diff options
Diffstat (limited to 'src')
107 files changed, 28853 insertions, 784 deletions
diff --git a/src/ARM.cpp b/src/ARM.cpp index 6248de2..68cac59 100644 --- a/src/ARM.cpp +++ b/src/ARM.cpp @@ -18,6 +18,7 @@ #include <stdio.h> #include "NDS.h" +#include "DSi.h" #include "ARM.h" #include "ARMInterpreter.h" #include "AREngine.h" @@ -101,10 +102,55 @@ void ARM::Reset() void ARMv5::Reset() { + if (NDS::ConsoleType == 1) + { + BusRead8 = DSi::ARM9Read8; + BusRead16 = DSi::ARM9Read16; + BusRead32 = DSi::ARM9Read32; + BusWrite8 = DSi::ARM9Write8; + BusWrite16 = DSi::ARM9Write16; + BusWrite32 = DSi::ARM9Write32; + GetMemRegion = DSi::ARM9GetMemRegion; + } + else + { + BusRead8 = NDS::ARM9Read8; + BusRead16 = NDS::ARM9Read16; + BusRead32 = NDS::ARM9Read32; + BusWrite8 = NDS::ARM9Write8; + BusWrite16 = NDS::ARM9Write16; + BusWrite32 = NDS::ARM9Write32; + GetMemRegion = NDS::ARM9GetMemRegion; + } + CP15Reset(); ARM::Reset(); } +void ARMv4::Reset() +{ + if (NDS::ConsoleType) + { + BusRead8 = DSi::ARM7Read8; + BusRead16 = DSi::ARM7Read16; + BusRead32 = DSi::ARM7Read32; + BusWrite8 = DSi::ARM7Write8; + BusWrite16 = DSi::ARM7Write16; + BusWrite32 = DSi::ARM7Write32; + } + else + { + BusRead8 = NDS::ARM7Read8; + BusRead16 = NDS::ARM7Read16; + BusRead32 = NDS::ARM7Read32; + BusWrite8 = NDS::ARM7Write8; + BusWrite16 = NDS::ARM7Write16; + BusWrite32 = NDS::ARM7Write32; + } + + ARM::Reset(); +} + void ARM::DoSavestate(Savestate* file) { @@ -222,9 +268,6 @@ void ARMv5::JumpTo(u32 addr, bool restorecpsr) CPSR &= ~0x20; } - // TODO: investigate this - // firmware jumps to region 01FFxxxx, but region 5 (01000000-02000000) is set to non-executable - // is melonDS fucked up somewhere, or is the DS PU just incomplete/crapoed? /*if (!(PU_Map[addr>>12] & 0x04)) { printf("jumped to %08X. very bad\n", addr); @@ -132,6 +132,14 @@ public: NDS::MemRegion CodeMem; static u32 ConditionTable[16]; + +protected: + u8 (*BusRead8)(u32 addr); + u16 (*BusRead16)(u32 addr); + u32 (*BusRead32)(u32 addr); + void (*BusWrite8)(u32 addr, u8 val); + void (*BusWrite16)(u32 addr, u16 val); + void (*BusWrite32)(u32 addr, u32 val); }; class ARMv5 : public ARM @@ -259,6 +267,8 @@ public: s32 RegionCodeCycles; u8* CurICacheLine; + + bool (*GetMemRegion)(u32 addr, bool write, NDS::MemRegion* region); }; class ARMv4 : public ARM @@ -266,23 +276,25 @@ class ARMv4 : public ARM public: ARMv4(); + void Reset(); + void JumpTo(u32 addr, bool restorecpsr = false); void Execute(); u16 CodeRead16(u32 addr) { - return NDS::ARM7Read16(addr); + return BusRead16(addr); } u32 CodeRead32(u32 addr) { - return NDS::ARM7Read32(addr); + return BusRead32(addr); } void DataRead8(u32 addr, u32* val) { - *val = NDS::ARM7Read8(addr); + *val = BusRead8(addr); DataRegion = addr >> 24; DataCycles = NDS::ARM7MemTimings[DataRegion][0]; } @@ -291,7 +303,7 @@ public: { addr &= ~1; - *val = NDS::ARM7Read16(addr); + *val = BusRead16(addr); DataRegion = addr >> 24; DataCycles = NDS::ARM7MemTimings[DataRegion][0]; } @@ -300,7 +312,7 @@ public: { addr &= ~3; - *val = NDS::ARM7Read32(addr); + *val = BusRead32(addr); DataRegion = addr >> 24; DataCycles = NDS::ARM7MemTimings[DataRegion][2]; } @@ -309,13 +321,13 @@ public: { addr &= ~3; - *val = NDS::ARM7Read32(addr); + *val = BusRead32(addr); DataCycles += NDS::ARM7MemTimings[DataRegion][3]; } void DataWrite8(u32 addr, u8 val) { - NDS::ARM7Write8(addr, val); + BusWrite8(addr, val); DataRegion = addr >> 24; DataCycles = NDS::ARM7MemTimings[DataRegion][0]; } @@ -324,7 +336,7 @@ public: { addr &= ~1; - NDS::ARM7Write16(addr, val); + BusWrite16(addr, val); DataRegion = addr >> 24; DataCycles = NDS::ARM7MemTimings[DataRegion][0]; } @@ -333,7 +345,7 @@ public: { addr &= ~3; - NDS::ARM7Write32(addr, val); + BusWrite32(addr, val); DataRegion = addr >> 24; DataCycles = NDS::ARM7MemTimings[DataRegion][2]; } @@ -342,7 +354,7 @@ public: { addr &= ~3; - NDS::ARM7Write32(addr, val); + BusWrite32(addr, val); DataCycles += NDS::ARM7MemTimings[DataRegion][3]; } diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 245e6a2..32fcac2 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -13,9 +13,19 @@ add_library(core STATIC CP15.cpp CRC32.cpp DMA.cpp + DSi.cpp + DSi_AES.cpp + DSi_Camera.cpp + DSi_I2C.cpp + DSi_NDMA.cpp + DSi_NWifi.cpp + DSi_SD.cpp + DSi_SPI_TSC.cpp FIFO.h GBACart.cpp GPU.cpp + GPU_OpenGL.cpp + GPU_OpenGL_shaders.h GPU2D.cpp GPU3D.cpp GPU3D_OpenGL.cpp @@ -25,6 +35,7 @@ add_library(core STATIC NDSCart.cpp OpenGLSupport.cpp Platform.h + ROMList.h RTC.cpp Savestate.cpp SPI.cpp @@ -33,6 +44,8 @@ add_library(core STATIC version.h Wifi.cpp WifiAP.cpp + + tiny-AES-c/aes.c ) if (WIN32) diff --git a/src/CP15.cpp b/src/CP15.cpp index c1f46bc..d340b9e 100644 --- a/src/CP15.cpp +++ b/src/CP15.cpp @@ -19,6 +19,7 @@ #include <stdio.h> #include <string.h> #include "NDS.h" +#include "DSi.h" #include "ARM.h" @@ -719,7 +720,7 @@ u32 ARMv5::CodeRead32(u32 addr, bool branch) if (CodeMem.Mem) return *(u32*)&CodeMem.Mem[addr & CodeMem.Mask]; - return NDS::ARM9Read32(addr); + return BusRead32(addr); } @@ -738,7 +739,7 @@ void ARMv5::DataRead8(u32 addr, u32* val) return; } - *val = NDS::ARM9Read8(addr); + *val = BusRead8(addr); DataCycles = MemTimings[addr >> 12][1]; } @@ -759,7 +760,7 @@ void ARMv5::DataRead16(u32 addr, u32* val) return; } - *val = NDS::ARM9Read16(addr); + *val = BusRead16(addr); DataCycles = MemTimings[addr >> 12][1]; } @@ -780,7 +781,7 @@ void ARMv5::DataRead32(u32 addr, u32* val) return; } - *val = NDS::ARM9Read32(addr); + *val = BusRead32(addr); DataCycles = MemTimings[addr >> 12][2]; } @@ -801,7 +802,7 @@ void ARMv5::DataRead32S(u32 addr, u32* val) return; } - *val = NDS::ARM9Read32(addr); + *val = BusRead32(addr); DataCycles += MemTimings[addr >> 12][3]; } @@ -820,7 +821,7 @@ void ARMv5::DataWrite8(u32 addr, u8 val) return; } - NDS::ARM9Write8(addr, val); + BusWrite8(addr, val); DataCycles = MemTimings[addr >> 12][1]; } @@ -841,7 +842,7 @@ void ARMv5::DataWrite16(u32 addr, u16 val) return; } - NDS::ARM9Write16(addr, val); + BusWrite16(addr, val); DataCycles = MemTimings[addr >> 12][1]; } @@ -862,7 +863,7 @@ void ARMv5::DataWrite32(u32 addr, u32 val) return; } - NDS::ARM9Write32(addr, val); + BusWrite32(addr, val); DataCycles = MemTimings[addr >> 12][2]; } @@ -883,7 +884,7 @@ void ARMv5::DataWrite32S(u32 addr, u32 val) return; } - NDS::ARM9Write32(addr, val); + BusWrite32(addr, val); DataCycles += MemTimings[addr >> 12][3]; } @@ -896,6 +897,6 @@ void ARMv5::GetCodeMemRegion(u32 addr, NDS::MemRegion* region) return; }*/ - NDS::ARM9GetMemRegion(addr, false, &CodeMem); + GetMemRegion(addr, false, &CodeMem); } diff --git a/src/Config.cpp b/src/Config.cpp index f558ef6..5745f34 100644 --- a/src/Config.cpp +++ b/src/Config.cpp @@ -28,19 +28,25 @@ namespace Config const char* kConfigFile = "melonDS.ini"; -int _3DRenderer; -int Threaded3D; +char BIOS9Path[1024]; +char BIOS7Path[1024]; +char FirmwarePath[1024]; -int GL_ScaleFactor; -int GL_Antialias; +char DSiBIOS9Path[1024]; +char DSiBIOS7Path[1024]; +char DSiFirmwarePath[1024]; +char DSiNANDPath[1024]; ConfigEntry ConfigFile[] = { - {"3DRenderer", 0, &_3DRenderer, 1, NULL, 0}, - {"Threaded3D", 0, &Threaded3D, 1, NULL, 0}, + {"BIOS9Path", 1, BIOS9Path, 0, "", 1023}, + {"BIOS7Path", 1, BIOS7Path, 0, "", 1023}, + {"FirmwarePath", 1, FirmwarePath, 0, "", 1023}, - {"GL_ScaleFactor", 0, &GL_ScaleFactor, 1, NULL, 0}, - {"GL_Antialias", 0, &GL_Antialias, 0, NULL, 0}, + {"DSiBIOS9Path", 1, DSiBIOS9Path, 0, "", 1023}, + {"DSiBIOS7Path", 1, DSiBIOS7Path, 0, "", 1023}, + {"DSiFirmwarePath", 1, DSiFirmwarePath, 0, "", 1023}, + {"DSiNANDPath", 1, DSiNANDPath, 0, "", 1023}, {"", -1, NULL, 0, NULL, 0} }; @@ -82,7 +88,8 @@ void Load() while (!feof(f)) { fgets(linebuf, 1024, f); - int ret = sscanf(linebuf, "%32[A-Za-z_0-9]=%[^\t\n]", entryname, entryval); + int ret = sscanf(linebuf, "%31[A-Za-z_0-9]=%[^\t\n]", entryname, entryval); + entryname[31] = '\0'; if (ret < 2) continue; ConfigEntry* entry = &ConfigFile[0]; diff --git a/src/Config.h b/src/Config.h index 0aeab85..3947598 100644 --- a/src/Config.h +++ b/src/Config.h @@ -42,11 +42,14 @@ bool HasConfigFile(const char* fileName); void Load(); void Save(); -extern int _3DRenderer; -extern int Threaded3D; - -extern int GL_ScaleFactor; -extern int GL_Antialias; +extern char BIOS9Path[1024]; +extern char BIOS7Path[1024]; +extern char FirmwarePath[1024]; + +extern char DSiBIOS9Path[1024]; +extern char DSiBIOS7Path[1024]; +extern char DSiFirmwarePath[1024]; +extern char DSiNANDPath[1024]; } diff --git a/src/DMA.cpp b/src/DMA.cpp index ae3fdd7..cd2df45 100644 --- a/src/DMA.cpp +++ b/src/DMA.cpp @@ -18,16 +18,11 @@ #include <stdio.h> #include "NDS.h" +#include "DSi.h" #include "DMA.h" -#include "NDSCart.h" #include "GPU.h" -// NOTES ON DMA SHIT -// -// * could use optimized code paths for common types of DMA transfers. for example, VRAM -// have to profile it to see if it's actually worth doing - // DMA TIMINGS // @@ -58,8 +53,6 @@ DMA::DMA(u32 cpu, u32 num) CountMask = 0x001FFFFF; else CountMask = (num==3 ? 0x0000FFFF : 0x00003FFF); - - Reset(); } DMA::~DMA() @@ -82,6 +75,21 @@ void DMA::Reset() Running = false; InProgress = false; + + if (NDS::ConsoleType == 1) + { + BusRead16 = (CPU==0) ? DSi::ARM9Read16 : DSi::ARM7Read16; + BusRead32 = (CPU==0) ? DSi::ARM9Read32 : DSi::ARM7Read32; + BusWrite16 = (CPU==0) ? DSi::ARM9Write16 : DSi::ARM7Write16; + BusWrite32 = (CPU==0) ? DSi::ARM9Write32 : DSi::ARM7Write32; + } + else + { + BusRead16 = (CPU==0) ? NDS::ARM9Read16 : NDS::ARM7Read16; + BusRead32 = (CPU==0) ? NDS::ARM9Read32 : NDS::ARM7Read32; + BusWrite16 = (CPU==0) ? NDS::ARM9Write16 : NDS::ARM7Write16; + BusWrite32 = (CPU==0) ? NDS::ARM9Write32 : NDS::ARM7Write32; + } } void DMA::DoSavestate(Savestate* file) @@ -232,7 +240,7 @@ void DMA::Run9() { NDS::ARM9Timestamp += (unitcycles << NDS::ARM9ClockShift); - NDS::ARM9Write16(CurDstAddr, NDS::ARM9Read16(CurSrcAddr)); + BusWrite16(CurDstAddr, BusRead16(CurSrcAddr)); CurSrcAddr += SrcAddrInc<<1; CurDstAddr += DstAddrInc<<1; @@ -268,7 +276,7 @@ void DMA::Run9() { NDS::ARM9Timestamp += (unitcycles << NDS::ARM9ClockShift); - NDS::ARM9Write32(CurDstAddr, NDS::ARM9Read32(CurSrcAddr)); + BusWrite32(CurDstAddr, BusRead32(CurSrcAddr)); CurSrcAddr += SrcAddrInc<<2; CurDstAddr += DstAddrInc<<2; @@ -344,7 +352,7 @@ void DMA::Run7() { NDS::ARM7Timestamp += unitcycles; - NDS::ARM7Write16(CurDstAddr, NDS::ARM7Read16(CurSrcAddr)); + BusWrite16(CurDstAddr, BusRead16(CurSrcAddr)); CurSrcAddr += SrcAddrInc<<1; CurDstAddr += DstAddrInc<<1; @@ -380,7 +388,7 @@ void DMA::Run7() { NDS::ARM7Timestamp += unitcycles; - NDS::ARM7Write32(CurDstAddr, NDS::ARM7Read32(CurSrcAddr)); + BusWrite32(CurDstAddr, BusRead32(CurSrcAddr)); CurSrcAddr += SrcAddrInc<<2; CurDstAddr += DstAddrInc<<2; @@ -86,6 +86,11 @@ private: bool Stall; bool IsGXFIFODMA; + + u16 (*BusRead16)(u32 addr); + u32 (*BusRead32)(u32 addr); + void (*BusWrite16)(u32 addr, u16 val); + void (*BusWrite32)(u32 addr, u32 val); }; #endif diff --git a/src/DSi.cpp b/src/DSi.cpp new file mode 100644 index 0000000..216f724 --- /dev/null +++ b/src/DSi.cpp @@ -0,0 +1,1806 @@ +/* + Copyright 2016-2019 Arisotura + + This file is part of melonDS. + + melonDS is free software: you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + melonDS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with melonDS. If not, see http://www.gnu.org/licenses/. +*/ + +#include <stdio.h> +#include <string.h> +#include "Config.h" +#include "NDS.h" +#include "DSi.h" +#include "ARM.h" +#include "GPU.h" +#include "NDSCart.h" +#include "Platform.h" + +#include "DSi_NDMA.h" +#include "DSi_I2C.h" +#include "DSi_SD.h" +#include "DSi_AES.h" + +#include "tiny-AES-c/aes.hpp" + + +namespace NDS +{ + +extern ARMv5* ARM9; +extern ARMv4* ARM7; + +} + + +namespace DSi +{ + +u32 BootAddr[2]; + +u16 SCFG_BIOS; +u16 SCFG_Clock9; +u16 SCFG_Clock7; +u32 SCFG_EXT[2]; +u32 SCFG_MC; + +u8 ARM9iBIOS[0x10000]; +u8 ARM7iBIOS[0x10000]; + +u32 MBK[2][9]; + +u8 NWRAM_A[0x40000]; +u8 NWRAM_B[0x40000]; +u8 NWRAM_C[0x40000]; + +u8* NWRAMMap_A[2][4]; +u8* NWRAMMap_B[3][8]; +u8* NWRAMMap_C[3][8]; + +u32 NWRAMStart[2][3]; +u32 NWRAMEnd[2][3]; +u32 NWRAMMask[2][3]; + +u32 NDMACnt[2]; +DSi_NDMA* NDMAs[8]; + +DSi_SDHost* SDMMC; +DSi_SDHost* SDIO; + +u64 ConsoleID; +u8 eMMC_CID[16]; + +u8 ITCMInit[0x8000]; +u8 ARM7Init[0x3C00]; + + +bool Init() +{ + if (!DSi_I2C::Init()) return false; + if (!DSi_AES::Init()) return false; + + NDMAs[0] = new DSi_NDMA(0, 0); + NDMAs[1] = new DSi_NDMA(0, 1); + NDMAs[2] = new DSi_NDMA(0, 2); + NDMAs[3] = new DSi_NDMA(0, 3); + NDMAs[4] = new DSi_NDMA(1, 0); + NDMAs[5] = new DSi_NDMA(1, 1); + NDMAs[6] = new DSi_NDMA(1, 2); + NDMAs[7] = new DSi_NDMA(1, 3); + + SDMMC = new DSi_SDHost(0); + SDIO = new DSi_SDHost(1); + + return true; +} + +void DeInit() +{ + DSi_I2C::DeInit(); + DSi_AES::DeInit(); + + for (int i = 0; i < 8; i++) delete NDMAs[i]; + + delete SDMMC; + delete SDIO; +} + +void Reset() +{ + //NDS::ARM9->CP15Write(0x910, 0x0D00000A); + //NDS::ARM9->CP15Write(0x911, 0x00000020); + //NDS::ARM9->CP15Write(0x100, NDS::ARM9->CP15Read(0x100) | 0x00050000); + + NDS::ARM9->JumpTo(BootAddr[0]); + NDS::ARM7->JumpTo(BootAddr[1]); + + NDMACnt[0] = 0; NDMACnt[1] = 0; + for (int i = 0; i < 8; i++) NDMAs[i]->Reset(); + + memcpy(NDS::ARM9->ITCM, ITCMInit, 0x8000); + + DSi_I2C::Reset(); + DSi_AES::Reset(); + + SDMMC->Reset(); + SDIO->Reset(); + + SCFG_BIOS = 0x0101; // TODO: should be zero when booting from BIOS + SCFG_Clock9 = 0x0187; // CHECKME + SCFG_Clock7 = 0x0187; + SCFG_EXT[0] = 0x8307F100; + SCFG_EXT[1] = 0x93FFFB06; + SCFG_MC = 0x0010;//0x0011; + + // LCD init flag + GPU::DispStat[0] |= (1<<6); + GPU::DispStat[1] |= (1<<6); + + NDS::MapSharedWRAM(3); + + for (u32 i = 0; i < 0x3C00; i+=4) + ARM7Write32(0x03FFC400+i, *(u32*)&ARM7Init[i]); + + u32 eaddr = 0x03FFE6E4; + ARM7Write32(eaddr+0x00, *(u32*)&eMMC_CID[0]); + ARM7Write32(eaddr+0x04, *(u32*)&eMMC_CID[4]); + ARM7Write32(eaddr+0x08, *(u32*)&eMMC_CID[8]); + ARM7Write32(eaddr+0x0C, *(u32*)&eMMC_CID[12]); + ARM7Write16(eaddr+0x2C, 0x0001); + ARM7Write16(eaddr+0x2E, 0x0001); + ARM7Write16(eaddr+0x3C, 0x0100); + ARM7Write16(eaddr+0x3E, 0x40E0); + ARM7Write16(eaddr+0x42, 0x0001); +} + +void SoftReset() +{ + // TODO: check exactly what is reset + // presumably, main RAM isn't reset, since the DSi can be told + // to boot a specific title this way + // BPTWL state wouldn't be reset either since BPTWL[0x70] is + // the warmboot flag + + // also, BPTWL[0x70] could be abused to quickly boot specific titles + + NDS::ARM9->Reset(); + NDS::ARM7->Reset(); + + memcpy(NDS::ARM9->ITCM, ITCMInit, 0x8000); + + DSi_AES::Reset(); + + LoadNAND(); + + SDMMC->Reset(); + SDIO->Reset(); + + NDS::ARM9->JumpTo(BootAddr[0]); + NDS::ARM7->JumpTo(BootAddr[1]); + + SCFG_BIOS = 0x0101; // TODO: should be zero when booting from BIOS + SCFG_Clock9 = 0x0187; // CHECKME + SCFG_Clock7 = 0x0187; + SCFG_EXT[0] = 0x8307F100; + SCFG_EXT[1] = 0x93FFFB06; + SCFG_MC = 0x0010;//0x0011; + + // LCD init flag + GPU::DispStat[0] |= (1<<6); + GPU::DispStat[1] |= (1<<6); + + NDS::MapSharedWRAM(3); + + for (u32 i = 0; i < 0x3C00; i+=4) + ARM7Write32(0x03FFC400+i, *(u32*)&ARM7Init[i]); + + u32 eaddr = 0x03FFE6E4; + ARM7Write32(eaddr+0x00, *(u32*)&eMMC_CID[0]); + ARM7Write32(eaddr+0x04, *(u32*)&eMMC_CID[4]); + ARM7Write32(eaddr+0x08, *(u32*)&eMMC_CID[8]); + ARM7Write32(eaddr+0x0C, *(u32*)&eMMC_CID[12]); + ARM7Write16(eaddr+0x2C, 0x0001); + ARM7Write16(eaddr+0x2E, 0x0001); + ARM7Write16(eaddr+0x3C, 0x0100); + ARM7Write16(eaddr+0x3E, 0x40E0); + ARM7Write16(eaddr+0x42, 0x0001); +} + +bool LoadBIOS() +{ + FILE* f; + u32 i; + + memset(ARM9iBIOS, 0, 0x10000); + memset(ARM7iBIOS, 0, 0x10000); + + f = Platform::OpenLocalFile(Config::DSiBIOS9Path, "rb"); + if (!f) + { + printf("ARM9i BIOS not found\n"); + + for (i = 0; i < 16; i++) + ((u32*)ARM9iBIOS)[i] = 0xE7FFDEFF; + } + else + { + fseek(f, 0, SEEK_SET); + fread(ARM9iBIOS, 0x10000, 1, f); + + printf("ARM9i BIOS loaded\n"); + fclose(f); + } + + f = Platform::OpenLocalFile(Config::DSiBIOS7Path, "rb"); + if (!f) + { + printf("ARM7i BIOS not found\n"); + + for (i = 0; i < 16; i++) + ((u32*)ARM7iBIOS)[i] = 0xE7FFDEFF; + } + else + { + // TODO: check if the first 32 bytes are crapoed + + fseek(f, 0, SEEK_SET); + fread(ARM7iBIOS, 0x10000, 1, f); + + printf("ARM7i BIOS loaded\n"); + fclose(f); + } + + // herp + *(u32*)&ARM9iBIOS[0] = 0xEAFFFFFE; + *(u32*)&ARM7iBIOS[0] = 0xEAFFFFFE; + + // TODO!!!! + // hax the upper 32K out of the goddamn DSi + + return true; +} + +bool LoadNAND() +{ + printf("Loading DSi NAND\n"); + + memset(NWRAM_A, 0, 0x40000); + memset(NWRAM_B, 0, 0x40000); + memset(NWRAM_C, 0, 0x40000); + + memset(MBK, 0, sizeof(MBK)); + memset(NWRAMMap_A, 0, sizeof(NWRAMMap_A)); + memset(NWRAMMap_B, 0, sizeof(NWRAMMap_B)); + memset(NWRAMMap_C, 0, sizeof(NWRAMMap_C)); + memset(NWRAMStart, 0, sizeof(NWRAMStart)); + memset(NWRAMEnd, 0, sizeof(NWRAMEnd)); + memset(NWRAMMask, 0, sizeof(NWRAMMask)); + + FILE* f = Platform::OpenLocalFile(Config::DSiNANDPath, "rb"); + if (f) + { + u32 bootparams[8]; + fseek(f, 0x220, SEEK_SET); + fread(bootparams, 4, 8, f); + + printf("ARM9: offset=%08X size=%08X RAM=%08X size_aligned=%08X\n", + bootparams[0], bootparams[1], bootparams[2], bootparams[3]); + printf("ARM7: offset=%08X size=%08X RAM=%08X size_aligned=%08X\n", + bootparams[4], bootparams[5], bootparams[6], bootparams[7]); + + // read and apply new-WRAM settings + + MBK[0][8] = 0; + MBK[1][8] = 0; + + u32 mbk[12]; + fseek(f, 0x380, SEEK_SET); + fread(mbk, 4, 12, f); + + MapNWRAM_A(0, mbk[0] & 0xFF); + MapNWRAM_A(1, (mbk[0] >> 8) & 0xFF); + MapNWRAM_A(2, (mbk[0] >> 16) & 0xFF); + MapNWRAM_A(3, mbk[0] >> 24); + + MapNWRAM_B(0, mbk[1] & 0xFF); + MapNWRAM_B(1, (mbk[1] >> 8) & 0xFF); + MapNWRAM_B(2, (mbk[1] >> 16) & 0xFF); + MapNWRAM_B(3, mbk[1] >> 24); + MapNWRAM_B(4, mbk[2] & 0xFF); + MapNWRAM_B(5, (mbk[2] >> 8) & 0xFF); + MapNWRAM_B(6, (mbk[2] >> 16) & 0xFF); + MapNWRAM_B(7, mbk[2] >> 24); + + MapNWRAM_C(0, mbk[3] & 0xFF); + MapNWRAM_C(1, (mbk[3] >> 8) & 0xFF); + MapNWRAM_C(2, (mbk[3] >> 16) & 0xFF); + MapNWRAM_C(3, mbk[3] >> 24); + MapNWRAM_C(4, mbk[4] & 0xFF); + MapNWRAM_C(5, (mbk[4] >> 8) & 0xFF); + MapNWRAM_C(6, (mbk[4] >> 16) & 0xFF); + MapNWRAM_C(7, mbk[4] >> 24); + + MapNWRAMRange(0, 0, mbk[5]); + MapNWRAMRange(0, 1, mbk[6]); + MapNWRAMRange(0, 2, mbk[7]); + + MapNWRAMRange(1, 0, mbk[8]); + MapNWRAMRange(1, 1, mbk[9]); + MapNWRAMRange(1, 2, mbk[10]); + + // TODO: find out why it is 0xFF000000 + mbk[11] &= 0x00FFFF0F; + MBK[0][8] = mbk[11]; + MBK[1][8] = mbk[11]; + + // load boot2 binaries + + AES_ctx ctx; + const u8 boot2key[16] = {0xAD, 0x34, 0xEC, 0xF9, 0x62, 0x6E, 0xC2, 0x3A, 0xF6, 0xB4, 0x6C, 0x00, 0x80, 0x80, 0xEE, 0x98}; + u8 boot2iv[16]; + u8 tmp[16]; + u32 dstaddr; + + *(u32*)&tmp[0] = bootparams[3]; + *(u32*)&tmp[4] = -bootparams[3]; + *(u32*)&tmp[8] = ~bootparams[3]; + *(u32*)&tmp[12] = 0; + for (int i = 0; i < 16; i++) boot2iv[i] = tmp[15-i]; + + AES_init_ctx_iv(&ctx, boot2key, boot2iv); + + fseek(f, bootparams[0], SEEK_SET); + dstaddr = bootparams[2]; + for (u32 i = 0; i < bootparams[3]; i += 16) + { + u8 data[16]; + fread(data, 16, 1, f); + + for (int j = 0; j < 16; j++) tmp[j] = data[15-j]; + AES_CTR_xcrypt_buffer(&ctx, tmp, 16); + for (int j = 0; j < 16; j++) data[j] = tmp[15-j]; + + ARM9Write32(dstaddr, *(u32*)&data[0]); dstaddr += 4; + ARM9Write32(dstaddr, *(u32*)&data[4]); dstaddr += 4; + ARM9Write32(dstaddr, *(u32*)&data[8]); dstaddr += 4; + ARM9Write32(dstaddr, *(u32*)&data[12]); dstaddr += 4; + } + + *(u32*)&tmp[0] = bootparams[7]; + *(u32*)&tmp[4] = -bootparams[7]; + *(u32*)&tmp[8] = ~bootparams[7]; + *(u32*)&tmp[12] = 0; + for (int i = 0; i < 16; i++) boot2iv[i] = tmp[15-i]; + + AES_init_ctx_iv(&ctx, boot2key, boot2iv); + + fseek(f, bootparams[4], SEEK_SET); + dstaddr = bootparams[6]; + for (u32 i = 0; i < bootparams[7]; i += 16) + { + u8 data[16]; + fread(data, 16, 1, f); + + for (int j = 0; j < 16; j++) tmp[j] = data[15-j]; + AES_CTR_xcrypt_buffer(&ctx, tmp, 16); + for (int j = 0; j < 16; j++) data[j] = tmp[15-j]; + + ARM7Write32(dstaddr, *(u32*)&data[0]); dstaddr += 4; + ARM7Write32(dstaddr, *(u32*)&data[4]); dstaddr += 4; + ARM7Write32(dstaddr, *(u32*)&data[8]); dstaddr += 4; + ARM7Write32(dstaddr, *(u32*)&data[12]); dstaddr += 4; + } + + // repoint the CPUs to the boot2 binaries + + BootAddr[0] = bootparams[2]; + BootAddr[1] = bootparams[6]; + +#define printhex(str, size) { for (int z = 0; z < (size); z++) printf("%02X", (str)[z]); printf("\n"); } +#define printhex_rev(str, size) { for (int z = (size)-1; z >= 0; z--) printf("%02X", (str)[z]); printf("\n"); } + + // read the nocash footer + + fseek(f, -0x40, SEEK_END); + + char nand_footer[16]; + const char* nand_footer_ref = "DSi eMMC CID/CPU"; + fread(nand_footer, 1, 16, f); + if (memcmp(nand_footer, nand_footer_ref, 16)) + { + printf("ERROR: NAND missing nocash footer\n"); + fclose(f); + return false; + } + + fread(eMMC_CID, 1, 16, f); + fread(&ConsoleID, 1, 8, f); + + printf("eMMC CID: "); printhex(eMMC_CID, 16); + printf("Console ID: %016llX\n", ConsoleID); + + fclose(f); + } + + memset(ITCMInit, 0, 0x8000); + memcpy(&ITCMInit[0x4400], &ARM9iBIOS[0x87F4], 0x400); + memcpy(&ITCMInit[0x4800], &ARM9iBIOS[0x9920], 0x80); + memcpy(&ITCMInit[0x4894], &ARM9iBIOS[0x99A0], 0x1048); + memcpy(&ITCMInit[0x58DC], &ARM9iBIOS[0xA9E8], 0x1048); + + memset(ARM7Init, 0, 0x3C00); + memcpy(&ARM7Init[0x0000], &ARM7iBIOS[0x8188], 0x200); + memcpy(&ARM7Init[0x0200], &ARM7iBIOS[0xB5D8], 0x40); + memcpy(&ARM7Init[0x0254], &ARM7iBIOS[0xC6D0], 0x1048); + memcpy(&ARM7Init[0x129C], &ARM7iBIOS[0xD718], 0x1048); + + return true; +} + + +void RunNDMAs(u32 cpu) +{ + // TODO: round-robin mode (requires DMA channels to have a subblock delay set) + + if (cpu == 0) + { + if (NDS::ARM9Timestamp >= NDS::ARM9Target) return; + + if (!(NDS::CPUStop & 0x80000000)) NDMAs[0]->Run(); + if (!(NDS::CPUStop & 0x80000000)) NDMAs[1]->Run(); + if (!(NDS::CPUStop & 0x80000000)) NDMAs[2]->Run(); + if (!(NDS::CPUStop & 0x80000000)) NDMAs[3]->Run(); + } + else + { + if (NDS::ARM7Timestamp >= NDS::ARM7Target) return; + + NDMAs[4]->Run(); + NDMAs[5]->Run(); + NDMAs[6]->Run(); + NDMAs[7]->Run(); + } +} + +void StallNDMAs() +{ + // TODO +} + +bool NDMAsInMode(u32 cpu, u32 mode) +{ + cpu <<= 2; + if (NDMAs[cpu+0]->IsInMode(mode)) return true; + if (NDMAs[cpu+1]->IsInMode(mode)) return true; + if (NDMAs[cpu+2]->IsInMode(mode)) return true; + if (NDMAs[cpu+3]->IsInMode(mode)) return true; + return false; +} + +bool NDMAsRunning(u32 cpu) +{ + cpu <<= 2; + if (NDMAs[cpu+0]->IsRunning()) return true; + if (NDMAs[cpu+1]->IsRunning()) return true; + if (NDMAs[cpu+2]->IsRunning()) return true; + if (NDMAs[cpu+3]->IsRunning()) return true; + return false; +} + +void CheckNDMAs(u32 cpu, u32 mode) +{ + cpu <<= 2; + NDMAs[cpu+0]->StartIfNeeded(mode); + NDMAs[cpu+1]->StartIfNeeded(mode); + NDMAs[cpu+2]->StartIfNeeded(mode); + NDMAs[cpu+3]->StartIfNeeded(mode); +} + +void StopNDMAs(u32 cpu, u32 mode) +{ + cpu <<= 2; + NDMAs[cpu+0]->StopIfNeeded(mode); + NDMAs[cpu+1]->StopIfNeeded(mode); + NDMAs[cpu+2]->StopIfNeeded(mode); + NDMAs[cpu+3]->StopIfNeeded(mode); +} + + +// new WRAM mapping +// TODO: find out what happens upon overlapping slots!! + +void MapNWRAM_A(u32 num, u8 val) +{ + if (MBK[0][8] & (1 << num)) + { + printf("trying to map NWRAM_A %d to %02X, but it is write-protected (%08X)\n", num, val, MBK[0][8]); + return; + } + + int mbkn = 0, mbks = 8*num; + + u8 oldval = (MBK[0][mbkn] >> mbks) & 0xFF; + if (oldval == val) return; + + MBK[0][mbkn] &= ~(0xFF << mbks); + MBK[0][mbkn] |= (val << mbks); + MBK[1][mbkn] = MBK[0][mbkn]; + + u8* ptr = &NWRAM_A[num << 16]; + + if (oldval & 0x80) + { + if (NWRAMMap_A[oldval & 0x01][(oldval >> 2) & 0x3] == ptr) + NWRAMMap_A[oldval & 0x01][(oldval >> 2) & 0x3] = NULL; + } + + if (val & 0x80) + { + NWRAMMap_A[val & 0x01][(val >> 2) & 0x3] = ptr; + } +} + +void MapNWRAM_B(u32 num, u8 val) +{ + if (MBK[0][8] & (1 << (8+num))) + { + printf("trying to map NWRAM_B %d to %02X, but it is write-protected (%08X)\n", num, val, MBK[0][8]); + return; + } + + int mbkn = 1+(num>>2), mbks = 8*(num&3); + + u8 oldval = (MBK[0][mbkn] >> mbks) & 0xFF; + if (oldval == val) return; + + MBK[0][mbkn] &= ~(0xFF << mbks); + MBK[0][mbkn] |= (val << mbks); + MBK[1][mbkn] = MBK[0][mbkn]; + + u8* ptr = &NWRAM_B[num << 15]; + + if (oldval & 0x80) + { + if (oldval & 0x02) oldval &= 0xFE; + + if (NWRAMMap_B[oldval & 0x03][(oldval >> 2) & 0x7] == ptr) + NWRAMMap_B[oldval & 0x03][(oldval >> 2) & 0x7] = NULL; + } + + if (val & 0x80) + { + if (val & 0x02) val &= 0xFE; + + NWRAMMap_B[val & 0x03][(val >> 2) & 0x7] = ptr; + } +} + +void MapNWRAM_C(u32 num, u8 val) +{ + if (MBK[0][8] & (1 << (16+num))) + { + printf("trying to map NWRAM_C %d to %02X, but it is write-protected (%08X)\n", num, val, MBK[0][8]); + return; + } + + int mbkn = 3+(num>>2), mbks = 8*(num&3); + + u8 oldval = (MBK[0][mbkn] >> mbks) & 0xFF; + if (oldval == val) return; + + MBK[0][mbkn] &= ~(0xFF << mbks); + MBK[0][mbkn] |= (val << mbks); + MBK[1][mbkn] = MBK[0][mbkn]; + + u8* ptr = &NWRAM_C[num << 15]; + + if (oldval & 0x80) + { + if (oldval & 0x02) oldval &= 0xFE; + + if (NWRAMMap_C[oldval & 0x03][(oldval >> 2) & 0x7] == ptr) + NWRAMMap_C[oldval & 0x03][(oldval >> 2) & 0x7] = NULL; + } + + if (val & 0x80) + { + if (val & 0x02) val &= 0xFE; + + NWRAMMap_C[val & 0x03][(val >> 2) & 0x7] = ptr; + } +} + +void MapNWRAMRange(u32 cpu, u32 num, u32 val) +{ + u32 oldval = MBK[cpu][5+num]; + if (oldval == val) return; + + MBK[cpu][5+num] = val; + + // TODO: what happens when the ranges are 'out of range'???? + if (num == 0) + { + u32 start = 0x03000000 + (((val >> 4) & 0xFF) << 16); + u32 end = 0x03000000 + (((val >> 20) & 0x1FF) << 16); + u32 size = (val >> 12) & 0x3; + + printf("NWRAM-A: ARM%d range %08X-%08X, size %d\n", cpu?7:9, start, end, size); + + NWRAMStart[cpu][num] = start; + NWRAMEnd[cpu][num] = end; + + switch (size) + { + case 0: + case 1: NWRAMMask[cpu][num] = 0x0; break; + case 2: NWRAMMask[cpu][num] = 0x1; break; // CHECKME + case 3: NWRAMMask[cpu][num] = 0x3; break; + } + } + else + { + u32 start = 0x03000000 + (((val >> 3) & 0x1FF) << 15); + u32 end = 0x03000000 + (((val >> 19) & 0x3FF) << 15); + u32 size = (val >> 12) & 0x3; + + printf("NWRAM-%c: ARM%d range %08X-%08X, size %d\n", 'A'+num, cpu?7:9, start, end, size); + + NWRAMStart[cpu][num] = start; + NWRAMEnd[cpu][num] = end; + + switch (size) + { + case 0: NWRAMMask[cpu][num] = 0x0; break; + case 1: NWRAMMask[cpu][num] = 0x1; break; + case 2: NWRAMMask[cpu][num] = 0x3; break; + case 3: NWRAMMask[cpu][num] = 0x7; break; + } + } +} + + +void Set_SCFG_Clock9(u16 val) +{ + SCFG_Clock9 = val & 0x0187; + return; + + NDS::ARM9Timestamp >>= NDS::ARM9ClockShift; + + printf("CLOCK9=%04X\n", val); + SCFG_Clock9 = val & 0x0187; + + if (SCFG_Clock9 & (1<<0)) NDS::ARM9ClockShift = 2; + else NDS::ARM9ClockShift = 1; + NDS::ARM9Timestamp <<= NDS::ARM9ClockShift; + NDS::ARM9->UpdateRegionTimings(0x00000000, 0xFFFFFFFF); +} + +void Set_SCFG_MC(u32 val) +{ + u32 oldslotstatus = SCFG_MC & 0xC; + + val &= 0xFFFF800C; + if ((val & 0xC) == 0xC) val &= ~0xC; // hax + if (val & 0x8000) printf("SCFG_MC: weird NDS slot swap\n"); + SCFG_MC = (SCFG_MC & ~0xFFFF800C) | val; + + if ((oldslotstatus == 0x0) && ((SCFG_MC & 0xC) == 0x4)) + { + NDSCart::ResetCart(); + } +} + + +u8 ARM9Read8(u32 addr) +{ + if ((addr >= 0xFFFF0000) && (!(SCFG_BIOS & (1<<1)))) + { + if ((addr >= 0xFFFF8000) && (SCFG_BIOS & (1<<0))) + return 0xFF; + + return *(u8*)&ARM9iBIOS[addr & 0xFFFF]; + } + + switch (addr & 0xFF000000) + { + case 0x03000000: + if (addr >= NWRAMStart[0][0] && addr < NWRAMEnd[0][0]) + { + u8* ptr = NWRAMMap_A[0][(addr >> 16) & NWRAMMask[0][0]]; + return ptr ? *(u8*)&ptr[addr & 0xFFFF] : 0; + } + if (addr >= NWRAMStart[0][1] && addr < NWRAMEnd[0][1]) + { + u8* ptr = NWRAMMap_B[0][(addr >> 15) & NWRAMMask[0][1]]; + return ptr ? *(u8*)&ptr[addr & 0x7FFF] : 0; + } + if (addr >= NWRAMStart[0][2] && addr < NWRAMEnd[0][2]) + { + u8* ptr = NWRAMMap_C[0][(addr >> 15) & NWRAMMask[0][2]]; + return ptr ? *(u8*)&ptr[addr & 0x7FFF] : 0; + } + return NDS::ARM9Read8(addr); + + case 0x04000000: + return ARM9IORead8(addr); + } + + return NDS::ARM9Read8(addr); +} + +u16 ARM9Read16(u32 addr) +{ + if ((addr >= 0xFFFF0000) && (!(SCFG_BIOS & (1<<1)))) + { + if ((addr >= 0xFFFF8000) && (SCFG_BIOS & (1<<0))) + return 0xFFFF; + + return *(u16*)&ARM9iBIOS[addr & 0xFFFF]; + } + + switch (addr & 0xFF000000) + { + case 0x03000000: + if (addr >= NWRAMStart[0][0] && addr < NWRAMEnd[0][0]) + { + u8* ptr = NWRAMMap_A[0][(addr >> 16) & NWRAMMask[0][0]]; + return ptr ? *(u16*)&ptr[addr & 0xFFFF] : 0; + } + if (addr >= NWRAMStart[0][1] && addr < NWRAMEnd[0][1]) + { + u8* ptr = NWRAMMap_B[0][(addr >> 15) & NWRAMMask[0][1]]; + return ptr ? *(u16*)&ptr[addr & 0x7FFF] : 0; + } + if (addr >= NWRAMStart[0][2] && addr < NWRAMEnd[0][2]) + { + u8* ptr = NWRAMMap_C[0][(addr >> 15) & NWRAMMask[0][2]]; + return ptr ? *(u16*)&ptr[addr & 0x7FFF] : 0; + } + return NDS::ARM9Read16(addr); + + case 0x04000000: + return ARM9IORead16(addr); + } + + return NDS::ARM9Read16(addr); +} + +u32 ARM9Read32(u32 addr) +{ + if ((addr >= 0xFFFF0000) && (!(SCFG_BIOS & (1<<1)))) + { + if ((addr >= 0xFFFF8000) && (SCFG_BIOS & (1<<0))) + return 0xFFFFFFFF; + + return *(u32*)&ARM9iBIOS[addr & 0xFFFF]; + } + + switch (addr & 0xFF000000) + { + case 0x02000000: + // HACK to bypass region locking + // TODO: make optional + if (addr == 0x02FE71B0) return 0xFFFFFFFF; + break; + + case 0x03000000: + if (addr >= NWRAMStart[0][0] && addr < NWRAMEnd[0][0]) + { + u8* ptr = NWRAMMap_A[0][(addr >> 16) & NWRAMMask[0][0]]; + return ptr ? *(u32*)&ptr[addr & 0xFFFF] : 0; + } + if (addr >= NWRAMStart[0][1] && addr < NWRAMEnd[0][1]) + { + u8* ptr = NWRAMMap_B[0][(addr >> 15) & NWRAMMask[0][1]]; + return ptr ? *(u32*)&ptr[addr & 0x7FFF] : 0; + } + if (addr >= NWRAMStart[0][2] && addr < NWRAMEnd[0][2]) + { + u8* ptr = NWRAMMap_C[0][(addr >> 15) & NWRAMMask[0][2]]; + return ptr ? *(u32*)&ptr[addr & 0x7FFF] : 0; + } + return NDS::ARM9Read32(addr); + + case 0x04000000: + return ARM9IORead32(addr); + } + + return NDS::ARM9Read32(addr); +} + +void ARM9Write8(u32 addr, u8 val) +{ + switch (addr & 0xFF000000) + { + case 0x03000000: + if (addr >= NWRAMStart[0][0] && addr < NWRAMEnd[0][0]) + { + u8* ptr = NWRAMMap_A[0][(addr >> 16) & NWRAMMask[0][0]]; + if (ptr) *(u8*)&ptr[addr & 0xFFFF] = val; + return; + } + if (addr >= NWRAMStart[0][1] && addr < NWRAMEnd[0][1]) + { + u8* ptr = NWRAMMap_B[0][(addr >> 15) & NWRAMMask[0][1]]; + if (ptr) *(u8*)&ptr[addr & 0x7FFF] = val; + return; + } + if (addr >= NWRAMStart[0][2] && addr < NWRAMEnd[0][2]) + { + u8* ptr = NWRAMMap_C[0][(addr >> 15) & NWRAMMask[0][2]]; + if (ptr) *(u8*)&ptr[addr & 0x7FFF] = val; + return; + } + return NDS::ARM9Write8(addr, val); + + case 0x04000000: + ARM9IOWrite8(addr, val); + return; + } + + return NDS::ARM9Write8(addr, val); +} + +void ARM9Write16(u32 addr, u16 val) +{ + switch (addr & 0xFF000000) + { + case 0x03000000: + if (addr >= NWRAMStart[0][0] && addr < NWRAMEnd[0][0]) + { + u8* ptr = NWRAMMap_A[0][(addr >> 16) & NWRAMMask[0][0]]; + if (ptr) *(u16*)&ptr[addr & 0xFFFF] = val; + return; + } + if (addr >= NWRAMStart[0][1] && addr < NWRAMEnd[0][1]) + { + u8* ptr = NWRAMMap_B[0][(addr >> 15) & NWRAMMask[0][1]]; + if (ptr) *(u16*)&ptr[addr & 0x7FFF] = val; + return; + } + if (addr >= NWRAMStart[0][2] && addr < NWRAMEnd[0][2]) + { + u8* ptr = NWRAMMap_C[0][(addr >> 15) & NWRAMMask[0][2]]; + if (ptr) *(u16*)&ptr[addr & 0x7FFF] = val; + return; + } + return NDS::ARM9Write16(addr, val); + + case 0x04000000: + ARM9IOWrite16(addr, val); + return; + } + + return NDS::ARM9Write16(addr, val); +} + +void ARM9Write32(u32 addr, u32 val) +{ + switch (addr & 0xFF000000) + { + case 0x03000000: + if (addr >= NWRAMStart[0][0] && addr < NWRAMEnd[0][0]) + { + u8* ptr = NWRAMMap_A[0][(addr >> 16) & NWRAMMask[0][0]]; + if (ptr) *(u32*)&ptr[addr & 0xFFFF] = val; + return; + } + if (addr >= NWRAMStart[0][1] && addr < NWRAMEnd[0][1]) + { + u8* ptr = NWRAMMap_B[0][(addr >> 15) & NWRAMMask[0][1]]; + if (ptr) *(u32*)&ptr[addr & 0x7FFF] = val; + return; + } + if (addr >= NWRAMStart[0][2] && addr < NWRAMEnd[0][2]) + { + u8* ptr = NWRAMMap_C[0][(addr >> 15) & NWRAMMask[0][2]]; + if (ptr) *(u32*)&ptr[addr & 0x7FFF] = val; + return; + } + return NDS::ARM9Write32(addr, val); + + case 0x04000000: + ARM9IOWrite32(addr, val); + return; + } + + return NDS::ARM9Write32(addr, val); +} + +bool ARM9GetMemRegion(u32 addr, bool write, NDS::MemRegion* region) +{ + switch (addr & 0xFF000000) + { + case 0x02000000: + region->Mem = NDS::MainRAM; + region->Mask = NDS::MainRAMMask; + return true; + } + + if ((addr & 0xFFFF0000) == 0xFFFF0000 && !write) + { + if (SCFG_BIOS & (1<<1)) + { + if (addr >= 0xFFFF1000) + { + region->Mem = NULL; + return false; + } + + region->Mem = NDS::ARM9BIOS; + region->Mask = 0xFFF; + } + else + { + region->Mem = ARM9iBIOS; + region->Mask = 0xFFFF; + } + return true; + } + + region->Mem = NULL; + return false; +} + + + +u8 ARM7Read8(u32 addr) +{ + if ((addr < 0x00010000) && (!(SCFG_BIOS & (1<<9)))) + { + if ((addr >= 0x00008000) && (SCFG_BIOS & (1<<8))) + return 0xFF; + if (NDS::ARM7->R[15] >= 0x00010000) + return 0xFF; + if (addr < NDS::ARM7BIOSProt && NDS::ARM7->R[15] >= NDS::ARM7BIOSProt) + return 0xFF; + + return *(u8*)&ARM7iBIOS[addr]; + } + + switch (addr & 0xFF800000) + { + case 0x03000000: + if (addr >= NWRAMStart[1][0] && addr < NWRAMEnd[1][0]) + { + u8* ptr = NWRAMMap_A[1][(addr >> 16) & NWRAMMask[1][0]]; + return ptr ? *(u8*)&ptr[addr & 0xFFFF] : 0; + } + if (addr >= NWRAMStart[1][1] && addr < NWRAMEnd[1][1]) + { + u8* ptr = NWRAMMap_B[1][(addr >> 15) & NWRAMMask[1][1]]; + return ptr ? *(u8*)&ptr[addr & 0x7FFF] : 0; + } + if (addr >= NWRAMStart[1][2] && addr < NWRAMEnd[1][2]) + { + u8* ptr = NWRAMMap_C[1][(addr >> 15) & NWRAMMask[1][2]]; + return ptr ? *(u8*)&ptr[addr & 0x7FFF] : 0; + } + return NDS::ARM7Read8(addr); + + case 0x04000000: + return ARM7IORead8(addr); + } + + return NDS::ARM7Read8(addr); +} + +u16 ARM7Read16(u32 addr) +{ + if ((addr < 0x00010000) && (!(SCFG_BIOS & (1<<9)))) + { + if ((addr >= 0x00008000) && (SCFG_BIOS & (1<<8))) + return 0xFFFF; + if (NDS::ARM7->R[15] >= 0x00010000) + return 0xFFFF; + if (addr < NDS::ARM7BIOSProt && NDS::ARM7->R[15] >= NDS::ARM7BIOSProt) + return 0xFFFF; + + return *(u16*)&ARM7iBIOS[addr]; + } + + switch (addr & 0xFF800000) + { + case 0x03000000: + if (addr >= NWRAMStart[1][0] && addr < NWRAMEnd[1][0]) + { + u8* ptr = NWRAMMap_A[1][(addr >> 16) & NWRAMMask[1][0]]; + return ptr ? *(u16*)&ptr[addr & 0xFFFF] : 0; + } + if (addr >= NWRAMStart[1][1] && addr < NWRAMEnd[1][1]) + { + u8* ptr = NWRAMMap_B[1][(addr >> 15) & NWRAMMask[1][1]]; + return ptr ? *(u16*)&ptr[addr & 0x7FFF] : 0; + } + if (addr >= NWRAMStart[1][2] && addr < NWRAMEnd[1][2]) + { + u8* ptr = NWRAMMap_C[1][(addr >> 15) & NWRAMMask[1][2]]; + return ptr ? *(u16*)&ptr[addr & 0x7FFF] : 0; + } + return NDS::ARM7Read16(addr); + + case 0x04000000: + return ARM7IORead16(addr); + } + + return NDS::ARM7Read16(addr); +} + +u32 ARM7Read32(u32 addr) +{ + if ((addr < 0x00010000) && (!(SCFG_BIOS & (1<<9)))) + { + if ((addr >= 0x00008000) && (SCFG_BIOS & (1<<8))) + return 0xFFFFFFFF; + if (NDS::ARM7->R[15] >= 0x00010000) + return 0xFFFFFFFF; + if (addr < NDS::ARM7BIOSProt && NDS::ARM7->R[15] >= NDS::ARM7BIOSProt) + return 0xFFFFFFFF; + + return *(u32*)&ARM7iBIOS[addr]; + } + + switch (addr & 0xFF800000) + { + case 0x03000000: + if (addr >= NWRAMStart[1][0] && addr < NWRAMEnd[1][0]) + { + u8* ptr = NWRAMMap_A[1][(addr >> 16) & NWRAMMask[1][0]]; + return ptr ? *(u32*)&ptr[addr & 0xFFFF] : 0; + } + if (addr >= NWRAMStart[1][1] && addr < NWRAMEnd[1][1]) + { + u8* ptr = NWRAMMap_B[1][(addr >> 15) & NWRAMMask[1][1]]; + return ptr ? *(u32*)&ptr[addr & 0x7FFF] : 0; + } + if (addr >= NWRAMStart[1][2] && addr < NWRAMEnd[1][2]) + { + u8* ptr = NWRAMMap_C[1][(addr >> 15) & NWRAMMask[1][2]]; + return ptr ? *(u32*)&ptr[addr & 0x7FFF] : 0; + } + return NDS::ARM7Read32(addr); + + case 0x04000000: + return ARM7IORead32(addr); + } + + return NDS::ARM7Read32(addr); +} + +void ARM7Write8(u32 addr, u8 val) +{ + switch (addr & 0xFF800000) + { + case 0x03000000: + if (addr >= NWRAMStart[1][0] && addr < NWRAMEnd[1][0]) + { + u8* ptr = NWRAMMap_A[1][(addr >> 16) & NWRAMMask[1][0]]; + if (ptr) *(u8*)&ptr[addr & 0xFFFF] = val; + return; + } + if (addr >= NWRAMStart[1][1] && addr < NWRAMEnd[1][1]) + { + u8* ptr = NWRAMMap_B[1][(addr >> 15) & NWRAMMask[1][1]]; + if (ptr) *(u8*)&ptr[addr & 0x7FFF] = val; + return; + } + if (addr >= NWRAMStart[1][2] && addr < NWRAMEnd[1][2]) + { + u8* ptr = NWRAMMap_C[1][(addr >> 15) & NWRAMMask[1][2]]; + if (ptr) *(u8*)&ptr[addr & 0x7FFF] = val; + return; + } + return NDS::ARM7Write8(addr, val); + + case 0x04000000: + ARM7IOWrite8(addr, val); + return; + } + + return NDS::ARM7Write8(addr, val); +} + +void ARM7Write16(u32 addr, u16 val) +{ + switch (addr & 0xFF800000) + { + case 0x03000000: + if (addr >= NWRAMStart[1][0] && addr < NWRAMEnd[1][0]) + { + u8* ptr = NWRAMMap_A[1][(addr >> 16) & NWRAMMask[1][0]]; + if (ptr) *(u16*)&ptr[addr & 0xFFFF] = val; + return; + } + if (addr >= NWRAMStart[1][1] && addr < NWRAMEnd[1][1]) + { + u8* ptr = NWRAMMap_B[1][(addr >> 15) & NWRAMMask[1][1]]; + if (ptr) *(u16*)&ptr[addr & 0x7FFF] = val; + return; + } + if (addr >= NWRAMStart[1][2] && addr < NWRAMEnd[1][2]) + { + u8* ptr = NWRAMMap_C[1][(addr >> 15) & NWRAMMask[1][2]]; + if (ptr) *(u16*)&ptr[addr & 0x7FFF] = val; + return; + } + return NDS::ARM7Write16(addr, val); + + case 0x04000000: + ARM7IOWrite16(addr, val); + return; + } + + return NDS::ARM7Write16(addr, val); +} + +void ARM7Write32(u32 addr, u32 val) +{ + switch (addr & 0xFF800000) + { + case 0x03000000: + if (addr >= NWRAMStart[1][0] && addr < NWRAMEnd[1][0]) + { + u8* ptr = NWRAMMap_A[1][(addr >> 16) & NWRAMMask[1][0]]; + if (ptr) *(u32*)&ptr[addr & 0xFFFF] = val; + return; + } + if (addr >= NWRAMStart[1][1] && addr < NWRAMEnd[1][1]) + { + u8* ptr = NWRAMMap_B[1][(addr >> 15) & NWRAMMask[1][1]]; + if (ptr) *(u32*)&ptr[addr & 0x7FFF] = val; + return; + } + if (addr >= NWRAMStart[1][2] && addr < NWRAMEnd[1][2]) + { + u8* ptr = NWRAMMap_C[1][(addr >> 15) & NWRAMMask[1][2]]; + if (ptr) *(u32*)&ptr[addr & 0x7FFF] = val; + return; + } + return NDS::ARM7Write32(addr, val); + + case 0x04000000: + ARM7IOWrite32(addr, val); + return; + } + + return NDS::ARM7Write32(addr, val); +} + +bool ARM7GetMemRegion(u32 addr, bool write, NDS::MemRegion* region) +{ + switch (addr & 0xFF800000) + { + case 0x02000000: + case 0x02800000: + region->Mem = NDS::MainRAM; + region->Mask = NDS::MainRAMMask; + return true; + } + + // BIOS. ARM7 PC has to be within range. + /*if (addr < 0x00010000 && !write) + { + if (NDS::ARM7->R[15] < 0x00010000 && (addr >= NDS::ARM7BIOSProt || NDS::ARM7->R[15] < NDS::ARM7BIOSProt)) + { + region->Mem = NDS::ARM7BIOS; + region->Mask = 0xFFFF; + return true; + } + }*/ + + region->Mem = NULL; + return false; +} + + + + +#define CASE_READ8_16BIT(addr, val) \ + case (addr): return (val) & 0xFF; \ + case (addr+1): return (val) >> 8; + +#define CASE_READ8_32BIT(addr, val) \ + case (addr): return (val) & 0xFF; \ + case (addr+1): return ((val) >> 8) & 0xFF; \ + case (addr+2): return ((val) >> 16) & 0xFF; \ + case (addr+3): return (val) >> 24; + +#define CASE_READ16_32BIT(addr, val) \ + case (addr): return (val) & 0xFFFF; \ + case (addr+2): return (val) >> 16; + +u8 ARM9IORead8(u32 addr) +{ + switch (addr) + { + case 0x04004000: return SCFG_BIOS & 0xFF; + + CASE_READ8_32BIT(0x04004040, MBK[0][0]) + CASE_READ8_32BIT(0x04004044, MBK[0][1]) + CASE_READ8_32BIT(0x04004048, MBK[0][2]) + CASE_READ8_32BIT(0x0400404C, MBK[0][3]) + CASE_READ8_32BIT(0x04004050, MBK[0][4]) + CASE_READ8_32BIT(0x04004054, MBK[0][5]) + CASE_READ8_32BIT(0x04004058, MBK[0][6]) + CASE_READ8_32BIT(0x0400405C, MBK[0][7]) + CASE_READ8_32BIT(0x04004060, MBK[0][8]) + } + + return NDS::ARM9IORead8(addr); +} + +u16 ARM9IORead16(u32 addr) +{ + switch (addr) + { + case 0x04004000: return SCFG_BIOS & 0xFF; + case 0x04004004: return SCFG_Clock9; + case 0x04004010: return SCFG_MC & 0xFFFF; + + CASE_READ16_32BIT(0x04004040, MBK[0][0]) + CASE_READ16_32BIT(0x04004044, MBK[0][1]) + CASE_READ16_32BIT(0x04004048, MBK[0][2]) + CASE_READ16_32BIT(0x0400404C, MBK[0][3]) + CASE_READ16_32BIT(0x04004050, MBK[0][4]) + CASE_READ16_32BIT(0x04004054, MBK[0][5]) + CASE_READ16_32BIT(0x04004058, MBK[0][6]) + CASE_READ16_32BIT(0x0400405C, MBK[0][7]) + CASE_READ16_32BIT(0x04004060, MBK[0][8]) + } + + return NDS::ARM9IORead16(addr); +} + +u32 ARM9IORead32(u32 addr) +{ + switch (addr) + { + case 0x04004000: return SCFG_BIOS & 0xFF; + case 0x04004008: return SCFG_EXT[0]; + case 0x04004010: return SCFG_MC & 0xFFFF; + + case 0x04004040: return MBK[0][0]; + case 0x04004044: return MBK[0][1]; + case 0x04004048: return MBK[0][2]; + case 0x0400404C: return MBK[0][3]; + case 0x04004050: return MBK[0][4]; + case 0x04004054: return MBK[0][5]; + case 0x04004058: return MBK[0][6]; + case 0x0400405C: return MBK[0][7]; + case 0x04004060: return MBK[0][8]; + + case 0x04004100: return NDMACnt[0]; + case 0x04004104: return NDMAs[0]->SrcAddr; + case 0x04004108: return NDMAs[0]->DstAddr; + case 0x0400410C: return NDMAs[0]->TotalLength; + case 0x04004110: return NDMAs[0]->BlockLength; + case 0x04004114: return NDMAs[0]->SubblockTimer; + case 0x04004118: return NDMAs[0]->FillData; + case 0x0400411C: return NDMAs[0]->Cnt; + case 0x04004120: return NDMAs[1]->SrcAddr; + case 0x04004124: return NDMAs[1]->DstAddr; + case 0x04004128: return NDMAs[1]->TotalLength; + case 0x0400412C: return NDMAs[1]->BlockLength; + case 0x04004130: return NDMAs[1]->SubblockTimer; + case 0x04004134: return NDMAs[1]->FillData; + case 0x04004138: return NDMAs[1]->Cnt; + case 0x0400413C: return NDMAs[2]->SrcAddr; + case 0x04004140: return NDMAs[2]->DstAddr; + case 0x04004144: return NDMAs[2]->TotalLength; + case 0x04004148: return NDMAs[2]->BlockLength; + case 0x0400414C: return NDMAs[2]->SubblockTimer; + case 0x04004150: return NDMAs[2]->FillData; + case 0x04004154: return NDMAs[2]->Cnt; + case 0x04004158: return NDMAs[3]->SrcAddr; + case 0x0400415C: return NDMAs[3]->DstAddr; + case 0x04004160: return NDMAs[3]->TotalLength; + case 0x04004164: return NDMAs[3]->BlockLength; + case 0x04004168: return NDMAs[3]->SubblockTimer; + case 0x0400416C: return NDMAs[3]->FillData; + case 0x04004170: return NDMAs[3]->Cnt; + } + + return NDS::ARM9IORead32(addr); +} + +void ARM9IOWrite8(u32 addr, u8 val) +{ + switch (addr) + { + case 0x04000301: + // TODO: OPTIONAL PERFORMANCE HACK + // the DSi ARM9 BIOS has a bug where the IRQ wait function attempts to use (ARM7-only) HALTCNT + // effectively causing it to wait in a busy loop. + // for better DSi performance, we can implement an actual IRQ wait here. + // in practice this would only matter when running DS software in DSi mode (ie already a hack). + // DSi software does not use the BIOS IRQ wait function. + //if (val == 0x80 && NDS::ARM9->R[15] == 0xFFFF0268) NDS::ARM9->Halt(1); + return; + + case 0x04004040: MapNWRAM_A(0, val); return; + case 0x04004041: MapNWRAM_A(1, val); return; + case 0x04004042: MapNWRAM_A(2, val); return; + case 0x04004043: MapNWRAM_A(3, val); return; + case 0x04004044: MapNWRAM_B(0, val); return; + case 0x04004045: MapNWRAM_B(1, val); return; + case 0x04004046: MapNWRAM_B(2, val); return; + case 0x04004047: MapNWRAM_B(3, val); return; + case 0x04004048: MapNWRAM_B(4, val); return; + case 0x04004049: MapNWRAM_B(5, val); return; + case 0x0400404A: MapNWRAM_B(6, val); return; + case 0x0400404B: MapNWRAM_B(7, val); return; + case 0x0400404C: MapNWRAM_C(0, val); return; + case 0x0400404D: MapNWRAM_C(1, val); return; + case 0x0400404E: MapNWRAM_C(2, val); return; + case 0x0400404F: MapNWRAM_C(3, val); return; + case 0x04004050: MapNWRAM_C(4, val); return; + case 0x04004051: MapNWRAM_C(5, val); return; + case 0x04004052: MapNWRAM_C(6, val); return; + case 0x04004053: MapNWRAM_C(7, val); return; + } + + return NDS::ARM9IOWrite8(addr, val); +} + +void ARM9IOWrite16(u32 addr, u16 val) +{ + switch (addr) + { + case 0x04004004: + Set_SCFG_Clock9(val); + return; + + case 0x04004040: + MapNWRAM_A(0, val & 0xFF); + MapNWRAM_A(1, val >> 8); + return; + case 0x04004042: + MapNWRAM_A(2, val & 0xFF); + MapNWRAM_A(3, val >> 8); + return; + case 0x04004044: + MapNWRAM_B(0, val & 0xFF); + MapNWRAM_B(1, val >> 8); + return; + case 0x04004046: + MapNWRAM_B(2, val & 0xFF); + MapNWRAM_B(3, val >> 8); + return; + case 0x04004048: + MapNWRAM_B(4, val & 0xFF); + MapNWRAM_B(5, val >> 8); + return; + case 0x0400404A: + MapNWRAM_B(6, val & 0xFF); + MapNWRAM_B(7, val >> 8); + return; + case 0x0400404C: + MapNWRAM_C(0, val & 0xFF); + MapNWRAM_C(1, val >> 8); + return; + case 0x0400404E: + MapNWRAM_C(2, val & 0xFF); + MapNWRAM_C(3, val >> 8); + return; + case 0x04004050: + MapNWRAM_C(4, val & 0xFF); + MapNWRAM_C(5, val >> 8); + return; + case 0x04004052: + MapNWRAM_C(6, val & 0xFF); + MapNWRAM_C(7, val >> 8); + return; + } + + return NDS::ARM9IOWrite16(addr, val); +} + +void ARM9IOWrite32(u32 addr, u32 val) +{ + switch (addr) + { + case 0x04004008: + SCFG_EXT[0] &= ~0x8007F19F; + SCFG_EXT[0] |= (val & 0x8007F19F); + SCFG_EXT[1] &= ~0x0000F080; + SCFG_EXT[1] |= (val & 0x0000F080); + printf("SCFG_EXT = %08X / %08X (val9 %08X)\n", SCFG_EXT[0], SCFG_EXT[1], val); + /*switch ((SCFG_EXT[0] >> 14) & 0x3) + { + case 0: + case 1: + NDS::MainRAMMask = 0x3FFFFF; + printf("RAM: 4MB\n"); + break; + case 2: + case 3: // TODO: debug console w/ 32MB? + NDS::MainRAMMask = 0xFFFFFF; + printf("RAM: 16MB\n"); + break; + }*/ + printf("from %08X, ARM7 %08X, %08X\n", NDS::GetPC(0), NDS::GetPC(1), NDS::ARM7->R[1]); + return; + + case 0x04004040: + MapNWRAM_A(0, val & 0xFF); + MapNWRAM_A(1, (val >> 8) & 0xFF); + MapNWRAM_A(2, (val >> 16) & 0xFF); + MapNWRAM_A(3, val >> 24); + return; + case 0x04004044: + MapNWRAM_B(0, val & 0xFF); + MapNWRAM_B(1, (val >> 8) & 0xFF); + MapNWRAM_B(2, (val >> 16) & 0xFF); + MapNWRAM_B(3, val >> 24); + return; + case 0x04004048: + MapNWRAM_B(4, val & 0xFF); + MapNWRAM_B(5, (val >> 8) & 0xFF); + MapNWRAM_B(6, (val >> 16) & 0xFF); + MapNWRAM_B(7, val >> 24); + return; + case 0x0400404C: + MapNWRAM_C(0, val & 0xFF); + MapNWRAM_C(1, (val >> 8) & 0xFF); + MapNWRAM_C(2, (val >> 16) & 0xFF); + MapNWRAM_C(3, val >> 24); + return; + case 0x04004050: + MapNWRAM_C(4, val & 0xFF); + MapNWRAM_C(5, (val >> 8) & 0xFF); + MapNWRAM_C(6, (val >> 16) & 0xFF); + MapNWRAM_C(7, val >> 24); + return; + case 0x04004054: MapNWRAMRange(0, 0, val); return; + case 0x04004058: MapNWRAMRange(0, 1, val); return; + case 0x0400405C: MapNWRAMRange(0, 2, val); return; + + case 0x04004100: NDMACnt[0] = val & 0x800F0000; return; + case 0x04004104: NDMAs[0]->SrcAddr = val & 0xFFFFFFFC; return; + case 0x04004108: NDMAs[0]->DstAddr = val & 0xFFFFFFFC; return; + case 0x0400410C: NDMAs[0]->TotalLength = val & 0x0FFFFFFF; return; + case 0x04004110: NDMAs[0]->BlockLength = val & 0x00FFFFFF; return; + case 0x04004114: NDMAs[0]->SubblockTimer = val & 0x0003FFFF; return; + case 0x04004118: NDMAs[0]->FillData = val; return; + case 0x0400411C: NDMAs[0]->WriteCnt(val); return; + case 0x04004120: NDMAs[1]->SrcAddr = val & 0xFFFFFFFC; return; + case 0x04004124: NDMAs[1]->DstAddr = val & 0xFFFFFFFC; return; + case 0x04004128: NDMAs[1]->TotalLength = val & 0x0FFFFFFF; return; + case 0x0400412C: NDMAs[1]->BlockLength = val & 0x00FFFFFF; return; + case 0x04004130: NDMAs[1]->SubblockTimer = val & 0x0003FFFF; return; + case 0x04004134: NDMAs[1]->FillData = val; return; + case 0x04004138: NDMAs[1]->WriteCnt(val); return; + case 0x0400413C: NDMAs[2]->SrcAddr = val & 0xFFFFFFFC; return; + case 0x04004140: NDMAs[2]->DstAddr = val & 0xFFFFFFFC; return; + case 0x04004144: NDMAs[2]->TotalLength = val & 0x0FFFFFFF; return; + case 0x04004148: NDMAs[2]->BlockLength = val & 0x00FFFFFF; return; + case 0x0400414C: NDMAs[2]->SubblockTimer = val & 0x0003FFFF; return; + case 0x04004150: NDMAs[2]->FillData = val; return; + case 0x04004154: NDMAs[2]->WriteCnt(val); return; + case 0x04004158: NDMAs[3]->SrcAddr = val & 0xFFFFFFFC; return; + case 0x0400415C: NDMAs[3]->DstAddr = val & 0xFFFFFFFC; return; + case 0x04004160: NDMAs[3]->TotalLength = val & 0x0FFFFFFF; return; + case 0x04004164: NDMAs[3]->BlockLength = val & 0x00FFFFFF; return; + case 0x04004168: NDMAs[3]->SubblockTimer = val & 0x0003FFFF; return; + case 0x0400416C: NDMAs[3]->FillData = val; return; + case 0x04004170: NDMAs[3]->WriteCnt(val); return; + } + + return NDS::ARM9IOWrite32(addr, val); +} + + +u8 ARM7IORead8(u32 addr) +{ + switch (addr) + { + case 0x04004000: return SCFG_BIOS & 0xFF; + case 0x04004001: return SCFG_BIOS >> 8; + + CASE_READ8_32BIT(0x04004040, MBK[1][0]) + CASE_READ8_32BIT(0x04004044, MBK[1][1]) + CASE_READ8_32BIT(0x04004048, MBK[1][2]) + CASE_READ8_32BIT(0x0400404C, MBK[1][3]) + CASE_READ8_32BIT(0x04004050, MBK[1][4]) + CASE_READ8_32BIT(0x04004054, MBK[1][5]) + CASE_READ8_32BIT(0x04004058, MBK[1][6]) + CASE_READ8_32BIT(0x0400405C, MBK[1][7]) + CASE_READ8_32BIT(0x04004060, MBK[1][8]) + + case 0x04004500: return DSi_I2C::ReadData(); + case 0x04004501: return DSi_I2C::Cnt; + + case 0x04004D00: if (SCFG_BIOS & (1<<10)) return 0; return ConsoleID & 0xFF; + case 0x04004D01: if (SCFG_BIOS & (1<<10)) return 0; return (ConsoleID >> 8) & 0xFF; + case 0x04004D02: if (SCFG_BIOS & (1<<10)) return 0; return (ConsoleID >> 16) & 0xFF; + case 0x04004D03: if (SCFG_BIOS & (1<<10)) return 0; return (ConsoleID >> 24) & 0xFF; + case 0x04004D04: if (SCFG_BIOS & (1<<10)) return 0; return (ConsoleID >> 32) & 0xFF; + case 0x04004D05: if (SCFG_BIOS & (1<<10)) return 0; return (ConsoleID >> 40) & 0xFF; + case 0x04004D06: if (SCFG_BIOS & (1<<10)) return 0; return (ConsoleID >> 48) & 0xFF; + case 0x04004D07: if (SCFG_BIOS & (1<<10)) return 0; return ConsoleID >> 56; + case 0x04004D08: return 0; + } + + return NDS::ARM7IORead8(addr); +} + +u16 ARM7IORead16(u32 addr) +{ + switch (addr) + { + case 0x04000218: return NDS::IE2; + case 0x0400021C: return NDS::IF2; + + case 0x04004000: return SCFG_BIOS; + case 0x04004004: return SCFG_Clock7; + case 0x04004006: return 0; // JTAG register + case 0x04004010: return SCFG_MC & 0xFFFF; + + CASE_READ16_32BIT(0x04004040, MBK[1][0]) + CASE_READ16_32BIT(0x04004044, MBK[1][1]) + CASE_READ16_32BIT(0x04004048, MBK[1][2]) + CASE_READ16_32BIT(0x0400404C, MBK[1][3]) + CASE_READ16_32BIT(0x04004050, MBK[1][4]) + CASE_READ16_32BIT(0x04004054, MBK[1][5]) + CASE_READ16_32BIT(0x04004058, MBK[1][6]) + CASE_READ16_32BIT(0x0400405C, MBK[1][7]) + CASE_READ16_32BIT(0x04004060, MBK[1][8]) + + case 0x04004D00: if (SCFG_BIOS & (1<<10)) return 0; return ConsoleID & 0xFFFF; + case 0x04004D02: if (SCFG_BIOS & (1<<10)) return 0; return (ConsoleID >> 16) & 0xFFFF; + case 0x04004D04: if (SCFG_BIOS & (1<<10)) return 0; return (ConsoleID >> 32) & 0xFFFF; + case 0x04004D06: if (SCFG_BIOS & (1<<10)) return 0; return ConsoleID >> 48; + case 0x04004D08: return 0; + } + + if (addr >= 0x04004800 && addr < 0x04004A00) + { + return SDMMC->Read(addr); + } + if (addr >= 0x04004A00 && addr < 0x04004C00) + { + return SDIO->Read(addr); + } + + return NDS::ARM7IORead16(addr); +} + +u32 ARM7IORead32(u32 addr) +{ + switch (addr) + { + case 0x04000218: return NDS::IE2; + case 0x0400021C: return NDS::IF2; + + case 0x04004000: return SCFG_BIOS; + case 0x04004008: return SCFG_EXT[1]; + case 0x04004010: return SCFG_MC; + + case 0x04004040: return MBK[1][0]; + case 0x04004044: return MBK[1][1]; + case 0x04004048: return MBK[1][2]; + case 0x0400404C: return MBK[1][3]; + case 0x04004050: return MBK[1][4]; + case 0x04004054: return MBK[1][5]; + case 0x04004058: return MBK[1][6]; + case 0x0400405C: return MBK[1][7]; + case 0x04004060: return MBK[1][8]; + + case 0x04004100: return NDMACnt[1]; + case 0x04004104: return NDMAs[4]->SrcAddr; + case 0x04004108: return NDMAs[4]->DstAddr; + case 0x0400410C: return NDMAs[4]->TotalLength; + case 0x04004110: return NDMAs[4]->BlockLength; + case 0x04004114: return NDMAs[4]->SubblockTimer; + case 0x04004118: return NDMAs[4]->FillData; + case 0x0400411C: return NDMAs[4]->Cnt; + case 0x04004120: return NDMAs[5]->SrcAddr; + case 0x04004124: return NDMAs[5]->DstAddr; + case 0x04004128: return NDMAs[5]->TotalLength; + case 0x0400412C: return NDMAs[5]->BlockLength; + case 0x04004130: return NDMAs[5]->SubblockTimer; + case 0x04004134: return NDMAs[5]->FillData; + case 0x04004138: return NDMAs[5]->Cnt; + case 0x0400413C: return NDMAs[6]->SrcAddr; + case 0x04004140: return NDMAs[6]->DstAddr; + case 0x04004144: return NDMAs[6]->TotalLength; + case 0x04004148: return NDMAs[6]->BlockLength; + case 0x0400414C: return NDMAs[6]->SubblockTimer; + case 0x04004150: return NDMAs[6]->FillData; + case 0x04004154: return NDMAs[6]->Cnt; + case 0x04004158: return NDMAs[7]->SrcAddr; + case 0x0400415C: return NDMAs[7]->DstAddr; + case 0x04004160: return NDMAs[7]->TotalLength; + case 0x04004164: return NDMAs[7]->BlockLength; + case 0x04004168: return NDMAs[7]->SubblockTimer; + case 0x0400416C: return NDMAs[7]->FillData; + case 0x04004170: return NDMAs[7]->Cnt; + + case 0x04004400: return DSi_AES::ReadCnt(); + case 0x0400440C: return DSi_AES::ReadOutputFIFO(); + + case 0x04004D00: if (SCFG_BIOS & (1<<10)) return 0; return ConsoleID & 0xFFFFFFFF; + case 0x04004D04: if (SCFG_BIOS & (1<<10)) return 0; return ConsoleID >> 32; + case 0x04004D08: return 0; + } + + if (addr >= 0x04004800 && addr < 0x04004A00) + { + if (addr == 0x0400490C) return SDMMC->ReadFIFO32(); + return SDMMC->Read(addr) | (SDMMC->Read(addr+2) << 16); + } + if (addr >= 0x04004A00 && addr < 0x04004C00) + { + if (addr == 0x04004B0C) return SDIO->ReadFIFO32(); + return SDIO->Read(addr) | (SDIO->Read(addr+2) << 16); + } + + return NDS::ARM7IORead32(addr); +} + +void ARM7IOWrite8(u32 addr, u8 val) +{ + switch (addr) + { + case 0x04004000: + SCFG_BIOS |= (val & 0x03); + return; + case 0x04004001: + SCFG_BIOS |= ((val & 0x07) << 8); + return; + + case 0x04004500: DSi_I2C::WriteData(val); return; + case 0x04004501: DSi_I2C::WriteCnt(val); return; + } + + return NDS::ARM7IOWrite8(addr, val); +} + +void ARM7IOWrite16(u32 addr, u16 val) +{ + switch (addr) + { + case 0x04000218: NDS::IE2 = (val & 0x7FF7); NDS::UpdateIRQ(1); return; + case 0x0400021C: NDS::IF2 &= ~(val & 0x7FF7); NDS::UpdateIRQ(1); return; + + case 0x04004000: + SCFG_BIOS |= (val & 0x0703); + return; + case 0x04004004: + SCFG_Clock7 = val & 0x0187; + return; + case 0x04004010: + Set_SCFG_MC((SCFG_MC & 0xFFFF0000) | val); + return; + } + + if (addr >= 0x04004800 && addr < 0x04004A00) + { + SDMMC->Write(addr, val); + return; + } + if (addr >= 0x04004A00 && addr < 0x04004C00) + { + SDIO->Write(addr, val); + return; + } + + return NDS::ARM7IOWrite16(addr, val); +} + +void ARM7IOWrite32(u32 addr, u32 val) +{ + switch (addr) + { + case 0x04000218: NDS::IE2 = (val & 0x7FF7); NDS::UpdateIRQ(1); return; + case 0x0400021C: NDS::IF2 &= ~(val & 0x7FF7); NDS::UpdateIRQ(1); return; + + case 0x04004000: + SCFG_BIOS |= (val & 0x0703); + return; + case 0x04004008: + SCFG_EXT[0] &= ~0x03000000; + SCFG_EXT[0] |= (val & 0x03000000); + SCFG_EXT[1] &= ~0x93FF0F07; + SCFG_EXT[1] |= (val & 0x93FF0F07); + printf("SCFG_EXT = %08X / %08X (val7 %08X)\n", SCFG_EXT[0], SCFG_EXT[1], val); + return; + case 0x04004010: + Set_SCFG_MC(val); + return; + + case 0x04004054: MapNWRAMRange(1, 0, val); return; + case 0x04004058: MapNWRAMRange(1, 1, val); return; + case 0x0400405C: MapNWRAMRange(1, 2, val); return; + case 0x04004060: val &= 0x00FFFF0F; MBK[0][8] = val; MBK[1][8] = val; return; + + case 0x04004100: NDMACnt[1] = val & 0x800F0000; return; + case 0x04004104: NDMAs[4]->SrcAddr = val & 0xFFFFFFFC; return; + case 0x04004108: NDMAs[4]->DstAddr = val & 0xFFFFFFFC; return; + case 0x0400410C: NDMAs[4]->TotalLength = val & 0x0FFFFFFF; return; + case 0x04004110: NDMAs[4]->BlockLength = val & 0x00FFFFFF; return; + case 0x04004114: NDMAs[4]->SubblockTimer = val & 0x0003FFFF; return; + case 0x04004118: NDMAs[4]->FillData = val; return; + case 0x0400411C: NDMAs[4]->WriteCnt(val); return; + case 0x04004120: NDMAs[5]->SrcAddr = val & 0xFFFFFFFC; return; + case 0x04004124: NDMAs[5]->DstAddr = val & 0xFFFFFFFC; return; + case 0x04004128: NDMAs[5]->TotalLength = val & 0x0FFFFFFF; return; + case 0x0400412C: NDMAs[5]->BlockLength = val & 0x00FFFFFF; return; + case 0x04004130: NDMAs[5]->SubblockTimer = val & 0x0003FFFF; return; + case 0x04004134: NDMAs[5]->FillData = val; return; + case 0x04004138: NDMAs[5]->WriteCnt(val); return; + case 0x0400413C: NDMAs[6]->SrcAddr = val & 0xFFFFFFFC; return; + case 0x04004140: NDMAs[6]->DstAddr = val & 0xFFFFFFFC; return; + case 0x04004144: NDMAs[6]->TotalLength = val & 0x0FFFFFFF; return; + case 0x04004148: NDMAs[6]->BlockLength = val & 0x00FFFFFF; return; + case 0x0400414C: NDMAs[6]->SubblockTimer = val & 0x0003FFFF; return; + case 0x04004150: NDMAs[6]->FillData = val; return; + case 0x04004154: NDMAs[6]->WriteCnt(val); return; + case 0x04004158: NDMAs[7]->SrcAddr = val & 0xFFFFFFFC; return; + case 0x0400415C: NDMAs[7]->DstAddr = val & 0xFFFFFFFC; return; + case 0x04004160: NDMAs[7]->TotalLength = val & 0x0FFFFFFF; return; + case 0x04004164: NDMAs[7]->BlockLength = val & 0x00FFFFFF; return; + case 0x04004168: NDMAs[7]->SubblockTimer = val & 0x0003FFFF; return; + case 0x0400416C: NDMAs[7]->FillData = val; return; + case 0x04004170: NDMAs[7]->WriteCnt(val); return; + + case 0x04004400: DSi_AES::WriteCnt(val); return; + case 0x04004404: DSi_AES::WriteBlkCnt(val); return; + case 0x04004408: DSi_AES::WriteInputFIFO(val); return; + } + + if (addr >= 0x04004420 && addr < 0x04004430) + { + addr -= 0x04004420; + DSi_AES::WriteIV(addr, val, 0xFFFFFFFF); + return; + } + if (addr >= 0x04004430 && addr < 0x04004440) + { + addr -= 0x04004430; + DSi_AES::WriteMAC(addr, val, 0xFFFFFFFF); + return; + } + if (addr >= 0x04004440 && addr < 0x04004500) + { + addr -= 0x04004440; + int n = 0; + while (addr >= 0x30) { addr -= 0x30; n++; } + + switch (addr >> 4) + { + case 0: DSi_AES::WriteKeyNormal(n, addr&0xF, val, 0xFFFFFFFF); return; + case 1: DSi_AES::WriteKeyX(n, addr&0xF, val, 0xFFFFFFFF); return; + case 2: DSi_AES::WriteKeyY(n, addr&0xF, val, 0xFFFFFFFF); return; + } + } + + if (addr >= 0x04004800 && addr < 0x04004A00) + { + if (addr == 0x0400490C) { SDMMC->WriteFIFO32(val); return; } + SDMMC->Write(addr, val & 0xFFFF); + SDMMC->Write(addr+2, val >> 16); + return; + } + if (addr >= 0x04004A00 && addr < 0x04004C00) + { + if (addr == 0x04004B0C) { SDIO->WriteFIFO32(val); return; } + SDIO->Write(addr, val & 0xFFFF); + SDIO->Write(addr+2, val >> 16); + return; + } + + return NDS::ARM7IOWrite32(addr, val); +} + +} diff --git a/src/DSi.h b/src/DSi.h new file mode 100644 index 0000000..8cc8fd5 --- /dev/null +++ b/src/DSi.h @@ -0,0 +1,93 @@ +/* + Copyright 2016-2019 Arisotura + + This file is part of melonDS. + + melonDS is free software: you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + melonDS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with melonDS. If not, see http://www.gnu.org/licenses/. +*/ + +#ifndef DSI_H +#define DSI_H + +#include "NDS.h" +#include "DSi_SD.h" + +namespace DSi +{ + +extern u8 ARM9iBIOS[0x10000]; +extern u8 ARM7iBIOS[0x10000]; + +extern u8 eMMC_CID[16]; +extern u64 ConsoleID; + +extern DSi_SDHost* SDMMC; +extern DSi_SDHost* SDIO; + + +bool Init(); +void DeInit(); +void Reset(); + +void SoftReset(); + +bool LoadBIOS(); +bool LoadNAND(); + +void RunNDMAs(u32 cpu); +void StallNDMAs(); +bool NDMAsInMode(u32 cpu, u32 mode); +bool NDMAsRunning(u32 cpu); +void CheckNDMAs(u32 cpu, u32 mode); +void StopNDMAs(u32 cpu, u32 mode); + +void MapNWRAM_A(u32 num, u8 val); +void MapNWRAM_B(u32 num, u8 val); +void MapNWRAM_C(u32 num, u8 val); +void MapNWRAMRange(u32 cpu, u32 num, u32 val); + +u8 ARM9Read8(u32 addr); +u16 ARM9Read16(u32 addr); +u32 ARM9Read32(u32 addr); +void ARM9Write8(u32 addr, u8 val); +void ARM9Write16(u32 addr, u16 val); +void ARM9Write32(u32 addr, u32 val); + +bool ARM9GetMemRegion(u32 addr, bool write, NDS::MemRegion* region); + +u8 ARM7Read8(u32 addr); +u16 ARM7Read16(u32 addr); +u32 ARM7Read32(u32 addr); +void ARM7Write8(u32 addr, u8 val); +void ARM7Write16(u32 addr, u16 val); +void ARM7Write32(u32 addr, u32 val); + +bool ARM7GetMemRegion(u32 addr, bool write, NDS::MemRegion* region); + +u8 ARM9IORead8(u32 addr); +u16 ARM9IORead16(u32 addr); +u32 ARM9IORead32(u32 addr); +void ARM9IOWrite8(u32 addr, u8 val); +void ARM9IOWrite16(u32 addr, u16 val); +void ARM9IOWrite32(u32 addr, u32 val); + +u8 ARM7IORead8(u32 addr); +u16 ARM7IORead16(u32 addr); +u32 ARM7IORead32(u32 addr); +void ARM7IOWrite8(u32 addr, u8 val); +void ARM7IOWrite16(u32 addr, u16 val); +void ARM7IOWrite32(u32 addr, u32 val); + +} + +#endif // DSI_H diff --git a/src/DSiCrypto.cpp b/src/DSiCrypto.cpp new file mode 100644 index 0000000..6a524dd --- /dev/null +++ b/src/DSiCrypto.cpp @@ -0,0 +1,17 @@ +/* + Copyright 2016-2019 Arisotura + + This file is part of melonDS. + + melonDS is free software: you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + melonDS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with melonDS. If not, see http://www.gnu.org/licenses/. +*/ diff --git a/src/DSiCrypto.h b/src/DSiCrypto.h new file mode 100644 index 0000000..dc9bfe6 --- /dev/null +++ b/src/DSiCrypto.h @@ -0,0 +1,24 @@ +/* + Copyright 2016-2019 Arisotura + + This file is part of melonDS. + + melonDS is free software: you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + melonDS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with melonDS. If not, see http://www.gnu.org/licenses/. +*/ + +#ifndef DSICRYPTO_H +#define DSICRYPTO_H + +// + +#endif // DSICRYPTO_H diff --git a/src/DSi_AES.cpp b/src/DSi_AES.cpp new file mode 100644 index 0000000..6a8ffad --- /dev/null +++ b/src/DSi_AES.cpp @@ -0,0 +1,555 @@ +/* + Copyright 2016-2019 Arisotura + + This file is part of melonDS. + + melonDS is free software: you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + melonDS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with melonDS. If not, see http://www.gnu.org/licenses/. +*/ + +#include <stdio.h> +#include <string.h> +#include "DSi.h" +#include "DSi_AES.h" +#include "FIFO.h" +#include "tiny-AES-c/aes.hpp" +#include "Platform.h" + + +namespace DSi_AES +{ + +u32 Cnt; + +u32 BlkCnt; +u32 RemBlocks; + +bool OutputFlush; + +u32 InputDMASize, OutputDMASize; +u32 AESMode; + +FIFO<u32>* InputFIFO; +FIFO<u32>* OutputFIFO; + +u8 IV[16]; + +u8 MAC[16]; + +u8 KeyNormal[4][16]; +u8 KeyX[4][16]; +u8 KeyY[4][16]; + +u8 CurKey[16]; +u8 CurMAC[16]; + +AES_ctx Ctx; + + +void Swap16(u8* dst, u8* src) +{ + for (int i = 0; i < 16; i++) + dst[i] = src[15-i]; +} + +void ROL16(u8* val, u32 n) +{ + u32 n_coarse = n >> 3; + u32 n_fine = n & 7; + u8 tmp[16]; + + for (u32 i = 0; i < 16; i++) + { + tmp[i] = val[(i - n_coarse) & 0xF]; + } + + for (u32 i = 0; i < 16; i++) + { + val[i] = (tmp[i] << n_fine) | (tmp[(i - 1) & 0xF] >> (8-n_fine)); + } +} + +#define _printhex(str, size) { for (int z = 0; z < (size); z++) printf("%02X", (str)[z]); printf("\n"); } +#define _printhex2(str, size) { for (int z = 0; z < (size); z++) printf("%02X", (str)[z]); } + +#define _printhexR(str, size) { for (int z = 0; z < (size); z++) printf("%02X", (str)[((size)-1)-z]); printf("\n"); } +#define _printhex2R(str, size) { for (int z = 0; z < (size); z++) printf("%02X", (str)[((size)-1)-z]); } + + +bool Init() +{ + InputFIFO = new FIFO<u32>(16); + OutputFIFO = new FIFO<u32>(16); + + const u8 zero[16] = {0}; + AES_init_ctx_iv(&Ctx, zero, zero); + + return true; +} + +void DeInit() +{ + delete InputFIFO; + delete OutputFIFO; +} + +void Reset() +{ + Cnt = 0; + + BlkCnt = 0; + RemBlocks = 0; + + OutputFlush = false; + + InputDMASize = 0; + OutputDMASize = 0; + AESMode = 0; + + InputFIFO->Clear(); + OutputFIFO->Clear(); + + memset(IV, 0, sizeof(IV)); + + memset(MAC, 0, sizeof(MAC)); + + memset(KeyNormal, 0, sizeof(KeyNormal)); + memset(KeyX, 0, sizeof(KeyX)); + memset(KeyY, 0, sizeof(KeyY)); + + memset(CurKey, 0, sizeof(CurKey)); + memset(CurMAC, 0, sizeof(CurMAC)); + + // initialize keys + + // slot 0: modcrypt + *(u32*)&KeyX[0][0] = 0x746E694E; + *(u32*)&KeyX[0][4] = 0x6F646E65; + + // slot 1: 'Tad'/dev.kp + *(u32*)&KeyX[1][0] = 0x4E00004A; + *(u32*)&KeyX[1][4] = 0x4A00004E; + *(u32*)&KeyX[1][8] = (u32)(DSi::ConsoleID >> 32) ^ 0xC80C4B72; + *(u32*)&KeyX[1][12] = (u32)DSi::ConsoleID; + + // slot 3: console-unique eMMC crypto + *(u32*)&KeyX[3][0] = (u32)DSi::ConsoleID; + *(u32*)&KeyX[3][4] = (u32)DSi::ConsoleID ^ 0x24EE6906; + *(u32*)&KeyX[3][8] = (u32)(DSi::ConsoleID >> 32) ^ 0xE65B601D; + *(u32*)&KeyX[3][12] = (u32)(DSi::ConsoleID >> 32); + *(u32*)&KeyY[3][0] = 0x0AB9DC76; + *(u32*)&KeyY[3][4] = 0xBD4DC4D3; + *(u32*)&KeyY[3][8] = 0x202DDD1D; +} + + +void ProcessBlock_CCM_Decrypt() +{ + u8 data[16]; + u8 data_rev[16]; + + *(u32*)&data[0] = InputFIFO->Read(); + *(u32*)&data[4] = InputFIFO->Read(); + *(u32*)&data[8] = InputFIFO->Read(); + *(u32*)&data[12] = InputFIFO->Read(); + + //printf("AES-CCM: "); _printhex2(data, 16); + + Swap16(data_rev, data); + AES_CTR_xcrypt_buffer(&Ctx, data_rev, 16); + + for (int i = 0; i < 16; i++) CurMAC[i] ^= data_rev[i]; + AES_ECB_encrypt(&Ctx, CurMAC); + + Swap16(data, data_rev); + + //printf(" -> "); _printhex2(data, 16); + + OutputFIFO->Write(*(u32*)&data[0]); + OutputFIFO->Write(*(u32*)&data[4]); + OutputFIFO->Write(*(u32*)&data[8]); + OutputFIFO->Write(*(u32*)&data[12]); +} + +void ProcessBlock_CTR() +{ + u8 data[16]; + u8 data_rev[16]; + + *(u32*)&data[0] = InputFIFO->Read(); + *(u32*)&data[4] = InputFIFO->Read(); + *(u32*)&data[8] = InputFIFO->Read(); + *(u32*)&data[12] = InputFIFO->Read(); + + //printf("AES-CTR: "); _printhex2(data, 16); + + Swap16(data_rev, data); + AES_CTR_xcrypt_buffer(&Ctx, data_rev, 16); + Swap16(data, data_rev); + + //printf(" -> "); _printhex(data, 16); + + OutputFIFO->Write(*(u32*)&data[0]); + OutputFIFO->Write(*(u32*)&data[4]); + OutputFIFO->Write(*(u32*)&data[8]); + OutputFIFO->Write(*(u32*)&data[12]); +} + + +u32 ReadCnt() +{ + u32 ret = Cnt; + + ret |= InputFIFO->Level(); + ret |= (OutputFIFO->Level() << 5); + + return ret; +} + +void WriteCnt(u32 val) +{ + u32 oldcnt = Cnt; + Cnt = val & 0xFC1FF000; + + /*if (val & (3<<10)) + { + if (val & (1<<11)) OutputFlush = true; + Update(); + }*/ + + u32 dmasize_in[4] = {0, 4, 8, 12}; + u32 dmasize_out[4] = {4, 8, 12, 16}; + InputDMASize = dmasize_in[(val >> 12) & 0x3]; + OutputDMASize = dmasize_out[(val >> 14) & 0x3]; + + AESMode = (val >> 28) & 0x3; + if (AESMode == 1) printf("AES-CCM TODO\n"); + + if (val & (1<<24)) + { + u32 slot = (val >> 26) & 0x3; + memcpy(CurKey, KeyNormal[slot], 16); + } + + if (!(oldcnt & (1<<31)) && (val & (1<<31))) + { + // transfer start (checkme) + RemBlocks = BlkCnt >> 16; + + if (RemBlocks > 0) + { + u8 key[16]; + u8 iv[16]; + + Swap16(key, CurKey); + Swap16(iv, IV); + + if (AESMode < 2) + { + if (BlkCnt & 0xFFFF) printf("AES: CCM EXTRA LEN TODO\n"); + + u32 maclen = (val >> 16) & 0x7; + if (maclen < 1) maclen = 1; + + iv[0] = 0x02; + for (int i = 0; i < 12; i++) iv[1+i] = iv[4+i]; + iv[13] = 0x00; + iv[14] = 0x00; + iv[15] = 0x01; + + AES_init_ctx_iv(&Ctx, key, iv); + + iv[0] |= (maclen << 3) | ((BlkCnt & 0xFFFF) ? (1<<6) : 0); + iv[13] = RemBlocks >> 12; + iv[14] = RemBlocks >> 4; + iv[15] = RemBlocks << 4; + + memcpy(CurMAC, iv, 16); + AES_ECB_encrypt(&Ctx, CurMAC); + } + else + { + AES_init_ctx_iv(&Ctx, key, iv); + } + + DSi::CheckNDMAs(1, 0x2A); + } + else + { + // no blocks to process? oh well. mark it finished + // CHECKME: does this trigger any IRQ or shit? + + Cnt &= ~(1<<31); + } + } + + //printf("AES CNT: %08X / mode=%d key=%d inDMA=%d outDMA=%d blocks=%d\n", + // val, AESMode, (val >> 26) & 0x3, InputDMASize, OutputDMASize, RemBlocks); +} + +void WriteBlkCnt(u32 val) +{ + BlkCnt = val; +} + +u32 ReadOutputFIFO() +{ + if (OutputFIFO->IsEmpty()) printf("!!! AES OUTPUT FIFO EMPTY\n"); + + u32 ret = OutputFIFO->Read(); + + if (Cnt & (1<<31)) + { + CheckInputDMA(); + CheckOutputDMA(); + } + else + { + if (OutputFIFO->Level() > 0) + DSi::CheckNDMAs(1, 0x2B); + else + DSi::StopNDMAs(1, 0x2B); + } + + return ret; +} + +void WriteInputFIFO(u32 val) +{ + // TODO: add some delay to processing + + if (InputFIFO->IsFull()) printf("!!! AES INPUT FIFO FULL\n"); + + InputFIFO->Write(val); + + if (!(Cnt & (1<<31))) return; + + Update(); +} + +void CheckInputDMA() +{ + if (RemBlocks == 0) return; + + if (InputFIFO->Level() <= InputDMASize) + { + // trigger input DMA + DSi::CheckNDMAs(1, 0x2A); + } + + Update(); +} + +void CheckOutputDMA() +{ + if (OutputFIFO->Level() >= OutputDMASize) + { + // trigger output DMA + DSi::CheckNDMAs(1, 0x2B); + } +} + +void Update() +{ + while (InputFIFO->Level() >= 4 && OutputFIFO->Level() <= 12 && RemBlocks > 0) + { + switch (AESMode) + { + case 0: ProcessBlock_CCM_Decrypt(); break; + case 2: + case 3: ProcessBlock_CTR(); break; + default: + // dorp + OutputFIFO->Write(InputFIFO->Read()); + OutputFIFO->Write(InputFIFO->Read()); + OutputFIFO->Write(InputFIFO->Read()); + OutputFIFO->Write(InputFIFO->Read()); + } + + RemBlocks--; + } + + CheckOutputDMA(); + + if (RemBlocks == 0) + { + if (AESMode == 0) + { + Ctx.Iv[13] = 0x00; + Ctx.Iv[14] = 0x00; + Ctx.Iv[15] = 0x00; + AES_CTR_xcrypt_buffer(&Ctx, CurMAC, 16); + + //printf("FINAL MAC: "); _printhexR(CurMAC, 16); + //printf("INPUT MAC: "); _printhex(MAC, 16); + + Cnt |= (1<<21); + for (int i = 0; i < 16; i++) + { + if (CurMAC[15-i] != MAC[i]) Cnt &= ~(1<<21); + } + } + else + { + // CHECKME + Cnt &= ~(1<<21); + } + + Cnt &= ~(1<<31); + if (Cnt & (1<<30)) NDS::SetIRQ2(NDS::IRQ2_DSi_AES); + DSi::StopNDMAs(1, 0x2A); + + if (OutputFIFO->Level() > 0) + DSi::CheckNDMAs(1, 0x2B); + else + DSi::StopNDMAs(1, 0x2B); + OutputFlush = false; + } +} + + +void WriteIV(u32 offset, u32 val, u32 mask) +{ + u32 old = *(u32*)&IV[offset]; + + *(u32*)&IV[offset] = (old & ~mask) | (val & mask); + + //printf("AES: IV: "); _printhex(IV, 16); +} + +void WriteMAC(u32 offset, u32 val, u32 mask) +{ + u32 old = *(u32*)&MAC[offset]; + + *(u32*)&MAC[offset] = (old & ~mask) | (val & mask); + + //printf("AES: MAC: "); _printhex(MAC, 16); +} + +void DeriveNormalKey(u32 slot) +{ + const u8 key_const[16] = {0xFF, 0xFE, 0xFB, 0x4E, 0x29, 0x59, 0x02, 0x58, 0x2A, 0x68, 0x0F, 0x5F, 0x1A, 0x4F, 0x3E, 0x79}; + u8 tmp[16]; + + //printf("slot%d keyX: ", slot); _printhex(KeyX[slot], 16); + //printf("slot%d keyY: ", slot); _printhex(KeyY[slot], 16); + + for (int i = 0; i < 16; i++) + tmp[i] = KeyX[slot][i] ^ KeyY[slot][i]; + + u32 carry = 0; + for (int i = 0; i < 16; i++) + { + u32 res = tmp[i] + key_const[15-i] + carry; + tmp[i] = res & 0xFF; + carry = res >> 8; + } + + ROL16(tmp, 42); + + //printf("derive normalkey %d\n", slot); _printhex(tmp, 16); + + memcpy(KeyNormal[slot], tmp, 16); +} + +void WriteKeyNormal(u32 slot, u32 offset, u32 val, u32 mask) +{ + u32 old = *(u32*)&KeyNormal[slot][offset]; + + *(u32*)&KeyNormal[slot][offset] = (old & ~mask) | (val & mask); + + //printf("KeyNormal(%d): ", slot); _printhex(KeyNormal[slot], 16); +} + +void WriteKeyX(u32 slot, u32 offset, u32 val, u32 mask) +{ + u32 old = *(u32*)&KeyX[slot][offset]; + + *(u32*)&KeyX[slot][offset] = (old & ~mask) | (val & mask); + + //printf("KeyX(%d): ", slot); _printhex(KeyX[slot], 16); +} + +void WriteKeyY(u32 slot, u32 offset, u32 val, u32 mask) +{ + u32 old = *(u32*)&KeyY[slot][offset]; + + *(u32*)&KeyY[slot][offset] = (old & ~mask) | (val & mask); + + //printf("[%08X] KeyY(%d): ", NDS::GetPC(1), slot); _printhex(KeyY[slot], 16); + + if (offset >= 0xC) + { + DeriveNormalKey(slot); + } +} + + +// utility + +void GetModcryptKey(u8* romheader, u8* key) +{ + if ((romheader[0x01C] & 0x04) || (romheader[0x1BF] & 0x80)) + { + // dev key + memcpy(key, &romheader[0x000], 16); + return; + } + + u8 oldkeys[16*3]; + memcpy(&oldkeys[16*0], KeyX[0], 16); + memcpy(&oldkeys[16*1], KeyY[0], 16); + memcpy(&oldkeys[16*2], KeyNormal[0], 16); + + KeyX[0][8] = romheader[0x00C]; + KeyX[0][9] = romheader[0x00D]; + KeyX[0][10] = romheader[0x00E]; + KeyX[0][11] = romheader[0x00F]; + KeyX[0][12] = romheader[0x00F]; + KeyX[0][13] = romheader[0x00E]; + KeyX[0][14] = romheader[0x00D]; + KeyX[0][15] = romheader[0x00C]; + + memcpy(KeyY[0], &romheader[0x350], 16); + + DeriveNormalKey(0); + memcpy(key, KeyNormal[0], 16); + + memcpy(KeyX[0], &oldkeys[16*0], 16); + memcpy(KeyY[0], &oldkeys[16*1], 16); + memcpy(KeyNormal[0], &oldkeys[16*2], 16); +} + +void ApplyModcrypt(u8* data, u32 len, u8* key, u8* iv) +{ + u8 key_rev[16], iv_rev[16]; + u8 data_rev[16]; + u8 oldkeys[16*2]; + memcpy(&oldkeys[16*0], Ctx.RoundKey, 16); + memcpy(&oldkeys[16*1], Ctx.Iv, 16); + + Swap16(key_rev, key); + Swap16(iv_rev, iv); + AES_init_ctx_iv(&Ctx, key_rev, iv_rev); + + for (u32 i = 0; i < len; i += 16) + { + Swap16(data_rev, &data[i]); + AES_CTR_xcrypt_buffer(&Ctx, data_rev, 16); + Swap16(&data[i], data_rev); + } + + memcpy(Ctx.RoundKey, &oldkeys[16*0], 16); + memcpy(Ctx.Iv, &oldkeys[16*1], 16); +} + +} diff --git a/src/DSi_AES.h b/src/DSi_AES.h new file mode 100644 index 0000000..354c4a7 --- /dev/null +++ b/src/DSi_AES.h @@ -0,0 +1,54 @@ +/* + Copyright 2016-2019 Arisotura + + This file is part of melonDS. + + melonDS is free software: you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + melonDS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with melonDS. If not, see http://www.gnu.org/licenses/. +*/ + +#ifndef DSI_AES_H +#define DSI_AES_H + +#include "types.h" + +namespace DSi_AES +{ + +extern u32 Cnt; + +bool Init(); +void DeInit(); +void Reset(); + +u32 ReadCnt(); +void WriteCnt(u32 val); +void WriteBlkCnt(u32 val); + +u32 ReadOutputFIFO(); +void WriteInputFIFO(u32 val); +void CheckInputDMA(); +void CheckOutputDMA(); +void Update(); + +void WriteIV(u32 offset, u32 val, u32 mask); +void WriteMAC(u32 offset, u32 val, u32 mask); +void WriteKeyNormal(u32 slot, u32 offset, u32 val, u32 mask); +void WriteKeyX(u32 slot, u32 offset, u32 val, u32 mask); +void WriteKeyY(u32 slot, u32 offset, u32 val, u32 mask); + +void GetModcryptKey(u8* romheader, u8* key); +void ApplyModcrypt(u8* data, u32 len, u8* key, u8* iv); + +} + +#endif // DSI_AES_H diff --git a/src/DSi_Camera.cpp b/src/DSi_Camera.cpp new file mode 100644 index 0000000..45061b2 --- /dev/null +++ b/src/DSi_Camera.cpp @@ -0,0 +1,166 @@ +/* + Copyright 2016-2019 Arisotura + + This file is part of melonDS. + + melonDS is free software: you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + melonDS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with melonDS. If not, see http://www.gnu.org/licenses/. +*/ + +#include <stdio.h> +#include <string.h> +#include "DSi_Camera.h" + + +DSi_Camera* DSi_Camera0; // 78 / facing outside +DSi_Camera* DSi_Camera1; // 7A / selfie cam + + +bool DSi_Camera::Init() +{ + DSi_Camera0 = new DSi_Camera(0); + DSi_Camera1 = new DSi_Camera(1); + + return true; +} + +void DSi_Camera::DeInit() +{ + delete DSi_Camera0; + delete DSi_Camera1; +} + +void DSi_Camera::Reset() +{ + DSi_Camera0->ResetCam(); + DSi_Camera1->ResetCam(); +} + + +DSi_Camera::DSi_Camera(u32 num) +{ + Num = num; +} + +DSi_Camera::~DSi_Camera() +{ + // +} + +void DSi_Camera::ResetCam() +{ + DataPos = 0; + RegAddr = 0; + RegData = 0; + + PLLCnt = 0; + StandbyCnt = 0x4029; // checkme +} + + +void DSi_Camera::Start() +{ +} + +u8 DSi_Camera::Read(bool last) +{ + u8 ret; + + if (DataPos < 2) + { + printf("DSi_Camera: WHAT??\n"); + ret = 0; + } + else + { + if (DataPos & 0x1) + { + ret = RegData & 0xFF; + RegAddr += 2; // checkme + } + else + { + RegData = ReadReg(RegAddr); + ret = RegData >> 8; + } + } + + if (last) DataPos = 0; + else DataPos++; + + return ret; +} + +void DSi_Camera::Write(u8 val, bool last) +{ + if (DataPos < 2) + { + if (DataPos == 0) + RegAddr = val << 8; + else + RegAddr |= val; + + if (RegAddr & 0x1) printf("DSi_Camera: !! UNALIGNED REG ADDRESS %04X\n", RegAddr); + } + else + { + if (DataPos & 0x1) + { + RegData |= val; + WriteReg(RegAddr, RegData); + RegAddr += 2; // checkme + } + else + { + RegData = val << 8; + } + } + + if (last) DataPos = 0; + else DataPos++; +} + +u16 DSi_Camera::ReadReg(u16 addr) +{ + switch (addr) + { + case 0x0000: return 0x2280; // chip ID + case 0x0014: return PLLCnt; + case 0x0018: return StandbyCnt; + + case 0x301A: return ((~StandbyCnt) & 0x4000) >> 12; + } + + printf("DSi_Camera%d: unknown read %04X\n", Num, addr); + return 0; +} + +void DSi_Camera::WriteReg(u16 addr, u16 val) +{ + switch (addr) + { + case 0x0014: + // shouldn't be instant either? + val &= 0x7FFF; + val |= ((val & 0x0002) << 14); + PLLCnt = val; + return; + case 0x0018: + // TODO: this shouldn't be instant, but uh + val &= 0x003F; + val |= ((val & 0x0001) << 14); + StandbyCnt = val; + return; + } + + printf("DSi_Camera%d: unknown write %04X %04X\n", Num, addr, val); +} diff --git a/src/DSi_Camera.h b/src/DSi_Camera.h new file mode 100644 index 0000000..78629b5 --- /dev/null +++ b/src/DSi_Camera.h @@ -0,0 +1,58 @@ +/* + Copyright 2016-2019 Arisotura + + This file is part of melonDS. + + melonDS is free software: you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + melonDS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with melonDS. If not, see http://www.gnu.org/licenses/. +*/ + +#ifndef DSI_CAMERA_H +#define DSI_CAMERA_H + +#include "types.h" + +class DSi_Camera +{ +public: + static bool Init(); + static void DeInit(); + static void Reset(); + + DSi_Camera(u32 num); + ~DSi_Camera(); + + void ResetCam(); + + void Start(); + u8 Read(bool last); + void Write(u8 val, bool last); + +private: + u32 Num; + + u32 DataPos; + u32 RegAddr; + u16 RegData; + + u16 ReadReg(u16 addr); + void WriteReg(u16 addr, u16 val); + + u16 PLLCnt; + u16 StandbyCnt; +}; + + +extern DSi_Camera* DSi_Camera0; +extern DSi_Camera* DSi_Camera1; + +#endif // DSI_CAMERA_H diff --git a/src/DSi_I2C.cpp b/src/DSi_I2C.cpp new file mode 100644 index 0000000..9984f5e --- /dev/null +++ b/src/DSi_I2C.cpp @@ -0,0 +1,255 @@ +/* + Copyright 2016-2019 Arisotura + + This file is part of melonDS. + + melonDS is free software: you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + melonDS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with melonDS. If not, see http://www.gnu.org/licenses/. +*/ + +#include <stdio.h> +#include <string.h> +#include "DSi.h" +#include "DSi_I2C.h" +#include "DSi_Camera.h" + + +namespace DSi_BPTWL +{ + +u8 Registers[0x100]; +u32 CurPos; + +bool Init() +{ + return true; +} + +void DeInit() +{ +} + +void Reset() +{ + CurPos = -1; + memset(Registers, 0x5A, 0x100); + + Registers[0x00] = 0x33; // TODO: support others?? + Registers[0x01] = 0x00; + Registers[0x02] = 0x50; + Registers[0x10] = 0x00; // power btn + Registers[0x11] = 0x00; // reset + Registers[0x12] = 0x00; // power btn tap + Registers[0x20] = 0x83; // battery + Registers[0x21] = 0x07; + Registers[0x30] = 0x13; + Registers[0x31] = 0x00; // camera power + Registers[0x40] = 0x1F; // volume + Registers[0x41] = 0x04; // backlight + Registers[0x60] = 0x00; + Registers[0x61] = 0x01; + Registers[0x62] = 0x50; + Registers[0x63] = 0x00; + Registers[0x70] = 0x00; // boot flag + Registers[0x71] = 0x00; + Registers[0x72] = 0x00; + Registers[0x73] = 0x00; + Registers[0x74] = 0x00; + Registers[0x75] = 0x00; + Registers[0x76] = 0x00; + Registers[0x77] = 0x00; + Registers[0x80] = 0x10; + Registers[0x81] = 0x64; +} + +void Start() +{ + //printf("BPTWL: start\n"); +} + +u8 Read(bool last) +{ + if (last) + { + CurPos = -1; + return 0; + } + + //printf("BPTWL: read %02X -> %02X\n", CurPos, Registers[CurPos]); + return Registers[CurPos++]; +} + +void Write(u8 val, bool last) +{ + if (last) + { + CurPos = -1; + return; + } + + if (CurPos == -1) + { + CurPos = val; + //printf("BPTWL: reg=%02X\n", val); + return; + } + + if (CurPos == 0x11 && val == 0x01) + { + printf("BPTWL: soft-reset\n"); + val = 0; // checkme + // TODO: soft-reset might need to be scheduled later! + DSi::SoftReset(); + CurPos = -1; + return; + } + + if (CurPos == 0x11 || CurPos == 0x12 || + CurPos == 0x21 || + CurPos == 0x30 || CurPos == 0x31 || + CurPos == 0x40 || CurPos == 0x31 || + CurPos == 0x60 || CurPos == 0x63 || + (CurPos >= 0x70 && CurPos <= 0x77) || + CurPos == 0x80 || CurPos == 0x81) + { + Registers[CurPos] = val; + } + + //printf("BPTWL: write %02X -> %02X\n", CurPos, val); + CurPos++; // CHECKME +} + +} + + +namespace DSi_I2C +{ + +u8 Cnt; +u8 Data; + +u32 Device; + +bool Init() +{ + if (!DSi_BPTWL::Init()) return false; + if (!DSi_Camera::Init()) return false; + + return true; +} + +void DeInit() +{ + DSi_BPTWL::DeInit(); + DSi_Camera::DeInit(); +} + +void Reset() +{ + Cnt = 0; + Data = 0; + + Device = -1; + + DSi_BPTWL::Reset(); + DSi_Camera::Reset(); +} + +void WriteCnt(u8 val) +{ + //printf("I2C: write CNT %02X, %08X\n", val, NDS::GetPC(1)); + + // TODO: check ACK flag + // TODO: transfer delay + // TODO: IRQ + // TODO: check read/write direction + + if (val & (1<<7)) + { + bool islast = val & (1<<0); + + if (val & (1<<5)) + { + // read + val &= 0xF7; + + switch (Device) + { + case 0x4A: Data = DSi_BPTWL::Read(islast); break; + case 0x78: Data = DSi_Camera0->Read(islast); break; + case 0x7A: Data = DSi_Camera1->Read(islast); break; + default: + printf("I2C: read on unknown device %02X, cnt=%02X, data=%02X, last=%d\n", Device, val, 0, islast); + Data = 0xFF; + break; + } + + //printf("I2C read, device=%02X, cnt=%02X, data=%02X, last=%d\n", Device, val, Data, islast); + } + else + { + // write + val &= 0xE7; + bool ack = true; + + if (val & (1<<1)) + { + Device = Data & 0xFE; + //printf("I2C: %s start, device=%02X\n", (Data&0x01)?"read":"write", Device); + + switch (Device) + { + case 0x4A: DSi_BPTWL::Start(); break; + case 0x78: DSi_Camera0->Start(); break; + case 0x7A: DSi_Camera1->Start(); break; + default: + printf("I2C: %s start on unknown device %02X\n", (Data&0x01)?"read":"write", Device); + ack = false; + break; + } + } + else + { + //printf("I2C write, device=%02X, cnt=%02X, data=%02X, last=%d\n", Device, val, Data, islast); + + switch (Device) + { + case 0x4A: DSi_BPTWL::Write(Data, islast); break; + case 0x78: DSi_Camera0->Write(Data, islast); break; + case 0x7A: DSi_Camera1->Write(Data, islast); break; + default: + printf("I2C: write on unknown device %02X, cnt=%02X, data=%02X, last=%d\n", Device, val, Data, islast); + ack = false; + break; + } + } + + if (ack) val |= (1<<4); + } + + val &= 0x7F; + } + + Cnt = val; +} + +u8 ReadData() +{ + return Data; +} + +void WriteData(u8 val) +{ + Data = val; +} + +} diff --git a/src/DSi_I2C.h b/src/DSi_I2C.h new file mode 100644 index 0000000..d058be1 --- /dev/null +++ b/src/DSi_I2C.h @@ -0,0 +1,41 @@ +/* + Copyright 2016-2019 Arisotura + + This file is part of melonDS. + + melonDS is free software: you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + melonDS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with melonDS. If not, see http://www.gnu.org/licenses/. +*/ + +#ifndef DSI_I2C_H +#define DSI_I2C_H + +namespace DSi_I2C +{ + +extern u8 Cnt; + +bool Init(); +void DeInit(); +void Reset(); +//void DoSavestate(Savestate* file); + +void WriteCnt(u8 val); + +u8 ReadData(); +void WriteData(u8 val); + +//void TransferDone(u32 param); + +} + +#endif // DSI_I2C_H diff --git a/src/DSi_NDMA.cpp b/src/DSi_NDMA.cpp new file mode 100644 index 0000000..19c72b6 --- /dev/null +++ b/src/DSi_NDMA.cpp @@ -0,0 +1,341 @@ +/* + Copyright 2016-2019 Arisotura + + This file is part of melonDS. + + melonDS is free software: you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + melonDS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with melonDS. If not, see http://www.gnu.org/licenses/. +*/ + +#include <stdio.h> +#include "NDS.h" +#include "DSi.h" +#include "DSi_NDMA.h" +#include "GPU.h" +#include "DSi_AES.h" + + + +DSi_NDMA::DSi_NDMA(u32 cpu, u32 num) +{ + CPU = cpu; + Num = num; + + Reset(); +} + +DSi_NDMA::~DSi_NDMA() +{ +} + +void DSi_NDMA::Reset() +{ + SrcAddr = 0; + DstAddr = 0; + TotalLength = 0; + BlockLength = 0; + SubblockTimer = 0; + FillData = 0; + Cnt = 0; + + StartMode = 0; + CurSrcAddr = 0; + CurDstAddr = 0; + SubblockLength = 0; + RemCount = 0; + IterCount = 0; + TotalRemCount = 0; + SrcAddrInc = 0; + DstAddrInc = 0; + + Running = false; + InProgress = false; +} + +void DSi_NDMA::DoSavestate(Savestate* file) +{ + // TODO! +} + +void DSi_NDMA::WriteCnt(u32 val) +{ + u32 oldcnt = Cnt; + Cnt = val; + + if ((!(oldcnt & 0x80000000)) && (val & 0x80000000)) // checkme + { + CurSrcAddr = SrcAddr; + CurDstAddr = DstAddr; + TotalRemCount = TotalLength; + + switch ((Cnt >> 10) & 0x3) + { + case 0: DstAddrInc = 1; break; + case 1: DstAddrInc = -1; break; + case 2: DstAddrInc = 0; break; + case 3: DstAddrInc = 1; printf("BAD NDMA DST INC MODE 3\n"); break; + } + + switch ((Cnt >> 13) & 0x3) + { + case 0: SrcAddrInc = 1; break; + case 1: SrcAddrInc = -1; break; + case 2: SrcAddrInc = 0; break; + case 3: SrcAddrInc = 0; break; // fill mode + } + + StartMode = (Cnt >> 24) & 0x1F; + if (StartMode > 0x10) StartMode = 0x10; + if (CPU == 1) StartMode |= 0x20; + + if ((StartMode & 0x1F) == 0x10) + Start(); + + if (StartMode != 0x10 && StartMode != 0x30 && + StartMode != 0x04 && StartMode != 0x06 && StartMode != 0x07 && StartMode != 0x08 && StartMode != 0x09 && + StartMode != 0x24 && StartMode != 0x26 && StartMode != 0x28 && StartMode != 0x29 && StartMode != 0x2A && StartMode != 0x2B) + printf("UNIMPLEMENTED ARM%d NDMA%d START MODE %02X, %08X->%08X LEN=%d BLK=%d CNT=%08X\n", + CPU?7:9, Num, StartMode, SrcAddr, DstAddr, TotalLength, BlockLength, Cnt); + } +} + +void DSi_NDMA::Start() +{ + if (Running) return; + + if (!InProgress) + { + RemCount = BlockLength; + if (!RemCount) + RemCount = 0x1000000; + } + + // TODO: how does GXFIFO DMA work with all the block shito? + IterCount = RemCount; + + if (((StartMode & 0x1F) != 0x10) && !(Cnt & (1<<29))) + { + if (IterCount > TotalRemCount) + { + IterCount = TotalRemCount; + RemCount = IterCount; + } + } + + if (Cnt & (1<<12)) CurDstAddr = DstAddr; + if (Cnt & (1<<15)) CurSrcAddr = SrcAddr; + + //printf("ARM%d NDMA%d %08X %02X %08X->%08X %d bytes, total=%d\n", CPU?7:9, Num, Cnt, StartMode, CurSrcAddr, CurDstAddr, RemCount*4, TotalRemCount*4); + + //IsGXFIFODMA = (CPU == 0 && (CurSrcAddr>>24) == 0x02 && CurDstAddr == 0x04000400 && DstAddrInc == 0); + + // TODO eventually: not stop if we're running code in ITCM + + //if (SubblockTimer & 0xFFFF) + // printf("TODO! NDMA SUBBLOCK TIMER: %08X\n", SubblockTimer); + + if (NDS::DMAsRunning(CPU)) + Running = 1; + else + Running = 2; + + InProgress = true; + NDS::StopCPU(CPU, 1<<(Num+4)); +} + +void DSi_NDMA::Run() +{ + if (!Running) return; + if (CPU == 0) return Run9(); + else return Run7(); +} + +void DSi_NDMA::Run9() +{ + if (NDS::ARM9Timestamp >= NDS::ARM9Target) return; + + Executing = true; + + // add NS penalty for first accesses in burst + bool burststart = (Running == 2); + Running = 1; + + s32 unitcycles; + //s32 lastcycles = cycles; + + bool dofill = ((Cnt >> 13) & 0x3) == 3; + + if ((CurSrcAddr >> 24) == 0x02 && (CurDstAddr >> 24) == 0x02) + { + unitcycles = NDS::ARM9MemTimings[CurSrcAddr >> 14][2] + NDS::ARM9MemTimings[CurDstAddr >> 14][2]; + } + else + { + unitcycles = NDS::ARM9MemTimings[CurSrcAddr >> 14][3] + NDS::ARM9MemTimings[CurDstAddr >> 14][3]; + if ((CurSrcAddr >> 24) == (CurDstAddr >> 24)) + unitcycles++; + else if ((CurSrcAddr >> 24) == 0x02) + unitcycles--; + + /*if (burststart) + { + cycles -= 2; + cycles -= (NDS::ARM9MemTimings[CurSrcAddr >> 14][2] + NDS::ARM9MemTimings[CurDstAddr >> 14][2]); + cycles += unitcycles; + }*/ + } + + while (IterCount > 0 && !Stall) + { + NDS::ARM9Timestamp += (unitcycles << NDS::ARM9ClockShift); + + if (dofill) + DSi::ARM9Write32(CurDstAddr, FillData); + else + DSi::ARM9Write32(CurDstAddr, DSi::ARM9Read32(CurSrcAddr)); + + CurSrcAddr += SrcAddrInc<<2; + CurDstAddr += DstAddrInc<<2; + IterCount--; + RemCount--; + TotalRemCount--; + + if (NDS::ARM9Timestamp >= NDS::ARM9Target) break; + } + + Executing = false; + Stall = false; + + if (RemCount) + { + if (IterCount == 0) + { + Running = 0; + NDS::ResumeCPU(0, 1<<(Num+4)); + + //if (StartMode == 0x07) + // GPU3D::CheckFIFODMA(); + } + + return; + } + + if ((StartMode & 0x1F) == 0x10) // CHECKME + { + Cnt &= ~(1<<31); + if (Cnt & (1<<30)) NDS::SetIRQ(0, NDS::IRQ_DSi_NDMA0 + Num); + } + else if (!(Cnt & (1<<29))) + { + if (TotalRemCount == 0) + { + Cnt &= ~(1<<31); + if (Cnt & (1<<30)) NDS::SetIRQ(0, NDS::IRQ_DSi_NDMA0 + Num); + } + } + + Running = 0; + InProgress = false; + NDS::ResumeCPU(0, 1<<(Num+4)); +} + +void DSi_NDMA::Run7() +{ + if (NDS::ARM7Timestamp >= NDS::ARM7Target) return; + + Executing = true; + + // add NS penalty for first accesses in burst + bool burststart = (Running == 2); + Running = 1; + + s32 unitcycles; + //s32 lastcycles = cycles; + + bool dofill = ((Cnt >> 13) & 0x3) == 3; + + if ((CurSrcAddr >> 24) == 0x02 && (CurDstAddr >> 24) == 0x02) + { + unitcycles = NDS::ARM7MemTimings[CurSrcAddr >> 15][2] + NDS::ARM7MemTimings[CurDstAddr >> 15][2]; + } + else + { + unitcycles = NDS::ARM7MemTimings[CurSrcAddr >> 15][3] + NDS::ARM7MemTimings[CurDstAddr >> 15][3]; + if ((CurSrcAddr >> 23) == (CurDstAddr >> 23)) + unitcycles++; + else if ((CurSrcAddr >> 24) == 0x02) + unitcycles--; + + /*if (burststart) + { + cycles -= 2; + cycles -= (NDS::ARM7MemTimings[CurSrcAddr >> 15][2] + NDS::ARM7MemTimings[CurDstAddr >> 15][2]); + cycles += unitcycles; + }*/ + } + + while (IterCount > 0 && !Stall) + { + NDS::ARM7Timestamp += unitcycles; + + if (dofill) + DSi::ARM7Write32(CurDstAddr, FillData); + else + DSi::ARM7Write32(CurDstAddr, DSi::ARM7Read32(CurSrcAddr)); + + CurSrcAddr += SrcAddrInc<<2; + CurDstAddr += DstAddrInc<<2; + IterCount--; + RemCount--; + TotalRemCount--; + + if (NDS::ARM7Timestamp >= NDS::ARM7Target) break; + } + + Executing = false; + Stall = false; + + if (RemCount) + { + if (IterCount == 0) + { + Running = 0; + NDS::ResumeCPU(1, 1<<(Num+4)); + + DSi_AES::CheckInputDMA(); + DSi_AES::CheckOutputDMA(); + } + + return; + } + + if ((StartMode & 0x1F) == 0x10) // CHECKME + { + Cnt &= ~(1<<31); + if (Cnt & (1<<30)) NDS::SetIRQ(1, NDS::IRQ_DSi_NDMA0 + Num); + } + else if (!(Cnt & (1<<29))) + { + if (TotalRemCount == 0) + { + Cnt &= ~(1<<31); + if (Cnt & (1<<30)) NDS::SetIRQ(1, NDS::IRQ_DSi_NDMA0 + Num); + } + } + + Running = 0; + InProgress = false; + NDS::ResumeCPU(1, 1<<(Num+4)); + + DSi_AES::CheckInputDMA(); + DSi_AES::CheckOutputDMA(); +} diff --git a/src/DSi_NDMA.h b/src/DSi_NDMA.h new file mode 100644 index 0000000..d7b7483 --- /dev/null +++ b/src/DSi_NDMA.h @@ -0,0 +1,96 @@ +/* + Copyright 2016-2019 Arisotura + + This file is part of melonDS. + + melonDS is free software: you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + melonDS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with melonDS. If not, see http://www.gnu.org/licenses/. +*/ + +#ifndef DSI_NDMA_H +#define DSI_NDMA_H + +#include "types.h" + +class DSi_NDMA +{ +public: + DSi_NDMA(u32 cpu, u32 num); + ~DSi_NDMA(); + + void Reset(); + + void DoSavestate(Savestate* file); + + void WriteCnt(u32 val); + void Start(); + + void Run(); + + void Run9(); + void Run7(); + + bool IsInMode(u32 mode) + { + return ((mode == StartMode) && (Cnt & 0x80000000)); + } + + bool IsRunning() { return Running!=0; } + + void StartIfNeeded(u32 mode) + { + if ((mode == StartMode) && (Cnt & 0x80000000)) + Start(); + } + + void StopIfNeeded(u32 mode) + { + if (mode == StartMode) + Cnt &= ~0x80000000; + } + + void StallIfRunning() + { + if (Executing) Stall = true; + } + + u32 SrcAddr; + u32 DstAddr; + u32 TotalLength; // total length, when transferring multiple blocks + u32 BlockLength; // length of one transfer + u32 SubblockTimer; // optional delay between subblocks (only in round-robin mode) + u32 FillData; + u32 Cnt; + +private: + u32 CPU, Num; + + u32 StartMode; + u32 CurSrcAddr; + u32 CurDstAddr; + u32 SubblockLength; // length transferred per run when delay is used + u32 RemCount; + u32 IterCount; + u32 TotalRemCount; + u32 SrcAddrInc; + u32 DstAddrInc; + + u32 Running; + bool InProgress; + + bool Executing; + bool Stall; + + bool IsGXFIFODMA; +}; + +#endif // DSI_NDMA_H diff --git a/src/DSi_NWifi.cpp b/src/DSi_NWifi.cpp new file mode 100644 index 0000000..79bc632 --- /dev/null +++ b/src/DSi_NWifi.cpp @@ -0,0 +1,881 @@ +/* + Copyright 2016-2019 Arisotura + + This file is part of melonDS. + + melonDS is free software: you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + melonDS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with melonDS. If not, see http://www.gnu.org/licenses/. +*/ + +#include <string.h> +#include <stdio.h> +#include "DSi.h" +#include "DSi_NWifi.h" +#include "SPI.h" + + +const u8 CIS0[256] = +{ + 0x01, 0x03, 0xD9, 0x01, 0xFF, + 0x20, 0x04, 0x71, 0x02, 0x00, 0x02, + 0x21, 0x02, 0x0C, 0x00, + 0x22, 0x04, 0x00, 0x00, 0x08, 0x32, + 0x1A, 0x05, 0x01, 0x01, 0x00, 0x02, 0x07, + 0x1B, 0x08, 0xC1, 0x41, 0x30, 0x30, 0xFF, 0xFF, 0x32, 0x00, + 0x14, 0x00, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00 +}; + +const u8 CIS1[256] = +{ + 0x20, 0x04, 0x71, 0x02, 0x00, 0x02, + 0x21, 0x02, 0x0C, 0x00, + 0x22, 0x2A, 0x01, + 0x01, 0x11, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x08, + 0x00, 0x00, 0xFF, 0x80, + 0x00, 0x00, 0x00, + 0x00, 0x01, 0x0A, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x01, + 0x00, 0x01, 0x00, 0x01, + 0x80, 0x01, 0x06, + 0x81, 0x01, 0x07, + 0x82, 0x01, 0xDF, + 0xFF, + 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + + +// hax +DSi_NWifi* hax_wifi; +void triggerirq(u32 param) +{ + hax_wifi->SetIRQ_F1_Counter(0); +} + + +DSi_NWifi::DSi_NWifi(DSi_SDHost* host) : DSi_SDDevice(host) +{ + TransferCmd = 0xFFFFFFFF; + RemSize = 0; + + F0_IRQEnable = 0; + F0_IRQStatus = 0; + + F1_IRQEnable = 0; F1_IRQEnable_CPU = 0; F1_IRQEnable_Error = 0; F1_IRQEnable_Counter = 0; + F1_IRQStatus = 0; F1_IRQStatus_CPU = 0; F1_IRQStatus_Error = 0; F1_IRQStatus_Counter = 0; + + WindowData = 0; + WindowReadAddr = 0; + WindowWriteAddr = 0; + + // TODO: check the actual mailbox size (presumably 0x200) + for (int i = 0; i < 8; i++) + Mailbox[i] = new FIFO<u8>(0x200); + + u8* mac = SPI_Firmware::GetWifiMAC(); + printf("NWifi MAC: %02X:%02X:%02X:%02X:%02X:%02X\n", + mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); + + memset(EEPROM, 0, 0x400); + + *(u32*)&EEPROM[0x000] = 0x300; + *(u16*)&EEPROM[0x008] = 0x8348; // TODO: determine properly (country code) + memcpy(&EEPROM[0x00A], mac, 6); + *(u32*)&EEPROM[0x010] = 0x60000000; + + memset(&EEPROM[0x03C], 0xFF, 0x70); + memset(&EEPROM[0x140], 0xFF, 0x8); + + u16 chk = 0xFFFF; + for (int i = 0; i < 0x300; i+=2) + chk ^= *(u16*)&EEPROM[i]; + + *(u16*)&EEPROM[0x004] = chk; + + EEPROMReady = 0; + + BootPhase = 0; +} + +DSi_NWifi::~DSi_NWifi() +{ + for (int i = 0; i < 8; i++) + delete Mailbox[i]; +} + + +// CHECKME +// can IRQ status bits be set when the corresponding IRQs are disabled in the enable register? +// otherwise, does disabling them clear the status register? + +void DSi_NWifi::UpdateIRQ() +{ + F0_IRQStatus = 0; + IRQ = false; + + if (F1_IRQStatus & F1_IRQEnable) + F0_IRQStatus |= (1<<1); + + if (F0_IRQEnable & (1<<0)) + { + if (F0_IRQStatus & F0_IRQEnable) + IRQ = true; + } + + Host->SetCardIRQ(); +} + +void DSi_NWifi::UpdateIRQ_F1() +{ + F1_IRQStatus = 0; + + if (!Mailbox[4]->IsEmpty()) F1_IRQStatus |= (1<<0); + if (!Mailbox[5]->IsEmpty()) F1_IRQStatus |= (1<<1); + if (!Mailbox[6]->IsEmpty()) F1_IRQStatus |= (1<<2); + if (!Mailbox[7]->IsEmpty()) F1_IRQStatus |= (1<<3); + if (F1_IRQStatus_Counter & F1_IRQEnable_Counter) F1_IRQStatus |= (1<<4); + if (F1_IRQStatus_CPU & F1_IRQEnable_CPU) F1_IRQStatus |= (1<<6); + if (F1_IRQStatus_Error & F1_IRQEnable_Error) F1_IRQStatus |= (1<<7); + + UpdateIRQ(); +} + +void DSi_NWifi::SetIRQ_F1_Counter(u32 n) +{ + F1_IRQStatus_Counter |= (1<<n); + UpdateIRQ_F1(); +} + +void DSi_NWifi::ClearIRQ_F1_Counter(u32 n) +{ + F1_IRQStatus_Counter &= ~(1<<n); + UpdateIRQ_F1(); +} + +void DSi_NWifi::SetIRQ_F1_CPU(u32 n) +{ + F1_IRQStatus_CPU |= (1<<n); + UpdateIRQ_F1(); +} + + +u8 DSi_NWifi::F0_Read(u32 addr) +{ + switch (addr) + { + case 0x00000: return 0x11; + case 0x00001: return 0x00; + + case 0x00002: return 0x02; // writable?? + case 0x00003: return 0x02; + + case 0x00004: return F0_IRQEnable; + case 0x00005: return F0_IRQStatus; + + case 0x00008: return 0x17; + + case 0x00009: return 0x00; + case 0x0000A: return 0x10; + case 0x0000B: return 0x00; + + case 0x00012: return 0x03; + + case 0x00109: return 0x00; + case 0x0010A: return 0x11; + case 0x0010B: return 0x00; + } + + if (addr >= 0x01000 && addr < 0x01100) + { + return CIS0[addr & 0xFF]; + } + if (addr >= 0x01100 && addr < 0x01200) + { + return CIS1[addr & 0xFF]; + } + + printf("NWIFI: unknown func0 read %05X\n", addr); + return 0; +} + +void DSi_NWifi::F0_Write(u32 addr, u8 val) +{ + switch (addr) + { + case 0x00004: + F0_IRQEnable = val; + UpdateIRQ(); + return; + } + + printf("NWIFI: unknown func0 write %05X %02X\n", addr, val); +} + + +u8 DSi_NWifi::F1_Read(u32 addr) +{ + if (addr < 0x100) + { + u8 ret = Mailbox[4]->Read(); + UpdateIRQ_F1(); + return ret; + } + else if (addr < 0x200) + { + u8 ret = Mailbox[5]->Read(); + UpdateIRQ_F1(); + return ret; + } + else if (addr < 0x300) + { + u8 ret = Mailbox[6]->Read(); + UpdateIRQ_F1(); + return ret; + } + else if (addr < 0x400) + { + u8 ret = Mailbox[7]->Read(); + UpdateIRQ_F1(); + return ret; + } + else if (addr < 0x800) + { + switch (addr) + { + case 0x00400: return F1_IRQStatus; + case 0x00401: return F1_IRQStatus_CPU; + case 0x00402: return F1_IRQStatus_Error; + case 0x00403: return F1_IRQStatus_Counter; + + case 0x00405: + { + u8 ret = 0; + + if (Mailbox[4]->Level() >= 4) ret |= (1<<0); + if (Mailbox[5]->Level() >= 4) ret |= (1<<1); + if (Mailbox[6]->Level() >= 4) ret |= (1<<2); + if (Mailbox[7]->Level() >= 4) ret |= (1<<3); + + return ret; + } + + case 0x00408: return Mailbox[4]->Peek(0); + case 0x00409: return Mailbox[4]->Peek(1); + case 0x0040A: return Mailbox[4]->Peek(2); + case 0x0040B: return Mailbox[4]->Peek(3); + + case 0x00418: return F1_IRQEnable; + case 0x00419: return F1_IRQEnable_CPU; + case 0x0041A: return F1_IRQEnable_Error; + case 0x0041B: return F1_IRQEnable_Counter; + + // GROSS FUCKING HACK + case 0x00440: ClearIRQ_F1_Counter(0); return 0; + case 0x00450: return 1; // HAX!! + + case 0x00474: return WindowData & 0xFF; + case 0x00475: return (WindowData >> 8) & 0xFF; + case 0x00476: return (WindowData >> 16) & 0xFF; + case 0x00477: return WindowData >> 24; + } + } + else if (addr < 0x1000) + { + u8 ret = Mailbox[4]->Read(); + UpdateIRQ_F1(); + return ret; + } + else if (addr < 0x1800) + { + u8 ret = Mailbox[5]->Read(); + UpdateIRQ_F1(); + return ret; + } + else if (addr < 0x2000) + { + u8 ret = Mailbox[6]->Read(); + UpdateIRQ_F1(); + return ret; + } + else if (addr < 0x2800) + { + u8 ret = Mailbox[7]->Read(); + UpdateIRQ_F1(); + return ret; + } + else + { + u8 ret = Mailbox[4]->Read(); + UpdateIRQ_F1(); + return ret; + } + + printf("NWIFI: unknown func1 read %05X\n", addr); + return 0; +} + +void DSi_NWifi::F1_Write(u32 addr, u8 val) +{ + if (addr < 0x100) + { + if (Mailbox[0]->IsFull()) printf("!!! NWIFI: MBOX0 FULL\n"); + Mailbox[0]->Write(val); + if (addr == 0xFF) HandleCommand(); + UpdateIRQ_F1(); + return; + } + else if (addr < 0x200) + { + if (Mailbox[1]->IsFull()) printf("!!! NWIFI: MBOX1 FULL\n"); + Mailbox[1]->Write(val); + UpdateIRQ_F1(); + return; + } + else if (addr < 0x300) + { + if (Mailbox[2]->IsFull()) printf("!!! NWIFI: MBOX2 FULL\n"); + Mailbox[2]->Write(val); + UpdateIRQ_F1(); + return; + } + else if (addr < 0x400) + { + if (Mailbox[3]->IsFull()) printf("!!! NWIFI: MBOX3 FULL\n"); + Mailbox[3]->Write(val); + UpdateIRQ_F1(); + return; + } + else if (addr < 0x800) + { + switch (addr) + { + case 0x00418: F1_IRQEnable = val; UpdateIRQ_F1(); return; + case 0x00419: F1_IRQEnable_CPU = val; UpdateIRQ_F1(); return; + case 0x0041A: F1_IRQEnable_Error = val; UpdateIRQ_F1(); return; + case 0x0041B: F1_IRQEnable_Counter = val; UpdateIRQ_F1(); return; + + // GROSS FUCKING HACK + case 0x00440: ClearIRQ_F1_Counter(0); return; + + case 0x00474: WindowData = (WindowData & 0xFFFFFF00) | val; return; + case 0x00475: WindowData = (WindowData & 0xFFFF00FF) | (val << 8); return; + case 0x00476: WindowData = (WindowData & 0xFF00FFFF) | (val << 16); return; + case 0x00477: WindowData = (WindowData & 0x00FFFFFF) | (val << 24); return; + + case 0x00478: + WindowWriteAddr = (WindowWriteAddr & 0xFFFFFF00) | val; + WindowWrite(WindowWriteAddr, WindowData); + return; + case 0x00479: WindowWriteAddr = (WindowWriteAddr & 0xFFFF00FF) | (val << 8); return; + case 0x0047A: WindowWriteAddr = (WindowWriteAddr & 0xFF00FFFF) | (val << 16); return; + case 0x0047B: WindowWriteAddr = (WindowWriteAddr & 0x00FFFFFF) | (val << 24); return; + + case 0x0047C: + WindowReadAddr = (WindowReadAddr & 0xFFFFFF00) | val; + WindowData = WindowRead(WindowReadAddr); + return; + case 0x0047D: WindowReadAddr = (WindowReadAddr & 0xFFFF00FF) | (val << 8); return; + case 0x0047E: WindowReadAddr = (WindowReadAddr & 0xFF00FFFF) | (val << 16); return; + case 0x0047F: WindowReadAddr = (WindowReadAddr & 0x00FFFFFF) | (val << 24); return; + } + } + else if (addr < 0x1000) + { + if (Mailbox[0]->IsFull()) printf("!!! NWIFI: MBOX0 FULL\n"); + Mailbox[0]->Write(val); + if (addr == 0xFFF) HandleCommand(); + UpdateIRQ_F1(); + return; + } + else if (addr < 0x1800) + { + if (Mailbox[1]->IsFull()) printf("!!! NWIFI: MBOX1 FULL\n"); + Mailbox[1]->Write(val); + UpdateIRQ_F1(); + return; + } + else if (addr < 0x2000) + { + if (Mailbox[2]->IsFull()) printf("!!! NWIFI: MBOX2 FULL\n"); + Mailbox[2]->Write(val); + UpdateIRQ_F1(); + return; + } + else if (addr < 0x2800) + { + if (Mailbox[3]->IsFull()) printf("!!! NWIFI: MBOX3 FULL\n"); + Mailbox[3]->Write(val); + UpdateIRQ_F1(); + return; + } + else + { + if (Mailbox[0]->IsFull()) printf("!!! NWIFI: MBOX0 FULL\n"); + Mailbox[0]->Write(val); + if (addr == 0x3FFF) HandleCommand(); // CHECKME + UpdateIRQ_F1(); + return; + } + + printf("NWIFI: unknown func1 write %05X %02X\n", addr, val); +} + + +u8 DSi_NWifi::SDIO_Read(u32 func, u32 addr) +{ + switch (func) + { + case 0: return F0_Read(addr); + case 1: return F1_Read(addr); + } + + printf("NWIFI: unknown SDIO read %d %05X\n", func, addr); + return 0; +} + +void DSi_NWifi::SDIO_Write(u32 func, u32 addr, u8 val) +{ + switch (func) + { + case 0: return F0_Write(addr, val); + case 1: return F1_Write(addr, val); + } + + printf("NWIFI: unknown SDIO write %d %05X %02X\n", func, addr, val); +} + + +void DSi_NWifi::SendCMD(u8 cmd, u32 param) +{ + switch (cmd) + { + case 12: + // stop command + // CHECKME: does the SDIO controller actually send those?? + // DSi firmware sets it to send them + return; + + case 52: // IO_RW_DIRECT + { + u32 func = (param >> 28) & 0x7; + u32 addr = (param >> 9) & 0x1FFFF; + + if (param & (1<<31)) + { + // write + + u8 val = param & 0xFF; + SDIO_Write(func, addr, val); + if (param & (1<<27)) + val = SDIO_Read(func, addr); // checkme + Host->SendResponse(val | 0x1000, true); + } + else + { + // read + + u8 val = SDIO_Read(func, addr); + Host->SendResponse(val | 0x1000, true); + } + } + return; + + case 53: // IO_RW_EXTENDED + { + u32 addr = (param >> 9) & 0x1FFFF; + + TransferCmd = param; + TransferAddr = addr; + if (param & (1<<27)) + { + RemSize = (param & 0x1FF) << 9; // checkme + } + else + { + RemSize = (param & 0x1FF); + if (!RemSize) RemSize = 0x200; + } + + if (param & (1<<31)) + { + // write + + WriteBlock(); + Host->SendResponse(0x1000, true); + } + else + { + // read + + ReadBlock(); + Host->SendResponse(0x1000, true); + } + } + return; + } + + printf("NWIFI: unknown CMD %d %08X\n", cmd, param); +} + +void DSi_NWifi::SendACMD(u8 cmd, u32 param) +{ + printf("NWIFI: unknown ACMD %d %08X\n", cmd, param); +} + +void DSi_NWifi::ContinueTransfer() +{ + if (TransferCmd & (1<<31)) + WriteBlock(); + else + ReadBlock(); +} + +void DSi_NWifi::ReadBlock() +{ + u32 func = (TransferCmd >> 28) & 0x7; + u32 len = (TransferCmd & (1<<27)) ? 0x200 : RemSize; + + len = Host->GetTransferrableLen(len); + + u8 data[0x200]; + + for (u32 i = 0; i < len; i++) + { + data[i] = SDIO_Read(func, TransferAddr); + if (TransferCmd & (1<<26)) + { + TransferAddr++; + TransferAddr &= 0x1FFFF; // checkme + } + } + len = Host->DataRX(data, len); + + if (RemSize > 0) + { + RemSize -= len; + if (RemSize == 0) + { + // TODO? + } + } +} + +void DSi_NWifi::WriteBlock() +{ + u32 func = (TransferCmd >> 28) & 0x7; + u32 len = (TransferCmd & (1<<27)) ? 0x200 : RemSize; + + len = Host->GetTransferrableLen(len); + + u8 data[0x200]; + if (len = Host->DataTX(data, len)) + { + for (u32 i = 0; i < len; i++) + { + SDIO_Write(func, TransferAddr, data[i]); + if (TransferCmd & (1<<26)) + { + TransferAddr++; + TransferAddr &= 0x1FFFF; // checkme + } + } + + if (RemSize > 0) + { + RemSize -= len; + if (RemSize == 0) + { + // TODO? + } + } + } +} + + +void DSi_NWifi::HandleCommand() +{ + switch (BootPhase) + { + case 0: return BMI_Command(); + case 1: return WMI_Command(); + } +} + +void DSi_NWifi::BMI_Command() +{ + // HLE command handling stub + u32 cmd = MB_Read32(0); + + switch (cmd) + { + case 0x01: // BMI_DONE + { + printf("BMI_DONE\n"); + EEPROMReady = 1; // GROSS FUCKING HACK + u8 ready_msg[8] = {0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00}; + SendWMIFrame(ready_msg, 8, 0, 0x00, 0x0000); + BootPhase = 1; + } + return; + + case 0x03: // BMI_WRITE_MEMORY + { + u32 addr = MB_Read32(0); + u32 len = MB_Read32(0); + printf("BMI mem write %08X %08X\n", addr, len); + + for (int i = 0; i < len; i++) + { + u8 val = Mailbox[0]->Read(); + + // TODO: do something with it!! + } + } + return; + + case 0x04: // BMI_EXECUTE + { + u32 entry = MB_Read32(0); + u32 arg = MB_Read32(0); + + printf("BMI_EXECUTE %08X %08X\n", entry, arg); + } + return; + + case 0x06: // BMI_READ_SOC_REGISTER + { + u32 addr = MB_Read32(0); + u32 val = WindowRead(addr); + MB_Write32(4, val); + } + return; + + case 0x07: // BMI_WRITE_SOC_REGISTER + { + u32 addr = MB_Read32(0); + u32 val = MB_Read32(0); + WindowWrite(addr, val); + } + return; + + case 0x08: // BMI_GET_TARGET_ID + MB_Write32(4, 0xFFFFFFFF); + MB_Write32(4, 0x0000000C); + //MB_Write32(4, 0x20000118); + MB_Write32(4, 0x23000024); // ROM version (TODO: how to determine correct one?) + MB_Write32(4, 0x00000002); + return; + + case 0x0D: // BMI_LZ_STREAM_START + { + u32 addr = MB_Read32(0); + printf("BMI_LZ_STREAM_START %08X\n", addr); + } + return; + + case 0x0E: // BMI_LZ_DATA + { + u32 len = MB_Read32(0); + printf("BMI LZ write %08X\n", len); + //FILE* f = fopen("wififirm.bin", "ab"); + + for (int i = 0; i < len; i++) + { + u8 val = Mailbox[0]->Read(); + + // TODO: do something with it!! + //fwrite(&val, 1, 1, f); + } + //fclose(f); + } + return; + + default: + printf("unknown BMI command %08X\n", cmd); + return; + } +} + +void DSi_NWifi::WMI_Command() +{ + // HLE command handling stub + u16 h0 = MB_Read16(0); + u16 len = MB_Read16(0); + u16 h2 = MB_Read16(0); + + u16 cmd = MB_Read16(0); + printf("WMI: cmd %04X\n", cmd); + + switch (cmd) + { + case 0x0002: // service connect + { + u16 svc_id = MB_Read16(0); + u16 conn_flags = MB_Read16(0); + + u8 svc_resp[10]; + *(u16*)&svc_resp[0] = 0x0003; + *(u16*)&svc_resp[2] = svc_id; + svc_resp[4] = 0; + svc_resp[5] = (svc_id & 0xFF) + 1; + *(u16*)&svc_resp[6] = 0x0001; + *(u16*)&svc_resp[8] = 0x0001; + SendWMIFrame(svc_resp, 10, 0, 0x00, 0x0000); + } + break; + + case 0x0004: // setup complete + { + u8 ready_evt[14]; + memset(ready_evt, 0, 14); + *(u16*)&ready_evt[0] = 0x1001; + memcpy(&ready_evt[2], SPI_Firmware::GetWifiMAC(), 6); + ready_evt[8] = 0x02; + *(u32*)&ready_evt[10] = 0x23000024; + // ctrl[0] = trailer size + // trailer[1] = trailer extra size + // trailer[0] = trailer type??? + SendWMIFrame(ready_evt, 14, 1, 0x00, 0x0000); + } + break; + + default: + printf("unknown WMI command %04X\n", cmd); + break; + } + + MB_Drain(0); +} + +void DSi_NWifi::SendWMIFrame(u8* data, u32 len, u8 ep, u8 flags, u16 ctrl) +{ + u32 wlen = 0; + + Mailbox[4]->Write(ep); // eid + Mailbox[4]->Write(flags); // flags + MB_Write16(4, len); // payload length + MB_Write16(4, ctrl); // ctrl + wlen += 6; + + for (int i = 0; i < len; i++) + { + Mailbox[4]->Write(data[i]); + wlen++; + } + + for (; wlen & 0x7F; wlen++) + Mailbox[4]->Write(0); +} + + +u32 DSi_NWifi::WindowRead(u32 addr) +{ + printf("NWifi: window read %08X\n", addr); + + if ((addr & 0xFFFF00) == 0x520000) + { + // RAM host interest area + // TODO: different base based on hardware version + + switch (addr & 0xFF) + { + case 0x54: + // base address of EEPROM data + // TODO find what the actual address is! + return 0x1FFC00; + case 0x58: return EEPROMReady; // hax + } + + return 0; + } + + // hax + if ((addr & 0x1FFC00) == 0x1FFC00) + { + return *(u32*)&EEPROM[addr & 0x3FF]; + } + + switch (addr) + { + case 0x40EC: // chip ID + // 0D000000 / 0D000001 == AR6013 + // TODO: check firmware.bin to determine the correct value + return 0x0D000001; + + // SOC_RESET_CAUSE + case 0x40C0: return 2; + } + + return 0; +} + +void DSi_NWifi::WindowWrite(u32 addr, u32 val) +{ + printf("NWifi: window write %08X %08X\n", addr, val); +} diff --git a/src/DSi_NWifi.h b/src/DSi_NWifi.h new file mode 100644 index 0000000..e5fe637 --- /dev/null +++ b/src/DSi_NWifi.h @@ -0,0 +1,121 @@ +/* + Copyright 2016-2019 Arisotura + + This file is part of melonDS. + + melonDS is free software: you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + melonDS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with melonDS. If not, see http://www.gnu.org/licenses/. +*/ + +#ifndef DSI_NWIFI_H +#define DSI_NWIFI_H + +#include "DSi_SD.h" +#include "FIFO.h" + +class DSi_NWifi : public DSi_SDDevice +{ +public: + DSi_NWifi(DSi_SDHost* host); + ~DSi_NWifi(); + + void SendCMD(u8 cmd, u32 param); + void SendACMD(u8 cmd, u32 param); + + void ContinueTransfer(); + + void SetIRQ_F1_Counter(u32 n); + +private: + u32 TransferCmd; + u32 TransferAddr; + u32 RemSize; + + void UpdateIRQ(); + void UpdateIRQ_F1(); + //void SetIRQ_F1_Counter(u32 n); + void ClearIRQ_F1_Counter(u32 n); + void SetIRQ_F1_CPU(u32 n); + + u8 F0_Read(u32 addr); + void F0_Write(u32 addr, u8 val); + + u8 F1_Read(u32 addr); + void F1_Write(u32 addr, u8 val); + + u8 SDIO_Read(u32 func, u32 addr); + void SDIO_Write(u32 func, u32 addr, u8 val); + + void ReadBlock(); + void WriteBlock(); + + void HandleCommand(); + void BMI_Command(); + void WMI_Command(); + + void SendWMIFrame(u8* data, u32 len, u8 ep, u8 flags, u16 ctrl); + + u32 WindowRead(u32 addr); + void WindowWrite(u32 addr, u32 val); + + u16 MB_Read16(int n) + { + u16 ret = Mailbox[n]->Read(); + ret |= (Mailbox[n]->Read() << 8); + return ret; + } + + void MB_Write16(int n, u16 val) + { + Mailbox[n]->Write(val & 0xFF); val >>= 8; + Mailbox[n]->Write(val & 0xFF); + } + + u32 MB_Read32(int n) + { + u32 ret = Mailbox[n]->Read(); + ret |= (Mailbox[n]->Read() << 8); + ret |= (Mailbox[n]->Read() << 16); + ret |= (Mailbox[n]->Read() << 24); + return ret; + } + + void MB_Write32(int n, u32 val) + { + Mailbox[n]->Write(val & 0xFF); val >>= 8; + Mailbox[n]->Write(val & 0xFF); val >>= 8; + Mailbox[n]->Write(val & 0xFF); val >>= 8; + Mailbox[n]->Write(val & 0xFF); + } + + void MB_Drain(int n) + { + while (!Mailbox[n]->IsEmpty()) Mailbox[n]->Read(); + } + + FIFO<u8>* Mailbox[8]; + + u8 F0_IRQEnable; + u8 F0_IRQStatus; + + u8 F1_IRQEnable, F1_IRQEnable_CPU, F1_IRQEnable_Error, F1_IRQEnable_Counter; + u8 F1_IRQStatus, F1_IRQStatus_CPU, F1_IRQStatus_Error, F1_IRQStatus_Counter; + + u32 WindowData, WindowReadAddr, WindowWriteAddr; + + u8 EEPROM[0x400]; + u32 EEPROMReady; + + u32 BootPhase; +}; + +#endif // DSI_NWIFI_H diff --git a/src/DSi_SD.cpp b/src/DSi_SD.cpp new file mode 100644 index 0000000..751c64f --- /dev/null +++ b/src/DSi_SD.cpp @@ -0,0 +1,934 @@ +/* + Copyright 2016-2019 Arisotura + + This file is part of melonDS. + + melonDS is free software: you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + melonDS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with melonDS. If not, see http://www.gnu.org/licenses/. +*/ + +#include <stdio.h> +#include <string.h> +#include "DSi.h" +#include "DSi_SD.h" +#include "DSi_NWifi.h" +#include "Platform.h" + + +// observed IRQ behavior during transfers +// +// during reads: +// * bit23 is cleared during the first block, always set otherwise. weird +// * bit24 (RXRDY) gets set when the FIFO is full +// +// during reads with FIFO32: +// * FIFO16 drains directly into FIFO32 +// * when bit24 is set, FIFO32 is already full (with contents from the other FIFO) +// * reading from an empty FIFO just wraps around (and sets bit21) +// * FIFO32 starts filling when bit24 would be set? +// +// +// TX: +// * when sending command, if current FIFO full +// * upon ContinueTransfer(), if current FIFO full +// * -> upon DataTX() if current FIFO full +// * when filling FIFO + + +#define SD_DESC Num?"SDIO":"SD/MMC" + + +DSi_SDHost::DSi_SDHost(u32 num) +{ + Num = num; + + DataFIFO[0] = new FIFO<u16>(0x100); + DataFIFO[1] = new FIFO<u16>(0x100); + DataFIFO32 = new FIFO<u32>(0x80); + + Ports[0] = NULL; + Ports[1] = NULL; +} + +DSi_SDHost::~DSi_SDHost() +{ + delete DataFIFO[0]; + delete DataFIFO[1]; + delete DataFIFO32; + + if (Ports[0]) delete Ports[0]; + if (Ports[1]) delete Ports[1]; +} + +void DSi_SDHost::Reset() +{ + if (Num == 0) + { + PortSelect = 0x0200; // CHECKME + } + else + { + PortSelect = 0x0100; // CHECKME + } + + SoftReset = 0x0007; // CHECKME + SDClock = 0; + SDOption = 0; + + Command = 0; + Param = 0; + memset(ResponseBuffer, 0, sizeof(ResponseBuffer)); + + DataFIFO[0]->Clear(); + DataFIFO[1]->Clear(); + CurFIFO = 0; + DataFIFO32->Clear(); + + IRQStatus = 0; + IRQMask = 0x8B7F031D; + + CardIRQStatus = 0; + CardIRQMask = 0xC007; + CardIRQCtl = 0; + + DataCtl = 0; + Data32IRQ = 0; + DataMode = 0; + BlockCount16 = 0; BlockCount32 = 0; BlockCountInternal = 0; + BlockLen16 = 0; BlockLen32 = 0; + StopAction = 0; + + TXReq = false; + + if (Ports[0]) delete Ports[0]; + if (Ports[1]) delete Ports[1]; + Ports[0] = NULL; + Ports[1] = NULL; + + if (Num == 0) + { + // TODO: eventually pull from host filesystem + /*DSi_MMCStorage* sd = new DSi_MMCStorage(this, false, "sd.bin"); + u8 sd_cid[16] = {0xBD, 0x12, 0x34, 0x56, 0x78, 0x03, 0x4D, 0x30, 0x30, 0x46, 0x50, 0x41, 0x00, 0x00, 0x15, 0x00}; + sd->SetCID(sd_cid);*/ + DSi_MMCStorage* sd = NULL; + + DSi_MMCStorage* mmc = new DSi_MMCStorage(this, true, "nand.bin"); + mmc->SetCID(DSi::eMMC_CID); + + Ports[0] = sd; + Ports[1] = mmc; + } + else + { + DSi_NWifi* nwifi = new DSi_NWifi(this); + + Ports[0] = nwifi; + } +} + +void DSi_SDHost::DoSavestate(Savestate* file) +{ + // TODO! +} + + +void DSi_SDHost::UpdateData32IRQ() +{ + if (DataMode == 0) return; + + u32 oldflags = ((Data32IRQ >> 8) & 0x1) | (((~Data32IRQ) >> 8) & 0x2); + oldflags &= (Data32IRQ >> 11); + + Data32IRQ &= ~0x0300; + if (DataFIFO32->Level() >= (BlockLen32>>2)) Data32IRQ |= (1<<8); + if (!DataFIFO32->IsEmpty()) Data32IRQ |= (1<<9); + + u32 newflags = ((Data32IRQ >> 8) & 0x1) | (((~Data32IRQ) >> 8) & 0x2); + newflags &= (Data32IRQ >> 11); + + if ((oldflags == 0) && (newflags != 0)) + NDS::SetIRQ2(Num ? NDS::IRQ2_DSi_SDIO : NDS::IRQ2_DSi_SDMMC); +} + +void DSi_SDHost::ClearIRQ(u32 irq) +{ + IRQStatus &= ~(1<<irq); +} + +void DSi_SDHost::SetIRQ(u32 irq) +{ + u32 oldflags = IRQStatus & ~IRQMask; + + IRQStatus |= (1<<irq); + u32 newflags = IRQStatus & ~IRQMask; + + if ((oldflags == 0) && (newflags != 0)) + NDS::SetIRQ2(Num ? NDS::IRQ2_DSi_SDIO : NDS::IRQ2_DSi_SDMMC); +} + +void DSi_SDHost::UpdateIRQ(u32 oldmask) +{ + u32 oldflags = IRQStatus & ~oldmask; + u32 newflags = IRQStatus & ~IRQMask; + + if ((oldflags == 0) && (newflags != 0)) + NDS::SetIRQ2(Num ? NDS::IRQ2_DSi_SDIO : NDS::IRQ2_DSi_SDMMC); +} + +void DSi_SDHost::SetCardIRQ() +{ + if (!(CardIRQCtl & (1<<0))) return; + + u16 oldflags = CardIRQStatus & ~CardIRQMask; + DSi_SDDevice* dev = Ports[PortSelect & 0x1]; + + if (dev->IRQ) CardIRQStatus |= (1<<0); + else CardIRQStatus &= ~(1<<0); + + u16 newflags = CardIRQStatus & ~CardIRQMask; + + if ((oldflags == 0) && (newflags != 0)) // checkme + { + NDS::SetIRQ2(Num ? NDS::IRQ2_DSi_SDIO : NDS::IRQ2_DSi_SDMMC); + NDS::SetIRQ2(Num ? NDS::IRQ2_DSi_SDIO_Data1 : NDS::IRQ2_DSi_SD_Data1); + } +} + +void DSi_SDHost::SendResponse(u32 val, bool last) +{ + *(u32*)&ResponseBuffer[6] = *(u32*)&ResponseBuffer[4]; + *(u32*)&ResponseBuffer[4] = *(u32*)&ResponseBuffer[2]; + *(u32*)&ResponseBuffer[2] = *(u32*)&ResponseBuffer[0]; + *(u32*)&ResponseBuffer[0] = val; + + if (last) SetIRQ(0); +} + +void DSi_SDHost::FinishRX(u32 param) +{ + DSi_SDHost* host = (param & 0x1) ? DSi::SDIO : DSi::SDMMC; + + host->CheckSwapFIFO(); + + if (host->DataMode == 1) + host->UpdateFIFO32(); + else + host->SetIRQ(24); +} + +u32 DSi_SDHost::DataRX(u8* data, u32 len) +{ + if (len != BlockLen16) { printf("!! BAD BLOCKLEN\n"); len = BlockLen16; } + + bool last = (BlockCountInternal == 0); + + u32 f = CurFIFO ^ 1; + for (u32 i = 0; i < len; i += 2) + DataFIFO[f]->Write(*(u16*)&data[i]); + + //CurFIFO = f; + //SetIRQ(24); + // TODO: determine what the delay should be! + // for now, this is a placeholder + // we need a delay because DSi boot2 will send a command and then wait for IRQ0 + // but if IRQ24 is thrown instantly, the handler clears IRQ0 before the + // send-command function starts polling IRQ status + u32 param = Num | (last << 1); + NDS::ScheduleEvent(Num ? NDS::Event_DSi_SDIOTransfer : NDS::Event_DSi_SDMMCTransfer, + false, 512, FinishRX, param); + + return len; +} + +void DSi_SDHost::FinishTX(u32 param) +{ + DSi_SDHost* host = (param & 0x1) ? DSi::SDIO : DSi::SDMMC; + DSi_SDDevice* dev = host->Ports[host->PortSelect & 0x1]; + + if (host->BlockCountInternal == 0) + { + if (host->StopAction & (1<<8)) + { + if (dev) dev->SendCMD(12, 0); + } + + // CHECKME: presumably IRQ2 should not trigger here, but rather + // when the data transfer is done + //SetIRQ(0); + host->SetIRQ(2); + host->TXReq = false; + } + else + { + if (dev) dev->ContinueTransfer(); + } +} + +u32 DSi_SDHost::DataTX(u8* data, u32 len) +{ + TXReq = true; + + u32 f = CurFIFO; + + if (DataMode == 1) + { + if ((DataFIFO32->Level() << 2) < len) + { + if (DataFIFO32->IsEmpty()) + { + SetIRQ(25); + DSi::CheckNDMAs(1, Num ? 0x29 : 0x28); + } + return 0; + } + + // drain FIFO32 into FIFO16 + + if (!DataFIFO[f]->IsEmpty()) printf("VERY BAD!! TRYING TO DRAIN FIFO32 INTO FIFO16 BUT IT CONTAINS SHIT ALREADY\n"); + for (;;) + { + u32 f = CurFIFO; + if ((DataFIFO[f]->Level() << 1) >= BlockLen16) break; + if (DataFIFO32->IsEmpty()) break; + + u32 val = DataFIFO32->Read(); + DataFIFO[f]->Write(val & 0xFFFF); + DataFIFO[f]->Write(val >> 16); + } + + UpdateData32IRQ(); + + if (BlockCount32 > 1) + BlockCount32--; + } + else + { + if ((DataFIFO[f]->Level() << 1) < len) + { + if (DataFIFO[f]->IsEmpty()) SetIRQ(25); + return 0; + } + } + + for (u32 i = 0; i < len; i += 2) + *(u16*)&data[i] = DataFIFO[f]->Read(); + + CurFIFO ^= 1; + BlockCountInternal--; + + NDS::ScheduleEvent(Num ? NDS::Event_DSi_SDIOTransfer : NDS::Event_DSi_SDMMCTransfer, + false, 512, FinishTX, Num); + + return len; +} + +u32 DSi_SDHost::GetTransferrableLen(u32 len) +{ + if (len > BlockLen16) len = BlockLen16; // checkme + return len; +} + +void DSi_SDHost::CheckRX() +{ + DSi_SDDevice* dev = Ports[PortSelect & 0x1]; + + CheckSwapFIFO(); + + if (BlockCountInternal <= 1) + { + if (StopAction & (1<<8)) + { + if (dev) dev->SendCMD(12, 0); + } + + // CHECKME: presumably IRQ2 should not trigger here, but rather + // when the data transfer is done + //SetIRQ(0); + SetIRQ(2); + } + else + { + BlockCountInternal--; + + if (dev) dev->ContinueTransfer(); + } +} + +void DSi_SDHost::CheckTX() +{ + if (!TXReq) return; + + if (DataMode == 1) + { + if ((DataFIFO32->Level() << 2) < BlockLen32) + return; + } + else + { + u32 f = CurFIFO; + if ((DataFIFO[f]->Level() << 1) < BlockLen16) + return; + } + + DSi_SDDevice* dev = Ports[PortSelect & 0x1]; + if (dev) dev->ContinueTransfer(); +} + + +u16 DSi_SDHost::Read(u32 addr) +{ + switch (addr & 0x1FF) + { + case 0x000: return Command; + case 0x002: return PortSelect & 0x030F; + case 0x004: return Param & 0xFFFF; + case 0x006: return Param >> 16; + + case 0x008: return StopAction; + case 0x00A: return BlockCount16; + + case 0x00C: return ResponseBuffer[0]; + case 0x00E: return ResponseBuffer[1]; + case 0x010: return ResponseBuffer[2]; + case 0x012: return ResponseBuffer[3]; + case 0x014: return ResponseBuffer[4]; + case 0x016: return ResponseBuffer[5]; + case 0x018: return ResponseBuffer[6]; + case 0x01A: return ResponseBuffer[7]; + + case 0x01C: + { + u16 ret = (IRQStatus & 0x031D); + + if (!Num) + { + if (Ports[0]) // basic check of whether the SD card is inserted + ret |= 0x0030; + else + ret |= 0x0008; + } + else + { + // SDIO wifi is always inserted, I guess + ret |= 0x0030; + } + return ret; + } + case 0x01E: return ((IRQStatus >> 16) & 0x8B7F); + case 0x020: return IRQMask & 0x031D; + case 0x022: return (IRQMask >> 16) & 0x8B7F; + + case 0x024: return SDClock; + case 0x026: return BlockLen16; + case 0x028: return SDOption; + + case 0x02C: return 0; // TODO + + case 0x034: return CardIRQCtl; + case 0x036: return CardIRQStatus; + case 0x038: return CardIRQMask; + + case 0x030: return ReadFIFO16(); + + case 0x0D8: return DataCtl; + + case 0x0E0: return SoftReset; + + case 0x0F6: return 0; // MMC write protect (always 0) + + case 0x100: return Data32IRQ; + case 0x104: return BlockLen32; + case 0x108: return BlockCount32; + } + + printf("unknown %s read %08X @ %08X\n", SD_DESC, addr, NDS::GetPC(1)); + return 0; +} + +u16 DSi_SDHost::ReadFIFO16() +{ + u32 f = CurFIFO; + if (DataFIFO[f]->IsEmpty()) + { + // TODO + // on hardware it seems to wrap around. underflow bit is set upon the first 'empty' read. + return 0; + } + + DSi_SDDevice* dev = Ports[PortSelect & 0x1]; + u16 ret = DataFIFO[f]->Read(); + + if (DataFIFO[f]->IsEmpty()) + { + CheckRX(); + } + + return ret; +} + +u32 DSi_SDHost::ReadFIFO32() +{ + if (DataMode != 1) return 0; + + if (DataFIFO32->IsEmpty()) + { + // TODO + return 0; + } + + DSi_SDDevice* dev = Ports[PortSelect & 0x1]; + u32 ret = DataFIFO32->Read(); + + if (DataFIFO32->IsEmpty()) + { + CheckRX(); + } + + UpdateData32IRQ(); + + return ret; +} + +void DSi_SDHost::Write(u32 addr, u16 val) +{ + switch (addr & 0x1FF) + { + case 0x000: + { + Command = val; + u8 cmd = Command & 0x3F; + + DSi_SDDevice* dev = Ports[PortSelect & 0x1]; + if (dev) + { + // CHECKME + // "Setting Command Type to "ACMD" is automatically sending an APP_CMD prefix prior to the command number" + // except DSi boot2 manually sends an APP_CMD prefix AND sets the next command to be ACMD + switch ((Command >> 6) & 0x3) + { + case 0: dev->SendCMD(cmd, Param); break; + case 1: /*dev->SendCMD(55, 0);*/ dev->SendCMD(cmd, Param); break; + default: + printf("%s: unknown command type %d, %02X %08X\n", SD_DESC, (Command>>6)&0x3, cmd, Param); + break; + } + } + else printf("%s: SENDING CMD %04X TO NULL DEVICE\n", SD_DESC, val); + } + return; + + case 0x002: PortSelect = (val & 0x040F) | (PortSelect & 0x0300); return; + case 0x004: Param = (Param & 0xFFFF0000) | val; return; + case 0x006: Param = (Param & 0x0000FFFF) | (val << 16); return; + + case 0x008: StopAction = val & 0x0101; return; + case 0x00A: BlockCount16 = val; BlockCountInternal = val; return; + + case 0x01C: IRQStatus &= (val | 0xFFFF0000); return; + case 0x01E: IRQStatus &= ((val << 16) | 0xFFFF); return; + case 0x020: + { + u32 oldmask = IRQMask; + IRQMask = (IRQMask & 0x8B7F0000) | (val & 0x031D); + UpdateIRQ(oldmask); + } + return; + case 0x022: + { + u32 oldmask = IRQMask; + IRQMask = (IRQMask & 0x0000031D) | ((val & 0x8B7F) << 16); + UpdateIRQ(oldmask); + if (!DataFIFO[CurFIFO]->IsEmpty()) SetIRQ(24); // checkme + if (DataFIFO[CurFIFO]->IsEmpty()) SetIRQ(25); // checkme + } + return; + + case 0x024: SDClock = val & 0x03FF; return; + case 0x026: + BlockLen16 = val & 0x03FF; + if (BlockLen16 > 0x200) BlockLen16 = 0x200; + return; + case 0x028: SDOption = val & 0xC1FF; return; + + case 0x030: WriteFIFO16(val); return; + + case 0x034: + CardIRQCtl = val & 0x0305; + SetCardIRQ(); + return; + case 0x036: + CardIRQStatus &= val; + return; + case 0x038: + CardIRQMask = val & 0xC007; + SetCardIRQ(); + return; + + case 0x0D8: + DataCtl = (val & 0x0022); + DataMode = ((DataCtl >> 1) & 0x1) & ((Data32IRQ >> 1) & 0x1); + return; + + case 0x0E0: + if ((SoftReset & 0x0001) && !(val & 0x0001)) + { + printf("%s: RESET\n", SD_DESC); + StopAction = 0; + memset(ResponseBuffer, 0, sizeof(ResponseBuffer)); + IRQStatus = 0; + // TODO: ERROR_DETAIL_STATUS + SDClock &= ~0x0500; + SDOption = 0x40EE; + // TODO: CARD_IRQ_STAT + // TODO: FIFO16 shit + } + SoftReset = 0x0006 | (val & 0x0001); + return; + + case 0x100: + Data32IRQ = (val & 0x1802) | (Data32IRQ & 0x0300); + if (val & (1<<10)) DataFIFO32->Clear(); + DataMode = ((DataCtl >> 1) & 0x1) & ((Data32IRQ >> 1) & 0x1); + return; + case 0x104: BlockLen32 = val & 0x03FF; return; + case 0x108: BlockCount32 = val; return; + } + + printf("unknown %s write %08X %04X\n", SD_DESC, addr, val); +} + +void DSi_SDHost::WriteFIFO16(u16 val) +{ + DSi_SDDevice* dev = Ports[PortSelect & 0x1]; + u32 f = CurFIFO; + if (DataFIFO[f]->IsFull()) + { + // TODO + printf("!!!! %s FIFO (16) FULL\n", SD_DESC); + return; + } + + DataFIFO[f]->Write(val); + + CheckTX(); +} + +void DSi_SDHost::WriteFIFO32(u32 val) +{ + if (DataMode != 1) return; + + if (DataFIFO32->IsFull()) + { + // TODO + printf("!!!! %s FIFO (32) FULL\n", SD_DESC); + return; + } + + DataFIFO32->Write(val); + + CheckTX(); + + UpdateData32IRQ(); +} + +void DSi_SDHost::UpdateFIFO32() +{ + // check whether we can drain FIFO32 into FIFO16, or vice versa + + if (DataMode != 1) return; + + if (!DataFIFO32->IsEmpty()) printf("VERY BAD!! TRYING TO DRAIN FIFO16 INTO FIFO32 BUT IT CONTAINS SHIT ALREADY\n"); + for (;;) + { + u32 f = CurFIFO; + if ((DataFIFO32->Level() << 2) >= BlockLen32) break; + if (DataFIFO[f]->IsEmpty()) break; + + u32 val = DataFIFO[f]->Read(); + val |= (DataFIFO[f]->Read() << 16); + DataFIFO32->Write(val); + } + + UpdateData32IRQ(); + + if ((DataFIFO32->Level() << 2) >= BlockLen32) + { + DSi::CheckNDMAs(1, Num ? 0x29 : 0x28); + } +} + +void DSi_SDHost::CheckSwapFIFO() +{ + // check whether we can swap the FIFOs + + u32 f = CurFIFO; + bool cur_empty = (DataMode == 1) ? DataFIFO32->IsEmpty() : DataFIFO[f]->IsEmpty(); + if (cur_empty && ((DataFIFO[f^1]->Level() << 1) >= BlockLen16)) + { + CurFIFO ^= 1; + } +} + + +#define MMC_DESC (Internal?"NAND":"SDcard") + +DSi_MMCStorage::DSi_MMCStorage(DSi_SDHost* host, bool internal, const char* path) : DSi_SDDevice(host) +{ + Internal = internal; + strncpy(FilePath, path, 1023); FilePath[1023] = '\0'; + + File = Platform::OpenLocalFile(path, "r+b"); + if (!File) + { + if (internal) + { + // TODO: proper failure + printf("!! MMC file %s does not exist\n", path); + } + else + { + File = Platform::OpenLocalFile(path, "w+b"); + } + } + + CSR = 0x00000100; // checkme + + // TODO: busy bit + // TODO: SDHC/SDXC bit + OCR = 0x80FF8000; + + // TODO: customize based on card size etc + u8 csd_template[16] = {0x40, 0x40, 0x96, 0xE9, 0x7F, 0xDB, 0xF6, 0xDF, 0x01, 0x59, 0x0F, 0x2A, 0x01, 0x26, 0x90, 0x00}; + memcpy(CSD, csd_template, 16); + + // checkme + memset(SCR, 0, 8); + *(u32*)&SCR[0] = 0x012A0000; + + memset(SSR, 0, 64); + + BlockSize = 0; + RWAddress = 0; + RWCommand = 0; +} + +DSi_MMCStorage::~DSi_MMCStorage() +{ + if (File) fclose(File); +} + +void DSi_MMCStorage::SendCMD(u8 cmd, u32 param) +{ + if (CSR & (1<<5)) + { + CSR &= ~(1<<5); + return SendACMD(cmd, param); + } + + switch (cmd) + { + case 0: // reset/etc + Host->SendResponse(CSR, true); + return; + + case 2: + case 10: // get CID + Host->SendResponse(*(u32*)&CID[12], false); + Host->SendResponse(*(u32*)&CID[8], false); + Host->SendResponse(*(u32*)&CID[4], false); + Host->SendResponse(*(u32*)&CID[0], true); + if (cmd == 2) SetState(0x02); + return; + + case 3: // get/set RCA + if (Internal) + { + RCA = param >> 16; + Host->SendResponse(CSR|0x10000, true); // huh?? + } + else + { + // TODO + printf("CMD3 on SD card: TODO\n"); + Host->SendResponse((CSR & 0x1FFF) | ((CSR >> 6) & 0x2000) | ((CSR >> 8) & 0xC000) | (1 << 16), true); + } + return; + + case 7: // select card (by RCA) + Host->SendResponse(CSR, true); + return; + + case 8: // set voltage + Host->SendResponse(param, true); + return; + + case 9: // get CSD + Host->SendResponse(*(u32*)&CSD[12], false); + Host->SendResponse(*(u32*)&CSD[8], false); + Host->SendResponse(*(u32*)&CSD[4], false); + Host->SendResponse(*(u32*)&CSD[0], true); + return; + + case 12: // stop operation + SetState(0x04); + if (File) fflush(File); + RWCommand = 0; + Host->SendResponse(CSR, true); + return; + + case 13: // get status + Host->SendResponse(CSR, true); + return; + + case 16: // set block size + BlockSize = param; + if (BlockSize > 0x200) + { + // TODO! raise error + printf("!! SD/MMC: BAD BLOCK LEN %d\n", BlockSize); + BlockSize = 0x200; + } + SetState(0x04); // CHECKME + Host->SendResponse(CSR, true); + return; + + case 18: // read multiple blocks + //printf("READ_MULTIPLE_BLOCKS addr=%08X size=%08X\n", param, BlockSize); + RWAddress = param; + if (OCR & (1<<30)) + { + RWAddress <<= 9; + BlockSize = 512; + } + RWCommand = 18; + Host->SendResponse(CSR, true); + ReadBlock(RWAddress); + RWAddress += BlockSize; + SetState(0x05); + return; + + case 25: // write multiple blocks + //printf("WRITE_MULTIPLE_BLOCKS addr=%08X size=%08X\n", param, BlockSize); + RWAddress = param; + if (OCR & (1<<30)) + { + RWAddress <<= 9; + BlockSize = 512; + } + RWCommand = 25; + Host->SendResponse(CSR, true); + WriteBlock(RWAddress); + RWAddress += BlockSize; + SetState(0x04); + return; + + case 55: // appcmd prefix + CSR |= (1<<5); + Host->SendResponse(CSR, true); + return; + } + + printf("MMC: unknown CMD %d %08X\n", cmd, param); +} + +void DSi_MMCStorage::SendACMD(u8 cmd, u32 param) +{ + switch (cmd) + { + case 6: // set bus width (TODO?) + //printf("SET BUS WIDTH %08X\n", param); + Host->SendResponse(CSR, true); + return; + + case 13: // get SSR + Host->SendResponse(CSR, true); + Host->DataRX(SSR, 64); + return; + + case 41: // set operating conditions + // CHECKME: + // DSi boot2 sets this to 0x40100000 (hardcoded) + // then has two codepaths depending on whether bit30 did get set + // is it settable at all on the MMC? probably not. + if (Internal) param &= ~(1<<30); + OCR &= 0xBF000000; + OCR |= (param & 0x40FFFFFF); + Host->SendResponse(OCR, true); + SetState(0x01); + return; + + case 42: // ??? + Host->SendResponse(CSR, true); + return; + + case 51: // get SCR + Host->SendResponse(CSR, true); + Host->DataRX(SCR, 8); + return; + } + + printf("MMC: unknown ACMD %d %08X\n", cmd, param); +} + +void DSi_MMCStorage::ContinueTransfer() +{ + if (RWCommand == 0) return; + + u32 len = 0; + + switch (RWCommand) + { + case 18: + len = ReadBlock(RWAddress); + break; + + case 25: + len = WriteBlock(RWAddress); + break; + } + + RWAddress += len; +} + +u32 DSi_MMCStorage::ReadBlock(u64 addr) +{ + u32 len = BlockSize; + len = Host->GetTransferrableLen(len); + + u8 data[0x200]; + if (File) + { + fseek(File, addr, SEEK_SET); + fread(data, 1, len, File); + } + + return Host->DataRX(data, len); +} + +u32 DSi_MMCStorage::WriteBlock(u64 addr) +{ + u32 len = BlockSize; + len = Host->GetTransferrableLen(len); + + u8 data[0x200]; + if (len = Host->DataTX(data, len)) + { + if (File) + { + fseek(File, addr, SEEK_SET); + fwrite(data, 1, len, File); + } + } + + return len; +} diff --git a/src/DSi_SD.h b/src/DSi_SD.h new file mode 100644 index 0000000..2862173 --- /dev/null +++ b/src/DSi_SD.h @@ -0,0 +1,154 @@ +/* + Copyright 2016-2019 Arisotura + + This file is part of melonDS. + + melonDS is free software: you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + melonDS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with melonDS. If not, see http://www.gnu.org/licenses/. +*/ + +#ifndef DSI_SD_H +#define DSI_SD_H + +#include <string.h> +#include "FIFO.h" + + +class DSi_SDDevice; + + +class DSi_SDHost +{ +public: + DSi_SDHost(u32 num); + ~DSi_SDHost(); + + void Reset(); + + void DoSavestate(Savestate* file); + + static void FinishRX(u32 param); + static void FinishTX(u32 param); + void SendResponse(u32 val, bool last); + u32 DataRX(u8* data, u32 len); + u32 DataTX(u8* data, u32 len); + u32 GetTransferrableLen(u32 len); + + void CheckRX(); + void CheckTX(); + bool TXReq; + + void SetCardIRQ(); + + u16 Read(u32 addr); + void Write(u32 addr, u16 val); + u16 ReadFIFO16(); + void WriteFIFO16(u16 val); + u32 ReadFIFO32(); + void WriteFIFO32(u32 val); + + void UpdateFIFO32(); + void CheckSwapFIFO(); + +private: + u32 Num; + + u16 PortSelect; + u16 SoftReset; + u16 SDClock; + u16 SDOption; + + u32 IRQStatus; // IF + u32 IRQMask; // ~IE + + u16 CardIRQStatus; + u16 CardIRQMask; + u16 CardIRQCtl; + + u16 DataCtl; + u16 Data32IRQ; + u32 DataMode; // 0=16bit 1=32bit + u16 BlockCount16, BlockCount32, BlockCountInternal; + u16 BlockLen16, BlockLen32; + u16 StopAction; + + u16 Command; + u32 Param; + u16 ResponseBuffer[8]; + + FIFO<u16>* DataFIFO[2]; + u32 CurFIFO; // FIFO accessible for read/write + FIFO<u32>* DataFIFO32; + + DSi_SDDevice* Ports[2]; + + void UpdateData32IRQ(); + void ClearIRQ(u32 irq); + void SetIRQ(u32 irq); + void UpdateIRQ(u32 oldmask); +}; + + +class DSi_SDDevice +{ +public: + DSi_SDDevice(DSi_SDHost* host) { Host = host; IRQ = false; } + ~DSi_SDDevice() {} + + virtual void SendCMD(u8 cmd, u32 param) = 0; + virtual void ContinueTransfer() = 0; + + bool IRQ; + +protected: + DSi_SDHost* Host; +}; + + +class DSi_MMCStorage : public DSi_SDDevice +{ +public: + DSi_MMCStorage(DSi_SDHost* host, bool internal, const char* path); + ~DSi_MMCStorage(); + + void SetCID(u8* cid) { memcpy(CID, cid, 16); } + + void SendCMD(u8 cmd, u32 param); + void SendACMD(u8 cmd, u32 param); + + void ContinueTransfer(); + +private: + bool Internal; + char FilePath[1024]; + FILE* File; + + u8 CID[16]; + u8 CSD[16]; + + u32 CSR; + u32 OCR; + u32 RCA; + u8 SCR[8]; + u8 SSR[64]; + + u32 BlockSize; + u64 RWAddress; + u32 RWCommand; + + void SetState(u32 state) { CSR &= ~(0xF << 9); CSR |= (state << 9); } + + u32 ReadBlock(u64 addr); + u32 WriteBlock(u64 addr); +}; + +#endif // DSI_SD_H diff --git a/src/DSi_SPI_TSC.cpp b/src/DSi_SPI_TSC.cpp new file mode 100644 index 0000000..507005b --- /dev/null +++ b/src/DSi_SPI_TSC.cpp @@ -0,0 +1,231 @@ +/* + Copyright 2016-2019 Arisotura + + This file is part of melonDS. + + melonDS is free software: you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + melonDS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with melonDS. If not, see http://www.gnu.org/licenses/. +*/ + +#include <stdio.h> +#include <string.h> +#include "DSi.h" +#include "SPI.h" +#include "DSi_SPI_TSC.h" + + +namespace DSi_SPI_TSC +{ + +u32 DataPos; +u8 Index; +u8 Bank; +u8 Data; + +u8 Bank3Regs[0x80]; +u8 TSCMode; + +u16 TouchX, TouchY; + + +bool Init() +{ + return true; +} + +void DeInit() +{ +} + +void Reset() +{ + DataPos = 0; + + Bank = 0; + Index = 0; + Data = 0; + + memset(Bank3Regs, 0, 0x80); + Bank3Regs[0x02] = 0x18; + Bank3Regs[0x03] = 0x87; + Bank3Regs[0x04] = 0x22; + Bank3Regs[0x05] = 0x04; + Bank3Regs[0x06] = 0x20; + Bank3Regs[0x09] = 0x40; + Bank3Regs[0x0E] = 0xAD; + Bank3Regs[0x0F] = 0xA0; + Bank3Regs[0x10] = 0x88; + Bank3Regs[0x11] = 0x81; + + TSCMode = 0x01; // DSi mode +} + +void DoSavestate(Savestate* file) +{ + /*file->Section("SPTi"); + + file->Var32(&DataPos); + file->Var8(&ControlByte); + file->Var8(&Data); + + file->Var16(&ConvResult);*/ + // TODO!! +} + +void SetTouchCoords(u16 x, u16 y) +{ + if (TSCMode == 0x00) + { + if (y == 0xFFF) NDS::KeyInput |= (1 << (16+6)); + else NDS::KeyInput &= ~(1 << (16+6)); + return SPI_TSC::SetTouchCoords(x, y); + } + + TouchX = x; + TouchY = y; + + u8 oldpress = Bank3Regs[0x0E] & 0x01; + + if (y == 0xFFF) + { + // released + + // TODO: GBAtek says it can also be 1000 or 3000?? + TouchX = 0x7000; + TouchY = 0x7000; + + Bank3Regs[0x09] = 0x40; + //Bank3Regs[0x09] &= ~0x80; + Bank3Regs[0x0E] |= 0x01; + } + else + { + // pressed + + TouchX <<= 4; + TouchY <<= 4; + + Bank3Regs[0x09] = 0x80; + //Bank3Regs[0x09] |= 0x80; + Bank3Regs[0x0E] &= ~0x01; + } + + if (oldpress ^ (Bank3Regs[0x0E] & 0x01)) + { + TouchX |= 0x8000; + TouchY |= 0x8000; + } +} + +void MicInputFrame(s16* data, int samples) +{ + if (TSCMode == 0x00) return SPI_TSC::MicInputFrame(data, samples); + + // otherwise we don't handle mic input + // TODO: handle it where it needs to be +} + +u8 Read() +{ + if (TSCMode == 0x00) return SPI_TSC::Read(); + + return Data; +} + +void Write(u8 val, u32 hold) +{ + if (TSCMode == 0x00) return SPI_TSC::Write(val, hold); + +#define READWRITE(var) { if (Index & 0x01) Data = var; else var = val; } + + if (DataPos == 0) + { + Index = val; + } + else + { + u8 id = Index >> 1; + + if (id == 0) + { + READWRITE(Bank); + } + else if (Bank == 0x03) + { + if (Index & 0x01) Data = Bank3Regs[id]; + else + { + if (id == 0x0D || id == 0x0E) + Bank3Regs[id] = (Bank3Regs[id] & 0x03) | (val & 0xFC); + } + } + else if ((Bank == 0xFC) && (Index & 0x01)) + { + if (id < 0x0B) + { + // X coordinates + + if (id & 0x01) Data = TouchX >> 8; + else Data = TouchX & 0xFF; + + TouchX &= 0x7FFF; + } + else if (id < 0x15) + { + // Y coordinates + + if (id & 0x01) Data = TouchY >> 8; + else Data = TouchY & 0xFF; + + TouchY &= 0x7FFF; // checkme + } + else + { + // whatever (TODO) + Data = 0; + } + } + else if (Bank == 0xFF) + { + if (id == 0x05) + { + // TSC mode register + // 01: normal (DSi) mode + // 00: compatibility (DS) mode + + if (Index & 0x01) Data = TSCMode; + else + { + TSCMode = val; + if (TSCMode == 0x00) + { + printf("DSi_SPI_TSC: DS-compatibility mode\n"); + DataPos = 0; + NDS::KeyInput |= (1 << (16+6)); + return; + } + } + } + } + else + { + printf("DSi_SPI_TSC: unknown IO, bank=%02X, index=%02X (%02X %s)\n", Bank, Index, Index>>1, (Index&1)?"read":"write"); + } + + Index += (1<<1); // increment index + } + + if (hold) DataPos++; + else DataPos = 0; +} + +} diff --git a/src/DSi_SPI_TSC.h b/src/DSi_SPI_TSC.h new file mode 100644 index 0000000..f3ffc32 --- /dev/null +++ b/src/DSi_SPI_TSC.h @@ -0,0 +1,40 @@ +/* + Copyright 2016-2019 Arisotura + + This file is part of melonDS. + + melonDS is free software: you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + melonDS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with melonDS. If not, see http://www.gnu.org/licenses/. +*/ + +#ifndef DSI_SPI_TSC +#define DSI_SPI_TSC + +namespace DSi_SPI_TSC +{ + +extern u32 DataPos; + +bool Init(); +void DeInit(); +void Reset(); +void DoSavestate(Savestate* file); + +void SetTouchCoords(u16 x, u16 y); +void MicInputFrame(s16* data, int samples); + +u8 Read(); +void Write(u8 val, u32 hold); + +} + +#endif // DSI_SPI_TSC @@ -89,6 +89,15 @@ public: return Entries[ReadPos]; } + T Peek(u32 offset) + { + u32 pos = ReadPos + offset; + if (pos >= NumEntries) + pos -= NumEntries; + + return Entries[pos]; + } + u32 Level() { return NumOccupied; } bool IsEmpty() { return NumOccupied == 0; } bool IsFull() { return NumOccupied >= NumEntries; } diff --git a/src/GPU.cpp b/src/GPU.cpp index 42bfc56..29867db 100644 --- a/src/GPU.cpp +++ b/src/GPU.cpp @@ -21,6 +21,7 @@ #include "NDS.h" #include "GPU.h" + namespace GPU { @@ -78,6 +79,7 @@ u8* VRAMPtr_BOBJ[0x8]; int FrontBuffer; u32* Framebuffer[2][2]; +int Renderer; bool Accelerated; GPU2D* GPU2D_A; @@ -93,8 +95,8 @@ bool Init() FrontBuffer = 0; Framebuffer[0][0] = NULL; Framebuffer[0][1] = NULL; Framebuffer[1][0] = NULL; Framebuffer[1][1] = NULL; + Renderer = 0; Accelerated = false; - SetDisplaySettings(false); return true; } @@ -182,6 +184,8 @@ void Reset() int backbuf = FrontBuffer ? 0 : 1; GPU2D_A->SetFramebuffer(Framebuffer[backbuf][1]); GPU2D_B->SetFramebuffer(Framebuffer[backbuf][0]); + + ResetRenderer(); } void Stop() @@ -274,15 +278,72 @@ void AssignFramebuffers() } } -void SetDisplaySettings(bool accel) +void InitRenderer(int renderer) +{ + if (renderer == 1) + { + if (!GLCompositor::Init()) + { + renderer = 0; + } + else if (!GPU3D::GLRenderer::Init()) + { + GLCompositor::DeInit(); + renderer = 0; + } + } + + if (renderer == 0) + { + GPU3D::SoftRenderer::Init(); + } + + Renderer = renderer; + Accelerated = renderer != 0; +} + +void DeInitRenderer() +{ + if (Renderer == 0) + { + GPU3D::SoftRenderer::DeInit(); + } + else + { + GPU3D::GLRenderer::DeInit(); + GLCompositor::DeInit(); + } +} + +void ResetRenderer() { + if (Renderer == 0) + { + GPU3D::SoftRenderer::Reset(); + } + else + { + GLCompositor::Reset(); + GPU3D::GLRenderer::Reset(); + } +} + +void SetRenderSettings(int renderer, RenderSettings& settings) +{ + if (renderer != Renderer) + { + DeInitRenderer(); + InitRenderer(renderer); + } + + bool accel = Accelerated; int fbsize; if (accel) fbsize = (256*3 + 1) * 192; else fbsize = 256 * 192; - if (Framebuffer[0][0]) delete[] Framebuffer[0][0]; - if (Framebuffer[1][0]) delete[] Framebuffer[1][0]; - if (Framebuffer[0][1]) delete[] Framebuffer[0][1]; - if (Framebuffer[1][1]) delete[] Framebuffer[1][1]; + if (Framebuffer[0][0]) { delete[] Framebuffer[0][0]; Framebuffer[0][0] = nullptr; } + if (Framebuffer[1][0]) { delete[] Framebuffer[1][0]; Framebuffer[1][0] = nullptr; } + if (Framebuffer[0][1]) { delete[] Framebuffer[0][1]; Framebuffer[0][1] = nullptr; } + if (Framebuffer[1][1]) { delete[] Framebuffer[1][1]; Framebuffer[1][1] = nullptr; } Framebuffer[0][0] = new u32[fbsize]; Framebuffer[1][0] = new u32[fbsize]; @@ -296,10 +357,18 @@ void SetDisplaySettings(bool accel) AssignFramebuffers(); - GPU2D_A->SetDisplaySettings(accel); - GPU2D_B->SetDisplaySettings(accel); + GPU2D_A->SetRenderSettings(accel); + GPU2D_B->SetRenderSettings(accel); - Accelerated = accel; + if (Renderer == 0) + { + GPU3D::SoftRenderer::SetRenderSettings(settings); + } + else + { + GLCompositor::SetRenderSettings(settings); + GPU3D::GLRenderer::SetRenderSettings(settings); + } } @@ -985,6 +1054,8 @@ void StartScanline(u32 line) GPU2D_A->VBlank(); GPU2D_B->VBlank(); GPU3D::VBlank(); + + if (Accelerated) GLCompositor::RenderFrame(); } else if (VCount == 144) { @@ -20,7 +20,6 @@ #define GPU_H #include "GPU2D.h" -#include "GPU3D.h" namespace GPU { @@ -72,6 +71,17 @@ extern u32* Framebuffer[2][2]; extern GPU2D* GPU2D_A; extern GPU2D* GPU2D_B; +extern int Renderer; + + +typedef struct +{ + bool Soft_Threaded; + + int GL_ScaleFactor; + +} RenderSettings; + bool Init(); void DeInit(); @@ -80,7 +90,11 @@ void Stop(); void DoSavestate(Savestate* file); -void SetDisplaySettings(bool accel); +void InitRenderer(int renderer); +void DeInitRenderer(); +void ResetRenderer(); + +void SetRenderSettings(int renderer, RenderSettings& settings); u8* GetUniqueBankPtr(u32 mask, u32 offset); @@ -422,6 +436,22 @@ void SetDispStat(u32 cpu, u16 val); void SetVCount(u16 val); +namespace GLCompositor +{ + +bool Init(); +void DeInit(); +void Reset(); + +void SetRenderSettings(RenderSettings& settings); + +void RenderFrame(); +void BindOutputTexture(); + +} + } +#include "GPU3D.h" + #endif diff --git a/src/GPU2D.cpp b/src/GPU2D.cpp index 1c6cf0c..604a4ee 100644 --- a/src/GPU2D.cpp +++ b/src/GPU2D.cpp @@ -202,16 +202,8 @@ void GPU2D::DoSavestate(Savestate* file) file->Var32(&CaptureCnt); } - if (file->IsAtleastVersion(2, 1)) - { - file->Var32(&Win0Active); - file->Var32(&Win1Active); - } - else - { - Win0Active = 0; - Win1Active = 0; - } + file->Var32(&Win0Active); + file->Var32(&Win1Active); if (!file->Saving) { @@ -232,7 +224,7 @@ void GPU2D::SetFramebuffer(u32* buf) Framebuffer = buf; } -void GPU2D::SetDisplaySettings(bool accel) +void GPU2D::SetRenderSettings(bool accel) { Accelerated = accel; @@ -728,6 +720,8 @@ u32 GPU2D::ColorComposite(int i, u32 val1, u32 val2) case 3: return ColorBrightnessDown(val1, EVY); case 4: return ColorBlend5(val1, val2); } + + return val1; } diff --git a/src/GPU2D.h b/src/GPU2D.h index c4bd2f9..521adf0 100644 --- a/src/GPU2D.h +++ b/src/GPU2D.h @@ -31,7 +31,7 @@ public: void SetEnabled(bool enable) { Enabled = enable; } void SetFramebuffer(u32* buf); - void SetDisplaySettings(bool accel); + void SetRenderSettings(bool accel); u8 Read8(u32 addr); u16 Read16(u32 addr); diff --git a/src/GPU3D.cpp b/src/GPU3D.cpp index 4f146ae..bd27783 100644 --- a/src/GPU3D.cpp +++ b/src/GPU3D.cpp @@ -157,8 +157,6 @@ u32 NumCommands, CurCommand, ParamCount, TotalParams; bool GeometryEnabled; bool RenderingEnabled; -int Renderer; - u32 DispCnt; u8 AlphaRefVal, AlphaRef; @@ -280,17 +278,11 @@ bool Init() CmdStallQueue = new FIFO<CmdFIFOEntry>(64); - Renderer = -1; - // SetRenderer() will be called to set it up later - return true; } void DeInit() { - if (Renderer == 0) SoftRenderer::DeInit(); - else GLRenderer::DeInit(); - delete CmdFIFO; delete CmdPIPE; @@ -391,8 +383,6 @@ void Reset() FlushAttributes = 0; ResetRenderingState(); - if (Renderer == 0) SoftRenderer::Reset(); - else GLRenderer::Reset(); } void DoSavestate(Savestate* file) @@ -607,43 +597,6 @@ void SetEnabled(bool geometry, bool rendering) } -int InitRenderer(bool hasGL) -{ - int renderer = hasGL ? Config::_3DRenderer : 0; - - if (renderer == 1) - { - if (!GLRenderer::Init()) - renderer = 0; - } - - if (renderer == 0) SoftRenderer::Init(); - - Renderer = renderer; - UpdateRendererConfig(); - GPU::SetDisplaySettings(Renderer != 0); - return renderer; -} - -void DeInitRenderer() -{ - if (Renderer == 0) SoftRenderer::DeInit(); - else GLRenderer::DeInit(); -} - -void UpdateRendererConfig() -{ - if (Renderer == 0) - { - SoftRenderer::SetupRenderThread(); - } - else - { - GLRenderer::UpdateDisplaySettings(); - } -} - - void MatrixLoadIdentity(s32* m) { @@ -2470,7 +2423,7 @@ void CheckFIFODMA() void VCount144() { - if (Renderer == 0) SoftRenderer::VCount144(); + if (GPU::Renderer == 0) SoftRenderer::VCount144(); } @@ -2552,14 +2505,14 @@ void VBlank() void VCount215() { - if (Renderer == 0) SoftRenderer::RenderFrame(); - else GLRenderer::RenderFrame(); + if (GPU::Renderer == 0) SoftRenderer::RenderFrame(); + else GLRenderer::RenderFrame(); } u32* GetLine(int line) { - if (Renderer == 0) return SoftRenderer::GetLine(line); - else return GLRenderer::GetLine(line); + if (GPU::Renderer == 0) return SoftRenderer::GetLine(line); + else return GLRenderer::GetLine(line); } diff --git a/src/GPU3D.h b/src/GPU3D.h index 1fd3383..71f069d 100644 --- a/src/GPU3D.h +++ b/src/GPU3D.h @@ -102,10 +102,6 @@ void DoSavestate(Savestate* file); void SetEnabled(bool geometry, bool rendering); -int InitRenderer(bool hasGL); -void DeInitRenderer(); -void UpdateRendererConfig(); - void ExecuteCommand(); s32 CyclesToRunFor(); @@ -134,6 +130,7 @@ bool Init(); void DeInit(); void Reset(); +void SetRenderSettings(GPU::RenderSettings& settings); void SetupRenderThread(); void VCount144(); @@ -149,7 +146,7 @@ bool Init(); void DeInit(); void Reset(); -void UpdateDisplaySettings(); +void SetRenderSettings(GPU::RenderSettings& settings); void RenderFrame(); void PrepareCaptureFrame(); diff --git a/src/GPU3D_OpenGL.cpp b/src/GPU3D_OpenGL.cpp index b1bcaa1..8a06874 100644 --- a/src/GPU3D_OpenGL.cpp +++ b/src/GPU3D_OpenGL.cpp @@ -29,6 +29,8 @@ namespace GPU3D namespace GLRenderer { +using namespace OpenGL; + // GL version requirements // * texelFetch: 3.0 (GLSL 1.30) (3.2/1.50 for MS) // * UBO: 3.1 @@ -142,7 +144,7 @@ bool BuildRenderShader(u32 flags, const char* vs, const char* fs) strcpy(&fsbuf[headerlen], kRenderFSCommon); strcpy(&fsbuf[headerlen + fsclen], fs); - bool ret = OpenGL_BuildShaderProgram(vsbuf, fsbuf, RenderShader[flags], shadername); + bool ret = OpenGL::BuildShaderProgram(vsbuf, fsbuf, RenderShader[flags], shadername); delete[] vsbuf; delete[] fsbuf; @@ -158,7 +160,7 @@ bool BuildRenderShader(u32 flags, const char* vs, const char* fs) glBindFragDataLocation(prog, 0, "oColor"); glBindFragDataLocation(prog, 1, "oAttr"); - if (!OpenGL_LinkShaderProgram(RenderShader[flags])) + if (!OpenGL::LinkShaderProgram(RenderShader[flags])) return false; GLint uni_id = glGetUniformBlockIndex(prog, "uConfig"); @@ -197,19 +199,18 @@ bool Init() glEnable(GL_DEPTH_TEST); glEnable(GL_STENCIL_TEST); - glDepthRange(0, 1); glClearDepth(1.0); - if (!OpenGL_BuildShaderProgram(kClearVS, kClearFS, ClearShaderPlain, "ClearShader")) + if (!OpenGL::BuildShaderProgram(kClearVS, kClearFS, ClearShaderPlain, "ClearShader")) return false; glBindAttribLocation(ClearShaderPlain[2], 0, "vPosition"); glBindFragDataLocation(ClearShaderPlain[2], 0, "oColor"); glBindFragDataLocation(ClearShaderPlain[2], 1, "oAttr"); - if (!OpenGL_LinkShaderProgram(ClearShaderPlain)) + if (!OpenGL::LinkShaderProgram(ClearShaderPlain)) return false; ClearUniformLoc[0] = glGetUniformLocation(ClearShaderPlain[2], "uColor"); @@ -237,15 +238,15 @@ bool Init() kRenderVS_W, kRenderFS_WSM)) return false; - if (!OpenGL_BuildShaderProgram(kFinalPassVS, kFinalPassEdgeFS, FinalPassEdgeShader, "FinalPassEdgeShader")) + if (!OpenGL::BuildShaderProgram(kFinalPassVS, kFinalPassEdgeFS, FinalPassEdgeShader, "FinalPassEdgeShader")) return false; - if (!OpenGL_BuildShaderProgram(kFinalPassVS, kFinalPassFogFS, FinalPassFogShader, "FinalPassFogShader")) + if (!OpenGL::BuildShaderProgram(kFinalPassVS, kFinalPassFogFS, FinalPassFogShader, "FinalPassFogShader")) return false; glBindAttribLocation(FinalPassEdgeShader[2], 0, "vPosition"); glBindFragDataLocation(FinalPassEdgeShader[2], 0, "oColor"); - if (!OpenGL_LinkShaderProgram(FinalPassEdgeShader)) + if (!OpenGL::LinkShaderProgram(FinalPassEdgeShader)) return false; uni_id = glGetUniformBlockIndex(FinalPassEdgeShader[2], "uConfig"); @@ -261,7 +262,7 @@ bool Init() glBindAttribLocation(FinalPassFogShader[2], 0, "vPosition"); glBindFragDataLocation(FinalPassFogShader[2], 0, "oColor"); - if (!OpenGL_LinkShaderProgram(FinalPassFogShader)) + if (!OpenGL::LinkShaderProgram(FinalPassFogShader)) return false; uni_id = glGetUniformBlockIndex(FinalPassFogShader[2], "uConfig"); @@ -392,7 +393,7 @@ void DeInit() for (int i = 0; i < 16; i++) { if (!RenderShader[i][2]) continue; - OpenGL_DeleteShaderProgram(RenderShader[i]); + OpenGL::DeleteShaderProgram(RenderShader[i]); } } @@ -400,10 +401,10 @@ void Reset() { } -void UpdateDisplaySettings() +void SetRenderSettings(GPU::RenderSettings& settings) { - int scale = Config::GL_ScaleFactor; - bool antialias = false; //Config::GL_Antialias; + int scale = settings.GL_ScaleFactor; + bool antialias = false; // REMOVE ME! if (antialias) scale *= 2; @@ -1224,7 +1225,7 @@ void RenderFrame() glBlitFramebuffer(0, 0, ScreenW, ScreenH, 0, 0, ScreenW/2, ScreenH/2, GL_COLOR_BUFFER_BIT, GL_LINEAR); } - glBindFramebuffer(GL_FRAMEBUFFER, FramebufferID[FrontBuffer]); + //glBindFramebuffer(GL_FRAMEBUFFER, FramebufferID[FrontBuffer]); FrontBuffer = FrontBuffer ? 0 : 1; } diff --git a/src/GPU3D_Soft.cpp b/src/GPU3D_Soft.cpp index 8397898..e9d8e75 100644 --- a/src/GPU3D_Soft.cpp +++ b/src/GPU3D_Soft.cpp @@ -60,6 +60,7 @@ bool Enabled; // threading +bool Threaded; void* RenderThread; bool RenderThreadRunning; bool RenderThreadRendering; @@ -83,7 +84,7 @@ void StopRenderThread() void SetupRenderThread() { - if (Config::Threaded3D) + if (Threaded) { if (!RenderThreadRunning) { @@ -112,6 +113,7 @@ bool Init() Sema_RenderDone = Platform::Semaphore_Create(); Sema_ScanlineCount = Platform::Semaphore_Create(); + Threaded = false; RenderThreadRunning = false; RenderThreadRendering = false; @@ -138,6 +140,12 @@ void Reset() SetupRenderThread(); } +void SetRenderSettings(GPU::RenderSettings& settings) +{ + Threaded = settings.Soft_Threaded; + SetupRenderThread(); +} + // Notes on the interpolator: diff --git a/src/GPU_OpenGL.cpp b/src/GPU_OpenGL.cpp new file mode 100644 index 0000000..1cb6864 --- /dev/null +++ b/src/GPU_OpenGL.cpp @@ -0,0 +1,206 @@ +/* + Copyright 2016-2020 Arisotura + + This file is part of melonDS. + + melonDS is free software: you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + melonDS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with melonDS. If not, see http://www.gnu.org/licenses/. +*/ + +#include <stdio.h> +#include <string.h> +#include "NDS.h" +#include "GPU.h" +#include "Config.h" +#include "OpenGLSupport.h" +#include "GPU_OpenGL_shaders.h" + +namespace GPU +{ +namespace GLCompositor +{ + +using namespace OpenGL; + +int Scale; +int ScreenH, ScreenW; + +GLuint CompShader[1][3]; +GLuint CompScaleLoc[1]; + +GLuint CompVertexBufferID; +GLuint CompVertexArrayID; +float CompVertices[2 * 3*2 * 2]; // position + +GLuint CompScreenInputTex; +GLuint CompScreenOutputTex; +GLuint CompScreenOutputFB; + + +bool Init() +{ + if (!OpenGL::BuildShaderProgram(kCompositorVS, kCompositorFS_Nearest, CompShader[0], "CompositorShader")) + //if (!OpenGL::BuildShaderProgram(kCompositorVS, kCompositorFS_Linear, CompShader[0], "CompositorShader")) + //if (!OpenGL::BuildShaderProgram(kCompositorVS_xBRZ, kCompositorFS_xBRZ, CompShader[0], "CompositorShader")) + return false; + + for (int i = 0; i < 1; i++) + { + GLint uni_id; + + glBindAttribLocation(CompShader[i][2], 0, "vPosition"); + glBindFragDataLocation(CompShader[i][2], 0, "oColor"); + + if (!OpenGL::LinkShaderProgram(CompShader[i])) + return false; + + CompScaleLoc[i] = glGetUniformLocation(CompShader[i][2], "u3DScale"); + + glUseProgram(CompShader[i][2]); + uni_id = glGetUniformLocation(CompShader[i][2], "ScreenTex"); + glUniform1i(uni_id, 0); + uni_id = glGetUniformLocation(CompShader[i][2], "_3DTex"); + glUniform1i(uni_id, 1); + } + +#define SETVERTEX(i, x, y) \ + CompVertices[2*(i) + 0] = x; \ + CompVertices[2*(i) + 1] = y; + + // top screen + SETVERTEX(0, -1, 1); + SETVERTEX(1, 1, 0); + SETVERTEX(2, 1, 1); + SETVERTEX(3, -1, 1); + SETVERTEX(4, -1, 0); + SETVERTEX(5, 1, 0); + + // bottom screen + SETVERTEX(6, -1, 0); + SETVERTEX(7, 1, -1); + SETVERTEX(8, 1, 0); + SETVERTEX(9, -1, 0); + SETVERTEX(10, -1, -1); + SETVERTEX(11, 1, -1); + +#undef SETVERTEX + + glGenBuffers(1, &CompVertexBufferID); + glBindBuffer(GL_ARRAY_BUFFER, CompVertexBufferID); + glBufferData(GL_ARRAY_BUFFER, sizeof(CompVertices), CompVertices, GL_STATIC_DRAW); + + glGenVertexArrays(1, &CompVertexArrayID); + glBindVertexArray(CompVertexArrayID); + glEnableVertexAttribArray(0); // position + glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2*4, (void*)(0)); + + glGenFramebuffers(1, &CompScreenOutputFB); + + glGenTextures(1, &CompScreenInputTex); + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, CompScreenInputTex); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8UI, 256*3 + 1, 192*2, 0, GL_RGBA_INTEGER, GL_UNSIGNED_BYTE, NULL); + + glGenTextures(1, &CompScreenOutputTex); + glBindTexture(GL_TEXTURE_2D, CompScreenOutputTex); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + + return true; +} + +void DeInit() +{ + glDeleteFramebuffers(1, &CompScreenOutputFB); + glDeleteTextures(1, &CompScreenInputTex); + glDeleteTextures(1, &CompScreenOutputTex); + + glDeleteVertexArrays(1, &CompVertexArrayID); + glDeleteBuffers(1, &CompVertexBufferID); + + for (int i = 0; i < 1; i++) + OpenGL::DeleteShaderProgram(CompShader[i]); +} + +void Reset() +{ +} + + +void SetRenderSettings(RenderSettings& settings) +{ + int scale = settings.GL_ScaleFactor; + + Scale = scale; + ScreenW = 256 * scale; + ScreenH = 384 * scale; + + glBindTexture(GL_TEXTURE_2D, CompScreenOutputTex); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, ScreenW, ScreenH, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); + + GLenum fbassign[] = {GL_COLOR_ATTACHMENT0}; + glBindFramebuffer(GL_FRAMEBUFFER, CompScreenOutputFB); + glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, CompScreenOutputTex, 0); + glDrawBuffers(1, fbassign); +} + + +void RenderFrame() +{ + glBindFramebuffer(GL_FRAMEBUFFER, CompScreenOutputFB); + + glDisable(GL_DEPTH_TEST); + glDisable(GL_STENCIL_TEST); + glDisable(GL_BLEND); + glColorMaski(0, GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + + glViewport(0, 0, ScreenW, ScreenH); + + // TODO: select more shaders (filtering, etc) + OpenGL::UseShaderProgram(CompShader[0]); + glUniform1ui(CompScaleLoc[0], Scale); + + int frontbuf = GPU::FrontBuffer; + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, CompScreenInputTex); + + if (GPU::Framebuffer[frontbuf][0] && GPU::Framebuffer[frontbuf][1]) + { + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 256*3 + 1, 192, GL_RGBA_INTEGER, + GL_UNSIGNED_BYTE, GPU::Framebuffer[frontbuf][0]); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 192, 256*3 + 1, 192, GL_RGBA_INTEGER, + GL_UNSIGNED_BYTE, GPU::Framebuffer[frontbuf][1]); + } + + glActiveTexture(GL_TEXTURE1); + GPU3D::GLRenderer::SetupAccelFrame(); + + glBindBuffer(GL_ARRAY_BUFFER, CompVertexBufferID); + glBindVertexArray(CompVertexArrayID); + glDrawArrays(GL_TRIANGLES, 0, 4*3); + + glFlush(); +} + +void BindOutputTexture() +{ + glBindTexture(GL_TEXTURE_2D, CompScreenOutputTex); +} + +} +} diff --git a/src/GPU_OpenGL_shaders.h b/src/GPU_OpenGL_shaders.h new file mode 100644 index 0000000..20ac767 --- /dev/null +++ b/src/GPU_OpenGL_shaders.h @@ -0,0 +1,867 @@ +/* + Copyright 2016-2020 Arisotura + + This file is part of melonDS. + + melonDS is free software: you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + melonDS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with melonDS. If not, see http://www.gnu.org/licenses/. +*/ + +#ifndef GPU_OPENGL_SHADERS_H +#define GPU_OPENGL_SHADERS_H + +const char* kCompositorVS = R"(#version 140 + +in vec2 vPosition; + +smooth out vec2 fTexcoord; + +void main() +{ + vec4 fpos; + fpos.xy = vPosition; + fpos.z = 0.0; + fpos.w = 1.0; + + gl_Position = fpos; + fTexcoord = (vPosition + vec2(1.0, 1.0)) * (vec2(256.0, 384.0) / 2.0); +} +)"; + +const char* kCompositorFS_Nearest = R"(#version 140 + +uniform uint u3DScale; + +uniform usampler2D ScreenTex; +uniform sampler2D _3DTex; + +smooth in vec2 fTexcoord; + +out vec4 oColor; + +void main() +{ + ivec4 pixel = ivec4(texelFetch(ScreenTex, ivec2(fTexcoord), 0)); + + ivec4 mbright = ivec4(texelFetch(ScreenTex, ivec2(256*3, int(fTexcoord.y)), 0)); + int dispmode = mbright.b & 0x3; + + if (dispmode == 1) + { + ivec4 val1 = pixel; + ivec4 val2 = ivec4(texelFetch(ScreenTex, ivec2(fTexcoord) + ivec2(256,0), 0)); + ivec4 val3 = ivec4(texelFetch(ScreenTex, ivec2(fTexcoord) + ivec2(512,0), 0)); + + int compmode = val3.a & 0xF; + int eva, evb, evy; + + if (compmode == 4) + { + // 3D on top, blending + + float xpos = val3.r + fract(fTexcoord.x); + float ypos = mod(fTexcoord.y, 192); + ivec4 _3dpix = ivec4(texelFetch(_3DTex, ivec2(vec2(xpos, ypos)*u3DScale), 0).bgra + * vec4(63,63,63,31)); + + if (_3dpix.a > 0) + { + eva = (_3dpix.a & 0x1F) + 1; + evb = 32 - eva; + + val1 = ((_3dpix * eva) + (val1 * evb)) >> 5; + if (eva <= 16) val1 += ivec4(1,1,1,0); + val1 = min(val1, 0x3F); + } + else + val1 = val2; + } + else if (compmode == 1) + { + // 3D on bottom, blending + + float xpos = val3.r + fract(fTexcoord.x); + float ypos = mod(fTexcoord.y, 192); + ivec4 _3dpix = ivec4(texelFetch(_3DTex, ivec2(vec2(xpos, ypos)*u3DScale), 0).bgra + * vec4(63,63,63,31)); + + if (_3dpix.a > 0) + { + eva = val3.g; + evb = val3.b; + + val1 = ((val1 * eva) + (_3dpix * evb)) >> 4; + val1 = min(val1, 0x3F); + } + else + val1 = val2; + } + else if (compmode <= 3) + { + // 3D on top, normal/fade + + float xpos = val3.r + fract(fTexcoord.x); + float ypos = mod(fTexcoord.y, 192); + ivec4 _3dpix = ivec4(texelFetch(_3DTex, ivec2(vec2(xpos, ypos)*u3DScale), 0).bgra + * vec4(63,63,63,31)); + + if (_3dpix.a > 0) + { + evy = val3.g; + + val1 = _3dpix; + if (compmode == 2) val1 += ((ivec4(0x3F,0x3F,0x3F,0) - val1) * evy) >> 4; + else if (compmode == 3) val1 -= (val1 * evy) >> 4; + } + else + val1 = val2; + } + + pixel = val1; + } + + if (dispmode != 0) + { + int brightmode = mbright.g >> 6; + if (brightmode == 1) + { + // up + int evy = mbright.r & 0x1F; + if (evy > 16) evy = 16; + + pixel += ((ivec4(0x3F,0x3F,0x3F,0) - pixel) * evy) >> 4; + } + else if (brightmode == 2) + { + // down + int evy = mbright.r & 0x1F; + if (evy > 16) evy = 16; + + pixel -= (pixel * evy) >> 4; + } + } + + pixel.rgb <<= 2; + pixel.rgb |= (pixel.rgb >> 6); + + // TODO: filters + + oColor = vec4(vec3(pixel.bgr) / 255.0, 1.0); +} +)"; + + + +const char* kCompositorFS_Linear = R"(#version 140 + +uniform uint u3DScale; + +uniform usampler2D ScreenTex; +uniform sampler2D _3DTex; + +smooth in vec2 fTexcoord; + +out vec4 oColor; + +ivec4 Get3DPixel(vec2 pos) +{ + return ivec4(texelFetch(_3DTex, ivec2(pos*u3DScale), 0).bgra + * vec4(63,63,63,31)); +} + +ivec4 GetFullPixel(ivec4 val1, ivec4 val2, ivec4 val3, ivec4 _3dpix) +{ + int compmode = val3.a & 0xF; + int eva, evb, evy; + + if (compmode == 4) + { + // 3D on top, blending + + if (_3dpix.a > 0) + { + eva = (_3dpix.a & 0x1F) + 1; + evb = 32 - eva; + + val1 = ((_3dpix * eva) + (val1 * evb)) >> 5; + if (eva <= 16) val1 += ivec4(1,1,1,0); + val1 = min(val1, 0x3F); + } + else + val1 = val2; + } + else if (compmode == 1) + { + // 3D on bottom, blending + + if (_3dpix.a > 0) + { + eva = val3.g; + evb = val3.b; + + val1 = ((val1 * eva) + (_3dpix * evb)) >> 4; + val1 = min(val1, 0x3F); + } + else + val1 = val2; + } + else if (compmode <= 3) + { + // 3D on top, normal/fade + + if (_3dpix.a > 0) + { + evy = val3.g; + + val1 = _3dpix; + if (compmode == 2) val1 += ((ivec4(0x3F,0x3F,0x3F,0) - val1) * evy) >> 4; + else if (compmode == 3) val1 -= (val1 * evy) >> 4; + } + else + val1 = val2; + } + + return val1; +} + +ivec4 imix(ivec4 a, ivec4 b, float x) +{ + return ivec4(vec4(a)*(1-x) + vec4(b)*x); +} + +void main() +{ + ivec4 pixel = ivec4(texelFetch(ScreenTex, ivec2(fTexcoord), 0)); + + ivec4 mbright = ivec4(texelFetch(ScreenTex, ivec2(256*3, int(fTexcoord.y)), 0)); + int dispmode = mbright.b & 0x3; + + if (dispmode == 1) + { + ivec4 val1 = pixel; + ivec4 val2 = ivec4(texelFetch(ScreenTex, ivec2(fTexcoord) + ivec2(256,0), 0)); + ivec4 val3 = ivec4(texelFetch(ScreenTex, ivec2(fTexcoord) + ivec2(512,0), 0)); + + float xfract = fract(fTexcoord.x); + float yfract = fract(fTexcoord.y); + + float xpos = val3.r + xfract; + float ypos = mod(fTexcoord.y, 192); + ivec4 _3dpix = Get3DPixel(vec2(xpos,ypos)); + + ivec4 p00 = GetFullPixel(val1, val2, val3, _3dpix); + + int xdisp = 1 - int(step(255, fTexcoord.x)); + int ydisp = 1 - int(step(191, ypos)); + + ivec4 p01 = GetFullPixel(ivec4(texelFetch(ScreenTex, ivec2(fTexcoord) + ivec2(xdisp+0 ,0), 0)), + ivec4(texelFetch(ScreenTex, ivec2(fTexcoord) + ivec2(xdisp+256,0), 0)), + ivec4(texelFetch(ScreenTex, ivec2(fTexcoord) + ivec2(xdisp+512,0), 0)), + _3dpix); + + ivec4 p10 = GetFullPixel(ivec4(texelFetch(ScreenTex, ivec2(fTexcoord) + ivec2(0+0 ,ydisp), 0)), + ivec4(texelFetch(ScreenTex, ivec2(fTexcoord) + ivec2(0+256,ydisp), 0)), + ivec4(texelFetch(ScreenTex, ivec2(fTexcoord) + ivec2(0+512,ydisp), 0)), + _3dpix); + + ivec4 p11 = GetFullPixel(ivec4(texelFetch(ScreenTex, ivec2(fTexcoord) + ivec2(xdisp+0 ,ydisp), 0)), + ivec4(texelFetch(ScreenTex, ivec2(fTexcoord) + ivec2(xdisp+256,ydisp), 0)), + ivec4(texelFetch(ScreenTex, ivec2(fTexcoord) + ivec2(xdisp+512,ydisp), 0)), + _3dpix); + + ivec4 pa = imix(p00, p01, xfract); + ivec4 pb = imix(p10, p11, xfract); + + pixel = imix(pa, pb, yfract); + } + + if (dispmode != 0) + { + int brightmode = mbright.g >> 6; + if (brightmode == 1) + { + // up + int evy = mbright.r & 0x1F; + if (evy > 16) evy = 16; + + pixel += ((ivec4(0x3F,0x3F,0x3F,0) - pixel) * evy) >> 4; + } + else if (brightmode == 2) + { + // down + int evy = mbright.r & 0x1F; + if (evy > 16) evy = 16; + + pixel -= (pixel * evy) >> 4; + } + } + + pixel.rgb <<= 2; + pixel.rgb |= (pixel.rgb >> 6); + + // TODO: filters + + oColor = vec4(vec3(pixel.bgr) / 255.0, 1.0); +} +)"; + + + + + + +// HUGE TEST ZONE ARRLGD + +const char* kCompositorVS_xBRZ = R"(#version 140 + +#define BLEND_NONE 0 +#define BLEND_NORMAL 1 +#define BLEND_DOMINANT 2 +#define LUMINANCE_WEIGHT 1.0 +#define EQUAL_COLOR_TOLERANCE 30.0/255.0 +#define STEEP_DIRECTION_THRESHOLD 2.2 +#define DOMINANT_DIRECTION_THRESHOLD 3.6 + +#if __VERSION__ >= 130 +#define COMPAT_VARYING out +#define COMPAT_ATTRIBUTE in +#define COMPAT_TEXTURE texture +#else +#define COMPAT_VARYING varying +#define COMPAT_ATTRIBUTE attribute +#define COMPAT_TEXTURE texture2D +#endif + +#ifdef GL_ES +#define COMPAT_PRECISION mediump +#else +#define COMPAT_PRECISION +#endif + +COMPAT_ATTRIBUTE vec2 vPosition; +COMPAT_VARYING vec4 TEX0; +COMPAT_VARYING vec4 t1; +COMPAT_VARYING vec4 t2; +COMPAT_VARYING vec4 t3; +COMPAT_VARYING vec4 t4; +COMPAT_VARYING vec4 t5; +COMPAT_VARYING vec4 t6; +COMPAT_VARYING vec4 t7; + +uniform COMPAT_PRECISION int FrameDirection; +uniform COMPAT_PRECISION int FrameCount; +uniform COMPAT_PRECISION vec2 OutputSize; +uniform COMPAT_PRECISION vec2 TextureSize; +uniform COMPAT_PRECISION vec2 InputSize; + +// vertex compatibility #defines +#define vTexCoord TEX0.xy +#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize +#define outsize vec4(OutputSize, 1.0 / OutputSize) + +void main() +{ + vec4 fpos; + fpos.xy = vPosition; + fpos.z = 0.0; + fpos.w = 1.0; + + gl_Position = fpos; + vec2 TexCoord = (vPosition + vec2(1.0, 1.0)) * (vec2(256.0, 384.0) / 2.0); + + + //gl_Position = MVPMatrix * VertexCoord; + //COL0 = COLOR; + TEX0.xy = TexCoord.xy; + vec2 ps = vec2(1,1);//vec2(SourceSize.z, SourceSize.w); + float dx = ps.x; + float dy = ps.y; + + // A1 B1 C1 + // A0 A B C C4 + // D0 D E F F4 + // G0 G H I I4 + // G5 H5 I5 + + t1 = vTexCoord.xxxy + vec4( -dx, 0.0, dx,-2.0*dy); // A1 B1 C1 + t2 = vTexCoord.xxxy + vec4( -dx, 0.0, dx, -dy); // A B C + t3 = vTexCoord.xxxy + vec4( -dx, 0.0, dx, 0.0); // D E F + t4 = vTexCoord.xxxy + vec4( -dx, 0.0, dx, dy); // G H I + t5 = vTexCoord.xxxy + vec4( -dx, 0.0, dx, 2.0*dy); // G5 H5 I5 + t6 = vTexCoord.xyyy + vec4(-2.0*dx,-dy, 0.0, dy); // A0 D0 G0 + t7 = vTexCoord.xyyy + vec4( 2.0*dx,-dy, 0.0, dy); // C4 F4 I4 +} +)"; + +const char* kCompositorFS_xBRZ = R"(#version 140 + +#define BLEND_NONE 0 +#define BLEND_NORMAL 1 +#define BLEND_DOMINANT 2 +#define LUMINANCE_WEIGHT 1.0 +#define EQUAL_COLOR_TOLERANCE 30.0/255.0 +#define STEEP_DIRECTION_THRESHOLD 2.2 +#define DOMINANT_DIRECTION_THRESHOLD 3.6 + +#if __VERSION__ >= 130 +#define COMPAT_VARYING in +//#define COMPAT_TEXTURE texture +#define FragColor oColor +#else +#define COMPAT_VARYING varying +#define FragColor gl_FragColor +//#define COMPAT_TEXTURE texture2D +#endif + +#ifdef GL_ES +#ifdef GL_FRAGMENT_PRECISION_HIGH +precision highp float; +#else +precision mediump float; +#endif +#define COMPAT_PRECISION mediump +#else +#define COMPAT_PRECISION +#endif + +uniform uint u3DScale; + +uniform usampler2D ScreenTex; +uniform sampler2D _3DTex; + +smooth in vec2 fTexcoord; + +out vec4 oColor; + +//uniform COMPAT_PRECISION vec2 OutputSize; +//uniform COMPAT_PRECISION vec2 TextureSize; +#define TextureSize vec2(256,384) +//uniform COMPAT_PRECISION vec2 InputSize; +//uniform sampler2D Texture; +#define Texture 1312 +COMPAT_VARYING vec4 TEX0; +COMPAT_VARYING vec4 t1; +COMPAT_VARYING vec4 t2; +COMPAT_VARYING vec4 t3; +COMPAT_VARYING vec4 t4; +COMPAT_VARYING vec4 t5; +COMPAT_VARYING vec4 t6; +COMPAT_VARYING vec4 t7; + +// fragment compatibility #defines +#define Source Texture +#define vTexCoord TEX0.xy + +#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize +#define outsize vec4(OutputSize, 1.0 / OutputSize) + + const float one_sixth = 1.0 / 6.0; + const float two_sixth = 2.0 / 6.0; + const float four_sixth = 4.0 / 6.0; + const float five_sixth = 5.0 / 6.0; + +vec4 Get2DPixel(vec2 texcoord, int level) +{ + ivec4 pixel = ivec4(texelFetch(ScreenTex, ivec2(texcoord) + ivec2(level*256,0), 0)); + + return vec4(pixel) / vec4(63.0, 63.0, 63.0, 31.0); +} + +ivec4 Get3DPixel(vec2 pos) +{ + return ivec4(texelFetch(_3DTex, ivec2(pos*u3DScale), 0).bgra + * vec4(63,63,63,31)); +} + +float reduce(const vec3 color) +{ + return dot(color, vec3(65536.0, 256.0, 1.0)); +} + +float DistYCbCr(const vec3 pixA, const vec3 pixB) +{ + const vec3 w = vec3(0.2627, 0.6780, 0.0593); + const float scaleB = 0.5 / (1.0 - w.b); + const float scaleR = 0.5 / (1.0 - w.r); + vec3 diff = pixA - pixB; + float Y = dot(diff, w); + float Cb = scaleB * (diff.b - Y); + float Cr = scaleR * (diff.r - Y); + + return sqrt( ((LUMINANCE_WEIGHT * Y) * (LUMINANCE_WEIGHT * Y)) + (Cb * Cb) + (Cr * Cr) ); +} + +bool IsPixEqual(const vec3 pixA, const vec3 pixB) +{ + return (DistYCbCr(pixA, pixB) < EQUAL_COLOR_TOLERANCE); +} + +bool IsBlendingNeeded(const ivec4 blend) +{ + return any(notEqual(blend, ivec4(BLEND_NONE))); +} + +//--------------------------------------- +// Input Pixel Mapping: --|21|22|23|-- +// 19|06|07|08|09 +// 18|05|00|01|10 +// 17|04|03|02|11 +// --|15|14|13|-- +// +// Output Pixel Mapping: 20|21|22|23|24|25 +// 19|06|07|08|09|26 +// 18|05|00|01|10|27 +// 17|04|03|02|11|28 +// 16|15|14|13|12|29 +// 35|34|33|32|31|30 + +ivec4 GetFiltered2DPixel(int level) +{ + vec2 f = fract(vTexCoord.xy);// * SourceSize.xy); + + //--------------------------------------- + // Input Pixel Mapping: 20|21|22|23|24 + // 19|06|07|08|09 + // 18|05|00|01|10 + // 17|04|03|02|11 + // 16|15|14|13|12 + + vec3 src[25]; + + src[21] = Get2DPixel(t1.xw, level).rgb; + src[22] = Get2DPixel(t1.yw, level).rgb; + src[23] = Get2DPixel(t1.zw, level).rgb; + src[ 6] = Get2DPixel(t2.xw, level).rgb; + src[ 7] = Get2DPixel(t2.yw, level).rgb; + src[ 8] = Get2DPixel(t2.zw, level).rgb; + src[ 5] = Get2DPixel(t3.xw, level).rgb; + src[ 0] = Get2DPixel(t3.yw, level).rgb; + src[ 1] = Get2DPixel(t3.zw, level).rgb; + src[ 4] = Get2DPixel(t4.xw, level).rgb; + src[ 3] = Get2DPixel(t4.yw, level).rgb; + src[ 2] = Get2DPixel(t4.zw, level).rgb; + src[15] = Get2DPixel(t5.xw, level).rgb; + src[14] = Get2DPixel(t5.yw, level).rgb; + src[13] = Get2DPixel(t5.zw, level).rgb; + src[19] = Get2DPixel(t6.xy, level).rgb; + src[18] = Get2DPixel(t6.xz, level).rgb; + src[17] = Get2DPixel(t6.xw, level).rgb; + src[ 9] = Get2DPixel(t7.xy, level).rgb; + src[10] = Get2DPixel(t7.xz, level).rgb; + src[11] = Get2DPixel(t7.xw, level).rgb; + + float v[9]; + v[0] = reduce(src[0]); + v[1] = reduce(src[1]); + v[2] = reduce(src[2]); + v[3] = reduce(src[3]); + v[4] = reduce(src[4]); + v[5] = reduce(src[5]); + v[6] = reduce(src[6]); + v[7] = reduce(src[7]); + v[8] = reduce(src[8]); + + ivec4 blendResult = ivec4(BLEND_NONE); + + // Preprocess corners + // Pixel Tap Mapping: --|--|--|--|-- + // --|--|07|08|-- + // --|05|00|01|10 + // --|04|03|02|11 + // --|--|14|13|-- + // Corner (1, 1) + if ( ((v[0] == v[1] && v[3] == v[2]) || (v[0] == v[3] && v[1] == v[2])) == false) + { + float dist_03_01 = DistYCbCr(src[ 4], src[ 0]) + DistYCbCr(src[ 0], src[ 8]) + DistYCbCr(src[14], src[ 2]) + DistYCbCr(src[ 2], src[10]) + (4.0 * DistYCbCr(src[ 3], src[ 1])); + float dist_00_02 = DistYCbCr(src[ 5], src[ 3]) + DistYCbCr(src[ 3], src[13]) + DistYCbCr(src[ 7], src[ 1]) + DistYCbCr(src[ 1], src[11]) + (4.0 * DistYCbCr(src[ 0], src[ 2])); + bool dominantGradient = (DOMINANT_DIRECTION_THRESHOLD * dist_03_01) < dist_00_02; + blendResult[2] = ((dist_03_01 < dist_00_02) && (v[0] != v[1]) && (v[0] != v[3])) ? ((dominantGradient) ? BLEND_DOMINANT : BLEND_NORMAL) : BLEND_NONE; + } + + // Pixel Tap Mapping: --|--|--|--|-- + // --|06|07|--|-- + // 18|05|00|01|-- + // 17|04|03|02|-- + // --|15|14|--|-- + // Corner (0, 1) + if ( ((v[5] == v[0] && v[4] == v[3]) || (v[5] == v[4] && v[0] == v[3])) == false) + { + float dist_04_00 = DistYCbCr(src[17], src[ 5]) + DistYCbCr(src[ 5], src[ 7]) + DistYCbCr(src[15], src[ 3]) + DistYCbCr(src[ 3], src[ 1]) + (4.0 * DistYCbCr(src[ 4], src[ 0])); + float dist_05_03 = DistYCbCr(src[18], src[ 4]) + DistYCbCr(src[ 4], src[14]) + DistYCbCr(src[ 6], src[ 0]) + DistYCbCr(src[ 0], src[ 2]) + (4.0 * DistYCbCr(src[ 5], src[ 3])); + bool dominantGradient = (DOMINANT_DIRECTION_THRESHOLD * dist_05_03) < dist_04_00; + blendResult[3] = ((dist_04_00 > dist_05_03) && (v[0] != v[5]) && (v[0] != v[3])) ? ((dominantGradient) ? BLEND_DOMINANT : BLEND_NORMAL) : BLEND_NONE; + } + + // Pixel Tap Mapping: --|--|22|23|-- + // --|06|07|08|09 + // --|05|00|01|10 + // --|--|03|02|-- + // --|--|--|--|-- + // Corner (1, 0) + if ( ((v[7] == v[8] && v[0] == v[1]) || (v[7] == v[0] && v[8] == v[1])) == false) + { + float dist_00_08 = DistYCbCr(src[ 5], src[ 7]) + DistYCbCr(src[ 7], src[23]) + DistYCbCr(src[ 3], src[ 1]) + DistYCbCr(src[ 1], src[ 9]) + (4.0 * DistYCbCr(src[ 0], src[ 8])); + float dist_07_01 = DistYCbCr(src[ 6], src[ 0]) + DistYCbCr(src[ 0], src[ 2]) + DistYCbCr(src[22], src[ 8]) + DistYCbCr(src[ 8], src[10]) + (4.0 * DistYCbCr(src[ 7], src[ 1])); + bool dominantGradient = (DOMINANT_DIRECTION_THRESHOLD * dist_07_01) < dist_00_08; + blendResult[1] = ((dist_00_08 > dist_07_01) && (v[0] != v[7]) && (v[0] != v[1])) ? ((dominantGradient) ? BLEND_DOMINANT : BLEND_NORMAL) : BLEND_NONE; + } + + // Pixel Tap Mapping: --|21|22|--|-- + // 19|06|07|08|-- + // 18|05|00|01|-- + // --|04|03|--|-- + // --|--|--|--|-- + // Corner (0, 0) + if ( ((v[6] == v[7] && v[5] == v[0]) || (v[6] == v[5] && v[7] == v[0])) == false) + { + float dist_05_07 = DistYCbCr(src[18], src[ 6]) + DistYCbCr(src[ 6], src[22]) + DistYCbCr(src[ 4], src[ 0]) + DistYCbCr(src[ 0], src[ 8]) + (4.0 * DistYCbCr(src[ 5], src[ 7])); + float dist_06_00 = DistYCbCr(src[19], src[ 5]) + DistYCbCr(src[ 5], src[ 3]) + DistYCbCr(src[21], src[ 7]) + DistYCbCr(src[ 7], src[ 1]) + (4.0 * DistYCbCr(src[ 6], src[ 0])); + bool dominantGradient = (DOMINANT_DIRECTION_THRESHOLD * dist_05_07) < dist_06_00; + blendResult[0] = ((dist_05_07 < dist_06_00) && (v[0] != v[5]) && (v[0] != v[7])) ? ((dominantGradient) ? BLEND_DOMINANT : BLEND_NORMAL) : BLEND_NONE; + } + + vec3 dst[16]; + dst[ 0] = src[0]; + dst[ 1] = src[0]; + dst[ 2] = src[0]; + dst[ 3] = src[0]; + dst[ 4] = src[0]; + dst[ 5] = src[0]; + dst[ 6] = src[0]; + dst[ 7] = src[0]; + dst[ 8] = src[0]; + dst[ 9] = src[0]; + dst[10] = src[0]; + dst[11] = src[0]; + dst[12] = src[0]; + dst[13] = src[0]; + dst[14] = src[0]; + dst[15] = src[0]; + + // Scale pixel + if (IsBlendingNeeded(blendResult) == true) + { + float dist_01_04 = DistYCbCr(src[1], src[4]); + float dist_03_08 = DistYCbCr(src[3], src[8]); + bool haveShallowLine = (STEEP_DIRECTION_THRESHOLD * dist_01_04 <= dist_03_08) && (v[0] != v[4]) && (v[5] != v[4]); + bool haveSteepLine = (STEEP_DIRECTION_THRESHOLD * dist_03_08 <= dist_01_04) && (v[0] != v[8]) && (v[7] != v[8]); + bool needBlend = (blendResult[2] != BLEND_NONE); + bool doLineBlend = ( blendResult[2] >= BLEND_DOMINANT || + ((blendResult[1] != BLEND_NONE && !IsPixEqual(src[0], src[4])) || + (blendResult[3] != BLEND_NONE && !IsPixEqual(src[0], src[8])) || + (IsPixEqual(src[4], src[3]) && IsPixEqual(src[3], src[2]) && IsPixEqual(src[2], src[1]) && IsPixEqual(src[1], src[8]) && IsPixEqual(src[0], src[2]) == false) ) == false ); + + vec3 blendPix = ( DistYCbCr(src[0], src[1]) <= DistYCbCr(src[0], src[3]) ) ? src[1] : src[3]; + dst[ 2] = mix(dst[ 2], blendPix, (needBlend && doLineBlend) ? ((haveShallowLine) ? ((haveSteepLine) ? 1.0/3.0 : 0.25) : ((haveSteepLine) ? 0.25 : 0.00)) : 0.00); + dst[ 9] = mix(dst[ 9], blendPix, (needBlend && doLineBlend && haveSteepLine) ? 0.25 : 0.00); + dst[10] = mix(dst[10], blendPix, (needBlend && doLineBlend && haveSteepLine) ? 0.75 : 0.00); + dst[11] = mix(dst[11], blendPix, (needBlend) ? ((doLineBlend) ? ((haveSteepLine) ? 1.00 : ((haveShallowLine) ? 0.75 : 0.50)) : 0.08677704501) : 0.00); + dst[12] = mix(dst[12], blendPix, (needBlend) ? ((doLineBlend) ? 1.00 : 0.6848532563) : 0.00); + dst[13] = mix(dst[13], blendPix, (needBlend) ? ((doLineBlend) ? ((haveShallowLine) ? 1.00 : ((haveSteepLine) ? 0.75 : 0.50)) : 0.08677704501) : 0.00); + dst[14] = mix(dst[14], blendPix, (needBlend && doLineBlend && haveShallowLine) ? 0.75 : 0.00); + dst[15] = mix(dst[15], blendPix, (needBlend && doLineBlend && haveShallowLine) ? 0.25 : 0.00); + + dist_01_04 = DistYCbCr(src[7], src[2]); + dist_03_08 = DistYCbCr(src[1], src[6]); + haveShallowLine = (STEEP_DIRECTION_THRESHOLD * dist_01_04 <= dist_03_08) && (v[0] != v[2]) && (v[3] != v[2]); + haveSteepLine = (STEEP_DIRECTION_THRESHOLD * dist_03_08 <= dist_01_04) && (v[0] != v[6]) && (v[5] != v[6]); + needBlend = (blendResult[1] != BLEND_NONE); + doLineBlend = ( blendResult[1] >= BLEND_DOMINANT || + !((blendResult[0] != BLEND_NONE && !IsPixEqual(src[0], src[2])) || + (blendResult[2] != BLEND_NONE && !IsPixEqual(src[0], src[6])) || + (IsPixEqual(src[2], src[1]) && IsPixEqual(src[1], src[8]) && IsPixEqual(src[8], src[7]) && IsPixEqual(src[7], src[6]) && !IsPixEqual(src[0], src[8])) ) ); + + blendPix = ( DistYCbCr(src[0], src[7]) <= DistYCbCr(src[0], src[1]) ) ? src[7] : src[1]; + dst[ 1] = mix(dst[ 1], blendPix, (needBlend && doLineBlend) ? ((haveShallowLine) ? ((haveSteepLine) ? 1.0/3.0 : 0.25) : ((haveSteepLine) ? 0.25 : 0.00)) : 0.00); + dst[ 6] = mix(dst[ 6], blendPix, (needBlend && doLineBlend && haveSteepLine) ? 0.25 : 0.00); + dst[ 7] = mix(dst[ 7], blendPix, (needBlend && doLineBlend && haveSteepLine) ? 0.75 : 0.00); + dst[ 8] = mix(dst[ 8], blendPix, (needBlend) ? ((doLineBlend) ? ((haveSteepLine) ? 1.00 : ((haveShallowLine) ? 0.75 : 0.50)) : 0.08677704501) : 0.00); + dst[ 9] = mix(dst[ 9], blendPix, (needBlend) ? ((doLineBlend) ? 1.00 : 0.6848532563) : 0.00); + dst[10] = mix(dst[10], blendPix, (needBlend) ? ((doLineBlend) ? ((haveShallowLine) ? 1.00 : ((haveSteepLine) ? 0.75 : 0.50)) : 0.08677704501) : 0.00); + dst[11] = mix(dst[11], blendPix, (needBlend && doLineBlend && haveShallowLine) ? 0.75 : 0.00); + dst[12] = mix(dst[12], blendPix, (needBlend && doLineBlend && haveShallowLine) ? 0.25 : 0.00); + + dist_01_04 = DistYCbCr(src[5], src[8]); + dist_03_08 = DistYCbCr(src[7], src[4]); + haveShallowLine = (STEEP_DIRECTION_THRESHOLD * dist_01_04 <= dist_03_08) && (v[0] != v[8]) && (v[1] != v[8]); + haveSteepLine = (STEEP_DIRECTION_THRESHOLD * dist_03_08 <= dist_01_04) && (v[0] != v[4]) && (v[3] != v[4]); + needBlend = (blendResult[0] != BLEND_NONE); + doLineBlend = ( blendResult[0] >= BLEND_DOMINANT || + !((blendResult[3] != BLEND_NONE && !IsPixEqual(src[0], src[8])) || + (blendResult[1] != BLEND_NONE && !IsPixEqual(src[0], src[4])) || + (IsPixEqual(src[8], src[7]) && IsPixEqual(src[7], src[6]) && IsPixEqual(src[6], src[5]) && IsPixEqual(src[5], src[4]) && !IsPixEqual(src[0], src[6])) ) ); + + blendPix = ( DistYCbCr(src[0], src[5]) <= DistYCbCr(src[0], src[7]) ) ? src[5] : src[7]; + dst[ 0] = mix(dst[ 0], blendPix, (needBlend && doLineBlend) ? ((haveShallowLine) ? ((haveSteepLine) ? 1.0/3.0 : 0.25) : ((haveSteepLine) ? 0.25 : 0.00)) : 0.00); + dst[15] = mix(dst[15], blendPix, (needBlend && doLineBlend && haveSteepLine) ? 0.25 : 0.00); + dst[ 4] = mix(dst[ 4], blendPix, (needBlend && doLineBlend && haveSteepLine) ? 0.75 : 0.00); + dst[ 5] = mix(dst[ 5], blendPix, (needBlend) ? ((doLineBlend) ? ((haveSteepLine) ? 1.00 : ((haveShallowLine) ? 0.75 : 0.50)) : 0.08677704501) : 0.00); + dst[ 6] = mix(dst[ 6], blendPix, (needBlend) ? ((doLineBlend) ? 1.00 : 0.6848532563) : 0.00); + dst[ 7] = mix(dst[ 7], blendPix, (needBlend) ? ((doLineBlend) ? ((haveShallowLine) ? 1.00 : ((haveSteepLine) ? 0.75 : 0.50)) : 0.08677704501) : 0.00); + dst[ 8] = mix(dst[ 8], blendPix, (needBlend && doLineBlend && haveShallowLine) ? 0.75 : 0.00); + dst[ 9] = mix(dst[ 9], blendPix, (needBlend && doLineBlend && haveShallowLine) ? 0.25 : 0.00); + + + dist_01_04 = DistYCbCr(src[3], src[6]); + dist_03_08 = DistYCbCr(src[5], src[2]); + haveShallowLine = (STEEP_DIRECTION_THRESHOLD * dist_01_04 <= dist_03_08) && (v[0] != v[6]) && (v[7] != v[6]); + haveSteepLine = (STEEP_DIRECTION_THRESHOLD * dist_03_08 <= dist_01_04) && (v[0] != v[2]) && (v[1] != v[2]); + needBlend = (blendResult[3] != BLEND_NONE); + doLineBlend = ( blendResult[3] >= BLEND_DOMINANT || + !((blendResult[2] != BLEND_NONE && !IsPixEqual(src[0], src[6])) || + (blendResult[0] != BLEND_NONE && !IsPixEqual(src[0], src[2])) || + (IsPixEqual(src[6], src[5]) && IsPixEqual(src[5], src[4]) && IsPixEqual(src[4], src[3]) && IsPixEqual(src[3], src[2]) && !IsPixEqual(src[0], src[4])) ) ); + + blendPix = ( DistYCbCr(src[0], src[3]) <= DistYCbCr(src[0], src[5]) ) ? src[3] : src[5]; + dst[ 3] = mix(dst[ 3], blendPix, (needBlend && doLineBlend) ? ((haveShallowLine) ? ((haveSteepLine) ? 1.0/3.0 : 0.25) : ((haveSteepLine) ? 0.25 : 0.00)) : 0.00); + dst[12] = mix(dst[12], blendPix, (needBlend && doLineBlend && haveSteepLine) ? 0.25 : 0.00); + dst[13] = mix(dst[13], blendPix, (needBlend && doLineBlend && haveSteepLine) ? 0.75 : 0.00); + dst[14] = mix(dst[14], blendPix, (needBlend) ? ((doLineBlend) ? ((haveSteepLine) ? 1.00 : ((haveShallowLine) ? 0.75 : 0.50)) : 0.08677704501) : 0.00); + dst[15] = mix(dst[15], blendPix, (needBlend) ? ((doLineBlend) ? 1.00 : 0.6848532563) : 0.00); + dst[ 4] = mix(dst[ 4], blendPix, (needBlend) ? ((doLineBlend) ? ((haveShallowLine) ? 1.00 : ((haveSteepLine) ? 0.75 : 0.50)) : 0.08677704501) : 0.00); + dst[ 5] = mix(dst[ 5], blendPix, (needBlend && doLineBlend && haveShallowLine) ? 0.75 : 0.00); + dst[ 6] = mix(dst[ 6], blendPix, (needBlend && doLineBlend && haveShallowLine) ? 0.25 : 0.00); + } + + vec3 res = mix( mix( mix( mix(dst[ 6], dst[ 7], step(0.25, f.x)), mix(dst[ 8], dst[ 9], step(0.75, f.x)), step(0.50, f.x)), + mix( mix(dst[ 5], dst[ 0], step(0.25, f.x)), mix(dst[ 1], dst[10], step(0.75, f.x)), step(0.50, f.x)), step(0.25, f.y)), + mix( mix( mix(dst[ 4], dst[ 3], step(0.25, f.x)), mix(dst[ 2], dst[11], step(0.75, f.x)), step(0.50, f.x)), + mix( mix(dst[15], dst[14], step(0.25, f.x)), mix(dst[13], dst[12], step(0.75, f.x)), step(0.50, f.x)), step(0.75, f.y)), + step(0.50, f.y)); + + return ivec4(res * vec3(63,63,63), 0); +} + + +void main() +{ + vec2 fTexcoord = vTexCoord.xy; + + ivec4 pixel;// = ivec4(texelFetch(ScreenTex, ivec2(fTexcoord), 0)); + + ivec4 mbright = ivec4(texelFetch(ScreenTex, ivec2(256*3, int(fTexcoord.y)), 0)); + int dispmode = mbright.b & 0x3; + + if (dispmode == 1) + { + ivec4 val1;// = pixel; + //ivec4 val2 = ivec4(texelFetch(ScreenTex, ivec2(fTexcoord) + ivec2(256,0), 0)); + ivec4 val3 = ivec4(texelFetch(ScreenTex, ivec2(fTexcoord) + ivec2(512,0), 0)); + + int compmode = val3.a & 0xF; + int eva, evb, evy; + + float xpos = val3.r + fract(fTexcoord.x); + float ypos = mod(fTexcoord.y, 192); + ivec4 _3dpix = Get3DPixel(vec2(xpos, ypos)); + + if (compmode == 4) + { + // 3D on top, blending + + if (_3dpix.a > 0) + { + eva = (_3dpix.a & 0x1F) + 1; + if (eva == 32) + { + val1 = _3dpix; + } + else + { + evb = 32 - eva; + + val1 = GetFiltered2DPixel(0); + + val1 = ((_3dpix * eva) + (val1 * evb)) >> 5; + if (eva <= 16) val1 += ivec4(1,1,1,0); + val1 = min(val1, 0x3F); + } + } + else + val1 = GetFiltered2DPixel(1); + } + else if (compmode == 1) + { + // 3D on bottom, blending + + if (_3dpix.a > 0) + { + eva = val3.g; + evb = val3.b; + + val1 = GetFiltered2DPixel(0); + + val1 = ((val1 * eva) + (_3dpix * evb)) >> 4; + val1 = min(val1, 0x3F); + } + else + val1 = GetFiltered2DPixel(1); + } + else if (compmode <= 3) + { + // 3D on top, normal/fade + + if (_3dpix.a > 0) + { + evy = val3.g; + + val1 = _3dpix; + if (compmode == 2) val1 += ((ivec4(0x3F,0x3F,0x3F,0) - val1) * evy) >> 4; + else if (compmode == 3) val1 -= (val1 * evy) >> 4; + } + else + val1 = GetFiltered2DPixel(1); + } + else + val1 = GetFiltered2DPixel(0); + + pixel = val1; + } + else + { + pixel = GetFiltered2DPixel(0); + } + + if (dispmode != 0) + { + int brightmode = mbright.g >> 6; + if (brightmode == 1) + { + // up + int evy = mbright.r & 0x1F; + if (evy > 16) evy = 16; + + pixel += ((ivec4(0x3F,0x3F,0x3F,0) - pixel) * evy) >> 4; + } + else if (brightmode == 2) + { + // down + int evy = mbright.r & 0x1F; + if (evy > 16) evy = 16; + + pixel -= (pixel * evy) >> 4; + } + } + + pixel.rgb <<= 2; + pixel.rgb |= (pixel.rgb >> 6); + + FragColor = vec4(vec3(pixel.bgr) / 255.0, 1.0); +} +)"; + + + + + + +#endif // GPU_OPENGL_SHADERS_H diff --git a/src/NDS.cpp b/src/NDS.cpp index a2ab6ce..22368ae 100644 --- a/src/NDS.cpp +++ b/src/NDS.cpp @@ -33,6 +33,9 @@ #include "AREngine.h" #include "Platform.h" +#include "DSi.h" +#include "DSi_SPI_TSC.h" + namespace NDS { @@ -59,6 +62,8 @@ namespace NDS // // timings for GBA slot and wifi are set up at runtime +int ConsoleType; + u8 ARM9MemTimings[0x40000][4]; u8 ARM7MemTimings[0x20000][4]; @@ -88,7 +93,8 @@ u32 CPUStop; u8 ARM9BIOS[0x1000]; u8 ARM7BIOS[0x4000]; -u8 MainRAM[MAIN_RAM_SIZE]; +u8 MainRAM[0x1000000]; +u32 MainRAMMask; u8 SharedWRAM[0x8000]; u8 WRAMCnt; @@ -108,6 +114,7 @@ u8 ROMSeed1[2*8]; // IO shit u32 IME[2]; u32 IE[2], IF[2]; +u32 IE2, IF2; u8 PostFlag9; u8 PostFlag7; @@ -181,6 +188,8 @@ bool Init() if (!RTC::Init()) return false; if (!Wifi::Init()) return false; + if (!DSi::Init()) return false; + if (!AREngine::Init()) return false; return true; @@ -205,6 +214,8 @@ void DeInit() RTC::DeInit(); Wifi::DeInit(); + DSi::DeInit(); + AREngine::DeInit(); } @@ -238,7 +249,11 @@ void SetARM9RegionTimings(u32 addrstart, u32 addrend, int buswidth, int nonseq, ARM9MemTimings[i][3] = S32; } - ARM9->UpdateRegionTimings(addrstart<<14, addrend<<14); + addrstart <<= 14; + addrend <<= 14; + if (!addrend) addrend = 0xFFFFFFFF; + + ARM9->UpdateRegionTimings(addrstart, addrend); } void SetARM7RegionTimings(u32 addrstart, u32 addrend, int buswidth, int nonseq, int seq) @@ -283,6 +298,8 @@ void InitTimings() // TODO: +3c nonseq waitstate doesn't apply to DMA! // but of course mainRAM always gets 8c nonseq waitstate + // TODO: DSi-specific timings!! + SetARM9RegionTimings(0x00000000, 0xFFFFFFFF, 32, 1 + 3, 1); // void SetARM9RegionTimings(0xFFFF0000, 0xFFFFFFFF, 32, 1 + 3, 1); // BIOS @@ -308,6 +325,12 @@ void InitTimings() void SetupDirectBoot() { + if (ConsoleType == 1) + { + printf("!! DIRECT BOOT NOT SUPPORTED IN DSI MODE\n"); + return; + } + u32 bootparams[8]; memcpy(bootparams, &NDSCart::CartROM[0x20], 8*4); @@ -416,7 +439,13 @@ void Reset() RunningGame = false; LastSysClockCycles = 0; - f = Platform::OpenLocalFile("bios9.bin", "rb"); + memset(ARM9BIOS, 0, 0x1000); + memset(ARM7BIOS, 0, 0x4000); + + // DS BIOSes are always loaded, even in DSi mode + // we need them for DS-compatible mode + + f = Platform::OpenLocalFile(Config::BIOS9Path, "rb"); if (!f) { printf("ARM9 BIOS not found\n"); @@ -433,7 +462,7 @@ void Reset() fclose(f); } - f = Platform::OpenLocalFile("bios7.bin", "rb"); + f = Platform::OpenLocalFile(Config::BIOS7Path, "rb"); if (!f) { printf("ARM7 BIOS not found\n"); @@ -450,8 +479,19 @@ void Reset() fclose(f); } - // TODO for later: configure this when emulating a DSi - ARM9ClockShift = 1; + if (ConsoleType == 1) + { + DSi::LoadBIOS(); + DSi::LoadNAND(); + + ARM9ClockShift = 2; + MainRAMMask = 0xFFFFFF; + } + else + { + ARM9ClockShift = 1; + MainRAMMask = 0x3FFFFF; + } ARM9Timestamp = 0; ARM9Target = 0; ARM7Timestamp = 0; ARM7Target = 0; @@ -459,14 +499,14 @@ void Reset() InitTimings(); - memset(MainRAM, 0, MAIN_RAM_SIZE); + memset(MainRAM, 0, 0x1000000); memset(SharedWRAM, 0, 0x8000); memset(ARM7WRAM, 0, 0x10000); MapSharedWRAM(0); - ExMemCnt[0] = 0; - ExMemCnt[1] = 0; + ExMemCnt[0] = 0x4000; + ExMemCnt[1] = 0x4000; memset(ROMSeed0, 0, 2*8); memset(ROMSeed1, 0, 2*8); SetGBASlotTimings(); @@ -477,6 +517,8 @@ void Reset() IME[1] = 0; IE[1] = 0; IF[1] = 0; + IE2 = 0; + IF2 = 0; PostFlag9 = 0x00; PostFlag7 = 0x00; @@ -527,6 +569,12 @@ void Reset() RTC::Reset(); Wifi::Reset(); + if (ConsoleType == 1) + { + DSi::Reset(); + KeyInput &= ~(1 << (16+6)); + } + AREngine::Reset(); } @@ -587,7 +635,7 @@ bool DoSavestate_Scheduler(Savestate* file) } if (funcid == -1) { - printf("savestate: VERY BAD!!!!! FUNCTION POINTER FOR EVENT %d NOT IN HACKY LIST. CANNOT SAVE. SMACK STAPLEBUTTER.\n", i); + printf("savestate: VERY BAD!!!!! FUNCTION POINTER FOR EVENT %d NOT IN HACKY LIST. CANNOT SAVE. SMACK ARISOTURA.\n", i); return false; } } @@ -635,6 +683,11 @@ bool DoSavestate(Savestate* file) { file->Section("NDSG"); + // TODO: + // * do something for bool's (sizeof=1) + // * do something for 'loading DSi-mode savestate in DS mode' and vice-versa + // * add IE2/IF2 there + file->VarArray(MainRAM, 0x400000); file->VarArray(SharedWRAM, 0x8000); file->VarArray(ARM7WRAM, 0x10000); @@ -737,6 +790,11 @@ bool DoSavestate(Savestate* file) return true; } +void SetConsoleType(int type) +{ + ConsoleType = type; +} + bool LoadROM(const char* path, const char* sram, bool direct) { if (NDSCart::LoadROM(path, sram, direct)) @@ -848,6 +906,7 @@ u32 RunFrame() if (!(CPUStop & 0x80000000)) DMAs[1]->Run(); if (!(CPUStop & 0x80000000)) DMAs[2]->Run(); if (!(CPUStop & 0x80000000)) DMAs[3]->Run(); + if (ConsoleType == 1) DSi::RunNDMAs(0); } else { @@ -870,6 +929,7 @@ u32 RunFrame() DMAs[5]->Run(); DMAs[6]->Run(); DMAs[7]->Run(); + if (ConsoleType == 1) DSi::RunNDMAs(1); } else { @@ -951,24 +1011,30 @@ void CancelEvent(u32 id) } -void PressKey(u32 key) -{ - KeyInput &= ~(1 << key); -} - -void ReleaseKey(u32 key) -{ - KeyInput |= (1 << key); -} - void TouchScreen(u16 x, u16 y) { - SPI_TSC::SetTouchCoords(x, y); + if (ConsoleType == 1) + { + DSi_SPI_TSC::SetTouchCoords(x, y); + } + else + { + SPI_TSC::SetTouchCoords(x, y); + KeyInput &= ~(1 << (16+6)); + } } void ReleaseScreen() { - SPI_TSC::SetTouchCoords(0x000, 0xFFF); + if (ConsoleType == 1) + { + DSi_SPI_TSC::SetTouchCoords(0x000, 0xFFF); + } + else + { + SPI_TSC::SetTouchCoords(0x000, 0xFFF); + KeyInput |= (1 << (16+6)); + } } @@ -981,6 +1047,12 @@ void SetKeyMask(u32 mask) KeyInput |= key_lo | (key_hi << 16); } +bool IsLidClosed() +{ + if (KeyInput & (1<<23)) return true; + return false; +} + void SetLidClosed(bool closed) { if (closed) @@ -1095,6 +1167,8 @@ void UpdateIRQ(u32 cpu) if (IME[cpu] & 0x1) { arm->IRQ = IE[cpu] & IF[cpu]; + if ((ConsoleType == 1) && cpu) + arm->IRQ |= (IE2 & IF2); } else { @@ -1114,6 +1188,18 @@ void ClearIRQ(u32 cpu, u32 irq) UpdateIRQ(cpu); } +void SetIRQ2(u32 irq) +{ + IF2 |= (1 << irq); + UpdateIRQ(1); +} + +void ClearIRQ2(u32 irq) +{ + IF2 &= ~(1 << irq); + UpdateIRQ(1); +} + bool HaltInterrupted(u32 cpu) { if (cpu == 0) @@ -1161,6 +1247,7 @@ void GXFIFOStall() DMAs[1]->StallIfRunning(); DMAs[2]->StallIfRunning(); DMAs[3]->StallIfRunning(); + if (ConsoleType == 1) DSi::StallNDMAs(); } } @@ -1298,6 +1385,7 @@ void NocashPrint(u32 ncpu, u32 addr) void MonitorARM9Jump(u32 addr) { // checkme: can the entrypoint addr be THUMB? + // also TODO: make it work in DSi mode if ((!RunningGame) && NDSCart::CartROM) { @@ -1374,6 +1462,29 @@ void RunTimers(u32 cpu) +// matching NDMA modes for DSi +const u32 NDMAModes[] = +{ + // ARM9 + + 0x10, // immediate + 0x06, // VBlank + 0x07, // HBlank + 0x08, // scanline start + 0x09, // mainmem FIFO + 0x04, // DS cart slot + 0xFF, // GBA cart slot + 0x0A, // GX FIFO + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + + // ARM7 + + 0x30, // immediate + 0x26, // VBlank + 0x24, // DS cart slot + 0xFF, // wifi / GBA cart slot (TODO) +}; + bool DMAsInMode(u32 cpu, u32 mode) { cpu <<= 2; @@ -1381,6 +1492,13 @@ bool DMAsInMode(u32 cpu, u32 mode) if (DMAs[cpu+1]->IsInMode(mode)) return true; if (DMAs[cpu+2]->IsInMode(mode)) return true; if (DMAs[cpu+3]->IsInMode(mode)) return true; + + if (ConsoleType == 1) + { + cpu >>= 2; + return DSi::NDMAsInMode(cpu, NDMAModes[mode]); + } + return false; } @@ -1391,6 +1509,10 @@ bool DMAsRunning(u32 cpu) if (DMAs[cpu+1]->IsRunning()) return true; if (DMAs[cpu+2]->IsRunning()) return true; if (DMAs[cpu+3]->IsRunning()) return true; + if (ConsoleType == 1) + { + if (DSi::NDMAsRunning(cpu>>2)) return true; + } return false; } @@ -1401,6 +1523,12 @@ void CheckDMAs(u32 cpu, u32 mode) DMAs[cpu+1]->StartIfNeeded(mode); DMAs[cpu+2]->StartIfNeeded(mode); DMAs[cpu+3]->StartIfNeeded(mode); + + if (ConsoleType == 1) + { + cpu >>= 2; + DSi::CheckNDMAs(cpu, NDMAModes[mode]); + } } void StopDMAs(u32 cpu, u32 mode) @@ -1410,6 +1538,12 @@ void StopDMAs(u32 cpu, u32 mode) DMAs[cpu+1]->StopIfNeeded(mode); DMAs[cpu+2]->StopIfNeeded(mode); DMAs[cpu+3]->StopIfNeeded(mode); + + if (ConsoleType == 1) + { + cpu >>= 2; + DSi::StopNDMAs(cpu, NDMAModes[mode]); + } } @@ -1602,12 +1736,12 @@ void debug(u32 param) printf("ARM7 PC=%08X LR=%08X %08X\n", ARM7->R[15], ARM7->R[14], ARM7->R_IRQ[1]); printf("ARM9 IME=%08X IE=%08X IF=%08X\n", IME[0], IE[0], IF[0]); - printf("ARM7 IME=%08X IE=%08X IF=%08X\n", IME[1], IE[1], IF[1]); + printf("ARM7 IME=%08X IE=%08X IF=%08X IE2=%04X IF2=%04X\n", IME[1], IE[1], IF[1], IE2, IF2); //for (int i = 0; i < 9; i++) // printf("VRAM %c: %02X\n", 'A'+i, GPU::VRAMCNT[i]); - FILE* + /*FILE* shit = fopen("debug/party.bin", "wb"); fwrite(ARM9->ITCM, 0x8000, 1, shit); for (u32 i = 0x02000000; i < 0x02400000; i+=4) @@ -1620,6 +1754,21 @@ void debug(u32 param) u32 val = ARM7Read32(i); fwrite(&val, 4, 1, shit); } + fclose(shit);*/ + FILE* + /*shit = fopen("debug/dump9.bin", "wb"); + for (u32 i = 0x02000000; i < 0x04000000; i+=4) + { + u32 val = DSi::ARM9Read32(i); + fwrite(&val, 4, 1, shit); + } + fclose(shit);*/ + shit = fopen("debug/dump7_2.bin", "wb"); + for (u32 i = 0x02000000; i < 0x04000000; i+=4) + { + u32 val = DSi::ARM7Read32(i); + fwrite(&val, 4, 1, shit); + } fclose(shit); } @@ -1635,7 +1784,7 @@ u8 ARM9Read8(u32 addr) switch (addr & 0xFF000000) { case 0x02000000: - return *(u8*)&MainRAM[addr & (MAIN_RAM_SIZE - 1)]; + return *(u8*)&MainRAM[addr & MainRAMMask]; case 0x03000000: if (SWRAM_ARM9) @@ -1700,7 +1849,7 @@ u16 ARM9Read16(u32 addr) switch (addr & 0xFF000000) { case 0x02000000: - return *(u16*)&MainRAM[addr & (MAIN_RAM_SIZE - 1)]; + return *(u16*)&MainRAM[addr & MainRAMMask]; case 0x03000000: if (SWRAM_ARM9) @@ -1765,7 +1914,7 @@ u32 ARM9Read32(u32 addr) switch (addr & 0xFF000000) { case 0x02000000: - return *(u32*)&MainRAM[addr & (MAIN_RAM_SIZE - 1)]; + return *(u32*)&MainRAM[addr & MainRAMMask]; case 0x03000000: if (SWRAM_ARM9) @@ -1825,7 +1974,7 @@ void ARM9Write8(u32 addr, u8 val) switch (addr & 0xFF000000) { case 0x02000000: - *(u8*)&MainRAM[addr & (MAIN_RAM_SIZE - 1)] = val; + *(u8*)&MainRAM[addr & MainRAMMask] = val; return; case 0x03000000: @@ -1875,7 +2024,7 @@ void ARM9Write16(u32 addr, u16 val) switch (addr & 0xFF000000) { case 0x02000000: - *(u16*)&MainRAM[addr & (MAIN_RAM_SIZE - 1)] = val; + *(u16*)&MainRAM[addr & MainRAMMask] = val; return; case 0x03000000: @@ -1941,7 +2090,7 @@ void ARM9Write32(u32 addr, u32 val) switch (addr & 0xFF000000) { case 0x02000000: - *(u32*)&MainRAM[addr & (MAIN_RAM_SIZE - 1)] = val; + *(u32*)&MainRAM[addr & MainRAMMask] = val; return ; case 0x03000000: @@ -2009,7 +2158,7 @@ bool ARM9GetMemRegion(u32 addr, bool write, MemRegion* region) { case 0x02000000: region->Mem = MainRAM; - region->Mask = MAIN_RAM_SIZE-1; + region->Mask = MainRAMMask; return true; case 0x03000000: @@ -2039,7 +2188,8 @@ u8 ARM7Read8(u32 addr) { if (addr < 0x00004000) { - if (ARM7->R[15] >= 0x4000) + // TODO: check the boundary? is it 4000 or higher on regular DS? + if (ARM7->R[15] >= 0x00004000) return 0xFF; if (addr < ARM7BIOSProt && ARM7->R[15] >= ARM7BIOSProt) return 0xFF; @@ -2051,7 +2201,7 @@ u8 ARM7Read8(u32 addr) { case 0x02000000: case 0x02800000: - return *(u8*)&MainRAM[addr & (MAIN_RAM_SIZE - 1)]; + return *(u8*)&MainRAM[addr & MainRAMMask]; case 0x03000000: if (SWRAM_ARM7) @@ -2099,7 +2249,7 @@ u16 ARM7Read16(u32 addr) { if (addr < 0x00004000) { - if (ARM7->R[15] >= 0x4000) + if (ARM7->R[15] >= 0x00004000) return 0xFFFF; if (addr < ARM7BIOSProt && ARM7->R[15] >= ARM7BIOSProt) return 0xFFFF; @@ -2111,7 +2261,7 @@ u16 ARM7Read16(u32 addr) { case 0x02000000: case 0x02800000: - return *(u16*)&MainRAM[addr & (MAIN_RAM_SIZE - 1)]; + return *(u16*)&MainRAM[addr & MainRAMMask]; case 0x03000000: if (SWRAM_ARM7) @@ -2166,7 +2316,7 @@ u32 ARM7Read32(u32 addr) { if (addr < 0x00004000) { - if (ARM7->R[15] >= 0x4000) + if (ARM7->R[15] >= 0x00004000) return 0xFFFFFFFF; if (addr < ARM7BIOSProt && ARM7->R[15] >= ARM7BIOSProt) return 0xFFFFFFFF; @@ -2178,7 +2328,7 @@ u32 ARM7Read32(u32 addr) { case 0x02000000: case 0x02800000: - return *(u32*)&MainRAM[addr & (MAIN_RAM_SIZE - 1)]; + return *(u32*)&MainRAM[addr & MainRAMMask]; case 0x03000000: if (SWRAM_ARM7) @@ -2235,7 +2385,7 @@ void ARM7Write8(u32 addr, u8 val) { case 0x02000000: case 0x02800000: - *(u8*)&MainRAM[addr & (MAIN_RAM_SIZE - 1)] = val; + *(u8*)&MainRAM[addr & MainRAMMask] = val; return; case 0x03000000: @@ -2294,7 +2444,7 @@ void ARM7Write16(u32 addr, u16 val) { case 0x02000000: case 0x02800000: - *(u16*)&MainRAM[addr & (MAIN_RAM_SIZE - 1)] = val; + *(u16*)&MainRAM[addr & MainRAMMask] = val; return; case 0x03000000: @@ -2363,7 +2513,7 @@ void ARM7Write32(u32 addr, u32 val) { case 0x02000000: case 0x02800000: - *(u32*)&MainRAM[addr & (MAIN_RAM_SIZE - 1)] = val; + *(u32*)&MainRAM[addr & MainRAMMask] = val; return; case 0x03000000: @@ -2435,7 +2585,7 @@ bool ARM7GetMemRegion(u32 addr, bool write, MemRegion* region) case 0x02000000: case 0x02800000: region->Mem = MainRAM; - region->Mask = MAIN_RAM_SIZE-1; + region->Mask = MainRAMMask; return true; case 0x03000000: @@ -42,6 +42,11 @@ enum Event_Div, Event_Sqrt, + // DSi + Event_DSi_SDMMCTransfer, + Event_DSi_SDIOTransfer, + Event_DSi_NWifi, + Event_MAX }; @@ -74,12 +79,42 @@ enum IRQ_IPCSync, IRQ_IPCSendDone, IRQ_IPCRecv, - IRQ_CartSendDone, - IRQ_CartIREQMC, + IRQ_CartSendDone, // TODO: less misleading name + IRQ_CartIREQMC, // IRQ triggered by game cart (example: Pokémon Typing Adventure, BT controller) IRQ_GXFIFO, IRQ_LidOpen, IRQ_SPI, - IRQ_Wifi + IRQ_Wifi, + + // DSi IRQs + IRQ_DSi_DSP = 24, + IRQ_DSi_Camera, + IRQ_DSi_Unk26, + IRQ_DSi_Unk27, + IRQ_DSi_NDMA0, + IRQ_DSi_NDMA1, + IRQ_DSi_NDMA2, + IRQ_DSi_NDMA3, +}; + +enum +{ + // DSi ARM7-side IE2/IF2 + IRQ2_DSi_GPIO18_0 = 0, + IRQ2_DSi_GPIO18_1, + IRQ2_DSi_GPIO18_2, + IRQ2_DSi_Unused3, + IRQ2_DSi_GPIO33_0, + IRQ2_DSi_Headphone, + IRQ2_DSi_PowerButton, + IRQ2_DSi_GPIO33_3, // "sound enable input" + IRQ2_DSi_SDMMC, + IRQ2_DSi_SD_Data1, + IRQ2_DSi_SDIO, + IRQ2_DSi_SDIO_Data1, + IRQ2_DSi_AES, + IRQ2_DSi_I2C, + IRQ2_DSi_MicExt }; typedef struct @@ -98,6 +133,8 @@ typedef struct } MemRegion; +extern int ConsoleType; + extern u8 ARM9MemTimings[0x40000][4]; extern u8 ARM7MemTimings[0x20000][4]; @@ -105,12 +142,15 @@ extern u64 ARM9Timestamp, ARM9Target; extern u64 ARM7Timestamp, ARM7Target; extern u32 ARM9ClockShift; -// hax extern u32 IME[2]; extern u32 IE[2]; extern u32 IF[2]; +extern u32 IE2; +extern u32 IF2; extern Timer Timers[8]; +extern u32 CPUStop; + extern u16 PowerControl9; extern u16 ExMemCnt[2]; @@ -119,10 +159,12 @@ extern u8 ROMSeed1[2*8]; extern u8 ARM9BIOS[0x1000]; extern u8 ARM7BIOS[0x4000]; +extern u16 ARM7BIOSProt; -#define MAIN_RAM_SIZE 0x400000 +extern u8 MainRAM[0x1000000]; +extern u32 MainRAMMask; -extern u8 MainRAM[MAIN_RAM_SIZE]; +extern u32 KeyInput; bool Init(); void DeInit(); @@ -134,6 +176,9 @@ bool DoSavestate(Savestate* file); void SetARM9RegionTimings(u32 addrstart, u32 addrend, int buswidth, int nonseq, int seq); void SetARM7RegionTimings(u32 addrstart, u32 addrend, int buswidth, int nonseq, int seq); +// 0=DS 1=DSi +void SetConsoleType(int type); + bool LoadROM(const char* path, const char* sram, bool direct); bool LoadGBAROM(const char* path, const char* sram); void LoadBIOS(); @@ -142,13 +187,12 @@ void RelocateSave(const char* path, bool write); u32 RunFrame(); -void PressKey(u32 key); -void ReleaseKey(u32 key); void TouchScreen(u16 x, u16 y); void ReleaseScreen(); void SetKeyMask(u32 mask); +bool IsLidClosed(); void SetLidClosed(bool closed); void MicInputFrame(s16* data, int samples); @@ -162,8 +206,11 @@ void Halt(); void MapSharedWRAM(u8 val); +void UpdateIRQ(u32 cpu); void SetIRQ(u32 cpu, u32 irq); void ClearIRQ(u32 cpu, u32 irq); +void SetIRQ2(u32 irq); +void ClearIRQ2(u32 irq); bool HaltInterrupted(u32 cpu); void StopCPU(u32 cpu, u32 mask); void ResumeCPU(u32 cpu, u32 mask); diff --git a/src/NDSCart.cpp b/src/NDSCart.cpp index 5a2a0d0..a5e0f41 100644 --- a/src/NDSCart.cpp +++ b/src/NDSCart.cpp @@ -19,10 +19,13 @@ #include <stdio.h> #include <string.h> #include "NDS.h" +#include "DSi.h" #include "NDSCart.h" #include "ARM.h" #include "CRC32.h" +#include "DSi_AES.h" #include "Platform.h" +#include "ROMList.h" namespace NDSCart_SRAM @@ -473,6 +476,7 @@ u32 CartROMSize; u32 CartCRC; u32 CartID; bool CartIsHomebrew; +bool CartIsDSi; u32 CmdEncMode; u32 DataEncMode; @@ -555,9 +559,13 @@ void Key1_ApplyKeycode(u32* keycode, u32 mod) } } -void Key1_InitKeycode(u32 idcode, u32 level, u32 mod) +void Key1_InitKeycode(bool dsi, u32 idcode, u32 level, u32 mod) { - memcpy(Key1_KeyBuf, &NDS::ARM7BIOS[0x30], 0x1048); // hax + // TODO: source the key data from different possible places + if (dsi && NDS::ConsoleType==1) + memcpy(Key1_KeyBuf, &DSi::ARM7iBIOS[0xC6D0], 0x1048); // hax + else + memcpy(Key1_KeyBuf, &NDS::ARM7BIOS[0x30], 0x1048); // hax u32 keycode[3] = {idcode, idcode>>1, idcode<<1}; if (level >= 1) Key1_ApplyKeycode(keycode, mod); @@ -592,6 +600,15 @@ void Key2_Encrypt(u8* data, u32 len) } +void ApplyModcrypt(u32 addr, u32 len, u8* iv) +{return; + u8 key[16]; + + DSi_AES::GetModcryptKey(&CartROM[0], key); + DSi_AES::ApplyModcrypt(&CartROM[addr], len, key, iv); +} + + bool Init() { if (!NDSCart_SRAM::Init()) return false; @@ -610,32 +627,19 @@ void DeInit() void Reset() { - SPICnt = 0; - ROMCnt = 0; - - memset(ROMCommand, 0, 8); - ROMDataOut = 0; - - Key2_X = 0; - Key2_Y = 0; - - memset(DataOut, 0, 0x4000); - DataOutPos = 0; - DataOutLen = 0; - CartInserted = false; if (CartROM) delete[] CartROM; CartROM = NULL; CartROMSize = 0; CartID = 0; CartIsHomebrew = false; + CartIsDSi = false; ROMCommandHandler = NULL; - CmdEncMode = 0; - DataEncMode = 0; - NDSCart_SRAM::Reset(); + + ResetCart(); } void DoSavestate(Savestate* file) @@ -808,34 +812,21 @@ void ApplyDLDIPatch() } -bool ReadROMParams(u32 gamecode, u32* params) +bool ReadROMParams(u32 gamecode, ROMListEntry* params) { - // format for romlist.bin: - // [gamecode] [ROM size] [save type] [reserved] - // list must be sorted by gamecode - - FILE* f = Platform::OpenDataFile("romlist.bin"); - if (!f) return false; - - fseek(f, 0, SEEK_END); - u32 len = (u32)ftell(f); - u32 maxlen = len; - len >>= 4; // 16 bytes per entry + u32 len = sizeof(ROMList) / sizeof(ROMListEntry); u32 offset = 0; u32 chk_size = len >> 1; for (;;) { u32 key = 0; - fseek(f, offset + (chk_size << 4), SEEK_SET); - fread(&key, 4, 1, f); - - printf("chk_size=%d, key=%08X, wanted=%08X, offset=%08X\n", chk_size, key, gamecode, offset); + ROMListEntry* curentry = &ROMList[offset + chk_size]; + key = curentry->GameCode; if (key == gamecode) { - fread(params, 4, 3, f); - fclose(f); + memcpy(params, curentry, sizeof(ROMListEntry)); return true; } else @@ -843,22 +834,20 @@ bool ReadROMParams(u32 gamecode, u32* params) if (key < gamecode) { if (chk_size == 0) - offset += 0x10; + offset++; else - offset += (chk_size << 4); + offset += chk_size; } else if (chk_size == 0) { - fclose(f); return false; } chk_size >>= 1; } - if (offset >= maxlen) + if (offset >= len) { - fclose(f); return false; } } @@ -867,15 +856,20 @@ bool ReadROMParams(u32 gamecode, u32* params) void DecryptSecureArea(u8* out) { + // TODO: source decryption data from different possible sources + // * original DS-mode ARM7 BIOS has the key data at 0x30 + // * .srl ROMs (VC dumps) have encrypted secure areas but have precomputed + // decryption data at 0x1000 (and at the beginning of the DSi region if any) + u32 gamecode = *(u32*)&CartROM[0x0C]; u32 arm9base = *(u32*)&CartROM[0x20]; memcpy(out, &CartROM[arm9base], 0x800); - Key1_InitKeycode(gamecode, 2, 2); + Key1_InitKeycode(false, gamecode, 2, 2); Key1_Decrypt((u32*)&out[0]); - Key1_InitKeycode(gamecode, 3, 2); + Key1_InitKeycode(false, gamecode, 3, 2); for (u32 i = 0; i < 0x800; i += 8) Key1_Decrypt((u32*)&out[i]); @@ -898,6 +892,7 @@ bool LoadROM(const char* path, const char* sram, bool direct) { // TODO: streaming mode? for really big ROMs or systems with limited RAM // for now we're lazy + // also TODO: validate what we're loading!! FILE* f = Platform::OpenFile(path, "rb"); if (!f) @@ -919,6 +914,11 @@ bool LoadROM(const char* path, const char* sram, bool direct) fread(&gamecode, 4, 1, f); printf("Game code: %c%c%c%c\n", gamecode&0xFF, (gamecode>>8)&0xFF, (gamecode>>16)&0xFF, gamecode>>24); + u8 unitcode; + fseek(f, 0x12, SEEK_SET); + fread(&unitcode, 1, 1, f); + CartIsDSi = (unitcode & 0x02) != 0; + CartROM = new u8[CartROMSize]; memset(CartROM, 0, CartROMSize); fseek(f, 0, SEEK_SET); @@ -930,22 +930,23 @@ bool LoadROM(const char* path, const char* sram, bool direct) CartCRC = CRC32(CartROM, CartROMSize); printf("ROM CRC32: %08X\n", CartCRC); - u32 romparams[3]; - if (!ReadROMParams(gamecode, romparams)) + ROMListEntry romparams; + if (!ReadROMParams(gamecode, &romparams)) { // set defaults printf("ROM entry not found\n"); - romparams[0] = CartROMSize; + romparams.GameCode = gamecode; + romparams.ROMSize = CartROMSize; if (*(u32*)&CartROM[0x20] < 0x4000) - romparams[1] = 0; // no saveRAM for homebrew + romparams.SaveMemType = 0; // no saveRAM for homebrew else - romparams[1] = 2; // assume EEPROM 64k (TODO FIXME) + romparams.SaveMemType = 2; // assume EEPROM 64k (TODO FIXME) } else - printf("ROM entry: %08X %08X %08X\n", romparams[0], romparams[1], romparams[2]); + printf("ROM entry: %08X %08X\n", romparams.ROMSize, romparams.SaveMemType); - if (romparams[0] != len) printf("!! bad ROM size %d (expected %d) rounded to %d\n", len, romparams[0], CartROMSize); + if (romparams.ROMSize != len) printf("!! bad ROM size %d (expected %d) rounded to %d\n", len, romparams.ROMSize, CartROMSize); // generate a ROM ID // note: most games don't check the actual value @@ -957,9 +958,12 @@ bool LoadROM(const char* path, const char* sram, bool direct) else CartID |= (0x100 - (CartROMSize >> 28)) << 8; - if (romparams[1] == 8) + if (romparams.SaveMemType == 8) CartID |= 0x08000000; // NAND flag + if (CartIsDSi) + CartID |= 0x40000000; + printf("Cart ID: %08X\n", CartID); u32 arm9base = *(u32*)&CartROM[0x20]; @@ -975,11 +979,11 @@ bool LoadROM(const char* path, const char* sram, bool direct) strncpy((char*)&CartROM[arm9base], "encryObj", 8); - Key1_InitKeycode(gamecode, 3, 2); + Key1_InitKeycode(false, gamecode, 3, 2); for (u32 i = 0; i < 0x800; i += 8) Key1_Encrypt((u32*)&CartROM[arm9base + i]); - Key1_InitKeycode(gamecode, 2, 2); + Key1_InitKeycode(false, gamecode, 2, 2); Key1_Encrypt((u32*)&CartROM[arm9base]); } } @@ -1007,12 +1011,11 @@ bool LoadROM(const char* path, const char* sram, bool direct) ROMCommandHandler = ROMCommand_Retail; // encryption - Key1_InitKeycode(gamecode, 2, 2); - + Key1_InitKeycode(false, gamecode, 2, 2); // save printf("Save file: %s\n", sram); - NDSCart_SRAM::LoadSave(sram, romparams[1]); + NDSCart_SRAM::LoadSave(sram, romparams.SaveMemType); return true; } @@ -1023,6 +1026,27 @@ void RelocateSave(const char* path, bool write) NDSCart_SRAM::RelocateSave(path, write); } +void ResetCart() +{ + // CHECKME: what if there is a transfer in progress? + + SPICnt = 0; + ROMCnt = 0; + + memset(ROMCommand, 0, 8); + ROMDataOut = 0; + + Key2_X = 0; + Key2_Y = 0; + + memset(DataOut, 0, 0x4000); + DataOutPos = 0; + DataOutLen = 0; + + CmdEncMode = 0; + DataEncMode = 0; +} + void ReadROM(u32 addr, u32 len, u32 offset) { if (!CartInserted) return; @@ -1197,7 +1221,7 @@ void WriteROMCnt(u32 val) // handle KEY1 encryption as needed. // KEY2 encryption is implemented in hardware and doesn't need to be handled. u8 cmd[8]; - if (CmdEncMode == 1) + if (CmdEncMode == 1 || CmdEncMode == 11) { *(u32*)&cmd[0] = ByteSwap(*(u32*)&ROMCommand[4]); *(u32*)&cmd[4] = ByteSwap(*(u32*)&ROMCommand[0]); @@ -1243,11 +1267,23 @@ void WriteROMCnt(u32 val) break; case 0x3C: - if (CartInserted) CmdEncMode = 1; + if (CartInserted) + { + CmdEncMode = 1; + Key1_InitKeycode(false, *(u32*)&CartROM[0xC], 2, 2); + } + break; + + case 0x3D: + if (CartInserted && CartIsDSi) + { + CmdEncMode = 11; + Key1_InitKeycode(true, *(u32*)&CartROM[0xC], 1, 2); + } break; default: - if (CmdEncMode == 1) + if (CmdEncMode == 1 || CmdEncMode == 11) { switch (cmd[0] & 0xF0) { @@ -1263,6 +1299,12 @@ void WriteROMCnt(u32 val) case 0x20: { u32 addr = (cmd[2] & 0xF0) << 8; + if (CmdEncMode == 11) + { + u32 arm9i_base = *(u32*)&CartROM[0x1C0]; + addr -= 0x4000; + addr += arm9i_base; + } ReadROM(addr, 0x1000, 0); } break; diff --git a/src/NDSCart.h b/src/NDSCart.h index f19aea1..adc821f 100644 --- a/src/NDSCart.h +++ b/src/NDSCart.h @@ -48,6 +48,8 @@ void DecryptSecureArea(u8* out); bool LoadROM(const char* path, const char* sram, bool direct); void RelocateSave(const char* path, bool write); +void ResetCart(); + void WriteROMCnt(u32 val); u32 ReadROMData(); diff --git a/src/OpenGLSupport.cpp b/src/OpenGLSupport.cpp index f91af9b..27b1480 100644 --- a/src/OpenGLSupport.cpp +++ b/src/OpenGLSupport.cpp @@ -19,18 +19,20 @@ #include "OpenGLSupport.h" +namespace OpenGL +{ DO_PROCLIST(DECLPROC); -bool OpenGL_Init() +bool Init() { DO_PROCLIST(LOADPROC); return true; } -bool OpenGL_BuildShaderProgram(const char* vs, const char* fs, GLuint* ids, const char* name) +bool BuildShaderProgram(const char* vs, const char* fs, GLuint* ids, const char* name) { int len; int res; @@ -89,7 +91,7 @@ bool OpenGL_BuildShaderProgram(const char* vs, const char* fs, GLuint* ids, cons return true; } -bool OpenGL_LinkShaderProgram(GLuint* ids) +bool LinkShaderProgram(GLuint* ids) { int res; @@ -115,14 +117,16 @@ bool OpenGL_LinkShaderProgram(GLuint* ids) return true; } -void OpenGL_DeleteShaderProgram(GLuint* ids) +void DeleteShaderProgram(GLuint* ids) { glDeleteShader(ids[0]); glDeleteShader(ids[1]); glDeleteProgram(ids[2]); } -void OpenGL_UseShaderProgram(GLuint* ids) +void UseShaderProgram(GLuint* ids) { glUseProgram(ids[2]); } + +} diff --git a/src/OpenGLSupport.h b/src/OpenGLSupport.h index 5f92580..925c0ad 100644 --- a/src/OpenGLSupport.h +++ b/src/OpenGLSupport.h @@ -21,6 +21,8 @@ #include <stdio.h> #include <string.h> + +// TODO: different includes for each platform #include <GL/gl.h> #include <GL/glext.h> @@ -45,18 +47,18 @@ // if you need more OpenGL functions, add them to the macronator here -// TODO: handle conditionally loading certain functions for different GL versions -#ifndef __WIN32__ -#define DO_PROCLIST_1_3(func) - -#else +#ifdef __WIN32__ #define DO_PROCLIST_1_3(func) \ func(GLACTIVETEXTURE, glActiveTexture); \ func(GLBLENDCOLOR, glBlendColor); \ +#else + +#define DO_PROCLIST_1_3(func) + #endif @@ -112,6 +114,11 @@ func(GLGETUNIFORMLOCATION, glGetUniformLocation); \ func(GLGETUNIFORMBLOCKINDEX, glGetUniformBlockIndex); \ \ + func(GLFENCESYNC, glFenceSync); \ + func(GLDELETESYNC, glDeleteSync); \ + func(GLWAITSYNC, glWaitSync); \ + func(GLCLIENTWAITSYNC, glClientWaitSync); \ + \ func(GLDRAWBUFFERS, glDrawBuffers); \ \ func(GLBLENDFUNCSEPARATE, glBlendFuncSeparate); \ @@ -122,14 +129,18 @@ func(GLGETSTRINGI, glGetStringi); \ +namespace OpenGL +{ + DO_PROCLIST(DECLPROC_EXT); +bool Init(); -bool OpenGL_Init(); +bool BuildShaderProgram(const char* vs, const char* fs, GLuint* ids, const char* name); +bool LinkShaderProgram(GLuint* ids); +void DeleteShaderProgram(GLuint* ids); +void UseShaderProgram(GLuint* ids); -bool OpenGL_BuildShaderProgram(const char* vs, const char* fs, GLuint* ids, const char* name); -bool OpenGL_LinkShaderProgram(GLuint* ids); -void OpenGL_DeleteShaderProgram(GLuint* ids); -void OpenGL_UseShaderProgram(GLuint* ids); +} #endif // OPENGLSUPPORT_H diff --git a/src/Platform.h b/src/Platform.h index b6effdc..fea98dd 100644 --- a/src/Platform.h +++ b/src/Platform.h @@ -24,6 +24,9 @@ namespace Platform { +void Init(int argc, char** argv); +void DeInit(); + void StopEmu(); // fopen() wrappers diff --git a/src/ROMList.h b/src/ROMList.h new file mode 100644 index 0000000..ead3ee4 --- /dev/null +++ b/src/ROMList.h @@ -0,0 +1,6809 @@ +/* + Copyright 2016-2020 Arisotura + + This file is part of melonDS. + + melonDS is free software: you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + melonDS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with melonDS. If not, see http://www.gnu.org/licenses/. +*/ + +#ifndef ROMLIST_H +#define ROMLIST_H + +typedef struct +{ + u32 GameCode; + u32 ROMSize; + u32 SaveMemType; + +} ROMListEntry; + + +ROMListEntry ROMList[] = +{ + {0x41464141, 0x00800000, 0x00000004}, + {0x414D4155, 0x00800000, 0x00000008}, + {0x43363341, 0x02000000, 0x00000008}, + {0x43443241, 0x02000000, 0x00000002}, + {0x43495941, 0x01000000, 0x00000001}, + {0x434D5341, 0x01000000, 0x00000002}, + {0x434E5341, 0x00800000, 0x00000002}, + {0x43575A41, 0x02000000, 0x00000002}, + {0x44323643, 0x04000000, 0x00000001}, + {0x44324254, 0x04000000, 0x00000002}, + {0x44324C43, 0x00800000, 0x00000001}, + {0x44325542, 0x01000000, 0x00000002}, + {0x44325942, 0x00800000, 0x00000001}, + {0x44334444, 0x02000000, 0x00000001}, + {0x44334542, 0x04000000, 0x00000001}, + {0x44334754, 0x00800000, 0x00000002}, + {0x44334756, 0x02000000, 0x00000002}, + {0x44335141, 0x04000000, 0x00000002}, + {0x44335159, 0x04000000, 0x00000002}, + {0x44335254, 0x02000000, 0x00000001}, + {0x44335742, 0x08000000, 0x00000002}, + {0x44335942, 0x00800000, 0x00000001}, + {0x44343642, 0x00800000, 0x00000001}, + {0x44344259, 0x02000000, 0x00000001}, + {0x44344443, 0x00800000, 0x00000001}, + {0x44345254, 0x02000000, 0x00000001}, + {0x44345542, 0x00800000, 0x00000002}, + {0x44345942, 0x00800000, 0x00000001}, + {0x44353243, 0x02000000, 0x00000002}, + {0x44353642, 0x00800000, 0x00000001}, + {0x44353842, 0x01000000, 0x00000001}, + {0x44354259, 0x02000000, 0x00000002}, + {0x44354442, 0x01000000, 0x00000002}, + {0x44354659, 0x01000000, 0x00000001}, + {0x44354841, 0x02000000, 0x00000002}, + {0x44354C42, 0x01000000, 0x00000002}, + {0x44354C43, 0x00000000, 0x00000001}, + {0x44355342, 0x01000000, 0x00000001}, + {0x44355542, 0x02000000, 0x00000002}, + {0x44355942, 0x00800000, 0x00000001}, + {0x44363243, 0x01000000, 0x00000002}, + {0x44364142, 0x02000000, 0x00000002}, + {0x44364341, 0x01000000, 0x00000002}, + {0x44364843, 0x04000000, 0x00000001}, + {0x44364B43, 0x02000000, 0x00000002}, + {0x44364C42, 0x01000000, 0x00000002}, + {0x44365542, 0x01000000, 0x00000002}, + {0x44374543, 0x02000000, 0x00000002}, + {0x44374959, 0x04000000, 0x00000002}, + {0x44375359, 0x02000000, 0x00000001}, + {0x44384243, 0x02000000, 0x00000001}, + {0x44384A59, 0x01000000, 0x00000002}, + {0x44384F42, 0x01000000, 0x00000001}, + {0x44394259, 0x02000000, 0x00000003}, + {0x44394341, 0x04000000, 0x00000001}, + {0x44394543, 0x01000000, 0x00000003}, + {0x44414441, 0x04000000, 0x00000006}, + {0x44414A42, 0x01000000, 0x00000003}, + {0x44414C59, 0x00800000, 0x00000002}, + {0x44414D56, 0x02000000, 0x00000001}, + {0x44414E43, 0x04000000, 0x00000001}, + {0x44415041, 0x04000000, 0x00000006}, + {0x44415249, 0x10000000, 0x00000006}, + {0x44423542, 0x04000000, 0x00000002}, + {0x44424242, 0x00000000, 0x00000001}, + {0x44424354, 0x08000000, 0x00000001}, + {0x44424542, 0x10000000, 0x00000003}, + {0x44424A42, 0x04000000, 0x00000001}, + {0x44424B42, 0x01000000, 0x00000001}, + {0x44424C54, 0x02000000, 0x00000001}, + {0x44425249, 0x10000000, 0x00000006}, + {0x44425642, 0x02000000, 0x00000002}, + {0x44434343, 0x02000000, 0x00000002}, + {0x44434643, 0x02000000, 0x00000002}, + {0x44434842, 0x01000000, 0x00000001}, + {0x44434A42, 0x04000000, 0x00000002}, + {0x44434C54, 0x01000000, 0x00000001}, + {0x44435159, 0x01000000, 0x00000001}, + {0x44435342, 0x08000000, 0x00000002}, + {0x44435359, 0x01000000, 0x00000001}, + {0x44435559, 0x04000000, 0x00000002}, + {0x44435943, 0x02000000, 0x00000002}, + {0x44444254, 0x04000000, 0x00000002}, + {0x44444842, 0x04000000, 0x00000001}, + {0x44444856, 0x02000000, 0x00000002}, + {0x44445054, 0x08000000, 0x00000001}, + {0x44445249, 0x20000000, 0x00000006}, + {0x44445443, 0x00000000, 0x00000002}, + {0x44445459, 0x02000000, 0x00000002}, + {0x44445641, 0x01000000, 0x00000002}, + {0x44454242, 0x01000000, 0x00000001}, + {0x44454542, 0x10000000, 0x00000003}, + {0x44454559, 0x10000000, 0x00000003}, + {0x44454756, 0x02000000, 0x00000002}, + {0x44454842, 0x02000000, 0x00000002}, + {0x44454D54, 0x00800000, 0x00000002}, + {0x44454E42, 0x02000000, 0x00000001}, + {0x44454E59, 0x02000000, 0x00000002}, + {0x44455143, 0x04000000, 0x00000002}, + {0x44455249, 0x20000000, 0x00000006}, + {0x44455342, 0x01000000, 0x00000001}, + {0x44455642, 0x00800000, 0x00000002}, + {0x44464242, 0x02000000, 0x00000001}, + {0x44464B42, 0x04000000, 0x00000002}, + {0x44464B59, 0x02000000, 0x00000001}, + {0x44464C42, 0x10000000, 0x00000003}, + {0x44465343, 0x00800000, 0x00000001}, + {0x44465359, 0x04000000, 0x00000001}, + {0x44465442, 0x01000000, 0x00000002}, + {0x44473242, 0x04000000, 0x00000001}, + {0x44474B42, 0x00800000, 0x00000002}, + {0x44474C43, 0x04000000, 0x00000001}, + {0x44474D41, 0x01000000, 0x00000001}, + {0x44474D43, 0x04000000, 0x00000001}, + {0x44475049, 0x08000000, 0x00000006}, + {0x44475759, 0x01000000, 0x00000001}, + {0x44483842, 0x04000000, 0x00000002}, + {0x44485142, 0x00800000, 0x00000002}, + {0x44485442, 0x01000000, 0x00000002}, + {0x44493643, 0x00800000, 0x00000001}, + {0x44494243, 0x02000000, 0x00000001}, + {0x44494442, 0x04000000, 0x00000001}, + {0x44494C43, 0x04000000, 0x00000001}, + {0x44495443, 0x00000000, 0x00000002}, + {0x44495742, 0x01000000, 0x00000002}, + {0x444A3343, 0x10000000, 0x00000003}, + {0x444A3443, 0x00800000, 0x00000001}, + {0x444A4542, 0x04000000, 0x00000001}, + {0x444A4742, 0x02000000, 0x00000002}, + {0x444A4F42, 0x04000000, 0x00000002}, + {0x444A5543, 0x00000000, 0x00000002}, + {0x444A5641, 0x04000000, 0x00000002}, + {0x444B3842, 0x02000000, 0x00000002}, + {0x444B4159, 0x08000000, 0x00000002}, + {0x444B4356, 0x08000000, 0x00000002}, + {0x444B4C42, 0x04000000, 0x00000001}, + {0x444B5049, 0x08000000, 0x00000006}, + {0x444C3643, 0x01000000, 0x00000001}, + {0x444C4254, 0x00800000, 0x00000001}, + {0x444C4842, 0x04000000, 0x00000002}, + {0x444C5059, 0x00800000, 0x00000001}, + {0x444C5941, 0x01000000, 0x00000002}, + {0x444D3442, 0x02000000, 0x00000001}, + {0x444D4359, 0x02000000, 0x00000001}, + {0x444D4C54, 0x08000000, 0x00000001}, + {0x444D5642, 0x02000000, 0x00000001}, + {0x444E4242, 0x00800000, 0x00000002}, + {0x444E4259, 0x04000000, 0x00000007}, + {0x444E4641, 0x02000000, 0x00000002}, + {0x444E4C54, 0x00800000, 0x00000002}, + {0x444E4D42, 0x01000000, 0x00000001}, + {0x444F4142, 0x04000000, 0x00000001}, + {0x444F4359, 0x04000000, 0x00000001}, + {0x444F4543, 0x02000000, 0x00000002}, + {0x444F4642, 0x00800000, 0x00000001}, + {0x444F4656, 0x02000000, 0x00000002}, + {0x444F5056, 0x02000000, 0x00000002}, + {0x444F5143, 0x02000000, 0x00000001}, + {0x44504C43, 0x04000000, 0x00000003}, + {0x44505041, 0x01000000, 0x00000002}, + {0x44505342, 0x01000000, 0x00000002}, + {0x44505542, 0x01000000, 0x00000001}, + {0x44505A55, 0x08000000, 0x00000003}, + {0x44513343, 0x04000000, 0x00000002}, + {0x44513443, 0x04000000, 0x00000002}, + {0x44513743, 0x02000000, 0x00000002}, + {0x44514543, 0x04000000, 0x00000002}, + {0x44514A59, 0x01000000, 0x00000001}, + {0x44514C54, 0x00800000, 0x00000002}, + {0x44515142, 0x01000000, 0x00000002}, + {0x44515543, 0x04000000, 0x00000002}, + {0x44515642, 0x02000000, 0x00000002}, + {0x44524642, 0x08000000, 0x00000002}, + {0x44524842, 0x02000000, 0x00000001}, + {0x44525359, 0x00000000, 0x00000005}, + {0x44525642, 0x04000000, 0x00000001}, + {0x44533341, 0x02000000, 0x00000001}, + {0x44534F41, 0x08000000, 0x00000005}, + {0x44535143, 0x02000000, 0x00000001}, + {0x44535342, 0x01000000, 0x00000002}, + {0x44535541, 0x04000000, 0x00000001}, + {0x44535642, 0x02000000, 0x00000002}, + {0x44544442, 0x00800000, 0x00000001}, + {0x44544C59, 0x08000000, 0x00000002}, + {0x44545659, 0x02000000, 0x00000001}, + {0x44545759, 0x01000000, 0x00000001}, + {0x44553243, 0x04000000, 0x00000002}, + {0x44553642, 0x00800000, 0x00000001}, + {0x44554254, 0x02000000, 0x00000001}, + {0x44554259, 0x08000000, 0x00000003}, + {0x44554959, 0x04000000, 0x00000001}, + {0x44554D59, 0x04000000, 0x00000002}, + {0x44555043, 0x08000000, 0x00000006}, + {0x44563442, 0x02000000, 0x00000001}, + {0x44564159, 0x04000000, 0x00000002}, + {0x44564643, 0x02000000, 0x00000002}, + {0x44564859, 0x04000000, 0x00000001}, + {0x44564A59, 0x01000000, 0x00000002}, + {0x44564B43, 0x01000000, 0x00000002}, + {0x44564C42, 0x01000000, 0x00000001}, + {0x44564E43, 0x10000000, 0x00000005}, + {0x44565042, 0x00800000, 0x00000002}, + {0x44565841, 0x04000000, 0x00000003}, + {0x44573742, 0x01000000, 0x00000002}, + {0x44574242, 0x01000000, 0x00000002}, + {0x44574642, 0x00800000, 0x00000001}, + {0x44574943, 0x08000000, 0x00000002}, + {0x44574C41, 0x02000000, 0x00000001}, + {0x44574C42, 0x02000000, 0x00000001}, + {0x44575343, 0x04000000, 0x00000001}, + {0x44584D59, 0x00800000, 0x00000001}, + {0x44593443, 0x00000000, 0x00000001}, + {0x44593642, 0x02000000, 0x00000002}, + {0x44594159, 0x02000000, 0x00000001}, + {0x44594442, 0x04000000, 0x00000002}, + {0x44594641, 0x04000000, 0x00000001}, + {0x44594842, 0x01000000, 0x00000001}, + {0x44594A42, 0x04000000, 0x00000001}, + {0x44594A43, 0x04000000, 0x00000001}, + {0x44594A59, 0x00800000, 0x00000001}, + {0x44594C41, 0x04000000, 0x00000001}, + {0x44594D42, 0x01000000, 0x00000002}, + {0x44595143, 0x01000000, 0x00000001}, + {0x445A3643, 0x01000000, 0x00000001}, + {0x445A3659, 0x08000000, 0x00000000}, + {0x445A4341, 0x01000000, 0x00000001}, + {0x445A4641, 0x04000000, 0x00000001}, + {0x445A5054, 0x04000000, 0x00000002}, + {0x445A5142, 0x00000000, 0x00000002}, + {0x445A5359, 0x08000000, 0x00000001}, + {0x445A5442, 0x02000000, 0x00000001}, + {0x445A5443, 0x02000000, 0x00000003}, + {0x445A5942, 0x02000000, 0x00000002}, + {0x45323241, 0x01000000, 0x00000002}, + {0x45323341, 0x04000000, 0x00000008}, + {0x45323343, 0x04000000, 0x00000003}, + {0x45323542, 0x01000000, 0x00000001}, + {0x45323559, 0x08000000, 0x00000008}, + {0x45323643, 0x04000000, 0x00000001}, + {0x45323741, 0x01000000, 0x00000000}, + {0x45323859, 0x00800000, 0x00000000}, + {0x45324142, 0x04000000, 0x00000001}, + {0x45324143, 0x08000000, 0x00000003}, + {0x45324241, 0x02000000, 0x00000002}, + {0x45324242, 0x04000000, 0x00000002}, + {0x45324259, 0x02000000, 0x00000002}, + {0x45324341, 0x04000000, 0x00000001}, + {0x45324343, 0x01000000, 0x00000001}, + {0x45324354, 0x00800000, 0x00000001}, + {0x45324356, 0x02000000, 0x00000001}, + {0x45324359, 0x04000000, 0x00000006}, + {0x45324441, 0x02000000, 0x00000005}, + {0x45324442, 0x01000000, 0x00000002}, + {0x45324456, 0x04000000, 0x00000001}, + {0x45324459, 0x01000000, 0x00000003}, + {0x45324542, 0x00800000, 0x00000003}, + {0x45324643, 0x01000000, 0x00000001}, + {0x45324654, 0x04000000, 0x00000000}, + {0x45324741, 0x04000000, 0x00000001}, + {0x45324759, 0x01000000, 0x00000001}, + {0x45324842, 0x02000000, 0x00000003}, + {0x45324854, 0x01000000, 0x00000001}, + {0x45324859, 0x02000000, 0x00000003}, + {0x45324941, 0x04000000, 0x00000002}, + {0x45324A42, 0x04000000, 0x00000001}, + {0x45324A59, 0x02000000, 0x00000002}, + {0x45324B41, 0x02000000, 0x00000001}, + {0x45324C41, 0x04000000, 0x00000002}, + {0x45324C59, 0x08000000, 0x00000003}, + {0x45324D56, 0x04000000, 0x00000002}, + {0x45324D59, 0x01000000, 0x00000001}, + {0x45325041, 0x02000000, 0x00000001}, + {0x45325042, 0x02000000, 0x00000001}, + {0x45325043, 0x04000000, 0x00000003}, + {0x45325059, 0x04000000, 0x00000005}, + {0x45325141, 0x02000000, 0x00000002}, + {0x45325242, 0x02000000, 0x00000001}, + {0x45325254, 0x02000000, 0x00000002}, + {0x45325341, 0x01000000, 0x00000001}, + {0x45325342, 0x02000000, 0x00000005}, + {0x45325343, 0x00800000, 0x00000001}, + {0x45325359, 0x04000000, 0x00000005}, + {0x45325442, 0x04000000, 0x00000003}, + {0x45325459, 0x00800000, 0x00000001}, + {0x45325642, 0x02000000, 0x00000001}, + {0x45325741, 0x02000000, 0x00000003}, + {0x45325742, 0x01000000, 0x00000002}, + {0x45325759, 0x04000000, 0x00000005}, + {0x45325841, 0x00800000, 0x00000001}, + {0x45325A43, 0x01000000, 0x00000003}, + {0x45333241, 0x01000000, 0x00000008}, + {0x45333259, 0x04000000, 0x00000008}, + {0x45333441, 0x00800000, 0x00000008}, + {0x45333641, 0x02000000, 0x00000008}, + {0x45333759, 0x08000000, 0x00000008}, + {0x45333842, 0x08000000, 0x00000001}, + {0x45333859, 0x00800000, 0x00000000}, + {0x45334159, 0x00800000, 0x00000001}, + {0x45334241, 0x04000000, 0x00000003}, + {0x45334242, 0x08000000, 0x00000001}, + {0x45334259, 0x04000000, 0x00000005}, + {0x45334341, 0x04000000, 0x00000005}, + {0x45334441, 0x02000000, 0x00000005}, + {0x45334442, 0x04000000, 0x00000001}, + {0x45334443, 0x04000000, 0x00000001}, + {0x45334541, 0x04000000, 0x00000001}, + {0x45334641, 0x00800000, 0x00000001}, + {0x45334643, 0x00800000, 0x00000001}, + {0x45334659, 0x02000000, 0x00000002}, + {0x45334741, 0x02000000, 0x00000005}, + {0x45334743, 0x02000000, 0x00000002}, + {0x45334759, 0x02000000, 0x00000003}, + {0x45334841, 0x04000000, 0x00000003}, + {0x45334943, 0x04000000, 0x00000001}, + {0x45334959, 0x04000000, 0x00000002}, + {0x45334A42, 0x04000000, 0x00000005}, + {0x45334A43, 0x00800000, 0x00000001}, + {0x45334A56, 0x02000000, 0x00000001}, + {0x45334B41, 0x02000000, 0x00000002}, + {0x45334C41, 0x02000000, 0x00000001}, + {0x45334C59, 0x04000000, 0x00000002}, + {0x45334D43, 0x08000000, 0x00000003}, + {0x45334D54, 0x02000000, 0x00000001}, + {0x45334F41, 0x02000000, 0x00000001}, + {0x45335043, 0x08000000, 0x00000005}, + {0x45335141, 0x04000000, 0x00000002}, + {0x45335159, 0x04000000, 0x00000002}, + {0x45335341, 0x02000000, 0x00000001}, + {0x45335342, 0x01000000, 0x00000001}, + {0x45335343, 0x04000000, 0x00000003}, + {0x45335356, 0x08000000, 0x00000005}, + {0x45335359, 0x00800000, 0x00000001}, + {0x45335456, 0x04000000, 0x00000002}, + {0x45335459, 0x04000000, 0x00000003}, + {0x45335541, 0x02000000, 0x00000002}, + {0x45335543, 0x02000000, 0x00000001}, + {0x45335741, 0x04000000, 0x00000001}, + {0x45335743, 0x08000000, 0x00000002}, + {0x45335759, 0x01000000, 0x00000001}, + {0x45343243, 0x08000000, 0x00000003}, + {0x45343459, 0x00800000, 0x00000000}, + {0x45343543, 0x02000000, 0x00000003}, + {0x45343559, 0x01000000, 0x00000000}, + {0x45343842, 0x02000000, 0x00000001}, + {0x45344241, 0x04000000, 0x00000005}, + {0x45344259, 0x02000000, 0x00000001}, + {0x45344341, 0x04000000, 0x00000001}, + {0x45344441, 0x02000000, 0x00000005}, + {0x45344643, 0x00800000, 0x00000001}, + {0x45344659, 0x08000000, 0x00000003}, + {0x45344759, 0x10000000, 0x00000003}, + {0x45344842, 0x00800000, 0x00000001}, + {0x45344843, 0x04000000, 0x00000002}, + {0x45344943, 0x04000000, 0x00000002}, + {0x45344A42, 0x00800000, 0x00000001}, + {0x45344A43, 0x01000000, 0x00000001}, + {0x45344A56, 0x02000000, 0x00000001}, + {0x45344C41, 0x00800000, 0x00000001}, + {0x45344D41, 0x00800000, 0x00000000}, + {0x45344D43, 0x01000000, 0x00000003}, + {0x45344D56, 0x02000000, 0x00000002}, + {0x45344E41, 0x04000000, 0x00000001}, + {0x45345059, 0x04000000, 0x00000002}, + {0x45345141, 0x02000000, 0x00000001}, + {0x45345341, 0x02000000, 0x00000003}, + {0x45345342, 0x01000000, 0x00000001}, + {0x45345456, 0x04000000, 0x00000003}, + {0x45345459, 0x02000000, 0x00000001}, + {0x45345642, 0x01000000, 0x00000001}, + {0x45345643, 0x04000000, 0x00000001}, + {0x45345659, 0x08000000, 0x00000003}, + {0x45345741, 0x02000000, 0x00000002}, + {0x45345742, 0x02000000, 0x00000002}, + {0x45345759, 0x04000000, 0x00000003}, + {0x45345A43, 0x04000000, 0x00000001}, + {0x45353541, 0x01000000, 0x00000008}, + {0x45353542, 0x00800000, 0x00000001}, + {0x45353841, 0x02000000, 0x00000008}, + {0x45353941, 0x04000000, 0x00000008}, + {0x45354143, 0x08000000, 0x00000003}, + {0x45354259, 0x02000000, 0x00000002}, + {0x45354359, 0x00800000, 0x00000008}, + {0x45354441, 0x02000000, 0x00000005}, + {0x45354443, 0x02000000, 0x00000001}, + {0x45354643, 0x00800000, 0x00000002}, + {0x45354741, 0x01000000, 0x00000001}, + {0x45354743, 0x04000000, 0x00000001}, + {0x45354841, 0x02000000, 0x00000002}, + {0x45354943, 0x01000000, 0x00000001}, + {0x45354959, 0x04000000, 0x00000002}, + {0x45354B41, 0x02000000, 0x00000001}, + {0x45354B43, 0x04000000, 0x00000005}, + {0x45354C41, 0x04000000, 0x00000001}, + {0x45354D43, 0x04000000, 0x00000001}, + {0x45354E59, 0x04000000, 0x00000002}, + {0x45354F42, 0x10000000, 0x00000005}, + {0x45355043, 0x02000000, 0x00000001}, + {0x45355059, 0x01000000, 0x00000001}, + {0x45355141, 0x00800000, 0x00000001}, + {0x45355241, 0x02000000, 0x00000001}, + {0x45355243, 0x08000000, 0x00000001}, + {0x45355259, 0x02000000, 0x00000002}, + {0x45355341, 0x01000000, 0x00000001}, + {0x45355342, 0x01000000, 0x00000001}, + {0x45355343, 0x04000000, 0x00000001}, + {0x45355356, 0x02000000, 0x00000002}, + {0x45355359, 0x04000000, 0x00000001}, + {0x45355541, 0x00800000, 0x00000001}, + {0x45355643, 0x02000000, 0x00000001}, + {0x45355659, 0x08000000, 0x00000003}, + {0x45355843, 0x01000000, 0x00000001}, + {0x45355941, 0x08000000, 0x00000003}, + {0x45363241, 0x02000000, 0x00000008}, + {0x45363341, 0x02000000, 0x00000008}, + {0x45363359, 0x01000000, 0x00000008}, + {0x45363442, 0x01000000, 0x00000001}, + {0x45363543, 0x02000000, 0x00000002}, + {0x45363559, 0x04000000, 0x00000008}, + {0x45363642, 0x01000000, 0x00000001}, + {0x45363741, 0x04000000, 0x00000008}, + {0x45363742, 0x02000000, 0x00000001}, + {0x45363842, 0x00800000, 0x00000001}, + {0x45364241, 0x02000000, 0x00000001}, + {0x45364243, 0x02000000, 0x00000002}, + {0x45364254, 0x02000000, 0x00000001}, + {0x45364341, 0x01000000, 0x00000002}, + {0x45364356, 0x02000000, 0x00000002}, + {0x45364542, 0x02000000, 0x00000002}, + {0x45364641, 0x02000000, 0x00000002}, + {0x45364643, 0x04000000, 0x00000002}, + {0x45364742, 0x02000000, 0x00000002}, + {0x45364743, 0x08000000, 0x00000002}, + {0x45364759, 0x04000000, 0x00000002}, + {0x45364841, 0x01000000, 0x00000001}, + {0x45364843, 0x04000000, 0x00000001}, + {0x45364A56, 0x02000000, 0x00000001}, + {0x45364B41, 0x01000000, 0x00000001}, + {0x45364B59, 0x00800000, 0x00000008}, + {0x45364C41, 0x01000000, 0x00000001}, + {0x45364C43, 0x02000000, 0x00000001}, + {0x45364D41, 0x02000000, 0x00000005}, + {0x45364D43, 0x08000000, 0x00000002}, + {0x45364D54, 0x01000000, 0x00000001}, + {0x45364E41, 0x02000000, 0x00000001}, + {0x45364F41, 0x08000000, 0x00000001}, + {0x45365042, 0x01000000, 0x00000001}, + {0x45365241, 0x00800000, 0x00000002}, + {0x45365242, 0x02000000, 0x00000002}, + {0x45365259, 0x02000000, 0x00000002}, + {0x45365342, 0x01000000, 0xFFFFFFFF}, + {0x45365343, 0x04000000, 0x00000002}, + {0x45365359, 0x04000000, 0x00000005}, + {0x45365541, 0x00800000, 0x00000002}, + {0x45365559, 0x02000000, 0x00000002}, + {0x45365642, 0x01000000, 0x00000001}, + {0x45365742, 0x01000000, 0x00000001}, + {0x45365743, 0x04000000, 0x00000002}, + {0x45365941, 0x00800000, 0x00000005}, + {0x45365A42, 0x04000000, 0x00000002}, + {0x45373243, 0x08000000, 0x00000003}, + {0x45373359, 0x01000000, 0x00000001}, + {0x45373442, 0x01000000, 0x00000001}, + {0x45373541, 0x01000000, 0x00000008}, + {0x45373542, 0x00800000, 0xFFFFFFFF}, + {0x45373643, 0x00800000, 0x00000001}, + {0x45374143, 0x02000000, 0x00000002}, + {0x45374159, 0x02000000, 0x00000002}, + {0x45374241, 0x00800000, 0x00000001}, + {0x45374242, 0x02000000, 0x00000002}, + {0x45374243, 0x02000000, 0x00000002}, + {0x45374259, 0x04000000, 0x00000002}, + {0x45374341, 0x00800000, 0x00000002}, + {0x45374342, 0x01000000, 0x00000001}, + {0x45374441, 0x04000000, 0x00000005}, + {0x45374442, 0x00800000, 0x00000001}, + {0x45374542, 0x04000000, 0x00000002}, + {0x45374641, 0x02000000, 0x00000002}, + {0x45374659, 0x01000000, 0x00000002}, + {0x45374741, 0x02000000, 0x00000002}, + {0x45374742, 0x04000000, 0x00000001}, + {0x45374842, 0x00800000, 0x00000001}, + {0x45374943, 0x04000000, 0x00000002}, + {0x45374A42, 0x00800000, 0x00000001}, + {0x45374A43, 0x04000000, 0x00000001}, + {0x45374C41, 0x02000000, 0x00000001}, + {0x45374C43, 0x01000000, 0x00000002}, + {0x45374D41, 0x02000000, 0x00000002}, + {0x45374D43, 0x02000000, 0x00000008}, + {0x45374D59, 0x04000000, 0x00000002}, + {0x45374E41, 0x02000000, 0x00000002}, + {0x45375043, 0x04000000, 0x00000002}, + {0x45375141, 0x00800000, 0x00000002}, + {0x45375143, 0x04000000, 0x00000001}, + {0x45375242, 0x02000000, 0x00000002}, + {0x45375341, 0x08000000, 0x00000003}, + {0x45375359, 0x02000000, 0x00000001}, + {0x45375459, 0x04000000, 0x00000002}, + {0x45375541, 0x02000000, 0x00000002}, + {0x45375643, 0x00800000, 0x00000001}, + {0x45375742, 0x02000000, 0x00000002}, + {0x45375759, 0x04000000, 0x00000001}, + {0x45375842, 0x01000000, 0x00000001}, + {0x45375941, 0x08000000, 0x00000005}, + {0x45375943, 0x04000000, 0x00000002}, + {0x45375A42, 0x00800000, 0x00000001}, + {0x45383259, 0x02000000, 0x00000008}, + {0x45383342, 0x00800000, 0x00000001}, + {0x45383343, 0x04000000, 0x00000005}, + {0x45383541, 0x02000000, 0x00000008}, + {0x45383542, 0x00800000, 0x00000001}, + {0x45383559, 0x00800000, 0x00000000}, + {0x45384142, 0x00800000, 0x00000001}, + {0x45384159, 0x01000000, 0x00000002}, + {0x45384241, 0x02000000, 0x00000001}, + {0x45384242, 0x04000000, 0x00000002}, + {0x45384243, 0x02000000, 0x00000001}, + {0x45384342, 0x00800000, 0x00000001}, + {0x45384359, 0x01000000, 0x00000002}, + {0x45384443, 0x02000000, 0x00000002}, + {0x45384643, 0x04000000, 0x00000002}, + {0x45384659, 0x02000000, 0x00000003}, + {0x45384741, 0x04000000, 0x00000003}, + {0x45384759, 0x08000000, 0x00000005}, + {0x45384841, 0x02000000, 0x00000001}, + {0x45384842, 0x01000000, 0x00000001}, + {0x45384941, 0x02000000, 0x00000002}, + {0x45384959, 0x04000000, 0x00000001}, + {0x45384C41, 0x04000000, 0x00000001}, + {0x45384C43, 0x04000000, 0x00000002}, + {0x45384C59, 0x01000000, 0x00000001}, + {0x45384D41, 0x01000000, 0x00000001}, + {0x45384D42, 0x04000000, 0x00000001}, + {0x45384D43, 0x02000000, 0x00000002}, + {0x45384E41, 0x00800000, 0x00000001}, + {0x45384E42, 0x01000000, 0x00000001}, + {0x45384F41, 0x04000000, 0x00000003}, + {0x45384F59, 0x08000000, 0x00000003}, + {0x45385043, 0x02000000, 0x00000002}, + {0x45385059, 0x01000000, 0x00000001}, + {0x45385141, 0x00800000, 0x00000002}, + {0x45385142, 0x04000000, 0x00000002}, + {0x45385143, 0x01000000, 0x00000001}, + {0x45385243, 0x04000000, 0x00000002}, + {0x45385259, 0x02000000, 0x00000002}, + {0x45385342, 0x04000000, 0x00000002}, + {0x45385359, 0x04000000, 0x00000001}, + {0x45385442, 0x08000000, 0x00000001}, + {0x45385459, 0x02000000, 0x00000002}, + {0x45385542, 0x04000000, 0x00000001}, + {0x45385641, 0x01000000, 0x00000001}, + {0x45385643, 0x04000000, 0x00000002}, + {0x45385741, 0x04000000, 0x00000001}, + {0x45385743, 0x02000000, 0x00000002}, + {0x45385759, 0x08000000, 0x00000005}, + {0x45385841, 0x00800000, 0x00000001}, + {0x45385859, 0x08000000, 0x00000001}, + {0x45385941, 0x01000000, 0x00000001}, + {0x45385942, 0x00800000, 0x00000001}, + {0x45385943, 0x10000000, 0x00000003}, + {0x45385A42, 0x00800000, 0x00000001}, + {0x45393241, 0x00800000, 0x00000008}, + {0x45393341, 0x01000000, 0x00000008}, + {0x45393343, 0x02000000, 0x00000002}, + {0x45393443, 0x04000000, 0x00000005}, + {0x45393459, 0x04000000, 0x00000008}, + {0x45393541, 0x04000000, 0x00000008}, + {0x45393643, 0x04000000, 0x00000002}, + {0x45394241, 0x01000000, 0x00000001}, + {0x45394242, 0x02000000, 0x00000001}, + {0x45394243, 0x08000000, 0x00000005}, + {0x45394259, 0x02000000, 0x00000003}, + {0x45394341, 0x04000000, 0x00000001}, + {0x45394441, 0x02000000, 0x00000003}, + {0x45394542, 0x04000000, 0x00000002}, + {0x45394543, 0x01000000, 0x00000003}, + {0x45394641, 0x00800000, 0x00000001}, + {0x45394643, 0x02000000, 0x00000003}, + {0x45394659, 0x02000000, 0x00000001}, + {0x45394841, 0x04000000, 0x00000005}, + {0x45394856, 0x04000000, 0x00000002}, + {0x45394943, 0x01000000, 0x00000002}, + {0x45394A59, 0x00800000, 0x00000005}, + {0x45394B42, 0x10000000, 0x00000003}, + {0x45394C41, 0x02000000, 0x00000002}, + {0x45394C42, 0x08000000, 0x00000001}, + {0x45394D41, 0x01000000, 0x00000002}, + {0x45394D43, 0x01000000, 0x00000001}, + {0x45394D59, 0x01000000, 0x00000001}, + {0x45394E41, 0x01000000, 0x00000001}, + {0x45395042, 0x04000000, 0x00000002}, + {0x45395056, 0x04000000, 0x00000001}, + {0x45395059, 0x04000000, 0x00000003}, + {0x45395141, 0x04000000, 0x00000001}, + {0x45395259, 0x04000000, 0x00000002}, + {0x45395341, 0x02000000, 0x00000001}, + {0x45395343, 0x02000000, 0x00000001}, + {0x45395459, 0x04000000, 0x00000003}, + {0x45395643, 0x01000000, 0x00000001}, + {0x45395742, 0x08000000, 0x00000002}, + {0x45395743, 0x08000000, 0x00000001}, + {0x45395941, 0x08000000, 0x00000003}, + {0x45395943, 0x04000000, 0x00000002}, + {0x45395A43, 0x04000000, 0x00000002}, + {0x45413541, 0x04000000, 0x00000001}, + {0x45413543, 0x02000000, 0x00000002}, + {0x45413641, 0x02000000, 0x00000005}, + {0x45413642, 0x04000000, 0x00000001}, + {0x45413741, 0x01000000, 0x00000001}, + {0x45413956, 0x02000000, 0x00000000}, + {0x45414143, 0x04000000, 0x00000002}, + {0x45414156, 0x02000000, 0x00000007}, + {0x45414159, 0x04000000, 0x00000002}, + {0x45414241, 0x02000000, 0x00000001}, + {0x45414242, 0x02000000, 0x00000002}, + {0x45414243, 0x02000000, 0x00000001}, + {0x45414254, 0x01000000, 0x00000001}, + {0x45414256, 0x02000000, 0x00000001}, + {0x45414341, 0x00800000, 0x00000001}, + {0x45414356, 0x04000000, 0x00000001}, + {0x45414441, 0x04000000, 0x00000006}, + {0x45414442, 0x04000000, 0x00000001}, + {0x45414443, 0x04000000, 0x00000002}, + {0x45414541, 0x08000000, 0x00000001}, + {0x45414559, 0x02000000, 0x00000003}, + {0x45414641, 0x04000000, 0x00000003}, + {0x45414642, 0x02000000, 0x00000003}, + {0x45414643, 0x08000000, 0x00000002}, + {0x45414941, 0x04000000, 0x00000001}, + {0x45414959, 0x02000000, 0x00000001}, + {0x45414A42, 0x01000000, 0x00000002}, + {0x45414A43, 0x04000000, 0x00000003}, + {0x45414A59, 0x04000000, 0x00000002}, + {0x45414B41, 0x08000000, 0x00000005}, + {0x45414C42, 0x04000000, 0x00000002}, + {0x45414C56, 0x04000000, 0x00000002}, + {0x45414E42, 0x02000000, 0x00000001}, + {0x45414E43, 0x04000000, 0x00000001}, + {0x45415041, 0x04000000, 0x00000006}, + {0x45415042, 0x02000000, 0x00000002}, + {0x45415043, 0x02000000, 0x00000001}, + {0x45415054, 0x02000000, 0x00000001}, + {0x45415141, 0x02000000, 0x00000001}, + {0x45415143, 0x01000000, 0x00000002}, + {0x45415241, 0x02000000, 0x00000001}, + {0x45415243, 0x00800000, 0x00000001}, + {0x45415259, 0x01000000, 0x00000001}, + {0x45415343, 0x01000000, 0x00000001}, + {0x45415359, 0x01000000, 0x00000002}, + {0x45415441, 0x01000000, 0x00000001}, + {0x45415443, 0x04000000, 0x00000001}, + {0x45415543, 0x04000000, 0x00000001}, + {0x45415641, 0x04000000, 0x00000002}, + {0x45415643, 0x01000000, 0x00000001}, + {0x45415741, 0x04000000, 0x00000002}, + {0x45415743, 0x00800000, 0x00000001}, + {0x45415941, 0x00800000, 0x00000002}, + {0x45415942, 0x02000000, 0x00000001}, + {0x45415A42, 0x08000000, 0x00000001}, + {0x45415A43, 0x02000000, 0x00000002}, + {0x45423243, 0x02000000, 0x00000001}, + {0x45423342, 0x04000000, 0x00000001}, + {0x45423343, 0x00800000, 0x00000001}, + {0x45423442, 0x04000000, 0x00000002}, + {0x45423443, 0x02000000, 0x00000003}, + {0x45423542, 0x04000000, 0x00000002}, + {0x45423543, 0x01000000, 0x00000002}, + {0x45423641, 0x02000000, 0x00000005}, + {0x45423642, 0x04000000, 0x00000001}, + {0x45423741, 0x01000000, 0x00000001}, + {0x45423743, 0x02000000, 0x00000002}, + {0x45424143, 0x01000000, 0x00000001}, + {0x45424159, 0x00800000, 0x00000001}, + {0x45424243, 0x01000000, 0x00000002}, + {0x45424341, 0x04000000, 0x00000003}, + {0x45424354, 0x08000000, 0x00000001}, + {0x45424442, 0x04000000, 0x00000002}, + {0x45424443, 0x04000000, 0x00000001}, + {0x45424541, 0x00800000, 0x00000008}, + {0x45424641, 0x00800000, 0x00000001}, + {0x45424642, 0x01000000, 0x00000002}, + {0x45424654, 0x01000000, 0x00000001}, + {0x45424656, 0x02000000, 0x00000001}, + {0x45424743, 0x02000000, 0x00000001}, + {0x45424841, 0x02000000, 0x00000002}, + {0x45424842, 0x00800000, 0x00000001}, + {0x45424942, 0x01000000, 0x00000003}, + {0x45424959, 0x02000000, 0x00000001}, + {0x45424A41, 0x04000000, 0x00000005}, + {0x45424A42, 0x04000000, 0x00000001}, + {0x45424A43, 0x01000000, 0x00000001}, + {0x45424A59, 0x04000000, 0x00000001}, + {0x45424B41, 0x02000000, 0x00000003}, + {0x45424B43, 0x02000000, 0x00000002}, + {0x45424B59, 0x04000000, 0x00000003}, + {0x45424C42, 0x04000000, 0x00000002}, + {0x45424C43, 0x08000000, 0x00000003}, + {0x45424C59, 0x04000000, 0x00000002}, + {0x45424E43, 0x04000000, 0x00000003}, + {0x45425141, 0x00800000, 0x00000001}, + {0x45425143, 0x01000000, 0x00000002}, + {0x45425159, 0x00800000, 0x00000001}, + {0x45425241, 0x02000000, 0x00000001}, + {0x45425243, 0x02000000, 0x00000005}, + {0x45425259, 0x08000000, 0x00000003}, + {0x45425341, 0x04000000, 0x00000002}, + {0x45425442, 0x04000000, 0x00000002}, + {0x45425443, 0x08000000, 0x00000005}, + {0x45425543, 0x04000000, 0x00000003}, + {0x45425559, 0x04000000, 0x00000002}, + {0x45425641, 0x01000000, 0x00000001}, + {0x45425741, 0x00800000, 0x00000001}, + {0x45425742, 0x04000000, 0x00000002}, + {0x45425759, 0x02000000, 0x00000002}, + {0x45425942, 0x01000000, 0x00000001}, + {0x45425943, 0x04000000, 0x00000001}, + {0x45425959, 0x04000000, 0x00000005}, + {0x45433342, 0x04000000, 0x00000002}, + {0x45433441, 0x02000000, 0x00000003}, + {0x45433459, 0x04000000, 0x00000008}, + {0x45433542, 0x00800000, 0x00000001}, + {0x45433641, 0x02000000, 0x00000005}, + {0x45433642, 0x08000000, 0x00000002}, + {0x45433643, 0x10000000, 0x00000005}, + {0x45433741, 0x02000000, 0x00000001}, + {0x45433841, 0x02000000, 0x00000002}, + {0x45433859, 0x00800000, 0x00000008}, + {0x45434156, 0x04000000, 0x00000002}, + {0x45434241, 0x04000000, 0x00000005}, + {0x45434259, 0x02000000, 0x00000002}, + {0x45434341, 0x02000000, 0x00000001}, + {0x45434343, 0x01000000, 0x00000001}, + {0x45434354, 0x00800000, 0x00000001}, + {0x45434441, 0x01000000, 0x00000001}, + {0x45434442, 0x02000000, 0x00000001}, + {0x45434443, 0x04000000, 0x00000003}, + {0x45434459, 0x08000000, 0x00000003}, + {0x45434541, 0x00800000, 0x00000001}, + {0x45434559, 0x02000000, 0x00000001}, + {0x45434642, 0x02000000, 0x00000001}, + {0x45434659, 0x08000000, 0x00000002}, + {0x45434741, 0x04000000, 0x00000003}, + {0x45434759, 0x02000000, 0x00000002}, + {0x45434843, 0x01000000, 0x00000001}, + {0x45434941, 0x01000000, 0x00000001}, + {0x45434943, 0x04000000, 0x00000003}, + {0x45434956, 0x04000000, 0x00000002}, + {0x45434959, 0x04000000, 0x00000002}, + {0x45434A42, 0x03E8823C, 0x00000002}, + {0x45434A43, 0x04000000, 0x00000002}, + {0x45434A56, 0x04000000, 0x00000001}, + {0x45434A59, 0x04000000, 0x00000002}, + {0x45434B42, 0x10000000, 0x00000006}, + {0x45434B43, 0x01000000, 0x00000001}, + {0x45434C42, 0x04000000, 0x00000002}, + {0x45434C56, 0x04000000, 0x00000002}, + {0x45434D41, 0x02000000, 0x00000005}, + {0x45434D56, 0x02000000, 0x00000001}, + {0x45434F43, 0x01000000, 0x00000001}, + {0x45435041, 0x01000000, 0x00000001}, + {0x45435043, 0x00800000, 0x00000002}, + {0x45435159, 0x01000000, 0x00000001}, + {0x45435241, 0x02000000, 0x00000002}, + {0x45435243, 0x02000000, 0x00000001}, + {0x45435341, 0x04000000, 0x00000002}, + {0x45435343, 0x04000000, 0x00000001}, + {0x45435359, 0x01000000, 0x00000001}, + {0x45435441, 0x04000000, 0x00000005}, + {0x45435442, 0x01000000, 0x00000001}, + {0x45435641, 0x04000000, 0x00000005}, + {0x45435741, 0x04000000, 0x00000002}, + {0x45435759, 0x02000000, 0x00000002}, + {0x45435842, 0x01000000, 0x00000001}, + {0x45435943, 0x02000000, 0x00000002}, + {0x45435959, 0x02000000, 0x00000001}, + {0x45443241, 0x02000000, 0x00000002}, + {0x45443343, 0x01000000, 0x00000001}, + {0x45443442, 0x00800000, 0x00000001}, + {0x45443643, 0x02000000, 0x00000001}, + {0x45443659, 0x00800000, 0x00000008}, + {0x45443741, 0x02000000, 0x00000001}, + {0x45443759, 0x08000000, 0x00000008}, + {0x45444154, 0x08000000, 0x00000005}, + {0x45444241, 0x01000000, 0x00000001}, + {0x45444243, 0x04000000, 0x00000002}, + {0x45444343, 0x00800000, 0x00000003}, + {0x45444354, 0x02000000, 0x00000001}, + {0x45444356, 0x04000000, 0x00000002}, + {0x45444441, 0x01000000, 0x00000001}, + {0x45444459, 0x01000000, 0x00000001}, + {0x45444559, 0x00800000, 0x00000001}, + {0x45444641, 0x04000000, 0x00000002}, + {0x45444642, 0x00800000, 0x00000001}, + {0x45444643, 0x08000000, 0x00000002}, + {0x45444743, 0x00800000, 0x00000001}, + {0x45444759, 0x00800000, 0x00000003}, + {0x45444841, 0x04000000, 0x00000002}, + {0x45444842, 0x04000000, 0x00000001}, + {0x45444859, 0x04000000, 0x00000001}, + {0x45444943, 0x02000000, 0x00000003}, + {0x45444956, 0x02000000, 0x00000002}, + {0x45444959, 0x02000000, 0x00000005}, + {0x45444A42, 0x01000000, 0x00000002}, + {0x45444A59, 0x02000000, 0x00000002}, + {0x45444B41, 0x01000000, 0x00000002}, + {0x45444C41, 0x04000000, 0x00000003}, + {0x45444C42, 0x04000000, 0x00000002}, + {0x45444C59, 0x04000000, 0x00000005}, + {0x45444D41, 0x01000000, 0x00000005}, + {0x45444D42, 0x04000000, 0x00000001}, + {0x45444D43, 0x02000000, 0x00000005}, + {0x45444D44, 0x20000000, 0x00000000}, + {0x45444E41, 0x01000000, 0x00000005}, + {0x45444E42, 0x02000000, 0x00000001}, + {0x45444E43, 0x04000000, 0x00000002}, + {0x45444E59, 0x02000000, 0x00000001}, + {0x45445041, 0x01000000, 0x00000002}, + {0x45445042, 0x04000000, 0xFFFFFFFF}, + {0x45445043, 0x02000000, 0x00000001}, + {0x45445054, 0x08000000, 0x00000001}, + {0x45445241, 0x02000000, 0x00000001}, + {0x45445243, 0x01000000, 0x00000001}, + {0x45445341, 0x01000000, 0x00000001}, + {0x45445342, 0x04000000, 0x00000002}, + {0x45445343, 0x01000000, 0x00000001}, + {0x45445441, 0x01000000, 0x00000002}, + {0x45445442, 0x01000000, 0x00000001}, + {0x45445443, 0x04000000, 0x00000002}, + {0x45445542, 0x01000000, 0x00000001}, + {0x45445641, 0x01000000, 0x00000002}, + {0x45445642, 0x00800000, 0x00000001}, + {0x45445741, 0x02000000, 0x00000005}, + {0x45445742, 0x04000000, 0x00000001}, + {0x45445759, 0x01000000, 0x00000002}, + {0x45445842, 0x01000000, 0x00000001}, + {0x45445A41, 0x00800000, 0x00000008}, + {0x45445A42, 0x08000000, 0x00000001}, + {0x45453242, 0x00800000, 0x00000001}, + {0x45453341, 0x00800000, 0x00000002}, + {0x45453442, 0x01000000, 0x00000001}, + {0x45453559, 0x04000000, 0x00000000}, + {0x45453642, 0x02000000, 0x00000001}, + {0x45453741, 0x01000000, 0x00000001}, + {0x45453742, 0x02000000, 0x00000001}, + {0x45454241, 0x00800000, 0x00000001}, + {0x45454254, 0x02000000, 0x00000001}, + {0x45454343, 0x01000000, 0x00000005}, + {0x45454359, 0x02000000, 0x00000002}, + {0x45454442, 0x04000000, 0x00000002}, + {0x45454456, 0x10000000, 0x00000006}, + {0x45454641, 0x04000000, 0x00000003}, + {0x45454659, 0x04000000, 0x00000005}, + {0x45454741, 0x01000000, 0x00000001}, + {0x45454742, 0x04000000, 0x00000001}, + {0x45454743, 0x02000000, 0x00000002}, + {0x45454841, 0x08000000, 0x00000005}, + {0x45454943, 0x04000000, 0x00000002}, + {0x45454A59, 0x01000000, 0x00000001}, + {0x45454B42, 0x04000000, 0x00000002}, + {0x45454C59, 0x02000000, 0x00000001}, + {0x45454D44, 0x20000000, 0x00000000}, + {0x45454D56, 0x02000000, 0x00000001}, + {0x45454F59, 0x01000000, 0x00000005}, + {0x45455056, 0x04000000, 0x00000001}, + {0x45455141, 0x00800000, 0x00000002}, + {0x45455143, 0x04000000, 0x00000002}, + {0x45455241, 0x04000000, 0x00000001}, + {0x45455243, 0x04000000, 0x00000001}, + {0x45455341, 0x04000000, 0x00000002}, + {0x45455456, 0x04000000, 0x00000002}, + {0x45455459, 0x02000000, 0x00000003}, + {0x45455641, 0x01000000, 0x00000001}, + {0x45455642, 0x00800000, 0x00000002}, + {0x45455741, 0x04000000, 0x00000005}, + {0x45455742, 0x04000000, 0x00000001}, + {0x45455743, 0x01000000, 0x00000002}, + {0x45455842, 0x04000000, 0x00000001}, + {0x45455943, 0x08000000, 0x00000002}, + {0x45455A41, 0x04000000, 0x00000006}, + {0x45455A42, 0x00800000, 0x00000001}, + {0x45463242, 0x00800000, 0x00000001}, + {0x45463541, 0x04000000, 0x00000002}, + {0x45463641, 0x08000000, 0x00000003}, + {0x45463642, 0x08000000, 0x00000001}, + {0x45463659, 0x02000000, 0x00000000}, + {0x45463742, 0x01000000, 0xFFFFFFFF}, + {0x45463743, 0x01000000, 0x00000003}, + {0x45463859, 0x08000000, 0x00000008}, + {0x45464159, 0x02000000, 0x00000002}, + {0x45464243, 0x08000000, 0x00000003}, + {0x45464341, 0x04000000, 0x00000002}, + {0x45464343, 0x00800000, 0x00000001}, + {0x45464441, 0x01000000, 0x00000001}, + {0x45464443, 0x04000000, 0x00000002}, + {0x45464541, 0x00800000, 0x00000001}, + {0x45464542, 0x00800000, 0x00000001}, + {0x45464543, 0x01000000, 0x00000001}, + {0x45464641, 0x08000000, 0x00000003}, + {0x45464741, 0x04000000, 0x00000002}, + {0x45464743, 0x00800000, 0x00000001}, + {0x45464759, 0x01000000, 0x00000001}, + {0x45464841, 0x02000000, 0x00000001}, + {0x45464843, 0x02000000, 0x00000002}, + {0x45464859, 0x00800000, 0x00000002}, + {0x45464956, 0x02000000, 0x00000002}, + {0x45464959, 0x04000000, 0x00000002}, + {0x45464B43, 0x02000000, 0x00000001}, + {0x45464B59, 0x02000000, 0x00000001}, + {0x45464C42, 0x10000000, 0x00000003}, + {0x45464C43, 0x02000000, 0x00000001}, + {0x45464D41, 0x01000000, 0x00000001}, + {0x45464D44, 0x02000000, 0xFFFFFFFF}, + {0x45464D59, 0x04000000, 0x00000003}, + {0x45464E41, 0x02000000, 0x00000005}, + {0x45465042, 0x04000000, 0x00000002}, + {0x45465043, 0x00800000, 0x00000002}, + {0x45465054, 0x02000000, 0x00000001}, + {0x45465056, 0x04000000, 0x00000002}, + {0x45465241, 0x08000000, 0x00000003}, + {0x45465242, 0x08000000, 0x00000003}, + {0x45465243, 0x02000000, 0x00000002}, + {0x45465259, 0x02000000, 0x00000002}, + {0x45465341, 0x02000000, 0x00000005}, + {0x45465359, 0x04000000, 0x00000001}, + {0x45465443, 0x04000000, 0x00000001}, + {0x45465541, 0x04000000, 0x00000002}, + {0x45465542, 0x01000000, 0x00000002}, + {0x45465742, 0x04000000, 0x00000001}, + {0x45465743, 0x02000000, 0x00000002}, + {0x45465841, 0x08000000, 0x00000003}, + {0x45465842, 0x04000000, 0x00000001}, + {0x45473241, 0x02000000, 0x00000003}, + {0x45473256, 0x02000000, 0x00000006}, + {0x45473459, 0x01000000, 0x00000008}, + {0x45473541, 0x01000000, 0x00000001}, + {0x45473642, 0x00800000, 0x00000001}, + {0x45473741, 0x02000000, 0x00000001}, + {0x45473743, 0x01000000, 0x00000001}, + {0x45473759, 0x08000000, 0x00000000}, + {0x45473859, 0x02000000, 0x00000000}, + {0x45474142, 0x01000000, 0x00000001}, + {0x45474159, 0x01000000, 0x00000001}, + {0x45474243, 0x02000000, 0x00000005}, + {0x45474254, 0x00800000, 0x00000001}, + {0x45474341, 0x00800000, 0x00000002}, + {0x45474342, 0x04000000, 0x00000002}, + {0x45474354, 0x04000000, 0x00000001}, + {0x45474356, 0x04000000, 0x00000002}, + {0x45474359, 0x00800000, 0x00000001}, + {0x45474441, 0x02000000, 0x00000005}, + {0x45474443, 0x04000000, 0x00000006}, + {0x45474541, 0x04000000, 0x00000001}, + {0x45474542, 0x00800000, 0x00000001}, + {0x45474641, 0x04000000, 0x00000001}, + {0x45474642, 0x04000000, 0x00000003}, + {0x45474742, 0x02000000, 0x00000005}, + {0x45474754, 0x00800000, 0x00000001}, + {0x45474842, 0x02000000, 0x00000001}, + {0x45474942, 0x02000000, 0x00000001}, + {0x45474A59, 0x02000000, 0x00000002}, + {0x45474B41, 0x02000000, 0x00000002}, + {0x45474B56, 0x02000000, 0x00000005}, + {0x45474B59, 0x10000000, 0x00000003}, + {0x45474C43, 0x04000000, 0x00000001}, + {0x45474C59, 0x04000000, 0x00000001}, + {0x45474D41, 0x01000000, 0x00000001}, + {0x45474D42, 0x02000000, 0x00000001}, + {0x45474D43, 0x04000000, 0x00000001}, + {0x45474D56, 0x02000000, 0x00000002}, + {0x45474E43, 0x02000000, 0x00000002}, + {0x45474E59, 0x08000000, 0x00000003}, + {0x45474F59, 0x08000000, 0x00000003}, + {0x45475041, 0x01000000, 0x00000001}, + {0x45475049, 0x08000000, 0x00000006}, + {0x45475059, 0x04000000, 0x00000002}, + {0x45475142, 0x04000000, 0x00000001}, + {0x45475241, 0x02000000, 0x00000005}, + {0x45475256, 0x02000000, 0x00000002}, + {0x45475356, 0x02000000, 0x00000001}, + {0x45475541, 0x02000000, 0x00000002}, + {0x45475542, 0x00800000, 0x00000001}, + {0x45475642, 0x01000000, 0x00000002}, + {0x45475842, 0x04000000, 0x00000002}, + {0x45475843, 0x00800000, 0x00000001}, + {0x45475941, 0x04000000, 0x00000002}, + {0x45475A42, 0x02000000, 0x00000001}, + {0x45483241, 0x01000000, 0x00000001}, + {0x45483341, 0x02000000, 0x00000001}, + {0x45483343, 0x00800000, 0x00000001}, + {0x45483442, 0x02000000, 0x00000001}, + {0x45483541, 0x01000000, 0x00000001}, + {0x45483542, 0x01000000, 0x00000001}, + {0x45483559, 0x02000000, 0x00000000}, + {0x45483741, 0x02000000, 0x00000001}, + {0x45483742, 0x04000000, 0x00000002}, + {0x45483842, 0x04000000, 0x00000002}, + {0x45483959, 0x00800000, 0x00000008}, + {0x45484142, 0x04000000, 0x00000001}, + {0x45484159, 0x04000000, 0x00000002}, + {0x45484241, 0x08000000, 0x00000002}, + {0x45484254, 0x01000000, 0x00000001}, + {0x45484342, 0x00800000, 0x00000001}, + {0x45484459, 0x02000000, 0x00000005}, + {0x45484541, 0x04000000, 0x00000002}, + {0x45484542, 0x01000000, 0x00000002}, + {0x45484659, 0x04000000, 0x00000002}, + {0x45484742, 0x10000000, 0x00000001}, + {0x45484743, 0x02000000, 0x00000002}, + {0x45484759, 0x08000000, 0x00000001}, + {0x45484841, 0x04000000, 0x00000001}, + {0x45484942, 0x04000000, 0x00000002}, + {0x45484943, 0x04000000, 0x00000002}, + {0x45484959, 0x02000000, 0x00000002}, + {0x45484B43, 0x02000000, 0x00000002}, + {0x45484B56, 0x02000000, 0x00000002}, + {0x45484B59, 0x08000000, 0x00000005}, + {0x45484C41, 0x02000000, 0x00000001}, + {0x45484C42, 0x08000000, 0x00000001}, + {0x45484C43, 0x01000000, 0x00000002}, + {0x45484C59, 0x04000000, 0x00000002}, + {0x45484D41, 0x04000000, 0x00000005}, + {0x45484D54, 0x00800000, 0x00000001}, + {0x45485041, 0x02000000, 0x00000005}, + {0x45485043, 0x04000000, 0x00000001}, + {0x45485059, 0x00800000, 0x00000002}, + {0x45485341, 0x02000000, 0x00000002}, + {0x45485342, 0x02000000, 0x00000001}, + {0x45485359, 0x02000000, 0x00000001}, + {0x45485441, 0x02000000, 0x00000001}, + {0x45485442, 0x01000000, 0x00000002}, + {0x45485559, 0x01000000, 0x00000002}, + {0x45485641, 0x04000000, 0x00000002}, + {0x45485642, 0x01000000, 0x00000001}, + {0x45485741, 0x01000000, 0x00000001}, + {0x45485843, 0x02000000, 0x00000001}, + {0x45485942, 0x02000000, 0x00000002}, + {0x45485943, 0x04000000, 0x00000002}, + {0x45485A42, 0x00800000, 0x00000001}, + {0x45485A59, 0x04000000, 0x00000001}, + {0x45493241, 0x01000000, 0x00000001}, + {0x45493242, 0x04000000, 0x00000001}, + {0x45493341, 0x08000000, 0x00000002}, + {0x45493441, 0x02000000, 0x00000001}, + {0x45493459, 0x04000000, 0x00000008}, + {0x45493541, 0x01000000, 0x00000001}, + {0x45493642, 0x04000000, 0x00000002}, + {0x45493741, 0x02000000, 0x00000001}, + {0x45493842, 0x04000000, 0x00000001}, + {0x45493859, 0x01000000, 0x00000000}, + {0x45494159, 0x04000000, 0x00000001}, + {0x45494341, 0x02000000, 0x00000002}, + {0x45494342, 0x02000000, 0x00000002}, + {0x45494359, 0x01000000, 0x00000001}, + {0x45494442, 0x04000000, 0x00000001}, + {0x45494459, 0x04000000, 0x00000002}, + {0x45494643, 0x08000000, 0x00000003}, + {0x45494659, 0x04000000, 0x00000001}, + {0x45494742, 0x04000000, 0x00000001}, + {0x45494942, 0x00800000, 0x00000001}, + {0x45494959, 0x00800000, 0x00000001}, + {0x45494B42, 0x08000000, 0x00000007}, + {0x45494C43, 0x04000000, 0x00000001}, + {0x45494C59, 0x04000000, 0x00000002}, + {0x45494D43, 0x00800000, 0x00000001}, + {0x45494E41, 0x08000000, 0x00000005}, + {0x45494E59, 0x08000000, 0x00000002}, + {0x45495056, 0x02000000, 0x00000002}, + {0x45495059, 0x02000000, 0x00000003}, + {0x45495141, 0x02000000, 0x00000005}, + {0x45495241, 0x01000000, 0x00000001}, + {0x45495243, 0x02000000, 0x00000002}, + {0x45495256, 0x02000000, 0x00000001}, + {0x45495259, 0x04000000, 0x00000002}, + {0x45495341, 0x02000000, 0x00000002}, + {0x45495342, 0x04000000, 0x00000001}, + {0x45495343, 0x01000000, 0x00000002}, + {0x45495441, 0x01000000, 0x00000008}, + {0x45495442, 0x01000000, 0x00000001}, + {0x45495456, 0x02000000, 0x00000001}, + {0x45495541, 0x01000000, 0x00000001}, + {0x45495542, 0x01000000, 0x00000001}, + {0x45495543, 0x02000000, 0x00000002}, + {0x45495559, 0x04000000, 0x00000002}, + {0x45495643, 0x04000000, 0x00000002}, + {0x45495659, 0x08000000, 0x00000003}, + {0x45495741, 0x08000000, 0x00000005}, + {0x45495742, 0x01000000, 0x00000002}, + {0x45495743, 0x01000000, 0x00000001}, + {0x45495941, 0x01000000, 0x00000001}, + {0x45495943, 0x02000000, 0x00000002}, + {0x45495A42, 0x00800000, 0x00000001}, + {0x454A3259, 0x02000000, 0x00000008}, + {0x454A3342, 0x08000000, 0x00000002}, + {0x454A3343, 0x10000000, 0x00000003}, + {0x454A3442, 0x00800000, 0x00000001}, + {0x454A3542, 0x00800000, 0x00000001}, + {0x454A3559, 0x08000000, 0x00000000}, + {0x454A3642, 0x00800000, 0x00000001}, + {0x454A3741, 0x02000000, 0x00000001}, + {0x454A4142, 0x01000000, 0x00000001}, + {0x454A4143, 0x01000000, 0x00000001}, + {0x454A4159, 0x01000000, 0x00000002}, + {0x454A4241, 0x04000000, 0x00000005}, + {0x454A4341, 0x04000000, 0x00000001}, + {0x454A4454, 0x00800000, 0x00000001}, + {0x454A4459, 0x01000000, 0x00000001}, + {0x454A4543, 0x01000000, 0x00000001}, + {0x454A4642, 0x01000000, 0x00000002}, + {0x454A4643, 0x02000000, 0x00000002}, + {0x454A4759, 0x02000000, 0x00000001}, + {0x454A4841, 0x01000000, 0x00000002}, + {0x454A4943, 0x00800000, 0x00000001}, + {0x454A4956, 0x04000000, 0x00000003}, + {0x454A4A42, 0x01000000, 0x00000001}, + {0x454A4A43, 0x00800000, 0x00000001}, + {0x454A4C41, 0x01000000, 0x00000001}, + {0x454A4C42, 0x04000000, 0x00000001}, + {0x454A4C43, 0x08000000, 0x00000002}, + {0x454A4C54, 0x08000000, 0x00000002}, + {0x454A4C59, 0x04000000, 0x00000001}, + {0x454A4D42, 0x00800000, 0x00000001}, + {0x454A4D59, 0x04000000, 0x00000001}, + {0x454A4E41, 0x02000000, 0x00000001}, + {0x454A4E43, 0x02000000, 0x00000001}, + {0x454A4E59, 0x02000000, 0x00000001}, + {0x454A4F41, 0x02000000, 0x00000002}, + {0x454A5043, 0x04000000, 0x00000002}, + {0x454A5141, 0x08000000, 0x00000001}, + {0x454A5143, 0x00800000, 0x00000001}, + {0x454A5242, 0x08000000, 0x00000003}, + {0x454A5243, 0x02000000, 0x00000001}, + {0x454A5341, 0x04000000, 0x00000005}, + {0x454A5342, 0x00800000, 0x00000001}, + {0x454A5441, 0x01000000, 0x00000002}, + {0x454A5442, 0x01000000, 0x00000002}, + {0x454A5459, 0x04000000, 0x00000002}, + {0x454A5541, 0x04000000, 0x00000001}, + {0x454A5542, 0x08000000, 0x00000001}, + {0x454A5641, 0x04000000, 0x00000002}, + {0x454A5642, 0x01000000, 0x00000001}, + {0x454A5659, 0x01000000, 0x00000001}, + {0x454A5743, 0x00800000, 0x00000001}, + {0x454A5759, 0x00800000, 0x00000002}, + {0x454A5841, 0x04000000, 0x00000003}, + {0x454A5959, 0x01000000, 0x00000002}, + {0x454A5A42, 0x02000000, 0x00000001}, + {0x454B3243, 0x00800000, 0x00000003}, + {0x454B3342, 0x01000000, 0x00000001}, + {0x454B3641, 0x08000000, 0x00000003}, + {0x454B3741, 0x02000000, 0x00000001}, + {0x454B3842, 0x02000000, 0x00000002}, + {0x454B4143, 0x01000000, 0x00000002}, + {0x454B4241, 0x00800000, 0x00000001}, + {0x454B4242, 0x02000000, 0x00000002}, + {0x454B4243, 0x04000000, 0x00000002}, + {0x454B4343, 0x04000000, 0x00000001}, + {0x454B4356, 0x08000000, 0x00000002}, + {0x454B4541, 0x04000000, 0x00000002}, + {0x454B4559, 0x08000000, 0x00000005}, + {0x454B4841, 0x04000000, 0x00000003}, + {0x454B4843, 0x01000000, 0x00000001}, + {0x454B4959, 0x02000000, 0x00000005}, + {0x454B4A43, 0x08000000, 0x00000003}, + {0x454B4A59, 0x08000000, 0x00000002}, + {0x454B4B41, 0x01000000, 0x00000003}, + {0x454B4C41, 0x08000000, 0x00000003}, + {0x454B4C54, 0x08000000, 0x00000002}, + {0x454B4C59, 0x02000000, 0x00000002}, + {0x454B4D42, 0x04000000, 0x00000001}, + {0x454B4E41, 0x00800000, 0x00000001}, + {0x454B4E59, 0x04000000, 0x00000002}, + {0x454B5049, 0x08000000, 0x00000006}, + {0x454B5142, 0x01000000, 0x00000001}, + {0x454B5159, 0x02000000, 0x00000001}, + {0x454B5243, 0x04000000, 0x00000001}, + {0x454B5341, 0x04000000, 0x00000002}, + {0x454B5342, 0x08000000, 0x00000003}, + {0x454B5356, 0x04000000, 0x00000001}, + {0x454B5441, 0x04000000, 0x00000002}, + {0x454B5559, 0x04000000, 0x00000001}, + {0x454B5641, 0x01000000, 0x00000001}, + {0x454B5741, 0x04000000, 0x00000003}, + {0x454B5759, 0x04000000, 0x00000002}, + {0x454B5943, 0x02000000, 0x00000002}, + {0x454B5959, 0x04000000, 0x00000002}, + {0x454B5A41, 0x00800000, 0x00000002}, + {0x454C3241, 0x01000000, 0x00000003}, + {0x454C3259, 0x04000000, 0x00000005}, + {0x454C3541, 0x08000000, 0x00000002}, + {0x454C3642, 0x08000000, 0x00000002}, + {0x454C3741, 0x02000000, 0x00000001}, + {0x454C3742, 0x00800000, 0x00000001}, + {0x454C3859, 0x08000000, 0x00000000}, + {0x454C4143, 0x04000000, 0x00000001}, + {0x454C4156, 0x04000000, 0x00000002}, + {0x454C4241, 0x08000000, 0x00000002}, + {0x454C4242, 0x02000000, 0x00000001}, + {0x454C4243, 0x00800000, 0x00000002}, + {0x454C4256, 0x02000000, 0x00000002}, + {0x454C4259, 0x00800000, 0x00000001}, + {0x454C4341, 0x04000000, 0x00000003}, + {0x454C4342, 0x01000000, 0x00000002}, + {0x454C4354, 0x02000000, 0x00000001}, + {0x454C4441, 0x04000000, 0x00000003}, + {0x454C4442, 0x01000000, 0x00000001}, + {0x454C4443, 0x02000000, 0x00000005}, + {0x454C4459, 0x01000000, 0x00000008}, + {0x454C4556, 0x02000000, 0x00000003}, + {0x454C4641, 0x00800000, 0x00000001}, + {0x454C4642, 0x04000000, 0x00000002}, + {0x454C4741, 0x02000000, 0x00000001}, + {0x454C4742, 0x01000000, 0x00000001}, + {0x454C4759, 0x04000000, 0x00000002}, + {0x454C4859, 0x08000000, 0x00000003}, + {0x454C4A41, 0x04000000, 0x00000001}, + {0x454C4A42, 0x02000000, 0x00000002}, + {0x454C4A59, 0x01000000, 0x00000002}, + {0x454C4B54, 0x02000000, 0x00000002}, + {0x454C4C42, 0x01000000, 0x00000003}, + {0x454C4C54, 0x04000000, 0x00000001}, + {0x454C4D41, 0x02000000, 0x00000002}, + {0x454C4D42, 0x00800000, 0x00000001}, + {0x454C4D43, 0x04000000, 0x00000002}, + {0x454C4D54, 0x04000000, 0x00000002}, + {0x454C4E41, 0x04000000, 0x00000001}, + {0x454C4E42, 0x01000000, 0x00000001}, + {0x454C4E59, 0x04000000, 0x00000001}, + {0x454C4F43, 0x08000000, 0x00000003}, + {0x454C5041, 0x00800000, 0x00000002}, + {0x454C5043, 0x01000000, 0x00000001}, + {0x454C5059, 0x00800000, 0x00000001}, + {0x454C5141, 0x00800000, 0x00000001}, + {0x454C5142, 0x00800000, 0x00000003}, + {0x454C5159, 0x08000000, 0x00000002}, + {0x454C5242, 0x01000000, 0x00000001}, + {0x454C5243, 0x02000000, 0x00000001}, + {0x454C5259, 0x02000000, 0x00000001}, + {0x454C5341, 0x01000000, 0x00000001}, + {0x454C5342, 0x02000000, 0x00000003}, + {0x454C5343, 0x00800000, 0x00000002}, + {0x454C5359, 0x10000000, 0x00000005}, + {0x454C5441, 0x01000000, 0x00000001}, + {0x454C5459, 0x00800000, 0x00000002}, + {0x454C5541, 0x00800000, 0x00000002}, + {0x454C5741, 0x08000000, 0x00000003}, + {0x454C5759, 0x02000000, 0x00000001}, + {0x454C5841, 0x04000000, 0x00000001}, + {0x454C5942, 0x02000000, 0x00000001}, + {0x454C5A41, 0x08000000, 0x00000007}, + {0x454D3241, 0x00800000, 0x00000001}, + {0x454D3243, 0x02000000, 0x00000002}, + {0x454D3259, 0x02000000, 0x00000008}, + {0x454D3341, 0x08000000, 0x00000002}, + {0x454D3342, 0x04000000, 0x00000002}, + {0x454D3442, 0x02000000, 0x00000001}, + {0x454D3443, 0x04000000, 0x00000001}, + {0x454D3542, 0x01000000, 0x00000001}, + {0x454D3543, 0x01000000, 0x00000001}, + {0x454D3643, 0x04000000, 0x00000002}, + {0x454D3741, 0x02000000, 0x00000001}, + {0x454D3742, 0x01000000, 0x00000001}, + {0x454D3743, 0x01000000, 0x00000003}, + {0x454D4143, 0x01000000, 0x00000002}, + {0x454D4154, 0x02000000, 0x00000001}, + {0x454D4159, 0x00800000, 0x00000001}, + {0x454D4241, 0x00800000, 0x00000001}, + {0x454D4242, 0x00800000, 0x00000001}, + {0x454D4243, 0x02000000, 0x00000002}, + {0x454D4341, 0x01000000, 0x00000001}, + {0x454D4342, 0x04000000, 0x00000001}, + {0x454D4343, 0x04000000, 0x00000002}, + {0x454D4354, 0x04000000, 0x00000002}, + {0x454D4356, 0x04000000, 0x00000002}, + {0x454D4359, 0x02000000, 0x00000001}, + {0x454D4441, 0x02000000, 0x00000005}, + {0x454D4459, 0x02000000, 0x00000002}, + {0x454D4643, 0x04000000, 0x00000003}, + {0x454D4659, 0x04000000, 0x00000003}, + {0x454D4742, 0x04000000, 0x00000003}, + {0x454D4843, 0x04000000, 0x00000002}, + {0x454D4943, 0x01000000, 0x00000002}, + {0x454D4959, 0x04000000, 0x00000001}, + {0x454D4A42, 0x04000000, 0x00000002}, + {0x454D4A59, 0x00800000, 0x00000002}, + {0x454D4C54, 0x08000000, 0x00000001}, + {0x454D4D42, 0x00800000, 0x00000001}, + {0x454D4D59, 0x02000000, 0x00000001}, + {0x454D4E41, 0x02000000, 0x00000005}, + {0x454D4E42, 0x04000000, 0x00000001}, + {0x454D4E43, 0x04000000, 0x00000001}, + {0x454D4E59, 0x01000000, 0x00000002}, + {0x454D5042, 0x02000000, 0x00000001}, + {0x454D5043, 0x04000000, 0x00000002}, + {0x454D5141, 0x00800000, 0x00000001}, + {0x454D5241, 0x04000000, 0x00000002}, + {0x454D5242, 0x01000000, 0x00000002}, + {0x454D5259, 0x02000000, 0x00000003}, + {0x454D5341, 0x01000000, 0x00000002}, + {0x454D5342, 0x01000000, 0x00000002}, + {0x454D5459, 0x04000000, 0x00000002}, + {0x454D5642, 0x02000000, 0x00000001}, + {0x454D5643, 0x02000000, 0x00000002}, + {0x454D5741, 0x00800000, 0x00000001}, + {0x454D5842, 0x04000000, 0x00000002}, + {0x454D5843, 0x04000000, 0x00000003}, + {0x454D5A43, 0x02000000, 0x00000001}, + {0x454E3242, 0x02000000, 0x00000001}, + {0x454E3243, 0x01000000, 0x00000002}, + {0x454E3342, 0x02000000, 0x00000001}, + {0x454E3542, 0x01000000, 0x00000001}, + {0x454E3543, 0x01000000, 0x00000001}, + {0x454E3641, 0x08000000, 0x00000003}, + {0x454E3741, 0x02000000, 0x00000001}, + {0x454E3742, 0x08000000, 0x00000003}, + {0x454E3841, 0x02000000, 0x00000005}, + {0x454E4143, 0x02000000, 0x00000005}, + {0x454E4259, 0x04000000, 0x00000007}, + {0x454E4341, 0x01000000, 0x00000002}, + {0x454E4354, 0x01000000, 0x00000001}, + {0x454E4441, 0x04000000, 0x00000003}, + {0x454E4443, 0x08000000, 0x00000001}, + {0x454E4541, 0x04000000, 0x00000002}, + {0x454E4543, 0x02000000, 0x00000003}, + {0x454E4641, 0x02000000, 0x00000002}, + {0x454E4654, 0x04000000, 0x00000002}, + {0x454E4656, 0x02000000, 0x00000002}, + {0x454E4741, 0x02000000, 0x00000001}, + {0x454E4743, 0x04000000, 0x00000002}, + {0x454E4759, 0x04000000, 0x00000002}, + {0x454E4841, 0x04000000, 0x00000001}, + {0x454E4843, 0x02000000, 0x00000002}, + {0x454E4859, 0x04000000, 0x00000003}, + {0x454E4942, 0x00800000, 0x00000001}, + {0x454E4A41, 0x02000000, 0x00000002}, + {0x454E4A43, 0x01000000, 0x00000001}, + {0x454E4B43, 0x08000000, 0x00000002}, + {0x454E4C41, 0x02000000, 0x00000002}, + {0x454E4C59, 0x08000000, 0x00000002}, + {0x454E4D54, 0x01000000, 0x00000002}, + {0x454E4E42, 0x04000000, 0x00000002}, + {0x454E4E59, 0x08000000, 0x00000003}, + {0x454E5041, 0x02000000, 0x00000001}, + {0x454E5042, 0x01000000, 0x00000002}, + {0x454E5059, 0x00800000, 0x00000001}, + {0x454E5142, 0x04000000, 0x00000001}, + {0x454E5159, 0x04000000, 0x00000002}, + {0x454E5241, 0x01000000, 0x00000001}, + {0x454E5341, 0x00800000, 0x00000002}, + {0x454E5342, 0x02000000, 0x00000001}, + {0x454E5356, 0x04000000, 0x00000002}, + {0x454E5442, 0x04000000, 0x00000002}, + {0x454E5642, 0x04000000, 0x00000001}, + {0x454E5643, 0x04000000, 0x00000001}, + {0x454E5842, 0x01000000, 0x00000001}, + {0x454E5A41, 0x01000000, 0x00000002}, + {0x454E5A43, 0x04000000, 0x00000002}, + {0x454F3241, 0x04000000, 0x00000003}, + {0x454F3341, 0x00800000, 0x00000001}, + {0x454F3441, 0x02000000, 0x00000005}, + {0x454F3541, 0x01000000, 0x00000001}, + {0x454F3542, 0x00800000, 0x00000001}, + {0x454F3559, 0x08000000, 0x00000000}, + {0x454F3642, 0x02000000, 0x00000001}, + {0x454F3659, 0x00800000, 0x00000000}, + {0x454F3741, 0x02000000, 0x00000001}, + {0x454F3743, 0x04000000, 0x00000002}, + {0x454F3842, 0x01000000, 0x00000001}, + {0x454F3959, 0x00800000, 0x00000000}, + {0x454F4142, 0x04000000, 0x00000001}, + {0x454F4143, 0x01000000, 0x00000001}, + {0x454F4156, 0x04000000, 0x00000001}, + {0x454F4241, 0x02000000, 0x00000001}, + {0x454F4259, 0x08000000, 0x00000003}, + {0x454F4341, 0x04000000, 0x00000005}, + {0x454F4359, 0x04000000, 0x00000001}, + {0x454F4641, 0x04000000, 0x00000003}, + {0x454F4842, 0x04000000, 0x00000001}, + {0x454F4843, 0x02000000, 0x00000001}, + {0x454F4942, 0x02000000, 0x00000001}, + {0x454F4943, 0x01000000, 0x00000008}, + {0x454F4A42, 0x04000000, 0x00000001}, + {0x454F4A43, 0x04000000, 0x00000002}, + {0x454F4B42, 0x04000000, 0x00000003}, + {0x454F4D41, 0x04000000, 0x00000002}, + {0x454F4D56, 0x02000000, 0x00000003}, + {0x454F4D59, 0x04000000, 0x00000001}, + {0x454F4E41, 0x02000000, 0x00000002}, + {0x454F4F42, 0x08000000, 0x00000002}, + {0x454F4F43, 0x04000000, 0x00000002}, + {0x454F5043, 0x01000000, 0x00000002}, + {0x454F5059, 0x04000000, 0x00000003}, + {0x454F5259, 0x04000000, 0x00000002}, + {0x454F5342, 0x02000000, 0x00000001}, + {0x454F5356, 0x04000000, 0x00000003}, + {0x454F5541, 0x00800000, 0x00000001}, + {0x454F5741, 0x02000000, 0x00000002}, + {0x454F5742, 0x02000000, 0x00000001}, + {0x454F5743, 0x00800000, 0x00000001}, + {0x454F5843, 0x04000000, 0x00000001}, + {0x454F5A42, 0x04000000, 0x00000003}, + {0x454F5A43, 0x02000000, 0x00000001}, + {0x45503342, 0x04000000, 0x00000001}, + {0x45503343, 0x04000000, 0x00000002}, + {0x45503441, 0x02000000, 0x00000002}, + {0x45503541, 0x04000000, 0x00000001}, + {0x45503643, 0x04000000, 0x00000007}, + {0x45503659, 0x04000000, 0x00000000}, + {0x45503741, 0x02000000, 0x00000001}, + {0x45503743, 0x04000000, 0x00000002}, + {0x45503859, 0x00800000, 0x00000008}, + {0x45504143, 0x02000000, 0x00000003}, + {0x45504243, 0x01000000, 0x00000002}, + {0x45504259, 0x02000000, 0x00000001}, + {0x45504341, 0x00800000, 0x00000002}, + {0x45504342, 0x04000000, 0x00000002}, + {0x45504442, 0x00800000, 0x00000001}, + {0x45504443, 0x01000000, 0x00000002}, + {0x45504542, 0x01000000, 0x00000002}, + {0x45504543, 0x08000000, 0x00000002}, + {0x45504643, 0x04000000, 0x00000002}, + {0x45504659, 0x01000000, 0x00000001}, + {0x45504741, 0x04000000, 0x00000002}, + {0x45504743, 0x02000000, 0x00000001}, + {0x45504754, 0x02000000, 0x00000001}, + {0x45504841, 0x04000000, 0x00000001}, + {0x45504941, 0x00800000, 0x00000008}, + {0x45504A41, 0x00800000, 0x00000001}, + {0x45504A43, 0x04000000, 0x00000002}, + {0x45504B41, 0x01000000, 0x00000001}, + {0x45504C41, 0x00800000, 0x00000001}, + {0x45504C42, 0x04000000, 0x00000002}, + {0x45504C43, 0x04000000, 0x00000003}, + {0x45504C54, 0x02000000, 0x00000001}, + {0x45504C59, 0x00800000, 0x00000002}, + {0x45504D41, 0x02000000, 0x00000002}, + {0x45504D43, 0x04000000, 0x00000001}, + {0x45504E41, 0x01000000, 0x00000001}, + {0x45504E59, 0x04000000, 0x00000002}, + {0x45504F41, 0x00800000, 0x00000001}, + {0x45504F43, 0x01000000, 0x00000003}, + {0x45504F59, 0x01000000, 0x00000001}, + {0x45505041, 0x001A68C8, 0x00000002}, + {0x45505043, 0x04000000, 0x00000005}, + {0x45505056, 0x02000000, 0x00000001}, + {0x45505141, 0x02000000, 0x00000002}, + {0x45505143, 0x01000000, 0x00000001}, + {0x45505159, 0x04000000, 0x00000002}, + {0x45505241, 0x04000000, 0x00000001}, + {0x45505242, 0x08000000, 0x00000002}, + {0x45505243, 0x02000000, 0x00000001}, + {0x45505256, 0x02000000, 0x00000001}, + {0x45505341, 0x02000000, 0x00000003}, + {0x45505342, 0x01000000, 0x00000002}, + {0x45505343, 0x10000000, 0x00000003}, + {0x45505356, 0x02000000, 0x00000002}, + {0x45505359, 0x02000000, 0x00000005}, + {0x45505442, 0x04000000, 0x00000002}, + {0x45505642, 0x08000000, 0x00000006}, + {0x45505659, 0x08000000, 0x00000003}, + {0x45505741, 0x01000000, 0x00000001}, + {0x45505742, 0x00800000, 0x00000001}, + {0x45505743, 0x02000000, 0x00000002}, + {0x45505841, 0x02000000, 0x00000005}, + {0x45505843, 0x02000000, 0x00000001}, + {0x45513543, 0x01000000, 0x00000002}, + {0x45513643, 0x08000000, 0x00000001}, + {0x45513741, 0x02000000, 0x00000001}, + {0x45513841, 0x02000000, 0x00000005}, + {0x45514141, 0x00800000, 0x00000000}, + {0x45514242, 0x00800000, 0x00000001}, + {0x45514243, 0x02000000, 0x00000002}, + {0x45514342, 0x01000000, 0x00000001}, + {0x45514359, 0x04000000, 0x00000002}, + {0x45514441, 0x04000000, 0x00000002}, + {0x45514459, 0x10000000, 0x00000003}, + {0x45514559, 0x00800000, 0x00000001}, + {0x45514641, 0x04000000, 0x00000002}, + {0x45514643, 0x01000000, 0x00000001}, + {0x45514741, 0x02000000, 0x00000003}, + {0x45514742, 0x02000000, 0x00000002}, + {0x45514743, 0x04000000, 0x00000003}, + {0x45514759, 0x04000000, 0x00000002}, + {0x45514841, 0x02000000, 0x00000001}, + {0x45514943, 0x02000000, 0x00000002}, + {0x45514A41, 0x01000000, 0x00000002}, + {0x45514A43, 0x00800000, 0x00000002}, + {0x45514A59, 0x01000000, 0x00000001}, + {0x45514B41, 0x02000000, 0x00000001}, + {0x45514B42, 0x04000000, 0x00000001}, + {0x45514B43, 0x02000000, 0x00000001}, + {0x45514C43, 0x04000000, 0x00000001}, + {0x45514D41, 0x04000000, 0x00000005}, + {0x45514E41, 0x00800000, 0x00000002}, + {0x45514E42, 0x02000000, 0x00000001}, + {0x45514F43, 0x04000000, 0x00000002}, + {0x45515042, 0x02000000, 0x00000001}, + {0x45515043, 0x02000000, 0x00000001}, + {0x45515141, 0x02000000, 0x00000002}, + {0x45515242, 0x01000000, 0x00000001}, + {0x45515243, 0x02000000, 0x00000001}, + {0x45515259, 0x02000000, 0x00000001}, + {0x45515341, 0x00800000, 0x00000002}, + {0x45515343, 0x01000000, 0x00000001}, + {0x45515359, 0x02000000, 0x00000002}, + {0x45515442, 0x01000000, 0x00000001}, + {0x45515641, 0x02000000, 0x00000002}, + {0x45515742, 0x01000000, 0x00000001}, + {0x45515743, 0x02000000, 0x00000001}, + {0x45515759, 0x00800000, 0x00000001}, + {0x45515842, 0x02000000, 0x00000001}, + {0x45515941, 0x00800000, 0x00000002}, + {0x45515943, 0x04000000, 0x00000001}, + {0x45515A43, 0x01000000, 0x00000001}, + {0x45523342, 0x08000000, 0x00000005}, + {0x45523442, 0x02000000, 0x00000001}, + {0x45523443, 0x02000000, 0x00000001}, + {0x45523459, 0x04000000, 0x00000008}, + {0x45523542, 0x10000000, 0x00000001}, + {0x45523559, 0x04000000, 0x00000008}, + {0x45523641, 0x04000000, 0x00000003}, + {0x45523642, 0x08000000, 0x00000002}, + {0x45523659, 0x04000000, 0x00000008}, + {0x45523741, 0x02000000, 0x00000001}, + {0x45524141, 0x00800000, 0x00000008}, + {0x45524143, 0x01000000, 0x00000002}, + {0x45524159, 0x01000000, 0x00000001}, + {0x45524241, 0x04000000, 0x00000002}, + {0x45524254, 0x04000000, 0x00000001}, + {0x45524256, 0x02000000, 0x00000001}, + {0x45524259, 0x04000000, 0x00000001}, + {0x45524341, 0x02000000, 0x00000001}, + {0x45524343, 0x00800000, 0x00000002}, + {0x45524354, 0x00800000, 0x00000001}, + {0x45524441, 0x01000000, 0x00000002}, + {0x45524442, 0x04000000, 0x00000005}, + {0x45524443, 0x00800000, 0x00000001}, + {0x45524459, 0x00800000, 0x00000001}, + {0x45524541, 0x01000000, 0x00000002}, + {0x45524542, 0x02000000, 0x00000001}, + {0x45524543, 0x02000000, 0x00000003}, + {0x45524559, 0x04000000, 0x00000003}, + {0x45524641, 0x04000000, 0x00000001}, + {0x45524643, 0x08000000, 0x00000002}, + {0x45524659, 0x01000000, 0x00000001}, + {0x45524756, 0x04000000, 0x00000001}, + {0x45524841, 0x02000000, 0x00000002}, + {0x45524842, 0x02000000, 0x00000001}, + {0x45524859, 0x01000000, 0x00000002}, + {0x45524942, 0x01000000, 0x00000001}, + {0x45524943, 0x04000000, 0x00000002}, + {0x45524959, 0x04000000, 0x00000001}, + {0x45524A41, 0x08000000, 0x00000005}, + {0x45524A42, 0x01000000, 0x00000001}, + {0x45524A43, 0x08000000, 0x00000003}, + {0x45524B42, 0x02000000, 0x00000001}, + {0x45524C42, 0x10000000, 0x00000001}, + {0x45524C43, 0x04000000, 0x00000003}, + {0x45524C54, 0x08000000, 0x00000001}, + {0x45524C59, 0x01000000, 0x00000002}, + {0x45524D43, 0x02000000, 0x00000002}, + {0x45524E42, 0x04000000, 0x00000003}, + {0x45524E43, 0x04000000, 0x00000002}, + {0x45524F55, 0x08000000, 0x00000008}, + {0x45525041, 0x02000000, 0x00000002}, + {0x45525042, 0x00800000, 0x00000001}, + {0x45525043, 0x04000000, 0x00000002}, + {0x45525059, 0x02000000, 0x00000002}, + {0x45525143, 0x04000000, 0x00000002}, + {0x45525241, 0x02000000, 0x00000002}, + {0x45525243, 0x02000000, 0x00000005}, + {0x45525254, 0x01000000, 0x00000001}, + {0x45525259, 0x02000000, 0x00000002}, + {0x45525342, 0x01000000, 0x00000001}, + {0x45525359, 0x01000000, 0x00000005}, + {0x45525441, 0x01000000, 0x00000002}, + {0x45525443, 0x02000000, 0x00000003}, + {0x45525459, 0x04000000, 0x00000001}, + {0x45525542, 0x01000000, 0x00000001}, + {0x45525741, 0x02000000, 0x00000005}, + {0x45525759, 0x04000000, 0x00000001}, + {0x45525843, 0x04000000, 0x00000001}, + {0x45525942, 0x08000000, 0x00000001}, + {0x45525959, 0x04000000, 0x00000001}, + {0x45525A42, 0x00800000, 0x00000001}, + {0x45525A43, 0x02000000, 0x00000001}, + {0x45533241, 0x04000000, 0x00000002}, + {0x45533242, 0x08000000, 0x00000002}, + {0x45533243, 0x08000000, 0x00000004}, + {0x45533341, 0x02000000, 0x00000001}, + {0x45533459, 0x08000000, 0x00000008}, + {0x45533543, 0x08000000, 0x00000001}, + {0x45533559, 0x04000000, 0x00000008}, + {0x45533641, 0x04000000, 0x00000001}, + {0x45533642, 0x04000000, 0x00000001}, + {0x45533741, 0x02000000, 0x00000001}, + {0x45533759, 0x04000000, 0x00000008}, + {0x45533842, 0x04000000, 0x00000002}, + {0x45533859, 0x00800000, 0x00000000}, + {0x45534143, 0x02000000, 0x00000001}, + {0x45534154, 0x01000000, 0x00000001}, + {0x45534242, 0x02000000, 0x00000001}, + {0x45534243, 0x01000000, 0x00000002}, + {0x45534256, 0x02000000, 0x00000001}, + {0x45534342, 0x04000000, 0x00000002}, + {0x45534354, 0x04000000, 0x00000005}, + {0x45534359, 0x00800000, 0x00000001}, + {0x45534443, 0x08000000, 0x00000001}, + {0x45534542, 0x04000000, 0x00000001}, + {0x45534556, 0x04000000, 0x00000001}, + {0x45534641, 0x02000000, 0x00000002}, + {0x45534656, 0x08000000, 0x00000003}, + {0x45534743, 0x08000000, 0x00000001}, + {0x45534754, 0x02000000, 0x00000001}, + {0x45534759, 0x04000000, 0x00000003}, + {0x45534841, 0x02000000, 0x00000002}, + {0x45534844, 0x02000000, 0xFFFFFFFF}, + {0x45534859, 0x02000000, 0x00000003}, + {0x45534941, 0x01000000, 0x00000001}, + {0x45534959, 0x04000000, 0x00000002}, + {0x45534A42, 0x04000000, 0x00000003}, + {0x45534A56, 0x04000000, 0x00000003}, + {0x45534B54, 0x02000000, 0x00000002}, + {0x45534C42, 0x04000000, 0x00000001}, + {0x45534C54, 0x01000000, 0x00000001}, + {0x45534D43, 0x02000000, 0x00000003}, + {0x45534D54, 0x01000000, 0x00000001}, + {0x45534E41, 0x01000000, 0x00000001}, + {0x45534E42, 0x01000000, 0x00000001}, + {0x45534E43, 0x04000000, 0x00000002}, + {0x45534F41, 0x08000000, 0x00000005}, + {0x45534F43, 0x02000000, 0x00000001}, + {0x45535043, 0x04000000, 0x00000002}, + {0x45535143, 0x02000000, 0x00000001}, + {0x45535243, 0x00800000, 0x00000001}, + {0x45535341, 0x04000000, 0x00000002}, + {0x45535342, 0x01000000, 0x00000002}, + {0x45535359, 0x04000000, 0x00000003}, + {0x45535541, 0x04000000, 0x00000001}, + {0x45535543, 0x02000000, 0x00000001}, + {0x45535559, 0x00800000, 0x00000001}, + {0x45535641, 0x02000000, 0x00000002}, + {0x45535643, 0x02000000, 0x00000001}, + {0x45535659, 0x02000000, 0x00000003}, + {0x45535741, 0x01000000, 0x00000002}, + {0x45535759, 0x08000000, 0x00000003}, + {0x45535842, 0x04000000, 0x00000003}, + {0x45535843, 0x01000000, 0x00000001}, + {0x45535943, 0x04000000, 0x00000002}, + {0x45535A42, 0x00800000, 0x00000001}, + {0x45543241, 0x02000000, 0x00000001}, + {0x45543341, 0x02000000, 0x00000002}, + {0x45543343, 0x04000000, 0x00000003}, + {0x45543442, 0x01000000, 0x00000002}, + {0x45543541, 0x02000000, 0x00000005}, + {0x45543542, 0x00800000, 0x00000001}, + {0x45543543, 0x02000000, 0x00000005}, + {0x45543559, 0x00800000, 0x00000008}, + {0x45543641, 0x04000000, 0x00000001}, + {0x45543642, 0x04000000, 0x00000002}, + {0x45543643, 0x01000000, 0x00000002}, + {0x45543741, 0x02000000, 0x00000001}, + {0x45543841, 0x02000000, 0x00000002}, + {0x45544142, 0x04000000, 0x00000002}, + {0x45544143, 0x02000000, 0x00000002}, + {0x45544154, 0x02000000, 0x00000001}, + {0x45544156, 0x02000000, 0x00000001}, + {0x45544159, 0x01000000, 0x00000002}, + {0x45544241, 0x02000000, 0x00000001}, + {0x45544254, 0x01000000, 0x00000001}, + {0x45544256, 0x02000000, 0x00000002}, + {0x45544259, 0x08000000, 0x00000003}, + {0x45544341, 0x02000000, 0x00000001}, + {0x45544359, 0x02000000, 0x00000001}, + {0x45544454, 0x10000000, 0x00000008}, + {0x45544459, 0x04000000, 0x00000003}, + {0x45544559, 0x01000000, 0x00000001}, + {0x45544641, 0x00800000, 0x00000001}, + {0x45544659, 0x04000000, 0x00000005}, + {0x45544742, 0x08000000, 0x00000002}, + {0x45544759, 0x02000000, 0x00000001}, + {0x45544941, 0x00800000, 0x00000001}, + {0x45544943, 0x01000000, 0x00000001}, + {0x45544959, 0x01000000, 0x00000001}, + {0x45544A41, 0x02000000, 0x00000001}, + {0x45544A56, 0x04000000, 0x00000001}, + {0x45544B43, 0x04000000, 0x00000002}, + {0x45544C41, 0x00800000, 0x00000001}, + {0x45544C42, 0x00800000, 0x00000001}, + {0x45544C59, 0x08000000, 0x00000002}, + {0x45544D41, 0x04000000, 0x00000002}, + {0x45544D42, 0x08000000, 0x00000003}, + {0x45544D43, 0x02000000, 0x00000001}, + {0x45544D54, 0x04000000, 0x00000002}, + {0x45544E41, 0x04000000, 0x00000002}, + {0x45545041, 0x01000000, 0x00000002}, + {0x45545054, 0x08000000, 0x00000001}, + {0x45545059, 0x02000000, 0x00000005}, + {0x45545141, 0x01000000, 0x00000002}, + {0x45545143, 0x04000000, 0x00000003}, + {0x45545259, 0x02000000, 0x00000002}, + {0x45545341, 0x02000000, 0x00000001}, + {0x45545343, 0x04000000, 0x00000001}, + {0x45545359, 0x04000000, 0x00000001}, + {0x45545541, 0x01000000, 0x00000001}, + {0x45545543, 0x01000000, 0x00000001}, + {0x45545559, 0x04000000, 0x00000002}, + {0x45545659, 0x02000000, 0x00000001}, + {0x45545741, 0x00800000, 0x00000001}, + {0x45545743, 0x02000000, 0x00000001}, + {0x45545841, 0x00800000, 0x00000001}, + {0x45545942, 0x08000000, 0x00000002}, + {0x45545959, 0x01000000, 0x00000002}, + {0x45545A41, 0x01000000, 0x00000005}, + {0x45545A59, 0x01000000, 0x00000005}, + {0x45553242, 0x02000000, 0x00000001}, + {0x45553342, 0x02000000, 0x00000002}, + {0x45553459, 0x02000000, 0x00000008}, + {0x45553541, 0x02000000, 0x00000005}, + {0x45553542, 0x04000000, 0x00000002}, + {0x45553543, 0x02000000, 0x00000002}, + {0x45553559, 0x01000000, 0x00000000}, + {0x45553659, 0x01000000, 0x00000000}, + {0x45553743, 0x02000000, 0x00000001}, + {0x45554159, 0x04000000, 0x00000003}, + {0x45554241, 0x04000000, 0x00000005}, + {0x45554242, 0x04000000, 0x00000003}, + {0x45554259, 0x08000000, 0x00000003}, + {0x45554341, 0x04000000, 0x00000005}, + {0x45554342, 0x01000000, 0x00000001}, + {0x45554359, 0x00400000, 0x00000003}, + {0x45554442, 0x02000000, 0x00000001}, + {0x45554443, 0x01000000, 0x00000003}, + {0x45554454, 0x00800000, 0x00000001}, + {0x45554543, 0x04000000, 0x00000002}, + {0x45554641, 0x01000000, 0x00000003}, + {0x45554642, 0x01000000, 0x00000001}, + {0x45554854, 0x02000000, 0x00000001}, + {0x45554859, 0x00800000, 0x00000001}, + {0x45554942, 0x01000000, 0x00000001}, + {0x45554943, 0x04000000, 0x00000002}, + {0x45554A59, 0x04000000, 0x00000002}, + {0x45554B41, 0x04000000, 0x00000001}, + {0x45554B42, 0x08000000, 0x00000005}, + {0x45554B56, 0x04000000, 0x00000001}, + {0x45554C54, 0x04000000, 0x00000001}, + {0x45554D41, 0x00800000, 0x00000001}, + {0x45554D42, 0x04000000, 0x00000001}, + {0x45554D43, 0x01000000, 0x00000003}, + {0x45554D59, 0x04000000, 0x00000002}, + {0x45554E41, 0x01000000, 0x00000001}, + {0x45554F43, 0x00800000, 0x00000003}, + {0x45555043, 0x08000000, 0x00000006}, + {0x45555054, 0x01000000, 0x00000001}, + {0x45555159, 0x08000000, 0x00000003}, + {0x45555242, 0x01000000, 0x00000001}, + {0x45555341, 0x04000000, 0x00000003}, + {0x45555343, 0x02000000, 0x00000001}, + {0x45555442, 0x04000000, 0x00000002}, + {0x45555741, 0x02000000, 0x00000001}, + {0x45555742, 0x01000000, 0x00000002}, + {0x45555743, 0x04000000, 0x00000001}, + {0x45555841, 0x02000000, 0x00000001}, + {0x45555843, 0x08000000, 0x00000002}, + {0x45555943, 0x01000000, 0x00000002}, + {0x45555959, 0x04000000, 0x00000001}, + {0x45555A42, 0x02000000, 0x00000002}, + {0x45555A56, 0x02000000, 0x00000002}, + {0x45563241, 0x00800000, 0x00000001}, + {0x45563242, 0x01000000, 0x00000001}, + {0x45563341, 0x04000000, 0x00000003}, + {0x45563342, 0x02000000, 0x00000001}, + {0x45563542, 0x04000000, 0x00000001}, + {0x45563559, 0x00800000, 0x00000008}, + {0x45563642, 0x00800000, 0x00000001}, + {0x45563643, 0x02000000, 0x00000001}, + {0x45563742, 0x00800000, 0x00000001}, + {0x45564142, 0x04000000, 0x00000001}, + {0x45564143, 0x02000000, 0x00000002}, + {0x45564156, 0x04000000, 0x00000001}, + {0x45564159, 0x04000000, 0x00000002}, + {0x45564242, 0x00800000, 0x00000001}, + {0x45564256, 0x02000000, 0x00000001}, + {0x45564259, 0x02000000, 0x00000002}, + {0x45564341, 0x04000000, 0x00000002}, + {0x45564359, 0x01000000, 0x00000003}, + {0x45564441, 0x01000000, 0x00000001}, + {0x45564442, 0x02000000, 0x00000001}, + {0x45564443, 0x01000000, 0x00000001}, + {0x45564454, 0x08000000, 0x00000003}, + {0x45564459, 0x00800000, 0x00000002}, + {0x45564641, 0x04000000, 0x00000001}, + {0x45564643, 0x02000000, 0x00000002}, + {0x45564741, 0x02000000, 0x00000002}, + {0x45564841, 0x01000000, 0x00000001}, + {0x45564842, 0x02000000, 0x00000001}, + {0x45564843, 0x02000000, 0x00000003}, + {0x45564854, 0x04000000, 0x00000001}, + {0x45564942, 0x00800000, 0x00000001}, + {0x45564959, 0x08000000, 0x00000003}, + {0x45564A59, 0x01000000, 0x00000002}, + {0x45564C41, 0x01000000, 0x00000002}, + {0x45564C54, 0x02000000, 0x00000002}, + {0x45564D41, 0x04000000, 0x00000001}, + {0x45564D42, 0x00800000, 0x00000001}, + {0x45564D43, 0x00800000, 0x00000001}, + {0x45564D59, 0x00800000, 0x00000001}, + {0x45564E43, 0x10000000, 0x00000005}, + {0x45564F59, 0x00800000, 0x00000001}, + {0x45565041, 0x00800000, 0x00000002}, + {0x45565042, 0x00800000, 0x00000004}, + {0x45565043, 0x04000000, 0x00000002}, + {0x45565056, 0x04000000, 0x00000002}, + {0x45565059, 0x04000000, 0x00000001}, + {0x45565141, 0x01000000, 0x00000002}, + {0x45565143, 0x04000000, 0x00000001}, + {0x45565159, 0x01000000, 0x00000001}, + {0x45565241, 0x02000000, 0x00000003}, + {0x45565242, 0x01000000, 0x00000002}, + {0x45565259, 0x02000000, 0x00000005}, + {0x45565341, 0x00800000, 0x00000001}, + {0x45565342, 0x02000000, 0x00000001}, + {0x45565343, 0x02000000, 0x00000005}, + {0x45565441, 0x01000000, 0x00000001}, + {0x45565442, 0x02000000, 0x00000002}, + {0x45565459, 0x08000000, 0x00000003}, + {0x45565642, 0x01000000, 0x00000002}, + {0x45565741, 0x01000000, 0x00000001}, + {0x45565742, 0x02000000, 0x00000001}, + {0x45565756, 0x04000000, 0x00000001}, + {0x45565841, 0x04000000, 0x00000003}, + {0x45565842, 0x02000000, 0x00000001}, + {0x45565A41, 0x00800000, 0x00000001}, + {0x45565A42, 0x04000000, 0x00000002}, + {0x45565A43, 0x02000000, 0x00000001}, + {0x45573241, 0x04000000, 0x00000001}, + {0x45573259, 0x04000000, 0x00000008}, + {0x45573341, 0x04000000, 0x00000002}, + {0x45573342, 0x04000000, 0x00000002}, + {0x45573543, 0x01000000, 0x00000002}, + {0x45573641, 0x02000000, 0x00000002}, + {0x45573642, 0x08000000, 0x00000002}, + {0x45573643, 0x02000000, 0x00000002}, + {0x45573742, 0x01000000, 0x00000002}, + {0x45573759, 0x00800000, 0x00000001}, + {0x45574159, 0x04000000, 0x00000002}, + {0x45574259, 0x01000000, 0x00000002}, + {0x45574343, 0x02000000, 0x00000002}, + {0x45574354, 0x02000000, 0x00000001}, + {0x45574356, 0x02000000, 0x00000002}, + {0x45574442, 0x02000000, 0x00000001}, + {0x45574459, 0x02000000, 0x00000005}, + {0x45574542, 0x04000000, 0x00000002}, + {0x45574641, 0x01000000, 0x00000001}, + {0x45574643, 0x01000000, 0x00000001}, + {0x45574659, 0x00800000, 0x00000001}, + {0x45574741, 0x01000000, 0x00000002}, + {0x45574743, 0x00800000, 0x00000001}, + {0x45574759, 0x00800000, 0x00000001}, + {0x45574842, 0x00800000, 0x00000001}, + {0x45574856, 0x04000000, 0x00000002}, + {0x45574859, 0x02000000, 0x00000001}, + {0x45574942, 0x02000000, 0x00000002}, + {0x45574A43, 0x00800000, 0x00000001}, + {0x45574A56, 0x02000000, 0x00000003}, + {0x45574B41, 0x04000000, 0x00000002}, + {0x45574B42, 0x00800000, 0x00000002}, + {0x45574B59, 0x08000000, 0x00000003}, + {0x45574C41, 0x02000000, 0x00000001}, + {0x45574C43, 0x10000000, 0x00000002}, + {0x45574D41, 0x04000000, 0x00000002}, + {0x45574D49, 0x04000000, 0x00000007}, + {0x45574E41, 0x02000000, 0x00000002}, + {0x45574E59, 0x02000000, 0x00000001}, + {0x45574F41, 0x00800000, 0x00000001}, + {0x45575041, 0x02000000, 0x00000001}, + {0x45575042, 0x01000000, 0x00000001}, + {0x45575043, 0x04000000, 0x00000002}, + {0x45575141, 0x01000000, 0x00000001}, + {0x45575243, 0x02000000, 0x00000002}, + {0x45575254, 0x02000000, 0x00000002}, + {0x45575259, 0x02000000, 0x00000005}, + {0x45575341, 0x02000000, 0x00000001}, + {0x45575343, 0x04000000, 0x00000001}, + {0x45575359, 0x00800000, 0x00000001}, + {0x45575441, 0x02000000, 0x00000002}, + {0x45575442, 0x02000000, 0x00000001}, + {0x45575443, 0x08000000, 0x00000001}, + {0x45575641, 0x02000000, 0x00000002}, + {0x45575741, 0x02000000, 0x00000001}, + {0x45575842, 0x00800000, 0x00000001}, + {0x45575941, 0x02000000, 0x00000002}, + {0x45575943, 0x01000000, 0x00000001}, + {0x45575959, 0x02000000, 0x00000001}, + {0x45575A41, 0x02000000, 0x00000002}, + {0x45583242, 0x02000000, 0x00000002}, + {0x45583341, 0x04000000, 0x00000001}, + {0x45583342, 0x01000000, 0x00000001}, + {0x45583659, 0x00800000, 0x00000000}, + {0x45584154, 0x00800000, 0x00000001}, + {0x45584241, 0x02000000, 0x00000002}, + {0x45584242, 0x00800000, 0x00000001}, + {0x45584243, 0x01000000, 0x00000003}, + {0x45584259, 0x00800000, 0x00000001}, + {0x45584341, 0x01000000, 0x00000003}, + {0x45584343, 0x01000000, 0x00000003}, + {0x45584359, 0x02000000, 0x00000002}, + {0x45584456, 0x04000000, 0x00000001}, + {0x45584542, 0x01000000, 0x00000001}, + {0x45584559, 0x02000000, 0x00000002}, + {0x45584641, 0x08000000, 0x00000003}, + {0x45584642, 0x04000000, 0x00000002}, + {0x45584643, 0x01000000, 0x00000001}, + {0x45584659, 0x02000000, 0x00000001}, + {0x45584741, 0x08000000, 0x00000003}, + {0x45584759, 0x08000000, 0x00000002}, + {0x45584841, 0x00800000, 0x00000001}, + {0x45584843, 0x02000000, 0x00000003}, + {0x45584859, 0x01000000, 0x00000001}, + {0x45584A43, 0x01000000, 0x00000001}, + {0x45584B43, 0x01000000, 0x00000001}, + {0x45584C41, 0x02000000, 0x00000001}, + {0x45584C59, 0x00800000, 0x00000001}, + {0x45584D41, 0x01000000, 0x00000001}, + {0x45584D42, 0x02000000, 0x00000001}, + {0x45584D43, 0x01000000, 0x00000001}, + {0x45584D59, 0x00800000, 0x00000001}, + {0x45584E41, 0x02000000, 0x00000001}, + {0x45584E42, 0x04000000, 0x00000002}, + {0x45584E59, 0x00800000, 0x00000002}, + {0x45585159, 0x01000000, 0x00000001}, + {0x45585343, 0x01000000, 0x00000001}, + {0x45585359, 0x01000000, 0x00000001}, + {0x45585441, 0x01000000, 0x00000002}, + {0x45585442, 0x04000000, 0x00000001}, + {0x45585443, 0x01000000, 0x00000001}, + {0x45585543, 0x04000000, 0x00000001}, + {0x45585559, 0x04000000, 0x00000003}, + {0x45585641, 0x01000000, 0x00000001}, + {0x45585643, 0x04000000, 0x00000002}, + {0x45585741, 0x01000000, 0x00000002}, + {0x45585842, 0x02000000, 0x00000001}, + {0x45585859, 0x04000000, 0x00000002}, + {0x45585941, 0x08000000, 0x00000005}, + {0x45585942, 0x10000000, 0x00000003}, + {0x45585943, 0x02000000, 0x00000001}, + {0x45585A42, 0x02000000, 0x00000001}, + {0x45585A59, 0x04000000, 0x00000002}, + {0x45593341, 0x04000000, 0x00000003}, + {0x45593342, 0x02000000, 0x00000001}, + {0x45593459, 0x01000000, 0x00000008}, + {0x45593559, 0x01000000, 0x00000008}, + {0x45593641, 0x01000000, 0x00000002}, + {0x45593742, 0x01000000, 0x00000002}, + {0x45593759, 0x00800000, 0x00000008}, + {0x45594143, 0x02000000, 0x00000001}, + {0x45594159, 0x02000000, 0x00000001}, + {0x45594242, 0x00800000, 0x00000001}, + {0x45594243, 0x02000000, 0x00000001}, + {0x45594259, 0x02000000, 0x00000001}, + {0x45594343, 0x01000000, 0x00000001}, + {0x45594354, 0x04000000, 0x00000002}, + {0x45594359, 0x00800000, 0x00000001}, + {0x45594442, 0x04000000, 0x00000002}, + {0x45594542, 0x01000000, 0x00000001}, + {0x45594543, 0x02000000, 0x00000001}, + {0x45594641, 0x04000000, 0x00000001}, + {0x45594659, 0x04000000, 0x00000005}, + {0x45594741, 0x04000000, 0x00000005}, + {0x45594756, 0x02000000, 0x00000002}, + {0x45594842, 0x01000000, 0x00000001}, + {0x45594843, 0x01000000, 0x00000001}, + {0x45594941, 0x02000000, 0x00000001}, + {0x45594943, 0x04000000, 0x00000002}, + {0x45594959, 0x01000000, 0x00000001}, + {0x45594B41, 0x01000000, 0x00000003}, + {0x45594B42, 0x02000000, 0x00000002}, + {0x45594C41, 0x04000000, 0x00000001}, + {0x45594C59, 0x02000000, 0x00000002}, + {0x45594D42, 0x01000000, 0x00000002}, + {0x45594D56, 0x04000000, 0x00000001}, + {0x45594D59, 0x08000000, 0x00000002}, + {0x45594E41, 0x04000000, 0x00000003}, + {0x45594E42, 0x04000000, 0x00000001}, + {0x45594E43, 0x04000000, 0x00000002}, + {0x45594E59, 0x00800000, 0x00000001}, + {0x45594F41, 0x01000000, 0x00000002}, + {0x45594F43, 0x04000000, 0x00000002}, + {0x45595041, 0x02000000, 0x00000002}, + {0x45595042, 0x00800000, 0x00000001}, + {0x45595142, 0x04000000, 0x00000001}, + {0x45595241, 0x02000000, 0x00000002}, + {0x45595243, 0x01000000, 0x00000001}, + {0x45595254, 0x02000000, 0x00000001}, + {0x45595342, 0x02000000, 0x00000002}, + {0x45595343, 0x01000000, 0x00000001}, + {0x45595344, 0x02000000, 0x00000001}, + {0x45595359, 0x01000000, 0x00000001}, + {0x45595543, 0x02000000, 0x00000001}, + {0x45595642, 0x08000000, 0x00000001}, + {0x45595842, 0x04000000, 0x00000002}, + {0x45595859, 0x00800000, 0x00000001}, + {0x45595941, 0x01000000, 0x00000002}, + {0x45595942, 0x08000000, 0x00000003}, + {0x45595A41, 0x04000000, 0x00000002}, + {0x45595A42, 0x00800000, 0x00000001}, + {0x45595A59, 0x01000000, 0x00000002}, + {0x455A3441, 0x00800000, 0x00000001}, + {0x455A3443, 0x04000000, 0x00000002}, + {0x455A3541, 0x04000000, 0x00000001}, + {0x455A3542, 0x00800000, 0x00000001}, + {0x455A3543, 0x00800000, 0x00000001}, + {0x455A3642, 0x04000000, 0x00000003}, + {0x455A3659, 0x08000000, 0x00000000}, + {0x455A3742, 0x04000000, 0x00000001}, + {0x455A4159, 0x01000000, 0x00000001}, + {0x455A4241, 0x08000000, 0x00000003}, + {0x455A4242, 0x01000000, 0x00000001}, + {0x455A4259, 0x01000000, 0x00000001}, + {0x455A4341, 0x01000000, 0x00000001}, + {0x455A4343, 0x00800000, 0x00000001}, + {0x455A4354, 0x04000000, 0x00000002}, + {0x455A4441, 0x02000000, 0x00000002}, + {0x455A4442, 0x04000000, 0x00000003}, + {0x455A4443, 0x04000000, 0x00000002}, + {0x455A4641, 0x04000000, 0x00000001}, + {0x455A4642, 0x00800000, 0x00000001}, + {0x455A4656, 0x02000000, 0x00000001}, + {0x455A4742, 0x01000000, 0x00000002}, + {0x455A4841, 0x04000000, 0x00000001}, + {0x455A4842, 0x02000000, 0x00000003}, + {0x455A4859, 0x04000000, 0x00000002}, + {0x455A4941, 0x01000000, 0x00000002}, + {0x455A4943, 0x02000000, 0x00000001}, + {0x455A4959, 0x04000000, 0x00000002}, + {0x455A4A59, 0x04000000, 0x00000005}, + {0x455A4B43, 0x01000000, 0x00000005}, + {0x455A4C43, 0x04000000, 0x00000001}, + {0x455A4C59, 0x08000000, 0x00000002}, + {0x455A4D56, 0x04000000, 0x00000001}, + {0x455A4D59, 0x01000000, 0x00000001}, + {0x455A4E41, 0x01000000, 0x00000001}, + {0x455A4E59, 0x04000000, 0x00000002}, + {0x455A4F41, 0x01000000, 0x00000002}, + {0x455A4F42, 0x02000000, 0x00000001}, + {0x455A4F43, 0x08000000, 0x00000002}, + {0x455A5042, 0x00800000, 0x00000001}, + {0x455A5043, 0x02000000, 0x00000002}, + {0x455A5143, 0x02000000, 0x00000001}, + {0x455A5241, 0x04000000, 0x00000002}, + {0x455A5242, 0x04000000, 0x00000003}, + {0x455A5243, 0x00800000, 0x00000002}, + {0x455A5254, 0x02000000, 0x00000002}, + {0x455A5341, 0x01000000, 0x00000001}, + {0x455A5343, 0x02000000, 0x00000005}, + {0x455A5359, 0x08000000, 0x00000001}, + {0x455A5442, 0x02000000, 0x00000001}, + {0x455A5443, 0x02000000, 0x00000003}, + {0x455A5459, 0x02000000, 0x00000001}, + {0x455A5541, 0x04000000, 0x00000005}, + {0x455A5543, 0x04000000, 0x00000001}, + {0x455A5759, 0x04000000, 0x00000001}, + {0x455A5A42, 0x00800000, 0x00000001}, + {0x46323643, 0x04000000, 0x00000001}, + {0x46324543, 0x02000000, 0x00000001}, + {0x46324C42, 0x01000000, 0x00000001}, + {0x46324E42, 0x01000000, 0x00000002}, + {0x46325959, 0x00800000, 0x00000001}, + {0x46334343, 0x01000000, 0x00000001}, + {0x46334E42, 0x01000000, 0x00000002}, + {0x46335141, 0x04000000, 0x00000002}, + {0x46335159, 0x04000000, 0x00000002}, + {0x46335742, 0x08000000, 0x00000002}, + {0x46344259, 0x02000000, 0x00000001}, + {0x46344559, 0x02000000, 0x00000001}, + {0x46344E42, 0x01000000, 0x00000002}, + {0x46354243, 0x01000000, 0x00000001}, + {0x46354841, 0x02000000, 0x00000002}, + {0x46354E42, 0x01000000, 0x00000002}, + {0x46363443, 0x00800000, 0x00000001}, + {0x46364E42, 0x01000000, 0x00000002}, + {0x46373343, 0x02000000, 0x00000001}, + {0x46373443, 0x02000000, 0x00000001}, + {0x46373543, 0x02000000, 0x00000001}, + {0x46373742, 0x00800000, 0x00000001}, + {0x46374559, 0x00800000, 0x00000001}, + {0x46375443, 0x00800000, 0x00000002}, + {0x46375959, 0x01000000, 0x00000001}, + {0x46383643, 0x02000000, 0x00000001}, + {0x46383742, 0x00800000, 0x00000001}, + {0x46384343, 0x02000000, 0x00000001}, + {0x46384543, 0x02000000, 0x00000001}, + {0x46384C59, 0x01000000, 0x00000001}, + {0x46394341, 0x04000000, 0x00000001}, + {0x46394343, 0x02000000, 0x00000001}, + {0x46394943, 0x01000000, 0x00000002}, + {0x46395342, 0x00800000, 0x00000001}, + {0x46395942, 0x00800000, 0x00000001}, + {0x46413343, 0x00800000, 0x00000001}, + {0x46414441, 0x04000000, 0x00000006}, + {0x46414759, 0x01000000, 0x00000001}, + {0x46414C59, 0x00800000, 0x00000002}, + {0x46414E43, 0x02000000, 0x00000001}, + {0x46414F43, 0x00800000, 0x00000001}, + {0x46415041, 0x04000000, 0x00000006}, + {0x46415249, 0x10000000, 0x00000006}, + {0x46415843, 0x00800000, 0x00000001}, + {0x46423542, 0x04000000, 0x00000002}, + {0x46424354, 0x08000000, 0x00000001}, + {0x46424542, 0x10000000, 0x00000003}, + {0x46424659, 0x01000000, 0x00000001}, + {0x46424A42, 0x04000000, 0x00000001}, + {0x46424D43, 0x01000000, 0x00000001}, + {0x46424F43, 0x00800000, 0x00000001}, + {0x46425042, 0x01000000, 0x00000001}, + {0x46425043, 0x01000000, 0x00000001}, + {0x46425249, 0x10000000, 0x00000006}, + {0x46425254, 0x00800000, 0x00000001}, + {0x46425843, 0x00800000, 0x00000001}, + {0x46433243, 0x00800000, 0x00000001}, + {0x46434143, 0x01000000, 0x00000002}, + {0x46434A42, 0x04000000, 0x00000002}, + {0x46435843, 0x00800000, 0x00000001}, + {0x46435943, 0x02000000, 0x00000002}, + {0x46444143, 0x01000000, 0x00000002}, + {0x46444359, 0x02000000, 0x00000001}, + {0x46445054, 0x08000000, 0x00000001}, + {0x46445249, 0x20000000, 0x00000006}, + {0x46445443, 0x04000000, 0x00000002}, + {0x46445641, 0x01000000, 0x00000002}, + {0x46445843, 0x00800000, 0x00000001}, + {0x46454143, 0x01000000, 0x00000002}, + {0x46454542, 0x10000000, 0x00000003}, + {0x46454543, 0x00800000, 0x00000001}, + {0x46454559, 0x10000000, 0x00000003}, + {0x46454741, 0x01000000, 0x00000001}, + {0x46454959, 0x02000000, 0x00000002}, + {0x46455249, 0x20000000, 0x00000006}, + {0x46455542, 0x02000000, 0x00000001}, + {0x46455843, 0x00800000, 0x00000001}, + {0x46464143, 0x01000000, 0x00000001}, + {0x46464459, 0x01000000, 0x00000001}, + {0x46464A43, 0x01000000, 0x00000001}, + {0x46464B59, 0x02000000, 0x00000001}, + {0x46464C42, 0x10000000, 0x00000003}, + {0x46464D43, 0x00800000, 0x00000001}, + {0x46465059, 0x02000000, 0x00000001}, + {0x46465359, 0x04000000, 0x00000001}, + {0x46465843, 0x00800000, 0x00000001}, + {0x46465959, 0x00800000, 0x00000001}, + {0x46474D41, 0x01000000, 0x00000001}, + {0x46474D43, 0x04000000, 0x00000001}, + {0x46475049, 0x08000000, 0x00000006}, + {0x46483842, 0x04000000, 0x00000002}, + {0x46484143, 0x00800000, 0x00000001}, + {0x46484259, 0x02000000, 0x00000002}, + {0x46484A42, 0x01000000, 0x00000001}, + {0x46495443, 0x02000000, 0x00000002}, + {0x464A3343, 0x10000000, 0x00000003}, + {0x464A3743, 0x00800000, 0x00000001}, + {0x464A4754, 0x00800000, 0x00000001}, + {0x464A4959, 0x04000000, 0x00000002}, + {0x464A4F41, 0x02000000, 0x00000002}, + {0x464A4F42, 0x04000000, 0x00000002}, + {0x464A4F43, 0x00800000, 0x00000001}, + {0x464A5641, 0x04000000, 0x00000002}, + {0x464A5759, 0x00800000, 0x00000002}, + {0x464B4159, 0x08000000, 0x00000002}, + {0x464B4356, 0x08000000, 0x00000002}, + {0x464B4841, 0x04000000, 0x00000003}, + {0x464B5049, 0x08000000, 0x00000006}, + {0x464C4343, 0x02000000, 0x00000002}, + {0x464C4359, 0x01000000, 0x00000002}, + {0x464C4842, 0x04000000, 0x00000002}, + {0x464C4D59, 0x00800000, 0x00000001}, + {0x464C4F41, 0x00800000, 0x00000001}, + {0x464D4443, 0x00800000, 0x00000001}, + {0x464D4C54, 0x08000000, 0x00000001}, + {0x464D5141, 0x00800000, 0x00000001}, + {0x464E4243, 0x02000000, 0x00000001}, + {0x464E4259, 0x04000000, 0x00000007}, + {0x464E5243, 0x01000000, 0x00000001}, + {0x464E5759, 0x02000000, 0x00000001}, + {0x464F4359, 0x04000000, 0x00000001}, + {0x46504242, 0x00800000, 0x00000001}, + {0x46504A59, 0x01000000, 0x00000001}, + {0x46504B43, 0x02000000, 0x00000001}, + {0x46504C43, 0x04000000, 0x00000003}, + {0x46504F42, 0x01000000, 0x00000001}, + {0x46505041, 0x01000000, 0x00000002}, + {0x46505942, 0x02000000, 0x00000001}, + {0x46505A55, 0x08000000, 0x00000003}, + {0x46514343, 0x02000000, 0x00000001}, + {0x46514C59, 0x04000000, 0x00000001}, + {0x46514D43, 0x02000000, 0x00000001}, + {0x46524359, 0x02000000, 0x00000001}, + {0x46525141, 0x01000000, 0x00000002}, + {0x46525359, 0x01000000, 0x00000005}, + {0x46533341, 0x02000000, 0x00000001}, + {0x46534343, 0x02000000, 0x00000001}, + {0x46534959, 0x02000000, 0x00000002}, + {0x46534F41, 0x08000000, 0x00000005}, + {0x46535541, 0x04000000, 0x00000001}, + {0x46543242, 0x00800000, 0x00000001}, + {0x46543743, 0x01000000, 0x00000002}, + {0x46544159, 0x01000000, 0x00000002}, + {0x46544443, 0x02000000, 0x00000001}, + {0x46544C43, 0x00800000, 0x00000001}, + {0x46544C59, 0x08000000, 0x00000002}, + {0x46545643, 0x02000000, 0x00000001}, + {0x46554243, 0x01000000, 0x00000001}, + {0x46554259, 0x08000000, 0x00000003}, + {0x46554559, 0x01000000, 0x00000001}, + {0x46554743, 0x01000000, 0x00000002}, + {0x46554F59, 0x02000000, 0x00000001}, + {0x46555043, 0x08000000, 0x00000006}, + {0x46555643, 0x01000000, 0x00000001}, + {0x46563742, 0x01000000, 0x00000001}, + {0x46564559, 0x01000000, 0x00000001}, + {0x46564643, 0x02000000, 0x00000002}, + {0x46564859, 0x04000000, 0x00000001}, + {0x46564E43, 0x10000000, 0x00000005}, + {0x46565841, 0x04000000, 0x00000003}, + {0x46573743, 0x00800000, 0x00000001}, + {0x46574243, 0x02000000, 0x00000001}, + {0x46574356, 0x02000000, 0x00000002}, + {0x46574959, 0x04000000, 0x00000001}, + {0x46575959, 0x02000000, 0x00000001}, + {0x46583543, 0x02000000, 0x00000001}, + {0x46583743, 0x00800000, 0x00000001}, + {0x46585059, 0x00800000, 0x00000003}, + {0x46585441, 0x01000000, 0x00000002}, + {0x46585959, 0x01000000, 0x00000001}, + {0x46593743, 0x00800000, 0x00000001}, + {0x46594342, 0x04000000, 0x00000001}, + {0x46594442, 0x04000000, 0x00000002}, + {0x46594443, 0x02000000, 0x00000002}, + {0x46594641, 0x04000000, 0x00000001}, + {0x46594642, 0x01000000, 0x00000001}, + {0x46594A59, 0x00800000, 0x00000001}, + {0x46594C41, 0x04000000, 0x00000001}, + {0x46595559, 0x00800000, 0x00000001}, + {0x46595A41, 0x04000000, 0x00000002}, + {0x465A3659, 0x08000000, 0x00000008}, + {0x465A3743, 0x00800000, 0x00000001}, + {0x465A4142, 0x04000000, 0x00000001}, + {0x465A4641, 0x04000000, 0x00000001}, + {0x465A4F41, 0x01000000, 0x00000002}, + {0x465A5359, 0x08000000, 0x00000001}, + {0x474C4443, 0x02000000, 0x00000004}, + {0x47595543, 0x02000000, 0x00000001}, + {0x48334B54, 0x01000000, 0x00000001}, + {0x48335159, 0x04000000, 0x00000002}, + {0x48344259, 0x02000000, 0x00000001}, + {0x48344559, 0x02000000, 0x00000001}, + {0x48354841, 0x02000000, 0x00000002}, + {0x48373642, 0x01000000, 0x00000002}, + {0x48374E43, 0x01000000, 0x00000002}, + {0x48384C59, 0x01000000, 0x00000001}, + {0x48414B54, 0x02000000, 0x00000001}, + {0x48414C59, 0x00800000, 0x00000002}, + {0x48434842, 0x01000000, 0x00000001}, + {0x48435943, 0x02000000, 0x00000002}, + {0x48454E42, 0x02000000, 0x00000001}, + {0x48455142, 0x02000000, 0x00000002}, + {0x48464B59, 0x02000000, 0x00000001}, + {0x48464C42, 0x10000000, 0x00000003}, + {0x48464E42, 0x02000000, 0x00000001}, + {0x48474D41, 0x01000000, 0x00000001}, + {0x48474D43, 0x04000000, 0x00000001}, + {0x48494759, 0x00800000, 0x00000002}, + {0x48495959, 0x01000000, 0x00000001}, + {0x484A3343, 0x10000000, 0x00000003}, + {0x484A4D43, 0x01000000, 0x00000002}, + {0x484B5242, 0x00800000, 0x00000002}, + {0x484C3542, 0x01000000, 0x00000001}, + {0x484C4842, 0x04000000, 0x00000002}, + {0x484C5143, 0x00800000, 0x00000002}, + {0x484C5442, 0x00800000, 0x00000002}, + {0x484C5459, 0x00800000, 0x00000002}, + {0x484D5742, 0x01000000, 0x00000001}, + {0x484E4242, 0x00800000, 0x00000002}, + {0x48504A59, 0x01000000, 0x00000001}, + {0x48505443, 0x00800000, 0x00000002}, + {0x48515443, 0x00800000, 0x00000001}, + {0x48533341, 0x02000000, 0x00000001}, + {0x48544C59, 0x08000000, 0x00000002}, + {0x48565742, 0x02000000, 0x00000001}, + {0x48565841, 0x04000000, 0x00000003}, + {0x48575143, 0x02000000, 0x00000008}, + {0x48594559, 0x01000000, 0x00000001}, + {0x48595759, 0x04000000, 0x00000002}, + {0x485A3243, 0x00800000, 0x00000002}, + {0x485A4841, 0x04000000, 0x00000001}, + {0x485A4942, 0x01000000, 0x00000001}, + {0x49323643, 0x04000000, 0x00000001}, + {0x49334943, 0x04000000, 0x00000001}, + {0x49335141, 0x04000000, 0x00000002}, + {0x49335159, 0x04000000, 0x00000002}, + {0x49335742, 0x08000000, 0x00000002}, + {0x49344259, 0x02000000, 0x00000001}, + {0x49354841, 0x02000000, 0x00000002}, + {0x49364959, 0x04000000, 0x00000002}, + {0x49384C59, 0x01000000, 0x00000001}, + {0x49394341, 0x04000000, 0x00000001}, + {0x49413643, 0x00800000, 0x00000001}, + {0x49414441, 0x04000000, 0x00000006}, + {0x49414C59, 0x00800000, 0x00000002}, + {0x49415041, 0x04000000, 0x00000006}, + {0x49415249, 0x10000000, 0x00000006}, + {0x49424542, 0x10000000, 0x00000003}, + {0x49425249, 0x10000000, 0x00000006}, + {0x49434A42, 0x04000000, 0x00000002}, + {0x49434D43, 0x02000000, 0x00000002}, + {0x49435141, 0x02000000, 0x00000002}, + {0x49435943, 0x02000000, 0x00000002}, + {0x49445249, 0x20000000, 0x00000006}, + {0x49445641, 0x01000000, 0x00000002}, + {0x49454542, 0x10000000, 0x00000003}, + {0x49454559, 0x10000000, 0x00000003}, + {0x49455249, 0x20000000, 0x00000006}, + {0x49464B59, 0x02000000, 0x00000001}, + {0x49464C42, 0x10000000, 0x00000003}, + {0x49465359, 0x04000000, 0x00000001}, + {0x49474354, 0x04000000, 0x00000001}, + {0x49474D41, 0x01000000, 0x00000001}, + {0x49474D43, 0x04000000, 0x00000001}, + {0x49475049, 0x08000000, 0x00000006}, + {0x49483642, 0x02000000, 0x00000001}, + {0x494A3343, 0x10000000, 0x00000003}, + {0x494A4D54, 0x02000000, 0x00000001}, + {0x494A4F41, 0x02000000, 0x00000002}, + {0x494A5641, 0x04000000, 0x00000002}, + {0x494B4356, 0x08000000, 0x00000002}, + {0x494B5049, 0x08000000, 0x00000006}, + {0x494B5356, 0x04000000, 0x00000001}, + {0x494C4C43, 0x00800000, 0x00000002}, + {0x494C5842, 0x01000000, 0x00000002}, + {0x494D4359, 0x02000000, 0x00000001}, + {0x494E5243, 0x01000000, 0x00000001}, + {0x494F4359, 0x04000000, 0x00000001}, + {0x49505A55, 0x08000000, 0xFFFFFFFF}, + {0x49525359, 0x01000000, 0x00000005}, + {0x49525643, 0x00800000, 0x00000001}, + {0x49533341, 0x02000000, 0x00000001}, + {0x49534F41, 0x08000000, 0x00000005}, + {0x49535541, 0x04000000, 0x00000001}, + {0x49544C59, 0x08000000, 0x00000002}, + {0x49554259, 0x08000000, 0x00000003}, + {0x49555043, 0x08000000, 0x00000006}, + {0x49564E43, 0x10000000, 0x00000005}, + {0x49565841, 0x04000000, 0x00000003}, + {0x49574342, 0x01000000, 0x00000001}, + {0x49585059, 0x00800000, 0x00000003}, + {0x49594641, 0x04000000, 0x00000001}, + {0x49594C41, 0x04000000, 0x00000001}, + {0x49595543, 0x02000000, 0x00000001}, + {0x495A3659, 0x08000000, 0x00000008}, + {0x495A4341, 0x01000000, 0x00000001}, + {0x495A4641, 0x04000000, 0x00000001}, + {0x495A4F41, 0x01000000, 0x00000002}, + {0x495A5359, 0x08000000, 0x00000001}, + {0x4A323242, 0x08000000, 0x00000003}, + {0x4A323243, 0x04000000, 0x00000002}, + {0x4A323342, 0x04000000, 0x00000001}, + {0x4A323343, 0x04000000, 0x00000003}, + {0x4A323442, 0x04000000, 0x00000002}, + {0x4A323443, 0x04000000, 0x00000002}, + {0x4A323543, 0x04000000, 0x00000002}, + {0x4A323642, 0x04000000, 0x00000005}, + {0x4A323742, 0x01000000, 0x00000001}, + {0x4A324143, 0x08000000, 0x00000003}, + {0x4A324159, 0x08000000, 0x00000001}, + {0x4A324243, 0x02000000, 0x00000002}, + {0x4A324259, 0x02000000, 0x00000002}, + {0x4A324341, 0x04000000, 0x00000001}, + {0x4A324359, 0x04000000, 0x00000006}, + {0x4A324441, 0x02000000, 0x00000005}, + {0x4A324442, 0x01000000, 0x00000002}, + {0x4A324443, 0x04000000, 0x00000002}, + {0x4A324541, 0x08000000, 0x00000001}, + {0x4A324559, 0x04000000, 0x00000002}, + {0x4A324641, 0x01000000, 0x00000002}, + {0x4A324642, 0x04000000, 0x00000005}, + {0x4A324659, 0x10000000, 0x00000003}, + {0x4A324742, 0x08000000, 0x00000005}, + {0x4A324759, 0x01000000, 0x00000001}, + {0x4A324841, 0x00800000, 0x00000003}, + {0x4A324842, 0x02000000, 0x00000003}, + {0x4A324843, 0x04000000, 0x00000002}, + {0x4A324956, 0x08000000, 0x00000005}, + {0x4A324A43, 0x01000000, 0x00000002}, + {0x4A324B41, 0x02000000, 0x00000001}, + {0x4A324B54, 0x04000000, 0x00000001}, + {0x4A324B59, 0x02000000, 0x00000003}, + {0x4A324C41, 0x04000000, 0x00000002}, + {0x4A324C59, 0x08000000, 0x00000003}, + {0x4A324D41, 0x04000000, 0x00000005}, + {0x4A324D42, 0x02000000, 0x00000003}, + {0x4A324E41, 0x02000000, 0x00000002}, + {0x4A324E43, 0x04000000, 0x00000005}, + {0x4A324F41, 0x08000000, 0x00000005}, + {0x4A324F42, 0x04000000, 0x00000002}, + {0x4A324F43, 0x10000000, 0x00000001}, + {0x4A324F59, 0x02000000, 0x00000002}, + {0x4A325041, 0x02000000, 0x00000001}, + {0x4A325043, 0x04000000, 0x00000003}, + {0x4A325054, 0x08000000, 0x00000002}, + {0x4A325059, 0x04000000, 0x00000005}, + {0x4A325142, 0x10000000, 0x00000003}, + {0x4A325143, 0x01000000, 0x00000003}, + {0x4A325159, 0x04000000, 0x00000002}, + {0x4A325241, 0x02000000, 0x00000005}, + {0x4A325243, 0x04000000, 0x00000002}, + {0x4A325341, 0x01000000, 0x00000001}, + {0x4A325359, 0x04000000, 0x00000005}, + {0x4A325443, 0x04000000, 0x00000002}, + {0x4A325541, 0x04000000, 0x00000001}, + {0x4A325543, 0x01000000, 0x00000002}, + {0x4A325559, 0x01000000, 0x00000005}, + {0x4A325641, 0x02000000, 0x00000001}, + {0x4A325659, 0x02000000, 0x00000002}, + {0x4A325743, 0x01000000, 0x00000001}, + {0x4A325843, 0x04000000, 0x00000003}, + {0x4A325859, 0x00800000, 0x00000002}, + {0x4A325943, 0x04000000, 0x00000001}, + {0x4A325A41, 0x02000000, 0x00000002}, + {0x4A325A42, 0x04000000, 0x00000002}, + {0x4A325A59, 0x00800000, 0x00000002}, + {0x4A333242, 0x04000000, 0x00000005}, + {0x4A333243, 0x02000000, 0x00000002}, + {0x4A333342, 0x04000000, 0x00000002}, + {0x4A333343, 0x04000000, 0x00000001}, + {0x4A333441, 0x00800000, 0x00000000}, + {0x4A333442, 0x04000000, 0x00000003}, + {0x4A333542, 0x02000000, 0x00000003}, + {0x4A333643, 0x02000000, 0x00000002}, + {0x4A334241, 0x04000000, 0x00000003}, + {0x4A334259, 0x04000000, 0x00000005}, + {0x4A334341, 0x02000000, 0x00000005}, + {0x4A334441, 0x02000000, 0x00000005}, + {0x4A334543, 0x10000000, 0x00000003}, + {0x4A334559, 0x02000000, 0x00000002}, + {0x4A334741, 0x02000000, 0x00000005}, + {0x4A334742, 0x04000000, 0x00000002}, + {0x4A334743, 0x02000000, 0x00000002}, + {0x4A334759, 0x02000000, 0x00000003}, + {0x4A334841, 0x02000000, 0x00000003}, + {0x4A334843, 0x04000000, 0x00000002}, + {0x4A334854, 0x20000000, 0x00000002}, + {0x4A334859, 0x10000000, 0x00000002}, + {0x4A334A42, 0x02000000, 0x00000005}, + {0x4A334A59, 0x04000000, 0x00000002}, + {0x4A334B41, 0x02000000, 0x00000002}, + {0x4A334B42, 0x02000000, 0x00000003}, + {0x4A334B59, 0x02000000, 0x00000003}, + {0x4A334C41, 0x02000000, 0x00000001}, + {0x4A334C42, 0x08000000, 0x00000002}, + {0x4A334C56, 0x08000000, 0x00000005}, + {0x4A334C59, 0x04000000, 0x00000002}, + {0x4A334D42, 0x08000000, 0x00000003}, + {0x4A334D43, 0x08000000, 0x00000003}, + {0x4A334D59, 0x02000000, 0x00000002}, + {0x4A334E43, 0x08000000, 0x00000002}, + {0x4A334E54, 0x20000000, 0x00000005}, + {0x4A334F43, 0x10000000, 0x00000001}, + {0x4A334F59, 0x02000000, 0x00000001}, + {0x4A335141, 0x04000000, 0x00000001}, + {0x4A335142, 0x04000000, 0x00000002}, + {0x4A335143, 0x01000000, 0x00000003}, + {0x4A335241, 0x04000000, 0x00000003}, + {0x4A335242, 0x08000000, 0x00000002}, + {0x4A335243, 0x08000000, 0x00000002}, + {0x4A335259, 0x10000000, 0x00000003}, + {0x4A335442, 0x00800000, 0x00000003}, + {0x4A335443, 0x04000000, 0x00000003}, + {0x4A335456, 0x04000000, 0x00000001}, + {0x4A335459, 0x04000000, 0x00000003}, + {0x4A335559, 0x01000000, 0x00000001}, + {0x4A335641, 0x02000000, 0x00000001}, + {0x4A335642, 0x01000000, 0x00000002}, + {0x4A335643, 0x01000000, 0x00000001}, + {0x4A335741, 0x04000000, 0x00000001}, + {0x4A335759, 0x01000000, 0x00000001}, + {0x4A335841, 0x08000000, 0x00000001}, + {0x4A335843, 0x02000000, 0x00000002}, + {0x4A335941, 0x04000000, 0x00000002}, + {0x4A335959, 0x02000000, 0x00000002}, + {0x4A335A41, 0x02000000, 0x00000002}, + {0x4A335A42, 0x08000000, 0x00000003}, + {0x4A335A43, 0x02000000, 0x00000003}, + {0x4A335A59, 0x02000000, 0x00000002}, + {0x4A343243, 0x08000000, 0x00000003}, + {0x4A343342, 0x02000000, 0x00000001}, + {0x4A343343, 0x04000000, 0x00000003}, + {0x4A343442, 0x01000000, 0x00000002}, + {0x4A343443, 0x08000000, 0x00000002}, + {0x4A343541, 0x02000000, 0x00000000}, + {0x4A343542, 0x01000000, 0x00000002}, + {0x4A343559, 0x00400000, 0x00000000}, + {0x4A343643, 0x04000000, 0x00000003}, + {0x4A343742, 0x04000000, 0x00000002}, + {0x4A344142, 0x01000000, 0x00000002}, + {0x4A344241, 0x04000000, 0x00000005}, + {0x4A344242, 0x04000000, 0x00000002}, + {0x4A344254, 0x10000000, 0x00000006}, + {0x4A344341, 0x04000000, 0x00000001}, + {0x4A344342, 0x10000000, 0x00000002}, + {0x4A344343, 0x04000000, 0x00000003}, + {0x4A344354, 0x04000000, 0x00000007}, + {0x4A344359, 0x02000000, 0x00000003}, + {0x4A344454, 0x02000000, 0x00000001}, + {0x4A344541, 0x04000000, 0x00000002}, + {0x4A344543, 0x01000000, 0x00000003}, + {0x4A344642, 0x10000000, 0x00000002}, + {0x4A344654, 0x04000000, 0x00000005}, + {0x4A344659, 0x08000000, 0x00000003}, + {0x4A344742, 0x08000000, 0x00000002}, + {0x4A344743, 0x04000000, 0x00000003}, + {0x4A344754, 0x04000000, 0x00000003}, + {0x4A344759, 0x10000000, 0x00000003}, + {0x4A344841, 0x00800000, 0x00000001}, + {0x4A344859, 0x04000000, 0x00000001}, + {0x4A344941, 0x01000000, 0x00000003}, + {0x4A344A59, 0x01000000, 0x00000002}, + {0x4A344B41, 0x02000000, 0x00000003}, + {0x4A344B42, 0x08000000, 0x00000002}, + {0x4A344B43, 0x04000000, 0x00000003}, + {0x4A344B59, 0x04000000, 0x00000002}, + {0x4A344C41, 0x00800000, 0x00000001}, + {0x4A344C42, 0x04000000, 0x00000002}, + {0x4A344C43, 0x08000000, 0x00000002}, + {0x4A344C59, 0x00800000, 0x00000002}, + {0x4A344D54, 0x04000000, 0x00000002}, + {0x4A344D59, 0x04000000, 0x00000002}, + {0x4A344E41, 0x04000000, 0x00000001}, + {0x4A344F41, 0x02000000, 0x00000002}, + {0x4A344F42, 0x04000000, 0x00000003}, + {0x4A344F43, 0x00800000, 0x00000006}, + {0x4A344F59, 0x08000000, 0x00000002}, + {0x4A345043, 0x08000000, 0x00000002}, + {0x4A345054, 0x04000000, 0x00000002}, + {0x4A345056, 0x08000000, 0x00000006}, + {0x4A345059, 0x04000000, 0x00000002}, + {0x4A345142, 0x04000000, 0x00000002}, + {0x4A345159, 0x00800000, 0x00000002}, + {0x4A345241, 0x01000000, 0x00000002}, + {0x4A345259, 0x01000000, 0x00000003}, + {0x4A345343, 0x08000000, 0x00000003}, + {0x4A345359, 0x04000000, 0x00000002}, + {0x4A345541, 0x01000000, 0x00000001}, + {0x4A345559, 0x02000000, 0x00000003}, + {0x4A345641, 0x02000000, 0x00000001}, + {0x4A345659, 0x08000000, 0x00000003}, + {0x4A345743, 0x10000000, 0x00000003}, + {0x4A345759, 0x04000000, 0x00000003}, + {0x4A345841, 0x08000000, 0x00000001}, + {0x4A345843, 0x04000000, 0x00000005}, + {0x4A345941, 0x08000000, 0x00000001}, + {0x4A345959, 0x04000000, 0x00000003}, + {0x4A345A41, 0x00800000, 0x00000002}, + {0x4A345A59, 0x02000000, 0x00000001}, + {0x4A353342, 0x04000000, 0x00000005}, + {0x4A353443, 0x01000000, 0x00000002}, + {0x4A353543, 0x04000000, 0x00000003}, + {0x4A353742, 0x01000000, 0x00000002}, + {0x4A354143, 0x08000000, 0x00000003}, + {0x4A354241, 0x02000000, 0x00000001}, + {0x4A354341, 0x02000000, 0x00000005}, + {0x4A354354, 0x02000000, 0x00000002}, + {0x4A354459, 0x00800000, 0x00000002}, + {0x4A354541, 0x01000000, 0x00000003}, + {0x4A354542, 0x04000000, 0x00000002}, + {0x4A354742, 0x04000000, 0x00000002}, + {0x4A354843, 0x04000000, 0x00000002}, + {0x4A354859, 0x04000000, 0x00000002}, + {0x4A354941, 0x04000000, 0x00000002}, + {0x4A354A43, 0x02000000, 0x00000002}, + {0x4A354B41, 0x01000000, 0x00000001}, + {0x4A354B43, 0x04000000, 0x00000005}, + {0x4A354B54, 0x00800000, 0x00000003}, + {0x4A354B56, 0x04000000, 0x00000003}, + {0x4A354C59, 0x08000000, 0x00000003}, + {0x4A354D41, 0x04000000, 0x00000005}, + {0x4A354E41, 0x01000000, 0x00000003}, + {0x4A354E43, 0x04000000, 0x00000003}, + {0x4A354F41, 0x02000000, 0x00000005}, + {0x4A354F42, 0x10000000, 0x00000005}, + {0x4A354F59, 0x04000000, 0x00000003}, + {0x4A355154, 0x04000000, 0xFFFFFFFF}, + {0x4A355159, 0x01000000, 0x00000002}, + {0x4A355442, 0x08000000, 0x00000002}, + {0x4A355543, 0x04000000, 0x00000002}, + {0x4A355559, 0x08000000, 0x00000002}, + {0x4A355641, 0x02000000, 0x00000001}, + {0x4A355643, 0x02000000, 0x00000001}, + {0x4A355659, 0x08000000, 0x00000003}, + {0x4A355741, 0x01000000, 0x00000003}, + {0x4A355841, 0x08000000, 0x00000001}, + {0x4A355941, 0x08000000, 0x00000003}, + {0x4A355959, 0x04000000, 0x00000003}, + {0x4A355A43, 0x02000000, 0x00000003}, + {0x4A355A59, 0x02000000, 0x00000002}, + {0x4A363243, 0x00800000, 0x00000002}, + {0x4A363341, 0x02000000, 0x00000000}, + {0x4A363343, 0x04000000, 0x00000001}, + {0x4A363542, 0x04000000, 0x00000005}, + {0x4A363643, 0x04000000, 0x00000002}, + {0x4A364143, 0x04000000, 0x00000002}, + {0x4A364241, 0x02000000, 0x00000001}, + {0x4A364243, 0x01000000, 0x00000002}, + {0x4A364259, 0x01000000, 0x00000002}, + {0x4A364359, 0x01000000, 0x00000003}, + {0x4A364443, 0x08000000, 0x00000003}, + {0x4A364541, 0x04000000, 0x00000003}, + {0x4A364543, 0x01000000, 0x00000002}, + {0x4A364559, 0x04000000, 0x00000003}, + {0x4A364659, 0x04000000, 0x00000003}, + {0x4A364741, 0x02000000, 0x00000002}, + {0x4A364841, 0x01000000, 0x00000001}, + {0x4A364842, 0x04000000, 0x00000002}, + {0x4A364843, 0x04000000, 0x00000001}, + {0x4A364859, 0x04000000, 0x00000001}, + {0x4A364943, 0x02000000, 0x00000003}, + {0x4A364A43, 0x08000000, 0x00000002}, + {0x4A364B42, 0x02000000, 0x00000002}, + {0x4A364B59, 0x00800000, 0x00000003}, + {0x4A364C59, 0x04000000, 0x00000001}, + {0x4A364D43, 0x08000000, 0x00000002}, + {0x4A364E43, 0x04000000, 0x00000002}, + {0x4A364F41, 0x08000000, 0x00000001}, + {0x4A364F42, 0x01000000, 0x00000002}, + {0x4A364F43, 0x04000000, 0x00000002}, + {0x4A364F59, 0x02000000, 0x00000001}, + {0x4A365141, 0x00800000, 0x00000002}, + {0x4A365142, 0x02000000, 0x00000003}, + {0x4A365241, 0x00800000, 0x00000002}, + {0x4A365243, 0x04000000, 0x00000002}, + {0x4A365341, 0x04000000, 0x00000005}, + {0x4A365359, 0x04000000, 0x00000005}, + {0x4A365443, 0x04000000, 0x00000002}, + {0x4A365459, 0x01000000, 0x00000003}, + {0x4A365559, 0x02000000, 0x00000002}, + {0x4A365641, 0x02000000, 0x00000001}, + {0x4A365659, 0x00800000, 0x00000001}, + {0x4A365759, 0x02000000, 0x00000002}, + {0x4A365841, 0x08000000, 0x00000001}, + {0x4A365843, 0x08000000, 0x00000002}, + {0x4A365941, 0x00800000, 0x00000005}, + {0x4A365A41, 0x01000000, 0x00000005}, + {0x4A365A59, 0x02000000, 0x00000002}, + {0x4A373243, 0x08000000, 0x00000003}, + {0x4A374142, 0x02000000, 0x00000002}, + {0x4A374341, 0x00800000, 0x00000002}, + {0x4A374359, 0x02000000, 0x00000002}, + {0x4A374459, 0x04000000, 0x00000002}, + {0x4A374541, 0x08000000, 0x00000002}, + {0x4A374741, 0x02000000, 0x00000002}, + {0x4A374743, 0x04000000, 0x00000002}, + {0x4A374759, 0x04000000, 0x00000002}, + {0x4A374841, 0x04000000, 0x00000002}, + {0x4A374843, 0x10000000, 0x00000003}, + {0x4A374859, 0x08000000, 0x00000001}, + {0x4A374A43, 0x04000000, 0x00000001}, + {0x4A374A54, 0x04000000, 0x00000002}, + {0x4A374A59, 0x01000000, 0x00000002}, + {0x4A374B41, 0x02000000, 0x00000005}, + {0x4A374B59, 0x01000000, 0x00000002}, + {0x4A374C41, 0x02000000, 0x00000001}, + {0x4A374C59, 0x04000000, 0x00000003}, + {0x4A374D41, 0x02000000, 0x00000002}, + {0x4A374D42, 0x04000000, 0x00000003}, + {0x4A374D59, 0x04000000, 0x00000002}, + {0x4A374E54, 0x20000000, 0x00000005}, + {0x4A374F41, 0x04000000, 0x00000002}, + {0x4A374F42, 0x01000000, 0x00000005}, + {0x4A374F59, 0x01000000, 0x00000002}, + {0x4A375141, 0x00800000, 0x00000002}, + {0x4A375241, 0x04000000, 0x00000002}, + {0x4A375259, 0x04000000, 0x00000002}, + {0x4A375341, 0x08000000, 0x00000003}, + {0x4A375342, 0x04000000, 0x00000001}, + {0x4A375343, 0x10000000, 0x00000003}, + {0x4A375541, 0x02000000, 0x00000002}, + {0x4A375641, 0x02000000, 0x00000002}, + {0x4A375659, 0x00800000, 0x00000001}, + {0x4A375741, 0x02000000, 0x00000002}, + {0x4A375841, 0x08000000, 0x00000003}, + {0x4A375859, 0x01000000, 0x00000003}, + {0x4A375941, 0x08000000, 0x00000005}, + {0x4A375A41, 0x01000000, 0x00000002}, + {0x4A375A59, 0x02000000, 0x00000001}, + {0x4A383343, 0x04000000, 0x00000005}, + {0x4A383442, 0x00800000, 0x00000002}, + {0x4A384154, 0x01000000, 0x00000001}, + {0x4A384259, 0x02000000, 0x00000003}, + {0x4A384359, 0x01000000, 0x00000002}, + {0x4A384441, 0x01000000, 0x00000002}, + {0x4A384443, 0x02000000, 0x00000002}, + {0x4A384459, 0x04000000, 0x00000003}, + {0x4A384541, 0x04000000, 0x00000002}, + {0x4A384542, 0x20000000, 0x00000003}, + {0x4A384641, 0x01000000, 0x00000002}, + {0x4A384741, 0x04000000, 0x00000003}, + {0x4A384742, 0x01000000, 0x00000003}, + {0x4A384743, 0x02000000, 0x00000002}, + {0x4A384759, 0x08000000, 0x00000005}, + {0x4A384841, 0x02000000, 0x00000001}, + {0x4A384943, 0x04000000, 0x00000002}, + {0x4A384A43, 0x04000000, 0x00000002}, + {0x4A384A54, 0x04000000, 0x00000002}, + {0x4A384B43, 0x02000000, 0x00000003}, + {0x4A384B59, 0x04000000, 0x00000003}, + {0x4A384D41, 0x01000000, 0x00000001}, + {0x4A384D43, 0x02000000, 0x00000002}, + {0x4A384D59, 0x01000000, 0x00000002}, + {0x4A384E43, 0x10000000, 0x00000003}, + {0x4A385041, 0x02000000, 0x00000005}, + {0x4A385043, 0x02000000, 0x00000002}, + {0x4A385141, 0x00800000, 0x00000002}, + {0x4A385142, 0x04000000, 0x00000002}, + {0x4A385154, 0x04000000, 0x00000003}, + {0x4A385159, 0x04000000, 0x00000003}, + {0x4A385241, 0x04000000, 0x00000002}, + {0x4A385242, 0x01000000, 0x00000001}, + {0x4A385341, 0x00800000, 0x00000002}, + {0x4A385443, 0x04000000, 0x00000003}, + {0x4A385541, 0x04000000, 0x00000002}, + {0x4A385641, 0x01000000, 0x00000001}, + {0x4A385643, 0x04000000, 0x00000002}, + {0x4A385659, 0x00800000, 0x00000001}, + {0x4A385759, 0x08000000, 0x00000005}, + {0x4A385843, 0x02000000, 0x00000002}, + {0x4A385943, 0x10000000, 0x00000003}, + {0x4A385959, 0x04000000, 0x00000002}, + {0x4A385A41, 0x00800000, 0x00000002}, + {0x4A385A59, 0x02000000, 0x00000002}, + {0x4A393243, 0x04000000, 0x00000005}, + {0x4A393256, 0x02000000, 0x00000005}, + {0x4A393341, 0x02000000, 0x00000000}, + {0x4A393342, 0x08000000, 0x00000002}, + {0x4A393441, 0x02000000, 0x00000000}, + {0x4A393443, 0x04000000, 0x00000005}, + {0x4A393542, 0x01000000, 0x00000002}, + {0x4A393543, 0x04000000, 0x00000002}, + {0x4A393741, 0x02000000, 0x00000000}, + {0x4A393842, 0x04000000, 0x00000005}, + {0x4A394142, 0x04000000, 0x00000002}, + {0x4A394154, 0x01000000, 0x00000001}, + {0x4A394241, 0x01000000, 0x00000001}, + {0x4A394243, 0x08000000, 0x00000005}, + {0x4A394441, 0x02000000, 0x00000003}, + {0x4A394443, 0x04000000, 0x00000003}, + {0x4A394541, 0x04000000, 0x00000002}, + {0x4A394559, 0x04000000, 0x00000003}, + {0x4A394741, 0x02000000, 0x00000003}, + {0x4A394742, 0x04000000, 0x00000005}, + {0x4A394743, 0x01000000, 0x00000002}, + {0x4A394842, 0x20000000, 0x00000002}, + {0x4A394843, 0x02000000, 0x00000003}, + {0x4A394859, 0x02000000, 0x00000002}, + {0x4A394941, 0x04000000, 0x00000002}, + {0x4A394A42, 0x01000000, 0x00000002}, + {0x4A394A54, 0x04000000, 0x00000002}, + {0x4A394A59, 0x00800000, 0x00000005}, + {0x4A394B41, 0x01000000, 0x00000002}, + {0x4A394B42, 0x10000000, 0x00000003}, + {0x4A394B43, 0x04000000, 0x00000005}, + {0x4A394B54, 0x08000000, 0x00000002}, + {0x4A394B59, 0x08000000, 0x00000002}, + {0x4A394C59, 0x04000000, 0x00000003}, + {0x4A394D41, 0x01000000, 0x00000002}, + {0x4A394D42, 0x04000000, 0x00000003}, + {0x4A394E41, 0x01000000, 0x00000001}, + {0x4A394E59, 0x02000000, 0x00000002}, + {0x4A394F41, 0x04000000, 0x00000002}, + {0x4A394F42, 0x04000000, 0x00000003}, + {0x4A394F59, 0x02000000, 0x00000003}, + {0x4A395041, 0x01000000, 0x00000002}, + {0x4A395059, 0x04000000, 0x00000003}, + {0x4A395141, 0x04000000, 0x00000001}, + {0x4A395142, 0x00800000, 0x00000002}, + {0x4A395143, 0x00800000, 0x00000002}, + {0x4A395241, 0x02000000, 0x00000002}, + {0x4A395243, 0x01000000, 0x00000002}, + {0x4A395259, 0x04000000, 0x00000002}, + {0x4A395359, 0x04000000, 0x00000003}, + {0x4A395541, 0x01000000, 0x00000002}, + {0x4A395559, 0x04000000, 0x00000002}, + {0x4A395659, 0x00800000, 0x00000001}, + {0x4A395841, 0x04000000, 0x00000002}, + {0x4A395843, 0x08000000, 0x00000003}, + {0x4A395859, 0x01000000, 0x00000003}, + {0x4A395941, 0x08000000, 0x00000003}, + {0x4A395959, 0x02000000, 0x00000002}, + {0x4A395A41, 0x02000000, 0x00000003}, + {0x4A395A42, 0x04000000, 0x00000002}, + {0x4A395A59, 0x02000000, 0x00000002}, + {0x4A413241, 0x04000000, 0x00000002}, + {0x4A413243, 0x08000000, 0x00000002}, + {0x4A413341, 0x04000000, 0x00000006}, + {0x4A413442, 0x01000000, 0x00000002}, + {0x4A413443, 0x04000000, 0x00000001}, + {0x4A413541, 0x04000000, 0x00000001}, + {0x4A413641, 0x02000000, 0x00000005}, + {0x4A413841, 0x00800000, 0x00000001}, + {0x4A414154, 0x02000000, 0x00000004}, + {0x4A414156, 0x02000000, 0x00000008}, + {0x4A414159, 0x04000000, 0x00000002}, + {0x4A414259, 0x02000000, 0x00000002}, + {0x4A414356, 0x04000000, 0x00000001}, + {0x4A414441, 0x04000000, 0x00000006}, + {0x4A414459, 0x02000000, 0x00000003}, + {0x4A414543, 0x02000000, 0x00000003}, + {0x4A414559, 0x02000000, 0x00000003}, + {0x4A414641, 0x04000000, 0x00000003}, + {0x4A414659, 0x02000000, 0x00000003}, + {0x4A414843, 0x04000000, 0x00000003}, + {0x4A414859, 0x01000000, 0x00000003}, + {0x4A414941, 0x04000000, 0x00000001}, + {0x4A414943, 0x08000000, 0x00000003}, + {0x4A414A41, 0x08000000, 0x00000003}, + {0x4A414A59, 0x04000000, 0x00000002}, + {0x4A414B41, 0x08000000, 0x00000005}, + {0x4A414B42, 0x08000000, 0x00000003}, + {0x4A414B59, 0x04000000, 0x00000003}, + {0x4A414C41, 0x04000000, 0x00000005}, + {0x4A414D41, 0x01000000, 0x00000002}, + {0x4A414D43, 0x08000000, 0x00000002}, + {0x4A414D59, 0x02000000, 0x00000002}, + {0x4A414E41, 0x02000000, 0x00000002}, + {0x4A414E59, 0x04000000, 0x00000002}, + {0x4A414F59, 0x02000000, 0x00000002}, + {0x4A415041, 0x04000000, 0x00000006}, + {0x4A415142, 0x01000000, 0x00000005}, + {0x4A415154, 0x08000000, 0x00000004}, + {0x4A415242, 0x04000000, 0x00000002}, + {0x4A415249, 0x10000000, 0x00000006}, + {0x4A415342, 0x04000000, 0x00000003}, + {0x4A415441, 0x01000000, 0x00000001}, + {0x4A415442, 0x08000000, 0x00000003}, + {0x4A415541, 0x04000000, 0x00000005}, + {0x4A415559, 0x04000000, 0x00000001}, + {0x4A415643, 0x04000000, 0x00000002}, + {0x4A415741, 0x04000000, 0x00000002}, + {0x4A415841, 0x08000000, 0x00000002}, + {0x4A415859, 0x04000000, 0x00000003}, + {0x4A415941, 0x00800000, 0x00000002}, + {0x4A415943, 0x04000000, 0x00000006}, + {0x4A415959, 0x02000000, 0x00000003}, + {0x4A415A41, 0x02000000, 0x00000002}, + {0x4A415A59, 0x01000000, 0x00000002}, + {0x4A423241, 0x01000000, 0x00000001}, + {0x4A423242, 0x08000000, 0x00000002}, + {0x4A423341, 0x08000000, 0x00000002}, + {0x4A423442, 0x04000000, 0x00000002}, + {0x4A423443, 0x01000000, 0x00000003}, + {0x4A423541, 0x04000000, 0x00000002}, + {0x4A423641, 0x02000000, 0x00000005}, + {0x4A424241, 0x01000000, 0x00000005}, + {0x4A424341, 0x04000000, 0x00000003}, + {0x4A424359, 0x04000000, 0x00000001}, + {0x4A424441, 0x04000000, 0x00000002}, + {0x4A424442, 0x04000000, 0x00000002}, + {0x4A424454, 0x04000000, 0x00000002}, + {0x4A424542, 0x10000000, 0x00000003}, + {0x4A424543, 0x02000000, 0x00000003}, + {0x4A424556, 0x02000000, 0x00000007}, + {0x4A424559, 0x02000000, 0x00000002}, + {0x4A424754, 0x08000000, 0x00000002}, + {0x4A424759, 0x01000000, 0x00000002}, + {0x4A424843, 0x04000000, 0x00000001}, + {0x4A424859, 0x04000000, 0x00000003}, + {0x4A424941, 0x08000000, 0x00000002}, + {0x4A424943, 0x01000000, 0x00000002}, + {0x4A424A41, 0x04000000, 0x00000005}, + {0x4A424A59, 0x04000000, 0x00000001}, + {0x4A424B41, 0x02000000, 0x00000003}, + {0x4A424B59, 0x04000000, 0x00000003}, + {0x4A424C41, 0x08000000, 0x00000003}, + {0x4A424C43, 0x04000000, 0x00000003}, + {0x4A424D41, 0x04000000, 0x00000002}, + {0x4A424E41, 0x04000000, 0x00000005}, + {0x4A424E42, 0x04000000, 0x00000003}, + {0x4A424E59, 0x04000000, 0x00000002}, + {0x4A424F42, 0x02000000, 0x00000001}, + {0x4A425041, 0x02000000, 0x00000001}, + {0x4A425059, 0x08000000, 0x00000003}, + {0x4A425141, 0x01000000, 0x00000001}, + {0x4A425142, 0x04000000, 0x00000002}, + {0x4A425154, 0x02000000, 0x00000003}, + {0x4A425241, 0x02000000, 0x00000001}, + {0x4A425243, 0x02000000, 0x00000005}, + {0x4A425249, 0x10000000, 0x00000006}, + {0x4A425259, 0x08000000, 0x00000003}, + {0x4A425341, 0x04000000, 0x00000002}, + {0x4A425441, 0x04000000, 0x00000002}, + {0x4A425442, 0x04000000, 0x00000002}, + {0x4A425459, 0x08000000, 0x00000003}, + {0x4A425541, 0x04000000, 0x00000005}, + {0x4A425643, 0x02000000, 0x00000003}, + {0x4A425659, 0x08000000, 0x00000002}, + {0x4A425841, 0x04000000, 0x00000008}, + {0x4A425859, 0x08000000, 0x00000003}, + {0x4A425941, 0x02000000, 0x00000002}, + {0x4A425959, 0x04000000, 0x00000005}, + {0x4A425A41, 0x00800000, 0x00000001}, + {0x4A425A42, 0x02000000, 0x00000003}, + {0x4A425A59, 0x02000000, 0x00000002}, + {0x4A433342, 0x04000000, 0x00000002}, + {0x4A433343, 0x02000000, 0x00000001}, + {0x4A433441, 0x01000000, 0x00000003}, + {0x4A433442, 0x08000000, 0x00000002}, + {0x4A433443, 0x01000000, 0x00000002}, + {0x4A433541, 0x01000000, 0x00000001}, + {0x4A433641, 0x02000000, 0x00000005}, + {0x4A433643, 0x10000000, 0x00000005}, + {0x4A433841, 0x02000000, 0x00000002}, + {0x4A434154, 0x02000000, 0x00000002}, + {0x4A434159, 0x04000000, 0x00000003}, + {0x4A434241, 0x02000000, 0x00000005}, + {0x4A434254, 0x00800000, 0x00000001}, + {0x4A434341, 0x02000000, 0x00000001}, + {0x4A434441, 0x01000000, 0x00000001}, + {0x4A434459, 0x08000000, 0x00000003}, + {0x4A434541, 0x00800000, 0x00000001}, + {0x4A434554, 0x08000000, 0x00000005}, + {0x4A434559, 0x02000000, 0x00000001}, + {0x4A434741, 0x04000000, 0x00000003}, + {0x4A434743, 0x04000000, 0x00000002}, + {0x4A434754, 0x04000000, 0x00000003}, + {0x4A434941, 0x01000000, 0x00000001}, + {0x4A434A41, 0x00800000, 0x00000002}, + {0x4A434B59, 0x02000000, 0x00000002}, + {0x4A434C56, 0x04000000, 0x00000002}, + {0x4A434D41, 0x02000000, 0x00000005}, + {0x4A434E41, 0x04000000, 0x00000002}, + {0x4A434E42, 0x08000000, 0x00000002}, + {0x4A434E43, 0x04000000, 0x00000002}, + {0x4A434F41, 0x01000000, 0x00000003}, + {0x4A434F42, 0x00800000, 0x00000003}, + {0x4A434F59, 0x02000000, 0x00000002}, + {0x4A435041, 0x01000000, 0x00000001}, + {0x4A435054, 0x08000000, 0x00000002}, + {0x4A435141, 0x04000000, 0x00000002}, + {0x4A435154, 0x08000000, 0x00000004}, + {0x4A435259, 0x08000000, 0x00000002}, + {0x4A435341, 0x04000000, 0x00000002}, + {0x4A435459, 0x08000000, 0x00000003}, + {0x4A435541, 0x04000000, 0x00000005}, + {0x4A435542, 0x04000000, 0x00000002}, + {0x4A435641, 0x04000000, 0x00000005}, + {0x4A435643, 0x02000000, 0x00000001}, + {0x4A435741, 0x04000000, 0x00000002}, + {0x4A435742, 0x02000000, 0x00000002}, + {0x4A435743, 0x02000000, 0x00000001}, + {0x4A435841, 0x02000000, 0x00000003}, + {0x4A435859, 0x04000000, 0x00000003}, + {0x4A435941, 0x04000000, 0x00000003}, + {0x4A435A41, 0x00800000, 0x00000001}, + {0x4A435A42, 0x02000000, 0x00000003}, + {0x4A435A43, 0x02000000, 0x00000002}, + {0x4A435A55, 0x08000000, 0xFFFFFFFF}, + {0x4A435A59, 0x01000000, 0x00000002}, + {0x4A443241, 0x02000000, 0x00000002}, + {0x4A443243, 0x04000000, 0x00000002}, + {0x4A443341, 0x08000000, 0x00000003}, + {0x4A443342, 0x04000000, 0x00000002}, + {0x4A443441, 0x04000000, 0x00000003}, + {0x4A443443, 0x04000000, 0x00000002}, + {0x4A443541, 0x00800000, 0x00000002}, + {0x4A443542, 0x04000000, 0x00000002}, + {0x4A443543, 0x02000000, 0x00000001}, + {0x4A443641, 0x04000000, 0x00000002}, + {0x4A443841, 0x04000000, 0x00000002}, + {0x4A444154, 0x08000000, 0x00000005}, + {0x4A444259, 0x08000000, 0x00000002}, + {0x4A444342, 0x04000000, 0x00000002}, + {0x4A444356, 0x04000000, 0x00000002}, + {0x4A444441, 0x01000000, 0x00000001}, + {0x4A444443, 0x04000000, 0x00000002}, + {0x4A444459, 0x01000000, 0x00000001}, + {0x4A444543, 0x04000000, 0x00000002}, + {0x4A444554, 0x02000000, 0x00000003}, + {0x4A444741, 0x02000000, 0x00000003}, + {0x4A444754, 0x10000000, 0x00000002}, + {0x4A444841, 0x04000000, 0x00000002}, + {0x4A444843, 0x08000000, 0x00000002}, + {0x4A444941, 0x02000000, 0x00000002}, + {0x4A444942, 0x08000000, 0x00000003}, + {0x4A444A41, 0x00800000, 0x00000002}, + {0x4A444A43, 0x00800000, 0x00000001}, + {0x4A444B41, 0x01000000, 0x00000002}, + {0x4A444B43, 0x02000000, 0x00000002}, + {0x4A444B54, 0x02000000, 0x00000002}, + {0x4A444B59, 0x08000000, 0x00000005}, + {0x4A444C41, 0x04000000, 0x00000005}, + {0x4A444C59, 0x04000000, 0x00000005}, + {0x4A444D59, 0x02000000, 0x00000003}, + {0x4A444E41, 0x01000000, 0x00000005}, + {0x4A444F41, 0x02000000, 0x00000003}, + {0x4A444F59, 0x04000000, 0x00000002}, + {0x4A445041, 0x01000000, 0x00000002}, + {0x4A445059, 0x02000000, 0x00000005}, + {0x4A445141, 0x02000000, 0x00000003}, + {0x4A445142, 0x04000000, 0x00000002}, + {0x4A445143, 0x01000000, 0x00000002}, + {0x4A445154, 0x02000000, 0x00000003}, + {0x4A445159, 0x02000000, 0x00000002}, + {0x4A445249, 0x20000000, 0x00000006}, + {0x4A445342, 0x04000000, 0x00000002}, + {0x4A445359, 0x04000000, 0x00000005}, + {0x4A445441, 0x01000000, 0x00000002}, + {0x4A445541, 0x04000000, 0x00000005}, + {0x4A445542, 0x01000000, 0x00000001}, + {0x4A445559, 0x01000000, 0x00000005}, + {0x4A445841, 0x01000000, 0x00000002}, + {0x4A445859, 0x02000000, 0x00000003}, + {0x4A445941, 0x04000000, 0x00000002}, + {0x4A445A43, 0x02000000, 0x00000002}, + {0x4A445A59, 0x04000000, 0x00000002}, + {0x4A453243, 0x02000000, 0x00000003}, + {0x4A453343, 0x02000000, 0x00000002}, + {0x4A453541, 0x04000000, 0x00000001}, + {0x4A453542, 0x10000000, 0x00000003}, + {0x4A453543, 0x02000000, 0x00000005}, + {0x4A453641, 0x04000000, 0x00000003}, + {0x4A453841, 0x00800000, 0x00000001}, + {0x4A454159, 0x08000000, 0x00000002}, + {0x4A454243, 0x02000000, 0x00000001}, + {0x4A454341, 0x01000000, 0x00000002}, + {0x4A454441, 0x08000000, 0x00000003}, + {0x4A454442, 0x04000000, 0x00000002}, + {0x4A454456, 0x10000000, 0x00000006}, + {0x4A454541, 0x04000000, 0x00000003}, + {0x4A454542, 0x10000000, 0x00000003}, + {0x4A454559, 0x08000000, 0x00000003}, + {0x4A454641, 0x04000000, 0x00000003}, + {0x4A454643, 0x02000000, 0x00000001}, + {0x4A454659, 0x04000000, 0x00000005}, + {0x4A454741, 0x01000000, 0x00000001}, + {0x4A454759, 0x04000000, 0x00000002}, + {0x4A454841, 0x08000000, 0x00000005}, + {0x4A454859, 0x08000000, 0x00000003}, + {0x4A454A41, 0x08000000, 0x00000003}, + {0x4A454A42, 0x02000000, 0x00000003}, + {0x4A454A43, 0x02000000, 0x00000003}, + {0x4A454B41, 0x04000000, 0x00000002}, + {0x4A454B43, 0x01000000, 0x00000002}, + {0x4A454B59, 0x04000000, 0x00000002}, + {0x4A454C41, 0x08000000, 0x00000002}, + {0x4A454C42, 0x04000000, 0x00000003}, + {0x4A454C59, 0x02000000, 0x00000001}, + {0x4A454D41, 0x02000000, 0x00000002}, + {0x4A454D42, 0x10000000, 0x00000003}, + {0x4A454D43, 0x04000000, 0x00000002}, + {0x4A454D59, 0x00800000, 0x00000002}, + {0x4A454E41, 0x04000000, 0x00000002}, + {0x4A454E43, 0x02000000, 0x00000002}, + {0x4A454F41, 0x04000000, 0x00000003}, + {0x4A454F42, 0x20000000, 0x00000003}, + {0x4A454F43, 0x01000000, 0x00000002}, + {0x4A455041, 0x04000000, 0x00000001}, + {0x4A455043, 0x02000000, 0x00000002}, + {0x4A455059, 0x04000000, 0x00000002}, + {0x4A455241, 0x02000000, 0x00000001}, + {0x4A455249, 0x20000000, 0x00000006}, + {0x4A455259, 0x02000000, 0x00000002}, + {0x4A455341, 0x04000000, 0x00000002}, + {0x4A455343, 0x04000000, 0x00000002}, + {0x4A455441, 0x02000000, 0x00000001}, + {0x4A455541, 0x04000000, 0x00000005}, + {0x4A455643, 0x04000000, 0x00000002}, + {0x4A455741, 0x04000000, 0x00000005}, + {0x4A455759, 0x01000000, 0x00000002}, + {0x4A455841, 0x00800000, 0x00000002}, + {0x4A455859, 0x02000000, 0x00000003}, + {0x4A455941, 0x04000000, 0x00000002}, + {0x4A455A41, 0x04000000, 0x00000006}, + {0x4A455A59, 0x02000000, 0x00000003}, + {0x4A463241, 0x08000000, 0x00000003}, + {0x4A463243, 0x08000000, 0x00000002}, + {0x4A463341, 0x04000000, 0x00000005}, + {0x4A463442, 0x04000000, 0x00000003}, + {0x4A463443, 0x01000000, 0x00000003}, + {0x4A463541, 0x04000000, 0x00000003}, + {0x4A463542, 0x04000000, 0x00000005}, + {0x4A463543, 0x04000000, 0x00000002}, + {0x4A463641, 0x08000000, 0x00000003}, + {0x4A463643, 0x10000000, 0x00000002}, + {0x4A463841, 0x00800000, 0x00000001}, + {0x4A464241, 0x01000000, 0x00000005}, + {0x4A464254, 0x04000000, 0x00000003}, + {0x4A464259, 0x08000000, 0x00000003}, + {0x4A464341, 0x04000000, 0x00000002}, + {0x4A464443, 0x04000000, 0x00000002}, + {0x4A464641, 0x08000000, 0x00000003}, + {0x4A464741, 0x04000000, 0x00000002}, + {0x4A464842, 0x10000000, 0x00000003}, + {0x4A464941, 0x04000000, 0x00000002}, + {0x4A464B41, 0x00800000, 0x00000001}, + {0x4A464B54, 0x04000000, 0x00000005}, + {0x4A464B59, 0x02000000, 0x00000001}, + {0x4A464C42, 0x10000000, 0x00000003}, + {0x4A464D44, 0x02000000, 0xFFFFFFFF}, + {0x4A464F41, 0x02000000, 0x00000003}, + {0x4A464F59, 0x02000000, 0x00000003}, + {0x4A465041, 0x04000000, 0x00000002}, + {0x4A465141, 0x04000000, 0x00000002}, + {0x4A465142, 0x04000000, 0x00000002}, + {0x4A465143, 0x02000000, 0x00000008}, + {0x4A465154, 0x02000000, 0x00000003}, + {0x4A465241, 0x08000000, 0x00000003}, + {0x4A465242, 0x08000000, 0x00000003}, + {0x4A465341, 0x02000000, 0x00000005}, + {0x4A465459, 0x08000000, 0x00000003}, + {0x4A465541, 0x04000000, 0x00000002}, + {0x4A465559, 0x04000000, 0x00000002}, + {0x4A465641, 0x01000000, 0x00000002}, + {0x4A465759, 0x02000000, 0x00000003}, + {0x4A465841, 0x08000000, 0x00000003}, + {0x4A465859, 0x02000000, 0x00000003}, + {0x4A465A59, 0x02000000, 0x00000002}, + {0x4A473241, 0x02000000, 0x00000003}, + {0x4A473243, 0x04000000, 0x00000002}, + {0x4A473256, 0x02000000, 0x00000006}, + {0x4A473341, 0x04000000, 0x00000005}, + {0x4A473342, 0x04000000, 0x00000002}, + {0x4A473441, 0x02000000, 0x00000002}, + {0x4A473442, 0x08000000, 0x00000002}, + {0x4A473443, 0x10000000, 0x00000003}, + {0x4A473542, 0x04000000, 0x00000006}, + {0x4A473543, 0x01000000, 0x00000002}, + {0x4A473641, 0x04000000, 0x00000002}, + {0x4A473643, 0x01000000, 0x00000003}, + {0x4A473841, 0x04000000, 0x00000002}, + {0x4A474342, 0x04000000, 0x00000002}, + {0x4A474343, 0x10000000, 0x00000003}, + {0x4A474356, 0x04000000, 0x00000002}, + {0x4A474441, 0x02000000, 0x00000005}, + {0x4A474442, 0x10000000, 0x00000002}, + {0x4A474443, 0x04000000, 0x00000006}, + {0x4A474543, 0x10000000, 0x00000003}, + {0x4A474559, 0x04000000, 0x00000003}, + {0x4A474643, 0x02000000, 0x00000002}, + {0x4A474741, 0x02000000, 0x00000002}, + {0x4A474743, 0x02000000, 0x00000002}, + {0x4A474841, 0x02000000, 0x00000003}, + {0x4A474843, 0x10000000, 0x00000003}, + {0x4A474854, 0x04000000, 0x00000002}, + {0x4A474859, 0x04000000, 0x00000003}, + {0x4A474941, 0x04000000, 0x00000003}, + {0x4A474943, 0x01000000, 0x00000002}, + {0x4A474A41, 0x00800000, 0x00000005}, + {0x4A474A59, 0x04000000, 0x00000002}, + {0x4A474B41, 0x02000000, 0x00000002}, + {0x4A474B54, 0x04000000, 0x00000002}, + {0x4A474B56, 0x02000000, 0x00000005}, + {0x4A474B59, 0x10000000, 0x00000003}, + {0x4A474C41, 0x04000000, 0x00000001}, + {0x4A474D41, 0x01000000, 0x00000001}, + {0x4A474E41, 0x08000000, 0x00000005}, + {0x4A474E42, 0x04000000, 0x00000005}, + {0x4A474E59, 0x08000000, 0x00000003}, + {0x4A474F59, 0x08000000, 0x00000003}, + {0x4A475041, 0x01000000, 0x00000001}, + {0x4A475043, 0x02000000, 0x00000003}, + {0x4A475049, 0x08000000, 0x00000006}, + {0x4A475054, 0x10000000, 0x00000003}, + {0x4A475056, 0x08000000, 0x00000002}, + {0x4A475141, 0x04000000, 0x00000002}, + {0x4A475143, 0x04000000, 0x00000002}, + {0x4A475154, 0x04000000, 0x00000004}, + {0x4A475241, 0x02000000, 0x00000005}, + {0x4A475242, 0x04000000, 0x00000002}, + {0x4A475254, 0x08000000, 0x00000002}, + {0x4A475259, 0x04000000, 0x00000002}, + {0x4A475341, 0x02000000, 0x00000005}, + {0x4A475343, 0x08000000, 0x00000003}, + {0x4A475441, 0x00800000, 0x00000002}, + {0x4A475442, 0x10000000, 0x00000003}, + {0x4A475443, 0x10000000, 0x00000003}, + {0x4A475459, 0x08000000, 0x00000003}, + {0x4A475559, 0x02000000, 0x00000003}, + {0x4A475641, 0x04000000, 0x00000002}, + {0x4A475659, 0x08000000, 0x00000002}, + {0x4A475741, 0x08000000, 0x00000005}, + {0x4A475743, 0x01000000, 0x00000002}, + {0x4A475859, 0x02000000, 0x00000003}, + {0x4A475941, 0x04000000, 0x00000002}, + {0x4A475942, 0x02000000, 0x00000002}, + {0x4A475943, 0x04000000, 0x00000001}, + {0x4A475959, 0x04000000, 0x00000002}, + {0x4A475A41, 0x01000000, 0x00000003}, + {0x4A475A59, 0x02000000, 0x00000002}, + {0x4A483241, 0x01000000, 0x00000005}, + {0x4A483342, 0x04000000, 0x00000002}, + {0x4A483441, 0x02000000, 0x00000002}, + {0x4A483443, 0x08000000, 0x00000002}, + {0x4A483641, 0x02000000, 0x00000002}, + {0x4A483643, 0x01000000, 0x00000001}, + {0x4A483841, 0x00800000, 0x00000001}, + {0x4A484241, 0x08000000, 0x00000002}, + {0x4A484341, 0x04000000, 0x00000005}, + {0x4A484354, 0x04000000, 0x00000002}, + {0x4A484359, 0x04000000, 0x00000005}, + {0x4A484441, 0x04000000, 0x00000005}, + {0x4A484443, 0x01000000, 0x00000002}, + {0x4A484541, 0x04000000, 0x00000002}, + {0x4A484543, 0x08000000, 0x00000002}, + {0x4A484641, 0x01000000, 0x00000002}, + {0x4A484759, 0x08000000, 0x00000001}, + {0x4A484843, 0x01000000, 0x00000003}, + {0x4A484859, 0x02000000, 0x00000002}, + {0x4A484941, 0x08000000, 0x00000002}, + {0x4A484A41, 0x01000000, 0x00000002}, + {0x4A484A43, 0x04000000, 0x00000003}, + {0x4A484A54, 0x04000000, 0x00000005}, + {0x4A484A59, 0x01000000, 0x00000002}, + {0x4A484B41, 0x04000000, 0x00000002}, + {0x4A484B42, 0x04000000, 0x00000003}, + {0x4A484B59, 0x08000000, 0x00000005}, + {0x4A484C41, 0x02000000, 0x00000001}, + {0x4A484C59, 0x04000000, 0x00000002}, + {0x4A484D41, 0x04000000, 0x00000005}, + {0x4A484D59, 0x04000000, 0x00000003}, + {0x4A484E41, 0x08000000, 0x00000006}, + {0x4A484E42, 0x01000000, 0x00000002}, + {0x4A484E59, 0x02000000, 0x00000003}, + {0x4A484F41, 0x02000000, 0x00000003}, + {0x4A484F42, 0x00800000, 0x00000003}, + {0x4A484F43, 0x10000000, 0x00000002}, + {0x4A484F59, 0x02000000, 0x00000002}, + {0x4A485041, 0x02000000, 0x00000003}, + {0x4A485042, 0x02000000, 0x00000005}, + {0x4A485054, 0x04000000, 0x00000005}, + {0x4A485141, 0x04000000, 0x00000002}, + {0x4A485143, 0x04000000, 0x00000001}, + {0x4A485154, 0x08000000, 0x00000004}, + {0x4A485159, 0x01000000, 0x00000002}, + {0x4A485242, 0x08000000, 0x00000002}, + {0x4A485259, 0x02000000, 0x00000001}, + {0x4A485341, 0x02000000, 0x00000002}, + {0x4A485343, 0x02000000, 0x00000002}, + {0x4A485443, 0x01000000, 0x00000002}, + {0x4A485459, 0x08000000, 0x00000003}, + {0x4A485541, 0x01000000, 0x00000001}, + {0x4A485543, 0x02000000, 0x00000003}, + {0x4A485659, 0x01000000, 0x00000003}, + {0x4A485841, 0x01000000, 0x00000003}, + {0x4A485856, 0x08000000, 0x00000002}, + {0x4A485859, 0x02000000, 0x00000003}, + {0x4A485941, 0x04000000, 0x00000002}, + {0x4A485A41, 0x04000000, 0x00000002}, + {0x4A493241, 0x01000000, 0x00000005}, + {0x4A493341, 0x08000000, 0x00000002}, + {0x4A493342, 0x04000000, 0x00000002}, + {0x4A493442, 0x08000000, 0x00000005}, + {0x4A493443, 0x04000000, 0x00000002}, + {0x4A493543, 0x04000000, 0x00000002}, + {0x4A493641, 0x08000000, 0x00000003}, + {0x4A493841, 0x02000000, 0x00000002}, + {0x4A494143, 0x02000000, 0x00000002}, + {0x4A494241, 0x00800000, 0x00000005}, + {0x4A494259, 0x04000000, 0x00000002}, + {0x4A494341, 0x01000000, 0x00000002}, + {0x4A494441, 0x08000000, 0x00000001}, + {0x4A494459, 0x04000000, 0x00000002}, + {0x4A494555, 0x04000000, 0x00000002}, + {0x4A494559, 0x04000000, 0x00000002}, + {0x4A494643, 0x08000000, 0x00000003}, + {0x4A494841, 0x04000000, 0x00000003}, + {0x4A494843, 0x10000000, 0x00000003}, + {0x4A494859, 0x04000000, 0x00000001}, + {0x4A494941, 0x01000000, 0x00000002}, + {0x4A494959, 0x00800000, 0x00000001}, + {0x4A494B42, 0x08000000, 0x00000007}, + {0x4A494B59, 0x04000000, 0x00000003}, + {0x4A494C42, 0x04000000, 0x00000003}, + {0x4A494C59, 0x04000000, 0x00000002}, + {0x4A494D41, 0x00800000, 0x00000002}, + {0x4A494E41, 0x08000000, 0x00000005}, + {0x4A494F41, 0x02000000, 0x00000006}, + {0x4A494F43, 0x10000000, 0x00000002}, + {0x4A495041, 0x04000000, 0x00000005}, + {0x4A495059, 0x01000000, 0x00000003}, + {0x4A495141, 0x02000000, 0x00000005}, + {0x4A495142, 0x08000000, 0x00000002}, + {0x4A495143, 0x01000000, 0x00000002}, + {0x4A495241, 0x01000000, 0x00000001}, + {0x4A495242, 0x04000000, 0x00000001}, + {0x4A495243, 0x02000000, 0x00000002}, + {0x4A495341, 0x02000000, 0x00000002}, + {0x4A495441, 0x01000000, 0x00000008}, + {0x4A495459, 0x08000000, 0x00000003}, + {0x4A495559, 0x01000000, 0x00000002}, + {0x4A495641, 0x02000000, 0x00000001}, + {0x4A495642, 0x04000000, 0x00000002}, + {0x4A495643, 0x04000000, 0x00000002}, + {0x4A495659, 0x08000000, 0x00000003}, + {0x4A495741, 0x08000000, 0x00000005}, + {0x4A495759, 0x02000000, 0x00000002}, + {0x4A495841, 0x02000000, 0x00000002}, + {0x4A495843, 0x04000000, 0x00000005}, + {0x4A495859, 0x02000000, 0x00000003}, + {0x4A495941, 0x01000000, 0x00000001}, + {0x4A495A41, 0x00800000, 0x00000002}, + {0x4A495A59, 0x01000000, 0x00000002}, + {0x4A4A3241, 0x04000000, 0x00000003}, + {0x4A4A3242, 0x10000000, 0x00000003}, + {0x4A4A3343, 0x10000000, 0x00000003}, + {0x4A4A3441, 0x00800000, 0x00000002}, + {0x4A4A3543, 0x01000000, 0x00000002}, + {0x4A4A3641, 0x04000000, 0x00000002}, + {0x4A4A3842, 0x10000000, 0x00000005}, + {0x4A4A4241, 0x04000000, 0x00000005}, + {0x4A4A4242, 0x04000000, 0x00000003}, + {0x4A4A4441, 0x04000000, 0x00000005}, + {0x4A4A4541, 0x02000000, 0x00000002}, + {0x4A4A4659, 0x04000000, 0x00000003}, + {0x4A4A4843, 0x04000000, 0x00000002}, + {0x4A4A4859, 0x00800000, 0x00000003}, + {0x4A4A4941, 0x02000000, 0x00000003}, + {0x4A4A4A59, 0x04000000, 0x00000002}, + {0x4A4A4B41, 0x01000000, 0x00000003}, + {0x4A4A4B42, 0x01000000, 0x00000002}, + {0x4A4A4B59, 0x08000000, 0x00000002}, + {0x4A4A4C43, 0x08000000, 0x00000002}, + {0x4A4A4D41, 0x02000000, 0x00000005}, + {0x4A4A4D59, 0x04000000, 0x00000001}, + {0x4A4A4F41, 0x02000000, 0x00000002}, + {0x4A4A4F42, 0x04000000, 0x00000002}, + {0x4A4A4F59, 0x01000000, 0x00000002}, + {0x4A4A5041, 0x04000000, 0x00000005}, + {0x4A4A5059, 0x04000000, 0x00000005}, + {0x4A4A5142, 0x02000000, 0x00000003}, + {0x4A4A5154, 0x04000000, 0x00000003}, + {0x4A4A5241, 0x08000000, 0x00000003}, + {0x4A4A5242, 0x08000000, 0x00000003}, + {0x4A4A5341, 0x04000000, 0x00000005}, + {0x4A4A5343, 0x08000000, 0x00000002}, + {0x4A4A5443, 0x08000000, 0x00000002}, + {0x4A4A5559, 0x04000000, 0x00000001}, + {0x4A4A5641, 0x04000000, 0x00000002}, + {0x4A4A5643, 0x04000000, 0x00000002}, + {0x4A4A5841, 0x04000000, 0x00000003}, + {0x4A4A5859, 0x08000000, 0x00000005}, + {0x4A4A5941, 0x02000000, 0x00000005}, + {0x4A4A5943, 0x04000000, 0x00000002}, + {0x4A4A5959, 0x01000000, 0x00000002}, + {0x4A4A5A59, 0x01000000, 0x00000002}, + {0x4A4B3241, 0x04000000, 0x00000005}, + {0x4A4B3242, 0x20000000, 0x00000003}, + {0x4A4B3341, 0x00800000, 0x00000003}, + {0x4A4B3343, 0x00800000, 0x00000003}, + {0x4A4B3441, 0x00800000, 0x00000002}, + {0x4A4B3442, 0x01000000, 0x00000002}, + {0x4A4B3541, 0x01000000, 0x00000003}, + {0x4A4B3542, 0x04000000, 0x00000002}, + {0x4A4B3543, 0x04000000, 0x00000002}, + {0x4A4B3641, 0x08000000, 0x00000003}, + {0x4A4B3643, 0x04000000, 0x00000002}, + {0x4A4B3742, 0x04000000, 0x00000002}, + {0x4A4B3743, 0x04000000, 0x00000002}, + {0x4A4B3841, 0x02000000, 0x00000003}, + {0x4A4B4154, 0x04000000, 0x00000002}, + {0x4A4B4241, 0x01000000, 0x00000001}, + {0x4A4B4243, 0x04000000, 0x00000002}, + {0x4A4B4341, 0x02000000, 0x00000005}, + {0x4A4B4342, 0x04000000, 0x00000002}, + {0x4A4B4354, 0x02000000, 0x00000001}, + {0x4A4B4441, 0x04000000, 0x00000005}, + {0x4A4B4443, 0x01000000, 0x00000002}, + {0x4A4B4459, 0x01000000, 0x00000002}, + {0x4A4B4542, 0x08000000, 0x00000003}, + {0x4A4B4543, 0x04000000, 0x00000002}, + {0x4A4B4559, 0x08000000, 0x00000005}, + {0x4A4B4659, 0x04000000, 0x00000002}, + {0x4A4B4743, 0x02000000, 0x00000001}, + {0x4A4B4754, 0x04000000, 0x00000001}, + {0x4A4B4841, 0x04000000, 0x00000003}, + {0x4A4B4842, 0x01000000, 0x00000002}, + {0x4A4B4859, 0x01000000, 0x00000002}, + {0x4A4B4941, 0x02000000, 0x00000002}, + {0x4A4B4942, 0x04000000, 0x00000005}, + {0x4A4B4943, 0x04000000, 0x00000001}, + {0x4A4B4959, 0x02000000, 0x00000005}, + {0x4A4B4A41, 0x08000000, 0x00000002}, + {0x4A4B4A42, 0x01000000, 0x00000002}, + {0x4A4B4A43, 0x08000000, 0x00000003}, + {0x4A4B4B41, 0x01000000, 0x00000003}, + {0x4A4B4B42, 0x08000000, 0x00000003}, + {0x4A4B4B43, 0x10000000, 0x00000002}, + {0x4A4B4B59, 0x02000000, 0x00000002}, + {0x4A4B4C41, 0x08000000, 0x00000003}, + {0x4A4B4C59, 0x02000000, 0x00000002}, + {0x4A4B4D41, 0x00800000, 0x00000002}, + {0x4A4B4D54, 0x04000000, 0x00000002}, + {0x4A4B4D59, 0x08000000, 0x00000001}, + {0x4A4B4E41, 0x00800000, 0x00000001}, + {0x4A4B4E42, 0x02000000, 0x00000003}, + {0x4A4B4E43, 0x04000000, 0x00000002}, + {0x4A4B4E59, 0x04000000, 0x00000002}, + {0x4A4B4F42, 0x10000000, 0x00000002}, + {0x4A4B4F43, 0x00800000, 0x00000002}, + {0x4A4B4F59, 0x01000000, 0x00000002}, + {0x4A4B5041, 0x02000000, 0x00000005}, + {0x4A4B5049, 0x08000000, 0x00000006}, + {0x4A4B5059, 0x04000000, 0x00000002}, + {0x4A4B5141, 0x02000000, 0x00000002}, + {0x4A4B5154, 0x02000000, 0x00000003}, + {0x4A4B5241, 0x04000000, 0x00000002}, + {0x4A4B5341, 0x04000000, 0x00000002}, + {0x4A4B5342, 0x08000000, 0x00000003}, + {0x4A4B5343, 0x08000000, 0x00000003}, + {0x4A4B5359, 0x08000000, 0x00000003}, + {0x4A4B5441, 0x04000000, 0x00000002}, + {0x4A4B5443, 0x08000000, 0x00000002}, + {0x4A4B5459, 0x04000000, 0x00000003}, + {0x4A4B5541, 0x01000000, 0x00000001}, + {0x4A4B5542, 0x08000000, 0x00000002}, + {0x4A4B5543, 0x08000000, 0x00000002}, + {0x4A4B5641, 0x01000000, 0x00000001}, + {0x4A4B5743, 0x02000000, 0x00000003}, + {0x4A4B5841, 0x01000000, 0x00000002}, + {0x4A4B5859, 0x08000000, 0x00000005}, + {0x4A4B5941, 0x02000000, 0x00000005}, + {0x4A4B5959, 0x04000000, 0x00000002}, + {0x4A4B5A41, 0x00800000, 0x00000002}, + {0x4A4B5A42, 0x02000000, 0x00000003}, + {0x4A4B5A43, 0x04000000, 0x00000002}, + {0x4A4B5A59, 0x10000000, 0x00000003}, + {0x4A4C3243, 0x04000000, 0x00000002}, + {0x4A4C3341, 0x00800000, 0x00000002}, + {0x4A4C3342, 0x20000000, 0x00000003}, + {0x4A4C3441, 0x01000000, 0x00000002}, + {0x4A4C3442, 0x02000000, 0x00000002}, + {0x4A4C3641, 0x00800000, 0x00000002}, + {0x4A4C4142, 0x10000000, 0x00000003}, + {0x4A4C4159, 0x02000000, 0x00000003}, + {0x4A4C4241, 0x08000000, 0x00000002}, + {0x4A4C4341, 0x04000000, 0x00000003}, + {0x4A4C4342, 0x01000000, 0x00000002}, + {0x4A4C4441, 0x04000000, 0x00000003}, + {0x4A4C4541, 0x04000000, 0x00000002}, + {0x4A4C4542, 0x02000000, 0x00000002}, + {0x4A4C4559, 0x02000000, 0x00000001}, + {0x4A4C4654, 0x08000000, 0x00000003}, + {0x4A4C4659, 0x04000000, 0x00000003}, + {0x4A4C4741, 0x02000000, 0x00000001}, + {0x4A4C4841, 0x01000000, 0x00000003}, + {0x4A4C4843, 0x04000000, 0x00000002}, + {0x4A4C4854, 0x20000000, 0x00000002}, + {0x4A4C4859, 0x08000000, 0x00000003}, + {0x4A4C4941, 0x00800000, 0x00000002}, + {0x4A4C4943, 0x02000000, 0x00000001}, + {0x4A4C4959, 0x10000000, 0x00000002}, + {0x4A4C4B41, 0x04000000, 0x00000005}, + {0x4A4C4B42, 0x10000000, 0x00000002}, + {0x4A4C4C41, 0x00800000, 0x00000003}, + {0x4A4C4C59, 0x00800000, 0x00000002}, + {0x4A4C4E43, 0x04000000, 0x00000001}, + {0x4A4C4F42, 0x01000000, 0x00000003}, + {0x4A4C4F43, 0x08000000, 0x00000003}, + {0x4A4C4F59, 0x08000000, 0x00000002}, + {0x4A4C5041, 0x00800000, 0x00000002}, + {0x4A4C5056, 0x08000000, 0x00000006}, + {0x4A4C5154, 0x02000000, 0x00000003}, + {0x4A4C5241, 0x01000000, 0x00000005}, + {0x4A4C5342, 0x02000000, 0x00000003}, + {0x4A4C5359, 0x10000000, 0x00000005}, + {0x4A4C5559, 0x04000000, 0x00000002}, + {0x4A4C5641, 0x02000000, 0x00000002}, + {0x4A4C5642, 0x04000000, 0x00000002}, + {0x4A4C5659, 0x04000000, 0x00000003}, + {0x4A4C5741, 0x08000000, 0x00000003}, + {0x4A4C5759, 0x02000000, 0x00000001}, + {0x4A4C5859, 0x08000000, 0x00000005}, + {0x4A4C5A41, 0x08000000, 0x00000007}, + {0x4A4C5A59, 0x08000000, 0x00000001}, + {0x4A4D3341, 0x08000000, 0x00000002}, + {0x4A4D3541, 0x02000000, 0x00000002}, + {0x4A4D3842, 0x10000000, 0x00000005}, + {0x4A4D4241, 0x00800000, 0x00000001}, + {0x4A4D4259, 0x01000000, 0x00000002}, + {0x4A4D4341, 0x01000000, 0x00000001}, + {0x4A4D4354, 0x04000000, 0x00000002}, + {0x4A4D4441, 0x02000000, 0x00000005}, + {0x4A4D4541, 0x08000000, 0x00000003}, + {0x4A4D4559, 0x02000000, 0x00000003}, + {0x4A4D4641, 0x04000000, 0x00000002}, + {0x4A4D4643, 0x04000000, 0x00000003}, + {0x4A4D4659, 0x04000000, 0x00000003}, + {0x4A4D4743, 0x08000000, 0x00000003}, + {0x4A4D4759, 0x04000000, 0x00000002}, + {0x4A4D4841, 0x02000000, 0x00000002}, + {0x4A4D4854, 0x10000000, 0x00000005}, + {0x4A4D4859, 0x02000000, 0x00000002}, + {0x4A4D4941, 0x01000000, 0x00000005}, + {0x4A4D4942, 0x04000000, 0x00000005}, + {0x4A4D4956, 0x10000000, 0x00000003}, + {0x4A4D4A41, 0x01000000, 0x00000003}, + {0x4A4D4A42, 0x04000000, 0x00000001}, + {0x4A4D4B41, 0x08000000, 0x00000003}, + {0x4A4D4B42, 0x02000000, 0x00000002}, + {0x4A4D4B43, 0x01000000, 0x00000003}, + {0x4A4D4B54, 0x04000000, 0x00000005}, + {0x4A4D4B59, 0x01000000, 0x00000005}, + {0x4A4D4C43, 0x08000000, 0x00000003}, + {0x4A4D4D41, 0x00800000, 0x00000001}, + {0x4A4D4D43, 0x02000000, 0x00000003}, + {0x4A4D4D56, 0x04000000, 0x00000003}, + {0x4A4D4E41, 0x02000000, 0x00000005}, + {0x4A4D4E59, 0x01000000, 0x00000002}, + {0x4A4D4F41, 0x01000000, 0x00000002}, + {0x4A4D4F59, 0x04000000, 0x00000002}, + {0x4A4D5041, 0x01000000, 0x00000001}, + {0x4A4D5043, 0x04000000, 0x00000002}, + {0x4A4D5142, 0x01000000, 0x00000001}, + {0x4A4D5154, 0x08000000, 0x00000004}, + {0x4A4D5159, 0x04000000, 0x00000002}, + {0x4A4D5241, 0x04000000, 0x00000002}, + {0x4A4D5242, 0x01000000, 0x00000002}, + {0x4A4D5243, 0x02000000, 0x00000003}, + {0x4A4D5341, 0x01000000, 0x00000002}, + {0x4A4D5359, 0x08000000, 0x00000003}, + {0x4A4D5441, 0x08000000, 0x00000002}, + {0x4A4D5443, 0x04000000, 0x00000002}, + {0x4A4D5459, 0x04000000, 0x00000002}, + {0x4A4D5541, 0x02000000, 0x00000005}, + {0x4A4D5543, 0x02000000, 0x00000002}, + {0x4A4D5559, 0x00800000, 0x00000002}, + {0x4A4D5641, 0x04000000, 0x00000006}, + {0x4A4D5743, 0x10000000, 0x00000003}, + {0x4A4D5843, 0x04000000, 0x00000003}, + {0x4A4D5859, 0x02000000, 0x00000003}, + {0x4A4D5941, 0x01000000, 0x00000003}, + {0x4A4D5942, 0x04000000, 0x00000002}, + {0x4A4D5943, 0x02000000, 0x00000002}, + {0x4A4D5959, 0x10000000, 0x00000003}, + {0x4A4D5A41, 0x01000000, 0x00000002}, + {0x4A4D5A42, 0x04000000, 0x00000006}, + {0x4A4D5A59, 0x01000000, 0x00000002}, + {0x4A4E3242, 0x02000000, 0x00000001}, + {0x4A4E3343, 0x04000000, 0x00000003}, + {0x4A4E3441, 0x00800000, 0x00000002}, + {0x4A4E3442, 0x00800000, 0x00000002}, + {0x4A4E3443, 0x04000000, 0x00000003}, + {0x4A4E3641, 0x08000000, 0x00000003}, + {0x4A4E3841, 0x02000000, 0x00000005}, + {0x4A4E4156, 0x02000000, 0x00000007}, + {0x4A4E4159, 0x04000000, 0x00000002}, + {0x4A4E4241, 0x04000000, 0x00000002}, + {0x4A4E4259, 0x02000000, 0x00000007}, + {0x4A4E4341, 0x01000000, 0x00000002}, + {0x4A4E4342, 0x08000000, 0x00000005}, + {0x4A4E4359, 0x08000000, 0x00000001}, + {0x4A4E4441, 0x04000000, 0x00000003}, + {0x4A4E4442, 0x04000000, 0x00000003}, + {0x4A4E4459, 0x04000000, 0x00000002}, + {0x4A4E4541, 0x04000000, 0x00000002}, + {0x4A4E4554, 0x20000000, 0x00000002}, + {0x4A4E4641, 0x02000000, 0x00000002}, + {0x4A4E4643, 0x04000000, 0x00000002}, + {0x4A4E4842, 0x10000000, 0x00000002}, + {0x4A4E4859, 0x04000000, 0x00000003}, + {0x4A4E4941, 0x04000000, 0x00000002}, + {0x4A4E4943, 0x08000000, 0x00000002}, + {0x4A4E4959, 0x00800000, 0x00000001}, + {0x4A4E4A41, 0x02000000, 0x00000002}, + {0x4A4E4A59, 0x04000000, 0x00000002}, + {0x4A4E4B41, 0x01000000, 0x00000001}, + {0x4A4E4B43, 0x08000000, 0x00000002}, + {0x4A4E4B54, 0x04000000, 0x00000002}, + {0x4A4E4B56, 0x02000000, 0x00000003}, + {0x4A4E4B59, 0x01000000, 0x00000002}, + {0x4A4E4D41, 0x01000000, 0x00000005}, + {0x4A4E4E41, 0x04000000, 0x00000003}, + {0x4A4E4E42, 0x04000000, 0x00000002}, + {0x4A4E4E59, 0x08000000, 0x00000003}, + {0x4A4E4F41, 0x02000000, 0x00000005}, + {0x4A4E4F42, 0x08000000, 0x00000003}, + {0x4A4E4F43, 0x01000000, 0x00000005}, + {0x4A4E4F59, 0x01000000, 0x00000003}, + {0x4A4E5041, 0x02000000, 0x00000001}, + {0x4A4E5141, 0x01000000, 0x00000002}, + {0x4A4E5143, 0x02000000, 0x00000002}, + {0x4A4E5154, 0x04000000, 0x00000000}, + {0x4A4E5159, 0x04000000, 0x00000002}, + {0x4A4E5241, 0x01000000, 0x00000001}, + {0x4A4E5341, 0x00800000, 0x00000002}, + {0x4A4E5459, 0x08000000, 0x00000003}, + {0x4A4E5541, 0x00800000, 0x00000002}, + {0x4A4E5543, 0x10000000, 0x00000003}, + {0x4A4E5559, 0x04000000, 0x00000003}, + {0x4A4E5641, 0x08000000, 0x00000002}, + {0x4A4E5741, 0x08000000, 0x00000002}, + {0x4A4E5742, 0x02000000, 0x00000002}, + {0x4A4E5743, 0x04000000, 0x00000002}, + {0x4A4E5841, 0x00800000, 0x00000002}, + {0x4A4E5859, 0x02000000, 0x00000003}, + {0x4A4E5941, 0x04000000, 0x00000003}, + {0x4A4E5942, 0x04000000, 0x00000003}, + {0x4A4E5959, 0x02000000, 0x00000001}, + {0x4A4E5A59, 0x04000000, 0x00000002}, + {0x4A4F3241, 0x04000000, 0x00000003}, + {0x4A4F3242, 0x02000000, 0x00000005}, + {0x4A4F3341, 0x00800000, 0x00000001}, + {0x4A4F3343, 0x08000000, 0x00000002}, + {0x4A4F3441, 0x02000000, 0x00000005}, + {0x4A4F3641, 0x02000000, 0x00000002}, + {0x4A4F3643, 0x08000000, 0x00000003}, + {0x4A4F4242, 0x00800000, 0x00000001}, + {0x4A4F4243, 0x02000000, 0x00000005}, + {0x4A4F4341, 0x04000000, 0x00000005}, + {0x4A4F4359, 0x04000000, 0x00000001}, + {0x4A4F4459, 0x02000000, 0x00000002}, + {0x4A4F4541, 0x02000000, 0x00000001}, + {0x4A4F4559, 0x04000000, 0x00000003}, + {0x4A4F4641, 0x04000000, 0x00000003}, + {0x4A4F4741, 0x04000000, 0x00000005}, + {0x4A4F4841, 0x01000000, 0x00000002}, + {0x4A4F4859, 0x01000000, 0x00000002}, + {0x4A4F4941, 0x08000000, 0x00000005}, + {0x4A4F4B41, 0x08000000, 0x00000003}, + {0x4A4F4B59, 0x02000000, 0x00000006}, + {0x4A4F4C43, 0x01000000, 0x00000001}, + {0x4A4F4D41, 0x04000000, 0x00000002}, + {0x4A4F4D42, 0x08000000, 0x00000005}, + {0x4A4F4D43, 0x02000000, 0x00000003}, + {0x4A4F4E41, 0x02000000, 0x00000002}, + {0x4A4F4E43, 0x04000000, 0x00000002}, + {0x4A4F4F41, 0x01000000, 0x00000002}, + {0x4A4F4F42, 0x08000000, 0x00000002}, + {0x4A4F4F59, 0x04000000, 0x00000003}, + {0x4A4F5041, 0x04000000, 0x00000001}, + {0x4A4F5042, 0x04000000, 0x00000003}, + {0x4A4F5059, 0x04000000, 0x00000003}, + {0x4A4F5141, 0x04000000, 0x00000003}, + {0x4A4F5241, 0x08000000, 0x00000003}, + {0x4A4F5242, 0x04000000, 0x00000003}, + {0x4A4F5259, 0x04000000, 0x00000002}, + {0x4A4F5441, 0x04000000, 0x00000002}, + {0x4A4F5442, 0x04000000, 0x00000002}, + {0x4A4F5443, 0x04000000, 0x00000001}, + {0x4A4F5459, 0x04000000, 0x00000002}, + {0x4A4F5559, 0x10000000, 0x00000003}, + {0x4A4F5641, 0x01000000, 0x00000003}, + {0x4A4F5659, 0x02000000, 0x00000002}, + {0x4A4F5842, 0x04000000, 0x00000003}, + {0x4A4F5859, 0x04000000, 0x00000005}, + {0x4A4F5941, 0x04000000, 0x00000003}, + {0x4A4F5942, 0x04000000, 0x00000003}, + {0x4A4F5A59, 0x08000000, 0x00000002}, + {0x4A503242, 0x04000000, 0x00000005}, + {0x4A503243, 0x04000000, 0x00000003}, + {0x4A503341, 0x02000000, 0x00000001}, + {0x4A503443, 0x01000000, 0x00000002}, + {0x4A503541, 0x04000000, 0x00000001}, + {0x4A503542, 0x10000000, 0x00000001}, + {0x4A503543, 0x02000000, 0x00000002}, + {0x4A503641, 0x00800000, 0x00000003}, + {0x4A503643, 0x02000000, 0x00000007}, + {0x4A503742, 0x08000000, 0x00000003}, + {0x4A503841, 0x02000000, 0x00000002}, + {0x4A503842, 0x02000000, 0x00000003}, + {0x4A504142, 0x04000000, 0x00000001}, + {0x4A504341, 0x00800000, 0x00000002}, + {0x4A504356, 0x04000000, 0x00000003}, + {0x4A504359, 0x04000000, 0x00000001}, + {0x4A504441, 0x00800000, 0x00000002}, + {0x4A504459, 0x02000000, 0x00000001}, + {0x4A504541, 0x01000000, 0x00000003}, + {0x4A504641, 0x04000000, 0x00000001}, + {0x4A504642, 0x04000000, 0x00000002}, + {0x4A504654, 0x04000000, 0x00000005}, + {0x4A504741, 0x04000000, 0x00000002}, + {0x4A504759, 0x02000000, 0x00000003}, + {0x4A504841, 0x04000000, 0x00000001}, + {0x4A504843, 0x01000000, 0x00000001}, + {0x4A504859, 0x01000000, 0x00000002}, + {0x4A504942, 0x04000000, 0x00000002}, + {0x4A504943, 0x02000000, 0x00000002}, + {0x4A504959, 0x04000000, 0x00000001}, + {0x4A504A42, 0x02000000, 0x00000002}, + {0x4A504B42, 0x04000000, 0x00000002}, + {0x4A504B56, 0x02000000, 0x00000005}, + {0x4A504C59, 0x00800000, 0x00000002}, + {0x4A504D54, 0x08000000, 0x00000003}, + {0x4A504D59, 0x08000000, 0x00000005}, + {0x4A505042, 0x04000000, 0x00000005}, + {0x4A505054, 0x04000000, 0x00000007}, + {0x4A505059, 0x01000000, 0x00000001}, + {0x4A505142, 0x04000000, 0x00000002}, + {0x4A505159, 0x02000000, 0x00000002}, + {0x4A505242, 0x08000000, 0x00000003}, + {0x4A505341, 0x02000000, 0x00000003}, + {0x4A505343, 0x02000000, 0x00000003}, + {0x4A505359, 0x02000000, 0x00000005}, + {0x4A505441, 0x04000000, 0x00000005}, + {0x4A505541, 0x00800000, 0x00000001}, + {0x4A505559, 0x04000000, 0x00000002}, + {0x4A505641, 0x04000000, 0x00000002}, + {0x4A505643, 0x10000000, 0x00000002}, + {0x4A505659, 0x08000000, 0x00000003}, + {0x4A505759, 0x04000000, 0x00000002}, + {0x4A505841, 0x02000000, 0x00000005}, + {0x4A505842, 0x04000000, 0x00000002}, + {0x4A505859, 0x02000000, 0x00000003}, + {0x4A505A41, 0x01000000, 0x00000002}, + {0x4A505A55, 0x08000000, 0x00000003}, + {0x4A505A59, 0x02000000, 0x00000002}, + {0x4A513242, 0x04000000, 0x00000001}, + {0x4A513341, 0x04000000, 0x00000003}, + {0x4A513441, 0x01000000, 0x00000001}, + {0x4A513442, 0x02000000, 0x00000002}, + {0x4A513541, 0x01000000, 0x00000001}, + {0x4A513641, 0x01000000, 0x00000001}, + {0x4A513742, 0x04000000, 0x00000005}, + {0x4A513841, 0x02000000, 0x00000005}, + {0x4A514154, 0x04000000, 0x00000004}, + {0x4A514159, 0x04000000, 0x00000003}, + {0x4A514254, 0x04000000, 0x00000002}, + {0x4A514341, 0x02000000, 0x00000001}, + {0x4A514359, 0x04000000, 0x00000002}, + {0x4A514441, 0x04000000, 0x00000002}, + {0x4A514443, 0x08000000, 0x00000001}, + {0x4A514459, 0x10000000, 0x00000003}, + {0x4A514541, 0x00800000, 0x00000002}, + {0x4A514542, 0x04000000, 0x00000002}, + {0x4A514641, 0x02000000, 0x00000002}, + {0x4A514654, 0x04000000, 0x00000007}, + {0x4A514659, 0x04000000, 0x00000002}, + {0x4A514842, 0x04000000, 0x00000002}, + {0x4A514859, 0x04000000, 0x00000003}, + {0x4A514941, 0x00800000, 0x00000002}, + {0x4A514959, 0x08000000, 0x00000002}, + {0x4A514A41, 0x02000000, 0x00000002}, + {0x4A514B41, 0x02000000, 0x00000001}, + {0x4A514B59, 0x04000000, 0x00000003}, + {0x4A514D41, 0x04000000, 0x00000005}, + {0x4A514E41, 0x00800000, 0x00000002}, + {0x4A514E43, 0x02000000, 0x00000003}, + {0x4A514E59, 0x00800000, 0x00000002}, + {0x4A514F41, 0x04000000, 0x00000001}, + {0x4A514F42, 0x02000000, 0x00000005}, + {0x4A514F59, 0x08000000, 0x00000002}, + {0x4A515054, 0x04000000, 0x00000002}, + {0x4A515059, 0x01000000, 0x00000001}, + {0x4A515141, 0x02000000, 0x00000002}, + {0x4A515241, 0x04000000, 0x00000003}, + {0x4A515242, 0x04000000, 0x00000005}, + {0x4A515341, 0x00800000, 0x00000002}, + {0x4A515541, 0x01000000, 0x00000002}, + {0x4A515542, 0x08000000, 0x00000001}, + {0x4A515559, 0x01000000, 0x00000002}, + {0x4A515741, 0x01000000, 0x00000001}, + {0x4A515859, 0x02000000, 0x00000003}, + {0x4A515942, 0x02000000, 0x00000002}, + {0x4A515959, 0x01000000, 0x00000002}, + {0x4A515A42, 0x08000000, 0x00000003}, + {0x4A515A59, 0x01000000, 0x00000005}, + {0x4A523241, 0x01000000, 0x00000003}, + {0x4A523342, 0x08000000, 0x00000005}, + {0x4A523343, 0x04000000, 0x00000002}, + {0x4A523356, 0x02000000, 0x00000003}, + {0x4A523441, 0x02000000, 0x00000002}, + {0x4A523541, 0x01000000, 0x00000002}, + {0x4A523543, 0x08000000, 0x00000003}, + {0x4A523641, 0x04000000, 0x00000003}, + {0x4A523643, 0x04000000, 0x00000003}, + {0x4A523841, 0x04000000, 0x00000005}, + {0x4A523842, 0x04000000, 0x00000002}, + {0x4A524142, 0x02000000, 0x00000005}, + {0x4A524255, 0x00800000, 0x00000005}, + {0x4A524259, 0x04000000, 0x00000001}, + {0x4A524441, 0x01000000, 0x00000002}, + {0x4A524541, 0x01000000, 0x00000002}, + {0x4A524559, 0x04000000, 0x00000003}, + {0x4A524643, 0x08000000, 0x00000002}, + {0x4A524741, 0x04000000, 0x00000005}, + {0x4A524742, 0x02000000, 0x00000002}, + {0x4A524743, 0x04000000, 0x00000001}, + {0x4A524759, 0x08000000, 0x00000002}, + {0x4A524841, 0x02000000, 0x00000002}, + {0x4A524854, 0x20000000, 0x00000003}, + {0x4A524856, 0x04000000, 0x00000002}, + {0x4A524941, 0x01000000, 0x00000001}, + {0x4A524A41, 0x08000000, 0x00000005}, + {0x4A524A43, 0x08000000, 0x00000003}, + {0x4A524A59, 0x08000000, 0x00000002}, + {0x4A524B41, 0x04000000, 0x00000002}, + {0x4A524B43, 0x04000000, 0x00000003}, + {0x4A524B59, 0x04000000, 0x00000005}, + {0x4A524C41, 0x00800000, 0x00000002}, + {0x4A524D41, 0x01000000, 0x00000003}, + {0x4A524E41, 0x04000000, 0x00000001}, + {0x4A524E43, 0x04000000, 0x00000002}, + {0x4A524E54, 0x10000000, 0x00000003}, + {0x4A524E59, 0x04000000, 0x00000002}, + {0x4A524F42, 0x01000000, 0x00000003}, + {0x4A524F55, 0x02000000, 0x00000008}, + {0x4A525041, 0x02000000, 0x00000002}, + {0x4A525142, 0x02000000, 0x00000002}, + {0x4A525143, 0x04000000, 0x00000002}, + {0x4A525242, 0x10000000, 0x00000003}, + {0x4A525243, 0x02000000, 0x00000005}, + {0x4A525341, 0x04000000, 0x00000003}, + {0x4A525343, 0x10000000, 0x00000002}, + {0x4A525359, 0x01000000, 0x00000005}, + {0x4A525441, 0x01000000, 0x00000002}, + {0x4A52544E, 0x00180AC8, 0x00000000}, + {0x4A525541, 0x04000000, 0x00000002}, + {0x4A525543, 0x04000000, 0x00000001}, + {0x4A525559, 0x04000000, 0x00000003}, + {0x4A525641, 0x04000000, 0x00000002}, + {0x4A525659, 0x08000000, 0x00000002}, + {0x4A525741, 0x02000000, 0x00000005}, + {0x4A525742, 0x02000000, 0x00000003}, + {0x4A525841, 0x01000000, 0x00000002}, + {0x4A525959, 0x04000000, 0x00000001}, + {0x4A525A41, 0x08000000, 0x00000002}, + {0x4A525A59, 0x01000000, 0x00000002}, + {0x4A533243, 0x08000000, 0x00000004}, + {0x4A533342, 0x20000000, 0x00000003}, + {0x4A534159, 0x10000000, 0x00000005}, + {0x4A534241, 0x01000000, 0x00000005}, + {0x4A534254, 0x02000000, 0x00000002}, + {0x4A534259, 0x08000000, 0x00000003}, + {0x4A534342, 0x04000000, 0x00000002}, + {0x4A534459, 0x04000000, 0x00000002}, + {0x4A534559, 0x04000000, 0x00000003}, + {0x4A534654, 0x02000000, 0x00000003}, + {0x4A534659, 0x04000000, 0x00000002}, + {0x4A534841, 0x02000000, 0x00000002}, + {0x4A534A41, 0x001998C8, 0x00000002}, + {0x4A534A59, 0x02000000, 0x00000002}, + {0x4A534B41, 0x02000000, 0x00000002}, + {0x4A534B42, 0x02000000, 0x00000002}, + {0x4A534C41, 0x04000000, 0x00000002}, + {0x4A534C59, 0x04000000, 0x00000001}, + {0x4A534D41, 0x04000000, 0x00000003}, + {0x4A534D43, 0x02000000, 0x00000003}, + {0x4A534D59, 0x04000000, 0x00000005}, + {0x4A534E41, 0x01000000, 0x00000001}, + {0x4A534E43, 0x04000000, 0x00000002}, + {0x4A534E55, 0x00800000, 0x00000006}, + {0x4A534F41, 0x04000000, 0x00000002}, + {0x4A534F42, 0x01000000, 0x00000003}, + {0x4A534F56, 0x02000000, 0x00000007}, + {0x4A534F59, 0x00800000, 0x00000002}, + {0x4A535041, 0x04000000, 0x00000005}, + {0x4A535054, 0x04000000, 0x00000005}, + {0x4A535059, 0x01000000, 0x00000002}, + {0x4A535141, 0x02000000, 0x00000002}, + {0x4A535142, 0x01000000, 0x00000003}, + {0x4A535241, 0x08000000, 0x00000002}, + {0x4A535359, 0x04000000, 0x00000003}, + {0x4A535443, 0x04000000, 0x00000001}, + {0x4A535641, 0x02000000, 0x00000002}, + {0x4A535659, 0x02000000, 0x00000003}, + {0x4A535841, 0x04000000, 0x00000002}, + {0x4A535842, 0x04000000, 0x00000003}, + {0x4A535859, 0x02000000, 0x00000003}, + {0x4A535941, 0x04000000, 0x00000005}, + {0x4A535942, 0x04000000, 0x00000003}, + {0x4A535959, 0x01000000, 0x00000002}, + {0x4A535A41, 0x01000000, 0x00000003}, + {0x4A535A43, 0x04000000, 0x00000001}, + {0x4A535A59, 0x01000000, 0x00000002}, + {0x4A543243, 0x04000000, 0x00000003}, + {0x4A543342, 0x02000000, 0x00000001}, + {0x4A543442, 0x02000000, 0x00000002}, + {0x4A543443, 0x08000000, 0x00000002}, + {0x4A543541, 0x02000000, 0x00000005}, + {0x4A543841, 0x02000000, 0x00000002}, + {0x4A543842, 0x01000000, 0x00000001}, + {0x4A544143, 0x02000000, 0x00000002}, + {0x4A544259, 0x08000000, 0x00000003}, + {0x4A544341, 0x02000000, 0x00000001}, + {0x4A544343, 0x08000000, 0x00000003}, + {0x4A544354, 0x02000000, 0x00000005}, + {0x4A544356, 0x04000000, 0x00000003}, + {0x4A544359, 0x02000000, 0x00000001}, + {0x4A544459, 0x04000000, 0x00000003}, + {0x4A544541, 0x04000000, 0x00000001}, + {0x4A544542, 0x04000000, 0x00000005}, + {0x4A544543, 0x08000000, 0x00000002}, + {0x4A544654, 0x04000000, 0x00000002}, + {0x4A544659, 0x04000000, 0x00000005}, + {0x4A544741, 0x02000000, 0x00000002}, + {0x4A544742, 0x08000000, 0x00000002}, + {0x4A544843, 0x04000000, 0x00000002}, + {0x4A544854, 0x20000000, 0x00000003}, + {0x4A544859, 0x01000000, 0x00000001}, + {0x4A544942, 0x08000000, 0x00000005}, + {0x4A544A59, 0x08000000, 0x00000002}, + {0x4A544B41, 0x01000000, 0x00000001}, + {0x4A544B42, 0x04000000, 0x00000002}, + {0x4A544B54, 0x04000000, 0x00000002}, + {0x4A544B59, 0x02000000, 0x00000002}, + {0x4A544C54, 0x04000000, 0x00000003}, + {0x4A544C59, 0x08000000, 0x00000002}, + {0x4A544D41, 0x04000000, 0x00000002}, + {0x4A544D42, 0x08000000, 0x00000003}, + {0x4A544D56, 0x10000000, 0x00000002}, + {0x4A544E41, 0x04000000, 0x00000002}, + {0x4A544E43, 0x10000000, 0x00000003}, + {0x4A544E59, 0x10000000, 0x00000001}, + {0x4A544F41, 0x01000000, 0x00000002}, + {0x4A544F42, 0x01000000, 0x00000005}, + {0x4A544F43, 0x01000000, 0x00000005}, + {0x4A544F59, 0x04000000, 0x00000003}, + {0x4A545041, 0x01000000, 0x00000002}, + {0x4A545043, 0x04000000, 0x00000005}, + {0x4A545056, 0x08000000, 0x00000006}, + {0x4A545059, 0x02000000, 0x00000005}, + {0x4A545143, 0x04000000, 0x00000003}, + {0x4A545241, 0x08000000, 0x00000002}, + {0x4A545341, 0x02000000, 0x00000001}, + {0x4A545359, 0x04000000, 0x00000001}, + {0x4A545442, 0x04000000, 0x00000002}, + {0x4A545443, 0x08000000, 0x00000003}, + {0x4A545459, 0x08000000, 0x00000003}, + {0x4A545641, 0x04000000, 0x00000002}, + {0x4A545741, 0x00800000, 0x00000001}, + {0x4A545843, 0x10000000, 0x00000003}, + {0x4A545859, 0x02000000, 0x00000003}, + {0x4A545941, 0x08000000, 0x00000003}, + {0x4A545943, 0x04000000, 0x00000003}, + {0x4A545A41, 0x01000000, 0x00000005}, + {0x4A545A43, 0x02000000, 0x00000002}, + {0x4A545A59, 0x01000000, 0x00000005}, + {0x4A553241, 0x04000000, 0x00000002}, + {0x4A553341, 0x02000000, 0x00000001}, + {0x4A553343, 0x08000000, 0x00000002}, + {0x4A553441, 0x02000000, 0x00000002}, + {0x4A553442, 0x02000000, 0x00000003}, + {0x4A553443, 0x04000000, 0x00000001}, + {0x4A553641, 0x02000000, 0x00000001}, + {0x4A553841, 0x02000000, 0x00000002}, + {0x4A554241, 0x04000000, 0x00000005}, + {0x4A554242, 0x04000000, 0x00000003}, + {0x4A554259, 0x08000000, 0x00000003}, + {0x4A554341, 0x04000000, 0x00000005}, + {0x4A554343, 0x04000000, 0x00000006}, + {0x4A554441, 0x02000000, 0x00000003}, + {0x4A554459, 0x04000000, 0x00000003}, + {0x4A554541, 0x04000000, 0x00000003}, + {0x4A554542, 0x10000000, 0x00000003}, + {0x4A554641, 0x01000000, 0x00000003}, + {0x4A554656, 0x10000000, 0x00000005}, + {0x4A554659, 0x04000000, 0x00000002}, + {0x4A554741, 0x02000000, 0x00000002}, + {0x4A554742, 0x08000000, 0x00000003}, + {0x4A554759, 0x01000000, 0x00000002}, + {0x4A554843, 0x10000000, 0x00000003}, + {0x4A554A41, 0x04000000, 0x00000003}, + {0x4A554A42, 0x02000000, 0x00000003}, + {0x4A554A43, 0x04000000, 0x00000003}, + {0x4A554A59, 0x04000000, 0x00000002}, + {0x4A554B42, 0x08000000, 0x00000005}, + {0x4A554B43, 0x04000000, 0x00000003}, + {0x4A554B59, 0x04000000, 0x00000003}, + {0x4A554C41, 0x02000000, 0x00000002}, + {0x4A554C42, 0x08000000, 0x00000003}, + {0x4A554C59, 0x08000000, 0x00000005}, + {0x4A554E43, 0x02000000, 0x00000002}, + {0x4A554E59, 0x04000000, 0x00000003}, + {0x4A554F41, 0x01000000, 0x00000003}, + {0x4A555041, 0x02000000, 0x00000003}, + {0x4A555042, 0x04000000, 0x00000005}, + {0x4A555043, 0x08000000, 0x00000006}, + {0x4A555141, 0x08000000, 0x00000002}, + {0x4A555142, 0x04000000, 0x00000002}, + {0x4A555143, 0x02000000, 0x00000002}, + {0x4A555159, 0x08000000, 0x00000003}, + {0x4A555241, 0x02000000, 0x00000003}, + {0x4A555259, 0x00800000, 0x00000001}, + {0x4A555341, 0x04000000, 0x00000003}, + {0x4A555359, 0x00800000, 0x00000003}, + {0x4A555441, 0x04000000, 0x00000002}, + {0x4A555442, 0x04000000, 0x00000002}, + {0x4A555443, 0x10000000, 0x00000003}, + {0x4A555459, 0x04000000, 0x00000003}, + {0x4A555541, 0x00800000, 0x00000003}, + {0x4A555543, 0x00800000, 0x00000002}, + {0x4A555559, 0x02000000, 0x00000002}, + {0x4A555641, 0x08000000, 0x00000003}, + {0x4A555643, 0x04000000, 0x00000002}, + {0x4A555659, 0x04000000, 0x00000005}, + {0x4A555759, 0x02000000, 0x00000001}, + {0x4A555859, 0x02000000, 0x00000003}, + {0x4A555941, 0x02000000, 0x00000002}, + {0x4A555A41, 0x01000000, 0x00000002}, + {0x4A555A59, 0x04000000, 0x00000001}, + {0x4A563243, 0x10000000, 0x00000003}, + {0x4A563341, 0x04000000, 0x00000003}, + {0x4A563441, 0x08000000, 0x00000005}, + {0x4A563841, 0x04000000, 0x00000002}, + {0x4A563842, 0x02000000, 0x00000003}, + {0x4A564156, 0x04000000, 0x00000001}, + {0x4A564241, 0x02000000, 0x00000002}, + {0x4A564341, 0x04000000, 0x00000002}, + {0x4A564441, 0x01000000, 0x00000001}, + {0x4A564454, 0x08000000, 0x00000003}, + {0x4A564541, 0x04000000, 0x00000002}, + {0x4A564542, 0x10000000, 0x00000003}, + {0x4A564742, 0x04000000, 0x00000002}, + {0x4A564759, 0x04000000, 0x00000002}, + {0x4A564843, 0x01000000, 0x00000003}, + {0x4A564941, 0x02000000, 0x00000002}, + {0x4A564942, 0x00800000, 0x00000001}, + {0x4A564943, 0x08000000, 0x00000003}, + {0x4A564959, 0x08000000, 0x00000003}, + {0x4A564A41, 0x01000000, 0x00000001}, + {0x4A564B41, 0x04000000, 0x00000001}, + {0x4A564B59, 0x08000000, 0x00000003}, + {0x4A564C41, 0x02000000, 0x00000002}, + {0x4A564C59, 0x04000000, 0x00000002}, + {0x4A564D59, 0x00800000, 0x00000001}, + {0x4A564E43, 0x08000000, 0x00000005}, + {0x4A564E59, 0x02000000, 0x00000002}, + {0x4A564F41, 0x04000000, 0x00000002}, + {0x4A564F43, 0x02000000, 0x00000005}, + {0x4A565041, 0x00800000, 0x00000002}, + {0x4A565142, 0x04000000, 0x00000003}, + {0x4A565259, 0x02000000, 0x00000005}, + {0x4A565359, 0x04000000, 0x00000003}, + {0x4A565541, 0x08000000, 0x00000002}, + {0x4A565559, 0x02000000, 0x00000003}, + {0x4A565641, 0x00800000, 0x00000003}, + {0x4A565643, 0x01000000, 0x00000001}, + {0x4A565659, 0x00800000, 0x00000001}, + {0x4A565741, 0x01000000, 0x00000001}, + {0x4A565743, 0x04000000, 0x00000002}, + {0x4A565759, 0x04000000, 0x00000002}, + {0x4A565841, 0x04000000, 0x00000003}, + {0x4A565843, 0x02000000, 0x00000003}, + {0x4A565942, 0x08000000, 0x00000003}, + {0x4A565943, 0x04000000, 0x00000002}, + {0x4A565A41, 0x00800000, 0x00000001}, + {0x4A565A59, 0x02000000, 0x00000002}, + {0x4A573241, 0x04000000, 0x00000001}, + {0x4A573242, 0x08000000, 0x00000003}, + {0x4A573243, 0x02000000, 0x00000002}, + {0x4A573343, 0x02000000, 0x00000003}, + {0x4A573443, 0x02000000, 0x00000002}, + {0x4A573643, 0x02000000, 0x00000002}, + {0x4A573841, 0x00800000, 0x00000001}, + {0x4A574159, 0x04000000, 0x00000002}, + {0x4A574254, 0x02000000, 0x00000001}, + {0x4A574341, 0x00800000, 0x00000002}, + {0x4A574359, 0x00800000, 0x00000002}, + {0x4A574459, 0x02000000, 0x00000005}, + {0x4A574541, 0x04000000, 0x00000002}, + {0x4A574543, 0x08000000, 0x00000002}, + {0x4A574559, 0x04000000, 0x00000008}, + {0x4A574741, 0x01000000, 0x00000002}, + {0x4A574742, 0x02000000, 0x00000002}, + {0x4A574743, 0x00800000, 0x00000001}, + {0x4A574941, 0x01000000, 0x00000002}, + {0x4A574A41, 0x01000000, 0x00000001}, + {0x4A574B41, 0x04000000, 0x00000002}, + {0x4A574B43, 0x10000000, 0x00000001}, + {0x4A574B59, 0x08000000, 0x00000003}, + {0x4A574C41, 0x02000000, 0x00000001}, + {0x4A574D49, 0x04000000, 0x00000007}, + {0x4A574F43, 0x10000000, 0x00000002}, + {0x4A574F59, 0x02000000, 0x00000002}, + {0x4A575141, 0x02000000, 0x00000002}, + {0x4A575142, 0x08000000, 0x00000003}, + {0x4A575241, 0x01000000, 0x00000002}, + {0x4A575242, 0x08000000, 0x00000005}, + {0x4A575259, 0x02000000, 0x00000005}, + {0x4A575342, 0x08000000, 0x00000006}, + {0x4A575441, 0x02000000, 0x00000002}, + {0x4A575443, 0x01000000, 0x00000003}, + {0x4A575459, 0x08000000, 0x00000003}, + {0x4A575541, 0x04000000, 0x00000003}, + {0x4A575543, 0x04000000, 0x00000003}, + {0x4A575659, 0x10000000, 0x00000003}, + {0x4A575742, 0x08000000, 0x00000003}, + {0x4A575759, 0x02000000, 0x00000002}, + {0x4A575841, 0x00800000, 0x00000002}, + {0x4A575843, 0x02000000, 0x00000003}, + {0x4A575859, 0x01000000, 0x00000003}, + {0x4A575941, 0x02000000, 0x00000002}, + {0x4A575943, 0x01000000, 0x00000001}, + {0x4A575A41, 0x02000000, 0x00000002}, + {0x4A575A43, 0x04000000, 0x00000002}, + {0x4A575A59, 0x02000000, 0x00000002}, + {0x4A583241, 0x01000000, 0x00000002}, + {0x4A583243, 0x02000000, 0x00000003}, + {0x4A583342, 0x01000000, 0x00000001}, + {0x4A583343, 0x08000000, 0x00000002}, + {0x4A583442, 0x04000000, 0x00000002}, + {0x4A583641, 0x02000000, 0x00000002}, + {0x4A583642, 0x01000000, 0x00000003}, + {0x4A583643, 0x00800000, 0x00000002}, + {0x4A583742, 0x08000000, 0x00000003}, + {0x4A583841, 0x04000000, 0x00000002}, + {0x4A584241, 0x02000000, 0x00000002}, + {0x4A584342, 0x04000000, 0x00000005}, + {0x4A584359, 0x02000000, 0x00000002}, + {0x4A584441, 0x02000000, 0x00000002}, + {0x4A584442, 0x01000000, 0x00000001}, + {0x4A584541, 0x08000000, 0x00000002}, + {0x4A584559, 0x02000000, 0x00000002}, + {0x4A584641, 0x08000000, 0x00000003}, + {0x4A584642, 0x04000000, 0x00000002}, + {0x4A584743, 0x10000000, 0x00000001}, + {0x4A584759, 0x08000000, 0x00000002}, + {0x4A584842, 0x04000000, 0x00000002}, + {0x4A584941, 0x04000000, 0x00000002}, + {0x4A584959, 0x08000000, 0x00000003}, + {0x4A584A41, 0x02000000, 0x00000001}, + {0x4A584B41, 0x08000000, 0x00000002}, + {0x4A584B42, 0x04000000, 0x00000003}, + {0x4A584B59, 0x00800000, 0x00000002}, + {0x4A584C54, 0x01000000, 0x00000002}, + {0x4A584D54, 0x04000000, 0x00000003}, + {0x4A584E42, 0x04000000, 0x00000002}, + {0x4A584F42, 0x20000000, 0x00000005}, + {0x4A584F59, 0x04000000, 0x00000003}, + {0x4A585041, 0x04000000, 0x00000005}, + {0x4A585141, 0x08000000, 0x00000003}, + {0x4A585241, 0x04000000, 0x00000001}, + {0x4A585259, 0x04000000, 0x00000002}, + {0x4A585341, 0x01000000, 0x00000002}, + {0x4A585459, 0x04000000, 0x00000002}, + {0x4A585541, 0x01000000, 0x00000001}, + {0x4A585559, 0x04000000, 0x00000003}, + {0x4A585659, 0x04000000, 0x00000002}, + {0x4A585841, 0x04000000, 0x00000002}, + {0x4A585843, 0x02000000, 0x00000003}, + {0x4A585859, 0x04000000, 0x00000002}, + {0x4A585941, 0x08000000, 0x00000005}, + {0x4A585942, 0x10000000, 0x00000003}, + {0x4A585A41, 0x04000000, 0x00000002}, + {0x4A585A59, 0x04000000, 0x00000002}, + {0x4A593241, 0x01000000, 0x00000007}, + {0x4A593243, 0x08000000, 0x00000003}, + {0x4A593341, 0x04000000, 0x00000003}, + {0x4A593343, 0x08000000, 0x00000002}, + {0x4A593441, 0x00800000, 0x00000003}, + {0x4A593442, 0x00800000, 0x00000001}, + {0x4A593543, 0x08000000, 0x00000002}, + {0x4A593643, 0x04000000, 0x00000002}, + {0x4A593841, 0x00800000, 0x00000001}, + {0x4A594159, 0x02000000, 0x00000001}, + {0x4A594341, 0x01000000, 0x00000005}, + {0x4A594541, 0x04000000, 0x00000002}, + {0x4A594659, 0x04000000, 0x00000005}, + {0x4A594741, 0x04000000, 0x00000005}, + {0x4A594743, 0x04000000, 0x00000002}, + {0x4A594759, 0x00800000, 0x00000002}, + {0x4A594942, 0x04000000, 0x00000005}, + {0x4A594A41, 0x04000000, 0x00000006}, + {0x4A594B41, 0x01000000, 0x00000003}, + {0x4A594B43, 0x02000000, 0x00000003}, + {0x4A594B59, 0x02000000, 0x00000002}, + {0x4A594D41, 0x04000000, 0x00000003}, + {0x4A594D43, 0x01000000, 0x00000003}, + {0x4A594E41, 0x04000000, 0x00000003}, + {0x4A594F42, 0x04000000, 0x00000002}, + {0x4A594F59, 0x01000000, 0x00000002}, + {0x4A595041, 0x02000000, 0x00000002}, + {0x4A595056, 0x10000000, 0x00000005}, + {0x4A595141, 0x04000000, 0x00000002}, + {0x4A595159, 0x01000000, 0x00000002}, + {0x4A595242, 0x10000000, 0x00000002}, + {0x4A595259, 0x02000000, 0x00000001}, + {0x4A595341, 0x00800000, 0x00000001}, + {0x4A595541, 0x02000000, 0x00000002}, + {0x4A595542, 0x04000000, 0x00000002}, + {0x4A595543, 0x02000000, 0x00000001}, + {0x4A595641, 0x04000000, 0x00000002}, + {0x4A595659, 0x08000000, 0x00000001}, + {0x4A595741, 0x02000000, 0x00000003}, + {0x4A595742, 0x04000000, 0x00000003}, + {0x4A595841, 0x08000000, 0x00000001}, + {0x4A595843, 0x02000000, 0x00000003}, + {0x4A595942, 0x08000000, 0x00000003}, + {0x4A595959, 0x04000000, 0x00000003}, + {0x4A595A43, 0x02000000, 0x00000002}, + {0x4A5A3241, 0x02000000, 0x00000001}, + {0x4A5A3341, 0x04000000, 0x00000002}, + {0x4A5A3342, 0x02000000, 0x00000001}, + {0x4A5A3641, 0x08000000, 0x00000002}, + {0x4A5A3642, 0x04000000, 0x00000003}, + {0x4A5A3841, 0x02000000, 0x00000002}, + {0x4A5A4143, 0x04000000, 0x00000002}, + {0x4A5A4241, 0x08000000, 0x00000003}, + {0x4A5A4341, 0x01000000, 0x00000001}, + {0x4A5A4441, 0x02000000, 0x00000002}, + {0x4A5A4459, 0x01000000, 0x00000002}, + {0x4A5A4541, 0x04000000, 0x00000002}, + {0x4A5A4542, 0x20000000, 0x00000003}, + {0x4A5A4543, 0x08000000, 0x00000002}, + {0x4A5A4559, 0x04000000, 0x00000002}, + {0x4A5A4741, 0x04000000, 0x00000001}, + {0x4A5A4843, 0x04000000, 0x00000002}, + {0x4A5A4854, 0x20000000, 0x00000002}, + {0x4A5A4941, 0x00800000, 0x00000002}, + {0x4A5A4959, 0x04000000, 0x00000002}, + {0x4A5A4A41, 0x00800000, 0x00000002}, + {0x4A5A4A59, 0x02000000, 0x00000005}, + {0x4A5A4B41, 0x01000000, 0x00000002}, + {0x4A5A4B54, 0x02000000, 0x00000002}, + {0x4A5A4B59, 0x01000000, 0x00000002}, + {0x4A5A4C41, 0x02000000, 0x00000002}, + {0x4A5A4C59, 0x08000000, 0x00000002}, + {0x4A5A4D41, 0x00800000, 0x00000002}, + {0x4A5A4D43, 0x04000000, 0x00000003}, + {0x4A5A4E41, 0x01000000, 0x00000001}, + {0x4A5A4E43, 0x02000000, 0x00000002}, + {0x4A5A4E59, 0x04000000, 0x00000002}, + {0x4A5A4F41, 0x01000000, 0x00000002}, + {0x4A5A4F43, 0x08000000, 0x00000002}, + {0x4A5A5041, 0x01000000, 0x00000002}, + {0x4A5A5141, 0x02000000, 0x00000002}, + {0x4A5A5159, 0x00800000, 0x00000001}, + {0x4A5A5241, 0x04000000, 0x00000002}, + {0x4A5A5242, 0x04000000, 0x00000003}, + {0x4A5A5641, 0x01000000, 0x00000001}, + {0x4A5A5643, 0x10000000, 0x00000003}, + {0x4A5A5659, 0x00800000, 0x00000001}, + {0x4A5A5741, 0x02000000, 0x00000002}, + {0x4A5A5742, 0x04000000, 0x00000003}, + {0x4A5A5759, 0x04000000, 0x00000001}, + {0x4A5A5841, 0x08000000, 0x00000001}, + {0x4A5A5843, 0x02000000, 0x00000003}, + {0x4A5A5941, 0x02000000, 0x00000003}, + {0x4A5A5A41, 0x04000000, 0x00000005}, + {0x4A5A5A59, 0x02000000, 0x00000001}, + {0x4B324359, 0x04000000, 0x00000006}, + {0x4B324441, 0x02000000, 0x00000005}, + {0x4B325043, 0x04000000, 0x00000003}, + {0x4B325359, 0x04000000, 0x00000005}, + {0x4B325859, 0x00800000, 0x00000002}, + {0x4B334341, 0x02000000, 0x00000005}, + {0x4B334359, 0x04000000, 0x00000006}, + {0x4B334441, 0x02000000, 0x00000005}, + {0x4B334741, 0x02000000, 0x00000005}, + {0x4B334C41, 0x02000000, 0x00000001}, + {0x4B334D43, 0x08000000, 0x00000003}, + {0x4B344241, 0x04000000, 0x00000005}, + {0x4B344759, 0x10000000, 0x00000003}, + {0x4B344C43, 0x08000000, 0x00000002}, + {0x4B345043, 0x08000000, 0x00000002}, + {0x4B345759, 0x04000000, 0x00000003}, + {0x4B354459, 0x00800000, 0x00000002}, + {0x4B354759, 0x04000000, 0x00000003}, + {0x4B354B43, 0x04000000, 0x00000005}, + {0x4B355443, 0x08000000, 0x00000002}, + {0x4B363643, 0x04000000, 0x00000002}, + {0x4B364843, 0x04000000, 0x00000001}, + {0x4B364C59, 0x04000000, 0x00000001}, + {0x4B374743, 0x04000000, 0x00000002}, + {0x4B374D41, 0x02000000, 0x00000002}, + {0x4B374D59, 0x04000000, 0x00000002}, + {0x4B375241, 0x04000000, 0x00000002}, + {0x4B383443, 0x04000000, 0x00000006}, + {0x4B384659, 0x02000000, 0x00000003}, + {0x4B384759, 0x08000000, 0x00000005}, + {0x4B385741, 0x04000000, 0x00000001}, + {0x4B385943, 0x10000000, 0x00000003}, + {0x4B394559, 0x04000000, 0x00000003}, + {0x4B394643, 0x02000000, 0x00000003}, + {0x4B395259, 0x04000000, 0x00000002}, + {0x4B395343, 0x02000000, 0x00000001}, + {0x4B395759, 0x08000000, 0x00000001}, + {0x4B395941, 0x08000000, 0x00000003}, + {0x4B413242, 0x04000000, 0x00000003}, + {0x4B414156, 0x02000000, 0x00000008}, + {0x4B414441, 0x04000000, 0x00000006}, + {0x4B414641, 0x04000000, 0x00000003}, + {0x4B414642, 0x02000000, 0x00000003}, + {0x4B415041, 0x04000000, 0x00000006}, + {0x4B415249, 0x10000000, 0x00000006}, + {0x4B415941, 0x00800000, 0x00000002}, + {0x4B424B59, 0x04000000, 0x00000003}, + {0x4B425249, 0x10000000, 0x00000006}, + {0x4B425259, 0x08000000, 0x00000003}, + {0x4B433841, 0x02000000, 0x00000002}, + {0x4B434241, 0x02000000, 0x00000005}, + {0x4B434341, 0x02000000, 0x00000001}, + {0x4B434D41, 0x02000000, 0x00000005}, + {0x4B435041, 0x01000000, 0x00000001}, + {0x4B435141, 0x04000000, 0x00000002}, + {0x4B435259, 0x08000000, 0x00000002}, + {0x4B443241, 0x02000000, 0x00000002}, + {0x4B444154, 0x04000000, 0x00000005}, + {0x4B444342, 0x02000000, 0x00000002}, + {0x4B444E41, 0x01000000, 0x00000005}, + {0x4B444E43, 0x04000000, 0x00000002}, + {0x4B445041, 0x01000000, 0x00000002}, + {0x4B445059, 0x02000000, 0x00000003}, + {0x4B445249, 0x20000000, 0x00000006}, + {0x4B454641, 0x04000000, 0x00000003}, + {0x4B455249, 0x20000000, 0x00000006}, + {0x4B455741, 0x04000000, 0x00000005}, + {0x4B455A41, 0x04000000, 0x00000006}, + {0x4B463341, 0x04000000, 0x00000005}, + {0x4B463541, 0x04000000, 0x00000002}, + {0x4B464B59, 0x02000000, 0x00000001}, + {0x4B465241, 0x08000000, 0x00000003}, + {0x4B473341, 0x04000000, 0x00000005}, + {0x4B473641, 0x04000000, 0x00000002}, + {0x4B474441, 0x02000000, 0x00000005}, + {0x4B474E41, 0x08000000, 0x00000005}, + {0x4B474E59, 0x08000000, 0x00000003}, + {0x4B475049, 0x08000000, 0x00000006}, + {0x4B475059, 0x04000000, 0x00000002}, + {0x4B483643, 0x01000000, 0x00000001}, + {0x4B484759, 0x08000000, 0x00000001}, + {0x4B484D41, 0x04000000, 0x00000005}, + {0x4B484E41, 0x08000000, 0x00000006}, + {0x4B485041, 0x02000000, 0x00000005}, + {0x4B494459, 0x04000000, 0x00000002}, + {0x4B495041, 0x00800000, 0x00000002}, + {0x4B495141, 0x02000000, 0x00000005}, + {0x4B495243, 0x02000000, 0x00000002}, + {0x4B495741, 0x08000000, 0x00000005}, + {0x4B4A4241, 0x04000000, 0x00000005}, + {0x4B4A4342, 0x10000000, 0x00000003}, + {0x4B4A4C43, 0x08000000, 0x00000002}, + {0x4B4A5159, 0x08000000, 0x00000005}, + {0x4B4B4343, 0x02000000, 0x00000001}, + {0x4B4B4841, 0x04000000, 0x00000003}, + {0x4B4B5049, 0x08000000, 0x00000006}, + {0x4B4B5659, 0x08000000, 0x00000002}, + {0x4B4C4143, 0x04000000, 0x00000001}, + {0x4B4C4443, 0x02000000, 0x00000005}, + {0x4B4C4542, 0x02000000, 0x00000002}, + {0x4B4C4F43, 0x08000000, 0x00000003}, + {0x4B4C5759, 0x02000000, 0x00000001}, + {0x4B4C5A41, 0x08000000, 0x00000007}, + {0x4B4D3341, 0x08000000, 0x00000002}, + {0x4B4D4441, 0x02000000, 0x00000005}, + {0x4B4D4641, 0x04000000, 0x00000002}, + {0x4B4D4E41, 0x02000000, 0x00000005}, + {0x4B4D5241, 0x04000000, 0x00000002}, + {0x4B4D5341, 0x01000000, 0x00000001}, + {0x4B4E3442, 0x00800000, 0x00000002}, + {0x4B4E5041, 0x02000000, 0x00000001}, + {0x4B4E5943, 0x01000000, 0x00000002}, + {0x4B4F3242, 0x02000000, 0x00000005}, + {0x4B4F4359, 0x04000000, 0x00000001}, + {0x4B4F4443, 0x04000000, 0x00000005}, + {0x4B4F4559, 0x04000000, 0x00000003}, + {0x4B4F4E59, 0x08000000, 0x00000003}, + {0x4B4F5259, 0x02000000, 0x00000002}, + {0x4B504441, 0x00800000, 0x00000002}, + {0x4B504D59, 0x08000000, 0x00000005}, + {0x4B504E59, 0x04000000, 0x00000002}, + {0x4B505142, 0x04000000, 0x00000002}, + {0x4B505359, 0x02000000, 0x00000005}, + {0x4B505759, 0x04000000, 0x00000002}, + {0x4B505841, 0x02000000, 0x00000005}, + {0x4B514641, 0x04000000, 0x00000003}, + {0x4B514B42, 0x04000000, 0x00000001}, + {0x4B524559, 0x04000000, 0x00000003}, + {0x4B524E41, 0x04000000, 0x00000001}, + {0x4B524E59, 0x04000000, 0x00000002}, + {0x4B525441, 0x01000000, 0x00000002}, + {0x4B534743, 0x08000000, 0x00000001}, + {0x4B534E43, 0x04000000, 0x00000002}, + {0x4B534F41, 0x08000000, 0x00000005}, + {0x4B535043, 0x04000000, 0x00000002}, + {0x4B535143, 0x02000000, 0x00000001}, + {0x4B535659, 0x02000000, 0x00000003}, + {0x4B543841, 0x02000000, 0x00000002}, + {0x4B544659, 0x04000000, 0x00000005}, + {0x4B544C59, 0x08000000, 0x00000002}, + {0x4B545041, 0x01000000, 0x00000002}, + {0x4B545359, 0x04000000, 0x00000001}, + {0x4B545A59, 0x01000000, 0x00000005}, + {0x4B554242, 0x04000000, 0x00000003}, + {0x4B554D42, 0x02000000, 0x00000001}, + {0x4B555043, 0x08000000, 0x00000006}, + {0x4B564143, 0x02000000, 0x00000002}, + {0x4B564C59, 0x04000000, 0x00000002}, + {0x4B573443, 0x02000000, 0x00000002}, + {0x4B574441, 0x04000000, 0x00000002}, + {0x4B574459, 0x02000000, 0x00000005}, + {0x4B574B41, 0x04000000, 0x00000002}, + {0x4B574B59, 0x08000000, 0x00000003}, + {0x4B574F42, 0x04000000, 0x00000002}, + {0x4B575241, 0x01000000, 0x00000002}, + {0x4B575941, 0x02000000, 0x00000002}, + {0x4B575A41, 0x02000000, 0x00000002}, + {0x4B583241, 0x01000000, 0x00000002}, + {0x4B584241, 0x02000000, 0x00000002}, + {0x4B584559, 0x02000000, 0x00000002}, + {0x4B585541, 0x01000000, 0x00000001}, + {0x4B585942, 0x10000000, 0x00000003}, + {0x4B585A43, 0x08000000, 0x00000002}, + {0x4B593242, 0x02000000, 0x00000002}, + {0x4B593341, 0x04000000, 0x00000003}, + {0x4B593441, 0x00800000, 0x00000003}, + {0x4B594541, 0x04000000, 0x00000002}, + {0x4B594659, 0x04000000, 0x00000005}, + {0x4B595543, 0x02000000, 0x00000001}, + {0x4B595942, 0x08000000, 0x00000003}, + {0x4B5A4459, 0x00800000, 0x00000002}, + {0x4B5A4C59, 0x08000000, 0x00000002}, + {0x4B5A5242, 0x04000000, 0x00000003}, + {0x4B5A5A43, 0x10000000, 0x00000005}, + {0x4C464B59, 0x04000000, 0x00000001}, + {0x4C474D43, 0x04000000, 0x00000001}, + {0x4D374C42, 0x04000000, 0x00000001}, + {0x4D375042, 0x02000000, 0x00000001}, + {0x4D385042, 0x04000000, 0x00000001}, + {0x4D435143, 0x02000000, 0x00000001}, + {0x4D474D43, 0x04000000, 0x00000001}, + {0x4D503642, 0x02000000, 0x00000001}, + {0x4E374C42, 0x04000000, 0x00000001}, + {0x4E374E42, 0x02000000, 0x00000001}, + {0x4E375042, 0x02000000, 0x00000001}, + {0x4E385042, 0x04000000, 0x00000001}, + {0x4E435143, 0x02000000, 0x00000001}, + {0x4E454642, 0x04000000, 0x00000001}, + {0x4E503642, 0x02000000, 0x00000001}, + {0x4E573542, 0x02000000, 0x00000001}, + {0x4E584C42, 0x04000000, 0x00000008}, + {0x4E594C42, 0x04000000, 0x00000008}, + {0x4F415249, 0x10000000, 0x00000006}, + {0x4F425249, 0x10000000, 0x00000006}, + {0x4F445249, 0x20000000, 0x00000006}, + {0x4F455249, 0x20000000, 0x00000006}, + {0x50323241, 0x01000000, 0x00000002}, + {0x50323343, 0x04000000, 0x00000003}, + {0x50323542, 0x01000000, 0x00000001}, + {0x50323641, 0x04000000, 0x00000008}, + {0x50323643, 0x04000000, 0x00000001}, + {0x50323743, 0x00800000, 0x00000002}, + {0x50323842, 0x01000000, 0x00000001}, + {0x50324241, 0x02000000, 0x00000002}, + {0x50324242, 0x04000000, 0x00000002}, + {0x50324259, 0x04000000, 0x00000002}, + {0x50324341, 0x04000000, 0x00000001}, + {0x50324343, 0x01000000, 0x00000001}, + {0x50324354, 0x00800000, 0x00000001}, + {0x50324359, 0x00000000, 0x00000006}, + {0x50324441, 0x04000000, 0x00000005}, + {0x50324442, 0x01000000, 0x00000002}, + {0x50324459, 0x01000000, 0x00000003}, + {0x50324643, 0x01000000, 0x00000001}, + {0x50324741, 0x08000000, 0x00000001}, + {0x50324743, 0x02000000, 0x00000002}, + {0x50324759, 0x01000000, 0x00000001}, + {0x50324842, 0x02000000, 0x00000003}, + {0x50324854, 0x01000000, 0x00000001}, + {0x50324859, 0x02000000, 0x00000003}, + {0x50324941, 0x04000000, 0x00000002}, + {0x50324943, 0x00800000, 0x00000001}, + {0x50324959, 0x00800000, 0x00000001}, + {0x50324A41, 0x00800000, 0x00000008}, + {0x50324A42, 0x04000000, 0x00000001}, + {0x50324A43, 0x01000000, 0x00000002}, + {0x50324A56, 0x02000000, 0x00000001}, + {0x50324A59, 0x02000000, 0x00000002}, + {0x50324B43, 0x02000000, 0x00000001}, + {0x50324C41, 0x04000000, 0x00000002}, + {0x50324C59, 0x08000000, 0x00000003}, + {0x50325041, 0x02000000, 0x00000001}, + {0x50325042, 0x02000000, 0x00000001}, + {0x50325059, 0x04000000, 0x00000005}, + {0x50325141, 0x02000000, 0x00000002}, + {0x50325254, 0x02000000, 0x00000002}, + {0x50325259, 0x08000000, 0x00000003}, + {0x50325341, 0x01000000, 0x00000001}, + {0x50325359, 0x04000000, 0x00000005}, + {0x50325442, 0x04000000, 0x00000003}, + {0x50325459, 0x00800000, 0x00000001}, + {0x50325559, 0x01000000, 0x00000003}, + {0x50325642, 0x02000000, 0x00000001}, + {0x50325741, 0x02000000, 0x00000003}, + {0x50325759, 0x04000000, 0x00000005}, + {0x50325841, 0x00800000, 0x00000001}, + {0x50325842, 0x00800000, 0x00000001}, + {0x50325A43, 0x01000000, 0x00000003}, + {0x50333441, 0x01000000, 0x00000008}, + {0x50333543, 0x00800000, 0x00000001}, + {0x50333743, 0x00800000, 0x00000002}, + {0x50333842, 0x08000000, 0x00000001}, + {0x50334142, 0x04000000, 0x00000001}, + {0x50334159, 0x00800000, 0x00000001}, + {0x50334241, 0x04000000, 0x00000003}, + {0x50334242, 0x08000000, 0x00000001}, + {0x50334243, 0x02000000, 0x00000002}, + {0x50334259, 0x04000000, 0x00000005}, + {0x50334341, 0x04000000, 0x00000005}, + {0x50334342, 0x00800000, 0x00000001}, + {0x50334354, 0x04000000, 0x00000002}, + {0x50334441, 0x04000000, 0x00000005}, + {0x50334442, 0x04000000, 0x00000001}, + {0x50334444, 0x02000000, 0x00000001}, + {0x50334542, 0x04000000, 0x00000001}, + {0x50334641, 0x00800000, 0x00000001}, + {0x50334643, 0x01000000, 0x00000001}, + {0x50334659, 0x02000000, 0x00000002}, + {0x50334741, 0x04000000, 0x00000005}, + {0x50334743, 0x02000000, 0x00000002}, + {0x50334759, 0x02000000, 0x00000003}, + {0x50334841, 0x02000000, 0x00000003}, + {0x50334842, 0x02000000, 0x00000002}, + {0x50334941, 0x01000000, 0x00000002}, + {0x50334943, 0x04000000, 0x00000001}, + {0x50334959, 0x04000000, 0x00000002}, + {0x50334A43, 0x00800000, 0x00000001}, + {0x50334A54, 0x01000000, 0x00000001}, + {0x50334A56, 0x02000000, 0x00000001}, + {0x50334B41, 0x02000000, 0x00000002}, + {0x50334B59, 0x02000000, 0x00000003}, + {0x50334C41, 0x02000000, 0x00000001}, + {0x50334C43, 0x01000000, 0x00000001}, + {0x50334C59, 0x04000000, 0x00000002}, + {0x50334D43, 0x08000000, 0x00000003}, + {0x50334D54, 0x04000000, 0x00000001}, + {0x50334F41, 0x02000000, 0x00000001}, + {0x50335043, 0x08000000, 0x00000005}, + {0x50335059, 0x02000000, 0x00000008}, + {0x50335141, 0x04000000, 0x00000002}, + {0x50335154, 0x04000000, 0x00000001}, + {0x50335159, 0x04000000, 0x00000002}, + {0x50335341, 0x02000000, 0x00000001}, + {0x50335343, 0x04000000, 0x00000003}, + {0x50335359, 0x00800000, 0x00000001}, + {0x50335459, 0x04000000, 0x00000003}, + {0x50335543, 0x02000000, 0x00000001}, + {0x50335559, 0x02000000, 0x00000001}, + {0x50335741, 0x04000000, 0x00000001}, + {0x50335742, 0x08000000, 0x00000002}, + {0x50335759, 0x01000000, 0x00000001}, + {0x50335842, 0x00800000, 0x00000001}, + {0x50335941, 0x04000000, 0x00000002}, + {0x50343242, 0x00800000, 0x00000001}, + {0x50343243, 0x08000000, 0x00000003}, + {0x50343543, 0x02000000, 0x00000003}, + {0x50343559, 0x02000000, 0x00000008}, + {0x50343741, 0x04000000, 0x00000008}, + {0x50343743, 0x00800000, 0x00000002}, + {0x50344259, 0x02000000, 0x00000001}, + {0x50344341, 0x04000000, 0x00000001}, + {0x50344441, 0x02000000, 0x00000005}, + {0x50344443, 0x00800000, 0x00000001}, + {0x50344456, 0x04000000, 0x00000001}, + {0x50344643, 0x00800000, 0x00000001}, + {0x50344659, 0x08000000, 0x00000003}, + {0x50344759, 0x10000000, 0x00000003}, + {0x50344843, 0x04000000, 0x00000002}, + {0x50344943, 0x04000000, 0x00000002}, + {0x50344A42, 0x00800000, 0x00000001}, + {0x50344A43, 0x01000000, 0x00000001}, + {0x50344A56, 0x02000000, 0x00000001}, + {0x50344C41, 0x00800000, 0x00000001}, + {0x50344D41, 0x00800000, 0x00000002}, + {0x50344D42, 0x00000000, 0x00000002}, + {0x50344D43, 0x01000000, 0x00000003}, + {0x50344D56, 0x02000000, 0x00000002}, + {0x50344E41, 0x04000000, 0x00000001}, + {0x50345059, 0x04000000, 0x00000002}, + {0x50345141, 0x02000000, 0x00000001}, + {0x50345159, 0x00800000, 0x00000002}, + {0x50345242, 0x08000000, 0x00000003}, + {0x50345243, 0x04000000, 0x00000002}, + {0x50345341, 0x04000000, 0x00000003}, + {0x50345442, 0x01000000, 0x00000008}, + {0x50345443, 0x01000000, 0x00000001}, + {0x50345543, 0x02000000, 0x00000002}, + {0x50345659, 0x08000000, 0x00000003}, + {0x50345742, 0x02000000, 0x00000002}, + {0x50345759, 0x04000000, 0x00000003}, + {0x50345842, 0x00800000, 0x00000001}, + {0x50345A43, 0x04000000, 0x00000001}, + {0x50353441, 0x01000000, 0x00000008}, + {0x50353542, 0x00800000, 0x00000001}, + {0x50353643, 0x02000000, 0x00000001}, + {0x50353743, 0x00800000, 0x00000002}, + {0x50353841, 0x02000000, 0x00000008}, + {0x50353859, 0x00800000, 0x00000000}, + {0x50354142, 0x01000000, 0x00000001}, + {0x50354242, 0x00800000, 0x00000002}, + {0x50354259, 0x02000000, 0x00000002}, + {0x50354342, 0x04000000, 0x00000002}, + {0x50354359, 0x00800000, 0x00000008}, + {0x50354443, 0x02000000, 0x00000001}, + {0x50354642, 0x00800000, 0x00000002}, + {0x50354643, 0x00800000, 0x00000002}, + {0x50354741, 0x01000000, 0x00000001}, + {0x50354743, 0x04000000, 0x00000001}, + {0x50354841, 0x02000000, 0x00000002}, + {0x50354943, 0x01000000, 0x00000001}, + {0x50354A42, 0x02000000, 0x00000001}, + {0x50354A54, 0x01000000, 0x00000002}, + {0x50354A59, 0x08000000, 0x00000002}, + {0x50354B43, 0x04000000, 0x00000005}, + {0x50354C41, 0x04000000, 0x00000001}, + {0x50354D43, 0x04000000, 0x00000001}, + {0x50354F41, 0x02000000, 0x00000005}, + {0x50354F42, 0x10000000, 0x00000005}, + {0x50354F43, 0x04000000, 0x00000001}, + {0x50355043, 0x02000000, 0x00000001}, + {0x50355059, 0x01000000, 0x00000001}, + {0x50355141, 0x04000000, 0x00000001}, + {0x50355241, 0x02000000, 0x00000001}, + {0x50355242, 0x01000000, 0x00000002}, + {0x50355259, 0x02000000, 0x00000002}, + {0x50355341, 0x01000000, 0x00000001}, + {0x50355343, 0x04000000, 0x00000001}, + {0x50355359, 0x02000000, 0x00000001}, + {0x50355459, 0x00800000, 0x00000002}, + {0x50355541, 0x00800000, 0x00000001}, + {0x50355643, 0x02000000, 0x00000001}, + {0x50355659, 0x08000000, 0x00000003}, + {0x50355743, 0x00000000, 0x00000001}, + {0x50355759, 0x01000000, 0x00000001}, + {0x50355842, 0x00800000, 0x00000001}, + {0x50355941, 0x08000000, 0x00000003}, + {0x50363241, 0x01000000, 0x00000008}, + {0x50363242, 0x00800000, 0x00000002}, + {0x50363341, 0x04000000, 0x00000008}, + {0x50363442, 0x01000000, 0x00000001}, + {0x50363642, 0x01000000, 0x00000001}, + {0x50363742, 0x02000000, 0x00000001}, + {0x50363743, 0x02000000, 0x00000002}, + {0x50363842, 0x00800000, 0x00000001}, + {0x50363859, 0x00800000, 0x00000000}, + {0x50364241, 0x02000000, 0x00000001}, + {0x50364243, 0x02000000, 0x00000002}, + {0x50364254, 0x02000000, 0x00000001}, + {0x50364341, 0x01000000, 0x00000002}, + {0x50364542, 0x02000000, 0x00000002}, + {0x50364641, 0x02000000, 0x00000002}, + {0x50364642, 0x00800000, 0x00000001}, + {0x50364743, 0x08000000, 0x00000002}, + {0x50364759, 0x04000000, 0x00000002}, + {0x50364841, 0x02000000, 0x00000001}, + {0x50364843, 0x04000000, 0x00000001}, + {0x50364A56, 0x02000000, 0x00000001}, + {0x50364B41, 0x01000000, 0x00000001}, + {0x50364B59, 0x00800000, 0x00000008}, + {0x50364D41, 0x02000000, 0x00000005}, + {0x50364D43, 0x08000000, 0x00000002}, + {0x50364D54, 0x01000000, 0x00000001}, + {0x50364D59, 0x00800000, 0x00000001}, + {0x50364E41, 0x02000000, 0x00000001}, + {0x50365043, 0x00000000, 0x00000002}, + {0x50365059, 0x01000000, 0x00000001}, + {0x50365241, 0x01000000, 0x00000002}, + {0x50365242, 0x02000000, 0x00000002}, + {0x50365259, 0x02000000, 0x00000002}, + {0x50365342, 0x02000000, 0x00000001}, + {0x50365343, 0x04000000, 0x00000002}, + {0x50365359, 0x04000000, 0x00000005}, + {0x50365541, 0x00800000, 0x00000002}, + {0x50365559, 0x04000000, 0x00000002}, + {0x50365642, 0x01000000, 0x00000001}, + {0x50365643, 0x01000000, 0x00000001}, + {0x50365741, 0x00800000, 0x00000001}, + {0x50365743, 0x04000000, 0x00000002}, + {0x50365842, 0x00800000, 0x00000001}, + {0x50365941, 0x00800000, 0x00000005}, + {0x50365942, 0x01000000, 0x00000001}, + {0x50365A41, 0x01000000, 0x00000005}, + {0x50365A42, 0x04000000, 0x00000002}, + {0x50373241, 0x01000000, 0x00000008}, + {0x50373242, 0x00800000, 0x00000001}, + {0x50373243, 0x08000000, 0x00000003}, + {0x50373442, 0x01000000, 0x00000001}, + {0x50373541, 0x01000000, 0x00000008}, + {0x50373743, 0x02000000, 0x00000003}, + {0x50374143, 0x02000000, 0x00000002}, + {0x50374159, 0x02000000, 0x00000002}, + {0x50374241, 0x00800000, 0x00000001}, + {0x50374242, 0x04000000, 0x00000002}, + {0x50374243, 0x02000000, 0x00000002}, + {0x50374259, 0x04000000, 0x00000002}, + {0x50374341, 0x00800000, 0x00000002}, + {0x50374441, 0x04000000, 0x00000005}, + {0x50374443, 0x01000000, 0x00000001}, + {0x50374542, 0x04000000, 0x00000002}, + {0x50374641, 0x02000000, 0x00000002}, + {0x50374642, 0x00800000, 0x00000001}, + {0x50374659, 0x01000000, 0x00000002}, + {0x50374741, 0x04000000, 0x00000002}, + {0x50374943, 0x04000000, 0x00000002}, + {0x50374A42, 0x00800000, 0x00000001}, + {0x50374C41, 0x02000000, 0x00000001}, + {0x50374C43, 0x01000000, 0x00000002}, + {0x50374D54, 0x04000000, 0x00000002}, + {0x50374D59, 0x04000000, 0x00000002}, + {0x50374E41, 0x02000000, 0x00000002}, + {0x50374E43, 0x01000000, 0x00000002}, + {0x50375141, 0x00800000, 0x00000002}, + {0x50375143, 0x04000000, 0x00000001}, + {0x50375241, 0x08000000, 0x00000002}, + {0x50375259, 0x04000000, 0x00000002}, + {0x50375359, 0x02000000, 0x00000001}, + {0x50375443, 0x00800000, 0x00000002}, + {0x50375459, 0x04000000, 0x00000002}, + {0x50375541, 0x02000000, 0x00000002}, + {0x50375542, 0x08000000, 0x00000001}, + {0x50375643, 0x00800000, 0x00000001}, + {0x50375941, 0x08000000, 0x00000005}, + {0x50375942, 0x00800000, 0x00000001}, + {0x50375943, 0x04000000, 0x00000002}, + {0x50383242, 0x04000000, 0x00000001}, + {0x50383259, 0x02000000, 0x00000008}, + {0x50383342, 0x01000000, 0x00000001}, + {0x50383343, 0x04000000, 0x00000005}, + {0x50383541, 0x02000000, 0x00000008}, + {0x50383542, 0x01000000, 0x00000001}, + {0x50383543, 0x04000000, 0x00000001}, + {0x50383642, 0x00800000, 0x00000001}, + {0x50384149, 0x04000000, 0x00000005}, + {0x50384159, 0x01000000, 0x00000002}, + {0x50384241, 0x02000000, 0x00000001}, + {0x50384243, 0x02000000, 0x00000001}, + {0x50384359, 0x01000000, 0x00000002}, + {0x50384443, 0x02000000, 0x00000002}, + {0x50384642, 0x00800000, 0x00000001}, + {0x50384643, 0x04000000, 0x00000002}, + {0x50384659, 0x02000000, 0x00000003}, + {0x50384741, 0x04000000, 0x00000003}, + {0x50384759, 0x08000000, 0x00000005}, + {0x50384841, 0x02000000, 0x00000001}, + {0x50384843, 0x02000000, 0x00000001}, + {0x50384941, 0x02000000, 0x00000002}, + {0x50384A42, 0x04000000, 0x00000002}, + {0x50384C41, 0x04000000, 0x00000001}, + {0x50384C43, 0x04000000, 0x00000002}, + {0x50384D41, 0x01000000, 0x00000001}, + {0x50384D42, 0x04000000, 0x00000001}, + {0x50384D43, 0x02000000, 0x00000002}, + {0x50384E41, 0x00800000, 0x00000001}, + {0x50384F41, 0x04000000, 0x00000003}, + {0x50384F59, 0x08000000, 0x00000003}, + {0x50385043, 0x02000000, 0x00000002}, + {0x50385059, 0x01000000, 0x00000001}, + {0x50385141, 0x00800000, 0x00000002}, + {0x50385143, 0x01000000, 0x00000001}, + {0x50385243, 0x04000000, 0x00000002}, + {0x50385259, 0x02000000, 0x00000002}, + {0x50385342, 0x04000000, 0x00000002}, + {0x50385343, 0x04000000, 0x00000003}, + {0x50385359, 0x04000000, 0x00000001}, + {0x50385442, 0x08000000, 0x00000001}, + {0x50385459, 0x02000000, 0x00000002}, + {0x50385542, 0x04000000, 0x00000001}, + {0x50385543, 0x00800000, 0x00000001}, + {0x50385642, 0x01000000, 0x00000002}, + {0x50385643, 0x04000000, 0x00000002}, + {0x50385741, 0x04000000, 0x00000001}, + {0x50385742, 0x01000000, 0x00000001}, + {0x50385759, 0x08000000, 0x00000005}, + {0x50385859, 0x08000000, 0x00000001}, + {0x50385942, 0x00800000, 0x00000001}, + {0x50385943, 0x10000000, 0x00000003}, + {0x50385A42, 0x01000000, 0x00000001}, + {0x50393241, 0x00800000, 0x00000008}, + {0x50393343, 0x02000000, 0x00000002}, + {0x50393442, 0x04000000, 0x00000001}, + {0x50393443, 0x04000000, 0x00000005}, + {0x50393459, 0x04000000, 0x00000008}, + {0x50393642, 0x01000000, 0x00000001}, + {0x50393643, 0x04000000, 0x00000002}, + {0x50393741, 0x02000000, 0x00000008}, + {0x50393742, 0x02000000, 0x00000001}, + {0x50394159, 0x00800000, 0x00000001}, + {0x50394241, 0x01000000, 0x00000001}, + {0x50394242, 0x02000000, 0x00000001}, + {0x50394243, 0x08000000, 0x00000005}, + {0x50394259, 0x02000000, 0x00000003}, + {0x50394341, 0x04000000, 0x00000001}, + {0x50394441, 0x04000000, 0x00000003}, + {0x50394442, 0x00800000, 0x00000002}, + {0x50394542, 0x04000000, 0x00000002}, + {0x50394543, 0x01000000, 0x00000003}, + {0x50394641, 0x00800000, 0x00000001}, + {0x50394642, 0x00800000, 0x00000001}, + {0x50394643, 0x02000000, 0x00000003}, + {0x50394659, 0x02000000, 0x00000001}, + {0x50394841, 0x04000000, 0x00000005}, + {0x50394943, 0x01000000, 0x00000002}, + {0x50394A59, 0x00800000, 0x00000005}, + {0x50394B42, 0x10000000, 0x00000003}, + {0x50394C42, 0x08000000, 0x00000001}, + {0x50394D41, 0x01000000, 0x00000002}, + {0x50394D43, 0x01000000, 0x00000001}, + {0x50394D59, 0x01000000, 0x00000001}, + {0x50394E41, 0x01000000, 0x00000001}, + {0x50395042, 0x04000000, 0x00000002}, + {0x50395141, 0x04000000, 0x00000001}, + {0x50395242, 0x01000000, 0x00000001}, + {0x50395259, 0x04000000, 0x00000002}, + {0x50395341, 0x02000000, 0x00000001}, + {0x50395343, 0x00000000, 0x00000001}, + {0x50395442, 0x00800000, 0x00000001}, + {0x50395459, 0x04000000, 0x00000003}, + {0x50395542, 0x04000000, 0x00000001}, + {0x50395642, 0x01000000, 0x00000001}, + {0x50395643, 0x01000000, 0x00000001}, + {0x50395742, 0x08000000, 0x00000002}, + {0x50395759, 0x08000000, 0x00000001}, + {0x50395941, 0x08000000, 0x00000003}, + {0x50395943, 0x04000000, 0x00000001}, + {0x50413342, 0x02000000, 0x00000001}, + {0x50413459, 0x04000000, 0x00000008}, + {0x50413541, 0x04000000, 0x00000001}, + {0x50413542, 0x00800000, 0x00000001}, + {0x50413543, 0x02000000, 0x00000002}, + {0x50413641, 0x02000000, 0x00000005}, + {0x50413741, 0x02000000, 0x00000001}, + {0x50413742, 0x00800000, 0x00000001}, + {0x50413842, 0x02000000, 0x00000001}, + {0x50413859, 0x04000000, 0x00000000}, + {0x50414159, 0x04000000, 0x00000002}, + {0x50414241, 0x02000000, 0x00000001}, + {0x50414254, 0x01000000, 0x00000001}, + {0x50414259, 0x02000000, 0x00000002}, + {0x50414341, 0x00800000, 0x00000001}, + {0x50414342, 0x01000000, 0x00000002}, + {0x50414443, 0x04000000, 0x00000002}, + {0x50414541, 0x08000000, 0x00000001}, + {0x50414642, 0x00000000, 0x00000003}, + {0x50414643, 0x08000000, 0x00000002}, + {0x50414754, 0x01000000, 0x00000001}, + {0x50414759, 0x01000000, 0x00000001}, + {0x50414941, 0x04000000, 0x00000001}, + {0x50414A54, 0x00800000, 0x00000001}, + {0x50414B41, 0x08000000, 0x00000005}, + {0x50414B43, 0x04000000, 0x00000002}, + {0x50414C54, 0x00800000, 0x00000001}, + {0x50414C59, 0x00800000, 0x00000002}, + {0x50414D54, 0x00800000, 0x00000001}, + {0x50414E42, 0x02000000, 0x00000001}, + {0x50414E43, 0x02000000, 0x00000001}, + {0x50414F42, 0x04000000, 0x00000001}, + {0x50415042, 0x02000000, 0x00000002}, + {0x50415043, 0x02000000, 0x00000001}, + {0x50415054, 0x02000000, 0x00000001}, + {0x50415141, 0x02000000, 0x00000001}, + {0x50415241, 0x02000000, 0x00000001}, + {0x50415243, 0x00800000, 0x00000001}, + {0x50415254, 0x00800000, 0x00000001}, + {0x50415343, 0x01000000, 0x00000001}, + {0x50415443, 0x04000000, 0x00000001}, + {0x50415543, 0x04000000, 0x00000001}, + {0x50415641, 0x04000000, 0x00000002}, + {0x50415642, 0x00800000, 0x00000001}, + {0x50415741, 0x04000000, 0x00000002}, + {0x50415742, 0x02000000, 0x00000002}, + {0x50415743, 0x00800000, 0x00000001}, + {0x50415941, 0x02000000, 0x00000002}, + {0x50415A42, 0x08000000, 0x00000001}, + {0x50415A43, 0x02000000, 0x00000002}, + {0x50423342, 0x04000000, 0x00000001}, + {0x50423343, 0x00800000, 0x00000001}, + {0x50423442, 0x04000000, 0x00000002}, + {0x50423443, 0x02000000, 0x00000003}, + {0x50423542, 0x04000000, 0x00000002}, + {0x50423543, 0x01000000, 0x00000003}, + {0x50423641, 0x02000000, 0x00000005}, + {0x50423642, 0x04000000, 0x00000001}, + {0x50423643, 0x02000000, 0x00000002}, + {0x50423741, 0x01000000, 0x00000001}, + {0x50423841, 0x00800000, 0x00000002}, + {0x50423842, 0x01000000, 0x00000002}, + {0x50423959, 0x08000000, 0x00000000}, + {0x50424142, 0x01000000, 0x00000002}, + {0x50424243, 0x01000000, 0x00000002}, + {0x50424259, 0x02000000, 0x00000001}, + {0x50424341, 0x04000000, 0x00000003}, + {0x50424354, 0x08000000, 0x00000001}, + {0x50424441, 0x04000000, 0x00000002}, + {0x50424442, 0x04000000, 0x00000002}, + {0x50424443, 0x04000000, 0x00000001}, + {0x50424542, 0x10000000, 0x00000003}, + {0x50424641, 0x00800000, 0x00000001}, + {0x50424642, 0x01000000, 0x00000002}, + {0x50424654, 0x01000000, 0x00000001}, + {0x50424742, 0x00800000, 0x00000002}, + {0x50424841, 0x02000000, 0x00000002}, + {0x50424842, 0x00800000, 0x00000001}, + {0x50424942, 0x01000000, 0x00000003}, + {0x50424959, 0x02000000, 0x00000001}, + {0x50424A42, 0x04000000, 0x00000001}, + {0x50424A59, 0x04000000, 0x00000001}, + {0x50424B41, 0x04000000, 0x00000003}, + {0x50424C42, 0x04000000, 0x00000002}, + {0x50424C43, 0x08000000, 0x00000003}, + {0x50424E43, 0x04000000, 0x00000003}, + {0x50425054, 0x00800000, 0x00000002}, + {0x50425141, 0x02000000, 0x00000001}, + {0x50425159, 0x00800000, 0x00000001}, + {0x50425241, 0x02000000, 0x00000001}, + {0x50425341, 0x04000000, 0x00000002}, + {0x50425343, 0x01000000, 0x00000002}, + {0x50425359, 0x02000000, 0x00000002}, + {0x50425442, 0x04000000, 0x00000002}, + {0x50425543, 0x04000000, 0x00000003}, + {0x50425559, 0x04000000, 0x00000002}, + {0x50425741, 0x00800000, 0x00000001}, + {0x50425742, 0x04000000, 0x00000002}, + {0x50425743, 0x00800000, 0x00000001}, + {0x50425759, 0x02000000, 0x00000002}, + {0x50425855, 0x08000000, 0x00000008}, + {0x50425942, 0x01000000, 0x00000001}, + {0x50425943, 0x04000000, 0x00000001}, + {0x50425959, 0x08000000, 0x00000005}, + {0x50425A41, 0x00800000, 0x00000001}, + {0x50433342, 0x04000000, 0x00000002}, + {0x50433441, 0x02000000, 0x00000003}, + {0x50433459, 0x08000000, 0x00000008}, + {0x50433543, 0x01000000, 0x00000003}, + {0x50433641, 0x02000000, 0x00000005}, + {0x50433643, 0x10000000, 0x00000005}, + {0x50433741, 0x01000000, 0x00000001}, + {0x50433742, 0x00800000, 0x00000002}, + {0x50433841, 0x02000000, 0x00000002}, + {0x50433859, 0x00800000, 0x00000008}, + {0x50434241, 0x04000000, 0x00000005}, + {0x50434259, 0x02000000, 0x00000002}, + {0x50434341, 0x02000000, 0x00000001}, + {0x50434342, 0x04000000, 0x00000002}, + {0x50434354, 0x00800000, 0x00000001}, + {0x50434441, 0x02000000, 0x00000001}, + {0x50434443, 0x04000000, 0x00000003}, + {0x50434541, 0x04000000, 0x00000001}, + {0x50434543, 0x04000000, 0x00000002}, + {0x50434559, 0x02000000, 0x00000001}, + {0x50434641, 0x00800000, 0x00000001}, + {0x50434659, 0x08000000, 0x00000002}, + {0x50434741, 0x04000000, 0x00000003}, + {0x50434742, 0x00800000, 0x00000001}, + {0x50434759, 0x02000000, 0x00000002}, + {0x50434859, 0x00800000, 0x00000001}, + {0x50434941, 0x01000000, 0x00000001}, + {0x50434943, 0x04000000, 0x00000003}, + {0x50434956, 0x08000000, 0x00000002}, + {0x50434A42, 0x04000000, 0x00000002}, + {0x50434A43, 0x04000000, 0x00000002}, + {0x50434A59, 0x04000000, 0x00000002}, + {0x50434C41, 0x01000000, 0x00000008}, + {0x50434C42, 0x04000000, 0x00000002}, + {0x50434C43, 0x02000000, 0x00000001}, + {0x50434D41, 0x02000000, 0x00000005}, + {0x50434D42, 0x01000000, 0x00000001}, + {0x50434D54, 0x04000000, 0x00000003}, + {0x50435041, 0x01000000, 0x00000001}, + {0x50435043, 0x00800000, 0x00000002}, + {0x50435159, 0x01000000, 0x00000001}, + {0x50435242, 0x04000000, 0x00000003}, + {0x50435243, 0x02000000, 0x00000001}, + {0x50435254, 0x04000000, 0x00000001}, + {0x50435341, 0x04000000, 0x00000002}, + {0x50435343, 0x08000000, 0x00000001}, + {0x50435441, 0x04000000, 0x00000005}, + {0x50435442, 0x01000000, 0x00000001}, + {0x50435641, 0x04000000, 0x00000005}, + {0x50435642, 0x00800000, 0x00000001}, + {0x50435759, 0x02000000, 0x00000002}, + {0x50435842, 0x01000000, 0x00000001}, + {0x50435943, 0x02000000, 0x00000002}, + {0x50435959, 0x04000000, 0x00000001}, + {0x50443241, 0x02000000, 0x00000002}, + {0x50443242, 0x02000000, 0x00000002}, + {0x50443343, 0x01000000, 0x00000001}, + {0x50443442, 0x01000000, 0x00000001}, + {0x50443741, 0x01000000, 0x00000001}, + {0x50443841, 0x04000000, 0x00000002}, + {0x50444154, 0x08000000, 0x00000005}, + {0x50444156, 0x02000000, 0x00000001}, + {0x50444159, 0x01000000, 0x00000001}, + {0x50444343, 0x00000000, 0x00000003}, + {0x50444354, 0x02000000, 0x00000001}, + {0x50444441, 0x01000000, 0x00000001}, + {0x50444442, 0x01000000, 0x00000001}, + {0x50444454, 0x00800000, 0x00000001}, + {0x50444459, 0x01000000, 0x00000001}, + {0x50444541, 0x00800000, 0x00000001}, + {0x50444559, 0x00800000, 0x00000001}, + {0x50444641, 0x04000000, 0x00000002}, + {0x50444643, 0x08000000, 0x00000002}, + {0x50444743, 0x01000000, 0x00000001}, + {0x50444759, 0x00800000, 0x00000002}, + {0x50444841, 0x04000000, 0x00000002}, + {0x50444842, 0x04000000, 0x00000001}, + {0x50444859, 0x04000000, 0x00000001}, + {0x50444943, 0x02000000, 0x00000003}, + {0x50444A54, 0x01000000, 0x00000001}, + {0x50444A59, 0x02000000, 0x00000002}, + {0x50444B41, 0x02000000, 0x00000002}, + {0x50444C41, 0x04000000, 0x00000003}, + {0x50444C42, 0x04000000, 0x00000002}, + {0x50444C54, 0x02000000, 0x00000001}, + {0x50444C59, 0x04000000, 0x00000005}, + {0x50444D42, 0x00000000, 0x00000001}, + {0x50444D43, 0x02000000, 0x00000005}, + {0x50444D54, 0x04000000, 0x00000002}, + {0x50444E41, 0x01000000, 0x00000005}, + {0x50444E42, 0x02000000, 0x00000001}, + {0x50444E43, 0x04000000, 0x00000002}, + {0x50445041, 0x02000000, 0x00000002}, + {0x50445042, 0x04000000, 0x00000002}, + {0x50445043, 0x02000000, 0x00000001}, + {0x50445054, 0x08000000, 0x00000001}, + {0x50445059, 0x04000000, 0x00000003}, + {0x50445241, 0x02000000, 0x00000001}, + {0x50445243, 0x01000000, 0x00000001}, + {0x50445259, 0x02000000, 0x00000001}, + {0x50445341, 0x01000000, 0x00000001}, + {0x50445343, 0x02000000, 0x00000001}, + {0x50445441, 0x01000000, 0x00000002}, + {0x50445442, 0x01000000, 0x00000001}, + {0x50445443, 0x04000000, 0x00000002}, + {0x50445641, 0x01000000, 0x00000002}, + {0x50445643, 0x00800000, 0x00000001}, + {0x50445741, 0x02000000, 0x00000005}, + {0x50445743, 0x02000000, 0x00000003}, + {0x50445759, 0x01000000, 0x00000002}, + {0x50445A42, 0x08000000, 0x00000001}, + {0x50453242, 0x00800000, 0x00000001}, + {0x50453341, 0x00800000, 0x00000002}, + {0x50453442, 0x01000000, 0x00000001}, + {0x50453642, 0x02000000, 0x00000001}, + {0x50453643, 0x00800000, 0x00000002}, + {0x50453741, 0x02000000, 0x00000001}, + {0x50454156, 0x02000000, 0x00000001}, + {0x50454254, 0x04000000, 0x00000001}, + {0x50454342, 0x02000000, 0x00000002}, + {0x50454343, 0x00000000, 0x00000005}, + {0x50454359, 0x02000000, 0x00000002}, + {0x50454442, 0x04000000, 0x00000002}, + {0x50454443, 0x00800000, 0x00000001}, + {0x50454542, 0x10000000, 0x00000003}, + {0x50454559, 0x10000000, 0x00000003}, + {0x50454641, 0x04000000, 0x00000003}, + {0x50454659, 0x04000000, 0x00000005}, + {0x50454741, 0x01000000, 0x00000001}, + {0x50454742, 0x04000000, 0x00000001}, + {0x50454841, 0x08000000, 0x00000005}, + {0x50454843, 0x02000000, 0x00000002}, + {0x50454854, 0x01000000, 0x00000001}, + {0x50454A59, 0x01000000, 0x00000001}, + {0x50454B42, 0x04000000, 0x00000002}, + {0x50454C43, 0x02000000, 0x00000001}, + {0x50454C54, 0x02000000, 0x00000001}, + {0x50454C59, 0x02000000, 0x00000001}, + {0x50454D56, 0x02000000, 0x00000001}, + {0x50454F59, 0x01000000, 0x00000005}, + {0x50455141, 0x00800000, 0x00000002}, + {0x50455143, 0x04000000, 0x00000002}, + {0x50455241, 0x04000000, 0x00000001}, + {0x50455341, 0x08000000, 0x00000002}, + {0x50455443, 0x00800000, 0x00000001}, + {0x50455459, 0x02000000, 0x00000003}, + {0x50455542, 0x02000000, 0x00000001}, + {0x50455543, 0x01000000, 0x00000002}, + {0x50455641, 0x01000000, 0x00000001}, + {0x50455642, 0x00800000, 0x00000002}, + {0x50455741, 0x04000000, 0x00000005}, + {0x50455743, 0x01000000, 0x00000002}, + {0x50455842, 0x04000000, 0x00000001}, + {0x50455942, 0x02000000, 0x00000001}, + {0x50455959, 0x00000000, 0x00000002}, + {0x50455A41, 0x08000000, 0x00000006}, + {0x50463259, 0x04000000, 0x00000008}, + {0x50463342, 0x00800000, 0x00000001}, + {0x50463343, 0x00000000, 0x00000002}, + {0x50463541, 0x08000000, 0x00000002}, + {0x50463641, 0x08000000, 0x00000003}, + {0x50463642, 0x08000000, 0x00000001}, + {0x50463741, 0x02000000, 0x00000001}, + {0x50463743, 0x01000000, 0x00000003}, + {0x50464156, 0x02000000, 0x00000001}, + {0x50464159, 0x02000000, 0x00000002}, + {0x50464243, 0x00000000, 0x00000003}, + {0x50464341, 0x04000000, 0x00000002}, + {0x50464342, 0x01000000, 0x00000002}, + {0x50464343, 0x00800000, 0x00000001}, + {0x50464354, 0x04000000, 0x00000002}, + {0x50464441, 0x01000000, 0x00000001}, + {0x50464443, 0x04000000, 0x00000002}, + {0x50464542, 0x00800000, 0x00000001}, + {0x50464543, 0x01000000, 0x00000001}, + {0x50464641, 0x08000000, 0x00000003}, + {0x50464643, 0x00800000, 0x00000005}, + {0x50464741, 0x04000000, 0x00000002}, + {0x50464743, 0x00800000, 0x00000001}, + {0x50464759, 0x01000000, 0x00000001}, + {0x50464841, 0x02000000, 0x00000001}, + {0x50464843, 0x02000000, 0x00000002}, + {0x50464859, 0x00800000, 0x00000002}, + {0x50464943, 0x02000000, 0x00000001}, + {0x50464959, 0x04000000, 0x00000002}, + {0x50464A59, 0x08000000, 0x00000002}, + {0x50464B43, 0x02000000, 0x00000001}, + {0x50464B59, 0x02000000, 0x00000001}, + {0x50464C42, 0x10000000, 0x00000003}, + {0x50464C43, 0x02000000, 0x00000001}, + {0x50464C54, 0x01000000, 0x00000001}, + {0x50464C59, 0x04000000, 0x00000001}, + {0x50464D41, 0x01000000, 0x00000001}, + {0x50464D42, 0x02000000, 0x00000002}, + {0x50464D59, 0x04000000, 0x00000003}, + {0x50464E41, 0x02000000, 0x00000005}, + {0x50464F41, 0x01000000, 0x00000001}, + {0x50465042, 0x04000000, 0x00000002}, + {0x50465054, 0x02000000, 0x00000001}, + {0x50465159, 0x02000000, 0x00000002}, + {0x50465241, 0x08000000, 0x00000003}, + {0x50465242, 0x08000000, 0x00000003}, + {0x50465243, 0x02000000, 0x00000002}, + {0x50465259, 0x02000000, 0x00000002}, + {0x50465341, 0x04000000, 0x00000005}, + {0x50465342, 0x02000000, 0x00000001}, + {0x50465359, 0x04000000, 0x00000001}, + {0x50465441, 0x01000000, 0x00000001}, + {0x50465443, 0x08000000, 0x00000001}, + {0x50465541, 0x04000000, 0x00000002}, + {0x50465543, 0x01000000, 0x00000001}, + {0x50465643, 0x01000000, 0x00000001}, + {0x50465659, 0x02000000, 0x00000001}, + {0x50465743, 0x02000000, 0x00000002}, + {0x50465841, 0x08000000, 0x00000003}, + {0x50465842, 0x04000000, 0x00000001}, + {0x50465943, 0x08000000, 0x00000003}, + {0x50465956, 0x02000000, 0x00000001}, + {0x50465A42, 0x04000000, 0x00000001}, + {0x50473241, 0x02000000, 0x00000003}, + {0x50473459, 0x01000000, 0x00000008}, + {0x50473559, 0x01000000, 0x00000002}, + {0x50473642, 0x01000000, 0x00000001}, + {0x50473742, 0x00800000, 0x00000001}, + {0x50473743, 0x01000000, 0x00000001}, + {0x50473759, 0x08000000, 0x00000008}, + {0x50474142, 0x01000000, 0x00000001}, + {0x50474143, 0x02000000, 0x00000001}, + {0x50474159, 0x04000000, 0x00000001}, + {0x50474243, 0x02000000, 0x00000005}, + {0x50474254, 0x00800000, 0x00000001}, + {0x50474259, 0x00800000, 0x00000001}, + {0x50474354, 0x04000000, 0x00000001}, + {0x50474441, 0x04000000, 0x00000005}, + {0x50474443, 0x04000000, 0x00000006}, + {0x50474541, 0x04000000, 0x00000001}, + {0x50474542, 0x00800000, 0x00000001}, + {0x50474641, 0x04000000, 0x00000001}, + {0x50474659, 0x01000000, 0x00000001}, + {0x50474742, 0x02000000, 0x00000005}, + {0x50474754, 0x00800000, 0x00000001}, + {0x50474842, 0x02000000, 0x00000001}, + {0x50474942, 0x02000000, 0x00000001}, + {0x50474959, 0x02000000, 0x00000001}, + {0x50474B41, 0x02000000, 0x00000002}, + {0x50474B59, 0x10000000, 0x00000003}, + {0x50474C59, 0x04000000, 0x00000001}, + {0x50474D41, 0x01000000, 0x00000001}, + {0x50474D42, 0x02000000, 0x00000001}, + {0x50474D43, 0x04000000, 0x00000001}, + {0x50474D54, 0x04000000, 0x00000002}, + {0x50474E41, 0x08000000, 0x00000005}, + {0x50474E59, 0x08000000, 0x00000003}, + {0x50474F41, 0x00800000, 0x00000001}, + {0x50474F59, 0x08000000, 0x00000003}, + {0x50475041, 0x01000000, 0x00000001}, + {0x50475059, 0x04000000, 0x00000002}, + {0x50475241, 0x02000000, 0x00000005}, + {0x50475243, 0x01000000, 0x00000001}, + {0x50475541, 0x02000000, 0x00000002}, + {0x50475543, 0x02000000, 0x00000002}, + {0x50475842, 0x04000000, 0x00000002}, + {0x50475843, 0x00800000, 0x00000001}, + {0x50475941, 0x04000000, 0x00000002}, + {0x50475956, 0x04000000, 0x00000001}, + {0x50483241, 0x02000000, 0x00000005}, + {0x50483243, 0x02000000, 0x00000002}, + {0x50483341, 0x02000000, 0x00000001}, + {0x50483343, 0x00800000, 0x00000001}, + {0x50483442, 0x02000000, 0x00000001}, + {0x50483741, 0x02000000, 0x00000001}, + {0x50483742, 0x04000000, 0x00000002}, + {0x50483842, 0x04000000, 0x00000002}, + {0x50484159, 0x04000000, 0x00000002}, + {0x50484241, 0x08000000, 0x00000002}, + {0x50484259, 0x02000000, 0x00000002}, + {0x50484341, 0x04000000, 0x00000005}, + {0x50484342, 0x00800000, 0x00000001}, + {0x50484442, 0x02000000, 0x00000002}, + {0x50484459, 0x02000000, 0x00000005}, + {0x50484541, 0x04000000, 0x00000002}, + {0x50484542, 0x01000000, 0x00000002}, + {0x50484559, 0x04000000, 0x00000001}, + {0x50484643, 0x04000000, 0x00000003}, + {0x50484659, 0x04000000, 0x00000002}, + {0x50484742, 0x10000000, 0x00000001}, + {0x50484743, 0x02000000, 0x00000002}, + {0x50484759, 0x08000000, 0x00000001}, + {0x50484841, 0x04000000, 0x00000001}, + {0x50484842, 0x01000000, 0x00000001}, + {0x50484943, 0x04000000, 0x00000002}, + {0x50484959, 0x02000000, 0x00000002}, + {0x50484A42, 0x01000000, 0x00000001}, + {0x50484B43, 0x02000000, 0x00000002}, + {0x50484B56, 0x02000000, 0x00000002}, + {0x50484C41, 0x02000000, 0x00000001}, + {0x50484C42, 0x08000000, 0x00000001}, + {0x50484C54, 0x01000000, 0x00000001}, + {0x50484D41, 0x04000000, 0x00000005}, + {0x50484D42, 0x04000000, 0x00000001}, + {0x50484D54, 0x00800000, 0x00000001}, + {0x50484E41, 0x08000000, 0x00000006}, + {0x50484E43, 0x04000000, 0x00000002}, + {0x50485041, 0x02000000, 0x00000005}, + {0x50485043, 0x04000000, 0x00000001}, + {0x50485243, 0x02000000, 0x00000002}, + {0x50485254, 0x02000000, 0x00000001}, + {0x50485341, 0x02000000, 0x00000002}, + {0x50485441, 0x04000000, 0x00000001}, + {0x50485641, 0x04000000, 0x00000002}, + {0x50485643, 0x04000000, 0x00000002}, + {0x50485741, 0x01000000, 0x00000001}, + {0x50485759, 0x01000000, 0x00000001}, + {0x50485843, 0x02000000, 0x00000001}, + {0x50485959, 0x04000000, 0x00000001}, + {0x50485A42, 0x01000000, 0x00000001}, + {0x50485A59, 0x04000000, 0x00000001}, + {0x50493241, 0x02000000, 0x00000005}, + {0x50493242, 0x04000000, 0x00000001}, + {0x50493341, 0x08000000, 0x00000002}, + {0x50493441, 0x04000000, 0x00000001}, + {0x50493642, 0x04000000, 0x00000002}, + {0x50493741, 0x02000000, 0x00000001}, + {0x50493742, 0x02000000, 0x00000001}, + {0x50493842, 0x04000000, 0x00000001}, + {0x50494159, 0x04000000, 0x00000001}, + {0x50494341, 0x02000000, 0x00000002}, + {0x50494342, 0x02000000, 0x00000002}, + {0x50494359, 0x01000000, 0x00000001}, + {0x50494442, 0x04000000, 0x00000001}, + {0x50494443, 0x02000000, 0x00000001}, + {0x50494542, 0x01000000, 0x00000001}, + {0x50494641, 0x02000000, 0x00000002}, + {0x50494643, 0x08000000, 0x00000003}, + {0x50494659, 0x04000000, 0x00000001}, + {0x50494742, 0x04000000, 0x00000001}, + {0x50494759, 0x00800000, 0x00000002}, + {0x50494842, 0x04000000, 0x00000002}, + {0x50494959, 0x00800000, 0x00000001}, + {0x50494A43, 0x02000000, 0x00000002}, + {0x50494B42, 0x08000000, 0x00000007}, + {0x50494C43, 0x04000000, 0x00000001}, + {0x50494C56, 0x02000000, 0x00000001}, + {0x50494C59, 0x04000000, 0x00000002}, + {0x50494D43, 0x00800000, 0x00000001}, + {0x50494E41, 0x08000000, 0x00000005}, + {0x50494E42, 0x02000000, 0x00000001}, + {0x50494E43, 0x04000000, 0x00000001}, + {0x50494E59, 0x08000000, 0x00000002}, + {0x50494F42, 0x02000000, 0x00000002}, + {0x50495042, 0x00800000, 0x00000001}, + {0x50495043, 0x01000000, 0x00000002}, + {0x50495056, 0x02000000, 0x00000002}, + {0x50495059, 0x02000000, 0x00000003}, + {0x50495141, 0x02000000, 0x00000005}, + {0x50495241, 0x01000000, 0x00000001}, + {0x50495243, 0x02000000, 0x00000002}, + {0x50495259, 0x04000000, 0x00000002}, + {0x50495341, 0x02000000, 0x00000002}, + {0x50495342, 0x04000000, 0x00000001}, + {0x50495441, 0x01000000, 0x00000008}, + {0x50495442, 0x01000000, 0x00000001}, + {0x50495456, 0x02000000, 0x00000001}, + {0x50495541, 0x02000000, 0x00000001}, + {0x50495543, 0x02000000, 0x00000002}, + {0x50495559, 0x04000000, 0x00000002}, + {0x50495641, 0x04000000, 0x00000001}, + {0x50495659, 0x08000000, 0x00000003}, + {0x50495741, 0x08000000, 0x00000005}, + {0x50495742, 0x01000000, 0x00000002}, + {0x50495941, 0x01000000, 0x00000001}, + {0x50495A41, 0x00800000, 0x00000002}, + {0x504A3259, 0x04000000, 0x00000008}, + {0x504A3343, 0x10000000, 0x00000003}, + {0x504A3356, 0x04000000, 0x00000001}, + {0x504A3442, 0x00800000, 0x00000001}, + {0x504A3542, 0x01000000, 0x00000001}, + {0x504A3642, 0x00800000, 0x00000001}, + {0x504A3742, 0x01000000, 0x00000001}, + {0x504A4241, 0x04000000, 0x00000005}, + {0x504A4243, 0x08000000, 0x00000003}, + {0x504A4259, 0x00800000, 0x00000001}, + {0x504A4341, 0x04000000, 0x00000001}, + {0x504A4343, 0x04000000, 0x00000002}, + {0x504A4359, 0x02000000, 0x00000005}, + {0x504A4559, 0x01000000, 0x00000002}, + {0x504A4643, 0x02000000, 0x00000002}, + {0x504A4743, 0x02000000, 0x00000002}, + {0x504A4759, 0x02000000, 0x00000001}, + {0x504A4841, 0x01000000, 0x00000002}, + {0x504A4943, 0x00800000, 0x00000001}, + {0x504A4959, 0x00000000, 0x00000002}, + {0x504A4A43, 0x00800000, 0x00000002}, + {0x504A4B43, 0x02000000, 0x00000001}, + {0x504A4C41, 0x01000000, 0x00000001}, + {0x504A4C42, 0x04000000, 0x00000001}, + {0x504A4C43, 0x08000000, 0x00000002}, + {0x504A4C54, 0x08000000, 0x00000002}, + {0x504A4C59, 0x04000000, 0x00000001}, + {0x504A4D43, 0x01000000, 0x00000002}, + {0x504A4D59, 0x04000000, 0x00000001}, + {0x504A4E41, 0x02000000, 0x00000001}, + {0x504A4E42, 0x01000000, 0x00000001}, + {0x504A4E43, 0x02000000, 0x00000001}, + {0x504A4E59, 0x02000000, 0x00000001}, + {0x504A4F42, 0x04000000, 0x00000002}, + {0x504A5042, 0x00800000, 0x00000001}, + {0x504A5043, 0x04000000, 0x00000002}, + {0x504A5141, 0x08000000, 0x00000001}, + {0x504A5143, 0x00800000, 0x00000001}, + {0x504A5243, 0x02000000, 0x00000001}, + {0x504A5259, 0x08000000, 0x00000002}, + {0x504A5341, 0x04000000, 0x00000005}, + {0x504A5342, 0x01000000, 0x00000001}, + {0x504A5359, 0x00800000, 0x00000001}, + {0x504A5441, 0x01000000, 0x00000002}, + {0x504A5541, 0x04000000, 0x00000001}, + {0x504A5542, 0x08000000, 0x00000001}, + {0x504A5641, 0x04000000, 0x00000002}, + {0x504A5659, 0x01000000, 0x00000001}, + {0x504A5743, 0x00000000, 0x00000001}, + {0x504A5759, 0x00800000, 0x00000002}, + {0x504A5841, 0x08000000, 0x00000003}, + {0x504A5842, 0x00000000, 0x00000001}, + {0x504A5A43, 0x01000000, 0x00000001}, + {0x504B3342, 0x01000000, 0x00000001}, + {0x504B3443, 0x00800000, 0x00000001}, + {0x504B3641, 0x08000000, 0x00000003}, + {0x504B3642, 0x08000000, 0x00000003}, + {0x504B3842, 0x02000000, 0x00000002}, + {0x504B3859, 0x00800000, 0x00000008}, + {0x504B4159, 0x08000000, 0x00000002}, + {0x504B4241, 0x00800000, 0x00000001}, + {0x504B4242, 0x02000000, 0x00000002}, + {0x504B4243, 0x04000000, 0x00000002}, + {0x504B4343, 0x04000000, 0x00000001}, + {0x504B4541, 0x04000000, 0x00000002}, + {0x504B4641, 0x00800000, 0x00000001}, + {0x504B4742, 0x01000000, 0x00000001}, + {0x504B4841, 0x04000000, 0x00000003}, + {0x504B4843, 0x01000000, 0x00000001}, + {0x504B4A59, 0x08000000, 0x00000002}, + {0x504B4B41, 0x01000000, 0x00000003}, + {0x504B4C41, 0x08000000, 0x00000003}, + {0x504B4C43, 0x04000000, 0x00000001}, + {0x504B4C54, 0x10000000, 0x00000002}, + {0x504B4C59, 0x02000000, 0x00000002}, + {0x504B4E41, 0x01000000, 0x00000001}, + {0x504B4E59, 0x04000000, 0x00000002}, + {0x504B5043, 0x02000000, 0x00000008}, + {0x504B5142, 0x01000000, 0x00000001}, + {0x504B5143, 0x04000000, 0x00000001}, + {0x504B5159, 0x02000000, 0x00000001}, + {0x504B5243, 0x00000000, 0x00000001}, + {0x504B5341, 0x04000000, 0x00000002}, + {0x504B5441, 0x04000000, 0x00000002}, + {0x504B5559, 0x04000000, 0x00000001}, + {0x504B5641, 0x01000000, 0x00000001}, + {0x504B5642, 0x04000000, 0x00000002}, + {0x504B5741, 0x04000000, 0x00000003}, + {0x504B5759, 0x04000000, 0x00000002}, + {0x504B5842, 0x02000000, 0x00000001}, + {0x504B5843, 0x04000000, 0x00000001}, + {0x504B5943, 0x02000000, 0x00000002}, + {0x504B5A41, 0x00800000, 0x00000002}, + {0x504C3241, 0x01000000, 0x00000003}, + {0x504C3242, 0x02000000, 0x00000001}, + {0x504C3541, 0x08000000, 0x00000002}, + {0x504C3543, 0x02000000, 0x00000001}, + {0x504C3742, 0x00800000, 0x00000001}, + {0x504C3743, 0x08000000, 0x00000002}, + {0x504C3859, 0x08000000, 0x00000000}, + {0x504C4143, 0x04000000, 0x00000001}, + {0x504C4241, 0x08000000, 0x00000002}, + {0x504C4242, 0x02000000, 0x00000001}, + {0x504C4259, 0x00800000, 0x00000001}, + {0x504C4341, 0x08000000, 0x00000003}, + {0x504C4354, 0x02000000, 0x00000001}, + {0x504C4441, 0x04000000, 0x00000003}, + {0x504C4443, 0x02000000, 0x00000005}, + {0x504C4642, 0x04000000, 0x00000002}, + {0x504C4741, 0x02000000, 0x00000001}, + {0x504C4742, 0x01000000, 0x00000001}, + {0x504C4759, 0x04000000, 0x00000002}, + {0x504C4859, 0x08000000, 0x00000003}, + {0x504C4A41, 0x04000000, 0x00000001}, + {0x504C4A43, 0x02000000, 0x00000002}, + {0x504C4A54, 0x00800000, 0x00000001}, + {0x504C4A59, 0x01000000, 0x00000002}, + {0x504C4D41, 0x02000000, 0x00000002}, + {0x504C4E41, 0x04000000, 0x00000001}, + {0x504C4E59, 0x04000000, 0x00000001}, + {0x504C4F41, 0x00800000, 0x00000001}, + {0x504C4F43, 0x08000000, 0x00000003}, + {0x504C5041, 0x00800000, 0x00000002}, + {0x504C5042, 0x02000000, 0x00000001}, + {0x504C5043, 0x02000000, 0x00000001}, + {0x504C5054, 0x04000000, 0x00000001}, + {0x504C5059, 0x00800000, 0x00000001}, + {0x504C5141, 0x00800000, 0x00000001}, + {0x504C5159, 0x08000000, 0x00000002}, + {0x504C5243, 0x02000000, 0x00000001}, + {0x504C5259, 0x02000000, 0x00000001}, + {0x504C5342, 0x02000000, 0x00000003}, + {0x504C5441, 0x01000000, 0x00000001}, + {0x504C5443, 0x02000000, 0x00000003}, + {0x504C5459, 0x00800000, 0x00000002}, + {0x504C5643, 0x01000000, 0x00000001}, + {0x504C5741, 0x08000000, 0x00000003}, + {0x504C5742, 0x04000000, 0x00000003}, + {0x504C5759, 0x02000000, 0x00000001}, + {0x504C5841, 0x04000000, 0x00000001}, + {0x504C5843, 0x04000000, 0x00000002}, + {0x504C5941, 0x02000000, 0x00000002}, + {0x504C5943, 0x04000000, 0x00000002}, + {0x504C5956, 0x04000000, 0x00000001}, + {0x504C5A41, 0x10000000, 0x00000007}, + {0x504C5A42, 0x00800000, 0x00000002}, + {0x504C5A43, 0x02000000, 0x00000002}, + {0x504D3241, 0x00800000, 0x00000001}, + {0x504D3242, 0x08000000, 0x00000002}, + {0x504D3243, 0x02000000, 0x00000002}, + {0x504D3341, 0x08000000, 0x00000002}, + {0x504D3443, 0x04000000, 0x00000001}, + {0x504D3643, 0x04000000, 0x00000002}, + {0x504D3743, 0x00000000, 0x00000003}, + {0x504D4142, 0x02000000, 0x00000002}, + {0x504D4154, 0x02000000, 0x00000001}, + {0x504D4156, 0x02000000, 0x00000001}, + {0x504D4159, 0x00800000, 0x00000001}, + {0x504D4241, 0x00800000, 0x00000001}, + {0x504D4242, 0x00800000, 0x00000001}, + {0x504D4243, 0x02000000, 0x00000002}, + {0x504D4254, 0x04000000, 0x00000001}, + {0x504D4341, 0x01000000, 0x00000001}, + {0x504D4342, 0x04000000, 0x00000001}, + {0x504D4343, 0x04000000, 0x00000002}, + {0x504D4354, 0x04000000, 0x00000002}, + {0x504D4356, 0x04000000, 0x00000002}, + {0x504D4359, 0x02000000, 0x00000001}, + {0x504D4441, 0x04000000, 0x00000005}, + {0x504D4442, 0x04000000, 0x00000002}, + {0x504D4459, 0x02000000, 0x00000002}, + {0x504D4556, 0x04000000, 0x00000001}, + {0x504D4559, 0x04000000, 0x00000003}, + {0x504D4642, 0x02000000, 0x00000002}, + {0x504D4742, 0x04000000, 0x00000003}, + {0x504D4843, 0x04000000, 0x00000002}, + {0x504D4943, 0x00000000, 0x00000002}, + {0x504D4959, 0x04000000, 0x00000001}, + {0x504D4A54, 0x00800000, 0x00000001}, + {0x504D4C42, 0x02000000, 0x00000001}, + {0x504D4C54, 0x08000000, 0x00000001}, + {0x504D4D59, 0x02000000, 0x00000001}, + {0x504D4E41, 0x04000000, 0x00000005}, + {0x504D4E43, 0x04000000, 0x00000001}, + {0x504D4E59, 0x01000000, 0x00000002}, + {0x504D5042, 0x02000000, 0x00000001}, + {0x504D5043, 0x04000000, 0x00000002}, + {0x504D5141, 0x00800000, 0x00000001}, + {0x504D5143, 0x00000000, 0x00000001}, + {0x504D5241, 0x04000000, 0x00000002}, + {0x504D5242, 0x01000000, 0x00000002}, + {0x504D5259, 0x02000000, 0x00000003}, + {0x504D5341, 0x01000000, 0x00000002}, + {0x504D5342, 0x01000000, 0x00000002}, + {0x504D5343, 0x01000000, 0x00000003}, + {0x504D5442, 0x00800000, 0x00000002}, + {0x504D5459, 0x04000000, 0x00000002}, + {0x504D5642, 0x02000000, 0x00000001}, + {0x504D5643, 0x02000000, 0x00000002}, + {0x504D5742, 0x01000000, 0x00000001}, + {0x504D5842, 0x04000000, 0x00000002}, + {0x504D5A43, 0x02000000, 0x00000001}, + {0x504E3242, 0x02000000, 0x00000001}, + {0x504E3342, 0x02000000, 0x00000001}, + {0x504E3542, 0x01000000, 0x00000001}, + {0x504E3543, 0x01000000, 0x00000001}, + {0x504E3641, 0x08000000, 0x00000003}, + {0x504E3642, 0x00800000, 0x00000001}, + {0x504E3742, 0x08000000, 0x00000003}, + {0x504E3841, 0x02000000, 0x00000005}, + {0x504E3842, 0x01000000, 0x00000001}, + {0x504E4142, 0x01000000, 0x00000002}, + {0x504E4143, 0x02000000, 0x00000005}, + {0x504E4241, 0x08000000, 0x00000002}, + {0x504E4243, 0x02000000, 0x00000001}, + {0x504E4259, 0x04000000, 0x00000007}, + {0x504E4341, 0x01000000, 0x00000002}, + {0x504E4343, 0x00000000, 0x00000001}, + {0x504E4443, 0x08000000, 0x00000001}, + {0x504E4541, 0x04000000, 0x00000002}, + {0x504E4542, 0x00800000, 0x00000001}, + {0x504E4559, 0x00800000, 0x00000001}, + {0x504E4641, 0x02000000, 0x00000002}, + {0x504E4642, 0x00800000, 0x00000001}, + {0x504E4654, 0x04000000, 0x00000002}, + {0x504E4741, 0x02000000, 0x00000001}, + {0x504E4743, 0x04000000, 0x00000002}, + {0x504E4759, 0x04000000, 0x00000002}, + {0x504E4841, 0x02000000, 0x00000001}, + {0x504E4843, 0x02000000, 0x00000002}, + {0x504E4859, 0x00000000, 0x00000003}, + {0x504E4A41, 0x02000000, 0x00000002}, + {0x504E4A42, 0x02000000, 0x00000001}, + {0x504E4C43, 0x02000000, 0x00000002}, + {0x504E4C59, 0x08000000, 0x00000002}, + {0x504E4D54, 0x01000000, 0x00000002}, + {0x504E4D59, 0x01000000, 0x00000002}, + {0x504E4E42, 0x04000000, 0x00000002}, + {0x504E4E59, 0x08000000, 0x00000003}, + {0x504E4F41, 0x02000000, 0x00000005}, + {0x504E4F43, 0x02000000, 0x00000001}, + {0x504E4F59, 0x04000000, 0x00000003}, + {0x504E5041, 0x02000000, 0x00000001}, + {0x504E5042, 0x02000000, 0x00000002}, + {0x504E5043, 0x02000000, 0x00000008}, + {0x504E5142, 0x04000000, 0x00000001}, + {0x504E5159, 0x04000000, 0x00000002}, + {0x504E5241, 0x02000000, 0x00000001}, + {0x504E5243, 0x01000000, 0x00000001}, + {0x504E5341, 0x00800000, 0x00000002}, + {0x504E5342, 0x02000000, 0x00000001}, + {0x504E5343, 0x08000000, 0x00000003}, + {0x504E5359, 0x04000000, 0x00000002}, + {0x504E5442, 0x04000000, 0x00000002}, + {0x504E5443, 0x01000000, 0x00000002}, + {0x504E5642, 0x04000000, 0x00000001}, + {0x504E5656, 0x02000000, 0x00000002}, + {0x504E5A43, 0x04000000, 0x00000002}, + {0x504F3241, 0x04000000, 0x00000003}, + {0x504F3341, 0x01000000, 0x00000001}, + {0x504F3441, 0x02000000, 0x00000005}, + {0x504F3442, 0x00800000, 0x00000001}, + {0x504F3541, 0x01000000, 0x00000001}, + {0x504F3543, 0x01000000, 0x00000001}, + {0x504F3642, 0x02000000, 0x00000001}, + {0x504F3743, 0x04000000, 0x00000002}, + {0x504F3959, 0x00800000, 0x00000000}, + {0x504F4142, 0x04000000, 0x00000001}, + {0x504F4143, 0x02000000, 0x00000001}, + {0x504F4156, 0x04000000, 0x00000001}, + {0x504F4241, 0x02000000, 0x00000001}, + {0x504F4259, 0x08000000, 0x00000003}, + {0x504F4341, 0x04000000, 0x00000005}, + {0x504F4342, 0x01000000, 0x00000001}, + {0x504F4359, 0x04000000, 0x00000001}, + {0x504F4742, 0x00800000, 0x00000002}, + {0x504F4743, 0x01000000, 0x00000001}, + {0x504F4759, 0x02000000, 0x00000001}, + {0x504F4842, 0x04000000, 0x00000001}, + {0x504F4843, 0x02000000, 0x00000001}, + {0x504F4941, 0x08000000, 0x00000005}, + {0x504F4942, 0x02000000, 0x00000001}, + {0x504F4959, 0x00800000, 0x00000001}, + {0x504F4A42, 0x04000000, 0x00000001}, + {0x504F4A43, 0x04000000, 0x00000002}, + {0x504F4C42, 0x00800000, 0x00000001}, + {0x504F4D41, 0x04000000, 0x00000002}, + {0x504F4D59, 0x04000000, 0x00000001}, + {0x504F4E41, 0x02000000, 0x00000002}, + {0x504F4E42, 0x01000000, 0x00000001}, + {0x504F4F42, 0x00400000, 0x00000002}, + {0x504F4F43, 0x04000000, 0x00000002}, + {0x504F5043, 0x01000000, 0x00000002}, + {0x504F5059, 0x04000000, 0x00000003}, + {0x504F5143, 0x02000000, 0x00000001}, + {0x504F5159, 0x00800000, 0x00000001}, + {0x504F5259, 0x04000000, 0x00000002}, + {0x504F5342, 0x02000000, 0x00000001}, + {0x504F5343, 0x00000000, 0x00000002}, + {0x504F5359, 0x01000000, 0x00000002}, + {0x504F5541, 0x00800000, 0x00000001}, + {0x504F5741, 0x02000000, 0x00000002}, + {0x504F5743, 0x00800000, 0x00000001}, + {0x504F5759, 0x00800000, 0x00000001}, + {0x504F5841, 0x01000000, 0x00000002}, + {0x504F5843, 0x04000000, 0x00000001}, + {0x504F5A42, 0x04000000, 0x00000003}, + {0x504F5A43, 0x02000000, 0x00000001}, + {0x50503342, 0x04000000, 0x00000001}, + {0x50503343, 0x04000000, 0x00000002}, + {0x50503441, 0x02000000, 0x00000002}, + {0x50503541, 0x04000000, 0x00000001}, + {0x50503643, 0x04000000, 0x00000007}, + {0x50503659, 0x04000000, 0x00000008}, + {0x50504143, 0x02000000, 0x00000003}, + {0x50504159, 0x01000000, 0x00000001}, + {0x50504243, 0x01000000, 0x00000002}, + {0x50504259, 0x02000000, 0x00000001}, + {0x50504341, 0x01000000, 0x00000002}, + {0x50504441, 0x00800000, 0x00000002}, + {0x50504442, 0x00800000, 0x00000001}, + {0x50504443, 0x00000000, 0x00000002}, + {0x50504459, 0x02000000, 0x00000001}, + {0x50504542, 0x01000000, 0x00000002}, + {0x50504543, 0x08000000, 0x00000002}, + {0x50504741, 0x04000000, 0x00000002}, + {0x50504742, 0x04000000, 0x00000002}, + {0x50504743, 0x02000000, 0x00000001}, + {0x50504754, 0x02000000, 0x00000001}, + {0x50504841, 0x04000000, 0x00000001}, + {0x50504941, 0x00800000, 0x00000008}, + {0x50504A41, 0x00800000, 0x00000001}, + {0x50504A43, 0x04000000, 0x00000002}, + {0x50504B41, 0x01000000, 0x00000001}, + {0x50504C42, 0x04000000, 0x00000002}, + {0x50504C43, 0x04000000, 0x00000003}, + {0x50504C59, 0x00800000, 0x00000002}, + {0x50504D43, 0x04000000, 0x00000001}, + {0x50504D44, 0x10000000, 0xFFFFFFFF}, + {0x50504E41, 0x01000000, 0x00000001}, + {0x50504E42, 0x04000000, 0x00000001}, + {0x50504E43, 0x01000000, 0x00000002}, + {0x50504E59, 0x04000000, 0x00000002}, + {0x50504F43, 0x01000000, 0x00000003}, + {0x50505041, 0x01000000, 0x00000002}, + {0x50505141, 0x02000000, 0x00000002}, + {0x50505143, 0x01000000, 0x00000001}, + {0x50505241, 0x04000000, 0x00000001}, + {0x50505242, 0x08000000, 0x00000002}, + {0x50505341, 0x02000000, 0x00000003}, + {0x50505343, 0x02000000, 0x00000003}, + {0x50505359, 0x02000000, 0x00000005}, + {0x50505543, 0x00800000, 0x00000001}, + {0x50505642, 0x08000000, 0x00000006}, + {0x50505659, 0x08000000, 0x00000003}, + {0x50505741, 0x01000000, 0x00000001}, + {0x50505742, 0x00800000, 0x00000001}, + {0x50505743, 0x02000000, 0x00000002}, + {0x50505841, 0x02000000, 0x00000005}, + {0x50505843, 0x02000000, 0x00000001}, + {0x50505943, 0x04000000, 0x00000002}, + {0x50505A41, 0x01000000, 0x00000002}, + {0x50505A42, 0x01000000, 0x00000001}, + {0x50505A55, 0x08000000, 0x00000003}, + {0x50513243, 0x00800000, 0x00000001}, + {0x50513342, 0x00800000, 0x00000001}, + {0x50513543, 0x01000000, 0x00000002}, + {0x50513642, 0x00800000, 0x00000001}, + {0x50513643, 0x08000000, 0x00000001}, + {0x50513841, 0x02000000, 0x00000005}, + {0x50513842, 0x00800000, 0x00000001}, + {0x50513859, 0x00800000, 0x00000000}, + {0x50514143, 0x02000000, 0x00000002}, + {0x50514242, 0x00800000, 0x00000001}, + {0x50514243, 0x02000000, 0x00000002}, + {0x50514259, 0x02000000, 0x00000002}, + {0x50514359, 0x04000000, 0x00000002}, + {0x50514459, 0x10000000, 0x00000003}, + {0x50514559, 0x00800000, 0x00000001}, + {0x50514641, 0x04000000, 0x00000002}, + {0x50514642, 0x00800000, 0x00000001}, + {0x50514742, 0x02000000, 0x00000002}, + {0x50514743, 0x04000000, 0x00000003}, + {0x50514759, 0x04000000, 0x00000002}, + {0x50514841, 0x02000000, 0x00000001}, + {0x50514943, 0x02000000, 0x00000002}, + {0x50514A41, 0x04000000, 0x00000002}, + {0x50514A43, 0x00800000, 0x00000002}, + {0x50514A59, 0x01000000, 0x00000001}, + {0x50514B41, 0x02000000, 0x00000001}, + {0x50514B43, 0x02000000, 0x00000001}, + {0x50514C41, 0x00800000, 0x00000001}, + {0x50514C43, 0x04000000, 0x00000001}, + {0x50514D41, 0x04000000, 0x00000005}, + {0x50514D42, 0x04000000, 0x00000001}, + {0x50514D54, 0x02000000, 0x00000002}, + {0x50514E41, 0x00800000, 0x00000002}, + {0x50514E42, 0x02000000, 0x00000001}, + {0x50514F41, 0x01000000, 0x00000001}, + {0x50514F43, 0x04000000, 0x00000002}, + {0x50515043, 0x02000000, 0x00000001}, + {0x50515141, 0x02000000, 0x00000002}, + {0x50515143, 0x04000000, 0x00000001}, + {0x50515243, 0x02000000, 0x00000001}, + {0x50515259, 0x02000000, 0x00000001}, + {0x50515341, 0x01000000, 0x00000002}, + {0x50515343, 0x01000000, 0x00000001}, + {0x50515359, 0x02000000, 0x00000002}, + {0x50515442, 0x01000000, 0x00000001}, + {0x50515641, 0x02000000, 0x00000002}, + {0x50515643, 0x02000000, 0x00000002}, + {0x50515741, 0x01000000, 0x00000001}, + {0x50515743, 0x02000000, 0x00000001}, + {0x50515842, 0x04000000, 0x00000001}, + {0x50515941, 0x01000000, 0x00000002}, + {0x50515943, 0x04000000, 0x00000001}, + {0x50515A41, 0x01000000, 0x00000002}, + {0x50523341, 0x01000000, 0x00000002}, + {0x50523342, 0x08000000, 0x00000005}, + {0x50523443, 0x02000000, 0x00000001}, + {0x50523459, 0x04000000, 0x00000008}, + {0x50523542, 0x10000000, 0x00000001}, + {0x50523559, 0x04000000, 0x00000008}, + {0x50523642, 0x08000000, 0x00000002}, + {0x50523743, 0x00800000, 0x00000001}, + {0x50524241, 0x04000000, 0x00000002}, + {0x50524243, 0x01000000, 0x00000002}, + {0x50524254, 0x04000000, 0x00000001}, + {0x50524255, 0x00800000, 0x00000005}, + {0x50524259, 0x04000000, 0x00000001}, + {0x50524341, 0x02000000, 0x00000001}, + {0x50524343, 0x00800000, 0x00000002}, + {0x50524354, 0x00800000, 0x00000001}, + {0x50524441, 0x01000000, 0x00000002}, + {0x50524442, 0x04000000, 0x00000005}, + {0x50524459, 0x00800000, 0x00000001}, + {0x50524541, 0x01000000, 0x00000002}, + {0x50524543, 0x02000000, 0x00000003}, + {0x50524554, 0x00800000, 0x00000001}, + {0x50524559, 0x04000000, 0x00000003}, + {0x50524641, 0x04000000, 0x00000001}, + {0x50524659, 0x01000000, 0x00000001}, + {0x50524741, 0x02000000, 0x00000005}, + {0x50524754, 0x01000000, 0x00000001}, + {0x50524841, 0x02000000, 0x00000002}, + {0x50524942, 0x01000000, 0x00000001}, + {0x50524943, 0x04000000, 0x00000002}, + {0x50524A41, 0x08000000, 0x00000005}, + {0x50524A42, 0x01000000, 0x00000001}, + {0x50524A43, 0x08000000, 0x00000003}, + {0x50524C42, 0x10000000, 0x00000001}, + {0x50524C43, 0x04000000, 0x00000003}, + {0x50524C54, 0x08000000, 0x00000001}, + {0x50524D43, 0x02000000, 0x00000002}, + {0x50524D59, 0x01000000, 0x00000001}, + {0x50524E41, 0x04000000, 0x00000001}, + {0x50524E42, 0x04000000, 0x00000003}, + {0x50524E43, 0x04000000, 0x00000002}, + {0x50524F55, 0x08000000, 0x00000008}, + {0x50525041, 0x02000000, 0x00000002}, + {0x50525042, 0x00800000, 0x00000001}, + {0x50525054, 0x02000000, 0x00000001}, + {0x50525059, 0x02000000, 0x00000002}, + {0x50525141, 0x01000000, 0x00000002}, + {0x50525143, 0x04000000, 0x00000002}, + {0x50525159, 0x02000000, 0x00000001}, + {0x50525254, 0x01000000, 0x00000001}, + {0x50525259, 0x02000000, 0x00000002}, + {0x50525359, 0x01000000, 0x00000005}, + {0x50525441, 0x01000000, 0x00000002}, + {0x50525442, 0x02000000, 0x00000002}, + {0x50525443, 0x02000000, 0x00000003}, + {0x50525459, 0x00000000, 0x00000001}, + {0x50525741, 0x02000000, 0x00000005}, + {0x50525743, 0x02000000, 0x00000001}, + {0x50525759, 0x04000000, 0x00000001}, + {0x50525843, 0x04000000, 0x00000001}, + {0x50525941, 0x00800000, 0x00000001}, + {0x50525943, 0x02000000, 0x00000001}, + {0x50525959, 0x04000000, 0x00000001}, + {0x50525A43, 0x02000000, 0x00000001}, + {0x50533242, 0x08000000, 0x00000002}, + {0x50533243, 0x08000000, 0x00000004}, + {0x50533341, 0x02000000, 0x00000001}, + {0x50533343, 0x01000000, 0x00000002}, + {0x50533543, 0x08000000, 0x00000001}, + {0x50533641, 0x04000000, 0x00000001}, + {0x50533642, 0x04000000, 0x00000001}, + {0x50533659, 0x04000000, 0x00000008}, + {0x50533759, 0x04000000, 0x00000008}, + {0x50533841, 0x00800000, 0x00000002}, + {0x50534143, 0x02000000, 0x00000001}, + {0x50534156, 0x02000000, 0x00000001}, + {0x50534359, 0x00800000, 0x00000001}, + {0x50534443, 0x08000000, 0x00000001}, + {0x50534556, 0x04000000, 0x00000001}, + {0x50534641, 0x02000000, 0x00000002}, + {0x50534643, 0x02000000, 0x00000001}, + {0x50534743, 0x08000000, 0x00000001}, + {0x50534759, 0x04000000, 0x00000003}, + {0x50534841, 0x02000000, 0x00000002}, + {0x50534843, 0x02000000, 0x00000001}, + {0x50534859, 0x02000000, 0x00000003}, + {0x50534941, 0x01000000, 0x00000001}, + {0x50534943, 0x04000000, 0x00000001}, + {0x50534959, 0x04000000, 0x00000002}, + {0x50534A42, 0x04000000, 0x00000003}, + {0x50534A43, 0x01000000, 0x00000002}, + {0x50534A54, 0x00800000, 0x00000001}, + {0x50534C42, 0x04000000, 0x00000001}, + {0x50534C54, 0x02000000, 0x00000001}, + {0x50534D43, 0x02000000, 0x00000003}, + {0x50534D54, 0x01000000, 0x00000001}, + {0x50534E41, 0x01000000, 0x00000001}, + {0x50534F41, 0x08000000, 0x00000005}, + {0x50534F43, 0x02000000, 0x00000001}, + {0x50535042, 0x04000000, 0x00000002}, + {0x50535043, 0x04000000, 0x00000002}, + {0x50535143, 0x02000000, 0x00000001}, + {0x50535154, 0x00800000, 0x00000001}, + {0x50535159, 0x02000000, 0x00000002}, + {0x50535243, 0x00800000, 0x00000001}, + {0x50535341, 0x04000000, 0x00000002}, + {0x50535343, 0x00800000, 0x00000001}, + {0x50535459, 0x01000000, 0x00000001}, + {0x50535541, 0x04000000, 0x00000001}, + {0x50535542, 0x00800000, 0x00000002}, + {0x50535543, 0x02000000, 0x00000001}, + {0x50535559, 0x00800000, 0x00000001}, + {0x50535641, 0x02000000, 0x00000002}, + {0x50535643, 0x02000000, 0x00000001}, + {0x50535659, 0x02000000, 0x00000003}, + {0x50535741, 0x01000000, 0x00000002}, + {0x50535743, 0x00000000, 0x00000002}, + {0x50535842, 0x04000000, 0x00000003}, + {0x50535843, 0x00000000, 0x00000001}, + {0x50535941, 0x04000000, 0x00000001}, + {0x50543241, 0x02000000, 0x00000001}, + {0x50543341, 0x02000000, 0x00000002}, + {0x50543343, 0x08000000, 0x00000003}, + {0x50543442, 0x01000000, 0x00000002}, + {0x50543541, 0x04000000, 0x00000005}, + {0x50543641, 0x04000000, 0x00000001}, + {0x50543642, 0x04000000, 0x00000001}, + {0x50543643, 0x01000000, 0x00000002}, + {0x50543743, 0x01000000, 0x00000002}, + {0x50543841, 0x02000000, 0x00000002}, + {0x50544142, 0x04000000, 0x00000002}, + {0x50544143, 0x02000000, 0x00000002}, + {0x50544159, 0x01000000, 0x00000002}, + {0x50544241, 0x02000000, 0x00000001}, + {0x50544243, 0x02000000, 0x00000001}, + {0x50544254, 0x01000000, 0x00000001}, + {0x50544256, 0x02000000, 0x00000002}, + {0x50544259, 0x08000000, 0x00000003}, + {0x50544341, 0x02000000, 0x00000001}, + {0x50544459, 0x04000000, 0x00000003}, + {0x50544556, 0x08000000, 0x00000007}, + {0x50544559, 0x01000000, 0x00000001}, + {0x50544641, 0x00800000, 0x00000001}, + {0x50544642, 0x01000000, 0x00000001}, + {0x50544659, 0x08000000, 0x00000005}, + {0x50544742, 0x08000000, 0x00000002}, + {0x50544754, 0x04000000, 0x00000002}, + {0x50544759, 0x02000000, 0x00000001}, + {0x50544841, 0x01000000, 0x00000001}, + {0x50544941, 0x00800000, 0x00000001}, + {0x50544943, 0x01000000, 0x00000001}, + {0x50544A41, 0x02000000, 0x00000001}, + {0x50544A56, 0x04000000, 0x00000001}, + {0x50544B43, 0x04000000, 0x00000002}, + {0x50544C41, 0x00800000, 0x00000001}, + {0x50544C59, 0x08000000, 0x00000002}, + {0x50544D41, 0x04000000, 0x00000002}, + {0x50544D43, 0x02000000, 0x00000001}, + {0x50544D54, 0x04000000, 0x00000003}, + {0x50544D59, 0x02000000, 0x00000002}, + {0x50544F43, 0x02000000, 0x00000001}, + {0x50545041, 0x01000000, 0x00000002}, + {0x50545054, 0x08000000, 0x00000001}, + {0x50545059, 0x02000000, 0x00000005}, + {0x50545154, 0x02000000, 0x00000002}, + {0x50545259, 0x02000000, 0x00000002}, + {0x50545341, 0x02000000, 0x00000001}, + {0x50545359, 0x04000000, 0x00000001}, + {0x50545456, 0x04000000, 0x00000001}, + {0x50545541, 0x02000000, 0x00000001}, + {0x50545542, 0x02000000, 0x00000001}, + {0x50545559, 0x04000000, 0x00000002}, + {0x50545642, 0x01000000, 0x00000001}, + {0x50545643, 0x02000000, 0x00000001}, + {0x50545659, 0x02000000, 0x00000001}, + {0x50545841, 0x00800000, 0x00000001}, + {0x50545942, 0x08000000, 0x00000002}, + {0x50545959, 0x02000000, 0x00000002}, + {0x50545A41, 0x01000000, 0x00000005}, + {0x50545A59, 0x01000000, 0x00000005}, + {0x50553242, 0x02000000, 0x00000001}, + {0x50553342, 0x02000000, 0x00000002}, + {0x50553459, 0x02000000, 0x00000008}, + {0x50553541, 0x02000000, 0x00000005}, + {0x50553659, 0x01000000, 0x00000008}, + {0x50553743, 0x02000000, 0x00000001}, + {0x50553842, 0x01000000, 0x00000001}, + {0x50554159, 0x04000000, 0x00000003}, + {0x50554241, 0x04000000, 0x00000005}, + {0x50554242, 0x08000000, 0x00000003}, + {0x50554259, 0x08000000, 0x00000003}, + {0x50554359, 0x00000000, 0x00000003}, + {0x50554442, 0x02000000, 0x00000001}, + {0x50554443, 0x01000000, 0x00000003}, + {0x50554454, 0x00800000, 0x00000001}, + {0x50554641, 0x01000000, 0x00000003}, + {0x50554643, 0x02000000, 0x00000002}, + {0x50554842, 0x04000000, 0x00000001}, + {0x50554854, 0x02000000, 0x00000001}, + {0x50554859, 0x00800000, 0x00000008}, + {0x50554943, 0x04000000, 0x00000002}, + {0x50554B41, 0x04000000, 0x00000001}, + {0x50554B42, 0x08000000, 0x00000005}, + {0x50554C41, 0x02000000, 0x00000002}, + {0x50554C54, 0x04000000, 0x00000001}, + {0x50554C59, 0x08000000, 0x00000005}, + {0x50554D41, 0x00800000, 0x00000001}, + {0x50554D42, 0x04000000, 0x00000001}, + {0x50554D43, 0x01000000, 0x00000003}, + {0x50554D54, 0x04000000, 0x00000003}, + {0x50554D59, 0x04000000, 0x00000002}, + {0x50554E41, 0x01000000, 0x00000001}, + {0x50554E42, 0x01000000, 0x00000001}, + {0x50554F42, 0x02000000, 0x00000001}, + {0x50555054, 0x01000000, 0x00000001}, + {0x50555059, 0x02000000, 0x00000008}, + {0x50555154, 0x00800000, 0x00000001}, + {0x50555159, 0x08000000, 0x00000003}, + {0x50555341, 0x04000000, 0x00000003}, + {0x50555342, 0x02000000, 0x00000001}, + {0x50555343, 0x02000000, 0x00000001}, + {0x50555442, 0x04000000, 0x00000002}, + {0x50555542, 0x04000000, 0x00000001}, + {0x50555741, 0x02000000, 0x00000001}, + {0x50555743, 0x04000000, 0x00000001}, + {0x50555841, 0x02000000, 0x00000001}, + {0x50555842, 0x04000000, 0x00000001}, + {0x50555843, 0x08000000, 0x00000002}, + {0x50555942, 0x00800000, 0x00000001}, + {0x50555943, 0x01000000, 0x00000002}, + {0x50555959, 0x04000000, 0x00000001}, + {0x50555A42, 0x02000000, 0x00000002}, + {0x50563241, 0x00800000, 0x00000001}, + {0x50563342, 0x02000000, 0x00000001}, + {0x50563343, 0x01000000, 0x00000001}, + {0x50563443, 0x01000000, 0x00000001}, + {0x50563643, 0x02000000, 0x00000001}, + {0x50563743, 0x00800000, 0x00000001}, + {0x50564143, 0x02000000, 0x00000002}, + {0x50564159, 0x04000000, 0x00000002}, + {0x50564242, 0x00800000, 0x00000001}, + {0x50564243, 0x04000000, 0x00000002}, + {0x50564341, 0x04000000, 0x00000002}, + {0x50564359, 0x01000000, 0x00000003}, + {0x50564441, 0x01000000, 0x00000001}, + {0x50564442, 0x00000000, 0x00000001}, + {0x50564443, 0x01000000, 0x00000001}, + {0x50564454, 0x07FFEC70, 0x00000003}, + {0x50564641, 0x04000000, 0x00000001}, + {0x50564642, 0x00800000, 0x00000001}, + {0x50564741, 0x02000000, 0x00000002}, + {0x50564841, 0x01000000, 0x00000001}, + {0x50564842, 0x02000000, 0x00000001}, + {0x50564843, 0x02000000, 0x00000003}, + {0x50564854, 0x04000000, 0x00000001}, + {0x50564942, 0x00800000, 0x00000001}, + {0x50564959, 0x08000000, 0x00000003}, + {0x50564A56, 0x04000000, 0x00000001}, + {0x50564C41, 0x01000000, 0x00000002}, + {0x50564C43, 0x04000000, 0x00000001}, + {0x50564C54, 0x02000000, 0x00000002}, + {0x50564D41, 0x04000000, 0x00000001}, + {0x50564D42, 0x00800000, 0x00000001}, + {0x50564D43, 0x00800000, 0x00000001}, + {0x50564D54, 0x04000000, 0x00000002}, + {0x50564E42, 0x02000000, 0x00000001}, + {0x50564E43, 0x10000000, 0x00000005}, + {0x50565042, 0x00800000, 0x00000002}, + {0x50565043, 0x04000000, 0x00000002}, + {0x50565059, 0x04000000, 0x00000001}, + {0x50565141, 0x01000000, 0x00000002}, + {0x50565143, 0x04000000, 0x00000001}, + {0x50565159, 0x01000000, 0x00000001}, + {0x50565243, 0x02000000, 0x00000001}, + {0x50565259, 0x02000000, 0x00000005}, + {0x50565341, 0x00800000, 0x00000001}, + {0x50565342, 0x02000000, 0x00000001}, + {0x50565343, 0x02000000, 0x00000005}, + {0x50565441, 0x02000000, 0x00000001}, + {0x50565442, 0x02000000, 0x00000002}, + {0x50565443, 0x04000000, 0x00000003}, + {0x50565459, 0x08000000, 0x00000003}, + {0x50565542, 0x02000000, 0x00000002}, + {0x50565642, 0x01000000, 0x00000002}, + {0x50565741, 0x01000000, 0x00000001}, + {0x50565742, 0x02000000, 0x00000001}, + {0x50565756, 0x04000000, 0x00000001}, + {0x50565841, 0x04000000, 0x00000003}, + {0x50565842, 0x02000000, 0x00000001}, + {0x50565859, 0x00800000, 0x00000001}, + {0x50565A41, 0x00800000, 0x00000001}, + {0x50565A43, 0x02000000, 0x00000001}, + {0x50573259, 0x04000000, 0x00000008}, + {0x50573341, 0x04000000, 0x00000002}, + {0x50573641, 0x02000000, 0x00000002}, + {0x50573643, 0x02000000, 0x00000002}, + {0x50573742, 0x01000000, 0x00000002}, + {0x50573759, 0x01000000, 0x00000001}, + {0x50574142, 0x02000000, 0x00000001}, + {0x50574159, 0x04000000, 0x00000002}, + {0x50574259, 0x01000000, 0x00000002}, + {0x50574343, 0x02000000, 0x00000001}, + {0x50574354, 0x02000000, 0x00000001}, + {0x50574442, 0x02000000, 0x00000001}, + {0x50574443, 0x00800000, 0x00000001}, + {0x50574459, 0x02000000, 0x00000005}, + {0x50574542, 0x04000000, 0x00000002}, + {0x50574641, 0x01000000, 0x00000001}, + {0x50574741, 0x01000000, 0x00000002}, + {0x50574759, 0x00800000, 0x00000001}, + {0x50574843, 0x02000000, 0x00000002}, + {0x50574859, 0x02000000, 0x00000001}, + {0x50574942, 0x04000000, 0x00000002}, + {0x50574A43, 0x00800000, 0x00000001}, + {0x50574A59, 0x00800000, 0x00000001}, + {0x50574B41, 0x04000000, 0x00000002}, + {0x50574B42, 0x00800000, 0x00000002}, + {0x50574B59, 0x08000000, 0x00000003}, + {0x50574C41, 0x02000000, 0x00000001}, + {0x50574C43, 0x10000000, 0x00000002}, + {0x50574C54, 0x02000000, 0x00000002}, + {0x50574C59, 0x02000000, 0x00000001}, + {0x50574D41, 0x04000000, 0x00000002}, + {0x50574D43, 0x02000000, 0x00000002}, + {0x50574D49, 0x04000000, 0x00000007}, + {0x50574D54, 0x01000000, 0x00000001}, + {0x50574D59, 0x01000000, 0x00000002}, + {0x50574E41, 0x02000000, 0x00000002}, + {0x50574E42, 0x02000000, 0x00000001}, + {0x50574E59, 0x02000000, 0x00000001}, + {0x50574F41, 0x00800000, 0x00000001}, + {0x50575041, 0x02000000, 0x00000001}, + {0x50575042, 0x01000000, 0x00000001}, + {0x50575043, 0x04000000, 0x00000002}, + {0x50575054, 0x00800000, 0x00000002}, + {0x50575141, 0x01000000, 0x00000001}, + {0x50575159, 0x00800000, 0x00000001}, + {0x50575243, 0x02000000, 0x00000002}, + {0x50575254, 0x04000000, 0x00000002}, + {0x50575259, 0x02000000, 0x00000005}, + {0x50575343, 0x04000000, 0x00000001}, + {0x50575442, 0x02000000, 0x00000001}, + {0x50575443, 0x08000000, 0x00000001}, + {0x50575542, 0x02000000, 0x00000001}, + {0x50575559, 0x02000000, 0x00000002}, + {0x50575641, 0x02000000, 0x00000002}, + {0x50575643, 0x01000000, 0x00000002}, + {0x50575941, 0x02000000, 0x00000002}, + {0x50575942, 0x00800000, 0x00000001}, + {0x50575A41, 0x02000000, 0x00000002}, + {0x50583242, 0x02000000, 0x00000002}, + {0x50583341, 0x04000000, 0x00000001}, + {0x50583542, 0x02000000, 0x00000003}, + {0x50583559, 0x00800000, 0x00000008}, + {0x50583659, 0x00800000, 0x00000008}, + {0x50584142, 0x04000000, 0x00000001}, + {0x50584143, 0x02000000, 0x00000003}, + {0x50584154, 0x00800000, 0x00000001}, + {0x50584159, 0x02000000, 0x00000002}, + {0x50584241, 0x04000000, 0x00000002}, + {0x50584242, 0x00800000, 0x00000001}, + {0x50584259, 0x00800000, 0x00000001}, + {0x50584341, 0x01000000, 0x00000003}, + {0x50584343, 0x01000000, 0x00000003}, + {0x50584354, 0x00800000, 0x00000001}, + {0x50584443, 0x02000000, 0x00000001}, + {0x50584459, 0x04000000, 0x00000001}, + {0x50584559, 0x02000000, 0x00000002}, + {0x50584641, 0x08000000, 0x00000003}, + {0x50584642, 0x04000000, 0x00000002}, + {0x50584741, 0x08000000, 0x00000003}, + {0x50584742, 0x02000000, 0x00000002}, + {0x50584759, 0x08000000, 0x00000002}, + {0x50584841, 0x00800000, 0x00000001}, + {0x50584843, 0x02000000, 0x00000003}, + {0x50584859, 0x01000000, 0x00000001}, + {0x50584943, 0x00800000, 0x00000001}, + {0x50584A43, 0x01000000, 0x00000001}, + {0x50584A59, 0x00800000, 0x00000001}, + {0x50584C41, 0x02000000, 0x00000001}, + {0x50584C43, 0x02000000, 0x00000002}, + {0x50584C59, 0x00800000, 0x00000001}, + {0x50584D41, 0x02000000, 0x00000001}, + {0x50584D42, 0x02000000, 0x00000001}, + {0x50584D59, 0x00800000, 0x00000001}, + {0x50584E41, 0x02000000, 0x00000001}, + {0x50584F41, 0x02000000, 0x00000001}, + {0x50585043, 0x01000000, 0x00000005}, + {0x50585054, 0x00800000, 0x00000002}, + {0x50585059, 0x00800000, 0x00000003}, + {0x50585143, 0x04000000, 0x00000001}, + {0x50585159, 0x01000000, 0x00000001}, + {0x50585342, 0x02000000, 0x00000001}, + {0x50585359, 0x01000000, 0x00000001}, + {0x50585441, 0x01000000, 0x00000002}, + {0x50585543, 0x04000000, 0x00000001}, + {0x50585559, 0x04000000, 0x00000003}, + {0x50585641, 0x01000000, 0x00000001}, + {0x50585741, 0x01000000, 0x00000002}, + {0x50585742, 0x02000000, 0x00000001}, + {0x50585759, 0x01000000, 0x00000002}, + {0x50585859, 0x04000000, 0x00000002}, + {0x50585941, 0x08000000, 0x00000005}, + {0x50585942, 0x10000000, 0x00000003}, + {0x50585A42, 0x02000000, 0x00000001}, + {0x50585A59, 0x04000000, 0x00000002}, + {0x50593259, 0x00800000, 0x00000008}, + {0x50593341, 0x04000000, 0x00000003}, + {0x50593342, 0x02000000, 0x00000001}, + {0x50593443, 0x02000000, 0x00000001}, + {0x50593542, 0x01000000, 0x00000001}, + {0x50593641, 0x01000000, 0x00000002}, + {0x50593842, 0x02000000, 0x00000001}, + {0x50594143, 0x02000000, 0x00000001}, + {0x50594159, 0x02000000, 0x00000001}, + {0x50594242, 0x00800000, 0x00000001}, + {0x50594243, 0x02000000, 0x00000001}, + {0x50594259, 0x02000000, 0x00000001}, + {0x50594343, 0x01000000, 0x00000001}, + {0x50594359, 0x00800000, 0x00000001}, + {0x50594442, 0x04000000, 0x00000002}, + {0x50594443, 0x02000000, 0x00000002}, + {0x50594459, 0x00800000, 0x00000001}, + {0x50594542, 0x00800000, 0x00000001}, + {0x50594641, 0x04000000, 0x00000001}, + {0x50594659, 0x08000000, 0x00000005}, + {0x50594741, 0x04000000, 0x00000005}, + {0x50594742, 0x01000000, 0x00000001}, + {0x50594842, 0x02000000, 0x00000001}, + {0x50594843, 0x00000000, 0x00000001}, + {0x50594859, 0x01000000, 0x00000001}, + {0x50594943, 0x04000000, 0x00000002}, + {0x50594959, 0x01000000, 0x00000001}, + {0x50594A42, 0x04000000, 0x00000001}, + {0x50594A59, 0x00800000, 0x00000001}, + {0x50594B41, 0x02000000, 0x00000003}, + {0x50594B42, 0x02000000, 0x00000002}, + {0x50594C41, 0x04000000, 0x00000001}, + {0x50594C43, 0x02000000, 0x00000002}, + {0x50594C59, 0x02000000, 0x00000002}, + {0x50594D54, 0x00800000, 0x00000001}, + {0x50594D59, 0x08000000, 0x00000005}, + {0x50594E41, 0x04000000, 0x00000003}, + {0x50594E42, 0x04000000, 0x00000001}, + {0x50594E43, 0x08000000, 0x00000002}, + {0x50594E59, 0x00800000, 0x00000001}, + {0x50594F41, 0x02000000, 0x00000002}, + {0x50594F43, 0x00000000, 0x00000002}, + {0x50595041, 0x02000000, 0x00000002}, + {0x50595042, 0x00800000, 0x00000001}, + {0x50595056, 0x10000000, 0x00000005}, + {0x50595241, 0x02000000, 0x00000002}, + {0x50595243, 0x01000000, 0x00000001}, + {0x50595254, 0x02000000, 0x00000001}, + {0x50595342, 0x02000000, 0x00000002}, + {0x50595344, 0x02000000, 0x00000001}, + {0x50595359, 0x01000000, 0x00000001}, + {0x50595442, 0x01000000, 0x00000002}, + {0x50595443, 0x01000000, 0x00000002}, + {0x50595543, 0x02000000, 0x00000001}, + {0x50595642, 0x08000000, 0x00000001}, + {0x50595743, 0x02000000, 0x00000003}, + {0x50595842, 0x04000000, 0x00000002}, + {0x50595941, 0x01000000, 0x00000002}, + {0x50595942, 0x08000000, 0x00000003}, + {0x50595943, 0x00800000, 0x00000001}, + {0x50595A41, 0x04000000, 0x00000002}, + {0x505A3243, 0x00800000, 0x00000002}, + {0x505A3441, 0x00800000, 0x00000001}, + {0x505A3442, 0x08000000, 0x00000002}, + {0x505A3443, 0x04000000, 0x00000002}, + {0x505A3542, 0x01000000, 0x00000001}, + {0x505A3642, 0x04000000, 0x00000003}, + {0x505A3659, 0x08000000, 0x00000000}, + {0x505A3742, 0x04000000, 0x00000001}, + {0x505A3842, 0x01000000, 0x00000001}, + {0x505A4159, 0x01000000, 0x00000001}, + {0x505A4241, 0x08000000, 0x00000003}, + {0x505A4243, 0x01000000, 0x00000003}, + {0x505A4259, 0x01000000, 0x00000001}, + {0x505A4341, 0x01000000, 0x00000001}, + {0x505A4342, 0x01000000, 0x00000002}, + {0x505A4343, 0x00800000, 0x00000001}, + {0x505A4359, 0x00800000, 0x00000001}, + {0x505A4441, 0x02000000, 0x00000002}, + {0x505A4442, 0x04000000, 0x00000003}, + {0x505A4443, 0x04000000, 0x00000002}, + {0x505A4459, 0x01000000, 0x00000002}, + {0x505A4641, 0x04000000, 0x00000001}, + {0x505A4642, 0x00800000, 0x00000001}, + {0x505A4742, 0x01000000, 0x00000002}, + {0x505A4743, 0x00000000, 0x00000001}, + {0x505A4759, 0x04000000, 0x00000001}, + {0x505A4841, 0x04000000, 0x00000001}, + {0x505A4842, 0x02000000, 0x00000003}, + {0x505A4859, 0x04000000, 0x00000002}, + {0x505A4941, 0x02000000, 0x00000002}, + {0x505A4943, 0x02000000, 0x00000001}, + {0x505A4A59, 0x04000000, 0x00000005}, + {0x505A4C42, 0x02000000, 0x00000001}, + {0x505A4C43, 0x04000000, 0x00000001}, + {0x505A4C59, 0x10000000, 0x00000002}, + {0x505A4D42, 0x00800000, 0x00000002}, + {0x505A4D54, 0x01000000, 0x00000002}, + {0x505A4D56, 0x04000000, 0x00000001}, + {0x505A4E41, 0x01000000, 0x00000001}, + {0x505A4E42, 0x01000000, 0x00000001}, + {0x505A4E59, 0x04000000, 0x00000002}, + {0x505A4F41, 0x01000000, 0x00000002}, + {0x505A4F42, 0x02000000, 0x00000001}, + {0x505A4F59, 0x00000000, 0x00000002}, + {0x505A5042, 0x00000000, 0x00000001}, + {0x505A5059, 0x01000000, 0x00000001}, + {0x505A5143, 0x02000000, 0x00000001}, + {0x505A5241, 0x04000000, 0x00000002}, + {0x505A5242, 0x04000000, 0x00000003}, + {0x505A5243, 0x00800000, 0x00000002}, + {0x505A5259, 0x01000000, 0x00000002}, + {0x505A5359, 0x08000000, 0x00000001}, + {0x505A5442, 0x02000000, 0x00000001}, + {0x505A5459, 0x04000000, 0x00000001}, + {0x505A5541, 0x04000000, 0x00000005}, + {0x505A5542, 0x00800000, 0x00000002}, + {0x505A5543, 0x04000000, 0x00000001}, + {0x505A5759, 0x04000000, 0x00000001}, + {0x505A5A42, 0x01000000, 0x00000001}, + {0x51374C42, 0x04000000, 0x00000001}, + {0x51375042, 0x02000000, 0x00000001}, + {0x51375142, 0x02000000, 0x00000001}, + {0x51385042, 0x04000000, 0x00000001}, + {0x51435143, 0x02000000, 0x00000001}, + {0x51454642, 0x04000000, 0x00000001}, + {0x514C5542, 0x02000000, 0x00000001}, + {0x514F5542, 0x01000000, 0x00000001}, + {0x51503642, 0x02000000, 0x00000001}, + {0x51573542, 0x02000000, 0x00000001}, + {0x51584C42, 0x04000000, 0x00000008}, + {0x51585042, 0x04000000, 0x00000003}, + {0x51594C42, 0x04000000, 0x00000008}, + {0x52335741, 0x04000000, 0x00000001}, + {0x52464443, 0x04000000, 0x00000002}, + {0x53323643, 0x04000000, 0x00000001}, + {0x53335141, 0x04000000, 0x00000002}, + {0x53335159, 0x04000000, 0x00000002}, + {0x53344259, 0x02000000, 0x00000001}, + {0x53344C43, 0x04000000, 0x00000002}, + {0x53354841, 0x02000000, 0x00000002}, + {0x53394341, 0x04000000, 0x00000001}, + {0x53414441, 0x04000000, 0x00000006}, + {0x53415041, 0x04000000, 0x00000006}, + {0x53415249, 0x10000000, 0x00000006}, + {0x53424542, 0x10000000, 0x00000003}, + {0x53425249, 0x10000000, 0x00000006}, + {0x53434A42, 0x04000000, 0x00000002}, + {0x53434D43, 0x02000000, 0x00000002}, + {0x53435141, 0x04000000, 0x00000002}, + {0x53435259, 0x08000000, 0x00000002}, + {0x53435943, 0x02000000, 0x00000002}, + {0x53445249, 0x20000000, 0x00000006}, + {0x53445641, 0x01000000, 0x00000002}, + {0x53453231, 0x02000000, 0x00000003}, + {0x53453443, 0x04000000, 0x00000001}, + {0x53454343, 0x01000000, 0x00000005}, + {0x53454542, 0x10000000, 0x00000003}, + {0x53454559, 0x10000000, 0x00000003}, + {0x53454959, 0x02000000, 0x00000002}, + {0x53454C43, 0x04000000, 0x00000001}, + {0x53455249, 0x20000000, 0x00000006}, + {0x53464959, 0x02000000, 0x00000002}, + {0x53464B59, 0x02000000, 0x00000001}, + {0x53464C42, 0x10000000, 0x00000003}, + {0x53465359, 0x04000000, 0x00000001}, + {0x53474D41, 0x01000000, 0x00000001}, + {0x53474D43, 0x04000000, 0x00000001}, + {0x53475049, 0x08000000, 0x00000006}, + {0x534A3343, 0x10000000, 0x00000003}, + {0x534A5641, 0x04000000, 0x00000002}, + {0x534B4356, 0x08000000, 0x00000002}, + {0x534B5049, 0x08000000, 0x00000006}, + {0x534C4443, 0x02000000, 0x00000004}, + {0x534C4C43, 0x01000000, 0x00000002}, + {0x534D4359, 0x02000000, 0x00000001}, + {0x534F4359, 0x04000000, 0x00000001}, + {0x534F5342, 0x02000000, 0x00000001}, + {0x53504A59, 0x01000000, 0x00000001}, + {0x53505A55, 0x08000000, 0xFFFFFFFF}, + {0x53514142, 0x08000000, 0x00000002}, + {0x53525359, 0x01000000, 0x00000005}, + {0x53533341, 0x02000000, 0x00000001}, + {0x53534F41, 0x08000000, 0x00000005}, + {0x53535541, 0x04000000, 0x00000001}, + {0x53544C59, 0x08000000, 0x00000002}, + {0x53554259, 0x08000000, 0x00000003}, + {0x53555043, 0x08000000, 0x00000006}, + {0x53563543, 0x01000000, 0x00000001}, + {0x53564256, 0x02000000, 0x00000001}, + {0x53564E43, 0x10000000, 0x00000005}, + {0x53565841, 0x04000000, 0x00000003}, + {0x53574143, 0x04000000, 0x00000001}, + {0x53594641, 0x04000000, 0x00000001}, + {0x53594C41, 0x04000000, 0x00000001}, + {0x53595543, 0x02000000, 0x00000001}, + {0x53595A41, 0x04000000, 0x00000002}, + {0x535A4641, 0x04000000, 0x00000001}, + {0x535A5359, 0x08000000, 0x00000001}, + {0x54595056, 0x10000000, 0x00000005}, + {0x55414C59, 0x00800000, 0x00000002}, + {0x55425742, 0x04000000, 0x00000002}, + {0x55434956, 0x04000000, 0x00000002}, + {0x55435243, 0x02000000, 0x00000001}, + {0x55444E41, 0x00800000, 0x00000008}, + {0x55454342, 0x02000000, 0x00000002}, + {0x55463343, 0x02000000, 0x00000002}, + {0x554A5243, 0x02000000, 0x00000001}, + {0x55504A59, 0x01000000, 0x00000001}, + {0x55515243, 0x02000000, 0x00000001}, + {0x55524542, 0x02000000, 0x00000001}, + {0x55525342, 0x01000000, 0x00000001}, + {0x55544256, 0x02000000, 0x00000002}, + {0x55545942, 0x04000000, 0x00000002}, + {0x55573341, 0x04000000, 0x00000002}, + {0x55574C41, 0x02000000, 0x00000001}, + {0x56324356, 0x02000000, 0x00000001}, + {0x56324456, 0x04000000, 0x00000001}, + {0x56324D56, 0x04000000, 0x00000002}, + {0x56335356, 0x08000000, 0x00000005}, + {0x56335456, 0x04000000, 0x00000001}, + {0x56345456, 0x04000000, 0x00000003}, + {0x56364356, 0x02000000, 0x00000002}, + {0x56394856, 0x04000000, 0x00000002}, + {0x56395056, 0x04000000, 0x00000001}, + {0x56413956, 0x02000000, 0x00000000}, + {0x56414156, 0x02000000, 0x00000008}, + {0x56414256, 0x02000000, 0x00000001}, + {0x56414356, 0x04000000, 0x00000001}, + {0x56414C56, 0x04000000, 0x00000002}, + {0x56434156, 0x04000000, 0x00000002}, + {0x56434D56, 0x02000000, 0x00000001}, + {0x56444356, 0x04000000, 0x00000002}, + {0x56444956, 0x02000000, 0x00000002}, + {0x56455056, 0x04000000, 0x00000001}, + {0x56455456, 0x04000000, 0x00000002}, + {0x56464956, 0x02000000, 0x00000002}, + {0x56465056, 0x04000000, 0x00000001}, + {0x56473256, 0x02000000, 0x00000006}, + {0x56475256, 0x02000000, 0x00000002}, + {0x56494C56, 0x02000000, 0x00000001}, + {0x56495256, 0x02000000, 0x00000001}, + {0x564A4956, 0x08000000, 0x00000003}, + {0x564B4356, 0x08000000, 0x00000002}, + {0x564B4D56, 0x02000000, 0x00000003}, + {0x564B5355, 0x08000000, 0xFFFFFFFF}, + {0x564B5356, 0x04000000, 0x00000001}, + {0x564C4156, 0x04000000, 0x00000002}, + {0x564C4256, 0x02000000, 0x00000002}, + {0x564C4556, 0x02000000, 0x00000003}, + {0x564D4356, 0x04000000, 0x00000002}, + {0x564E5356, 0x04000000, 0x00000002}, + {0x564F4156, 0x04000000, 0x00000001}, + {0x564F5356, 0x04000000, 0x00000003}, + {0x56505056, 0x02000000, 0x00000001}, + {0x56505256, 0x02000000, 0x00000001}, + {0x56505456, 0x08000000, 0x00000002}, + {0x56524756, 0x04000000, 0x00000001}, + {0x56534256, 0x02000000, 0x00000001}, + {0x56534556, 0x04000000, 0x00000001}, + {0x56534656, 0x08000000, 0x00000003}, + {0x56534844, 0x02000000, 0xFFFFFFFF}, + {0x56544156, 0x02000000, 0x00000001}, + {0x56554B56, 0x04000000, 0x00000001}, + {0x56555A56, 0x02000000, 0x00000002}, + {0x56564156, 0x04000000, 0x00000001}, + {0x56564256, 0x02000000, 0x00000001}, + {0x56564A56, 0x04000000, 0x00000001}, + {0x56565056, 0x04000000, 0x00000002}, + {0x56565756, 0x04000000, 0x00000001}, + {0x56574356, 0x02000000, 0x00000002}, + {0x56574856, 0x04000000, 0x00000002}, + {0x56574A56, 0x02000000, 0x00000003}, + {0x56594D56, 0x04000000, 0x00000001}, + {0x565A4656, 0x02000000, 0x00000001}, + {0x565A4D56, 0x04000000, 0x00000001}, + {0x57325141, 0x02000000, 0x00000002}, + {0x57334941, 0x01000000, 0x00000002}, + {0x57414356, 0x04000000, 0x00000001}, + {0x57414E43, 0x04000000, 0x00000001}, + {0x57445759, 0x01000000, 0x00000002}, + {0x57474C43, 0x04000000, 0x00000001}, + {0x574C5759, 0x02000000, 0x00000001}, + {0x57565141, 0x01000000, 0x00000002}, + {0x575A5242, 0x04000000, 0x00000003}, + {0x58324354, 0x00800000, 0x00000001}, + {0x58324842, 0x02000000, 0x00000003}, + {0x58324859, 0x02000000, 0x00000003}, + {0x58324B41, 0x04000000, 0x00000001}, + {0x58324D56, 0x04000000, 0x00000002}, + {0x58325141, 0x02000000, 0x00000002}, + {0x58325241, 0x02000000, 0x00000003}, + {0x58325341, 0x01000000, 0x00000001}, + {0x58334242, 0x00000000, 0x00000001}, + {0x58334542, 0x04000000, 0x00000001}, + {0x58334759, 0x02000000, 0x00000003}, + {0x58334841, 0x04000000, 0x00000003}, + {0x58334941, 0x01000000, 0x00000002}, + {0x58334943, 0x04000000, 0x00000001}, + {0x58334C41, 0x02000000, 0x00000001}, + {0x58335456, 0x04000000, 0x00000001}, + {0x58343242, 0x00800000, 0x00000001}, + {0x58344A43, 0x01000000, 0x00000001}, + {0x58345442, 0x01000000, 0x00000008}, + {0x58345741, 0x02000000, 0x00000002}, + {0x58354259, 0x02000000, 0x00000002}, + {0x58354A42, 0x02000000, 0x00000001}, + {0x58354D54, 0x04000000, 0x00000003}, + {0x58355059, 0x10000000, 0x00000001}, + {0x58355142, 0x04000000, 0x00000001}, + {0x58355243, 0x10000000, 0x00000001}, + {0x58355259, 0x02000000, 0x00000002}, + {0x58355343, 0x04000000, 0x00000001}, + {0x58363559, 0x04000000, 0x00000008}, + {0x58364254, 0x02000000, 0x00000001}, + {0x58364341, 0x01000000, 0x00000002}, + {0x58365259, 0x00000000, 0x00000002}, + {0x58374943, 0x04000000, 0x00000002}, + {0x58374A42, 0x00800000, 0x00000001}, + {0x58374C42, 0x04000000, 0x00000001}, + {0x58375042, 0x02000000, 0x00000001}, + {0x58384442, 0x04000000, 0x00000001}, + {0x58384843, 0x02000000, 0x00000001}, + {0x58384D41, 0x01000000, 0x00000001}, + {0x58385741, 0x04000000, 0x00000001}, + {0x58385742, 0x01000000, 0x00000001}, + {0x58385859, 0x08000000, 0x00000001}, + {0x58394259, 0x02000000, 0x00000003}, + {0x58394943, 0x01000000, 0x00000002}, + {0x58394D59, 0x01000000, 0x00000001}, + {0x58395056, 0x04000000, 0x00000001}, + {0x58395141, 0x04000000, 0x00000001}, + {0x58395341, 0x02000000, 0x00000001}, + {0x58395759, 0x08000000, 0x00000001}, + {0x58413541, 0x04000000, 0x00000001}, + {0x58414243, 0x02000000, 0x00000001}, + {0x58414356, 0x04000000, 0x00000001}, + {0x58414643, 0x08000000, 0x00000002}, + {0x58414E43, 0x04000000, 0x00000001}, + {0x58415141, 0x02000000, 0x00000001}, + {0x58415243, 0x00800000, 0x00000001}, + {0x58415359, 0x01000000, 0x00000002}, + {0x58415459, 0x04000000, 0x00000001}, + {0x58415A43, 0x02000000, 0x00000002}, + {0x58423242, 0x08000000, 0x00000002}, + {0x58423542, 0x08000000, 0x00000002}, + {0x58424254, 0x02000000, 0x00000001}, + {0x58424654, 0x01000000, 0x00000001}, + {0x58424743, 0x02000000, 0x00000001}, + {0x58424A43, 0x01000000, 0x00000001}, + {0x58424B43, 0x02000000, 0x00000002}, + {0x58425342, 0x04000000, 0x00000003}, + {0x58425442, 0x04000000, 0x00000002}, + {0x58425742, 0x04000000, 0x00000002}, + {0x58433342, 0x04000000, 0x00000002}, + {0x58433441, 0x02000000, 0x00000003}, + {0x58434341, 0x02000000, 0x00000001}, + {0x58434542, 0x01000000, 0x00000003}, + {0x58434642, 0x02000000, 0x00000001}, + {0x58434741, 0x04000000, 0x00000003}, + {0x58434941, 0x01000000, 0x00000001}, + {0x58435043, 0x01000000, 0x00000002}, + {0x58435143, 0x02000000, 0x00000001}, + {0x58435359, 0x02000000, 0x00000001}, + {0x58435842, 0x01000000, 0x00000001}, + {0x58443743, 0x04000000, 0x00000001}, + {0x58444359, 0x01000000, 0x00000001}, + {0x58444642, 0x00000000, 0x00000001}, + {0x58444842, 0x04000000, 0x00000001}, + {0x58444A54, 0x01000000, 0x00000001}, + {0x58444B42, 0x00800000, 0x00000001}, + {0x58445054, 0x08000000, 0x00000001}, + {0x58445759, 0x01000000, 0x00000002}, + {0x58453242, 0x00800000, 0x00000001}, + {0x58453442, 0x01000000, 0x00000001}, + {0x58454543, 0x00800000, 0x00000001}, + {0x58454C43, 0x04000000, 0x00000001}, + {0x58455056, 0x04000000, 0x00000001}, + {0x58455141, 0x00800000, 0x00000002}, + {0x58455143, 0x04000000, 0x00000002}, + {0x58455456, 0x04000000, 0x00000002}, + {0x58455542, 0x02000000, 0x00000001}, + {0x58463642, 0x08000000, 0x00000001}, + {0x58464143, 0x01000000, 0x00000001}, + {0x58464243, 0x08000000, 0x00000003}, + {0x58464541, 0x00800000, 0x00000001}, + {0x58464A42, 0x08000000, 0x00000003}, + {0x58465956, 0x02000000, 0x00000001}, + {0x58465A42, 0x04000000, 0x00000001}, + {0x58473241, 0x02000000, 0x00000003}, + {0x58474142, 0x01000000, 0x00000001}, + {0x58474143, 0x02000000, 0x00000001}, + {0x58474342, 0x04000000, 0x00000002}, + {0x58474354, 0x04000000, 0x00000001}, + {0x58474542, 0x00800000, 0x00000001}, + {0x58475742, 0x04000000, 0x00000001}, + {0x58475956, 0x04000000, 0x00000001}, + {0x58483343, 0x00800000, 0x00000001}, + {0x58483842, 0x04000000, 0x00000002}, + {0x58484759, 0x08000000, 0x00000001}, + {0x58484A42, 0x01000000, 0x00000001}, + {0x58484C41, 0x02000000, 0x00000001}, + {0x58485243, 0x00000000, 0x00000002}, + {0x58485254, 0x02000000, 0x00000001}, + {0x58485641, 0x04000000, 0x00000002}, + {0x58485A59, 0x04000000, 0x00000001}, + {0x58493642, 0x04000000, 0x00000002}, + {0x58494442, 0x04000000, 0x00000001}, + {0x58494641, 0x02000000, 0x00000002}, + {0x58494942, 0x00800000, 0x00000001}, + {0x58494C43, 0x04000000, 0x00000001}, + {0x58495259, 0x04000000, 0x00000002}, + {0x58495442, 0x01000000, 0x00000001}, + {0x584A4841, 0x01000000, 0x00000002}, + {0x584A4D54, 0x02000000, 0x00000001}, + {0x584A5143, 0x00800000, 0x00000001}, + {0x584B3443, 0x00800000, 0x00000001}, + {0x584B3842, 0x02000000, 0x00000002}, + {0x584B4143, 0x04000000, 0x00000002}, + {0x584B4243, 0x04000000, 0x00000002}, + {0x584B4541, 0x04000000, 0x00000002}, + {0x584B4642, 0x04000000, 0x00000001}, + {0x584B4B41, 0x02000000, 0x00000003}, + {0x584B4C42, 0x04000000, 0x00000001}, + {0x584B5356, 0x04000000, 0x00000001}, + {0x584B5559, 0x04000000, 0x00000001}, + {0x584C4643, 0x02000000, 0x00000002}, + {0x584C4A59, 0x01000000, 0x00000002}, + {0x584C4E59, 0x04000000, 0x00000001}, + {0x584C5059, 0x00800000, 0x00000001}, + {0x584C5242, 0x02000000, 0x00000001}, + {0x584C5342, 0x02000000, 0x00000003}, + {0x584C5543, 0x04000000, 0x00000001}, + {0x584C5759, 0x02000000, 0x00000001}, + {0x584C5941, 0x02000000, 0x00000002}, + {0x584C5959, 0x04000000, 0x00000002}, + {0x584D3243, 0x02000000, 0x00000002}, + {0x584D3442, 0x02000000, 0x00000001}, + {0x584D4359, 0x02000000, 0x00000001}, + {0x584D4842, 0x02000000, 0x00000001}, + {0x584D4A54, 0x00800000, 0x00000001}, + {0x584D4C42, 0x01000000, 0x00000001}, + {0x584D4E42, 0x04000000, 0x00000001}, + {0x584D5642, 0x02000000, 0x00000001}, + {0x584D5842, 0x04000000, 0x00000002}, + {0x584E3743, 0x04000000, 0x00000001}, + {0x584E4354, 0x01000000, 0x00000001}, + {0x584E4559, 0x00800000, 0x00000001}, + {0x584E4641, 0x02000000, 0x00000002}, + {0x584E5159, 0x04000000, 0x00000002}, + {0x584F3543, 0x01000000, 0x00000001}, + {0x584F3642, 0x02000000, 0x00000001}, + {0x584F3743, 0x04000000, 0x00000002}, + {0x584F4142, 0x04000000, 0x00000001}, + {0x584F4156, 0x04000000, 0x00000001}, + {0x584F4442, 0x01000000, 0x00000001}, + {0x584F4D59, 0x04000000, 0x00000001}, + {0x584F5542, 0x02000000, 0x00000001}, + {0x584F5741, 0x02000000, 0x00000002}, + {0x584F5841, 0x01000000, 0x00000002}, + {0x584F5843, 0x04000000, 0x00000001}, + {0x58503541, 0x04000000, 0x00000001}, + {0x58504259, 0x02000000, 0x00000001}, + {0x58504342, 0x04000000, 0x00000002}, + {0x58504442, 0x02000000, 0x00000001}, + {0x58504B59, 0x01000000, 0x00000001}, + {0x58504F43, 0x01000000, 0x00000003}, + {0x58505343, 0x02000000, 0x00000003}, + {0x58513543, 0x01000000, 0x00000002}, + {0x58513643, 0x08000000, 0x00000001}, + {0x58514559, 0x01000000, 0x00000001}, + {0x58514A59, 0x01000000, 0x00000001}, + {0x58514C42, 0x02000000, 0x00000001}, + {0x58514D43, 0x02000000, 0x00000001}, + {0x58514D59, 0x02000000, 0x00000001}, + {0x58515459, 0x01000000, 0x00000001}, + {0x58523559, 0x04000000, 0x00000008}, + {0x58523743, 0x00800000, 0x00000001}, + {0x58524354, 0x00800000, 0x00000001}, + {0x58524459, 0x01000000, 0x00000001}, + {0x58524842, 0x02000000, 0x00000001}, + {0x58524943, 0x04000000, 0x00000002}, + {0x58524A42, 0x01000000, 0x00000001}, + {0x58524C54, 0x08000000, 0x00000001}, + {0x58524D42, 0x02000000, 0x00000001}, + {0x58525042, 0x00800000, 0x00000001}, + {0x58525141, 0x01000000, 0x00000002}, + {0x58525642, 0x04000000, 0x00000001}, + {0x58525843, 0x04000000, 0x00000001}, + {0x58533841, 0x00800000, 0x00000002}, + {0x58534342, 0x04000000, 0x00000002}, + {0x58534556, 0x04000000, 0x00000001}, + {0x58534642, 0x04000000, 0x00000001}, + {0x58534643, 0x02000000, 0x00000001}, + {0x58534743, 0x08000000, 0x00000001}, + {0x58534A54, 0x00800000, 0x00000001}, + {0x58534E43, 0x04000000, 0x00000002}, + {0x58535143, 0x02000000, 0x00000001}, + {0x58543341, 0x02000000, 0x00000002}, + {0x58543642, 0x04000000, 0x00000001}, + {0x58543743, 0x01000000, 0x00000002}, + {0x58544256, 0x02000000, 0x00000002}, + {0x58544D59, 0x02000000, 0x00000002}, + {0x58545054, 0x08000000, 0x00000001}, + {0x58545259, 0x02000000, 0x00000002}, + {0x58545A41, 0x01000000, 0x00000005}, + {0x58554159, 0x04000000, 0x00000003}, + {0x58554242, 0x04000000, 0x00000003}, + {0x58554341, 0x08000000, 0x00000005}, + {0x58554454, 0x01000000, 0x00000001}, + {0x58554643, 0x00000000, 0x00000002}, + {0x58554E42, 0x01000000, 0x00000001}, + {0x58555442, 0x04000000, 0x00000002}, + {0x58555841, 0x02000000, 0x00000001}, + {0x58564142, 0x04000000, 0x00000001}, + {0x58564159, 0x04000000, 0x00000002}, + {0x58564343, 0x01000000, 0x00000001}, + {0x58564854, 0x04000000, 0x00000001}, + {0x58564B42, 0x00800000, 0x00000001}, + {0x58564D42, 0x00800000, 0x00000001}, + {0x58565141, 0x01000000, 0x00000002}, + {0x58573241, 0x04000000, 0x00000001}, + {0x58573341, 0x04000000, 0x00000002}, + {0x58573742, 0x01000000, 0x00000002}, + {0x58574443, 0x01000000, 0x00000001}, + {0x58574859, 0x02000000, 0x00000001}, + {0x58574942, 0x04000000, 0x00000002}, + {0x58574C41, 0x02000000, 0x00000001}, + {0x58574D42, 0x04000000, 0x00000002}, + {0x58575141, 0x02000000, 0x00000001}, + {0x58575343, 0x04000000, 0x00000001}, + {0x58575942, 0x00800000, 0x00000001}, + {0x58584254, 0x04000000, 0x00000002}, + {0x58584C41, 0x02000000, 0x00000001}, + {0x58584D59, 0x00800000, 0x00000001}, + {0x58585043, 0x01000000, 0x00000005}, + {0x58594159, 0x02000000, 0x00000001}, + {0x58594259, 0x02000000, 0x00000001}, + {0x58594443, 0x02000000, 0x00000002}, + {0x58594741, 0x04000000, 0x00000003}, + {0x58594842, 0x02000000, 0x00000001}, + {0x58594943, 0x04000000, 0x00000002}, + {0x58594A42, 0x04000000, 0x00000001}, + {0x58594E42, 0x04000000, 0x00000001}, + {0x58595543, 0x02000000, 0x00000001}, + {0x585A3242, 0x00800000, 0x00000001}, + {0x585A3742, 0x04000000, 0x00000001}, + {0x585A4341, 0x01000000, 0x00000001}, + {0x585A4A59, 0x04000000, 0x00000005}, + {0x585A4C59, 0x10000000, 0x00000002}, + {0x585A4D56, 0x04000000, 0x00000001}, + {0x585A5059, 0x01000000, 0x00000001}, + {0x585A5242, 0x04000000, 0x00000003}, + {0x585A5243, 0x00800000, 0x00000002}, + {0x585A5442, 0x04000000, 0x00000001}, + {0x59325141, 0x02000000, 0x00000002}, + {0x59334242, 0x08000000, 0x00000001}, + {0x59334759, 0x02000000, 0x00000003}, + {0x59334941, 0x01000000, 0x00000002}, + {0x59334943, 0x04000000, 0x00000001}, + {0x59334C41, 0x02000000, 0x00000001}, + {0x59345741, 0x02000000, 0x00000002}, + {0x59354A42, 0x02000000, 0x00000001}, + {0x59355142, 0x08000000, 0x00000001}, + {0x59364341, 0x01000000, 0x00000002}, + {0x59374943, 0x00000000, 0x00000002}, + {0x59394259, 0x02000000, 0x00000003}, + {0x59395056, 0x04000000, 0x00000001}, + {0x59414356, 0x04000000, 0x00000001}, + {0x59414643, 0x08000000, 0x00000002}, + {0x59414E43, 0x04000000, 0x00000001}, + {0x59415359, 0x01000000, 0x00000002}, + {0x59415459, 0x04000000, 0x00000001}, + {0x59425442, 0x04000000, 0x00000002}, + {0x59425742, 0x04000000, 0x00000002}, + {0x59434741, 0x04000000, 0x00000003}, + {0x59443442, 0x01000000, 0x00000001}, + {0x59444642, 0x00800000, 0x00000001}, + {0x59445054, 0x08000000, 0x00000001}, + {0x59453442, 0x01000000, 0x00000001}, + {0x59454259, 0x08000000, 0x00000003}, + {0x59454543, 0x00800000, 0x00000001}, + {0x59454C43, 0x04000000, 0x00000001}, + {0x59455056, 0x04000000, 0x00000001}, + {0x59455143, 0x04000000, 0x00000002}, + {0x59455542, 0x02000000, 0x00000001}, + {0x59463642, 0x08000000, 0x00000001}, + {0x59465042, 0x04000000, 0x00000002}, + {0x59474354, 0x04000000, 0x00000001}, + {0x59474C43, 0x04000000, 0x00000001}, + {0x59484A42, 0x01000000, 0x00000001}, + {0x59484C41, 0x02000000, 0x00000001}, + {0x59495443, 0x02000000, 0x00000002}, + {0x594A4841, 0x01000000, 0x00000002}, + {0x594A4D54, 0x02000000, 0x00000001}, + {0x594B5356, 0x04000000, 0x00000001}, + {0x594C4A59, 0x01000000, 0x00000002}, + {0x594C4E59, 0x04000000, 0x00000001}, + {0x594C5759, 0x02000000, 0x00000001}, + {0x594E4641, 0x02000000, 0x00000002}, + {0x594E4654, 0x04000000, 0x00000002}, + {0x594E5159, 0x04000000, 0x00000002}, + {0x594F5841, 0x01000000, 0x00000002}, + {0x59504442, 0x02000000, 0x00000001}, + {0x59513642, 0x00800000, 0x00000001}, + {0x59514559, 0x01000000, 0x00000001}, + {0x59514D59, 0x02000000, 0x00000001}, + {0x59524254, 0x04000000, 0x00000001}, + {0x59524459, 0x01000000, 0x00000001}, + {0x59524842, 0x02000000, 0x00000001}, + {0x59524C54, 0x08000000, 0x00000001}, + {0x59533841, 0x00800000, 0x00000002}, + {0x59545054, 0x08000000, 0x00000001}, + {0x59545259, 0x02000000, 0x00000002}, + {0x59545A41, 0x01000000, 0x00000005}, + {0x59554242, 0x04000000, 0x00000003}, + {0x59554341, 0x08000000, 0x00000005}, + {0x59554B56, 0x04000000, 0x00000001}, + {0x59554D42, 0x04000000, 0x00000001}, + {0x59555154, 0x00800000, 0x00000001}, + {0x59555442, 0x04000000, 0x00000002}, + {0x59564854, 0x04000000, 0x00000001}, + {0x59565141, 0x01000000, 0x00000002}, + {0x59573241, 0x04000000, 0x00000001}, + {0x59574443, 0x01000000, 0x00000001}, + {0x59574C41, 0x02000000, 0x00000001}, + {0x59574D42, 0x04000000, 0x00000002}, + {0x59594159, 0x02000000, 0x00000001}, + {0x59594254, 0x04000000, 0x00000002}, + {0x59594442, 0x08000000, 0x00000002}, + {0x59594E42, 0x04000000, 0x00000001}, + {0x595A4341, 0x01000000, 0x00000001}, + {0x595A4A59, 0x04000000, 0x00000005}, + {0x595A5059, 0x01000000, 0x00000001}, + {0x595A5242, 0x04000000, 0x00000003}, + {0x595A5442, 0x04000000, 0x00000001}, + {0x595A5443, 0x02000000, 0x00000003}, + {0x5A325141, 0x02000000, 0x00000002}, + {0x5A334941, 0x01000000, 0x00000002}, + {0x5A335456, 0x04000000, 0x00000001}, + {0x5A345741, 0x02000000, 0x00000002}, + {0x5A353859, 0x00800000, 0x00000008}, + {0x5A374943, 0x04000000, 0x00000002}, + {0x5A414356, 0x04000000, 0x00000001}, + {0x5A424259, 0x02000000, 0x00000001}, + {0x5A445759, 0x01000000, 0x00000002}, + {0x5A454259, 0x08000000, 0x00000003}, + {0x5A475956, 0x04000000, 0x00000001}, + {0x5A4A3642, 0x00800000, 0x00000001}, + {0x5A4A3959, 0x00800000, 0x00000008}, + {0x5A4C4E59, 0x04000000, 0x00000001}, + {0x5A4C5759, 0x02000000, 0x00000001}, + {0x5A4C5959, 0x04000000, 0x00000002}, + {0x5A4D4842, 0x02000000, 0x00000001}, + {0x5A4F3959, 0x00800000, 0x00000000}, + {0x5A513642, 0x00800000, 0x00000001}, + {0x5A523642, 0x08000000, 0x00000002}, + {0x5A544D59, 0x02000000, 0x00000002}, + {0x5A545054, 0x08000000, 0x00000001}, + {0x5A554242, 0x04000000, 0x00000003}, + {0x5A565141, 0x01000000, 0x00000002}, + {0x5A574C41, 0x02000000, 0x00000001}, + {0x5A595543, 0x02000000, 0x00000001}, + {0x5A5A4254, 0x04000000, 0x00000002}, + {0x5A5A4341, 0x01000000, 0x00000001}, + {0x5A5A5242, 0x04000000, 0x00000003}, +}; + +#endif // ROMLIST_H diff --git a/src/SPI.cpp b/src/SPI.cpp index 1a5873e..ac40707 100644 --- a/src/SPI.cpp +++ b/src/SPI.cpp @@ -22,12 +22,14 @@ #include "Config.h" #include "NDS.h" #include "SPI.h" +#include "DSi_SPI_TSC.h" #include "Platform.h" namespace SPI_Firmware { +char FirmwarePath[1024]; u8* Firmware; u32 FirmwareLength; u32 FirmwareMask; @@ -76,6 +78,7 @@ bool VerifyCRC16(u32 start, u32 offset, u32 len, u32 crcoffset) bool Init() { + memset(FirmwarePath, 0, sizeof(FirmwarePath)); Firmware = NULL; return true; } @@ -90,10 +93,15 @@ void Reset() if (Firmware) delete[] Firmware; Firmware = NULL; - FILE* f = Platform::OpenLocalFile("firmware.bin", "rb"); + if (NDS::ConsoleType == 1) + strncpy(FirmwarePath, Config::DSiFirmwarePath, 1023); + else + strncpy(FirmwarePath, Config::FirmwarePath, 1023); + + FILE* f = Platform::OpenLocalFile(FirmwarePath, "rb"); if (!f) { - printf("firmware.bin not found\n"); + printf("Firmware not found\n"); // TODO: generate default firmware return; @@ -129,7 +137,11 @@ void Reset() fclose(f); // take a backup - const char* firmbkp = "firmware.bin.bak"; + char firmbkp[1028]; + int fplen = strlen(FirmwarePath); + strncpy(&firmbkp[0], FirmwarePath, fplen); + strncpy(&firmbkp[fplen], ".bak", 1028-fplen); + firmbkp[fplen+4] = '\0'; f = Platform::OpenLocalFile(firmbkp, "rb"); if (f) fclose(f); else @@ -151,6 +163,7 @@ void Reset() UserSettings = userdata; // fix touchscreen coords + #if 0 *(u16*)&Firmware[userdata+0x58] = 0; *(u16*)&Firmware[userdata+0x5A] = 0; Firmware[userdata+0x5C] = 0; @@ -173,12 +186,12 @@ void Reset() Firmware[0x39] = rand()&0xFF; Firmware[0x3A] = rand()&0xFF; Firmware[0x3B] = rand()&0xFF; - +#endif printf("MAC: %02X:%02X:%02X:%02X:%02X:%02X\n", Firmware[0x36], Firmware[0x37], Firmware[0x38], Firmware[0x39], Firmware[0x3A], Firmware[0x3B]); - *(u16*)&Firmware[0x2A] = CRC16(&Firmware[0x2C], *(u16*)&Firmware[0x2C], 0x0000); + //*(u16*)&Firmware[0x2A] = CRC16(&Firmware[0x2C], *(u16*)&Firmware[0x2C], 0x0000); // verify shit printf("FW: WIFI CRC16 = %s\n", VerifyCRC16(0x0000, 0x2C, *(u16*)&Firmware[0x2C], 0x2A)?"GOOD":"BAD"); @@ -225,6 +238,7 @@ void SetupDirectBoot() u8 GetConsoleType() { return Firmware[0x1D]; } u8 GetWifiVersion() { return Firmware[0x2F]; } u8 GetRFVersion() { return Firmware[0x40]; } +u8* GetWifiMAC() { return &Firmware[0x36]; } u8 Read() { @@ -325,7 +339,7 @@ void Write(u8 val, u32 hold) if (!hold && (CurCmd == 0x02 || CurCmd == 0x0A)) { - FILE* f = Platform::OpenLocalFile("firmware.bin", "r+b"); + FILE* f = Platform::OpenLocalFile(FirmwarePath, "r+b"); if (f) { u32 cutoff = 0x7FA00 & FirmwareMask; @@ -581,7 +595,7 @@ namespace SPI u16 Cnt; -u32 CurDevice; +u32 CurDevice; // remove me bool Init() @@ -589,6 +603,7 @@ bool Init() if (!SPI_Firmware::Init()) return false; if (!SPI_Powerman::Init()) return false; if (!SPI_TSC::Init()) return false; + if (!DSi_SPI_TSC::Init()) return false; return true; } @@ -598,6 +613,7 @@ void DeInit() SPI_Firmware::DeInit(); SPI_Powerman::DeInit(); SPI_TSC::DeInit(); + DSi_SPI_TSC::DeInit(); } void Reset() @@ -607,6 +623,7 @@ void Reset() SPI_Firmware::Reset(); SPI_Powerman::Reset(); SPI_TSC::Reset(); + if (NDS::ConsoleType == 1) DSi_SPI_TSC::Reset(); } void DoSavestate(Savestate* file) @@ -619,6 +636,7 @@ void DoSavestate(Savestate* file) SPI_Firmware::DoSavestate(file); SPI_Powerman::DoSavestate(file); SPI_TSC::DoSavestate(file); + if (NDS::ConsoleType == 1) DSi_SPI_TSC::DoSavestate(file); } @@ -632,7 +650,12 @@ void WriteCnt(u16 val) { case 0x0000: SPI_Powerman::Hold = 0; break; case 0x0100: SPI_Firmware::Hold = 0; break; - case 0x0200: SPI_TSC::DataPos = 0; break; + case 0x0200: + if (NDS::ConsoleType == 1) + DSi_SPI_TSC::DataPos = 0; + else + SPI_TSC::DataPos = 0; + break; } } @@ -658,7 +681,11 @@ u8 ReadData() { case 0x0000: return SPI_Powerman::Read(); case 0x0100: return SPI_Firmware::Read(); - case 0x0200: return SPI_TSC::Read(); + case 0x0200: + if (NDS::ConsoleType == 1) + return DSi_SPI_TSC::Read(); + else + return SPI_TSC::Read(); default: return 0; } } @@ -674,7 +701,12 @@ void WriteData(u8 val) { case 0x0000: SPI_Powerman::Write(val, Cnt&(1<<11)); break; case 0x0100: SPI_Firmware::Write(val, Cnt&(1<<11)); break; - case 0x0200: SPI_TSC::Write(val, Cnt&(1<<11)); break; + case 0x0200: + if (NDS::ConsoleType == 1) + DSi_SPI_TSC::Write(val, Cnt&(1<<11)); + else + SPI_TSC::Write(val, Cnt&(1<<11)); + break; default: printf("SPI to unknown device %04X %02X\n", Cnt, val); break; } @@ -29,6 +29,7 @@ void SetupDirectBoot(); u8 GetConsoleType(); u8 GetWifiVersion(); u8 GetRFVersion(); +u8* GetWifiMAC(); } @@ -38,6 +39,9 @@ namespace SPI_TSC void SetTouchCoords(u16 x, u16 y); void MicInputFrame(s16* data, int samples); +u8 Read(); +void Write(u8 val, u32 hold); + } namespace SPI @@ -50,7 +54,6 @@ void DeInit(); void Reset(); void DoSavestate(Savestate* file); -u16 ReadCnt(); void WriteCnt(u16 val); u8 ReadData(); diff --git a/src/SPU.cpp b/src/SPU.cpp index 710533e..9f6b107 100644 --- a/src/SPU.cpp +++ b/src/SPU.cpp @@ -19,6 +19,7 @@ #include <stdio.h> #include <string.h> #include "NDS.h" +#include "DSi.h" #include "SPU.h" @@ -116,6 +117,9 @@ void Reset() void Stop() { memset(OutputBuffer, 0, 2*OutputBufferSize*2); + + OutputReadOffset = 0; + OutputWriteOffset = 0; } void DoSavestate(Savestate* file) @@ -151,6 +155,11 @@ Channel::~Channel() void Channel::Reset() { + if (NDS::ConsoleType == 1) + BusRead32 = DSi::ARM7Read32; + else + BusRead32 = NDS::ARM7Read32; + SetCnt(0); SrcAddr = 0; TimerReload = 0; @@ -213,7 +222,7 @@ void Channel::FIFO_BufferData() for (u32 i = 0; i < burstlen; i += 4) { - FIFO[FIFOWritePos] = NDS::ARM7Read32(SrcAddr + FIFOReadOffset); + FIFO[FIFOWritePos] = BusRead32(SrcAddr + FIFOReadOffset); FIFOReadOffset += 4; FIFOWritePos++; FIFOWritePos &= 0x7; @@ -461,6 +470,11 @@ CaptureUnit::~CaptureUnit() void CaptureUnit::Reset() { + if (NDS::ConsoleType == 1) + BusWrite32 = DSi::ARM7Write32; + else + BusWrite32 = NDS::ARM7Write32; + SetCnt(0); DstAddr = 0; TimerReload = 0; @@ -496,7 +510,7 @@ void CaptureUnit::FIFO_FlushData() { for (u32 i = 0; i < 4; i++) { - NDS::ARM7Write32(DstAddr + FIFOWriteOffset, FIFO[FIFOReadPos]); + BusWrite32(DstAddr + FIFOWriteOffset, FIFO[FIFOReadPos]); FIFOReadPos++; FIFOReadPos &= 0x3; @@ -142,6 +142,9 @@ public: } void PanOutput(s32* inbuf, u32 samples, s32* leftbuf, s32* rightbuf); + +private: + u32 (*BusRead32)(u32 addr); }; class CaptureUnit @@ -196,6 +199,9 @@ public: } void Run(s32 sample); + +private: + void (*BusWrite32)(u32 addr, u32 val); }; } diff --git a/src/frontend/FrontendUtil.h b/src/frontend/FrontendUtil.h index 32f28d1..099583f 100644 --- a/src/frontend/FrontendUtil.h +++ b/src/frontend/FrontendUtil.h @@ -32,6 +32,33 @@ enum ROMSlot_MAX }; +enum +{ + Load_OK = 0, + + Load_BIOS9Missing, + Load_BIOS9Bad, + + Load_BIOS7Missing, + Load_BIOS7Bad, + + Load_FirmwareMissing, + Load_FirmwareBad, + Load_FirmwareNotBootable, + + Load_DSiBIOS9Missing, + Load_DSiBIOS9Bad, + + Load_DSiBIOS7Missing, + Load_DSiBIOS7Bad, + + Load_DSiNANDMissing, + Load_DSiNANDBad, + + // TODO: more precise errors for ROM loading + Load_ROMLoadError, +}; + extern char ROMPath [ROMSlot_MAX][1024]; extern char SRAMPath[ROMSlot_MAX][1024]; extern bool SavestateLoaded; @@ -41,11 +68,18 @@ extern bool SavestateLoaded; void Init_ROM(); // load the BIOS/firmware and boot from it -bool LoadBIOS(); +int LoadBIOS(); // load a ROM file to the specified cart slot // note: loading a ROM to the NDS slot resets emulation -bool LoadROM(const char* file, int slot); +int LoadROM(const char* file, int slot); + +// unload the ROM loaded in the specified cart slot +// simulating ejection of the cartridge +void UnloadROM(int slot); + +// reset execution of the current ROM +int Reset(); // get the filename associated with the given savestate slot (1-8) void GetSavestateName(int slot, char* filename, int len); @@ -64,6 +98,33 @@ bool SaveState(const char* filename); void UndoStateLoad(); +// setup the display layout based on the provided display size and parameters +// * screenWidth/screenHeight: size of the host display +// * screenLayout: how the DS screens are laid out +// 0 = natural (top screen above bottom screen always) +// 1 = vertical +// 2 = horizontal +// * rotation: angle at which the DS screens are presented: 0/1/2/3 = 0/90/180/270 +// * sizing: how the display size is shared between the two screens +// 0 = even (both screens get same size) +// 1 = emphasize top screen (make top screen as big as possible, fit bottom screen in remaining space) +// 2 = emphasize bottom screen +// * screenGap: size of the gap between the two screens +// * integerScale: force screens to be scaled up at integer scaling factors +void SetupScreenLayout(int screenWidth, int screenHeight, int screenLayout, int rotation, int sizing, int screenGap, bool integerScale); + +// get a 2x3 transform matrix for each screen +// note: the transform assumes an origin point at the top left of the display, +// X going left and Y going down +// for each screen the source coordinates should be (0,0) and (256,192) +// 'top' and 'bot' should point each to an array of 6 floats +void GetScreenTransforms(float* top, float* bot); + +// de-transform the provided host display coordinates to get coordinates +// on the bottom screen +void GetTouchCoords(int& x, int& y); + + // initialize the audio utility void Init_Audio(int outputfreq); @@ -72,9 +133,20 @@ void Init_Audio(int outputfreq); int AudioOut_GetNumSamples(int outlen); // resample audio from the core audio output to match the frontend's -// output frequency, and apply user-specified volume +// output frequency, and apply specified volume // note: this assumes the output buffer is interleaved stereo -void AudioOut_Resample(s16* inbuf, int inlen, s16* outbuf, int outlen); +void AudioOut_Resample(s16* inbuf, int inlen, s16* outbuf, int outlen, int volume); + +// feed silence to the microphone input +void Mic_FeedSilence(); + +// feed random noise to the microphone input +void Mic_FeedNoise(); + +// feed an external buffer to the microphone input +// buffer should be mono +void Mic_FeedExternalBuffer(); +void Mic_SetExternalBuffer(s16* buffer, u32 len); } diff --git a/src/frontend/Util_Audio.cpp b/src/frontend/Util_Audio.cpp index fe0ecab..fc80c90 100644 --- a/src/frontend/Util_Audio.cpp +++ b/src/frontend/Util_Audio.cpp @@ -17,16 +17,15 @@ */ #include <stdio.h> +#include <stdlib.h> #include <string.h> #include <math.h> #include "FrontendUtil.h" -#include "Config.h" -#include "qt_sdl/PlatformConfig.h" // FIXME!!! -#include "Platform.h" #include "NDS.h" -#include "GBACart.h" + +#include "mic_blow.h" namespace Frontend @@ -35,13 +34,22 @@ namespace Frontend int AudioOut_Freq; float AudioOut_SampleFrac; +s16* MicBuffer; +u32 MicBufferLength; +u32 MicBufferReadPos; + void Init_Audio(int outputfreq) { AudioOut_Freq = outputfreq; AudioOut_SampleFrac = 0; + + MicBuffer = nullptr; + MicBufferLength = 0; + MicBufferReadPos = 0; } + int AudioOut_GetNumSamples(int outlen) { float f_len_in = (outlen * 32823.6328125) / (float)AudioOut_Freq; @@ -52,14 +60,12 @@ int AudioOut_GetNumSamples(int outlen) return len_in; } -void AudioOut_Resample(s16* inbuf, int inlen, s16* outbuf, int outlen) +void AudioOut_Resample(s16* inbuf, int inlen, s16* outbuf, int outlen, int volume) { float res_incr = inlen / (float)outlen; float res_timer = 0; int res_pos = 0; - int volume = Config::AudioVolume; - for (int i = 0; i < outlen; i++) { outbuf[i*2 ] = (inbuf[res_pos*2 ] * volume) >> 8; @@ -74,4 +80,56 @@ void AudioOut_Resample(s16* inbuf, int inlen, s16* outbuf, int outlen) } } + +void Mic_FeedSilence() +{ + MicBufferReadPos = 0; + NDS::MicInputFrame(NULL, 0); +} + +void Mic_FeedNoise() +{ + int sample_len = sizeof(mic_blow) / sizeof(u16); + static int sample_pos = 0; + + s16 tmp[735]; + + for (int i = 0; i < 735; i++) + { + tmp[i] = mic_blow[sample_pos]; + sample_pos++; + if (sample_pos >= sample_len) sample_pos = 0; + } + + NDS::MicInputFrame(tmp, 735); +} + +void Mic_FeedExternalBuffer() +{ + if (!MicBuffer) return Mic_FeedSilence(); + + if ((MicBufferReadPos + 735) > MicBufferLength) + { + s16 tmp[735]; + u32 len1 = MicBufferLength - MicBufferReadPos; + memcpy(&tmp[0], &MicBuffer[MicBufferReadPos], len1*sizeof(s16)); + memcpy(&tmp[len1], &MicBuffer[0], (735 - len1)*sizeof(s16)); + + NDS::MicInputFrame(tmp, 735); + MicBufferReadPos = 735 - len1; + } + else + { + NDS::MicInputFrame(&MicBuffer[MicBufferReadPos], 735); + MicBufferReadPos += 735; + } +} + +void Mic_SetExternalBuffer(s16* buffer, u32 len) +{ + MicBuffer = buffer; + MicBufferLength = len; + MicBufferReadPos = 0; +} + } diff --git a/src/frontend/Util_ROM.cpp b/src/frontend/Util_ROM.cpp index 19c8eb9..8116a93 100644 --- a/src/frontend/Util_ROM.cpp +++ b/src/frontend/Util_ROM.cpp @@ -50,6 +50,11 @@ void Init_ROM() memset(PrevSRAMPath[ROMSlot_GBA], 0, 1024); } +// TODO: currently, when failing to load a ROM for whatever reason, we attempt +// to revert to the previous state and resume execution; this may not be a very +// good thing, depending on what state the core was left in. +// should we do a better state revert (via the savestate system)? completely stop? + void SetupSRAMPath(int slot) { strncpy(SRAMPath[slot], ROMPath[slot], 1023); @@ -57,8 +62,166 @@ void SetupSRAMPath(int slot) strncpy(SRAMPath[slot] + strlen(ROMPath[slot]) - 3, "sav", 3); } -bool LoadBIOS() +int VerifyDSBIOS() +{ + FILE* f; + long len; + + f = Platform::OpenLocalFile(Config::BIOS9Path, "rb"); + if (!f) return Load_BIOS9Missing; + + fseek(f, 0, SEEK_END); + len = ftell(f); + if (len != 0x1000) + { + fclose(f); + return Load_BIOS9Bad; + } + + fclose(f); + + f = Platform::OpenLocalFile(Config::BIOS7Path, "rb"); + if (!f) return Load_BIOS7Missing; + + fseek(f, 0, SEEK_END); + len = ftell(f); + if (len != 0x4000) + { + fclose(f); + return Load_BIOS7Bad; + } + + fclose(f); + + return Load_OK; +} + +int VerifyDSiBIOS() +{ + FILE* f; + long len; + + // TODO: check the first 32 bytes + + f = Platform::OpenLocalFile(Config::DSiBIOS9Path, "rb"); + if (!f) return Load_DSiBIOS9Missing; + + fseek(f, 0, SEEK_END); + len = ftell(f); + if (len != 0x10000) + { + fclose(f); + return Load_DSiBIOS9Bad; + } + + fclose(f); + + f = Platform::OpenLocalFile(Config::DSiBIOS7Path, "rb"); + if (!f) return Load_DSiBIOS7Missing; + + fseek(f, 0, SEEK_END); + len = ftell(f); + if (len != 0x10000) + { + fclose(f); + return Load_DSiBIOS7Bad; + } + + fclose(f); + + return Load_OK; +} + +int VerifyDSFirmware() +{ + FILE* f; + long len; + + f = Platform::OpenLocalFile(Config::FirmwarePath, "rb"); + if (!f) return Load_FirmwareMissing; + + fseek(f, 0, SEEK_END); + len = ftell(f); + if (len == 0x20000) + { + // 128KB firmware, not bootable + fclose(f); + return Load_FirmwareNotBootable; + } + else if (len != 0x40000 && len != 0x80000) + { + fclose(f); + return Load_FirmwareBad; + } + + fclose(f); + + return Load_OK; +} + +int VerifyDSiFirmware() { + FILE* f; + long len; + + f = Platform::OpenLocalFile(Config::DSiFirmwarePath, "rb"); + if (!f) return Load_FirmwareMissing; + + fseek(f, 0, SEEK_END); + len = ftell(f); + if (len != 0x20000) + { + // not 128KB + // TODO: check whether those work + fclose(f); + return Load_FirmwareBad; + } + + fclose(f); + + return Load_OK; +} + +int VerifyDSiNAND() +{ + FILE* f; + long len; + + f = Platform::OpenLocalFile(Config::DSiNANDPath, "rb"); + if (!f) return Load_DSiNANDMissing; + + // TODO: some basic checks + // check that it has the nocash footer, and all + + fclose(f); + + return Load_OK; +} + +int LoadBIOS() +{ + int res; + + res = VerifyDSBIOS(); + if (res != Load_OK) return res; + + if (Config::ConsoleType == 1) + { + res = VerifyDSiBIOS(); + if (res != Load_OK) return res; + + res = VerifyDSiFirmware(); + if (res != Load_OK) return res; + + res = VerifyDSiNAND(); + if (res != Load_OK) return res; + } + else + { + res = VerifyDSFirmware(); + if (res != Load_OK) return res; + } + // TODO: // original code in the libui frontend called NDS::LoadGBAROM() if needed // should this be carried over here? @@ -67,16 +230,54 @@ bool LoadBIOS() ROMPath[ROMSlot_NDS][0] = '\0'; SRAMPath[ROMSlot_NDS][0] = '\0'; + NDS::SetConsoleType(Config::ConsoleType); NDS::LoadBIOS(); SavestateLoaded = false; - // TODO: error reporting? - return true; + return Load_OK; } -bool LoadROM(const char* file, int slot) +int LoadROM(const char* file, int slot) { + int res; + bool directboot = Config::DirectBoot != 0; + + if (Config::ConsoleType == 1 && slot == 1) + { + // cannot load a GBA ROM into a DSi + return Load_ROMLoadError; + } + + res = VerifyDSBIOS(); + if (res != Load_OK) return res; + + if (Config::ConsoleType == 1) + { + res = VerifyDSiBIOS(); + if (res != Load_OK) return res; + + res = VerifyDSiFirmware(); + if (res != Load_OK) return res; + + res = VerifyDSiNAND(); + if (res != Load_OK) return res; + + GBACart::Eject(); + ROMPath[ROMSlot_GBA][0] = '\0'; + } + else + { + res = VerifyDSFirmware(); + if (res != Load_OK) + { + if (res == Load_FirmwareNotBootable) + directboot = true; + else + return res; + } + } + char oldpath[1024]; char oldsram[1024]; strncpy(oldpath, ROMPath[slot], 1024); @@ -88,29 +289,105 @@ bool LoadROM(const char* file, int slot) SetupSRAMPath(0); SetupSRAMPath(1); - if (slot == ROMSlot_NDS && NDS::LoadROM(ROMPath[slot], SRAMPath[slot], Config::DirectBoot)) + NDS::SetConsoleType(Config::ConsoleType); + + if (slot == ROMSlot_NDS && NDS::LoadROM(ROMPath[slot], SRAMPath[slot], directboot)) { SavestateLoaded = false; // Reload the inserted GBA cartridge (if any) + // TODO: report failure there?? if (ROMPath[ROMSlot_GBA][0] != '\0') NDS::LoadGBAROM(ROMPath[ROMSlot_GBA], SRAMPath[ROMSlot_GBA]); strncpy(PrevSRAMPath[slot], SRAMPath[slot], 1024); // safety - return true; + return Load_OK; } else if (slot == ROMSlot_GBA && NDS::LoadGBAROM(ROMPath[slot], SRAMPath[slot])) { - SavestateLoaded = false; + SavestateLoaded = false; // checkme?? strncpy(PrevSRAMPath[slot], SRAMPath[slot], 1024); // safety - return true; + return Load_OK; } else { strncpy(ROMPath[slot], oldpath, 1024); strncpy(SRAMPath[slot], oldsram, 1024); - return false; + return Load_ROMLoadError; + } +} + +void UnloadROM(int slot) +{ + if (slot == ROMSlot_NDS) + { + // TODO! + } + else if (slot == ROMSlot_GBA) + { + GBACart::Eject(); } + + ROMPath[slot][0] = '\0'; +} + +int Reset() +{ + int res; + bool directboot = Config::DirectBoot != 0; + + res = VerifyDSBIOS(); + if (res != Load_OK) return res; + + if (Config::ConsoleType == 1) + { + res = VerifyDSiBIOS(); + if (res != Load_OK) return res; + + res = VerifyDSiFirmware(); + if (res != Load_OK) return res; + + res = VerifyDSiNAND(); + if (res != Load_OK) return res; + + GBACart::Eject(); + ROMPath[ROMSlot_GBA][0] = '\0'; + } + else + { + res = VerifyDSFirmware(); + if (res != Load_OK) + { + if (res == Load_FirmwareNotBootable) + directboot = true; + else + return res; + } + } + + SavestateLoaded = false; + + NDS::SetConsoleType(Config::ConsoleType); + + if (ROMPath[ROMSlot_NDS][0] == '\0') + { + NDS::LoadBIOS(); + } + else + { + SetupSRAMPath(0); + if (!NDS::LoadROM(ROMPath[ROMSlot_NDS], SRAMPath[ROMSlot_NDS], directboot)) + return Load_ROMLoadError; + } + + if (ROMPath[ROMSlot_GBA][0] != '\0') + { + SetupSRAMPath(1); + if (!NDS::LoadGBAROM(ROMPath[ROMSlot_GBA], SRAMPath[ROMSlot_GBA])) + return Load_ROMLoadError; + } + + return Load_OK; } @@ -241,10 +518,6 @@ bool SaveState(const char* filename) } } - /*char msg[64]; - if (slot > 0) sprintf(msg, "State saved to slot %d", slot); - else sprintf(msg, "State saved to file"); - OSD::AddMessage(0, msg);*/ return true; } @@ -264,8 +537,6 @@ void UndoStateLoad() strncpy(SRAMPath[ROMSlot_NDS], PrevSRAMPath[ROMSlot_NDS], 1024); NDS::RelocateSave(SRAMPath[ROMSlot_NDS], false); } - - //OSD::AddMessage(0, "State load undone"); } } diff --git a/src/frontend/Util_Video.cpp b/src/frontend/Util_Video.cpp new file mode 100644 index 0000000..87cb9b5 --- /dev/null +++ b/src/frontend/Util_Video.cpp @@ -0,0 +1,334 @@ +/* + Copyright 2016-2020 Arisotura + + This file is part of melonDS. + + melonDS is free software: you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + melonDS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with melonDS. If not, see http://www.gnu.org/licenses/. +*/ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <cmath> +#include <algorithm> + +#include "FrontendUtil.h" + + +namespace Frontend +{ + +float TopScreenMtx[6]; +float BotScreenMtx[6]; +float TouchMtx[6]; + + +void M23_Identity(float* m) +{ + m[0] = 1; m[1] = 0; + m[2] = 0; m[3] = 1; + m[4] = 0; m[5] = 0; +} + +void M23_Scale(float* m, float s) +{ + m[0] *= s; m[1] *= s; + m[2] *= s; m[3] *= s; + m[4] *= s; m[5] *= s; +} + +void M23_RotateFast(float* m, int angle) +{ + if (angle == 0) return; + + float temp[4]; memcpy(temp, m, sizeof(float)*4); + + switch (angle) + { + case 1: // 90 + m[0] = temp[2]; + m[1] = temp[3]; + m[2] = -temp[0]; + m[3] = -temp[1]; + break; + + case 2: // 180 + m[0] = -temp[0]; + m[1] = -temp[1]; + m[2] = -temp[2]; + m[3] = -temp[3]; + break; + + case 3: // 270 + m[0] = -temp[2]; + m[1] = -temp[3]; + m[2] = temp[0]; + m[3] = temp[1]; + break; + } +} + +void M23_Translate(float* m, float tx, float ty) +{ + m[4] += tx; + m[5] += ty; +} + +void M23_Multiply(float* m, float* _a, float* _b) +{ + float a[6]; memcpy(a, _a, 6*sizeof(float)); + float b[6]; memcpy(b, _b, 6*sizeof(float)); + + m[0] = (a[0] * b[0]) + (a[2] * b[1]); + m[1] = (a[1] * b[0]) + (a[3] * b[1]); + + m[2] = (a[0] * b[2]) + (a[2] * b[3]); + m[3] = (a[1] * b[2]) + (a[3] * b[3]); + + m[4] = (a[0] * b[4]) + (a[2] * b[5]) + a[4]; + m[5] = (a[1] * b[4]) + (a[3] * b[5]) + a[5]; +} + +void M23_Transform(float* m, float& x, float& y) +{ + float vx = x; + float vy = y; + + x = (vx * m[0]) + (vy * m[2]) + m[4]; + y = (vx * m[1]) + (vy * m[3]) + m[5]; +} + + +void SetupScreenLayout(int screenWidth, int screenHeight, int screenLayout, int rotation, int sizing, int screenGap, bool integerScale) +{ + float refpoints[4][2] = + { + {0, 0}, {256, 192}, + {0, 0}, {256, 192} + }; + + int layout = screenLayout == 0 + ? ((rotation % 2 == 0) ? 0 : 1) + : screenLayout - 1; + + float botScale = 1; + float botTrans[4] = {0}; + + M23_Identity(TopScreenMtx); + M23_Identity(BotScreenMtx); + + M23_Translate(TopScreenMtx, -256/2, -192/2); + M23_Translate(BotScreenMtx, -256/2, -192/2); + + // rotation + { + float rotmtx[6]; + M23_Identity(rotmtx); + + M23_RotateFast(rotmtx, rotation); + M23_Multiply(TopScreenMtx, rotmtx, TopScreenMtx); + M23_Multiply(BotScreenMtx, rotmtx, BotScreenMtx); + + M23_Transform(TopScreenMtx, refpoints[0][0], refpoints[0][1]); + M23_Transform(TopScreenMtx, refpoints[1][0], refpoints[1][1]); + M23_Transform(BotScreenMtx, refpoints[2][0], refpoints[2][1]); + M23_Transform(BotScreenMtx, refpoints[3][0], refpoints[3][1]); + } + + // move screens apart + { + int idx = layout == 0 ? 1 : 0; + float offset = + (((layout == 0 && (rotation % 2 == 0)) || (layout == 1 && (rotation % 2 == 1)) + ? 192.f : 256.f) + + screenGap) / 2.f; + if (rotation == 1 || rotation == 2) + offset *= -1.f; + + M23_Translate(TopScreenMtx, (idx==0)?-offset:0, (idx==1)?-offset:0); + M23_Translate(BotScreenMtx, (idx==0)?offset:0, (idx==1)?offset:0); + + refpoints[0][idx] -= offset; + refpoints[1][idx] -= offset; + refpoints[2][idx] += offset; + refpoints[3][idx] += offset; + + botTrans[idx] = offset; + } + + // scale + { + if (sizing == 0) + { + float minX = refpoints[0][0], maxX = minX; + float minY = refpoints[0][1], maxY = minY; + + for (int i = 1; i < 4; i++) + { + minX = std::min(minX, refpoints[i][0]); + minY = std::min(minY, refpoints[i][1]); + maxX = std::max(maxX, refpoints[i][0]); + maxY = std::max(maxY, refpoints[i][1]); + } + + float hSize = maxX - minX; + float vSize = maxY - minY; + + // scale evenly + float scale = std::min(screenWidth / hSize, screenHeight / vSize); + + if (integerScale) + scale = floor(scale); + + M23_Scale(TopScreenMtx, scale); + M23_Scale(BotScreenMtx, scale); + + for (int i = 0; i < 4; i++) + { + refpoints[i][0] *= scale; + refpoints[i][1] *= scale; + } + + botScale = scale; + } + else + { + int primOffset = (sizing == 1) ? 0 : 2; + int secOffset = (sizing == 1) ? 2 : 0; + float* primMtx = (sizing == 1) ? TopScreenMtx : BotScreenMtx; + float* secMtx = (sizing == 1) ? BotScreenMtx : TopScreenMtx; + + float primMinX = refpoints[primOffset][0], primMaxX = primMinX; + float primMinY = refpoints[primOffset][1], primMaxY = primMinY; + float secMinX = refpoints[secOffset][0], secMaxX = secMinX; + float secMinY = refpoints[secOffset][1], secMaxY = secMinY; + + primMinX = std::min(primMinX, refpoints[primOffset+1][0]); + primMinY = std::min(primMinY, refpoints[primOffset+1][1]); + primMaxX = std::max(primMaxX, refpoints[primOffset+1][0]); + primMaxY = std::max(primMaxY, refpoints[primOffset+1][1]); + + secMinX = std::min(secMinX, refpoints[secOffset+1][0]); + secMinY = std::min(secMinY, refpoints[secOffset+1][1]); + secMaxX = std::max(secMaxX, refpoints[secOffset+1][0]); + secMaxY = std::max(secMaxY, refpoints[secOffset+1][1]); + + float primHSize = layout == 1 ? std::max(primMaxX, -primMinX) : primMaxX - primMinX; + float primVSize = layout == 0 ? std::max(primMaxY, -primMinY) : primMaxY - primMinY; + + float secHSize = layout == 1 ? std::max(secMaxX, -secMinX) : secMaxX - secMinX; + float secVSize = layout == 0 ? std::max(secMaxY, -secMinY) : secMaxY - secMinY; + + float primScale = std::min(screenWidth / primHSize, screenHeight / primVSize); + float secScale = 1.f; + + if (layout == 0) + { + if (screenHeight - primVSize * primScale < secVSize) + primScale = std::min(screenWidth / primHSize, (screenHeight - secVSize) / primVSize); + else + secScale = std::min((screenHeight - primVSize * primScale) / secVSize, screenWidth / secHSize); + } + else + { + if (screenWidth - primHSize * primScale < secHSize) + primScale = std::min((screenWidth - secHSize) / primHSize, screenHeight / primVSize); + else + secScale = std::min((screenWidth - primHSize * primScale) / secHSize, screenHeight / secVSize); + } + + if (integerScale) + { + primScale = floor(primScale); + secScale = floor(secScale); + } + + M23_Scale(primMtx, primScale); + M23_Scale(secMtx, secScale); + + refpoints[primOffset+0][0] *= primScale; + refpoints[primOffset+0][1] *= primScale; + refpoints[primOffset+1][0] *= primScale; + refpoints[primOffset+1][1] *= primScale; + refpoints[secOffset+0][0] *= secScale; + refpoints[secOffset+0][1] *= secScale; + refpoints[secOffset+1][0] *= secScale; + refpoints[secOffset+1][1] *= secScale; + + botScale = (sizing == 1) ? secScale : primScale; + } + } + + // position + { + float minX = refpoints[0][0], maxX = minX; + float minY = refpoints[0][1], maxY = minY; + + for (int i = 1; i < 4; i++) + { + minX = std::min(minX, refpoints[i][0]); + minY = std::min(minY, refpoints[i][1]); + maxX = std::max(maxX, refpoints[i][0]); + maxY = std::max(maxY, refpoints[i][1]); + } + + float width = maxX - minX; + float height = maxY - minY; + + float tx = (screenWidth/2) - (width/2) - minX; + float ty = (screenHeight/2) - (height/2) - minY; + + M23_Translate(TopScreenMtx, tx, ty); + M23_Translate(BotScreenMtx, tx, ty); + + botTrans[2] = tx; botTrans[3] = ty; + } + + // prepare a 'reverse' matrix for the touchscreen + // this matrix undoes the transforms applied to the bottom screen + // and can be used to calculate touchscreen coords from host screen coords + { + M23_Identity(TouchMtx); + + M23_Translate(TouchMtx, -botTrans[2], -botTrans[3]); + M23_Scale(TouchMtx, 1.f / botScale); + M23_Translate(TouchMtx, -botTrans[0], -botTrans[1]); + + float rotmtx[6]; + M23_Identity(rotmtx); + M23_RotateFast(rotmtx, (4-rotation) & 3); + M23_Multiply(TouchMtx, rotmtx, TouchMtx); + + M23_Translate(TouchMtx, 256/2, 192/2); + } +} + +void GetScreenTransforms(float* top, float* bot) +{ + memcpy(top, TopScreenMtx, 6*sizeof(float)); + memcpy(bot, BotScreenMtx, 6*sizeof(float)); +} + +void GetTouchCoords(int& x, int& y) +{ + float vx = x; + float vy = y; + + M23_Transform(TouchMtx, vx, vy); + + x = (int)vx; + y = (int)vy; +} + +} + diff --git a/src/frontend/mic_blow.h b/src/frontend/mic_blow.h new file mode 100644 index 0000000..cee92fe --- /dev/null +++ b/src/frontend/mic_blow.h @@ -0,0 +1,5539 @@ +/* + Copyright 2016-2020 Arisotura + + This file is part of melonDS. + + melonDS is free software: you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + melonDS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with melonDS. If not, see http://www.gnu.org/licenses/. +*/ + +#ifndef MIC_BLOW_H +#define MIC_BLOW_H + +const u16 mic_blow[] = +{ + 0x1840, 0x1EF0, 0x24F0, 0x2A60, 0x2F60, 0x33F0, 0x3800, 0x3BC0, 0x3FB0, 0x43E0, 0x48A0, 0x4EC0, 0x5490, 0x5A30, 0x6040, 0x6490, + 0x6960, 0x6E40, 0x7220, 0x76B0, 0x79B0, 0x7CA0, 0x7E60, 0x7F00, 0x7F20, 0x7EC0, 0x7F10, 0x7F10, 0x7F00, 0x7EF0, 0x7EC0, 0x7F30, + 0x7F00, 0x7EF0, 0x7F10, 0x7F00, 0x7F40, 0x7F10, 0x7F10, 0x7F00, 0x7EE0, 0x7F30, 0x7EF0, 0x7F20, 0x7EF0, 0x7F10, 0x7F60, 0x7F00, + 0x7F10, 0x7F10, 0x7F20, 0x7F60, 0x7EF0, 0x7EF0, 0x7EE0, 0x7EF0, 0x7F50, 0x7EF0, 0x7EA0, 0x7EF0, 0x7F10, 0x7F60, 0x7EE0, 0x7E90, + 0x7F10, 0x7F00, 0x7EF0, 0x7EF0, 0x7EA0, 0x7EE0, 0x7EF0, 0x7F30, 0x7F20, 0x7EC0, 0x7F10, 0x7F10, 0x7F00, 0x7F10, 0x7EB0, 0x7F20, + 0x7EE0, 0x7EF0, 0x7F30, 0x7F20, 0x7F60, 0x7F10, 0x7F20, 0x7F40, 0x7F10, 0x7F80, 0x7EB0, 0x7220, 0x66D0, 0x5BD0, 0x5190, 0x4680, + 0x3D70, 0x3470, 0x2C70, 0x2640, 0x2090, 0x1D00, 0x1A40, 0x1910, 0x1810, 0x17A0, 0x1860, 0x19C0, 0x1C10, 0x1F30, 0x22E0, 0x2930, + 0x2FA0, 0x3720, 0x3EC0, 0x46B0, 0x4E80, 0x5660, 0x5ED0, 0x6710, 0x7000, 0x7720, 0x7D10, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, + 0x7F30, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, + 0x7F20, 0x7F30, 0x7F30, 0x7F40, 0x7F30, 0x7F30, 0x7F30, 0x7F40, 0x7F10, 0x7F30, 0x7F20, 0x7E80, 0x7D30, 0x7C00, 0x7AA0, 0x7890, + 0x7610, 0x73F0, 0x71A0, 0x6F60, 0x6CD0, 0x6970, 0x6670, 0x6310, 0x5F90, 0x5D10, 0x5A20, 0x5720, 0x5410, 0x4FB0, 0x4AC0, 0x4670, + 0x4250, 0x3E40, 0x39F0, 0x3540, 0x2FB0, 0x28E0, 0x2260, 0x1BB0, 0x15F0, 0x10B0, 0x0C60, 0x08B0, 0x05B0, 0x0300, 0x00F0, 0xFEB0, + 0xFC00, 0xF8E0, 0xF570, 0xF170, 0xED60, 0xE8E0, 0xE4C0, 0xDFF0, 0xDB90, 0xD650, 0xD090, 0xCAB0, 0xC570, 0xC0C0, 0xBD00, 0xBA30, + 0xB790, 0xB4C0, 0xB1B0, 0xAF40, 0xAD00, 0xAC10, 0xAB70, 0xAA70, 0xA9C0, 0xA800, 0xA640, 0xA520, 0xA420, 0xA2C0, 0xA1D0, 0xA000, + 0x9E60, 0x9CF0, 0x9B80, 0x9A10, 0x97F0, 0x9550, 0x9340, 0x9170, 0x8F80, 0x8DA0, 0x8C40, 0x8B10, 0x89E0, 0x8890, 0x87B0, 0x86F0, + 0x8660, 0x8640, 0x8600, 0x85F0, 0x85D0, 0x85B0, 0x8580, 0x8560, 0x8550, 0x8550, 0x8540, 0x8530, 0x8530, 0x8520, 0x8510, 0x8510, + 0x8500, 0x8500, 0x8500, 0x8500, 0x84F0, 0x84F0, 0x84E0, 0x84E0, 0x84E0, 0x84E0, 0x84E0, 0x8510, 0x84E0, 0x84E0, 0x8500, 0x84F0, + 0x84F0, 0x84C0, 0x84F0, 0x8500, 0x8500, 0x8510, 0x8520, 0x8530, 0x8550, 0x8580, 0x8590, 0x85D0, 0x8610, 0x8690, 0x8730, 0x8820, + 0x8970, 0x8BC0, 0x8E40, 0x9190, 0x9560, 0x9990, 0x9E30, 0xA1E0, 0xA540, 0xA890, 0xAAB0, 0xADB0, 0xB0E0, 0xB370, 0xB5E0, 0xB860, + 0xBB30, 0xBEB0, 0xC230, 0xC5E0, 0xC930, 0xCD20, 0xCFA0, 0xD130, 0xD310, 0xD530, 0xD8C0, 0xDC80, 0xE0D0, 0xE520, 0xE880, 0xEBF0, + 0xEEB0, 0xF160, 0xF460, 0xF6F0, 0xF970, 0xFBC0, 0xFE90, 0x0250, 0x04C0, 0x06E0, 0x0910, 0x0AB0, 0x0C90, 0x0DA0, 0x0F80, 0x1210, + 0x1400, 0x1550, 0x1680, 0x1770, 0x18A0, 0x1A10, 0x1C90, 0x1E80, 0x2060, 0x22B0, 0x2360, 0x2540, 0x2600, 0x26C0, 0x2920, 0x2B40, + 0x2D50, 0x2EF0, 0x30C0, 0x31D0, 0x3210, 0x3330, 0x33E0, 0x35C0, 0x36F0, 0x37D0, 0x38A0, 0x3990, 0x39F0, 0x39C0, 0x39C0, 0x3950, + 0x3820, 0x3730, 0x36A0, 0x3610, 0x35A0, 0x3490, 0x3270, 0x30B0, 0x2E20, 0x2C60, 0x2A90, 0x2890, 0x2760, 0x2490, 0x2330, 0x20C0, + 0x1F20, 0x1E10, 0x1D30, 0x1D70, 0x1D20, 0x1D10, 0x1E40, 0x1F00, 0x2010, 0x2110, 0x21B0, 0x23C0, 0x25E0, 0x2810, 0x2A20, 0x2C10, + 0x2DF0, 0x2E20, 0x2E60, 0x2F10, 0x2FB0, 0x30F0, 0x3200, 0x31F0, 0x31B0, 0x3070, 0x2F50, 0x2DC0, 0x2BD0, 0x29F0, 0x27C0, 0x2650, + 0x2470, 0x2290, 0x2090, 0x1DF0, 0x1B60, 0x18C0, 0x1670, 0x1490, 0x1220, 0x10E0, 0x0EA0, 0x0D60, 0x0C90, 0x0B10, 0x09B0, 0x0860, + 0x06C0, 0x0630, 0x0520, 0x0520, 0x04F0, 0x0430, 0x0340, 0x0180, 0x0150, 0x0100, 0xFFE0, 0x00A0, 0xFFC0, 0xFFF0, 0xFFF0, 0xFFF0, + 0x00B0, 0x00C0, 0x0150, 0x0190, 0x00D0, 0x0170, 0x01F0, 0x0330, 0x03F0, 0x0480, 0x0510, 0x0580, 0x0570, 0x05C0, 0x0630, 0x06E0, + 0x0810, 0x0910, 0x0A50, 0x0B20, 0x0BD0, 0x0CD0, 0x0E70, 0x1070, 0x1280, 0x1520, 0x17B0, 0x18F0, 0x2120, 0x2240, 0x2340, 0x23B0, + 0x2560, 0x2640, 0x27F0, 0x29F0, 0x2AB0, 0x2BC0, 0x2C50, 0x2CE0, 0x2E20, 0x2F50, 0x3150, 0x3360, 0x33E0, 0x3510, 0x3500, 0x3520, + 0x34F0, 0x33B0, 0x3320, 0x3200, 0x3210, 0x3150, 0x30E0, 0x3010, 0x2ED0, 0x2DE0, 0x2D20, 0x2AF0, 0x2A50, 0x28D0, 0x2760, 0x26C0, + 0x2560, 0x2540, 0x2460, 0x2350, 0x2290, 0x2170, 0x21A0, 0x2110, 0x2090, 0x2000, 0x1F50, 0x1F80, 0x1F40, 0x21A0, 0x21D0, 0x21B0, + 0x21E0, 0x21C0, 0x2260, 0x2370, 0x24F0, 0x2630, 0x2700, 0x2760, 0x2810, 0x2930, 0x2AE0, 0x2C40, 0x2D20, 0x2D80, 0x2DF0, 0x2F00, + 0x30A0, 0x31F0, 0x3510, 0x36B0, 0x3950, 0x3AB0, 0x3B70, 0x3DA0, 0x3F90, 0x4310, 0x4640, 0x4840, 0x4B10, 0x4D20, 0x4FE0, 0x5270, + 0x5590, 0x5900, 0x5C00, 0x5ED0, 0x6110, 0x63A0, 0x66F0, 0x69A0, 0x6CA0, 0x6F40, 0x7090, 0x7290, 0x7440, 0x75F0, 0x7800, 0x79C0, + 0x7BA0, 0x7C90, 0x7D90, 0x7E00, 0x7E70, 0x7ED0, 0x7EF0, 0x7F70, 0x7EF0, 0x7F10, 0x7F00, 0x7F00, 0x7F70, 0x7F10, 0x7EB0, 0x7EA0, + 0x7E40, 0x7C70, 0x7AA0, 0x7890, 0x76F0, 0x74E0, 0x71F0, 0x6EC0, 0x6A00, 0x6630, 0x61E0, 0x5D10, 0x5A30, 0x5560, 0x5160, 0x4D50, + 0x4990, 0x46E0, 0x4400, 0x4130, 0x3DE0, 0x3A00, 0x3790, 0x3480, 0x31E0, 0x2F80, 0x2CD0, 0x2B30, 0x27C0, 0x24D0, 0x2220, 0x2020, + 0x1F00, 0x1D10, 0x1B10, 0x1830, 0x1520, 0x12F0, 0x1160, 0x10A0, 0x0FC0, 0x0E30, 0x0BB0, 0x0900, 0x05F0, 0x0350, 0x00E0, 0xFF50, + 0xFD70, 0xFA30, 0xF600, 0xF1C0, 0xEE10, 0xEA30, 0xE5E0, 0xE1F0, 0xDDB0, 0xD8C0, 0xD3C0, 0xCE10, 0xC850, 0xC2C0, 0xBD40, 0xB720, + 0xAFF0, 0xA880, 0xA0D0, 0x99A0, 0x9250, 0x8C50, 0x88B0, 0x86A0, 0x85B0, 0x8540, 0x8510, 0x84F0, 0x84E0, 0x84D0, 0x84D0, 0x84C0, + 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84C0, 0x84C0, 0x84C0, 0x84F0, 0x84F0, + 0x84D0, 0x84D0, 0x8490, 0x84F0, 0x84F0, 0x8500, 0x8500, 0x8510, 0x8520, 0x8540, 0x8560, 0x8590, 0x85E0, 0x8630, 0x8680, 0x8700, + 0x87C0, 0x88C0, 0x89D0, 0x8BA0, 0x8DF0, 0x9050, 0x9320, 0x9620, 0x9930, 0x9BE0, 0x9E30, 0xA0F0, 0xA300, 0xA5B0, 0xA8C0, 0xABC0, + 0xAE30, 0xB140, 0xB3E0, 0xB660, 0xB7B0, 0xB990, 0xBB30, 0xBDC0, 0xBF70, 0xC0A0, 0xC200, 0xC310, 0xC410, 0xC5A0, 0xC710, 0xC7F0, + 0xC910, 0xC960, 0xCA30, 0xCA70, 0xCB70, 0xCB90, 0xCBF0, 0xCCB0, 0xCD00, 0xCE40, 0xCEA0, 0xCEF0, 0xD010, 0xD0F0, 0xD2F0, 0xD360, + 0xD470, 0xD570, 0xD660, 0xD740, 0xD7B0, 0xD820, 0xD820, 0xD880, 0xD810, 0xD910, 0xDA60, 0xDB80, 0xDC90, 0xDD20, 0xDD40, 0xDDA0, + 0xDE00, 0xDE90, 0xDF60, 0xDFD0, 0xE030, 0xE070, 0xE010, 0xE070, 0xE130, 0xE1F0, 0xE240, 0xE1C0, 0xE1A0, 0xE1C0, 0xE1C0, 0xE210, + 0xE270, 0xE1E0, 0xE1D0, 0xE1A0, 0xE0E0, 0xE0A0, 0xDFF0, 0xE010, 0xDFC0, 0xDF60, 0xDEB0, 0xDDB0, 0xDC70, 0xDC10, 0xDB70, 0xDA80, + 0xD990, 0xD8B0, 0xD790, 0xD7E0, 0xD860, 0xD800, 0xD7B0, 0xD650, 0xD580, 0xD470, 0xD3F0, 0xD380, 0xD3D0, 0xD3D0, 0xD300, 0xD1B0, + 0xD030, 0xCFA0, 0xCF60, 0xCF10, 0xCF30, 0xCEE0, 0xCEE0, 0xCEA0, 0xCEF0, 0xCEE0, 0xCF10, 0xCF80, 0xD030, 0xD0A0, 0xD150, 0xD230, + 0xD2A0, 0xD3E0, 0xD4F0, 0xD5E0, 0xD6C0, 0xD7C0, 0xD9C0, 0xDC50, 0xDDE0, 0xDF70, 0xDFD0, 0xDFF0, 0xDFB0, 0xE020, 0xE070, 0xE130, + 0xE280, 0xE3B0, 0xE480, 0xE530, 0xE500, 0xE4D0, 0xE3F0, 0xE370, 0xE270, 0xE1C0, 0xE110, 0xE170, 0xE240, 0xE2F0, 0xE310, 0xE260, + 0xE0C0, 0xDF00, 0xDCB0, 0xDB60, 0xDA20, 0xD950, 0xD730, 0xD550, 0xD290, 0xCE90, 0xCBB0, 0xC980, 0xC750, 0xC4E0, 0xC210, 0xBED0, + 0xBC10, 0xBA10, 0xB8A0, 0xB780, 0xB690, 0xB520, 0xB410, 0xB240, 0xB110, 0xB100, 0xB0D0, 0xB140, 0xB180, 0xB290, 0xB320, 0xB460, + 0xB680, 0xB8C0, 0xBB70, 0xBCE0, 0xBF30, 0xC140, 0xC3D0, 0xC750, 0xCA50, 0xCD20, 0xCFA0, 0xD1A0, 0xD370, 0xD530, 0xD710, 0xD930, + 0xDB50, 0xDCA0, 0xDD30, 0xDCF0, 0xDD00, 0xDDF0, 0xDE50, 0xDDB0, 0xDC70, 0xD9E0, 0xD660, 0xD250, 0xCDB0, 0xC8D0, 0xC410, 0xBE00, + 0xB810, 0xB180, 0xAB00, 0xA410, 0x9DB0, 0x9650, 0x8FB0, 0x8AE0, 0x87D0, 0x8670, 0x85D0, 0x8590, 0x8580, 0x8580, 0x85A0, 0x85D0, + 0x8640, 0x8730, 0x8950, 0x8E80, 0x9630, 0x9E10, 0xA5B0, 0xAD40, 0xB370, 0xB8D0, 0xBE30, 0xC2E0, 0xC740, 0xCBF0, 0xD040, 0xD470, + 0xDA20, 0xDEE0, 0xE3C0, 0xE770, 0xEA30, 0xED30, 0xEFC0, 0xF250, 0xF480, 0xF720, 0xF9F0, 0xFC00, 0xFE60, 0x0060, 0x0210, 0x03B0, + 0x04E0, 0x0600, 0x0790, 0x07B0, 0x08A0, 0x08E0, 0x08D0, 0x08E0, 0x0940, 0x0950, 0x08B0, 0x0780, 0x0700, 0x05D0, 0x0590, 0x05E0, + 0x05C0, 0x0640, 0x0580, 0x0540, 0x0490, 0x0490, 0x0420, 0x0410, 0x0510, 0x0550, 0x05F0, 0x06F0, 0x0730, 0x07A0, 0x0700, 0x0630, + 0x0580, 0x03C0, 0x0350, 0x0290, 0x0160, 0x00B0, 0x0010, 0xFF60, 0xFDC0, 0xFC40, 0xFA80, 0xF880, 0xF740, 0xF5F0, 0xF450, 0xF270, + 0xF090, 0xEEF0, 0xEDE0, 0xEC60, 0xEC20, 0xEAF0, 0xE8E0, 0xE720, 0xE450, 0xE290, 0xDFE0, 0xDDC0, 0xDA50, 0xD710, 0xD330, 0xCEE0, + 0xCA80, 0xC640, 0xC1C0, 0xBCD0, 0xB7D0, 0xB240, 0xAC90, 0xA620, 0xA0B0, 0x9AE0, 0x93F0, 0x8EA0, 0x8A40, 0x87A0, 0x8610, 0x8560, + 0x8510, 0x84F0, 0x84E0, 0x84C0, 0x84C0, 0x84B0, 0x84A0, 0x84A0, 0x84A0, 0x8490, 0x8490, 0x8480, 0x8480, 0x8480, 0x8480, 0x84B0, + 0x8490, 0x8470, 0x8470, 0x8450, 0x8470, 0x8470, 0x84A0, 0x8480, 0x84B0, 0x8480, 0x8480, 0x8480, 0x8480, 0x8490, 0x8490, 0x8490, + 0x8490, 0x84A0, 0x84A0, 0x84B0, 0x84B0, 0x84C0, 0x84D0, 0x84D0, 0x84E0, 0x84F0, 0x84F0, 0x8500, 0x8510, 0x8530, 0x8530, 0x8550, + 0x8560, 0x8570, 0x8590, 0x8590, 0x8590, 0x85B0, 0x85C0, 0x85E0, 0x85F0, 0x8660, 0x86D0, 0x8750, 0x87C0, 0x8800, 0x8860, 0x88C0, + 0x88E0, 0x88F0, 0x8940, 0x8920, 0x88C0, 0x8800, 0x8740, 0x86A0, 0x8600, 0x8580, 0x8550, 0x8500, 0x84E0, 0x84F0, 0x84B0, 0x84A0, + 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x8490, 0x84B0, 0x84A0, 0x84A0, 0x84A0, 0x8490, 0x8490, 0x8480, 0x8470, + 0x8470, 0x8460, 0x8460, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8440, 0x8440, 0x8440, 0x8440, + 0x8430, 0x8430, 0x8420, 0x8420, 0x8410, 0x8410, 0x8400, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83C0, 0x83E0, 0x83D0, 0x83D0, 0x83D0, + 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83C0, 0x83B0, 0x83B0, 0x83C0, 0x83A0, 0x83C0, 0x83C0, 0x83F0, + 0x83F0, 0x83D0, 0x83D0, 0x83D0, 0x83E0, 0x83E0, 0x83E0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8400, 0x8400, 0x8410, + 0x8410, 0x8410, 0x8420, 0x8420, 0x8420, 0x8430, 0x8430, 0x8430, 0x8430, 0x8440, 0x8430, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, + 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, + 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8460, 0x8460, 0x8460, 0x8460, 0x8470, 0x8470, 0x8480, 0x8490, 0x8490, 0x8490, + 0x84A0, 0x84A0, 0x84A0, 0x84B0, 0x84C0, 0x84C0, 0x84E0, 0x84F0, 0x8510, 0x8540, 0x85B0, 0x8680, 0x88E0, 0x8F80, 0x9A70, 0xA590, + 0xB2D0, 0xC030, 0xCE40, 0xDD10, 0xEAF0, 0xF910, 0x0560, 0x1130, 0x1B90, 0x2650, 0x2F70, 0x3730, 0x3E60, 0x4460, 0x49D0, 0x4EF0, + 0x5380, 0x5800, 0x5CB0, 0x6030, 0x6400, 0x6740, 0x6AC0, 0x6EB0, 0x7280, 0x7710, 0x7B10, 0x7E40, 0x7EF0, 0x7F10, 0x7F00, 0x7EE0, + 0x7F50, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F60, 0x7F00, 0x7EF0, 0x7F10, 0x7F00, 0x7F60, 0x7ED0, 0x7EB0, 0x7EE0, 0x7EF0, 0x7F70, + 0x7F00, 0x7EA0, 0x7F10, 0x7F10, 0x7F20, 0x7EE0, 0x7E90, 0x7F00, 0x7EE0, 0x7EF0, 0x7F10, 0x7EB0, 0x7F20, 0x7F00, 0x7F10, 0x7F20, + 0x7EC0, 0x7F10, 0x7F10, 0x7F00, 0x7F20, 0x7F10, 0x7F60, 0x7F00, 0x7F10, 0x7F30, 0x7F20, 0x7F80, 0x7F10, 0x7F10, 0x7F20, 0x7EE0, + 0x7F80, 0x7EF0, 0x7F20, 0x7ED0, 0x7F10, 0x7F70, 0x7F20, 0x7ED0, 0x7EF0, 0x7EE0, 0x7F50, 0x7F10, 0x7EB0, 0x7EE0, 0x7ED0, 0x7F30, + 0x7F20, 0x7EC0, 0x7ED0, 0x7F00, 0x7F30, 0x7F10, 0x7E90, 0x7EB0, 0x7EA0, 0x7EF0, 0x7F10, 0x7EB0, 0x7ED0, 0x7F10, 0x7F20, 0x7F20, + 0x7EC0, 0x7F10, 0x7F10, 0x7F00, 0x7EF0, 0x7F00, 0x7F20, 0x7F00, 0x7F10, 0x7F10, 0x7F20, 0x7F60, 0x7F10, 0x7F10, 0x7F20, 0x7F10, + 0x7F30, 0x7EF0, 0x7F00, 0x7F20, 0x7EF0, 0x7F10, 0x7F20, 0x7F00, 0x7F10, 0x7F10, 0x7F10, 0x7F00, 0x7EF0, 0x7F10, 0x7F20, 0x7F00, + 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F00, 0x7F10, 0x7F20, 0x7F10, 0x7F10, 0x7EF0, 0x7F20, 0x7F10, 0x7F30, 0x7F30, 0x7F00, 0x7F30, + 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7C80, 0x70C0, 0x65B0, 0x5AD0, 0x5000, 0x4640, 0x3E30, 0x3790, + 0x3330, 0x2FB0, 0x2D80, 0x2B70, 0x2980, 0x2A40, 0x2D00, 0x3230, 0x39A0, 0x43C0, 0x5030, 0x5BE0, 0x66C0, 0x7150, 0x7A30, 0x7EF0, + 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, + 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F30, + 0x7F30, 0x7F20, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F10, + 0x7F20, 0x7F20, 0x7F40, 0x7F30, 0x7F10, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F00, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7EF0, 0x7F30, + 0x7F20, 0x7F20, 0x7F30, 0x7F00, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F20, 0x7F20, 0x7F40, 0x7F30, 0x7F20, + 0x7F20, 0x7F20, 0x7F40, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F40, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F20, 0x7F20, + 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F20, 0x7EF0, 0x7F30, 0x7F20, + 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F90, 0x7F10, 0x7EE0, 0x7EF0, 0x7EF0, 0x7F30, 0x7F20, 0x7E80, + 0x7F10, 0x7F00, 0x7F20, 0x7F00, 0x7E90, 0x7EB0, 0x7EE0, 0x7EF0, 0x7F10, 0x7EA0, 0x7EC0, 0x7EF0, 0x7F10, 0x7F20, 0x7EC0, 0x7F10, + 0x7F00, 0x7F00, 0x7EF0, 0x7E90, 0x7F00, 0x7EE0, 0x7F10, 0x7F10, 0x7F00, 0x7F40, 0x7EF0, 0x7F10, 0x7F00, 0x7F10, 0x7F30, 0x7EF0, + 0x7F20, 0x7EF0, 0x7F10, 0x7F20, 0x7F00, 0x7F20, 0x7F30, 0x7F00, 0x7F30, 0x7EF0, 0x7EE0, 0x7EF0, 0x7EF0, 0x7F30, 0x7EE0, 0x7ED0, + 0x7EF0, 0x7F20, 0x7F60, 0x7ED0, 0x7E90, 0x7F00, 0x7EE0, 0x7F30, 0x7EE0, 0x7E70, 0x7EF0, 0x7F10, 0x7F20, 0x7F20, 0x7EC0, 0x7F10, + 0x7F00, 0x7F10, 0x7F10, 0x7EB0, 0x7F20, 0x7EF0, 0x7F10, 0x7F30, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F40, 0x7F10, 0x7F70, 0x7EF0, + 0x7F10, 0x7EF0, 0x7EF0, 0x7F70, 0x7EF0, 0x7F20, 0x7F20, 0x7F00, 0x7F90, 0x7F10, 0x7EE0, 0x7EF0, 0x7EF0, 0x7F60, 0x7EF0, 0x7ED0, + 0x7EF0, 0x7F00, 0x7F40, 0x7F10, 0x7EE0, 0x7EE0, 0x7ED0, 0x7F10, 0x7F00, 0x7E70, 0x7ED0, 0x7F10, 0x7F20, 0x7EF0, 0x7E90, 0x7F00, + 0x7F20, 0x7F10, 0x7F10, 0x7EA0, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7EC0, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F30, 0x7F40, + 0x7F10, 0x7F10, 0x7EE0, 0x7F50, 0x7EF0, 0x7F20, 0x7F20, 0x7F00, 0x7F70, 0x7F00, 0x7F20, 0x7F10, 0x7F10, 0x7F60, 0x7EE0, 0x7EC0, + 0x7F10, 0x7EF0, 0x7F70, 0x7EF0, 0x7EC0, 0x7F00, 0x7ED0, 0x7F10, 0x7EE0, 0x7EA0, 0x7EF0, 0x7F00, 0x7F20, 0x7ED0, 0x7EB0, 0x7F20, + 0x7F20, 0x7F10, 0x7F10, 0x7EC0, 0x7F10, 0x7F10, 0x7F00, 0x7F20, 0x7EC0, 0x7F30, 0x7F10, 0x7F20, 0x7F10, 0x7F00, 0x7F40, 0x7F10, + 0x7F10, 0x7F20, 0x7EE0, 0x7F70, 0x7EF0, 0x7F20, 0x7EF0, 0x7EF0, 0x7F90, 0x7F20, 0x7F10, 0x7EF0, 0x7EF0, 0x7F60, 0x7F10, 0x7EF0, + 0x7EF0, 0x7F20, 0x7F10, 0x7F10, 0x7F60, 0x7EE0, 0x7EF0, 0x7F10, 0x7F00, 0x7F60, 0x7F10, 0x7F20, 0x7F00, 0x7EF0, 0x7F50, 0x7F00, + 0x7EC0, 0x7ED0, 0x7EF0, 0x7F30, 0x7EF0, 0x7ED0, 0x7F00, 0x7EE0, 0x7F30, 0x7F10, 0x7E90, 0x7EC0, 0x7EF0, 0x7F30, 0x7EE0, 0x7E90, + 0x7ED0, 0x7F20, 0x7F20, 0x7F10, 0x7EB0, 0x7F00, 0x7F10, 0x7F10, 0x7F10, 0x7EC0, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F20, + 0x7F20, 0x7F40, 0x7F10, 0x7F00, 0x7F60, 0x7EF0, 0x7F10, 0x7F10, 0x7EF0, 0x7F50, 0x7F10, 0x7F20, 0x75F0, 0x6B10, 0x60B0, 0x5570, + 0x4AC0, 0x3EF0, 0x33B0, 0x29C0, 0x2050, 0x1890, 0x1230, 0x0B40, 0x03D0, 0xFC70, 0xF320, 0xEB50, 0xE4B0, 0xDF20, 0xDA40, 0xD4D0, + 0xCFB0, 0xC940, 0xC240, 0xB9A0, 0xB050, 0xA640, 0x9B60, 0x90F0, 0x89C0, 0x8690, 0x8560, 0x8510, 0x84E0, 0x84D0, 0x84C0, 0x84C0, + 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84D0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, + 0x84B0, 0x84B0, 0x84C0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84F0, 0x84D0, 0x84C0, 0x84C0, 0x8460, 0x84D0, 0x84E0, + 0x8500, 0x8510, 0x8530, 0x8580, 0x8600, 0x86F0, 0x8850, 0x8A40, 0x8CC0, 0x9010, 0x9360, 0x9730, 0x9B10, 0xA020, 0xA4A0, 0xA7D0, + 0xAA70, 0xAC90, 0xAFD0, 0xB350, 0xB710, 0xBB50, 0xBEA0, 0xC240, 0xC4A0, 0xC7C0, 0xCA60, 0xCD30, 0xD0D0, 0xD4C0, 0xD7F0, 0xDAD0, + 0xDD30, 0xDFA0, 0xE250, 0xE4F0, 0xE860, 0xEAE0, 0xECF0, 0xEF70, 0xF130, 0xF3A0, 0xF450, 0xF5B0, 0xF560, 0xF3F0, 0xF310, 0xF170, + 0xF120, 0xF190, 0xF1B0, 0xF1E0, 0xF1C0, 0xF0C0, 0xEEA0, 0xEC10, 0xE950, 0xE680, 0xE360, 0xDFA0, 0xDA40, 0xD500, 0xCF20, 0xC8C0, + 0xC250, 0xBB70, 0xB440, 0xAC40, 0xA3E0, 0x9C10, 0x94D0, 0x8ED0, 0x89D0, 0x8710, 0x85E0, 0x8500, 0x84F0, 0x84E0, 0x84E0, 0x84D0, + 0x84C0, 0x84C0, 0x84C0, 0x84D0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84D0, 0x84D0, 0x84D0, 0x84E0, 0x84E0, 0x84E0, + 0x84E0, 0x84F0, 0x84F0, 0x8510, 0x8500, 0x8510, 0x8520, 0x8570, 0x8550, 0x8570, 0x8590, 0x85B0, 0x85E0, 0x8600, 0x8650, 0x86C0, + 0x8730, 0x87C0, 0x8850, 0x88A0, 0x88F0, 0x89C0, 0x8A70, 0x8B80, 0x8C20, 0x8D00, 0x8DC0, 0x8E60, 0x8F80, 0x9080, 0x9240, 0x9400, + 0x9530, 0x96C0, 0x97A0, 0x9980, 0x9BA0, 0x9ED0, 0xA240, 0xA600, 0xA920, 0xACC0, 0xAFE0, 0xB370, 0xB650, 0xB8C0, 0xBA90, 0xBB80, + 0xBBD0, 0xBBD0, 0xBB80, 0xBBE0, 0xBB10, 0xBA40, 0xB960, 0xB8B0, 0xB710, 0xB5D0, 0xB400, 0xB1C0, 0xAEF0, 0xABC0, 0xA930, 0xA7A0, + 0xA6E0, 0xA610, 0xA440, 0xA230, 0xA080, 0x9EC0, 0x9CE0, 0x9C00, 0x9AB0, 0x9A30, 0x9A40, 0x9A90, 0x9A80, 0x9A50, 0x9A60, 0x9A50, + 0x9AE0, 0x9C10, 0x9D60, 0x9E30, 0x9EF0, 0x9F50, 0x9FA0, 0x9FF0, 0xA000, 0xA030, 0xA140, 0xA210, 0xA260, 0xA260, 0xA250, 0xA1F0, + 0xA190, 0xA1B0, 0xA260, 0xA290, 0xA310, 0xA2D0, 0xA2F0, 0xA200, 0xA1A0, 0xA210, 0xA1B0, 0xA190, 0xA110, 0xA050, 0x9FE0, 0x9FF0, + 0xA0C0, 0xA200, 0xA310, 0xA330, 0xA340, 0xA330, 0xA370, 0xA500, 0xA730, 0xA930, 0xABB0, 0xADF0, 0xB030, 0xB2D0, 0xB560, 0xB7E0, + 0xBA50, 0xBC50, 0xBDC0, 0xBFE0, 0xC310, 0xC5E0, 0xC900, 0xCC50, 0xCF60, 0xD1D0, 0xD4E0, 0xD780, 0xDAA0, 0xDE10, 0xE0E0, 0xE3F0, + 0xE630, 0xE910, 0xEC00, 0xEF10, 0xF270, 0xF580, 0xF800, 0xFA70, 0xFB90, 0xFD30, 0xFF20, 0x01E0, 0x04F0, 0x07F0, 0x09C0, 0x0B50, + 0x0B90, 0x0C50, 0x0DA0, 0x0F90, 0x11D0, 0x1400, 0x1610, 0x17B0, 0x18F0, 0x1A60, 0x1BC0, 0x1D00, 0x1EA0, 0x2000, 0x2120, 0x2200, + 0x22D0, 0x2360, 0x23D0, 0x22B0, 0x2120, 0x1FD0, 0x1DF0, 0x1C80, 0x1AA0, 0x18D0, 0x16D0, 0x1430, 0x1170, 0x0DF0, 0x0AB0, 0x0860, + 0x0680, 0x0500, 0x0380, 0x01B0, 0x0060, 0xFF40, 0xFF70, 0x00A0, 0x02A0, 0x0600, 0x0AD0, 0x1100, 0x1820, 0x20D0, 0x2A10, 0x34C0, + 0x3FF0, 0x4BD0, 0x5830, 0x64A0, 0x7140, 0x7C80, 0x7F00, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7EE0, 0x7F10, 0x7F30, 0x7F20, 0x7F20, + 0x7F10, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F70, 0x7EF0, 0x7EB0, 0x7F20, 0x7F40, 0x7F40, + 0x7ED0, 0x7E70, 0x7EF0, 0x7F10, 0x7EF0, 0x7E70, 0x7E60, 0x7EF0, 0x7EF0, 0x7F20, 0x7F20, 0x7EC0, 0x7F00, 0x7F10, 0x7F10, 0x7BF0, + 0x6A00, 0x5660, 0x3CF0, 0x1E60, 0xFDE0, 0xDB20, 0xC030, 0xACE0, 0xA1C0, 0xA010, 0xA950, 0xBD40, 0xDC30, 0x0280, 0x32B0, 0x5F20, + 0x7ED0, 0x7F10, 0x7F20, 0x7F00, 0x7EF0, 0x7F30, 0x7EF0, 0x7F10, 0x7F10, 0x7EE0, 0x7F40, 0x7EF0, 0x7EB0, 0x7EF0, 0x7EE0, 0x7F10, + 0x7F00, 0x7EC0, 0x7ED0, 0x7EB0, 0x7F10, 0x7EF0, 0x7E90, 0x7EF0, 0x7F20, 0x7E50, 0x7A90, 0x7900, 0x79A0, 0x7B90, 0x7C90, 0x7DA0, + 0x7E00, 0x7EE0, 0x7F00, 0x7F00, 0x7EF0, 0x7F00, 0x7F30, 0x7F20, 0x7F40, 0x7F10, 0x7EF0, 0x7F40, 0x7F10, 0x7F20, 0x7F00, 0x7EF0, + 0x7F50, 0x7F00, 0x7F20, 0x74D0, 0x6630, 0x5CA0, 0x5540, 0x4F50, 0x4970, 0x41E0, 0x3950, 0x2E50, 0x2180, 0x12F0, 0x0550, 0xF8E0, + 0xF020, 0xEAC0, 0xE880, 0xE6D0, 0xE3A0, 0xDE80, 0xD430, 0xC620, 0xB530, 0xA1C0, 0x8E40, 0x8600, 0x84E0, 0x84B0, 0x8480, 0x8470, + 0x8450, 0x8440, 0x8430, 0x8420, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8400, 0x83F0, 0x83F0, 0x83E0, 0x8410, + 0x83D0, 0x83D0, 0x83D0, 0x83E0, 0x83F0, 0x8400, 0x8430, 0x8400, 0x8400, 0x8400, 0x8400, 0x8410, 0x8410, 0x8410, 0x8420, 0x8420, + 0x8420, 0x8430, 0x8430, 0x8430, 0x8430, 0x8440, 0x8440, 0x8440, 0x8450, 0x8450, 0x8450, 0x8480, 0x8460, 0x8470, 0x8480, 0x8490, + 0x8490, 0x84B0, 0x84D0, 0x84E0, 0x8520, 0x85C0, 0x8800, 0x8E80, 0x98F0, 0xA360, 0xAC50, 0xB560, 0xBD90, 0xC520, 0xCBB0, 0xCFE0, + 0xD3C0, 0xD570, 0xD5D0, 0xD670, 0xD6A0, 0xD650, 0xD550, 0xD320, 0xD060, 0xCCD0, 0xC9E0, 0xC680, 0xC2F0, 0xBF70, 0xBA80, 0xB400, + 0xAD50, 0xA690, 0xA050, 0x88A0, 0x8670, 0x8590, 0x8530, 0x8510, 0x8500, 0x8510, 0x84F0, 0x84F0, 0x84E0, 0x84F0, 0x8510, 0x8530, + 0x8560, 0x85B0, 0x8640, 0x8750, 0x88F0, 0x8BA0, 0x9020, 0x9490, 0x9740, 0x9920, 0x99E0, 0x9B50, 0x9C60, 0x9E30, 0xA040, 0xA1E0, + 0xA340, 0xA3B0, 0xA3A0, 0xA3B0, 0xA4F0, 0xA620, 0xA790, 0xA870, 0xAA50, 0xAC90, 0xB120, 0xB720, 0xBEF0, 0xC790, 0xD030, 0xDAC0, + 0xE540, 0xF220, 0xFE50, 0x0A30, 0x1590, 0x1E70, 0x2510, 0x2A80, 0x2E70, 0x3130, 0x31D0, 0x2FB0, 0x2B60, 0x2470, 0x1CF0, 0x14E0, + 0x0C40, 0x05A0, 0xFEF0, 0xF860, 0xF0E0, 0xE870, 0xE050, 0xD7E0, 0xCF90, 0xC7B0, 0xBF90, 0xB770, 0xAEF0, 0xA800, 0xA1B0, 0x9C00, + 0x9720, 0x92B0, 0x8E60, 0x8AB0, 0x8800, 0x8680, 0x85C0, 0x85A0, 0x8550, 0x8540, 0x8550, 0x8590, 0x85B0, 0x8620, 0x8730, 0x8930, + 0x8CA0, 0x90C0, 0x9610, 0x9BD0, 0xA290, 0xAA90, 0xB2D0, 0xBC70, 0xC500, 0xCE90, 0xD810, 0xE260, 0xEC00, 0xF5F0, 0xFFD0, 0x0900, + 0x12D0, 0x1C10, 0x24D0, 0x2E60, 0x37B0, 0x4070, 0x4970, 0x5160, 0x59D0, 0x6230, 0x68E0, 0x6F50, 0x7430, 0x79A0, 0x7D60, 0x7EF0, + 0x7F10, 0x7EA0, 0x7F10, 0x7F10, 0x7F10, 0x7F00, 0x7EC0, 0x7F30, 0x7F00, 0x7F20, 0x7F40, 0x7F00, 0x7F40, 0x7F10, 0x7F10, 0x7F20, + 0x7F00, 0x7F80, 0x7F10, 0x7F20, 0x7EF0, 0x7D30, 0x78B0, 0x7360, 0x6CC0, 0x64D0, 0x5C00, 0x50E0, 0x4520, 0x3830, 0x2D40, 0x22A0, + 0x1950, 0x1100, 0x09E0, 0x0410, 0xFEB0, 0xF8F0, 0xF250, 0xE970, 0xDF70, 0xD250, 0xC330, 0xB1D0, 0x9E20, 0x8B50, 0x8580, 0x84E0, + 0x84C0, 0x84A0, 0x8490, 0x8490, 0x8480, 0x8470, 0x8470, 0x8460, 0x8460, 0x8450, 0x8450, 0x8460, 0x8470, 0x8470, 0x8480, 0x8490, + 0x84A0, 0x84B0, 0x84C0, 0x84D0, 0x84F0, 0x8530, 0x8650, 0x8DA0, 0xA210, 0xB6B0, 0xCBF0, 0xDF70, 0xF270, 0x0360, 0x13F0, 0x22D0, + 0x3130, 0x3E60, 0x4960, 0x5470, 0x5C70, 0x62F0, 0x6850, 0x6B10, 0x6DB0, 0x6F10, 0x6F50, 0x6F90, 0x6EC0, 0x6E80, 0x6DA0, 0x6C60, + 0x6BE0, 0x6AD0, 0x6990, 0x6720, 0x6320, 0x5D70, 0x55C0, 0x4E10, 0x4600, 0x3EB0, 0x3920, 0x3540, 0x33D0, 0x33B0, 0x3400, 0x35F0, + 0x3860, 0x3CB0, 0x4240, 0x4890, 0x5030, 0x5700, 0x5D60, 0x6410, 0x68C0, 0x6D20, 0x6F90, 0x70B0, 0x7160, 0x70C0, 0x6F50, 0x6DE0, + 0x6AF0, 0x6880, 0x6530, 0x6260, 0x5FE0, 0x5ED0, 0x6210, 0x6800, 0x7370, 0x7E70, 0x7F30, 0x7EF0, 0x7E90, 0x7ED0, 0x7F00, 0x7F00, + 0x7F10, 0x7E90, 0x7ED0, 0x7EF0, 0x7F10, 0x7F00, 0x7EC0, 0x7F10, 0x7F20, 0x7F20, 0x1390, 0xF4A0, 0xD8C0, 0xC0E0, 0xACE0, 0x9B10, + 0x8CE0, 0x86C0, 0x8530, 0x84F0, 0x84D0, 0x84C0, 0x84B0, 0x84A0, 0x8490, 0x8480, 0x8480, 0x8460, 0x8450, 0x8440, 0x8430, 0x8430, + 0x8420, 0x8430, 0x8400, 0x8400, 0x8400, 0x83F0, 0x83E0, 0x83E0, 0x83D0, 0x83F0, 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8410, 0x8410, + 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8410, 0x8400, 0x8400, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, + 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8400, 0x8420, 0x8410, 0x8410, 0x8410, 0x8400, 0x8400, + 0x8400, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x8400, 0x8400, + 0x8400, 0x8410, 0x8410, 0x8420, 0x8420, 0x8420, 0x8420, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8440, 0x8440, 0x8470, 0x8450, + 0x8450, 0x8450, 0x8460, 0x8470, 0x8470, 0x84B0, 0x84A0, 0x84C0, 0x84F0, 0x8580, 0x88C0, 0x9930, 0xAA80, 0xB8D0, 0xC600, 0xD160, + 0xDA50, 0xE3B0, 0xEC10, 0xF470, 0xFD80, 0x0600, 0x0EB0, 0x1890, 0x2130, 0x2930, 0x30A0, 0x3620, 0x3AF0, 0x3E30, 0x4100, 0x4360, + 0x4630, 0x4900, 0x4A60, 0x4A70, 0x49F0, 0x4870, 0x4640, 0x4390, 0x4030, 0x3CE0, 0x3890, 0x33F0, 0x2F50, 0x2AE0, 0x26E0, 0x2290, + 0x1E70, 0x1A50, 0x14D0, 0x0F50, 0x0960, 0x03F0, 0xFE10, 0xF890, 0xF2E0, 0xECE0, 0xE670, 0xDEE0, 0xD780, 0xCFF0, 0xC7D0, 0xC070, + 0xBA50, 0xB580, 0xB1F0, 0xB0D0, 0xB0F0, 0xB290, 0xB5C0, 0xB9E0, 0xBDF0, 0xC1D0, 0xC5C0, 0xCA60, 0xCFA0, 0xD650, 0xDC60, 0xE2E0, + 0xE950, 0xEE50, 0xF370, 0xF7C0, 0xFB40, 0xFE10, 0xFFF0, 0x0250, 0x0540, 0x0710, 0x08A0, 0x0A00, 0x0AD0, 0x0A70, 0x0960, 0x07B0, + 0x0630, 0x0620, 0x05C0, 0x0610, 0x06D0, 0x0720, 0x0940, 0x0C50, 0x11A0, 0x17C0, 0x1F90, 0x2870, 0x3240, 0x3C90, 0x4780, 0x5170, + 0x5BA0, 0x64F0, 0x6BB0, 0x70A0, 0x73C0, 0x75D0, 0x77F0, 0x7A20, 0x7CA0, 0x7E40, 0x7F00, 0x7EF0, 0x7EF0, 0x7F00, 0x7EA0, 0x7F20, + 0x7F10, 0x7F10, 0x7F00, 0x7E90, 0x7F10, 0x7EF0, 0x7EF0, 0x7F10, 0x7F00, 0x7F60, 0x7F00, 0x7F10, 0x7F20, 0x7F00, 0x7F80, 0x7F10, + 0x7F20, 0x7EF0, 0x7EF0, 0x7F90, 0x7F20, 0x7F10, 0x7F10, 0x7F00, 0x7F80, 0x7F10, 0x7EF0, 0x7EE0, 0x7EE0, 0x7F50, 0x7F00, 0x7EE0, + 0x7ED0, 0x7EF0, 0x7F60, 0x7F20, 0x7E90, 0x7EB0, 0x7EE0, 0x7F30, 0x7F10, 0x7E70, 0x7EC0, 0x7EF0, 0x7F10, 0x7F20, 0x7EC0, 0x7F10, + 0x7F00, 0x7F00, 0x7F10, 0x7EB0, 0x7F00, 0x7F00, 0x7EF0, 0x7F10, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F50, 0x7F10, + 0x7F20, 0x7EF0, 0x7F00, 0x7F40, 0x7EF0, 0x7F10, 0x7F10, 0x7F20, 0x7F80, 0x7EF0, 0x7EE0, 0x7F10, 0x7F10, 0x7F70, 0x7EE0, 0x7ED0, + 0x7F10, 0x7F10, 0x7F60, 0x7EE0, 0x7EE0, 0x7F00, 0x7F10, 0x7F30, 0x7EB0, 0x7E70, 0x7EF0, 0x7EF0, 0x7F30, 0x7ED0, 0x7E90, 0x7F10, + 0x7F20, 0x7F10, 0x7F10, 0x7EB0, 0x7F20, 0x7EF0, 0x6610, 0x45A0, 0x2240, 0xFEF0, 0xDFA0, 0xC6D0, 0xB8F0, 0xB570, 0xBD60, 0xCD60, + 0xDF10, 0xEEF0, 0xF900, 0xFD00, 0xFBF0, 0xF830, 0xF470, 0xF300, 0xF530, 0xFAB0, 0x0180, 0x0940, 0x0F10, 0x1270, 0x1400, 0x1290, + 0x10F0, 0x0EC0, 0x0D50, 0x0C90, 0x0CD0, 0x0E40, 0x0E90, 0x0DD0, 0x0CB0, 0x0B00, 0x0980, 0x08E0, 0x0920, 0x0A40, 0x0C30, 0x1060, + 0x1520, 0x1BC0, 0x24B0, 0x3000, 0x3B40, 0x6860, 0x70C0, 0x7760, 0x7C40, 0x7ED0, 0x7E90, 0x7EB0, 0x7EE0, 0x7EF0, 0x7F10, 0x7EA0, + 0x7ED0, 0x7F00, 0x7F20, 0x7F20, 0x7EC0, 0x7F10, 0x7F00, 0x7F00, 0x7EF0, 0x7EA0, 0x7F00, 0x7F10, 0x7F10, 0x7F20, 0x7F00, 0x7F50, + 0x7F10, 0x7F20, 0x7F10, 0x7F10, 0x7F30, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F60, 0x7F00, 0x7F20, 0x7F20, 0x7F10, 0x7F90, 0x7EF0, + 0x7EE0, 0x7EF0, 0x7EF0, 0x7F70, 0x7EE0, 0x7ED0, 0x7F10, 0x7F20, 0x7F50, 0x7ED0, 0x7EB0, 0x7F00, 0x7EF0, 0x7EB0, 0x7CE0, 0x79C0, + 0x7780, 0x7590, 0x7370, 0x72E0, 0x7100, 0x6F10, 0x6C20, 0x6910, 0x6730, 0x6460, 0x61C0, 0x5E80, 0x5AF0, 0x5860, 0x55A0, 0x51D0, + 0x4E60, 0x49A0, 0x4510, 0x3F10, 0x38B0, 0x31A0, 0x29F0, 0x22F0, 0x1B20, 0x1380, 0x0C90, 0x0540, 0xFEE0, 0xF850, 0xF1B0, 0xEB00, + 0xE4E0, 0xDEF0, 0xD930, 0xD340, 0xCCC0, 0xC5D0, 0xBF30, 0xB740, 0xAEF0, 0xA670, 0x9CD0, 0x9460, 0x8D20, 0x8850, 0x8620, 0x8550, + 0x8500, 0x84D0, 0x84C0, 0x84B0, 0x84A0, 0x8490, 0x8490, 0x8480, 0x8480, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, + 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8480, 0x8480, 0x8490, 0x8490, 0x84A0, 0x84B0, 0x84C0, 0x84F0, 0x8540, 0x8660, 0x8B40, + 0x98D0, 0xA700, 0xB570, 0xC2F0, 0xCFC0, 0xDC10, 0xE730, 0xF1F0, 0xFAF0, 0x0250, 0x0740, 0x0A40, 0x0B10, 0x0870, 0x0400, 0xFCC0, + 0xF260, 0xE690, 0xD980, 0xCC80, 0xBFD0, 0xB5E0, 0xAF70, 0xAC90, 0xAEE0, 0xB5D0, 0xBFF0, 0xCC60, 0xDB00, 0xEBA0, 0xFC80, 0x0DF0, + 0x2000, 0x30D0, 0x4280, 0x51E0, 0x6140, 0x6EF0, 0x7AB0, 0x7EF0, 0x7EF0, 0x7F90, 0x7F10, 0x7F10, 0x7F10, 0x7F10, 0x7F70, 0x7F10, + 0x7F10, 0x7EF0, 0x7EE0, 0x7F60, 0x7F00, 0x7EE0, 0x7EE0, 0x7EF0, 0x7F70, 0x7F20, 0x7EC0, 0x7ED0, 0x7EB0, 0x7F50, 0x7F10, 0x7EB0, + 0x7EB0, 0x7EE0, 0x7F10, 0x7F10, 0x7EA0, 0x7F00, 0x7F10, 0x7F20, 0x7F20, 0x7EC0, 0x7F10, 0x7F00, 0x7F00, 0x7EF0, 0x7F00, 0x7F00, + 0x7F10, 0x7F10, 0x7F20, 0x7F00, 0x7F50, 0x7F10, 0x7F20, 0x7EE0, 0x7F10, 0x7F60, 0x7EF0, 0x7F10, 0x7F10, 0x7F20, 0x7F60, 0x7EF0, + 0x7EF0, 0x7F00, 0x7F10, 0x7F70, 0x7EE0, 0x7EE0, 0x7EF0, 0x7F10, 0x7F60, 0x7EE0, 0x7EF0, 0x7F00, 0x7F00, 0x7F50, 0x7ED0, 0x7EA0, + 0x7EE0, 0x7EF0, 0x7F30, 0x7EE0, 0x7E90, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7EB0, 0x7F20, 0x7F00, 0x7F10, 0x7F00, 0x7EC0, 0x7F40, + 0x7F10, 0x7F20, 0x7F40, 0x7F10, 0x7F80, 0x7F20, 0x7F10, 0x7F10, 0x7F00, 0x7F60, 0x7EF0, 0x7F10, 0x7F00, 0x7F10, 0x7F10, 0x7F00, + 0x7EF0, 0x7EF0, 0x7F10, 0x7F20, 0x7F40, 0x7F10, 0x7F20, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F00, 0x7F20, 0x7F10, 0x7F10, 0x7EF0, + 0x7590, 0x6980, 0x5C20, 0x4D80, 0x3DC0, 0x2DD0, 0x1DA0, 0x0BF0, 0xFCB0, 0xEDA0, 0xDE80, 0xD010, 0xC190, 0xB440, 0xA720, 0x9AF0, + 0x8F40, 0x88D0, 0x8630, 0x8530, 0x8500, 0x84E0, 0x84D0, 0x84C0, 0x84B0, 0x84B0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x8490, 0x8490, + 0x8490, 0x8490, 0x8490, 0x8490, 0x84A0, 0x84A0, 0x84A0, 0x84B0, 0x84C0, 0x84C0, 0x84D0, 0x84F0, 0x8500, 0x8520, 0x8560, 0x85D0, + 0x8670, 0x8770, 0x8900, 0x8B20, 0x8E20, 0x90C0, 0x9330, 0x94C0, 0x94E0, 0x92B0, 0x91E0, 0x90D0, 0x8FF0, 0x8E10, 0x8BD0, 0x8A20, + 0x8890, 0x8750, 0x8680, 0x85D0, 0x8590, 0x8550, 0x8530, 0x8510, 0x8500, 0x84F0, 0x84E0, 0x84F0, 0x84E0, 0x8510, 0x84E0, 0x84F0, + 0x8520, 0x8520, 0x8540, 0x8570, 0x85B0, 0x8610, 0x86C0, 0x8780, 0x8870, 0x8930, 0x8990, 0x8970, 0x8890, 0x87B0, 0x8720, 0x86E0, + 0x86D0, 0x8720, 0x87F0, 0x8940, 0x8BB0, 0x8F70, 0x9520, 0x9BA0, 0xA230, 0xA950, 0xB130, 0xB840, 0xBF40, 0xC630, 0xCDC0, 0xD540, + 0xDDC0, 0xE690, 0xF000, 0xFB50, 0x0670, 0x1290, 0x1F50, 0x2C30, 0x3980, 0x4700, 0x5460, 0x6200, 0x6F70, 0x7A70, 0x7F10, 0x7F30, + 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, + 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7FA0, 0x7F10, 0x7F20, 0x7F30, + 0x7EF0, 0x7F50, 0x7F20, 0x7F00, 0x7F00, 0x7F10, 0x7F30, 0x7EE0, 0x7EC0, 0x7EB0, 0x7EE0, 0x7EF0, 0x7F10, 0x7EF0, 0x7EE0, 0x7F00, + 0x7F10, 0x7F00, 0x7EE0, 0x7ED0, 0x7EB0, 0x7F20, 0x7F40, 0x7E80, 0x7EF0, 0x7F00, 0x7F00, 0x7F30, 0x7EA0, 0x7EC0, 0x7ED0, 0x7F10, + 0x7EF0, 0x7E80, 0x7EF0, 0x7F10, 0x7EE0, 0x7EF0, 0x7EB0, 0x7F00, 0x7F20, 0x7F10, 0x7F10, 0x7EF0, 0x7F40, 0x7F10, 0x7F00, 0x7F20, + 0x7EF0, 0x7F50, 0x7F20, 0x7F20, 0x7F40, 0x7F10, 0x7F60, 0x7F10, 0x7F10, 0x7EF0, 0x7EE0, 0x7F60, 0x7EF0, 0x7F00, 0x7F00, 0x7B90, + 0x62B0, 0x59F0, 0x5C90, 0x64D0, 0x6C30, 0x6EF0, 0x6CC0, 0x6580, 0x5E20, 0x5B70, 0x5FB0, 0x6BB0, 0x7A70, 0x7F00, 0x7F10, 0x7F10, + 0x7F00, 0x7E90, 0x7F10, 0x7F00, 0x7EF0, 0x7F10, 0x7F00, 0x7F20, 0x7F00, 0x7F10, 0x7F20, 0x7F00, 0x7F30, 0x7F10, 0x7F00, 0x7F20, + 0x7EF0, 0x7F80, 0x7F00, 0x7EF0, 0x7F30, 0x7F20, 0x7F80, 0x7F10, 0x7F10, 0x7EF0, 0x7EE0, 0x7F70, 0x7EF0, 0x7F00, 0x7EF0, 0x7EF0, + 0x7F60, 0x7F00, 0x7E10, 0x7D10, 0x7BB0, 0x7B50, 0x7B10, 0x79B0, 0x77A0, 0x71F0, 0x6530, 0x5240, 0x36A0, 0x14D0, 0xED70, 0xC8C0, + 0xA790, 0x8D80, 0x85F0, 0x8510, 0x84F0, 0x84C0, 0x84B0, 0x84B0, 0x84A0, 0x8490, 0x8490, 0x8490, 0x8480, 0x8480, 0x8480, 0x8480, + 0x8480, 0x8480, 0x8490, 0x8490, 0x8490, 0x8490, 0x84A0, 0x84A0, 0x84A0, 0x84E0, 0x84A0, 0x84A0, 0x84A0, 0x84B0, 0x84B0, 0x84B0, + 0x84B0, 0x84D0, 0x84B0, 0x84B0, 0x84A0, 0x84B0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x8480, 0x8490, 0x8490, 0x8490, 0x8490, + 0x8490, 0x84A0, 0x84A0, 0x84B0, 0x84B0, 0x84C0, 0x84D0, 0x84F0, 0x8510, 0x8550, 0x85F0, 0x8720, 0x89C0, 0x8FA0, 0x9730, 0x9F70, + 0xA670, 0xACF0, 0xB380, 0xB9C0, 0xC0B0, 0xC710, 0xCE90, 0xE950, 0xF110, 0xF940, 0x01A0, 0x0B00, 0x13C0, 0x1CD0, 0x2630, 0x2EE0, + 0x38E0, 0x4190, 0x48B0, 0x4ED0, 0x52B0, 0x5570, 0x5720, 0x56F0, 0x5710, 0x55E0, 0x54E0, 0x5200, 0x4F00, 0x4C00, 0x4740, 0x41F0, + 0x3B30, 0x33C0, 0x2BB0, 0x22D0, 0x1A90, 0x10C0, 0x0750, 0xFE00, 0xF460, 0xEA50, 0xDF90, 0xD410, 0xC7F0, 0xBB80, 0xADC0, 0xA0A0, + 0x9390, 0x89F0, 0x8620, 0x8530, 0x84F0, 0x84C0, 0x84B0, 0x84A0, 0x8490, 0x8480, 0x8480, 0x8470, 0x8470, 0x8460, 0x8460, 0x8460, + 0x8460, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8460, 0x8450, 0x8460, + 0x8460, 0x8460, 0x8460, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8480, 0x8480, 0x8490, 0x8490, 0x84A0, 0x8490, 0x84A0, 0x84B0, + 0x84B0, 0x84C0, 0x84C0, 0x84D0, 0x8500, 0x84E0, 0x84F0, 0x84E0, 0x8510, 0x8520, 0x8530, 0x8540, 0x8540, 0x8550, 0x8550, 0x8570, + 0x8580, 0x85B0, 0x85E0, 0x8630, 0x8670, 0x8700, 0x8780, 0x8860, 0x89B0, 0x8BB0, 0x8EF0, 0x9320, 0x9900, 0x9F60, 0xA590, 0xAC70, + 0xB2C0, 0xB830, 0xBDA0, 0xC210, 0xC5D0, 0xC950, 0xCD50, 0xD0F0, 0xD490, 0xD780, 0xD9C0, 0xDAC0, 0xDBF0, 0xDC30, 0xDC60, 0xDBB0, + 0xD9F0, 0xD7E0, 0xD560, 0xD1F0, 0xCDA0, 0xC7E0, 0xC1A0, 0xBA50, 0xB280, 0xA9A0, 0xA070, 0x97F0, 0x8FB0, 0x8A00, 0x86F0, 0x85C0, + 0x8550, 0x8510, 0x8500, 0x84E0, 0x84D0, 0x84D0, 0x84C0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x8490, + 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x84A0, 0x84A0, 0x84A0, 0x84B0, + 0x84B0, 0x84B0, 0x84A0, 0x84B0, 0x84C0, 0x84C0, 0x84D0, 0x84E0, 0x84F0, 0x84F0, 0x8500, 0x8520, 0x8530, 0x8540, 0x8560, 0x8580, + 0x85B0, 0x85F0, 0x8630, 0x8670, 0x86D0, 0x8700, 0x8720, 0x8710, 0x8780, 0x87A0, 0x87D0, 0x8790, 0x8770, 0x8730, 0x8720, 0x86B0, + 0x8680, 0x8670, 0x8660, 0x8640, 0x8630, 0x8620, 0x8620, 0x8600, 0x8610, 0x8620, 0x8630, 0x8620, 0x8660, 0x8630, 0x8660, 0x8690, + 0x86E0, 0x8740, 0x87A0, 0x87F0, 0x8840, 0x8850, 0x8880, 0x88C0, 0x8970, 0x8A80, 0x8BA0, 0x8C50, 0x8C90, 0x8C10, 0x8B10, 0x8990, + 0x8880, 0x87A0, 0x86E0, 0x8650, 0x85D0, 0x8590, 0x8560, 0x8540, 0x8530, 0x8530, 0x8530, 0x8530, 0x8530, 0x8540, 0x8560, 0x85A0, + 0x85D0, 0x85F0, 0x85F0, 0x85E0, 0x85D0, 0x85D0, 0x85D0, 0x85F0, 0x8610, 0x8610, 0x8600, 0x85F0, 0x85C0, 0x8590, 0x8560, 0x8530, + 0x8510, 0x8500, 0x84F0, 0x84E0, 0x84D0, 0x84C0, 0x84C0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, + 0x84A0, 0x84A0, 0x84A0, 0x84E0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84D0, + 0x84D0, 0x84D0, 0x84D0, 0x84E0, 0x84E0, 0x84E0, 0x84E0, 0x84E0, 0x84F0, 0x84F0, 0x84F0, 0x8500, 0x8500, 0x8510, 0x8520, 0x8530, + 0x8530, 0x8540, 0x8550, 0x8550, 0x8550, 0x8560, 0x8580, 0x85C0, 0x8600, 0x8640, 0x8670, 0x86B0, 0x86D0, 0x8730, 0x87D0, 0x88C0, + 0x89F0, 0x8B40, 0x8CE0, 0x8E30, 0x9010, 0x9190, 0x9350, 0x9420, 0x9550, 0x96B0, 0x9850, 0x9A40, 0x9BD0, 0x9D30, 0x9E40, 0x9E50, + 0x9D70, 0x9D10, 0x9CF0, 0x9DE0, 0x9F80, 0xA0F0, 0xA270, 0xA2D0, 0xA310, 0xA330, 0xA3D0, 0xA4A0, 0xA4E0, 0xA4C0, 0xA3A0, 0xA2D0, + 0xA260, 0xA250, 0xA320, 0xA460, 0xA4E0, 0xA480, 0xA3E0, 0xA310, 0xA2B0, 0xA210, 0xA250, 0xA290, 0xA180, 0xA0B0, 0xA000, 0x9F90, + 0xA040, 0xA130, 0xA220, 0xA2C0, 0xA2E0, 0xA260, 0xA220, 0xA240, 0xA340, 0xA3A0, 0xA330, 0xA2C0, 0xA1D0, 0xA110, 0xA110, 0xA0A0, + 0x9FD0, 0x9EC0, 0x9DB0, 0x9C40, 0x9AC0, 0x9900, 0x97C0, 0x9740, 0x97B0, 0x9850, 0x98F0, 0x9960, 0x9A30, 0x9B60, 0x9D70, 0x9F40, + 0xA120, 0xA3D0, 0xA650, 0xAAB0, 0xB070, 0xB650, 0xBC50, 0xC1F0, 0xD5D0, 0xDB30, 0xE040, 0xE450, 0xE7E0, 0xEA00, 0xEC30, 0xEDD0, + 0xEEB0, 0xEFA0, 0xEF70, 0xEF20, 0xEE50, 0xED40, 0xEBC0, 0xE8F0, 0xE550, 0xE090, 0xDB20, 0xD480, 0xCDE0, 0xC6B0, 0xBF70, 0xB700, + 0xAD50, 0xA270, 0x9690, 0x8BE0, 0x86B0, 0x8550, 0x8500, 0x84D0, 0x84C0, 0x84A0, 0x8490, 0x8480, 0x8470, 0x8460, 0x8450, 0x8440, + 0x8430, 0x8430, 0x8420, 0x8410, 0x8410, 0x8400, 0x8400, 0x8400, 0x83F0, 0x83F0, 0x83E0, 0x83F0, 0x83E0, 0x83F0, 0x83F0, 0x83F0, + 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8400, 0x8400, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8420, 0x8420, 0x8420, 0x8430, + 0x8430, 0x8430, 0x8440, 0x8440, 0x8450, 0x8450, 0x8450, 0x8460, 0x8470, 0x8480, 0x8490, 0x84B0, 0x84D0, 0x8500, 0x8560, 0x8660, + 0x8870, 0x8B90, 0x8DF0, 0x8EF0, 0x8E00, 0x8C40, 0x8A70, 0x88C0, 0x8780, 0x8670, 0x85D0, 0x8570, 0x8540, 0x8520, 0x8500, 0x84F0, + 0x84E0, 0x84D0, 0x84D0, 0x84C0, 0x84C0, 0x84B0, 0x84B0, 0x84A0, 0x84A0, 0x84A0, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, + 0x8480, 0x8480, 0x8490, 0x8480, 0x8480, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x84A0, 0x84B0, 0x84C0, 0x84C0, 0x84E0, 0x8500, + 0x8540, 0x85E0, 0x8790, 0x8D30, 0x96C0, 0xA0B0, 0xAA10, 0xB380, 0xBC30, 0xC440, 0xC9C0, 0xCEB0, 0xD3E0, 0xD950, 0xDFF0, 0xE7C0, + 0xF080, 0xF880, 0xFFC0, 0x0460, 0x0680, 0x06C0, 0x0490, 0x0230, 0xFE70, 0xF9E0, 0xF5A0, 0xF0D0, 0xEDC0, 0xEA90, 0xE890, 0xE830, + 0xE8A0, 0xE9D0, 0xEBF0, 0xEDE0, 0xF0F0, 0xF3D0, 0xF720, 0xFAE0, 0xFE90, 0x02D0, 0x06B0, 0x0AA0, 0x0EA0, 0x1280, 0x1620, 0x17B0, + 0x1830, 0x1730, 0x14E0, 0x11C0, 0x0C90, 0x07C0, 0x0210, 0xFB90, 0xF630, 0xF140, 0xECE0, 0xE950, 0xE520, 0xE180, 0xDDE0, 0xD9B0, + 0xD6B0, 0xD2D0, 0xD000, 0xCD00, 0xCA80, 0xC890, 0xC750, 0xC720, 0xC6F0, 0xC710, 0xC790, 0xC840, 0xCA50, 0xCC70, 0xCFA0, 0xD3E0, + 0xD820, 0xDF00, 0xE5F0, 0xEDF0, 0xF600, 0xFD70, 0x03E0, 0x0840, 0x0B90, 0x15A0, 0x1850, 0x1B70, 0x1EB0, 0x2140, 0x2350, 0x2520, + 0x26C0, 0x2750, 0x2890, 0x2930, 0x2A40, 0x2C10, 0x2D30, 0x2F20, 0x30D0, 0x3160, 0x3220, 0x3240, 0x31D0, 0x3230, 0x3320, 0x35E0, + 0x37F0, 0x3960, 0x3A80, 0x3AD0, 0x3BB0, 0x3C20, 0x3CE0, 0x3D90, 0x3E30, 0x3F70, 0x4050, 0x4110, 0x4170, 0x4170, 0x4180, 0x3FF0, + 0x3EA0, 0x3CC0, 0x3A90, 0x3900, 0x3780, 0x3590, 0x3330, 0x30A0, 0x2E20, 0x2AF0, 0x27D0, 0x24E0, 0x20D0, 0x1CC0, 0x17E0, 0x1240, + 0x0D90, 0x09D0, 0x06E0, 0x04C0, 0x0240, 0x0170, 0x00E0, 0x02C0, 0x06D0, 0x0CA0, 0x1460, 0x1C10, 0x2230, 0x2590, 0x24A0, 0x21B0, + 0x1C00, 0x1400, 0x0B90, 0x02F0, 0xFCF0, 0xF990, 0xF9B0, 0xFDE0, 0x0460, 0x0EA0, 0x1A30, 0x26B0, 0x3320, 0x4070, 0x4DF0, 0x5B30, + 0x6870, 0x7350, 0x7BF0, 0x7F00, 0x7F00, 0x7F90, 0x7EF0, 0x7EA0, 0x7EF0, 0x7F10, 0x7F60, 0x7EE0, 0x7EC0, 0x7F10, 0x7F20, 0x7F40, + 0x7ED0, 0x7E90, 0x7F00, 0x7F10, 0x7F10, 0x7EE0, 0x7EA0, 0x7EF0, 0x7F10, 0x7F20, 0x7F40, 0x7EB0, 0x7F20, 0x7F00, 0x7F10, 0x7F10, + 0x7F00, 0x7F40, 0x7EF0, 0x7F30, 0x7F20, 0x7EF0, 0x7F50, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F70, 0x7EE0, 0x7F10, 0x7F10, 0x7EE0, + 0x7F70, 0x7F10, 0x7F00, 0x7F00, 0x7EF0, 0x7F50, 0x7F20, 0x7EF0, 0x7EF0, 0x7EE0, 0x7F60, 0x7EF0, 0x7EB0, 0x7ED0, 0x7F00, 0x7F50, + 0x7F20, 0x7EA0, 0x7ED0, 0x7ED0, 0x7F00, 0x7EF0, 0x7E90, 0x7F10, 0x7EE0, 0x7EF0, 0x7F10, 0x7EB0, 0x7F20, 0x7F40, 0x7F10, 0x7F10, + 0x7EE0, 0x7F10, 0x7F10, 0x7F00, 0x7EF0, 0x7F10, 0x7F60, 0x7F20, 0x7F40, 0x7F10, 0x7F20, 0x7F60, 0x7F10, 0x7F10, 0x7EE0, 0x7EF0, + 0x7F50, 0x7F00, 0x7F00, 0x7F10, 0x7F10, 0x7F60, 0x7F00, 0x7ED0, 0x7F00, 0x7EF0, 0x7F50, 0x7ED0, 0x7EE0, 0x7EF0, 0x7F10, 0x7F30, + 0x7F00, 0x7EC0, 0x7F10, 0x7F10, 0x7F20, 0x7ED0, 0x7EA0, 0x7F00, 0x7EF0, 0x7F10, 0x7F20, 0x7F00, 0x7F40, 0x7F10, 0x7F20, 0x7F20, + 0x7F00, 0x7F20, 0x7EE0, 0x7EF0, 0x7F30, 0x7F10, 0x7F60, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F90, 0x7F10, 0x7F20, 0x7EF0, 0x7EF0, + 0x7F60, 0x7EF0, 0x7F10, 0x7F10, 0x7F00, 0x7F70, 0x7F10, 0x7EB0, 0x7EE0, 0x7EF0, 0x7F70, 0x7F00, 0x7EC0, 0x7ED0, 0x7EF0, 0x7F30, + 0x7F20, 0x7E90, 0x7F00, 0x7EE0, 0x7F10, 0x7F10, 0x7E70, 0x7E60, 0x7D90, 0x7C10, 0x7AE0, 0x7800, 0x75B0, 0x7260, 0x6E00, 0x6A50, + 0x6600, 0x61E0, 0x5E40, 0x59D0, 0x55B0, 0x5240, 0x4ED0, 0x4BF0, 0x48A0, 0x4570, 0x4290, 0x4130, 0x4060, 0x3ED0, 0x3E90, 0x3EE0, + 0x3F70, 0x4260, 0x4520, 0x4830, 0x4BE0, 0x4F20, 0x5240, 0x55B0, 0x59E0, 0x5E20, 0x6120, 0x6410, 0x66C0, 0x6850, 0x69D0, 0x6A90, + 0x6B40, 0x6B40, 0x6B10, 0x6A70, 0x69E0, 0x6850, 0x6710, 0x6620, 0x64E0, 0x6390, 0x61D0, 0x5FF0, 0x5D80, 0x5B50, 0x5860, 0x5560, + 0x51D0, 0x4D60, 0x48A0, 0x4400, 0x3E70, 0x37F0, 0x30B0, 0x27B0, 0x1E70, 0x1420, 0x0A60, 0x00D0, 0xF710, 0xEEA0, 0xE630, 0xDD50, + 0xD400, 0xCB40, 0xC260, 0xB980, 0xB0B0, 0xA8B0, 0xA120, 0x9A50, 0x93C0, 0x8D90, 0x89F0, 0x87D0, 0x86A0, 0x85E0, 0x8580, 0x8540, + 0x8520, 0x84F0, 0x8500, 0x8500, 0x8500, 0x8500, 0x8500, 0x8510, 0x8520, 0x8520, 0x8560, 0x8540, 0x8550, 0x8570, 0x8580, 0x8590, + 0x85A0, 0x85B0, 0x85D0, 0x85F0, 0x8600, 0x8620, 0x8620, 0x8620, 0x8630, 0x8640, 0x8640, 0x8650, 0x8660, 0x8680, 0x86A0, 0x86A0, + 0x86C0, 0x86C0, 0x86D0, 0x86F0, 0x8700, 0x8730, 0x8770, 0x8790, 0x87F0, 0x8880, 0x8940, 0x89B0, 0x8A60, 0x8B70, 0x8C90, 0x8E40, + 0x8FB0, 0x9170, 0x93F0, 0x9680, 0x9930, 0x9C70, 0xA030, 0xA3B0, 0xA780, 0xAB70, 0xAF50, 0xB2B0, 0xB6E0, 0xBAF0, 0xBEC0, 0xC2F0, + 0xC650, 0xC9F0, 0xCD60, 0xD0E0, 0xD3B0, 0xD660, 0xD8C0, 0xDAC0, 0xDCE0, 0xDE70, 0xE000, 0xE130, 0xE1E0, 0xE1B0, 0xE080, 0xDE60, + 0xDC70, 0xDA00, 0xD810, 0xD620, 0xD470, 0xD2E0, 0xD090, 0xCE40, 0xCBC0, 0xC990, 0xC800, 0xC6D0, 0xC6B0, 0xC700, 0xC850, 0xCAA0, + 0xCCA0, 0xCF90, 0xD220, 0xD510, 0xD840, 0xDB60, 0xDF00, 0xE340, 0xE7B0, 0xEC30, 0xF0E0, 0xF4B0, 0xF840, 0xFC30, 0x0050, 0x03F0, + 0x06B0, 0x0930, 0x0BC0, 0x0EF0, 0x1280, 0x1570, 0x18C0, 0x1BE0, 0x1DF0, 0x2120, 0x2300, 0x2530, 0x27F0, 0x2A70, 0x2E20, 0x3050, + 0x33A0, 0x35C0, 0x3870, 0x3AF0, 0x3C80, 0x3F00, 0x4090, 0x4230, 0x44A0, 0x4690, 0x49B0, 0x4D00, 0x4FE0, 0x5390, 0x56A0, 0x59C0, + 0x5C90, 0x5E90, 0x61A0, 0x6500, 0x6840, 0x6BB0, 0x6F20, 0x7340, 0x7680, 0x79B0, 0x7C60, 0x7E50, 0x7F10, 0x7F20, 0x7F60, 0x7F10, + 0x7F10, 0x7F20, 0x7EF0, 0x7F50, 0x7EF0, 0x7F00, 0x7F40, 0x7F00, 0x7F40, 0x7F10, 0x7F10, 0x7F30, 0x7EE0, 0x7F50, 0x7F10, 0x7F20, + 0x7EF0, 0x7F10, 0x7F80, 0x7F00, 0x7F10, 0x7F10, 0x7F10, 0x7F70, 0x7F10, 0x7F10, 0x7EF0, 0x7EE0, 0x7F50, 0x7F10, 0x7EB0, 0x7EE0, + 0x7ED0, 0x7F70, 0x7F20, 0x7EC0, 0x7ED0, 0x7ED0, 0x7F00, 0x7F20, 0x7E90, 0x7EB0, 0x7EC0, 0x7EF0, 0x7F10, 0x7EA0, 0x7F00, 0x7F10, + 0x7F10, 0x7F20, 0x7EC0, 0x7F10, 0x7F10, 0x7F00, 0x7EF0, 0x7F00, 0x7F30, 0x7F20, 0x7F10, 0x7F20, 0x7F20, 0x7F50, 0x7F10, 0x7F20, + 0x7F00, 0x7EF0, 0x7F50, 0x7EF0, 0x7F10, 0x7F10, 0x7F20, 0x7F60, 0x7F00, 0x7EF0, 0x7EF0, 0x7EE0, 0x7F50, 0x7EF0, 0x7EE0, 0x7EF0, + 0x7F10, 0x7F70, 0x7F00, 0x7EC0, 0x7F10, 0x7F20, 0x7F50, 0x7ED0, 0x7EA0, 0x7EE0, 0x7EF0, 0x7F30, 0x7F10, 0x7EC0, 0x7F10, 0x7F10, + 0x7F20, 0x7F10, 0x7EB0, 0x7F10, 0x7EF0, 0x7460, 0x63F0, 0x4FC0, 0x3C70, 0x2950, 0x1710, 0x06A0, 0xF600, 0xE5D0, 0xD510, 0xC3C0, + 0xB160, 0xA000, 0x8F40, 0x86F0, 0x8520, 0x84E0, 0x84C0, 0x84B0, 0x84A0, 0x8490, 0x8490, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, + 0x8480, 0x8480, 0x84A0, 0x8480, 0x8490, 0x8490, 0x8490, 0x84A0, 0x8460, 0x84C0, 0x84F0, 0x8500, 0x8540, 0x85B0, 0x8700, 0x8A40, + 0x90B0, 0x97F0, 0x9F90, 0xA5A0, 0xAB80, 0xAF30, 0xB2C0, 0xB420, 0xB5B0, 0xB600, 0xB580, 0xB7C0, 0xB990, 0xBB40, 0xBCC0, 0xBE80, + 0xC100, 0xC410, 0xC7E0, 0xCB60, 0xCE90, 0xD1D0, 0xD410, 0xD710, 0xDA40, 0xDDB0, 0xE1A0, 0xE4D0, 0xE830, 0xEAC0, 0xED70, 0xF090, + 0xF330, 0xF6C0, 0xF9C0, 0xFB50, 0xFD40, 0xFDE0, 0xFED0, 0xFFD0, 0x00D0, 0x01C0, 0x0250, 0x0280, 0x01C0, 0x00F0, 0x01C0, 0x02C0, + 0x04E0, 0x0690, 0x0830, 0x09B0, 0x0AF0, 0x0D10, 0x1020, 0x1360, 0x16F0, 0x1A00, 0x1C80, 0x1F80, 0x22D0, 0x2770, 0x2B60, 0x3000, + 0x33D0, 0x36A0, 0x3960, 0x3AD0, 0x3B50, 0x3BA0, 0x3A90, 0x3A10, 0x38E0, 0x3760, 0x3710, 0x3710, 0x38F0, 0x3990, 0x3990, 0x3A20, + 0x39A0, 0x38B0, 0x3750, 0x3560, 0x3390, 0x30B0, 0x2D50, 0x2920, 0x2440, 0x1EB0, 0x1820, 0x1160, 0x0A30, 0x0260, 0xFAA0, 0xF2C0, + 0xEBB0, 0xE490, 0xDC00, 0xD1D0, 0xC630, 0xB920, 0xA8D0, 0x95B0, 0x8830, 0x8520, 0x84D0, 0x84A0, 0x8480, 0x8470, 0x8470, 0x8450, + 0x8440, 0x8430, 0x8420, 0x8410, 0x8410, 0x8400, 0x8400, 0x83F0, 0x83F0, 0x83E0, 0x83E0, 0x83D0, 0x83E0, 0x83E0, 0x83F0, 0x83F0, + 0x83F0, 0x8400, 0x8440, 0x8440, 0x8430, 0x8440, 0x8460, 0x8450, 0x8460, 0x8470, 0x8480, 0x8480, 0x8490, 0x84D0, 0x84C0, 0x84B0, + 0x84C0, 0x84D0, 0x84E0, 0x8500, 0x8540, 0x8610, 0x8890, 0x91B0, 0x9E60, 0xA910, 0xB1B0, 0xB760, 0xBC40, 0xC060, 0xC400, 0xC7C0, + 0xCBD0, 0xD010, 0xD560, 0xDA20, 0xDF60, 0xE580, 0xEAE0, 0xEFD0, 0xF430, 0xF8B0, 0xFDE0, 0x0370, 0x0960, 0x0F00, 0x1440, 0x19B0, + 0x1F00, 0x2620, 0x2DD0, 0x35F0, 0x3E80, 0x4640, 0x4E90, 0x55B0, 0x5BF0, 0x62D0, 0x68B0, 0x6F00, 0x7440, 0x78B0, 0x7BA0, 0x7CE0, + 0x7D90, 0x7DB0, 0x7D70, 0x7CE0, 0x7B50, 0x7980, 0x76F0, 0x73D0, 0x71B0, 0x6E40, 0x6B60, 0x6680, 0x6030, 0x5960, 0x5180, 0x49D0, + 0x4320, 0x3C10, 0x3610, 0x2EA0, 0x26A0, 0x1DC0, 0x13D0, 0x0A00, 0xFE40, 0xF3F0, 0xE9E0, 0xE040, 0xD8A0, 0xD290, 0xCDF0, 0xCAA0, + 0xC870, 0xC6B0, 0xC520, 0xC3E0, 0xC290, 0xC2B0, 0xC350, 0xC3A0, 0xC420, 0xC530, 0xC600, 0xC800, 0xCB30, 0xCF70, 0xD500, 0xDA90, + 0xE050, 0xE640, 0xECC0, 0xF4F0, 0xFC60, 0x04F0, 0x0D90, 0x1630, 0x1F40, 0x2780, 0x3090, 0x39B0, 0x4350, 0x4C50, 0x5470, 0x5CE0, + 0x6480, 0x6B80, 0x7360, 0x7A80, 0x7EF0, 0x7F10, 0x7F20, 0x7F40, 0x7F00, 0x7F30, 0x7EE0, 0x7EF0, 0x7F30, 0x7F10, 0x7F50, 0x7F10, + 0x7F20, 0x7F20, 0x7F10, 0x7F90, 0x7F00, 0x7EF0, 0x7EE0, 0x7EF0, 0x7F60, 0x7EF0, 0x7EF0, 0x7F00, 0x7F00, 0x7F70, 0x7F10, 0x7EB0, + 0x7EF0, 0x7ED0, 0x7F10, 0x7EF0, 0x7F10, 0x7F20, 0x7EF0, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F10, + 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, + 0x7F40, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, + 0x7F30, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F10, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F00, 0x7F30, 0x7F30, 0x7F20, + 0x7F20, 0x7EF0, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F00, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F20, 0x7F20, + 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7DD0, 0x7080, 0x6040, 0x4E90, 0x3C70, 0x2B20, 0x1D10, 0x1450, 0x1270, 0x1700, 0x2120, + 0x2FA0, 0x3F80, 0x4F20, 0x5DD0, 0x6A90, 0x74A0, 0x7B60, 0x7E90, 0x7F30, 0x7F20, 0x7F10, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, + 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F20, 0x7F20, 0x7F20, 0x7F20, 0x7F30, 0x7F30, + 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F20, 0x7F20, + 0x7F20, 0x7F30, 0x7E60, 0x6A60, 0x5640, 0x4150, 0x2AE0, 0x16F0, 0x0280, 0xED80, 0xD8F0, 0xC560, 0xB460, 0xA5A0, 0x9B00, 0x92D0, + 0x8E00, 0x8A70, 0x8800, 0x8660, 0x8570, 0x8510, 0x84E0, 0x84C0, 0x84B0, 0x84B0, 0x84A0, 0x84A0, 0x84A0, 0x84B0, 0x84B0, 0x84C0, + 0x84C0, 0x84C0, 0x84B0, 0x84B0, 0x84B0, 0x84C0, 0x84C0, 0x84A0, 0x84C0, 0x84C0, 0x84C0, 0x84D0, 0x84D0, 0x84E0, 0x84D0, 0x84D0, + 0x84E0, 0x8480, 0x84F0, 0x8500, 0x8530, 0x8520, 0x8530, 0x8560, 0x8520, 0x85D0, 0x8630, 0x86C0, 0x8790, 0x8870, 0x89B0, 0x8B30, + 0x8D70, 0x8F50, 0x9210, 0x94D0, 0x97D0, 0x9A90, 0x9E30, 0xA2C0, 0xA770, 0xABF0, 0xB160, 0xB5F0, 0xBAD0, 0xBF60, 0xC370, 0xC670, + 0xC8D0, 0xCB80, 0xCC90, 0xCDB0, 0xCDD0, 0xCD40, 0xCD70, 0xCC60, 0xCBA0, 0xCA90, 0xC8A0, 0xC770, 0xC690, 0xC4C0, 0xC2D0, 0xC030, + 0xBEF0, 0xBDB0, 0xBCE0, 0xBCC0, 0xBC50, 0xBC90, 0xBC30, 0xBC20, 0xBC40, 0xBB20, 0xBAA0, 0xB8A0, 0xB730, 0xB570, 0xB3E0, 0xB1D0, + 0xAFE0, 0xAE70, 0xABF0, 0xA940, 0xA730, 0xA580, 0xA440, 0xA2D0, 0xA230, 0xA220, 0xA250, 0xA3B0, 0xA560, 0xA7D0, 0xAB70, 0xAEF0, + 0xB320, 0xB760, 0xBC10, 0xC270, 0xCA20, 0xD1B0, 0xD9D0, 0xE1E0, 0xEA20, 0xF190, 0xF8B0, 0x00A0, 0x06F0, 0x0D00, 0x1120, 0x1370, + 0x1510, 0x14B0, 0x1420, 0x1280, 0x0EF0, 0x0B20, 0x0500, 0xFE90, 0xF730, 0xEF00, 0xE740, 0xDEA0, 0xD5B0, 0xCD60, 0xC3C0, 0xBA00, + 0xB120, 0xA880, 0xA010, 0x9880, 0x9240, 0x8D10, 0x85C0, 0x8560, 0x8530, 0x8560, 0x8500, 0x8500, 0x8500, 0x8500, 0x8500, 0x8510, + 0x8520, 0x8530, 0x8550, 0x8570, 0x85B0, 0x8610, 0x86B0, 0x87C0, 0x8910, 0x8AF0, 0x8DE0, 0x9200, 0x95A0, 0x9990, 0x9C50, 0x9E60, + 0xA110, 0xA310, 0xA4E0, 0xA6C0, 0xA8C0, 0xAAC0, 0xACC0, 0xAEC0, 0xB0A0, 0xB1B0, 0xB370, 0xB460, 0xB590, 0xB750, 0xB840, 0xBA60, + 0xBB50, 0xBC70, 0xBD40, 0xBD60, 0xBDD0, 0xBCC0, 0xBB00, 0xB9B0, 0xB830, 0xB6A0, 0xB480, 0xB150, 0xADF0, 0xA9F0, 0xA5E0, 0xA110, + 0x9D70, 0x99E0, 0x95D0, 0x9260, 0x8F30, 0x8C80, 0x8A70, 0x88B0, 0x8780, 0x86C0, 0x8640, 0x85F0, 0x85A0, 0x8570, 0x8530, 0x8510, + 0x8510, 0x8500, 0x8500, 0x8500, 0x84F0, 0x84F0, 0x84F0, 0x84F0, 0x84F0, 0x84E0, 0x84E0, 0x84E0, 0x84E0, 0x84E0, 0x84D0, 0x84D0, + 0x84D0, 0x84D0, 0x84D0, 0x84D0, 0x84D0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, + 0x84D0, 0x84D0, 0x84D0, 0x84D0, 0x84D0, 0x84E0, 0x84E0, 0x84E0, 0x84F0, 0x84F0, 0x8500, 0x8500, 0x8510, 0x8520, 0x8530, 0x8540, + 0x8550, 0x8570, 0x8590, 0x85D0, 0x8610, 0x8680, 0x86F0, 0x8790, 0x8850, 0x8950, 0x8A60, 0x8BC0, 0x8DD0, 0x9080, 0x9340, 0x95A0, + 0x97D0, 0x9A60, 0x9CB0, 0x9F20, 0xA200, 0xA4A0, 0xA7C0, 0xAA00, 0xAC40, 0xAE70, 0xB070, 0xB2C0, 0xB580, 0xB840, 0xBB30, 0xBC60, + 0xBDA0, 0xBF20, 0xC0B0, 0xC250, 0xC370, 0xC4B0, 0xC550, 0xC5C0, 0xC5C0, 0xC4F0, 0xC4E0, 0xC450, 0xC380, 0xC200, 0xC070, 0xBE60, + 0xBBF0, 0xBA20, 0xB8E0, 0xB690, 0xB3A0, 0xB080, 0xADA0, 0xAB00, 0xA770, 0xA3C0, 0xA090, 0x9CE0, 0x98F0, 0x94F0, 0x91E0, 0x8EB0, + 0x8C30, 0x8A00, 0x8840, 0x8700, 0x8630, 0x85B0, 0x8580, 0x8550, 0x8530, 0x8530, 0x8500, 0x8510, 0x8500, 0x8500, 0x8500, 0x8500, + 0x8500, 0x8500, 0x8500, 0x8500, 0x8500, 0x8510, 0x8510, 0x8520, 0x8520, 0x8530, 0x8550, 0x8570, 0x8580, 0x85C0, 0x8610, 0x8650, + 0x86A0, 0x86F0, 0x8750, 0x8770, 0x87F0, 0x8820, 0x87E0, 0x8760, 0x86E0, 0x8670, 0x8610, 0x85C0, 0x8580, 0x8560, 0x8530, 0x8520, + 0x8500, 0x8500, 0x8510, 0x84F0, 0x84F0, 0x84E0, 0x84E0, 0x84D0, 0x84D0, 0x84D0, 0x84D0, 0x84E0, 0x84F0, 0x8500, 0x8520, 0x8580, + 0x86C0, 0x8D60, 0x9D40, 0xAE70, 0xC1B0, 0xD710, 0xEE00, 0x06C0, 0x20E0, 0x3B20, 0x5790, 0x6FA0, 0x7F60, 0x7F10, 0x7F10, 0x7EF0, + 0x7EE0, 0x7F60, 0x7F10, 0x7EE0, 0x7EF0, 0x7EF0, 0x7F70, 0x7F20, 0x7EC0, 0x7ED0, 0x7EB0, 0x7F00, 0x7F10, 0x7EA0, 0x7EC0, 0x7EC0, + 0x7F10, 0x7F20, 0x7EA0, 0x7F00, 0x7F10, 0x7F20, 0x7F10, 0x7E90, 0x7F00, 0x7F00, 0x7EF0, 0x7F10, 0x7F00, 0x7F40, 0x7930, 0x6C80, + 0x5F20, 0x4F40, 0x3ED0, 0x2EB0, 0x1E70, 0x1060, 0x02F0, 0xF860, 0xF120, 0xEBF0, 0xEAB0, 0xEA60, 0xEA50, 0xEA10, 0xE7F0, 0xE340, + 0xDB80, 0xD290, 0xC800, 0xBE60, 0xB4D0, 0xAB60, 0xA0E0, 0x9680, 0x8D60, 0x8820, 0x8630, 0x8590, 0x8560, 0x8570, 0x85E0, 0x8730, + 0x8CC0, 0x9A90, 0xA8C0, 0xB550, 0xC060, 0xC9F0, 0xD310, 0xDC00, 0xE660, 0xF0E0, 0xFB50, 0x0670, 0x0F00, 0x1710, 0x1E30, 0x23C0, + 0x29E0, 0x2E50, 0x3310, 0x3770, 0x3C80, 0x42E0, 0x4780, 0x4BD0, 0x4FA0, 0x5340, 0x5690, 0x5960, 0x5C80, 0x6050, 0x63F0, 0x67A0, + 0x6B20, 0x6D50, 0x6F90, 0x7160, 0x72D0, 0x7510, 0x76F0, 0x78A0, 0x7A00, 0x7B50, 0x7C90, 0x7D30, 0x7E00, 0x7E30, 0x7EA0, 0x7EC0, + 0x7E90, 0x7E90, 0x7E60, 0x7E40, 0x7E70, 0x7EA0, 0x7ED0, 0x7EF0, 0x7EF0, 0x7EF0, 0x7EE0, 0x7F10, 0x7F30, 0x7F30, 0x7F40, 0x7F30, + 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F20, 0x7F40, 0x7F10, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, + 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F20, + 0x7EF0, 0x7F30, 0x7F20, 0x7F10, 0x7EF0, 0x7F10, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F00, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F10, + 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F20, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F40, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, + 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F20, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F20, + 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F30, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F40, 0x7F30, 0x7F20, 0x7F20, + 0x7F20, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F20, 0x7F20, 0x7F30, + 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F10, 0x7F20, 0x7F20, 0x7F30, 0x7F30, + 0x7F20, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F10, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F70, 0x7F30, 0x7F00, 0x7F00, 0x7F10, 0x7F30, + 0x7F20, 0x7F00, 0x7F10, 0x7EF0, 0x7F00, 0x7EE0, 0x7EC0, 0x7EC0, 0x7EF0, 0x7F50, 0x7F00, 0x7EC0, 0x7F00, 0x7F10, 0x7F30, 0x7EE0, + 0x7ED0, 0x7F10, 0x7F00, 0x7F20, 0x7EF0, 0x7EB0, 0x7F30, 0x7F00, 0x7F10, 0x7F20, 0x7EC0, 0x7F10, 0x7EF0, 0x7F00, 0x7F00, 0x7EC0, + 0x7F10, 0x7F20, 0x7EF0, 0x7F10, 0x7F00, 0x7F40, 0x7F10, 0x7F10, 0x7F30, 0x7EE0, 0x7F50, 0x7F00, 0x7F00, 0x7F50, 0x7F10, 0x7F60, + 0x7F20, 0x7F10, 0x7EF0, 0x7EF0, 0x7F90, 0x7F10, 0x7F00, 0x7EE0, 0x7EE0, 0x7F70, 0x7730, 0x6AA0, 0x5F60, 0x5280, 0x4660, 0x3B50, + 0x30D0, 0x2850, 0x2130, 0x1B90, 0x1790, 0x13D0, 0x1140, 0x0EF0, 0x0DD0, 0x0E60, 0x0F20, 0x1230, 0x1620, 0x1AA0, 0x1FC0, 0x2530, + 0x2AC0, 0x3070, 0x3550, 0x3A50, 0x3EE0, 0x4380, 0x4810, 0x4CF0, 0x53C0, 0x59D0, 0x6010, 0x66B0, 0x6CF0, 0x73D0, 0x79D0, 0x7E30, + 0x7F00, 0x7F30, 0x7F20, 0x7F20, 0x7F50, 0x7EF0, 0x7EF0, 0x7EF0, 0x7EF0, 0x7F70, 0x7EE0, 0x7EF0, 0x7F10, 0x7F20, 0x7F60, 0x7ED0, + 0x7E90, 0x7EF0, 0x7EE0, 0x7F30, 0x7EB0, 0x7EA0, 0x7EF0, 0x7F10, 0x7F20, 0x7F00, 0x7EC0, 0x7F10, 0x7F00, 0x7F10, 0x7F10, 0x7EA0, + 0x7F20, 0x7EF0, 0x7F10, 0x7F20, 0x7F20, 0x7F30, 0x7F00, 0x7F20, 0x7F40, 0x7F10, 0x7F60, 0x7EE0, 0x7EF0, 0x7F10, 0x7EF0, 0x7F60, + 0x7F10, 0x7F20, 0x7F20, 0x7F00, 0x7F90, 0x7F00, 0x7EE0, 0x7F10, 0x7EF0, 0x7F60, 0x7EF0, 0x7ED0, 0x7F00, 0x7300, 0x46D0, 0x2030, + 0xFC80, 0xE380, 0xD1B0, 0xC5B0, 0xBF00, 0xB9A0, 0xB4C0, 0xAF40, 0xA8B0, 0xA1D0, 0x9A40, 0x92B0, 0x8BB0, 0x8760, 0x85A0, 0x8510, + 0x84E0, 0x84C0, 0x84B0, 0x84A0, 0x8490, 0x8480, 0x8480, 0x8470, 0x8470, 0x8470, 0x8460, 0x8460, 0x8460, 0x8460, 0x8450, 0x8450, + 0x8440, 0x8440, 0x8410, 0x8400, 0x8400, 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8400, 0x8410, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, + 0x8400, 0x8420, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8400, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, + 0x8410, 0x8410, 0x8410, 0x8420, 0x8410, 0x8420, 0x8420, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, + 0x8430, 0x8430, 0x8410, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8440, 0x8440, 0x8440, 0x8450, 0x8450, + 0x8450, 0x8460, 0x8460, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8490, 0x8490, 0x8490, 0x84A0, 0x84B0, 0x84B0, 0x84C0, 0x84C0, + 0x84D0, 0x84E0, 0x84F0, 0x8510, 0x8530, 0x8560, 0x85B0, 0x8630, 0x86E0, 0x87B0, 0x88F0, 0x89F0, 0x8AB0, 0x8B90, 0x8C10, 0x8DC0, + 0x9020, 0x9350, 0x9820, 0x9E50, 0xA5B0, 0xADC0, 0xB5C0, 0xBD80, 0xC3D0, 0xCA60, 0xD020, 0xD5F0, 0xDBF0, 0xE130, 0xE680, 0xEB40, + 0xEF70, 0xF300, 0xF580, 0xF910, 0xFBE0, 0xFE90, 0x0170, 0x0250, 0x0260, 0x0010, 0xFD90, 0xFA20, 0xF5C0, 0xF090, 0xEA20, 0xE370, + 0xDC90, 0xD670, 0xCFE0, 0xC950, 0xC290, 0xBCD0, 0xB650, 0xAFC0, 0xAA30, 0xA500, 0xA0D0, 0x9C90, 0x9A10, 0x9810, 0x95F0, 0x9450, + 0x9270, 0x9140, 0x8F50, 0x8D60, 0x8BD0, 0x8A20, 0x8930, 0x8910, 0x8950, 0x8AA0, 0x8CF0, 0x90E0, 0x95A0, 0x9A30, 0x9E90, 0xA300, + 0xA7A0, 0xAB70, 0xAF60, 0xB2E0, 0xB4A0, 0xB650, 0xB7A0, 0xB8E0, 0xBAD0, 0xBD00, 0xBFD0, 0xC380, 0xC750, 0xCD20, 0xD2E0, 0xD8F0, + 0xDEF0, 0xE460, 0xE900, 0xECD0, 0xEFD0, 0xF240, 0xF420, 0xF610, 0xF8A0, 0xFA70, 0xFBE0, 0xFCF0, 0xFE60, 0xFFF0, 0x0170, 0x0310, + 0x04C0, 0x06E0, 0x0990, 0x0B00, 0x0DE0, 0x0F30, 0x1160, 0x13C0, 0x15B0, 0x18B0, 0x1B60, 0x1E70, 0x2140, 0x2380, 0x2620, 0x2800, + 0x2900, 0x2A20, 0x2B60, 0x2E00, 0x3090, 0x32E0, 0x34C0, 0x3580, 0x3660, 0x3670, 0x3710, 0x38B0, 0x3A40, 0x3D70, 0x3FD0, 0x41D0, + 0x4400, 0x46D0, 0x4AB0, 0x4E70, 0x5160, 0x5410, 0x55D0, 0x5780, 0x5840, 0x5890, 0x5A20, 0x5BA0, 0x5D90, 0x5FB0, 0x61F0, 0x65C0, + 0x68F0, 0x6E30, 0x7460, 0x7A50, 0x7EB0, 0x7EA0, 0x7EC0, 0x7F10, 0x7F10, 0x7F00, 0x7EA0, 0x7F10, 0x7F00, 0x7EF0, 0x7EF0, 0x7EB0, + 0x7F20, 0x7F40, 0x7F10, 0x7F10, 0x7F00, 0x7F10, 0x7F10, 0x7F20, 0x7F00, 0x7EF0, 0x7F70, 0x7D30, 0x6E40, 0x5DF0, 0x4B70, 0x3AC0, + 0x2A60, 0x1B80, 0x0EA0, 0x03E0, 0xFBA0, 0xF810, 0xF920, 0xFE60, 0x04C0, 0x09D0, 0x0C60, 0x0B40, 0x05F0, 0xFBD0, 0xED90, 0xDC80, + 0xC800, 0xB130, 0x9860, 0x87C0, 0x8500, 0x84D0, 0x84B0, 0x84A0, 0x84A0, 0x8490, 0x8490, 0x8490, 0x8480, 0x8480, 0x8470, 0x8470, + 0x8460, 0x8460, 0x8450, 0x8440, 0x8430, 0x8430, 0x8430, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8430, 0x8420, 0x8420, 0x8420, + 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8440, 0x8440, 0x8440, 0x8450, 0x8450, 0x8450, 0x8450, 0x8460, 0x8460, 0x8460, 0x8470, + 0x8470, 0x8470, 0x8470, 0x84A0, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8460, + 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8460, 0x8460, 0x8460, 0x8450, + 0x8450, 0x8450, 0x8430, 0x8450, 0x8450, 0x8450, 0x8450, 0x8460, 0x8460, 0x8470, 0x8480, 0x8490, 0x84B0, 0x84E0, 0x8560, 0x88B0, + 0x9A10, 0xADA0, 0xBDF0, 0xCC40, 0xD8C0, 0xE430, 0xEF00, 0xF970, 0x0310, 0x0B30, 0x1200, 0x1660, 0x17F0, 0x1870, 0x17A0, 0x1670, + 0x1510, 0x1380, 0x1180, 0x0E10, 0x0980, 0x03E0, 0xFDA0, 0xF7B0, 0xF180, 0xEBA0, 0xE580, 0xDF40, 0xD970, 0xD3C0, 0xCF00, 0xCB40, + 0xC800, 0xC510, 0xC2E0, 0xC170, 0xBFD0, 0xBEF0, 0xBF80, 0xC030, 0xC1B0, 0xC450, 0xC6C0, 0xC9B0, 0xCE00, 0xD360, 0xD940, 0xDF30, + 0xE650, 0xEEE0, 0xF850, 0x0250, 0x0D70, 0x18C0, 0x2230, 0x2C60, 0x3560, 0x3E10, 0x4610, 0x4D90, 0x5520, 0x5C80, 0x6380, 0x6A90, + 0x71F0, 0x7880, 0x7D60, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F20, 0x7F40, 0x7F10, 0x7F10, 0x7EB0, 0x7F20, + 0x7EF0, 0x7EF0, 0x7EF0, 0x7E70, 0x7EF0, 0x7EF0, 0x7F00, 0x7EE0, 0x7EC0, 0x7EF0, 0x7EB0, 0x7F40, 0x7F10, 0x7EC0, 0x7F40, 0x7EF0, + 0x7F30, 0x7F20, 0x7F00, 0x7F30, 0x7F20, 0x7F40, 0x7F10, 0x7F10, 0x7F10, 0x7EE0, 0x7EF0, 0x7F10, 0x7F10, 0x7F10, 0x7F10, 0x7F00, + 0x7F00, 0x7F10, 0x7F50, 0x7EB0, 0x7E70, 0x7EF0, 0x7F00, 0x7F20, 0x7ED0, 0x7EB0, 0x7F20, 0x7F00, 0x7F40, 0x7ED0, 0x7EA0, 0x7F10, + 0x7F10, 0x7F20, 0x7EE0, 0x7E90, 0x7F10, 0x7F10, 0x7F20, 0x7F40, 0x7EB0, 0x7F20, 0x7F10, 0x7F10, 0x7F10, 0x7F00, 0x7F40, 0x7EF0, + 0x7F20, 0x7F40, 0x7F00, 0x7F60, 0x7F20, 0x7F40, 0x7F10, 0x7F00, 0x7F60, 0x7EF0, 0x7F10, 0x7EF0, 0x7EF0, 0x7F90, 0x7F10, 0x7F00, + 0x7F00, 0x7ED0, 0x7F30, 0x7F00, 0x7EF0, 0x7EF0, 0x7EE0, 0x7F40, 0x7EF0, 0x7EB0, 0x7EE0, 0x7F00, 0x7F30, 0x7F20, 0x7EC0, 0x7C90, + 0x7650, 0x6EE0, 0x6920, 0x6410, 0x61B0, 0x60C0, 0x6050, 0x6210, 0x6480, 0x6800, 0x6A50, 0x6C30, 0x6DB0, 0x6DE0, 0x6BD0, 0x68B0, + 0x63A0, 0x5E00, 0x5750, 0x5010, 0x47C0, 0x3E40, 0x3470, 0x28C0, 0x1DC0, 0x1270, 0x0670, 0xFAA0, 0xEED0, 0xE3D0, 0xDA30, 0xD270, + 0xCC10, 0xC7A0, 0xC540, 0xC390, 0xC1F0, 0xC070, 0xBFC0, 0xC020, 0xC140, 0xC300, 0xC560, 0xC800, 0xCAF0, 0xCEE0, 0xD3B0, 0xD9C0, + 0xE050, 0xE660, 0xEDB0, 0xF300, 0xF820, 0xFCA0, 0x0090, 0x0590, 0x0880, 0x09F0, 0x0A50, 0x0900, 0x07A0, 0x0590, 0x0310, 0xFF20, + 0xFA70, 0xF440, 0xED20, 0xE5E0, 0xDDE0, 0xD5D0, 0xCE40, 0xC660, 0xBD80, 0xB380, 0xA7E0, 0x9B80, 0x8FA0, 0x8810, 0x85A0, 0x8510, + 0x84E0, 0x84C0, 0x84B0, 0x84A0, 0x8490, 0x8480, 0x8480, 0x8470, 0x8470, 0x8460, 0x8460, 0x8460, 0x8450, 0x8450, 0x8450, 0x8450, + 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8460, 0x8470, 0x8470, 0x8480, 0x8480, 0x8490, 0x8490, 0x84A0, 0x84B0, 0x84D0, 0x8500, + 0x8580, 0x87C0, 0x92F0, 0xA430, 0xB5A0, 0xC5F0, 0xD6B0, 0xE400, 0xEF00, 0xF590, 0xF830, 0xF5E0, 0xEF50, 0xE5B0, 0xD9C0, 0xCB70, + 0xBFB0, 0xB590, 0xAFB0, 0xAD40, 0xAF10, 0xB3B0, 0xB930, 0xBE70, 0xC370, 0xC6B0, 0xC890, 0xC910, 0xC9B0, 0xC960, 0xC8D0, 0xC950, + 0xC9F0, 0xCBA0, 0xCB50, 0xC8B0, 0xC300, 0xB870, 0xAB30, 0x9A80, 0x8BD0, 0x8630, 0x8510, 0x84F0, 0x84D0, 0x84C0, 0x84B0, 0x84A0, + 0x84A0, 0x84A0, 0x8490, 0x8490, 0x8490, 0x8490, 0x8480, 0x8480, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8470, + 0x8490, 0x8480, 0x8480, 0x8470, 0x8480, 0x8470, 0x8470, 0x8470, 0x8470, 0x8480, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8460, + 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8470, 0x8450, 0x8450, 0x8450, 0x8460, 0x8450, + 0x8460, 0x8460, 0x84A0, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8460, + 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8480, 0x8480, 0x8490, 0x84A0, 0x84B0, 0x84D0, 0x8530, 0x85C0, 0x87C0, 0x8C90, 0x9270, + 0x9750, 0x9BE0, 0xA060, 0xA4F0, 0xA830, 0xA8A0, 0xA350, 0x9560, 0x87A0, 0x8510, 0x84D0, 0x8480, 0x8460, 0x8480, 0x8440, 0x8430, + 0x8430, 0x8450, 0x8420, 0x8410, 0x8420, 0x8400, 0x83F0, 0x83F0, 0x83D0, 0x83D0, 0x83D0, 0x83F0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, + 0x83C0, 0x83C0, 0x83F0, 0x83C0, 0x83D0, 0x83D0, 0x83F0, 0x83E0, 0x8400, 0x8400, 0x8420, 0x8430, 0x8440, 0x8410, 0x8460, 0x8460, + 0x8470, 0x8470, 0x8470, 0x8470, 0x84A0, 0x8490, 0x84A0, 0x84B0, 0x84B0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84A0, 0x84A0, 0x84A0, + 0x8490, 0x8490, 0x8490, 0x84A0, 0x84A0, 0x84B0, 0x84C0, 0x84C0, 0x84E0, 0x8520, 0x8620, 0x8C10, 0x9DB0, 0xB020, 0xBEF0, 0xCC10, + 0xD700, 0xE0A0, 0xEA10, 0xF470, 0x0070, 0x0D20, 0x1AD0, 0x2790, 0x31E0, 0x3810, 0x39D0, 0x36A0, 0x2E30, 0x1FE0, 0x0CB0, 0xF400, + 0xDB90, 0xC530, 0xB1D0, 0xA370, 0x9970, 0x9280, 0x8DB0, 0x8AE0, 0x88A0, 0x8780, 0x86C0, 0x8630, 0x85E0, 0x85C0, 0x85D0, 0x85E0, + 0x85F0, 0x8610, 0x8640, 0x8690, 0x8760, 0x8930, 0x8DE0, 0x9600, 0xA080, 0xAB00, 0xB5D0, 0xBE20, 0xC4C0, 0xC9E0, 0xCE10, 0xD1E0, + 0xD5E0, 0xDAA0, 0xE0F0, 0xE840, 0xEF50, 0xF680, 0xFC60, 0x0160, 0x04C0, 0x0600, 0x03A0, 0xFE90, 0xF750, 0xED60, 0xE220, 0xD5D0, + 0xC890, 0xBB00, 0xACE0, 0x9C40, 0x8CF0, 0x8610, 0x84E0, 0x84B0, 0x8490, 0x8470, 0x8460, 0x8450, 0x8440, 0x8440, 0x8430, 0x8430, + 0x8420, 0x8430, 0x8410, 0x8400, 0x8400, 0x83F0, 0x83F0, 0x83E0, 0x83E0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, + 0x83E0, 0x83E0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8400, 0x8400, 0x8410, 0x8400, 0x8400, 0x8400, 0x8400, + 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8410, 0x8420, 0x8420, 0x8430, + 0x8430, 0x8440, 0x8450, 0x8460, 0x8480, 0x8490, 0x84B0, 0x84D0, 0x84F0, 0x8520, 0x85A0, 0x86F0, 0x8B10, 0x9640, 0xA3A0, 0xB1D0, + 0xBFD0, 0xCDB0, 0xDBB0, 0xE8E0, 0xF6E0, 0x0240, 0x0B90, 0x13E0, 0x1A40, 0x1FF0, 0x2420, 0x2880, 0x2C40, 0x2F10, 0x3110, 0x3260, + 0x33A0, 0x3590, 0x3930, 0x3F30, 0x4900, 0x5650, 0x6770, 0x7810, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F40, 0x7F10, 0x7F20, 0x7F40, + 0x7F30, 0x7F30, 0x7F00, 0x7F40, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F20, 0x7F20, 0x7F20, + 0x7F10, 0x7F20, 0x7F20, 0x7EF0, 0x66D0, 0x4E00, 0x36C0, 0x21C0, 0x1030, 0x00E0, 0xF090, 0xDED0, 0xC7D0, 0xAB10, 0x8C00, 0x84F0, + 0x84A0, 0x8480, 0x8470, 0x8460, 0x8460, 0x8460, 0x8460, 0x8470, 0x8470, 0x8480, 0x8490, 0x84A0, 0x84F0, 0x84E0, 0x8520, 0x85F0, + 0x8990, 0x96D0, 0xA570, 0xB2B0, 0xBEA0, 0xCA80, 0xD410, 0xDC70, 0xE500, 0xEE10, 0xF790, 0x01B0, 0x0B50, 0x14D0, 0x1D60, 0x2500, + 0x2B10, 0x3050, 0x3690, 0x3BA0, 0x41C0, 0x4840, 0x4E30, 0x5620, 0x5C90, 0x6300, 0x6820, 0x6BC0, 0x6ED0, 0x7070, 0x72A0, 0x74F0, + 0x7770, 0x7AA0, 0x7D00, 0x7ED0, 0x7F10, 0x7F20, 0x7F20, 0x7F00, 0x7F30, 0x7F00, 0x7F10, 0x7EB0, 0x7EC0, 0x7ED0, 0x7EB0, 0x7EE0, + 0x7F10, 0x7EA0, 0x7EA0, 0x7ED0, 0x7F10, 0x7F10, 0x7EA0, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7E70, 0x7EF0, 0x7F10, 0x7F20, 0x7F20, + 0x7F00, 0x7F10, 0x7EF0, 0x7F10, 0x7F20, 0x7F20, 0x7F50, 0x7F10, 0x7F10, 0x7EE0, 0x7EF0, 0x7F50, 0x7EF0, 0x7F20, 0x7EF0, 0x7F10, + 0x7F70, 0x7F00, 0x7EF0, 0x7F10, 0x7F20, 0x7F80, 0x7EF0, 0x7EB0, 0x7F00, 0x7EF0, 0x7F50, 0x7EE0, 0x7EA0, 0x7EF0, 0x7F10, 0x7F40, + 0x7EE0, 0x7E90, 0x7F00, 0x7EE0, 0x7EF0, 0x7F10, 0x7E70, 0x7EF0, 0x7EF0, 0x7F20, 0x7F20, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7F00, + 0x7EC0, 0x7F10, 0x7F10, 0x7F20, 0x7F40, 0x7F10, 0x7F50, 0x7F00, 0x7F40, 0x7F40, 0x7F10, 0x7F70, 0x7EE0, 0x7EF0, 0x7EF0, 0x7F00, + 0x7F60, 0x7F10, 0x7F20, 0x7F00, 0x7F00, 0x7F70, 0x7F10, 0x7EB0, 0x7EE0, 0x7ED0, 0x7F30, 0x7F00, 0x7EC0, 0x7ED0, 0x7EE0, 0x7F20, + 0x7F10, 0x7E90, 0x7EB0, 0x7ED0, 0x7F10, 0x7F00, 0x7E80, 0x7ED0, 0x7F10, 0x7F20, 0x7F20, 0x7F00, 0x7F00, 0x7F20, 0x7F10, 0x7F10, + 0x7F00, 0x7F20, 0x7F10, 0x7F10, 0x7F10, 0x7EE0, 0x7F40, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F30, 0x7EE0, 0x7EF0, 0x7F10, 0x7EE0, + 0x7F50, 0x7EF0, 0x7F20, 0x7F00, 0x7F10, 0x7F70, 0x7EB0, 0x7F10, 0x7F10, 0x7F00, 0x7F60, 0x7EE0, 0x7EB0, 0x7F10, 0x7F20, 0x7F40, + 0x7F00, 0x7EC0, 0x7F10, 0x7F00, 0x7F20, 0x7ED0, 0x7EB0, 0x7F10, 0x7F20, 0x7EF0, 0x7F10, 0x7EB0, 0x7F20, 0x7F10, 0x7F10, 0x7F10, + 0x7F00, 0x7F40, 0x7F00, 0x7F00, 0x7F10, 0x7F00, 0x7F60, 0x7E90, 0x7F00, 0x7EF0, 0x7EF0, 0x7F10, 0x7F00, 0x7F40, 0x7F00, 0x7F10, + 0x7F20, 0x7EF0, 0x7F80, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F70, 0x7EE0, 0x7F10, 0x7EF0, 0x7EE0, 0x7F70, 0x7F10, 0x7F00, 0x7F00, + 0x7EE0, 0x7F50, 0x7F00, 0x7EE0, 0x7ED0, 0x7EB0, 0x7F30, 0x7EF0, 0x7E90, 0x7ED0, 0x7F00, 0x7F30, 0x7F20, 0x7EA0, 0x7ED0, 0x7F10, + 0x7F10, 0x7F00, 0x7EC0, 0x7F10, 0x7EF0, 0x7F10, 0x7F20, 0x7EC0, 0x7F10, 0x7F10, 0x7F10, 0x7EE0, 0x7EF0, 0x7F10, 0x7F00, 0x7F00, + 0x7EF0, 0x7F10, 0x7F60, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7F50, 0x7F10, 0x7F20, 0x7EE0, 0x7EF0, 0x7F80, 0x7F00, 0x7EE0, 0x7EF0, + 0x7F10, 0x7F70, 0x7F00, 0x7ED0, 0x7F10, 0x7EF0, 0x7F20, 0x7ED0, 0x7EC0, 0x7EF0, 0x7F10, 0x7F30, 0x7EE0, 0x7EC0, 0x7F10, 0x7F00, + 0x7EF0, 0x7ED0, 0x7E90, 0x7F00, 0x7EE0, 0x7EF0, 0x7F10, 0x7F00, 0x7F40, 0x7F10, 0x7F20, 0x7F20, 0x7F00, 0x7F30, 0x7F00, 0x7F00, + 0x7EF0, 0x7F10, 0x7F80, 0x7EF0, 0x7F20, 0x7F20, 0x7F00, 0x7F90, 0x7EF0, 0x7F00, 0x7EE0, 0x7EF0, 0x7F70, 0x7EE0, 0x7EF0, 0x7EF0, + 0x7F00, 0x7F60, 0x7F10, 0x7EB0, 0x7EB0, 0x7EF0, 0x7F60, 0x7EF0, 0x7EC0, 0x7ED0, 0x7F00, 0x7F20, 0x7F10, 0x7E90, 0x7EE0, 0x7EE0, + 0x7F10, 0x7F10, 0x7E90, 0x7E60, 0x7EF0, 0x7F10, 0x7F20, 0x7E90, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F00, 0x7F20, 0x7EE0, 0x7EF0, + 0x7F00, 0x7EE0, 0x7F40, 0x7EF0, 0x7F20, 0x7F40, 0x7EC0, 0x7F10, 0x7EF0, 0x7F10, 0x7F00, 0x7EC0, 0x7EF0, 0x7F10, 0x7F20, 0x7F40, + 0x7F00, 0x7F30, 0x7EF0, 0x7F20, 0x7F20, 0x7F00, 0x7F90, 0x7F10, 0x7F10, 0x7EF0, 0x7EF0, 0x7F70, 0x7EE0, 0x7EF0, 0x7F10, 0x7F00, + 0x7F60, 0x7F10, 0x7EB0, 0x7EB0, 0x7EF0, 0x7F60, 0x7EF0, 0x7ED0, 0x7EF0, 0x7F00, 0x7F40, 0x7EF0, 0x7E90, 0x7EE0, 0x7EE0, 0x7F10, + 0x7F10, 0x7E70, 0x7EC0, 0x7EF0, 0x7F10, 0x7F20, 0x7E90, 0x7EF0, 0x7F20, 0x7F20, 0x7F10, 0x7F00, 0x7F20, 0x7F20, 0x7EF0, 0x7F10, + 0x7EC0, 0x7F40, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F50, 0x7F10, 0x7F40, 0x7F10, 0x7F00, 0x7F60, 0x7EF0, 0x7F10, 0x7F10, 0x7A60, + 0x7140, 0x67E0, 0x5F90, 0x57B0, 0x4FF0, 0x47C0, 0x4070, 0x3830, 0x3160, 0x29E0, 0x21E0, 0x1A40, 0x1190, 0x0890, 0xFE70, 0xF3D0, + 0xEA50, 0xE040, 0xD6C0, 0xCD30, 0xC470, 0xBC40, 0xB410, 0xACF0, 0xA6E0, 0xA110, 0x9D60, 0x99F0, 0x9830, 0x9720, 0x96D0, 0x97E0, + 0x9960, 0x9BC0, 0x9ED0, 0xA200, 0xA520, 0xA8C0, 0xAC90, 0xB100, 0xB500, 0xB950, 0xBD30, 0xC080, 0xC550, 0xC900, 0xCBD0, 0xCE10, + 0xD090, 0xD240, 0xD3F0, 0xD5D0, 0xD750, 0xD8C0, 0xD9F0, 0xDAD0, 0xDBC0, 0xDC40, 0xDD00, 0xDDD0, 0xDF10, 0xE080, 0xE210, 0xE380, + 0xE5B0, 0xE760, 0xE8C0, 0xEAF0, 0xED60, 0xF140, 0xF540, 0xF990, 0xFDC0, 0x0110, 0x0480, 0x0820, 0x0B40, 0x0E30, 0x1090, 0x12A0, + 0x15C0, 0x1800, 0x1990, 0x1BA0, 0x1D80, 0x1E90, 0x1F50, 0x2000, 0x20F0, 0x2180, 0x2240, 0x2370, 0x23A0, 0x23B0, 0x2400, 0x24C0, + 0x24D0, 0x2470, 0x24C0, 0x2490, 0x2430, 0x2490, 0x2340, 0x21E0, 0x1FD0, 0x1CD0, 0x19E0, 0x1650, 0x1290, 0x0EE0, 0x0980, 0x0310, + 0xFBF0, 0xF3C0, 0xEAC0, 0xE0E0, 0xD820, 0xD050, 0xC900, 0xC2A0, 0xBCA0, 0xB6E0, 0xB110, 0xABB0, 0xA700, 0xA250, 0x9E40, 0x9950, + 0x94E0, 0x90C0, 0x8D70, 0x8AE0, 0x88B0, 0x8790, 0x8680, 0x85E0, 0x8590, 0x8540, 0x8520, 0x8500, 0x84F0, 0x84E0, 0x84D0, 0x84D0, + 0x84C0, 0x84C0, 0x84B0, 0x84B0, 0x84B0, 0x84A0, 0x84A0, 0x8490, 0x8490, 0x8490, 0x8490, 0x84A0, 0x8480, 0x8480, 0x8480, 0x8480, + 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, + 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8470, 0x8470, 0x8470, 0x8470, + 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8460, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8460, 0x8470, + 0x8470, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8450, 0x8460, 0x8460, 0x8450, 0x8450, 0x8450, 0x8450, + 0x8460, 0x8460, 0x8460, 0x8450, 0x8460, 0x8460, 0x8460, 0x8470, 0x8470, 0x8470, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, + 0x8460, 0x8460, 0x8470, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, + 0x8470, 0x8470, 0x8470, 0x8470, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8470, 0x8480, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, + 0x8470, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8440, 0x8440, 0x8450, 0x8460, + 0x8450, 0x8430, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8430, 0x8440, 0x8470, 0x8430, 0x8430, 0x8430, 0x8470, + 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8450, 0x8460, 0x8420, 0x8420, 0x8420, 0x8420, 0x8410, 0x8410, 0x8410, 0x8400, + 0x8400, 0x8400, 0x8400, 0x83F0, 0x8400, 0x83F0, 0x83E0, 0x83E0, 0x8400, 0x83E0, 0x83D0, 0x83D0, 0x83D0, 0x8410, 0x83C0, 0x83C0, + 0x83C0, 0x83A0, 0x83C0, 0x83C0, 0x83C0, 0x83D0, 0x83D0, 0x83D0, 0x83C0, 0x83D0, 0x83D0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83F0, + 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8400, 0x8410, 0x8410, 0x8410, 0x8420, 0x8420, 0x8430, 0x8430, 0x8430, 0x8440, 0x8440, 0x8450, + 0x8450, 0x8460, 0x8460, 0x8470, 0x8470, 0x8480, 0x8490, 0x8490, 0x84A0, 0x84B0, 0x84C0, 0x84E0, 0x84F0, 0x8520, 0x85A0, 0x86E0, + 0x8A40, 0x93B0, 0x9F50, 0xA8D0, 0xB1D0, 0xBA40, 0xC200, 0xC8F0, 0xD020, 0xD5A0, 0xD980, 0xDD20, 0xDF70, 0xE190, 0xE240, 0xE120, + 0xDE30, 0xD7A0, 0xD050, 0xC480, 0xB4B0, 0xA1F0, 0x8D30, 0x8580, 0x84D0, 0x84A0, 0x8480, 0x8470, 0x8470, 0x8460, 0x8450, 0x8450, + 0x8440, 0x8440, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8460, 0x8460, 0x8480, 0x8490, 0x84C0, 0x8530, 0x89C0, + 0xA990, 0xC7D0, 0xE3D0, 0xFDF0, 0x12E0, 0x2440, 0x3190, 0x3D00, 0x4470, 0x48F0, 0x4BF0, 0x4D30, 0x4DF0, 0x4E10, 0x4DD0, 0x4EC0, + 0x4F40, 0x5150, 0x5490, 0x5760, 0x5C00, 0x60A0, 0x65F0, 0x6BA0, 0x7180, 0x7880, 0x7DA0, 0x7F40, 0x7F10, 0x7F10, 0x7F40, 0x7F00, + 0x7F30, 0x7F00, 0x7F10, 0x7F10, 0x7F10, 0x7F70, 0x7F00, 0x7F20, 0x7F40, 0x7F10, 0x7F70, 0x7EE0, 0x7EF0, 0x7EF0, 0x7F00, 0x7F60, + 0x7EF0, 0x7F10, 0x7F00, 0x7F00, 0x7F70, 0x7F10, 0x7EB0, 0x7EC0, 0x7ED0, 0x7F30, 0x7F20, 0x7E90, 0x7ED0, 0x7EE0, 0x7F20, 0x7F10, + 0x7E90, 0x7EE0, 0x7EE0, 0x7F10, 0x7F10, 0x7E70, 0x7EE0, 0x7F10, 0x7F20, 0x7F20, 0x7F00, 0x7F00, 0x7F40, 0x7F10, 0x7F10, 0x7F00, + 0x7F20, 0x7EF0, 0x7F10, 0x7F10, 0x7F00, 0x7F20, 0x7F20, 0x7EF0, 0x7F10, 0x7EF0, 0x7F60, 0x7EF0, 0x7F10, 0x7F10, 0x7F00, 0x7F60, + 0x7F10, 0x7F10, 0x7F00, 0x7EF0, 0x7F80, 0x7F00, 0x7F10, 0x7EF0, 0x7EF0, 0x7F60, 0x7ED0, 0x7EB0, 0x7F00, 0x7F00, 0x7F10, 0x7EF0, + 0x7EA0, 0x7F00, 0x7F10, 0x7F30, 0x7EE0, 0x7EC0, 0x7F10, 0x7F10, 0x7EF0, 0x7F10, 0x7EB0, 0x7F20, 0x7F00, 0x7F10, 0x7F10, 0x7F00, + 0x7F40, 0x7F10, 0x7F00, 0x7F20, 0x7EF0, 0x7F70, 0x7F20, 0x7F40, 0x7F10, 0x7F10, 0x7F60, 0x7F10, 0x7F10, 0x7EF0, 0x7EE0, 0x7F80, + 0x7F10, 0x7F00, 0x7F00, 0x7F00, 0x7F80, 0x7F10, 0x7EF0, 0x7EE0, 0x7EE0, 0x7F50, 0x7F10, 0x7EA0, 0x7EE0, 0x7ED0, 0x7F30, 0x7F20, + 0x7EC0, 0x7ED0, 0x7EF0, 0x7F00, 0x7EF0, 0x7E90, 0x7EB0, 0x7ED0, 0x7F10, 0x7F20, 0x7EC0, 0x7F00, 0x7F10, 0x7F10, 0x7F20, 0x7340, + 0x5A80, 0x4030, 0x2540, 0x0B50, 0xF2D0, 0xDC30, 0xC6C0, 0xB1A0, 0xA050, 0x91F0, 0x8990, 0x86B0, 0x85D0, 0x85A0, 0x85C0, 0x8650, + 0x88E0, 0x91F0, 0xA270, 0xB5A0, 0xCB70, 0xE250, 0xF9B0, 0x1150, 0x26A0, 0x3BB0, 0x4C10, 0x5960, 0x63D0, 0x6AD0, 0x6FF0, 0x7340, + 0x73D0, 0x7390, 0x71C0, 0x6DD0, 0x69B0, 0x6400, 0x5DF0, 0x5680, 0x4DB0, 0x4520, 0x3C00, 0x3350, 0x2BA0, 0x2460, 0x1ED0, 0x1900, + 0x1420, 0x0E70, 0xF610, 0xEF50, 0xE8A0, 0xE400, 0xE090, 0xDFB0, 0xE2E0, 0xE820, 0xEF40, 0xF720, 0xFD40, 0x0190, 0x0380, 0x0390, + 0x02F0, 0x0240, 0x02D0, 0x0450, 0x06F0, 0x0B40, 0x11C0, 0x19D0, 0x2160, 0x29E0, 0x3140, 0x3830, 0x3FE0, 0x4820, 0x4F90, 0x5770, + 0x60B0, 0x6990, 0x7170, 0x7840, 0x7D40, 0x7EB0, 0x7F00, 0x7F00, 0x7F40, 0x7EF0, 0x7EB0, 0x7F00, 0x7F10, 0x7F10, 0x7EF0, 0x7F00, + 0x7F00, 0x7EF0, 0x7ED0, 0x7F20, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F10, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F20, 0x7F20, 0x7F20, + 0x7F20, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F30, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F50, 0x7F30, 0x7F30, 0x7F20, 0x7F40, + 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F10, 0x7F30, 0x7F20, 0x7F40, 0x7F10, 0x7F30, + 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F20, + 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F30, 0x7F20, + 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F10, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, + 0x7F30, 0x7F30, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7EF0, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F10, + 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F40, 0x7F20, 0x7F30, 0x7F30, 0x7F20, + 0x7F50, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F40, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, + 0x7F10, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F20, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F40, + 0x7F30, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F10, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, + 0x7F20, 0x7F20, 0x7ED0, 0x7F10, 0x7F20, 0x7EF0, 0x7EF0, 0x7F00, 0x7F40, 0x7F00, 0x7F10, 0x7EF0, 0x7EC0, 0x7ED0, 0x7EB0, 0x7F20, + 0x7EC0, 0x7EF0, 0x65D0, 0x4360, 0x1E80, 0xF5A0, 0xCFE0, 0xA960, 0x8A20, 0x84F0, 0x84B0, 0x8490, 0x8480, 0x8490, 0x8460, 0x8460, + 0x8470, 0x8460, 0x8450, 0x8460, 0x8490, 0x8470, 0x8480, 0x8490, 0x84A0, 0x84C0, 0x8500, 0x85F0, 0x8E80, 0xA650, 0xBBF0, 0xCF30, + 0xE1B0, 0xF1B0, 0xFFB0, 0x0CE0, 0x1A00, 0x25B0, 0x3120, 0x3B80, 0x4450, 0x4CB0, 0x52C0, 0x5800, 0x5B40, 0x5DB0, 0x5F30, 0x5FE0, + 0x6090, 0x6110, 0x60F0, 0x6130, 0x6120, 0x61C0, 0x60F0, 0x6050, 0x6030, 0x5F70, 0x5FD0, 0x5EB0, 0x5CE0, 0x5A90, 0x5710, 0x5360, + 0x4EA0, 0x4950, 0x4350, 0x3CE0, 0x36C0, 0x3050, 0x2A30, 0x2440, 0x1CE0, 0x1650, 0x0F30, 0x0780, 0x00F0, 0xF9A0, 0xF420, 0xEEA0, + 0xEA10, 0xE6B0, 0xE2A0, 0xDF60, 0xDB30, 0xD670, 0xD200, 0xCD80, 0xC9A0, 0xC670, 0xC320, 0xC030, 0xBC80, 0xB960, 0xB6D0, 0xB380, + 0xB170, 0xAF00, 0xAC00, 0xA950, 0xA580, 0xA280, 0x9FE0, 0x9DC0, 0x9B10, 0x98A0, 0x9670, 0x9450, 0x9240, 0x90E0, 0x8F90, 0x8E60, + 0x8D20, 0x8BF0, 0x8BA0, 0x8B10, 0x8B30, 0x8B50, 0x8B50, 0x8BB0, 0x8BB0, 0x8B90, 0x8BB0, 0x8C10, 0x8D20, 0x8EA0, 0x8FD0, 0x9050, + 0x90A0, 0x91C0, 0x9270, 0x9470, 0x9630, 0x97A0, 0x9980, 0x9AF0, 0x9D00, 0x9FB0, 0xA210, 0xA510, 0xA880, 0xABC0, 0xAE40, 0xB160, + 0xB580, 0xB9C0, 0xBE70, 0xC2B0, 0xC670, 0xCB20, 0xCFB0, 0xD410, 0xD8F0, 0xDD80, 0xE230, 0xE690, 0xEA90, 0xEF20, 0xF3D0, 0xF830, + 0xFBE0, 0xFF60, 0x0350, 0x0770, 0x0B20, 0x0E70, 0x11F0, 0x15B0, 0x18E0, 0x1C30, 0x1EF0, 0x2170, 0x24C0, 0x2790, 0x2C50, 0x3100, + 0x3610, 0x3A70, 0x3D60, 0x4150, 0x4510, 0x4900, 0x4E20, 0x5380, 0x58D0, 0x5D70, 0x60A0, 0x6C80, 0x6F70, 0x71F0, 0x7360, 0x7550, + 0x7690, 0x7730, 0x7840, 0x7880, 0x7890, 0x78A0, 0x77B0, 0x7800, 0x7740, 0x7750, 0x7710, 0x75F0, 0x7520, 0x73C0, 0x7300, 0x7240, + 0x70C0, 0x6F30, 0x6D20, 0x6B80, 0x69E0, 0x67D0, 0x66F0, 0x6520, 0x6350, 0x6130, 0x5F60, 0x5D80, 0x5B80, 0x59B0, 0x5840, 0x5740, + 0x56D0, 0x5560, 0x53F0, 0x5310, 0x52B0, 0x5300, 0x5260, 0x51D0, 0x50F0, 0x4F70, 0x4DF0, 0x4D00, 0x4B70, 0x4B10, 0x4A10, 0x49B0, + 0x4960, 0x47E0, 0x46F0, 0x4540, 0x4490, 0x43A0, 0x4180, 0x4010, 0x3D90, 0x3B20, 0x3800, 0x3570, 0x32F0, 0x2FB0, 0x2C30, 0x2820, + 0x23C0, 0x1FF0, 0x1BC0, 0x1780, 0x1390, 0x0EA0, 0x0AA0, 0x0690, 0x0350, 0x0020, 0xFD40, 0xFB90, 0xF9E0, 0xF860, 0xF770, 0xF730, + 0xF7F0, 0xF940, 0xFB30, 0xFE90, 0x01E0, 0x0620, 0x0AF0, 0x10C0, 0x1680, 0x1B10, 0x2100, 0x26E0, 0x2BF0, 0x31F0, 0x3730, 0x3E00, + 0x43F0, 0x49B0, 0x4FA0, 0x5400, 0x5810, 0x5BB0, 0x5F60, 0x6380, 0x6680, 0x6960, 0x6B80, 0x6CD0, 0x6F10, 0x6FA0, 0x70C0, 0x7190, + 0x7230, 0x72C0, 0x7280, 0x7380, 0x7420, 0x7500, 0x76F0, 0x7890, 0x7930, 0x7940, 0x78D0, 0x7870, 0x7800, 0x7610, 0x7270, 0x6C60, + 0x65A0, 0x5D90, 0x5690, 0x4F60, 0x4770, 0x40A0, 0x38E0, 0x3070, 0x27E0, 0x2060, 0x1B70, 0x1910, 0x19F0, 0x1D60, 0x21D0, 0x2630, + 0x28B0, 0x2970, 0x2950, 0x2790, 0x25E0, 0x2320, 0x20B0, 0x1F60, 0x1D20, 0x1AD0, 0x1690, 0x10F0, 0x0960, 0xFF80, 0xF410, 0xE570, + 0xD570, 0xC510, 0xB380, 0xA140, 0x8F50, 0x86D0, 0x8510, 0x84D0, 0x84B0, 0x8490, 0x84B0, 0x8470, 0x8460, 0x8460, 0x8450, 0x8450, + 0x8450, 0x8460, 0x8460, 0x8460, 0x8460, 0x8470, 0x8470, 0x8470, 0x8470, 0x8460, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, + 0x8460, 0x8450, 0x8450, 0x8440, 0x8440, 0x8470, 0x8430, 0x8430, 0x8430, 0x8410, 0x8420, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, + 0x8430, 0x8400, 0x8400, 0x8400, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x8410, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, + 0x83F0, 0x83F0, 0x83E0, 0x83F0, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, + 0x8420, 0x8420, 0x8420, 0x8420, 0x8430, 0x8430, 0x8430, 0x8430, 0x8440, 0x8440, 0x8440, 0x8440, 0x8410, 0x8450, 0x8450, 0x8460, + 0x8460, 0x8470, 0x8470, 0x8470, 0x8480, 0x8480, 0x8490, 0x8490, 0x8490, 0x84A0, 0x84B0, 0x84B0, 0x84C0, 0x84D0, 0x84E0, 0x8500, + 0x8530, 0x8590, 0x8640, 0x8890, 0x8C90, 0x9340, 0x9AC0, 0xA190, 0xA8C0, 0xAFA0, 0xB5C0, 0xBCA0, 0xC2B0, 0xC870, 0xCDA0, 0xD1E0, + 0xD5C0, 0xD9A0, 0xDDE0, 0xE230, 0xE6B0, 0xEAA0, 0xED70, 0xF010, 0xF1F0, 0xF3D0, 0xF520, 0xF6A0, 0xF780, 0xF830, 0xF8A0, 0xF8F0, + 0xF960, 0xFA60, 0xF990, 0xF7F0, 0xF760, 0xF6F0, 0xF6C0, 0xF7F0, 0xFA30, 0xFBF0, 0xFEA0, 0x0030, 0x01C0, 0x0320, 0x03D0, 0x03E0, + 0x0300, 0x0240, 0x00D0, 0xFF70, 0xFEA0, 0xFDC0, 0xFCD0, 0xFBA0, 0xFA90, 0xFAA0, 0xFB60, 0xFBE0, 0xFCF0, 0xFDD0, 0xFEB0, 0xFEE0, + 0xFF80, 0xFF70, 0xFF10, 0xFF40, 0xFFD0, 0x01D0, 0x05B0, 0x0BE0, 0x1360, 0x1C10, 0x24A0, 0x2B70, 0x3050, 0x3400, 0x37B0, 0x3AD0, + 0x3E90, 0x4380, 0x48C0, 0x4E90, 0x53B0, 0x5760, 0x5B10, 0x5F50, 0x62B0, 0x6620, 0x69F0, 0x6E70, 0x7270, 0x75C0, 0x7870, 0x7AB0, + 0x7CE0, 0x7E60, 0x7F10, 0x7F10, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, + 0x7F40, 0x7F30, 0x7BE0, 0x7320, 0x6A60, 0x5FF0, 0x53F0, 0x44C0, 0x3470, 0x2150, 0x0B50, 0xF260, 0xD6C0, 0xB8F0, 0x99E0, 0x86E0, + 0x84E0, 0x84B0, 0x8490, 0x8480, 0x8470, 0x8470, 0x8460, 0x8460, 0x8460, 0x8460, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8480, + 0x8480, 0x8480, 0x8490, 0x8490, 0x84A0, 0x84A0, 0x84B0, 0x84C0, 0x84C0, 0x84D0, 0x84E0, 0x84F0, 0x8500, 0x8510, 0x8540, 0x8580, + 0x85E0, 0x8660, 0x8750, 0x8820, 0x8990, 0x8B10, 0x8C40, 0x8CC0, 0x8D20, 0x8CD0, 0x8B70, 0x8A00, 0x8850, 0x86E0, 0x85E0, 0x8540, + 0x8500, 0x84D0, 0x84D0, 0x84A0, 0x8490, 0x8480, 0x8460, 0x8450, 0x8450, 0x8440, 0x8430, 0x8430, 0x8420, 0x8420, 0x8420, 0x8410, + 0x8410, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, + 0x8400, 0x8400, 0x8400, 0x8400, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8420, 0x8420, 0x8420, 0x8420, + 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, + 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8480, 0x8430, 0x8430, 0x8440, 0x8430, 0x8440, + 0x8430, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8450, 0x8450, 0x8450, 0x8480, 0x8450, 0x8450, 0x8450, + 0x8450, 0x8450, 0x8450, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8480, 0x8480, + 0x8490, 0x8490, 0x84B0, 0x84B0, 0x84C0, 0x84E0, 0x8510, 0x8570, 0x8690, 0x8A20, 0x9430, 0x9F80, 0xAA10, 0xB350, 0xBCA0, 0xC500, + 0xCC40, 0xD430, 0xDC00, 0xE300, 0xEB20, 0xF220, 0xFA30, 0x01D0, 0x0930, 0x11C0, 0x1A00, 0x21B0, 0x29C0, 0x3270, 0x3BF0, 0x4480, + 0x4C80, 0x5440, 0x5B10, 0x6210, 0x67B0, 0x6CE0, 0x7270, 0x76A0, 0x7AE0, 0x7E40, 0x7F70, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F60, + 0x7F10, 0x7F10, 0x7F00, 0x7EE0, 0x7F70, 0x7EF0, 0x7EE0, 0x7F00, 0x7F10, 0x7F70, 0x7F00, 0x7ED0, 0x7F10, 0x7F00, 0x7F20, 0x7ED0, + 0x7EB0, 0x7EF0, 0x7F10, 0x7F30, 0x7EE0, 0x7E90, 0x7F10, 0x7F00, 0x7EF0, 0x7F10, 0x7E90, 0x7F00, 0x7EF0, 0x7EF0, 0x7F20, 0x7F00, + 0x7F40, 0x7ED0, 0x7F10, 0x7F40, 0x7F00, 0x7F30, 0x7EF0, 0x7F00, 0x7EF0, 0x7F10, 0x7F80, 0x7F00, 0x7F10, 0x7F00, 0x7F10, 0x7F10, + 0x7EC0, 0x7F30, 0x7F00, 0x7F20, 0x7F40, 0x7F00, 0x7F60, 0x7EE0, 0x7F10, 0x7F20, 0x7EF0, 0x7F80, 0x7F10, 0x7F20, 0x7F00, 0x7EF0, + 0x7F70, 0x7EF0, 0x7F10, 0x7EF0, 0x7EE0, 0x7F60, 0x7EF0, 0x7EF0, 0x7F00, 0x7EE0, 0x7F50, 0x7F10, 0x7C90, 0x5530, 0x33E0, 0x16D0, + 0xFE10, 0xE650, 0xCDA0, 0xB100, 0x8E60, 0x8510, 0x84B0, 0x8490, 0x8480, 0x8470, 0x8480, 0x8480, 0x8490, 0x84A0, 0x84C0, 0x84E0, + 0x8510, 0x8580, 0x8660, 0x8850, 0x8D90, 0x97C0, 0xA3F0, 0xAF10, 0xB760, 0xBB10, 0xB740, 0xAE30, 0xA000, 0x8FA0, 0x8700, 0x8520, + 0x84E0, 0x84C0, 0x84B0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x8490, 0x8490, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8490, 0x8490, + 0x84A0, 0x84B0, 0x84C0, 0x84F0, 0x8510, 0x8550, 0x85F0, 0x8760, 0x8B70, 0x9400, 0x9F80, 0xAB40, 0xB780, 0xC370, 0xCF90, 0xDD00, + 0xEB40, 0xFB50, 0x0CD0, 0x1DF0, 0x2D50, 0x3A80, 0x4600, 0x4F70, 0x5800, 0x60C0, 0x68D0, 0x70B0, 0x7880, 0x7DA0, 0x7F20, 0x7F20, + 0x7F50, 0x7F10, 0x7F00, 0x7EE0, 0x7EF0, 0x7F70, 0x7EE0, 0x7EF0, 0x7F00, 0x7F00, 0x7F60, 0x7F10, 0x7EB0, 0x7EB0, 0x7EF0, 0x7F30, + 0x7F00, 0x7EA0, 0x7ED0, 0x7ED0, 0x7F20, 0x7F20, 0x7E90, 0x7EE0, 0x7ED0, 0x7F10, 0x7F00, 0x7E80, 0x7ED0, 0x7F10, 0x7F20, 0x7F20, + 0x7E90, 0x7F00, 0x7F20, 0x7F10, 0x7F10, 0x7F00, 0x7F20, 0x7F00, 0x7F10, 0x7F00, 0x7EE0, 0x7F40, 0x7F20, 0x7F20, 0x7F10, 0x7F10, + 0x7F30, 0x7EE0, 0x7F10, 0x7F10, 0x7F00, 0x7F40, 0x7EF0, 0x7F10, 0x7F20, 0x7F00, 0x7F70, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7F60, + 0x7ED0, 0x7EB0, 0x7F00, 0x7F20, 0x7F50, 0x7EF0, 0x7EA0, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7EA0, 0x7EF0, 0x7F00, 0x7EF0, 0x7EF0, + 0x7EB0, 0x7F20, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7F20, 0x7EF0, 0x7F60, 0x7F00, 0x7F40, 0x7F10, 0x7F20, + 0x7F60, 0x7EF0, 0x7F10, 0x7EF0, 0x7EE0, 0x7F80, 0x7F10, 0x7F00, 0x7F20, 0x7F00, 0x7F80, 0x7F10, 0x7EF0, 0x7EE0, 0x7EE0, 0x7F50, + 0x7F10, 0x7EE0, 0x7EE0, 0x7ED0, 0x7F30, 0x7F20, 0x7EC0, 0x7ED0, 0x7EF0, 0x7F00, 0x7F10, 0x7E90, 0x7EB0, 0x7EE0, 0x7EF0, 0x7F10, + 0x7EA0, 0x7F20, 0x7F10, 0x7F20, 0x7F20, 0x7EC0, 0x7F10, 0x7F00, 0x7F00, 0x7EF0, 0x7F10, 0x7F60, 0x7F10, 0x7F20, 0x7F20, 0x7F00, + 0x7F50, 0x7F10, 0x7F20, 0x7EF0, 0x7EF0, 0x7F50, 0x7EF0, 0x7F20, 0x7F00, 0x7F10, 0x7F50, 0x7EF0, 0x7EE0, 0x7EF0, 0x7F10, 0x7F70, + 0x7EE0, 0x7ED0, 0x7EF0, 0x7F10, 0x7F20, 0x7F10, 0x7F00, 0x7EF0, 0x7EF0, 0x7EE0, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F00, 0x7340, + 0x56F0, 0x3D50, 0x2850, 0x1980, 0x0FE0, 0x0AF0, 0x0A60, 0x0C10, 0x0FC0, 0x14F0, 0x1B80, 0x2360, 0x2C50, 0x35F0, 0x3FF0, 0x4A40, + 0x5500, 0x5DA0, 0x65A0, 0x6B30, 0x70B0, 0x75B0, 0x79D0, 0x7C90, 0x7E80, 0x7F10, 0x7F30, 0x7F00, 0x7E40, 0x7BB0, 0x77B0, 0x7300, + 0x6EA0, 0x6AC0, 0x6710, 0x62B0, 0x5D00, 0x5510, 0x4A90, 0x3C70, 0x2B20, 0x1760, 0x02F0, 0xECA0, 0xD880, 0xC530, 0xB3F0, 0xA430, + 0x95C0, 0x8B80, 0x8710, 0x8590, 0x8520, 0x84F0, 0x84E0, 0x8460, 0x84D0, 0x84D0, 0x84D0, 0x84F0, 0x8520, 0x85C0, 0x87F0, 0x9090, + 0x9D60, 0xA950, 0xB470, 0xBF80, 0xCA00, 0xD3B0, 0xDC90, 0xE300, 0xE860, 0xEC90, 0xF000, 0xF0F0, 0xF040, 0xEDF0, 0xE930, 0xE180, + 0xD8F0, 0xD020, 0xC780, 0xBFF0, 0xB980, 0xB450, 0xB060, 0xAE50, 0xAE20, 0xAF90, 0xB230, 0xB510, 0xB8F0, 0xBD70, 0xC350, 0xC940, + 0xE1A0, 0xE850, 0xEEB0, 0xF530, 0xFC00, 0x0240, 0x0830, 0x0E00, 0x12E0, 0x1710, 0x1B20, 0x1FA0, 0x23E0, 0x2730, 0x29F0, 0x2CA0, + 0x2EE0, 0x3110, 0x3270, 0x3370, 0x3570, 0x3620, 0x3740, 0x3930, 0x3BD0, 0x3F70, 0x43A0, 0x48B0, 0x4E20, 0x53C0, 0x5910, 0x5EB0, + 0x6570, 0x6B70, 0x7140, 0x76D0, 0x7AF0, 0x7DA0, 0x7EB0, 0x7EF0, 0x7EE0, 0x7E70, 0x7D30, 0x7A30, 0x7620, 0x7110, 0x6AD0, 0x6300, + 0x5A20, 0x50D0, 0x4730, 0x3DE0, 0x3500, 0x2D60, 0x2680, 0x20B0, 0x1C60, 0x18D0, 0x1590, 0x12A0, 0x1070, 0x0F50, 0x1020, 0x11A0, + 0x1400, 0x1710, 0x1B30, 0x2000, 0x2670, 0x2DB0, 0x3570, 0x3C20, 0x4340, 0x49C0, 0x5170, 0x58E0, 0x5F50, 0x6610, 0x6C20, 0x7240, + 0x7740, 0x7AD0, 0x7DB0, 0x7E50, 0x7EB0, 0x7EE0, 0x7EF0, 0x7F10, 0x7F00, 0x7F60, 0x7F10, 0x7F10, 0x7F30, 0x7F20, 0x7F50, 0x7F10, + 0x7F10, 0x7F20, 0x7EF0, 0x7F10, 0x7D80, 0x7A40, 0x7710, 0x7330, 0x6F40, 0x6BD0, 0x6730, 0x6330, 0x5F00, 0x5AE0, 0x5770, 0x5440, + 0x5200, 0x5090, 0x4F30, 0x4EC0, 0x4D40, 0x4CB0, 0x4BB0, 0x4A50, 0x4A10, 0x49A0, 0x49E0, 0x4990, 0x48C0, 0x49E0, 0x4AC0, 0x4CC0, + 0x4E40, 0x4ED0, 0x4FD0, 0x5000, 0x5120, 0x5150, 0x5290, 0x5590, 0x5800, 0x5A10, 0x5B90, 0x5C80, 0x5DE0, 0x5F40, 0x6080, 0x62A0, + 0x63C0, 0x64F0, 0x66A0, 0x6840, 0x69C0, 0x6AD0, 0x6CB0, 0x6DF0, 0x6E60, 0x6E90, 0x6E70, 0x6F80, 0x70F0, 0x72B0, 0x7420, 0x7520, + 0x7650, 0x7650, 0x7670, 0x76C0, 0x7730, 0x7860, 0x7940, 0x79D0, 0x7AF0, 0x7B70, 0x7CC0, 0x7DD0, 0x7E80, 0x7EA0, 0x7E90, 0x7F10, + 0x7F20, 0x7F20, 0x7F10, 0x7ED0, 0x7F20, 0x7EE0, 0x7F10, 0x7F10, 0x7F00, 0x7F40, 0x7EF0, 0x7F20, 0x7F20, 0x7F00, 0x7F90, 0x7F20, + 0x7F40, 0x7F10, 0x7F10, 0x7F60, 0x7EF0, 0x7F10, 0x7F10, 0x7F00, 0x7F90, 0x7F10, 0x7F20, 0x7F00, 0x7F10, 0x7F70, 0x7F00, 0x7EC0, + 0x7ED0, 0x7EE0, 0x7F80, 0x7F10, 0x7EE0, 0x7EE0, 0x7ED0, 0x7F30, 0x7F00, 0x7E70, 0x7ED0, 0x7EB0, 0x7F10, 0x7F00, 0x7E90, 0x7EF0, + 0x7F20, 0x7F20, 0x7F10, 0x7EA0, 0x7F00, 0x7F10, 0x7F10, 0x7F10, 0x7EC0, 0x7F10, 0x7F10, 0x7F20, 0x7EF0, 0x7F00, 0x7F30, 0x7F20, + 0x7F40, 0x7F10, 0x7EF0, 0x7F60, 0x7EF0, 0x7F10, 0x7F00, 0x7EF0, 0x7F50, 0x7F10, 0x7F20, 0x7F00, 0x7F10, 0x7F70, 0x7EF0, 0x7F10, + 0x7EE0, 0x7EF0, 0x7F90, 0x7F00, 0x7EE0, 0x7F10, 0x7F10, 0x7F70, 0x7F00, 0x7EC0, 0x7EF0, 0x7F00, 0x7F40, 0x7ED0, 0x7EB0, 0x7F10, + 0x7ED0, 0x7EF0, 0x7EE0, 0x7F50, 0x7ED0, 0x7EC0, 0x7EF0, 0x7F00, 0x7F20, 0x7EE0, 0x7EB0, 0x7F20, 0x7F00, 0x7F10, 0x7EF0, 0x7E90, + 0x7F00, 0x7EE0, 0x7EF0, 0x7F10, 0x7F00, 0x7F40, 0x7F00, 0x7EF0, 0x7F10, 0x7F00, 0x7F60, 0x7F20, 0x7F10, 0x7F10, 0x7F00, 0x7F70, + 0x7F10, 0x7F10, 0x7EF0, 0x7EE0, 0x7F70, 0x7F10, 0x7F00, 0x7F00, 0x7ED0, 0x7F70, 0x7F20, 0x7ED0, 0x7ED0, 0x7EE0, 0x7EF0, 0x7EF0, + 0x7EB0, 0x7EC0, 0x7ED0, 0x7F30, 0x7F20, 0x7EC0, 0x7ED0, 0x7F10, 0x7F00, 0x7A60, 0x72C0, 0x6BA0, 0x65E0, 0x6050, 0x5C90, 0x5920, + 0x5740, 0x5580, 0x53B0, 0x52F0, 0x5130, 0x51B0, 0x51E0, 0x5210, 0x5310, 0x5400, 0x5440, 0x5490, 0x5410, 0x53E0, 0x5360, 0x5270, + 0x5130, 0x4E00, 0x4970, 0x42C0, 0x3A90, 0x3160, 0x25B0, 0x1990, 0x0BE0, 0xFD60, 0xED90, 0xDCF0, 0xCB60, 0xB800, 0xA2C0, 0x8D00, + 0x85B0, 0x84E0, 0x84B0, 0x8490, 0x8480, 0x8470, 0x8460, 0x8460, 0x8450, 0x8440, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8420, + 0x8410, 0x8420, 0x8410, 0x8420, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, + 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8430, 0x8430, 0x8430, + 0x8430, 0x8430, 0x8430, 0x8430, 0x8440, 0x8440, 0x8440, 0x8440, 0x8450, 0x8450, 0x8450, 0x8450, 0x8460, 0x8460, 0x8460, 0x8480, + 0x8470, 0x8470, 0x8470, 0x8470, 0x8480, 0x8480, 0x8490, 0x8490, 0x84C0, 0x84A0, 0x84A0, 0x84B0, 0x84C0, 0x84C0, 0x84C0, 0x84E0, + 0x84F0, 0x84F0, 0x8510, 0x8560, 0x8560, 0x85D0, 0x85F0, 0x8670, 0x8750, 0x88F0, 0x8B90, 0x8EC0, 0x91B0, 0x94F0, 0x9890, 0x9CA0, + 0xA170, 0xA6D0, 0xAC20, 0xAFF0, 0xB450, 0xB880, 0xBD00, 0xC1F0, 0xC740, 0xCD30, 0xD300, 0xD8D0, 0xDD70, 0xE1E0, 0xE700, 0xEAC0, + 0xEE00, 0xF0D0, 0xF270, 0xF3F0, 0xF500, 0xF6D0, 0xF840, 0xF920, 0xF8F0, 0xF830, 0xF6C0, 0xF5D0, 0xF490, 0xF390, 0xF140, 0xEE40, + 0xEAD0, 0xE710, 0xE400, 0xE140, 0xDEB0, 0xDCB0, 0xDA00, 0xD7F0, 0xD660, 0xD4C0, 0xD310, 0xD210, 0xD0B0, 0xCFE0, 0xCDB0, 0xCC70, + 0xCB00, 0xCB40, 0xCC20, 0xCD30, 0xCF20, 0xD010, 0xD170, 0xD390, 0xD660, 0xD950, 0xDBE0, 0xDE60, 0xE0C0, 0xE350, 0xE660, 0xE940, + 0xEC50, 0xEFC0, 0xF2E0, 0xF5E0, 0xF7B0, 0xF920, 0xF9A0, 0xF910, 0xF8F0, 0xF7D0, 0xF600, 0xF3C0, 0xF0C0, 0xEEC0, 0xEC60, 0xEA90, + 0xE930, 0xE7B0, 0xE710, 0xE5F0, 0xE560, 0xE570, 0xE5F0, 0xE7B0, 0xE9D0, 0xEB80, 0xEE40, 0xF110, 0xF430, 0xF770, 0xFB00, 0xFD90, + 0xFFF0, 0x0230, 0x0540, 0x08D0, 0x0CC0, 0x1140, 0x1580, 0x19D0, 0x1E60, 0x2350, 0x2910, 0x30E0, 0x38E0, 0x4180, 0x4B10, 0x5590, + 0x6020, 0x6BC0, 0x76D0, 0x7E90, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F30, 0x7F40, 0x7F30, 0x7F20, 0x7F40, + 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F40, 0x7F30, 0x7F40, 0x7F30, 0x7F30, 0x7F40, 0x7F30, 0x7F30, 0x7F30, 0x7F40, 0x7F40, 0x7F30, + 0x7F30, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F40, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F20, 0x7F20, 0x7B70, 0x74B0, 0x6D30, + 0x6560, 0x5CF0, 0x5490, 0x4C60, 0x44C0, 0x3E30, 0x3880, 0x3330, 0x2E70, 0x2AD0, 0x26F0, 0x2440, 0x2200, 0x2070, 0x2010, 0x2100, + 0x2250, 0x24D0, 0x28F0, 0x2E30, 0x3390, 0x3940, 0x3E90, 0x4370, 0x45E0, 0x46C0, 0x4540, 0x4240, 0x3D90, 0x3830, 0x32E0, 0x2DD0, + 0x28A0, 0x2440, 0x2000, 0x1C60, 0x1920, 0x15E0, 0x1320, 0x1080, 0x0DF0, 0x0AE0, 0x0830, 0x0530, 0x02F0, 0x0080, 0xFDF0, 0xFA50, + 0xF690, 0xF230, 0xEDE0, 0xE950, 0xE550, 0xE120, 0xDD80, 0xD9F0, 0xD7A0, 0xD5D0, 0xD480, 0xD350, 0xD260, 0xD1A0, 0xD0D0, 0xD030, + 0xCFA0, 0xCF20, 0xCDD0, 0xCC80, 0xCA40, 0xC750, 0xC450, 0xC000, 0xBBC0, 0xB6F0, 0xB250, 0xAD00, 0xA800, 0xA280, 0x9D70, 0x98B0, + 0x94F0, 0x91E0, 0x8FC0, 0x8E00, 0x8CC0, 0x8BF0, 0x8BF0, 0x8C10, 0x8C90, 0x8DF0, 0x8EB0, 0x8F90, 0x9040, 0x90F0, 0x90E0, 0x90D0, + 0x8FC0, 0x8E60, 0x8D50, 0x8C00, 0x8A80, 0x8940, 0x8820, 0x8720, 0x8640, 0x85A0, 0x8540, 0x8540, 0x84F0, 0x84E0, 0x84D0, 0x84B0, + 0x84B0, 0x84A0, 0x84A0, 0x8490, 0x8480, 0x8480, 0x8470, 0x8470, 0x8470, 0x8460, 0x8460, 0x8460, 0x8460, 0x8450, 0x8450, 0x8450, + 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8450, 0x8430, 0x8430, 0x8430, 0x8420, 0x8430, + 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8430, 0x8420, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, + 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8440, 0x8430, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8450, 0x8440, + 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8460, 0x8460, 0x8460, 0x8460, + 0x8460, 0x8460, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8480, 0x8480, 0x8490, 0x8490, 0x84A0, 0x84B0, 0x84C0, 0x84E0, + 0x8500, 0x8540, 0x85B0, 0x8670, 0x8750, 0x8800, 0x88A0, 0x89F0, 0x8C00, 0x9010, 0x9400, 0x96E0, 0x9880, 0x9810, 0x95F0, 0x91A0, + 0x8C20, 0x87F0, 0x8600, 0x8530, 0x84F0, 0x8500, 0x84F0, 0x84B0, 0x84B0, 0x84D0, 0x8490, 0x8490, 0x8480, 0x8480, 0x8480, 0x8470, + 0x8470, 0x8480, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8480, 0x8480, 0x8480, 0x8480, 0x84A0, 0x8490, 0x8490, 0x8490, + 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8480, 0x8490, 0x8480, 0x8480, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x84A0, 0x84A0, + 0x84A0, 0x84B0, 0x84B0, 0x84C0, 0x84C0, 0x84C0, 0x84D0, 0x84D0, 0x84E0, 0x84E0, 0x84E0, 0x84E0, 0x84E0, 0x84F0, 0x84F0, 0x84F0, + 0x84F0, 0x8500, 0x8500, 0x8500, 0x84F0, 0x84F0, 0x84E0, 0x84E0, 0x84D0, 0x84D0, 0x84E0, 0x84C0, 0x84D0, 0x84B0, 0x84A0, 0x84A0, + 0x8490, 0x8490, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, + 0x8470, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x84C0, 0x8490, 0x8490, 0x8490, 0x84A0, 0x84A0, 0x84A0, 0x84B0, 0x84B0, 0x84B0, + 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84C0, 0x84C0, 0x84D0, 0x84E0, 0x84E0, 0x8500, 0x8510, 0x8530, 0x8570, 0x85C0, 0x8670, 0x8760, + 0x88A0, 0x8A90, 0x8D00, 0x8FC0, 0x92D0, 0x95D0, 0x9980, 0x9CD0, 0x9FF0, 0xA2E0, 0xA620, 0xA960, 0xAC70, 0xAF40, 0xB1D0, 0xB3B0, + 0xB5B0, 0xB7A0, 0xB970, 0xBC30, 0xBEB0, 0xC1A0, 0xC430, 0xC6B0, 0xC8C0, 0xCA30, 0xCBD0, 0xCD70, 0xCE40, 0xCF00, 0xCFD0, 0xD130, + 0xD270, 0xD330, 0xD460, 0xD540, 0xD640, 0xD750, 0xD730, 0xD820, 0xD780, 0xD7F0, 0xD820, 0xD8A0, 0xD8F0, 0xD860, 0xD760, 0xD670, + 0xD510, 0xD430, 0xD2C0, 0xD150, 0xCFE0, 0xCD70, 0xCB70, 0xC910, 0xC680, 0xC430, 0xC1C0, 0xC010, 0xBEC0, 0xBD10, 0xBBF0, 0xBB30, + 0xBB10, 0xB9F0, 0xB930, 0xB8A0, 0xB8E0, 0xB9E0, 0xBAC0, 0xBC20, 0xBDF0, 0xBE80, 0xBF40, 0xBF30, 0xBF30, 0xBFB0, 0xC010, 0xC180, + 0xC170, 0xC130, 0xBFB0, 0xBDD0, 0xBBE0, 0xB8F0, 0xB610, 0xB3B0, 0xB110, 0xAE20, 0xAAF0, 0xA8D0, 0xA730, 0xA560, 0xA3D0, 0xA2E0, + 0xA270, 0xA2C0, 0xA2B0, 0xA380, 0xA4C0, 0xA620, 0xA780, 0xA940, 0xABB0, 0xAD00, 0xAF10, 0xB1C0, 0xB460, 0xB710, 0xBA50, 0xBDB0, + 0xC160, 0xC5B0, 0xC970, 0xCE60, 0xD2E0, 0xD7B0, 0xDCA0, 0xE160, 0xE640, 0xEAD0, 0xF070, 0xF5D0, 0xFB30, 0x0060, 0x0520, 0x09C0, + 0x0E80, 0x1390, 0x18E0, 0x1DE0, 0x2340, 0x2800, 0x2D30, 0x3270, 0x3800, 0x3E10, 0x4350, 0x47F0, 0x4D80, 0x5190, 0x5630, 0x59A0, + 0x5D40, 0x6150, 0x6500, 0x6800, 0x6AC0, 0x6CB0, 0x6FA0, 0x7220, 0x7540, 0x7790, 0x79E0, 0x7C20, 0x7DF0, 0x7ED0, 0x7F20, 0x7F40, + 0x7F10, 0x7F10, 0x7F60, 0x7EF0, 0x7F10, 0x7F10, 0x7F20, 0x7F70, 0x7F20, 0x7F40, 0x7F10, 0x7F10, 0x7F70, 0x7EE0, 0x7EF0, 0x7F10, + 0x7EF0, 0x7F60, 0x7EF0, 0x7ED0, 0x7F20, 0x7F00, 0x7F50, 0x7ED0, 0x7EA0, 0x7F10, 0x7F10, 0x7F30, 0x7EC0, 0x7EC0, 0x7F10, 0x7F20, + 0x7F20, 0x7F10, 0x7EA0, 0x7F00, 0x7F10, 0x7F10, 0x7F10, 0x7F00, 0x7F40, 0x7F10, 0x7F20, 0x7F10, 0x7F00, 0x7F30, 0x7F20, 0x7F10, + 0x7F10, 0x7F00, 0x7F60, 0x7EF0, 0x7F00, 0x7EF0, 0x7F10, 0x7F80, 0x7F00, 0x7F10, 0x7EF0, 0x7EF0, 0x7F60, 0x7F10, 0x7F10, 0x7EF0, + 0x7EE0, 0x7F60, 0x7F10, 0x7EB0, 0x7EE0, 0x7EE0, 0x7F70, 0x7F20, 0x7EC0, 0x7ED0, 0x7EF0, 0x7EF0, 0x7F00, 0x7EF0, 0x7EF0, 0x7F10, + 0x7F20, 0x7F20, 0x7580, 0x65B0, 0x5630, 0x4680, 0x3910, 0x2D30, 0x2230, 0x18B0, 0x10B0, 0x0A00, 0x0470, 0xFFC0, 0xFBB0, 0xF860, + 0xF550, 0xF250, 0xEFA0, 0xECB0, 0xEA20, 0xE6D0, 0xE380, 0xE050, 0xDD30, 0xDAB0, 0xD940, 0xD810, 0xD820, 0xD840, 0xD890, 0xD950, + 0xD970, 0xD840, 0xD6A0, 0xD370, 0xCF40, 0xCB10, 0xC630, 0xC160, 0xBCB0, 0xB9E0, 0xB8A0, 0xBA30, 0xBEF0, 0xC620, 0xCF90, 0xDAB0, + 0xE660, 0xF390, 0x0200, 0x0FB0, 0x1D80, 0x2B40, 0x38B0, 0x4730, 0x5670, 0x6620, 0x7660, 0x7F20, 0x7F20, 0x7F20, 0x7F30, 0x7F30, + 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F10, 0x7F10, 0x6EA0, 0x3E70, 0x0940, 0xD030, 0x95D0, 0x84E0, 0x8490, 0x8470, 0x8450, 0x8440, + 0x8430, 0x8420, 0x8420, 0x8410, 0x8410, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8410, 0x8410, 0x8420, 0x8420, 0x8430, 0x83E0, + 0x8440, 0x8450, 0x8450, 0x8460, 0x8460, 0x8490, 0x8470, 0x8480, 0x8490, 0x84A0, 0x84B0, 0x84C0, 0x84C0, 0x84D0, 0x84F0, 0x8500, + 0x8500, 0x8510, 0x8510, 0x8510, 0x8500, 0x84F0, 0x84E0, 0x84E0, 0x84D0, 0x84D0, 0x84C0, 0x84C0, 0x84C0, 0x84B0, 0x84B0, 0x84B0, + 0x84B0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84B0, 0x84A0, 0x84B0, 0x84B0, 0x84B0, 0x84C0, 0x84F0, 0x8500, 0x8530, 0x8570, 0x85F0, + 0x86F0, 0x8870, 0x8B30, 0x8DF0, 0x9050, 0x91F0, 0x9200, 0x90D0, 0x8E90, 0x8BD0, 0x8930, 0x8760, 0x8660, 0x85B0, 0x8570, 0x8530, + 0x8510, 0x84F0, 0x84E0, 0x84C0, 0x84F0, 0x84B0, 0x84B0, 0x84B0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84B0, 0x84B0, 0x84D0, 0x84F0, + 0x8570, 0x8780, 0x9360, 0xA3A0, 0xB000, 0xB7C0, 0xB9F0, 0xB630, 0xAD40, 0xA080, 0x93D0, 0x8A70, 0x8690, 0x8560, 0x8500, 0x84E0, + 0x84C0, 0x84B0, 0x84A0, 0x84A0, 0x84A0, 0x8490, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x8490, + 0x84C0, 0x84B0, 0x8480, 0x8480, 0x84A0, 0x8460, 0x8460, 0x8410, 0x8450, 0x8440, 0x8440, 0x8430, 0x8430, 0x8420, 0x8420, 0x8440, + 0x8410, 0x8400, 0x8400, 0x83A0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83E0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, + 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8410, 0x8400, 0x83C0, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8420, 0x8420, + 0x8420, 0x8420, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8440, 0x8440, 0x8440, 0x8450, 0x8450, 0x8460, 0x8460, 0x8470, + 0x8470, 0x8470, 0x8490, 0x84A0, 0x84C0, 0x84E0, 0x8510, 0x8660, 0x8F50, 0xA5B0, 0xBB30, 0xD020, 0xE410, 0xF770, 0x0710, 0x14E0, + 0x2140, 0x2BC0, 0x3350, 0x3940, 0x3D00, 0x3F90, 0x41A0, 0x42E0, 0x4450, 0x44B0, 0x44E0, 0x4470, 0x4480, 0x4650, 0x4900, 0x4C50, + 0x4FA0, 0x5240, 0x55D0, 0x5930, 0x5CB0, 0x5FE0, 0x61D0, 0x62B0, 0x60F0, 0x5C40, 0x5540, 0x4A90, 0x3D20, 0x2C20, 0x17F0, 0x0280, + 0xEC60, 0xD680, 0xC5B0, 0xB8D0, 0xB220, 0xAE90, 0xAE60, 0xAE50, 0xAB20, 0xA3D0, 0x95D0, 0x8900, 0x8530, 0x84D0, 0x84B0, 0x84A0, + 0x8490, 0x8480, 0x8480, 0x8480, 0x8490, 0x8490, 0x84A0, 0x84B0, 0x84E0, 0x8530, 0x87C0, 0x9CA0, 0xB6E0, 0xCCA0, 0xDF40, 0xF040, + 0x0040, 0x10B0, 0x21F0, 0x3340, 0x4560, 0x5910, 0x69B0, 0x7860, 0x7EE0, 0x7F80, 0x7F10, 0x7F00, 0x7F00, 0x7EF0, 0x7F70, 0x7F00, + 0x7ED0, 0x7EF0, 0x7EE0, 0x7EF0, 0x7F00, 0x7F60, 0x7F10, 0x7F10, 0x7EF0, 0x7EE0, 0x7F50, 0x7F10, 0x7EE0, 0x7EE0, 0x7ED0, 0x7F70, + 0x7F20, 0x7EC0, 0x7ED0, 0x7EB0, 0x7F00, 0x7F10, 0x7EA0, 0x7EE0, 0x7F10, 0x7F10, 0x7F00, 0x7EC0, 0x7F10, 0x7F20, 0x7F00, 0x7EF0, + 0x7ED0, 0x7F20, 0x7F20, 0x7F40, 0x7F10, 0x7F10, 0x7F60, 0x7F10, 0x7F10, 0x7F00, 0x7EE0, 0x7F50, 0x7F10, 0x7F20, 0x7F00, 0x7F10, + 0x7F60, 0x7F00, 0x7F10, 0x7F10, 0x7EF0, 0x7F60, 0x7ED0, 0x7EB0, 0x7F00, 0x7EF0, 0x7F70, 0x7F00, 0x7EC0, 0x7F10, 0x7F10, 0x7F20, + 0x7EE0, 0x7E90, 0x7EF0, 0x7EF0, 0x7F30, 0x7F00, 0x7EC0, 0x7F10, 0x7F00, 0x7F00, 0x7F00, 0x7E90, 0x7F10, 0x7F00, 0x7EF0, 0x7F10, + 0x7F00, 0x7F40, 0x7F00, 0x7F10, 0x7F20, 0x7F00, 0x7F50, 0x7F10, 0x7F20, 0x7EF0, 0x7EF0, 0x7F90, 0x7F20, 0x7F10, 0x7EF0, 0x7F10, + 0x7F70, 0x7F00, 0x7F10, 0x7EF0, 0x7EE0, 0x7F60, 0x7EF0, 0x7EE0, 0x7EF0, 0x7EF0, 0x7F70, 0x7F20, 0x7EC0, 0x7EB0, 0x7EB0, 0x7F50, + 0x7F10, 0x7E90, 0x7EB0, 0x7EE0, 0x7F10, 0x7F10, 0x7EA0, 0x7F00, 0x7EB0, 0x7700, 0x70C0, 0x6B80, 0x68B0, 0x6760, 0x6740, 0x6980, + 0x6D20, 0x7260, 0x7810, 0x7D60, 0x7F20, 0x7F00, 0x7F50, 0x7F10, 0x7F20, 0x7EF0, 0x7F10, 0x7F40, 0x7EF0, 0x7F10, 0x7F10, 0x7F20, + 0x7F60, 0x7F10, 0x7EF0, 0x7F10, 0x7F10, 0x7F40, 0x7EE0, 0x7EF0, 0x7F10, 0x7F20, 0x7F70, 0x7EF0, 0x7EF0, 0x7F00, 0x7F00, 0x7F50, + 0x7C30, 0x7670, 0x7160, 0x6C50, 0x66F0, 0x62C0, 0x5E90, 0x5CA0, 0x5A70, 0x58E0, 0x58D0, 0x5930, 0x5AB0, 0x5BE0, 0x5CF0, 0x5EE0, + 0x6000, 0x6250, 0x6390, 0x6360, 0x6300, 0x6200, 0x5FF0, 0x5D20, 0x5940, 0x55B0, 0x5030, 0x49C0, 0x42C0, 0x3AE0, 0x3330, 0x2B60, + 0x23A0, 0x1C90, 0x1490, 0x0D70, 0x06E0, 0x00D0, 0xFB10, 0xF4E0, 0xEF00, 0xE7F0, 0xE110, 0xDA80, 0xD480, 0xCF70, 0xCAD0, 0xC5F0, + 0xC220, 0xBD70, 0xB860, 0xB3A0, 0xAEB0, 0xAA10, 0xA4E0, 0x9FC0, 0x9B00, 0x9630, 0x9290, 0x8F10, 0x8C50, 0x8A50, 0x88F0, 0x8820, + 0x8770, 0x8700, 0x86D0, 0x86C0, 0x86D0, 0x86F0, 0x8730, 0x8790, 0x8840, 0x8990, 0x8BA0, 0x8F10, 0x9480, 0x9A30, 0x9F90, 0xA680, + 0xAD50, 0xB560, 0xBCF0, 0xC590, 0xCD70, 0xD570, 0xDE90, 0xE790, 0xF0C0, 0xFAC0, 0x04B0, 0x0F70, 0x19E0, 0x24C0, 0x2EF0, 0x39F0, + 0x44C0, 0x4ED0, 0x59B0, 0x6360, 0x6C40, 0x7510, 0x7B80, 0x7F00, 0x7F10, 0x7F30, 0x7F00, 0x7EC0, 0x7F10, 0x7F10, 0x7F00, 0x7F00, + 0x7F00, 0x7EF0, 0x7EF0, 0x7F20, 0x7F20, 0x7F00, 0x7F50, 0x7F10, 0x7F20, 0x7F20, 0x7F00, 0x7F10, 0x7EF0, 0x7F20, 0x7F20, 0x7F00, + 0x7F10, 0x7F20, 0x7F40, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F30, 0x7F10, 0x7F00, 0x7F10, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F10, + 0x7F10, 0x7F20, 0x7F30, 0x7F20, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F30, 0x7F40, 0x7F30, 0x7F30, + 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F30, 0x7F30, 0x7F40, 0x7F40, 0x7F30, 0x7F30, 0x7B70, 0x6A40, 0x5870, 0x4380, 0x3080, 0x1EC0, + 0x0E50, 0x0090, 0xF4D0, 0xEBE0, 0xE6A0, 0xE450, 0xE4F0, 0xE7A0, 0xEBF0, 0xF0C0, 0xF4D0, 0xF7D0, 0xF9E0, 0xFAB0, 0xFC40, 0xFD50, + 0xFFB0, 0x01A0, 0x0380, 0x0410, 0x0480, 0x03B0, 0x02A0, 0x0200, 0x01A0, 0x0300, 0x0480, 0x0730, 0x0B20, 0x0FE0, 0x1520, 0x1A00, + 0x1E10, 0x21D0, 0x2500, 0x2950, 0x2D80, 0x3270, 0x36E0, 0x3BC0, 0x4010, 0x44D0, 0x49F0, 0x4E40, 0x52C0, 0x56D0, 0x5AB0, 0x5E20, + 0x6120, 0x6410, 0x6730, 0x69C0, 0x6BD0, 0x6D30, 0x6E40, 0x6E60, 0x6E90, 0x6E90, 0x6E00, 0x6D20, 0x6B90, 0x6A00, 0x67B0, 0x65E0, + 0x63C0, 0x61B0, 0x5F30, 0x5CC0, 0x59A0, 0x55C0, 0x51A0, 0x4DB0, 0x4A10, 0x4660, 0x4340, 0x4040, 0x3D10, 0x3A60, 0x3710, 0x3490, + 0x31E0, 0x2F30, 0x2CC0, 0x2B10, 0x29D0, 0x2920, 0x2860, 0x2730, 0x2610, 0x2520, 0x2440, 0x2410, 0x24F0, 0x25A0, 0x26C0, 0x2770, + 0x2800, 0x2870, 0x28D0, 0x2960, 0x29C0, 0x2AC0, 0x2A50, 0x29B0, 0x2890, 0x2730, 0x2510, 0x2360, 0x21A0, 0x1FD0, 0x1DD0, 0x1C00, + 0x19A0, 0x1760, 0x1420, 0x10F0, 0x0D10, 0x08B0, 0x03C0, 0xFF00, 0xF8F0, 0xF2D0, 0xECC0, 0xE6A0, 0xE110, 0xDC00, 0xD7D0, 0xD420, + 0xD0C0, 0xCE30, 0xCC30, 0xCA00, 0xC7D0, 0xC5B0, 0xC460, 0xC330, 0xC240, 0xC210, 0xC190, 0xC130, 0xC100, 0xC160, 0xC240, 0xC360, + 0xC550, 0xC760, 0xC9B0, 0xCCC0, 0xD000, 0xD430, 0xD980, 0xDDD0, 0xE210, 0xE600, 0xE980, 0xEC90, 0xEF30, 0xF2E0, 0xF550, 0xF8E0, + 0xFB90, 0xFF70, 0x0450, 0x0900, 0x0EB0, 0x1480, 0x1A60, 0x2140, 0x2880, 0x2ED0, 0x3560, 0x3B20, 0x4200, 0x4990, 0x5070, 0x5820, + 0x5ED0, 0x65F0, 0x6BA0, 0x70F0, 0x7680, 0x7A80, 0x7E40, 0x7EF0, 0x7F70, 0x7F00, 0x7F20, 0x7EF0, 0x7EF0, 0x7F60, 0x7EE0, 0x7ED0, + 0x7EF0, 0x7F00, 0x7F20, 0x7F20, 0x7EC0, 0x7EE0, 0x7ED0, 0x7F30, 0x7F00, 0x7E90, 0x7ED0, 0x7F10, 0x7EF0, 0x7EF0, 0x7EB0, 0x7F00, + 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7F20, 0x7F10, 0x7F10, 0x7F00, 0x7EC0, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F40, 0x7F40, + 0x7F10, 0x7F00, 0x7EE0, 0x7F50, 0x7F10, 0x7F20, 0x7F00, 0x7EF0, 0x7F60, 0x7F00, 0x7F10, 0x7F10, 0x7F10, 0x7F60, 0x7EE0, 0x7ED0, + 0x7EF0, 0x7F10, 0x7F70, 0x7F00, 0x7ED0, 0x7F10, 0x7F10, 0x7F30, 0x7EE0, 0x7E90, 0x7EF0, 0x7EE0, 0x7DC0, 0x79B0, 0x7430, 0x6E20, + 0x6700, 0x5E50, 0x5540, 0x4C40, 0x43F0, 0x3CB0, 0x35E0, 0x3160, 0x2D00, 0x2A80, 0x2820, 0x26F0, 0x2750, 0x27C0, 0x2940, 0x2A80, + 0x2AF0, 0x2C10, 0x2C40, 0x2CD0, 0x2E20, 0x2EE0, 0x3090, 0x3280, 0x34E0, 0x36E0, 0x3940, 0x3C90, 0x3EA0, 0x4040, 0x3E50, 0x3BD0, + 0x3900, 0x3610, 0x3390, 0x3020, 0x2C40, 0x2A10, 0x26E0, 0x2330, 0x1FF0, 0x1C40, 0x1950, 0x1630, 0x13A0, 0x11F0, 0x1030, 0x0F10, + 0x0DC0, 0x0BF0, 0x0A10, 0x07B0, 0x0530, 0x0240, 0xFE50, 0xF920, 0xF280, 0xEAB0, 0xE2E0, 0xDAD0, 0xD3C0, 0xCCE0, 0xC670, 0xBFA0, + 0xB840, 0xB0D0, 0xA7E0, 0xA000, 0x9790, 0x8F90, 0x8520, 0x84F0, 0x84E0, 0x84C0, 0x84C0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x8490, + 0x8490, 0x8490, 0x8490, 0x8490, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8490, 0x84B0, 0x8490, 0x8490, 0x8490, 0x8490, + 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x8490, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84C0, 0x84B0, 0x84C0, 0x84C0, 0x84B0, 0x84C0, 0x84C0, + 0x84D0, 0x84D0, 0x84D0, 0x84D0, 0x84D0, 0x84D0, 0x84D0, 0x84D0, 0x84F0, 0x84D0, 0x84D0, 0x84D0, 0x84D0, 0x84E0, 0x84E0, 0x84E0, + 0x84F0, 0x84F0, 0x84F0, 0x84F0, 0x84F0, 0x84E0, 0x84D0, 0x84C0, 0x84C0, 0x84C0, 0x84B0, 0x84B0, 0x84A0, 0x8490, 0x8490, 0x8480, + 0x8470, 0x8470, 0x8470, 0x8460, 0x8450, 0x8450, 0x8450, 0x8440, 0x8440, 0x8440, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, + 0x8430, 0x8430, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8400, 0x8400, 0x8400, + 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x83F0, 0x83F0, 0x83D0, 0x83F0, 0x83E0, 0x83E0, 0x83E0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, + 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83B0, 0x8360, 0x83B0, 0x83A0, 0x83A0, 0x8360, 0x8390, 0x8390, 0x8390, 0x8390, 0x8390, 0x8380, + 0x8380, 0x8380, 0x8380, 0x8380, 0x8380, 0x8380, 0x8380, 0x8370, 0x8380, 0x83A0, 0x8370, 0x8370, 0x8370, 0x8380, 0x8380, 0x8390, + 0x8390, 0x8390, 0x8390, 0x83A0, 0x83A0, 0x8390, 0x83A0, 0x83A0, 0x83A0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83C0, + 0x83C0, 0x83D0, 0x83C0, 0x83C0, 0x83D0, 0x83C0, 0x83C0, 0x83D0, 0x8360, 0x83D0, 0x83D0, 0x83E0, 0x83F0, 0x83E0, 0x83E0, 0x83E0, + 0x83E0, 0x83E0, 0x83D0, 0x83D0, 0x83D0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83D0, 0x83D0, 0x83D0, + 0x83E0, 0x83E0, 0x83F0, 0x8400, 0x8400, 0x8410, 0x8410, 0x8420, 0x8430, 0x8440, 0x8450, 0x8460, 0x8470, 0x8480, 0x84A0, 0x84D0, + 0x84E0, 0x8530, 0x8610, 0x87A0, 0x89A0, 0x8A70, 0x8A00, 0x8900, 0x8770, 0x8660, 0x8590, 0x84E0, 0x8500, 0x84E0, 0x84E0, 0x84D0, + 0x8500, 0x84E0, 0x84E0, 0x84E0, 0x84E0, 0x84F0, 0x84F0, 0x8510, 0x8580, 0x8900, 0xA060, 0xBBC0, 0xD580, 0xEB70, 0xFB20, 0x0860, + 0x1400, 0x2100, 0x3210, 0x4300, 0x5360, 0x6140, 0x69D0, 0x6E30, 0x6D00, 0x6780, 0x5DD0, 0x4F20, 0x3EC0, 0x2B80, 0x15D0, 0xFFE0, + 0xEA00, 0xD620, 0xC240, 0xAD20, 0x93C0, 0x8690, 0x84F0, 0x84B0, 0x8490, 0x8480, 0x8470, 0x8460, 0x8460, 0x8450, 0x8450, 0x8450, + 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8450, 0x8450, 0x8450, 0x8460, 0x8470, 0x84C0, 0x8490, + 0x84A0, 0x84B0, 0x84D0, 0x8500, 0x8600, 0x8DC0, 0xAAA0, 0xC790, 0xE670, 0x06B0, 0x27B0, 0x4900, 0x6820, 0x7ED0, 0x7F30, 0x7F30, + 0x7F50, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, + 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, + 0x7F20, 0x7F20, 0x7F10, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, + 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F10, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F10, 0x7F20, 0x7F40, + 0x7F30, 0x7F30, 0x7F00, 0x7F40, 0x7ED0, 0x73F0, 0x6920, 0x5CF0, 0x5190, 0x46A0, 0x3CE0, 0x3450, 0x2D90, 0x2840, 0x24E0, 0x2290, + 0x2260, 0x2340, 0x2490, 0x2660, 0x2860, 0x2A10, 0x2B50, 0x2CD0, 0x2DA0, 0x2E50, 0x2E40, 0x2E50, 0x2D40, 0x2C60, 0x2BD0, 0x2C00, + 0x2C60, 0x2DE0, 0x2F30, 0x3030, 0x30C0, 0x3090, 0x3020, 0x2FE0, 0x30E0, 0x32A0, 0x3510, 0x39A0, 0x3FE0, 0x46D0, 0x4F60, 0x57A0, + 0x6040, 0x68C0, 0x7090, 0x7740, 0x7D40, 0x7F30, 0x7F20, 0x7F20, 0x7F40, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F20, 0x7F30, 0x7F30, + 0x7F20, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F10, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, + 0x7F30, 0x7F20, 0x7EC0, 0x7F10, 0x7F20, 0x7F00, 0x7EF0, 0x7E40, 0x7530, 0x6C70, 0x62F0, 0x5990, 0x4F40, 0x4640, 0x3E80, 0x3630, + 0x2F20, 0x2840, 0x2300, 0x1DA0, 0x18C0, 0x1590, 0x1290, 0x0FF0, 0x0F10, 0x0F10, 0x1160, 0x1560, 0x1A60, 0x2130, 0x2A10, 0x3550, + 0x4360, 0x5340, 0x6530, 0x7860, 0x7EF0, 0x7F10, 0x7F70, 0x7F00, 0x7ED0, 0x7F10, 0x7EF0, 0x7F30, 0x7EF0, 0x7EA0, 0x7F20, 0x7EF0, + 0x7F30, 0x7EE0, 0x7EC0, 0x7F10, 0x7F10, 0x7F40, 0x7ED0, 0x7E90, 0x7F20, 0x7EF0, 0x7EF0, 0x7F20, 0x7F00, 0x7F40, 0x7F20, 0x7F20, + 0x7F10, 0x7F00, 0x7F20, 0x7EE0, 0x7EF0, 0x7F30, 0x7F20, 0x7F40, 0x7EF0, 0x7F30, 0x7F30, 0x7F00, 0x7F80, 0x7F10, 0x7F00, 0x7F00, + 0x7F10, 0x7F70, 0x7EE0, 0x7EF0, 0x7EF0, 0x7F00, 0x7F60, 0x7F10, 0x7EB0, 0x7F00, 0x7EF0, 0x7F50, 0x7F00, 0x7E70, 0x7EC0, 0x7ED0, + 0x7F20, 0x7F20, 0x7EB0, 0x7EE0, 0x7EE0, 0x7F10, 0x7F10, 0x7E90, 0x7E60, 0x7EF0, 0x7F10, 0x7EF0, 0x7EB0, 0x7F00, 0x7F00, 0x7F10, + 0x7F10, 0x7F00, 0x7F20, 0x7F10, 0x7F10, 0x7F00, 0x7EE0, 0x7F40, 0x7F10, 0x7F20, 0x7F00, 0x7F10, 0x7F30, 0x7F20, 0x7F10, 0x7F10, + 0x7F00, 0x7F40, 0x7EF0, 0x7F10, 0x7F10, 0x7F20, 0x7F50, 0x7F00, 0x7F00, 0x7F00, 0x7F10, 0x7F30, 0x7EE0, 0x7EA0, 0x7EF0, 0x7EE0, + 0x7F50, 0x7EF0, 0x7EA0, 0x7F00, 0x7F10, 0x7F10, 0x7EE0, 0x7E70, 0x7F10, 0x7EF0, 0x7EF0, 0x7EF0, 0x7E80, 0x7F10, 0x7F00, 0x7F20, + 0x7F10, 0x7F00, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7EE0, 0x7F50, 0x7F10, 0x7F20, 0x7EF0, 0x7F10, 0x7F60, 0x7F00, 0x7F10, 0x7F10, + 0x7EF0, 0x7F60, 0x7EF0, 0x7F00, 0x7EF0, 0x7EF0, 0x7F80, 0x7F20, 0x7F00, 0x7ED0, 0x7ED0, 0x7F30, 0x7F10, 0x7EE0, 0x7EE0, 0x7ED0, + 0x7F30, 0x7F20, 0x7EC0, 0x7ED0, 0x7ED0, 0x7F30, 0x7F20, 0x7E90, 0x7EB0, 0x7EF0, 0x7EE0, 0x7F00, 0x7F60, 0x7F10, 0x7E90, 0x7EB0, + 0x7EC0, 0x7EF0, 0x7F10, 0x7E90, 0x7ED0, 0x7F00, 0x7F00, 0x7EF0, 0x7EC0, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F00, 0x7F40, 0x7F40, + 0x7F10, 0x7F10, 0x7EE0, 0x7F50, 0x7EF0, 0x7F20, 0x7EF0, 0x7EF0, 0x7F70, 0x7F00, 0x7F20, 0x7F10, 0x7F10, 0x7F60, 0x7EE0, 0x7F10, + 0x7F30, 0x7F00, 0x7F80, 0x7F10, 0x7F10, 0x7EE0, 0x7EF0, 0x7F70, 0x7EF0, 0x7EF0, 0x7EF0, 0x7F00, 0x7F60, 0x7F10, 0x7ED0, 0x7EB0, + 0x7EE0, 0x7F60, 0x7F00, 0x7E90, 0x7EB0, 0x7EB0, 0x7EF0, 0x7EF0, 0x7EA0, 0x7F00, 0x7EE0, 0x7F10, 0x7F10, 0x7EA0, 0x7F00, 0x7F10, + 0x7F10, 0x7F00, 0x7EE0, 0x7F00, 0x7F00, 0x7EF0, 0x7F10, 0x7F00, 0x7F40, 0x7F10, 0x7F10, 0x7F00, 0x7F00, 0x7F80, 0x7F10, 0x7F20, + 0x7EF0, 0x7EF0, 0x7F50, 0x7F00, 0x7F00, 0x7F10, 0x7F20, 0x7F60, 0x7EF0, 0x7EF0, 0x7EF0, 0x7EE0, 0x7F50, 0x7EF0, 0x7EE0, 0x7EF0, + 0x7F10, 0x7F60, 0x7EE0, 0x7E90, 0x7F10, 0x7F00, 0x7EF0, 0x7ED0, 0x7EA0, 0x7EE0, 0x7EF0, 0x7F30, 0x7F20, 0x7EC0, 0x7F10, 0x7F10, + 0x7ED0, 0x7D10, 0x7AA0, 0x79C0, 0x78C0, 0x77B0, 0x7860, 0x7900, 0x7A50, 0x7BD0, 0x7D60, 0x7EC0, 0x7F10, 0x7F80, 0x7F00, 0x7F00, + 0x7EF0, 0x7F10, 0x7F60, 0x7EF0, 0x7F30, 0x7F20, 0x7F20, 0x7F80, 0x7F10, 0x7EB0, 0x7EE0, 0x7EF0, 0x7F70, 0x7EE0, 0x7ED0, 0x7EF0, + 0x7F00, 0x7F40, 0x7F10, 0x7E90, 0x7EE0, 0x7ED0, 0x7F10, 0x7F00, 0x7E70, 0x7ED0, 0x7F10, 0x7F20, 0x7F40, 0x7EA0, 0x7ED0, 0x7F10, + 0x7F10, 0x7F00, 0x7EC0, 0x7F10, 0x7F20, 0x7F20, 0x7EF0, 0x7480, 0x4BE0, 0x28C0, 0x0B60, 0xF590, 0xE570, 0xD9E0, 0xD300, 0xD000, + 0xD120, 0xD710, 0xE290, 0xF480, 0x0D80, 0x2C80, 0x4F90, 0x71B0, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7F60, 0x7EE0, 0x7ED0, 0x7F10, + 0x7F00, 0x7F70, 0x7F00, 0x7EC0, 0x7F10, 0x7F10, 0x7F20, 0x7EC0, 0x7E90, 0x7F10, 0x7EE0, 0x7EF0, 0x7EF0, 0x71A0, 0x34A0, 0xF7D0, + 0xBB00, 0x88A0, 0x84B0, 0x8480, 0x8460, 0x8450, 0x8440, 0x8440, 0x8430, 0x8440, 0x8440, 0x8430, 0x8430, 0x8430, 0x8430, 0x8420, + 0x8420, 0x8420, 0x8410, 0x8410, 0x8410, 0x8410, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x83F0, 0x83F0, 0x83F0, 0x83F0, + 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8410, 0x8410, 0x8410, 0x8410, 0x8420, 0x8430, + 0x8430, 0x8430, 0x8440, 0x8450, 0x8450, 0x8460, 0x8460, 0x8470, 0x8470, 0x8480, 0x8490, 0x84A0, 0x84B0, 0x84C0, 0x84E0, 0x8500, + 0x8580, 0x8690, 0x8950, 0x8FD0, 0x98C0, 0xA070, 0xA7D0, 0xAF10, 0xB710, 0xBFE0, 0xC6D0, 0xCD40, 0xD390, 0xD900, 0xDDC0, 0xE290, + 0xE7F0, 0xECD0, 0xF1B0, 0xF570, 0xF970, 0xFC60, 0xFF10, 0x01D0, 0x0410, 0x05F0, 0x0780, 0x0890, 0x0920, 0x0A40, 0x0A50, 0x0A10, + 0x0970, 0x0850, 0x06F0, 0x04B0, 0x0280, 0x0080, 0xFE30, 0xFB40, 0xF900, 0xF5B0, 0xF2B0, 0xEFF0, 0xEE10, 0xED10, 0xEC60, 0xEBE0, + 0xEC50, 0xED30, 0xEE80, 0xF020, 0xF230, 0xF4A0, 0xF780, 0xFA90, 0xFDF0, 0x0220, 0x0620, 0x0A10, 0x0D90, 0x11E0, 0x16E0, 0x1D70, + 0x2500, 0x2EC0, 0x3970, 0x44F0, 0x5060, 0x5B40, 0x6550, 0x6F10, 0x7730, 0x7CE0, 0x7F10, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, + 0x7F30, 0x7F20, 0x7F30, 0x7E00, 0x7550, 0x6A60, 0x5CF0, 0x4D10, 0x3B00, 0x2620, 0x0CA0, 0xF2B0, 0xD690, 0xBA90, 0x9FA0, 0x8AF0, + 0x8590, 0x84F0, 0x84D0, 0x84C0, 0x84B0, 0x84B0, 0x84C0, 0x84C0, 0x84D0, 0x8500, 0x8570, 0x87A0, 0x9AA0, 0xB2C0, 0xCB10, 0xE070, + 0xF170, 0xFB60, 0xFD30, 0xF5F0, 0xE5F0, 0xCDA0, 0xB200, 0x9550, 0x86B0, 0x8500, 0x84D0, 0x84C0, 0x84B0, 0x84A0, 0x84A0, 0x8490, + 0x8490, 0x8490, 0x8480, 0x8480, 0x8480, 0x8470, 0x8470, 0x8470, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8450, 0x8450, 0x8450, + 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8490, 0x8470, 0x8470, 0x8470, 0x8480, 0x8480, 0x8490, 0x8490, 0x84A0, 0x84B0, 0x84B0, + 0x84C0, 0x84C0, 0x84D0, 0x84E0, 0x84F0, 0x8500, 0x8520, 0x8550, 0x8590, 0x85E0, 0x8620, 0x86D0, 0x8770, 0x8870, 0x8A90, 0x8D80, + 0x9150, 0x95B0, 0x99E0, 0x9E50, 0xA410, 0xAA80, 0xB280, 0xBB00, 0xC3E0, 0xCD50, 0xD610, 0xDFA0, 0xE8E0, 0xF3A0, 0xFDA0, 0x0650, + 0x0FB0, 0x17E0, 0x2040, 0x2810, 0x2F80, 0x3760, 0x3E10, 0x4490, 0x49B0, 0x4E70, 0x5400, 0x5880, 0x5D80, 0x61E0, 0x6680, 0x6AB0, + 0x6E80, 0x7260, 0x7600, 0x7970, 0x7CA0, 0x7EC0, 0x7F40, 0x7F10, 0x7EF0, 0x7EF0, 0x7F10, 0x7F60, 0x7F10, 0x7F10, 0x7F10, 0x7EF0, + 0x7F40, 0x7EF0, 0x7F00, 0x7F40, 0x7EF0, 0x7F30, 0x7F00, 0x7EE0, 0x7F10, 0x7F10, 0x7F50, 0x7EB0, 0x7EE0, 0x7EF0, 0x7F10, 0x7F30, + 0x7F00, 0x7EC0, 0x7F10, 0x7F20, 0x7F40, 0x7EF0, 0x7E90, 0x7F00, 0x7EE0, 0x7EF0, 0x7F10, 0x7F00, 0x7EF0, 0x7EF0, 0x7F20, 0x7F20, + 0x7F00, 0x7F10, 0x7EF0, 0x7F00, 0x7F20, 0x7F00, 0x7F30, 0x7EE0, 0x7EF0, 0x7F30, 0x7F20, 0x7F80, 0x4240, 0xED50, 0x9040, 0x84A0, + 0x8470, 0x8450, 0x8440, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8440, 0x8460, 0x8460, 0x8450, 0x8460, 0x8490, 0x8480, 0x84C0, + 0x84B0, 0x84D0, 0x8500, 0x85F0, 0x8A50, 0x97D0, 0xA3A0, 0xACF0, 0xB460, 0xBA50, 0xBED0, 0xC180, 0xC1F0, 0xC0B0, 0xBEB0, 0xBD40, + 0xBC60, 0xBD90, 0xC0D0, 0xC5E0, 0xCCD0, 0xD500, 0xDE60, 0xE8C0, 0xF470, 0x0200, 0x1060, 0x2180, 0x30E0, 0x3E90, 0x4AD0, 0x53A0, + 0x58E0, 0x5AE0, 0x5B90, 0x5D70, 0x60E0, 0x66C0, 0x6EF0, 0x77D0, 0x7EA0, 0x7F10, 0x7F50, 0x7EB0, 0x7E70, 0x7F10, 0x7F00, 0x7F60, + 0x7ED0, 0x7EB0, 0x7F10, 0x7F20, 0x7F40, 0x7F10, 0x7EA0, 0x7F10, 0x7F10, 0x7F20, 0x7E70, 0x7EC0, 0x7F10, 0x7F10, 0x7F20, 0x7F10, + 0x7EB0, 0x7F20, 0x7F10, 0x7F10, 0x7F10, 0x7F00, 0x7F40, 0x7EF0, 0x7EF0, 0x7F30, 0x7F20, 0x7F60, 0x7F10, 0x7F10, 0x7F20, 0x7EE0, + 0x7F80, 0x7F10, 0x7F10, 0x7F20, 0x7EF0, 0x7F90, 0x7F10, 0x7F00, 0x7EF0, 0x7ED0, 0x7F60, 0x7F10, 0x7ED0, 0x7EF0, 0x7F20, 0x7F40, + 0x7F10, 0x7F90, 0x7F00, 0x7F00, 0x7EF0, 0x7EF0, 0x7F70, 0x7EF0, 0x7F10, 0x7F00, 0x7F00, 0x7F70, 0x7F10, 0x7EB0, 0x7EC0, 0x7EC0, + 0x7F30, 0x7F00, 0x7EC0, 0x7ED0, 0x7EE0, 0x7F20, 0x7F10, 0x7E90, 0x7EB0, 0x7EE0, 0x7F10, 0x7F10, 0x7E70, 0x7EF0, 0x7F10, 0x7F20, + 0x7F20, 0x7F00, 0x7EA0, 0x7F10, 0x7F10, 0x7F10, 0x7EC0, 0x7F10, 0x7390, 0x6630, 0x5CA0, 0x5480, 0x4F00, 0x4BA0, 0x48C0, 0x4690, + 0x4470, 0x41B0, 0x3E70, 0x3A50, 0x36E0, 0x3370, 0x30C0, 0x2E90, 0x2DB0, 0x2EC0, 0x3080, 0x3330, 0x3760, 0x3B50, 0x4030, 0x4530, + 0x4A60, 0x4F40, 0x52D0, 0x54A0, 0x5460, 0x51F0, 0x4F70, 0x4B80, 0x4800, 0x4490, 0x4120, 0x3EE0, 0x3CF0, 0x3CF0, 0x3DB0, 0x3F90, + 0x4360, 0x46C0, 0x4BD0, 0x50F0, 0x55A0, 0x5B20, 0x6040, 0x6520, 0x6A30, 0x6DE0, 0x7240, 0x7580, 0x78B0, 0x7BA0, 0x7D70, 0x7EF0, + 0x7F10, 0x7F50, 0x7F10, 0x7F20, 0x7EF0, 0x7EF0, 0x7F90, 0x7F20, 0x7F00, 0x7EF0, 0x7F10, 0x7F30, 0x7F40, 0x7F10, 0x7F10, 0x7EE0, + 0x7F60, 0x7F10, 0x7F20, 0x7F00, 0x7EF0, 0x7F70, 0x7F00, 0x7F40, 0x7F10, 0x7F00, 0x7F60, 0x7EE0, 0x7F10, 0x7F00, 0x7EF0, 0x7F90, + 0x7F00, 0x7EE0, 0x7F00, 0x7F10, 0x7F30, 0x7EF0, 0x7EE0, 0x7EF0, 0x7EF0, 0x7F70, 0x7F00, 0x7EC0, 0x7F10, 0x7F10, 0x7F30, 0x7F00, + 0x7EA0, 0x7F10, 0x7F10, 0x7F10, 0x7F20, 0x7EC0, 0x7F30, 0x7F00, 0x7F00, 0x7F00, 0x7F00, 0x7F30, 0x7F00, 0x7F40, 0x7F10, 0x7F10, + 0x7F50, 0x7F10, 0x7F10, 0x7F20, 0x7EF0, 0x7F90, 0x7F10, 0x7F20, 0x7F00, 0x7F10, 0x7F70, 0x7F00, 0x7F10, 0x7EF0, 0x7EE0, 0x7F60, + 0x7F10, 0x7EB0, 0x7EE0, 0x7ED0, 0x7F70, 0x7F20, 0x7EC0, 0x7ED0, 0x7EB0, 0x7F00, 0x7EF0, 0x7E70, 0x7ED0, 0x7ED0, 0x7F20, 0x7F20, + 0x7EC0, 0x7EF0, 0x7F00, 0x7F00, 0x7F10, 0x7E90, 0x7F00, 0x7F00, 0x7EF0, 0x7F10, 0x7F00, 0x7F40, 0x7F20, 0x7F20, 0x7F20, 0x7F00, + 0x7F50, 0x7F10, 0x7F20, 0x7EF0, 0x7EF0, 0x7F60, 0x7F20, 0x7F10, 0x7F10, 0x7F10, 0x7F60, 0x7F00, 0x7EF0, 0x7F00, 0x7EF0, 0x7F30, + 0x74C0, 0x4FC0, 0x29C0, 0x0160, 0xD6F0, 0xABE0, 0x88C0, 0x84E0, 0x84A0, 0x8480, 0x8480, 0x8470, 0x8470, 0x8470, 0x8460, 0x8460, + 0x8460, 0x8450, 0x8440, 0x8440, 0x8430, 0x8430, 0x8430, 0x8420, 0x8410, 0x8420, 0x8410, 0x8410, 0x8410, 0x8410, 0x8420, 0x8420, + 0x8410, 0x8430, 0x8430, 0x8440, 0x8440, 0x8450, 0x8450, 0x8460, 0x8470, 0x8470, 0x8480, 0x8490, 0x84A0, 0x84C0, 0x84C0, 0x84E0, + 0x8500, 0x8540, 0x8670, 0x8930, 0x8FA0, 0x9770, 0x9EE0, 0xA590, 0xABE0, 0xB280, 0xBAE0, 0xC380, 0xCC90, 0xD410, 0xDB20, 0xE040, + 0xE350, 0xE480, 0xE420, 0xE240, 0xDF30, 0xD9B0, 0xD340, 0xCCE0, 0xC7A0, 0xC3B0, 0xC240, 0xC320, 0xC4A0, 0xC5B0, 0xC530, 0xC230, + 0xBBF0, 0xB1A0, 0xA570, 0x98D0, 0x8DB0, 0x87C0, 0x85B0, 0x8510, 0x84E0, 0x84C0, 0x84B0, 0x8490, 0x8470, 0x8460, 0x8440, 0x8440, + 0x8420, 0x8410, 0x8400, 0x8400, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, + 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83F0, 0x83D0, 0x83D0, 0x8410, 0x83E0, 0x83E0, 0x83E0, 0x83E0, + 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83D0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83C0, 0x83B0, + 0x83C0, 0x83C0, 0x83C0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83C0, 0x83C0, + 0x83C0, 0x83C0, 0x83D0, 0x83D0, 0x83E0, 0x8400, 0x83E0, 0x83E0, 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8400, 0x8400, 0x8410, 0x8410, + 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8430, + 0x8410, 0x8430, 0x8430, 0x8430, 0x8470, 0x8430, 0x8430, 0x8430, 0x8430, 0x8440, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8440, + 0x8430, 0x8430, 0x8430, 0x8440, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8450, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, + 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8440, 0x8440, 0x8440, 0x8440, 0x8450, 0x8450, 0x8450, 0x8470, 0x8460, 0x8460, + 0x8460, 0x8450, 0x8460, 0x8460, 0x8470, 0x8450, 0x8470, 0x8470, 0x8470, 0x8470, 0x8480, 0x8480, 0x8480, 0x8480, 0x8490, 0x8490, + 0x8490, 0x84A0, 0x84A0, 0x84A0, 0x84B0, 0x84B0, 0x84B0, 0x84C0, 0x84B0, 0x84C0, 0x84D0, 0x84D0, 0x84E0, 0x84F0, 0x8510, 0x8540, + 0x85C0, 0x8710, 0x8BC0, 0x9860, 0xA810, 0xB7C0, 0xC690, 0xD3F0, 0xDF90, 0xE900, 0xEF90, 0xF430, 0xF620, 0xF7B0, 0xF7D0, 0xF920, + 0xFAE0, 0xFD90, 0x02B0, 0x08C0, 0x10C0, 0x1910, 0x2020, 0x26E0, 0x2CC0, 0x31B0, 0x3760, 0x3BA0, 0x4110, 0x4610, 0x4A70, 0x4E90, + 0x50D0, 0x52E0, 0x5340, 0x5390, 0x53B0, 0x53E0, 0x54C0, 0x5510, 0x55D0, 0x5650, 0x56A0, 0x57E0, 0x58E0, 0x5990, 0x5A90, 0x5A70, + 0x5B70, 0x5B10, 0x5A70, 0x5920, 0x5660, 0x5310, 0x4EE0, 0x4AE0, 0x4780, 0x4450, 0x4340, 0x42C0, 0x4330, 0x4530, 0x46E0, 0x49C0, + 0x4C90, 0x4F30, 0x5300, 0x5600, 0x5910, 0x5C00, 0x5EE0, 0x6250, 0x64B0, 0x65A0, 0x64C0, 0x6250, 0x5EE0, 0x59C0, 0x5390, 0x4D50, + 0x46A0, 0x3FA0, 0x3870, 0x3230, 0x2D60, 0x29B0, 0x28B0, 0x2960, 0x2B50, 0x2EA0, 0x3160, 0x3470, 0x34B0, 0x32B0, 0x2F20, 0x2980, + 0x2540, 0x23F0, 0x26E0, 0x2FC0, 0x3C90, 0x4D10, 0x5E40, 0x6EF0, 0x7C50, 0x7EA0, 0x7EC0, 0x7F10, 0x7F10, 0x7F00, 0x7EA0, 0x7EF0, + 0x7F00, 0x7F00, 0x7EF0, 0x7EC0, 0x7F20, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F10, 0x7F10, 0x7F00, 0x7EF0, 0x7EF0, 0x7F50, 0x7F20, + 0x7F20, 0x7F10, 0x7F10, 0x7F60, 0x7F00, 0x7F10, 0x7F10, 0x7EF0, 0x7F60, 0x7EF0, 0x7EF0, 0x7EE0, 0x7EF0, 0x7F80, 0x7F00, 0x7EE0, + 0x7F10, 0x7F10, 0x7F30, 0x7EC0, 0x7EB0, 0x7EF0, 0x7EE0, 0x7F30, 0x7EF0, 0x7EA0, 0x7F20, 0x7F10, 0x7F10, 0x7EE0, 0x7EC0, 0x7F10, + 0x7ED0, 0x7F00, 0x7EF0, 0x7F30, 0x7EE0, 0x7EA0, 0x7EF0, 0x7F10, 0x7F20, 0x7F00, 0x7E90, 0x7F10, 0x7F20, 0x7F40, 0x7ED0, 0x7EA0, + 0x7F00, 0x7EF0, 0x7F10, 0x7F00, 0x7EC0, 0x7F10, 0x7F20, 0x7F20, 0x7F40, 0x7F00, 0x7F30, 0x7EE0, 0x7F00, 0x7F20, 0x7F00, 0x7F50, + 0x7F20, 0x7F40, 0x7EF0, 0x7F10, 0x7F70, 0x7EF0, 0x7F00, 0x7F10, 0x7F10, 0x7F70, 0x7F00, 0x7F10, 0x7EF0, 0x7EE0, 0x7F80, 0x7F20, + 0x7F00, 0x7EF0, 0x7EB0, 0x7F30, 0x7EF0, 0x7E90, 0x7EB0, 0x7EE0, 0x7EF0, 0x7F10, 0x7EB0, 0x7EE0, 0x7F00, 0x7F10, 0x7F10, 0x7EA0, + 0x7ED0, 0x7F00, 0x7F00, 0x7EF0, 0x7EC0, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F00, 0x7F40, 0x7F10, 0x7F10, 0x7F00, 0x7EF0, 0x7F50, + 0x7F10, 0x7F20, 0x7F10, 0x7F10, 0x7F60, 0x7F10, 0x7F10, 0x7F10, 0x7F00, 0x7F60, 0x7EF0, 0x7F10, 0x7EF0, 0x7F10, 0x7F60, 0x7F00, + 0x7EF0, 0x7F10, 0x7EF0, 0x7F60, 0x7EF0, 0x7EB0, 0x7EE0, 0x7EF0, 0x7F50, 0x7EE0, 0x7EA0, 0x7F00, 0x7EF0, 0x7F30, 0x7EE0, 0x7EC0, + 0x7F10, 0x7EF0, 0x7EF0, 0x7F10, 0x7EB0, 0x7F20, 0x7EF0, 0x7EF0, 0x7F20, 0x7F00, 0x7F40, 0x7EF0, 0x7F10, 0x7F20, 0x7EF0, 0x7F30, + 0x7EE0, 0x7EF0, 0x7F30, 0x7F20, 0x7F70, 0x7F10, 0x7F10, 0x7EF0, 0x7F00, 0x7F90, 0x7F10, 0x7F00, 0x7EE0, 0x7EF0, 0x7F70, 0x7F20, + 0x7EE0, 0x7EF0, 0x7F00, 0x7F60, 0x7F10, 0x7EB0, 0x7EB0, 0x7EC0, 0x7EF0, 0x7F10, 0x7E70, 0x7ED0, 0x7ED0, 0x7F20, 0x7F20, 0x7EC0, + 0x7ED0, 0x7F00, 0x7F00, 0x7F10, 0x7EA0, 0x7EE0, 0x7EF0, 0x7F10, 0x7F20, 0x7F00, 0x7F40, 0x7F10, 0x7F10, 0x7F10, 0x7EB0, 0x7F20, + 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7F60, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F50, 0x7F10, 0x7F10, 0x7F20, 0x7EF0, 0x7F60, 0x7F00, + 0x7F40, 0x7F10, 0x7F00, 0x7F60, 0x7EF0, 0x7F20, 0x7F00, 0x7F00, 0x7F60, 0x7EF0, 0x7F10, 0x7F00, 0x7F00, 0x7F50, 0x7F10, 0x7CB0, + 0x6470, 0x4910, 0x2E70, 0x1310, 0xF660, 0xD8B0, 0xB990, 0x9A30, 0x8740, 0x84F0, 0x84B0, 0x84A0, 0x8490, 0x8480, 0x8470, 0x8470, + 0x8460, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8480, 0x8480, 0x8450, 0x8460, 0x8420, 0x8470, 0x8470, 0x84B0, 0x8480, 0x8490, + 0x84A0, 0x84B0, 0x84C0, 0x84D0, 0x84F0, 0x8550, 0x8640, 0x8940, 0x92D0, 0x9F10, 0xAA90, 0xB690, 0xC230, 0xCDF0, 0xD980, 0xE380, + 0xEC50, 0xF590, 0xFE70, 0x0720, 0x0F50, 0x18B0, 0x2040, 0x2810, 0x2F80, 0x34E0, 0x3A20, 0x3ED0, 0x4270, 0x46E0, 0x4B40, 0x4EF0, + 0x5300, 0x55B0, 0x5840, 0x5A00, 0x5BB0, 0x5E00, 0x5F50, 0x6060, 0x6160, 0x62F0, 0x6450, 0x6560, 0x66A0, 0x6780, 0x6790, 0x6750, + 0x66E0, 0x6690, 0x6710, 0x67B0, 0x68C0, 0x69C0, 0x6AD0, 0x6C00, 0x6DA0, 0x7020, 0x7240, 0x7510, 0x7810, 0x7AA0, 0x7D20, 0x7EB0, + 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, + 0x7F30, 0x7F30, 0x7F40, 0x7F30, 0x7F20, 0x7F40, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F40, 0x7F30, 0x7F30, + 0x7F20, 0x7F40, 0x7F30, 0x7F10, 0x7F20, 0x7F10, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F20, 0x7F30, 0x7F10, 0x7F20, 0x7F20, + 0x7F30, 0x7F30, 0x7F00, 0x7F20, 0x7F30, 0x7F30, 0x7F30, 0x7F00, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7EF0, 0x7F30, 0x7F20, 0x7F40, + 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F40, 0x7F40, 0x7F30, 0x7F10, 0x7F40, 0x7F30, 0x7F20, 0x7F20, 0x7F20, 0x7F30, + 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F30, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F30, + 0x7F20, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F20, + 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F10, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F20, + 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F10, 0x7F20, 0x7F20, + 0x7F30, 0x7F30, 0x7EF0, 0x7E90, 0x7D10, 0x7B60, 0x79A0, 0x7850, 0x7630, 0x73B0, 0x7260, 0x7150, 0x6F70, 0x6E30, 0x6CA0, 0x6BE0, + 0x6B90, 0x6AA0, 0x6B00, 0x69D0, 0x68C0, 0x6810, 0x6790, 0x67A0, 0x6820, 0x69D0, 0x6B80, 0x6D00, 0x6E00, 0x6E10, 0x6F10, 0x6F80, + 0x7020, 0x7050, 0x7000, 0x6FA0, 0x6EA0, 0x6C90, 0x6BE0, 0x6A40, 0x6910, 0x6830, 0x66A0, 0x6560, 0x6480, 0x6450, 0x64A0, 0x6540, + 0x6730, 0x68A0, 0x6A20, 0x6BE0, 0x6D90, 0x7090, 0x72A0, 0x7480, 0x7720, 0x7880, 0x7A90, 0x7BB0, 0x7CF0, 0x7DE0, 0x7E90, 0x7EF0, + 0x7EE0, 0x7F40, 0x7E80, 0x7E20, 0x7D20, 0x7C20, 0x7A90, 0x7950, 0x7700, 0x7560, 0x7290, 0x6FF0, 0x6D20, 0x6910, 0x65B0, 0x61B0, + 0x5D60, 0x5950, 0x54B0, 0x5060, 0x4B90, 0x45B0, 0x3FE0, 0x3900, 0x32D0, 0x2BB0, 0x2480, 0x1EA0, 0x1730, 0x1020, 0x0940, 0x0240, + 0xFC30, 0xF5D0, 0xEF20, 0xE830, 0xE0B0, 0xD7E0, 0xD040, 0xC930, 0xC2C0, 0xBC40, 0xB5B0, 0xAED0, 0xA8A0, 0xA260, 0x9B80, 0x9660, + 0x91C0, 0x8DE0, 0x8B40, 0x8990, 0x88C0, 0x8850, 0x8830, 0x8850, 0x88C0, 0x8920, 0x8960, 0x89D0, 0x8AE0, 0x8C70, 0x8FA0, 0x9430, + 0x9880, 0x9CE0, 0xA060, 0xA3F0, 0xA730, 0xAA60, 0xAE20, 0xB0C0, 0xB3B0, 0xB820, 0xBB60, 0xBF50, 0xC300, 0xC6C0, 0xCAA0, 0xCD50, + 0xD060, 0xD370, 0xD6F0, 0xDA20, 0xDCC0, 0xDFB0, 0xE300, 0xE5A0, 0xE8F0, 0xEAD0, 0xEDB0, 0xEFC0, 0xF1B0, 0xF430, 0xF5A0, 0xF770, + 0xF870, 0xF960, 0xFB40, 0xFD00, 0xFEE0, 0x00A0, 0x01F0, 0x0350, 0x04F0, 0x05C0, 0x0720, 0x0870, 0x0A60, 0x0B30, 0x0C20, 0x0DD0, + 0x0EB0, 0x1060, 0x1110, 0x1250, 0x1250, 0x1170, 0x1010, 0x0EB0, 0x0E60, 0x0CF0, 0x0B10, 0x08A0, 0x0500, 0x0100, 0xFC30, 0xF670, + 0xF160, 0xEBD0, 0xE630, 0xDFB0, 0xD8B0, 0xD210, 0xCB50, 0xC530, 0xBF00, 0xB8F0, 0xB3E0, 0xAE70, 0xAA10, 0xA700, 0xA530, 0xA4B0, + 0xA480, 0xA530, 0xAE10, 0xB150, 0xB4C0, 0xB8E0, 0xBCA0, 0xC0B0, 0xC4E0, 0xC860, 0xCC30, 0xCF40, 0xD210, 0xD360, 0xD410, 0xD450, + 0xD4A0, 0xD580, 0xD730, 0xD8A0, 0xD890, 0xD760, 0xD430, 0xCE40, 0xC6A0, 0xBCE0, 0xB270, 0xA6D0, 0x9A40, 0x8EC0, 0x87E0, 0x8580, + 0x84F0, 0x84C0, 0x84B0, 0x8490, 0x8480, 0x8470, 0x8470, 0x8460, 0x8450, 0x8450, 0x8440, 0x8430, 0x8440, 0x8430, 0x8430, 0x8420, + 0x8420, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8420, 0x8410, 0x8430, 0x8420, 0x8410, + 0x8420, 0x8420, 0x8420, 0x8420, 0x8430, 0x8430, 0x8440, 0x8440, 0x8440, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8460, + 0x8460, 0x8450, 0x8450, 0x8450, 0x8450, 0x8420, 0x8440, 0x8450, 0x8450, 0x8450, 0x8450, 0x8460, 0x8460, 0x8460, 0x8460, 0x8470, + 0x8470, 0x8460, 0x8480, 0x8490, 0x8490, 0x8490, 0x84A0, 0x84A0, 0x84B0, 0x84B0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84B0, + 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, + 0x84C0, 0x84C0, 0x84C0, 0x84B0, 0x84E0, 0x84C0, 0x84B0, 0x84B0, 0x84D0, 0x84C0, 0x84B0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, + 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84B0, 0x84B0, 0x84B0, 0x84A0, 0x84A0, 0x84B0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84B0, + 0x84B0, 0x84A0, 0x84B0, 0x84B0, 0x84A0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84A0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84A0, + 0x84B0, 0x84B0, 0x84A0, 0x84A0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x8480, 0x84C0, + 0x84C0, 0x84C0, 0x84C0, 0x84D0, 0x84D0, 0x84D0, 0x84E0, 0x84E0, 0x84F0, 0x8500, 0x8510, 0x8530, 0x8550, 0x8580, 0x8600, 0x86E0, + 0x8870, 0x8BD0, 0x91C0, 0x9860, 0x9FB0, 0xA6F0, 0xAE90, 0xB6A0, 0xBDF0, 0xC5B0, 0xCDB0, 0xD520, 0xDC90, 0xE4E0, 0xECC0, 0xF410, + 0xFAF0, 0x00F0, 0x0700, 0x0C70, 0x1250, 0x1920, 0x1FF0, 0x2660, 0x2C10, 0x3280, 0x38F0, 0x3F70, 0x4620, 0x4BD0, 0x5130, 0x5670, + 0x5B40, 0x6090, 0x6600, 0x6B00, 0x6FF0, 0x72F0, 0x7710, 0x79E0, 0x7CF0, 0x7ED0, 0x7F20, 0x7F40, 0x7F10, 0x7F50, 0x7F00, 0x7F20, + 0x7EF0, 0x7F10, 0x7F70, 0x7EE0, 0x7EF0, 0x7F10, 0x7F00, 0x7F70, 0x7F10, 0x7F10, 0x7F00, 0x7EE0, 0x7F50, 0x7F10, 0x7F20, 0x7F10, + 0x7F10, 0x7F30, 0x7EE0, 0x7EF0, 0x7F00, 0x7F10, 0x7F10, 0x7F10, 0x7F10, 0x7F20, 0x7EF0, 0x7EF0, 0x7F10, 0x7F20, 0x7F20, 0x7F10, + 0x7EF0, 0x7F10, 0x7F20, 0x7F10, 0x7F20, 0x7EF0, 0x7F10, 0x7F20, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F10, 0x7F30, 0x7F20, + 0x7F20, 0x7F40, 0x7F30, 0x5F70, 0x3700, 0x11C0, 0xF510, 0xDC00, 0xC420, 0xAB50, 0x9200, 0x8630, 0x84E0, 0x84B0, 0x8490, 0x8490, + 0x8480, 0x8470, 0x8470, 0x8460, 0x8460, 0x8460, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8440, 0x8440, + 0x8440, 0x8430, 0x8440, 0x8420, 0x8420, 0x8410, 0x8410, 0x8410, 0x8400, 0x8400, 0x8440, 0x8400, 0x8400, 0x8410, 0x8410, 0x8400, + 0x8410, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8420, + 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, + 0x8430, 0x8420, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8420, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, + 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8430, + 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8440, 0x8440, 0x8440, 0x8440, 0x8450, 0x8480, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, + 0x8460, 0x8460, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8440, 0x8470, 0x8470, 0x8470, 0x8480, 0x8480, 0x8490, 0x8490, 0x84A0, + 0x84B0, 0x84C0, 0x84E0, 0x8520, 0x8640, 0x90E0, 0xA7F0, 0xBEE0, 0xD580, 0xEA70, 0xFD30, 0x0CA0, 0x1A50, 0x2530, 0x2EF0, 0x3760, + 0x3D50, 0x4210, 0x4480, 0x42C0, 0x3ED0, 0x3690, 0x2C30, 0x1DD0, 0x0EE0, 0x0030, 0xF160, 0xE2D0, 0xD430, 0xC3F0, 0xB180, 0x99A0, + 0x8660, 0x84C0, 0x8480, 0x8460, 0x8450, 0x8440, 0x8430, 0x8420, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8420, 0x8420, 0x8420, + 0x8430, 0x8430, 0x8440, 0x8440, 0x8450, 0x8460, 0x8460, 0x8470, 0x8480, 0x8490, 0x84B0, 0x84E0, 0x8530, 0x8690, 0x8DC0, 0x9EC0, + 0xAE70, 0xBE00, 0xCC20, 0xD9C0, 0xE930, 0xF6E0, 0x0390, 0x1030, 0x1B70, 0x26D0, 0x3200, 0x3DE0, 0x49A0, 0x5490, 0x5ED0, 0x6800, + 0x70E0, 0x7880, 0x7DD0, 0x7F10, 0x7F00, 0x7F50, 0x7F00, 0x7F00, 0x7F20, 0x7EF0, 0x7F80, 0x7F20, 0x7F40, 0x7F10, 0x7EF0, 0x7F80, + 0x7F10, 0x7F10, 0x7EF0, 0x7EE0, 0x7F50, 0x7F10, 0x7EE0, 0x7F00, 0x7F00, 0x7F60, 0x7F00, 0x7ED0, 0x7ED0, 0x7EB0, 0x7EF0, 0x7EF0, + 0x7EB0, 0x7ED0, 0x7EF0, 0x7F30, 0x7F20, 0x7E90, 0x7EB0, 0x7F00, 0x7F00, 0x7EF0, 0x7E70, 0x7D20, 0x7B60, 0x78F0, 0x7730, 0x7500, + 0x7340, 0x7210, 0x7090, 0x6FC0, 0x6F10, 0x6E30, 0x6DE0, 0x6C40, 0x6B40, 0x6990, 0x68A0, 0x6800, 0x6750, 0x6820, 0x6AA0, 0x6E60, + 0x7390, 0x79F0, 0x7EA0, 0x7EE0, 0x7F70, 0x7EE0, 0x7EF0, 0x7F10, 0x7F20, 0x7F70, 0x7EF0, 0x7ED0, 0x7F00, 0x7EE0, 0x7F70, 0x7ED0, + 0x7EB0, 0x7EE0, 0x7EF0, 0x7F30, 0x7F00, 0x7EA0, 0x7F10, 0x7F20, 0x7F40, 0x7EF0, 0x7E90, 0x7F00, 0x7EE0, 0x7DC0, 0x7230, 0x64A0, + 0x54E0, 0x45B0, 0x35C0, 0x26C0, 0x1700, 0x0590, 0xF3B0, 0xDFF0, 0xCC00, 0xB5E0, 0xA2B0, 0x9110, 0x87D0, 0x8580, 0x8500, 0x84E0, + 0x84D0, 0x84C0, 0x84B0, 0x84B0, 0x84A0, 0x8490, 0x8480, 0x8470, 0x8470, 0x8460, 0x8460, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, + 0x8440, 0x8440, 0x8450, 0x8450, 0x8460, 0x8460, 0x8460, 0x8470, 0x8470, 0x8480, 0x8480, 0x8490, 0x8490, 0x84A0, 0x84B0, 0x84B0, + 0x84B0, 0x84B0, 0x84C0, 0x84B0, 0x84D0, 0x84E0, 0x84F0, 0x8500, 0x8510, 0x8540, 0x8590, 0x8630, 0x8790, 0x8A90, 0x9050, 0x9790, + 0x9E90, 0xA570, 0xAC60, 0xB330, 0xBA70, 0xC170, 0xC870, 0xCF00, 0xD540, 0xDA90, 0xDFA0, 0xE470, 0xE8F0, 0xED60, 0xF240, 0xF690, + 0xFA50, 0xFD90, 0x0040, 0x0210, 0x02F0, 0x0290, 0x0050, 0xFD00, 0xF9E0, 0xF630, 0xF2F0, 0xF100, 0xF090, 0xF2B0, 0xF6F0, 0xFE20, + 0x0620, 0x0E90, 0x17D0, 0x1FB0, 0x2520, 0x2970, 0x2B40, 0x2B20, 0x28F0, 0x2410, 0x1EC0, 0x18C0, 0x1410, 0x1150, 0x1040, 0x1160, + 0x12D0, 0x14E0, 0x1500, 0x13D0, 0x11D0, 0x0E30, 0x09E0, 0x0440, 0xFED0, 0xF960, 0xF350, 0xEDC0, 0xE630, 0xDB70, 0xCCC0, 0xB8D0, + 0xA170, 0x8BA0, 0x8560, 0x84D0, 0x84B0, 0x84A0, 0x84A0, 0x8470, 0x8470, 0x8460, 0x8470, 0x8470, 0x8420, 0x8470, 0x8470, 0x8470, + 0x8480, 0x8490, 0x84A0, 0x84E0, 0x85C0, 0x9BC0, 0xBD20, 0xDBE0, 0xF830, 0x1220, 0x2C40, 0x4440, 0x5B90, 0x6F80, 0x7DE0, 0x7EF0, + 0x7F00, 0x7F30, 0x7F40, 0x7F10, 0x7F10, 0x7F00, 0x7F60, 0x7F10, 0x7F20, 0x7EE0, 0x7EF0, 0x7F50, 0x7F00, 0x7F20, 0x7F10, 0x4A50, + 0x01E0, 0xBD80, 0x8700, 0x8490, 0x8460, 0x8440, 0x8420, 0x83F0, 0x83E0, 0x83D0, 0x83C0, 0x83B0, 0x83A0, 0x8390, 0x8390, 0x8380, + 0x8380, 0x8370, 0x8370, 0x8370, 0x8360, 0x8360, 0x8360, 0x8320, 0x8370, 0x8360, 0x8370, 0x8390, 0x8370, 0x8370, 0x8310, 0x8380, + 0x8380, 0x8380, 0x8390, 0x8390, 0x8390, 0x8350, 0x83A0, 0x8390, 0x83A0, 0x83B0, 0x83B0, 0x83B0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, + 0x83D0, 0x83D0, 0x83D0, 0x83E0, 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8400, 0x8410, 0x8410, 0x8410, 0x8420, 0x8420, 0x8420, 0x8420, + 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8440, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, + 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8400, 0x8420, 0x8420, + 0x8420, 0x8400, 0x8420, 0x8420, 0x8420, 0x8420, 0x8430, 0x8430, 0x8430, 0x8440, 0x8440, 0x8440, 0x8450, 0x8450, 0x8460, 0x8460, + 0x8470, 0x8470, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, + 0x8490, 0x8490, 0x8490, 0x84A0, 0x84B0, 0x84C0, 0x84C0, 0x84E0, 0x84F0, 0x8520, 0x8580, 0x86D0, 0x8FF0, 0xA1F0, 0xB4E0, 0xCB10, + 0xE2A0, 0xFB90, 0x1550, 0x2F30, 0x47A0, 0x5EF0, 0x7560, 0x7EF0, 0x7F30, 0x7F20, 0x7F20, 0x7F40, 0x7F10, 0x7F10, 0x7F20, 0x7F10, + 0x7F10, 0x7F10, 0x7F20, 0x7F10, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, + 0x7F30, 0x7F20, 0x7F40, 0x7F10, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F30, + 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F20, 0x7F10, 0x7F20, 0x7F40, 0x7F20, 0x7F10, 0x7F20, + 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, + 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F30, + 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, + 0x7F20, 0x7F10, 0x7F30, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F10, 0x7F20, 0x7F10, 0x7F30, 0x7F30, 0x7F00, 0x7F20, + 0x7F30, 0x7F30, 0x7F20, 0x7EF0, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F00, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F30, 0x7F20, 0x7F10, + 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F10, 0x7F30, + 0x7F20, 0x7F30, 0x7F10, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F40, 0x7F30, 0x7F30, 0x7F30, 0x7F40, 0x7F90, 0x7F30, + 0x7F00, 0x7F00, 0x7EF0, 0x7F50, 0x7F20, 0x7F00, 0x7F00, 0x7EB0, 0x7F20, 0x7EE0, 0x7EF0, 0x7EB0, 0x7EE0, 0x7F50, 0x7F00, 0x7F00, + 0x7EE0, 0x7EF0, 0x7F30, 0x7F00, 0x7EB0, 0x7EF0, 0x7EE0, 0x7F30, 0x7F30, 0x7EA0, 0x7F00, 0x7ED0, 0x7AB0, 0x70A0, 0x6840, 0x62D0, + 0x5E30, 0x5B20, 0x5960, 0x5880, 0x5840, 0x5830, 0x56D0, 0x5580, 0x51A0, 0x4D00, 0x4790, 0x4130, 0x3A60, 0x32C0, 0x2A70, 0x2200, + 0x1BA0, 0x1870, 0x18B0, 0x1BA0, 0x21F0, 0x2800, 0x2D90, 0x3130, 0x3330, 0x34F0, 0x3690, 0x38E0, 0x3AF0, 0x3E30, 0x4230, 0x4760, + 0x4DF0, 0x5700, 0x5FD0, 0x6890, 0x7120, 0x7970, 0x7E90, 0x7F30, 0x7F00, 0x7EC0, 0x7EF0, 0x7F10, 0x7F30, 0x7EE0, 0x7EC0, 0x7F10, + 0x7EF0, 0x7EF0, 0x7F10, 0x7E70, 0x7EF0, 0x7EF0, 0x7F10, 0x7F20, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7F40, 0x7F00, 0x7F30, 0x7EF0, + 0x7F00, 0x7EF0, 0x7F10, 0x7F70, 0x7F00, 0x7F20, 0x7F40, 0x7F10, 0x7F90, 0x7F00, 0x7EF0, 0x7EF0, 0x7EF0, 0x7F70, 0x7EE0, 0x7EF0, + 0x7F10, 0x7F00, 0x7F60, 0x7F10, 0x7EB0, 0x7EB0, 0x7EC0, 0x7F30, 0x7F00, 0x7E70, 0x7ED0, 0x7ED0, 0x7F20, 0x7F40, 0x7E90, 0x7ED0, + 0x7EE0, 0x7F10, 0x7F10, 0x7E90, 0x7EC0, 0x7EF0, 0x7F10, 0x7F20, 0x7F00, 0x7F00, 0x7F20, 0x7F20, 0x7F10, 0x7F00, 0x7F20, 0x7F20, + 0x7EF0, 0x7F10, 0x7ED0, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F30, 0x7EF0, 0x7EF0, 0x7F10, 0x7EF0, 0x7F40, 0x7EF0, 0x7F10, + 0x7F00, 0x7F00, 0x7F50, 0x7ED0, 0x7F00, 0x7F10, 0x7F10, 0x7F30, 0x7EE0, 0x7E90, 0x7F10, 0x7F10, 0x7F40, 0x7ED0, 0x7EB0, 0x7F00, + 0x7F10, 0x7F10, 0x7F00, 0x7EA0, 0x7EF0, 0x7EF0, 0x7F20, 0x7EF0, 0x7EB0, 0x7F20, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7F40, 0x7EF0, + 0x7EF0, 0x7F10, 0x7F00, 0x7F60, 0x7F00, 0x7F10, 0x7EE0, 0x7EF0, 0x7F10, 0x7F00, 0x7F40, 0x7F10, 0x7F10, 0x7F20, 0x7EE0, 0x7F80, + 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F90, 0x7F10, 0x7F10, 0x7F00, 0x76A0, 0x66D0, 0x57E0, 0x4740, 0x3840, 0x29D0, 0x1C90, 0x0EB0, + 0x01F0, 0xF6A0, 0xEB90, 0xE090, 0xD660, 0xCC10, 0xC310, 0xB9F0, 0xB110, 0xA8F0, 0xA0B0, 0x98A0, 0x9250, 0x8DD0, 0x8B50, 0x8970, + 0x8850, 0x87F0, 0x87D0, 0x8800, 0x88A0, 0x89F0, 0x8CC0, 0x9160, 0x9740, 0x9D60, 0xA440, 0xAB90, 0xB370, 0xBB80, 0xC3B0, 0xCBE0, + 0xD350, 0xDB10, 0xE300, 0xEBE0, 0xF400, 0xFB80, 0x0350, 0x0B20, 0x11F0, 0x1860, 0x1E10, 0x23F0, 0x2A40, 0x2EF0, 0x33D0, 0x3870, + 0x3C60, 0x4150, 0x4630, 0x4A70, 0x4F20, 0x5320, 0x5740, 0x5A90, 0x5DB0, 0x6140, 0x6400, 0x67B0, 0x6AA0, 0x6DF0, 0x71D0, 0x7490, + 0x7830, 0x7B60, 0x7DD0, 0x7EF0, 0x7F00, 0x7F40, 0x7F00, 0x7F20, 0x7F20, 0x7F00, 0x7F50, 0x7F00, 0x7F20, 0x7F20, 0x7EF0, 0x7F90, + 0x7EE0, 0x7EF0, 0x7F10, 0x7F10, 0x7F70, 0x7F10, 0x7F10, 0x7EF0, 0x7EE0, 0x7F70, 0x7F00, 0x7EF0, 0x7EF0, 0x7F00, 0x7F70, 0x7F20, + 0x7ED0, 0x7EB0, 0x7F00, 0x7F60, 0x7F10, 0x7E90, 0x7EB0, 0x7EC0, 0x7EF0, 0x7F10, 0x7EA0, 0x7ED0, 0x7EF0, 0x7F20, 0x7F20, 0x7EC0, + 0x7F10, 0x7F00, 0x7F00, 0x7EF0, 0x7EA0, 0x7F00, 0x7F10, 0x7F10, 0x7F20, 0x7F00, 0x7F50, 0x7F10, 0x7F20, 0x7F10, 0x7F00, 0x7F30, + 0x7EF0, 0x7F10, 0x7F10, 0x7F20, 0x7F40, 0x7EF0, 0x7F40, 0x7F10, 0x7F10, 0x7F30, 0x7EE0, 0x7EF0, 0x7F10, 0x7F20, 0x7F70, 0x7EF0, + 0x7EF0, 0x7F00, 0x7F00, 0x7F70, 0x7ED0, 0x7EB0, 0x7EE0, 0x7EF0, 0x7F30, 0x7EA0, 0x7AC0, 0x7610, 0x6FA0, 0x6820, 0x5FD0, 0x5590, + 0x4A90, 0x3CD0, 0x2EB0, 0x2030, 0x1060, 0xFFC0, 0xEDD0, 0xDBA0, 0xC980, 0xB560, 0x9E60, 0x8B50, 0x8570, 0x84E0, 0x84B0, 0x8490, + 0x8480, 0x8470, 0x8460, 0x8460, 0x8450, 0x8440, 0x8440, 0x8430, 0x8430, 0x8430, 0x8420, 0x8410, 0x8410, 0x8400, 0x8400, 0x8400, + 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8410, 0x8400, 0x8410, 0x8410, + 0x8410, 0x8410, 0x8410, 0x8420, 0x8420, 0x8420, 0x8420, 0x8430, 0x8430, 0x8430, 0x8430, 0x8450, 0x8440, 0x8450, 0x8450, 0x8450, + 0x8450, 0x8450, 0x8460, 0x8450, 0x8460, 0x8460, 0x8460, 0x8460, 0x8470, 0x8470, 0x84A0, 0x8480, 0x8480, 0x8490, 0x84A0, 0x84B0, + 0x84D0, 0x8510, 0x85C0, 0x8940, 0x99C0, 0xAB80, 0xBE30, 0xCFE0, 0xE090, 0xF170, 0x0060, 0x0FC0, 0x1AF0, 0x2330, 0x2B10, 0x2F10, + 0x30E0, 0x3040, 0x2E10, 0x2AF0, 0x2640, 0x2190, 0x1CC0, 0x1730, 0x10C0, 0x0950, 0x0040, 0xF6E0, 0xED30, 0xE4D0, 0xDC20, 0xD3C0, + 0xCBB0, 0xC400, 0xBD00, 0xB590, 0xAFA0, 0xAB00, 0xA7A0, 0xA610, 0xA570, 0xA530, 0xA580, 0xA660, 0xA7A0, 0xAAD0, 0xB0F0, 0xBB10, + 0xCA10, 0xDEE0, 0xF8E0, 0x1650, 0x3490, 0x5400, 0x6D50, 0x7E30, 0x7F30, 0x7F20, 0x7F40, 0x7F10, 0x7F30, 0x7F20, 0x7F30, 0x7F30, + 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F30, 0x7F20, + 0x7F30, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7EF0, 0x7F20, 0x7F20, 0x7F20, 0x7F20, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F20, + 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, + 0x7F30, 0x7F30, 0x7F00, 0x7F40, 0x7F40, 0x7F30, 0x7F30, 0x7EF0, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F40, 0x7F10, 0x7DB0, 0x6EF0, + 0x6280, 0x57C0, 0x4E70, 0x4680, 0x3E40, 0x3640, 0x2EE0, 0x2A20, 0x2740, 0x26D0, 0x2810, 0x2B70, 0x2FC0, 0x33D0, 0x3650, 0x37E0, + 0x39A0, 0x3AD0, 0x3B90, 0x3D30, 0x4040, 0x43F0, 0x48D0, 0x5930, 0x5BE0, 0x5CF0, 0x5D90, 0x5D30, 0x5C40, 0x5AF0, 0x58D0, 0x5620, + 0x52C0, 0x4DC0, 0x47A0, 0x4130, 0x39F0, 0x31E0, 0x2980, 0x2040, 0x1690, 0x0CA0, 0x0260, 0xF6D0, 0xEBB0, 0xE010, 0xD400, 0xC800, + 0xBC00, 0xB130, 0xA620, 0x9C20, 0x91F0, 0x8BC0, 0x8840, 0x86A0, 0x85E0, 0x85D0, 0x8580, 0x8590, 0x85D0, 0x8660, 0x8780, 0x89B0, + 0x8D40, 0x9260, 0x9690, 0x9A90, 0x9DA0, 0x9F90, 0xA270, 0xA500, 0xA850, 0xACE0, 0xB1C0, 0xB760, 0xBC90, 0xC2E0, 0xC8B0, 0xCDB0, + 0xD1F0, 0xD550, 0xD900, 0xDCE0, 0xDF60, 0xE160, 0xE2C0, 0xE3B0, 0xE430, 0xE350, 0xE1A0, 0xDDE0, 0xD930, 0xD310, 0xCBE0, 0xC420, + 0xBCA0, 0xB3C0, 0xAB90, 0xA330, 0x9A50, 0x9040, 0x88D0, 0x8600, 0x8520, 0x84E0, 0x84C0, 0x84B0, 0x84A0, 0x8490, 0x84C0, 0x8480, + 0x8470, 0x8460, 0x8490, 0x8450, 0x8450, 0x8450, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8430, 0x8410, 0x8430, 0x8430, 0x8430, + 0x8450, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8420, 0x8420, 0x8420, 0x8430, 0x8430, 0x8430, 0x8430, + 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8450, 0x8450, 0x8450, 0x8460, 0x8460, 0x8460, + 0x8470, 0x8470, 0x8470, 0x8480, 0x8480, 0x8490, 0x8490, 0x8490, 0x84A0, 0x84B0, 0x84F0, 0x84D0, 0x84F0, 0x8510, 0x8570, 0x8670, + 0x89B0, 0x9250, 0x9DE0, 0xA830, 0xB1F0, 0xBC00, 0xC610, 0xD060, 0xDB80, 0xE650, 0xF150, 0xFBC0, 0x05A0, 0x1000, 0x19D0, 0x24B0, + 0x2F60, 0x39C0, 0x43B0, 0x4D80, 0x58D0, 0x62D0, 0x6BB0, 0x7440, 0x7B40, 0x7ED0, 0x7EF0, 0x7F60, 0x7EF0, 0x7EF0, 0x7EE0, 0x7EE0, + 0x7F50, 0x7F20, 0x7EA0, 0x7ED0, 0x7ED0, 0x7F10, 0x7F10, 0x7E90, 0x7EB0, 0x7EE0, 0x7EF0, 0x7F10, 0x7EA0, 0x7F00, 0x7F20, 0x7F20, + 0x7F10, 0x7E90, 0x7F00, 0x7F00, 0x7EF0, 0x7F10, 0x7F00, 0x7F40, 0x7F00, 0x7F10, 0x7F20, 0x7F00, 0x7F50, 0x7F10, 0x7F10, 0x7F00, + 0x7EF0, 0x7F30, 0x7EF0, 0x7F20, 0x7ED0, 0x7BF0, 0x77F0, 0x73C0, 0x6F50, 0x6BB0, 0x6800, 0x6510, 0x61B0, 0x5EB0, 0x5C60, 0x5990, + 0x56A0, 0x5420, 0x5100, 0x4F30, 0x4D30, 0x4C40, 0x4BD0, 0x4B90, 0x4BC0, 0x4850, 0x4740, 0x45E0, 0x44D0, 0x4430, 0x4320, 0x4240, + 0x4150, 0x3FF0, 0x3F80, 0x3E10, 0x3D00, 0x3B70, 0x3940, 0x36F0, 0x3400, 0x3260, 0x3040, 0x2EF0, 0x2E00, 0x2D00, 0x2C30, 0x2A30, + 0x2740, 0x24E0, 0x2140, 0x1D90, 0x1A50, 0x1770, 0x1560, 0x12F0, 0x1090, 0x0E00, 0x0B60, 0x0840, 0x0480, 0x00B0, 0xFD80, 0xFB00, + 0xF870, 0xF580, 0xF250, 0xEF50, 0xEAA0, 0xE760, 0xE490, 0xE1B0, 0xDF30, 0xDC70, 0xDA30, 0xD6F0, 0xD3D0, 0xD0A0, 0xCC40, 0xC8A0, + 0xC5C0, 0xC2E0, 0xC0B0, 0xBEB0, 0xBCB0, 0xBA60, 0xB790, 0xB4F0, 0xB180, 0xAEB0, 0xAC10, 0xA870, 0xA620, 0xA420, 0xA270, 0x9FF0, + 0x9CE0, 0x9A10, 0x96E0, 0x9330, 0x9060, 0x8DD0, 0x8BB0, 0x89F0, 0x8890, 0x8760, 0x86A0, 0x8610, 0x85D0, 0x8590, 0x8570, 0x8550, + 0x8530, 0x8520, 0x8510, 0x8500, 0x84F0, 0x84F0, 0x84E0, 0x84E0, 0x84D0, 0x84D0, 0x84D0, 0x84D0, 0x84C0, 0x84B0, 0x84B0, 0x84B0, + 0x84B0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8480, 0x8480, 0x8480, 0x84C0, + 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8430, 0x8480, 0x8470, 0x8470, 0x8430, 0x8480, 0x8480, 0x8470, + 0x8480, 0x8480, 0x8480, 0x8480, 0x8470, 0x8480, 0x8480, 0x8480, 0x84B0, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, + 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8490, 0x8490, 0x8490, 0x8490, 0x84A0, 0x8490, 0x84B0, 0x84B0, 0x84C0, 0x8510, 0x8500, + 0x8530, 0x85C0, 0x8750, 0x8D40, 0x9980, 0xA690, 0xB4A0, 0xC1C0, 0xCEE0, 0xDC90, 0xE9B0, 0xF720, 0x0590, 0x12D0, 0x1F30, 0x2A60, + 0x34D0, 0x3D90, 0x4460, 0x48C0, 0x4AD0, 0x4AB0, 0x4540, 0x3CD0, 0x2F10, 0x1D20, 0x07E0, 0xEDD0, 0xD030, 0xB0B0, 0x8E10, 0x8530, + 0x84C0, 0x8490, 0x8480, 0x8470, 0x8460, 0x8450, 0x8450, 0x8450, 0x8440, 0x8440, 0x8440, 0x8440, 0x8450, 0x8440, 0x8450, 0x8450, + 0x8460, 0x8460, 0x8470, 0x8480, 0x84A0, 0x84C0, 0x8590, 0xA040, 0xD550, 0x0E70, 0x4100, 0x6BB0, 0x7F10, 0x7F70, 0x7EE0, 0x7EF0, + 0x7F10, 0x7F00, 0x7F80, 0x7F10, 0x7F20, 0x7F00, 0x7EF0, 0x7F70, 0x7F00, 0x7EC0, 0x7ED0, 0x7E90, 0x4DE0, 0x11C0, 0xBDE0, 0x84B0, + 0x8440, 0x8410, 0x8410, 0x83C0, 0x83B0, 0x83A0, 0x8390, 0x83C0, 0x83A0, 0x83C0, 0x83A0, 0x83A0, 0x83B0, 0x83B0, 0x8380, 0x83B0, + 0x83C0, 0x83C0, 0x83D0, 0x83D0, 0x83E0, 0x83E0, 0x83E0, 0x8400, 0x83F0, 0x83F0, 0x83F0, 0x8430, 0x83F0, 0x83F0, 0x8400, 0x8400, + 0x8430, 0x8400, 0x8400, 0x83E0, 0x8400, 0x8400, 0x8410, 0x8410, 0x8420, 0x8420, 0x8430, 0x8430, 0x8440, 0x8450, 0x8460, 0x8470, + 0x8490, 0x84B0, 0x8510, 0x88C0, 0xA830, 0xC6F0, 0xE3D0, 0xFDE0, 0x1810, 0x2EB0, 0x4380, 0x5800, 0x6C40, 0x7DB0, 0x7F20, 0x7F40, + 0x7F40, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F10, 0x7F30, 0x7F20, 0x7F40, 0x7F50, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, + 0x7F20, 0x7F20, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F10, 0x7F30, 0x7F20, + 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, + 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F20, + 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F10, 0x7F20, 0x7F20, 0x7F10, + 0x7F30, 0x7F00, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7EF0, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7EF0, 0x7F20, 0x7F10, 0x7F10, 0x7F30, + 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F20, 0x7F40, + 0x7F20, 0x7F10, 0x7F20, 0x7F20, 0x7F20, 0x7F10, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F30, + 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F20, 0x7F10, 0x7F20, 0x7F20, 0x7F20, 0x7F10, + 0x7F30, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F60, 0x7F10, 0x7E90, 0x7F00, 0x7EE0, 0x7F10, 0x7F10, 0x7E70, 0x7EE0, 0x7ED0, 0x7EF0, + 0x7EE0, 0x7E80, 0x7F00, 0x7F00, 0x7F10, 0x7F10, 0x7E90, 0x7F00, 0x7F00, 0x7F10, 0x7F20, 0x7F00, 0x7F40, 0x7F10, 0x7F20, 0x7F00, + 0x7F00, 0x7F10, 0x7EF0, 0x7F20, 0x7EF0, 0x7EF0, 0x7EF0, 0x7EF0, 0x7F10, 0x7F20, 0x7F00, 0x7F10, 0x7EF0, 0x7F00, 0x7F40, 0x7F00, + 0x7F10, 0x7EE0, 0x7EF0, 0x7F30, 0x7F20, 0x7F60, 0x7F10, 0x7F10, 0x7F10, 0x7F00, 0x7F60, 0x7EF0, 0x7F30, 0x7F20, 0x7F00, 0x7F90, + 0x7EE0, 0x7EF0, 0x7F10, 0x7F00, 0x7F60, 0x7F10, 0x7EB0, 0x7EB0, 0x7EC0, 0x7F50, 0x7F10, 0x7EA0, 0x7EC0, 0x7ED0, 0x7F10, 0x7F20, + 0x7EA0, 0x7EF0, 0x7F00, 0x7F00, 0x7F10, 0x7E90, 0x7E70, 0x7F00, 0x7EF0, 0x7F10, 0x7F00, 0x7EF0, 0x7F10, 0x7F20, 0x7F20, 0x7F00, + 0x7F30, 0x7F20, 0x7F20, 0x7EF0, 0x7F00, 0x7F40, 0x7EF0, 0x6B50, 0x5A00, 0x4B00, 0x3FF0, 0x3770, 0x31A0, 0x2FB0, 0x3110, 0x3640, + 0x3E90, 0x49A0, 0x57D0, 0x66C0, 0x75F0, 0x7ED0, 0x7F00, 0x7F00, 0x7F10, 0x7F50, 0x7EE0, 0x7EA0, 0x7EF0, 0x7F10, 0x7F30, 0x7ED0, + 0x7EB0, 0x7F00, 0x7F20, 0x7F40, 0x7EF0, 0x7EA0, 0x7F00, 0x7EF0, 0x7F10, 0x7F00, 0x7EA0, 0x7EF0, 0x7F10, 0x7F20, 0x7F40, 0x7F00, + 0x7F30, 0x7F10, 0x7F10, 0x7F20, 0x7EE0, 0x7F40, 0x7EF0, 0x7F20, 0x7F20, 0x7F10, 0x7F80, 0x7F00, 0x7F40, 0x7F20, 0x7F10, 0x7F70, + 0x7EE0, 0x7EF0, 0x7EF0, 0x7EE0, 0x7F70, 0x6E00, 0x54F0, 0x3DE0, 0x26A0, 0x0EF0, 0xF730, 0xDD70, 0xC1D0, 0xA950, 0x9450, 0x8960, + 0x8670, 0x85E0, 0x85E0, 0x8640, 0x8710, 0x8840, 0x8A10, 0x8D30, 0x95F0, 0xA610, 0xBC40, 0xD9A0, 0xFAB0, 0x1A60, 0x3630, 0x4160, + 0x3D20, 0x2A50, 0x0CB0, 0xECC0, 0xCF00, 0xB840, 0xA9E0, 0xA1F0, 0x9EF0, 0x9CE0, 0x9850, 0x8510, 0x84E0, 0x84D0, 0x84C0, 0x84A0, + 0x84B0, 0x84A0, 0x84A0, 0x84B0, 0x8490, 0x8490, 0x8490, 0x8490, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8470, + 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8460, + 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8490, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8460, 0x8470, + 0x8470, 0x8480, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8460, + 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8470, 0x8440, + 0x8440, 0x8440, 0x8440, 0x8430, 0x8440, 0x8440, 0x8440, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x83E0, + 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8440, 0x8440, 0x8440, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, + 0x8450, 0x8460, 0x8440, 0x8440, 0x8440, 0x8400, 0x8430, 0x8430, 0x8430, 0x83D0, 0x8410, 0x8410, 0x8410, 0x8410, 0x8400, 0x8400, + 0x8400, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8420, 0x8410, 0x8410, 0x8410, 0x8420, 0x8420, + 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8410, 0x8410, 0x8410, 0x8410, + 0x8440, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8420, 0x8410, 0x8420, 0x83C0, + 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, + 0x8410, 0x8410, 0x8400, 0x8400, 0x8400, 0x8400, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, + 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83C0, 0x8410, 0x83C0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, + 0x83E0, 0x83E0, 0x83E0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x8400, 0x8410, 0x8410, 0x8420, 0x8430, 0x8430, 0x8440, 0x8450, 0x8450, + 0x8460, 0x8470, 0x8490, 0x84A0, 0x84D0, 0x8530, 0x86C0, 0x9120, 0xA2F0, 0xB150, 0xBBF0, 0xC300, 0xC5B0, 0xC3A0, 0xBC00, 0xAFC0, + 0x9F00, 0x8C10, 0x8590, 0x84E0, 0x84B0, 0x8490, 0x8470, 0x8460, 0x8450, 0x8450, 0x8440, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, + 0x8430, 0x8430, 0x8450, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8420, 0x8420, 0x8410, 0x8410, 0x8400, 0x8400, 0x83F0, + 0x83F0, 0x83F0, 0x83F0, 0x83E0, 0x83E0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83E0, 0x83E0, + 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x8410, 0x8400, 0x8400, 0x8410, 0x8410, 0x8410, 0x8410, 0x8420, 0x8420, 0x8430, 0x8460, + 0x8440, 0x8440, 0x8450, 0x8460, 0x8470, 0x8480, 0x8490, 0x84B0, 0x84E0, 0x8540, 0x8720, 0x92D0, 0xA470, 0xB540, 0xC4C0, 0xD330, + 0xE170, 0xECF0, 0xF770, 0x0120, 0x0A20, 0x1340, 0x1AF0, 0x2140, 0x2690, 0x2B30, 0x2EA0, 0x3280, 0x35F0, 0x38D0, 0x3B70, 0x3C40, + 0x3C60, 0x3B90, 0x38A0, 0x33D0, 0x2DB0, 0x26B0, 0x2060, 0x1A50, 0x1650, 0x1430, 0x13E0, 0x1560, 0x1750, 0x1870, 0x19C0, 0x1A80, + 0x1B50, 0x1C60, 0x1F00, 0x2300, 0x27E0, 0x2E20, 0x3590, 0x3E30, 0x4710, 0x5050, 0x5970, 0x6270, 0x6B30, 0x7420, 0x7C40, 0x7F10, + 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F20, + 0x7F10, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F10, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7EF0, + 0x7F20, 0x7F30, 0x7F20, 0x7F20, 0x7EF0, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F40, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, + 0x7F20, 0x7F10, 0x7F30, 0x7F40, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F50, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, + 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F20, 0x7F40, 0x7F20, 0x7F10, 0x7F30, 0x7F10, 0x7F30, 0x7EE0, 0x7EF0, 0x7EF0, 0x7EE0, 0x7EF0, + 0x7EF0, 0x7F20, 0x7F00, 0x7EF0, 0x7F10, 0x7F00, 0x7EF0, 0x7EF0, 0x7F00, 0x7F60, 0x7EF0, 0x7EF0, 0x7F00, 0x7F00, 0x7F40, 0x7F50, + 0x7EF0, 0x7EF0, 0x7EB0, 0x7F60, 0x7F40, 0x7E90, 0x7EC0, 0x7F00, 0x7F10, 0x7F30, 0x7EA0, 0x7EE0, 0x7F00, 0x7F10, 0x7F00, 0x7EA0, + 0x7EF0, 0x7F10, 0x7F00, 0x7EF0, 0x7EC0, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F00, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7EE0, 0x7F50, + 0x7F10, 0x7F20, 0x7F00, 0x7F10, 0x7F60, 0x7F10, 0x7F10, 0x7F10, 0x7EF0, 0x7F60, 0x7ED0, 0x7EF0, 0x7F00, 0x7F10, 0x7F60, 0x7F00, + 0x7ED0, 0x7F00, 0x7EF0, 0x7F50, 0x7ED0, 0x7EB0, 0x7EE0, 0x7EF0, 0x7F30, 0x7EE0, 0x7EA0, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7E90, + 0x7F10, 0x7F00, 0x7EF0, 0x7F10, 0x7F00, 0x7F20, 0x7F00, 0x7F10, 0x7F20, 0x7F00, 0x7F40, 0x7F10, 0x7F10, 0x7F20, 0x7EE0, 0x7F80, + 0x7F10, 0x7EF0, 0x7F30, 0x7F20, 0x7F80, 0x7F40, 0x7F10, 0x7F10, 0x7EE0, 0x7F10, 0x7F10, 0x7F00, 0x7EF0, 0x7F00, 0x7F40, 0x7F40, + 0x7F10, 0x7F10, 0x7EE0, 0x7F60, 0x7F20, 0x7F10, 0x7F10, 0x7F00, 0x7F40, 0x7EF0, 0x7EF0, 0x7F10, 0x7F10, 0x7F60, 0x7F00, 0x7ED0, + 0x7F10, 0x7EF0, 0x7F60, 0x7ED0, 0x7EB0, 0x7F10, 0x7F20, 0x7F60, 0x7EF0, 0x7EB0, 0x7F00, 0x7EE0, 0x7F40, 0x7EF0, 0x7E90, 0x7F10, + 0x7EF0, 0x7EF0, 0x7EF0, 0x7EB0, 0x7F20, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7F40, 0x7F10, 0x7F10, 0x7F20, 0x7EE0, 0x7F50, 0x7F10, + 0x7F00, 0x7F10, 0x7F10, 0x7F80, 0x7F00, 0x7F40, 0x7F10, 0x7EF0, 0x7F60, 0x7830, 0x6D70, 0x6360, 0x5810, 0x4C50, 0x4120, 0x35C0, + 0x2B60, 0x2230, 0x18A0, 0x1150, 0x0990, 0x02D0, 0xFCC0, 0xF790, 0xF490, 0xF310, 0xF310, 0xF510, 0xF910, 0x26A0, 0x36F0, 0x4800, + 0x57E0, 0x67E0, 0x7580, 0x7ED0, 0x7F10, 0x7E70, 0x7EC0, 0x7ED0, 0x7F60, 0x7EF0, 0x7EB0, 0x7EE0, 0x7EE0, 0x7F10, 0x7F10, 0x7EA0, + 0x7EE0, 0x7ED0, 0x7F10, 0x7F00, 0x7EA0, 0x7EF0, 0x7F10, 0x7F20, 0x7F20, 0x7F00, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F00, 0x7F40, + 0x7EF0, 0x7F30, 0x7F20, 0x7EF0, 0x7F50, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F30, 0x7EE0, 0x7EF0, 0x7F00, 0x7EE0, 0x7F50, 0x7F10, + 0x7F00, 0x7F00, 0x7F10, 0x7F50, 0x7EB0, 0x7EF0, 0x7F00, 0x7EE0, 0x7F50, 0x7BB0, 0x7230, 0x6780, 0x5B90, 0x4E90, 0x4100, 0x3320, + 0x2550, 0x16F0, 0x0730, 0xF800, 0xE890, 0xD920, 0xCA50, 0xB970, 0xA960, 0x9970, 0x8BF0, 0x8660, 0x8520, 0x84E0, 0x84D0, 0x84B0, + 0x84A0, 0x8490, 0x8480, 0x8470, 0x8470, 0x8460, 0x8460, 0x8450, 0x8450, 0x8450, 0x8440, 0x8440, 0x83F0, 0x8440, 0x8430, 0x8440, + 0x8430, 0x8430, 0x8440, 0x8420, 0x8440, 0x8440, 0x8440, 0x8440, 0x8450, 0x8450, 0x8450, 0x8450, 0x84A0, 0x8450, 0x8450, 0x8450, + 0x8460, 0x8450, 0x8450, 0x8480, 0x8450, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8450, 0x8460, 0x8450, 0x8450, + 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8440, 0x8440, 0x8440, 0x8440, 0x8470, 0x8430, 0x8440, 0x8430, 0x8430, 0x8430, + 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8440, 0x8440, + 0x8450, 0x8470, 0x8470, 0x8480, 0x84C0, 0x8490, 0x84A0, 0x8490, 0x8490, 0x8480, 0x8460, 0x8460, 0x8450, 0x8440, 0x8420, 0x8420, + 0x8410, 0x8400, 0x8400, 0x83F0, 0x83E0, 0x83E0, 0x83D0, 0x83C0, 0x83C0, 0x83B0, 0x83B0, 0x83B0, 0x83A0, 0x83A0, 0x83A0, 0x8390, + 0x8390, 0x8390, 0x8390, 0x83B0, 0x83A0, 0x8390, 0x8390, 0x8390, 0x8390, 0x8390, 0x8390, 0x8390, 0x8390, 0x8390, 0x83C0, 0x8390, + 0x8390, 0x8350, 0x83A0, 0x8390, 0x83A0, 0x83A0, 0x83A0, 0x83A0, 0x83D0, 0x83A0, 0x83D0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, + 0x83E0, 0x83A0, 0x83B0, 0x8360, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83D0, 0x83D0, + 0x83D0, 0x83D0, 0x83E0, 0x83E0, 0x83F0, 0x83F0, 0x8400, 0x8410, 0x8420, 0x8430, 0x8440, 0x8450, 0x8470, 0x8480, 0x8490, 0x8490, + 0x84A0, 0x84B0, 0x84C0, 0x84D0, 0x84D0, 0x84E0, 0x84F0, 0x84F0, 0x84F0, 0x84E0, 0x84D0, 0x84C0, 0x84B0, 0x84A0, 0x8480, 0x8470, + 0x8460, 0x8450, 0x8440, 0x8430, 0x8470, 0x8410, 0x8400, 0x83F0, 0x83F0, 0x83E0, 0x83E0, 0x83D0, 0x83C0, 0x83D0, 0x83C0, 0x83C0, + 0x83C0, 0x83C0, 0x83C0, 0x83D0, 0x83D0, 0x83E0, 0x83E0, 0x83E0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8410, + 0x8420, 0x8420, 0x8430, 0x8430, 0x8440, 0x8440, 0x8440, 0x8450, 0x8470, 0x8490, 0x8560, 0xB1A0, 0xF1A0, 0x29D0, 0x58D0, 0x7A70, + 0x7F20, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, + 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F20, 0x7F40, 0x7F10, 0x7F10, 0x7F00, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F00, 0x7F10, 0x7F30, + 0x7F30, 0x7F20, 0x7EF0, 0x7F30, 0x7F30, 0x7F40, 0x7F30, 0x7F10, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F30, + 0x7F20, 0x7F40, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F40, 0x7F20, 0x7F10, 0x7F10, 0x7F30, 0x7F30, 0x7F20, 0x7F10, 0x7F30, 0x7F20, + 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F20, + 0x7F10, 0x7F30, 0x7F10, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F10, + 0x7F30, 0x7F20, 0x7F20, 0x7F20, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F30, + 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F20, 0x7F00, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F00, 0x7F10, 0x7F20, + 0x7F20, 0x7F10, 0x7EF0, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F90, 0x7F40, 0x7EF0, 0x7F30, 0x7F20, 0x7F60, 0x7F40, 0x7EB0, 0x7EB0, + 0x7EF0, 0x7F30, 0x7EE0, 0x7E90, 0x7EB0, 0x7F10, 0x7F20, 0x7EF0, 0x7E90, 0x7EB0, 0x7F20, 0x7F40, 0x7ED0, 0x7E90, 0x7EE0, 0x7EF0, + 0x7F10, 0x7F30, 0x7F00, 0x7F30, 0x7F00, 0x7F00, 0x7F10, 0x7F00, 0x7F30, 0x7EE0, 0x7EF0, 0x7EF0, 0x7EC0, 0x7F40, 0x7EF0, 0x7F20, + 0x7F20, 0x7F00, 0x7F90, 0x7F10, 0x7F00, 0x7F50, 0x7F10, 0x7F30, 0x7EE0, 0x7EF0, 0x7F30, 0x7F00, 0x7F60, 0x7F10, 0x7F20, 0x7F10, + 0x7EF0, 0x7F60, 0x7EE0, 0x7ED0, 0x7EF0, 0x7F00, 0x7F30, 0x7EF0, 0x7EB0, 0x7EE0, 0x7EE0, 0x7F10, 0x7F10, 0x7E70, 0x7EC0, 0x7EF0, + 0x7F00, 0x7EF0, 0x7E90, 0x7F00, 0x7F20, 0x7F00, 0x7F10, 0x7EB0, 0x7F20, 0x7F10, 0x7F10, 0x7F10, 0x7EE0, 0x7F40, 0x7EF0, 0x7F20, + 0x7F20, 0x7F00, 0x7F40, 0x7F20, 0x7F10, 0x7F10, 0x7EF0, 0x7F40, 0x7EF0, 0x7F10, 0x7F10, 0x7EE0, 0x7F50, 0x7F00, 0x7F00, 0x7F00, + 0x7F10, 0x7F50, 0x7EE0, 0x7E70, 0x7F10, 0x7F00, 0x7F60, 0x7ED0, 0x7EB0, 0x7F00, 0x7F00, 0x7F40, 0x7EF0, 0x7EC0, 0x7F10, 0x7F10, + 0x7F20, 0x7F20, 0x7E90, 0x7F10, 0x7F00, 0x7F20, 0x7F10, 0x7EB0, 0x7F20, 0x7F10, 0x7F10, 0x7F10, 0x7F00, 0x7F40, 0x7EF0, 0x7EF0, + 0x7F30, 0x7F00, 0x7F60, 0x7F00, 0x7F10, 0x7F10, 0x7EE0, 0x7F70, 0x7F10, 0x7F10, 0x7EF0, 0x7EF0, 0x7F80, 0x7F10, 0x7F00, 0x7EE0, + 0x7ED0, 0x7F60, 0x7F00, 0x7ED0, 0x7EB0, 0x7EE0, 0x7EF0, 0x7EF0, 0x7EB0, 0x7EE0, 0x7ED0, 0x7F30, 0x7F20, 0x7EC0, 0x7ED0, 0x7EF0, + 0x7F00, 0x7EE0, 0x7E90, 0x7EB0, 0x7E70, 0x7EF0, 0x7F10, 0x7EA0, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7E90, 0x7F00, 0x7F00, 0x7EF0, + 0x7F10, 0x7F00, 0x7F40, 0x7F10, 0x7F10, 0x7ED0, 0x7E90, 0x7EE0, 0x7EF0, 0x7EF0, 0x7F20, 0x7EC0, 0x7F10, 0x7EF0, 0x7EF0, 0x7F10, + 0x7F10, 0x7ED0, 0x7E70, 0x7EE0, 0x7EF0, 0x7F30, 0x7F20, 0x7EC0, 0x7F10, 0x7EF0, 0x7F00, 0x7F10, 0x7EB0, 0x7F20, 0x7EE0, 0x7EF0, + 0x7F30, 0x7F20, 0x7F60, 0x7F10, 0x7F20, 0x7F10, 0x7F10, 0x7F60, 0x7EF0, 0x7F10, 0x7F30, 0x7F00, 0x7F80, 0x7EF0, 0x7F20, 0x7F10, + 0x7F00, 0x7F90, 0x7F10, 0x7EE0, 0x7EE0, 0x7EF0, 0x7F60, 0x7EF0, 0x7ED0, 0x7EF0, 0x7F00, 0x7F40, 0x7F10, 0x7E90, 0x7EB0, 0x7ED0, + 0x7F10, 0x7F00, 0x7E70, 0x7ED0, 0x7F10, 0x7F20, 0x7F20, 0x7EC0, 0x7F00, 0x7F00, 0x7F10, 0x7F10, 0x7EA0, 0x7F00, 0x7F10, 0x7F20, + 0x7F20, 0x7F00, 0x7F20, 0x7F40, 0x7F10, 0x7F10, 0x7EE0, 0x7F50, 0x7EF0, 0x7F20, 0x7F20, 0x7F00, 0x7F50, 0x7F10, 0x7F20, 0x7F00, + 0x7EF0, 0x7F50, 0x7F00, 0x7F10, 0x7F00, 0x7EE0, 0x7F70, 0x7EF0, 0x7EE0, 0x7F00, 0x7D10, 0x7190, 0x65B0, 0x5960, 0x4B80, 0x3A50, + 0x26B0, 0x1160, 0xFA80, 0xE550, 0xD510, 0xCCA0, 0xCE00, 0xD850, 0xE920, 0xFDD0, 0x12B0, 0x2690, 0x37A0, 0x4600, 0x54B0, 0x61A0, + 0x6F10, 0x7B00, 0x7F30, 0x7F20, 0x7F10, 0x7F30, 0x7F00, 0x7F50, 0x7F10, 0x7F20, 0x7EF0, 0x7EF0, 0x7F90, 0x7F20, 0x7F20, 0x7EF0, + 0x7F10, 0x7F90, 0x6F70, 0x54E0, 0x3800, 0x1850, 0xF6B0, 0xD480, 0xB160, 0x8E50, 0x8530, 0x84C0, 0x84B0, 0x8490, 0x8490, 0x8490, + 0x84A0, 0x8490, 0x84C0, 0x84D0, 0x84D0, 0x84D0, 0x84C0, 0x84B0, 0x8470, 0x8490, 0x8480, 0x8470, 0x8470, 0x8460, 0x8460, 0x8460, + 0x8460, 0x8450, 0x8450, 0x8450, 0x8440, 0x8430, 0x8420, 0x8420, 0x8410, 0x8400, 0x8400, 0x8400, 0x83F0, 0x83F0, 0x83F0, 0x83F0, + 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, + 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83D0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, + 0x83F0, 0x8400, 0x8400, 0x8400, 0x8400, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8420, 0x83D0, 0x8420, 0x8420, 0x8430, 0x8430, + 0x8430, 0x8430, 0x8430, 0x8440, 0x8440, 0x8440, 0x8450, 0x8460, 0x8460, 0x8460, 0x8470, 0x8470, 0x8470, 0x8480, 0x8480, 0x8490, + 0x8490, 0x84A0, 0x84A0, 0x84B0, 0x84B0, 0x84C0, 0x84C0, 0x84C0, 0x84D0, 0x84E0, 0x84E0, 0x84F0, 0x84F0, 0x8500, 0x84E0, 0x8510, + 0x8510, 0x8520, 0x8550, 0x8550, 0x8530, 0x8540, 0x8530, 0x85A0, 0x8610, 0x8700, 0x88F0, 0x8D80, 0x94C0, 0x9D80, 0xA630, 0xAEF0, + 0xB880, 0xC250, 0xCC70, 0xD6F0, 0xE130, 0xEBE0, 0xF510, 0xFFA0, 0x07A0, 0x0F50, 0x1710, 0x2060, 0x2A80, 0x35C0, 0x40B0, 0x4AB0, + 0x5520, 0x5D70, 0x6520, 0x6BE0, 0x71C0, 0x7600, 0x79D0, 0x7CB0, 0x7E70, 0x7F10, 0x7EF0, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F40, + 0x7F40, 0x7F30, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F40, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F50, 0x7F30, + 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7EF0, 0x7E10, 0x7CD0, 0x7BC0, 0x7AF0, 0x7AA0, + 0x7AA0, 0x7B20, 0x7BF0, 0x7C90, 0x7CE0, 0x7D40, 0x7DD0, 0x7E20, 0x7E40, 0x7E90, 0x7EF0, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F10, + 0x7F20, 0x7F20, 0x7F40, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F20, + 0x7F10, 0x7EE0, 0x7E00, 0x7CD0, 0x7B30, 0x7970, 0x7840, 0x77B0, 0x77B0, 0x77D0, 0x7770, 0x7750, 0x7780, 0x7770, 0x77C0, 0x7850, + 0x7890, 0x7830, 0x77A0, 0x7730, 0x7720, 0x7750, 0x7890, 0x7A30, 0x7B20, 0x7BD0, 0x7BF0, 0x7C10, 0x7C60, 0x7CC0, 0x7D10, 0x7D70, + 0x7D60, 0x7D20, 0x7CF0, 0x7D10, 0x7D60, 0x7D30, 0x7CB0, 0x7B60, 0x7A20, 0x78C0, 0x7790, 0x76E0, 0x7620, 0x75E0, 0x75E0, 0x75E0, + 0x7610, 0x7650, 0x7610, 0x7560, 0x7490, 0x72D0, 0x7030, 0x6DD0, 0x6C30, 0x6A90, 0x68B0, 0x6640, 0x6310, 0x5F10, 0x5A20, 0x5500, + 0x4EE0, 0x49E0, 0x4430, 0x3DF0, 0x3680, 0x2EC0, 0x26C0, 0x1F30, 0x1890, 0x11C0, 0x0B10, 0x0580, 0x00A0, 0xFC70, 0xFA50, 0xF980, + 0xFA10, 0xFC20, 0x0050, 0x0510, 0x0A80, 0x1060, 0x16C0, 0x1CA0, 0x20B0, 0x2320, 0x2460, 0x2310, 0x2000, 0x1AE0, 0x12D0, 0x0930, + 0xFD30, 0xEFC0, 0xE1F0, 0xD490, 0xC7D0, 0xBC90, 0xB200, 0xA7F0, 0x9E80, 0x9540, 0x8D50, 0x8830, 0x85F0, 0x8520, 0x84E0, 0x84D0, + 0x84B0, 0x84B0, 0x84A0, 0x8490, 0x8490, 0x8480, 0x8480, 0x8470, 0x8460, 0x8460, 0x8450, 0x8440, 0x8430, 0x8430, 0x8420, 0x8410, + 0x8410, 0x8400, 0x8400, 0x8400, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x8400, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83E0, 0x83F0, + 0x83D0, 0x83F0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, + 0x83C0, 0x83C0, 0x83D0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, + 0x83D0, 0x83D0, 0x83D0, 0x83E0, 0x83D0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83F0, + 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x8400, 0x83E0, + 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8410, + 0x8410, 0x8420, 0x8420, 0x8430, 0x8430, 0x8430, 0x8440, 0x8460, 0x8450, 0x8450, 0x8460, 0x8470, 0x8470, 0x8480, 0x8490, 0x8490, + 0x84A0, 0x84B0, 0x84C0, 0x84D0, 0x84F0, 0x8510, 0x8550, 0x85B0, 0x8660, 0x87A0, 0x8970, 0x8BA0, 0x8E60, 0x9190, 0x9440, 0x9730, + 0x9A80, 0x9D50, 0xA0A0, 0xA430, 0xA7F0, 0xAC10, 0xB110, 0xB4B0, 0xB9D0, 0xBE00, 0xC1E0, 0xC680, 0xCAE0, 0xCFB0, 0xD460, 0xD8B0, + 0xDCC0, 0xE060, 0xE4F0, 0xEA50, 0xF060, 0xF670, 0xFCD0, 0x0410, 0x0B00, 0x1190, 0x1880, 0x1F80, 0x2760, 0x2ED0, 0x35B0, 0x3CB0, + 0x4170, 0x4690, 0x4B00, 0x4F60, 0x6430, 0x69F0, 0x6FE0, 0x7610, 0x7BF0, 0x7ED0, 0x7F70, 0x7F10, 0x7E90, 0x7EB0, 0x7EE0, 0x7F50, + 0x7F10, 0x7EA0, 0x7EC0, 0x7ED0, 0x7F10, 0x7F20, 0x7EC0, 0x7ED0, 0x7F00, 0x7F40, 0x7F10, 0x7E90, 0x7F00, 0x7F20, 0x7EF0, 0x7F10, + 0x7EA0, 0x7F00, 0x7F10, 0x7F20, 0x7F20, 0x7F00, 0x7F50, 0x7F10, 0x7F20, 0x7F10, 0x7EF0, 0x7F60, 0x7EF0, 0x7F10, 0x7F20, 0x7F20, + 0x7F60, 0x7EF0, 0x7F10, 0x7F10, 0x7F00, 0x7F40, 0x7EF0, 0x7EF0, 0x7F00, 0x7F00, 0x7F70, 0x7EF0, 0x7EF0, 0x7EF0, 0x7EE0, 0x7F50, + 0x7EF0, 0x7EB0, 0x7F00, 0x7F00, 0x7F60, 0x7ED0, 0x7F10, 0x7F00, 0x7F00, 0x7F50, 0x7F00, 0x7EC0, 0x7ED0, 0x7EF0, 0x7F50, 0x7F00, + 0x7EA0, 0x7ED0, 0x7ED0, 0x7F20, 0x7F00, 0x7E90, 0x7ED0, 0x7EE0, 0x7F00, 0x7F10, 0x7E90, 0x7F00, 0x7F00, 0x7EF0, 0x7F10, 0x7E90, + 0x7F00, 0x7F20, 0x7F00, 0x7F10, 0x7F00, 0x7F20, 0x7F20, 0x7EF0, 0x7F10, 0x7EE0, 0x7F40, 0x7EF0, 0x7F30, 0x7F20, 0x7F00, 0x7F50, + 0x7EF0, 0x7F40, 0x7F10, 0x7F10, 0x7F30, 0x7EE0, 0x7EF0, 0x7F10, 0x7F00, 0x7F60, 0x7EF0, 0x7F00, 0x7F00, 0x7F00, 0x7F50, 0x7EB0, + 0x7E70, 0x7EE0, 0x7EF0, 0x7F40, 0x7ED0, 0x7E90, 0x7F10, 0x7F00, 0x7F40, 0x7F10, 0x7EA0, 0x7F00, 0x7F00, 0x7EF0, 0x7EF0, 0x7EB0, + 0x7F20, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7F20, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7F60, 0x7EF0, 0x7F10, 0x7F20, 0x7EF0, 0x7F80, + 0x7F00, 0x7F20, 0x7F10, 0x7EF0, 0x7F70, 0x7EF0, 0x7EE0, 0x7EF0, 0x7EE0, 0x7F60, 0x7F10, 0x7EF0, 0x7F00, 0x7EE0, 0x7EF0, 0x7F10, + 0x7ED0, 0x7EB0, 0x7EE0, 0x7EF0, 0x7EF0, 0x7EB0, 0x7EE0, 0x7F00, 0x7F10, 0x7F10, 0x7EA0, 0x7EE0, 0x7F10, 0x7F10, 0x7F00, 0x7EC0, + 0x7EF0, 0x7F10, 0x7EF0, 0x7EF0, 0x7F00, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7EF0, 0x7F60, 0x7F10, 0x7F10, 0x7F00, 0x7EF0, 0x7F70, + 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F60, 0x7F10, 0x7F10, 0x7F00, 0x7EE0, 0x7F70, 0x7EF0, 0x7EE0, 0x7F00, 0x7F20, 0x7F70, 0x7EF0, + 0x7EB0, 0x7EF0, 0x7EE0, 0x7F50, 0x7ED0, 0x7EB0, 0x7EE0, 0x7EF0, 0x7F30, 0x7F00, 0x7EA0, 0x7F10, 0x7F10, 0x7F10, 0x7F00, 0x7E90, + 0x7F00, 0x7EE0, 0x7EF0, 0x7F10, 0x7F00, 0x7F40, 0x7F10, 0x7F10, 0x7F20, 0x7F00, 0x7F50, 0x7F00, 0x7F20, 0x7DE0, 0x6980, 0x5530, + 0x4040, 0x2930, 0x15E0, 0x0370, 0xF150, 0xE030, 0xCEE0, 0xBDC0, 0xABC0, 0x9800, 0x88C0, 0x8540, 0x84E0, 0x84B0, 0x84D0, 0x8480, + 0x8470, 0x8460, 0x8450, 0x8430, 0x8440, 0x8430, 0x8430, 0x8430, 0x8430, 0x8420, 0x8440, 0x8420, 0x8420, 0x8420, 0x8420, 0x8430, + 0x8430, 0x8430, 0x8430, 0x8440, 0x8470, 0x8450, 0x8490, 0x8470, 0x8480, 0x84B0, 0x84E0, 0x8610, 0x9C90, 0xBD70, 0xDEE0, 0xFFF0, + 0x2040, 0x3F30, 0x5B20, 0x72A0, 0x7F10, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F30, 0x7F30, + 0x7F20, 0x7F40, 0x7F30, 0x7F10, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F00, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x6AB0, 0x4970, + 0x26C0, 0x0890, 0xED60, 0xD580, 0xC1C0, 0xB1A0, 0xA530, 0x9C30, 0x95C0, 0x92D0, 0x92B0, 0x9600, 0x9D60, 0xA840, 0xB590, 0xC5C0, + 0xD6E0, 0xE880, 0xFA10, 0x0800, 0x12F0, 0x1B80, 0x21B0, 0x25A0, 0x2890, 0x2930, 0x27B0, 0x23B0, 0x1C60, 0x1290, 0x06B0, 0xF9F0, + 0xEBF0, 0xDBE0, 0xCA30, 0xB610, 0x9D50, 0x89D0, 0x8520, 0x84C0, 0x84A0, 0x8480, 0x8470, 0x8460, 0x8460, 0x8450, 0x8450, 0x8440, + 0x8440, 0x8440, 0x8430, 0x8430, 0x8420, 0x8430, 0x8430, 0x8440, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, + 0x8460, 0x8440, 0x8450, 0x8450, 0x8460, 0x8470, 0x8480, 0x8490, 0x84A0, 0x84D0, 0x8520, 0x86A0, 0x8FE0, 0xA240, 0xB2D0, 0xC2D0, + 0xD250, 0xE1D0, 0xEF90, 0xFC80, 0x07E0, 0x11F0, 0x19B0, 0x1FD0, 0x2480, 0x2740, 0x29B0, 0x2B60, 0x2D50, 0x2F10, 0x3150, 0x33A0, + 0x3680, 0x3990, 0x3C00, 0x3DF0, 0x3F90, 0x4030, 0x3FE0, 0x3EC0, 0x3AF0, 0x35D0, 0x2EC0, 0x26A0, 0x1B70, 0x0EC0, 0xFFE0, 0xEE70, + 0xDC10, 0xC840, 0xB430, 0x9F70, 0x8DC0, 0x8630, 0x8510, 0x84D0, 0x84B0, 0x84A0, 0x8490, 0x8490, 0x8480, 0x8480, 0x8470, 0x8470, + 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8480, 0x8480, 0x8480, 0x8490, 0x8490, 0x84A0, 0x84B0, 0x84C0, 0x84E0, + 0x8510, 0x8580, 0x86B0, 0x8A70, 0x92F0, 0x9D70, 0xA750, 0xB010, 0xB8C0, 0xC140, 0xC840, 0xCDC0, 0xD290, 0xD700, 0xDAF0, 0xDF10, + 0xE250, 0xE4C0, 0xE720, 0xE890, 0xE9D0, 0xEA70, 0xEAC0, 0xEA80, 0xE9D0, 0xE950, 0xE8E0, 0xE790, 0xE5F0, 0xE3A0, 0xE180, 0xDF10, + 0xDCD0, 0xDB80, 0xD9E0, 0xD8F0, 0xD7A0, 0xD650, 0xD520, 0xD330, 0xD110, 0xCFC0, 0xCD90, 0xCBB0, 0xC9E0, 0xC860, 0xC710, 0xC610, + 0xC530, 0xC3A0, 0xC250, 0xC160, 0xBFF0, 0xBF10, 0xBE20, 0xBD40, 0xBCD0, 0xBC10, 0xBC00, 0xBB70, 0xBB30, 0xBBD0, 0xBC00, 0xBD90, + 0xBF00, 0xC030, 0xC280, 0xC490, 0xC730, 0xC9A0, 0xCD60, 0xD220, 0xD8C0, 0xDEE0, 0xE4B0, 0xEA90, 0xF0A0, 0xF680, 0xFDD0, 0x0590, + 0x0DE0, 0x16D0, 0x1F10, 0x2720, 0x2F00, 0x3640, 0x3E90, 0x4620, 0x4D00, 0x5390, 0x5A80, 0x6090, 0x6630, 0x6C20, 0x71C0, 0x7680, + 0x7AB0, 0x7DA0, 0x7F50, 0x7EF0, 0x7F20, 0x7F00, 0x7F00, 0x7F70, 0x7F10, 0x7EB0, 0x7EC0, 0x7ED0, 0x7F60, 0x7EF0, 0x7ED0, 0x7EF0, + 0x7EE0, 0x7F20, 0x7F10, 0x7E90, 0x7EE0, 0x7ED0, 0x7F10, 0x7F10, 0x7E70, 0x7EE0, 0x7F10, 0x7F20, 0x7F20, 0x7F00, 0x7F00, 0x7F20, + 0x7F10, 0x7F10, 0x7EC0, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F00, 0x7F20, 0x7F40, 0x7F10, 0x7F10, 0x7EF0, 0x7F60, 0x7EF0, 0x7F20, + 0x7F10, 0x7F00, 0x7F40, 0x7EF0, 0x7F10, 0x7F20, 0x7F00, 0x7F90, 0x7ED0, 0x7F00, 0x7ED0, 0x7F10, 0x7F60, 0x7EE0, 0x7EC0, 0x7F10, + 0x7F20, 0x7F40, 0x7EF0, 0x7EB0, 0x7F00, 0x7F10, 0x7F10, 0x7EF0, 0x7EA0, 0x7EF0, 0x7D10, 0x7750, 0x7320, 0x6E20, 0x6960, 0x6510, + 0x5FF0, 0x5B70, 0x5660, 0x51D0, 0x4D50, 0x49E0, 0x4190, 0x40F0, 0x41B0, 0x42C0, 0x4500, 0x4730, 0x4950, 0x4BC0, 0x4EA0, 0x5280, + 0x5650, 0x5A90, 0x5E30, 0x6100, 0x63C0, 0x6640, 0x6810, 0x6AC0, 0x6CE0, 0x6ED0, 0x70B0, 0x7120, 0x71F0, 0x7380, 0x74B0, 0x75B0, + 0x76A0, 0x7790, 0x7780, 0x7740, 0x7650, 0x7500, 0x7380, 0x7140, 0x6D90, 0x6910, 0x6230, 0x5AA0, 0x5110, 0x46B0, 0x3B00, 0x2CF0, + 0x1E50, 0x0E50, 0xFE60, 0xEE60, 0xDF10, 0xCEE0, 0xC090, 0xB210, 0xA450, 0x97A0, 0x8CC0, 0x8790, 0x85B0, 0x8520, 0x84F0, 0x84D0, + 0x84C0, 0x84B0, 0x84B0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x8490, 0x8490, 0x8490, 0x8490, 0x8480, 0x84B0, 0x8490, 0x8470, 0x8470, + 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8490, 0x84A0, 0x8470, 0x8470, 0x8470, 0x8480, 0x8480, 0x8480, 0x8490, + 0x8490, 0x84A0, 0x84B0, 0x84C0, 0x84D0, 0x84E0, 0x8500, 0x8530, 0x85B0, 0x8690, 0x8880, 0x8DD0, 0x94F0, 0x9D30, 0xA4D0, 0xACB0, + 0xB470, 0xBA50, 0xC140, 0xC700, 0xCE10, 0xD550, 0xDC30, 0xE380, 0xE950, 0xEDD0, 0xF260, 0xF6E0, 0xFAC0, 0xFF80, 0x03C0, 0x0880, + 0x0B80, 0x0F30, 0x1320, 0x17E0, 0x1D30, 0x22B0, 0x2990, 0x3030, 0x3670, 0x3D00, 0x4440, 0x4C10, 0x53B0, 0x5AE0, 0x6240, 0x6850, + 0x6E90, 0x74B0, 0x7F60, 0x7F10, 0x7F10, 0x7F00, 0x7EE0, 0x7F50, 0x7F10, 0x7F10, 0x7F00, 0x7EE0, 0x7F80, 0x7F00, 0x7F00, 0x7F10, + 0x7F10, 0x7F80, 0x7F00, 0x7ED0, 0x7EF0, 0x7F00, 0x7F30, 0x7ED0, 0x7EB0, 0x7F00, 0x7F20, 0x7F60, 0x7ED0, 0x7EB0, 0x7F00, 0x7EF0, + 0x7EF0, 0x7F10, 0x7EA0, 0x7F10, 0x7F00, 0x7EF0, 0x7F10, 0x7F00, 0x7F20, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7F40, 0x7F10, 0x7F10, + 0x7F20, 0x7EF0, 0x7F90, 0x7F10, 0x7F20, 0x7EF0, 0x7F10, 0x7F70, 0x7F00, 0x7F10, 0x7EF0, 0x7EE0, 0x7F60, 0x7EF0, 0x7EF0, 0x7EE0, + 0x7EF0, 0x7F70, 0x7F20, 0x7EC0, 0x7ED0, 0x7EB0, 0x7F10, 0x7F10, 0x7EB0, 0x7EB0, 0x7EC0, 0x7EF0, 0x7F10, 0x7EA0, 0x6F60, 0x5750, + 0x3B50, 0x2290, 0x0A60, 0xF3C0, 0xDF20, 0xCBD0, 0xBCF0, 0xB120, 0xA8C0, 0xA240, 0x9E20, 0x9C10, 0x99F0, 0x9800, 0x9630, 0x9490, + 0x9370, 0x9240, 0x91E0, 0x92C0, 0x94F0, 0x98F0, 0x9E00, 0xA340, 0xA980, 0xAEA0, 0xB420, 0xBA10, 0xC0B0, 0xC830, 0xD060, 0xD980, + 0xE230, 0xEAB0, 0xF2C0, 0xFA70, 0x0300, 0x0A00, 0x10F0, 0x1880, 0x1FE0, 0x2800, 0x2F50, 0x3610, 0x3D60, 0x4440, 0x4A10, 0x4E90, + 0x51F0, 0x5700, 0x5A50, 0x5F70, 0x6420, 0x6840, 0x6DB0, 0x7260, 0x77A0, 0x7D50, 0x7F20, 0x7F10, 0x7F10, 0x7F00, 0x7EF0, 0x7F40, + 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F10, 0x7F40, 0x7F10, 0x7F10, 0x7F20, 0x7EE0, 0x7350, 0x64B0, 0x5360, 0x4020, 0x29E0, + 0x13E0, 0xFC60, 0xE380, 0xC950, 0xAED0, 0x9550, 0x8780, 0x8550, 0x84E0, 0x84D0, 0x84C0, 0x84C0, 0x84D0, 0x84E0, 0x84F0, 0x8500, + 0x8500, 0x8500, 0x84F0, 0x84E0, 0x84E0, 0x84E0, 0x84E0, 0x84F0, 0x84F0, 0x84F0, 0x84F0, 0x8500, 0x84E0, 0x84E0, 0x84E0, 0x84F0, + 0x84F0, 0x8510, 0x8530, 0x8570, 0x85F0, 0x8690, 0x8790, 0x88C0, 0x8AA0, 0x8CF0, 0x90E0, 0x9500, 0x98B0, 0x9B80, 0x9D70, 0x9E60, + 0x9E70, 0x9D10, 0x9C20, 0x9AF0, 0x9930, 0x97A0, 0x9680, 0x9710, 0x9A60, 0xA080, 0xA810, 0xB0F0, 0xBA00, 0xC360, 0xCCC0, 0xD490, + 0xDAD0, 0xDF80, 0xE0F0, 0xDE50, 0xD6B0, 0xCAD0, 0xBBE0, 0xA9F0, 0x99F0, 0x8CB0, 0x86D0, 0x8580, 0x84F0, 0x84D0, 0x84C0, 0x84B0, + 0x84A0, 0x84A0, 0x8490, 0x8490, 0x8490, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, + 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8480, 0x84B0, 0x8490, 0x84C0, 0x84A0, 0x84B0, 0x84C0, 0x84D0, 0x84E0, 0x84F0, + 0x8500, 0x8510, 0x8550, 0x85F0, 0x8850, 0x90E0, 0x9E20, 0xABF0, 0xB9F0, 0xC880, 0xD7D0, 0xE6C0, 0xF4D0, 0x02A0, 0x0DA0, 0x16F0, + 0x1F90, 0x27B0, 0x2EE0, 0x34F0, 0x3970, 0x3BB0, 0x3B40, 0x3890, 0x3360, 0x2D00, 0x25A0, 0x1D50, 0x1500, 0x0CD0, 0x0560, 0xFE30, + 0xF880, 0xF570, 0xF3F0, 0xF3A0, 0xF520, 0xF780, 0xFB80, 0x0140, 0x0870, 0x1080, 0x1930, 0x2300, 0x2D80, 0x3850, 0x44D0, 0x5190, + 0x5D70, 0x6A30, 0x74B0, 0x7D60, 0x7EF0, 0x7F30, 0x7F20, 0x7EC0, 0x7F20, 0x7F10, 0x7F20, 0x7F00, 0x7EC0, 0x7ED0, 0x7F10, 0x7F30, + 0x7EE0, 0x7E90, 0x7EF0, 0x7EF0, 0x7C50, 0x6A00, 0x50C0, 0x31D0, 0x0EF0, 0xEBB0, 0xCC50, 0xB220, 0x9D00, 0x8F80, 0x8880, 0x8600, + 0x8530, 0x84F0, 0x84F0, 0x84F0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84F0, 0x84D0, 0x84E0, 0x8500, 0x8530, 0x85C0, + 0x8720, 0x8AE0, 0x9370, 0x9D90, 0xA810, 0xB2C0, 0xBE80, 0xCBB0, 0xD8F0, 0xE730, 0xF630, 0x0580, 0x1410, 0x2250, 0x3030, 0x3E10, + 0x4F30, 0x5EE0, 0x6DF0, 0x7AD0, 0x7F30, 0x7F20, 0x7EC0, 0x7ED0, 0x7F00, 0x7F40, 0x7F10, 0x7E90, 0x7E90, 0x7F00, 0x7EF0, 0x7F10, + 0x7F00, 0x7F40, 0x7F10, 0x7F20, 0x7F20, 0x7F00, 0x7F30, 0x7F20, 0x7F20, 0x7EF0, 0x7F10, 0x7220, 0x5A40, 0x3A00, 0x1510, 0xEC80, + 0xC3F0, 0x9D90, 0x8740, 0x84F0, 0x84C0, 0x84B0, 0x84A0, 0x84A0, 0x8490, 0x8490, 0x8490, 0x8490, 0x8480, 0x8480, 0x8480, 0x8470, + 0x8470, 0x8490, 0x8460, 0x8460, 0x8410, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8480, 0x8460, 0x8480, 0x8440, + 0x8460, 0x8450, 0x8460, 0x8460, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8480, 0x8480, 0x8480, 0x8490, 0x84A0, 0x84D0, + 0x84B0, 0x84D0, 0x84E0, 0x8510, 0x8550, 0x8600, 0x8810, 0x8E50, 0x9A10, 0xA590, 0xB260, 0xBDB0, 0xC830, 0xD160, 0xD9B0, 0xE1F0, + 0xEA30, 0xF160, 0xF870, 0xFF30, 0x0540, 0x0AD0, 0x0F10, 0x1330, 0x1760, 0x1B60, 0x1F90, 0x2290, 0x25B0, 0x2790, 0x2930, 0x2B70, + 0x2D00, 0x2ED0, 0x3020, 0x3120, 0x3250, 0x3300, 0x3360, 0x33A0, 0x3310, 0x33B0, 0x3370, 0x33C0, 0x3410, 0x34B0, 0x3630, 0x3710, + 0x37C0, 0x3800, 0x37B0, 0x37B0, 0x3800, 0x37C0, 0x36F0, 0x3690, 0x31C0, 0x2F60, 0x2E60, 0x2C80, 0x2B00, 0x29F0, 0x2970, 0x2B80, + 0x2EC0, 0x3430, 0x3A50, 0x4210, 0x4BB0, 0x5460, 0x5BE0, 0x6210, 0x6680, 0x6AA0, 0x6D20, 0x6F10, 0x70B0, 0x7230, 0x73A0, 0x7440, + 0x73C0, 0x7230, 0x6F00, 0x6AE0, 0x64D0, 0x5EF0, 0x5850, 0x5150, 0x4A70, 0x43C0, 0x3CD0, 0x3730, 0x31D0, 0x2EC0, 0x2CC0, 0x2A70, + 0x28B0, 0x2700, 0x2690, 0x26D0, 0x27A0, 0x2A80, 0x2E40, 0x3310, 0x3880, 0x3C80, 0x4130, 0x44B0, 0x4720, 0x48D0, 0x4850, 0x4550, + 0x3EE0, 0x3490, 0x27E0, 0x1920, 0x0980, 0xF910, 0xE960, 0xDB80, 0xCF30, 0xC5D0, 0xBDE0, 0xB7F0, 0xB470, 0xB280, 0xB300, 0xB3B0, + 0xB4B0, 0xB5E0, 0xB640, 0xB470, 0xB1B0, 0xAD10, 0xA830, 0xA1D0, 0x9B60, 0x9470, 0x8EA0, 0x8AA0, 0x8810, 0x86E0, 0x8640, 0x85F0, + 0x85B0, 0x8570, 0x8560, 0x8540, 0x8530, 0x8520, 0x8510, 0x8500, 0x8500, 0x84F0, 0x84F0, 0x84E0, 0x8530, 0x84E0, 0x84E0, 0x84F0, + 0x8500, 0x8510, 0x8540, 0x8590, 0x8630, 0x8770, 0x89E0, 0x90E0, 0x99C0, 0xA390, 0xAE00, 0xB8E0, 0xC420, 0xCF50, 0xDAF0, 0xE760, + 0xF470, 0x00C0, 0x0BD0, 0x1730, 0x20B0, 0x2970, 0x3180, 0x37B0, 0x3E20, 0x43C0, 0x48B0, 0x4E20, 0x51E0, 0x5650, 0x5A10, 0x5C70, + 0x5EA0, 0x5F80, 0x60C0, 0x60E0, 0x6090, 0x6030, 0x5E60, 0x5D40, 0x5B50, 0x59B0, 0x5920, 0x5940, 0x5B90, 0x5EB0, 0x6260, 0x66F0, + 0x69F0, 0x6B60, 0x6960, 0x63F0, 0x5B00, 0x4F50, 0x4150, 0x3270, 0x23C0, 0x1710, 0x0BB0, 0x01F0, 0xF8C0, 0xEEA0, 0xE510, 0xDB00, + 0xD020, 0xC480, 0xB8E0, 0xAD40, 0xA110, 0x9580, 0x8C60, 0x8810, 0x86A0, 0x85E0, 0x8590, 0x8580, 0x8590, 0x8580, 0x85A0, 0x85F0, + 0x8680, 0x87D0, 0x8A80, 0x9020, 0x9850, 0xA280, 0xAC20, 0xB650, 0xC180, 0xCB80, 0xD550, 0xDD90, 0xE570, 0xEC70, 0xF210, 0xF790, + 0xFBE0, 0x0020, 0x02C0, 0x04C0, 0x0750, 0x0980, 0x0B70, 0x0CA0, 0x0CB0, 0x0D00, 0x0CE0, 0x0B70, 0x0930, 0x05B0, 0x0120, 0xF9D0, + 0xEFD0, 0xBD00, 0xAFC0, 0xA3C0, 0x9AB0, 0x9310, 0x8D50, 0x8980, 0x8740, 0x85F0, 0x8550, 0x8510, 0x84E0, 0x84D0, 0x84C0, 0x84B0, + 0x84D0, 0x8490, 0x8490, 0x8490, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, + 0x8490, 0x8490, 0x8450, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, + 0x8490, 0x84A0, 0x8490, 0x8490, 0x8490, 0x84A0, 0x84A0, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, + 0x8490, 0x8490, 0x8480, 0x8480, 0x8480, 0x8480, 0x8490, 0x8490, 0x84C0, 0x8490, 0x8490, 0x84A0, 0x84B0, 0x84B0, 0x84C0, 0x84D0, + 0x8500, 0x8500, 0x8520, 0x8550, 0x85B0, 0x8640, 0x8750, 0x8950, 0x8D10, 0x92C0, 0x9920, 0x9DE0, 0xA1C0, 0xA5E0, 0xA9D0, 0xAC90, + 0xAFB0, 0xB2D0, 0xB5F0, 0xB8B0, 0xBAC0, 0xBCD0, 0xBDE0, 0xBF30, 0xBFD0, 0xBF80, 0xBEE0, 0xBE30, 0xBD50, 0xBC30, 0xBAA0, 0xB940, + 0xB760, 0xB5B0, 0xB440, 0xB3D0, 0xB270, 0xB1D0, 0xB1C0, 0xB1B0, 0xB0D0, 0xB020, 0xAFC0, 0xAED0, 0xAE80, 0xAEE0, 0xAF00, 0xAEE0, + 0xAE10, 0xAC80, 0xAA70, 0xA890, 0xA780, 0xA720, 0xA6F0, 0xA630, 0xA620, 0xA6C0, 0xA740, 0xA7A0, 0xA7F0, 0xA7E0, 0xA820, 0xA870, + 0xA9D0, 0xABA0, 0xADF0, 0xB030, 0xB200, 0xB330, 0xB440, 0xB540, 0xB6B0, 0xB940, 0xBBC0, 0xBE30, 0xBFF0, 0xC100, 0xC210, 0xC310, + 0xC3F0, 0xC580, 0xC760, 0xC940, 0xCAC0, 0xCBC0, 0xCCF0, 0xCE80, 0xD000, 0xD250, 0xD450, 0xD760, 0xD9D0, 0xDBF0, 0xDEB0, 0xE160, + 0xE460, 0xE6F0, 0xE990, 0xEC60, 0xEFD0, 0xF380, 0xF760, 0xFAE0, 0xFDD0, 0x0030, 0x01C0, 0x02F0, 0x04B0, 0x0730, 0x0900, 0x0AD0, + 0x0C10, 0x0C90, 0x0C00, 0x0B40, 0x0950, 0x0850, 0x0710, 0x0600, 0x0560, 0x0580, 0x05D0, 0x06A0, 0x0750, 0x08D0, 0x0B00, 0x0E20, + 0x1330, 0x1960, 0x2100, 0x2A10, 0x3410, 0x3EA0, 0x49E0, 0x54F0, 0x6090, 0x6BE0, 0x76F0, 0x7E90, 0x7F30, 0x7F20, 0x7F20, 0x7F30, + 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, + 0x7F60, 0x7F40, 0x7F70, 0x7F20, 0x7EE0, 0x7F10, 0x7F10, 0x7EF0, 0x7EF0, 0x7E80, 0x7F00, 0x7F00, 0x7EF0, 0x7EF0, 0x7E90, 0x7F00, + 0x7F00, 0x7F10, 0x7F10, 0x7E70, 0x7EE0, 0x7EE0, 0x79E0, 0x7040, 0x6430, 0x5700, 0x4820, 0x3900, 0x2B30, 0x1E40, 0x1240, 0x0890, + 0xFF30, 0xF660, 0xEDA0, 0xE450, 0xDCA0, 0xD4A0, 0xCC80, 0xC3C0, 0xBB80, 0xB2F0, 0xAA00, 0xA110, 0x9800, 0x8FC0, 0x8A80, 0x8780, + 0x8630, 0x85A0, 0x8550, 0x8530, 0x8510, 0x8500, 0x8500, 0x84F0, 0x84F0, 0x84E0, 0x84E0, 0x84D0, 0x84D0, 0x84F0, 0x84D0, 0x84D0, + 0x84D0, 0x84C0, 0x84C0, 0x84B0, 0x84B0, 0x84B0, 0x84A0, 0x8460, 0x8490, 0x8490, 0x8490, 0x8480, 0x8480, 0x8480, 0x8480, 0x8470, + 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, + 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x84A0, 0x84A0, 0x84B0, 0x84B0, 0x84B0, 0x84C0, 0x84C0, 0x84D0, 0x84D0, 0x84E0, 0x84F0, + 0x84F0, 0x8500, 0x8510, 0x8510, 0x8520, 0x8530, 0x8530, 0x8540, 0x8550, 0x8550, 0x8580, 0x8590, 0x85B0, 0x85C0, 0x85E0, 0x85F0, + 0x85D0, 0x85B0, 0x85D0, 0x8590, 0x85B0, 0x8580, 0x8580, 0x8580, 0x8560, 0x8550, 0x8540, 0x8530, 0x8530, 0x8530, 0x8540, 0x8540, + 0x8550, 0x8580, 0x85C0, 0x8650, 0x8780, 0x8A70, 0x91D0, 0x9C50, 0xA6E0, 0xB220, 0xBD60, 0xC8F0, 0xD440, 0xDE60, 0xE690, 0xEDF0, + 0xF480, 0xF880, 0xFBF0, 0xFD80, 0xFD70, 0xF890, 0xF180, 0xE6E0, 0xDA50, 0xCC40, 0xBE60, 0xB150, 0xA5F0, 0x9C00, 0x9300, 0x8CC0, + 0x88D0, 0x86F0, 0x8600, 0x8580, 0x8540, 0x8520, 0x8500, 0x8500, 0x8500, 0x8530, 0x8500, 0x8500, 0x8500, 0x84E0, 0x8510, 0x8510, + 0x8530, 0x8530, 0x8550, 0x8570, 0x85A0, 0x85F0, 0x86A0, 0x8810, 0x8AE0, 0x8F50, 0xA150, 0xA4A0, 0xA7A0, 0xA9C0, 0xAA50, 0xA920, + 0xA4E0, 0x9F10, 0x9740, 0x8DC0, 0x87E0, 0x8580, 0x84F0, 0x84C0, 0x84A0, 0x8490, 0x8480, 0x8480, 0x8470, 0x8460, 0x8460, 0x8460, + 0x8460, 0x8450, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8470, 0x8460, 0x8470, 0x8470, 0x8480, 0x84A0, 0x8480, 0x8490, + 0x8490, 0x8490, 0x84A0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84C0, 0x84C0, 0x84E0, 0x84D0, 0x84E0, 0x84E0, 0x8500, 0x84F0, + 0x84F0, 0x8500, 0x84B0, 0x8500, 0x8500, 0x8510, 0x8520, 0x8530, 0x8550, 0x8570, 0x8590, 0x85B0, 0x85E0, 0x8630, 0x86B0, 0x8790, + 0x8920, 0x8B10, 0x8DE0, 0x9280, 0x9820, 0x9F60, 0xA640, 0xAD80, 0xB6B0, 0xC020, 0xCA30, 0xD4D0, 0xDFB0, 0xEB90, 0xF780, 0x02B0, + 0x0CD0, 0x1470, 0x1B60, 0x2080, 0x23B0, 0x2520, 0x2440, 0x2380, 0x2200, 0x2180, 0x2110, 0x2030, 0x2020, 0x1E90, 0x1CC0, 0x1B90, + 0x1BC0, 0x1E80, 0x21F0, 0x2680, 0x2BA0, 0x30E0, 0x3610, 0x3BB0, 0x41A0, 0x4890, 0x4EC0, 0x54C0, 0x59C0, 0x5EB0, 0x6440, 0x69C0, + 0x6F90, 0x7530, 0x79F0, 0x7D90, 0x7E90, 0x7EB0, 0x7EE0, 0x7EF0, 0x7F10, 0x7EB0, 0x7F00, 0x7ED0, 0x7ED0, 0x76C0, 0x6A40, 0x5BD0, + 0x4A00, 0x34E0, 0x1EE0, 0x06C0, 0xECA0, 0xD490, 0xBDF0, 0xA9C0, 0x9840, 0x8C50, 0x87B0, 0x8650, 0x85E0, 0x85B0, 0x85B0, 0x8590, + 0x8560, 0x8530, 0x8510, 0x8500, 0x84F0, 0x84E0, 0x84E0, 0x8500, 0x84E0, 0x84F0, 0x8500, 0x8520, 0x8550, 0x85E0, 0x8780, 0x8CD0, + 0x97E0, 0xA3C0, 0xAFD0, 0xBB80, 0xC570, 0xCD30, 0xD1C0, 0xD2B0, 0xD140, 0xCC80, 0xC580, 0xBCF0, 0xB3C0, 0xA980, 0x9F90, 0x9540, + 0x8D30, 0x88B0, 0x86D0, 0x8600, 0x85B0, 0x8580, 0x8580, 0x85B0, 0x85F0, 0x8670, 0x8780, 0x8890, 0x89D0, 0x8AC0, 0x8BA0, 0x8CC0, + 0x8DC0, 0x8E60, 0x8DA0, 0x8C00, 0x8A40, 0x88A0, 0x8780, 0x8690, 0x8600, 0x8590, 0x8550, 0x8520, 0x8510, 0x8500, 0x84F0, 0x84F0, + 0x84F0, 0x84E0, 0x84E0, 0x84E0, 0x84E0, 0x84F0, 0x8500, 0x8500, 0x8520, 0x8530, 0x8550, 0x8590, 0x85F0, 0x8690, 0x87E0, 0x8A60, + 0x8F70, 0x9680, 0x9E70, 0xA5E0, 0xADC0, 0xB580, 0xBD10, 0xC540, 0xCCA0, 0xD3E0, 0xDB50, 0xE310, 0xEAA0, 0xF1A0, 0xF7F0, 0xFDA0, + 0x0320, 0x08A0, 0x0ED0, 0x1510, 0x1AE0, 0x1FE0, 0x2550, 0x29D0, 0x2DE0, 0x31D0, 0x35B0, 0x3A40, 0x3DE0, 0x40D0, 0x4370, 0x4520, + 0x47C0, 0x4A50, 0x4C60, 0x4ED0, 0x50D0, 0x52E0, 0x54A0, 0x5660, 0x5890, 0x5A10, 0x5CA0, 0x5E10, 0x5E80, 0x5F00, 0x5F10, 0x5FD0, + 0x60B0, 0x6200, 0x64D0, 0x6670, 0x67C0, 0x68C0, 0x69B0, 0x6AB0, 0x6C00, 0x6D40, 0x6F50, 0x71B0, 0x7440, 0x7690, 0x78A0, 0x7AC0, + 0x7F20, 0x7F10, 0x7F10, 0x7F10, 0x7F20, 0x7F10, 0x7F20, 0x7EE0, 0x7E40, 0x7CD0, 0x7A90, 0x7760, 0x73D0, 0x7050, 0x6D40, 0x6A20, + 0x66D0, 0x6260, 0x5E70, 0x5910, 0x5290, 0x4AE0, 0x42C0, 0x3860, 0x2FE0, 0x2910, 0x2250, 0x1C00, 0x16A0, 0x1110, 0x0C90, 0x0960, + 0x0840, 0x0860, 0x0A00, 0x0C40, 0x1020, 0x1550, 0x1C50, 0x2490, 0x2DE0, 0x3830, 0x4090, 0x4880, 0x4FF0, 0x5730, 0x5E90, 0x6660, + 0x6E00, 0x7450, 0x7A30, 0x7D60, 0x7E50, 0x7E30, 0x7B30, 0x7460, 0x6890, 0x5940, 0x45B0, 0x2ED0, 0x1890, 0x02C0, 0xECD0, 0xD7A0, + 0xC3E0, 0xB180, 0xA070, 0x92E0, 0x8A30, 0x8740, 0x8640, 0x8600, 0x8620, 0x8690, 0x88B0, 0x8DC0, 0x95B0, 0x9E60, 0xA470, 0xA9B0, + 0xAD90, 0xB040, 0xB280, 0xB380, 0xB270, 0xAF50, 0xA990, 0xA1B0, 0x97C0, 0x8DB0, 0x8800, 0x85D0, 0x8520, 0x84F0, 0x84D0, 0x84C0, + 0x84B0, 0x84B0, 0x84A0, 0x8490, 0x8490, 0x8490, 0x8480, 0x8480, 0x8480, 0x8470, 0x8480, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, + 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8480, 0x8480, 0x8480, 0x8480, + 0x8490, 0x8490, 0x8490, 0x84A0, 0x8490, 0x8490, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84D0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, + 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x8490, 0x8490, 0x8490, 0x8490, 0x84A0, 0x84A0, 0x84A0, 0x84B0, 0x84B0, 0x84C0, 0x84F0, 0x84E0, + 0x8530, 0x8550, 0x85F0, 0x8800, 0x8E90, 0x9980, 0xA420, 0xAEA0, 0xB720, 0xBDD0, 0xC2D0, 0xC740, 0xCAB0, 0xCDF0, 0xD010, 0xD2A0, + 0xD430, 0xD4E0, 0xD560, 0xD590, 0xD610, 0xD5C0, 0xD480, 0xD370, 0xD2B0, 0xD2D0, 0xD2D0, 0xD220, 0xD140, 0xCFF0, 0xCDD0, 0xCB90, + 0xC970, 0xC890, 0xC6C0, 0xC5C0, 0xC400, 0xC230, 0xC0E0, 0xBF00, 0xBD40, 0xBAE0, 0xB8F0, 0xB6C0, 0xB4D0, 0xB300, 0xB140, 0xAF80, + 0xAE10, 0xAC80, 0xAB10, 0xA9E0, 0xA920, 0xA8F0, 0xAA00, 0xABA0, 0xAE00, 0xB000, 0xB390, 0xB750, 0xBD00, 0xC2C0, 0xC970, 0xD0B0, + 0xD890, 0xE0F0, 0xE990, 0xF270, 0xFD00, 0x06C0, 0x1230, 0x1DC0, 0x2890, 0x3470, 0x3F70, 0x4B40, 0x55F0, 0x6050, 0x69F0, 0x7240, + 0x77F0, 0x7D00, 0x7EC0, 0x7F10, 0x7F10, 0x7F30, 0x7EE0, 0x7E90, 0x7F00, 0x7EE0, 0x7F50, 0x7ED0, 0x7EB0, 0x7F00, 0x7F10, 0x7F10, + 0x7F10, 0x7E90, 0x7F00, 0x7EE0, 0x7EF0, 0x7F10, 0x7F00, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F00, 0x7F40, 0x7F10, 0x7F10, 0x7F20, + 0x7EF0, 0x7F80, 0x7F10, 0x7EF0, 0x7F30, 0x7F10, 0x7F60, 0x7F10, 0x7F10, 0x7EF0, 0x7EE0, 0x7F60, 0x7F10, 0x7F00, 0x7EE0, 0x7EF0, + 0x7F70, 0x7F20, 0x7EC0, 0x7EE0, 0x7ED0, 0x7F70, 0x7F10, 0x7EB0, 0x7EE0, 0x7C80, 0x7250, 0x68B0, 0x5D60, 0x5280, 0x46D0, 0x3C20, + 0x33A0, 0x2A60, 0x21D0, 0x1900, 0x1120, 0x0B20, 0x0650, 0x0440, 0x0480, 0x06D0, 0x0C70, 0x1320, 0x1B00, 0x21D0, 0x27A0, 0x2B70, + 0x2D30, 0x2E30, 0x2DE0, 0x2B80, 0x2850, 0x22D0, 0x1C70, 0x1590, 0x0F50, 0x0B20, 0x0A60, 0x0B90, 0x0E00, 0x10A0, 0x12E0, 0x1310, + 0x1170, 0x0E60, 0x09B0, 0x04E0, 0xFFC0, 0xFA90, 0xF6B0, 0xF360, 0xF140, 0xEFD0, 0xEF90, 0xF120, 0xF160, 0xF1D0, 0xF0D0, 0xEEE0, + 0xED70, 0xEB30, 0xE9B0, 0xE800, 0xE6F0, 0xE820, 0xE980, 0xEC40, 0xEFF0, 0xF350, 0xF800, 0xFC00, 0x00D0, 0x1EC0, 0x2810, 0x3080, + 0x3860, 0x40C0, 0x4900, 0x50E0, 0x5710, 0x5AB0, 0x5E80, 0x60E0, 0x62F0, 0x64D0, 0x6770, 0x6AD0, 0x6DD0, 0x7030, 0x7340, 0x75E0, + 0x7980, 0x7CB0, 0x7F40, 0x7F10, 0x7F20, 0x7F20, 0x7F00, 0x7F90, 0x7F10, 0x7EE0, 0x7EE0, 0x7ED0, 0x7F30, 0x7EF0, 0x7ED0, 0x7EE0, + 0x7F00, 0x7F50, 0x7F10, 0x7EA0, 0x7EC0, 0x7EE0, 0x7EF0, 0x7EF0, 0x7EB0, 0x7EE0, 0x7F20, 0x7F10, 0x7F10, 0x7EA0, 0x7F00, 0x7EE0, + 0x7EF0, 0x7F10, 0x7EA0, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7F00, 0x7EA0, 0x7BE0, 0x7790, 0x72D0, 0x6D00, 0x66E0, 0x6050, 0x5990, + 0x5310, 0x4C60, 0x4680, 0x4080, 0x3AA0, 0x34C0, 0x2F10, 0x2A70, 0x2730, 0x24A0, 0x2370, 0x2300, 0x22F0, 0x2400, 0x2550, 0x2700, + 0x2960, 0x2B90, 0x2F10, 0x3260, 0x3640, 0x3910, 0x3A90, 0x3C00, 0x3B80, 0x3AF0, 0x39B0, 0x37A0, 0x3630, 0x3400, 0x3140, 0x2E10, + 0x29F0, 0x2680, 0x2240, 0x1EE0, 0x1B80, 0x1890, 0x1710, 0x15A0, 0x15C0, 0x16D0, 0x1880, 0x1BF0, 0x2020, 0x25D0, 0x2D10, 0x33B0, + 0x3BC0, 0x42F0, 0x4B30, 0x5280, 0x5940, 0x5FD0, 0x6550, 0x6AC0, 0x6E10, 0x6FB0, 0x70F0, 0x7040, 0x6D90, 0x69B0, 0x6520, 0x6000, + 0x5890, 0x4FF0, 0x4740, 0x3DC0, 0x33D0, 0x28F0, 0x1DA0, 0x12E0, 0x0730, 0xFB00, 0xEF50, 0xE3D0, 0xD980, 0xCE50, 0xC490, 0xBB10, + 0xB2A0, 0xAB00, 0xA320, 0x9D70, 0x98B0, 0x9580, 0x9410, 0x9480, 0x9670, 0x9830, 0x9A50, 0x9BF0, 0x9DF0, 0xA000, 0xA2F0, 0xA620, + 0xA9A0, 0xAC90, 0xAF80, 0xB1A0, 0xB3E0, 0xB690, 0xB830, 0xB920, 0xBA10, 0xBA90, 0xBB60, 0xBC10, 0xBCA0, 0xBE70, 0xBFB0, 0xC0D0, + 0xC230, 0xC310, 0xC480, 0xC590, 0xC790, 0xC9E0, 0xCC30, 0xCE60, 0xCFC0, 0xD0E0, 0xD220, 0xD330, 0xD3C0, 0xD460, 0xD4F0, 0xD4E0, + 0xD4B0, 0xD4D0, 0xD450, 0xD480, 0xD440, 0xD3B0, 0xD3D0, 0xD460, 0xD480, 0xD510, 0xD580, 0xD680, 0xD6B0, 0xD690, 0xD560, 0xD420, + 0xD3D0, 0xD3C0, 0xD470, 0xD470, 0xD4C0, 0xD530, 0xD580, 0xD550, 0xD5D0, 0xD680, 0xD710, 0xD6F0, 0xD630, 0xD640, 0xD5D0, 0xD630, + 0xD6F0, 0xD700, 0xD740, 0xD700, 0xD750, 0xD710, 0xD7E0, 0xD960, 0xDA80, 0xDB20, 0xDB70, 0xDB00, 0xDB80, 0xDBE0, 0xDCA0, 0xDD40, + 0xDDF0, 0xDEF0, 0xDEA0, 0xDE70, 0xDDE0, 0xDDB0, 0xDDD0, 0xDD60, 0xDD40, 0xDCD0, 0xDC20, 0xDC90, 0xDCD0, 0xDCD0, 0xDCC0, 0xDD30, + 0xDDB0, 0xDE30, 0xE020, 0xE350, 0xE6D0, 0xEB00, 0xEE60, 0xF170, 0xF3A0, 0xF670, 0xFA90, 0xFF10, 0x03F0, 0x0940, 0x0D90, 0x11F0, + 0x13A0, 0x1540, 0x1610, 0x16A0, 0x1680, 0x16B0, 0x1670, 0x1560, 0x13C0, 0x11F0, 0x0F60, 0x0CC0, 0x0900, 0x0550, 0x0160, 0xFE40, + 0xFA90, 0xF720, 0xF2E0, 0xEE00, 0xE8D0, 0xE310, 0xDDA0, 0xD890, 0xD340, 0xCE20, 0xC960, 0xC460, 0xBEF0, 0xB9E0, 0xB5A0, 0xB1E0, + 0xAE90, 0xAB70, 0xA860, 0xA5B0, 0xA450, 0xA3F0, 0xA3A0, 0xA4A0, 0xA5B0, 0xA770, 0xA940, 0xAB40, 0xADB0, 0xB080, 0xB470, 0xB8F0, + 0xBE00, 0xC320, 0xC840, 0xCD90, 0xD410, 0xDA30, 0xDFB0, 0xE580, 0xEAD0, 0xF010, 0xF4C0, 0xF960, 0xFF40, 0x04D0, 0x0950, 0x0CE0, + 0x1050, 0x12F0, 0x1530, 0x17A0, 0x1AC0, 0x1DD0, 0x20B0, 0x2310, 0x24C0, 0x2650, 0x2770, 0x2820, 0x2810, 0x2780, 0x26B0, 0x2500, + 0x22F0, 0x20F0, 0x1EA0, 0x1AE0, 0x1710, 0x1280, 0x0E50, 0x0A00, 0x05B0, 0x01E0, 0xFEE0, 0xFC70, 0xFB30, 0xFA10, 0xF9A0, 0xFA70, + 0xFBD0, 0xFD90, 0x0060, 0x03A0, 0x0730, 0x0B30, 0x0F00, 0x12C0, 0x15D0, 0x17F0, 0x19E0, 0x1BE0, 0x1E40, 0x20F0, 0x23B0, 0x2760, + 0x2AE0, 0x2D80, 0x2FB0, 0x31D0, 0x3490, 0x3790, 0x3B60, 0x3EB0, 0x4240, 0x4540, 0x4890, 0x4D20, 0x52A0, 0x5A50, 0x6290, 0x6B30, + 0x7440, 0x7C10, 0x7F10, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7EE0, 0x7100, 0x6210, 0x5390, 0x4560, + 0x3910, 0x2D70, 0x2000, 0x11A0, 0x0050, 0xED50, 0xD8B0, 0xC460, 0xAFD0, 0xA070, 0x9500, 0x8EC0, 0x8C30, 0x8C60, 0x9060, 0x9A40, + 0xA690, 0xB780, 0xC7C0, 0xD760, 0xE5F0, 0xF1C0, 0xFC40, 0x0380, 0x0890, 0x0BF0, 0x0E80, 0x1010, 0x1160, 0x12E0, 0x1580, 0x17A0, + 0x1A30, 0x1CC0, 0x1F90, 0x2300, 0x2660, 0x2AC0, 0x2FC0, 0x3610, 0x3CF0, 0x4360, 0x4A80, 0x5180, 0x5830, 0x5DE0, 0x61D0, 0x6590, + 0x6800, 0x69A0, 0x6AF0, 0x6BB0, 0x6BB0, 0x6A50, 0x6860, 0x6400, 0x5DC0, 0x5650, 0x4CC0, 0x43A0, 0x3B00, 0x3230, 0x2960, 0x2060, + 0x1680, 0x0D10, 0x0310, 0xFA40, 0xF1F0, 0xE9D0, 0xE330, 0xDD60, 0xDA50, 0xD920, 0xD9C0, 0xDC40, 0xDEF0, 0xE2B0, 0xE530, 0xE7C0, + 0xEAB0, 0xED60, 0xF050, 0xF2F0, 0xF550, 0xF7A0, 0xFA40, 0xFCD0, 0x0070, 0x0540, 0x0B10, 0x10D0, 0x1700, 0x1DC0, 0x2550, 0x2E50, + 0x3820, 0x4300, 0x4E60, 0x5840, 0x6290, 0x6C30, 0x7600, 0x7D40, 0x7F10, 0x7F10, 0x7F00, 0x7F00, 0x7F10, 0x7F20, 0x7F20, 0x7F00, + 0x7F50, 0x7F10, 0x7F00, 0x7EF0, 0x7EB0, 0x73E0, 0x6660, 0x56F0, 0x47B0, 0x37F0, 0x2940, 0x1C50, 0x1070, 0x0570, 0xFC50, 0xF480, + 0xEE10, 0xE920, 0xE570, 0xE2B0, 0xE1B0, 0xE1A0, 0xE210, 0xE2F0, 0xE460, 0xE5D0, 0xE790, 0xE950, 0xEB60, 0xECA0, 0xECA0, 0xECA0, + 0xEBD0, 0xEAD0, 0xE9A0, 0xE7F0, 0xE6D0, 0xE520, 0xE360, 0xE0F0, 0xDE80, 0xDBF0, 0xD9A0, 0xD710, 0xD500, 0xD3A0, 0xD360, 0xD390, + 0xD510, 0xD870, 0xDB90, 0xE090, 0xE5C0, 0xEB10, 0xF050, 0xF5A0, 0xFB90, 0x00E0, 0x0670, 0x0B30, 0x0F00, 0x1280, 0x1590, 0x1830, + 0x1A40, 0x1AF0, 0x1BD0, 0x1B50, 0x19D0, 0x1830, 0x1600, 0x1480, 0x1290, 0x11B0, 0x1160, 0x1220, 0x1450, 0x17B0, 0x1C00, 0x2210, + 0x28B0, 0x30B0, 0x3920, 0x4220, 0x4C90, 0x5800, 0x6280, 0x6C90, 0x74B0, 0x7BB0, 0x7EC0, 0x7F40, 0x7F30, 0x7F20, 0x7F10, 0x7F00, + 0x7F40, 0x7F40, 0x7F10, 0x7F10, 0x7F00, 0x7F40, 0x7D80, 0x78E0, 0x74F0, 0x7080, 0x6C90, 0x67F0, 0x6380, 0x5FD0, 0x5B90, 0x56F0, + 0x5290, 0x4DF0, 0x49E0, 0x44D0, 0x3FF0, 0x3AA0, 0x3570, 0x30D0, 0x2CD0, 0x28F0, 0x2610, 0x22D0, 0x2000, 0x1C30, 0x1820, 0x0EC0, + 0x0D80, 0x0D10, 0x0C90, 0x0CB0, 0x0CE0, 0x0CD0, 0x0D10, 0x0D30, 0x0DB0, 0x0E00, 0x0EA0, 0x1000, 0x1060, 0x11C0, 0x11E0, 0x1090, + 0x0FB0, 0x0E00, 0x0C20, 0x0AD0, 0x0890, 0x05E0, 0x0300, 0xFFF0, 0xFBB0, 0xF660, 0xF1D0, 0xEC80, 0xE750, 0xE1E0, 0xDC90, 0xD6F0, + 0xD0E0, 0xCA70, 0xC330, 0xBC30, 0xB5E0, 0xAF90, 0xAA60, 0xA5D0, 0xA1E0, 0x9F30, 0x9CA0, 0x9B20, 0x9AA0, 0x9B50, 0x9D00, 0x9F30, + 0xA2F0, 0xA6C0, 0xAAC0, 0xAF10, 0xB4B0, 0xBA20, 0xC0D0, 0xC730, 0xCE20, 0xD430, 0xD930, 0xDF90, 0xE490, 0xEB00, 0xF090, 0xF570, + 0xFAE0, 0xFF90, 0x0480, 0x0990, 0x0EA0, 0x1400, 0x1900, 0x1D80, 0x2210, 0x2650, 0x2BD0, 0x3170, 0x37A0, 0x3D50, 0x4310, 0x49C0, + 0x50E0, 0x57D0, 0x5EF0, 0x6630, 0x6DE0, 0x74D0, 0x7B70, 0x7EE0, 0x7F30, 0x7F00, 0x7F00, 0x7F90, 0x7EF0, 0x7EB0, 0x7EE0, 0x7EF0, + 0x7F30, 0x7EE0, 0x7EC0, 0x7EF0, 0x7F10, 0x7F30, 0x7EE0, 0x7E90, 0x7910, 0x6860, 0x54D0, 0x4210, 0x2F60, 0x1E00, 0x0D50, 0xFE30, + 0xF0B0, 0xE520, 0xDAB0, 0xD170, 0xCAC0, 0xC690, 0xC380, 0xC1F0, 0xC2A0, 0xC4F0, 0xC980, 0xCF70, 0xD810, 0xE1F0, 0xED70, 0xFAB0, + 0x07D0, 0x1530, 0x2230, 0x2DF0, 0x38F0, 0x41F0, 0x4840, 0x4D10, 0x5040, 0x52A0, 0x54D0, 0x5770, 0x59A0, 0x5AC0, 0x5A90, 0x56F0, + 0x4FF0, 0x4740, 0x3BB0, 0x3030, 0x2400, 0x1770, 0x0C50, 0x00A0, 0xF7C0, 0xEF40, 0xE750, 0xE070, 0xD900, 0xD140, 0xC980, 0xC1C0, + 0xB9E0, 0xB200, 0xAA90, 0xA370, 0x9BF0, 0x9530, 0x8EE0, 0x8A80, 0x87E0, 0x8650, 0x85E0, 0x8550, 0x8550, 0x8500, 0x84F0, 0x84F0, + 0x84E0, 0x84E0, 0x84E0, 0x84D0, 0x84E0, 0x84D0, 0x84E0, 0x84E0, 0x84E0, 0x84E0, 0x84E0, 0x84E0, 0x84F0, 0x84D0, 0x84F0, 0x8500, + 0x8510, 0x8530, 0x8540, 0x8580, 0x85E0, 0x8660, 0x8770, 0x8970, 0x8D10, 0x92C0, 0x9890, 0x9E80, 0xA4A0, 0xAB40, 0xB100, 0xB710, + 0xBD80, 0xC410, 0xCAA0, 0xD150, 0xD850, 0xDF50, 0xE5D0, 0xEB70, 0xF0B0, 0xF4E0, 0xF980, 0xFDE0, 0x02B0, 0x06E0, 0x0A40, 0x0E60, + 0x10A0, 0x1280, 0x1490, 0x1610, 0x1930, 0x1BA0, 0x1CD0, 0x1E50, 0x1EF0, 0x2090, 0x22B0, 0x2560, 0x2840, 0x2BB0, 0x2EF0, 0x3220, + 0x35F0, 0x3A70, 0x3F70, 0x4590, 0x4C50, 0x53B0, 0x5C20, 0x6410, 0x6CB0, 0x74F0, 0x7C70, 0x7F10, 0x7EA0, 0x7EC0, 0x7E80, 0x7F10, + 0x7F20, 0x7F00, 0x7F20, 0x7F00, 0x7F10, 0x7F10, 0x7EA0, 0x7F00, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7E30, 0x7150, 0x6500, + 0x5800, 0x4A90, 0x3CF0, 0x2EA0, 0x2190, 0x1370, 0x07A0, 0xFB10, 0xF250, 0xEB00, 0xE4D0, 0xDFB0, 0xDB50, 0xD6B0, 0xD220, 0xCC80, + 0xC5D0, 0xBFC0, 0xB990, 0xB390, 0xAD40, 0xA7C0, 0xA300, 0x9EC0, 0x9C60, 0x9AB0, 0x9B10, 0x9C60, 0x9DC0, 0x9F00, 0x9F30, 0x9F80, + 0x9FB0, 0x9F10, 0x9DD0, 0x9B60, 0x98F0, 0x9520, 0x9040, 0x8C20, 0x8910, 0x8720, 0x8630, 0x85A0, 0x8550, 0x8530, 0x8510, 0x8500, + 0x84F0, 0x8500, 0x84E0, 0x84E0, 0x84E0, 0x84E0, 0x84E0, 0x84E0, 0x84E0, 0x84E0, 0x84E0, 0x84E0, 0x84F0, 0x84F0, 0x84F0, 0x84F0, + 0x84F0, 0x84F0, 0x84F0, 0x84F0, 0x8500, 0x8500, 0x8500, 0x8510, 0x8510, 0x8520, 0x8530, 0x8550, 0x8560, 0x8580, 0x85B0, 0x8610, + 0x86A0, 0x8790, 0x88D0, 0x8AC0, 0x8C30, 0x8D20, 0x8D40, 0x8C70, 0x8B30, 0x8980, 0x8810, 0x86E0, 0x8600, 0x8580, 0x8540, 0x8510, + 0x84F0, 0x84E0, 0x84E0, 0x84D0, 0x84C0, 0x84C0, 0x84A0, 0x84B0, 0x84B0, 0x84A0, 0x84A0, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, + 0x84A0, 0x84A0, 0x84A0, 0x84B0, 0x84B0, 0x84C0, 0x84C0, 0x84D0, 0x84D0, 0x84E0, 0x84F0, 0x8500, 0x8510, 0x8520, 0x8530, 0x8540, + 0x8550, 0x8570, 0x8590, 0x85B0, 0x85D0, 0x85E0, 0x85E0, 0x85E0, 0x85E0, 0x8600, 0x85E0, 0x85D0, 0x85C0, 0x85B0, 0x8590, 0x8570, + 0x8560, 0x8550, 0x8540, 0x8530, 0x8530, 0x8530, 0x8520, 0x8550, 0x8520, 0x8520, 0x8520, 0x8510, 0x8510, 0x8510, 0x8510, 0x8510, + 0x8520, 0x8520, 0x8520, 0x8530, 0x8530, 0x8550, 0x8560, 0x8580, 0x85B0, 0x85F0, 0x8640, 0x86C0, 0x8780, 0x88F0, 0x9320, 0x96C0, + 0x9A90, 0x9EB0, 0xA3C0, 0xA970, 0xAF20, 0xB4B0, 0xBA70, 0xBFB0, 0xC480, 0xC940, 0xCEC0, 0xD390, 0xD910, 0xDDE0, 0xE310, 0xE8F0, + 0xEE30, 0xF300, 0xF680, 0xF990, 0xFC50, 0xFF30, 0x0270, 0x0580, 0x08E0, 0x0BB0, 0x0EB0, 0x11F0, 0x13E0, 0x15F0, 0x1950, 0x1C30, + 0x1F30, 0x2190, 0x2490, 0x27F0, 0x2AE0, 0x2DD0, 0x3210, 0x3530, 0x3970, 0x3C50, 0x3FB0, 0x41F0, 0x4370, 0x4690, 0x4870, 0x4B70, + 0x4E00, 0x4FD0, 0x5280, 0x5410, 0x5610, 0x5780, 0x57C0, 0x5860, 0x5840, 0x5830, 0x58C0, 0x5890, 0x5860, 0x5780, 0x5660, 0x5550, + 0x53B0, 0x52C0, 0x51E0, 0x5140, 0x5130, 0x5090, 0x50E0, 0x5160, 0x51C0, 0x53D0, 0x56B0, 0x5B20, 0x5FC0, 0x6490, 0x6A30, 0x6FA0, + 0x75E0, 0x7B10, 0x7EF0, 0x7F00, 0x7EC0, 0x7ED0, 0x7EF0, 0x7F60, 0x7ED0, 0x7EB0, 0x7EE0, 0x7EE0, 0x7ED0, 0x7F10, 0x7E70, 0x7EC0, + 0x7ED0, 0x7F10, 0x7EE0, 0x7E90, 0x7F00, 0x7EA0, 0x75C0, 0x6D90, 0x64C0, 0x5C00, 0x5410, 0x4C50, 0x45E0, 0x4040, 0x3C80, 0x3AD0, + 0x3B90, 0x3EC0, 0x4380, 0x4840, 0x4C90, 0x5110, 0x5620, 0x59E0, 0x5C80, 0x5DB0, 0x5D20, 0x5BA0, 0x5840, 0x5330, 0x4C20, 0x44E0, + 0x3DF0, 0x37B0, 0x3320, 0x3240, 0x3510, 0x3C30, 0x4640, 0x5240, 0x5FB0, 0x6C20, 0x77C0, 0x7E80, 0x7F10, 0x7F00, 0x7EC0, 0x7F10, + 0x7F00, 0x7F20, 0x7EE0, 0x7E90, 0x7E30, 0x7B20, 0x7990, 0x7AE0, 0x7D60, 0x7F10, 0x7F10, 0x7F00, 0x7F20, 0x7ED0, 0x7F50, 0x7F00, + 0x7F00, 0x7F10, 0x7F00, 0x7F60, 0x7F00, 0x7F10, 0x7F10, 0x7EF0, 0x7F80, 0x7F10, 0x7F20, 0x7EF0, 0x7EF0, 0x7F90, 0x7F20, 0x7F00, + 0x7D50, 0x7400, 0x6860, 0x5AC0, 0x4C50, 0x4170, 0x39C0, 0x3670, 0x3690, 0x3820, 0x3A50, 0x3A70, 0x3760, 0x31C0, 0x2850, 0x1D90, + 0x1070, 0x0240, 0xF5D0, 0xE9C0, 0xE1D0, 0xDC90, 0xDAA0, 0xDBE0, 0xDE90, 0xE2F0, 0xE8A0, 0xEEA0, 0xF610, 0xFD10, 0x0460, 0x0A20, + 0x0E40, 0x01E0, 0xF810, 0xEB50, 0xDA00, 0xC400, 0xA930, 0x8C50, 0x8500, 0x84A0, 0x8480, 0x8460, 0x8450, 0x8430, 0x8430, 0x8430, + 0x8430, 0x8430, 0x8430, 0x8440, 0x8450, 0x8460, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8460, 0x8470, 0x8460, 0x8470, 0x8450, + 0x8440, 0x8430, 0x8440, 0x8420, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8420, 0x8420, 0x8430, 0x8430, + 0x8470, 0x8440, 0x8440, 0x8450, 0x8450, 0x8460, 0x8460, 0x8450, 0x8470, 0x8470, 0x8470, 0x8480, 0x8480, 0x8480, 0x8490, 0x8490, + 0x8490, 0x84A0, 0x84B0, 0x84B0, 0x84C0, 0x84D0, 0x84E0, 0x84F0, 0x8510, 0x8530, 0x8550, 0x8580, 0x85B0, 0x85F0, 0x8630, 0x86C0, + 0x87B0, 0x8910, 0x8B50, 0x8DF0, 0x9090, 0x9290, 0x9580, 0x9870, 0x9B50, 0x9F70, 0xA2D0, 0xA650, 0xA9E0, 0xAC90, 0xB090, 0xB430, + 0xB860, 0xBC80, 0xBFA0, 0xC260, 0xC490, 0xC630, 0xC900, 0xCBC0, 0xCFD0, 0xD260, 0xD480, 0xD620, 0xD7C0, 0xDA20, 0xDBE0, 0xDDD0, + 0xDFF0, 0xE130, 0xE360, 0xE590, 0xE850, 0xEB60, 0xEE10, 0xF0A0, 0xF200, 0xF2F0, 0xF330, 0xF3A0, 0xF500, 0xF690, 0xF7F0, 0xF940, + 0xF9A0, 0xFA10, 0xFAA0, 0xFA70, 0xFA40, 0xFAB0, 0xFB90, 0xFB20, 0xFA70, 0xFB10, 0xFBC0, 0xFCE0, 0xFE90, 0xFF90, 0x00C0, 0x00C0, + 0x00B0, 0x00A0, 0x0060, 0x00F0, 0x00C0, 0x00D0, 0x0160, 0x0040, 0x0010, 0xFF80, 0xFE30, 0xFCD0, 0xFAA0, 0xF8A0, 0xF610, 0xF350, + 0xF0E0, 0xEED0, 0xED70, 0xEB80, 0xE9E0, 0xE850, 0xE710, 0xE550, 0xE350, 0xE0C0, 0xDF80, 0xDCE0, 0xDB40, 0xD980, 0xD860, 0xD7E0, + 0xD690, 0xD550, 0xD380, 0xD120, 0xCF40, 0xCDB0, 0xCC60, 0xCA90, 0xC8B0, 0xC6B0, 0xC420, 0xC280, 0xC0E0, 0xBEE0, 0xBE10, 0xBCC0, + 0xBB90, 0xB9B0, 0xB870, 0xB710, 0xB5B0, 0xB560, 0xB5A0, 0xB610, 0xB6C0, 0xB7D0, 0xB8F0, 0xBB00, 0xBDC0, 0xC1B0, 0xC580, 0xC9D0, + 0xCE80, 0xD310, 0xD890, 0xDDA0, 0xE270, 0xE850, 0xEE40, 0xF4A0, 0xFAF0, 0x00A0, 0x05C0, 0x0AB0, 0x0FD0, 0x14C0, 0x1960, 0x1D50, + 0x2170, 0x2570, 0x2890, 0x2B90, 0x2E40, 0x3060, 0x32D0, 0x3470, 0x35B0, 0x3860, 0x39B0, 0x3BA0, 0x3C80, 0x3C50, 0x3D10, 0x3C70, + 0x3C60, 0x3C80, 0x3BB0, 0x3C60, 0x3D00, 0x3DC0, 0x3DC0, 0x3CD0, 0x3C70, 0x3C00, 0x3C60, 0x3DD0, 0x4080, 0x4520, 0x4980, 0x5010, + 0x57E0, 0x5FA0, 0x6880, 0x7110, 0x7990, 0x7E70, 0x7F10, 0x7F30, 0x7F00, 0x7F70, 0x7EF0, 0x7F20, 0x7F00, 0x7F00, 0x7F90, 0x7F10, + 0x7F20, 0x7F00, 0x7EF0, 0x7F30, 0x7F00, 0x7EC0, 0x7ED0, 0x7EB0, 0x7C90, 0x7A60, 0x7980, 0x7990, 0x7B00, 0x7D20, 0x7ED0, 0x7F10, + 0x7F20, 0x7F20, 0x7F10, 0x7F20, 0x7F20, 0x7F20, 0x7F40, 0x7F20, 0x7F10, 0x7F10, 0x7F00, 0x7F20, 0x7F10, 0x7F20, 0x7F20, 0x7F20, + 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F30, 0x7F40, 0x7F40, 0x7F30, 0x7F40, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, + 0x7F10, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F10, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, + 0x7F30, 0x7F20, 0x7EF0, 0x7F50, 0x7730, 0x67E0, 0x5840, 0x4850, 0x3840, 0x2860, 0x1A90, 0x0DB0, 0x03A0, 0xFB90, 0xF610, 0xF2A0, + 0xF010, 0xEE00, 0xEC50, 0xEAD0, 0xE950, 0xE840, 0xE6F0, 0xE620, 0xE540, 0xE4D0, 0xE400, 0xE450, 0xE520, 0xE650, 0xE7B0, 0xE830, + 0xE920, 0xEA00, 0xEA90, 0xEB50, 0xECE0, 0xEF10, 0xF0C0, 0xF220, 0xF3A0, 0xF4E0, 0xF680, 0xF7E0, 0xF9D0, 0xFBD0, 0xFD00, 0xFE80, + 0x0000, 0x01F0, 0x03E0, 0x0590, 0x0690, 0x07E0, 0x08B0, 0x09A0, 0x0B10, 0x0C70, 0x0DD0, 0x0F60, 0x1050, 0x1110, 0x11C0, 0x1200, + 0x12B0, 0x12B0, 0x1340, 0x1370, 0x1390, 0x12C0, 0x11C0, 0x1110, 0x1020, 0x0F20, 0x0E20, 0x0C90, 0x0B00, 0x08C0, 0x07C0, 0x0720, + 0x06E0, 0x05C0, 0x04C0, 0x0320, 0x01B0, 0x0050, 0xFF80, 0xFF00, 0xFEB0, 0xFE50, 0xFD60, 0xFD00, 0xFC40, 0xFC40, 0xFBB0, 0xFB20, + 0xFA40, 0xF950, 0xF830, 0xF740, 0xF660, 0xF600, 0xF5D0, 0xF5C0, 0xF510, 0xF430, 0xF390, 0xF360, 0xF2C0, 0xF1C0, 0xF0D0, 0xEFE0, + 0xEEF0, 0xEE90, 0xEE90, 0xEE40, 0xEDA0, 0xED50, 0xEC30, 0xEAC0, 0xE900, 0xE5B0, 0xE2E0, 0xDFF0, 0xDCB0, 0xD880, 0xD4C0, 0xD1B0, + 0xCDF0, 0xCB10, 0xC760, 0xC420, 0xC0F0, 0xBD30, 0xBA70, 0xB740, 0xB5C0, 0xB340, 0xB160, 0xB030, 0xAF50, 0xAE30, 0xAD10, 0xABF0, + 0xAB10, 0xAA90, 0xA960, 0xA850, 0xA6E0, 0xA6C0, 0xA620, 0xA540, 0xA4B0, 0xA460, 0xA450, 0xA4D0, 0xA530, 0xA620, 0xA670, 0xA690, + 0xA6A0, 0xA740, 0xA7B0, 0xA7D0, 0xA8A0, 0xA920, 0xAA20, 0xAB70, 0xACE0, 0xAE30, 0xAF70, 0xB0C0, 0xB1B0, 0xB2D0, 0xB4C0, 0xB5A0, + 0xB690, 0xB880, 0xBA40, 0xBC70, 0xBE50, 0xBFB0, 0xC1F0, 0xC380, 0xC4E0, 0xC690, 0xC7E0, 0xC980, 0xCB20, 0xD360, 0xD530, 0xD610, + 0xD7E0, 0xD910, 0xDB10, 0xDC30, 0xDC60, 0xDD30, 0xDD90, 0xDE40, 0xDEF0, 0xDFB0, 0xE080, 0xE160, 0xE260, 0xE2C0, 0xE350, 0xE4A0, + 0xE560, 0xE670, 0xE750, 0xE7A0, 0xE8D0, 0xEA30, 0xEBC0, 0xED60, 0xEF50, 0xF170, 0xF320, 0xF440, 0xF5D0, 0xF760, 0xF9C0, 0xFC60, + 0xFF10, 0x0180, 0x0360, 0x0590, 0x06D0, 0x08C0, 0x0B10, 0x0D30, 0x0FE0, 0x11D0, 0x12D0, 0x1560, 0x16A0, 0x1840, 0x1A30, 0x1BB0, + 0x1D80, 0x1E80, 0x1FD0, 0x20E0, 0x2220, 0x2450, 0x2580, 0x26A0, 0x2740, 0x27B0, 0x28B0, 0x2940, 0x2A90, 0x2BB0, 0x2BE0, 0x2CA0, + 0x2D10, 0x2E70, 0x2FE0, 0x3160, 0x3370, 0x3470, 0x35C0, 0x3610, 0x36F0, 0x37C0, 0x3A40, 0x3C90, 0x3F50, 0x41A0, 0x4510, 0x4830, + 0x4AA0, 0x4D00, 0x4F40, 0x5180, 0x5350, 0x5630, 0x5870, 0x5B60, 0x5EC0, 0x6200, 0x6430, 0x66C0, 0x6850, 0x6A10, 0x6B40, 0x6C60, + 0x6E50, 0x6FB0, 0x71E0, 0x7360, 0x74B0, 0x7640, 0x76E0, 0x7810, 0x7980, 0x79E0, 0x79E0, 0x7940, 0x7930, 0x7940, 0x7990, 0x7A70, + 0x7A60, 0x7AA0, 0x7A40, 0x7930, 0x7900, 0x7840, 0x7830, 0x77E0, 0x7700, 0x7680, 0x7590, 0x7470, 0x7400, 0x7340, 0x7330, 0x7280, + 0x71A0, 0x7040, 0x6EC0, 0x6EA0, 0x6EC0, 0x6F90, 0x7060, 0x7100, 0x7240, 0x7310, 0x74B0, 0x7560, 0x75E0, 0x76D0, 0x7880, 0x7AC0, + 0x7C60, 0x7D90, 0x7E30, 0x7E60, 0x7EC0, 0x7ED0, 0x7F70, 0x7F10, 0x7EB0, 0x7EE0, 0x7ED0, 0x7F10, 0x7F10, 0x7E70, 0x7ED0, 0x7ED0, + 0x7F30, 0x7F20, 0x7EA0, 0x7ED0, 0x7F10, 0x7F10, 0x7F00, 0x7EC0, 0x7F00, 0x7F10, 0x7F10, 0x7F10, 0x7EC0, 0x7F40, 0x7F30, 0x7F20, + 0x7F20, 0x7EF0, 0x7F50, 0x7F20, 0x7F40, 0x7F10, 0x7F10, 0x7F30, 0x7E60, 0x7B10, 0x76B0, 0x7260, 0x6D50, 0x6850, 0x63D0, 0x6100, + 0x5F50, 0x5EB0, 0x5EF0, 0x5FD0, 0x6210, 0x6470, 0x6770, 0x6BD0, 0x7000, 0x7500, 0x79A0, 0x7CC0, 0x7EA0, 0x7EA0, 0x7F10, 0x7F10, + 0x7F20, 0x7EE0, 0x7EC0, 0x7F10, 0x7F00, 0x7F30, 0x7F00, 0x7EC0, 0x7F10, 0x7F10, 0x7F00, 0x7F20, 0x7EE0, 0x7F30, 0x7F00, 0x7EF0, + 0x7F10, 0x7F10, 0x7F60, 0x7F00, 0x7F10, 0x7F10, 0x7EF0, 0x7F90, 0x7F10, 0x7F20, 0x7EF0, 0x7EF0, 0x7F90, 0x7F20, 0x7F00, 0x7EF0, + 0x7F00, 0x7F60, 0x7F10, 0x7ED0, 0x7EB0, 0x7EE0, 0x7EF0, 0x7EF0, 0x7EB0, 0x7ED0, 0x7EF0, 0x7F30, 0x7F20, 0x7EC0, 0x7EB0, 0x7EF0, + 0x7EE0, 0x7EF0, 0x7E90, 0x7EB0, 0x7F00, 0x7EF0, 0x7F10, 0x7F00, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F00, 0x7F10, 0x7F20, 0x7F00, + 0x7EF0, 0x7F10, 0x7F60, 0x7F20, 0x7F20, 0x7F20, 0x7F00, 0x7A40, 0x7190, 0x6860, 0x5F40, 0x55D0, 0x4C80, 0x4270, 0x3A90, 0x33B0, + 0x2CE0, 0x27C0, 0x22E0, 0x1DB0, 0x19B0, 0x15A0, 0x1190, 0x0F00, 0x0CD0, 0x0BF0, 0x0B70, 0x0BC0, 0x0C40, 0x0D30, 0x0F10, 0x1160, + 0x1440, 0x1810, 0x1B30, 0x2020, 0x24F0, 0x2990, 0x2F90, 0x3500, 0x3B70, 0x4120, 0x4700, 0x4E00, 0x5440, 0x5A10, 0x5F60, 0x63C0, + 0x6850, 0x6CC0, 0x7040, 0x7350, 0x7590, 0x77E0, 0x79C0, 0x7B90, 0x7CF0, 0x7E20, 0x7ED0, 0x7EB0, 0x7F60, 0x7EF0, 0x7F10, 0x7F00, + 0x7F00, 0x7F70, 0x7F10, 0x7F10, 0x7EF0, 0x7EF0, 0x7F60, 0x7EF0, 0x7EB0, 0x7EA0, 0x7E60, 0x7E30, 0x7E10, 0x7E10, 0x7EA0, 0x7EE0, + 0x7F10, 0x7F10, 0x7E70, 0x7EE0, 0x7F10, 0x7F00, 0x7EF0, 0x7E90, 0x7E90, 0x7F20, 0x7F20, 0x7F10, 0x7F00, 0x7F20, 0x7F10, 0x7F10, + 0x7F10, 0x7EE0, 0x7F40, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F40, 0x7F40, 0x7F10, 0x7F10, 0x7F00, 0x7F40, 0x7EF0, 0x7F10, 0x7F00, + 0x7EF0, 0x7650, 0x6980, 0x5C60, 0x4F40, 0x41B0, 0x3490, 0x28B0, 0x1C80, 0x1110, 0x06F0, 0xFE60, 0xF650, 0xEF10, 0xE880, 0xE280, + 0xDD10, 0xD850, 0xD310, 0xCFA0, 0xCD90, 0xCD20, 0xCEC0, 0xD200, 0xD6B0, 0xDC80, 0xE2A0, 0xEB30, 0xF260, 0xFAB0, 0x03C0, 0x0DF0, + 0x1900, 0x24E0, 0x3210, 0x3E40, 0x49F0, 0x5540, 0x6130, 0x6E00, 0x7A60, 0x7EF0, 0x7F20, 0x7F00, 0x7F10, 0x7F20, 0x7F20, 0x7F20, + 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F40, 0x7950, 0x5B30, + 0x3E20, 0x20E0, 0x03F0, 0xE6F0, 0xCA90, 0xAEC0, 0x9210, 0x8660, 0x84F0, 0x84C0, 0x84A0, 0x8490, 0x8480, 0x8470, 0x8460, 0x8450, + 0x8450, 0x8440, 0x8430, 0x8440, 0x8440, 0x8450, 0x8460, 0x8470, 0x8480, 0x8490, 0x84B0, 0x84E0, 0x8530, 0x85D0, 0x86C0, 0x8740, + 0x86B0, 0x85C0, 0x8530, 0x84F0, 0x84E0, 0x84D0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84D0, 0x8510, + 0x8520, 0x85C0, 0x87E0, 0x8FB0, 0x9930, 0xA070, 0xA4A0, 0xA630, 0xA440, 0x9F50, 0x9760, 0x8EC0, 0x8840, 0x85F0, 0x8540, 0x8500, + 0x84F0, 0x84E0, 0x84E0, 0x84D0, 0x84D0, 0x84C0, 0x84C0, 0x84B0, 0x84D0, 0x84A0, 0x8490, 0x8490, 0x8490, 0x8480, 0x8480, 0x8470, + 0x8470, 0x8470, 0x8470, 0x8460, 0x8460, 0x8450, 0x8450, 0x8450, 0x8450, 0x8430, 0x8440, 0x8440, 0x8430, 0x8430, 0x8430, 0x8430, + 0x8440, 0x8430, 0x8440, 0x8450, 0x8460, 0x8470, 0x8480, 0x84A0, 0x84E0, 0x8680, 0x9AA0, 0xAFB0, 0xBB90, 0xBF80, 0xBE00, 0xB9A0, + 0xB400, 0xADD0, 0xA6B0, 0x9F60, 0x9650, 0x8D30, 0x8760, 0x8550, 0x84E0, 0x84D0, 0x84B0, 0x8490, 0x8480, 0x8410, 0x8470, 0x8460, + 0x8450, 0x8440, 0x8440, 0x8430, 0x8420, 0x8420, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8420, 0x8420, 0x8430, + 0x8430, 0x8440, 0x8440, 0x8450, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8450, 0x8450, 0x8450, 0x8450, 0x8440, 0x8440, 0x8410, + 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8450, 0x8420, 0x8460, 0x8460, 0x8460, 0x8470, 0x8450, 0x8450, 0x8420, 0x8440, + 0x8430, 0x8430, 0x8420, 0x8410, 0x8410, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8410, 0x8420, 0x8430, 0x8430, + 0x8440, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, + 0x8460, 0x8460, 0x8460, 0x8470, 0x8470, 0x8480, 0x8470, 0x8490, 0x8490, 0x84A0, 0x84B0, 0x84C0, 0x84E0, 0x8500, 0x8550, 0x8650, + 0x8970, 0x92B0, 0x9E50, 0xA8B0, 0xB2C0, 0xBC10, 0xC5B0, 0xD070, 0xDA60, 0xE520, 0xF080, 0xFCE0, 0x0980, 0x1710, 0x25E0, 0x3560, + 0x45A0, 0x5380, 0x5ED0, 0x66A0, 0x6960, 0x66C0, 0x5C90, 0x4AB0, 0x3240, 0x1140, 0xEDB0, 0xC7D0, 0xA1F0, 0x87C0, 0x84E0, 0x84B0, + 0x8450, 0x8490, 0x8480, 0x8470, 0x8470, 0x8460, 0x8460, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, + 0x8450, 0x8450, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8470, 0x8470, 0x8470, 0x8480, 0x84A0, 0x8490, 0x8490, + 0x8490, 0x8490, 0x8490, 0x84A0, 0x84C0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84B0, 0x84A0, 0x84A0, 0x84B0, 0x84B0, 0x84B0, + 0x84B0, 0x84B0, 0x84C0, 0x84C0, 0x84D0, 0x84E0, 0x8500, 0x8530, 0x8590, 0x8650, 0x8780, 0x8920, 0x8AB0, 0x8C90, 0x8E50, 0x90E0, + 0x9410, 0x9680, 0x98C0, 0x9A70, 0x9A80, 0x9930, 0x96E0, 0x9370, 0x8FC0, 0x8C30, 0x8990, 0x87A0, 0x8690, 0x8620, 0x8660, 0x8690, + 0x87F0, 0x8B10, 0x9190, 0x9890, 0x9D10, 0x9E40, 0x9750, 0x99A0, 0x9D40, 0xA1F0, 0xA730, 0xABE0, 0xAF90, 0xB2F0, 0xB520, 0xB870, + 0xBC80, 0xC2D0, 0xCAF0, 0xD4E0, 0xE1C0, 0xF000, 0xFE90, 0x0D70, 0x1A70, 0x2650, 0x2FC0, 0x3760, 0x3D90, 0x42E0, 0x47F0, 0x4CC0, + 0x50C0, 0x53B0, 0x5500, 0x54D0, 0x5210, 0x4E10, 0x4860, 0x40F0, 0x3950, 0x31A0, 0x2A30, 0x22E0, 0x1B30, 0x16A0, 0x1320, 0x1190, + 0x1210, 0x1400, 0x1840, 0x1CD0, 0x2210, 0x2960, 0x3010, 0x3770, 0x3F40, 0x4640, 0x4D90, 0x5400, 0x5970, 0x5E40, 0x62E0, 0x6820, + 0x6C80, 0x71C0, 0x7680, 0x7A60, 0x7DA0, 0x7ED0, 0x7F30, 0x7F10, 0x7F10, 0x7F20, 0x7EE0, 0x7F50, 0x7F20, 0x7F20, 0x7F10, 0x7F10, + 0x7F60, 0x7F20, 0x7F40, 0x7F10, 0x7F00, 0x7F60, 0x7EF0, 0x7EF0, 0x7F10, 0x7EF0, 0x7F80, 0x7F00, 0x7F00, 0x7F10, 0x7F10, 0x7F30, + 0x7EE0, 0x7EC0, 0x7F10, 0x7F00, 0x7F40, 0x7ED0, 0x7EB0, 0x7F00, 0x7F00, 0x7F10, 0x7F10, 0x7EC0, 0x7F10, 0x7F10, 0x7EF0, 0x7F00, + 0x7EC0, 0x7F20, 0x7F00, 0x7F20, 0x7F20, 0x7EC0, 0x7F10, 0x7F00, 0x7F20, 0x7F40, 0x7F10, 0x7F60, 0x7F00, 0x7F20, 0x7F40, 0x7F00, + 0x7F30, 0x7EE0, 0x7EF0, 0x7F30, 0x7F10, 0x7F70, 0x7EF0, 0x7F00, 0x7EF0, 0x7F10, 0x7F70, 0x7F00, 0x7ED0, 0x7ED0, 0x7EB0, 0x7F60, + 0x7F10, 0x7EB0, 0x7EB0, 0x7EC0, 0x7EF0, 0x7F10, 0x7EA0, 0x7EE0, 0x7ED0, 0x7F20, 0x7F20, 0x7E90, 0x7ED0, 0x7F00, 0x7EE0, 0x7EF0, + 0x7EC0, 0x7EE0, 0x7EF0, 0x7F10, 0x7F20, 0x7F00, 0x7F40, 0x7F10, 0x7F10, 0x7F00, 0x7F00, 0x7F20, 0x7F20, 0x7EF0, 0x7F10, 0x7F10, + 0x7F60, 0x7F10, 0x7F10, 0x7F10, 0x7F10, 0x7F30, 0x7F20, 0x7EF0, 0x7F10, 0x7F10, 0x7F60, 0x7EF0, 0x7F10, 0x7F00, 0x7F20, 0x7F80, + 0x7ED0, 0x7EB0, 0x7EE0, 0x7EF0, 0x7F30, 0x7EE0, 0x7EC0, 0x7EF0, 0x7F10, 0x7F20, 0x7EE0, 0x7E90, 0x7F10, 0x7EF0, 0x7F40, 0x7F10, + 0x7EA0, 0x7F00, 0x7EF0, 0x7F10, 0x7F20, 0x7F00, 0x7F40, 0x7F20, 0x7F20, 0x7F10, 0x7800, 0x6E70, 0x6520, 0x5B50, 0x52B0, 0x4880, + 0x3BF0, 0x2DB0, 0x1CA0, 0x0A40, 0xF510, 0xDD80, 0xC520, 0xAC00, 0x93D0, 0x86E0, 0x8510, 0x84D0, 0x84C0, 0x84B0, 0x84A0, 0x8490, + 0x8490, 0x8480, 0x8480, 0x8480, 0x8480, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, + 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8490, 0x8490, + 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, + 0x84B0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84B0, 0x84B0, 0x84E0, 0x84B0, 0x84B0, 0x84D0, 0x84C0, 0x84D0, 0x84F0, + 0x8500, 0x8550, 0x8640, 0x8BA0, 0xA1F0, 0xC010, 0xE500, 0x10B0, 0x4530, 0x7520, 0x7F40, 0x7F30, 0x7F30, 0x7F40, 0x7F20, 0x7F30, + 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x58A0, 0xDF50, 0x8790, 0x8490, 0x8470, 0x8460, 0x8470, 0x8470, 0x8480, 0x84A0, 0x84D0, + 0x8500, 0x8520, 0x8510, 0x84E0, 0x84B0, 0x8490, 0x8470, 0x8470, 0x8460, 0x8460, 0x8460, 0x8470, 0x8470, 0x8480, 0x84A0, 0x84F0, + 0x9330, 0xD740, 0x10F0, 0x3AA0, 0x4CC0, 0x44B0, 0x2660, 0xF820, 0xC090, 0x8B90, 0x84C0, 0x8490, 0x8470, 0x8450, 0x8450, 0x8440, + 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8450, 0x8450, 0x8460, 0x8470, 0x8470, 0x8490, 0x84B0, 0x84E0, 0x8580, 0x8A60, + 0xA360, 0xBAC0, 0xD370, 0xECB0, 0x0570, 0x1C70, 0x2EC0, 0x3B10, 0x4190, 0x4260, 0x4040, 0x3CF0, 0x3A80, 0x3A60, 0x3D40, 0x4250, + 0x4AB0, 0x54A0, 0x60A0, 0x6AE0, 0x7270, 0x7650, 0x75B0, 0x6FE0, 0x6420, 0x53F0, 0x4130, 0x2EA0, 0x1FF0, 0x1530, 0x0DB0, 0x0920, + 0x05D0, 0x0400, 0x04B0, 0x07B0, 0x0EC0, 0x1830, 0x23E0, 0x2FA0, 0x3AF0, 0x44B0, 0x4D60, 0x5500, 0x5C00, 0x6150, 0x6330, 0x60A0, + 0x57C0, 0x4890, 0x3480, 0x1EB0, 0x0A30, 0xFA40, 0xF070, 0xEDB0, 0xF030, 0xF630, 0xFDB0, 0x05A0, 0x0CB0, 0x12B0, 0x15E0, 0x1660, + 0x1330, 0x0D00, 0x0470, 0xFAE0, 0xF050, 0xE5D0, 0xDAC0, 0xCF20, 0xC170, 0xB400, 0xA700, 0x9A90, 0x8FD0, 0x8980, 0x86B0, 0x85B0, + 0x8540, 0x8510, 0x8500, 0x8500, 0x8500, 0x8510, 0x8530, 0x8560, 0x85F0, 0x8710, 0x89F0, 0x8EC0, 0x9230, 0x93E0, 0x9380, 0x9190, + 0x8ED0, 0x8C20, 0x8A20, 0x8860, 0x8760, 0x86C0, 0x8660, 0x8640, 0x8650, 0x8690, 0x8700, 0x87C0, 0x8920, 0x8C40, 0x9220, 0x9B50, + 0xA600, 0xB330, 0xC140, 0xD000, 0xE030, 0xF200, 0x0460, 0x1750, 0x2AD0, 0x3EE0, 0x5270, 0x6550, 0x75D0, 0x7F20, 0x7ED0, 0x7EB0, + 0x7F30, 0x7F00, 0x7F10, 0x7EB0, 0x7EA0, 0x7F00, 0x7EF0, 0x7F20, 0x7EC0, 0x7E90, 0x7F10, 0x7F20, 0x7F00, 0x7F10, 0x7F00, 0x7F20, + 0x7F00, 0x7F00, 0x7F00, 0x7F00, 0x7F30, 0x7F00, 0x7F40, 0x7F10, 0x7F00, 0x7F40, 0x7F10, 0x7F10, 0x7F20, 0x7EF0, 0x7F80, 0x7F10, + 0x7F20, 0x7F00, 0x7F10, 0x7F80, 0x7F00, 0x7F10, 0x7EF0, 0x7EF0, 0x7F60, 0x7EF0, 0x7ED0, 0x7EE0, 0x7EE0, 0x7F50, 0x7F10, 0x7EB0, + 0x7EE0, 0x7ED0, 0x7F10, 0x7F00, 0x7E90, 0x7EB0, 0x7EE0, 0x7EF0, 0x7F10, 0x7EA0, 0x78A0, 0x70D0, 0x68B0, 0x60E0, 0x5980, 0x5390, + 0x4F70, 0x4CA0, 0x4C20, 0x4C80, 0x4D30, 0x4EE0, 0x50D0, 0x5490, 0x5880, 0x5CC0, 0x60B0, 0x6390, 0x6660, 0x67A0, 0x68F0, 0x6A30, + 0x6AF0, 0x6C50, 0x6D90, 0x6E80, 0x7020, 0x7140, 0x7230, 0x7330, 0x73D0, 0x7510, 0x75B0, 0x7740, 0x7890, 0x7A30, 0x7C00, 0x7D20, + 0x7DD0, 0x7E40, 0x7ED0, 0x7E90, 0x7E30, 0x7EC0, 0x7EF0, 0x7F10, 0x7F00, 0x7EC0, 0x7EF0, 0x7F10, 0x7F20, 0x7F20, 0x7EC0, 0x7F10, + 0x7F00, 0x7EF0, 0x7F10, 0x7EA0, 0x7F20, 0x7EF0, 0x7F10, 0x7F20, 0x7F20, 0x7F80, 0x7F10, 0x7F20, 0x7F40, 0x7F10, 0x7F60, 0x7EE0, + 0x7EF0, 0x7F20, 0x7F00, 0x7F60, 0x7F10, 0x7F20, 0x7F00, 0x7EF0, 0x7F70, 0x7F00, 0x7EE0, 0x7EE0, 0x7EF0, 0x7F30, 0x7F10, 0x7F00, + 0x7F00, 0x7EF0, 0x7F30, 0x7F00, 0x7720, 0x6890, 0x5950, 0x4970, 0x3C60, 0x3050, 0x2630, 0x12C0, 0x13B0, 0x1530, 0x1740, 0x19A0, + 0x1C50, 0x1FE0, 0x2360, 0x2690, 0x2A90, 0x2D90, 0x30A0, 0x3260, 0x3360, 0x34D0, 0x34B0, 0x34E0, 0x3640, 0x39F0, 0x4030, 0x46C0, + 0x4DC0, 0x5380, 0x57E0, 0x5B80, 0x5D90, 0x6060, 0x62A0, 0x63E0, 0x6490, 0x6400, 0x6230, 0x6040, 0x5C60, 0x5910, 0x5500, 0x50E0, + 0x4BE0, 0x4650, 0x4190, 0x3C20, 0x3640, 0x30D0, 0x2B80, 0x2730, 0x2340, 0x20A0, 0x1F40, 0x1D50, 0x1D90, 0x1D60, 0x1CA0, 0x1C50, + 0x1BF0, 0x1C00, 0x1C00, 0x1BF0, 0x1CB0, 0x1BF0, 0x1BC0, 0x1A90, 0x1930, 0x1820, 0x1680, 0x1580, 0x1440, 0x12A0, 0x1150, 0x0F30, + 0x0E20, 0x0D40, 0x0BE0, 0x0BB0, 0x0A10, 0x0950, 0x08D0, 0x07D0, 0x07C0, 0x0710, 0x0790, 0x06B0, 0x0640, 0x0710, 0x0800, 0x0940, + 0x0AE0, 0x0C30, 0x0DD0, 0x0EC0, 0x1050, 0x1270, 0x1500, 0x1870, 0x1AE0, 0x1E10, 0x2150, 0x2430, 0x27A0, 0x2AC0, 0x2EF0, 0x33B0, + 0x3780, 0x3BC0, 0x3FF0, 0x43F0, 0x48E0, 0x4DE0, 0x52D0, 0x5730, 0x5BF0, 0x6040, 0x6480, 0x6920, 0x6D00, 0x7090, 0x7430, 0x7760, + 0x7AC0, 0x7D30, 0x7E70, 0x7EC0, 0x7E90, 0x7F10, 0x7F10, 0x7F20, 0x7F10, 0x7F00, 0x7F10, 0x7F10, 0x7F10, 0x7F20, 0x7EC0, 0x7F10, + 0x7F10, 0x7F20, 0x7F40, 0x7F00, 0x7F30, 0x7F20, 0x7F40, 0x7F10, 0x7F10, 0x7F60, 0x7EF0, 0x7F10, 0x7F20, 0x7EF0, 0x7F90, 0x7F10, + 0x7F20, 0x7F00, 0x7EF0, 0x7F70, 0x7F00, 0x7F10, 0x7EF0, 0x7EE0, 0x7F60, 0x7F10, 0x7EB0, 0x7EE0, 0x7EE0, 0x7ED0, 0x7F20, 0x7EC0, + 0x7ED0, 0x7EB0, 0x7F00, 0x7F00, 0x7E90, 0x7F00, 0x7F20, 0x7F10, 0x7F20, 0x7EC0, 0x7EF0, 0x7F10, 0x7F00, 0x7F00, 0x7EC0, 0x7F30, + 0x7F00, 0x7F00, 0x7EF0, 0x7F00, 0x7F40, 0x7F20, 0x7F10, 0x7F10, 0x7F00, 0x7F50, 0x7F10, 0x7F20, 0x7EF0, 0x7EF0, 0x7F50, 0x7EE0, + 0x7A60, 0x7490, 0x6DF0, 0x6840, 0x62C0, 0x5E10, 0x5AB0, 0x57E0, 0x5570, 0x5410, 0x5360, 0x53D0, 0x5390, 0x52F0, 0x51F0, 0x5010, + 0x4EB0, 0x4CB0, 0x4AF0, 0x49C0, 0x4870, 0x47D0, 0x4700, 0x45C0, 0x4600, 0x45C0, 0x46F0, 0x4820, 0x49A0, 0x4B90, 0x4DA0, 0x5020, + 0x52A0, 0x53D0, 0x55E0, 0x5760, 0x58E0, 0x5990, 0x5B00, 0x5D00, 0x5E00, 0x5E90, 0x5EE0, 0x5EE0, 0x5ED0, 0x5E20, 0x5D20, 0x5C40, + 0x5A90, 0x59E0, 0x58A0, 0x5890, 0x59D0, 0x5CB0, 0x5FE0, 0x6370, 0x6670, 0x6960, 0x6AC0, 0x6BB0, 0x6B60, 0x69F0, 0x6910, 0x6730, + 0x6720, 0x66D0, 0x66F0, 0x67B0, 0x6770, 0x6780, 0x6690, 0x6580, 0x64A0, 0x6280, 0x6180, 0x6000, 0x5D60, 0x5B90, 0x5910, 0x5670, + 0x5280, 0x4EE0, 0x4BA0, 0x4880, 0x45B0, 0x42A0, 0x3FC0, 0x3D50, 0x3A80, 0x37B0, 0x3510, 0x31D0, 0x2F30, 0x2C40, 0x2920, 0x2630, + 0x2390, 0x2230, 0x2140, 0x2230, 0x24A0, 0x27F0, 0x2C90, 0x30B0, 0x33A0, 0x3590, 0x36C0, 0x37B0, 0x3840, 0x3900, 0x38F0, 0x3880, + 0x3870, 0x3840, 0x38B0, 0x3990, 0x3AE0, 0x3CE0, 0x3E50, 0x3F30, 0x3ED0, 0x3D70, 0x3BE0, 0x3A60, 0x3A30, 0x3AF0, 0x3CC0, 0x4070, + 0x45E0, 0x4CB0, 0x5560, 0x5EC0, 0x6910, 0x72B0, 0x7B20, 0x7F10, 0x7F30, 0x7F20, 0x7F40, 0x7F50, 0x7F30, 0x79E0, 0x6D60, 0x6040, + 0x5370, 0x4AA0, 0x4480, 0x42B0, 0x4490, 0x4A20, 0x5240, 0x5AD0, 0x63B0, 0x6CC0, 0x7350, 0x7910, 0x7DA0, 0x7F10, 0x7F10, 0x7F30, + 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F30, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, + 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7B40, 0x6510, 0x4E50, 0x36A0, 0x1EF0, 0x07F0, 0xF5B0, 0xE6D0, + 0xDB10, 0xD2F0, 0xCDC0, 0xCBA0, 0xCCD0, 0xD090, 0xD850, 0xE250, 0xEE20, 0xFAF0, 0x07D0, 0x1510, 0x20D0, 0x2C40, 0x35C0, 0x3ED0, + 0x46A0, 0x4DA0, 0x5560, 0x5CB0, 0x6290, 0x67B0, 0x6BC0, 0x6E10, 0x6EB0, 0x6D20, 0x6940, 0x6410, 0x5E00, 0x56C0, 0x5010, 0x4A00, + 0x44D0, 0x3F00, 0x3910, 0x32F0, 0x2C00, 0x23C0, 0x1B30, 0x1170, 0x0730, 0xFD70, 0xF290, 0xE940, 0xE100, 0xD9D0, 0xD3A0, 0xCF20, + 0xCC50, 0xCA10, 0xC8C0, 0xC7B0, 0xC780, 0xC8B0, 0xCB10, 0xCE80, 0xD3B0, 0xDA00, 0xE070, 0xE6B0, 0xEBC0, 0xEE30, 0xEF60, 0xEED0, + 0xED60, 0xEAF0, 0xE870, 0xE4A0, 0xDFF0, 0xDCD0, 0xDBE0, 0xDBF0, 0xDF30, 0xE310, 0xE560, 0xE4B0, 0xDE20, 0xD150, 0xBB10, 0x9F60, + 0x87F0, 0x84E0, 0x84D0, 0x8490, 0x8470, 0x8470, 0x84A0, 0x8470, 0x8470, 0x8480, 0x8480, 0x8480, 0x8480, 0x8490, 0x8490, 0x8490, + 0x84A0, 0x84A0, 0x84B0, 0x84C0, 0x84D0, 0x8510, 0x8500, 0x8530, 0x85A0, 0x8630, 0x8730, 0x88D0, 0x8AE0, 0x8D50, 0x8F10, 0x8FC0, + 0x8FB0, 0x8E50, 0x8C30, 0x8A20, 0x8820, 0x86D0, 0x85E0, 0x8560, 0x8520, 0x8500, 0x84F0, 0x84D0, 0x84C0, 0x84C0, 0x84B0, 0x84A0, + 0x8490, 0x84C0, 0x8490, 0x8470, 0x8470, 0x8470, 0x8470, 0x8460, 0x8460, 0x8460, 0x8460, 0x8490, 0x8470, 0x8460, 0x8460, 0x8460, + 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8470, 0x8470, 0x8470, + 0x8480, 0x8480, 0x8490, 0x8490, 0x84A0, 0x84B0, 0x84C0, 0x84C0, 0x84E0, 0x8500, 0x8550, 0x85E0, 0x8710, 0x89C0, 0x8E70, 0x9420, + 0x99B0, 0x9EF0, 0xA490, 0xA9B0, 0xAE10, 0xB120, 0xB270, 0xB2B0, 0xB0B0, 0xAD80, 0xA940, 0xA510, 0xA0C0, 0x9C30, 0x97C0, 0x9310, + 0x8E20, 0x8A70, 0x87E0, 0x8680, 0x85F0, 0x85A0, 0x8590, 0x8590, 0x85C0, 0x8620, 0x86E0, 0x8870, 0x8C10, 0x9250, 0x9930, 0xA190, + 0xAA40, 0xB300, 0xBB10, 0xC320, 0xC9A0, 0xCF80, 0xD380, 0xD6C0, 0xD990, 0xDBE0, 0xDEE0, 0xE080, 0xE190, 0xE1D0, 0xE120, 0xE040, + 0xDF90, 0xDEC0, 0xDE20, 0xDD30, 0xDC90, 0xDBB0, 0xDA60, 0xD950, 0xD990, 0xDA70, 0xDC10, 0xDD70, 0xDF70, 0xE130, 0xE4D0, 0xE810, + 0xECC0, 0xF180, 0xF630, 0xFB00, 0x00A0, 0x04C0, 0x09D0, 0x0E40, 0x1320, 0x1790, 0x1B10, 0x1E80, 0x20D0, 0x2310, 0x2530, 0x2760, + 0x2910, 0x2A50, 0x2B40, 0x2C10, 0x2BE0, 0x2BA0, 0x2AD0, 0x2990, 0x2850, 0x2660, 0x24F0, 0x23F0, 0x2320, 0x1EA0, 0x1D00, 0x1B90, + 0x1970, 0x1860, 0x1640, 0x1470, 0x1380, 0x1260, 0x11B0, 0x10F0, 0x0F50, 0x0EB0, 0x0DA0, 0x0CD0, 0x0B80, 0x0A30, 0x0A40, 0x0A10, + 0x0B50, 0x0CB0, 0x0EA0, 0x1170, 0x1360, 0x1750, 0x1B00, 0x1EA0, 0x2240, 0x24B0, 0x2840, 0x2A60, 0x2CB0, 0x2F00, 0x3050, 0x31B0, + 0x3130, 0x2FA0, 0x2F80, 0x2E90, 0x2E20, 0x2D80, 0x2C90, 0x2C10, 0x2B00, 0x2A00, 0x2990, 0x2A30, 0x2B90, 0x2C90, 0x2DB0, 0x2E20, + 0x2E90, 0x2F30, 0x30E0, 0x33E0, 0x3800, 0x3D10, 0x4260, 0x4800, 0x4D50, 0x5330, 0x5920, 0x5FC0, 0x65D0, 0x6C30, 0x71F0, 0x76F0, + 0x7C20, 0x7EE0, 0x7F70, 0x7EF0, 0x7EF0, 0x7EE0, 0x7EF0, 0x7F60, 0x7EF0, 0x7F10, 0x7F20, 0x7F00, 0x7F70, 0x7ED0, 0x7EA0, 0x7EE0, + 0x7F10, 0x7F30, 0x7EB0, 0x7EA0, 0x7EF0, 0x7F10, 0x7F20, 0x7F20, 0x7EC0, 0x7F20, 0x7F00, 0x7F70, 0x7F10, 0x7EA0, 0x7EC0, 0x7ED0, + 0x7F30, 0x7F20, 0x7EA0, 0x7ED0, 0x7EE0, 0x7F20, 0x7F10, 0x7E90, 0x7EB0, 0x7F00, 0x7F10, 0x7F10, 0x7E90, 0x7F00, 0x7F00, 0x7F10, + 0x7F20, 0x7F00, 0x7F40, 0x7F10, 0x7F20, 0x7F20, 0x7F00, 0x7F30, 0x7F20, 0x7F20, 0x7EF0, 0x7F10, 0x7F60, 0x7EF0, 0x7F30, 0x7F20, + 0x7F10, 0x7F50, 0x7EF0, 0x7F00, 0x7EF0, 0x7ED0, 0x7F10, 0x7EF0, 0x7F20, 0x7F20, 0x7F10, 0x7F70, 0x7EE0, 0x7EE0, 0x7EF0, 0x7F10, + 0x7F30, 0x7EE0, 0x7E90, 0x7F10, 0x7F20, 0x7EC0, 0x7910, 0x7130, 0x68E0, 0x60D0, 0x59B0, 0x5500, 0x5040, 0x4BF0, 0x4710, 0x4100, + 0x3A20, 0x3140, 0x27A0, 0x1C80, 0x1040, 0x0340, 0xF420, 0xE2E0, 0xD050, 0xBCC0, 0xA670, 0x9110, 0x8680, 0x84F0, 0x84C0, 0x8480, + 0x8490, 0x8480, 0x8470, 0x8460, 0x8460, 0x8450, 0x8450, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, + 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8450, 0x8450, 0x8450, 0x8450, 0x8460, 0x8450, + 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8470, 0x8460, 0x8470, 0x84A0, 0x8470, 0x84A0, 0x8470, 0x8470, 0x8480, 0x8470, 0x8480, + 0x84B0, 0x84B0, 0x8480, 0x8480, 0x8440, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8490, 0x8480, 0x8480, + 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8490, 0x8480, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, + 0x8490, 0x8480, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x84A0, 0x8490, 0x8480, 0x8490, 0x8490, 0x8490, 0x8490, 0x84A0, 0x8430, + 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, + 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x8490, 0x84A0, 0x84A0, 0x84A0, 0x8490, 0x8490, 0x8490, + 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x84C0, 0x8490, + 0x8490, 0x8490, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84B0, 0x84B0, 0x84B0, 0x84C0, 0x84C0, 0x84D0, 0x84D0, 0x84E0, 0x84F0, 0x8510, + 0x8550, 0x8550, 0x85A0, 0x8620, 0x8710, 0x88A0, 0x8B30, 0x8EF0, 0x9390, 0x9820, 0x9C40, 0xA090, 0xA560, 0xA930, 0xACF0, 0xB150, + 0xB530, 0xB8C0, 0xBCE0, 0xC090, 0xC3E0, 0xC640, 0xC860, 0xCA80, 0xCC50, 0xCE90, 0xD160, 0xD320, 0xD530, 0xD6E0, 0xD8A0, 0xD9D0, + 0xDB80, 0xDD80, 0xDEC0, 0xE040, 0xE110, 0xE220, 0xE3B0, 0xE4D0, 0xE6A0, 0xE810, 0xE910, 0xE9E0, 0xEAB0, 0xEBE0, 0xED50, 0xEEF0, + 0xEFA0, 0xF050, 0xF050, 0xF100, 0xF1F0, 0xF2C0, 0xF3D0, 0xF500, 0xF690, 0xF710, 0xF7A0, 0xF7B0, 0xF890, 0xF990, 0xFB10, 0xFCB0, + 0xFE40, 0xFF50, 0xFFB0, 0xFFB0, 0x00A0, 0x0150, 0x0230, 0x02E0, 0x03E0, 0x0450, 0x04C0, 0x0520, 0x0550, 0x0550, 0x04E0, 0x04A0, + 0x04C0, 0x0500, 0x05F0, 0x0720, 0x0790, 0x0870, 0x0860, 0x0820, 0x0850, 0x0810, 0x0860, 0x08E0, 0x0900, 0x0930, 0x0960, 0x0960, + 0x0950, 0x09E0, 0x0AA0, 0x0B00, 0x0B10, 0x0AF0, 0x0AC0, 0x0AD0, 0x0AF0, 0x0AE0, 0x0B60, 0x0B90, 0x0BD0, 0x0C20, 0x0D40, 0x0E70, + 0x0EE0, 0x0F50, 0x0F50, 0x0F90, 0x0F90, 0x0F60, 0x1030, 0x1190, 0x1310, 0x13D0, 0x1460, 0x1500, 0x1680, 0x17F0, 0x1930, 0x1B00, + 0x1BC0, 0x1C10, 0x1C30, 0x1CE0, 0x1E40, 0x1FB0, 0x2130, 0x22C0, 0x23C0, 0x25B0, 0x2620, 0x2710, 0x2810, 0x2930, 0x2B20, 0x2C20, + 0x2DD0, 0x3000, 0x3210, 0x3450, 0x3660, 0x3940, 0x3AB0, 0x3BD0, 0x3D60, 0x3EE0, 0x4080, 0x4250, 0x43E0, 0x4640, 0x4790, 0x4930, + 0x4AE0, 0x4B40, 0x4D70, 0x4F60, 0x5110, 0x5320, 0x5400, 0x5550, 0x5680, 0x5860, 0x5B10, 0x5D80, 0x6020, 0x6220, 0x63C0, 0x65D0, + 0x6790, 0x6A20, 0x6CA0, 0x6EF0, 0x7150, 0x72C0, 0x7580, 0x7730, 0x7870, 0x7A10, 0x7A50, 0x7B20, 0x7B70, 0x7B40, 0x7BD0, 0x7B30, + 0x7C00, 0x7BD0, 0x7B50, 0x7B60, 0x7B00, 0x7B40, 0x7B90, 0x7C10, 0x7CB0, 0x7CB0, 0x7D00, 0x7D40, 0x7D10, 0x7DE0, 0x7E20, 0x7EC0, + 0x7ED0, 0x7EB0, 0x7EC0, 0x7EC0, 0x7F10, 0x7EF0, 0x7EE0, 0x7EF0, 0x7EF0, 0x7F80, 0x7EE0, 0x7F10, 0x7F10, 0x7F20, 0x7F80, 0x7EF0, + 0x7EB0, 0x7EE0, 0x7EF0, 0x7F30, 0x7EE0, 0x7EC0, 0x7ED0, 0x7E30, 0x7D20, 0x7C00, 0x7AC0, 0x79B0, 0x78C0, 0x7690, 0x74B0, 0x7220, + 0x70C0, 0x6F50, 0x6E00, 0x6DA0, 0x6C80, 0x6C20, 0x6B40, 0x6AD0, 0x6B30, 0x6BA0, 0x6CE0, 0x6E10, 0x6F50, 0x7160, 0x73C0, 0x7640, + 0x7920, 0x7C40, 0x7EC0, 0x7F10, 0x7F70, 0x7F00, 0x7EF0, 0x7F30, 0x7F00, 0x7F70, 0x7EF0, 0x7F20, 0x7F00, 0x7F00, 0x7F70, 0x7F10, + 0x7F00, 0x7EF0, 0x7EF0, 0x7F60, 0x7EF0, 0x7E90, 0x7ED0, 0x7EE0, 0x7F10, 0x7F10, 0x7EA0, 0x7EE0, 0x7ED0, 0x7F10, 0x7F00, 0x7EA0, + 0x7ED0, 0x7F10, 0x7F10, 0x7F20, 0x7EA0, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7EC0, 0x7F10, 0x7F10, 0x7F00, 0x7EF0, 0x7EE0, 0x7F30, + 0x7F20, 0x7F40, 0x7F10, 0x7F10, 0x7F40, 0x7BF0, 0x7390, 0x6BE0, 0x6400, 0x5DC0, 0x57B0, 0x52E0, 0x4F80, 0x4D50, 0x4B60, 0x4F50, + 0x5280, 0x5650, 0x5950, 0x5D70, 0x60E0, 0x6430, 0x6730, 0x6920, 0x6BC0, 0x6D50, 0x6EE0, 0x6FF0, 0x70F0, 0x72B0, 0x7460, 0x7690, + 0x7910, 0x7C10, 0x7E70, 0x7F10, 0x7F70, 0x7EE0, 0x7EC0, 0x7EF0, 0x7F10, 0x7F30, 0x7EE0, 0x7E90, 0x7F10, 0x7F10, 0x7F30, 0x7EC0, + 0x7E90, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7EB0, 0x7F20, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7F20, 0x7EF0, 0x7F10, 0x7F00, 0x7EC0, + 0x7F30, 0x7F00, 0x7F20, 0x7F40, 0x7F10, 0x7F70, 0x7F20, 0x7F10, 0x7F30, 0x7EE0, 0x7F70, 0x7EF0, 0x7F20, 0x7F00, 0x7F00, 0x7F70, + 0x7F20, 0x7F10, 0x7EF0, 0x7EF0, 0x7DF0, 0x7090, 0x64D0, 0x5B60, 0x5300, 0x49A0, 0x41C0, 0x3930, 0x3170, 0x2930, 0x20C0, 0x1850, + 0x0EB0, 0x05F0, 0xFBC0, 0xF1E0, 0xE8B0, 0xE010, 0xD710, 0xCEB0, 0xC680, 0xBF50, 0xB820, 0xB130, 0xAC20, 0xA810, 0xA560, 0xA3B0, + 0xA270, 0xA1B0, 0xA030, 0x9E00, 0x9B80, 0x9870, 0x9580, 0x9240, 0x8F30, 0x8BE0, 0x8970, 0x87B0, 0x8680, 0x85E0, 0x8590, 0x8560, + 0x8550, 0x8530, 0x8530, 0x8520, 0x8520, 0x8520, 0x8520, 0x8520, 0x8520, 0x8520, 0x8520, 0x8510, 0x8510, 0x8510, 0x8500, 0x8500, + 0x84F0, 0x84F0, 0x84E0, 0x84E0, 0x84D0, 0x84D0, 0x84D0, 0x84D0, 0x84D0, 0x84D0, 0x84C0, 0x84D0, 0x84F0, 0x84C0, 0x84D0, 0x84E0, + 0x84D0, 0x84D0, 0x84D0, 0x84E0, 0x84F0, 0x84F0, 0x84F0, 0x8510, 0x8510, 0x8520, 0x8530, 0x8530, 0x8520, 0x8510, 0x8530, 0x8520, + 0x8500, 0x84F0, 0x8500, 0x84D0, 0x84C0, 0x84C0, 0x84B0, 0x84C0, 0x84B0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, + 0x84A0, 0x84A0, 0x84F0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84C0, 0x84C0, 0x84D0, 0x8500, 0x84D0, 0x84E0, 0x84E0, 0x84F0, 0x8500, + 0x8510, 0x8520, 0x8530, 0x8530, 0x8550, 0x8550, 0x8570, 0x8580, 0x85C0, 0x85F0, 0x8610, 0x8650, 0x8680, 0x86F0, 0x8760, 0x8820, + 0x8900, 0x89E0, 0x8AF0, 0x8C10, 0x8D00, 0x8EF0, 0x9160, 0x9470, 0x9720, 0x9980, 0x9C70, 0x9E80, 0xA140, 0xA440, 0xA770, 0xAB20, + 0xADF0, 0xB0F0, 0xB420, 0xB680, 0xB8F0, 0xBB80, 0xBE30, 0xC010, 0xC190, 0xC390, 0xC500, 0xC740, 0xC960, 0xCBC0, 0xCE00, 0xCF60, + 0xD080, 0xD1A0, 0xD2E0, 0xD430, 0xD520, 0xD5A0, 0xD5C0, 0xD5C0, 0xD5F0, 0xD5C0, 0xD610, 0xD600, 0xD550, 0xD430, 0xD320, 0xD280, + 0xD230, 0xD1F0, 0xD1B0, 0xD070, 0xCF10, 0xCDD0, 0xCCA0, 0xCC90, 0xCC80, 0xCD70, 0xCD50, 0xCCC0, 0xCC90, 0xCB90, 0xCAF0, 0xCA50, + 0xCA00, 0xCA20, 0xCA30, 0xC920, 0xC820, 0xC750, 0xC720, 0xC710, 0xC710, 0xC700, 0xC720, 0xC6A0, 0xC630, 0xC600, 0xC5C0, 0xC610, + 0xC750, 0xC840, 0xC8F0, 0xC8F0, 0xC910, 0xC8F0, 0xC8E0, 0xC880, 0xC850, 0xC840, 0xC870, 0xC900, 0xC920, 0xC8C0, 0xC8E0, 0xC910, + 0xC960, 0xC9A0, 0xC9D0, 0xC9E0, 0xCA40, 0xCA70, 0xCB20, 0xCBD0, 0xCCF0, 0xCE20, 0xCF40, 0xD070, 0xD190, 0xD2F0, 0xD440, 0xD570, + 0xD6E0, 0xD8B0, 0xD9C0, 0xDB70, 0xDD80, 0xDF10, 0xE120, 0xE2F0, 0xE510, 0xE730, 0xE990, 0xEC40, 0xEE90, 0xF140, 0xF3F0, 0xF5F0, + 0xF910, 0xFC30, 0xFEA0, 0x0110, 0x03E0, 0x0710, 0x09D0, 0x0CB0, 0x0FA0, 0x12F0, 0x1590, 0x1790, 0x19C0, 0x1C70, 0x1F10, 0x2150, + 0x2370, 0x2560, 0x2760, 0x28F0, 0x2B10, 0x2CC0, 0x2F00, 0x3120, 0x33C0, 0x35D0, 0x37B0, 0x3900, 0x3A40, 0x3B70, 0x3D70, 0x3FB0, + 0x41E0, 0x4410, 0x4610, 0x4740, 0x4920, 0x4A90, 0x4B70, 0x4CB0, 0x4EA0, 0x5000, 0x5150, 0x52C0, 0x54D0, 0x5730, 0x5950, 0x5B20, + 0x5D40, 0x5EC0, 0x5FF0, 0x6120, 0x6330, 0x6530, 0x6690, 0x6800, 0x68A0, 0x6990, 0x6A60, 0x6C40, 0x6E10, 0x6F30, 0x7040, 0x7070, + 0x7050, 0x70D0, 0x7160, 0x71C0, 0x71A0, 0x70F0, 0x7090, 0x6FB0, 0x6E60, 0x6D20, 0x6BF0, 0x69B0, 0x6720, 0x64C0, 0x6250, 0x6030, + 0x5E20, 0x5B40, 0x5800, 0x54D0, 0x5160, 0x4DE0, 0x4A10, 0x46A0, 0x42E0, 0x3F40, 0x3BB0, 0x37B0, 0x3460, 0x31D0, 0x2FF0, 0x2F30, + 0x2DE0, 0x2CD0, 0x2AF0, 0x2A00, 0x29F0, 0x2A60, 0x2C90, 0x2EF0, 0x3240, 0x3580, 0x38D0, 0x3D00, 0x41C0, 0x4690, 0x4C10, 0x51B0, + 0x57A0, 0x5E50, 0x64B0, 0x6AA0, 0x71D0, 0x7850, 0x7D70, 0x7F20, 0x7EC0, 0x7F10, 0x7F20, 0x7F20, 0x7F50, 0x7E90, 0x7EB0, 0x7EF0, + 0x7EE0, 0x7EF0, 0x7E80, 0x7E70, 0x7EF0, 0x7F20, 0x7F00, 0x7F00, 0x7ED0, 0x7F00, 0x7F20, 0x7F00, 0x7F00, 0x7F20, 0x7F20, 0x7F10, + 0x7F30, 0x7F20, 0x7F40, 0x7F10, 0x7F10, 0x7F00, 0x7ED0, 0x7C30, 0x72E0, 0x6A70, 0x6380, 0x5D90, 0x5860, 0x54A0, 0x51A0, 0x50A0, + 0x4FE0, 0x50D0, 0x5270, 0x54F0, 0x5970, 0x5EF0, 0x6430, 0x6AE0, 0x7000, 0x74F0, 0x79A0, 0x7CC0, 0x7E80, 0x7E90, 0x7F10, 0x7F20, + 0x7F10, 0x7EB0, 0x7C40, 0x78F0, 0x74B0, 0x6F00, 0x69C0, 0x63C0, 0x5E80, 0x5900, 0x5540, 0x53B0, 0x5400, 0x5560, 0x5750, 0x5990, + 0x5CE0, 0x5FC0, 0x6390, 0x67B0, 0x6B60, 0x7040, 0x73D0, 0x7710, 0x7920, 0x7B40, 0x7C80, 0x7CC0, 0x7C60, 0x7B50, 0x7970, 0x77A0, + 0x7600, 0x74D0, 0x7430, 0x7360, 0x7290, 0x71E0, 0x7070, 0x7040, 0x6FD0, 0x7030, 0x7040, 0x6F90, 0x6F10, 0x6E20, 0x6DD0, 0x6CB0, + 0x6BB0, 0x6B70, 0x6A80, 0x6A90, 0x6BA0, 0x6C40, 0x6ED0, 0x7080, 0x7260, 0x7440, 0x7590, 0x77B0, 0x7960, 0x7B40, 0x7D10, 0x7E20, + 0x7ED0, 0x7ED0, 0x7F30, 0x7F20, 0x7F10, 0x7EF0, 0x7EB0, 0x7EE0, 0x7E30, 0x7CB0, 0x7A60, 0x7850, 0x75D0, 0x7330, 0x7020, 0x6DC0, + 0x6AD0, 0x6760, 0x63A0, 0x6080, 0x5E30, 0x5C20, 0x59B0, 0x5750, 0x5430, 0x5200, 0x4F80, 0x4D70, 0x4C60, 0x4A90, 0x4950, 0x4720, + 0x44F0, 0x43C0, 0x4110, 0x3F60, 0x3DC0, 0x3A70, 0x3700, 0x3160, 0x2BE0, 0x2610, 0x1F60, 0x18E0, 0x1090, 0x0A10, 0x0360, 0xFD40, + 0xF890, 0xF4E0, 0xF160, 0xEE00, 0xEA70, 0xE6A0, 0xE3E0, 0xE200, 0xE0B0, 0xDF10, 0xDD30, 0xDA10, 0xD620, 0xD1D0, 0xCC50, 0xC810, + 0xC280, 0xBBB0, 0xB380, 0xAA80, 0xA060, 0x95A0, 0x8C80, 0x8790, 0x85C0, 0x8520, 0x84F0, 0x84D0, 0x84C0, 0x84B0, 0x84B0, 0x84A0, + 0x84A0, 0x8490, 0x8490, 0x8490, 0x84D0, 0x8490, 0x8490, 0x8490, 0x8490, 0x8480, 0x8490, 0x8490, 0x8490, 0x8480, 0x8480, 0x8480, + 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, + 0x8480, 0x8480, 0x8480, 0x8480, 0x8490, 0x8480, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, + 0x8490, 0x8490, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84C0, 0x84C0, + 0x84C0, 0x84C0, 0x84C0, 0x84D0, 0x84D0, 0x84E0, 0x84E0, 0x84E0, 0x8500, 0x8510, 0x8520, 0x8530, 0x8560, 0x8590, 0x85C0, 0x8620, + 0x8680, 0x8710, 0x8790, 0x8830, 0x8960, 0x8AA0, 0x8BD0, 0x8D10, 0x8E20, 0x8FB0, 0x9180, 0x93B0, 0x94F0, 0x95B0, 0x9580, 0x9530, + 0x95C0, 0x9680, 0x9780, 0x98A0, 0x98A0, 0x98D0, 0x9830, 0x9760, 0x9710, 0x96C0, 0x9710, 0x96A0, 0x9610, 0x9580, 0x9500, 0x9480, + 0x9430, 0x9490, 0x94C0, 0x9410, 0x93C0, 0x93C0, 0x9410, 0x94D0, 0x9520, 0x9580, 0x95A0, 0x9580, 0x9600, 0x9600, 0x9680, 0x96F0, + 0x9630, 0x95C0, 0x9460, 0x9390, 0x92F0, 0x9280, 0x9300, 0x92C0, 0x91D0, 0x9060, 0x8F10, 0x8DD0, 0x8D70, 0x8D20, 0x8C80, 0x8BA0, + 0x8AD0, 0x89E0, 0x88D0, 0x8830, 0x87C0, 0x8770, 0x8730, 0x86C0, 0x8660, 0x8620, 0x85E0, 0x85C0, 0x85C0, 0x8570, 0x8570, 0x8560, + 0x8550, 0x8520, 0x8550, 0x8530, 0x8530, 0x8520, 0x8510, 0x8510, 0x8500, 0x8500, 0x8500, 0x84F0, 0x84F0, 0x84F0, 0x84F0, 0x84E0, + 0x84E0, 0x84E0, 0x84E0, 0x84E0, 0x84D0, 0x84D0, 0x84D0, 0x84D0, 0x84C0, 0x84D0, 0x8460, 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, + 0x84C0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, + 0x84B0, 0x84B0, 0x84B0, 0x8450, 0x84B0, 0x84B0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, + 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, + 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, + 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84B0, 0x84B0, 0x84D0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, + 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, + 0x84C0, 0x84C0, 0x84E0, 0x84D0, 0x84D0, 0x84E0, 0x84F0, 0x8500, 0x8510, 0x8530, 0x8580, 0x85F0, 0x8710, 0x8930, 0x8CE0, 0x91F0, + 0x9840, 0x9E70, 0xA4D0, 0xAB60, 0xB0C0, 0xB610, 0xBA80, 0xBE00, 0xC1A0, 0xC570, 0xC900, 0xCC90, 0xD010, 0xD260, 0xD440, 0xD5A0, + 0xD690, 0xD830, 0xDA40, 0xDC40, 0xDE70, 0xDFB0, 0xE060, 0xE150, 0xE1C0, 0xE270, 0xE330, 0xE350, 0xE3D0, 0xE450, 0xE500, 0xE630, + 0xE710, 0xE790, 0xE740, 0xE6A0, 0xE630, 0xE590, 0xE530, 0xE5C0, 0xE5E0, 0xE620, 0xE5A0, 0xE4A0, 0xE380, 0xE2A0, 0xE240, 0xE200, + 0xE190, 0xE190, 0xE0B0, 0xE0D0, 0xE160, 0xE1A0, 0xE270, 0xE250, 0xE2B0, 0xE370, 0xE430, 0xE570, 0xE780, 0xE9E0, 0xEC90, 0xEF10, + 0xF1A0, 0xF3B0, 0xF6B0, 0xF980, 0xFD80, 0x0190, 0x0590, 0x09B0, 0x0E40, 0x1300, 0x1790, 0x1C80, 0x2180, 0x2650, 0x2B20, 0x2FA0, + 0x34D0, 0x3980, 0x3EE0, 0x4420, 0x4940, 0x4D90, 0x51E0, 0x5610, 0x5A90, 0x5E80, 0x62A0, 0x65E0, 0x68F0, 0x6BE0, 0x6DE0, 0x6FC0, + 0x71F0, 0x7420, 0x75A0, 0x76D0, 0x7780, 0x77D0, 0x77D0, 0x7850, 0x78D0, 0x7940, 0x7950, 0x78D0, 0x7750, 0x7600, 0x7560, 0x7580, + 0x75A0, 0x75A0, 0x7550, 0x7510, 0x74A0, 0x7520, 0x75F0, 0x76F0, 0x7820, 0x7950, 0x7A10, 0x7B90, 0x7CC0, 0x7E40, 0x7EF0, 0x7F00, + 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7EE0, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, + 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7ED0, 0x7E10, 0x7D30, 0x7C00, 0x7BC0, 0x7B50, 0x7950, 0x7860, 0x77D0, 0x7690, 0x7610, 0x75A0, + 0x75C0, 0x75F0, 0x7630, 0x76A0, 0x7680, 0x75E0, 0x7560, 0x7540, 0x7580, 0x7630, 0x7760, 0x78F0, 0x7A80, 0x7C80, 0x7DE0, 0x7ED0, + 0x7F00, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F00, 0x7EF0, 0x7EF0, 0x7EF0, 0x7F60, 0x7EF0, 0x7F10, 0x7F20, 0x7F00, 0x7F50, 0x7F10, + 0x7F00, 0x7F10, 0x7EF0, 0x7F30, 0x7EF0, 0x7E90, 0x7F00, 0x7F00, 0x7F00, 0x7F10, 0x7EA0, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7E80, + 0x7EF0, 0x7F10, 0x7EF0, 0x7ED0, 0x7EB0, 0x7F20, 0x7F40, 0x7F10, 0x7F10, 0x7F00, 0x7F40, 0x7F10, 0x7F20, 0x7EF0, 0x7EF0, 0x7F60, + 0x7F20, 0x7F40, 0x7F10, 0x7F10, 0x7F60, 0x7EF0, 0x7F10, 0x7EF0, 0x7EE0, 0x7F50, 0x7F00, 0x7F00, 0x7F00, 0x7F10, 0x7F70, 0x7F00, + 0x7ED0, 0x7F10, 0x7F00, 0x7F40, 0x7E90, 0x7C50, 0x7920, 0x7510, 0x70B0, 0x6D10, 0x6940, 0x6680, 0x6350, 0x6030, 0x5DA0, 0x5970, + 0x5660, 0x5370, 0x5090, 0x4F00, 0x4E00, 0x4D60, 0x4C40, 0x4C90, 0x4E00, 0x4F10, 0x5110, 0x5270, 0x5360, 0x5450, 0x5490, 0x5530, + 0x5660, 0x5660, 0x56E0, 0x5720, 0x5670, 0x5600, 0x54A0, 0x5440, 0x5240, 0x4FF0, 0x4D70, 0x4B10, 0x4980, 0x4760, 0x4500, 0x4350, + 0x4150, 0x3FA0, 0x3D60, 0x3B30, 0x3A00, 0x38A0, 0x37C0, 0x36F0, 0x3670, 0x3660, 0x3510, 0x3490, 0x32C0, 0x3090, 0x2F50, 0x2D00, + 0x2C00, 0x2940, 0x26D0, 0x2410, 0x2060, 0x1D80, 0x1A60, 0x16C0, 0x13D0, 0x1050, 0x0C60, 0x08C0, 0x0450, 0x00C0, 0xFCE0, 0xF940, + 0xF610, 0xF230, 0xEF60, 0xEBF0, 0xE830, 0xE490, 0xE070, 0xDC30, 0xD7F0, 0xD470, 0xD140, 0xCEA0, 0xCC60, 0xCA90, 0xC8F0, 0xC7D0, + 0xC600, 0xC4B0, 0xC370, 0xC340, 0xC2A0, 0xC250, 0xC310, 0xC3E0, 0xC540, 0xC700, 0xC9F0, 0xCD20, 0xD030, 0xD290, 0xD580, 0xD780, + 0xDA00, 0xDD00, 0xE040, 0xED40, 0xEFE0, 0xF2D0, 0xF5E0, 0xF8B0, 0xFB50, 0xFD60, 0x0000, 0x0180, 0x03F0, 0x06C0, 0x0950, 0x0BB0, + 0x0D00, 0x0EF0, 0x0FD0, 0x1090, 0x10A0, 0x0F90, 0x0EF0, 0x0D90, 0x0B50, 0x0A30, 0x0860, 0x06E0, 0x0520, 0x0250, 0xFFB0, 0xFC00, + 0xF820, 0xF450, 0xF0C0, 0xEE50, 0xEBF0, 0xEA30, 0xE7E0, 0xE460, 0xE110, 0xDDF0, 0xDB60, 0xD9A0, 0xD7F0, 0xD740, 0xD5D0, 0xD3F0, + 0xD2D0, 0xD1D0, 0xD1F0, 0xD1B0, 0xD230, 0xD330, 0xD3A0, 0xD460, 0xD4D0, 0xD550, 0xD6D0, 0xD800, 0xDA10, 0xDB90, 0xDCF0, 0xDEF0, + 0xE060, 0xE210, 0xE400, 0xE5C0, 0xE7A0, 0xE8E0, 0xEA40, 0xEBC0, 0xEDD0, 0xEFE0, 0xF160, 0xF2A0, 0xF450, 0xF5E0, 0xF910, 0xFBA0, + 0xFED0, 0x0180, 0x0340, 0x0510, 0x06B0, 0x0940, 0x0B70, 0x0E00, 0x10E0, 0x1350, 0x1550, 0x1750, 0x18C0, 0x1B10, 0x1CB0, 0x1E70, + 0x1F40, 0x2090, 0x2230, 0x23E0, 0x2550, 0x2710, 0x2890, 0x2A40, 0x2B80, 0x2B70, 0x2BE0, 0x2C40, 0x2D90, 0x2EA0, 0x2F20, 0x2FC0, + 0x2F50, 0x2EB0, 0x2F50, 0x2FB0, 0x30B0, 0x30C0, 0x30F0, 0x3050, 0x2F20, 0x2FC0, 0x3000, 0x3070, 0x3100, 0x3110, 0x3200, 0x3200, + 0x32C0, 0x32C0, 0x3370, 0x3430, 0x3440, 0x33B0, 0x33D0, 0x3340, 0x33F0, 0x34F0, 0x3500, 0x35C0, 0x3540, 0x3570, 0x34E0, 0x33F0, + 0x33F0, 0x3370, 0x3360, 0x3250, 0x3090, 0x2F30, 0x2D30, 0x2C30, 0x2A30, 0x2950, 0x27C0, 0x24D0, 0x2290, 0x2060, 0x1E00, 0x1C70, + 0x1A40, 0x1940, 0x1770, 0x1540, 0x1460, 0x1290, 0x1130, 0x0F90, 0x0C90, 0x0B10, 0x0900, 0x0740, 0x0590, 0x0490, 0x0420, 0x03A0, + 0x0280, 0x01A0, 0x0020, 0xFFB0, 0xFF50, 0xFF80, 0xFFE0, 0x0040, 0x0130, 0x0130, 0x0190, 0x0180, 0x0190, 0x02C0, 0x03C0, 0x0410, + 0x04A0, 0x0470, 0x04D0, 0x05A0, 0x06C0, 0x0800, 0x08F0, 0x0A40, 0x0A40, 0x0AF0, 0x0C30, 0x0CA0, 0x0E10, 0x0ED0, 0x0EE0, 0x0F40, + 0x0F80, 0x1030, 0x1130, 0x11F0, 0x12D0, 0x1300, 0x1380, 0x1310, 0x1310, 0x13A0, 0x13C0, 0x1450, 0x1450, 0x1520, 0x1530, 0x15B0, + 0x15E0, 0x1640, 0x15D0, 0x1630, 0x1610, 0x1670, 0x1710, 0x17B0, 0x1920, 0x1990, 0x1980, 0x19C0, 0x18E0, 0x1950, 0x19B0, 0x19E0, + 0x1A10, 0x19B0, 0x1960, 0x1900, 0x1840, 0x1820, 0x1740, 0x16A0, 0x15D0, 0x1520, 0x14E0, 0x1430, 0x1470, 0x1400, 0x1420, 0x14F0, + 0x14E0, 0x1590, 0x1550, 0x1530, 0x1560, 0x1520, 0x1590, 0x1510, 0x14E0, 0x1460, 0x1340, 0x12F0, 0x1240, 0x1110, 0x1060, 0x0F80, + 0x0EC0, 0x0DB0, 0x0CB0, 0x0BB0, 0x0980, 0x0860, 0x0640, 0x03A0, 0x0180, 0xFF10, 0xFD00, 0xFA40, 0xF7B0, 0xF450, 0xF180, 0xEEC0, + 0xEC50, 0xE960, 0xE6C0, 0xE490, 0xE2A0, 0xDFE0, 0xDD80, 0xDB20, 0xD930, 0xD750, 0xD620, 0xD530, 0xD490, 0xD3F0, 0xD2F0, 0xD240, + 0xD160, 0xD0C0, 0xD070, 0xD040, 0xD060, 0xD0F0, 0xD150, 0xD1A0, 0xD280, 0xD340, 0xD400, 0xD4A0, 0xD440, 0xD3F0, 0xD390, 0xD3D0, + 0xD480, 0xD520, 0xD620, 0xD680, 0xD6E0, 0xD610, 0xD530, 0xD330, 0xD2F0, 0xD2D0, 0xD290, 0xD2D0, 0xD310, 0xD2F0, 0xD340, 0xD2D0, + 0xD250, 0xD1B0, 0xD170, 0xD190, 0xD1E0, 0xD140, 0xD0D0, 0xD030, 0xCFC0, 0xCF30, 0xCF10, 0xCED0, 0xCED0, 0xCF60, 0xCFE0, 0xD000, + 0xCFF0, 0xD010, 0xD050, 0xD030, 0xD040, 0xD050, 0xD000, 0xD010, 0xD120, 0xD130, 0xD180, 0xD210, 0xD220, 0xD230, 0xD1F0, 0xD1A0, + 0xD1F0, 0xD300, 0xD410, 0xD4C0, 0xD550, 0xD5A0, 0xD600, 0xD5C0, 0xD5B0, 0xD5A0, 0xD560, 0xD5C0, 0xD5C0, 0xD5A0, 0xD580, 0xD550, + 0xD530, 0xD500, 0xD4C0, 0xD450, 0xD450, 0xD400, 0xD440, 0xD4C0, 0xD520, 0xD570, 0xD5D0, 0xD510, 0xD590, 0xD5C0, 0xD650, 0xD710, + 0xD730, 0xD790, 0xD710, 0xD710, 0xD6A0, 0xD6E0, 0xD6B0, 0xD6D0, 0xD730, 0xD7C0, 0xD850, 0xD8C0, 0xD990, 0xDA40, 0xDA70, 0xDAD0, + 0xDB50, 0xDBF0, 0xDC90, 0xDCC0, 0xDDD0, 0xDE70, 0xDED0, 0xDF00, 0xDFA0, 0xDF70, 0xDFF0, 0xE0C0, 0xE130, 0xE1C0, 0xE2B0, 0xE370, + 0xE490, 0xE530, 0xE570, 0xE590, 0xE560, 0xE510, 0xE5C0, 0xE6D0, 0xE7D0, 0xE900, 0xEA60, 0xEB00, 0xEB10, 0xEAF0, 0xEAD0, 0xEAE0, + 0xEC00, 0xECE0, 0xEEE0, 0xF080, 0xF250, 0xF320, 0xF380, 0xF430, 0xF490, 0xF470, 0xF4B0, 0xF610, 0xF750, 0xF870, 0xFA10, 0xFAD0, + 0xFC40, 0xFD70, 0xFE40, 0xFF80, 0xFFF0, 0x0100, 0x0100, 0x0150, 0x0200, 0x02B0, 0x0390, 0x03D0, 0x0440, 0x04C0, 0x04F0, 0x05E0, + 0x0660, 0x0670, 0x06E0, 0x06C0, 0x06C0, 0x0750, 0x0790, 0x0820, 0x0840, 0x0910, 0x0930, 0x0940, 0x09B0, 0x0980, 0x09A0, 0x0A10, + 0x09D0, 0x0A30, 0x0A60, 0x0A40, 0x0AA0, 0x0AA0, 0x0B40, 0x0B50, 0x0AC0, 0x0AC0, 0x0AC0, 0x0AB0, 0x0A70, 0x09B0, 0x09D0, 0x0990, + 0x0970, 0x0990, 0x08F0, 0x0920, 0x08C0, 0x0880, 0x0900, 0x0940, 0x0940, 0x08D0, 0x0830, 0x0800, 0x07F0, 0x07D0, 0x07D0, 0x0810, + 0x07E0, 0x07B0, 0x0870, 0x0840, 0x0910, 0x08B0, 0x07E0, 0x07D0, 0x06E0, 0x0700, 0x06C0, 0x0630, 0x0630, 0x0600, 0x0600, 0x0610, + 0x0570, 0x0640, 0x0600, 0x05A0, 0x05C0, 0x0470, 0x0430, 0x0430, 0x0440, 0x0470, 0x0470, 0x04C0, 0x03E0, 0x0250, 0x01E0, 0x00A0, + 0x0040, 0xFF70, 0xFEE0, 0xFDF0, 0xFD50, 0xFD50, 0xFC60, 0xFBC0, 0xFBB0, 0xFAF0, 0xFAC0, 0xF940, 0xF7F0, 0xF700, 0xF640, 0xF5D0, + 0xF5F0, 0xF5C0, 0xF5D0, 0xF4D0, 0xF430, 0xF3C0, 0xF2B0, 0xF1F0, 0xF140, 0xF090, 0xF000, 0xEF00, 0xEF60, 0xEF80, 0xEF80, 0xEF80, + 0xEEF0, 0xEE50, 0xEDA0, 0xED20, 0xED50, 0xEDB0, 0xEE70, 0xEEE0, 0xEE80, 0xEEA0, 0xEE40, 0xEEB0, 0xEEF0, 0xEF50, 0xF070, 0xF0F0, + 0xF1B0, 0xF2C0, 0xF410, 0xF5E0, 0xF7E0, 0xFAC0, 0xFCC0, 0xFF80, 0x0270, 0x0590, 0x09D0, 0x0E20, 0x12F0, 0x1790, 0x1BA0, 0x2000, + 0x2500, 0x2970, 0x2F60, 0x3460, 0x3A50, 0x3F90, 0x4420, 0x4960, 0x4DC0, 0x5280, 0x5640, 0x5980, 0x5CB0, 0x5E40, 0x6020, 0x6180, + 0x6230, 0x6370, 0x6380, 0x63F0, 0x6460, 0x63A0, 0x6380, 0x6280, 0x60C0, 0x5E60, 0x5B90, 0x58B0, 0x55B0, 0x5280, 0x4F70, 0x4B30, + 0x4780, 0x4310, 0x3DB0, 0x37A0, 0x3100, 0x1400, 0x0B40, 0x0310, 0xFAB0, 0xF360, 0xED00, 0xE750, 0xE270, 0xDD60, 0xD810, 0xD150, + 0xCA70, 0xC340, 0xBB00, 0xB290, 0xA970, 0xA1D0, 0x9D30, 0x9BE0, 0x9EF0, 0xA6C0, 0xB0A0, 0xBB00, 0xC300, 0xC870, 0xC8C0, 0xC4D0, + 0xBCD0, 0xB250, 0xA590, 0x97A0, 0x8AB0, 0x85A0, 0x84E0, 0x84B0, 0x8490, 0x8470, 0x8460, 0x8460, 0x8450, 0x8450, 0x8450, 0x8450, + 0x8450, 0x8450, 0x8460, 0x8460, 0x8460, 0x8470, 0x8470, 0x8480, 0x8480, 0x8490, 0x84A0, 0x84A0, 0x84B0, 0x84C0, 0x84D0, 0x84F0, + 0x8520, 0x8550, 0x85B0, 0x8690, 0x8860, 0x8BF0, 0x9130, 0x96C0, 0x9BB0, 0xA150, 0xA620, 0xAA70, 0xADE0, 0xB1F0, 0xB5E0, 0xB8A0, + 0xBC30, 0xC010, 0xC400, 0xC9D0, 0xD000, 0xD740, 0xDFD0, 0xE8B0, 0xF300, 0xFD80, 0x08C0, 0x1450, 0x1E20, 0x27D0, 0x3000, 0x3730, + 0x3D70, 0x42C0, 0x4880, 0x4D00, 0x5160, 0x5590, 0x5860, 0x5B00, 0x5C40, 0x5DB0, 0x5F20, 0x60E0, 0x6310, 0x6490, 0x65E0, 0x6670, + 0x6610, 0x66B0, 0x67E0, 0x6990, 0x6AB0, 0x6B30, 0x6B70, 0x6B10, 0x6A60, 0x69A0, 0x6880, 0x6890, 0x6780, 0x65E0, 0x6550, 0x64D0, + 0x6640, 0x6890, 0x6A90, 0x6E30, 0x7200, 0x7650, 0x7AB0, 0x7DA0, 0x7F00, 0x7EB0, 0x7F20, 0x7F00, 0x7E10, 0x79B0, 0x7440, 0x6EC0, + 0x6990, 0x63B0, 0x5EE0, 0x5980, 0x5510, 0x5180, 0x4E20, 0x4B90, 0x4970, 0x4730, 0x4540, 0x42B0, 0x4220, 0x4260, 0x4250, 0x42D0, + 0x4340, 0x4420, 0x4530, 0x46F0, 0x4A00, 0x4D10, 0x5210, 0x55F0, 0x59F0, 0x5E90, 0x62D0, 0x6900, 0x6EC0, 0x7590, 0x7BA0, 0x7E80, + 0x7ED0, 0x7EB0, 0x7F00, 0x7F00, 0x7E90, 0x7F10, 0x7EE0, 0x7EF0, 0x7F10, 0x7EA0, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7EE0, 0x7F10, + 0x7F00, 0x7F00, 0x7EF0, 0x7F00, 0x7F60, 0x7F40, 0x7F10, 0x7F10, 0x7F00, 0x7F50, 0x7F10, 0x7F20, 0x7F20, 0x7EF0, 0x7F50, 0x7F00, + 0x7F00, 0x7F10, 0x7F20, 0x7F60, 0x7F00, 0x7EF0, 0x7F00, 0x7EE0, 0x7F60, 0x7A90, 0x7120, 0x6CC0, 0x6AF0, 0x6BF0, 0x6FC0, 0x74D0, + 0x7B50, 0x7EF0, 0x7F20, 0x7ED0, 0x7EA0, 0x7F00, 0x7EF0, 0x7EF0, 0x7F20, 0x7EC0, 0x7F20, 0x7F10, 0x7F20, 0x7F20, 0x7EC0, 0x7F10, + 0x7EE0, 0x7EF0, 0x7F40, 0x7F10, 0x7F60, 0x7EF0, 0x7F20, 0x7F20, 0x7F10, 0x7F80, 0x7F10, 0x7F20, 0x7EF0, 0x7EF0, 0x7F60, 0x7EF0, + 0x7F10, 0x7F10, 0x7F00, 0x7F70, 0x7F10, 0x7EB0, 0x7EE0, 0x7EF0, 0x7F70, 0x7F00, 0x7EC0, 0x7ED0, 0x7EF0, 0x7F30, 0x7F20, 0x7E90, + 0x7F00, 0x7EE0, 0x7EF0, 0x7F10, 0x7E70, 0x7EC0, 0x6B40, 0x4E30, 0x2F40, 0x0BE0, 0xEB50, 0xC9F0, 0xA7B0, 0x86C0, 0x84C0, 0x8490, + 0x8470, 0x8450, 0x8430, 0x8420, 0x8410, 0x8400, 0x83F0, 0x83F0, 0x83E0, 0x83E0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, + 0x83D0, 0x83D0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8400, 0x8400, 0x8410, + 0x8410, 0x8410, 0x8410, 0x8410, 0x8420, 0x8420, 0x8430, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, + 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, + 0x8430, 0x8430, 0x8430, 0x8430, 0x8440, 0x8430, 0x8460, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8450, 0x8450, 0x8450, 0x8460, + 0x8460, 0x8460, 0x8470, 0x8470, 0x8480, 0x8470, 0x8470, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8490, 0x8480, 0x8480, 0x8480, + 0x8480, 0x8470, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8490, 0x8470, 0x8470, 0x8480, 0x8470, 0x8470, 0x8480, 0x8470, 0x8470, + 0x8480, 0x8490, 0x8490, 0x84B0, 0x84D0, 0x8500, 0x9B90, 0xA6F0, 0xB010, 0xB8B0, 0xBFF0, 0xC6A0, 0xCD00, 0xD2C0, 0xD640, 0xD870, + 0xD920, 0xD970, 0xD950, 0xD9E0, 0xDAD0, 0xDBD0, 0xDC60, 0xDC00, 0xDAE0, 0xD850, 0xD4F0, 0xD040, 0xCB30, 0xC4D0, 0xBF90, 0xBA60, + 0xB630, 0xB410, 0xB390, 0xB4F0, 0xB740, 0xB9C0, 0xBCF0, 0xC060, 0xC430, 0xC9A0, 0xCF00, 0xD500, 0xDAF0, 0xE210, 0xE9E0, 0xF2D0, + 0xFBF0, 0x05C0, 0x0E70, 0x16B0, 0x1EB0, 0x2600, 0x2C00, 0x30D0, 0x3350, 0x3350, 0x31F0, 0x2F70, 0x2C50, 0x29A0, 0x25A0, 0x20B0, + 0x1B30, 0x1470, 0x0DC0, 0x06D0, 0x00B0, 0xFBE0, 0xF6F0, 0xF350, 0xEF70, 0xEBA0, 0xE840, 0xE4B0, 0xE180, 0xDF10, 0xDC50, 0xD950, + 0xD4E0, 0xD0C0, 0xCB40, 0xC550, 0xC040, 0xB9B0, 0xB230, 0xAAC0, 0xA250, 0x99C0, 0x9140, 0x8AD0, 0x8760, 0x85D0, 0x8540, 0x8500, + 0x84E0, 0x84D0, 0x84C0, 0x84C0, 0x84B0, 0x84B0, 0x84B0, 0x84A0, 0x84B0, 0x84B0, 0x84C0, 0x84E0, 0x8520, 0x8620, 0x8B20, 0x9A70, + 0xAA60, 0xB800, 0xC430, 0xCF10, 0xD920, 0xE270, 0xEB10, 0xF3E0, 0xFB60, 0x02F0, 0x0940, 0x0D60, 0x1050, 0x1200, 0x1350, 0x14C0, + 0x1580, 0x1740, 0x1820, 0x1800, 0x1740, 0x1580, 0x1320, 0x10C0, 0x0DB0, 0x0BF0, 0x0A70, 0x0A70, 0x0BB0, 0x0DB0, 0x11F0, 0x16F0, + 0x1C90, 0x2340, 0x2A50, 0x32B0, 0x3B60, 0x4340, 0x4A10, 0x4FB0, 0x5520, 0x5940, 0x5D50, 0x6120, 0x6420, 0x6810, 0x6AB0, 0x6CF0, + 0x6E90, 0x6F90, 0x70F0, 0x71E0, 0x7240, 0x7350, 0x7320, 0x7400, 0x74D0, 0x74B0, 0x74C0, 0x7400, 0x7350, 0x72B0, 0x71E0, 0x71B0, + 0x7030, 0x6FA0, 0x6E60, 0x6CD0, 0x6C10, 0x6B40, 0x6AE0, 0x6AD0, 0x6A40, 0x6A40, 0x6990, 0x6900, 0x6870, 0x67C0, 0x6890, 0x68E0, + 0x6930, 0x6990, 0x69E0, 0x6AE0, 0x6C40, 0x6DD0, 0x7030, 0x7220, 0x7440, 0x7650, 0x7870, 0x7A60, 0x7C50, 0x7E70, 0x7F00, 0x7F70, + 0x7ED0, 0x7EB0, 0x7EF0, 0x7F10, 0x7F30, 0x7EE0, 0x7EA0, 0x7EF0, 0x7F10, 0x7F20, 0x7F00, 0x7EC0, 0x7F00, 0x7F00, 0x7F10, 0x7F10, + 0x7EA0, 0x7F00, 0x7EF0, 0x7F10, 0x7F20, 0x7EC0, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F00, 0x7F60, 0x7EE0, 0x7F10, 0x7F20, 0x7EF0, + 0x7F80, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F70, 0x7F00, 0x7F10, 0x7F10, 0x7EF0, 0x7F60, 0x7EF0, 0x7EF0, 0x7F00, 0x7EE0, 0x7F50, + 0x7F20, 0x7EE0, 0x7ED0, 0x7ED0, 0x7F30, 0x7EF0, 0x7E90, 0x7ED0, 0x7F10, 0x7EF0, 0x7EE0, 0x7F60, 0x7EF0, 0x7EB0, 0x7EE0, 0x7ED0, + 0x7F10, 0x77A0, 0x6DA0, 0x64C0, 0x5B90, 0x52A0, 0x4B70, 0x4400, 0x3E70, 0x38E0, 0x33B0, 0x2FD0, 0x2C80, 0x2A80, 0x2950, 0x2950, + 0x2C00, 0x2E40, 0x3290, 0x3880, 0x3E40, 0x4580, 0x4C90, 0x5220, 0x5670, 0x59D0, 0x5C30, 0x5DE0, 0x5F30, 0x5F90, 0x5F70, 0x5FA0, + 0x5EF0, 0x5DF0, 0x5CA0, 0x5B40, 0x5A90, 0x5A30, 0x5A70, 0x5B20, 0x5B90, 0x5D50, 0x5EE0, 0x61F0, 0x66E0, 0x6C60, 0x7350, 0x7A00, + 0x7E70, 0x7EE0, 0x7EC0, 0x7F10, 0x7EE0, 0x7EF0, 0x7EF0, 0x7EB0, 0x7F20, 0x7F10, 0x7F10, 0x7F10, 0x7F00, 0x7F10, 0x7F00, 0x7F00, + 0x7F10, 0x7F00, 0x7F30, 0x7F20, 0x7F40, 0x7F10, 0x7F00, 0x7F60, 0x7F10, 0x7F10, 0x7F20, 0x7EF0, 0x7F50, 0x7F10, 0x7F20, 0x7EF0, + 0x7F10, 0x7F70, 0x7F00, 0x7F10, 0x7EF0, 0x7EE0, 0x7F60, 0x7EF0, 0x7EF0, 0x7EE0, 0x7ED0, 0x7F70, 0x7F20, 0x7EA0, 0x7ED0, 0x7ED0, + 0x7F00, 0x7F10, 0x7E90, 0x7EB0, 0x7EE0, 0x7EF0, 0x7F10, 0x7EA0, 0x7F00, 0x7F10, 0x7F20, 0x7F20, 0x7EC0, 0x7F10, 0x7F10, 0x7F00, + 0x7EF0, 0x7EF0, 0x7F30, 0x7F00, 0x7F10, 0x7F20, 0x7F20, 0x7F50, 0x7ED0, 0x6110, 0x4370, 0x25F0, 0x0830, 0xEEF0, 0xD720, 0xC150, + 0xADF0, 0x9BD0, 0x8E90, 0x88A0, 0x86F0, 0x86C0, 0x8790, 0x8AA0, 0x92B0, 0x9DF0, 0xA910, 0xB410, 0xBE70, 0xC790, 0xD050, 0xD830, + 0xDEE0, 0xE590, 0xEBF0, 0xF220, 0xF780, 0xFB50, 0xFFF0, 0x02C0, 0x0510, 0x06E0, 0x0840, 0x09F0, 0x0AB0, 0x0B50, 0x0BE0, 0x0C60, + 0x0E30, 0x0FA0, 0x11A0, 0x1430, 0x16B0, 0x1AA0, 0x1EC0, 0x23D0, 0x29F0, 0x3020, 0x3650, 0x3B30, 0x3FF0, 0x4420, 0x4790, 0x4B10, + 0x4D20, 0x4DF0, 0x4D90, 0x4B70, 0x4940, 0x4640, 0x43F0, 0x42A0, 0x40E0, 0x40F0, 0x4190, 0x4320, 0x4650, 0x4A90, 0x50C0, 0x57C0, + 0x5F90, 0x68B0, 0x7100, 0x7960, 0x7E90, 0x7F30, 0x7F00, 0x7E90, 0x7ED0, 0x7F10, 0x7F20, 0x7F10, 0x7EB0, 0x7F00, 0x7F10, 0x7F10, + 0x7F10, 0x7EC0, 0x7F00, 0x7F10, 0x7F20, 0x7F20, 0x7F00, 0x7F30, 0x7F20, 0x7F40, 0x7F10, 0x7E10, 0x5E70, 0x3AF0, 0x1490, 0xEAE0, + 0xC400, 0x9D90, 0x8660, 0x84C0, 0x8490, 0x8480, 0x8470, 0x8460, 0x8450, 0x8440, 0x8440, 0x8440, 0x8430, 0x8430, 0x8430, 0x8430, + 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8420, 0x8420, 0x8430, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8410, 0x8410, + 0x8410, 0x8410, 0x8410, 0x8410, 0x8400, 0x8420, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x83F0, 0x83E0, 0x83F0, 0x83F0, 0x83F0, + 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8400, 0x8400, 0x8410, 0x8410, 0x8410, 0x8420, 0x8420, 0x8430, 0x8430, 0x8440, + 0x8480, 0x8460, 0x8470, 0x8480, 0x8480, 0x84B0, 0x84E0, 0x8530, 0x86A0, 0x8DB0, 0x9D20, 0xAB40, 0xB7F0, 0xC4C0, 0xD130, 0xDD30, + 0xE8D0, 0xF3B0, 0xFE00, 0x06A0, 0x0E10, 0x1420, 0x19C0, 0x1F30, 0x2310, 0x2570, 0x2790, 0x2830, 0x27F0, 0x2540, 0x2150, 0x1AE0, + 0x12E0, 0x0890, 0xFD50, 0xF0A0, 0xE460, 0xD8B0, 0xCD10, 0xC1D0, 0xB660, 0xAB80, 0xA180, 0x98E0, 0x9180, 0x8BD0, 0x8870, 0x86C0, + 0x85F0, 0x8590, 0x8570, 0x8570, 0x8570, 0x85C0, 0x85E0, 0x8680, 0x8820, 0x8C40, 0x95F0, 0xA030, 0xAAB0, 0xB510, 0xBFB0, 0xCA30, + 0xD440, 0xDCD0, 0xE380, 0xE900, 0xEC90, 0xF030, 0xF390, 0xF7E0, 0xFC70, 0x00D0, 0x04C0, 0x0860, 0x0BD0, 0x0EA0, 0x1170, 0x1430, + 0x1650, 0x18E0, 0x1BD0, 0x1F80, 0x22B0, 0x2640, 0x28C0, 0x2A50, 0x2BA0, 0x2C60, 0x2D70, 0x2E50, 0x30B0, 0x3360, 0x36D0, 0x3990, + 0x3BC0, 0x3E10, 0x3FF0, 0x42B0, 0x4640, 0x4A20, 0x4D80, 0x5160, 0x54E0, 0x58D0, 0x5D30, 0x6120, 0x65A0, 0x69C0, 0x6DF0, 0x71B0, + 0x75F0, 0x78D0, 0x7BD0, 0x7DF0, 0x7EF0, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F30, 0x7F20, + 0x7F40, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F10, 0x7F30, 0x7F30, 0x7F20, 0x7F40, + 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F00, 0x7F30, 0x7F30, 0x7F40, 0x7F40, 0x7F10, + 0x7F20, 0x7F20, 0x7F40, 0x7F30, 0x7F70, 0x7F20, 0x7EF0, 0x7F00, 0x7F20, 0x7F40, 0x7F10, 0x7EB0, 0x7EF0, 0x7EE0, 0x7EF0, 0x7EB0, + 0x7EA0, 0x7ED0, 0x7F30, 0x7F30, 0x7F00, 0x7F10, 0x7F10, 0x7EF0, 0x7F40, 0x7F40, 0x7ED0, 0x7F00, 0x7EF0, 0x7F30, 0x7F30, 0x7E70, + 0x7ED0, 0x7EE0, 0x7F10, 0x7F30, 0x7E70, 0x7EC0, 0x7F10, 0x7F20, 0x7F20, 0x7F00, 0x7F10, 0x7F20, 0x7F10, 0x7F10, 0x7F00, 0x7F00, + 0x7F10, 0x7F10, 0x7F30, 0x7F00, 0x7F40, 0x7F20, 0x7F20, 0x7F40, 0x7F10, 0x7F30, 0x7EF0, 0x7F00, 0x7EF0, 0x7F00, 0x7F40, 0x7EF0, + 0x7F10, 0x7F00, 0x7F20, 0x7F80, 0x7EF0, 0x7EB0, 0x7F10, 0x7F10, 0x7F30, 0x7EE0, 0x7EC0, 0x7F10, 0x7F20, 0x7F40, 0x7EF0, 0x7EB0, + 0x7F00, 0x7F10, 0x7F10, 0x7EE0, 0x7EA0, 0x7EF0, 0x7F10, 0x7F20, 0x7EF0, 0x7EB0, 0x7F20, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7F20, + 0x7EF0, 0x7F00, 0x7F00, 0x7EE0, 0x7F50, 0x7F00, 0x7F20, 0x7F40, 0x7F10, 0x7F70, 0x7F10, 0x7F10, 0x7F10, 0x7EE0, 0x7F70, 0x7F10, + 0x7F10, 0x7F00, 0x7EF0, 0x7F70, 0x7F00, 0x7F00, 0x7EF0, 0x7EB0, 0x7F60, 0x7EF0, 0x7E90, 0x7EE0, 0x7EE0, 0x7F50, 0x7F20, 0x7EA0, + 0x7ED0, 0x7ED0, 0x7F10, 0x7F00, 0x7EA0, 0x7EB0, 0x7EE0, 0x7EF0, 0x7F10, 0x7EA0, 0x7F00, 0x7F20, 0x7F10, 0x7F10, 0x7EC0, 0x7F10, + 0x7F10, 0x7F00, 0x7EF0, 0x7EF0, 0x7F50, 0x7F20, 0x7F40, 0x7F20, 0x7F20, 0x7F60, 0x7F10, 0x7F10, 0x7F00, 0x7EF0, 0x7F50, 0x7F10, + 0x7F10, 0x7EF0, 0x7F10, 0x7F60, 0x7F00, 0x7EF0, 0x7F10, 0x7EE0, 0x7F60, 0x7EF0, 0x7EE0, 0x7EF0, 0x7F10, 0x7F30, 0x7F00, 0x7EC0, + 0x7F10, 0x7F10, 0x7EF0, 0x7E10, 0x7D30, 0x7D20, 0x7CC0, 0x7BF0, 0x7B60, 0x7A00, 0x7880, 0x76B0, 0x7500, 0x73E0, 0x7230, 0x71B0, + 0x7170, 0x7110, 0x7190, 0x7250, 0x7340, 0x74C0, 0x7630, 0x7840, 0x7A40, 0x7BD0, 0x7EC0, 0x7F10, 0x7F10, 0x7F20, 0x7F40, 0x7F00, + 0x7F30, 0x7EF0, 0x7F10, 0x7F30, 0x7F20, 0x7F90, 0x7F10, 0x7F10, 0x7EE0, 0x7EF0, 0x7F80, 0x7F00, 0x7EF0, 0x7EF0, 0x7F00, 0x7F70, + 0x7F20, 0x7ED0, 0x7EB0, 0x7EE0, 0x7F50, 0x7F10, 0x7E70, 0x7ED0, 0x7ED0, 0x7F30, 0x7F20, 0x7EC0, 0x7ED0, 0x7EE0, 0x7F10, 0x7F10, + 0x7E90, 0x7EB0, 0x7F00, 0x7F10, 0x7F20, 0x7F00, 0x7EF0, 0x7F20, 0x7F20, 0x7F20, 0x7F00, 0x7F30, 0x7F20, 0x7F20, 0x7EF0, 0x7EE0, + 0x7F40, 0x7F10, 0x7F30, 0x7F20, 0x7F00, 0x7F50, 0x7F10, 0x7F00, 0x7F10, 0x7F10, 0x7F30, 0x7EE0, 0x7EF0, 0x7F10, 0x7F20, 0x7F60, + 0x7EF0, 0x7F00, 0x7F00, 0x7F10, 0x7F30, 0x7EE0, 0x7EA0, 0x7EF0, 0x7F10, 0x7F30, 0x7ED0, 0x7EB0, 0x7F00, 0x7F00, 0x7F40, 0x7F10, + 0x7E00, 0x6EE0, 0x5E70, 0x4C30, 0x3BC0, 0x2A90, 0x1AD0, 0x0C00, 0xFDC0, 0xF090, 0xE300, 0xD590, 0xC750, 0xB980, 0xACE0, 0xA110, + 0x9730, 0x8F50, 0x8A50, 0x8800, 0x8720, 0x86E0, 0x8710, 0x8790, 0x8860, 0x89A0, 0x8B10, 0x8D40, 0x9030, 0x9460, 0x9930, 0x9CF0, + 0xA100, 0xA460, 0xA700, 0xA990, 0xAC70, 0xAF40, 0xB1C0, 0xB410, 0xB540, 0xB630, 0xB770, 0xB830, 0xB8C0, 0xB980, 0xBA50, 0xBB00, + 0xBAB0, 0xBAC0, 0xBA80, 0xBAC0, 0xBB40, 0xBB80, 0xBC20, 0xBB80, 0xBAE0, 0xBB40, 0xBC40, 0xBDE0, 0xBFB0, 0xC200, 0xC4E0, 0xC770, + 0xCA80, 0xCDB0, 0xD180, 0xD5E0, 0xDA20, 0xDE40, 0xE340, 0xE830, 0xEE00, 0xF3F0, 0xF9D0, 0xFF90, 0x0370, 0x07A0, 0x0B50, 0x0F30, + 0x1320, 0x1660, 0x1990, 0x1D30, 0x2070, 0x2390, 0x2670, 0x2980, 0x2C00, 0x2DF0, 0x30A0, 0x3260, 0x3440, 0x3710, 0x3830, 0x3A80, + 0x3B50, 0x3AF0, 0x3930, 0x3660, 0x32D0, 0x2F00, 0x2A60, 0x24F0, 0x1ED0, 0x1840, 0x1140, 0x0A10, 0x03F0, 0xFDE0, 0xF840, 0xF120, + 0xEA90, 0xE440, 0xDE80, 0xDB10, 0xD860, 0xD840, 0xD990, 0xDC70, 0xE0E0, 0xE680, 0xED30, 0xF520, 0xFD40, 0x06C0, 0x0FD0, 0x18F0, + 0x2340, 0x2E30, 0x38E0, 0x4440, 0x4F40, 0x5A50, 0x63B0, 0x6D20, 0x7550, 0x7C10, 0x7EE0, 0x7EC0, 0x7ED0, 0x7EE0, 0x7F20, 0x7F10, + 0x7E90, 0x7EB0, 0x7F00, 0x7F10, 0x7F10, 0x7E70, 0x7EE0, 0x7F10, 0x7F20, 0x7EA0, 0x7A80, 0x7600, 0x6F60, 0x6880, 0x6180, 0x59A0, + 0x5220, 0x4B70, 0x44D0, 0x3F50, 0x3960, 0x3380, 0x2ED0, 0x2AA0, 0x2840, 0x2510, 0x2270, 0x1FA0, 0x1C00, 0x1880, 0x1330, 0x0E50, + 0x0990, 0x06D0, 0x05E0, 0x0780, 0x0BB0, 0x11B0, 0x1900, 0x20F0, 0x27B0, 0x2CF0, 0x3160, 0x34B0, 0x3890, 0x3C00, 0x3F60, 0x4310, + 0x44A0, 0x4550, 0x4360, 0x3FA0, 0x3AF0, 0x35D0, 0x3040, 0x2B90, 0x2880, 0x2560, 0x22C0, 0x20D0, 0x1F30, 0x1E30, 0x1E80, 0x2030, + 0x2200, 0x2470, 0x2650, 0x2840, 0x29C0, 0x2B00, 0x2B80, 0x2BF0, 0x2BC0, 0x2AD0, 0x2980, 0x2870, 0x2700, 0x25B0, 0x2450, 0x2310, + 0x2230, 0x2160, 0x20E0, 0x2140, 0x2220, 0x2340, 0x2490, 0x25E0, 0x27A0, 0x2970, 0x2BB0, 0x2D40, 0x2F90, 0x3190, 0x3380, 0x35E0, + 0x3800, 0x3A80, 0x3C70, 0x3E90, 0x3FF0, 0x4130, 0x42B0, 0x4480, 0x4680, 0x4890, 0x4A20, 0x4AF0, 0x4B10, 0x4B50, 0x4B20, 0x4B80, + 0x4BF0, 0x4CB0, 0x4D70, 0x4D80, 0x4CD0, 0x4C70, 0x4C80, 0x4C80, 0x4CD0, 0x4C40, 0x4B40, 0x4910, 0x4680, 0x43B0, 0x4150, 0x3EB0, + 0x3C10, 0x3940, 0x3640, 0x32F0, 0x2F30, 0x2B30, 0x27D0, 0x24B0, 0x21A0, 0x1EA0, 0x1C10, 0x1A30, 0x1870, 0x1730, 0x1650, 0x1490, + 0x1270, 0x0F70, 0x0C70, 0x09E0, 0x0760, 0x05D0, 0x03F0, 0x0230, 0xFF20, 0xFC40, 0xF9F0, 0xF730, 0xF580, 0xF390, 0xF180, 0xEF20, + 0xEC20, 0xE9C0, 0xE7A0, 0xE4C0, 0xE230, 0xDE90, 0xDB00, 0xD860, 0xD680, 0xD530, 0xD510, 0xD470, 0xD340, 0xD210, 0xD130, 0xD090, + 0xD0C0, 0xD270, 0xD4A0, 0xD7C0, 0xDB80, 0xDEF0, 0xE140, 0xE3C0, 0xE5F0, 0xE7A0, 0xE870, 0xE8F0, 0xE8B0, 0xE7C0, 0xE800, 0xE890, + 0xE990, 0xEBB0, 0xEDC0, 0xF030, 0xF250, 0xF440, 0xF6D0, 0xF900, 0xFB20, 0xFC80, 0xFD60, 0xFE80, 0xFFF0, 0x0160, 0x02C0, 0x0300, + 0x0230, 0xFFA0, 0xFC10, 0xF7F0, 0xF480, 0xF140, 0xED70, 0xEA30, 0xE6A0, 0xE2C0, 0xDDB0, 0xD910, 0xD4F0, 0xD0A0, 0xCC90, 0xC8F0, + 0xC5E0, 0xC2F0, 0xC0B0, 0xBEA0, 0xBD50, 0xBC20, 0xBA40, 0xB920, 0xB7C0, 0xB780, 0xB850, 0xB880, 0xB8C0, 0xB880, 0xB7C0, 0xB6C0, + 0xB590, 0xB580, 0xB570, 0xB560, 0xB5B0, 0xB520, 0xB4F0, 0xB460, 0xB450, 0xB590, 0xB630, 0xB820, 0xB890, 0xB960, 0xBAA0, 0xBC50, + 0xBEB0, 0xC180, 0xC4C0, 0xC700, 0xC950, 0xCBD0, 0xCDC0, 0xCF30, 0xD100, 0xD1F0, 0xD220, 0xD1B0, 0xD090, 0xCFF0, 0xCF90, 0xD060, + 0xD0E0, 0xD190, 0xD280, 0xD320, 0xD400, 0xD560, 0xD710, 0xDAC0, 0xDE50, 0xE3C0, 0xE9B0, 0xF0E0, 0xF9C0, 0x0340, 0x0DA0, 0x1960, + 0x2600, 0x32B0, 0x3E80, 0x49C0, 0x53D0, 0x5B90, 0x61F0, 0x65C0, 0x6750, 0x6860, 0x6920, 0x6AD0, 0x6BF0, 0x6DC0, 0x6FE0, 0x7150, + 0x73F0, 0x7720, 0x7B90, 0x7EB0, 0x7F00, 0x7EE0, 0x7ED0, 0x7F70, 0x7F20, 0x7EC0, 0x7ED0, 0x7F00, 0x7F60, 0x7F10, 0x7EB0, 0x7EB0, + 0x7EC0, 0x7EF0, 0x7F10, 0x7EA0, 0x7F20, 0x7F10, 0x7F30, 0x7EE0, 0x7EA0, 0x7EF0, 0x7F00, 0x78C0, 0x7080, 0x6710, 0x5CB0, 0x5190, + 0x44E0, 0x3890, 0x2B30, 0x1EB0, 0x1280, 0x06F0, 0xFC90, 0xF390, 0xED60, 0xE8F0, 0xE600, 0xE520, 0xE560, 0xE650, 0xE780, 0xE8A0, + 0xEA50, 0xEB10, 0xECB0, 0xEEF0, 0xF180, 0xF470, 0xF670, 0xF8E0, 0xFBF0, 0xFF00, 0x02A0, 0x05D0, 0x0A10, 0x0DD0, 0x10A0, 0x1320, + 0x14B0, 0x1520, 0x1510, 0x1340, 0x1150, 0x0EA0, 0x0A70, 0x0630, 0x00F0, 0xFAE0, 0xF360, 0xE830, 0xDC40, 0xCE30, 0xC080, 0xB3B0, + 0xA830, 0x9EF0, 0x97B0, 0x9410, 0x93E0, 0x9690, 0x9C00, 0xA280, 0xA8E0, 0xAE50, 0xB160, 0xB2F0, 0xB220, 0xB030, 0xAD20, 0xA890, + 0xA250, 0x99F0, 0x8F70, 0x8840, 0x8590, 0x8500, 0x84D0, 0x84B0, 0x84A0, 0x8490, 0x8480, 0x8470, 0x8470, 0x8460, 0x8460, 0x8450, + 0x8450, 0x8440, 0x8440, 0x8440, 0x8430, 0x8430, 0x8430, 0x8430, 0x8420, 0x8420, 0x8420, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, + 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8430, 0x8430, 0x8430, 0x8440, 0x8450, 0x8440, 0x8440, 0x8450, 0x8450, 0x8450, 0x8450, + 0x8460, 0x8450, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8480, + 0x8470, 0x8470, 0x8470, 0x84A0, 0x8470, 0x8470, 0x84B0, 0x84B0, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8490, 0x8490, 0x8480, + 0x8490, 0x8490, 0x8490, 0x8490, 0x84C0, 0x8490, 0x8490, 0x8490, 0x84A0, 0x8490, 0x8490, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, + 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84D0, 0x84A0, 0x84A0, 0x84B0, 0x84A0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84A0, 0x84B0, 0x84B0, + 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84D0, 0x84B0, 0x84B0, + 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84C0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84C0, 0x84B0, + 0x84B0, 0x84B0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84E0, 0x84C0, 0x84C0, 0x84F0, 0x84F0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, + 0x84C0, 0x84C0, 0x84B0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84E0, 0x84D0, 0x84F0, 0x8510, 0x8550, 0x8590, 0x8630, 0x8780, 0x89D0, + 0x8E30, 0x9460, 0x9C00, 0xA330, 0xAAD0, 0xB320, 0xBB50, 0xC270, 0xC9B0, 0xD030, 0xD680, 0xDCB0, 0xE300, 0xE9C0, 0xEF80, 0xF710, + 0xFEC0, 0x0630, 0x0DD0, 0x1480, 0x1B20, 0x21D0, 0x2880, 0x3090, 0x39C0, 0x4240, 0x4B00, 0x52A0, 0x5A10, 0x6010, 0x6670, 0x6C70, + 0x71F0, 0x7870, 0x7CE0, 0x7F40, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F90, 0x7EF0, 0x7F10, 0x7F10, 0x7F00, 0x7F60, 0x7EF0, 0x7ED0, + 0x7F10, 0x7F20, 0x7F50, 0x7F00, 0x7EC0, 0x7F10, 0x7F10, 0x7F30, 0x7EE0, 0x7E90, 0x7F10, 0x7F10, 0x7EF0, 0x7EF0, 0x7EB0, 0x7F20, + 0x7F10, 0x7F10, 0x7F10, 0x7F00, 0x7F40, 0x7F00, 0x7F00, 0x7F10, 0x7F00, 0x7F30, 0x7F20, 0x7F40, 0x7F10, 0x7F10, 0x7F50, 0x7F10, + 0x7F10, 0x7F20, 0x7EF0, 0x7F90, 0x7F10, 0x7F20, 0x7F00, 0x7F10, 0x7F70, 0x7F00, 0x7F10, 0x7EF0, 0x7EE0, 0x7F60, 0x7EF0, 0x7EB0, + 0x7EE0, 0x7ED0, 0x7F70, 0x7F20, 0x7EC0, 0x7ED0, 0x7EB0, 0x7F00, 0x7F00, 0x7E90, 0x7EB0, 0x7EC0, 0x7EF0, 0x7F10, 0x7EA0, 0x7F00, + 0x7F10, 0x7F10, 0x7F00, 0x7E90, 0x7F00, 0x7F00, 0x7EF0, 0x7EF0, 0x7F00, 0x7F40, 0x7F20, 0x7F10, 0x7F20, 0x7F00, 0x7F50, 0x7F10, + 0x7F20, 0x7EE0, 0x7EF0, 0x7EF0, 0x7F10, 0x7F10, 0x7F10, 0x7F00, 0x7EF0, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F00, 0x7320, + 0x6620, 0x58D0, 0x4D30, 0x4270, 0x38C0, 0x2FF0, 0x26B0, 0x1D80, 0x1400, 0x0AD0, 0x0330, 0xFCC0, 0xF690, 0xF1B0, 0xEDD0, 0xE9D0, + 0xE550, 0xE060, 0xDB30, 0xD6C0, 0xD2F0, 0xD110, 0xD110, 0xD250, 0xD3A0, 0xD4E0, 0xD4C0, 0xD3E0, 0xD3A0, 0xD4C0, 0xD870, 0xDEF0, + 0xE560, 0xEA70, 0xEC00, 0xE9F0, 0xE440, 0xDD50, 0xD630, 0xD110, 0xCED0, 0xCF30, 0xD1B0, 0xD680, 0xDDE0, 0xE940, 0xF850, 0x0A70, + 0x1D60, 0x30B0, 0x3E50, 0x4620, 0x4840, 0x4650, 0x4130, 0x3BE0, 0x3760, 0x3450, 0x32A0, 0x3210, 0x3040, 0x2D80, 0x28A0, 0x21A0, + 0x18F0, 0x0F10, 0x0550, 0xFCC0, 0xF6B0, 0xF130, 0xEC40, 0xE6C0, 0xE010, 0xD920, 0xD270, 0xCC00, 0xC730, 0xC460, 0xC3A0, 0xC4D0, + 0xC7F0, 0xCC10, 0xD180, 0xD750, 0xDCD0, 0xE210, 0xE6B0, 0xEAD0, 0xEFB0, 0xF5E0, 0xFD20, 0x0410, 0x0AE0, 0x0FB0, 0x1330, 0x1490, + 0x1360, 0x0F20, 0x08F0, 0x00C0, 0xF700, 0xEDA0, 0xE5A0, 0xDEC0, 0xDA00, 0xD670, 0xD310, 0xD070, 0xCE20, 0xCB70, 0xC990, 0xC890, + 0xC7A0, 0xC750, 0xC650, 0xC5B0, 0xC500, 0xC4D0, 0xC4F0, 0xC500, 0xC580, 0xC580, 0xC620, 0xC720, 0xC820, 0xC9F0, 0xCC00, 0xCE60, + 0xD150, 0xD2E0, 0xD510, 0xD640, 0xD650, 0xD670, 0xD560, 0xD2A0, 0xCE80, 0xC800, 0xBFE0, 0xB550, 0xAAC0, 0xA050, 0x9580, 0x8C90, + 0x87E0, 0x8600, 0x8560, 0x8520, 0x8500, 0x84F0, 0x84F0, 0x84E0, 0x84F0, 0x84D0, 0x84C0, 0x84C0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, + 0x84A0, 0x84A0, 0x84B0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84B0, 0x84B0, 0x84B0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84B0, + 0x84B0, 0x84B0, 0x84A0, 0x84A0, 0x8490, 0x8490, 0x8490, 0x8490, 0x8480, 0x84B0, 0x8480, 0x8480, 0x8480, 0x8470, 0x8470, 0x8470, + 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, + 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8490, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, + 0x8470, 0x8470, 0x8470, 0x8470, 0x84A0, 0x8470, 0x8470, 0x8480, 0x8470, 0x8470, 0x8470, 0x8490, 0x8480, 0x8470, 0x8480, 0x8490, + 0x8480, 0x8480, 0x84B0, 0x8490, 0x8480, 0x8480, 0x8410, 0x8480, 0x8480, 0x8490, 0x8490, 0x8480, 0x8490, 0x8460, 0x8490, 0x8480, + 0x84A0, 0x8490, 0x8490, 0x8490, 0x84A0, 0x8490, 0x8490, 0x84A0, 0x8440, 0x84A0, 0x84A0, 0x84D0, 0x84A0, 0x84A0, 0x84A0, 0x84E0, + 0x84A0, 0x84B0, 0x84B0, 0x84B0, 0x84A0, 0x84A0, 0x84B0, 0x84B0, 0x84C0, 0x84B0, 0x84A0, 0x84A0, 0x84B0, 0x8450, 0x84B0, 0x84B0, + 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84D0, + 0x84D0, 0x84D0, 0x84E0, 0x84E0, 0x84F0, 0x8500, 0x84E0, 0x8530, 0x8540, 0x8570, 0x85B0, 0x8610, 0x86F0, 0x8890, 0x8C10, 0x9300, + 0x9A20, 0xA190, 0xAA10, 0xB2F0, 0xBCE0, 0xC760, 0xD300, 0xDF70, 0xEE40, 0xFD40, 0x0B90, 0x18B0, 0x2300, 0x29E0, 0x2CF0, 0x2CB0, + 0x2C60, 0x2B00, 0x2BD0, 0x37E0, 0x3A70, 0x3CD0, 0x3D60, 0x3CE0, 0x3AD0, 0x38B0, 0x3A00, 0x4070, 0x5010, 0x63B0, 0x74C0, 0x7D50, + 0x7D70, 0x7470, 0x5FF0, 0x4380, 0x2730, 0x0B90, 0xF200, 0xDA60, 0xC240, 0xAB30, 0x93E0, 0x8720, 0x8500, 0x84C0, 0x8460, 0x8450, + 0x8440, 0x8440, 0x8440, 0x8440, 0x8430, 0x8440, 0x8430, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8450, 0x8450, 0x8460, 0x8470, + 0x8480, 0x84A0, 0x84E0, 0x8540, 0x8730, 0x90F0, 0xA020, 0xAD80, 0xBA30, 0xC670, 0xD0B0, 0xD9F0, 0xDF10, 0xE050, 0xE010, 0xDDA0, + 0xDA90, 0xD7B0, 0xD4C0, 0xD180, 0xCCA0, 0xC650, 0xBE00, 0xB4D0, 0xAA00, 0x9D30, 0x8FB0, 0x8730, 0x8520, 0x84D0, 0x84A0, 0x8480, + 0x8470, 0x8460, 0x8450, 0x8440, 0x8430, 0x8420, 0x8410, 0x8410, 0x8400, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83E0, 0x83E0, 0x83E0, + 0x8400, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83C0, 0x83D0, 0x83C0, 0x83C0, 0x83C0, 0x83E0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, + 0x83C0, 0x83D0, 0x83C0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83E0, 0x83C0, 0x83E0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, + 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8400, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, + 0x8410, 0x8410, 0x8420, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8430, 0x8420, 0x8420, 0x8420, 0x8450, 0x8430, 0x8430, + 0x8430, 0x8450, 0x8440, 0x8450, 0x8410, 0x8450, 0x8460, 0x8480, 0x8470, 0x8480, 0x8490, 0x84C0, 0x84F0, 0x85C0, 0x9040, 0xAD20, + 0xCAB0, 0xE560, 0xFEC0, 0x1780, 0x2E50, 0x4530, 0x5A40, 0x6D40, 0x7C90, 0x7F00, 0x7F10, 0x7F00, 0x7F30, 0x7F00, 0x7F40, 0x7F10, + 0x7F00, 0x7F60, 0x7F10, 0x7F10, 0x7F20, 0x7EF0, 0x7F90, 0x7F10, 0x7F20, 0x7F00, 0x7EF0, 0x7F70, 0x7F00, 0x7F10, 0x7EF0, 0x7EE0, + 0x7F60, 0x7F10, 0x7EB0, 0x7EE0, 0x7EF0, 0x7F70, 0x7F20, 0x7EC0, 0x7ED0, 0x7EB0, 0x7F00, 0x7EF0, 0x7E90, 0x7EB0, 0x7EE0, 0x7F10, + 0x7F10, 0x7EA0, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7EC0, 0x7F00, 0x7F00, 0x7F00, 0x7EF0, 0x7F00, 0x7F40, 0x7F20, 0x7F10, 0x7F20, + 0x7F00, 0x7F50, 0x7F10, 0x7F20, 0x7EF0, 0x7EF0, 0x7F50, 0x7860, 0x6CD0, 0x6210, 0x55B0, 0x4820, 0x3AD0, 0x2DB0, 0x2250, 0x18C0, + 0x11D0, 0x0DF0, 0x0D20, 0x0F10, 0x13F0, 0x1AB0, 0x2300, 0x2B90, 0x3570, 0x3F60, 0x48B0, 0x5250, 0x5C00, 0x66C0, 0x70D0, 0x7A90, + 0x7F20, 0x7EC0, 0x7F10, 0x7F10, 0x7F20, 0x7F10, 0x7EB0, 0x7F10, 0x7EE0, 0x7EF0, 0x7F10, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F40, + 0x7F10, 0x7F80, 0x7F00, 0x7F20, 0x7EF0, 0x7F00, 0x7F60, 0x7EF0, 0x7F10, 0x7F10, 0x7F00, 0x7F80, 0x7F10, 0x7EF0, 0x7F10, 0x7EF0, + 0x7F30, 0x7F00, 0x7EE0, 0x7ED0, 0x7EF0, 0x7F20, 0x7F10, 0x7F00, 0x7EE0, 0x7EF0, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F20, 0x7F20, + 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7EF0, 0x7F10, 0x7F20, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F20, + 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, + 0x7F10, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F00, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7EF0, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F00, + 0x7F20, 0x7F40, 0x7F30, 0x7F10, 0x7F00, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F40, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, + 0x7F20, 0x7F30, 0x7F30, 0x7F40, 0x7F20, 0x7F30, 0x7F20, 0x7F40, 0x7F50, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F40, + 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F20, + 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, + 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7980, + 0x6EC0, 0x61F0, 0x5490, 0x4880, 0x3E20, 0x34F0, 0x2D90, 0x28A0, 0x2420, 0x1F10, 0x1980, 0x12A0, 0x0B80, 0x0470, 0xFDA0, 0xF850, + 0xF450, 0xF0D0, 0xECD0, 0xE8E0, 0xE3D0, 0xDEB0, 0xDA60, 0xD510, 0xD100, 0xCD50, 0xC9E0, 0xC7B0, 0xC5D0, 0xC5F0, 0xC730, 0xC9C0, + 0xCE10, 0xD210, 0xD5A0, 0xD990, 0xDD40, 0xE0B0, 0xE420, 0xE780, 0xEB10, 0xEF20, 0xF280, 0xF580, 0xF7B0, 0xF8A0, 0xF8E0, 0xF6D0, + 0xF3F0, 0xF1E0, 0xEF80, 0xEDD0, 0xEBC0, 0xE940, 0xE640, 0xE370, 0xDFD0, 0xDD10, 0xDA40, 0xD8A0, 0xD730, 0xD620, 0xD560, 0xD510, + 0xD500, 0xD600, 0xD800, 0xDB10, 0xDDF0, 0xE0F0, 0xE3E0, 0xE6A0, 0xEA10, 0xED20, 0xF080, 0xF3F0, 0xF740, 0xFA10, 0xFDA0, 0x01E0, + 0x0610, 0x0AB0, 0x0E60, 0x10F0, 0x13D0, 0x15B0, 0x1870, 0x1AD0, 0x1D20, 0x1FA0, 0x20A0, 0x2190, 0x21B0, 0x21B0, 0x2160, 0x2030, + 0x1FB0, 0x1F40, 0x1D40, 0x1C70, 0x1B60, 0x1AC0, 0x1A30, 0x1930, 0x1860, 0x1730, 0x15E0, 0x1520, 0x14A0, 0x14F0, 0x1550, 0x15E0, + 0x1610, 0x1600, 0x1770, 0x18A0, 0x1A50, 0x1D50, 0x2030, 0x2320, 0x25B0, 0x27B0, 0x2A40, 0x2C70, 0x2F90, 0x3370, 0x3650, 0x39D0, + 0x3CD0, 0x4030, 0x4340, 0x4630, 0x4970, 0x4C00, 0x4EF0, 0x50D0, 0x5220, 0x5440, 0x55C0, 0x5730, 0x57C0, 0x5770, 0x57B0, 0x5700, + 0x5720, 0x5780, 0x5710, 0x5780, 0x5780, 0x5730, 0x56C0, 0x5680, 0x5780, 0x5890, 0x59B0, 0x5A40, 0x5A50, 0x5A90, 0x5A60, 0x5A50, + 0x5AB0, 0x5A60, 0x5B40, 0x5B90, 0x5B30, 0x5B70, 0x5B70, 0x5DB0, 0x5F60, 0x60E0, 0x6280, 0x6390, 0x6520, 0x6700, 0x68D0, 0x6B90, + 0x6DE0, 0x7090, 0x7290, 0x7470, 0x7760, 0x7950, 0x7BD0, 0x7E20, 0x7F00, 0x7F10, 0x7EA0, 0x7EE0, 0x7F10, 0x7F10, 0x7F10, 0x7EA0, + 0x7EF0, 0x7F10, 0x7F00, 0x7EF0, 0x7EC0, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F00, 0x7F40, 0x7F10, 0x7F10, 0x7F00, 0x7EF0, 0x7F50, + 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F60, 0x7F10, 0x7F10, 0x7F00, 0x7EE0, 0x7F70, 0x7EF0, 0x7EF0, 0x7F20, 0x7F10, 0x7F80, 0x7F00, + 0x7ED0, 0x7F10, 0x7F00, 0x7F30, 0x7ED0, 0x7E90, 0x7EE0, 0x7EF0, 0x7F30, 0x7F00, 0x7EA0, 0x7F10, 0x7F10, 0x7F10, 0x7F00, 0x7E90, + 0x7F00, 0x7EF0, 0x7EF0, 0x7F20, 0x7F50, 0x7ED0, 0x7EB0, 0x7F00, 0x7EF0, 0x7EF0, 0x7F10, 0x7EA0, 0x7F20, 0x7F00, 0x7F00, 0x7F10, + 0x7F00, 0x7F30, 0x7F00, 0x7F40, 0x7F10, 0x7F00, 0x7F60, 0x7F10, 0x7F10, 0x7F20, 0x7EF0, 0x7F90, 0x7F10, 0x7F20, 0x7F00, 0x7F10, + 0x7F70, 0x7F10, 0x7F10, 0x7EF0, 0x7EE0, 0x7F60, 0x7F10, 0x7EB0, 0x7EE0, 0x7EF0, 0x7F70, 0x7F20, 0x7EC0, 0x7ED0, 0x7EB0, 0x7F00, + 0x7EF0, 0x7E90, 0x7EF0, 0x7EE0, 0x7F50, 0x7F00, 0x7440, 0x3C80, 0x0310, 0xC930, 0x90A0, 0x84F0, 0x84A0, 0x8480, 0x8470, 0x8470, + 0x8460, 0x8460, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x84A0, 0x8470, + 0x8470, 0x8470, 0x8460, 0x8480, 0x8480, 0x8490, 0x8490, 0x84A0, 0x84B0, 0x84E0, 0x84F0, 0x8550, 0x8720, 0x92F0, 0xA780, 0xB6C0, + 0xC2F0, 0xCA30, 0xCE00, 0xCC70, 0xC790, 0xC030, 0xB690, 0xAB30, 0x9F80, 0x9470, 0x8BC0, 0x8750, 0x85D0, 0x8540, 0x8500, 0x84E0, + 0x84B0, 0x84A0, 0x8480, 0x8480, 0x8470, 0x8470, 0x8450, 0x8460, 0x8450, 0x8450, 0x8440, 0x8410, 0x8440, 0x8430, 0x8430, 0x8430, + 0x8420, 0x8430, 0x8420, 0x8420, 0x8420, 0x8420, 0x8410, 0x8410, 0x8400, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, + 0x8410, 0x8410, 0x8410, 0x8410, 0x8420, 0x8420, 0x8420, 0x8420, 0x8430, 0x8430, 0x8430, 0x8440, 0x8440, 0x8450, 0x8460, 0x8460, + 0x8470, 0x8470, 0x8480, 0x8490, 0x84A0, 0x84B0, 0x84C0, 0x84D0, 0x84F0, 0x8520, 0x8560, 0x8600, 0x8740, 0x8A70, 0x9170, 0x9A40, + 0xA170, 0xA890, 0xAD80, 0xB1E0, 0xB450, 0xB5E0, 0xB560, 0xB360, 0xB050, 0xAD90, 0xAB80, 0xACC0, 0xB160, 0xB9A0, 0xC3D0, 0xCF10, + 0xD8B0, 0xDF10, 0xE300, 0xE4E0, 0xE640, 0xE7D0, 0xEA60, 0xEF40, 0xF460, 0xFA90, 0x0240, 0x0800, 0x0DD0, 0x1280, 0x1660, 0x1980, + 0x1C70, 0x2080, 0x2460, 0x2890, 0x2D30, 0x3260, 0x3840, 0x3E10, 0x4370, 0x48E0, 0x4CE0, 0x50B0, 0x5400, 0x55F0, 0x5850, 0x5A00, + 0x5C00, 0x5DC0, 0x5E10, 0x5F10, 0x5E40, 0x5B90, 0x5830, 0x52A0, 0x4B60, 0x4290, 0x38A0, 0x2D20, 0x2050, 0x13B0, 0x0500, 0xF6C0, + 0xE8B0, 0xDAA0, 0xCD70, 0xC0A0, 0xB480, 0xA9D0, 0xA090, 0x9910, 0x9470, 0x91F0, 0x9180, 0x91E0, 0x9440, 0x9770, 0x9BC0, 0xA110, + 0xA6F0, 0xAD40, 0xB410, 0xB9F0, 0xC0E0, 0xC780, 0xCE10, 0xD3F0, 0xD8B0, 0xDD70, 0xE150, 0xE5A0, 0xE940, 0xEC70, 0xF030, 0xF280, + 0xF540, 0xF850, 0xFB70, 0xFEE0, 0x0280, 0x05B0, 0x0940, 0x0CD0, 0x1200, 0x15E0, 0x1950, 0x1CB0, 0x20D0, 0x2500, 0x2940, 0x2DD0, + 0x3200, 0x3640, 0x3A70, 0x3F30, 0x4360, 0x4800, 0x4D50, 0x52F0, 0x5860, 0x5D70, 0x6240, 0x6720, 0x6BE0, 0x7060, 0x7530, 0x79A0, + 0x7CE0, 0x7ED0, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F10, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F20, 0x7F40, + 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F30, + 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F20, 0x7F20, 0x7F40, 0x7F10, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7EF0, 0x7F30, + 0x7F20, 0x7F10, 0x7F30, 0x7F00, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F00, 0x7F40, 0x7F30, 0x7F20, 0x7F40, 0x7F10, 0x7F30, 0x7F20, + 0x7F40, 0x7F40, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F40, 0x7F40, 0x7F30, 0x7F20, 0x7A60, 0x73F0, 0x6DA0, 0x6800, 0x61D0, + 0x5BB0, 0x5670, 0x5160, 0x4D40, 0x4A00, 0x46A0, 0x4370, 0x40B0, 0x3DD0, 0x3B60, 0x38A0, 0x3610, 0x33B0, 0x31B0, 0x2F70, 0x2C90, + 0x29B0, 0x2660, 0x22E0, 0x1F50, 0x1B70, 0x1760, 0x13E0, 0x0FB0, 0x0BE0, 0x0900, 0x0570, 0x01B0, 0xFE00, 0xFAA0, 0xF690, 0xF3F0, + 0xF0E0, 0xEE90, 0xEBF0, 0xE870, 0xE470, 0xE040, 0xDC50, 0xD830, 0xD4A0, 0xD130, 0xCEE0, 0xCBD0, 0xC8C0, 0xC5B0, 0xC280, 0xBF90, + 0xBD50, 0xBA50, 0xB7B0, 0xB500, 0xB220, 0xAF60, 0xABE0, 0xA920, 0xA590, 0xA240, 0x9EC0, 0x9A50, 0x96D0, 0x92A0, 0x8ED0, 0x8B60, + 0x88F0, 0x8770, 0x8690, 0x8600, 0x85B0, 0x8580, 0x8550, 0x8530, 0x8520, 0x8520, 0x8510, 0x8510, 0x8520, 0x8520, 0x8530, 0x8530, + 0x8530, 0x8540, 0x8550, 0x8550, 0x8560, 0x8570, 0x8570, 0x8570, 0x8580, 0x8570, 0x8580, 0x8590, 0x85B0, 0x85D0, 0x85F0, 0x8610, + 0x8630, 0x8640, 0x8670, 0x8670, 0x8680, 0x86C0, 0x86F0, 0x8720, 0x8740, 0x8760, 0x87B0, 0x87C0, 0x87F0, 0x8810, 0x8850, 0x8890, + 0x88D0, 0x8980, 0x8A10, 0x8AF0, 0x8BF0, 0x8D20, 0x8F10, 0x9140, 0x93B0, 0x96F0, 0x9A00, 0x9CF0, 0x9F50, 0xA0F0, 0xA340, 0xA550, + 0xA7A0, 0xA9C0, 0xAC10, 0xAEB0, 0xB040, 0xB2E0, 0xB4A0, 0xB6D0, 0xB8F0, 0xBB90, 0xBE50, 0xC160, 0xC450, 0xC710, 0xC960, 0xCBF0, + 0xCE50, 0xD030, 0xD270, 0xD390, 0xD5D0, 0xD7E0, 0xD990, 0xDBF0, 0xDDA0, 0xDEB0, 0xDFF0, 0xE040, 0xE010, 0xE000, 0xDFD0, 0xE010, + 0xE070, 0xE110, 0xE150, 0xE110, 0xE0C0, 0xE0A0, 0xE090, 0xE0C0, 0xE110, 0xE180, 0xE130, 0xE160, 0xE0E0, 0xE070, 0xDF50, 0xDEC0, + 0xDE50, 0xDE90, 0xDEA0, 0xDF20, 0xDEF0, 0xDF90, 0xE0E0, 0xE250, 0xE480, 0xE720, 0xE8C0, 0xE970, 0xEAB0, 0xEC00, 0xED90, 0xF010, + 0xF300, 0xF670, 0xFBB0, 0x0110, 0x07E0, 0x0DF0, 0x1410, 0x1A80, 0x1F60, 0x22F0, 0x2650, 0x2930, 0x2C40, 0x2F10, 0x31D0, 0x33B0, + 0x3300, 0x3110, 0x2D30, 0x27A0, 0x1FF0, 0x17F0, 0x0F60, 0x0400, 0xF710, 0xE8D0, 0xD810, 0xC500, 0xAE90, 0x9320, 0x8610, 0x84D0, + 0x84A0, 0x8480, 0x8470, 0x8460, 0x8450, 0x8450, 0x8440, 0x8430, 0x8430, 0x8430, 0x8410, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, + 0x8420, 0x8460, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8430, 0x8420, 0x8430, 0x8430, 0x8430, 0x8430, 0x8440, 0x8440, 0x8440, + 0x8440, 0x8440, 0x8450, 0x8430, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8460, 0x8460, 0x8460, 0x8460, + 0x8460, 0x8460, 0x8460, 0x8470, 0x8470, 0x8490, 0x84A0, 0x84A0, 0x84B0, 0x84C0, 0x84B0, 0x84B0, 0x84D0, 0x84C0, 0x84C0, 0x84C0, + 0x84D0, 0x84E0, 0x84F0, 0x8510, 0x8540, 0x8520, 0x8530, 0x8510, 0x8570, 0x85B0, 0x8630, 0x8690, 0x8740, 0x8860, 0x8A70, 0x8C40, + 0x8DE0, 0x8EF0, 0x8F90, 0x90A0, 0x9280, 0x9560, 0x98A0, 0x9B60, 0x9D70, 0x9F70, 0xA130, 0xA360, 0xA4B0, 0xA5F0, 0xA720, 0xA870, + 0xA9F0, 0xAC80, 0xB0B0, 0xB610, 0xBBD0, 0xC210, 0xC880, 0xCF70, 0xD7A0, 0xDFF0, 0xE9E0, 0xF4A0, 0x01A0, 0x1000, 0x1E20, 0x2D40, + 0x3CF0, 0x4D70, 0x5D00, 0x6AF0, 0x7750, 0x7E80, 0x7EF0, 0x7EF0, 0x7F70, 0x7F20, 0x7ED0, 0x7ED0, 0x7EB0, 0x7F30, 0x7EF0, 0x7EB0, + 0x7EE0, 0x7ED0, 0x7F30, 0x7F20, 0x7EA0, 0x7ED0, 0x7F10, 0x7F10, 0x7F10, 0x7E90, 0x7EB0, 0x7F00, 0x7EF0, 0x7F10, 0x7F00, 0x7F20, + 0x7F40, 0x7F20, 0x7F20, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7EF0, 0x7EF0, 0x7F70, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F60, 0x7F10, + 0x7F10, 0x7EF0, 0x7EE0, 0x7F30, 0x7EE0, 0x7F00, 0x7EF0, 0x7F10, 0x7F70, 0x7F00, 0x7ED0, 0x7EF0, 0x7F00, 0x7F50, 0x7EF0, 0x7EB0, + 0x7EE0, 0x7EF0, 0x7F90, 0x7F20, 0x7F00, 0x7F20, 0x7F00, 0x7F90, 0x7F10, 0x7EF0, 0x7EE0, 0x7EF0, 0x7F70, 0x7F20, 0x7EE0, 0x7EE0, + 0x7ED0, 0x7F30, 0x7F20, 0x7EC0, 0x7ED0, 0x7EB0, 0x7F00, 0x7F10, 0x7E90, 0x7EB0, 0x7EE0, 0x7EF0, 0x7F10, 0x7EA0, 0x7E00, 0x5DF0, + 0x3E20, 0x2360, 0x0C00, 0xF7D0, 0xE790, 0xDB20, 0xD3D0, 0xD090, 0xD190, 0xD4C0, 0xD790, 0xD9F0, 0xD890, 0xD360, 0xCA10, 0xBDE0, + 0xB1F0, 0xA550, 0x9A70, 0x92E0, 0x8D50, 0x8980, 0x8770, 0x8640, 0x85B0, 0x8580, 0x8590, 0x8600, 0x8730, 0x8B20, 0x9440, 0x9CE0, + 0xA200, 0xA3D0, 0xA310, 0x9F40, 0x9980, 0x9360, 0x8D30, 0x8950, 0x86F0, 0x85E0, 0x8570, 0x8530, 0x8510, 0x84F0, 0x84E0, 0x84D0, + 0x84D0, 0x84C0, 0x84C0, 0x84B0, 0x84C0, 0x84B0, 0x84C0, 0x84C0, 0x84E0, 0x8510, 0x85E0, 0x8AE0, 0x9D60, 0xB050, 0xC290, 0xD5B0, + 0xE610, 0xF420, 0xFE80, 0x0550, 0x0690, 0x0460, 0xFEE0, 0xF7E0, 0xF2A0, 0xF100, 0xF450, 0xFC10, 0x0730, 0x1420, 0x20E0, 0x2C10, + 0x3480, 0x39F0, 0x3D30, 0x3E70, 0x3F00, 0x3F40, 0x3FB0, 0x4190, 0x42A0, 0x44C0, 0x46B0, 0x4920, 0x4C80, 0x5000, 0x53E0, 0x5800, + 0x5B40, 0x5E00, 0x5F00, 0x5F80, 0x5E50, 0x5A70, 0x5420, 0x49E0, 0x3C50, 0x2C90, 0x1B20, 0x0980, 0xF630, 0xE550, 0xD5C0, 0xC750, + 0xBA70, 0xAFD0, 0xA680, 0x9F20, 0x9920, 0x94C0, 0x9200, 0x90D0, 0x9070, 0x90B0, 0x9200, 0x93C0, 0x95F0, 0x9930, 0x9E10, 0xA4C0, + 0xAD90, 0xB850, 0xC490, 0xD320, 0xE4D0, 0xF620, 0x07C0, 0x19C0, 0x2A30, 0x38A0, 0x4570, 0x4F90, 0x57F0, 0x5F40, 0x6470, 0x68B0, + 0x6C00, 0x6E10, 0x6FB0, 0x7030, 0x7070, 0x7120, 0x7190, 0x7200, 0x7290, 0x7290, 0x7170, 0x6FC0, 0x6DC0, 0x6C30, 0x6B70, 0x6C10, + 0x6E70, 0x72B0, 0x7790, 0x7C20, 0x7EE0, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7C70, 0x7480, 0x6AC0, 0x5F10, 0x5230, 0x44D0, 0x3810, + 0x2B70, 0x1EA0, 0x1390, 0x0890, 0xFDB0, 0xF3E0, 0xEB00, 0xE390, 0xDD30, 0xD790, 0xD1D0, 0xCCB0, 0xC7E0, 0xC2E0, 0xBE70, 0xBA70, + 0xB6B0, 0xB3B0, 0xB110, 0xADF0, 0xAB90, 0xA910, 0xA720, 0xA4F0, 0xA3C0, 0xA230, 0xA250, 0xA3D0, 0xA7E0, 0xAC90, 0xB2F0, 0xB9D0, + 0xC1A0, 0xC910, 0xD140, 0xD930, 0xE140, 0xEA50, 0xF330, 0xFC70, 0x0560, 0x0EC0, 0x1780, 0x1FC0, 0x2790, 0x2F50, 0x3700, 0x3DE0, + 0x44D0, 0x4B50, 0x5160, 0x5600, 0x59C0, 0x5C30, 0x5D80, 0x5E10, 0x5E10, 0x5D50, 0x5B40, 0x58E0, 0x5580, 0x51E0, 0x4DB0, 0x4970, + 0x4470, 0x4030, 0x3CA0, 0x3880, 0x3490, 0x3160, 0x2E20, 0x2B50, 0x2980, 0x27F0, 0x2710, 0x2530, 0x23D0, 0x20E0, 0x1D40, 0x1850, + 0x12D0, 0x0D00, 0x0600, 0xFED0, 0xF780, 0xF060, 0xE940, 0xE190, 0xDAD0, 0xD400, 0xCD50, 0xC660, 0xC0C0, 0xBB80, 0xB6E0, 0xB320, + 0xB070, 0xAD70, 0xAAC0, 0xA830, 0xA630, 0xA4E0, 0xA400, 0xA3E0, 0xA380, 0xA350, 0xA2C0, 0xA300, 0xA310, 0xA370, 0xA4B0, 0xA580, + 0xA5F0, 0xA660, 0xA6C0, 0xA740, 0xA7C0, 0xA820, 0xA8A0, 0xA9A0, 0xAA90, 0xAB50, 0xAC30, 0xACB0, 0xAE40, 0xB020, 0xB1A0, 0xB370, + 0xB590, 0xB7F0, 0xBAE0, 0xBE90, 0xC230, 0xC5A0, 0xC920, 0xCBC0, 0xCF80, 0xD280, 0xD6C0, 0xDAB0, 0xDEF0, 0xE2A0, 0xE5A0, 0xE990, + 0xED00, 0xF140, 0xF530, 0xF870, 0xFB60, 0xFD80, 0xFFD0, 0x0260, 0x04A0, 0x07D0, 0x0B00, 0x0D60, 0x0ED0, 0x0F80, 0x10B0, 0x1160, + 0x1150, 0x1190, 0x1100, 0x1070, 0x0FB0, 0x0F70, 0x0EC0, 0x0E40, 0x0E60, 0x0D60, 0x0CE0, 0x0C50, 0x0B20, 0x0B20, 0x0B90, 0x0BF0, + 0x0C70, 0x0C60, 0x0C80, 0x0D30, 0x0E20, 0x0F90, 0x10A0, 0x1230, 0x1360, 0x13D0, 0x1600, 0x1700, 0x1920, 0x1B30, 0x1CB0, 0x1E40, + 0x1F10, 0x2070, 0x21F0, 0x2420, 0x2790, 0x2A90, 0x2DF0, 0x3010, 0x3330, 0x36E0, 0x3A40, 0x3F40, 0x4580, 0x4B60, 0x5240, 0x5880, + 0x5E80, 0x6440, 0x6910, 0x6FB0, 0x75E0, 0x7BE0, 0x7ED0, 0x7F20, 0x7F00, 0x7EF0, 0x7F90, 0x7F20, 0x7F20, 0x7EF0, 0x7EF0, 0x7F60, + 0x7EE0, 0x7ED0, 0x7EE0, 0x7EE0, 0x7F50, 0x7F10, 0x7EB0, 0x7EE0, 0x7ED0, 0x7F10, 0x7F10, 0x7EC0, 0x7EB0, 0x7EB0, 0x7EF0, 0x7EF0, + 0x7EB0, 0x7F00, 0x7F20, 0x7F10, 0x7F20, 0x7EC0, 0x7F10, 0x7F10, 0x7F00, 0x7F00, 0x7ED0, 0x7F30, 0x7F20, 0x7EF0, 0x7F10, 0x7F00, + 0x7F40, 0x7F10, 0x7F10, 0x7F00, 0x7EE0, 0x7F50, 0x7F20, 0x7F00, 0x7EF0, 0x7F10, 0x7F60, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7F50, + 0x7EF0, 0x7EF0, 0x7EE0, 0x7EF0, 0x7F70, 0x7F00, 0x7EC0, 0x7F10, 0x7F20, 0x7F60, 0x7EF0, 0x7EB0, 0x7EF0, 0x7EE0, 0x7EF0, 0x7EF0, + 0x7EB0, 0x7EF0, 0x7F10, 0x7F20, 0x7F00, 0x7EC0, 0x7F10, 0x7F00, 0x7F20, 0x7F10, 0x7EA0, 0x7F00, 0x7EF0, 0x7F10, 0x7F20, 0x7F40, + 0x7F50, 0x7C30, 0x6F70, 0x5F80, 0x4DD0, 0x3A30, 0x2520, 0x1040, 0xFB70, 0xE900, 0xD840, 0xC9F0, 0xBD30, 0xB480, 0xAE20, 0xA930, + 0xA750, 0xA620, 0xA5D0, 0xA4D0, 0xA3B0, 0xA260, 0xA0E0, 0xA080, 0xA0A0, 0xA1E0, 0xA3B0, 0xA6F0, 0xAA90, 0xAFC0, 0xB590, 0xBB30, + 0xC1A0, 0xC740, 0xCD30, 0xD220, 0xD680, 0xD930, 0xDA20, 0xD950, 0xD820, 0xD590, 0xD370, 0xD050, 0xCD90, 0xCBA0, 0xCA40, 0xC900, + 0xCA00, 0xCB70, 0xCDF0, 0xD140, 0xD4B0, 0xD860, 0xDB30, 0xDE00, 0xE160, 0xE5B0, 0xEAD0, 0xEFC0, 0xF560, 0xFB50, 0x0100, 0x0730, + 0x0CC0, 0x1220, 0x1850, 0x1E50, 0x25F0, 0x2D90, 0x37E0, 0x4270, 0x4D50, 0x5990, 0x6520, 0x6F60, 0x7790, 0x7D70, 0x7EF0, 0x7F10, + 0x7F30, 0x7EF0, 0x7EF0, 0x7EF0, 0x7F10, 0x7F70, 0x7F00, 0x7C10, 0x6CC0, 0x5B60, 0x47F0, 0x3430, 0x1F70, 0x0BC0, 0xF880, 0xE670, + 0xD660, 0xC5C0, 0xB700, 0xA960, 0x9B50, 0x8EC0, 0x87F0, 0x85B0, 0x8510, 0x84F0, 0x84D0, 0x84C0, 0x84C0, 0x84B0, 0x84B0, 0x84A0, + 0x84A0, 0x8490, 0x8490, 0x8470, 0x8490, 0x8490, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8490, 0x8490, 0x84A0, 0x8490, 0x84C0, + 0x84E0, 0x8530, 0x8620, 0x89F0, 0x9440, 0x9D20, 0xA120, 0xA050, 0x9B40, 0x9190, 0x8910, 0x85C0, 0x8500, 0x84D0, 0x84C0, 0x84B0, + 0x8490, 0x84B0, 0x84A0, 0x84B0, 0x84A0, 0x84B0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84D0, 0x84D0, 0x84E0, 0x84E0, 0x84E0, 0x84F0, + 0x8500, 0x8520, 0x8540, 0x8580, 0x85E0, 0x8690, 0x8800, 0x8B90, 0x9410, 0xA290, 0xB290, 0xC3E0, 0xD610, 0xE710, 0xF680, 0x0360, + 0x0CC0, 0x1350, 0x1640, 0x16F0, 0x1490, 0x0FF0, 0x0920, 0x01C0, 0xFA70, 0xF3B0, 0xEDE0, 0xE890, 0xE480, 0xE0A0, 0xDC40, 0xD690, + 0xCFB0, 0xC750, 0xBE00, 0xB2F0, 0xA7C0, 0x9E70, 0x95B0, 0x8E30, 0x8980, 0x8700, 0x85E0, 0x8550, 0x8510, 0x84F0, 0x84E0, 0x84D0, + 0x84C0, 0x84C0, 0x84C0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84A0, 0x84A0, 0x84A0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, + 0x84F0, 0x8500, 0x8510, 0x8510, 0x8520, 0x8540, 0x8550, 0x8580, 0x85A0, 0x85C0, 0x85A0, 0x8560, 0x8520, 0x84F0, 0x84C0, 0x84B0, + 0x8490, 0x8480, 0x8470, 0x8460, 0x8450, 0x8440, 0x8430, 0x8430, 0x8420, 0x8460, 0x8410, 0x8410, 0x8400, 0x8400, 0x8400, 0x8400, + 0x8400, 0x8410, 0x8410, 0x8400, 0x8410, 0x8410, 0x8420, 0x8470, 0x8420, 0x83F0, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, + 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8440, 0x8440, 0x8440, 0x8450, 0x8450, 0x8460, 0x8460, 0x8470, 0x84C0, 0x8480, 0x8490, + 0x8480, 0x84A0, 0x84B0, 0x84C0, 0x84D0, 0x84F0, 0x8510, 0x8590, 0x86E0, 0x8B70, 0x9610, 0xA0B0, 0xADF0, 0xB8A0, 0xC300, 0xCE20, + 0xDAB0, 0xE990, 0xF9D0, 0x0AC0, 0x1C10, 0x2C30, 0x3A60, 0x4410, 0x4AB0, 0x4F40, 0x5220, 0x5480, 0x56F0, 0x5A30, 0x5DA0, 0x6090, + 0x62B0, 0x63A0, 0x63D0, 0x62F0, 0x6280, 0x6320, 0x6560, 0x6A50, 0x7160, 0x79C0, 0x7F10, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, + 0x7F20, 0x7F30, 0x7F30, 0x7F30, 0x7F40, 0x7F30, 0x7F30, 0x7F30, 0x7F40, 0x7F30, 0x7F30, 0x7D00, 0x7540, 0x6E50, 0x6830, 0x63E0, + 0x61D0, 0x61D0, 0x63C0, 0x67B0, 0x6AB0, 0x6D50, 0x6EA0, 0x6C70, 0x6570, 0x5920, 0x4780, 0x3480, 0x20A0, 0x1180, 0x05E0, 0xFE00, + 0xF890, 0xF520, 0xF200, 0xEE10, 0xEA10, 0xE710, 0xE670, 0xE890, 0xEE40, 0xF880, 0x06F0, 0x1870, 0x2B20, 0x3E20, 0x51B0, 0x6230, + 0x7040, 0x7B90, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F50, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F20, + 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F40, + 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F30, 0x7840, 0x68F0, 0x5730, 0x4330, 0x3000, 0x1EC0, 0x0FF0, 0x0800, 0x0440, 0x03F0, 0x0530, + 0x06A0, 0x08E0, 0x0C90, 0x12F0, 0x1EA0, 0x2DB0, 0x3EB0, 0x4D20, 0x5640, 0x57D0, 0x5310, 0x4AB0, 0x42C0, 0x3DB0, 0x3CF0, 0x40A0, + 0x46D0, 0x4D80, 0x5420, 0x59A0, 0x5EE0, 0x6330, 0x67A0, 0x6A80, 0x6D70, 0x7010, 0x71F0, 0x73C0, 0x74B0, 0x7530, 0x7520, 0x74D0, + 0x7370, 0x72A0, 0x7340, 0x7580, 0x7850, 0x7BE0, 0x7E40, 0x7F10, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, + 0x7F30, 0x7F70, 0x7F10, 0x7E90, 0x7F20, 0x7F20, 0x7EF0, 0x7EF0, 0x7EA0, 0x7F40, 0x7F10, 0x7F00, 0x7EC0, 0x7E90, 0x7EB0, 0x7EB0, + 0x7F00, 0x7EF0, 0x7F00, 0x7EE0, 0x7EF0, 0x7F10, 0x7F20, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7F00, 0x7F00, 0x7F20, 0x7EE0, 0x7F10, + 0x7D30, 0x6D60, 0x5DF0, 0x4DC0, 0x3C90, 0x2A50, 0x1940, 0x08B0, 0xFB90, 0xF0F0, 0xEB50, 0xE9C0, 0xEBC0, 0xF100, 0xF7B0, 0xFD60, + 0x01A0, 0x03F0, 0x0710, 0x09C0, 0x0DC0, 0x1250, 0x1630, 0x1A60, 0x1C30, 0x1DE0, 0x1F00, 0x2090, 0x2550, 0x2BB0, 0x3520, 0x4060, + 0x4C70, 0x56A0, 0x5B60, 0x5990, 0x4DB0, 0x37E0, 0x1BD0, 0xFD30, 0xE170, 0xCAD0, 0xBD10, 0xB630, 0xB300, 0xB1A0, 0xB110, 0xB0B0, + 0xB060, 0xB150, 0xB450, 0xB820, 0xBD40, 0xC2D0, 0xC8B0, 0xCE30, 0xD340, 0xD580, 0xD770, 0xD800, 0xD7F0, 0xD850, 0xDA10, 0xDCA0, + 0xE050, 0xE4F0, 0xE970, 0xECD0, 0xF060, 0xF270, 0xF450, 0xF690, 0xF8B0, 0xFCA0, 0xFF40, 0x0230, 0x05B0, 0x0810, 0x0A30, 0x0AB0, + 0x0A40, 0x0A40, 0x0910, 0x08A0, 0x08C0, 0x0840, 0x0980, 0x0A00, 0x0B10, 0x0B80, 0x0BE0, 0x0CC0, 0x0D40, 0x0D90, 0x0E60, 0x0F50, + 0x1010, 0x1090, 0x1260, 0x13F0, 0x15B0, 0x1850, 0x1A70, 0x1C30, 0x1F70, 0x22A0, 0x2740, 0x2BD0, 0x2FF0, 0x3540, 0x3910, 0x3DF0, + 0x41F0, 0x45D0, 0x4990, 0x4CB0, 0x50E0, 0x53D0, 0x5590, 0x5700, 0x55C0, 0x5430, 0x5070, 0x4A90, 0x4390, 0x3B30, 0x32E0, 0x2A40, + 0x2210, 0x1BF0, 0x1600, 0x11D0, 0x0E90, 0x0C40, 0x0AE0, 0x0A10, 0x09B0, 0x09D0, 0x0870, 0x07B0, 0x0600, 0x03E0, 0x0190, 0xFEC0, + 0xFBC0, 0xF800, 0xF3F0, 0xEF30, 0xE920, 0xE2D0, 0xDCB0, 0xD670, 0xD060, 0xC9D0, 0xC330, 0xBB90, 0xB2C0, 0xA970, 0x9FD0, 0x9800, + 0x9120, 0x8D10, 0x8B30, 0x8A90, 0x8B30, 0x8D30, 0x8FA0, 0x9340, 0x9670, 0x98B0, 0x9530, 0x93C0, 0x9230, 0x90E0, 0x8F90, 0x8E40, + 0x8CD0, 0x8B20, 0x8990, 0x8870, 0x87C0, 0x8760, 0x8710, 0x86E0, 0x86C0, 0x86B0, 0x8690, 0x8680, 0x8670, 0x8670, 0x8670, 0x8670, + 0x8690, 0x86D0, 0x8750, 0x8820, 0x8980, 0x8C30, 0x8FC0, 0x9360, 0x9670, 0x98F0, 0x9AE0, 0x9C20, 0x9E70, 0xA0B0, 0xA3A0, 0xA6D0, + 0xAA30, 0xADE0, 0xB150, 0xB430, 0xB6B0, 0xBA10, 0xBDA0, 0xC250, 0xC750, 0xCCC0, 0xD220, 0xD790, 0xDD00, 0xE240, 0xE8F0, 0xEF30, + 0xF5B0, 0xFD10, 0x02F0, 0x08F0, 0x0F40, 0x1610, 0x1D20, 0x23F0, 0x2BE0, 0x32D0, 0x3A60, 0x4080, 0x4670, 0x4C70, 0x5170, 0x57C0, + 0x5D90, 0x6330, 0x69E0, 0x7030, 0x7620, 0x7BA0, 0x7E90, 0x7F10, 0x7EB0, 0x7F20, 0x7F10, 0x7F10, 0x7F00, 0x7EC0, 0x7F30, 0x7F20, + 0x7F20, 0x7F10, 0x7F10, 0x7F30, 0x7EF0, 0x7F10, 0x7F00, 0x7EE0, 0x7F50, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F90, 0x7F00, 0x7F10, + 0x7F10, 0x7F00, 0x7F60, 0x7EE0, 0x7ED0, 0x7F10, 0x7F20, 0x7F70, 0x7DF0, 0x7AA0, 0x78E0, 0x7790, 0x76B0, 0x7720, 0x7800, 0x7A50, + 0x7CE0, 0x7E90, 0x7ED0, 0x7EB0, 0x7F20, 0x7F10, 0x7F10, 0x7F10, 0x7F00, 0x7F10, 0x7F00, 0x7F00, 0x7F10, 0x7F00, 0x7F30, 0x7F20, + 0x7F40, 0x7F10, 0x7F00, 0x7F40, 0x7F10, 0x7F10, 0x7F20, 0x7EF0, 0x7F90, 0x7F10, 0x7F20, 0x7EF0, 0x7F10, 0x7F70, 0x7F00, 0x7F10, + 0x7EF0, 0x7EE0, 0x7F60, 0x7EF0, 0x7EF0, 0x7EE0, 0x7EF0, 0x7F70, 0x7F20, 0x7EC0, 0x7ED0, 0x7EB0, 0x7F10, 0x7F10, 0x7E90, 0x7EB0, + 0x7EE0, 0x7EF0, 0x7F10, 0x7EA0, 0x7F00, 0x7F10, 0x7F20, 0x7E60, 0x6E40, 0x5F50, 0x50B0, 0x4120, 0x3380, 0x2680, 0x1A60, 0x0F90, + 0x06B0, 0x0010, 0xFB20, 0xF8F0, 0xF950, 0xFB60, 0x0000, 0x0580, 0x0D30, 0x1500, 0x1D10, 0x2600, 0x2D80, 0x3460, 0x3A10, 0x3EB0, + 0x42A0, 0x4580, 0x47F0, 0x49A0, 0x4B80, 0x4D80, 0x4E80, 0x4EF0, 0x4F80, 0x4F70, 0x4EC0, 0x4BE0, 0x47B0, 0x4290, 0x3CA0, 0x3720, + 0x3080, 0x2930, 0x21B0, 0x18D0, 0x1130, 0x0930, 0x0250, 0xFCD0, 0xF850, 0xF430, 0xF060, 0xEC40, 0xE8E0, 0xE540, 0xE050, 0xDAE0, + 0xD330, 0xCAD0, 0xC1C0, 0xB8D0, 0xB030, 0xA770, 0x9FD0, 0x9880, 0x9210, 0x8D30, 0x89A0, 0x87C0, 0x86A0, 0x8600, 0x85A0, 0x8550, + 0x8520, 0x8500, 0x84F0, 0x84E0, 0x84C0, 0x84C0, 0x84B0, 0x8490, 0x8490, 0x8480, 0x8470, 0x8470, 0x8460, 0x8450, 0x8440, 0x8430, + 0x8430, 0x8420, 0x8410, 0x8400, 0x83F0, 0x83D0, 0x83E0, 0x83E0, 0x83D0, 0x83D0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, + 0x83D0, 0x83C0, 0x83C0, 0x83D0, 0x83C0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, + 0x83E0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83C0, + 0x83D0, 0x83D0, 0x83D0, 0x83C0, 0x83D0, 0x83D0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83D0, 0x83D0, 0x83D0, + 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83E0, 0x83D0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x8400, + 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8410, 0x8410, 0x8420, 0x8410, 0x8410, 0x8420, 0x8420, + 0x8410, 0x8430, 0x8430, 0x8450, 0x8430, 0x8440, 0x8450, 0x8460, 0x8470, 0x8480, 0x84B0, 0x8520, 0x8C20, 0xB580, 0xDB30, 0xFF20, + 0x2000, 0x3EC0, 0x5B10, 0x7540, 0x7F20, 0x7EF0, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F30, 0x7F40, + 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F40, 0x7F20, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F40, 0x7F30, + 0x7F30, 0x7F20, 0x7F40, 0x7EF0, 0x6CD0, 0x57F0, 0x4040, 0x2350, 0x0660, 0xE7E0, 0xC930, 0xAB30, 0x9050, 0x8620, 0x84F0, 0x84C0, + 0x84B0, 0x84A0, 0x8490, 0x8490, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8490, 0x84A0, 0x84D0, 0x8530, 0x8B10, 0xB130, + 0xD720, 0xFD70, 0x24E0, 0x46E0, 0x6470, 0x7BB0, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, + 0x7F30, 0x7F10, 0x7F20, 0x7F00, 0x7F10, 0x7EB0, 0x7F20, 0x7EF0, 0x7EF0, 0x7F00, 0x7F00, 0x7F40, 0x7EF0, 0x7F20, 0x7F00, 0x7ED0, + 0x7ED0, 0x7EE0, 0x7F40, 0x7EF0, 0x7F10, 0x7F60, 0x7EF0, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F10, 0x7EE0, 0x7EF0, 0x7EF0, 0x7F40, + 0x7F10, 0x7ED0, 0x7F00, 0x7F00, 0x7F40, 0x7F10, 0x7EB0, 0x7EE0, 0x7F10, 0x7F30, 0x7EC0, 0x7E90, 0x7F10, 0x7F20, 0x7F20, 0x6740, + 0x4E00, 0x32E0, 0x1A10, 0x0050, 0xE860, 0xD1C0, 0xBF40, 0xAF10, 0xA280, 0x9840, 0x8F10, 0x89B0, 0x8730, 0x8610, 0x85A0, 0x8580, + 0x8590, 0x85D0, 0x8670, 0x8810, 0x8B40, 0x90E0, 0x98E0, 0xA1C0, 0xAB30, 0xB520, 0xBE60, 0xC6E0, 0xCFD0, 0xD750, 0xDDC0, 0xE2F0, + 0xE7D0, 0xEBF0, 0xF080, 0xF490, 0xF970, 0x0080, 0x07D0, 0x1250, 0x1E90, 0x2CB0, 0x3B80, 0x4800, 0x50B0, 0x5160, 0x4610, 0x30B0, + 0x0F40, 0xE7A0, 0xBCA0, 0x92C0, 0x8540, 0x84C0, 0x84A0, 0x8490, 0x8470, 0x8470, 0x8460, 0x8460, 0x8460, 0x8460, 0x8470, 0x8470, + 0x8480, 0x84A0, 0x84B0, 0x8580, 0x94C0, 0xB5F0, 0xCF30, 0xDFF0, 0xE7D0, 0xE6E0, 0xDF90, 0xD4B0, 0xC960, 0xC170, 0xBF00, 0xC210, + 0xCB50, 0xD960, 0xEC20, 0xFF70, 0x1580, 0x2C90, 0x4550, 0x5F60, 0x7720, 0x7F30, 0x7ED0, 0x7EA0, 0x7EF0, 0x7F10, 0x7F30, 0x7F00, + 0x7EC0, 0x7F10, 0x7F00, 0x7F00, 0x7EF0, 0x7EA0, 0x7EE0, 0x7EF0, 0x62D0, 0x3D80, 0x1500, 0xE850, 0xB7B0, 0x8880, 0x84C0, 0x8480, + 0x8460, 0x8460, 0x8440, 0x8440, 0x8430, 0x8440, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8440, 0x8430, 0x8440, + 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8450, 0x8450, 0x8450, 0x8460, 0x8470, 0x8480, 0x84A0, 0x84D0, 0x8560, 0x8D30, 0xAD50, + 0xC890, 0xE290, 0xF6F0, 0x06B0, 0x1460, 0x1D40, 0x2450, 0x2990, 0x2C30, 0x2CC0, 0x2A00, 0x2500, 0x1670, 0x1970, 0x1D30, 0x2020, + 0x2360, 0x2450, 0x2590, 0x2600, 0x2640, 0x2840, 0x2A10, 0x2D40, 0x2F90, 0x3230, 0x3500, 0x3800, 0x3B80, 0x3FB0, 0x4370, 0x48A0, + 0x4D50, 0x52A0, 0x56E0, 0x58F0, 0x59B0, 0x5720, 0x52E0, 0x4DD0, 0x49B0, 0x4740, 0x4630, 0x46B0, 0x46E0, 0x4690, 0x46C0, 0x46D0, + 0x4720, 0x4810, 0x4AE0, 0x4E60, 0x5280, 0x5770, 0x5C90, 0x6120, 0x6440, 0x6250, 0x59B0, 0x4910, 0x3390, 0x1BF0, 0x0580, 0xF350, + 0xE710, 0xE020, 0xDEF0, 0xE1A0, 0xE850, 0xF1A0, 0xFB90, 0x06B0, 0x1100, 0x19C0, 0x2190, 0x2880, 0x2FA0, 0x3770, 0x3EB0, 0x4660, + 0x4C40, 0x50D0, 0x54B0, 0x57E0, 0x5D40, 0x6280, 0x67E0, 0x6C80, 0x6FD0, 0x7230, 0x7270, 0x71A0, 0x6FC0, 0x6C80, 0x6920, 0x6410, + 0x5FF0, 0x5C70, 0x58A0, 0x5690, 0x5470, 0x5330, 0x52F0, 0x5340, 0x54B0, 0x5870, 0x5E50, 0x6580, 0x6C20, 0x7300, 0x77C0, 0x7910, + 0x7870, 0x7390, 0x6CB0, 0x6260, 0x54C0, 0x44C0, 0x3190, 0x1C80, 0x0500, 0xEB50, 0xD0A0, 0xB700, 0x9E00, 0x8A40, 0x8550, 0x84E0, + 0x84C0, 0x84A0, 0x8490, 0x8480, 0x8480, 0x8470, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, + 0x8460, 0x8470, 0x8470, 0x8480, 0x8480, 0x8480, 0x84A0, 0x84B0, 0x84C0, 0x84D0, 0x8500, 0x8550, 0x8680, 0x8B90, 0x9990, 0xA650, + 0xB160, 0xBA90, 0xC260, 0xC970, 0xD0D0, 0xD8B0, 0xE030, 0xE780, 0xEBE0, 0xEE70, 0xEF60, 0xEE10, 0xEBF0, 0xE7A0, 0xE0C0, 0xD850, + 0xCB20, 0xBD70, 0xAD70, 0x9CA0, 0x8CD0, 0x8620, 0x84F0, 0x84C0, 0x84A0, 0x8480, 0x8470, 0x8460, 0x8450, 0x8440, 0x8430, 0x8430, + 0x8420, 0x8420, 0x8410, 0x8410, 0x8410, 0x8400, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8420, 0x8420, 0x8420, 0x8430, + 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8440, 0x8440, 0x8450, 0x8460, 0x8470, 0x8480, 0x8480, 0x8490, 0x8490, 0x84A0, 0x84B0, + 0x84C0, 0x84F0, 0x8590, 0x8970, 0x9C30, 0xAEB0, 0xC120, 0xD070, 0xDDD0, 0xEA10, 0xF560, 0x0060, 0x0D90, 0x1D00, 0x2F60, 0x44B0, + 0x5970, 0x6C60, 0x7B80, 0x7F10, 0x7F00, 0x7F60, 0x7EE0, 0x7ED0, 0x7EE0, 0x7EF0, 0x7F80, 0x7F00, 0x7EE0, 0x7F00, 0x7F10, 0x7F30, + 0x7EE0, 0x7EB0, 0x7F00, 0x7EE0, 0x7F30, 0x7ED0, 0x7EB0, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7EC0, 0x7F10, 0x7F00, 0x7F00, 0x7F00, + 0x7EC0, 0x7F30, 0x7F00, 0x7F10, 0x7F20, 0x7F00, 0x7F40, 0x7F10, 0x7F10, 0x7F20, 0x7EF0, 0x7F80, 0x7EE0, 0x7EF0, 0x7F10, 0x7F10, + 0x7F70, 0x7F00, 0x7F10, 0x7F00, 0x7EF0, 0x7F10, 0x7F20, 0x7F00, 0x7F10, 0x7F10, 0x7F10, 0x7F20, 0x7F10, 0x7F10, 0x7F10, 0x7F00, + 0x7F10, 0x7F10, 0x7F10, 0x7F20, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F00, 0x7F40, 0x7F10, 0x7F30, 0x7F20, 0x7F10, 0x7F10, + 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, + 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F30, 0x7F00, + 0x7F20, 0x7F30, 0x7F20, 0x7F40, 0x7EF0, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F10, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F10, + 0x7F10, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F20, 0x7F40, + 0x7F40, 0x7F30, 0x7F20, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F40, 0x7F30, + 0x7F20, 0x7F20, 0x7F40, 0x7F10, 0x7F20, 0x7F20, 0x7F20, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F10, 0x7F30, + 0x7F20, 0x7F30, 0x7F30, 0x7F00, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F00, 0x7F40, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F20, + 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F40, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F50, 0x7F30, 0x7F20, 0x7F40, + 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F20, 0x7F30, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F30, 0x7F10, 0x7F30, + 0x7F30, 0x7F20, 0x7F20, 0x7FB0, 0x7F30, 0x7F00, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7ED0, 0x7EF0, 0x7F20, 0x7F40, 0x7F40, 0x7EB0, + 0x7F00, 0x7F00, 0x7F30, 0x7F30, 0x7EB0, 0x7EC0, 0x7EF0, 0x7F20, 0x7F00, 0x7ED0, 0x7EE0, 0x7F00, 0x7F10, 0x7F30, 0x7E90, 0x7EE0, + 0x7EE0, 0x7EF0, 0x7F20, 0x7E80, 0x7ED0, 0x7F00, 0x7F20, 0x7F10, 0x7EC0, 0x7F10, 0x7F00, 0x7F10, 0x7F00, 0x7EC0, 0x7F00, 0x7F10, + 0x7F20, 0x7F40, 0x7F00, 0x7F50, 0x7F20, 0x7F40, 0x7F30, 0x7F10, 0x7F20, 0x7EF0, 0x7F10, 0x7F30, 0x7F20, 0x7F50, 0x7F00, 0x7F20, + 0x7F00, 0x7F10, 0x7F70, 0x7EE0, 0x7EC0, 0x7EF0, 0x7F00, 0x7F60, 0x7ED0, 0x7EB0, 0x7F00, 0x7F00, 0x7F10, 0x7EB0, 0x7E70, 0x7F10, + 0x7F10, 0x7F20, 0x7EE0, 0x7E90, 0x7F10, 0x7F20, 0x7F00, 0x7F10, 0x7EA0, 0x7F00, 0x7EF0, 0x7F10, 0x7F20, 0x7EE0, 0x7F40, 0x7F10, + 0x7F20, 0x7F10, 0x7F00, 0x7F40, 0x7F00, 0x7EF0, 0x7F10, 0x7EF0, 0x7F60, 0x7EF0, 0x7F20, 0x7EF0, 0x7EF0, 0x7F90, 0x7F20, 0x7F20, + 0x7EF0, 0x7EF0, 0x7F60, 0x7F10, 0x7EF0, 0x7EE0, 0x7EE0, 0x7F50, 0x7F10, 0x7E30, 0x7B00, 0x7790, 0x73F0, 0x7180, 0x6ED0, 0x6CB0, + 0x6A30, 0x6720, 0x65C0, 0x64D0, 0x6540, 0x6640, 0x67B0, 0x69F0, 0x6CA0, 0x6F90, 0x72B0, 0x7570, 0x7920, 0x7BC0, 0x7E60, 0x7EE0, + 0x7EF0, 0x7F10, 0x7F00, 0x7F60, 0x7F40, 0x7F10, 0x7F10, 0x7F10, 0x7F50, 0x7F10, 0x7F20, 0x7EF0, 0x7F10, 0x7F60, 0x7F00, 0x7F10, + 0x7F20, 0x7F20, 0x7F70, 0x7EF0, 0x7EF0, 0x7EE0, 0x7EF0, 0x7F70, 0x7F00, 0x7EE0, 0x7F10, 0x7F10, 0x7F60, 0x7EE0, 0x7E90, 0x7F00, + 0x7EE0, 0x7EF0, 0x7EB0, 0x7EA0, 0x7EF0, 0x7F10, 0x7F20, 0x7F20, 0x7EC0, 0x7F10, 0x7F00, 0x7F10, 0x7F10, 0x7EA0, 0x7F20, 0x7EF0, + 0x7F10, 0x7F30, 0x7F20, 0x7F80, 0x7F20, 0x7F20, 0x7F40, 0x7F10, 0x7F60, 0x7F20, 0x7EF0, 0x7F10, 0x7F00, 0x7F80, 0x7EC0, 0x7F10, + 0x7F10, 0x7EF0, 0x7F10, 0x7F00, 0x7F60, 0x7F00, 0x7F10, 0x7F30, 0x7EF0, 0x7F60, 0x7F00, 0x7F20, 0x7EF0, 0x7F10, 0x7F90, 0x7F20, + 0x7F10, 0x7EF0, 0x7EF0, 0x7F80, 0x7ED0, 0x7DB0, 0x7C00, 0x7A40, 0x78F0, 0x77B0, 0x75E0, 0x74E0, 0x73B0, 0x72E0, 0x7310, 0x7290, + 0x7370, 0x7400, 0x7440, 0x75C0, 0x7630, 0x7760, 0x7890, 0x79E0, 0x7BE0, 0x7C90, 0x7E00, 0x7EB0, 0x7EE0, 0x7EF0, 0x7EA0, 0x7F00, + 0x7F00, 0x7F10, 0x7F20, 0x7F00, 0x7F40, 0x7F10, 0x7F10, 0x7F10, 0x7F10, 0x7F30, 0x7EF0, 0x7F10, 0x7F10, 0x7F10, 0x7F60, 0x7F00, + 0x7F20, 0x7F20, 0x7F10, 0x7F50, 0x7EF0, 0x7EE0, 0x7EF0, 0x7EF0, 0x7F70, 0x7EF0, 0x7EF0, 0x7F10, 0x7F20, 0x7F70, 0x7ED0, 0x7EB0, + 0x7EE0, 0x7EF0, 0x7F30, 0x7EE0, 0x7EA0, 0x7EF0, 0x7F10, 0x7F20, 0x7F20, 0x7E90, 0x7F10, 0x7F00, 0x7F10, 0x7F10, 0x7EA0, 0x7F00, + 0x7EF0, 0x7F20, 0x7F20, 0x7F20, 0x7F30, 0x7F20, 0x7F40, 0x7F10, 0x7F10, 0x7F60, 0x7EF0, 0x7F10, 0x7F30, 0x7600, 0x5D80, 0x4380, + 0x2940, 0x1040, 0xF810, 0xE1B0, 0xCBF0, 0xB770, 0xA0B0, 0x8CC0, 0x85B0, 0x84E0, 0x84B0, 0x8490, 0x8480, 0x8470, 0x8460, 0x8450, + 0x8440, 0x8440, 0x8440, 0x8440, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8410, 0x8430, 0x8430, 0x8430, 0x8460, 0x8430, 0x8430, + 0x8430, 0x8440, 0x8430, 0x8430, 0x8460, 0x8440, 0x8440, 0x8440, 0x8440, 0x8450, 0x8450, 0x8440, 0x8450, 0x8450, 0x8450, 0x8450, + 0x8450, 0x8450, 0x8450, 0x8440, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8440, 0x8450, 0x8440, 0x8440, 0x8440, 0x8430, + 0x8430, 0x8430, 0x8450, 0x8430, 0x8420, 0x8410, 0x8420, 0x8420, 0x8410, 0x8410, 0x8410, 0x8410, 0x8400, 0x8400, 0x8400, 0x8400, + 0x8400, 0x8400, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83E0, 0x83E0, + 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, + 0x83E0, 0x83E0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8400, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, + 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8400, 0x8410, + 0x8400, 0x8400, 0x8410, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, + 0x8410, 0x8420, 0x8420, 0x8420, 0x8420, 0x8430, 0x8430, 0x8430, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, + 0x8440, 0x8430, 0x8450, 0x8450, 0x8450, 0x8460, 0x8460, 0x8460, 0x8460, 0x8470, 0x8470, 0x8470, 0x8460, 0x8440, 0x8460, 0x8460, + 0x8460, 0x8450, 0x8450, 0x8450, 0x8440, 0x8440, 0x8440, 0x8430, 0x8470, 0x8430, 0x8430, 0x8420, 0x8430, 0x8430, 0x8430, 0x8430, + 0x8440, 0x8440, 0x8480, 0x8460, 0x8460, 0x84B0, 0x8490, 0x84A0, 0x84D0, 0x8530, 0x8810, 0x9CB0, 0xB390, 0xC420, 0xCD90, 0xCF10, + 0xC810, 0xB9A0, 0xA4F0, 0x8FB0, 0x8660, 0x8500, 0x84D0, 0x84C0, 0x84B0, 0x84A0, 0x8490, 0x8480, 0x8480, 0x8460, 0x8450, 0x83E0, + 0x8430, 0x8420, 0x8420, 0x8420, 0x8430, 0x8460, 0x8440, 0x8460, 0x8480, 0x84A0, 0x84F0, 0x85B0, 0x8950, 0x9530, 0xA2D0, 0xB180, + 0xC2A0, 0xD230, 0xDF20, 0xE770, 0xEA10, 0xE6A0, 0xDAE0, 0xC4C0, 0xA010, 0x8550, 0x84A0, 0x8470, 0x8460, 0x8450, 0x8450, 0x8440, + 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8460, 0x8470, 0x8490, 0x84D0, 0x8780, 0xB350, 0xDE50, 0x0290, 0x2130, + 0x3B80, 0x5290, 0x67D0, 0x7AA0, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F20, 0x7F40, + 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F10, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x62D0, 0x5B20, 0x57B0, + 0x5910, 0x5DE0, 0x6420, 0x6AC0, 0x7130, 0x7720, 0x7BC0, 0x7EB0, 0x7F30, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F20, + 0x7F40, 0x7F40, 0x7F30, 0x7F20, 0x7F20, 0x7F50, 0x7F10, 0x7EA0, 0x7F20, 0x7EF0, 0x7EF0, 0x7EE0, 0x7E80, 0x7EF0, 0x7F20, 0x7F00, + 0x7F00, 0x7E80, 0x7EB0, 0x7EA0, 0x7F10, 0x7EB0, 0x7EA0, 0x7EE0, 0x7EF0, 0x7F30, 0x7F30, 0x7F00, 0x7F90, 0x7F20, 0x7F40, 0x7F10, + 0x7F10, 0x7F30, 0x7EF0, 0x7EF0, 0x7F00, 0x7F00, 0x7F80, 0x7F00, 0x7EE0, 0x7D60, 0x7C80, 0x7CB0, 0x7D70, 0x7E40, 0x7ED0, 0x7EE0, + 0x7F60, 0x7EF0, 0x7EB0, 0x7F00, 0x7EE0, 0x7F10, 0x7F10, 0x7E70, 0x7ED0, 0x7EB0, 0x7F00, 0x7EE0, 0x7E90, 0x7F10, 0x7F20, 0x7F00, + 0x7ED0, 0x7300, 0x6700, 0x5A10, 0x4D10, 0x42B0, 0x3B40, 0x3840, 0x3980, 0x3E70, 0x4800, 0x5140, 0x59E0, 0x6160, 0x66F0, 0x6B30, + 0x6D30, 0x6E30, 0x6E40, 0x6CB0, 0x6BA0, 0x6940, 0x6790, 0x66E0, 0x67A0, 0x6B10, 0x7050, 0x7730, 0x7E40, 0x7F10, 0x7F00, 0x7EF0, + 0x7F60, 0x7EF0, 0x7EB0, 0x7F00, 0x7F10, 0x7F60, 0x7F00, 0x7EC0, 0x7F10, 0x7F10, 0x7F20, 0x7EE0, 0x7E90, 0x7F10, 0x7EF0, 0x7EF0, + 0x7EB0, 0x7EC0, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7EE0, 0x7F10, 0x7EF0, 0x7EF0, 0x7F40, 0x72E0, 0x5EA0, 0x4960, 0x33D0, 0x2090, + 0x0CC0, 0xFBD0, 0xEDB0, 0xE260, 0xD960, 0xD380, 0xD030, 0xCF90, 0xD060, 0xD340, 0xD5C0, 0xD7C0, 0xD940, 0xDAB0, 0xDC30, 0xDE20, + 0xDF50, 0xE0B0, 0xE160, 0xE2C0, 0xE430, 0xE4B0, 0xE610, 0xE6D0, 0xE790, 0xE780, 0xE670, 0xE550, 0xE460, 0xE460, 0xE500, 0xE530, + 0xE820, 0xEB60, 0xF110, 0xF870, 0x01C0, 0x0BD0, 0x1710, 0x2300, 0x2FC0, 0x3CC0, 0x4A80, 0x5720, 0x6340, 0x6F20, 0x7820, 0x7E70, + 0x7F10, 0x7F50, 0x7EF0, 0x7F20, 0x7EF0, 0x7F10, 0x7F60, 0x7EF0, 0x7F30, 0x7F20, 0x7F00, 0x7F80, 0x7EF0, 0x7EE0, 0x7EE0, 0x7F10, + 0x7F70, 0x7EE0, 0x7ED0, 0x7F10, 0x7F20, 0x7F60, 0x7EE0, 0x7E90, 0x7F00, 0x7F10, 0x7F30, 0x7EB0, 0x7E70, 0x7EF0, 0x7F10, 0x7F20, + 0x7EE0, 0x7F30, 0x7EE0, 0x7EA0, 0x7EF0, 0x7F10, 0x7F40, 0x7ED0, 0x7E90, 0x7F00, 0x7EE0, 0x7EF0, 0x7F20, 0x7F00, 0x7F40, 0x7F20, + 0x7F20, 0x7F40, 0x7F00, 0x7F30, 0x7EE0, 0x7EF0, 0x7F30, 0x7F10, 0x7F40, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F90, 0x7F00, 0x7F00, + 0x7E60, 0x7AB0, 0x7740, 0x7380, 0x6F90, 0x6C70, 0x6960, 0x66F0, 0x64D0, 0x6310, 0x6100, 0x5E50, 0x5A30, 0x56E0, 0x52F0, 0x5090, + 0x4D60, 0x4980, 0x46A0, 0x41F0, 0x3F40, 0x3BE0, 0x3810, 0x34B0, 0x30A0, 0x2CC0, 0x28C0, 0x2500, 0x21E0, 0x1FC0, 0x1E30, 0x1CC0, + 0x1A80, 0x1850, 0x1620, 0x1440, 0x1240, 0x1010, 0x0F20, 0x0E00, 0x0DB0, 0x0D20, 0x0C60, 0x0CF0, 0x0CC0, 0x0BF0, 0x0B10, 0x0AD0, + 0x0B10, 0x0B20, 0x0BC0, 0x0C50, 0x0CA0, 0x0D70, 0x0DF0, 0x0F30, 0x10E0, 0x1360, 0x17B0, 0x1CB0, 0x2130, 0x25F0, 0x2AC0, 0x3100, + 0x3770, 0x3D50, 0x4400, 0x49A0, 0x4F50, 0x53D0, 0x56F0, 0x5AA0, 0x5CC0, 0x5FB0, 0x6260, 0x63C0, 0x65D0, 0x6700, 0x67C0, 0x6850, + 0x68D0, 0x69F0, 0x6A80, 0x6B10, 0x6C90, 0x6E60, 0x7170, 0x7450, 0x77D0, 0x7B20, 0x7D80, 0x7F10, 0x7F20, 0x7F80, 0x7F10, 0x7F10, + 0x7EF0, 0x7EF0, 0x7F80, 0x7F10, 0x7F10, 0x7EF0, 0x7F10, 0x7F70, 0x7F10, 0x7ED0, 0x7EB0, 0x7EE0, 0x7EF0, 0x7F00, 0x7EE0, 0x7EE0, + 0x7ED0, 0x7F30, 0x7F20, 0x7E60, 0x7CD0, 0x7B30, 0x7990, 0x78D0, 0x77B0, 0x77E0, 0x7820, 0x78C0, 0x7A90, 0x7C00, 0x7D20, 0x7E60, + 0x7EE0, 0x7F10, 0x7EC0, 0x7F10, 0x7F20, 0x7F00, 0x7F10, 0x7F10, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F50, 0x7EF0, 0x7F20, + 0x7EF0, 0x7EF0, 0x7F60, 0x7EF0, 0x7F10, 0x7F10, 0x7F20, 0x7F80, 0x7EF0, 0x7EB0, 0x7F10, 0x7F10, 0x7F70, 0x7EE0, 0x7EC0, 0x7EF0, + 0x7F10, 0x7F30, 0x7EE0, 0x7EB0, 0x7F00, 0x7F10, 0x7F10, 0x7EB0, 0x7E70, 0x7EF0, 0x7EF0, 0x7F20, 0x7EE0, 0x7E90, 0x7F10, 0x7F20, + 0x7F10, 0x7F10, 0x7F00, 0x7F20, 0x7EF0, 0x7F10, 0x7F20, 0x7EC0, 0x7F40, 0x7F10, 0x7F20, 0x7F40, 0x7F10, 0x7F70, 0x7F00, 0x7F10, + 0x7F30, 0x7EF0, 0x7F70, 0x7EF0, 0x7F20, 0x7F00, 0x7F00, 0x7F90, 0x7F20, 0x7F10, 0x7EF0, 0x7EF0, 0x7F60, 0x7EF0, 0x7ED0, 0x7EE0, + 0x7EE0, 0x7F50, 0x7F10, 0x7EA0, 0x7EE0, 0x7ED0, 0x7F10, 0x7F00, 0x7EA0, 0x7EB0, 0x7EE0, 0x7EF0, 0x7F10, 0x7EB0, 0x7F00, 0x7F20, + 0x7F10, 0x7F10, 0x7EC0, 0x7F10, 0x7F10, 0x7F00, 0x7F00, 0x7ED0, 0x7F30, 0x7F20, 0x7F40, 0x7F10, 0x7F00, 0x7F40, 0x7F10, 0x7F10, + 0x7F00, 0x7EE0, 0x7F50, 0x7F10, 0x7F20, 0x7EF0, 0x7F10, 0x7F00, 0x7F10, 0x7F10, 0x7F10, 0x7F10, 0x7F10, 0x7F00, 0x7F10, 0x7F10, + 0x7F20, 0x7F00, 0x7F40, 0x7F20, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7EF0, 0x7B50, 0x75B0, 0x6EF0, 0x6880, 0x61E0, 0x5B70, + 0x5540, 0x4FB0, 0x4CD0, 0x4BB0, 0x4D20, 0x5180, 0x56A0, 0x5D60, 0x6350, 0x6870, 0x6B50, 0x6AE0, 0x66C0, 0x5EB0, 0x5270, 0x4490, + 0x3600, 0x27E0, 0x1B00, 0x1030, 0x06C0, 0xFE80, 0xF520, 0xEA50, 0xDF60, 0xD460, 0xC950, 0xBED0, 0xB670, 0xAFE0, 0xAAE0, 0xA7D0, + 0xA520, 0xA3D0, 0xA240, 0xA050, 0x9DB0, 0x99A0, 0x9510, 0x9020, 0x8C80, 0x8A30, 0x8930, 0x88F0, 0x8940, 0x89A0, 0x8AA0, 0x8C10, + 0x8DF0, 0x90F0, 0x9530, 0x99C0, 0x9ED0, 0xA340, 0xA770, 0xABD0, 0xAF50, 0xB370, 0xB790, 0xBBA0, 0xBF60, 0xC2B0, 0xC580, 0xC840, + 0xCAA0, 0xCD40, 0xCFD0, 0xD220, 0xD3D0, 0xD530, 0xD640, 0xD800, 0xD9D0, 0xDBF0, 0xDDD0, 0xDFB0, 0xE040, 0xE090, 0xE0D0, 0xE140, + 0xE180, 0xE200, 0xE2A0, 0xE1D0, 0xE0D0, 0xE060, 0xE070, 0xE080, 0xE090, 0xE0B0, 0xE0C0, 0xE080, 0xDFD0, 0xDFF0, 0xE070, 0xE190, + 0xE230, 0xE2D0, 0xE3C0, 0xE450, 0xE470, 0xE5A0, 0xE640, 0xE660, 0xE540, 0xE300, 0xE090, 0xDE10, 0xDBF0, 0xDA50, 0xD8C0, 0xD600, + 0xD2A0, 0xCDB0, 0xC900, 0xC530, 0xC260, 0xBF40, 0xBBB0, 0xB850, 0xB4D0, 0xB0F0, 0xAE50, 0xAC50, 0xAA20, 0xA780, 0xA410, 0xA0E0, + 0x9DE0, 0x9B80, 0x9A10, 0x98C0, 0x97C0, 0x95C0, 0x9340, 0x90A0, 0x8E30, 0x8C50, 0x8B00, 0x89F0, 0x8900, 0x8850, 0x87C0, 0x8730, + 0x86D0, 0x8690, 0x8660, 0x8620, 0x8620, 0x85C0, 0x8590, 0x8570, 0x8560, 0x8550, 0x8540, 0x8530, 0x8520, 0x8520, 0x8510, 0x8510, + 0x8510, 0x8500, 0x8500, 0x84F0, 0x84F0, 0x84F0, 0x84E0, 0x84E0, 0x84E0, 0x84E0, 0x84D0, 0x84D0, 0x84D0, 0x84D0, 0x84C0, 0x84D0, + 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84D0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84D0, 0x84C0, 0x84B0, 0x84C0, + 0x84C0, 0x84C0, 0x84B0, 0x84C0, 0x84C0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, + 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84C0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, + 0x84C0, 0x84E0, 0x84B0, 0x84B0, 0x84C0, 0x84C0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84C0, 0x84C0, 0x84B0, 0x84C0, + 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84D0, 0x84D0, 0x84D0, 0x84D0, 0x84E0, 0x84E0, 0x84D0, 0x84F0, 0x84F0, 0x8500, + 0x8500, 0x8510, 0x8530, 0x8540, 0x8560, 0x8590, 0x85D0, 0x8600, 0x8660, 0x86B0, 0x8740, 0x87D0, 0x8860, 0x88E0, 0x8940, 0x89C0, + 0x8A50, 0x8B60, 0x8C10, 0x8C90, 0x8D10, 0x8D60, 0x8E00, 0x8E30, 0x8E90, 0x8F30, 0x8FC0, 0x8FE0, 0x9020, 0x9090, 0x9130, 0x9200, + 0x92F0, 0x93F0, 0x9480, 0x9520, 0x95C0, 0x96F0, 0x9920, 0x9BB0, 0x9E30, 0xA070, 0xA320, 0xA640, 0xAA80, 0xAF70, 0xB550, 0xBC70, + 0xC400, 0xCBD0, 0xD3F0, 0xDBF0, 0xE460, 0xEC60, 0xF3D0, 0xFCD0, 0x0360, 0x0930, 0x0E50, 0x11E0, 0x1520, 0x16D0, 0x1870, 0x18F0, + 0x1890, 0x1770, 0x14A0, 0x10A0, 0x0BD0, 0x05B0, 0xFF30, 0xF6C0, 0xEC90, 0xE1C0, 0xD680, 0xCA50, 0xBDB0, 0xB070, 0xA360, 0x95F0, + 0x8B20, 0x8670, 0x8520, 0x84F0, 0x84D0, 0x84C0, 0x84A0, 0x84A0, 0x8490, 0x8480, 0x8480, 0x8470, 0x8460, 0x8440, 0x8450, 0x8440, + 0x8430, 0x8420, 0x8400, 0x83F0, 0x83F0, 0x83E0, 0x83E0, 0x83D0, 0x83D0, 0x83D0, 0x83C0, 0x83C0, 0x83C0, 0x83B0, 0x83B0, 0x83B0, + 0x83B0, 0x83A0, 0x83A0, 0x83B0, 0x83B0, 0x83B0, 0x83C0, 0x83C0, 0x83D0, 0x83E0, 0x83F0, 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8400, + 0x8400, 0x8400, 0x8400, 0x8410, 0x8410, 0x8410, 0x8410, 0x8420, 0x8420, 0x8420, 0x8430, 0x8430, 0x8430, 0x8440, 0x8450, 0x8460, + 0x8470, 0x8480, 0x8490, 0x8490, 0x84A0, 0x84B0, 0x84A0, 0x8490, 0x8490, 0x8490, 0x8470, 0x8470, 0x8460, 0x8450, 0x8450, 0x8460, + 0x8430, 0x8430, 0x8460, 0x8420, 0x8430, 0x8410, 0x8410, 0x8420, 0x8420, 0x8410, 0x8420, 0x8420, 0x8420, 0x8450, 0x8430, 0x8420, + 0x8420, 0x8420, 0x8420, 0x8430, 0x8430, 0x8430, 0x8440, 0x8450, 0x8450, 0x8470, 0x8460, 0x8470, 0x8480, 0x8480, 0x8490, 0x84B0, + 0x84D0, 0x8500, 0x8570, 0x86C0, 0x89E0, 0x8EE0, 0x93C0, 0x97E0, 0x9B80, 0x9EF0, 0xA0F0, 0xA310, 0xA510, 0xA780, 0xAAD0, 0xB070, + 0xB820, 0xC330, 0xD0C0, 0xE1D0, 0xF3A0, 0x07F0, 0x19F0, 0x2AC0, 0x3BA0, 0x4BF0, 0x5C70, 0x6C30, 0x79E0, 0x7EF0, 0x7F00, 0x7F60, + 0x7EF0, 0x7EB0, 0x7F00, 0x7F00, 0x7F50, 0x7ED0, 0x7EA0, 0x7F10, 0x7F10, 0x7F30, 0x7EE0, 0x7E90, 0x7F10, 0x7F20, 0x7F00, 0x7F10, + 0x7EA0, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7EC0, 0x7F40, 0x7F10, 0x7F20, 0x7F10, 0x7F00, 0x7F40, 0x7F00, 0x7F10, 0x7F10, 0x7F00, + 0x7F60, 0x7EF0, 0x7F20, 0x7EF0, 0x7EF0, 0x7F90, 0x7F00, 0x7F20, 0x7F10, 0x7EF0, 0x7F70, 0x7F10, 0x7F10, 0x7EF0, 0x7EE0, 0x7F70, + 0x7F10, 0x7EB0, 0x7EE0, 0x7EF0, 0x72A0, 0x5FE0, 0x4B50, 0x3610, 0x1FE0, 0x0900, 0xF3D0, 0xE030, 0xD020, 0xC2C0, 0xB930, 0xB2F0, + 0xAD90, 0xA750, 0xA110, 0x99C0, 0x92A0, 0x8BD0, 0x87D0, 0x8630, 0x8580, 0x8510, 0x84F0, 0x8510, 0x84C0, 0x84B0, 0x84A0, 0x84A0, + 0x8490, 0x8480, 0x8480, 0x8480, 0x8480, 0x8470, 0x8490, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8460, + 0x8460, 0x8460, 0x8460, 0x8460, 0x8470, 0x8460, 0x8460, 0x8460, 0x8460, 0x8480, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8450, + 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8480, 0x8480, 0x8480, 0x8490, 0x84A0, 0x84A0, 0x8500, 0x84D0, + 0x84E0, 0x8500, 0x8530, 0x85B0, 0x86D0, 0x8A30, 0x9240, 0x9B80, 0xA4D0, 0xADB0, 0xB690, 0xBF90, 0xC8E0, 0xD2F0, 0xDE10, 0xE8D0, + 0xF3D0, 0xFF30, 0x0B00, 0x1640, 0x20F0, 0x2C30, 0x3660, 0x4050, 0x48D0, 0x4F50, 0x56F0, 0x5BC0, 0x5FA0, 0x62B0, 0x64A0, 0x65C0, + 0x6690, 0x6750, 0x6760, 0x6720, 0x66E0, 0x6650, 0x6620, 0x6690, 0x67D0, 0x6990, 0x6C80, 0x70E0, 0x75B0, 0x7B10, 0x7EB0, 0x7F30, + 0x7F20, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, + 0x7F30, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F10, 0x7D20, + 0x6AF0, 0x5A30, 0x49D0, 0x39F0, 0x2B30, 0x1D30, 0x0F40, 0x0270, 0xF660, 0xEBA0, 0xE220, 0xDB70, 0xD6D0, 0xD400, 0xD280, 0xD130, + 0xCF80, 0xCD00, 0xCA20, 0xC6C0, 0xC320, 0xBFD0, 0xBDA0, 0xBAF0, 0xB8A0, 0xB6A0, 0xB490, 0xB260, 0xB090, 0xAEB0, 0xACD0, 0xAB20, + 0xA8A0, 0xA5B0, 0xA110, 0x9AF0, 0x9470, 0x8E50, 0x8A00, 0x8790, 0x86B0, 0x8650, 0x8660, 0x8690, 0x8710, 0x87C0, 0x88B0, 0x89E0, + 0x8BB0, 0x8D90, 0x9070, 0x93C0, 0x9890, 0x9E40, 0xA560, 0xADD0, 0xB7A0, 0xC3A0, 0xCF90, 0xDCA0, 0xE9F0, 0xF7D0, 0x0600, 0x14A0, + 0x22C0, 0x3180, 0x4130, 0x4FC0, 0x5D90, 0x6A10, 0x7560, 0x7DF0, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F20, + 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F20, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F10, 0x7F30, + 0x7F30, 0x7F20, 0x7F30, 0x7EF0, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F00, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F10, 0x7F20, + 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F10, 0x7EB0, 0x7F20, + 0x7F40, 0x7F30, 0x7F10, 0x7EC0, 0x7F10, 0x7EF0, 0x7EB0, 0x7EE0, 0x7E80, 0x7ED0, 0x7E70, 0x7EF0, 0x7EF0, 0x7F00, 0x7F20, 0x7F00, + 0x7F10, 0x7F30, 0x7EE0, 0x7F50, 0x7F00, 0x7F20, 0x7EF0, 0x7EF0, 0x7F60, 0x7F20, 0x7F10, 0x7F00, 0x7F00, 0x7F70, 0x7F10, 0x7EF0, + 0x7EE0, 0x7EE0, 0x7F50, 0x7F10, 0x7EA0, 0x7EF0, 0x7F00, 0x7F60, 0x7F10, 0x7E90, 0x7EB0, 0x7EC0, 0x7EF0, 0x7EF0, 0x7E70, 0x7ED0, + 0x7ED0, 0x7F10, 0x7F00, 0x7EC0, 0x7F10, 0x7F10, 0x7F00, 0x7F10, 0x7E90, 0x7F00, 0x7F00, 0x7EF0, 0x7F10, 0x7F00, 0x7F40, 0x7F10, + 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7EF0, 0x7F20, 0x7EF0, 0x7F10, 0x7F40, 0x7EF0, 0x7F10, 0x7F20, 0x7F00, 0x7F50, 0x7EF0, 0x7EF0, + 0x7EE0, 0x7EF0, 0x7F60, 0x7EE0, 0x7EF0, 0x7F10, 0x7F20, 0x7F60, 0x7ED0, 0x7EB0, 0x7F00, 0x7F10, 0x7F30, 0x7EB0, 0x7EA0, 0x7EF0, + 0x7B50, 0x7430, 0x6DC0, 0x6710, 0x6260, 0x5F60, 0x5CD0, 0x5B50, 0x5760, 0x5140, 0x4800, 0x3C50, 0x2FA0, 0x2150, 0x1510, 0x09D0, + 0xFF80, 0xF750, 0xEFB0, 0xE830, 0xDFE0, 0xD550, 0xC7F0, 0xB990, 0xA850, 0x96E0, 0x89C0, 0x84C0, 0x84B0, 0x84A0, 0x8490, 0x8490, + 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8470, 0x8490, 0x84A0, 0x84B0, 0x84C0, 0x84E0, 0x8520, 0x85B0, 0x87B0, 0x8E00, + 0x97B0, 0xA1A0, 0xA970, 0xB020, 0xB5B0, 0xBA70, 0xBD10, 0xBE20, 0xBCB0, 0xBA80, 0xB6B0, 0xB320, 0xB060, 0xAD40, 0xAA10, 0xA7E0, + 0xA660, 0xA5B0, 0xA5F0, 0xA7A0, 0xAA10, 0xAC70, 0xAF60, 0xB1A0, 0xB510, 0xB940, 0xBE10, 0xC340, 0xC800, 0xCC90, 0xD0C0, 0xD2D0, + 0xD550, 0xD680, 0xD6B0, 0xD5C0, 0xD400, 0xD1D0, 0xCEE0, 0xCCF0, 0xCB80, 0xCA20, 0xC910, 0xC730, 0xC4A0, 0xC120, 0xBD30, 0xBA20, + 0xB730, 0xB3D0, 0xB170, 0xAE00, 0x9E70, 0x9B90, 0x9900, 0x9670, 0x9380, 0x9150, 0x8F80, 0x8EB0, 0x8F00, 0x9060, 0x9350, 0x9720, + 0x9BB0, 0xA180, 0xA990, 0xB320, 0xBE60, 0xCB70, 0xD7F0, 0xE420, 0xF210, 0xFF90, 0x0D90, 0x1B00, 0x2740, 0x33F0, 0x40B0, 0x4D00, + 0x5850, 0x62B0, 0x6D60, 0x7660, 0x7D90, 0x7F20, 0x7F20, 0x7F10, 0x7F00, 0x7F20, 0x7F40, 0x7F10, 0x7F10, 0x7EF0, 0x7F60, 0x7EF0, + 0x7F20, 0x7EF0, 0x7EF0, 0x7F70, 0x7F10, 0x7F20, 0x7F10, 0x7F10, 0x7F70, 0x7ED0, 0x7F10, 0x7F00, 0x7EE0, 0x7F80, 0x7EF0, 0x7EE0, + 0x7F00, 0x7F10, 0x7F70, 0x7F00, 0x7ED0, 0x7EF0, 0x7F00, 0x7F20, 0x7ED0, 0x7EB0, 0x7F20, 0x7EF0, 0x7F30, 0x7F00, 0x7EA0, 0x7F10, + 0x7F10, 0x7F10, 0x7F00, 0x7EC0, 0x7F00, 0x7EF0, 0x7EF0, 0x7F10, 0x7F00, 0x7F40, 0x7F10, 0x7F10, 0x7F20, 0x7F00, 0x7F30, 0x7F00, + 0x7F00, 0x7EF0, 0x7F10, 0x7F80, 0x7F20, 0x7F10, 0x7F20, 0x7F00, 0x7F90, 0x7F10, 0x7F00, 0x7EE0, 0x7EF0, 0x7F70, 0x7F20, 0x7EF0, + 0x7EF0, 0x7F00, 0x7F60, 0x7F10, 0x7EB0, 0x7EB0, 0x7EC0, 0x7EF0, 0x7F00, 0x7EC0, 0x7EC0, 0x7ED0, 0x7E80, 0x7D60, 0x7B80, 0x7A10, + 0x7930, 0x7780, 0x7690, 0x7500, 0x7440, 0x73D0, 0x7350, 0x73B0, 0x7400, 0x7440, 0x74B0, 0x74A0, 0x75A0, 0x7680, 0x77F0, 0x79E0, + 0x7AD0, 0x7BF0, 0x7D10, 0x7DE0, 0x7E90, 0x7F00, 0x7F00, 0x7F10, 0x7F50, 0x7EF0, 0x7F00, 0x7EF0, 0x7F00, 0x7F40, 0x7EF0, 0x7EF0, + 0x7F10, 0x7F20, 0x7F70, 0x7ED0, 0x7EB0, 0x7F00, 0x7F10, 0x7F30, 0x7EE0, 0x7EA0, 0x7EF0, 0x7F10, 0x7F20, 0x7F00, 0x7EB0, 0x7F00, + 0x7F10, 0x7F10, 0x7F10, 0x7EA0, 0x7F00, 0x7EF0, 0x7F20, 0x7EF0, 0x7E00, 0x7BB0, 0x79B0, 0x7780, 0x7610, 0x7460, 0x71E0, 0x6EF0, + 0x6C30, 0x6A40, 0x6800, 0x65D0, 0x6370, 0x6100, 0x5FA0, 0x5E10, 0x5C30, 0x5A80, 0x5790, 0x5570, 0x5330, 0x4FE0, 0x4D50, 0x49B0, + 0x46C0, 0x4400, 0x40F0, 0x3E60, 0x3C00, 0x3AD0, 0x3B50, 0x3CF0, 0x4040, 0x42C0, 0x45B0, 0x4800, 0x4A10, 0x4DB0, 0x5180, 0x5640, + 0x5AD0, 0x5E90, 0x62B0, 0x66A0, 0x6B30, 0x7030, 0x7460, 0x7950, 0x7D10, 0x7F00, 0x7F20, 0x7F10, 0x7F10, 0x7F00, 0x7F10, 0x7F10, + 0x7F00, 0x7EF0, 0x7EF0, 0x7F70, 0x7F20, 0x7F40, 0x7F10, 0x7F20, 0x7F60, 0x7F10, 0x7F10, 0x7F00, 0x7EE0, 0x7F70, 0x7F00, 0x7F00, + 0x7EF0, 0x7F10, 0x7F70, 0x7F00, 0x7ED0, 0x7EF0, 0x7F00, 0x7F30, 0x7EF0, 0x7EB0, 0x7EE0, 0x7EF0, 0x7F30, 0x7F00, 0x7EC0, 0x7F10, + 0x7BF0, 0x69E0, 0x5A10, 0x48B0, 0x38A0, 0x29A0, 0x1BF0, 0x1100, 0x06A0, 0xFE40, 0xF690, 0xF0A0, 0xEAD0, 0xE770, 0xE550, 0xE3F0, + 0xE3F0, 0xE570, 0xE8C0, 0xECF0, 0xF220, 0xF780, 0xFC70, 0x00C0, 0x0410, 0x06C0, 0x0930, 0x0A30, 0x0AB0, 0x09F0, 0x0830, 0x04F0, + 0x00D0, 0xFAE0, 0xF3B0, 0xECE0, 0xE610, 0xE000, 0xD930, 0xD1D0, 0xC790, 0xB900, 0xA320, 0x8940, 0x84E0, 0x8490, 0x8470, 0x8450, + 0x8440, 0x8430, 0x8420, 0x8420, 0x8410, 0x8410, 0x8410, 0x8410, 0x8400, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8420, + 0x8420, 0x8430, 0x8440, 0x8460, 0x8470, 0x8490, 0x84C0, 0x84E0, 0x8500, 0x8520, 0x8550, 0x85E0, 0x8790, 0x8DE0, 0x9840, 0x9F50, + 0x9F10, 0x9950, 0x8F70, 0x8830, 0x8590, 0x8510, 0x84F0, 0x84D0, 0x84C0, 0x84C0, 0x84C0, 0x84B0, 0x84C0, 0x84B0, 0x84A0, 0x84A0, + 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84B0, 0x84B0, 0x84B0, 0x84A0, 0x84B0, 0x84B0, 0x84A0, 0x84C0, 0x84C0, 0x84D0, + 0x84F0, 0x8510, 0x8540, 0x85D0, 0x86F0, 0x8950, 0x8DC0, 0x9250, 0x96B0, 0x98B0, 0x99A0, 0x9900, 0x9720, 0x9540, 0x93B0, 0x92F0, + 0x9250, 0x9240, 0x9270, 0x9230, 0x9200, 0x9160, 0x90D0, 0x9090, 0x9000, 0x8FE0, 0x8FC0, 0x9060, 0x9080, 0x9100, 0x9060, 0x8F40, + 0x8DE0, 0x8BA0, 0x89A0, 0x8840, 0x8760, 0x86D0, 0x8650, 0x85F0, 0x85A0, 0x8590, 0x8530, 0x8510, 0x84F0, 0x84F0, 0x84E0, 0x84D0, + 0x84C0, 0x84C0, 0x84B0, 0x84B0, 0x84A0, 0x84A0, 0x8490, 0x8490, 0x8480, 0x8480, 0x8470, 0x8470, 0x8470, 0x8460, 0x8460, 0x8460, + 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8440, 0x8470, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8450, + 0x8450, 0x8450, 0x8460, 0x8460, 0x8460, 0x8460, 0x8470, 0x8470, 0x8470, 0x84A0, 0x8480, 0x8470, 0x8480, 0x8480, 0x8480, 0x8490, + 0x8490, 0x84B0, 0x8490, 0x84A0, 0x8470, 0x84B0, 0x84C0, 0x84F0, 0x84E0, 0x8500, 0x8520, 0x8590, 0x85E0, 0x86F0, 0x88D0, 0x8CB0, + 0x91F0, 0x9760, 0x9D40, 0xA230, 0xA780, 0xACB0, 0xB180, 0xB540, 0xB8B0, 0xBB60, 0xBE80, 0xC1D0, 0xC5E0, 0xCA40, 0xCE50, 0xD300, + 0xD6E0, 0xDB10, 0xDF00, 0xE260, 0xE680, 0xE9F0, 0xED50, 0xF160, 0xF440, 0xF7D0, 0xFA30, 0xFCC0, 0xFD90, 0xFDF0, 0xFF10, 0x0020, + 0x0060, 0x00F0, 0x0020, 0xFEF0, 0xFCF0, 0xFA90, 0xF8A0, 0xF690, 0xF530, 0xF3E0, 0xF240, 0xF1E0, 0xEFF0, 0xEDE0, 0xEAF0, 0xE890, + 0xE770, 0xE560, 0xE490, 0xE410, 0xE400, 0xE420, 0xE350, 0xE360, 0xE3E0, 0xE3A0, 0xE520, 0xE700, 0xE960, 0xECC0, 0xF010, 0xF4C0, + 0xF900, 0xFEB0, 0x0430, 0x0A20, 0x1050, 0x1710, 0x1DF0, 0x25C0, 0x2C10, 0x33F0, 0x3BC0, 0x42F0, 0x4A10, 0x50E0, 0x5800, 0x5EF0, + 0x65E0, 0x6BA0, 0x7190, 0x76F0, 0x7BB0, 0x7EE0, 0x7EF0, 0x7EB0, 0x7EF0, 0x7F10, 0x7F70, 0x7EE0, 0x7EA0, 0x7EF0, 0x7F10, 0x7F30, + 0x7EE0, 0x7EC0, 0x7F20, 0x7F20, 0x7F40, 0x7ED0, 0x7EA0, 0x7F20, 0x7EF0, 0x7F10, 0x7F20, 0x7EC0, 0x7F10, 0x7F20, 0x7F20, 0x7F10, + 0x7F00, 0x7F30, 0x7EE0, 0x7EF0, 0x7F20, 0x7F00, 0x7F40, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F80, 0x7F00, 0x7F40, 0x7F10, 0x7EF0, + 0x7F60, 0x7EF0, 0x7F10, 0x7F10, 0x7F00, 0x7F70, 0x7F10, 0x7F00, 0x7F00, 0x7EF0, 0x7F30, 0x7F00, 0x7EC0, 0x7ED0, 0x7EE0, 0x7F50, + 0x7F10, 0x7EB0, 0x7EE0, 0x7EE0, 0x7F10, 0x7F10, 0x7E70, 0x7E80, 0x7EB0, 0x7F00, 0x7EF0, 0x7E90, 0x7F00, 0x7F20, 0x7F10, 0x7F10, + 0x7F00, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7EE0, 0x7F40, 0x7F30, 0x7F20, 0x7F10, 0x7F30, 0x7ED0, 0x7EB0, 0x7F00, 0x7F00, 0x7F10, + 0x7EE0, 0x7EA0, 0x7EF0, 0x7F10, 0x7F20, 0x7F10, 0x7EB0, 0x7F20, 0x7F10, 0x7F20, 0x7F40, 0x7F00, 0x7F30, 0x7EE0, 0x7F10, 0x7F30, + 0x7F10, 0x7F40, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F90, 0x7F00, 0x7F00, 0x7EF0, 0x7F10, 0x7F60, 0x7EF0, 0x7EF0, 0x7F00, 0x7F00, + 0x7F70, 0x7F10, 0x7EB0, 0x7F00, 0x7B90, 0x7530, 0x6F70, 0x68A0, 0x6210, 0x5A80, 0x5070, 0x4580, 0x3720, 0x28C0, 0x1940, 0x0770, + 0xF650, 0xE330, 0xD090, 0xBD80, 0xAB20, 0x9960, 0x8C70, 0x86D0, 0x8560, 0x8500, 0x84E0, 0x84D0, 0x84C0, 0x84C0, 0x84B0, 0x84B0, + 0x84B0, 0x84A0, 0x84A0, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8470, 0x8480, 0x8480, + 0x8480, 0x8470, 0x8470, 0x8480, 0x8470, 0x8470, 0x8480, 0x8470, 0x8470, 0x8470, 0x8490, 0x8480, 0x8480, 0x8480, 0x84B0, 0x8480, + 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8490, 0x8490, 0x8490, 0x8490, + 0x8490, 0x8490, 0x8490, 0x84A0, 0x84B0, 0x84B0, 0x84B0, 0x84C0, 0x84D0, 0x84E0, 0x8500, 0x8510, 0x8560, 0x85F0, 0x8770, 0x8B00, + 0x9250, 0x9AA0, 0xA1D0, 0xA910, 0xB020, 0xB760, 0xBED0, 0xC430, 0xC9A0, 0xCCF0, 0xD050, 0xD370, 0xD610, 0xD900, 0xDB50, 0xDD60, + 0xDF60, 0xE110, 0xE3D0, 0xE620, 0xE850, 0xEAF0, 0xED80, 0xF140, 0xF550, 0xF9D0, 0xFF40, 0x0490, 0x0A50, 0x10A0, 0x1570, 0x1AF0, + 0x1FD0, 0x25A0, 0x2B60, 0x3180, 0x37A0, 0x3D20, 0x42D0, 0x47D0, 0x4C10, 0x50E0, 0x5450, 0x57B0, 0x59A0, 0x5AF0, 0x5C50, 0x5D30, + 0x5E60, 0x5F80, 0x5F90, 0x6000, 0x5F40, 0x5EB0, 0x5E20, 0x5D60, 0x5D40, 0x5CF0, 0x5C30, 0x5C00, 0x5AF0, 0x5AE0, 0x5AC0, 0x59D0, + 0x5990, 0x5830, 0x56E0, 0x54C0, 0x5250, 0x5060, 0x4DC0, 0x4B90, 0x49D0, 0x47E0, 0x4790, 0x4780, 0x4910, 0x4B00, 0x4CF0, 0x4F30, + 0x5040, 0x5150, 0x5250, 0x53E0, 0x5700, 0x59C0, 0x5CD0, 0x5F20, 0x60D0, 0x6350, 0x6670, 0x6970, 0x6CE0, 0x7030, 0x7310, 0x74E0, + 0x76B0, 0x77E0, 0x7900, 0x7A00, 0x79D0, 0x7930, 0x77E0, 0x7590, 0x7350, 0x7070, 0x6DD0, 0x6A80, 0x6660, 0x62C0, 0x5E50, 0x59D0, + 0x55A0, 0x5020, 0x4B10, 0x45E0, 0x4000, 0x3A80, 0x3480, 0x2F00, 0x2A40, 0x2530, 0x20D0, 0x1BA0, 0x1680, 0x1190, 0x0C70, 0x08E0, + 0x0490, 0xFFF0, 0xFC30, 0xF870, 0xF4F0, 0xF200, 0xF040, 0xEEE0, 0xED80, 0xEE30, 0xEEE0, 0xEE40, 0xEEF0, 0xEF50, 0xF0A0, 0xF1F0, + 0xF3A0, 0xF590, 0xF790, 0xF9C0, 0xFC10, 0xFED0, 0x00E0, 0x02D0, 0x0450, 0x0610, 0x07A0, 0x0910, 0x0AF0, 0x0C00, 0x0CE0, 0x0DB0, + 0x0E80, 0x1030, 0x1260, 0x1510, 0x1750, 0x1950, 0x1A50, 0x1AF0, 0x1C20, 0x1DA0, 0x1F10, 0x20F0, 0x2300, 0x2560, 0x27F0, 0x2980, + 0x2B20, 0x2CD0, 0x2E10, 0x2EB0, 0x2EB0, 0x2E90, 0x2E30, 0x2DE0, 0x2DE0, 0x2E50, 0x2E70, 0x2E30, 0x2DD0, 0x2CB0, 0x2D00, 0x2C60, + 0x2B10, 0x29B0, 0x2800, 0x2620, 0x23F0, 0x2230, 0x21B0, 0x21E0, 0x2150, 0x21B0, 0x2250, 0x2350, 0x2450, 0x2560, 0x2680, 0x27D0, + 0x2910, 0x2A70, 0x2C00, 0x2E50, 0x3050, 0x31A0, 0x3310, 0x3410, 0x33B0, 0x3340, 0x3270, 0x3160, 0x3010, 0x2E70, 0x2C40, 0x29F0, + 0x2710, 0x2400, 0x20E0, 0x1DD0, 0x19E0, 0x1650, 0x1350, 0x1070, 0x0E70, 0x0CC0, 0x0C10, 0x0BB0, 0x0B00, 0x0A90, 0x0A70, 0x09A0, + 0x0900, 0x0870, 0x07A0, 0x06A0, 0x0500, 0x0350, 0x0040, 0xFD40, 0xFAD0, 0xF870, 0xF680, 0xF470, 0xF230, 0xEFD0, 0xECD0, 0xE990, + 0xE610, 0xE230, 0xDE90, 0xDA90, 0xD630, 0xD1D0, 0xCD00, 0xC880, 0xC3E0, 0xBF00, 0xBAE0, 0xB5E0, 0xB180, 0xAD70, 0xA960, 0xA5A0, + 0xA1B0, 0x9E60, 0x9B40, 0x9990, 0x9880, 0x98C0, 0x99D0, 0x9A80, 0x9B90, 0x9BF0, 0x9CB0, 0x9D80, 0x9EA0, 0xA090, 0xA2E0, 0xA530, + 0xA800, 0xAB10, 0xAD90, 0xB060, 0xB360, 0xB580, 0xB860, 0xBAA0, 0xBCA0, 0xBED0, 0xC180, 0xC400, 0xC6B0, 0xC790, 0xC7B0, 0xC7A0, + 0xC6F0, 0xC650, 0xC5F0, 0xC580, 0xC4E0, 0xC460, 0xC380, 0xC250, 0xC110, 0xBFB0, 0xBEE0, 0xBD80, 0xBC60, 0xBB30, 0xB950, 0xB7D0, + 0xB5C0, 0xB400, 0xB1F0, 0xAEF0, 0xAC60, 0xA970, 0xA6B0, 0xA350, 0x9FB0, 0x9BA0, 0x96A0, 0x9170, 0x8CB0, 0x8940, 0x8740, 0x8610, + 0x8580, 0x8540, 0x8510, 0x84F0, 0x84E0, 0x84D0, 0x84C0, 0x84C0, 0x84B0, 0x84B0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x8490, 0x8490, + 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8480, 0x8490, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, + 0x8480, 0x8470, 0x8480, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, + 0x8460, 0x8460, 0x8460, 0x8460, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8460, 0x8460, 0x8460, + 0x8460, 0x8480, 0x8470, 0x84A0, 0x8480, 0x8490, 0x8490, 0x84A0, 0x8490, 0x84D0, 0x84F0, 0x8530, 0x85C0, 0x88C0, 0x90F0, 0x9CB0, + 0xA680, 0xB010, 0xB7D0, 0xBF50, 0xC530, 0xCA50, 0xCED0, 0xD200, 0xD530, 0xD7D0, 0xDA20, 0xDC90, 0xDE00, 0xDFE0, 0xE1A0, 0xE2E0, + 0xE510, 0xE6A0, 0xE7E0, 0xEA80, 0xEC30, 0xEEE0, 0xF1E0, 0xF3B0, 0xF660, 0xF840, 0xFA70, 0xFC30, 0xFE20, 0x00B0, 0x0310, 0x0690, + 0x0920, 0x0B50, 0x0D10, 0x0DA0, 0x0DC0, 0x0E00, 0x0D50, 0x0CC0, 0x0B10, 0x08F0, 0x0670, 0x0370, 0x0140, 0xFF50, 0xFDA0, 0xFCE0, + 0xFBD0, 0xFBB0, 0xFAA0, 0xF9D0, 0xF850, 0xF7B0, 0xF760, 0xF690, 0xF5E0, 0xF580, 0xF550, 0xF5C0, 0xF650, 0xF720, 0xF900, 0xFB30, + 0xFDC0, 0x00E0, 0x04B0, 0x08B0, 0x0CF0, 0x11C0, 0x1650, 0x1AB0, 0x1FA0, 0x24D0, 0x2A80, 0x2F60, 0x3410, 0x3A00, 0x3F30, 0x44A0, + 0x4A50, 0x4ED0, 0x5470, 0x5900, 0x5D50, 0x61E0, 0x65E0, 0x6A60, 0x6E10, 0x71B0, 0x7530, 0x7810, 0x7AB0, 0x7C70, 0x7E40, 0x7ED0, + 0x7F20, 0x7F20, 0x7F00, 0x7F90, 0x7F20, 0x7F40, 0x7F10, 0x7EF0, 0x7F60, 0x7EF0, 0x7EF0, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7F60, + 0x7EF0, 0x7F10, 0x7F00, 0x7EF0, 0x7F70, 0x7F00, 0x7EC0, 0x7ED0, 0x7EE0, 0x7F30, 0x7F20, 0x7EB0, 0x7EE0, 0x7EE0, 0x7F10, 0x7F10, + 0x7EA0, 0x7EE0, 0x7EF0, 0x7F10, 0x7EF0, 0x7E90, 0x7F00, 0x7F20, 0x7F20, 0x7F10, 0x7F00, 0x7F20, 0x7F20, 0x7F10, 0x7F00, 0x7EC0, + 0x7F40, 0x7F20, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F40, 0x7EF0, 0x7F10, 0x7F00, 0x7F40, 0x7EF0, 0x7F10, 0x7F20, 0x7F20, 0x7F50, + 0x7F00, 0x7F20, 0x7ED0, 0x7F10, 0x7F60, 0x7EE0, 0x7EC0, 0x7F10, 0x7EF0, 0x7F70, 0x7EF0, 0x7EB0, 0x7EC0, 0x7E10, 0x7CB0, 0x7C20, + 0x7B40, 0x7B50, 0x7AF0, 0x7AA0, 0x7AD0, 0x7A00, 0x79C0, 0x79E0, 0x7910, 0x76B0, 0x75B0, 0x74E0, 0x7400, 0x7280, 0x7220, 0x70C0, + 0x70D0, 0x70B0, 0x7070, 0x7110, 0x7100, 0x7290, 0x73B0, 0x7520, 0x77C0, 0x7A40, 0x7D00, 0x7EA0, 0x7F10, 0x7F10, 0x7F10, 0x7F60, + 0x7F10, 0x7F10, 0x7F00, 0x7EE0, 0x7F50, 0x7EF0, 0x7F20, 0x7EF0, 0x7F10, 0x7F70, 0x7F00, 0x7E40, 0x79D0, 0x7530, 0x6FE0, 0x6A10, + 0x6330, 0x5C00, 0x5310, 0x48D0, 0x3DD0, 0x31E0, 0x25C0, 0x18F0, 0x0A20, 0xFBD0, 0xED10, 0xE000, 0xD360, 0xC7B0, 0xBCC0, 0xB2B0, + 0xA8A0, 0x9F30, 0x9660, 0x8E90, 0x8980, 0x86D0, 0x85B0, 0x8530, 0x8500, 0x84F0, 0x84E0, 0x84D0, 0x84D0, 0x84D0, 0x84C0, 0x84C0, + 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84B0, 0x84B0, 0x84B0, 0x84C0, 0x84B0, 0x84C0, 0x84C0, + 0x84C0, 0x84C0, 0x84D0, 0x84D0, 0x84D0, 0x84D0, 0x84E0, 0x84F0, 0x84F0, 0x84F0, 0x84F0, 0x8500, 0x8500, 0x8500, 0x8530, 0x8510, + 0x8510, 0x8520, 0x84F0, 0x8530, 0x8520, 0x8520, 0x84C0, 0x8500, 0x84F0, 0x8500, 0x84F0, 0x84E0, 0x84E0, 0x8490, 0x84F0, 0x84E0, + 0x84F0, 0x84D0, 0x84C0, 0x84C0, 0x84D0, 0x84B0, 0x8490, 0x84A0, 0x84A0, 0x8490, 0x8490, 0x84A0, 0x8490, 0x8490, 0x8490, 0x84B0, + 0x8490, 0x8490, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84C0, 0x84E0, 0x84B0, 0x84B0, 0x84F0, 0x84C0, 0x84D0, 0x84E0, 0x8510, 0x84E0, + 0x84F0, 0x84F0, 0x8510, 0x8520, 0x8530, 0x8550, 0x8560, 0x8570, 0x8580, 0x8590, 0x8590, 0x8580, 0x85A0, 0x8570, 0x8560, 0x8550, + 0x8550, 0x8530, 0x8530, 0x8520, 0x8510, 0x8510, 0x8500, 0x8500, 0x8500, 0x8500, 0x8500, 0x8500, 0x8500, 0x8500, 0x8510, 0x8530, + 0x8550, 0x85A0, 0x8640, 0x87B0, 0x8BD0, 0x94C0, 0x9FE0, 0xABE0, 0xB9E0, 0xC750, 0xD560, 0xE300, 0xF070, 0xFCD0, 0x08D0, 0x1400, + 0x1EE0, 0x2D30, 0x3940, 0x4620, 0x5270, 0x5E80, 0x69E0, 0x7410, 0x7CF0, 0x7F20, 0x7F00, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F10, + 0x7F10, 0x7F20, 0x7EF0, 0x7F10, 0x7F20, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F10, 0x7F30, + 0x7F20, 0x7F40, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7EF0, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F10, 0x7F20, 0x7F40, + 0x7F30, 0x7F30, 0x7F30, 0x7F40, 0x7F40, 0x7F30, 0x7F40, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F50, 0x7F30, 0x7F40, 0x7F30, + 0x7F30, 0x7F40, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F20, 0x7F20, 0x7F40, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F30, + 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F10, 0x76A0, 0x6B60, 0x5F90, 0x54E0, 0x4AC0, 0x4180, 0x39D0, 0x34D0, 0x3220, + 0x3180, 0x3200, 0x3230, 0x3140, 0x2E50, 0x29D0, 0x2520, 0x2070, 0x1CD0, 0x1990, 0x1640, 0x1320, 0x0F50, 0x0B00, 0x0630, 0x01F0, + 0xFC40, 0xF7D0, 0xF510, 0xF420, 0xF6B0, 0xFBF0, 0x01A0, 0x0680, 0x09D0, 0x0990, 0x0760, 0x0320, 0xFE00, 0xF920, 0xF5F0, 0xF3D0, + 0xF230, 0xF0D0, 0xEF70, 0xED90, 0xEBC0, 0xE9B0, 0xE810, 0xE660, 0xE600, 0xE700, 0xEA00, 0xED50, 0xEFF0, 0xEFC0, 0xEB60, 0xE230, + 0xD690, 0xC960, 0xBD40, 0xB230, 0xA9D0, 0xA460, 0x9FC0, 0x9D70, 0x9CD0, 0x9E30, 0xA000, 0xA2B0, 0xA640, 0xA910, 0xABF0, 0xAE80, + 0xB180, 0xB450, 0xB710, 0xB900, 0xBA50, 0xBAD0, 0xBB50, 0xBC60, 0xBD80, 0xBF70, 0xC2E0, 0xC6A0, 0xCA60, 0xCD20, 0xCF10, 0xCFA0, + 0xCE30, 0xCAF0, 0xC5B0, 0xBDB0, 0xB310, 0xA530, 0x9500, 0x8870, 0x8540, 0x84E0, 0x84B0, 0x84A0, 0x8490, 0x8480, 0x8480, 0x8470, + 0x8460, 0x8460, 0x8460, 0x8450, 0x8450, 0x8470, 0x8450, 0x8440, 0x8450, 0x8440, 0x8450, 0x8440, 0x8440, 0x83E0, 0x8440, 0x8440, + 0x8450, 0x8440, 0x8440, 0x8440, 0x8430, 0x8440, 0x8430, 0x8460, 0x8440, 0x8440, 0x8440, 0x8460, 0x8440, 0x8440, 0x8430, 0x8440, + 0x8430, 0x8430, 0x83E0, 0x8430, 0x8430, 0x8430, 0x83E0, 0x8430, 0x8430, 0x8440, 0x8430, 0x8430, 0x8430, 0x8400, 0x8430, 0x8430, + 0x8430, 0x8430, 0x8430, 0x8430, 0x8450, 0x8440, 0x8430, 0x8430, 0x8440, 0x8440, 0x8450, 0x8420, 0x8440, 0x8430, 0x8430, 0x83F0, + 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8450, 0x8440, 0x8430, 0x8440, 0x8440, 0x8440, 0x8430, 0x8430, 0x8430, 0x8430, + 0x8430, 0x8430, 0x8430, 0x8430, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8410, + 0x8410, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8430, 0x8430, 0x8430, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, + 0x8450, 0x8450, 0x8450, 0x8460, 0x8470, 0x8480, 0x8490, 0x84B0, 0x84F0, 0x8560, 0x8970, 0x94E0, 0x9C40, 0x9E50, 0x9C20, 0x95B0, + 0x8D60, 0x87C0, 0x8590, 0x8500, 0x84D0, 0x84C0, 0x84B0, 0x84A0, 0x8490, 0x8490, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, + 0x8480, 0x8490, 0x84A0, 0x84A0, 0x84C0, 0x84F0, 0x8590, 0x8910, 0x9D10, 0xB280, 0xC670, 0xD860, 0xE820, 0xF510, 0x00E0, 0x0980, + 0x10C0, 0x1650, 0x1A60, 0x1D20, 0x2010, 0x2230, 0x2360, 0x2480, 0x24F0, 0x2520, 0x25A0, 0x2570, 0x2630, 0x2620, 0x2760, 0x2830, + 0x28E0, 0x2A40, 0x2B50, 0x2C90, 0x2E30, 0x3040, 0x3390, 0x3780, 0x3BF0, 0x4140, 0x4630, 0x4B80, 0x5060, 0x5510, 0x62C0, 0x6600, + 0x6880, 0x6A20, 0x6CC0, 0x6EC0, 0x7110, 0x7360, 0x75F0, 0x7910, 0x7B20, 0x7CA0, 0x7D80, 0x7E30, 0x7E70, 0x7EC0, 0x7F50, 0x7F10, + 0x7F00, 0x7EF0, 0x7EF0, 0x7F70, 0x7F20, 0x7ED0, 0x7ED0, 0x7EB0, 0x7F20, 0x7F10, 0x7EB0, 0x7EC0, 0x7ED0, 0x7F30, 0x7F20, 0x7EC0, + 0x7ED0, 0x7F10, 0x7F00, 0x7F10, 0x7E90, 0x7EE0, 0x7EE0, 0x7EF0, 0x7F10, 0x7F00, 0x7F40, 0x7F10, 0x7F20, 0x7F20, 0x7F00, 0x7F10, + 0x7F20, 0x7F20, 0x7EF0, 0x7F10, 0x7F20, 0x7EF0, 0x7F30, 0x7F20, 0x7F20, 0x7F50, 0x7EF0, 0x7F10, 0x7F00, 0x7F10, 0x7F30, 0x7EE0, + 0x7EF0, 0x7F10, 0x7F20, 0x7F60, 0x7EF0, 0x7EB0, 0x7F00, 0x7F10, 0x7F70, 0x7EE0, 0x7E70, 0x7EF0, 0x7F10, 0x7F30, 0x7F00, 0x7EB0, + 0x7F00, 0x7F20, 0x7F40, 0x7EF0, 0x7EA0, 0x7EE0, 0x7EF0, 0x7F10, 0x7EE0, 0x7EC0, 0x7F10, 0x7F00, 0x7F20, 0x7F40, 0x7F00, 0x7F30, + 0x7EE0, 0x7F10, 0x7F20, 0x7EE0, 0x7F50, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F90, 0x7F00, 0x7F40, 0x7F10, 0x7EF0, 0x7F60, 0x7EF0, + 0x7EF0, 0x7F00, 0x7F00, 0x7F90, 0x7F10, 0x7F00, 0x7EF0, 0x7ED0, 0x7F30, 0x7F00, 0x7EA0, 0x7ED0, 0x7EE0, 0x6FC0, 0x5AB0, 0x4400, + 0x2E20, 0x1860, 0x03F0, 0xF230, 0xE1E0, 0xD330, 0xC790, 0xBDF0, 0xB780, 0xB330, 0xB1C0, 0xB440, 0xB9A0, 0xC1B0, 0xCD40, 0xDA90, + 0xE940, 0xF850, 0x07A0, 0x1580, 0x2110, 0x2AB0, 0x3220, 0x3850, 0x4610, 0x4920, 0x4BA0, 0x4D90, 0x5020, 0x5180, 0x5340, 0x53B0, + 0x5460, 0x55C0, 0x56C0, 0x5890, 0x5B40, 0x5D40, 0x6010, 0x6230, 0x6440, 0x66A0, 0x6880, 0x6AB0, 0x6CE0, 0x6E70, 0x7010, 0x70B0, + 0x7120, 0x70E0, 0x7060, 0x6F80, 0x6DC0, 0x6C30, 0x6A70, 0x68F0, 0x6800, 0x65F0, 0x64A0, 0x61D0, 0x5E90, 0x5B00, 0x55E0, 0x5160, + 0x4BD0, 0x45B0, 0x4030, 0x3A10, 0x33A0, 0x2D20, 0x2740, 0x2240, 0x1CA0, 0x1720, 0x1250, 0x0D10, 0x0890, 0x0340, 0xFF10, 0xFB90, + 0xF7E0, 0xF550, 0xF290, 0xF090, 0xEE40, 0xEBA0, 0xE9B0, 0xE800, 0xE650, 0xE580, 0xE460, 0xE4C0, 0xE550, 0xE680, 0xE790, 0xE8E0, + 0xEA00, 0xEB30, 0xEC40, 0xED20, 0xEF50, 0xF290, 0xF5A0, 0xF850, 0xFBA0, 0xFD60, 0xFF10, 0x00B0, 0x01E0, 0x0420, 0x0660, 0x08C0, + 0x0AF0, 0x0CF0, 0x0E70, 0x0F10, 0x1070, 0x1240, 0x1480, 0x1730, 0x1980, 0x1BE0, 0x1DB0, 0x1EA0, 0x2020, 0x2190, 0x2370, 0x2460, + 0x2540, 0x2670, 0x26C0, 0x27C0, 0x2750, 0x25B0, 0x2440, 0x2250, 0x2070, 0x1EB0, 0x1CC0, 0x1BA0, 0x1930, 0x1760, 0x1650, 0x15C0, + 0x1770, 0x1A60, 0x1ED0, 0x2770, 0x3010, 0x39D0, 0x4520, 0x50E0, 0x5C40, 0x66D0, 0x6FB0, 0x7620, 0x7AE0, 0x7DC0, 0x7ED0, 0x7F00, + 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F30, 0x7F40, 0x7F30, + 0x7F30, 0x7F30, 0x7F40, 0x7F30, 0x7F30, 0x7F30, 0x7F40, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, + 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F10, 0x7F30, 0x7F30, 0x7F20, + 0x7F20, 0x7EF0, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F00, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F00, 0x7F30, 0x7F30, 0x7F20, 0x7F40, + 0x7F50, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F40, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F60, 0x7F30, 0x7F30, 0x7F40, 0x7F30, 0x7F30, + 0x7F20, 0x7F20, 0x7F40, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F20, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F20, + 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F30, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, + 0x7E60, 0x7A30, 0x7670, 0x7340, 0x7040, 0x6CB0, 0x6820, 0x6240, 0x5AB0, 0x5290, 0x4AD0, 0x45F0, 0x42F0, 0x4220, 0x4300, 0x44F0, + 0x47B0, 0x4B00, 0x4EA0, 0x5330, 0x5740, 0x5C40, 0x6120, 0x6590, 0x6AB0, 0x6F40, 0x7360, 0x76D0, 0x7960, 0x7A40, 0x7970, 0x7710, + 0x7360, 0x6F40, 0x6A30, 0x64F0, 0x5F60, 0x5880, 0x5230, 0x4B90, 0x44C0, 0x3E00, 0x36B0, 0x3010, 0x29E0, 0x2540, 0x2100, 0x1EC0, + 0x1D90, 0x1D80, 0x1DB0, 0x1EC0, 0x20A0, 0x2350, 0x2650, 0x28C0, 0x29D0, 0x2890, 0x24D0, 0x1FE0, 0x1990, 0x12D0, 0x0BB0, 0x0320, + 0xF950, 0xED30, 0xE060, 0xD230, 0xC330, 0xB520, 0xA720, 0x9A50, 0x8FD0, 0x8920, 0x86A0, 0x85B0, 0x8540, 0x8500, 0x84E0, 0x84D0, + 0x84C0, 0x84B0, 0x84A0, 0x84A0, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x84A0, 0x84A0, + 0x84B0, 0x84B0, 0x84C0, 0x84C0, 0x84D0, 0x84F0, 0x8510, 0x8550, 0x85D0, 0x8700, 0x89C0, 0x8F90, 0x96F0, 0x9EA0, 0xA5A0, 0xACD0, + 0xB490, 0xBB20, 0xC110, 0xC620, 0xC980, 0xCDC0, 0xD110, 0xD4C0, 0xD880, 0xDAB0, 0xDD80, 0xDF30, 0xE0F0, 0xE240, 0xE350, 0xE640, + 0xE8C0, 0xEB40, 0xEF20, 0xF2C0, 0xF790, 0xFC90, 0x02D0, 0x0900, 0x0FD0, 0x16D0, 0x1D40, 0x23C0, 0x2AD0, 0x3130, 0x3820, 0x3DC0, + 0x4370, 0x4960, 0x4DF0, 0x53B0, 0x58B0, 0x5D60, 0x6190, 0x64F0, 0x67B0, 0x6960, 0x69F0, 0x6A00, 0x67E0, 0x6590, 0x6130, 0x5B30, + 0x5470, 0x4C00, 0x43D0, 0x3B00, 0x30B0, 0x2750, 0x1E60, 0x15C0, 0x0EE0, 0x0890, 0x0460, 0x0100, 0xFDD0, 0xFC20, 0xFB20, 0xFA70, + 0xFAA0, 0xFA60, 0xFA60, 0xF9E0, 0xF9B0, 0xF900, 0xF850, 0xF880, 0xF880, 0xF9A0, 0xF9B0, 0xF990, 0xFAB0, 0xFBA0, 0xFDD0, 0x0020, + 0x0300, 0x0680, 0x0950, 0x0D30, 0x11A0, 0x16D0, 0x1C50, 0x2270, 0x2940, 0x2F80, 0x35E0, 0x3C80, 0x4340, 0x4A30, 0x5190, 0x5760, + 0x5D80, 0x61B0, 0x65A0, 0x6890, 0x6AC0, 0x6D00, 0x6E00, 0x6E50, 0x6E90, 0x6DC0, 0x6D80, 0x6C90, 0x6C00, 0x6A70, 0x6890, 0x67B0, + 0x6620, 0x6500, 0x64D0, 0x64C0, 0x6720, 0x68F0, 0x6C50, 0x7070, 0x75C0, 0x7C40, 0x7EF0, 0x7F60, 0x7EF0, 0x7F30, 0x7F20, 0x7F20, + 0x7F80, 0x7EF0, 0x7EF0, 0x7EE0, 0x7F10, 0x7F70, 0x7EE0, 0x7EE0, 0x7EF0, 0x7F20, 0x7F60, 0x7EE0, 0x7E90, 0x7F00, 0x7F10, 0x7F30, + 0x7EF0, 0x7F60, 0x7F00, 0x7F10, 0x7F00, 0x7EE0, 0x7F70, 0x7EF0, 0x7EB0, 0x7F00, 0x7F10, 0x7F70, 0x7F00, 0x7EC0, 0x7F10, 0x7F10, + 0x7F20, 0x7EE0, 0x7E90, 0x7EE0, 0x7EF0, 0x7F30, 0x7AE0, 0x6E40, 0x61D0, 0x5490, 0x46B0, 0x3A70, 0x2D30, 0x22A0, 0x1960, 0x10C0, + 0x0990, 0x0420, 0x0060, 0xFE40, 0xFC80, 0xFBA0, 0xFBA0, 0xFC80, 0xFD50, 0xFD70, 0xFD50, 0xFB70, 0xF870, 0xF440, 0xEE60, 0xE920, + 0xE320, 0xDDE0, 0xD9F0, 0xD7B0, 0xD6E0, 0xD7C0, 0xD910, 0xDA60, 0xDB40, 0xDB60, 0xDB30, 0xDBC0, 0xDBE0, 0xDC50, 0xDDD0, 0xE060, + 0xE2B0, 0xE600, 0xE910, 0xED40, 0xF110, 0xF560, 0xFA00, 0xFE10, 0x02D0, 0x0640, 0x08D0, 0x0BF0, 0x0E00, 0x0FA0, 0x10C0, 0x1050, + 0x1060, 0x0FC0, 0x0EA0, 0x0CA0, 0x0A00, 0x0790, 0x05F0, 0x02E0, 0x0060, 0xFD30, 0xFA50, 0xF6A0, 0xF2B0, 0xEF30, 0xEC20, 0xE940, + 0xE610, 0xE3F0, 0xE260, 0xE0E0, 0xDFB0, 0xDEA0, 0xDD90, 0xDC70, 0xDB10, 0xD940, 0xD5E0, 0xD270, 0xD000, 0xCE20, 0xCD50, 0xCF10, + 0xD1A0, 0xD500, 0xD8C0, 0xDCE0, 0xDF40, 0xE210, 0xE590, 0xE920, 0xEDF0, 0xF3D0, 0xFA30, 0x0170, 0x0840, 0x0EF0, 0x14F0, 0x19A0, + 0x1D10, 0x2000, 0x21F0, 0x2500, 0x2850, 0x2CF0, 0x3260, 0x3870, 0x3FF0, 0x4670, 0x4D90, 0x5490, 0x5A60, 0x5FC0, 0x6460, 0x6990, + 0x6E70, 0x73A0, 0x7790, 0x7B10, 0x7DA0, 0x7EC0, 0x7F50, 0x7F20, 0x7EE0, 0x7EF0, 0x7F00, 0x7F60, 0x7F10, 0x7E90, 0x7D90, 0x7C60, + 0x7BF0, 0x7C90, 0x7D80, 0x7EC0, 0x7ED0, 0x7F30, 0x7F20, 0x7EC0, 0x7ED0, 0x7F10, 0x7F00, 0x7EF0, 0x7EA0, 0x7EE0, 0x7EF0, 0x7B30, + 0x7790, 0x7400, 0x70E0, 0x6E10, 0x6BB0, 0x6A00, 0x6900, 0x6830, 0x6770, 0x66C0, 0x6710, 0x67A0, 0x6920, 0x6A50, 0x6BA0, 0x6D40, + 0x6EF0, 0x70B0, 0x71B0, 0x7260, 0x72D0, 0x7250, 0x7130, 0x6F90, 0x6CF0, 0x6A90, 0x67E0, 0x6480, 0x6150, 0x5D70, 0x59A0, 0x54C0, + 0x4EF0, 0x4B60, 0x4790, 0x45B0, 0x4500, 0x45F0, 0x4990, 0x5000, 0x5770, 0x5F90, 0x6530, 0x6930, 0x6AC0, 0x6BC0, 0x6B50, 0x6A60, + 0x6A00, 0x6980, 0x68A0, 0x67A0, 0x6450, 0x6050, 0x59A0, 0x2DA0, 0x1E80, 0x1000, 0x0360, 0xF590, 0xE990, 0xDE30, 0xD2D0, 0xC700, + 0xBA10, 0xACE0, 0x9F90, 0x9420, 0x8C30, 0x8860, 0x86F0, 0x8610, 0x85D0, 0x85B0, 0x8590, 0x8590, 0x8560, 0x8540, 0x8540, 0x8530, + 0x8530, 0x8530, 0x8530, 0x8540, 0x8540, 0x8550, 0x8560, 0x8560, 0x8570, 0x8570, 0x8570, 0x8560, 0x8550, 0x8540, 0x8530, 0x8520, + 0x8510, 0x8500, 0x84F0, 0x84E0, 0x84D0, 0x84C0, 0x84C0, 0x84B0, 0x84B0, 0x84A0, 0x84A0, 0x8490, 0x8490, 0x8490, 0x8480, 0x8480, + 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8470, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, + 0x8480, 0x8480, 0x8490, 0x8480, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, + 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, + 0x8490, 0x8490, 0x8490, 0x8490, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84B0, 0x84B0, 0x84C0, + 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84C0, 0x84B0, 0x84B0, 0x84D0, 0x84B0, 0x84B0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84D0, + 0x84D0, 0x84D0, 0x84D0, 0x84E0, 0x84F0, 0x84F0, 0x8500, 0x8520, 0x8530, 0x8560, 0x8590, 0x85E0, 0x8640, 0x86F0, 0x87D0, 0x88E0, + 0x8A60, 0x8C20, 0x8E50, 0x9050, 0x9240, 0x93D0, 0x9520, 0x9660, 0x97B0, 0x98C0, 0x9940, 0x9930, 0x9930, 0x9890, 0x9880, 0x97D0, + 0x97A0, 0x9780, 0x9760, 0x96B0, 0x9560, 0x94E0, 0x9460, 0x93D0, 0x93E0, 0x93B0, 0x93E0, 0x93B0, 0x9410, 0x94A0, 0x95B0, 0x96C0, + 0x98B0, 0x99E0, 0x9BA0, 0x9D70, 0x9FC0, 0xA250, 0xA5B0, 0xA8A0, 0xAB80, 0xAE00, 0xB150, 0xB520, 0xB970, 0xBDC0, 0xC110, 0xC440, + 0xC690, 0xC890, 0xCA30, 0xCD20, 0xCFA0, 0xD2F0, 0xD600, 0xD940, 0xDC30, 0xDE60, 0xE0E0, 0xE310, 0xE530, 0xE7E0, 0xEA60, 0xEC80, + 0xEDD0, 0xEE60, 0xEE70, 0xEDD0, 0xEC70, 0xEA70, 0xE7B0, 0xE430, 0xE010, 0xDB80, 0xD5D0, 0xD0C0, 0xCBB0, 0xC760, 0xC380, 0xBE70, + 0xB8D0, 0xB350, 0xAD40, 0xA6A0, 0xA0F0, 0x9BD0, 0x9690, 0x9200, 0x8DB0, 0x8AA0, 0x88A0, 0x8750, 0x8680, 0x8600, 0x85B0, 0x8580, + 0x8560, 0x8540, 0x8530, 0x8530, 0x8530, 0x8520, 0x8520, 0x8530, 0x8530, 0x8530, 0x8530, 0x8540, 0x8550, 0x8550, 0x8570, 0x8590, + 0x85C0, 0x85E0, 0x8620, 0x8660, 0x86B0, 0x8710, 0x87C0, 0x8880, 0x89E0, 0x8B80, 0x8D30, 0x8F80, 0x9210, 0x9590, 0x98F0, 0x9CC0, + 0xA100, 0xA4C0, 0xA990, 0xAE50, 0xB3F0, 0xBA50, 0xC0B0, 0xC790, 0xCE00, 0xD500, 0xDB40, 0xE130, 0xE770, 0xECD0, 0xF1E0, 0xF6F0, + 0xFAF0, 0xFF30, 0x0340, 0x06B0, 0x0A10, 0x0C80, 0x0F90, 0x1190, 0x1370, 0x1660, 0x1980, 0x1DF0, 0x22E0, 0x26B0, 0x2A80, 0x2DA0, + 0x3180, 0x34C0, 0x36D0, 0x38E0, 0x3940, 0x38D0, 0x3760, 0x3520, 0x31F0, 0x2E00, 0x2A40, 0x25E0, 0x2010, 0x1B00, 0x1560, 0x0FD0, + 0x0A50, 0x0530, 0x0040, 0xFA40, 0xF410, 0xEDD0, 0xE680, 0xE070, 0xD980, 0xD220, 0xCAB0, 0xC2B0, 0xBB80, 0xB3A0, 0xACA0, 0xA670, + 0xA110, 0x9C70, 0x9800, 0x9460, 0x9120, 0x8ED0, 0x8D50, 0x8CE0, 0x8D10, 0x8DB0, 0x8E70, 0x9050, 0x9240, 0x94E0, 0x9800, 0x9B00, + 0x9DD0, 0xA120, 0xA430, 0xA850, 0xABD0, 0xB040, 0xB3D0, 0xB6F0, 0xBA70, 0xBD80, 0xC080, 0xC420, 0xC780, 0xCB60, 0xCE90, 0xD1A0, + 0xD4A0, 0xD710, 0xDA60, 0xDD60, 0xDFF0, 0xE1B0, 0xE2A0, 0xE380, 0xE3A0, 0xE3D0, 0xE4B0, 0xE4E0, 0xE580, 0xE550, 0xE570, 0xE530, + 0xE530, 0xE580, 0xE580, 0xE4C0, 0xE410, 0xE2C0, 0xE1B0, 0xE170, 0xE090, 0xDFF0, 0xDDB0, 0xDBE0, 0xDA00, 0xD7E0, 0xD680, 0xD550, + 0xD480, 0xD350, 0xD180, 0xCF50, 0xCC60, 0xCA90, 0xC880, 0xC720, 0xC5F0, 0xC510, 0xC4D0, 0xC520, 0xC770, 0xCC60, 0xD320, 0xDE40, + 0xEC70, 0xFC30, 0x5030, 0x6230, 0x72F0, 0x7D70, 0x7EC0, 0x7EF0, 0x7F10, 0x7F20, 0x7EC0, 0x7F10, 0x7F10, 0x7F20, 0x7F10, 0x7E90, + 0x7F00, 0x7F00, 0x7EF0, 0x7F10, 0x7F20, 0x7F60, 0x7F10, 0x7F20, 0x7F00, 0x7F10, 0x7F50, 0x7EF0, 0x7F00, 0x7EF0, 0x7F10, 0x7F60, + 0x7EF0, 0x7F30, 0x7F20, 0x7F00, 0x7F50, 0x7EF0, 0x7EF0, 0x7EE0, 0x7F10, 0x7F60, 0x7EE0, 0x7ED0, 0x7F10, 0x7F20, 0x7F60, 0x7ED0, + 0x7E90, 0x7F00, 0x7F10, 0x7F30, 0x7EB0, 0x7EA0, 0x7EF0, 0x7F10, 0x7F20, 0x7F20, 0x7EB0, 0x7F20, 0x7F00, 0x7F10, 0x7F10, 0x7EA0, + 0x7F20, 0x7EF0, 0x7F10, 0x7F00, 0x7EC0, 0x7F30, 0x7EB0, 0x7B80, 0x78C0, 0x7590, 0x7290, 0x7040, 0x6C30, 0x69B0, 0x66C0, 0x63F0, + 0x6180, 0x5E40, 0x5BA0, 0x5710, 0x51D0, 0x4BC0, 0x4550, 0x3FF0, 0x3A30, 0x34F0, 0x30F0, 0x2CA0, 0x29A0, 0x2760, 0x2550, 0x2410, + 0x22E0, 0x2180, 0x2030, 0x1E70, 0x1DC0, 0x1D10, 0x1D80, 0x1E60, 0x1F50, 0x20E0, 0x2180, 0x2380, 0x2550, 0x26B0, 0x28B0, 0x2A00, + 0x2A80, 0x2AB0, 0x2A20, 0x2A10, 0x2A40, 0x2A80, 0x29F0, 0x2810, 0x2610, 0x2200, 0x1E50, 0x1AB0, 0x1660, 0x1250, 0x0D80, 0x07F0, + 0x0270, 0xFD40, 0xF920, 0xF520, 0xF0F0, 0xEC90, 0xE750, 0xE1C0, 0xDBC0, 0xD590, 0xCF80, 0xC7F0, 0xBFE0, 0xB6A0, 0xACF0, 0xA240, + 0x9690, 0x8C50, 0x8730, 0x8570, 0x8500, 0x8490, 0x84C0, 0x84B0, 0x84A0, 0x8430, 0x8490, 0x8480, 0x8480, 0x8480, 0x8470, 0x8470, + 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8480, 0x8480, 0x8480, 0x8490, 0x8490, 0x84B0, + 0x84A0, 0x84A0, 0x84B0, 0x84A0, 0x84C0, 0x84D0, 0x84E0, 0x84E0, 0x84F0, 0x8500, 0x8510, 0x8550, 0x8590, 0x85E0, 0x8650, 0x86F0, + 0x8790, 0x8850, 0x8930, 0x8A30, 0x8BA0, 0x8D10, 0x8EC0, 0x90E0, 0x92F0, 0x9560, 0x9810, 0x9BC0, 0x9ED0, 0xA1F0, 0xA520, 0xA850, + 0xAB50, 0xADB0, 0xB030, 0xB290, 0xB420, 0xB5A0, 0xB650, 0xB690, 0xB670, 0xB640, 0xB5A0, 0xB4E0, 0xB340, 0xB110, 0xAEC0, 0xAC60, + 0xAA80, 0xA810, 0xA610, 0xA330, 0xA070, 0x9CD0, 0x98B0, 0x9580, 0x9280, 0x8F80, 0x8CE0, 0x8B30, 0x8A20, 0x8930, 0x8850, 0x87A0, + 0x8710, 0x86B0, 0x8670, 0x8650, 0x8630, 0x8630, 0x8640, 0x8650, 0x8660, 0x86B0, 0x8700, 0x8760, 0x87A0, 0x8810, 0x88C0, 0x8930, + 0x8A40, 0x8B30, 0x8C00, 0x8D10, 0x8E60, 0x8FC0, 0x9190, 0x9330, 0x9500, 0x9650, 0x9820, 0x9990, 0x9B20, 0x9CF0, 0x9F50, 0xA120, + 0xA330, 0xA500, 0xA680, 0xA890, 0xA9D0, 0xABB0, 0xAD00, 0xADF0, 0xAE20, 0xAE30, 0xAE70, 0xAE50, 0xAE90, 0xAE10, 0xADE0, 0xAD60, + 0xAD00, 0xACD0, 0xAD10, 0xAD60, 0xAD70, 0xADC0, 0xAE70, 0xAF00, 0xB040, 0xB1A0, 0xB370, 0xB5D0, 0xB880, 0xBAE0, 0xBEA0, 0xC2A0, + 0xC7C0, 0xCDD0, 0xD440, 0xDBE0, 0xE3F0, 0xEB40, 0x06E0, 0x0DF0, 0x1410, 0x1A60, 0x2130, 0x2790, 0x2EE0, 0x36F0, 0x3ED0, 0x46C0, + 0x4F10, 0x5750, 0x5EE0, 0x6720, 0x6F50, 0x7670, 0x7C90, 0x7F10, 0x7F30, 0x7F40, 0x7F40, 0x7F50, 0x7F30, 0x7F40, 0x7F40, 0x7F30, + 0x7F40, 0x7F40, 0x7F30, 0x7F20, 0x7F20, 0x7F40, 0x7F30, 0x7F20, 0x7F30, 0x7F10, 0x7F30, 0x7F20, 0x7F10, 0x7F30, 0x7F30, 0x7F20, + 0x7F40, 0x7F30, 0x7CA0, 0x7360, 0x6AB0, 0x6230, 0x5A30, 0x5260, 0x4B90, 0x44F0, 0x3D60, 0x36C0, 0x3070, 0x2B20, 0x2740, 0x24C0, + 0x22F0, 0x21F0, 0x2140, 0x2180, 0x2190, 0x2280, 0x2340, 0x23F0, 0x2490, 0x25C0, 0x2750, 0x2910, 0x2B20, 0x2D40, 0x2F30, 0x3170, + 0x3360, 0x3560, 0x3680, 0x37D0, 0x38C0, 0x3970, 0x39E0, 0x39F0, 0x3A80, 0x3AF0, 0x3B90, 0x3BE0, 0x3C40, 0x3C80, 0x3C00, 0x3A40, + 0x3800, 0x3480, 0x2FF0, 0x2980, 0x2090, 0x1640, 0x0A10, 0xFBF0, 0xEE70, 0xE0D0, 0xD420, 0xC7F0, 0xBD10, 0xB270, 0xA830, 0x9F60, + 0x9630, 0x8F30, 0x8A90, 0x8800, 0x86A0, 0x85F0, 0x8590, 0x8550, 0x8530, 0x8510, 0x8500, 0x8500, 0x8500, 0x8500, 0x8500, 0x8500, + 0x8510, 0x8510, 0x8530, 0x8510, 0x8510, 0x8510, 0x8530, 0x8530, 0x8540, 0x8570, 0x85C0, 0x8660, 0x8750, 0x88E0, 0x8BF0, 0x9040, + 0x9560, 0x9A40, 0x9F30, 0xA4B0, 0xAAA0, 0xB010, 0xB4D0, 0xB920, 0xBCF0, 0xC070, 0xC3A0, 0xC700, 0xC970, 0xCCE0, 0xCE70, 0xCF70, + 0xCEB0, 0xCD00, 0xCB80, 0xC9E0, 0xC870, 0xC700, 0xC520, 0xC3B0, 0xC190, 0xBF60, 0xBCE0, 0xBA40, 0xB780, 0xB480, 0xB1C0, 0xAF20, + 0xAD70, 0xAC90, 0xABF0, 0xAD00, 0xAEA0, 0xB100, 0xB520, 0xBA30, 0xC030, 0xC5B0, 0xCB60, 0xD1E0, 0xD7C0, 0xDDD0, 0xE490, 0xEAA0, + 0xF110, 0xF780, 0xFD00, 0x0140, 0x0460, 0x0720, 0x0860, 0x0880, 0x0870, 0x0730, 0x06A0, 0x06B0, 0x0830, 0x0BE0, 0x1040, 0x1480, + 0x1750, 0x1720, 0x1480, 0x0EF0, 0x0820, 0x0220, 0xFDF0, 0xFC00, 0xFD30, 0x00C0, 0x0480, 0x07B0, 0x0950, 0x07D0, 0x03A0, 0xFD00, + 0xF490, 0xEB90, 0xE1F0, 0xD860, 0xCF90, 0xC720, 0xC0E0, 0xBCF0, 0xBAD0, 0xB990, 0xB7F0, 0xB7B0, 0xB790, 0xB780, 0xB8D0, 0xBB40, + 0xBF70, 0xC4A0, 0xC9D0, 0xCF10, 0xD330, 0xD720, 0xD940, 0xDB70, 0xDDE0, 0xE0D0, 0xE530, 0xEB60, 0xF2B0, 0xFB20, 0x0390, 0x0C30, + 0x14C0, 0x1B90, 0x2130, 0x2580, 0x2940, 0x2B10, 0x2BB0, 0x2B70, 0x2970, 0x25B0, 0x1FF0, 0x17F0, 0x0DD0, 0x01D0, 0xF6E0, 0xED10, + 0xE6D0, 0xE510, 0xE810, 0xEEF0, 0xF830, 0x0170, 0x0AC0, 0x1150, 0x1750, 0x1B00, 0x1D50, 0x1FF0, 0x2140, 0x2220, 0x23D0, 0x2530, + 0x2730, 0x2940, 0x2B50, 0x2D20, 0x2E80, 0x3080, 0x31C0, 0x32E0, 0x33D0, 0x3430, 0x3530, 0x3520, 0x35A0, 0x3610, 0x3640, 0x38B0, + 0x3B10, 0x3DD0, 0x4100, 0x4390, 0x4510, 0x4430, 0x4080, 0x3B10, 0x3370, 0x2DE0, 0x28D0, 0x25F0, 0x2530, 0x2570, 0x2690, 0x26B0, + 0x2560, 0x21D0, 0x1D70, 0x1750, 0x0F80, 0x0540, 0xFA90, 0xEE60, 0xE210, 0xD650, 0xCB00, 0xC020, 0xB600, 0xAC10, 0xA180, 0x9790, + 0x8FB0, 0x8A20, 0x8780, 0x8670, 0x85B0, 0x8580, 0x8560, 0x8540, 0x8530, 0x8520, 0x8510, 0x8500, 0x84F0, 0x84F0, 0x84F0, 0x84E0, + 0x84E0, 0x84F0, 0x84D0, 0x84D0, 0x84C0, 0x84C0, 0x84C0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, + 0x84C0, 0x84C0, 0x84C0, 0x84D0, 0x84D0, 0x84E0, 0x84F0, 0x84F0, 0x8500, 0x8500, 0x8500, 0x8510, 0x8510, 0x8510, 0x8500, 0x8500, + 0x84F0, 0x84F0, 0x84F0, 0x84F0, 0x84F0, 0x84F0, 0x84F0, 0x84F0, 0x84F0, 0x84F0, 0x84F0, 0x84E0, 0x84E0, 0x84E0, 0x84E0, 0x84D0, + 0x84D0, 0x84D0, 0x84D0, 0x84D0, 0x84D0, 0x84D0, 0x84D0, 0x84D0, 0x84D0, 0x84D0, 0x84D0, 0x84D0, 0x84D0, 0x84F0, 0x84E0, 0x84E0, + 0x84F0, 0x8500, 0x8530, 0x8550, 0x85B0, 0x86A0, 0x8840, 0x8C20, 0x92A0, 0x9A90, 0xA1E0, 0xA8F0, 0xB020, 0xB610, 0xBB90, 0xC160, + 0xC6C0, 0xCAF0, 0xCF20, 0xD320, 0xD6C0, 0xDA30, 0xDCE0, 0xDF00, 0xDF90, 0xDF80, 0xDDC0, 0xDAF0, 0xD630, 0xCF80, 0xC6C0, 0xBBA0, + 0xAD80, 0x9D40, 0x8E50, 0x8700, 0x8530, 0x84E0, 0x84D0, 0x84B0, 0x84A0, 0x8490, 0x8490, 0x8480, 0x8480, 0x8470, 0x8470, 0x8470, + 0x8470, 0x8460, 0x8470, 0x8470, 0x84B0, 0x8470, 0x8470, 0x8470, 0x8480, 0x8480, 0x8490, 0x84A0, 0x84B0, 0x84D0, 0x84F0, 0x8550, + 0x8670, 0x8A60, 0x9470, 0x9E10, 0xA6B0, 0xADF0, 0xB2F0, 0xB750, 0xBB10, 0xBDE0, 0xBF80, 0xC210, 0xC560, 0xC920, 0xD030, 0xD720, + 0xDEC0, 0xE7C0, 0xF100, 0xFB00, 0x05C0, 0x1000, 0x1B50, 0x27C0, 0x33D0, 0x4030, 0x4D20, 0x5AE0, 0x6750, 0x7320, 0x7BC0, 0x7F10, + 0x7F20, 0x7F20, 0x7F60, 0x7F10, 0x7F20, 0x7F00, 0x7EF0, 0x7F50, 0x7EF0, 0x7390, 0x6670, 0x5860, 0x4B60, 0x3FD0, 0x3610, 0x2FD0, + 0x2C00, 0x2A40, 0x2B00, 0x2DA0, 0x3210, 0x3710, 0x3DB0, 0x46C0, 0x51C0, 0x5F50, 0x6E00, 0x7C50, 0x7ED0, 0x7EA0, 0x7EE0, 0x7EF0, + 0x7F10, 0x7F20, 0x7EC0, 0x7F20, 0x7F20, 0x7F20, 0x7F10, 0x7EB0, 0x7F20, 0x7EE0, 0x7EF0, 0x7F30, 0x7F20, 0x7F40, 0x7F10, 0x7F20, + 0x7F40, 0x7F10, 0x7F90, 0x7F00, 0x7F20, 0x7EF0, 0x7F00, 0x7F60, 0x7EF0, 0x7F10, 0x7F10, 0x7F00, 0x7F80, 0x7F10, 0x7EB0, 0x7F10, + 0x7EF0, 0x7F70, 0x7F20, 0x7ED0, 0x7ED0, 0x7EE0, 0x7F30, 0x7F10, 0x7EB0, 0x7EE0, 0x7ED0, 0x7F10, 0x7F00, 0x7E70, 0x7ED0, 0x7F10, + 0x7F20, 0x7EF0, 0x7E90, 0x7F00, 0x7F20, 0x7F10, 0x7E90, 0x6200, 0x4A60, 0x3740, 0x2710, 0x1C70, 0x1200, 0x08C0, 0x0080, 0xF900, + 0xF4E0, 0xF200, 0xF0F0, 0xF0A0, 0xEFF0, 0xEE60, 0xEA80, 0xE490, 0xDCF0, 0xD2C0, 0xC660, 0xB780, 0xA4A0, 0x9160, 0x86D0, 0x8510, + 0x84D0, 0x84B0, 0x84A0, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, + 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84B0, 0x84B0, 0x84C0, 0x84E0, 0x8510, 0x85C0, 0x8840, 0x91A0, 0x9DA0, 0xA7F0, 0xB220, 0xBB50, + 0xC520, 0xCF70, 0xDB20, 0xE6F0, 0xF420, 0x00D0, 0x0DF0, 0x1B80, 0x27A0, 0x3390, 0x3FD0, 0x4B60, 0x5770, 0x63E0, 0x7010, 0x7A50, + 0x7F00, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7910, 0x6DF0, 0x61B0, 0x5740, 0x4BB0, 0x4140, 0x36C0, 0x2C10, 0x2100, 0x15B0, 0x09A0, + 0xFD70, 0xF160, 0xE440, 0xD920, 0xCE50, 0xC350, 0xB880, 0xACE0, 0xA170, 0x9680, 0x8D80, 0x87F0, 0x8600, 0x8550, 0x8510, 0x8530, + 0x84E0, 0x84E0, 0x84D0, 0x84D0, 0x84D0, 0x84D0, 0x84D0, 0x84D0, 0x84E0, 0x84F0, 0x84F0, 0x84F0, 0x84F0, 0x84F0, 0x84F0, 0x84F0, + 0x84F0, 0x84F0, 0x84F0, 0x84F0, 0x8500, 0x8500, 0x8510, 0x8520, 0x8540, 0x8560, 0x85A0, 0x8600, 0x8680, 0x8760, 0x8890, 0x8AA0, + 0x8D70, 0x9180, 0x9600, 0x9A90, 0x9F10, 0xAC50, 0xAF40, 0xB290, 0xB5C0, 0xB840, 0xBA80, 0xBC30, 0xBDA0, 0xBE40, 0xBEA0, 0xBE70, + 0xBDD0, 0xBCF0, 0xBAD0, 0xB9A0, 0xB7D0, 0xB620, 0xB570, 0xB4F0, 0xB5E0, 0xB6B0, 0xB790, 0xB870, 0xB9B0, 0xBA20, 0xBA10, 0xB980, + 0xB990, 0xB950, 0xB8F0, 0xB8D0, 0xB820, 0xB790, 0xB620, 0xB4C0, 0xB2E0, 0xB190, 0xAFF0, 0xAE80, 0xACA0, 0xAB50, 0xAB20, 0xAAF0, + 0xAAD0, 0xAAE0, 0xAAF0, 0xAAE0, 0xAAA0, 0xAB30, 0xABA0, 0xAC90, 0xADB0, 0xAEA0, 0xAF60, 0xB050, 0xB120, 0xB200, 0xB370, 0xB4F0, + 0xB620, 0xB620, 0xB650, 0xB650, 0xB650, 0xB5F0, 0xB4F0, 0xB440, 0xB2A0, 0xB140, 0xAFC0, 0xAE40, 0xAD80, 0xACD0, 0xABB0, 0xAA10, + 0xA8C0, 0xA600, 0xA3E0, 0xA1F0, 0xA010, 0x9DC0, 0x9B10, 0x9760, 0x93C0, 0x9030, 0x8C90, 0x8A00, 0x8800, 0x86B0, 0x85D0, 0x8560, + 0x8520, 0x84F0, 0x84E0, 0x84D0, 0x84C0, 0x84E0, 0x84B0, 0x84A0, 0x84A0, 0x84A0, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8480, + 0x8480, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x84A0, 0x8490, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x8490, 0x8490, + 0x8490, 0x8490, 0x8490, 0x8490, 0x84A0, 0x8490, 0x8490, 0x84A0, 0x8490, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, + 0x84B0, 0x84A0, 0x84A0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84A0, 0x84B0, 0x84B0, + 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x8480, 0x84C0, + 0x84C0, 0x84C0, 0x8490, 0x84D0, 0x84E0, 0x84E0, 0x8510, 0x84F0, 0x8500, 0x8540, 0x8530, 0x8560, 0x85A0, 0x8620, 0x86F0, 0x8800, + 0x8990, 0x8BD0, 0x8ED0, 0x91C0, 0x9390, 0x9550, 0x9610, 0x9490, 0x91B0, 0x8D30, 0x8970, 0x86E0, 0x85A0, 0x8530, 0x8500, 0x84D0, + 0x84D0, 0x84C0, 0x84C0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84C0, 0x84D0, 0x84F0, 0x8520, 0x85C0, 0x87E0, 0x9030, + 0x9D90, 0xAC30, 0xB8B0, 0xC410, 0xCF70, 0xD8B0, 0xE0A0, 0xE780, 0xEED0, 0xF5D0, 0xFC80, 0x0310, 0x09D0, 0x1010, 0x16C0, 0x1D00, + 0x2350, 0x2A40, 0x3160, 0x3B10, 0x4440, 0x4F00, 0x5A70, 0x6600, 0x72B0, 0x7C70, 0x7F50, 0x7F10, 0x7F20, 0x7EF0, 0x7F10, 0x7F60, + 0x7F00, 0x7F10, 0x7F10, 0x7EF0, 0x7F60, 0x7EF0, 0x7EF0, 0x7EE0, 0x7EF0, 0x7F70, 0x7F00, 0x7EC0, 0x7F10, 0x7F10, 0x7F60, 0x7ED0, + 0x7E90, 0x7F00, 0x7EE0, 0x7EF0, 0x7F10, 0x7EA0, 0x7F40, 0x74F0, 0x71A0, 0x7340, 0x7910, 0x7EB0, 0x7E90, 0x7F10, 0x7EF0, 0x7EF0, + 0x7F10, 0x7EA0, 0x6000, 0x3B80, 0x1650, 0xF320, 0xD640, 0xBBD0, 0xA370, 0x8D10, 0x8590, 0x84E0, 0x84A0, 0x8490, 0x8470, 0x8460, + 0x8460, 0x8450, 0x8440, 0x8440, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8440, 0x8450, 0x8450, 0x8470, 0x8480, 0x84A0, + 0x84D0, 0x8510, 0x85A0, 0x8760, 0x8D50, 0x9A80, 0xAA50, 0xBC20, 0xCF10, 0xE290, 0xF390, 0x03B0, 0x11A0, 0x1E20, 0x2A00, 0x3480, + 0x3F70, 0x4980, 0x5410, 0x5D00, 0x6440, 0x6B70, 0x7040, 0x7480, 0x7760, 0x7890, 0x7990, 0x7840, 0x75C0, 0x71D0, 0x6B60, 0x6460, + 0x5C50, 0x53B0, 0x49F0, 0x4060, 0x3690, 0x2E70, 0x26A0, 0x1FE0, 0x1A10, 0x1570, 0x11A0, 0x0D40, 0x0910, 0x0300, 0xFCC0, 0xF5B0, + 0xEE30, 0xE660, 0xDD60, 0xD580, 0xCD80, 0xC660, 0xBFA0, 0xB9E0, 0xB4C0, 0xAFB0, 0xAA70, 0xA6A0, 0xA400, 0xA390, 0xA4C0, 0xA940, + 0xAF90, 0xB760, 0xBE80, 0xC490, 0xC8F0, 0xCC10, 0xCD40, 0xCCF0, 0xCBB0, 0xCA20, 0xC8D0, 0xC7B0, 0xC7A0, 0xC6A0, 0xC3D0, 0xBE90, + 0xB7B0, 0xAED0, 0xA680, 0x9FB0, 0x9A60, 0x9680, 0x9270, 0x8FD0, 0x8D80, 0x8C00, 0x8B30, 0x8B00, 0x8B60, 0x8CB0, 0x8F80, 0x9520, + 0x9E00, 0xA9C0, 0xB6B0, 0xC680, 0xD3F0, 0xE0B0, 0xEC20, 0xF6A0, 0x00D0, 0x0A30, 0x11B0, 0x17C0, 0x1930, 0x17E0, 0x1380, 0x0CB0, + 0x05A0, 0xFF40, 0xF9C0, 0xF5B0, 0xF290, 0xF260, 0xF380, 0xF5D0, 0xF900, 0xFC80, 0x00D0, 0x0580, 0x0AC0, 0x1140, 0x1900, 0x2100, + 0x2840, 0x2ED0, 0x3570, 0x3AC0, 0x4080, 0x4610, 0x4BB0, 0x51C0, 0x5650, 0x5AF0, 0x5FA0, 0x63F0, 0x6810, 0x6C30, 0x7100, 0x74E0, + 0x78B0, 0x7B70, 0x7DC0, 0x7EF0, 0x7F10, 0x7F60, 0x7EE0, 0x7E90, 0x7F00, 0x7F10, 0x7F30, 0x7EB0, 0x7E70, 0x7EF0, 0x7F10, 0x7F30, + 0x7F20, 0x7EC0, 0x7F10, 0x7F20, 0x7F30, 0x7F10, 0x7EB0, 0x7F20, 0x7EF0, 0x7F10, 0x7F30, 0x7EC0, 0x7F30, 0x7F10, 0x7F20, 0x7F40, + 0x7F10, 0x7F70, 0x7EE0, 0x7F10, 0x7F20, 0x7F00, 0x7F70, 0x7EF0, 0x7F20, 0x7F10, 0x7F00, 0x7F90, 0x7F00, 0x7F40, 0x7EF0, 0x7EF0, + 0x7F60, 0x7EF0, 0x7ED0, 0x7EF0, 0x7F00, 0x7F50, 0x7F10, 0x7EE0, 0x7EE0, 0x7ED0, 0x7F30, 0x7F00, 0x7E90, 0x7ED0, 0x7F10, 0x7EF0, + 0x7F10, 0x7EB0, 0x7EE0, 0x7F00, 0x7F10, 0x7F10, 0x7EA0, 0x7F00, 0x7F10, 0x7F00, 0x7EF0, 0x7EC0, 0x7F20, 0x7F20, 0x7F40, 0x7F10, + 0x7F10, 0x7F40, 0x7F10, 0x7F10, 0x7F00, 0x7EF0, 0x7F50, 0x7F10, 0x7F20, 0x7F00, 0x7F10, 0x7F60, 0x7F00, 0x7ED0, 0x7F00, 0x7EF0, + 0x7EF0, 0x7EF0, 0x7EF0, 0x7F10, 0x7F20, 0x7F00, 0x7F10, 0x7F10, 0x7F10, 0x7F10, 0x7F10, 0x7F10, 0x7F20, 0x7F10, 0x7F10, 0x7EF0, + 0x7F20, 0x7F20, 0x7F20, 0x7F20, 0x7EE0, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F10, 0x7F30, 0x7F40, 0x7F30, 0x7F30, 0x7F30, 0x7F30, + 0x7F30, 0x7F30, 0x7F30, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F50, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F40, 0x7F40, 0x7F30, + 0x7F30, 0x7F20, 0x7F30, 0x7B50, 0x7570, 0x6FE0, 0x6A80, 0x6690, 0x63A0, 0x6240, 0x6180, 0x6190, 0x6320, 0x6540, 0x6750, 0x6A30, + 0x6CE0, 0x7030, 0x72B0, 0x75B0, 0x7800, 0x79C0, 0x7B10, 0x7BF0, 0x7C60, 0x7C70, 0x7BF0, 0x7B60, 0x7AC0, 0x7A50, 0x79F0, 0x7940, + 0x7840, 0x7790, 0x76E0, 0x7600, 0x7550, 0x7530, 0x7530, 0x7440, 0x73D0, 0x7350, 0x72E0, 0x7290, 0x7250, 0x72E0, 0x7320, 0x73C0, + 0x7450, 0x74B0, 0x74E0, 0x7590, 0x7610, 0x76E0, 0x77E0, 0x7990, 0x7AF0, 0x7C60, 0x7DA0, 0x7E50, 0x7EE0, 0x7F20, 0x7F30, 0x7F10, + 0x7F20, 0x7F20, 0x7F40, 0x7F30, 0x7F00, 0x7F10, 0x7F30, 0x7F30, 0x7F20, 0x7EF0, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F00, 0x7F20, + 0x7F40, 0x7F30, 0x7F30, 0x7F40, 0x7F40, 0x7F30, 0x7F30, 0x7F40, 0x7F40, 0x7F30, 0x7DA0, 0x7740, 0x7050, 0x6930, 0x62A0, 0x5C00, + 0x5490, 0x4DB0, 0x4740, 0x4160, 0x3B70, 0x3570, 0x2F60, 0x28E0, 0x21C0, 0x1940, 0x11A0, 0x0A90, 0x0430, 0xFEB0, 0xF970, 0xF450, + 0xEF90, 0xE9E0, 0xE420, 0xDF10, 0xD990, 0xD470, 0xD080, 0xCC50, 0xC950, 0xC600, 0xC350, 0xC0B0, 0xBE30, 0xBB90, 0xB910, 0xB6B0, + 0xB570, 0xB540, 0xB4C0, 0xB4A0, 0xB8D0, 0xBA60, 0xBCE0, 0xBFB0, 0xC230, 0xC520, 0xC770, 0xCAC0, 0xCDC0, 0xD150, 0xD4E0, 0xD720, + 0xD950, 0xDB70, 0xDBE0, 0xDD00, 0xDD20, 0xDD10, 0xDC80, 0xDB80, 0xDB50, 0xDAE0, 0xDC00, 0xDC80, 0xDCE0, 0xDDE0, 0xDDE0, 0xDDE0, + 0xDD40, 0xDD00, 0xDDF0, 0xDEB0, 0xDF30, 0xE010, 0xE110, 0xE230, 0xE310, 0xE330, 0xE3C0, 0xE300, 0xE2B0, 0xE150, 0xDF90, 0xDD20, + 0xDA00, 0xD690, 0xD220, 0xCD80, 0xC840, 0xC260, 0xBD20, 0xB7F0, 0xB310, 0xAEA0, 0xAA10, 0xA5F0, 0xA200, 0x9E90, 0x9A90, 0x9760, + 0x9530, 0x9340, 0x9120, 0x8FE0, 0x8FC0, 0x8F90, 0x8FD0, 0x9070, 0x91D0, 0x9310, 0x9490, 0x9690, 0x99A0, 0x9D70, 0xA120, 0xA550, + 0xA9B0, 0xAE80, 0xB370, 0xB900, 0xBE90, 0xC530, 0xCB60, 0xD120, 0xD640, 0xDBA0, 0xE0A0, 0xE590, 0xEB30, 0xF070, 0xF670, 0xFBB0, + 0xFFE0, 0x04A0, 0x0970, 0x0DB0, 0x11F0, 0x15A0, 0x1970, 0x1C90, 0x1FF0, 0x2280, 0x2530, 0x2790, 0x28E0, 0x29D0, 0x2AD0, 0x2AC0, + 0x2B00, 0x2A90, 0x2960, 0x27C0, 0x25F0, 0x2450, 0x21B0, 0x1EC0, 0x1C40, 0x1890, 0x1500, 0x1090, 0x0CB0, 0x0980, 0x0640, 0x03F0, + 0x01B0, 0xFF00, 0xFCC0, 0xF950, 0xF700, 0xF3F0, 0xF170, 0xF070, 0xEF00, 0xEDF0, 0xED50, 0xEC30, 0xEB80, 0xEA80, 0xEA10, 0xEA20, + 0xE980, 0xE910, 0xE890, 0xE860, 0xE830, 0xE860, 0xE8D0, 0xE8D0, 0xE8D0, 0xE8D0, 0xE830, 0xE840, 0xE7D0, 0xE680, 0xE540, 0xE440, + 0xE3E0, 0xE340, 0xE230, 0xE170, 0xDFB0, 0xDEE0, 0xDD20, 0xDB30, 0xDAA0, 0xD910, 0xD920, 0xD920, 0xD940, 0xD940, 0xD8D0, 0xD910, + 0xD950, 0xD9D0, 0xDAE0, 0xDBA0, 0xDCC0, 0xDE10, 0xDF30, 0xE060, 0xE160, 0xE230, 0xE260, 0xE1F0, 0xE1B0, 0xE130, 0xE100, 0xE0D0, + 0xE0A0, 0xE0C0, 0xDFF0, 0xDF70, 0xDE40, 0xDC90, 0xDB70, 0xDAA0, 0xD940, 0xD560, 0xD4A0, 0xD440, 0xD310, 0xD2A0, 0xD210, 0xD120, + 0xD010, 0xCE40, 0xCD30, 0xCC70, 0xCB70, 0xCAA0, 0xC9C0, 0xC980, 0xC880, 0xC7E0, 0xC7B0, 0xC720, 0xC730, 0xC6E0, 0xC740, 0xC8A0, + 0xC9D0, 0xCBA0, 0xCDE0, 0xD040, 0xD360, 0xD5D0, 0xD870, 0xDB60, 0xDE90, 0xE310, 0xE780, 0xEC90, 0xF190, 0xF620, 0xFB20, 0xFF80, + 0x04F0, 0x0B20, 0x10A0, 0x1790, 0x1EC0, 0x2580, 0x2C80, 0x32B0, 0x39B0, 0x4000, 0x45D0, 0x4B30, 0x50A0, 0x56F0, 0x5B70, 0x5F60, + 0x6260, 0x6490, 0x6670, 0x66A0, 0x65C0, 0x6490, 0x62E0, 0x61E0, 0x6040, 0x5EF0, 0x5DC0, 0x5BD0, 0x5A50, 0x5890, 0x5660, 0x5450, + 0x51F0, 0x5070, 0x4EF0, 0x4D10, 0x4C00, 0x4A40, 0x49D0, 0x48C0, 0x4740, 0x4660, 0x44B0, 0x4380, 0x41C0, 0x4090, 0x40D0, 0x4180, + 0x42C0, 0x4500, 0x4690, 0x4980, 0x4C00, 0x4F10, 0x5230, 0x5500, 0x5810, 0x5B10, 0x5E20, 0x6140, 0x63F0, 0x6700, 0x6980, 0x6CB0, + 0x6F90, 0x71A0, 0x7470, 0x77B0, 0x7AE0, 0x7D60, 0x7ED0, 0x7F10, 0x7F20, 0x7F70, 0x7EF0, 0x7EB0, 0x7F00, 0x7F10, 0x7F30, 0x7EE0, + 0x7EA0, 0x7EF0, 0x7F10, 0x7F20, 0x7F00, 0x7EB0, 0x7F00, 0x7F00, 0x7F10, 0x7EF0, 0x7EA0, 0x7F00, 0x7EF0, 0x7F10, 0x7F00, 0x7EC0, + 0x7F20, 0x7F20, 0x7F20, 0x7F10, 0x7F00, 0x7F60, 0x7EF0, 0x7F10, 0x7F20, 0x7EF0, 0x7F50, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F70, + 0x7F10, 0x7F10, 0x7F10, 0x7EE0, 0x7F70, 0x7F10, 0x7F00, 0x7F00, 0x7EF0, 0x7F70, 0x7F20, 0x7EF0, 0x7ED0, 0x7EB0, 0x7F30, 0x7EF0, + 0x7EB0, 0x7ED0, 0x7ED0, 0x7F30, 0x7F20, 0x7EA0, 0x7ED0, 0x7F10, 0x7F00, 0x7F00, 0x7EC0, 0x7EB0, 0x7EE0, 0x7EF0, 0x7F10, 0x7F00, + 0x7F20, 0x7F10, 0x7F10, 0x7F00, 0x7EC0, 0x7F10, 0x7F20, 0x7F00, 0x7EF0, 0x7F10, 0x7F60, 0x7F20, 0x7F10, 0x7F20, 0x7F00, 0x7F50, + 0x7EF0, 0x7F20, 0x7EE0, 0x7EF0, 0x7F80, 0x7F00, 0x7EF0, 0x7F10, 0x7F20, 0x7F80, 0x7ED0, 0x7EB0, 0x7EF0, 0x7EF0, 0x7F50, 0x7EE0, + 0x7EC0, 0x7EF0, 0x7F10, 0x7F30, 0x7EE0, 0x7E90, 0x7E70, 0x6C20, 0x5750, 0x42B0, 0x2CE0, 0x16A0, 0xFF90, 0xE850, 0xD400, 0xC160, + 0xB3D0, 0xA920, 0xA380, 0xA340, 0xA630, 0xACC0, 0xB790, 0xC590, 0xD750, 0xEB20, 0x0250, 0x1830, 0x2D00, 0x3F40, 0x4C10, 0x5170, + 0x4E20, 0x40F0, 0x2CD0, 0x12E0, 0xFA00, 0xE510, 0xD380, 0xC590, 0xB820, 0xA990, 0x9980, 0x8BB0, 0x8610, 0x8520, 0x84F0, 0x84E0, + 0x84D0, 0x84D0, 0x84C0, 0x84B0, 0x84A0, 0x84C0, 0x84C0, 0x8480, 0x8470, 0x8490, 0x8480, 0x8490, 0x84B0, 0x8510, 0x8540, 0x8630, + 0x8810, 0x8A00, 0x89F0, 0x88F0, 0x87A0, 0x8690, 0x85D0, 0x8540, 0x8510, 0x84F0, 0x84E0, 0x84D0, 0x84E0, 0x8500, 0x8570, 0x8630, + 0x8A20, 0x95C0, 0xA100, 0xA910, 0xAEA0, 0xB220, 0xB610, 0xBAD0, 0xC1A0, 0xCA20, 0xD380, 0xDCC0, 0xE3D0, 0xE790, 0xE830, 0xE550, + 0xE100, 0xDD30, 0xDB00, 0xDB90, 0xDED0, 0xE4F0, 0xED60, 0xF760, 0x0400, 0x1080, 0x1D40, 0x2A00, 0x35D0, 0x41F0, 0x4DC0, 0x5910, + 0x6350, 0x6C20, 0x7240, 0x75D0, 0x7840, 0x79D0, 0x7B10, 0x7C00, 0x7C70, 0x7CC0, 0x7BF0, 0x7AA0, 0x77C0, 0x72D0, 0x6C90, 0x6470, + 0x5AA0, 0x5090, 0x45B0, 0x3B00, 0x3240, 0x2A80, 0x2520, 0x20E0, 0x1E50, 0x1E00, 0x1F90, 0x21F0, 0x23F0, 0x2530, 0x2470, 0x2240, + 0x1DD0, 0x17F0, 0x1160, 0x09E0, 0x0110, 0xF5A0, 0xE960, 0xDA40, 0xC810, 0xB4F0, 0xA1D0, 0x9080, 0x8810, 0x85D0, 0x8540, 0x8520, + 0x8500, 0x84E0, 0x84D0, 0x84B0, 0x84A0, 0x84A0, 0x8490, 0x8490, 0x8490, 0x8490, 0x84A0, 0x84A0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, + 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84C0, 0x84C0, 0x84D0, 0x84D0, 0x84E0, 0x84F0, 0x8500, 0x8520, 0x8550, 0x8590, 0x8630, 0x8770, + 0x89A0, 0x8E80, 0x96D0, 0x9E40, 0xA600, 0xAF00, 0xB710, 0xBFD0, 0xC720, 0xCE60, 0xD440, 0xD8D0, 0xDBF0, 0xDEE0, 0xE240, 0xE590, + 0xE9A0, 0xEEC0, 0xF480, 0xFAF0, 0x0320, 0x0A70, 0x1040, 0x1490, 0x1640, 0x1540, 0x12E0, 0x0ED0, 0x0AA0, 0x06C0, 0x0400, 0x0230, + 0x00E0, 0xFE40, 0xFAB0, 0xF520, 0xEEA0, 0xE770, 0xDF40, 0xD880, 0xD220, 0xCCF0, 0xC960, 0xC6A0, 0xC4F0, 0xC410, 0xC3D0, 0xC4C0, + 0xC570, 0xC650, 0xC760, 0xC900, 0xCB70, 0xCED0, 0xD250, 0xD6A0, 0xDB20, 0xDF50, 0xE320, 0xE730, 0xEAB0, 0xEE00, 0xF120, 0xF440, + 0xF790, 0xFB60, 0xFE40, 0x00D0, 0x0220, 0x02A0, 0x0290, 0x0210, 0x02B0, 0x0400, 0x0790, 0x0C00, 0x10E0, 0x1710, 0x1C10, 0x2100, + 0x25C0, 0x2AD0, 0x3030, 0x35F0, 0x3B10, 0x3FF0, 0x4410, 0x4860, 0x4B70, 0x4F10, 0x5300, 0x55E0, 0x59B0, 0x5BA0, 0x5DC0, 0x5E50, + 0x5ED0, 0x6020, 0x60C0, 0x6200, 0x6390, 0x64C0, 0x6610, 0x6580, 0x6460, 0x63A0, 0x6180, 0x60B0, 0x6030, 0x5FE0, 0x5FF0, 0x5FF0, + 0x6070, 0x5F50, 0x5D30, 0x5A20, 0x5580, 0x5050, 0x4A10, 0x41E0, 0x3910, 0x30B0, 0x27E0, 0x1DE0, 0x12C0, 0x06A0, 0xF880, 0xE920, + 0xD580, 0xC160, 0xAC30, 0x84F0, 0x84D0, 0x84B0, 0x84A0, 0x8490, 0x8490, 0x8490, 0x8480, 0x8480, 0x8480, 0x8480, 0x8490, 0x8490, + 0x8490, 0x8490, 0x8490, 0x8490, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x8480, 0x84C0, 0x84C0, 0x84D0, 0x84E0, 0x8500, 0x8510, 0x8530, + 0x8550, 0x8590, 0x8600, 0x86B0, 0x87F0, 0x8A50, 0x8E60, 0x9420, 0x99D0, 0x9F00, 0xA500, 0xAB00, 0xB120, 0xB7C0, 0xBD60, 0xC300, + 0xC830, 0xCD70, 0xD210, 0xD710, 0xDCD0, 0xE270, 0xE8B0, 0xEEF0, 0xF4A0, 0xFA80, 0x00B0, 0x0670, 0x0D40, 0x13B0, 0x1AF0, 0x2160, + 0x2750, 0x2CB0, 0x3120, 0x35F0, 0x3A80, 0x3D30, 0x4020, 0x4240, 0x44B0, 0x44E0, 0x4510, 0x4550, 0x4530, 0x4520, 0x4470, 0x4450, + 0x4410, 0x43C0, 0x4410, 0x4460, 0x4460, 0x45C0, 0x4650, 0x4710, 0x4820, 0x48E0, 0x4990, 0x4900, 0x48A0, 0x47C0, 0x46F0, 0x4700, + 0x4680, 0x4590, 0x4490, 0x4180, 0x3F90, 0x3CB0, 0x3A30, 0x38E0, 0x36F0, 0x3610, 0x3500, 0x3320, 0x31D0, 0x3100, 0x30D0, 0x3090, + 0x3130, 0x3230, 0x3360, 0x3550, 0x3830, 0x3BE0, 0x4010, 0x44F0, 0x4B00, 0x5180, 0x5890, 0x7700, 0x7D80, 0x7F00, 0x7F00, 0x7EF0, + 0x7ED0, 0x7F30, 0x7F00, 0x7EB0, 0x7EE0, 0x7EE0, 0x7F10, 0x7F10, 0x7E70, 0x7520, 0x6960, 0x5BB0, 0x4E30, 0x4200, 0x3750, 0x2DD0, + 0x22B0, 0x1820, 0x0BC0, 0xFE00, 0xEE20, 0xDA30, 0xC750, 0xB3A0, 0xA0A0, 0x9110, 0x88E0, 0x8650, 0x85A0, 0x8570, 0x8570, 0x8580, + 0x85D0, 0x8670, 0x8820, 0x8CC0, 0x9540, 0x9EF0, 0xA820, 0xB190, 0xBA50, 0xC270, 0xCA70, 0xD270, 0xD9F0, 0xE240, 0xE9C0, 0xF050, + 0xF500, 0xF6A0, 0xF530, 0xF060, 0xE960, 0xE280, 0xDC80, 0xD930, 0xD9C0, 0xDDF0, 0xE430, 0xEBF0, 0xF380, 0xF8F0, 0xFB10, 0xF880, + 0xF1C0, 0xE810, 0xDA20, 0xCCC0, 0xC0D0, 0xB5B0, 0xAD60, 0xA690, 0xA110, 0x9BE0, 0x9680, 0x9110, 0x8D00, 0x8A30, 0x88D0, 0x8840, + 0x88D0, 0x8A80, 0x8E20, 0x93F0, 0x9B70, 0xA300, 0xAAE0, 0xB2A0, 0xB9E0, 0xC190, 0xC990, 0xD110, 0xD7F0, 0xDF50, 0xE580, 0xEB20, + 0xF040, 0xF4F0, 0xFA90, 0x0020, 0x06F0, 0x0D30, 0x13A0, 0x19F0, 0x1E90, 0x22F0, 0x26A0, 0x2950, 0x2CD0, 0x3000, 0x3400, 0x38F0, + 0x3D40, 0x4200, 0x45C0, 0x49B0, 0x4C20, 0x4D00, 0x4E90, 0x4ED0, 0x4E70, 0x4D80, 0x4C80, 0x4B80, 0x4B80, 0x4D80, 0x5070, 0x5520, + 0x5A60, 0x6010, 0x64B0, 0x68A0, 0x6AF0, 0x6CD0, 0x6DC0, 0x6EC0, 0x6F90, 0x7110, 0x73E0, 0x7650, 0x7930, 0x7BB0, 0x7D40, 0x7E40, + 0x7E80, 0x7D30, 0x79F0, 0x7390, 0x6BA0, 0x6160, 0x5510, 0x4930, 0x3CE0, 0x3180, 0x26D0, 0x1BF0, 0x12A0, 0x0950, 0x0060, 0xF680, + 0xEC40, 0xE1C0, 0xD730, 0xCC20, 0xC040, 0xB290, 0xA410, 0x9420, 0x8870, 0x8540, 0x84E0, 0x84E0, 0x84A0, 0x8490, 0x8480, 0x8470, + 0x8470, 0x8460, 0x8460, 0x8460, 0x8460, 0x8450, 0x8490, 0x8450, 0x8450, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8470, + 0x8470, 0x8470, 0x8470, 0x8470, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8490, 0x8490, + 0x8490, 0x84A0, 0x84A0, 0x84F0, 0x84C0, 0x84D0, 0x84F0, 0x8540, 0x8610, 0x8800, 0x8BC0, 0x90E0, 0x92A0, 0x9240, 0x8FB0, 0x8CD0, + 0x8A40, 0x8830, 0x8710, 0x8670, 0x8620, 0x85F0, 0x8600, 0x8630, 0x86B0, 0x87B0, 0x89F0, 0x8EE0, 0x9670, 0x9F90, 0xA7D0, 0xAFA0, + 0xB560, 0xB9D0, 0xBC60, 0xBCE0, 0xBBF0, 0xB9A0, 0xB5E0, 0xB1D0, 0xAD70, 0xA8B0, 0xA460, 0x9FB0, 0x9B10, 0x96C0, 0x92E0, 0x8F10, + 0x8C30, 0x89F0, 0x88B0, 0x87F0, 0x8790, 0x8780, 0x87B0, 0x8820, 0x88D0, 0x89A0, 0x8A90, 0x8C30, 0x8E50, 0x9170, 0x9590, 0x9940, + 0x9E40, 0xA260, 0xA530, 0xA840, 0xA9F0, 0xAAE0, 0xABF0, 0xADC0, 0xB020, 0xB2B0, 0xB530, 0xB840, 0xBB40, 0xBDF0, 0xC0B0, 0xC370, + 0xC5F0, 0xC870, 0xCB20, 0xCDD0, 0xD080, 0xD3C0, 0xD7D0, 0xDBF0, 0xDFF0, 0xE370, 0xE660, 0xE810, 0xE910, 0xE9A0, 0xE9E0, 0xE980, + 0xE930, 0xE8A0, 0xE850, 0xE7E0, 0xE780, 0xE730, 0xE6E0, 0xE590, 0xE4B0, 0xE3E0, 0xE380, 0xE3B0, 0xE490, 0xE510, 0xE680, 0xE680, + 0xE680, 0xE650, 0xE680, 0xE630, 0xE560, 0xE4D0, 0xE480, 0xE440, 0xE3A0, 0xE310, 0xE330, 0xE3D0, 0xE4C0, 0xE610, 0xE720, 0xE830, + 0xE930, 0xEA80, 0xEBC0, 0xED00, 0xEDB0, 0xEDD0, 0xEE20, 0xEDD0, 0xEDD0, 0xED90, 0xECC0, 0xEBD0, 0xEA90, 0xE990, 0xE870, 0xE770, + 0xE6D0, 0xE5C0, 0xE4C0, 0xE450, 0xE3D0, 0xE3E0, 0xE400, 0xE4D0, 0xE580, 0xE660, 0xE750, 0xE870, 0xE9E0, 0xEBE0, 0xEDB0, 0xF080, + 0xF2D0, 0xF620, 0xF980, 0xFD90, 0x00C0, 0x0490, 0x0830, 0x0BB0, 0x0EE0, 0x1260, 0x16F0, 0x1AA0, 0x1E70, 0x2270, 0x25B0, 0x27A0, + 0x29C0, 0x2BB0, 0x2D30, 0x2EE0, 0x3090, 0x31E0, 0x3340, 0x3480, 0x35F0, 0x36D0, 0x37E0, 0x3A00, 0x3C90, 0x3F80, 0x4420, 0x4980, + 0x4F50, 0x5670, 0x5DB0, 0x64F0, 0x6B90, 0x71E0, 0x7690, 0x7A00, 0x7B70, 0x7BB0, 0x7A80, 0x7740, 0x7230, 0x6B70, 0x6250, 0x58B0, + 0x4D40, 0x4220, 0x36C0, 0x2C50, 0x2280, 0x1AA0, 0x13A0, 0x0CE0, 0x06C0, 0xFF20, 0xF650, 0xEB20, 0xDCE0, 0xCAC0, 0xB470, 0x9A80, + 0x86E0, 0x84E0, 0x84A0, 0x8480, 0x8490, 0x8460, 0x8450, 0x8440, 0x8430, 0x8430, 0x8420, 0x8410, 0x8400, 0x8400, 0x83F0, 0x83E0, + 0x83E0, 0x83D0, 0x83D0, 0x83D0, 0x83C0, 0x83C0, 0x83C0, 0x83B0, 0x83B0, 0x83B0, 0x83A0, 0x83A0, 0x8390, 0x8390, 0x83A0, 0x8380, + 0x8380, 0x8370, 0x8370, 0x8370, 0x8360, 0x8390, 0x8360, 0x8360, 0x8360, 0x8370, 0x8360, 0x8360, 0x8360, 0x8360, 0x8360, 0x8360, + 0x8390, 0x83A0, 0x8370, 0x8380, 0x83B0, 0x8390, 0x8380, 0x8390, 0x8390, 0x8380, 0x8380, 0x83B0, 0x8380, 0x8380, 0x8380, 0x8390, + 0x8390, 0x8390, 0x8390, 0x8390, 0x8390, 0x83A0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83D0, + 0x83D0, 0x83E0, 0x83E0, 0x83F0, 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8410, 0x8410, 0x8420, 0x8420, 0x8470, 0x8430, 0x8430, 0x8440, + 0x8430, 0x8440, 0x8450, 0x8460, 0x8460, 0x8470, 0x8490, 0x84A0, 0x84B0, 0x84C0, 0x84D0, 0x84D0, 0x84D0, 0x84C0, 0x84C0, 0x84D0, + 0x84E0, 0x84E0, 0x8500, 0x8550, 0x86B0, 0x94F0, 0xAFF0, 0xCBD0, 0xE440, 0xF480, 0xFAF0, 0xF8E0, 0xF170, 0xEA90, 0xE560, 0xE4F0, + 0xE8F0, 0xEEF0, 0xF6E0, 0xFE40, 0x03D0, 0x0810, 0x09A0, 0x0A30, 0x08D0, 0x0760, 0x05E0, 0x04D0, 0x05E0, 0x0900, 0x0E40, 0x1650, + 0x2000, 0x2B80, 0x3910, 0x46B0, 0x5660, 0x6650, 0x7590, 0x7EE0, 0x7F20, 0x7F10, 0x7F00, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F00, + 0x7F50, 0x7F10, 0x7F00, 0x7F10, 0x7F10, 0x7F70, 0x7F20, 0x7F40, 0x7F10, 0x7EF0, 0x7F60, 0x7F10, 0x7F10, 0x7EF0, 0x7EF0, 0x7F80, + 0x7F10, 0x7F00, 0x7F00, 0x7F10, 0x7F30, 0x7EE0, 0x7EF0, 0x7F10, 0x7F00, 0x7F60, 0x7EF0, 0x7EF0, 0x7EE0, 0x7EF0, 0x7F70, 0x7EF0, + 0x7EB0, 0x7EF0, 0x7EF0, 0x7F50, 0x7EF0, 0x7EA0, 0x7F00, 0x7F10, 0x7F30, 0x7EE0, 0x7E90, 0x7F00, 0x7EF0, 0x7EF0, 0x7F10, 0x7F00, + 0x7F00, 0x7EF0, 0x7EF0, 0x7F20, 0x7F00, 0x7F40, 0x7F10, 0x7F10, 0x7F20, 0x7F00, 0x7F30, 0x7EF0, 0x7F00, 0x7F10, 0x7F20, 0x7F10, + 0x7EB0, 0x7F20, 0x7EE0, 0x7EF0, 0x7F30, 0x7F20, 0x7F60, 0x7F10, 0x7F20, 0x7EF0, 0x7EF0, 0x7F90, 0x7F00, 0x7F00, 0x7EF0, 0x7EF0, + 0x7F80, 0x7F10, 0x7EF0, 0x7EE0, 0x7EE0, 0x7F50, 0x7F10, 0x7EA0, 0x7EC0, 0x7EF0, 0x7F60, 0x7F20, 0x7E90, 0x7EB0, 0x7EE0, 0x7EF0, + 0x7EF0, 0x7EB0, 0x7EC0, 0x7ED0, 0x7F10, 0x7F20, 0x7EC0, 0x7F10, 0x7F10, 0x7F00, 0x7EF0, 0x7EB0, 0x7F00, 0x7F00, 0x7F10, 0x7F10, + 0x7F00, 0x7F40, 0x7F10, 0x7F10, 0x7F00, 0x7F10, 0x7F30, 0x7EF0, 0x7F00, 0x7ED0, 0x7F10, 0x7F60, 0x7F00, 0x7F30, 0x7F00, 0x7F00, + 0x7F50, 0x7EF0, 0x7EE0, 0x7EE0, 0x7ED0, 0x7F70, 0x7EE0, 0x7ED0, 0x7F10, 0x7F20, 0x7F60, 0x7ED0, 0x7E90, 0x7EE0, 0x7EF0, 0x7F30, + 0x7EC0, 0x7EA0, 0x7EF0, 0x7F10, 0x7F20, 0x7F20, 0x7EC0, 0x7F10, 0x7F00, 0x7F10, 0x7F10, 0x7EA0, 0x7F00, 0x7EF0, 0x7F20, 0x7F20, + 0x7F10, 0x7F30, 0x7F00, 0x7F40, 0x7F10, 0x7F10, 0x7F60, 0x7EF0, 0x7F10, 0x7F10, 0x7EF0, 0x7F90, 0x7F10, 0x7F20, 0x7F00, 0x7EF0, + 0x7F70, 0x7F00, 0x7EE0, 0x7EF0, 0x7EE0, 0x7F70, 0x7F10, 0x7EE0, 0x7F00, 0x7EE0, 0x7F30, 0x7F10, 0x7ED0, 0x7ED0, 0x7EB0, 0x7F20, + 0x7EF0, 0x7E90, 0x7EE0, 0x7F20, 0x7E60, 0x7890, 0x7160, 0x6A80, 0x6380, 0x5CB0, 0x57C0, 0x5300, 0x5010, 0x4DB0, 0x4BE0, 0x4C50, + 0x4B80, 0x4B80, 0x4B00, 0x4910, 0x4830, 0x4670, 0x4460, 0x41B0, 0x3FB0, 0x3E60, 0x3C50, 0x39F0, 0x3770, 0x3500, 0x32D0, 0x30B0, + 0x2EC0, 0x2D50, 0x2AB0, 0x2840, 0x2560, 0x2230, 0x1E90, 0x1B20, 0x1840, 0x1390, 0x1040, 0x0D80, 0x0AF0, 0x0910, 0x0740, 0x05C0, + 0x0550, 0x0530, 0x0590, 0x0590, 0x0570, 0x0620, 0x06B0, 0x0750, 0x07F0, 0x08C0, 0x0A40, 0x0C00, 0x0E60, 0x0FF0, 0x1190, 0x1380, + 0x15E0, 0x1890, 0x1AD0, 0x1C70, 0x1E80, 0x1F60, 0x1EA0, 0x1C20, 0x1770, 0x1110, 0x0890, 0xFF60, 0xF4D0, 0xE830, 0xDC40, 0xCF00, + 0xC090, 0xB190, 0xA1A0, 0x9250, 0x8850, 0x8570, 0x84F0, 0x84D0, 0x84B0, 0x84A0, 0x84A0, 0x8480, 0x8470, 0x8470, 0x8460, 0x8460, + 0x8460, 0x8470, 0x8450, 0x8450, 0x8450, 0x8460, 0x8450, 0x8460, 0x8460, 0x8460, 0x8460, 0x8470, 0x8470, 0x8480, 0x8480, 0x8490, + 0x84E0, 0x84B0, 0x84C0, 0x84E0, 0x8520, 0x85D0, 0x8980, 0x9930, 0xAAE0, 0xBCE0, 0xCFD0, 0xE110, 0xF2B0, 0x0420, 0x16B0, 0x2930, + 0x3BF0, 0x4E60, 0x60D0, 0x7500, 0x7EE0, 0x7F50, 0x7F00, 0x7F00, 0x7F10, 0x7F10, 0x7F30, 0x7EE0, 0x7ED0, 0x7EF0, 0x7EE0, 0x7F50, + 0x7ED0, 0x7EB0, 0x7F00, 0x7F10, 0x7F10, 0x7EF0, 0x7EF0, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F10, + 0x7F20, 0x7F10, 0x7F10, 0x5FF0, 0x3260, 0x0190, 0xD6B0, 0xAE80, 0x8C40, 0x8500, 0x84B0, 0x8490, 0x8470, 0x8470, 0x8460, 0x8460, + 0x8450, 0x8460, 0x8460, 0x8470, 0x8480, 0x8490, 0x84B0, 0x84C0, 0x84F0, 0x8530, 0x8620, 0x8A00, 0x9670, 0xA1E0, 0xAAE0, 0xB280, + 0xBC70, 0xC970, 0xDC30, 0xF4C0, 0x1260, 0x33A0, 0x5350, 0x6D10, 0x7B90, 0x7EC0, 0x7A50, 0x67B0, 0x4A40, 0x2740, 0x0180, 0xDA90, + 0xAE80, 0x8750, 0x84B0, 0x8470, 0x8450, 0x8440, 0x8430, 0x8420, 0x8420, 0x8410, 0x8410, 0x8400, 0x83F0, 0x83F0, 0x83E0, 0x83E0, + 0x83D0, 0x83D0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83D0, 0x83D0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83F0, 0x83F0, 0x83F0, + 0x83F0, 0x8400, 0x8400, 0x8410, 0x83F0, 0x8410, 0x8410, 0x8400, 0x8410, 0x8410, 0x8420, 0x8420, 0x8420, 0x8430, 0x83F0, 0x8430, + 0x8440, 0x83F0, 0x8450, 0x8450, 0x8460, 0x8470, 0x8470, 0x8480, 0x8480, 0x8490, 0x8490, 0x84A0, 0x84B0, 0x84D0, 0x8520, 0x86F0, + 0x9880, 0xB440, 0xCE20, 0xE650, 0xFD20, 0x1260, 0x2630, 0x38C0, 0x4A90, 0x59D0, 0x6840, 0x7500, 0x7E30, 0x7F30, 0x7F20, 0x7F20, + 0x7F10, 0x7F30, 0x7F20, 0x7F10, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F20, 0x7F10, 0x7F30, + 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F30, + 0x7F20, 0x7F40, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F20, 0x7F20, 0x7F00, 0x7F50, 0x7F30, 0x7F20, 0x7F10, 0x7F10, 0x7F30, + 0x7F40, 0x7F10, 0x7EB0, 0x7EB0, 0x7EE0, 0x7ED0, 0x7F30, 0x7F00, 0x7F00, 0x7F30, 0x7F00, 0x7F40, 0x7F10, 0x7F10, 0x7F60, 0x7EE0, + 0x7ED0, 0x7F10, 0x7EF0, 0x7F50, 0x7F20, 0x7EC0, 0x7F20, 0x7EF0, 0x7F10, 0x7EE0, 0x7E70, 0x7F10, 0x7EE0, 0x7F20, 0x7ED0, 0x7EB0, + 0x7F00, 0x7F00, 0x7F10, 0x7F10, 0x7EC0, 0x7F10, 0x7F10, 0x7F00, 0x7F00, 0x7EC0, 0x7F30, 0x7F00, 0x7F20, 0x7F20, 0x7F00, 0x7F40, + 0x7ED0, 0x7F10, 0x7F30, 0x7EE0, 0x7F80, 0x7F10, 0x7F20, 0x7EF0, 0x7F10, 0x7F70, 0x7F00, 0x7F10, 0x7EF0, 0x7EE0, 0x7F60, 0x7F10, + 0x7EF0, 0x7EE0, 0x7EF0, 0x7F50, 0x7F20, 0x7EC0, 0x7ED0, 0x7EB0, 0x7F60, 0x7F10, 0x7EB0, 0x7EB0, 0x7EC0, 0x7F10, 0x7F20, 0x7EA0, + 0x7F00, 0x7EF0, 0x7F20, 0x7F20, 0x7E90, 0x7F00, 0x7F00, 0x7EF0, 0x7F10, 0x7F00, 0x7EF0, 0x7F10, 0x7F20, 0x7F20, 0x7F00, 0x7F50, + 0x7F10, 0x7F20, 0x7EF0, 0x7F00, 0x7F20, 0x7EF0, 0x7F10, 0x7F10, 0x7F20, 0x7F60, 0x7EF0, 0x7F10, 0x7F10, 0x7F10, 0x7F30, 0x7EE0, + 0x7EF0, 0x7EF0, 0x7F10, 0x7F60, 0x7F00, 0x7F00, 0x7F00, 0x7F10, 0x7F50, 0x7EB0, 0x7E70, 0x7EF0, 0x7EF0, 0x7F30, 0x7ED0, 0x7E90, + 0x7F10, 0x7F20, 0x7F40, 0x7ED0, 0x7EB0, 0x7F00, 0x7EF0, 0x7F10, 0x7F00, 0x7EC0, 0x7F10, 0x7F10, 0x7F20, 0x7F40, 0x7F00, 0x7F30, + 0x7F10, 0x7F10, 0x7F30, 0x7F00, 0x7F40, 0x7EF0, 0x7F20, 0x7F20, 0x7F00, 0x7F80, 0x7F00, 0x7F40, 0x7F10, 0x7EF0, 0x7F60, 0x7EF0, + 0x7ED0, 0x7F00, 0x7EE0, 0x7F80, 0x7F10, 0x7F00, 0x7F00, 0x7ED0, 0x7F30, 0x7F00, 0x7EA0, 0x7EB0, 0x7EE0, 0x7EF0, 0x7EF0, 0x7EB0, + 0x7EC0, 0x7F00, 0x7F10, 0x7F10, 0x7EC0, 0x7ED0, 0x7F10, 0x7F00, 0x7EF0, 0x7EC0, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F00, 0x7F40, + 0x7F10, 0x7F10, 0x7EF0, 0x7F10, 0x7F20, 0x7EC0, 0x7F10, 0x7F10, 0x7F00, 0x7F00, 0x7EE0, 0x7F40, 0x7F40, 0x7F10, 0x7F10, 0x7EE0, + 0x7F60, 0x7ED0, 0x7F20, 0x7F00, 0x7EF0, 0x7F50, 0x7F00, 0x7F20, 0x7F10, 0x7F10, 0x7F70, 0x7EE0, 0x7EC0, 0x7EF0, 0x7EE0, 0x7F70, + 0x7EF0, 0x7F20, 0x7F20, 0x7EF0, 0x7F70, 0x7EE0, 0x7F10, 0x7EF0, 0x7EF0, 0x7F70, 0x7F10, 0x7F00, 0x7F00, 0x7EF0, 0x7F30, 0x7F10, + 0x7F00, 0x7F00, 0x7EF0, 0x7F30, 0x7F00, 0x7EA0, 0x7ED0, 0x7EF0, 0x7F30, 0x7EF0, 0x7EB0, 0x7EE0, 0x7F00, 0x7F10, 0x7F10, 0x7EA0, + 0x7F00, 0x7F10, 0x7F00, 0x7F20, 0x7EC0, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F10, 0x7F10, 0x7F10, 0x7EE0, 0x7F50, + 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F70, 0x7F20, 0x7F40, 0x7F10, 0x7F00, 0x7F60, 0x7EE0, 0x7EF0, 0x7EE0, 0x7EF0, 0x7F90, 0x7F00, + 0x7EE0, 0x7F10, 0x7F10, 0x7F30, 0x7EE0, 0x7EB0, 0x7EF0, 0x7EE0, 0x7F30, 0x7ED0, 0x7EB0, 0x7F00, 0x7F10, 0x7F10, 0x79E0, 0x7110, + 0x6680, 0x5990, 0x4920, 0x3850, 0x2580, 0x11A0, 0xFBE0, 0xE2F0, 0xCA50, 0xAF80, 0x9470, 0x8660, 0x84E0, 0x84B0, 0x8490, 0x8480, + 0x8480, 0x8470, 0x8460, 0x8460, 0x8450, 0x8450, 0x8440, 0x8430, 0x83E0, 0x8430, 0x8420, 0x8420, 0x8410, 0x8400, 0x8400, 0x83B0, + 0x8400, 0x8400, 0x8420, 0x8410, 0x8410, 0x8420, 0x8430, 0x8430, 0x8430, 0x8430, 0x8450, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, + 0x8430, 0x8430, 0x8430, 0x8430, 0x8440, 0x8430, 0x8440, 0x8440, 0x8440, 0x8440, 0x8450, 0x8450, 0x8460, 0x8460, 0x8470, 0x8480, + 0x84D0, 0x84A0, 0x84B0, 0x84D0, 0x84F0, 0x85B0, 0x88F0, 0x9530, 0xA320, 0xB0A0, 0xBBA0, 0xC530, 0xCCB0, 0xD120, 0xD390, 0xD470, + 0xD360, 0xD220, 0xD010, 0xCD30, 0xCA90, 0xC830, 0xC710, 0xC200, 0xB060, 0x8FE0, 0x84E0, 0x8490, 0x8460, 0x8430, 0x8430, 0x8420, + 0x8410, 0x8400, 0x8400, 0x83E0, 0x8400, 0x83E0, 0x83E0, 0x83D0, 0x83F0, 0x83C0, 0x83C0, 0x83A0, 0x83B0, 0x83C0, 0x83C0, 0x83B0, + 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83A0, 0x83C0, 0x83D0, 0x83D0, 0x83D0, 0x83E0, 0x83E0, 0x83D0, 0x83E0, 0x83F0, + 0x83F0, 0x83E0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83E0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x8400, 0x8420, + 0x8410, 0x8410, 0x8410, 0x8410, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x83E0, 0x83F0, 0x83F0, 0x83E0, 0x83E0, 0x83D0, + 0x83C0, 0x83C0, 0x83B0, 0x83B0, 0x83B0, 0x83D0, 0x83B0, 0x83B0, 0x83B0, 0x83C0, 0x83D0, 0x83D0, 0x83E0, 0x83F0, 0x83F0, 0x83F0, + 0x8400, 0x8400, 0x8400, 0x8410, 0x8420, 0x8420, 0x8430, 0x8440, 0x8440, 0x8460, 0x8460, 0x8470, 0x8470, 0x8480, 0x8480, 0x84B0, + 0x84B0, 0x84C0, 0x84F0, 0x8530, 0x85C0, 0x87B0, 0x8F00, 0x9D10, 0xAB20, 0xB880, 0xC430, 0xCF00, 0xD640, 0xDB10, 0xDDB0, 0xDEE0, + 0xDFE0, 0xE0A0, 0xE150, 0xE0F0, 0xDE50, 0xD7F0, 0xCD20, 0xBCE0, 0xA810, 0x9000, 0x85A0, 0x84D0, 0x84A0, 0x8490, 0x8480, 0x8480, + 0x8470, 0x8470, 0x8460, 0x8460, 0x8450, 0x8450, 0x8460, 0x8490, 0x8470, 0x8480, 0x8490, 0x8490, 0x84A0, 0x84B0, 0x84C0, 0x84D0, + 0x8510, 0x8670, 0x9510, 0xB180, 0xCF10, 0xEE60, 0x0FA0, 0x32B0, 0x5900, 0x7760, 0x7F40, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, + 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F20, + 0x7F40, 0x7F30, 0x7F30, 0x7F10, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F10, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F00, 0x7F40, 0x7F30, + 0x7F30, 0x7F20, 0x7F00, 0x7F10, 0x7F30, 0x7F20, 0x7F10, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F30, + 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F50, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F10, 0x7F30, 0x7F30, + 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F20, + 0x7F20, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F30, 0x7F30, 0x7F70, 0x7F20, 0x7EC0, 0x7F00, + 0x7F10, 0x7EF0, 0x7EF0, 0x7E70, 0x7EF0, 0x7EC0, 0x7EE0, 0x7ED0, 0x7E80, 0x7EE0, 0x7F00, 0x7F10, 0x7F10, 0x7EC0, 0x7ED0, 0x7F10, + 0x7F00, 0x7EF0, 0x7F00, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F00, 0x7F30, 0x7F10, 0x7F10, 0x7EE0, 0x7EF0, 0x7F10, 0x7F10, 0x7EF0, + 0x7EF0, 0x7F10, 0x7F60, 0x7F00, 0x7F10, 0x7F00, 0x7EE0, 0x7F40, 0x7EF0, 0x7EE0, 0x7F40, 0x7F10, 0x7F40, 0x7F00, 0x7EC0, 0x7EF0, + 0x7F00, 0x7F50, 0x7ED0, 0x7EB0, 0x7EE0, 0x7EF0, 0x7F10, 0x7F00, 0x7EA0, 0x7F10, 0x7F10, 0x7F20, 0x7F00, 0x7E90, 0x7F00, 0x7EE0, + 0x7EF0, 0x7F10, 0x7F00, 0x7EF0, 0x7EF0, 0x7F20, 0x7F20, 0x7F00, 0x7F50, 0x7F00, 0x7F20, 0x7EF0, 0x7F00, 0x7F40, 0x7EF0, 0x7F30, + 0x7F20, 0x7F00, 0x7F90, 0x7F10, 0x7F10, 0x7F10, 0x7F10, 0x7F70, 0x7EE0, 0x73F0, 0x6290, 0x50E0, 0x3EF0, 0x2D50, 0x19F0, 0x09A0, + 0xFA40, 0xECB0, 0xE230, 0xD960, 0xD340, 0xCD90, 0xC9D0, 0xC810, 0xC650, 0xC630, 0xC660, 0xC660, 0xC6F0, 0xC750, 0xC800, 0xC860, + 0xC810, 0xC820, 0xC760, 0xC6D0, 0xC6C0, 0xC6E0, 0xC8E0, 0xCB40, 0xCE30, 0xD1C0, 0xD440, 0xD730, 0xD9E0, 0xDBC0, 0xDD50, 0xDED0, + 0xE0E0, 0xE2E0, 0xE5D0, 0xE910, 0xEC50, 0xEF90, 0xF200, 0xF3A0, 0xF4B0, 0xF480, 0xF3E0, 0xF2C0, 0xF0F0, 0xEF60, 0xECE0, 0xEA80, + 0xE7F0, 0xE4A0, 0xE1F0, 0xDEC0, 0xDB90, 0xD800, 0xD4D0, 0xD180, 0xCE10, 0xCBA0, 0xC8E0, 0xC5D0, 0xC360, 0xBFA0, 0xBD80, 0xBB10, + 0xB8E0, 0xB6D0, 0xB4A0, 0xB310, 0xB120, 0xAF10, 0xACD0, 0xAAE0, 0xA8D0, 0xA6F0, 0xA510, 0xA320, 0x9FF0, 0x9C70, 0x9900, 0x94F0, + 0x9140, 0x8D70, 0x8A10, 0x87E0, 0x8680, 0x85C0, 0x8560, 0x8520, 0x8500, 0x8520, 0x84E0, 0x84E0, 0x84C0, 0x84C0, 0x84C0, 0x84D0, + 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84D0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84C0, 0x84C0, 0x84C0, 0x84B0, + 0x84B0, 0x84C0, 0x84B0, 0x84B0, 0x84C0, 0x84C0, 0x84C0, 0x84E0, 0x84C0, 0x84C0, 0x84C0, 0x84D0, 0x84E0, 0x84D0, 0x8500, 0x8530, + 0x8580, 0x8650, 0x8830, 0x8CA0, 0x9400, 0x9CB0, 0xA430, 0xAC10, 0xB370, 0xBA90, 0xC390, 0xCBD0, 0xD580, 0xDEC0, 0xE840, 0xF210, + 0xFC10, 0x06B0, 0x1140, 0x1CB0, 0x26A0, 0x2FC0, 0x39F0, 0x4290, 0x4A70, 0x5260, 0x58D0, 0x5F30, 0x6480, 0x6890, 0x6C90, 0x7020, + 0x7440, 0x7890, 0x7BB0, 0x7E30, 0x7EC0, 0x7F10, 0x7F20, 0x7F40, 0x7E90, 0x7EB0, 0x7F00, 0x7EF0, 0x7EF0, 0x7F20, 0x7EC0, 0x7F10, + 0x7F10, 0x7F20, 0x7F40, 0x7F10, 0x7F30, 0x7F00, 0x7F20, 0x7F10, 0x7F00, 0x7F60, 0x7EF0, 0x7F30, 0x7F20, 0x7F00, 0x7F50, 0x7F10, + 0x7F40, 0x7F10, 0x7EF0, 0x7F60, 0x7EF0, 0x7EF0, 0x7EF0, 0x7F00, 0x7F60, 0x7F10, 0x7F00, 0x7EE0, 0x7ED0, 0x7F30, 0x7F00, 0x7EA0, + 0x7EF0, 0x7F10, 0x7F70, 0x7F00, 0x7ED0, 0x7F00, 0x7EE0, 0x7F50, 0x7EF0, 0x7EB0, 0x7F00, 0x7F10, 0x7F70, 0x7ED0, 0x7EB0, 0x7F00, + 0x7EF0, 0x7F30, 0x7F00, 0x7EC0, 0x7F10, 0x7EE0, 0x7EF0, 0x7F10, 0x7F00, 0x7F40, 0x7F10, 0x7F10, 0x7F20, 0x7EF0, 0x7F40, 0x7F10, + 0x7F10, 0x7F20, 0x7EF0, 0x7F90, 0x7F10, 0x7F20, 0x7F10, 0x7F00, 0x7F70, 0x7F10, 0x7F10, 0x7EF0, 0x7EE0, 0x7F70, 0x7F10, 0x7EE0, + 0x7EF0, 0x7EF0, 0x7F70, 0x7F00, 0x7ED0, 0x7EB0, 0x7EB0, 0x7EF0, 0x7EF0, 0x7E70, 0x7EC0, 0x7ED0, 0x7F10, 0x7F20, 0x7EC0, 0x7ED0, + 0x7F10, 0x7F00, 0x7F10, 0x7E90, 0x7EE0, 0x7F00, 0x7EF0, 0x7F10, 0x7F00, 0x7F40, 0x7F10, 0x7F20, 0x7F20, 0x7F00, 0x7F30, 0x7F20, + 0x7F20, 0x7EF0, 0x7F10, 0x7F60, 0x7F10, 0x7F30, 0x7F20, 0x7F00, 0x7F50, 0x7EF0, 0x7F00, 0x7EF0, 0x7ED0, 0x7F30, 0x7EE0, 0x7EF0, + 0x7F10, 0x7F20, 0x7F70, 0x7ED0, 0x7EB0, 0x7EF0, 0x7F10, 0x7F30, 0x7EE0, 0x7EA0, 0x7EF0, 0x7F10, 0x7F20, 0x7F00, 0x7E90, 0x7F00, + 0x7F10, 0x7F10, 0x7F00, 0x7EA0, 0x7EF0, 0x7EF0, 0x7F20, 0x7F20, 0x7EB0, 0x7F20, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7F40, 0x7EF0, + 0x7F10, 0x7F20, 0x7EF0, 0x7F50, 0x7F10, 0x7F20, 0x7F30, 0x7F10, 0x7F70, 0x7D20, 0x5D10, 0x40B0, 0x2400, 0x0840, 0xEE30, 0xD660, + 0xC1C0, 0xAF00, 0x9F50, 0x9250, 0x8B60, 0x8820, 0x86D0, 0x85F0, 0x85D0, 0x8580, 0x8550, 0x8510, 0x84F0, 0x84D0, 0x84F0, 0x84B0, + 0x84A0, 0x8490, 0x84B0, 0x8480, 0x8470, 0x8430, 0x8470, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8470, 0x8470, + 0x8470, 0x8470, 0x8480, 0x8480, 0x8490, 0x8490, 0x8490, 0x84A0, 0x84A0, 0x84A0, 0x84E0, 0x84B0, 0x84B0, 0x84A0, 0x84A0, 0x84A0, + 0x8490, 0x84A0, 0x8490, 0x8480, 0x8480, 0x8460, 0x8470, 0x8470, 0x8480, 0x8470, 0x8460, 0x8460, 0x8450, 0x8460, 0x8490, 0x8410, + 0x8460, 0x8460, 0x8460, 0x8460, 0x8450, 0x8450, 0x8450, 0x8440, 0x8470, 0x8440, 0x8440, 0x8440, 0x8440, 0x8430, 0x8430, 0x8430, + 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8440, 0x8440, 0x8440, 0x8450, + 0x8450, 0x8450, 0x8450, 0x8460, 0x8470, 0x8470, 0x8470, 0x8480, 0x8490, 0x8490, 0x84A0, 0x84B0, 0x84C0, 0x84E0, 0x8520, 0x85B0, + 0x87B0, 0x8E70, 0x9950, 0xA330, 0xAAD0, 0xB040, 0xB350, 0xB4B0, 0xB570, 0xB470, 0xB260, 0xAF80, 0xABD0, 0xA810, 0xA2B0, 0x9D40, + 0x96B0, 0x9070, 0x8B90, 0x8860, 0x86D0, 0x8600, 0x85D0, 0x8570, 0x8560, 0x8560, 0x8590, 0x85C0, 0x8650, 0x87A0, 0x8B40, 0x9380, + 0x9F10, 0xAAB0, 0xB620, 0xC0D0, 0xC940, 0xCF80, 0xD360, 0xD4B0, 0xD360, 0xCFB0, 0xCA90, 0xC3B0, 0xBAE0, 0xB010, 0xA330, 0x94A0, + 0x89A0, 0x85B0, 0x84F0, 0x84D0, 0x84B0, 0x84A0, 0x8490, 0x8490, 0x8490, 0x8480, 0x8470, 0x8470, 0x8470, 0x8460, 0x8460, 0x8460, + 0x8460, 0x8460, 0x8460, 0x8470, 0x8480, 0x8490, 0x84B0, 0x84F0, 0x8670, 0x9DC0, 0xBF90, 0xE0F0, 0x03B0, 0x2A70, 0x4E90, 0x6FD0, + 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F10, 0x7F30, 0x7F70, 0x7F20, 0x7F10, 0x7F30, + 0x7F00, 0x7F50, 0x7EF0, 0x7F00, 0x7F20, 0x7F10, 0x7F30, 0x7F10, 0x7F10, 0x7ED0, 0x7EB0, 0x7F20, 0x7EF0, 0x7F10, 0x7F00, 0x7F20, + 0x7F60, 0x7F10, 0x7F20, 0x7F10, 0x7EF0, 0x7F30, 0x7F30, 0x7EC0, 0x7ED0, 0x7EE0, 0x7F40, 0x7F50, 0x7EB0, 0x7F00, 0x7EE0, 0x7B80, + 0x6630, 0x4E00, 0x3540, 0x1B30, 0x0420, 0xEFA0, 0xDC00, 0xC950, 0xB610, 0xA220, 0x8FB0, 0x8710, 0x8530, 0x84F0, 0x84E0, 0x84E0, + 0x84E0, 0x84F0, 0x8530, 0x8570, 0x8600, 0x8730, 0x8900, 0x8BE0, 0x8E70, 0x90B0, 0x9230, 0x9310, 0x92D0, 0x9180, 0x8FF0, 0x8E30, + 0x8D40, 0x8C70, 0x8C10, 0x8C20, 0x8BD0, 0x8B80, 0x8B70, 0x8BB0, 0x8C20, 0x8CA0, 0x8D70, 0x8F10, 0x90C0, 0x9300, 0x9530, 0x9680, + 0x97B0, 0x9880, 0x99F0, 0x9B50, 0x9CB0, 0x9E20, 0x9FA0, 0xA0B0, 0xA1D0, 0xA220, 0xA290, 0xA2E0, 0xA370, 0xA3F0, 0xA300, 0xA160, + 0x9F00, 0x9B60, 0x96B0, 0x9150, 0x8BC0, 0x87E0, 0x85E0, 0x8530, 0x84F0, 0x84D0, 0x84C0, 0x84B0, 0x8490, 0x8490, 0x8480, 0x8470, + 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8460, 0x8470, 0x8470, 0x8480, 0x84A0, 0x84E0, 0x8790, 0xB3E0, 0xE6B0, 0x1220, 0x37F0, + 0x5850, 0x7100, 0x7E70, 0x7EF0, 0x7F10, 0x7F20, 0x7EC0, 0x7ED0, 0x7F10, 0x7F20, 0x7F10, 0x7E90, 0x7F00, 0x7F00, 0x7EF0, 0x7F10, + 0x7EA0, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F50, 0x7F10, 0x7F10, 0x7F10, 0x7F00, 0x7F60, 0x7EF0, 0x7F10, 0x7F10, 0x7F00, + 0x7F80, 0x7F10, 0x7F20, 0x7F10, 0x7F10, 0x7F70, 0x7EE0, 0x7ED0, 0x7F10, 0x7F20, 0x7F70, 0x7EF0, 0x7BB0, 0x4AA0, 0x1F10, 0xF790, + 0xD690, 0xBB30, 0xA890, 0x9D10, 0x9B60, 0xA110, 0xAB60, 0xB7E0, 0xC2A0, 0xCAA0, 0xCE90, 0xCCA0, 0xC730, 0xC110, 0xBB30, 0xB9E0, + 0xBCE0, 0xC510, 0xD2E0, 0xE370, 0xF380, 0x0080, 0x0800, 0x12E0, 0x1A70, 0x24E0, 0x31C0, 0x4090, 0x4F10, 0x5D30, 0x6960, 0x7390, + 0x7C80, 0x7F00, 0x7F10, 0x7F10, 0x7F20, 0x7F40, 0x7F10, 0x7F50, 0x7F00, 0x7F20, 0x7EF0, 0x7F00, 0x7F60, 0x7EF0, 0x7F30, 0x7F20, + 0x7F00, 0x7F90, 0x7F10, 0x7EF0, 0x7F10, 0x7EF0, 0x7F70, 0x7EE0, 0x7EF0, 0x7EF0, 0x7F00, 0x7F60, 0x7F10, 0x7EE0, 0x7F00, 0x7EF0, + 0x7F30, 0x7F00, 0x7E70, 0x7EC0, 0x7EF0, 0x7F10, 0x7EF0, 0x7E90, 0x7ED0, 0x7F00, 0x7F10, 0x7F10, 0x7EA0, 0x7F00, 0x7F10, 0x7F10, + 0x7F00, 0x7EC0, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F30, 0x7F40, 0x7F10, 0x7F10, 0x7EE0, 0x7F50, 0x7F10, 0x7F20, 0x7F20, + 0x7F10, 0x7F70, 0x7F00, 0x7F40, 0x7F10, 0x7F00, 0x7F60, 0x7EF0, 0x7EF0, 0x7F10, 0x7EF0, 0x7F80, 0x7F00, 0x7EE0, 0x7F00, 0x7F10, + 0x7F30, 0x7EE0, 0x7EA0, 0x7EF0, 0x7E20, 0x7C40, 0x7A50, 0x7800, 0x75E0, 0x7440, 0x7210, 0x7100, 0x6F20, 0x6DD0, 0x6CB0, 0x6B70, + 0x6B20, 0x6A00, 0x6910, 0x6820, 0x6700, 0x6650, 0x6520, 0x63C0, 0x6290, 0x60B0, 0x5F70, 0x5D60, 0x5AD0, 0x58B0, 0x54E0, 0x5190, + 0x4D30, 0x4820, 0x4340, 0x3DD0, 0x38B0, 0x32E0, 0x2D20, 0x2730, 0x20E0, 0x1B10, 0x1490, 0x0F30, 0x09A0, 0x04A0, 0x00D0, 0xFCD0, + 0xF790, 0xF250, 0xEBF0, 0xE5F0, 0xDED0, 0xD6F0, 0xD050, 0xC880, 0xC0C0, 0xB780, 0xAE90, 0xA650, 0x9DB0, 0x95C0, 0x8E60, 0x8960, + 0x86C0, 0x85B0, 0x8530, 0x8500, 0x84E0, 0x84E0, 0x84D0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84D0, 0x84E0, 0x8500, 0x8530, + 0x85E0, 0x8800, 0x8F90, 0x9BF0, 0xA910, 0xB400, 0xBBF0, 0xC1F0, 0xC5F0, 0xC820, 0xC760, 0xC4E0, 0xC0F0, 0xBAB0, 0xB450, 0x9DA0, + 0x9A10, 0x99F0, 0x9BA0, 0xA080, 0xA7D0, 0xB060, 0xBBE0, 0xC770, 0xD500, 0xE250, 0xF090, 0xFFB0, 0x0EC0, 0x1E70, 0x2E00, 0x3E90, + 0x4E50, 0x5C70, 0x69C0, 0x7410, 0x7BB0, 0x7F00, 0x7EC0, 0x7EC0, 0x7EE0, 0x7F30, 0x7F10, 0x7E90, 0x7EB0, 0x7EF0, 0x7EF0, 0x7F10, + 0x7F00, 0x7ED0, 0x7F10, 0x7F20, 0x7F20, 0x7F00, 0x7F10, 0x7F00, 0x7F00, 0x7EF0, 0x7EC0, 0x7F20, 0x7F10, 0x7F20, 0x7F20, 0x7F00, + 0x7F50, 0x7F10, 0x7F20, 0x7F10, 0x7F10, 0x7F30, 0x7EF0, 0x7EF0, 0x7F10, 0x7F00, 0x7F70, 0x7EF0, 0x7F20, 0x7F00, 0x7F10, 0x7F70, + 0x7EE0, 0x7EC0, 0x7EF0, 0x7F10, 0x7F30, 0x7ED0, 0x7EB0, 0x7F00, 0x7F00, 0x7F50, 0x7ED0, 0x7EA0, 0x7EE0, 0x7EF0, 0x7F20, 0x7EE0, + 0x7E90, 0x7F10, 0x7F20, 0x7F40, 0x7F10, 0x7F00, 0x7F20, 0x7F10, 0x7F10, 0x7F10, 0x7EE0, 0x7EF0, 0x7F20, 0x7F10, 0x7F10, 0x7F20, + 0x7F00, 0x7F10, 0x7F30, 0x7F20, 0x7F10, 0x7F10, 0x7EB0, 0x63E0, 0x4780, 0x2A10, 0x0D20, 0xF1F0, 0xD980, 0xC490, 0xB480, 0xA5F0, + 0x99A0, 0x8EC0, 0x87D0, 0x8590, 0x8510, 0x84E0, 0x84D0, 0x84D0, 0x84E0, 0x84E0, 0x84E0, 0x84E0, 0x84C0, 0x84B0, 0x8490, 0x8480, + 0x8470, 0x8460, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8440, 0x8440, 0x8430, 0x8430, 0x8420, + 0x8420, 0x8410, 0x8410, 0x8410, 0x8410, 0x8400, 0x8400, 0x83E0, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8420, + 0x8420, 0x8420, 0x8430, 0x8430, 0x8430, 0x8430, 0x8440, 0x8440, 0x8440, 0x8450, 0x8450, 0x8450, 0x8450, 0x8460, 0x8460, 0x8460, + 0x8470, 0x8470, 0x8470, 0x8470, 0x8480, 0x8480, 0x8480, 0x8490, 0x8490, 0x84A0, 0x84B0, 0x84C0, 0x84C0, 0x84E0, 0x8500, 0x8550, + 0x8680, 0x8AB0, 0x9790, 0xA740, 0xB7D0, 0xC880, 0xDA50, 0xEC20, 0xFD00, 0x0D50, 0x1B80, 0x2760, 0x31F0, 0x3B10, 0x4470, 0x4DC0, + 0x5810, 0x6310, 0x6E40, 0x7820, 0x7E90, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F40, + 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F30, + 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F20, + 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F80, 0x7F20, + 0x7F10, 0x7F30, 0x7F20, 0x7F40, 0x7F10, 0x7EF0, 0x7EE0, 0x7EE0, 0x7EF0, 0x7EF0, 0x7EE0, 0x7EC0, 0x7EF0, 0x7F20, 0x7F20, 0x7EF0, + 0x7ED0, 0x7F10, 0x7F20, 0x7EF0, 0x7EB0, 0x7F20, 0x7EF0, 0x7F30, 0x7F20, 0x7EC0, 0x7C40, 0x6680, 0x4C30, 0x3370, 0x1AB0, 0x0580, + 0xF3A0, 0xE4D0, 0xDA50, 0xD220, 0xCC10, 0xC650, 0xC180, 0xBC50, 0xB5C0, 0xADD0, 0xA560, 0x9CC0, 0x9520, 0x8EA0, 0x89F0, 0x8790, + 0x8640, 0x85B0, 0x84F0, 0x8530, 0x8520, 0x8510, 0x8540, 0x8510, 0x8510, 0x8530, 0x8570, 0x85B0, 0x86B0, 0x8980, 0x90A0, 0x9A40, + 0xA450, 0xAD50, 0xB630, 0xBE70, 0xC660, 0xCF10, 0xD7F0, 0xE0E0, 0xE940, 0xF1D0, 0xF8D0, 0xFE80, 0x0310, 0x0750, 0x0B30, 0x0EE0, + 0x10F0, 0x1250, 0x1400, 0x1450, 0x1470, 0x13E0, 0x11C0, 0x0F90, 0x0D30, 0x0B00, 0x0960, 0x0830, 0x0890, 0x09A0, 0x0B80, 0x0EA0, + 0x1230, 0x16C0, 0x1B80, 0x2010, 0x24E0, 0x28F0, 0x2DB0, 0x3250, 0x36A0, 0x3B50, 0x3FF0, 0x4570, 0x49C0, 0x4D90, 0x5070, 0x5300, + 0x56C0, 0x59F0, 0x5D70, 0x6100, 0x6440, 0x67B0, 0x6AE0, 0x6D90, 0x70B0, 0x7340, 0x7680, 0x7980, 0x7BB0, 0x7DE0, 0x7E70, 0x7F10, + 0x7F00, 0x7F20, 0x7ED0, 0x7EB0, 0x7F20, 0x7F00, 0x7F10, 0x7F10, 0x7EC0, 0x7F10, 0x7F10, 0x7F00, 0x7F00, 0x7ED0, 0x7F30, 0x7F00, + 0x7F40, 0x7F30, 0x7F00, 0x7F60, 0x7F10, 0x7F10, 0x7F20, 0x7EF0, 0x7F80, 0x7F10, 0x7F20, 0x7EF0, 0x7F10, 0x7F70, 0x7F00, 0x7F10, + 0x7EF0, 0x7EE0, 0x7F60, 0x7F10, 0x7EE0, 0x7EE0, 0x7ED0, 0x7F70, 0x7F20, 0x7EC0, 0x7ED0, 0x7EB0, 0x7F60, 0x7EF0, 0x7E90, 0x7EB0, + 0x7EE0, 0x7EF0, 0x7F10, 0x7EA0, 0x7F00, 0x7F00, 0x7F20, 0x7F20, 0x7E90, 0x7F00, 0x7F00, 0x7F00, 0x7EF0, 0x7F00, 0x7F00, 0x7F10, + 0x7F20, 0x7F20, 0x7F00, 0x7F50, 0x7F10, 0x7F20, 0x7EF0, 0x7F10, 0x7F60, 0x7EB0, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7EC0, 0x7F30, + 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F40, 0x7F10, 0x7F10, 0x7F00, 0x7EF0, 0x7F50, 0x7F10, 0x7F20, 0x7F00, 0x7F10, 0x7F60, 0x7F00, + 0x7F10, 0x7F10, 0x7EF0, 0x7F60, 0x7EF0, 0x7EB0, 0x7EF0, 0x7EF0, 0x7F70, 0x7F00, 0x7EC0, 0x7F10, 0x7F10, 0x7F20, 0x7EE0, 0x7EB0, + 0x7EE0, 0x7EF0, 0x7F30, 0x7F00, 0x7EA0, 0x7F10, 0x7F10, 0x7F10, 0x7F00, 0x7E90, 0x7F10, 0x7EE0, 0x7EF0, 0x7F10, 0x7F00, 0x7F40, + 0x7F10, 0x7D60, 0x70A0, 0x62E0, 0x5510, 0x4760, 0x3A20, 0x2DF0, 0x2110, 0x1520, 0x06F0, 0xF880, 0xE770, 0xD2C0, 0xBB10, 0xA190, + 0x8AB0, 0x84F0, 0x84D0, 0x84B0, 0x84A0, 0x8490, 0x8480, 0x8480, 0x8480, 0x84B0, 0x8480, 0x8480, 0x8490, 0x8490, 0x8490, 0x8480, + 0x8480, 0x8470, 0x8460, 0x8460, 0x8460, 0x8450, 0x8450, 0x8450, 0x8440, 0x8440, 0x8430, 0x8430, 0x8420, 0x8420, 0x8410, 0x8400, + 0x83F0, 0x83F0, 0x83E0, 0x83E0, 0x83E0, 0x83D0, 0x8400, 0x83E0, 0x83E0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8400, + 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8420, 0x8420, 0x8420, 0x8420, 0x8430, 0x8430, + 0x8430, 0x8430, 0x8430, 0x8440, 0x8440, 0x8450, 0x8460, 0x8470, 0x8480, 0x8490, 0x84A0, 0x84C0, 0x84D0, 0x8500, 0x8570, 0x8760, + 0x9100, 0x9F00, 0xA8E0, 0xAE20, 0xAE30, 0xA9D0, 0xA180, 0x9750, 0x8D00, 0x8720, 0x8550, 0x84F0, 0x84C0, 0x84C0, 0x8490, 0x8490, + 0x8480, 0x8470, 0x8470, 0x8460, 0x8460, 0x8480, 0x8450, 0x8440, 0x8430, 0x8430, 0x8430, 0x8430, 0x8420, 0x8420, 0x8410, 0x8410, + 0x8400, 0x8400, 0x8400, 0x8400, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8400, 0x8410, 0x8410, 0x8410, 0x8420, 0x8420, + 0x8430, 0x8430, 0x8420, 0x8440, 0x8440, 0x8440, 0x8450, 0x8450, 0x8450, 0x8460, 0x8460, 0x8470, 0x8470, 0x8470, 0x8480, 0x8480, + 0x8490, 0x8480, 0x84A0, 0x84B0, 0x84C0, 0x84D0, 0x84E0, 0x8500, 0x8520, 0x8580, 0x8650, 0x8830, 0x8CF0, 0x93F0, 0x9BC0, 0xA250, + 0xA920, 0xAE40, 0xB340, 0xB830, 0xBC30, 0xC090, 0xC3F0, 0xC710, 0xCA40, 0xCC10, 0xCD50, 0xCDE0, 0xCDF0, 0xCED0, 0xCFD0, 0xD100, + 0xD230, 0xD330, 0xD450, 0xD560, 0xD600, 0xD5D0, 0xD4C0, 0xD400, 0xD280, 0xD130, 0xCFC0, 0xCEF0, 0xCE30, 0xCCB0, 0xC7E0, 0xC660, + 0xC550, 0xC480, 0xC340, 0xC280, 0xC2E0, 0xC320, 0xC4B0, 0xC580, 0xC6E0, 0xC820, 0xC8A0, 0xCA00, 0xCB20, 0xCC90, 0xCF80, 0xD270, + 0xD540, 0xD7B0, 0xDA50, 0xDCB0, 0xDF60, 0xE210, 0xE5B0, 0xEA30, 0xEE60, 0xF300, 0xF660, 0xF890, 0xFA30, 0xFB30, 0xFAB0, 0xFA50, + 0xF9A0, 0xF990, 0xFB40, 0xFE40, 0x0270, 0x0700, 0x0B90, 0x0F90, 0x1190, 0x1250, 0x10E0, 0x0D90, 0x0880, 0x0240, 0xFBD0, 0xF450, + 0xEC80, 0xE3C0, 0xDB00, 0xD180, 0xC6E0, 0xBC00, 0xAFA0, 0xA200, 0x92F0, 0x8850, 0x8550, 0x84E0, 0x84B0, 0x84A0, 0x8490, 0x8480, + 0x8480, 0x8470, 0x8470, 0x8470, 0x8440, 0x8470, 0x8470, 0x8450, 0x8470, 0x8480, 0x8480, 0x8490, 0x8490, 0x84A0, 0x84B0, 0x84C0, + 0x84E0, 0x8500, 0x8540, 0x8600, 0x8810, 0x8E30, 0x9850, 0xA180, 0xAAB0, 0xB260, 0xB930, 0xBF30, 0xC590, 0xCB00, 0xD000, 0xD530, + 0xDA30, 0xDF80, 0xE3D0, 0xE7B0, 0xEB00, 0xEE80, 0xF210, 0xF610, 0xFA30, 0xFE00, 0x01B0, 0x0520, 0x0880, 0x0BB0, 0x0DE0, 0x0F70, + 0x1070, 0x1120, 0x11D0, 0x1280, 0x1330, 0x1440, 0x1580, 0x1670, 0x16B0, 0x1750, 0x1810, 0x1890, 0x1980, 0x1AB0, 0x1C00, 0x1D70, + 0x1F50, 0x2110, 0x2270, 0x2450, 0x25A0, 0x2770, 0x2970, 0x2BB0, 0x2DB0, 0x3040, 0x3320, 0x3590, 0x3800, 0x3AE0, 0x3DD0, 0x4130, + 0x4500, 0x48C0, 0x4C10, 0x4F30, 0x5190, 0x54C0, 0x5730, 0x5A30, 0x5CE0, 0x5F50, 0x6150, 0x6310, 0x6470, 0x65A0, 0x6690, 0x67B0, + 0x68A0, 0x6930, 0x68F0, 0x68B0, 0x68E0, 0x68F0, 0x68D0, 0x6860, 0x67D0, 0x6780, 0x6700, 0x66A0, 0x6600, 0x65D0, 0x6550, 0x6440, + 0x63D0, 0x62E0, 0x6240, 0x6210, 0x6230, 0x6320, 0x6500, 0x6630, 0x66F0, 0x6770, 0x67C0, 0x6770, 0x6750, 0x6790, 0x6820, 0x68D0, + 0x6B30, 0x6E30, 0x7150, 0x75B0, 0x7980, 0x7D00, 0x7EC0, 0x7F10, 0x7EF0, 0x7EF0, 0x7F20, 0x7ED0, 0x7F10, 0x7EB0, 0x7EE0, 0x7F10, + 0x7F20, 0x7F20, 0x7F00, 0x7F10, 0x7F60, 0x7F10, 0x7EF0, 0x7EF0, 0x7EE0, 0x7F40, 0x7F50, 0x7EB0, 0x7F00, 0x7ED0, 0x7F30, 0x7F40, + 0x7EC0, 0x7ED0, 0x7EB0, 0x7F00, 0x7F20, 0x7E90, 0x7EB0, 0x7EE0, 0x7EF0, 0x7F10, 0x7EA0, 0x7F00, 0x7F10, 0x7F10, 0x7F20, 0x7E90, + 0x7F10, 0x7F00, 0x7F00, 0x7F10, 0x7F00, 0x7F30, 0x7F20, 0x7F10, 0x7F20, 0x7F00, 0x7F50, 0x7EF0, 0x7F20, 0x7EE0, 0x7EF0, 0x7F50, + 0x7F00, 0x7F30, 0x7F20, 0x7F00, 0x7F50, 0x7EF0, 0x7EF0, 0x7EE0, 0x7EF0, 0x7F70, 0x7EE0, 0x7EE0, 0x7EF0, 0x7F10, 0x7F60, 0x7EE0, + 0x7E90, 0x7EF0, 0x7EF0, 0x7F30, 0x7EB0, 0x7EA0, 0x7EE0, 0x7EF0, 0x7F30, 0x7F20, 0x7EC0, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7EB0, + 0x7F20, 0x7EE0, 0x7EF0, 0x7F10, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F40, 0x7F10, 0x7F90, 0x7F00, 0x7F20, 0x7EF0, 0x7EF0, 0x7F80, + 0x7F10, 0x7F20, 0x7F00, 0x7ED0, 0x7F30, 0x7F00, 0x7EE0, 0x7F10, 0x7EF0, 0x7F60, 0x7EF0, 0x7ED0, 0x7EF0, 0x7F00, 0x7F40, 0x7F10, + 0x7C60, 0x7A40, 0x7A50, 0x7BF0, 0x7EA0, 0x7EA0, 0x7ED0, 0x7F10, 0x7F20, 0x7F00, 0x7EC0, 0x7F00, 0x7F20, 0x7F10, 0x7F10, 0x7F00, + 0x7F20, 0x7840, 0x6DB0, 0x6740, 0x6280, 0x6130, 0x63F0, 0x6980, 0x7110, 0x7810, 0x7D70, 0x7F20, 0x7F10, 0x7F10, 0x7EF0, 0x7F50, + 0x7EF0, 0x7F20, 0x7F20, 0x7F00, 0x7F60, 0x7EC0, 0x7840, 0x6ED0, 0x6430, 0x57F0, 0x4AC0, 0x3C90, 0x2F30, 0x20C0, 0x15F0, 0x0F90, + 0x0F40, 0x1580, 0x2090, 0x2F70, 0x41E0, 0x5550, 0x6AB0, 0x7B70, 0x7EF0, 0x7EF0, 0x7EB0, 0x7F20, 0x7F10, 0x7F10, 0x7F10, 0x7E90, + 0x7F00, 0x7EF0, 0x7EF0, 0x7F10, 0x7F00, 0x7F40, 0x7F00, 0x7F10, 0x7F20, 0x7F00, 0x7F50, 0x7F10, 0x7EF0, 0x7F10, 0x7E60, 0x7900, + 0x7380, 0x6FB0, 0x6D30, 0x6CC0, 0x6ED0, 0x7230, 0x7710, 0x7C30, 0x7EB0, 0x7EF0, 0x7EF0, 0x7F90, 0x7F20, 0x7F00, 0x7EF0, 0x7F10, + 0x7F70, 0x7F00, 0x7ED0, 0x7EF0, 0x7EE0, 0x7F40, 0x7EF0, 0x7EB0, 0x7EE0, 0x7ED0, 0x7F30, 0x7F20, 0x7EC0, 0x7ED0, 0x7EF0, 0x7F00, + 0x7EF0, 0x7E90, 0x7EB0, 0x7F00, 0x7EF0, 0x7F10, 0x7EB0, 0x7F20, 0x7F40, 0x7F10, 0x7F20, 0x7EC0, 0x7F10, 0x7F00, 0x7F00, 0x7EF0, + 0x7F10, 0x7F60, 0x7F20, 0x7F10, 0x7F20, 0x7F20, 0x7F60, 0x7F10, 0x7F10, 0x7EE0, 0x7EF0, 0x7F80, 0x7EE0, 0x7EF0, 0x7F10, 0x7F10, + 0x7F70, 0x7F00, 0x7ED0, 0x7F00, 0x7EE0, 0x7F90, 0x7EF0, 0x7EC0, 0x7EF0, 0x7F10, 0x7F30, 0x7EE0, 0x7EC0, 0x7F10, 0x7F00, 0x7F50, + 0x7ED0, 0x7EA0, 0x7F00, 0x7EF0, 0x7F10, 0x7F20, 0x7F00, 0x7F20, 0x7F00, 0x7F10, 0x7F10, 0x7EA0, 0x7F20, 0x7ED0, 0x70B0, 0x6130, + 0x4F00, 0x3F90, 0x3280, 0x29A0, 0x2560, 0x25D0, 0x2910, 0x2F20, 0x3640, 0x3EB0, 0x46E0, 0x4F40, 0x5810, 0x60F0, 0x6940, 0x6FA0, + 0x73F0, 0x75B0, 0x73D0, 0x7010, 0x6A30, 0x6270, 0x59E0, 0x5110, 0x48B0, 0x40A0, 0x3910, 0x31B0, 0x2C20, 0x2800, 0x25D0, 0x2470, + 0x2460, 0x24C0, 0x25B0, 0x26B0, 0x26F0, 0x2720, 0x2540, 0x2350, 0x20D0, 0x1DA0, 0x1A70, 0x1600, 0x1160, 0x0D20, 0x08C0, 0x05D0, + 0x02D0, 0x0020, 0xFD90, 0xFB40, 0xF9D0, 0xF820, 0xF640, 0xF3B0, 0xF090, 0xED20, 0xE8C0, 0xE370, 0xDD20, 0xD5F0, 0xCE50, 0xC720, + 0xC020, 0xBA20, 0xB480, 0xB0A0, 0xADD0, 0xAAE0, 0xA7F0, 0xA460, 0xA040, 0x9BB0, 0x96B0, 0x9200, 0x8E10, 0x8B80, 0x89B0, 0x88D0, + 0x88A0, 0x8910, 0x8A40, 0x8C60, 0x9080, 0x9580, 0x9B40, 0xA140, 0xA7C0, 0xADF0, 0xB560, 0xBC30, 0xC2E0, 0xC900, 0xCEC0, 0xD510, + 0xDA80, 0xDF80, 0xE540, 0xE980, 0xEE20, 0xF1D0, 0xF590, 0xF990, 0xFD40, 0x00F0, 0x0420, 0x06B0, 0x0A30, 0x0C30, 0x0EA0, 0x1000, + 0x10D0, 0x10D0, 0x10E0, 0x1190, 0x1290, 0x13C0, 0x1490, 0x1520, 0x1570, 0x14F0, 0x1450, 0x1430, 0x14A0, 0x1690, 0x1850, 0x1A70, + 0x1CC0, 0x1DD0, 0x1F40, 0x2020, 0x20C0, 0x2190, 0x2290, 0x2360, 0x2310, 0x21B0, 0x1FE0, 0x1C60, 0x17C0, 0x1210, 0x0B60, 0x03A0, + 0xFA90, 0xF220, 0xEA20, 0xE190, 0xDA10, 0xD270, 0xCBA0, 0xC590, 0xC0E0, 0xBD80, 0xBB60, 0xBB30, 0xBB40, 0xBC10, 0xBEF0, 0xC2A0, + 0xC7C0, 0xCCC0, 0xD320, 0xD7C0, 0xDB90, 0xDF80, 0xE290, 0xE570, 0xE950, 0xEC00, 0xEEF0, 0xF090, 0xF1D0, 0xF200, 0xF0F0, 0xEF30, + 0xEBD0, 0xE720, 0xE120, 0xD7B0, 0xCED0, 0xC480, 0xB990, 0xAE00, 0xA200, 0x95D0, 0x8BD0, 0x86B0, 0x8550, 0x84F0, 0x84D0, 0x84B0, + 0x84A0, 0x8490, 0x8490, 0x8480, 0x8480, 0x8470, 0x8460, 0x8470, 0x8470, 0x8460, 0x8460, 0x8460, 0x8470, 0x8460, 0x8470, 0x8470, + 0x8470, 0x8470, 0x8470, 0x8480, 0x8480, 0x8490, 0x8490, 0x84A0, 0x84B0, 0x84B0, 0x84D0, 0x84F0, 0x8530, 0x85C0, 0x87E0, 0x9080, + 0x9D20, 0xA9F0, 0xB740, 0xC430, 0xD0E0, 0xDD70, 0xEA00, 0xF670, 0x0350, 0x0F60, 0x1B10, 0x2630, 0x30C0, 0x54E0, 0x5CC0, 0x63B0, + 0x6A20, 0x70D0, 0x7630, 0x7AA0, 0x7DD0, 0x7EF0, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F00, 0x7F30, 0x7F30, + 0x7F30, 0x7F40, 0x7F40, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7EE0, 0x7CC0, 0x7990, 0x75E0, 0x7140, 0x6BA0, 0x6690, 0x61F0, 0x5E20, + 0x5B40, 0x58D0, 0x56D0, 0x55A0, 0x55E0, 0x56E0, 0x58C0, 0x5B50, 0x5E30, 0x6170, 0x6470, 0x6820, 0x6B50, 0x6E10, 0x7120, 0x7410, + 0x76D0, 0x7990, 0x7B70, 0x7D80, 0x7EB0, 0x7F10, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F30, 0x7F20, 0x7F40, + 0x7F30, 0x7F20, 0x7F40, 0x7F10, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F10, + 0x7F20, 0x7F20, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F10, 0x7F20, 0x7F20, 0x7F40, 0x7F30, 0x7F10, 0x7F20, + 0x7F40, 0x7F10, 0x7F30, 0x7F00, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F20, + 0x7F30, 0x7F30, 0x7F70, 0x7F40, 0x7EC0, 0x7F10, 0x7F40, 0x7F50, 0x7F10, 0x7E70, 0x7EF0, 0x7EF0, 0x7EF0, 0x7F00, 0x7E80, 0x7EC0, + 0x7F00, 0x7F20, 0x7EE0, 0x7980, 0x7270, 0x6B70, 0x6460, 0x5E80, 0x57A0, 0x52E0, 0x4E10, 0x4900, 0x44A0, 0x3F80, 0x3910, 0x32B0, + 0x2BC0, 0x2450, 0x1D70, 0x1740, 0x12C0, 0x0F30, 0x0E20, 0x0E60, 0x0FD0, 0x1280, 0x15A0, 0x1970, 0x1D30, 0x2120, 0x25E0, 0x2B80, + 0x3330, 0x3BB0, 0x45A0, 0x5160, 0x5C40, 0x66F0, 0x70B0, 0x7930, 0x7EC0, 0x7E90, 0x7EF0, 0x7F00, 0x7EF0, 0x7EF0, 0x7EB0, 0x7EE0, + 0x7EC0, 0x7F10, 0x7F10, 0x7EA0, 0x7F00, 0x7F10, 0x7F00, 0x7EF0, 0x7EC0, 0x7F10, 0x7F20, 0x7F40, 0x7F10, 0x7F10, 0x7F40, 0x7F10, + 0x7F10, 0x7F00, 0x7EF0, 0x7F50, 0x7F10, 0x7F20, 0x7F10, 0x7BB0, 0x6DA0, 0x5F10, 0x5010, 0x4220, 0x3420, 0x26E0, 0x1AC0, 0x0F60, + 0x03D0, 0xF9A0, 0xEFA0, 0xE650, 0xDCF0, 0xD2F0, 0xC8B0, 0xBD30, 0xB010, 0x9FD0, 0x8FE0, 0x8720, 0x8520, 0x84E0, 0x84C0, 0x84C0, + 0x84A0, 0x8490, 0x8480, 0x8480, 0x8480, 0x8480, 0x8470, 0x8480, 0x8480, 0x8480, 0x8480, 0x8490, 0x8490, 0x84A0, 0x84B0, 0x84C0, + 0x84E0, 0x8510, 0x8590, 0x8790, 0x9180, 0x9FA0, 0xABC0, 0xB700, 0xC0D0, 0xCA90, 0xD3A0, 0xDC60, 0xE4E0, 0xEE90, 0xF7E0, 0x0110, + 0x0A10, 0x11E0, 0x1840, 0x1DD0, 0x2210, 0x2530, 0x2880, 0x2B90, 0x2FA0, 0x33E0, 0x3A70, 0x4230, 0x4AD0, 0x5440, 0x5C90, 0x6580, + 0x6C20, 0x7150, 0x7610, 0x7960, 0x7C40, 0x7E50, 0x7EF0, 0x7F00, 0x7E90, 0x7ED0, 0x7D60, 0x78A0, 0x72D0, 0x6AD0, 0x61E0, 0x57E0, + 0x4C10, 0x3F40, 0x3380, 0x2800, 0x1CE0, 0x1260, 0x0950, 0x0030, 0xF750, 0xEF20, 0xE690, 0xE030, 0xDA90, 0xD5A0, 0xD290, 0xD110, + 0xD100, 0xD320, 0xD6D0, 0xDE70, 0xE750, 0xF230, 0xFEB0, 0x0C60, 0x1B70, 0x2A40, 0x39E0, 0x4820, 0x55D0, 0x7B20, 0x7ED0, 0x7EF0, + 0x7F10, 0x7F10, 0x7F00, 0x7F40, 0x7EF0, 0x7F10, 0x7F20, 0x7F00, 0x7F90, 0x7EE0, 0x7EC0, 0x7F10, 0x7F20, 0x7960, 0x6550, 0x4C50, + 0x3100, 0x1480, 0xF650, 0xDB30, 0xC040, 0xA750, 0x9020, 0x8690, 0x8510, 0x84E0, 0x84C0, 0x84B0, 0x84B0, 0x84A0, 0x84A0, 0x84A0, + 0x84A0, 0x84A0, 0x84A0, 0x84B0, 0x84B0, 0x84C0, 0x84C0, 0x84E0, 0x84F0, 0x8510, 0x8550, 0x8600, 0x87D0, 0x8DF0, 0x9850, 0xA390, + 0xADF0, 0xB820, 0xC1F0, 0xCB70, 0xD490, 0xDCC0, 0xE5A0, 0xECC0, 0xF2D0, 0xF850, 0xFC20, 0x00A0, 0x0390, 0x05B0, 0x07A0, 0x0740, + 0x0640, 0x0410, 0x0020, 0xFC80, 0xF790, 0xF250, 0xEC60, 0xE660, 0xDE30, 0xD4A0, 0xCA10, 0xBE10, 0xB0B0, 0xA230, 0x9340, 0x88E0, + 0x85B0, 0x8500, 0x84E0, 0x84C0, 0x84B0, 0x84A0, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8480, 0x8490, 0x8490, 0x8490, 0x84A0, + 0x84A0, 0x84B0, 0x84C0, 0x84F0, 0x8510, 0x8570, 0x86B0, 0x8B50, 0x9690, 0xA2D0, 0xAEE0, 0xBA00, 0xC580, 0xCF80, 0xD920, 0xE210, + 0xEBD0, 0xF570, 0xFFA0, 0x0AC0, 0x1680, 0x2400, 0x2F90, 0x39E0, 0x42B0, 0x4A00, 0x50C0, 0x5510, 0x57A0, 0x5860, 0x5500, 0x4F20, + 0x4480, 0x3690, 0x2730, 0x1660, 0x0500, 0xF4B0, 0xE530, 0xD580, 0xC820, 0xBD20, 0xB340, 0xAAF0, 0xA460, 0x9FE0, 0x9C00, 0x9920, + 0x9780, 0x9670, 0x9630, 0x9510, 0x9500, 0x9520, 0x94A0, 0x9300, 0x8F70, 0x8B70, 0x8840, 0x8650, 0x8570, 0x8510, 0x8520, 0x84D0, + 0x84C0, 0x84B0, 0x84A0, 0x84C0, 0x8490, 0x8480, 0x8470, 0x8470, 0x8470, 0x8460, 0x8460, 0x8460, 0x8460, 0x8470, 0x8470, 0x8470, + 0x8470, 0x8470, 0x84A0, 0x8480, 0x8480, 0x8490, 0x8490, 0x84A0, 0x84B0, 0x84C0, 0x84C0, 0x84E0, 0x8500, 0x8530, 0x8580, 0x8660, + 0x8890, 0x8F70, 0x9AF0, 0xA710, 0xB340, 0xBE80, 0xC970, 0xD0D0, 0xD590, 0xD7D0, 0xD740, 0xD4C0, 0xCF20, 0xC770, 0xBE20, 0xB1F0, + 0xA3F0, 0x9430, 0x88B0, 0x8560, 0x84E0, 0x84C0, 0x84A0, 0x8490, 0x8480, 0x8470, 0x8460, 0x8460, 0x8450, 0x8460, 0x8450, 0x8450, + 0x8460, 0x8450, 0x8460, 0x8460, 0x8460, 0x8470, 0x8470, 0x8480, 0x8480, 0x8490, 0x84A0, 0x84B0, 0x84B0, 0x84C0, 0x84D0, 0x84F0, + 0x8550, 0x8550, 0x85A0, 0x8620, 0x86B0, 0x8710, 0x8780, 0x87B0, 0x87C0, 0x87E0, 0x87B0, 0x8790, 0x8760, 0x8700, 0x86D0, 0x86A0, + 0x8680, 0x8670, 0x8650, 0x8630, 0x8610, 0x85F0, 0x8560, 0x8580, 0x8550, 0x8530, 0x8510, 0x84F0, 0x8500, 0x84D0, 0x84C0, 0x8480, + 0x84A0, 0x8490, 0x8490, 0x8480, 0x8480, 0x8470, 0x8470, 0x8470, 0x8460, 0x8470, 0x8470, 0x8470, 0x8470, 0x8480, 0x8490, 0x84A0, + 0x84C0, 0x84D0, 0x8500, 0x8540, 0x8610, 0x8810, 0x8D90, 0x9770, 0xA050, 0xA890, 0xB030, 0xB560, 0xB920, 0xBAF0, 0xBC50, 0xBCC0, + 0xBC60, 0xBB10, 0xB980, 0xB6D0, 0xB3F0, 0xAF60, 0xA9C0, 0xA390, 0x9CA0, 0x94E0, 0x8DF0, 0x88F0, 0x8660, 0x8560, 0x8500, 0x84E0, + 0x84C0, 0x84B0, 0x84A0, 0x8490, 0x8490, 0x8480, 0x8480, 0x8480, 0x8470, 0x8470, 0x8480, 0x8480, 0x8480, 0x8480, 0x8490, 0x84A0, + 0x84A0, 0x84C0, 0x84D0, 0x8500, 0x8540, 0x85F0, 0x8750, 0x8A20, 0x8E60, 0x9370, 0x9960, 0x9F80, 0xA5F0, 0xACD0, 0xB2A0, 0xB690, + 0xB820, 0xB6D0, 0xB190, 0xA7E0, 0x9B20, 0x8D70, 0x8630, 0x8500, 0x84C0, 0x84B0, 0x8490, 0x8480, 0x8470, 0x8470, 0x8470, 0x8480, + 0x8460, 0x8460, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8460, 0x8460, 0x8460, 0x8470, 0x8470, 0x8480, 0x8490, 0x84A0, + 0x84B0, 0x84D0, 0x84F0, 0x8530, 0x8600, 0x8730, 0x8AB0, 0x9160, 0x98C0, 0x9F80, 0xA600, 0xAC70, 0xB260, 0xB7F0, 0xBCE0, 0xC1C0, + 0xC670, 0xCB20, 0xCFB0, 0xD400, 0xD820, 0xDBA0, 0xDEB0, 0xE1B0, 0xE500, 0xE780, 0xE8E0, 0xE960, 0xE6E0, 0xE500, 0xE310, 0xE050, + 0xDD10, 0xD930, 0xD4C0, 0xD0D0, 0xCCE0, 0xC880, 0xC560, 0xC2E0, 0xBFE0, 0xBCA0, 0xB9D0, 0xB740, 0xB490, 0xB200, 0xAFD0, 0xAE20, + 0xADE0, 0xADB0, 0xADF0, 0xADF0, 0xAE40, 0xAE90, 0xAEA0, 0xAED0, 0xAFC0, 0xB090, 0xB190, 0xB2C0, 0xB4C0, 0xB6B0, 0xB920, 0xBBA0, + 0xBE00, 0xBFF0, 0xC220, 0xC430, 0xC710, 0xC9F0, 0xCD00, 0xD050, 0xD3F0, 0xD6D0, 0xDA40, 0xDC70, 0xDE80, 0xE0F0, 0xE360, 0xE590, + 0xE750, 0xE9A0, 0xEB80, 0xED80, 0xEFC0, 0xF180, 0xF330, 0xF470, 0xF5E0, 0xF7C0, 0xF930, 0xFAD0, 0xFC60, 0xFCF0, 0xFD30, 0xFD80, + 0xFD60, 0xFD90, 0xFD30, 0xFD90, 0xFDA0, 0xFDB0, 0xFDB0, 0xFCE0, 0xFCD0, 0xFCB0, 0xFC10, 0xFC20, 0xFBC0, 0xFC60, 0xFCD0, 0xFCD0, + 0xFDB0, 0xFE20, 0xFEA0, 0xFE90, 0xFE60, 0xFF60, 0x0040, 0x0190, 0x02A0, 0x0420, 0x0640, 0x0860, 0x0A70, 0x0CC0, 0x0EF0, 0x11F0, + 0x1560, 0x1870, 0x1B70, 0x1F80, 0x23F0, 0x28F0, 0x2EA0, 0x3510, 0x3AD0, 0x4130, 0x4660, 0x4C50, 0x5200, 0x5640, 0x5B60, 0x5F90, + 0x63B0, 0x67A0, 0x6A50, 0x6D30, 0x6F60, 0x7070, 0x71C0, 0x7210, 0x72A0, 0x7300, 0x7210, 0x7150, 0x6F60, 0x6E00, 0x6BB0, 0x68B0, + 0x6660, 0x6340, 0x6080, 0x5DB0, 0x5AD0, 0x5910, 0x5800, 0x5800, 0x5950, 0x5B90, 0x5F70, 0x63C0, 0x68F0, 0x6F20, 0x74E0, 0x7B60, + 0x7ED0, 0x7F60, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7F50, 0x7F10, 0x7F10, 0x7EE0, 0x7EF0, 0x7EF0, 0x7280, 0x6460, 0x55C0, 0x44A0, + 0x3560, 0x26F0, 0x1910, 0x0DB0, 0x02E0, 0xFA10, 0xF400, 0xEF60, 0xEC90, 0xEB60, 0xEAB0, 0xEB00, 0xEBD0, 0xED30, 0xEEB0, 0xF020, + 0xF350, 0xF700, 0xFB40, 0x00B0, 0x05E0, 0x0BA0, 0x1090, 0x1610, 0x1BE0, 0x2140, 0x2810, 0x2E80, 0x3570, 0x3B40, 0x40D0, 0x45F0, + 0x49C0, 0x4CD0, 0x4F10, 0x5040, 0x50D0, 0x5010, 0x4E90, 0x4C60, 0x4940, 0x4610, 0x4100, 0x3A70, 0x3270, 0x2910, 0x1E40, 0x1270, + 0x05B0, 0xF920, 0xEC20, 0xDFC0, 0xD450, 0xC8A0, 0xBF20, 0xB610, 0xAE20, 0xA6F0, 0xA020, 0x9B80, 0x9770, 0x9440, 0x9170, 0x8F00, + 0x8D40, 0x8B90, 0x8A80, 0x8990, 0x88F0, 0x88A0, 0x8830, 0x87F0, 0x87D0, 0x8790, 0x8780, 0x8740, 0x8700, 0x86C0, 0x86B0, 0x8710, + 0x8770, 0x87F0, 0x88B0, 0x89E0, 0x8C00, 0x8EE0, 0x9270, 0x9600, 0x98A0, 0x9A70, 0x9B90, 0x9C20, 0x9C30, 0x9BF0, 0x9BF0, 0x9A70, + 0x99B0, 0x9850, 0x9620, 0x9480, 0x9240, 0x90F0, 0x8FA0, 0x8E50, 0x8DA0, 0x8D00, 0x8C40, 0x8B90, 0x8B00, 0x8AA0, 0x8A60, 0x8A50, + 0x8AB0, 0x8B70, 0x8CC0, 0x8F10, 0x9210, 0x95C0, 0x9A10, 0x9EB0, 0xA320, 0xA950, 0xAF30, 0xB4A0, 0xBB60, 0xC150, 0xC800, 0xCEA0, + 0xD470, 0xDAB0, 0xE140, 0xE750, 0xED70, 0xF1D0, 0xF6C0, 0xFAB0, 0xFF30, 0x0450, 0x0920, 0x0F10, 0x13C0, 0x18C0, 0x1DF0, 0x23D0, + 0x2AA0, 0x30C0, 0x36F0, 0x3BB0, 0x3FF0, 0x44B0, 0x4870, 0x4CF0, 0x50D0, 0x5430, 0x5870, 0x5C00, 0x5F70, 0x6330, 0x65C0, 0x68C0, + 0x6B50, 0x6D70, 0x6FE0, 0x7110, 0x72B0, 0x7430, 0x7540, 0x7630, 0x7600, 0x7620, 0x7650, 0x7650, 0x76B0, 0x7640, 0x75C0, 0x7520, + 0x7420, 0x7380, 0x7290, 0x7170, 0x6FE0, 0x6D10, 0x6B80, 0x68A0, 0x6510, 0x62B0, 0x5EB0, 0x5B60, 0x57F0, 0x5490, 0x50B0, 0x4C80, + 0x4890, 0x44F0, 0x4140, 0x3E20, 0x3B80, 0x3980, 0x3760, 0x3590, 0x34F0, 0x33B0, 0x33D0, 0x3390, 0x3430, 0x3540, 0x3590, 0x3710, + 0x38A0, 0x3A40, 0x3C30, 0x3DE0, 0x3F60, 0x4000, 0x40B0, 0x41B0, 0x4240, 0x42D0, 0x4270, 0x4100, 0x3FD0, 0x3E00, 0x3C60, 0x3C10, + 0x3BD0, 0x3CB0, 0x3D60, 0x3E50, 0x3F50, 0x4090, 0x4210, 0x4320, 0x4460, 0x45D0, 0x4710, 0x4770, 0x4660, 0x4470, 0x4230, 0x3EB0, + 0x3B70, 0x3780, 0x3380, 0x2FA0, 0x2C00, 0x28F0, 0x2600, 0x21F0, 0x1F10, 0x1B70, 0x1830, 0x14C0, 0x1150, 0x0DB0, 0x0860, 0x0290, + 0xFB10, 0xF2F0, 0xEB20, 0xE330, 0xDCD0, 0xD820, 0xD4C0, 0xD330, 0xD300, 0xD3B0, 0xD450, 0xD5E0, 0xD8C0, 0xDC60, 0xE0B0, 0xE5B0, + 0xEBC0, 0xF380, 0xFC40, 0x04F0, 0x0E80, 0x1820, 0x22C0, 0x2D90, 0x37F0, 0x4160, 0x48F0, 0x5150, 0x5670, 0x5A60, 0x5CF0, 0x5D90, + 0x5D20, 0x5AA0, 0x55F0, 0x4ED0, 0x4420, 0x39A0, 0x2D50, 0x2030, 0x11E0, 0x01F0, 0xF270, 0xE280, 0xD3A0, 0xC4D0, 0xB840, 0xACB0, + 0xA250, 0x9890, 0x90D0, 0x8B30, 0x8840, 0x86C0, 0x8600, 0x85C0, 0x8590, 0x8590, 0x8550, 0x8590, 0x85B0, 0x85D0, 0x8610, 0x85E0, + 0x85F0, 0x8610, 0x8630, 0x8650, 0x86A0, 0x86C0, 0x86E0, 0x86E0, 0x86C0, 0x86C0, 0x86B0, 0x86A0, 0x8690, 0x8670, 0x8660, 0x8640, + 0x8640, 0x8630, 0x8620, 0x8630, 0x8640, 0x8650, 0x8660, 0x8670, 0x86A0, 0x8700, 0x87B0, 0x88C0, 0x8AB0, 0x8DE0, 0x9200, 0x9730, + 0x9D00, 0xA2F0, 0xA940, 0xB040, 0xB7C0, 0xBF30, 0xC6F0, 0xD150, 0xD930, 0xE140, 0xE880, 0xEF50, 0xF680, 0xFD80, 0x0550, 0x0DD0, + 0x1600, 0x1F00, 0x28F0, 0x3280, 0x3BC0, 0x4520, 0x4EF0, 0x57F0, 0x6060, 0x6840, 0x6F40, 0x7520, 0x7970, 0x7CB0, 0x7E70, 0x7EE0, + 0x7F00, 0x7ED0, 0x7D90, 0x7A20, 0x74D0, 0x6E70, 0x6720, 0x5E40, 0x5430, 0x48B0, 0x3CE0, 0x2FA0, 0x2210, 0x1440, 0x0760, 0xFBD0, + 0xF0D0, 0xE720, 0xDF80, 0xD8F0, 0xD3B0, 0xCF60, 0xCC40, 0xCA70, 0xC960, 0xC910, 0xC910, 0xC9B0, 0xCAC0, 0xCB70, 0xCBD0, 0xCC50, + 0xCBE0, 0xCAD0, 0xCA30, 0xC8B0, 0xC820, 0xC780, 0xC7B0, 0xC810, 0xC7B0, 0xC7B0, 0xC6E0, 0xC600, 0xC580, 0xC4B0, 0xC420, 0xC2C0, + 0xC120, 0xBE90, 0xBC20, 0xBA20, 0xB8D0, 0xB830, 0xB6C0, 0xB530, 0xB310, 0xB090, 0xADE0, 0xAB70, 0xA930, 0xA740, 0xA5A0, 0xA470, + 0xA2E0, 0xA190, 0xA0E0, 0xA0C0, 0xA030, 0x9F50, 0x9E20, 0x9DA0, 0x9D10, 0x9C00, 0x9AF0, 0x98C0, 0x95F0, 0x9360, 0x90A0, 0x8E90, + 0x8D10, 0x8BB0, 0x8AF0, 0x8AD0, 0x8AB0, 0x8A70, 0x8AE0, 0x8BC0, 0x8E60, 0x9320, 0x9A90, 0xA440, 0xAE60, 0xB940, 0xC560, 0xD130, + 0xDC70, 0xE730, 0xF150, 0xFAB0, 0x0340, 0x0AC0, 0x1130, 0x18C0, 0x1FF0, 0x2770, 0x2E00, 0x3340, 0x35B0, 0x3300, 0x29C0, 0x1A80, + 0x0530, 0xEF70, 0xDB20, 0xCB20, 0xBF60, 0xB730, 0xB1C0, 0xAD00, 0xA810, 0xA180, 0x9AE0, 0x93D0, 0x8DD0, 0x89C0, 0x8760, 0x8610, + 0x8580, 0x8530, 0x8500, 0x84E0, 0x84D0, 0x84C0, 0x84B0, 0x84B0, 0x84A0, 0x84A0, 0x8490, 0x8490, 0x8490, 0x8480, 0x8480, 0x8470, + 0x8450, 0x8470, 0x8470, 0x8470, 0x8490, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8480, 0x8480, 0x8490, 0x84A0, 0x84B0, + 0x84C0, 0x84F0, 0x8570, 0x8920, 0x9F80, 0xB7A0, 0xD0A0, 0xE550, 0xF730, 0x0670, 0x1340, 0x1E90, 0x2860, 0x2FC0, 0x35F0, 0x3930, + 0x3900, 0x3590, 0x3010, 0x29B0, 0x2220, 0x19D0, 0x11C0, 0x08A0, 0x0040, 0xF7C0, 0xEE70, 0xCB00, 0xBE20, 0xAFA0, 0x9EE0, 0x8E30, + 0x8630, 0x84F0, 0x84C0, 0x84A0, 0x8490, 0x8480, 0x8470, 0x8480, 0x8470, 0x8470, 0x8470, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, + 0x8480, 0x8470, 0x8470, 0x8470, 0x8460, 0x8460, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8440, 0x8440, 0x8440, 0x8440, 0x8430, + 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8420, 0x8430, 0x8420, 0x8420, 0x8430, 0x8420, 0x8430, 0x8430, + 0x8430, 0x8430, 0x8430, 0x8430, 0x8440, 0x8440, 0x8440, 0x8450, 0x8450, 0x8460, 0x8460, 0x8470, 0x8470, 0x8470, 0x8470, 0x8490, + 0x8490, 0x84A0, 0x84A0, 0x84B0, 0x84C0, 0x84D0, 0x84F0, 0x8510, 0x8540, 0x85B0, 0x8690, 0x8860, 0x8C40, 0x9260, 0x99A0, 0xA000, + 0xA650, 0xABD0, 0xB020, 0xB400, 0xB710, 0xBAA0, 0xBDC0, 0xC070, 0xC430, 0xC770, 0xC8F0, 0xCA00, 0xC940, 0xC860, 0xC600, 0xC3B0, + 0xC0C0, 0xBE50, 0xBCC0, 0xBB90, 0xB9D0, 0xB870, 0xB770, 0xB6B0, 0xB5C0, 0xB650, 0xB7E0, 0xBB70, 0xBFA0, 0xC4A0, 0xC9E0, 0xCF00, + 0xD400, 0xDA20, 0xE0B0, 0xE770, 0xEEF0, 0xF690, 0xFE90, 0x0570, 0x0BF0, 0x1320, 0x18D0, 0x2000, 0x26C0, 0x2D20, 0x3350, 0x39E0, + 0x4010, 0x45B0, 0x4B70, 0x5160, 0x55C0, 0x5B10, 0x5FD0, 0x6460, 0x6950, 0x6D00, 0x7080, 0x73A0, 0x75D0, 0x7830, 0x79B0, 0x7B20, + 0x7BD0, 0x7C60, 0x7D40, 0x7D90, 0x7DF0, 0x7DC0, 0x7DC0, 0x7D90, 0x7D90, 0x7D40, 0x7C90, 0x7BB0, 0x7AB0, 0x78E0, 0x7650, 0x7310, + 0x6EE0, 0x56F0, 0x4F30, 0x4870, 0x4180, 0x3AB0, 0x3430, 0x2E60, 0x29A0, 0x25C0, 0x2290, 0x1FD0, 0x1CC0, 0x1AE0, 0x19C0, 0x1930, + 0x1AA0, 0x1C40, 0x1F50, 0x2230, 0x2570, 0x2960, 0x2D10, 0x3120, 0x3560, 0x39F0, 0x4100, 0x46A0, 0x4CC0, 0x52D0, 0x58B0, 0x5F20, + 0x6540, 0x6A90, 0x6FF0, 0x7490, 0x78F0, 0x7BC0, 0x7DC0, 0x7EC0, 0x7ED0, 0x7EF0, 0x7EE0, 0x7EF0, 0x7E70, 0x7E20, 0x7E40, 0x7EB0, + 0x7F30, 0x7F00, 0x7F00, 0x7F10, 0x7EF0, 0x7DB0, 0x79A0, 0x7400, 0x6D90, 0x6750, 0x6260, 0x5EA0, 0x5D80, 0x5E80, 0x6120, 0x64C0, + 0x69C0, 0x6F10, 0x7570, 0x7BE0, 0x7EF0, 0x7F00, 0x7EA0, 0x7EF0, 0x7F10, 0x7F20, 0x7F00, 0x7EC0, 0x7F10, 0x7F00, 0x7EF0, 0x7F10, + 0x7EA0, 0x7F20, 0x7EF0, 0x7F10, 0x7F20, 0x7F20, 0x7F50, 0x7F10, 0x7F10, 0x7F40, 0x7F10, 0x7F60, 0x7EE0, 0x7F10, 0x7F10, 0x7F10, + 0x7F60, 0x7F10, 0x7F40, 0x7F10, 0x7F00, 0x7F60, 0x7EF0, 0x7EF0, 0x7F00, 0x7F00, 0x7F60, 0x7F00, 0x7F10, 0x7EF0, 0x7EE0, 0x7F60, + 0x7F10, 0x7EB0, 0x7EE0, 0x7EE0, 0x7F30, 0x7EF0, 0x7E90, 0x7ED0, 0x7F00, 0x7F10, 0x7F10, 0x7E90, 0x7F00, 0x6050, 0x4390, 0x3110, + 0x2800, 0x27C0, 0x2E40, 0x39A0, 0x4900, 0x59D0, 0x6BD0, 0x79E0, 0x7F10, 0x7F10, 0x7F00, 0x7F60, 0x7EF0, 0x7F10, 0x7F10, 0x7EF0, + 0x7F50, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F30, 0x7D20, 0x6360, 0x3EB0, 0x14E0, 0xE7D0, 0xBAD0, 0x9200, 0x8570, 0x84E0, 0x84C0, + 0x84B0, 0x84B0, 0x84B0, 0x84C0, 0x84D0, 0x84D0, 0x84E0, 0x84F0, 0x8510, 0x8520, 0x8540, 0x8560, 0x8570, 0x8550, 0x8530, 0x8520, + 0x8510, 0x84F0, 0x84F0, 0x84F0, 0x84F0, 0x8500, 0x8500, 0x8520, 0x8560, 0x85E0, 0x8740, 0x8B20, 0x9540, 0x9F20, 0xA860, 0xAFC0, + 0xB4F0, 0xB8E0, 0xBA80, 0xBB50, 0xBA60, 0xB830, 0xB450, 0xAEF0, 0xA7D0, 0x9F40, 0x95F0, 0x8DD0, 0x88A0, 0x8670, 0x8590, 0x8540, + 0x8520, 0x8500, 0x8500, 0x84F0, 0x84E0, 0x84E0, 0x84D0, 0x84D0, 0x84D0, 0x84D0, 0x84E0, 0x84E0, 0x84E0, 0x84F0, 0x84F0, 0x8500, + 0x8510, 0x8520, 0x8550, 0x8580, 0x85E0, 0x8670, 0x8770, 0x8930, 0x8C40, 0x9130, 0x9580, 0x9A80, 0x9F60, 0xA3C0, 0xA8A0, 0xAD80, + 0xB240, 0xB710, 0xBB20, 0xBF10, 0xC200, 0xC510, 0xC820, 0xCAC0, 0xCD40, 0xCF80, 0xD160, 0xD380, 0xD520, 0xD7E0, 0xDA40, 0xDC50, + 0xE000, 0xE3F0, 0xE860, 0xECC0, 0xF230, 0xF780, 0xFC60, 0x0200, 0x07E0, 0x0DC0, 0x1480, 0x1A50, 0x20E0, 0x27F0, 0x2E90, 0x35F0, + 0x3CE0, 0x4450, 0x4BF0, 0x5300, 0x5A40, 0x6040, 0x6760, 0x6DF0, 0x7490, 0x7C00, 0x7ED0, 0x7F10, 0x7EF0, 0x7F10, 0x7F10, 0x7F20, + 0x7F20, 0x7F10, 0x7F30, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F40, 0x7F20, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F10, 0x7F20, 0x7F10, + 0x7F10, 0x7F20, 0x7F40, 0x7F40, 0x7F30, 0x78A0, 0x6A30, 0x5AF0, 0x4C30, 0x3E40, 0x3090, 0x2380, 0x16B0, 0x0B20, 0x00E0, 0xF850, + 0xF230, 0xED70, 0xE8F0, 0xE450, 0xDE30, 0xD810, 0xD280, 0xCD40, 0xCA00, 0xC960, 0xCB50, 0xCFF0, 0xD580, 0xDC30, 0xE330, 0xE9E0, + 0xF000, 0xF410, 0xF620, 0xF510, 0xF230, 0xEC30, 0xE440, 0xDB30, 0xD080, 0xC4A0, 0xB880, 0xAAB0, 0x9D70, 0x90A0, 0x88E0, 0x8630, + 0x8560, 0x8520, 0x8500, 0x84F0, 0x84F0, 0x84F0, 0x84E0, 0x84E0, 0x84E0, 0x84D0, 0x84D0, 0x84D0, 0x84D0, 0x84E0, 0x84E0, 0x84E0, + 0x84E0, 0x84E0, 0x84E0, 0x84E0, 0x84E0, 0x84E0, 0x84E0, 0x84D0, 0x84D0, 0x84D0, 0x84D0, 0x84D0, 0x84D0, 0x84D0, 0x84C0, 0x84C0, + 0x84D0, 0x84D0, 0x84D0, 0x84D0, 0x84D0, 0x8500, 0x84F0, 0x84F0, 0x84B0, 0x8520, 0x8540, 0x8580, 0x85E0, 0x86A0, 0x8800, 0x8AE0, + 0x8FD0, 0x96E0, 0x9D50, 0xA350, 0xA9F0, 0xB080, 0xB640, 0xBBF0, 0xC1D0, 0xC710, 0xCCB0, 0xD310, 0xD870, 0xDD90, 0xE2C0, 0xE740, + 0xEAF0, 0xED80, 0xEFE0, 0xF260, 0xF420, 0xF600, 0xF790, 0xF810, 0xF910, 0xF920, 0xF900, 0xF950, 0xF910, 0xF940, 0xFA40, 0xFB40, + 0xFC20, 0xFD20, 0xFD60, 0xFE10, 0xFF30, 0x0000, 0x00D0, 0x0190, 0x0360, 0x04E0, 0x0640, 0x07F0, 0x08B0, 0x0960, 0x0A00, 0x0A30, + 0x0B60, 0x0C50, 0x0D30, 0x0ED0, 0x1050, 0x12A0, 0x1440, 0x15F0, 0x1810, 0x1A70, 0x1CA0, 0x1F20, 0x22E0, 0x2710, 0x2BB0, 0x31B0, + 0x3760, 0x3D20, 0x4280, 0x4780, 0x4BF0, 0x4FF0, 0x5360, 0x5590, 0x5780, 0x5970, 0x5B70, 0x5DC0, 0x6010, 0x6280, 0x64A0, 0x65A0, + 0x6690, 0x6730, 0x66C0, 0x66D0, 0x6730, 0x6810, 0x68E0, 0x68B0, 0x68B0, 0x6740, 0x6660, 0x6480, 0x62C0, 0x6080, 0x5D10, 0x5A90, + 0x5730, 0x5360, 0x5010, 0x4C10, 0x4780, 0x4280, 0x3C60, 0x36C0, 0x3000, 0x2A50, 0x2420, 0x1D40, 0x1650, 0x0E10, 0x0600, 0xFE40, + 0xF680, 0xF000, 0xE940, 0xE300, 0xDDB0, 0xD790, 0xD1A0, 0xCC50, 0xC730, 0xC2E0, 0xBE60, 0xB9C0, 0xB540, 0xB100, 0xADA0, 0xAA70, + 0xA810, 0xA640, 0xA410, 0xA2D0, 0xA170, 0xA0A0, 0x9F40, 0x9D80, 0x9BA0, 0x9A00, 0x9890, 0x97B0, 0x9700, 0x9760, 0x9720, 0x96E0, + 0x96B0, 0x9570, 0x94B0, 0x9460, 0x94B0, 0x94A0, 0x9440, 0x93E0, 0x9350, 0x92B0, 0x9130, 0x9040, 0x8F00, 0x8DC0, 0x8CA0, 0x8C00, + 0x8B10, 0x8A70, 0x89C0, 0x8940, 0x88E0, 0x8840, 0x87F0, 0x8770, 0x8730, 0x86E0, 0x8660, 0x8640, 0x8620, 0x8600, 0x85E0, 0x85C0, + 0x85A0, 0x8590, 0x8570, 0x8560, 0x8540, 0x8530, 0x8530, 0x8520, 0x8520, 0x8560, 0x8520, 0x8510, 0x8510, 0x8510, 0x8500, 0x8500, + 0x8510, 0x8500, 0x8510, 0x8510, 0x8520, 0x8520, 0x8520, 0x8520, 0x8520, 0x8530, 0x8530, 0x8540, 0x8550, 0x8560, 0x8580, 0x85A0, + 0x85B0, 0x85D0, 0x85D0, 0x85E0, 0x8600, 0x85D0, 0x85E0, 0x85E0, 0x85F0, 0x8610, 0x8630, 0x8660, 0x8680, 0x8680, 0x8690, 0x86B0, + 0x86E0, 0x8710, 0x8760, 0x87D0, 0x8840, 0x88E0, 0x89A0, 0x8A40, 0x8A90, 0x8AB0, 0x8B10, 0x8B60, 0x8C30, 0x8D40, 0x8DB0, 0x8EF0, + 0x8FB0, 0x9010, 0x9090, 0x9120, 0x9230, 0x9350, 0x9410, 0x9560, 0x9680, 0x97A0, 0x9890, 0x9990, 0x9AF0, 0x9B90, 0x9C70, 0x9CD0, + 0x9D10, 0x9D30, 0x9E00, 0x9E40, 0x9D40, 0x9C90, 0x9CD0, 0x9CB0, 0x9C60, 0x9C20, 0x9C10, 0x9BC0, 0x9B70, 0x9B60, 0x9B50, 0x9B60, + 0x9B40, 0x9AD0, 0x9A30, 0x9A20, 0x99B0, 0x99E0, 0x99A0, 0x9930, 0x9810, 0x9720, 0x96C0, 0x9680, 0x96A0, 0x9700, 0x9690, 0x9630, + 0x95C0, 0x94F0, 0x94A0, 0x93A0, 0x9350, 0x9290, 0x91A0, 0x9090, 0x8F50, 0x8E40, 0x8D40, 0x8C90, 0x8C30, 0x8B90, 0x8B40, 0x8AA0, + 0x8A30, 0x89F0, 0x89B0, 0x8970, 0x8940, 0x8930, 0x8980, 0x89D0, 0x8AD0, 0x8BD0, 0x8CC0, 0x8DF0, 0x8EE0, 0x9010, 0x9140, 0x92C0, + 0x9530, 0x9720, 0x9970, 0x9B10, 0x9D20, 0x9F70, 0xA160, 0xA380, 0xA580, 0xA770, 0xA960, 0xAB60, 0xADC0, 0xAF70, 0xB190, 0xB3D0, + 0xB5F0, 0xB840, 0xBA60, 0xBCC0, 0xBF90, 0xC240, 0xC510, 0xC7A0, 0xC910, 0xCBA0, 0xCD70, 0xD060, 0xD2C0, 0xD4F0, 0xD750, 0xDA40, + 0xDCA0, 0xDF30, 0xE1B0, 0xE570, 0xE830, 0xEB90, 0xEF40, 0xF240, 0xF560, 0xF840, 0xFC40, 0xFF50, 0x0390, 0x0870, 0x0CE0, 0x1180, + 0x1630, 0x1A60, 0x1F60, 0x2340, 0x2700, 0x2B40, 0x2FC0, 0x34D0, 0x3960, 0x3D90, 0x41B0, 0x4470, 0x4840, 0x4AF0, 0x4DF0, 0x50E0, + 0x5320, 0x55B0, 0x57B0, 0x59B0, 0x5BC0, 0x5D50, 0x5F30, 0x60E0, 0x61F0, 0x6310, 0x6370, 0x6440, 0x6450, 0x63B0, 0x63C0, 0x6310, + 0x6390, 0x63B0, 0x63A0, 0x63F0, 0x62B0, 0x6220, 0x6140, 0x5FF0, 0x6000, 0x5F20, 0x5E80, 0x5DD0, 0x5C40, 0x5BC0, 0x5A10, 0x5930, + 0x5860, 0x5770, 0x57D0, 0x57A0, 0x5770, 0x5780, 0x56A0, 0x5690, 0x5690, 0x56B0, 0x5760, 0x57C0, 0x5880, 0x58E0, 0x5920, 0x58F0, + 0x57F0, 0x57A0, 0x56A0, 0x55D0, 0x5490, 0x5370, 0x5220, 0x5010, 0x4E70, 0x4D20, 0x4AD0, 0x4980, 0x4780, 0x4540, 0x43D0, 0x4200, + 0x4120, 0x3F10, 0x3D90, 0x3CB0, 0x3BC0, 0x3B40, 0x3A90, 0x3A10, 0x3A40, 0x3A10, 0x3A60, 0x3B20, 0x3B50, 0x3C90, 0x3DA0, 0x3FA0, + 0x40F0, 0x4250, 0x44F0, 0x4700, 0x49A0, 0x4C60, 0x4E10, 0x5170, 0x5460, 0x5860, 0x5C10, 0x5FB0, 0x63B0, 0x6720, 0x6A10, 0x6E30, + 0x71E0, 0x7560, 0x7890, 0x7B70, 0x7DC0, 0x7ED0, 0x7EF0, 0x7EE0, 0x7F60, 0x7EF0, 0x7EB0, 0x7EE0, 0x7EE0, 0x7F50, 0x7F20, 0x7EA0, + 0x7ED0, 0x7ED0, 0x7F10, 0x7F00, 0x7EA0, 0x7EF0, 0x7EC0, 0x7F10, 0x7F10, 0x7EA0, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7EC0, 0x7F10, + 0x7F10, 0x7F00, 0x7EF0, 0x7EF0, 0x7F30, 0x7F20, 0x7F40, 0x7F10, 0x7F20, 0x7F50, 0x7F10, 0x7F10, 0x7F00, 0x7EF0, 0x7F50, 0x7F00, + 0x7F20, 0x7F10, 0x7F10, 0x7F60, 0x7F00, 0x7EF0, 0x7F10, 0x7F00, 0x7F60, 0x7ED0, 0x7EE0, 0x7F10, 0x7F20, 0x7F00, 0x7F10, 0x7F10, + 0x7F00, 0x7F10, 0x7F10, 0x7F20, 0x7F00, 0x7F10, 0x7F20, 0x7F00, 0x7F20, 0x7F20, 0x7F20, 0x7F40, 0x7F10, 0x7F10, 0x7F20, 0x7F10, + 0x7F10, 0x7F30, 0x7F20, 0x7F10, 0x7F30, 0x7F30, 0x7F40, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7970, 0x6FC0, 0x6510, + 0x5AB0, 0x4F70, 0x43C0, 0x3850, 0x2BA0, 0x20D0, 0x1780, 0x0E90, 0x07E0, 0x0200, 0xFDD0, 0xFAF0, 0xF900, 0xF7D0, 0xF790, 0xF7E0, + 0xF7A0, 0xF680, 0xF450, 0xEFB0, 0xE9E0, 0xE250, 0xD820, 0xCE00, 0xC390, 0xB870, 0xAD60, 0xA230, 0x9690, 0x8D20, 0x87F0, 0x8620, + 0x8550, 0x8510, 0x8500, 0x84F0, 0x84E0, 0x84D0, 0x84C0, 0x84C0, 0x84B0, 0x84B0, 0x84A0, 0x84A0, 0x84B0, 0x8490, 0x8490, 0x8490, + 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x84A0, 0x84A0, 0x84B0, 0x84B0, 0x84C0, 0x84C0, 0x84D0, 0x84D0, 0x84E0, 0x84E0, + 0x84F0, 0x8500, 0x8530, 0x8510, 0x8520, 0x8530, 0x8530, 0x8530, 0x8530, 0x8520, 0x8500, 0x8500, 0x84F0, 0x84F0, 0x84F0, 0x8500, + 0x8520, 0x8530, 0x8550, 0x8570, 0x8590, 0x85C0, 0x85E0, 0x8600, 0x8620, 0x8680, 0x8670, 0x8670, 0x8670, 0x8650, 0x8630, 0x8610, + 0x85F0, 0x85E0, 0x85C0, 0x85B0, 0x8590, 0x8580, 0x8570, 0x8560, 0x8560, 0x8560, 0x8560, 0x8570, 0x85C0, 0x85A0, 0x85C0, 0x8600, + 0x8640, 0x86D0, 0x87A0, 0x8920, 0x8B80, 0x8F30, 0x93D0, 0x98D0, 0x9D80, 0xA340, 0xA840, 0xAE00, 0xB330, 0xB820, 0xBCC0, 0xC140, + 0xC4D0, 0xC980, 0xCDD0, 0xD230, 0xD5B0, 0xD900, 0xDBC0, 0xDD40, 0xDED0, 0xE060, 0xE220, 0xE370, 0xE4E0, 0xE6C0, 0xE840, 0xE8E0, + 0xE9A0, 0xEAC0, 0xEAE0, 0xEB40, 0xEAD0, 0xEA30, 0xE9D0, 0xE920, 0xE9D0, 0xEA50, 0xEA20, 0xEA80, 0xEAC0, 0xEB10, 0xEB00, 0xE9F0, + 0xE9C0, 0xE930, 0xE980, 0xE9A0, 0xE9E0, 0xEB10, 0xEC20, 0xEC70, 0xEC50, 0xEC10, 0xEBA0, 0xEB10, 0xEB10, 0xEB50, 0xEBF0, 0xECB0, + 0xEE30, 0xEFF0, 0xF1A0, 0xF250, 0xF3B0, 0xF4D0, 0xF5C0, 0xF710, 0xF800, 0xFA40, 0xFBD0, 0xFD50, 0xFF70, 0x0160, 0x03D0, 0x0650, + 0x08C0, 0x0C00, 0x0DF0, 0x10D0, 0x1310, 0x1570, 0x1840, 0x1A90, 0x1E20, 0x2110, 0x24A0, 0x2890, 0x2C80, 0x3120, 0x3620, 0x3950, + 0x3D50, 0x40B0, 0x4420, 0x4690, 0x4860, 0x4B00, 0x4D80, 0x4F50, 0x5130, 0x5280, 0x5410, 0x54D0, 0x5560, 0x5540, 0x54D0, 0x5510, + 0x5570, 0x5540, 0x5590, 0x5530, 0x5600, 0x56D0, 0x57B0, 0x58E0, 0x5A30, 0x5B30, 0x5C60, 0x5D20, 0x5DD0, 0x5E80, 0x6040, 0x6240, + 0x63F0, 0x6630, 0x6760, 0x68C0, 0x6A00, 0x6AF0, 0x6C70, 0x6D10, 0x6E70, 0x6E70, 0x6F00, 0x6F90, 0x6F30, 0x7000, 0x6FE0, 0x6F80, + 0x6F20, 0x6E80, 0x6D90, 0x6CB0, 0x6C20, 0x6BC0, 0x6A20, 0x68D0, 0x6700, 0x64C0, 0x63B0, 0x6220, 0x6060, 0x5E10, 0x5B90, 0x58E0, + 0x5640, 0x5390, 0x5140, 0x4E90, 0x4CB0, 0x4A70, 0x48F0, 0x4750, 0x4630, 0x46C0, 0x4720, 0x47D0, 0x48B0, 0x48C0, 0x49A0, 0x49D0, + 0x4A70, 0x4B60, 0x4C90, 0x4F10, 0x5240, 0x55C0, 0x5A00, 0x5D70, 0x61E0, 0x6560, 0x6810, 0x6AB0, 0x6C00, 0x6B50, 0x68E0, 0x6340, + 0x5C40, 0x5290, 0x4880, 0x3E00, 0x3320, 0x29D0, 0x2020, 0x1880, 0x1140, 0x0AB0, 0x04E0, 0xFFC0, 0xFB50, 0xF730, 0xF2B0, 0xED00, + 0xE790, 0xE0E0, 0xDA30, 0xD240, 0xCA30, 0xC1C0, 0xB900, 0xB050, 0xA670, 0x89E0, 0x8700, 0x85C0, 0x8540, 0x84F0, 0x84F0, 0x84D0, + 0x84C0, 0x84C0, 0x84B0, 0x84A0, 0x84A0, 0x8490, 0x8480, 0x8480, 0x8480, 0x8470, 0x8470, 0x84C0, 0x8470, 0x8470, 0x8470, 0x8460, + 0x8460, 0x8460, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, + 0x8450, 0x8450, 0x8480, 0x8460, 0x8480, 0x8460, 0x8460, 0x8470, 0x8480, 0x8470, 0x8480, 0x8480, 0x8490, 0x8490, 0x8490, 0x84A0, + 0x84B0, 0x84C0, 0x84D0, 0x84E0, 0x8500, 0x8530, 0x8590, 0x8670, 0x88C0, 0x8EA0, 0x9800, 0xA180, 0xAB90, 0xB460, 0xBC90, 0xC3F0, + 0xCB70, 0xD220, 0xD870, 0xDED0, 0xE4B0, 0xEAB0, 0xEFB0, 0xF4E0, 0xF8E0, 0xFD10, 0x0040, 0x0270, 0x0540, 0x0690, 0x0860, 0x0A70, + 0x0C50, 0x0F30, 0x11B0, 0x1500, 0x1800, 0x1B10, 0x1F60, 0x2440, 0x2B60, 0x32A0, 0x3AA0, 0x4490, 0x4F30, 0x5AB0, 0x6640, 0x7140, + 0x7C00, 0x7EC0, 0x7F10, 0x7F20, 0x7F20, 0x7F20, 0x7F10, 0x7F50, 0x7EF0, 0x7F10, 0x7F10, 0x7F00, 0x7F60, 0x7EF0, 0x7F10, 0x5BE0, + 0x2FC0, 0xFF50, 0xC750, 0x93A0, 0x84F0, 0x84A0, 0x8480, 0x8470, 0x8480, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8470, 0x8480, + 0x8480, 0x8490, 0x84B0, 0x84D0, 0x85A0, 0x9570, 0xBDD0, 0xE830, 0x12B0, 0x37C0, 0x5190, 0x5E30, 0x5D00, 0x4F90, 0x3BD0, 0x2670, + 0x1600, 0x08C0, 0x01D0, 0xFE90, 0xFD00, 0xFA90, 0xF400, 0xE960, 0xD910, 0xC430, 0xAA30, 0x8DC0, 0x8520, 0x84C0, 0x8490, 0x8480, + 0x8470, 0x8470, 0x8470, 0x8480, 0x8490, 0x84B0, 0x84D0, 0x84E0, 0x84B0, 0x8490, 0x8470, 0x8460, 0x8450, 0x8450, 0x8450, 0x8450, + 0x8450, 0x8450, 0x8450, 0x8440, 0x8440, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8440, 0x8440, 0x8440, + 0x8440, 0x8440, 0x8430, 0x8430, 0x8430, 0x8430, 0x8440, 0x8440, 0x8440, 0x8450, 0x8450, 0x8450, 0x8450, 0x8460, 0x8460, 0x8460, + 0x8470, 0x8410, 0x8480, 0x8480, 0x8490, 0x8490, 0x84A0, 0x84B0, 0x84F0, 0x84D0, 0x84D0, 0x84E0, 0x8500, 0x8510, 0x8530, 0x8590, + 0x8590, 0x85C0, 0x85F0, 0x8610, 0x8640, 0x8680, 0x86A0, 0x8700, 0x8780, 0x8870, 0x8AE0, 0x90A0, 0x9B30, 0xA890, 0xB860, 0xC950, + 0xDE10, 0xF080, 0x0260, 0x1240, 0x1F90, 0x2A90, 0x30B0, 0x31E0, 0x2C80, 0x1ED0, 0x0B70, 0xF220, 0xD580, 0xB9B0, 0xA110, 0x8F30, + 0x8810, 0x8610, 0x8580, 0x8540, 0x8510, 0x84F0, 0x84E0, 0x84D0, 0x84C0, 0x84C0, 0x84B0, 0x84B0, 0x84C0, 0x84C0, 0x84D0, 0x84E0, + 0x84F0, 0x8520, 0x8550, 0x85B0, 0x8630, 0x86F0, 0x8840, 0x8A30, 0x8D20, 0x9080, 0x9380, 0x9690, 0x9960, 0x9CA0, 0x9FD0, 0xA3C0, + 0xA960, 0xB0D0, 0xBA10, 0xC520, 0xD140, 0xDD90, 0xEA90, 0xF760, 0x0420, 0x0F90, 0x1910, 0x2120, 0x29A0, 0x3110, 0x3990, 0x4330, + 0x4E60, 0x5A50, 0x66B0, 0x7200, 0x7AA0, 0x7ED0, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F20, 0x79E0, 0x6D40, + 0x5870, 0x3B10, 0x1860, 0xF340, 0xCF80, 0xB010, 0x95F0, 0x8810, 0x8580, 0x8510, 0x84E0, 0x84D0, 0x84C0, 0x84B0, 0x84A0, 0x84A0, + 0x84A0, 0x84B0, 0x84B0, 0x84D0, 0x84F0, 0x8550, 0x8650, 0x8970, 0x9110, 0x9A50, 0xA030, 0xA380, 0xA390, 0xA100, 0x9B80, 0x9470, + 0x8D10, 0x8850, 0x8650, 0x8590, 0x8540, 0x8530, 0x8530, 0x8520, 0x8520, 0x8520, 0x8520, 0x8520, 0x8520, 0x8520, 0x8540, 0x8580, + 0x8600, 0x86E0, 0x88D0, 0x8CD0, 0x9340, 0x99C0, 0xA000, 0xA570, 0xAA50, 0xAF30, 0xB4D0, 0xBAF0, 0xC0E0, 0xC740, 0xCD60, 0xD350, + 0xD930, 0xDEB0, 0xE520, 0xEC20, 0xF3B0, 0xFBE0, 0x0430, 0x0B90, 0x11F0, 0x1800, 0x1D00, 0x2170, 0x2590, 0x2940, 0x2D50, 0x32C0, + 0x3860, 0x3DB0, 0x41E0, 0x4600, 0x49D0, 0x4C70, 0x4F60, 0x5180, 0x5480, 0x5710, 0x59B0, 0x5BD0, 0x5D40, 0x5D40, 0x5C10, 0x5A60, + 0x5760, 0x5360, 0x4E20, 0x4760, 0x4050, 0x3850, 0x2FB0, 0x2590, 0x1A70, 0x0E90, 0x01C0, 0xF610, 0xEB30, 0xE150, 0xD830, 0xD140, + 0xCB70, 0xC730, 0xC430, 0xC280, 0xC1E0, 0xC1C0, 0xC210, 0xC2F0, 0xC4F0, 0xC7D0, 0xCB20, 0xCF30, 0xD3E0, 0xD8A0, 0xDD50, 0xE1F0, + 0xE750, 0xECC0, 0xF270, 0xF8F0, 0xFF50, 0x0620, 0x0CC0, 0x1270, 0x1880, 0x1E40, 0x23C0, 0x28B0, 0x2DA0, 0x31F0, 0x3690, 0x3AE0, + 0x3DF0, 0x41F0, 0x4480, 0x47C0, 0x4A00, 0x4BF0, 0x4D90, 0x4E20, 0x4E10, 0x4E40, 0x4D30, 0x4CE0, 0x4B40, 0x4A10, 0x48A0, 0x4700, + 0x4480, 0x4210, 0x40A0, 0x3E80, 0x3C80, 0x3AF0, 0x3820, 0x35C0, 0x3340, 0x3070, 0x2F20, 0x2D50, 0x2BF0, 0x2AC0, 0x28E0, 0x26D0, + 0x2490, 0x2300, 0x2130, 0x1FB0, 0x1E70, 0x1D60, 0x1CF0, 0x1C20, 0x1B20, 0x1A80, 0x1830, 0x16E0, 0x1500, 0x1310, 0x11D0, 0x1070, + 0x0FA0, 0x0F10, 0x0D90, 0x0D10, 0x0C40, 0x0B90, 0x0AD0, 0x0A20, 0x0A00, 0x09D0, 0x0A20, 0x0BA0, 0x0BD0, 0x0CE0, 0x0DE0, 0x0F30, + 0x10D0, 0x1190, 0x13C0, 0x15F0, 0x1830, 0x1A90, 0x1CD0, 0x2050, 0x22B0, 0x2560, 0x2750, 0x28F0, 0x2BC0, 0x2DE0, 0x2FD0, 0x3220, + 0x33D0, 0x3670, 0x3870, 0x39F0, 0x3AF0, 0x3B10, 0x3C60, 0x3D40, 0x3DB0, 0x3F30, 0x4040, 0x4200, 0x4290, 0x4370, 0x4440, 0x4440, + 0x44F0, 0x45A0, 0x46C0, 0x4800, 0x4A00, 0x4BE0, 0x4E40, 0x4ED0, 0x50B0, 0x51B0, 0x52D0, 0x5430, 0x5520, 0x5700, 0x5890, 0x5A10, + 0x5B40, 0x5C40, 0x5E10, 0x5FA0, 0x6060, 0x6110, 0x6210, 0x62E0, 0x6340, 0x6390, 0x64B0, 0x65A0, 0x67B0, 0x68C0, 0x69D0, 0x6A30, + 0x6A30, 0x6A60, 0x6AF0, 0x6B30, 0x6CA0, 0x6D40, 0x6EC0, 0x7000, 0x70B0, 0x7240, 0x7290, 0x73F0, 0x7500, 0x75E0, 0x7750, 0x7800, + 0x7940, 0x7A40, 0x7AF0, 0x7C20, 0x7C80, 0x7D90, 0x7E50, 0x7EC0, 0x7F00, 0x7F00, 0x7F30, 0x7F20, 0x7F20, 0x7EF0, 0x7F10, 0x7F60, + 0x7F20, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F00, 0x7F00, 0x7EF0, 0x7F10, 0x7F30, 0x7EF0, 0x7F10, 0x7F10, 0x7F20, 0x7F70, 0x7EF0, + 0x7EB0, 0x7EF0, 0x7F10, 0x7F70, 0x7EE0, 0x7EC0, 0x7EF0, 0x7F10, 0x7F30, 0x7EE0, 0x7E90, 0x7F00, 0x7F10, 0x7F10, 0x7EF0, 0x7EA0, + 0x7EF0, 0x7EF0, 0x7F10, 0x7F20, 0x7EB0, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F00, 0x7F20, 0x7EB0, 0x7F00, 0x7F00, 0x7F10, 0x7F10, + 0x7EA0, 0x7F20, 0x7F10, 0x7F20, 0x7F40, 0x7F10, 0x7F30, 0x7EE0, 0x7F10, 0x7F10, 0x7F10, 0x7F60, 0x7EF0, 0x7F30, 0x7F20, 0x7F00, + 0x7F90, 0x7F10, 0x7EE0, 0x7EE0, 0x7EE0, 0x7F70, 0x7F10, 0x7F00, 0x7F00, 0x7EF0, 0x7F50, 0x7F10, 0x7E70, 0x7EF0, 0x7ED0, 0x7F30, + 0x7F00, 0x7E90, 0x7ED0, 0x7F00, 0x7F20, 0x7F10, 0x7EB0, 0x7EE0, 0x7F10, 0x7F10, 0x7F10, 0x7EA0, 0x7EF0, 0x7F10, 0x7F20, 0x7EF0, + 0x7EC0, 0x7F20, 0x7F20, 0x7F40, 0x7F10, 0x7F10, 0x7F60, 0x7EF0, 0x7EF0, 0x7F20, 0x7F00, 0x7F40, 0x7F10, 0x7F10, 0x7F20, 0x7EF0, + 0x7F80, 0x7F20, 0x7F20, 0x7F40, 0x7F00, 0x7F30, 0x7F00, 0x7F10, 0x7F10, 0x7F10, 0x7F50, 0x7F10, 0x7F20, 0x7F40, 0x7F10, 0x7F90, + 0x7F00, 0x7EE0, 0x7EF0, 0x7EF0, 0x7F60, 0x7EF0, 0x7F10, 0x7F00, 0x7F00, 0x7F50, 0x7F10, 0x7EB0, 0x7EF0, 0x7EF0, 0x7F30, 0x7EF0, + 0x7E90, 0x7ED0, 0x7EE0, 0x7F00, 0x7F10, 0x7EC0, 0x7EC0, 0x7EB0, 0x7F00, 0x7F00, 0x7E90, 0x7F00, 0x7F20, 0x7F20, 0x7F10, 0x7EB0, + 0x7F00, 0x7F20, 0x7F10, 0x7F10, 0x7EE0, 0x7F40, 0x7F10, 0x7F00, 0x7EF0, 0x7EF0, 0x7F50, 0x7F20, 0x7F40, 0x7F10, 0x7F10, 0x7F30, + 0x7F10, 0x7F10, 0x7F00, 0x7EF0, 0x7F50, 0x7F10, 0x7F00, 0x7F00, 0x7F10, 0x7F60, 0x7F00, 0x7EF0, 0x7F10, 0x7F00, 0x7F60, 0x7ED0, + 0x7EB0, 0x7DE0, 0x7360, 0x6840, 0x5C40, 0x4E10, 0x3F70, 0x2F20, 0x1F40, 0x10F0, 0x0310, 0xF700, 0xEC10, 0xE2B0, 0xDA80, 0xD240, + 0xCAD0, 0xC390, 0xBBD0, 0xB500, 0xAF30, 0xAC50, 0xAC00, 0xADB0, 0xB120, 0xB4B0, 0xB710, 0xB7E0, 0xB640, 0xB230, 0xAD70, 0xA8F0, + 0xA580, 0xA3E0, 0xA410, 0xA580, 0xA820, 0xA9D0, 0xAA10, 0xA890, 0xA4C0, 0x9EC0, 0x98C0, 0x9330, 0x8EA0, 0x8B20, 0x88E0, 0x8740, + 0x8660, 0x85C0, 0x8560, 0x8520, 0x8510, 0x8500, 0x84F0, 0x84F0, 0x84F0, 0x8500, 0x8520, 0x8540, 0x8580, 0x85D0, 0x8680, 0x8770, + 0x88E0, 0x8B60, 0x8EB0, 0x9310, 0x9810, 0x9DD0, 0xA3E0, 0xAA30, 0xB0B0, 0xB7C0, 0xBFB0, 0xC790, 0xCF20, 0xD740, 0xDEF0, 0xE650, + 0xEE00, 0xF500, 0xFC10, 0x0340, 0x0A10, 0x10D0, 0x16E0, 0x1D90, 0x2350, 0x2890, 0x2C70, 0x2FE0, 0x32B0, 0x33B0, 0x33A0, 0x32F0, + 0x30D0, 0x2E10, 0x2A40, 0x24F0, 0x1F10, 0x1740, 0x0F00, 0x0590, 0xFB70, 0xF170, 0xE6E0, 0xDCD0, 0xD2D0, 0xC960, 0xC080, 0xB980, + 0xB3C0, 0xAF00, 0xAAD0, 0xA7A0, 0xA470, 0xA230, 0xA110, 0xA090, 0xA130, 0xA200, 0xA3D0, 0xA5C0, 0xA840, 0xAAF0, 0xADB0, 0xB030, + 0xB330, 0xB5B0, 0xB870, 0xBB50, 0xBE50, 0xC0E0, 0xC3D0, 0xC6B0, 0xC9D0, 0xCC90, 0xCF50, 0xD230, 0xD4E0, 0xD7E0, 0xDA70, 0xDCE0, + 0xDF70, 0xE170, 0xE3E0, 0xE600, 0xE8A0, 0xEB30, 0xED90, 0xF080, 0xF330, 0xF630, 0xF8E0, 0xFB00, 0xFD10, 0xFE40, 0x0010, 0x0160, + 0x0320, 0x04B0, 0x0670, 0x07A0, 0x0910, 0x0A10, 0x0B10, 0x0C00, 0x0CF0, 0x0DA0, 0x0E10, 0x0ED0, 0x0F90, 0x1000, 0x1160, 0x1270, + 0x13B0, 0x14A0, 0x1560, 0x15F0, 0x16A0, 0x1750, 0x1790, 0x17B0, 0x17E0, 0x17F0, 0x1790, 0x1730, 0x1660, 0x1640, 0x1470, 0x12B0, + 0x1040, 0x0D60, 0x0A50, 0x0650, 0x0250, 0xFF10, 0xFB00, 0xF7A0, 0xF520, 0xF240, 0xEFB0, 0xED90, 0xEBA0, 0xEA20, 0xE8F0, 0xE780, + 0xE6F0, 0xE690, 0xE6B0, 0xE740, 0xE850, 0xE910, 0xE9B0, 0xEA80, 0xEB50, 0xEC00, 0xECB0, 0xED50, 0xEE70, 0xEF90, 0xF0D0, 0xF220, + 0xF440, 0xF5F0, 0xF750, 0xF9B0, 0xFB70, 0xFD60, 0xFF50, 0x0170, 0x0400, 0x06E0, 0x0960, 0x0BF0, 0x0EB0, 0x1140, 0x1390, 0x15B0, + 0x1750, 0x1940, 0x1B10, 0x1BB0, 0x1C40, 0x1C50, 0x1C80, 0x1C30, 0x1C60, 0x1C20, 0x1BB0, 0x1B70, 0x19E0, 0x18C0, 0x1730, 0x1630, + 0x1560, 0x1440, 0x1330, 0x1250, 0x11E0, 0x11B0, 0x1170, 0x10E0, 0x10B0, 0x10B0, 0x10D0, 0x11F0, 0x1310, 0x1490, 0x1720, 0x19C0, + 0x1C50, 0x1F70, 0x22B0, 0x2760, 0x2C50, 0x31B0, 0x3710, 0x3D40, 0x4280, 0x47B0, 0x4BA0, 0x4EC0, 0x5040, 0x4FB0, 0x4E60, 0x4C00, + 0x47D0, 0x4340, 0x3E60, 0x38F0, 0x3280, 0x2C40, 0x2560, 0x1E50, 0x16B0, 0x0DC0, 0x0540, 0xFC70, 0xF3C0, 0xEAC0, 0xE190, 0xD8D0, + 0xD130, 0xC960, 0xC1F0, 0xBCA0, 0xB7E0, 0xB4B0, 0xB2D0, 0xB1A0, 0xB200, 0xB2F0, 0xB520, 0xB890, 0xBBB0, 0xBF40, 0xC2A0, 0xC620, + 0xC9F0, 0xCDB0, 0xD1D0, 0xD520, 0xD8F0, 0xDCF0, 0xE030, 0xE3C0, 0xE680, 0xE950, 0xEB80, 0xEDE0, 0xF080, 0xF300, 0xF560, 0xF840, + 0xFA90, 0xFDE0, 0x0160, 0x0510, 0x09B0, 0x0DB0, 0x1290, 0x1680, 0x1AE0, 0x1F60, 0x2310, 0x2730, 0x2B40, 0x2F70, 0x32F0, 0x3640, + 0x3930, 0x3BD0, 0x3DC0, 0x4060, 0x4210, 0x4530, 0x4770, 0x4A70, 0x4DD0, 0x5030, 0x53A0, 0x5640, 0x58F0, 0x5C60, 0x5F20, 0x6340, + 0x6790, 0x6BE0, 0x7080, 0x7450, 0x7900, 0x7CE0, 0x7EE0, 0x7F10, 0x7EB0, 0x7F20, 0x7EF0, 0x7F10, 0x7F20, 0x7F00, 0x7F10, 0x7F10, + 0x7F00, 0x7F00, 0x7EF0, 0x7F00, 0x7F10, 0x7F10, 0x7F10, 0x7F20, 0x7F60, 0x7F10, 0x7F20, 0x7EE0, 0x7F10, 0x7F50, 0x7EF0, 0x7F20, + 0x7EF0, 0x7F10, 0x7F60, 0x7F00, 0x7ED0, 0x7F20, 0x7F00, 0x7F90, 0x7EF0, 0x7EB0, 0x7EE0, 0x7EF0, 0x7F30, 0x7F00, 0x7ED0, 0x7F10, + 0x7F20, 0x7F40, 0x7ED0, 0x7E90, 0x7F00, 0x7EE0, 0x7EF0, 0x7EE0, 0x7EC0, 0x7EF0, 0x7F10, 0x7F20, 0x7F20, 0x7F00, 0x7F10, 0x7F00, + 0x7F10, 0x7F20, 0x7EC0, 0x7F10, 0x7F10, 0x7F20, 0x7F40, 0x7F10, 0x7F70, 0x7F00, 0x7F40, 0x7F40, 0x7F10, 0x7F70, 0x7EF0, 0x7EF0, + 0x7F10, 0x7F00, 0x7F50, 0x7F10, 0x7F20, 0x7F00, 0x7F10, 0x7F70, 0x7F00, 0x7EC0, 0x7ED0, 0x7EE0, 0x7F60, 0x7EF0, 0x7EB0, 0x7EE0, + 0x7F00, 0x7F10, 0x7F10, 0x7E70, 0x7ED0, 0x7EB0, 0x7E30, 0x7D20, 0x7BC0, 0x7BD0, 0x7C40, 0x7CE0, 0x7E50, 0x7E80, 0x7ED0, 0x7F10, + 0x7F00, 0x7EF0, 0x7F00, 0x7F20, 0x7F20, 0x7F40, 0x7F10, 0x7F00, 0x7F40, 0x7F40, 0x7F10, 0x7F10, 0x7EE0, 0x7F50, 0x7EF0, 0x7F20, + 0x7EF0, 0x7F10, 0x7F60, 0x7F00, 0x7F10, 0x7F10, 0x7F10, 0x7F60, 0x7F10, 0x7EF0, 0x7EF0, 0x7EE0, 0x7F60, 0x7F00, 0x7F70, 0x7EF0, + 0x7F10, 0x7EF0, 0x7EF0, 0x7F80, 0x7F00, 0x7EE0, 0x7F10, 0x7EE0, 0x7F50, 0x7ED0, 0x7EB0, 0x7F00, 0x7F00, 0x7F10, 0x7F10, 0x7EA0, + 0x7F10, 0x7F10, 0x7F10, 0x7F00, 0x7EC0, 0x7F10, 0x7F10, 0x7F20, 0x7710, 0x5720, 0x3840, 0x1910, 0xFB70, 0xE0E0, 0xC9C0, 0xB780, + 0xA950, 0x9F70, 0x9920, 0x9560, 0x9300, 0x91F0, 0x9200, 0x92A0, 0x94E0, 0x9880, 0x9E90, 0xA540, 0xAD30, 0xB5C0, 0xBDB0, 0xC610, + 0xCEF0, 0xD820, 0xE0D0, 0xEB60, 0xF520, 0xFE90, 0x0890, 0x1180, 0x18F0, 0x1FF0, 0x2490, 0x28A0, 0x2B50, 0x2C30, 0x2C00, 0x2A60, + 0x2910, 0x26D0, 0x2300, 0x1F20, 0x1990, 0x12C0, 0x0B50, 0x03F0, 0xFCA0, 0xF450, 0xEC70, 0xE4A0, 0xDD00, 0xD5A0, 0xCDB0, 0xC5E0, + 0xBF10, 0xB7D0, 0xB0F0, 0xAA40, 0xA500, 0x9F90, 0x9A30, 0x9640, 0x92B0, 0x8FE0, 0x8D90, 0x8C00, 0x8B30, 0x8A80, 0x8A10, 0x8A60, + 0x8A90, 0x8B30, 0x8C00, 0x8D00, 0x8EB0, 0x9120, 0x9410, 0x9790, 0x9AF0, 0x9F90, 0xA3D0, 0xA930, 0xAE90, 0xB310, 0xB800, 0xBBB0, + 0xBFE0, 0xC3E0, 0xC740, 0xCBD0, 0xCF90, 0xD300, 0xD560, 0xD640, 0xD680, 0xD500, 0xD240, 0xCE70, 0xCA40, 0xC690, 0xC290, 0xBF30, + 0xBB40, 0xB750, 0xB2F0, 0xAE40, 0xA980, 0xA4D0, 0xA020, 0x91D0, 0x8FB0, 0x8E60, 0x8DB0, 0x8DD0, 0x8FB0, 0x92B0, 0x96F0, 0x9AF0, + 0x9ED0, 0xA2A0, 0xA560, 0xA710, 0xA7C0, 0xA7C0, 0xA7C0, 0xA830, 0xA910, 0xAA60, 0xABE0, 0xADA0, 0xAEC0, 0xAF60, 0xAFC0, 0xAF20, + 0xADC0, 0xAB00, 0xA840, 0xA410, 0x9F60, 0x99F0, 0x9390, 0x8D80, 0x88B0, 0x8650, 0x8560, 0x8510, 0x84E0, 0x84D0, 0x84C0, 0x84B0, + 0x84A0, 0x8490, 0x84C0, 0x8480, 0x8470, 0x8470, 0x8440, 0x8470, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, + 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8470, 0x8470, 0x8470, 0x8480, 0x84A0, 0x8490, 0x8490, 0x84A0, 0x84A0, + 0x84B0, 0x84B0, 0x84C0, 0x84D0, 0x84E0, 0x8500, 0x8520, 0x8560, 0x85F0, 0x8710, 0x8990, 0x8ED0, 0x9510, 0x9B00, 0xA040, 0xA450, + 0xA820, 0xAB70, 0xAF30, 0xB2B0, 0xB5D0, 0xB8A0, 0xBB70, 0xBF10, 0xC200, 0xC4B0, 0xC890, 0xCC60, 0xD1A0, 0xD710, 0xDE00, 0xE530, + 0xED30, 0xF4E0, 0xFC50, 0x0350, 0x0A00, 0x0F60, 0x15D0, 0x1B50, 0x2080, 0x24A0, 0x27C0, 0x2AD0, 0x2C80, 0x2DF0, 0x2F70, 0x30B0, + 0x32B0, 0x33A0, 0x3430, 0x34B0, 0x3420, 0x3340, 0x3150, 0x2F30, 0x2D00, 0x2990, 0x2650, 0x2230, 0x1DF0, 0x19D0, 0x14D0, 0x10B0, + 0x0D70, 0x09F0, 0x07A0, 0x07C0, 0x0950, 0x0D10, 0x1250, 0x1960, 0x2310, 0x2F20, 0x3D40, 0x4E40, 0x5EF0, 0x6F20, 0x7C20, 0x7F20, + 0x7F40, 0x7F10, 0x7F00, 0x7F20, 0x7F20, 0x7F20, 0x7F10, 0x7F20, 0x7F20, 0x7F20, 0x7F50, 0x7F30, 0x7F30, 0x7F40, 0x7F30, 0x7F30, + 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F20, + 0x7F40, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7E30, 0x77B0, 0x7570, 0x7780, 0x7D10, 0x7F30, 0x7F30, 0x7F20, + 0x7F40, 0x7F40, 0x7F40, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x4170, 0xEA20, 0x8E40, 0x8490, 0x8460, 0x8440, + 0x8430, 0x8420, 0x8440, 0x8400, 0x8400, 0x8400, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, + 0x83E0, 0x83E0, 0x83E0, 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8400, 0x8410, 0x8410, 0x8410, 0x8410, 0x8420, 0x8420, 0x8430, 0x8440, + 0x83F0, 0x8450, 0x8450, 0x8450, 0x8450, 0x8460, 0x8460, 0x8460, 0x8460, 0x8470, 0x8470, 0x8470, 0x8480, 0x84A0, 0x8490, 0x8490, + 0x84C0, 0x84B0, 0x84B0, 0x84C0, 0x84D0, 0x84F0, 0x8530, 0x85F0, 0x87D0, 0x9130, 0x9F90, 0xAE10, 0xBCF0, 0xCAA0, 0xD7C0, 0xE3D0, + 0xEE30, 0xF750, 0xFED0, 0x0460, 0x0860, 0x0BB0, 0x0DD0, 0x0ED0, 0x0F20, 0x0E60, 0x0D30, 0x0C30, 0x0B30, 0x09F0, 0x0910, 0x0810, + 0x05A0, 0x0260, 0xFFE0, 0xFCF0, 0xF9B0, 0xF6F0, 0xF4A0, 0xF2A0, 0xF080, 0xEEB0, 0xEC90, 0xE9A0, 0xE620, 0xE180, 0xDC60, 0xD610, + 0xCE80, 0xC5B0, 0xBB10, 0xAEC0, 0xA020, 0x9180, 0x8760, 0x8530, 0x84D0, 0x84B0, 0x84A0, 0x84B0, 0x8480, 0x8470, 0x8470, 0x8460, + 0x8460, 0x8450, 0x8450, 0x8440, 0x8440, 0x8440, 0x8490, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8420, 0x8420, 0x8420, 0x8420, + 0x8420, 0x8420, 0x8420, 0x8420, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8440, 0x8440, 0x8440, 0x8440, + 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8460, 0x8440, 0x8440, 0x8460, 0x8450, 0x8450, 0x8450, 0x8450, + 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8460, 0x8450, 0x8450, 0x8460, 0x8460, 0x8460, + 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8470, 0x8470, 0x8490, 0x8470, 0x8480, 0x8480, 0x84C0, 0x8490, 0x84A0, 0x84B0, + 0x84D0, 0x8500, 0x8570, 0x8730, 0x9040, 0xA0D0, 0xB020, 0xBE70, 0xCC40, 0xD990, 0xE570, 0xF0B0, 0xFB60, 0x0530, 0x0F10, 0x18C0, + 0x2180, 0x2A50, 0x3320, 0x3A90, 0x4250, 0x4990, 0x5100, 0x5960, 0x6180, 0x6B10, 0x7400, 0x7CD0, 0x7F00, 0x7F20, 0x7F00, 0x7F10, + 0x7F70, 0x7EE0, 0x7EC0, 0x7EF0, 0x7EF0, 0x7F60, 0x7EF0, 0x7EB0, 0x7F00, 0x7F00, 0x7F10, 0x7EB0, 0x7E70, 0x7EF0, 0x7EE0, 0x7EF0, + 0x7ED0, 0x7EB0, 0x7F00, 0x7F10, 0x7F10, 0x7F10, 0x7EC0, 0x7F10, 0x7F10, 0x7F00, 0x7F20, 0x7EC0, 0x7F30, 0x7F10, 0x7F20, 0x7F10, + 0x7F00, 0x7F40, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F80, 0x7F10, 0x7F20, 0x7EF0, 0x7EF0, 0x7F90, 0x7F00, 0x7F00, 0x7EF0, 0x7EF0, + 0x7F60, 0x7F10, 0x7F00, 0x7EE0, 0x7EF0, 0x7F70, 0x7F20, 0x5160, 0x2380, 0xFD30, 0xDDA0, 0xCA30, 0xBD80, 0xB790, 0xB3E0, 0xB1E0, + 0xB190, 0xB190, 0xB300, 0xB5D0, 0xBA50, 0xBFA0, 0xC5A0, 0xCB00, 0xCF50, 0xD100, 0xD0A0, 0xCDA0, 0xC830, 0xC200, 0xBB90, 0xB060, + 0xB0E0, 0xB300, 0xB530, 0xBA10, 0xC090, 0xCA10, 0xD610, 0xE330, 0xF260, 0x0410, 0x1490, 0x24F0, 0x34C0, 0x4380, 0x5030, 0x5A60, + 0x62C0, 0x6850, 0x6C20, 0x6F00, 0x7050, 0x7200, 0x72B0, 0x72E0, 0x71F0, 0x7000, 0x6D20, 0x6950, 0x6560, 0x6170, 0x5DC0, 0x5A90, + 0x57B0, 0x55B0, 0x5370, 0x5110, 0x4F70, 0x4DD0, 0x4D00, 0x4CC0, 0x4CD0, 0x4D10, 0x4CB0, 0x4BE0, 0x4B10, 0x4990, 0x48D0, 0x46E0, + 0x4460, 0x42C0, 0x4050, 0x3E70, 0x3C60, 0x3A50, 0x3950, 0x3800, 0x36E0, 0x3650, 0x3530, 0x35A0, 0x35C0, 0x3600, 0x3780, 0x3860, + 0x3A50, 0x3B80, 0x3D20, 0x3E80, 0x3FD0, 0x4290, 0x4520, 0x48A0, 0x4CA0, 0x5060, 0x5510, 0x5950, 0x5E20, 0x6260, 0x6650, 0x6A30, + 0x6D60, 0x6F80, 0x7190, 0x7290, 0x73A0, 0x73A0, 0x72F0, 0x7230, 0x6FE0, 0x6DC0, 0x6A10, 0x6660, 0x61D0, 0x5BD0, 0x5670, 0x5040, + 0x4A10, 0x4490, 0x3EE0, 0x39C0, 0x33F0, 0x2E30, 0x2940, 0x2400, 0x2010, 0x1BB0, 0x17E0, 0x1540, 0x1290, 0x10B0, 0x0EF0, 0x0D90, + 0x0CB0, 0x0BC0, 0x0B80, 0x0B90, 0x0B60, 0x0B80, 0x0B20, 0x0B40, 0x0A50, 0x0A10, 0x0A80, 0x0A60, 0x0AF0, 0x0B10, 0x0B00, 0x0B20, + 0x0A70, 0x0A70, 0x0A50, 0x0A60, 0x0AE0, 0x0BD0, 0x0D50, 0x0ED0, 0x1110, 0x1380, 0x1600, 0x1890, 0x1B80, 0x1E00, 0x20E0, 0x23C0, + 0x2630, 0x29C0, 0x2C60, 0x3010, 0x3370, 0x35F0, 0x3940, 0x3B90, 0x3EB0, 0x40F0, 0x4350, 0x46F0, 0x49C0, 0x4D90, 0x51F0, 0x55A0, + 0x5A40, 0x5E40, 0x6260, 0x6610, 0x6910, 0x6D00, 0x6FC0, 0x72F0, 0x75B0, 0x77A0, 0x79A0, 0x7B40, 0x7CC0, 0x7D80, 0x7E20, 0x7EC0, + 0x7ED0, 0x7F30, 0x7EE0, 0x7EE0, 0x7EF0, 0x7EE0, 0x7F40, 0x7ED0, 0x7E50, 0x7DA0, 0x7CA0, 0x7AD0, 0x78D0, 0x75C0, 0x7310, 0x7030, + 0x6CF0, 0x69E0, 0x65C0, 0x6230, 0x5D80, 0x57C0, 0x5220, 0x4B40, 0x4610, 0x4090, 0x3AA0, 0x3540, 0x2E40, 0x2800, 0x2130, 0x19A0, + 0x13F0, 0x0E40, 0x09C0, 0x0620, 0x0210, 0xFF10, 0xF510, 0xF340, 0xF190, 0xF070, 0xEFC0, 0xEF00, 0xEE80, 0xEDA0, 0xEC70, 0xEB70, + 0xE9D0, 0xE8A0, 0xE760, 0xE5C0, 0xE4C0, 0xE3B0, 0xE2E0, 0xE240, 0xE130, 0xE060, 0xDEF0, 0xDD50, 0xDC80, 0xDBD0, 0xDB60, 0xDA80, + 0xD9F0, 0xD9E0, 0xD960, 0xD8E0, 0xD870, 0xD7F0, 0xD790, 0xD700, 0xD6D0, 0xD730, 0xD6A0, 0xD770, 0xD790, 0xD7E0, 0xD750, 0xD6D0, + 0xD6D0, 0xD6A0, 0xD6D0, 0xD6D0, 0xD670, 0xD700, 0xD730, 0xD780, 0xD800, 0xD770, 0xD7E0, 0xD800, 0xD820, 0xD8B0, 0xD8B0, 0xD960, + 0xD950, 0xD930, 0xD8F0, 0xD870, 0xD870, 0xD810, 0xD7B0, 0xD770, 0xD730, 0xD750, 0xD720, 0xD700, 0xD6B0, 0xD6B0, 0xD6D0, 0xD6C0, + 0xD6A0, 0xD5D0, 0xD550, 0xD560, 0xD560, 0xD630, 0xD730, 0xD6F0, 0xD790, 0xD720, 0xD740, 0xD770, 0xD7A0, 0xD810, 0xD8D0, 0xD990, + 0xDA30, 0xDB00, 0xDBB0, 0xDC20, 0xDCB0, 0xDD20, 0xDE40, 0xDE90, 0xDFB0, 0xE1E0, 0xE380, 0xE4D0, 0xE690, 0xE900, 0xEAE0, 0xED10, + 0xEF40, 0xF0E0, 0xF320, 0xF4F0, 0xF740, 0xF9A0, 0xFC90, 0xFF50, 0x0240, 0x0570, 0x0870, 0x0C60, 0x1020, 0x1390, 0x16E0, 0x1A30, + 0x1D80, 0x2040, 0x2330, 0x25C0, 0x28C0, 0x2B20, 0x2DC0, 0x3000, 0x3230, 0x3470, 0x3640, 0x3890, 0x39F0, 0x3C00, 0x3D60, 0x3EF0, + 0x40D0, 0x42B0, 0x4480, 0x4640, 0x4870, 0x4A70, 0x4CE0, 0x4F10, 0x5130, 0x5360, 0x55E0, 0x5850, 0x5A90, 0x5D00, 0x5FE0, 0x62F0, + 0x65B0, 0x68B0, 0x6BC0, 0x6E50, 0x70D0, 0x73A0, 0x76C0, 0x7A50, 0x7DC0, 0x7F10, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, + 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F10, 0x7F20, 0x7F20, 0x7F20, 0x7F30, 0x7F00, + 0x7F20, 0x7F20, 0x7F30, 0x7F20, 0x7EF0, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F10, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, + 0x7F20, 0x7F30, 0x7F30, 0x7F40, 0x7F40, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F40, 0x7F20, 0x7F30, + 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, + 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F50, 0x7F20, 0x7F90, 0x7F30, 0x7F00, 0x7F00, 0x7F10, 0x7F10, 0x7F30, + 0x7E70, 0x7EE0, 0x7EC0, 0x7EF0, 0x7EF0, 0x7EE0, 0x7F00, 0x7F00, 0x7F30, 0x7F00, 0x7E70, 0x7ED0, 0x7ED0, 0x7F10, 0x7F00, 0x7E90, + 0x7EF0, 0x7F10, 0x7F20, 0x7F20, 0x7EA0, 0x7F20, 0x7F00, 0x7F10, 0x7EF0, 0x7EA0, 0x7F00, 0x7F10, 0x7F20, 0x7EE0, 0x7EC0, 0x7F10, + 0x7F20, 0x70C0, 0x5B90, 0x4510, 0x30B0, 0x1DF0, 0x0B70, 0xFC20, 0xED20, 0xDDC0, 0xCCC0, 0xBAD0, 0xA840, 0x9690, 0x8A40, 0x8600, + 0x8530, 0x8500, 0x84E0, 0x84D0, 0x84C0, 0x84B0, 0x84A0, 0x84A0, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, + 0x8480, 0x8490, 0x8490, 0x8490, 0x84A0, 0x84A0, 0x84B0, 0x84B0, 0x84C0, 0x84D0, 0x84E0, 0x84F0, 0x8510, 0x8540, 0x8580, 0x85E0, + 0x86B0, 0x87C0, 0x8980, 0x8C00, 0x8ED0, 0x9260, 0x9540, 0x9800, 0x9A10, 0x9AF0, 0x9C30, 0x9D00, 0x9DD0, 0x9E40, 0x9E80, 0x9EF0, + 0x9EA0, 0x9EF0, 0x9E50, 0x9DC0, 0x9D50, 0x9C30, 0x9BB0, 0x9AE0, 0x9A10, 0x99E0, 0x9900, 0x98A0, 0x97E0, 0x9760, 0x96F0, 0x96A0, + 0x9650, 0x9630, 0x96C0, 0x9720, 0x9750, 0x97C0, 0x98E0, 0x9A40, 0x9B90, 0x9C90, 0x9DC0, 0x9EE0, 0x9FF0, 0xA1E0, 0xA3C0, 0xA650, + 0xA8C0, 0xAA70, 0xAC40, 0xAE40, 0xB050, 0xB2E0, 0xB560, 0xB890, 0xBAD0, 0xBD20, 0xC000, 0xC1E0, 0xC430, 0xC620, 0xC910, 0xCB00, + 0xCD10, 0xCF40, 0xD190, 0xD3F0, 0xD5A0, 0xD710, 0xD940, 0xDAE0, 0xDC70, 0xDF20, 0xE0B0, 0xE2D0, 0xE480, 0xE5F0, 0xE770, 0xE8A0, + 0xEA20, 0xEB40, 0xEC50, 0xEE20, 0xEED0, 0xF090, 0xF180, 0xF1E0, 0xF290, 0xF2B0, 0xF2F0, 0xF2E0, 0xF2C0, 0xF370, 0xF340, 0xF330, + 0xF350, 0xF2A0, 0xF280, 0xF2D0, 0xF250, 0xF290, 0xF2B0, 0xF390, 0xF420, 0xF480, 0xF5A0, 0xF650, 0xF870, 0xFA00, 0xFBD0, 0xFE70, + 0x00C0, 0x0E10, 0x1200, 0x16B0, 0x1AC0, 0x1F80, 0x2510, 0x2AF0, 0x3170, 0x3750, 0x3D50, 0x4300, 0x4840, 0x4DF0, 0x5340, 0x5820, + 0x5D40, 0x6130, 0x6670, 0x6AC0, 0x6E90, 0x7270, 0x74E0, 0x7780, 0x7980, 0x7AE0, 0x7BE0, 0x7BF0, 0x7C90, 0x7CE0, 0x7C90, 0x7C30, + 0x7AE0, 0x79E0, 0x77D0, 0x7530, 0x73B0, 0x7160, 0x6F90, 0x6E00, 0x6C90, 0x6BE0, 0x6A70, 0x6A10, 0x6910, 0x6860, 0x6870, 0x6900, + 0x6A50, 0x6C30, 0x6D20, 0x6EE0, 0x6F00, 0x7030, 0x7180, 0x7240, 0x7350, 0x7460, 0x7580, 0x76B0, 0x77B0, 0x7940, 0x7A50, 0x7B70, + 0x7C00, 0x7C60, 0x7C50, 0x7C10, 0x7AB0, 0x77C0, 0x7390, 0x6F00, 0x6900, 0x61E0, 0x5B10, 0x53E0, 0x4D60, 0x4690, 0x3FB0, 0x3820, + 0x2F40, 0x2690, 0x1D70, 0x1350, 0x09B0, 0x0050, 0xF800, 0xEF70, 0xE770, 0xE090, 0xD8E0, 0xD180, 0xC960, 0xC150, 0xBA60, 0xB350, + 0xACB0, 0xA630, 0xA080, 0x9AE0, 0x9610, 0x91B0, 0x8E00, 0x8B70, 0x8A00, 0x88F0, 0x8840, 0x87E0, 0x87A0, 0x8790, 0x8780, 0x87A0, + 0x87D0, 0x8820, 0x88D0, 0x89F0, 0x8BD0, 0x8ED0, 0x9250, 0x96D0, 0x9BA0, 0xA090, 0xA630, 0xAC50, 0xB3B0, 0xBA40, 0xC040, 0xC610, + 0xCBB0, 0xD1F0, 0xD640, 0xDB50, 0xE0B0, 0xE550, 0xEA40, 0xEE00, 0xF190, 0xF540, 0xF830, 0xFA70, 0xFBE0, 0xFCF0, 0xFE70, 0xFF60, + 0x0050, 0x0150, 0x01F0, 0x02C0, 0x03A0, 0x0510, 0x0680, 0x0740, 0x0910, 0x09F0, 0x0B90, 0x0C60, 0x0C90, 0x0D60, 0x0D80, 0x0CF0, + 0x0BD0, 0x0A50, 0x0870, 0x05E0, 0x0280, 0xFFC0, 0xFB90, 0xF770, 0xF2A0, 0xEDE0, 0xE900, 0xE410, 0xE030, 0xDC60, 0xD830, 0xD400, + 0xCFF0, 0xCCA0, 0xC8E0, 0xC610, 0xC410, 0xC270, 0xC0F0, 0xBF10, 0xBD10, 0xBB20, 0xB8E0, 0xB5F0, 0xB360, 0xB090, 0xADD0, 0xAA80, + 0xA6B0, 0xA2F0, 0x9EA0, 0x9AD0, 0x96F0, 0x9350, 0x8FF0, 0x8D30, 0x8AF0, 0x8940, 0x8840, 0x8780, 0x86E0, 0x86A0, 0x86A0, 0x8640, + 0x8630, 0x8600, 0x85F0, 0x85F0, 0x85E0, 0x85C0, 0x85D0, 0x85C0, 0x85C0, 0x85B0, 0x85D0, 0x85D0, 0x85F0, 0x85F0, 0x8600, 0x8630, + 0x8660, 0x8670, 0x86B0, 0x8700, 0x8770, 0x87E0, 0x8870, 0x8900, 0x89B0, 0x8AE0, 0x8C30, 0x8DC0, 0x8FD0, 0x91E0, 0x93D0, 0x9610, + 0x98C0, 0x9AB0, 0x9DA0, 0xA050, 0xA380, 0xA5C0, 0xA8E0, 0xAB10, 0xAD60, 0xAF50, 0xB100, 0xB300, 0xB4A0, 0xB680, 0xB7F0, 0xB9C0, + 0xBAD0, 0xBBF0, 0xBD80, 0xBE60, 0xBFD0, 0xC130, 0xC270, 0xC440, 0xC5C0, 0xC760, 0xC890, 0xC990, 0xCAB0, 0xCBE0, 0xCCD0, 0xCDD0, + 0xCED0, 0xD060, 0xD190, 0xD250, 0xD330, 0xD350, 0xD380, 0xD350, 0xD240, 0xD0F0, 0xCF70, 0xCE80, 0xCDD0, 0xCCF0, 0xCBD0, 0xCA90, + 0xC8F0, 0xC7A0, 0xC5C0, 0xC3F0, 0xC260, 0xBBE0, 0xBA30, 0xB7D0, 0xB5F0, 0xB400, 0xB180, 0xAF50, 0xAD20, 0xAB00, 0xA8E0, 0xA6D0, + 0xA520, 0xA340, 0xA140, 0x9FA0, 0x9E80, 0x9DE0, 0x9D20, 0x9BF0, 0x9B30, 0x9A50, 0x9A00, 0x99A0, 0x98F0, 0x9910, 0x9890, 0x98B0, + 0x9870, 0x9960, 0x99D0, 0x9A50, 0x9AE0, 0x9BA0, 0x9B60, 0x9C00, 0x9CB0, 0x9D70, 0x9D70, 0x9DB0, 0x9DE0, 0x9E40, 0x9E80, 0x9F70, + 0xA000, 0xA000, 0x9F80, 0x9F00, 0x9E50, 0x9DB0, 0x9D20, 0x9C60, 0x9CB0, 0x9CD0, 0x9D00, 0x9CC0, 0x9CF0, 0x9CE0, 0x9D10, 0x9C50, + 0x9BA0, 0x9B60, 0x9B60, 0x9BB0, 0x9BB0, 0x9BE0, 0x9C80, 0x9CA0, 0x9CE0, 0x9CD0, 0x9CD0, 0x9DB0, 0x9F00, 0xA0A0, 0xA300, 0xA570, + 0xA870, 0xAB40, 0xADF0, 0xB0D0, 0xB480, 0xB800, 0xBBF0, 0xBFF0, 0xC450, 0xC850, 0xCD10, 0xD1B0, 0xD5F0, 0xDA10, 0xDE90, 0xE340, + 0xE8B0, 0xEE10, 0xF390, 0xF8C0, 0xFE30, 0x02A0, 0x0700, 0x0B90, 0x0FD0, 0x1430, 0x1840, 0x1C70, 0x2070, 0x24D0, 0x2920, 0x2D80, + 0x31B0, 0x3550, 0x3940, 0x3CE0, 0x4050, 0x4350, 0x45F0, 0x4850, 0x4B30, 0x4DA0, 0x4FA0, 0x51D0, 0x5370, 0x5400, 0x53A0, 0x5230, + 0x50F0, 0x4FB0, 0x4E20, 0x4C10, 0x4A90, 0x4830, 0x4500, 0x41D0, 0x3DA0, 0x3970, 0x3540, 0x3130, 0x2D20, 0x28C0, 0x24C0, 0x2100, + 0x1D70, 0x19C0, 0x16A0, 0x13D0, 0x1100, 0x0E10, 0x0B60, 0x0910, 0x0780, 0x0570, 0x03D0, 0x0230, 0x0120, 0x0010, 0xFFD0, 0xFFF0, + 0x0020, 0x00C0, 0x00E0, 0x0170, 0x0140, 0x0190, 0x0230, 0x0370, 0x0500, 0x06D0, 0x0890, 0x09D0, 0x0B40, 0x0C90, 0x0DB0, 0x0F60, + 0x10C0, 0x1290, 0x1530, 0x1750, 0x18F0, 0x19A0, 0x1A80, 0x1A80, 0x1B10, 0x1B00, 0x1A60, 0x1B10, 0x1B10, 0x1AE0, 0x1A10, 0x1930, + 0x17E0, 0x1620, 0x1440, 0x1230, 0x0F90, 0x0D40, 0x0AA0, 0x0830, 0x0680, 0x0440, 0x0190, 0xFF00, 0xFC40, 0xFA20, 0xF7A0, 0xF590, + 0xF420, 0xF2F0, 0xF230, 0xF150, 0xF160, 0xF0F0, 0xF070, 0xF070, 0xF0F0, 0xF170, 0xF260, 0xF340, 0xF500, 0xF610, 0xF810, 0xF960, + 0xFA50, 0xFBA0, 0xFC10, 0xFCA0, 0xFCC0, 0xFC50, 0xFCF0, 0xFD20, 0xFE60, 0xFF50, 0x0100, 0x0220, 0x0290, 0x0350, 0x0370, 0x02C0, + 0x0360, 0x0350, 0x03F0, 0x0520, 0x0670, 0x0790, 0x0860, 0x0920, 0x09B0, 0x09A0, 0x0A60, 0x0AE0, 0x0B90, 0x0C70, 0x0D00, 0x0ED0, + 0x10B0, 0x12A0, 0x1420, 0x1560, 0x1730, 0x1930, 0x1C30, 0x1EB0, 0x2160, 0x2490, 0x2810, 0x2AB0, 0x2DA0, 0x2F60, 0x3200, 0x3320, + 0x34E0, 0x3640, 0x3770, 0x3A00, 0x3BE0, 0x3CF0, 0x3E70, 0x3F40, 0x4050, 0x40F0, 0x4110, 0x4200, 0x4110, 0x4150, 0x4100, 0x3FC0, + 0x3EF0, 0x3DA0, 0x3CA0, 0x3B50, 0x3A00, 0x3940, 0x3800, 0x3680, 0x35B0, 0x34B0, 0x3480, 0x33D0, 0x33A0, 0x33A0, 0x32C0, 0x31F0, + 0x3110, 0x2F40, 0x2E10, 0x2CA0, 0x2BD0, 0x2AF0, 0x29A0, 0x2770, 0x2390, 0x1F20, 0x1830, 0x0FE0, 0x0580, 0xFB50, 0xF180, 0xE880, + 0xE090, 0xD9D0, 0xD3A0, 0xCE60, 0xC8C0, 0xC270, 0xBC20, 0xB540, 0xAF00, 0xA870, 0xA290, 0x9D40, 0x9870, 0x9430, 0x9150, 0x8F80, + 0x8F00, 0x8E60, 0x8DC0, 0x8CE0, 0x8B20, 0x8970, 0x87A0, 0x8640, 0x8590, 0x8530, 0x8500, 0x84E0, 0x84D0, 0x84C0, 0x84C0, 0x84B0, + 0x84B0, 0x8450, 0x84B0, 0x84A0, 0x84A0, 0x84D0, 0x84A0, 0x84A0, 0x84B0, 0x84B0, 0x84C0, 0x84C0, 0x84C0, 0x84D0, 0x84E0, 0x84F0, + 0x8510, 0x8530, 0x8570, 0x85F0, 0x8B00, 0x8BC0, 0x8B80, 0x8A60, 0x8930, 0x8830, 0x8790, 0x8720, 0x86E0, 0x86D0, 0x86C0, 0x86A0, + 0x86A0, 0x8680, 0x8690, 0x8680, 0x8690, 0x8690, 0x86A0, 0x86B0, 0x8700, 0x8720, 0x8700, 0x86C0, 0x8660, 0x85E0, 0x8560, 0x8510, + 0x84F0, 0x84D0, 0x84B0, 0x84A0, 0x8490, 0x8480, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8480, 0x8480, 0x8490, 0x84A0, 0x84C0, + 0x8500, 0x85C0, 0x8B80, 0xA2E0, 0xB7D0, 0xCC30, 0xDEF0, 0xEFA0, 0xFDD0, 0x0970, 0x1260, 0x1880, 0x1D50, 0x20A0, 0x2340, 0x2650, + 0x28B0, 0x2AB0, 0x2C40, 0x2C30, 0x2BF0, 0x28E0, 0x2490, 0x1FF0, 0x1960, 0x1300, 0x0B50, 0x0230, 0xF770, 0xE9C0, 0xD730, 0xC270, + 0xAAA0, 0x9290, 0x8690, 0x8500, 0x84C0, 0x84A0, 0x8490, 0x8480, 0x8470, 0x8470, 0x8470, 0x8470, 0x8480, 0x8450, 0x84D0, 0x8550, + 0x8900, 0x9280, 0x9360, 0x8D00, 0x8700, 0x8520, 0x8500, 0x84B0, 0x84A0, 0x8470, 0x8460, 0x8450, 0x8440, 0x8440, 0x8420, 0x8410, + 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8430, 0x8420, + 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8440, 0x8440, 0x8430, 0x8430, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, + 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, + 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8450, 0x8450, 0x8450, 0x8470, 0x8450, 0x8450, + 0x8400, 0x8450, 0x8450, 0x8460, 0x8460, 0x8460, 0x8470, 0x8470, 0x8480, 0x8490, 0x84A0, 0x84B0, 0x84C0, 0x84D0, 0x84E0, 0x84F0, + 0x8500, 0x8510, 0x8510, 0x8510, 0x8510, 0x8510, 0x8500, 0x8500, 0x8500, 0x84F0, 0x84F0, 0x84F0, 0x84F0, 0x84F0, 0x84F0, 0x8500, + 0x8500, 0x8510, 0x8520, 0x8530, 0x8550, 0x85B0, 0x8650, 0x87E0, 0x8BD0, 0x9350, 0x9C70, 0xA4F0, 0xADD0, 0xB6D0, 0xC030, 0xC890, + 0xD120, 0xD940, 0xE140, 0xE990, 0xF090, 0xF6B0, 0xFC80, 0x0180, 0x0590, 0x08B0, 0x09E0, 0x0B40, 0x0B50, 0x0AB0, 0x0A40, 0x0920, + 0x07F0, 0x06E0, 0x05A0, 0x04D0, 0x03B0, 0x0360, 0x0370, 0x03F0, 0x05B0, 0x0830, 0x0C80, 0x1170, 0x1880, 0x2210, 0x2D30, 0x3A40, + 0x4650, 0x50F0, 0x5A00, 0x5EE0, 0x61C0, 0x63D0, 0x66F0, 0x6BC0, 0x7150, 0x7850, 0x7DB0, 0x7F30, 0x7F10, 0x7EA0, 0x7EC0, 0x7EF0, + 0x7F10, 0x7F20, 0x7EC0, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7EB0, 0x7F00, 0x7F20, 0x7EF0, 0x7F20, 0x7F00, 0x7F10, 0x7F10, 0x7F00, + 0x7EF0, 0x7EF0, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F20, 0x7F30, 0x7F10, 0x7C00, 0x79E0, 0x7A70, 0x7DA0, 0x7EF0, + 0x7F30, 0x7F10, 0x7F20, 0x7F40, 0x7F10, 0x7F30, 0x6630, 0x4A70, 0x32C0, 0x2300, 0x1C90, 0x1ED0, 0x26C0, 0x3250, 0x3D50, 0x4610, + 0x4B50, 0x4CC0, 0x4BC0, 0x4A60, 0x48B0, 0x4840, 0x4880, 0x47F0, 0x46C0, 0x44D0, 0x42B0, 0x40D0, 0x3F40, 0x3F80, 0x4030, 0x4260, + 0x4500, 0x4850, 0x4AF0, 0x4C10, 0x4CD0, 0x4C90, 0x4BF0, 0x4A10, 0x48E0, 0x4750, 0x4680, 0x4600, 0x45D0, 0x4600, 0x46E0, 0x4760, + 0x47D0, 0x4830, 0x48E0, 0x4A00, 0x4B90, 0x4DE0, 0x4F70, 0x5180, 0x5350, 0x5530, 0x57E0, 0x5A40, 0x5CF0, 0x6000, 0x62A0, 0x6600, + 0x6880, 0x6B70, 0x6DA0, 0x6F80, 0x7340, 0x7370, 0x7370, 0x7320, 0x72B0, 0x71D0, 0x70C0, 0x7000, 0x6EB0, 0x6DB0, 0x6CC0, 0x6B80, + 0x69D0, 0x6900, 0x6840, 0x68C0, 0x69B0, 0x6AB0, 0x6D00, 0x6E90, 0x7040, 0x7190, 0x7230, 0x71F0, 0x70C0, 0x6EB0, 0x6BF0, 0x68B0, + 0x6460, 0x5F50, 0x5AA0, 0x5570, 0x5070, 0x4B70, 0x4660, 0x4120, 0x3C40, 0x36D0, 0x3120, 0x2B40, 0x2590, 0x1FD0, 0x1A60, 0x1510, + 0x0FD0, 0x0A90, 0x0500, 0xFE80, 0xF8A0, 0xF2E0, 0xEDE0, 0xE910, 0xE4A0, 0xE0C0, 0xDD10, 0xDAD0, 0xD880, 0xD660, 0xD4C0, 0xD3D0, + 0xD290, 0xD220, 0xD140, 0xD0C0, 0xD080, 0xD000, 0xCF60, 0xCEB0, 0xCDB0, 0xCCE0, 0xCCA0, 0xCCD0, 0xCD50, 0xCE40, 0xCEC0, 0xCEF0, + 0xCFA0, 0xCF30, 0xCD70, 0xCAC0, 0xC710, 0xC270, 0xBE00, 0xB910, 0xB4F0, 0xB1C0, 0xAE90, 0xAC40, 0xAB00, 0xA930, 0xA880, 0xA900, + 0xAA70, 0xAD80, 0xB030, 0xB270, 0xB270, 0xAEC0, 0xA740, 0x9B30, 0x8D50, 0x8630, 0x8500, 0x84D0, 0x84B0, 0x84A0, 0x8490, 0x8480, + 0x8480, 0x8470, 0x8470, 0x8470, 0x8480, 0x8480, 0x8480, 0x8490, 0x8490, 0x8490, 0x84A0, 0x84B0, 0x84B0, 0x84C0, 0x84D0, 0x84F0, + 0x8500, 0x8530, 0x8590, 0x8620, 0x8780, 0x89C0, 0x8D30, 0x9110, 0x9440, 0x9820, 0x9AE0, 0x9DC0, 0xA0B0, 0xA460, 0xA9B0, 0xAF60, + 0xB5F0, 0xBDB0, 0xC6E0, 0xD160, 0xDD40, 0xEA10, 0xF9A0, 0x08C0, 0x1930, 0x2A00, 0x3B20, 0x4BF0, 0x5B90, 0x6AA0, 0x76E0, 0x7EF0, + 0x7F00, 0x7EE0, 0x7EE0, 0x7ED0, 0x7F30, 0x7F20, 0x7EC0, 0x7ED0, 0x7EE0, 0x7F50, 0x7F10, 0x7EA0, 0x7EC0, 0x7EE0, 0x7F10, 0x7F20, + 0x7EC0, 0x7EE0, 0x7EE0, 0x7F10, 0x7F10, 0x7EA0, 0x7EE0, 0x7EF0, 0x7F10, 0x7F20, 0x7EA0, 0x7F00, 0x7F10, 0x7F10, 0x7F20, 0x7F00, + 0x7F50, 0x7F10, 0x7F20, 0x7F10, 0x7F10, 0x7F60, 0x7EF0, 0x7F10, 0x7F10, 0x7F20, 0x7F70, 0x7EF0, 0x7F20, 0x7F10, 0x7F10, 0x7F30, + 0x7EE0, 0x7ED0, 0x7EF0, 0x7F10, 0x7F60, 0x7F00, 0x7EE0, 0x7F10, 0x7F10, 0x7F30, 0x7EE0, 0x7EA0, 0x7EF0, 0x7F10, 0x7F20, 0x7ED0, + 0x7E90, 0x7F10, 0x7F00, 0x7F10, 0x7F10, 0x7EB0, 0x7F20, 0x7F10, 0x7F10, 0x7F00, 0x7EC0, 0x7F30, 0x7F10, 0x7F20, 0x7F40, 0x7F10, + 0x7F40, 0x7F10, 0x7F10, 0x7F20, 0x7EE0, 0x7F70, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F80, 0x7F00, 0x7F10, 0x7EF0, 0x7EF0, 0x7F60, + 0x7EF0, 0x7ED0, 0x7EF0, 0x7F00, 0x7F70, 0x7F00, 0x7ED0, 0x7ED0, 0x7EE0, 0x7EF0, 0x7EF0, 0x7EB0, 0x7EB0, 0x7EC0, 0x7EF0, 0x7F10, + 0x7EA0, 0x7EE0, 0x7F10, 0x7F10, 0x7F20, 0x7E90, 0x7EF0, 0x7F00, 0x7F00, 0x7EF0, 0x7F00, 0x7F20, 0x7F40, 0x7F10, 0x7F20, 0x7F00, + 0x7F40, 0x7C50, 0x77F0, 0x7470, 0x7140, 0x6DF0, 0x6500, 0x63D0, 0x6230, 0x6070, 0x5F60, 0x5D00, 0x5B60, 0x5990, 0x57F0, 0x5740, + 0x5640, 0x5590, 0x55B0, 0x5570, 0x56C0, 0x5780, 0x5890, 0x59E0, 0x5B40, 0x5D90, 0x5F90, 0x6130, 0x63A0, 0x6530, 0x66A0, 0x6780, + 0x6890, 0x69B0, 0x6AA0, 0x6C80, 0x6ED0, 0x70B0, 0x7360, 0x75D0, 0x7910, 0x7C00, 0x7E60, 0x7F10, 0x7EB0, 0x7F20, 0x7F00, 0x7F30, + 0x7F20, 0x7EC0, 0x7F10, 0x7F10, 0x7F00, 0x7F20, 0x7F10, 0x7F80, 0x7EF0, 0x7F10, 0x7F30, 0x7F20, 0x7F80, 0x7F10, 0x7F10, 0x7EF0, + 0x7EE0, 0x7F70, 0x7EF0, 0x7F20, 0x7EF0, 0x7F10, 0x7F70, 0x7F00, 0x7ED0, 0x7EF0, 0x7EF0, 0x7F70, 0x7F00, 0x7EE0, 0x7ED0, 0x7EF0, + 0x7F60, 0x7F20, 0x7E90, 0x7EF0, 0x7F00, 0x7F30, 0x7F10, 0x7E90, 0x7EB0, 0x7EE0, 0x7EF0, 0x7F10, 0x7EA0, 0x7ED0, 0x7F10, 0x7F20, + 0x7F20, 0x7EC0, 0x7F10, 0x7F00, 0x7F00, 0x7F10, 0x7EA0, 0x7F00, 0x7F10, 0x7F10, 0x7F20, 0x7F00, 0x7F50, 0x7EF0, 0x7F20, 0x7F10, + 0x7F10, 0x7F30, 0x7EE0, 0x7EF0, 0x7F10, 0x7F20, 0x7F60, 0x7F20, 0x7F40, 0x7F10, 0x7F00, 0x7F60, 0x7EE0, 0x7EF0, 0x7F10, 0x7F20, + 0x7F70, 0x7EF0, 0x7EB0, 0x7F00, 0x7F10, 0x7F30, 0x7EB0, 0x7E70, 0x7EF0, 0x7F00, 0x7F20, 0x7ED0, 0x7EB0, 0x7F10, 0x7F20, 0x7F10, + 0x7F10, 0x7EB0, 0x7F00, 0x7C40, 0x6E50, 0x6130, 0x5440, 0x4620, 0x38D0, 0x2B00, 0x1DF0, 0x0EC0, 0x01C0, 0xF440, 0xE7B0, 0xDCA0, + 0xD270, 0xCA50, 0xC370, 0xBEA0, 0xBB20, 0xB8D0, 0xB7C0, 0xB7E0, 0xB860, 0xBAB0, 0xBD70, 0xC190, 0xC610, 0xCA50, 0xCE20, 0xD060, + 0xD0C0, 0xD0D0, 0xCF90, 0xCD80, 0xCA70, 0xC6D0, 0xC300, 0xBE10, 0xB9B0, 0xB4B0, 0xAE80, 0xA8A0, 0xA130, 0x9A20, 0x92D0, 0x8C00, + 0x8870, 0x8680, 0x85A0, 0x8530, 0x8500, 0x84E0, 0x84D0, 0x84C0, 0x84B0, 0x84A0, 0x84A0, 0x8440, 0x8490, 0x8480, 0x8480, 0x8410, + 0x8480, 0x8480, 0x8480, 0x8490, 0x8480, 0x8480, 0x8490, 0x8490, 0x84A0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84C0, 0x84D0, + 0x84D0, 0x84E0, 0x84E0, 0x84D0, 0x84E0, 0x84E0, 0x84F0, 0x84E0, 0x84E0, 0x84D0, 0x84C0, 0x84B0, 0x84C0, 0x8490, 0x8490, 0x84A0, + 0x84C0, 0x84E0, 0x8520, 0x8570, 0x8540, 0x84E0, 0x84B0, 0x8490, 0x8490, 0x8490, 0x8490, 0x84A0, 0x84C0, 0x8510, 0x8850, 0xA6D0, + 0xCB80, 0xF420, 0x20E0, 0x4FD0, 0x79B0, 0x7F00, 0x7F80, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F70, 0x7F00, 0x7EE0, 0x7EF0, 0x7EF0, + 0x7F60, 0x7EF0, 0x7ED0, 0x62B0, 0x4260, 0x20D0, 0xFFD0, 0xDE30, 0xBDE0, 0x9D10, 0x88E0, 0x8540, 0x84E0, 0x84D0, 0x84C0, 0x84C0, + 0x84D0, 0x84D0, 0x84E0, 0x84E0, 0x84F0, 0x8520, 0x8560, 0x8600, 0x87C0, 0x8BE0, 0x9360, 0x9B00, 0xA240, 0xA920, 0xAFA0, 0xB660, + 0xBDB0, 0xC670, 0xCF70, 0xD990, 0xE450, 0xEEE0, 0xF9C0, 0x0310, 0x0BD0, 0x1340, 0x19D0, 0x1E30, 0x21C0, 0x23C0, 0x23F0, 0x2270, + 0x1F70, 0x1AE0, 0x1450, 0x0C10, 0x0360, 0xFA60, 0xF1B0, 0xE910, 0xE1C0, 0xDB20, 0xD610, 0xD200, 0xCF10, 0xCDC0, 0xCDF0, 0xCF60, + 0xD230, 0xD750, 0xDDB0, 0xE600, 0xF0E0, 0xFCB0, 0x0850, 0x1460, 0x1F40, 0x2930, 0x3180, 0x3800, 0x3D00, 0x40C0, 0x43C0, 0x4580, + 0x4680, 0x46F0, 0x4720, 0x4670, 0x4440, 0x3FF0, 0x3B30, 0x3550, 0x3000, 0x2BA0, 0x2840, 0x25E0, 0x2370, 0x2010, 0x1B80, 0x15C0, + 0x0E80, 0x0860, 0x0370, 0x0070, 0x0000, 0x0220, 0x06B0, 0x0D80, 0x15B0, 0x1FC0, 0x28B0, 0x3170, 0x3960, 0x3FF0, 0x4580, 0x49A0, + 0x4CC0, 0x4ED0, 0x4F70, 0x4F90, 0x4EC0, 0x4D50, 0x4B80, 0x4990, 0x4600, 0x42D0, 0x3EC0, 0x39C0, 0x34E0, 0x2F90, 0x2A10, 0x24A0, + 0x1F50, 0x1A50, 0x15B0, 0x1160, 0x0DB0, 0x0A70, 0x08A0, 0x0760, 0x06C0, 0x06D0, 0x06D0, 0x06E0, 0x0740, 0x07F0, 0x08C0, 0x0A30, + 0x0BD0, 0x0E30, 0x1160, 0x14E0, 0x1950, 0x1D00, 0x2110, 0x2430, 0x2760, 0x2AA0, 0x2DB0, 0x30B0, 0x33C0, 0x3660, 0x38D0, 0x3B30, + 0x3D00, 0x3E20, 0x3E90, 0x3E90, 0x3D00, 0x3B90, 0x3950, 0x3630, 0x3300, 0x3000, 0x2C90, 0x2920, 0x2630, 0x2350, 0x1FF0, 0x1DB0, + 0x1B40, 0x1910, 0x1630, 0x0B10, 0x0820, 0x06C0, 0x05F0, 0x05F0, 0x0740, 0x09C0, 0x0E50, 0x1370, 0x19D0, 0x20B0, 0x2960, 0x3140, + 0x39B0, 0x4230, 0x49F0, 0x5230, 0x58C0, 0x5F80, 0x6550, 0x6A10, 0x6F70, 0x7340, 0x76D0, 0x7A80, 0x7D40, 0x7ED0, 0x7EA0, 0x7EC0, + 0x7F10, 0x7F10, 0x7F10, 0x7EA0, 0x7F00, 0x7EE0, 0x7EF0, 0x7D50, 0x7880, 0x7280, 0x6B80, 0x62F0, 0x59F0, 0x4F00, 0x4200, 0x3550, + 0x2810, 0x1B20, 0x0E00, 0x0140, 0xF4F0, 0xE9E0, 0xE100, 0xD860, 0xD1F0, 0xCD70, 0xCA70, 0xC9E0, 0xCA20, 0xCC30, 0xCFE0, 0xD560, + 0xDD40, 0xE540, 0xEEB0, 0xF970, 0x0440, 0x0F90, 0x1A10, 0x2370, 0x2C70, 0x3530, 0x3D60, 0x4540, 0x4C30, 0x53D0, 0x5A60, 0x60A0, + 0x6550, 0x6890, 0x6BC0, 0x6CD0, 0x6EB0, 0x6FE0, 0x7060, 0x7190, 0x7200, 0x72B0, 0x72C0, 0x71B0, 0x7160, 0x6FC0, 0x6E10, 0x6B90, + 0x6830, 0x65C0, 0x61D0, 0x5E50, 0x5A80, 0x56D0, 0x5440, 0x5210, 0x5040, 0x4F90, 0x4F60, 0x5050, 0x5150, 0x5330, 0x5560, 0x57C0, + 0x5B50, 0x6080, 0x66A0, 0x6EC0, 0x7790, 0x7E90, 0x7F00, 0x7F50, 0x7F10, 0x7EA0, 0x7ED0, 0x7ED0, 0x7F30, 0x7F20, 0x7EC0, 0x7ED0, + 0x7EE0, 0x7F20, 0x7F20, 0x7EB0, 0x7EF0, 0x7F00, 0x7EF0, 0x7F10, 0x7E90, 0x7EF0, 0x7F20, 0x7F20, 0x7F20, 0x7E10, 0x77F0, 0x7060, + 0x6790, 0x5E50, 0x5520, 0x4C00, 0x4350, 0x3A00, 0x31A0, 0x28C0, 0x1F10, 0x1510, 0x09A0, 0xFFD0, 0xF600, 0xECD0, 0xE440, 0xDBD0, + 0xD450, 0xCD30, 0xC620, 0xC030, 0xBAF0, 0xB6D0, 0xB300, 0xAFB0, 0xADB0, 0xABB0, 0xAAB0, 0xAA10, 0xA960, 0xAA10, 0xAA30, 0xAB00, + 0xAB80, 0xABB0, 0xAC90, 0xAD80, 0xAFC0, 0xB270, 0xB650, 0xBC20, 0xC300, 0xCB30, 0xD420, 0xDE00, 0xE7F0, 0xF120, 0xFA80, 0x0290, + 0x0910, 0x0F30, 0x1460, 0x19C0, 0x1E30, 0x21B0, 0x24E0, 0x2620, 0x25E0, 0x2400, 0x2050, 0x1AB0, 0x1360, 0x0940, 0xFD10, 0xEE20, + 0xDC40, 0xC950, 0xB590, 0xA1D0, 0x8F10, 0x86B0, 0x8520, 0x84E0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84B0, 0x84B0, 0x84C0, + 0x84D0, 0x84F0, 0x8510, 0x8570, 0x8650, 0x88C0, 0x8EF0, 0x9760, 0x9D60, 0xA220, 0xA450, 0xA510, 0xA310, 0x9FD0, 0x9C50, 0x98D0, + 0x96F0, 0x9710, 0x9A50, 0xA030, 0xA910, 0xB410, 0xC0B0, 0xCCF0, 0xD990, 0xE610, 0xF170, 0xFC20, 0x0500, 0x0E30, 0x1590, 0x1AE0, + 0x1D80, 0x1D90, 0x1CF0, 0x1A30, 0x1660, 0x12E0, 0x0FD0, 0x0F00, 0x0FC0, 0x1220, 0x14F0, 0x18C0, 0x1C50, 0x1F20, 0x1FF0, 0x1FC0, + 0x1DD0, 0x1B30, 0x16A0, 0x0FF0, 0x0880, 0xFF10, 0xF4E0, 0xE990, 0xDCB0, 0xCFA0, 0xC200, 0xB620, 0xAB30, 0xA280, 0x9EC0, 0x9D90, + 0x9DE0, 0x9E70, 0x9EF0, 0x9F40, 0x9E60, 0x9CA0, 0x9A30, 0x9700, 0x94B0, 0x91B0, 0x8F60, 0x8D90, 0x8C70, 0x8CA0, 0x8DF0, 0x91C0, + 0x97B0, 0x9E90, 0xA660, 0xADB0, 0xB440, 0xB9F0, 0xBF70, 0xC510, 0xCAB0, 0xCFF0, 0xD590, 0xD9B0, 0xDD70, 0xDF10, 0xDF30, 0xDEF0, + 0xDD90, 0xDD40, 0xDDD0, 0xDEB0, 0xE1C0, 0xE570, 0xEA90, 0xF120, 0xF870, 0x0110, 0x0C00, 0x1860, 0x2620, 0x3550, 0x44F0, 0x52A0, + 0x5E20, 0x6690, 0x6C50, 0x7060, 0x7140, 0x7150, 0x6FB0, 0x6C60, 0x67D0, 0x60C0, 0x57B0, 0x4C40, 0x3E10, 0x30B0, 0x2320, 0x1750, + 0x0C10, 0x0290, 0xFAC0, 0xF3D0, 0xEE30, 0xEA20, 0xE900, 0xEAB0, 0xEEF0, 0xF560, 0xFDC0, 0x06F0, 0x10B0, 0x18E0, 0x1FD0, 0x24B0, + 0x27A0, 0x2980, 0x2980, 0x28B0, 0x27C0, 0x2670, 0x25B0, 0x25A0, 0x2570, 0x2590, 0x2550, 0x2500, 0x2460, 0x2350, 0x2260, 0x20A0, + 0x1F10, 0x1C10, 0x17E0, 0x1370, 0x0D50, 0x06B0, 0xFF00, 0xF5C0, 0xEB50, 0xDE00, 0xCF70, 0xBE90, 0xA990, 0x9230, 0x8620, 0x84E0, + 0x84B0, 0x84B0, 0x8470, 0x8460, 0x8450, 0x8440, 0x8440, 0x8440, 0x8430, 0x8430, 0x8430, 0x8440, 0x8440, 0x8440, 0x8440, 0x8450, + 0x8450, 0x8450, 0x8460, 0x8460, 0x8460, 0x8460, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8460, 0x8470, + 0x8470, 0x8440, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8480, 0x8470, 0x8480, 0x8480, 0x8480, + 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8490, 0x8480, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, + 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x84B0, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, + 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x84A0, 0x8490, 0x8490, 0x8490, 0x84A0, 0x8490, 0x84A0, 0x8490, 0x84A0, + 0x84A0, 0x84A0, 0x84A0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84C0, 0x84C0, 0x84D0, 0x84D0, 0x84E0, 0x84E0, 0x84F0, 0x8500, + 0x8520, 0x8540, 0x8580, 0x85E0, 0x8670, 0x8790, 0x88D0, 0x8B70, 0x8F70, 0x9420, 0x98C0, 0x9D70, 0xA270, 0xA710, 0xAC90, 0xB150, + 0xB5F0, 0xBAE0, 0xBFF0, 0xC510, 0xCA50, 0xCFA0, 0xD4F0, 0xDAB0, 0xE000, 0xE590, 0xEB30, 0xF0E0, 0xF6E0, 0xFD40, 0x0380, 0x0A50, + 0x1120, 0x1740, 0x1D50, 0x2370, 0x2910, 0x2E40, 0x3390, 0x37A0, 0x3BF0, 0x4020, 0x43F0, 0x4740, 0x4A20, 0x4CF0, 0x4FD0, 0x51B0, + 0x5360, 0x54D0, 0x5610, 0x5720, 0x5840, 0x5940, 0x5A30, 0x5BA0, 0x5CC0, 0x5E10, 0x5E50, 0x5EC0, 0x5ED0, 0x5EE0, 0x5E70, 0x5DC0, + 0x5D50, 0x5C30, 0x5B30, 0x59C0, 0x5810, 0x5610, 0x5460, 0x52A0, 0x4FD0, 0x4D30, 0x4B70, 0x49C0, 0x4880, 0x4720, 0x45E0, 0x4410, + 0x4230, 0x4090, 0x3F20, 0x3E00, 0x3CB0, 0x3C70, 0x3BF0, 0x3C10, 0x3C20, 0x3C60, 0x3C60, 0x3C80, 0x3C90, 0x3CE0, 0x3DA0, 0x3E60, + 0x3FE0, 0x4140, 0x4310, 0x44D0, 0x4630, 0x4780, 0x48C0, 0x4990, 0x4AF0, 0x4C30, 0x4DA0, 0x4F20, 0x5140, 0x52B0, 0x54D0, 0x5680, + 0x5910, 0x5AF0, 0x5DE0, 0x60E0, 0x6450, 0x67D0, 0x6B80, 0x6F20, 0x7240, 0x75B0, 0x78A0, 0x7B00, 0x7CD0, 0x7E50, 0x7F00, 0x7F20, + 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F20, 0x7F20, 0x7F30, + 0x7F30, 0x7F30, 0x7F20, 0x7F10, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F00, 0x7F10, 0x7F30, 0x7F30, 0x7F20, 0x7EF0, 0x7F30, 0x7F30, + 0x7F20, 0x7F40, 0x7F50, 0x7F30, 0x7EF0, 0x7F20, 0x7F10, 0x7F20, 0x7F20, 0x7ED0, 0x7EF0, 0x7F20, 0x7F60, 0x7F10, 0x7E90, 0x7EB0, + 0x7F20, 0x7F40, 0x7EF0, 0x7E70, 0x7EE0, 0x7EF0, 0x7F30, 0x7F00, 0x7EC0, 0x7F00, 0x7F20, 0x7F40, 0x7F10, 0x7EA0, 0x7F20, 0x7EF0, + 0x7EF0, 0x7F10, 0x7EC0, 0x7EF0, 0x7EF0, 0x7F20, 0x7F20, 0x7F00, 0x7F50, 0x7EF0, 0x7F20, 0x7F10, 0x7230, 0x6260, 0x5570, 0x4AB0, + 0x43B0, 0x4020, 0x3F10, 0x4050, 0x4260, 0x4490, 0x4510, 0x45A0, 0x4740, 0x4B40, 0x5450, 0x61B0, 0x72F0, 0x7F10, 0x7F00, 0x7F00, + 0x7EF0, 0x7F30, 0x7EF0, 0x7F00, 0x7EF0, 0x7F10, 0x7F50, 0x7F10, 0x7F20, 0x7F10, 0x7F10, 0x7F30, 0x7EE0, 0x7EF0, 0x7F10, 0x7F10, + 0x7F70, 0x7EB0, 0x48A0, 0x1010, 0xD570, 0x9B30, 0x8500, 0x84A0, 0x8470, 0x8460, 0x8450, 0x8440, 0x8440, 0x8430, 0x8420, 0x8430, + 0x8430, 0x8430, 0x8440, 0x8450, 0x8450, 0x8470, 0x8480, 0x8480, 0x8490, 0x84A0, 0x84B0, 0x84E0, 0x84E0, 0x8510, 0x8570, 0x8690, + 0x8980, 0x8EB0, 0x9480, 0x98D0, 0x9C20, 0x9E70, 0x9F80, 0x9FD0, 0x9ED0, 0x9E30, 0x9C30, 0x9960, 0x95D0, 0x9270, 0x8EF0, 0x8BF0, + 0x8990, 0x87F0, 0x86C0, 0x8600, 0x8580, 0x8530, 0x8510, 0x84F0, 0x84E0, 0x84D0, 0x84C0, 0x84C0, 0x84B0, 0x84A0, 0x84D0, 0x84A0, + 0x8490, 0x8490, 0x84B0, 0x84A0, 0x8480, 0x8490, 0x8490, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, + 0x8480, 0x8480, 0x8480, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x84A0, 0x84A0, 0x84A0, 0x84B0, 0x84B0, 0x84B0, 0x84C0, + 0x84C0, 0x84C0, 0x84D0, 0x84E0, 0x84F0, 0x8500, 0x8510, 0x8530, 0x8550, 0x85A0, 0x8610, 0x8710, 0x88B0, 0x8BD0, 0x9080, 0x95B0, + 0x9B00, 0xA0E0, 0xA690, 0xAD90, 0xB4B0, 0xBC90, 0xC470, 0xCBE0, 0xD310, 0xDA30, 0xF230, 0xF630, 0xF9B0, 0xFC40, 0xFE50, 0xFFB0, + 0x0140, 0x0340, 0x0580, 0x07E0, 0x0A70, 0x0D40, 0x1090, 0x1350, 0x15C0, 0x1720, 0x1750, 0x16E0, 0x14D0, 0x1190, 0x0D20, 0x0770, + 0x0140, 0xFA50, 0xF3A0, 0xED90, 0xE810, 0xE3C0, 0xDFE0, 0xDC90, 0xD9B0, 0xD7B0, 0xD680, 0xD650, 0xD6B0, 0xD890, 0xDB90, 0xE060, + 0xE690, 0xEEF0, 0xFA00, 0x0610, 0x1320, 0x20A0, 0x2F10, 0x3CB0, 0x48C0, 0x5430, 0x5EB0, 0x6740, 0x6FA0, 0x7600, 0x7B10, 0x7E40, + 0x7ED0, 0x7F10, 0x7F00, 0x7F20, 0x7EF0, 0x7F30, 0x7F20, 0x7F00, 0x7F20, 0x7F40, 0x7F10, 0x7F10, 0x7F00, 0x7F60, 0x7EF0, 0x7F20, + 0x7F20, 0x7EF0, 0x7F50, 0x7F10, 0x7DA0, 0x6440, 0x4690, 0x24F0, 0x01A0, 0xDD00, 0xB6E0, 0x9590, 0x8640, 0x8530, 0x84B0, 0x84A0, + 0x8490, 0x8490, 0x8480, 0x8480, 0x8480, 0x8490, 0x8490, 0x84A0, 0x84A0, 0x84A0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84A0, + 0x84A0, 0x8490, 0x8490, 0x8480, 0x8480, 0x8470, 0x8470, 0x8460, 0x8460, 0x8450, 0x8450, 0x8450, 0x8440, 0x8440, 0x8440, 0x8430, + 0x8430, 0x8420, 0x8420, 0x8420, 0x8410, 0x8410, 0x8410, 0x8420, 0x8420, 0x8430, 0x8430, 0x8430, 0x8440, 0x8440, 0x8440, 0x8450, + 0x8460, 0x8460, 0x8470, 0x8470, 0x8470, 0x8490, 0x8490, 0x84A0, 0x84B0, 0x84C0, 0x84E0, 0x8500, 0x8540, 0x85D0, 0x86C0, 0x8810, + 0x89D0, 0x8B60, 0x8C60, 0x8CA0, 0x8D00, 0x8CA0, 0x8C60, 0x8C10, 0x8BF0, 0x8C50, 0x8D10, 0x8F10, 0x9080, 0x91D0, 0x9310, 0x94E0, + 0x9680, 0x9800, 0x9970, 0x9B40, 0x9CD0, 0x9E60, 0x9EF0, 0x9ED0, 0x9DD0, 0x9BF0, 0x98D0, 0x9500, 0x9160, 0x8EE0, 0x8CD0, 0x8BF0, + 0x8BA0, 0x8C00, 0x8DB0, 0x9040, 0x9510, 0x9AA0, 0xA220, 0xAA70, 0xB310, 0xBD20, 0xC6A0, 0xD000, 0xD9F0, 0xE300, 0xEB20, 0xF2A0, + 0xF850, 0xFE30, 0x0280, 0x0620, 0x0850, 0x08B0, 0x08E0, 0x07C0, 0x05F0, 0x0380, 0x0080, 0xFE50, 0xFBD0, 0xFA60, 0xFA10, 0xFA70, + 0xFB10, 0xFBC0, 0xFC30, 0xFE00, 0xFFA0, 0x01E0, 0x04D0, 0x0770, 0x0AE0, 0x0D70, 0x1020, 0x1260, 0x13D0, 0x1590, 0x1640, 0x1760, + 0x1790, 0x17B0, 0x1870, 0x1890, 0x19A0, 0x1AD0, 0x1B70, 0x1D50, 0x1F00, 0x2140, 0x2330, 0x2510, 0x2800, 0x2A50, 0x2D50, 0x30B0, + 0x3420, 0x37C0, 0x3B00, 0x3EB0, 0x4240, 0x45D0, 0x4A60, 0x4DC0, 0x5190, 0x5510, 0x5860, 0x5BA0, 0x5F10, 0x6250, 0x65B0, 0x68E0, + 0x6C50, 0x6F80, 0x7270, 0x7520, 0x7750, 0x7A00, 0x7BB0, 0x7D30, 0x7E00, 0x7E70, 0x7ED0, 0x7F10, 0x7F70, 0x7F00, 0x7ED0, 0x7F10, + 0x7F20, 0x7F40, 0x7F20, 0x7F20, 0x7EF0, 0x7F10, 0x7F00, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7EF0, 0x7F30, 0x7F20, 0x7F20, 0x7F10, + 0x7EF0, 0x7F20, 0x7F10, 0x7F20, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F30, 0x7F20, 0x7F20, 0x7F40, 0x7F10, 0x7F30, 0x7F40, + 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x76A0, 0x6AF0, 0x5D50, 0x4ED0, 0x3EB0, 0x2D40, + 0x1970, 0x02F0, 0xE9F0, 0xCC70, 0xAE00, 0x8FB0, 0x8570, 0x84C0, 0x84A0, 0x8480, 0x8480, 0x8470, 0x8460, 0x8450, 0x8450, 0x8440, + 0x8440, 0x8440, 0x8430, 0x8430, 0x8440, 0x8440, 0x8440, 0x8450, 0x8460, 0x8460, 0x8470, 0x8480, 0x8490, 0x84E0, 0x84C0, 0x84E0, + 0x8510, 0x8580, 0x86B0, 0x89F0, 0x9090, 0x9890, 0x9F50, 0xA4E0, 0xA880, 0xAA80, 0xAB40, 0xABD0, 0xAC70, 0xAE50, 0xB110, 0xB500, + 0xB8D0, 0xB870, 0xB0B0, 0x9FB0, 0x8AE0, 0x8530, 0x84D0, 0x84B0, 0x84B0, 0x84B0, 0x84C0, 0x84E0, 0x8520, 0x8570, 0x8610, 0x86B0, + 0x8790, 0x8940, 0x8D60, 0x93D0, 0x9C00, 0xA420, 0xAA60, 0xAFC0, 0xB3C0, 0xB770, 0xBA60, 0xBD50, 0xC030, 0xC3A0, 0xC6B0, 0xC9C0, + 0xCC30, 0xCD80, 0xCD90, 0xCCD0, 0xCB00, 0xC8E0, 0xC8B0, 0xC9C0, 0xCC60, 0xD150, 0xD710, 0xDDF0, 0xE640, 0xF1D0, 0xFD10, 0x0920, + 0x1500, 0x2050, 0x2A90, 0x32E0, 0x39C0, 0x3EF0, 0x4320, 0x4530, 0x4610, 0x4530, 0x42F0, 0x3EF0, 0x3990, 0x3320, 0x2AC0, 0x2050, + 0x1560, 0x0920, 0xFC40, 0xEF00, 0xE1F0, 0xD6B0, 0xCD20, 0xC690, 0xC160, 0xBE40, 0xBBD0, 0xB880, 0xB550, 0xB0C0, 0xAC80, 0xA820, + 0xA470, 0xA170, 0x9FC0, 0x9F40, 0x9FC0, 0xA160, 0xA2F0, 0xA510, 0xA6A0, 0xA770, 0xA770, 0xA650, 0xA4E0, 0xA2B0, 0x9F70, 0x9C20, + 0x9820, 0x93C0, 0x8F90, 0x8B40, 0x8900, 0x8770, 0x8680, 0x8600, 0x85A0, 0x8570, 0x8550, 0x8540, 0x8540, 0x8540, 0x8550, 0x8580, + 0x85C0, 0x8660, 0x8820, 0x8CB0, 0x9670, 0xA170, 0xAB60, 0xB470, 0xBC60, 0xC3C0, 0xCA40, 0xD060, 0xD660, 0xDCC0, 0xE350, 0xE980, + 0xEFB0, 0xF510, 0xF990, 0xFCF0, 0xFF70, 0x02A0, 0x05B0, 0x0A20, 0x0EF0, 0x1590, 0x1DE0, 0x2740, 0x3290, 0x3E30, 0x49B0, 0x56C0, + 0x6410, 0x7210, 0x7D70, 0x7EF0, 0x7F10, 0x7F00, 0x7F40, 0x7F10, 0x7F10, 0x7F40, 0x7F00, 0x7F30, 0x7F00, 0x7F20, 0x7EF0, 0x7F10, + 0x7F60, 0x7F00, 0x7F10, 0x7F20, 0x7F00, 0x7F90, 0x7F10, 0x7F10, 0x7EE0, 0x7EF0, 0x7F80, 0x7EE0, 0x7EF0, 0x7F10, 0x7F00, 0x7F60, + 0x7F10, 0x7EB0, 0x7EB0, 0x7EC0, 0x7F30, 0x7EF0, 0x7ED0, 0x7EF0, 0x7F00, 0x7F30, 0x7ED0, 0x7090, 0x5E00, 0x4460, 0x2710, 0x0830, + 0xE800, 0xC880, 0xAA80, 0x8FE0, 0x85F0, 0x84E0, 0x84B0, 0x84A0, 0x8490, 0x8480, 0x8470, 0x8470, 0x8470, 0x8460, 0x8460, 0x8460, + 0x8460, 0x8460, 0x8460, 0x8470, 0x8470, 0x8480, 0x8490, 0x8490, 0x84A0, 0x84B0, 0x84C0, 0x84E0, 0x8500, 0x8520, 0x8580, 0x8630, + 0x8810, 0xA710, 0xB130, 0xBA00, 0xC250, 0xCB60, 0xD450, 0xDD00, 0xE510, 0xEC70, 0xF330, 0xF930, 0xFE30, 0x0220, 0x03C0, 0x0410, + 0x01E0, 0xFDD0, 0xF7B0, 0xF010, 0xE700, 0xDDA0, 0xD590, 0xCEB0, 0xC930, 0xC5C0, 0xC410, 0xC560, 0xC890, 0xCEA0, 0xD6B0, 0xDF00, + 0xE7B0, 0xF060, 0xF7E0, 0xFFC0, 0x06C0, 0x0D00, 0x12E0, 0x1700, 0x1BB0, 0x1F30, 0x2280, 0x2560, 0x2780, 0x2AB0, 0x2D00, 0x2EB0, + 0x3060, 0x3180, 0x3290, 0x33B0, 0x3460, 0x3480, 0x33F0, 0x33B0, 0x3360, 0x3260, 0x3130, 0x2EF0, 0x22F0, 0x1FF0, 0x1D60, 0x1B10, + 0x1A30, 0x1970, 0x18C0, 0x1980, 0x1AF0, 0x1C30, 0x1F50, 0x22B0, 0x2670, 0x2A70, 0x2E10, 0x31B0, 0x34A0, 0x3790, 0x3950, 0x3AA0, + 0x3B60, 0x3A50, 0x39D0, 0x3770, 0x34A0, 0x31C0, 0x2D40, 0x28C0, 0x2390, 0x1F90, 0x1CA0, 0x1A00, 0x18F0, 0x19B0, 0x1B70, 0x1EE0, + 0x2150, 0x2200, 0x1F00, 0x17C0, 0x0DA0, 0xFF00, 0xED40, 0xD9F0, 0xC400, 0xACB0, 0x9250, 0x8640, 0x84E0, 0x84B0, 0x8490, 0x8480, + 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8480, 0x8460, 0x84B0, 0x8500, 0x8590, 0x8E30, 0xA810, 0xB9E0, 0xBF20, 0xB600, 0x9BF0, + 0x8590, 0x8490, 0x8460, 0x8440, 0x8410, 0x8400, 0x83F0, 0x83E0, 0x83D0, 0x83D0, 0x83E0, 0x83E0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, + 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8400, 0x8410, 0x8410, 0x8420, 0x8430, 0x8410, 0x8430, 0x8440, 0x8440, + 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8450, 0x8470, 0x8450, 0x8440, 0x8440, 0x8470, 0x8440, 0x8440, + 0x8440, 0x8460, 0x8440, 0x8440, 0x8440, 0x8450, 0x8450, 0x8450, 0x8450, 0x8460, 0x8460, 0x8470, 0x8470, 0x8470, 0x8470, 0x8480, + 0x8480, 0x8480, 0x8490, 0x84B0, 0x84A0, 0x84B0, 0x84B0, 0x84C0, 0x84D0, 0x84F0, 0x8510, 0x8580, 0x86C0, 0x8AE0, 0x94E0, 0x9FD0, + 0xAA20, 0xB3F0, 0xBE10, 0xCA30, 0xD7E0, 0xE770, 0xF9E0, 0x0AB0, 0x1B50, 0x29D0, 0x3630, 0x4100, 0x4990, 0x5250, 0x5A30, 0x61D0, + 0x6950, 0x7000, 0x76E0, 0x7C40, 0x7ED0, 0x7F20, 0x7EC0, 0x7F10, 0x7F20, 0x7F40, 0x7F10, 0x7EB0, 0x7F10, 0x7F00, 0x7EF0, 0x7F10, + 0x7F20, 0x7F10, 0x7F20, 0x7F40, 0x7E50, 0x76B0, 0x6D20, 0x6150, 0x5210, 0x41B0, 0x2E60, 0x1CB0, 0x0BB0, 0xFD10, 0xF1E0, 0xE980, + 0xE450, 0xE100, 0xDF10, 0xDE00, 0xDD30, 0xDBE0, 0xDB00, 0xD970, 0xD900, 0xD860, 0xD940, 0xD980, 0xDA10, 0xDB20, 0xDBB0, 0xDC90, + 0xDDA0, 0xDE40, 0xDFA0, 0xE0F0, 0xE2C0, 0xE580, 0xE830, 0xEC20, 0xF0D0, 0xF630, 0xFCB0, 0x0380, 0x0AC0, 0x11B0, 0x1870, 0x1DE0, + 0x21C0, 0x2480, 0x2640, 0x2680, 0x2730, 0x2710, 0x26E0, 0x2640, 0x2510, 0x2460, 0x22F0, 0x21D0, 0x2110, 0x1FE0, 0x1F00, 0x1E50, + 0x1CE0, 0x1B60, 0x1950, 0x1870, 0x1660, 0x1420, 0x11F0, 0x0E90, 0x0B00, 0x05E0, 0x0030, 0xF9D0, 0xF270, 0xEB90, 0xE4F0, 0xDF30, + 0xDBD0, 0xD8C0, 0xD7A0, 0xD740, 0xD7B0, 0xD870, 0xD920, 0xD890, 0xD5B0, 0xD090, 0xCA40, 0xC110, 0xB890, 0xAF50, 0xA770, 0xA110, + 0x9D80, 0x9C80, 0x9DC0, 0xA1D0, 0xA900, 0xAE70, 0xB320, 0xB610, 0xB760, 0xB790, 0xB7B0, 0xB7F0, 0xB930, 0xBBF0, 0xC020, 0xC620, + 0xCDF0, 0xD6B0, 0xE070, 0xEA50, 0xF5B0, 0xFFD0, 0x0A60, 0x1560, 0x2040, 0x2B50, 0x36B0, 0x41C0, 0x4C40, 0x5730, 0x6000, 0x68C0, + 0x7110, 0x78A0, 0x7E60, 0x7F40, 0x7F30, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, + 0x7F20, 0x7F40, 0x7F30, 0x7F50, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F40, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, + 0x7F20, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F20, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F20, + 0x7F30, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F10, 0x7F30, 0x7F20, 0x7F40, 0x7F30, + 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F30, + 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F30, 0x7F00, 0x7F10, 0x7F20, 0x7F20, 0x7F30, 0x7F10, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7EF0, + 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F00, 0x7F20, 0x7F20, 0x7F40, 0x7F30, 0x7F00, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F20, + 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F30, 0x7F40, 0x7F30, + 0x7F30, 0x7F20, 0x7F20, 0x7F20, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, + 0x7F20, 0x7F40, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F70, 0x7F10, 0x7EE0, 0x7F20, 0x7F20, 0x7F30, 0x7F40, + 0x7EC0, 0x7F10, 0x7EF0, 0x7EF0, 0x7EE0, 0x7E50, 0x7ED0, 0x7F00, 0x7EF0, 0x7F10, 0x7EA0, 0x7EC0, 0x7F10, 0x7F10, 0x7F10, 0x7EA0, + 0x7F40, 0x7EE0, 0x7EF0, 0x7F30, 0x7EA0, 0x7F40, 0x7F00, 0x7290, 0x6410, 0x55E0, 0x46C0, 0x3A30, 0x2EE0, 0x2660, 0x1ED0, 0x1910, + 0x14C0, 0x10C0, 0x0CD0, 0x0700, 0xFFC0, 0xF6B0, 0xEB30, 0xDDC0, 0xCDC0, 0xBCD0, 0xAA30, 0x97C0, 0x8980, 0x8590, 0x8500, 0x84D0, + 0x84C0, 0x84B0, 0x84A0, 0x8490, 0x8480, 0x8480, 0x8480, 0x8480, 0x8470, 0x8470, 0x8470, 0x8470, 0x8460, 0x8460, 0x8460, 0x8460, + 0x8460, 0x8460, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8480, 0x8450, 0x8460, 0x8460, + 0x8460, 0x8460, 0x8460, 0x8460, 0x8470, 0x8470, 0x8470, 0x8470, 0x8480, 0x8480, 0x8490, 0x8490, 0x8490, 0x8490, 0x84A0, 0x84A0, + 0x84B0, 0x84B0, 0x84C0, 0x84C0, 0x84D0, 0x84D0, 0x84E0, 0x84F0, 0x8510, 0x8530, 0x8580, 0x8640, 0x8850, 0x8D00, 0x9690, 0xA180, + 0xAC50, 0xB890, 0xC530, 0xD200, 0xDF00, 0xEA90, 0xF5C0, 0x0010, 0x0B10, 0x1540, 0x1DE0, 0x25F0, 0x2BD0, 0x30C0, 0x3340, 0x3480, + 0x3330, 0x2DE0, 0x2650, 0x1A50, 0x0990, 0xF460, 0xD9B0, 0xBF60, 0xA520, 0x8DF0, 0x8600, 0x8500, 0x8480, 0x84B0, 0x8490, 0x8490, + 0x8480, 0x8470, 0x8470, 0x84B0, 0x8460, 0x8450, 0x8450, 0x8490, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8430, + 0x8440, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8470, 0x8450, 0x8450, + 0x8460, 0x8470, 0x8460, 0x8460, 0x8460, 0x8470, 0x8470, 0x8470, 0x8480, 0x8490, 0x84A0, 0x84C0, 0x8500, 0x8550, 0x86F0, 0x9110, + 0xA350, 0xEC50, 0xFD60, 0x0F90, 0x2130, 0x3370, 0x4520, 0x55F0, 0x6530, 0x71F0, 0x7AE0, 0x7ED0, 0x7ED0, 0x7EB0, 0x7EE0, 0x7EF0, + 0x5FF0, 0x57F0, 0x5240, 0x4D90, 0x4B10, 0x4A00, 0x4A20, 0x4C90, 0x4FA0, 0x53F0, 0x5A00, 0x6030, 0x6720, 0x6DC0, 0x72B0, 0x77A0, + 0x7AD0, 0x7D90, 0x7EB0, 0x7EF0, 0x7F10, 0x7EC0, 0x7EE0, 0x7EF0, 0x7F10, 0x7F20, 0x7F00, 0x7F40, 0x7F10, 0x7F10, 0x7F20, 0x7F00, + 0x7F30, 0x7F00, 0x7F20, 0x7EF0, 0x7F10, 0x7F80, 0x7F00, 0x7F10, 0x7F20, 0x7F00, 0x7F90, 0x7F10, 0x7F00, 0x7EE0, 0x7EF0, 0x7F70, + 0x7F20, 0x7EC0, 0x7E60, 0x7E20, 0x7DF0, 0x7E10, 0x7E30, 0x7EA0, 0x7EC0, 0x7EF0, 0x7F00, 0x7EA0, 0x7ED0, 0x7EE0, 0x7F20, 0x7F20, + 0x7E90, 0x7EB0, 0x7F00, 0x7F10, 0x7F00, 0x7EA0, 0x7ED0, 0x7F10, 0x7F20, 0x7F20, 0x7F00, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F00, + 0x7F20, 0x7EF0, 0x7F10, 0x7F10, 0x7F20, 0x7F50, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7EF0, 0x7EF0, 0x7EF0, 0x7F00, 0x7F40, + 0x7EF0, 0x7F10, 0x7F00, 0x7F00, 0x7F70, 0x7ED0, 0x7EA0, 0x7F10, 0x7F10, 0x7F30, 0x7EE0, 0x7EC0, 0x7F10, 0x7F20, 0x7F40, 0x7F00, + 0x7EC0, 0x7F10, 0x7F10, 0x7F20, 0x7EE0, 0x7E90, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7EB0, 0x7F20, 0x7F00, 0x7F10, 0x7F10, 0x7F00, + 0x7F40, 0x7ED0, 0x7F00, 0x7F20, 0x7EF0, 0x7F70, 0x7F00, 0x7F40, 0x7EF0, 0x7EF0, 0x7F70, 0x7F00, 0x7F10, 0x7EF0, 0x7EE0, 0x7F60, + 0x7EF0, 0x7EF0, 0x7F00, 0x7EE0, 0x7F70, 0x7F00, 0x7ED0, 0x7ED0, 0x7EE0, 0x7EF0, 0x7EF0, 0x7EB0, 0x7EC0, 0x7EC0, 0x7F30, 0x7F20, + 0x7EA0, 0x7EC0, 0x7ED0, 0x7F10, 0x7F00, 0x7EC0, 0x7EB0, 0x7F00, 0x7EF0, 0x7EF0, 0x7EB0, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F00, + 0x7F10, 0x7F10, 0x7F20, 0x7F00, 0x7EF0, 0x7F60, 0x7F20, 0x7F40, 0x7F10, 0x7F20, 0x7F60, 0x7EF0, 0x7F10, 0x7EF0, 0x7EE0, 0x7F80, + 0x7F00, 0x7F10, 0x7F10, 0x7F20, 0x7F80, 0x7F10, 0x7690, 0x68E0, 0x5940, 0x48B0, 0x3710, 0x25A0, 0x1540, 0x04D0, 0xF490, 0xE3F0, + 0xD1A0, 0xBD30, 0xA6F0, 0x8F00, 0x8610, 0x84F0, 0x84C0, 0x84B0, 0x8490, 0x8490, 0x8480, 0x8470, 0x8470, 0x8460, 0x8460, 0x8460, + 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8470, 0x8470, 0x8470, 0x8470, 0x8480, 0x8480, 0x8490, 0x8490, 0x84A0, 0x84B0, 0x84C0, + 0x84E0, 0x8500, 0x8560, 0x8660, 0x8960, 0x91B0, 0x9C00, 0xA5D0, 0xAF90, 0xB830, 0xBFE0, 0xC5D0, 0xCAF0, 0xCE90, 0xD0E0, 0xD310, + 0xD3E0, 0xD560, 0xD600, 0xD690, 0xD750, 0xD6F0, 0xD630, 0xD440, 0xD240, 0xCFB0, 0xCD20, 0xCA60, 0xC7C0, 0xC5D0, 0xC420, 0xC2D0, + 0xC100, 0xBF10, 0xBDC0, 0xBC00, 0xB9F0, 0xB760, 0xB450, 0xB080, 0xAC20, 0xA7A0, 0xA290, 0x9E60, 0x9830, 0x9330, 0x8E10, 0x8A40, + 0x8790, 0x8630, 0x8580, 0x8540, 0x8510, 0x8500, 0x84F0, 0x84E0, 0x84E0, 0x84E0, 0x84D0, 0x84D0, 0x84D0, 0x84E0, 0x84E0, 0x84F0, + 0x84F0, 0x8500, 0x8520, 0x8530, 0x8570, 0x85B0, 0x8620, 0x86E0, 0x8800, 0x89C0, 0x8C70, 0x8F80, 0x9230, 0x9640, 0x9A20, 0x9DF0, + 0xA1F0, 0xA490, 0xA790, 0xAA10, 0xAD60, 0xB010, 0xB490, 0xB870, 0xBC30, 0xBF80, 0xC200, 0xC3D0, 0xC610, 0xC870, 0xCB00, 0xCE90, + 0xD160, 0xD4A0, 0xD6C0, 0xD910, 0xDB70, 0xDE80, 0xE1F0, 0xE530, 0xE830, 0xEB20, 0xEE10, 0xF010, 0xF2C0, 0xF560, 0xF880, 0xFAF0, + 0xFED0, 0x02C0, 0x05D0, 0x0920, 0x0C60, 0x0F50, 0x1240, 0x15B0, 0x1920, 0x1CA0, 0x1FD0, 0x22F0, 0x2640, 0x2990, 0x2CB0, 0x3030, + 0x3320, 0x3660, 0x3950, 0x3BB0, 0x3E40, 0x40B0, 0x4260, 0x4400, 0x4640, 0x4850, 0x49D0, 0x4A60, 0x49D0, 0x48F0, 0x47B0, 0x46E0, + 0x4590, 0x44B0, 0x43B0, 0x4300, 0x42E0, 0x4200, 0x40C0, 0x3F10, 0x3DF0, 0x3C90, 0x3B70, 0x3A40, 0x3970, 0x38B0, 0x3880, 0x3800, + 0x37F0, 0x3770, 0x3760, 0x3770, 0x3810, 0x3910, 0x39E0, 0x3A90, 0x3BB0, 0x3D20, 0x3EA0, 0x4040, 0x41F0, 0x42D0, 0x4400, 0x4540, + 0x4610, 0x46B0, 0x4830, 0x49E0, 0x4B10, 0x4CC0, 0x4E00, 0x4FA0, 0x50E0, 0x5210, 0x5370, 0x54A0, 0x5540, 0x55C0, 0x5610, 0x56A0, + 0x5740, 0x58F0, 0x5A90, 0x5C40, 0x5DF0, 0x5F70, 0x6110, 0x6320, 0x66E0, 0x6BD0, 0x7170, 0x7780, 0x7D10, 0x7F10, 0x7F30, 0x7EE0, + 0x7EE0, 0x7EF0, 0x7F10, 0x7F40, 0x7DF0, 0x7780, 0x6EE0, 0x62E0, 0x52D0, 0x3EB0, 0x23E0, 0x0270, 0xDAD0, 0xA990, 0x8740, 0x84C0, + 0x8490, 0x8470, 0x8460, 0x8460, 0x8450, 0x8450, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, + 0x8440, 0x8440, 0x8450, 0x8440, 0x8450, 0x8450, 0x8450, 0x8450, 0x8460, 0x8460, 0x8470, 0x8490, 0x8480, 0x8480, 0x8480, 0x8490, + 0x8480, 0x8470, 0x8480, 0x8480, 0x8470, 0x8470, 0x8470, 0x8490, 0x8460, 0x8450, 0x8470, 0x8450, 0x8450, 0x8440, 0x8440, 0x8440, + 0x8430, 0x8430, 0x8440, 0x8430, 0x8440, 0x8430, 0x8440, 0x8450, 0x8450, 0x8450, 0x8460, 0x8470, 0x8470, 0x84A0, 0x84C0, 0x8510, + 0x8690, 0x9230, 0xA460, 0xB260, 0xBDD0, 0xC7E0, 0xCF80, 0xD6B0, 0xDC90, 0xE320, 0xE8E0, 0xEE00, 0xF290, 0xF5F0, 0xF950, 0xFBC0, + 0xFD90, 0xFF10, 0x00B0, 0x0260, 0x0420, 0x05D0, 0x08B0, 0x0B90, 0x0DF0, 0x1150, 0x1490, 0x18F0, 0x1D60, 0x21F0, 0x2770, 0x2CE0, + 0x32D0, 0x38B0, 0x3F60, 0x4660, 0x4D50, 0x5590, 0x5CF0, 0x6460, 0x6C50, 0x73E0, 0x7AC0, 0x7E80, 0x7F10, 0x7F20, 0x7EC0, 0x7ED0, + 0x7F10, 0x7F00, 0x7F10, 0x7EB0, 0x7EE0, 0x7F00, 0x7EF0, 0x7F10, 0x7F00, 0x7F40, 0x7F10, 0x7F10, 0x7F10, 0x7F00, 0x7F20, 0x7F00, + 0x7F10, 0x7F10, 0x7F20, 0x7F60, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F50, 0x7EF0, 0x7F00, 0x7EE0, 0x7EF0, 0x7F30, 0x7EE0, 0x7F10, + 0x7F10, 0x7F20, 0x7F70, 0x7EF0, 0x7EB0, 0x7F00, 0x7F10, 0x7F50, 0x7EB0, 0x7E70, 0x7EF0, 0x7EF0, 0x7F30, 0x7F00, 0x7EC0, 0x7F00, + 0x7F00, 0x7EF0, 0x7EF0, 0x7EA0, 0x7EE0, 0x7EF0, 0x7F10, 0x7F20, 0x7EC0, 0x7F10, 0x7F10, 0x7F20, 0x7F40, 0x7F00, 0x7F30, 0x7EF0, + 0x7F20, 0x7F10, 0x7F00, 0x7F40, 0x7EA0, 0x7EE0, 0x7EF0, 0x7EF0, 0x7F20, 0x7F00, 0x7F40, 0x7F10, 0x7F10, 0x7F20, 0x7F00, 0x7F10, + 0x7F10, 0x7F20, 0x7F40, 0x7EF0, 0x7F80, 0x7DA0, 0x75E0, 0x6FA0, 0x6A20, 0x65E0, 0x6350, 0x6270, 0x6430, 0x67C0, 0x6CC0, 0x7330, + 0x7920, 0x7DF0, 0x7EF0, 0x7F70, 0x7F20, 0x7ED0, 0x7ED0, 0x7EB0, 0x7F20, 0x7F10, 0x7EB0, 0x7EC0, 0x7ED0, 0x7F30, 0x7F20, 0x7EA0, + 0x7DD0, 0x7C50, 0x7A50, 0x79B0, 0x78B0, 0x78C0, 0x7890, 0x77D0, 0x7760, 0x7580, 0x7380, 0x7050, 0x6B10, 0x6500, 0x5C00, 0x5140, + 0x4400, 0x3400, 0x2390, 0x1110, 0xFDF0, 0xEB90, 0xDB90, 0xCF00, 0xC710, 0xC540, 0xCA70, 0xD670, 0xE840, 0xFE90, 0x1530, 0x2B60, + 0x4090, 0x5310, 0x6250, 0x6E60, 0x76C0, 0x7B10, 0x7D60, 0x7D50, 0x7BB0, 0x78B0, 0x75F0, 0x75F0, 0x7810, 0x7C30, 0x7EE0, 0x7EF0, + 0x7ED0, 0x7EB0, 0x7F40, 0x7EF0, 0x7EB0, 0x7EE0, 0x7EE0, 0x7EF0, 0x7F10, 0x7EB0, 0x7ED0, 0x72F0, 0x3E90, 0x0520, 0xC380, 0x87B0, + 0x84A0, 0x8470, 0x8440, 0x8440, 0x8430, 0x8430, 0x8450, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8410, + 0x8420, 0x8420, 0x8420, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8440, 0x8420, 0x8430, 0x8430, + 0x8430, 0x8440, 0x8440, 0x8450, 0x8450, 0x8440, 0x8450, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8470, 0x8470, 0x8470, 0x8470, + 0x8480, 0x8480, 0x8480, 0x8490, 0x8490, 0x84A0, 0x84A0, 0x84B0, 0x84C0, 0x84E0, 0x8500, 0x8540, 0x85E0, 0x8720, 0x8890, 0x8980, + 0x8930, 0x8800, 0x8730, 0x86D0, 0x8700, 0x87B0, 0x8A30, 0x8F70, 0x9810, 0xA0F0, 0xAA90, 0xB270, 0xB900, 0xBFA0, 0xC600, 0xCBC0, + 0xD250, 0xD9D0, 0xE1A0, 0xEA50, 0xF300, 0xFC20, 0x0540, 0x0F70, 0x1BE0, 0x2900, 0x3750, 0x4550, 0x5250, 0x5DD0, 0x65B0, 0x6C20, + 0x7080, 0x7210, 0x7310, 0x7180, 0x6E80, 0x6A00, 0x63E0, 0x5EA0, 0x5800, 0x51B0, 0x4C20, 0x45C0, 0x40D0, 0x3B90, 0x3690, 0x32B0, + 0x2FA0, 0x2E90, 0x2E50, 0x3030, 0x32F0, 0x3740, 0x3E10, 0x4730, 0x5270, 0x5EC0, 0x6B80, 0x77B0, 0x7EE0, 0x7F80, 0x7EF0, 0x7EB0, + 0x7F10, 0x7F10, 0x7F70, 0x7EE0, 0x7EC0, 0x7EF0, 0x7F10, 0x7F30, 0x7EE0, 0x7EB0, 0x7F00, 0x7F40, 0x7F40, 0x7ED0, 0x7EA0, 0x7EE0, + 0x7EF0, 0x7F10, 0x7EE0, 0x7E90, 0x7F10, 0x7F20, 0x7F10, 0x7F10, 0x7F00, 0x7F20, 0x7EE0, 0x7F10, 0x7F20, 0x7F00, 0x7F40, 0x7EF0, + 0x7F30, 0x7F20, 0x7F10, 0x7F90, 0x7B20, 0x6EC0, 0x6390, 0x57F0, 0x4C20, 0x3F10, 0x35D0, 0x2E20, 0x2780, 0x2290, 0x1EB0, 0x1C00, + 0x1A50, 0x1AF0, 0x1D20, 0x2080, 0x25B0, 0x2A90, 0x2FE0, 0x3540, 0x3A70, 0x3F90, 0x4430, 0x48A0, 0x4CF0, 0x5210, 0x56E0, 0x5BF0, + 0x60D0, 0x65A0, 0x6AE0, 0x6F90, 0x73B0, 0x7750, 0x7A50, 0x7C30, 0x7D30, 0x7DA0, 0x7D00, 0x7B50, 0x7890, 0x7400, 0x6E40, 0x6620, + 0x5D80, 0x5290, 0x4530, 0x3680, 0x25E0, 0x1370, 0xFEE0, 0xE860, 0xCE90, 0xB510, 0x9A50, 0x87E0, 0x8500, 0x84C0, 0x84A0, 0x8490, + 0x84B0, 0x8470, 0x8470, 0x8440, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8470, 0x8470, 0x8470, 0x8480, + 0x84A0, 0x84F0, 0x8540, 0x9180, 0xB7B0, 0xD9F0, 0xF900, 0x13C0, 0x2B90, 0x41D0, 0x54E0, 0x63F0, 0x6FB0, 0x76A0, 0x7A80, 0x7BF0, + 0x7B30, 0x7820, 0x72C0, 0x6A10, 0x5ED0, 0x5070, 0x4180, 0x3310, 0x24F0, 0x1680, 0x06C0, 0xF2A0, 0xDAD0, 0xBF60, 0x9F10, 0x8880, + 0x8500, 0x84C0, 0x84A0, 0x8490, 0x8490, 0x8480, 0x8490, 0x8490, 0x8490, 0x84A0, 0x84A0, 0x84B0, 0x84C0, 0x84E0, 0x8540, 0x8740, + 0x9930, 0xAE50, 0xC1F0, 0xD1C0, 0xDD50, 0xE4C0, 0xE930, 0xEC20, 0xF070, 0xF790, 0x01B0, 0x0EF0, 0x1EA0, 0x3030, 0x41B0, 0x5270, + 0x6150, 0x6E70, 0x7A60, 0x7F10, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F10, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, + 0x7F30, 0x7F20, 0x7F00, 0x7F30, 0x7F20, 0x7F20, 0x7F40, 0x7F10, 0x7F20, 0x7F20, 0x7F20, 0x7F30, 0x7F00, 0x7390, 0x6770, 0x5B60, + 0x4E60, 0x4150, 0x3460, 0x2740, 0x1A80, 0x0F50, 0x0550, 0xFCA0, 0xF520, 0xECB0, 0xE270, 0xD570, 0xC6A0, 0xB690, 0xA5D0, 0x95D0, + 0x8AF0, 0x86C0, 0x8580, 0x8530, 0x8500, 0x84F0, 0x84E0, 0x84E0, 0x84E0, 0x84E0, 0x84F0, 0x8500, 0x8510, 0x8520, 0x8530, 0x8540, + 0x8550, 0x8540, 0x8560, 0x8570, 0x8580, 0x85A0, 0x85B0, 0x85D0, 0x85C0, 0x85B0, 0x85C0, 0x85A0, 0x8590, 0x8580, 0x8570, 0x8560, + 0x8550, 0x8540, 0x8550, 0x8560, 0x8580, 0x85A0, 0x85F0, 0x8670, 0x8700, 0x87B0, 0x8890, 0x8970, 0x8A70, 0x8AF0, 0x8BB0, 0x8CB0, + 0x8DD0, 0x8F70, 0x9100, 0x9280, 0x93F0, 0x94F0, 0x9580, 0x9510, 0x9400, 0x9290, 0x90F0, 0x8F90, 0x8DE0, 0x8BC0, 0x89A0, 0x87C0, + 0x8650, 0x8580, 0x8530, 0x8500, 0x84F0, 0x84E0, 0x84D0, 0x84E0, 0x84E0, 0x84E0, 0x84F0, 0x8500, 0x8500, 0x8510, 0x8510, 0x8510, + 0x8520, 0x8530, 0x8540, 0x8540, 0x8530, 0x8520, 0x84F0, 0x84E0, 0x84C0, 0x84A0, 0x8490, 0x8470, 0x8470, 0x8460, 0x8450, 0x8450, + 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8450, 0x8450, 0x8450, 0x8450, 0x8460, 0x8450, 0x8450, 0x8440, 0x8430, 0x8450, 0x8430, + 0x8420, 0x8410, 0x8410, 0x8410, 0x8400, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8420, + 0x8420, 0x8420, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8440, 0x8430, 0x8450, 0x8450, 0x8460, 0x8470, 0x8490, + 0x84B0, 0x84D0, 0x84F0, 0x8500, 0x84F0, 0x84D0, 0x84C0, 0x8480, 0x84B0, 0x84B0, 0x84C0, 0x84D0, 0x8510, 0x8520, 0x8590, 0x8660, + 0x87B0, 0x8890, 0x87D0, 0x8600, 0x8500, 0x84C0, 0x8490, 0x8470, 0x8460, 0x8450, 0x8430, 0x8430, 0x8430, 0x8420, 0x8420, 0x8420, + 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8420, 0x8420, 0x8430, 0x8410, + 0x8430, 0x8440, 0x8450, 0x8460, 0x8470, 0x8470, 0x84D0, 0x84F0, 0x8510, 0x8550, 0x85E0, 0x8700, 0x8960, 0x8E10, 0x9390, 0x9890, + 0x9C00, 0x9F40, 0xA210, 0xA4E0, 0xA810, 0xAC50, 0xB170, 0xB650, 0xBB00, 0xBEF0, 0xC1F0, 0xC4E0, 0xC6C0, 0xC800, 0xCA90, 0xCD20, + 0xCFF0, 0xD290, 0xD510, 0xD760, 0xD910, 0xD9F0, 0xDBA0, 0xDDD0, 0xDFB0, 0xE210, 0xE420, 0xE650, 0xE890, 0xEB20, 0xEDA0, 0xEFC0, + 0xF2F0, 0xF500, 0xF6C0, 0xF910, 0xFB80, 0xFEB0, 0x0240, 0x06F0, 0x0BE0, 0x1120, 0x1750, 0x1D90, 0x23F0, 0x2B60, 0x33C0, 0x3DD0, + 0x4800, 0x5270, 0x5D90, 0x67A0, 0x7160, 0x7940, 0x7E50, 0x7F20, 0x7EC0, 0x7ED0, 0x7EE0, 0x7F20, 0x7F10, 0x7E90, 0x7E80, 0x7F00, + 0x7EF0, 0x7F00, 0x7E90, 0x7F00, 0x7F20, 0x7F20, 0x7F10, 0x7F00, 0x7F20, 0x7F00, 0x7F10, 0x7F10, 0x7EE0, 0x7F40, 0x7EF0, 0x7F30, + 0x7F20, 0x7F00, 0x7F50, 0x7F20, 0x7F40, 0x7F10, 0x7F10, 0x7F30, 0x7EE0, 0x7EF0, 0x7F10, 0x7A20, 0x5900, 0x3D50, 0x2480, 0x0F80, + 0xFC00, 0xE7C0, 0xD150, 0xB790, 0x9BC0, 0x8730, 0x84F0, 0x84C0, 0x84A0, 0x8490, 0x8440, 0x8480, 0x8470, 0x8470, 0x8470, 0x8450, + 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8470, 0x8470, 0x8480, 0x8490, 0x84B0, 0x84D0, 0x84F0, 0x8540, 0x86D0, 0x8F70, 0x9FC0, + 0xAE40, 0xB990, 0xC400, 0xCD60, 0xD6C0, 0xE010, 0xE8F0, 0xF190, 0xFA20, 0x0170, 0x08B0, 0x0E70, 0x1330, 0x1750, 0x1B60, 0x1FA0, + 0x2440, 0x2870, 0x2E10, 0x3270, 0x3730, 0x3B60, 0x3F50, 0x43D0, 0x4830, 0x4D80, 0x5290, 0x57F0, 0x5CC0, 0x60C0, 0x7000, 0x7290, + 0x74F0, 0x76C0, 0x7810, 0x7A20, 0x7B60, 0x7C70, 0x7CE0, 0x7D40, 0x7DD0, 0x7E30, 0x7EB0, 0x7EC0, 0x7EB0, 0x7F10, 0x7EF0, 0x7F30, + 0x7ED0, 0x7EB0, 0x7F00, 0x7F10, 0x7F10, 0x7F10, 0x7EA0, 0x7EE0, 0x7EF0, 0x7F10, 0x7F20, 0x7F00, 0x7F40, 0x7F10, 0x7F10, 0x7F30, + 0x7F00, 0x7F40, 0x7F10, 0x7F10, 0x7F20, 0x7EE0, 0x7F80, 0x7F10, 0x7F20, 0x7EF0, 0x7EF0, 0x7F90, 0x7F20, 0x7F00, 0x7EF0, 0x7EF0, + 0x7F30, 0x7F10, 0x7EF0, 0x7EE0, 0x7EE0, 0x7F50, 0x7F10, 0x7EA0, 0x7EE0, 0x7ED0, 0x7F60, 0x7F20, 0x7E90, 0x7EB0, 0x7EB0, 0x7F00, + 0x7EF0, 0x7EA0, 0x7F00, 0x7ED0, 0x7F10, 0x7F20, 0x7EC0, 0x7F10, 0x7F10, 0x7F00, 0x7EF0, 0x7EE0, 0x7EF0, 0x7F10, 0x7F20, 0x7F20, + 0x7F00, 0x7F50, 0x7F10, 0x7F20, 0x7EF0, 0x7F10, 0x7F30, 0x7EF0, 0x7F10, 0x7F10, 0x7F10, 0x7F60, 0x7F00, 0x7F10, 0x7F20, 0x7F10, + 0x7F50, 0x7EF0, 0x7EE0, 0x7EF0, 0x7EF0, 0x7F70, 0x7F00, 0x7ED0, 0x7F10, 0x7F10, 0x7F20, 0x7F10, 0x7F00, 0x7EF0, 0x7ED0, 0x7EE0, + 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F00, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F20, 0x7F20, 0x7F20, 0x7F40, 0x7F40, 0x7F10, + 0x7F10, 0x7F10, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, + 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, + 0x7F30, 0x7F20, 0x7F20, 0x7F40, 0x7F20, 0x7F40, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F20, + 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F30, 0x7F20, 0x7520, 0x6750, 0x5980, 0x4A20, + 0x3CF0, 0x2FB0, 0x23A0, 0x1860, 0x0D50, 0x02F0, 0xF9E0, 0xF2D0, 0xECE0, 0xEA10, 0xEA10, 0xEC30, 0xF0A0, 0xF680, 0xFCC0, 0x02E0, + 0x0810, 0x0E20, 0x1370, 0x1990, 0x20A0, 0x2940, 0x3460, 0x4090, 0x4D30, 0x5970, 0x6460, 0x6D10, 0x7490, 0x7A60, 0x7EA0, 0x7F10, + 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, + 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7CA0, 0x73D0, 0x6B80, 0x6330, 0x5B20, 0x5350, 0x4B60, 0x4450, + 0x3D50, 0x3650, 0x2F20, 0x2790, 0x1FB0, 0x17E0, 0x0FC0, 0x07A0, 0xFF90, 0xF830, 0xEFC0, 0xE710, 0xDE30, 0xD550, 0xCBB0, 0xC2A0, + 0xB890, 0xAED0, 0xA4D0, 0x9B00, 0x9130, 0x8A70, 0x8710, 0x85C0, 0x8540, 0x8500, 0x84F0, 0x84E0, 0x84D0, 0x84D0, 0x84D0, 0x84C0, + 0x84C0, 0x84C0, 0x84D0, 0x84D0, 0x84E0, 0x84F0, 0x8500, 0x8530, 0x85B0, 0x86F0, 0x8A80, 0x94C0, 0x9F00, 0xA8F0, 0xB180, 0xB8A0, + 0xBF30, 0xC490, 0xCA10, 0xCF20, 0xD3F0, 0xD830, 0xDC30, 0xE060, 0xE340, 0xE5F0, 0xE700, 0xE5A0, 0xE240, 0xDAA0, 0xCFA0, 0xC1C0, + 0xB070, 0x9C90, 0x8B00, 0x85A0, 0x84F0, 0x84D0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84C0, 0x84C0, 0x84C0, 0x84D0, 0x84E0, + 0x8500, 0x8540, 0x85F0, 0x8900, 0x96D0, 0xA910, 0xBA80, 0xCA10, 0xD5A0, 0xD980, 0xD4F0, 0xC820, 0xB3D0, 0x9B00, 0x8820, 0x8500, + 0x84C0, 0x8490, 0x8480, 0x8460, 0x8450, 0x8440, 0x8430, 0x8430, 0x8420, 0x8410, 0x8420, 0x8410, 0x8400, 0x8410, 0x8410, 0x8410, + 0x8400, 0x8400, 0x8400, 0x83F0, 0x83F0, 0x83C0, 0x83F0, 0x83F0, 0x83E0, 0x83E0, 0x83E0, 0x83B0, 0x83F0, 0x83E0, 0x83E0, 0x83F0, + 0x83C0, 0x83F0, 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8400, 0x83F0, 0x8400, 0x8400, 0x8400, 0x8400, 0x8410, 0x8410, 0x8420, 0x8410, + 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8400, 0x8400, 0x8430, 0x8400, 0x8410, 0x8400, 0x83F0, 0x83F0, 0x83E0, + 0x8410, 0x83E0, 0x83E0, 0x83D0, 0x83F0, 0x83D0, 0x83D0, 0x83D0, 0x83C0, 0x83D0, 0x83D0, 0x83E0, 0x83E0, 0x83E0, 0x83F0, 0x83E0, + 0x8400, 0x8400, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8400, 0x8410, 0x8410, 0x8410, 0x8410, 0x8400, 0x8400, + 0x8410, 0x8400, 0x8400, 0x8400, 0x8400, 0x8410, 0x8410, 0x8410, 0x8410, 0x8420, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, + 0x8430, 0x8430, 0x8430, 0x8440, 0x8440, 0x8440, 0x8450, 0x8480, 0x8450, 0x8460, 0x8430, 0x8470, 0x8460, 0x8490, 0x84A0, 0x84C0, + 0x84E0, 0x8520, 0x8580, 0x86B0, 0x8950, 0x8DB0, 0x9260, 0x9740, 0xAE30, 0xB190, 0xB570, 0xBAD0, 0xC2C0, 0xCC80, 0xD6D0, 0xE0D0, + 0xE840, 0xEDD0, 0xF0A0, 0xF210, 0xF450, 0xF850, 0xFFD0, 0x0A30, 0x17A0, 0x2820, 0x38E0, 0x48F0, 0x55E0, 0x5EA0, 0x6480, 0x6730, + 0x6820, 0x6750, 0x66D0, 0x67B0, 0x69E0, 0x6E60, 0x74F0, 0x7C20, 0x7EF0, 0x7EF0, 0x7F70, 0x7F00, 0x7EC0, 0x7F10, 0x7F10, 0x7F20, + 0x7EE0, 0x7EC0, 0x7EF0, 0x7F10, 0x7F30, 0x7F00, 0x7EC0, 0x7F10, 0x7F00, 0x7F00, 0x7F10, 0x7E90, 0x7F10, 0x7EE0, 0x7EF0, 0x7F10, + 0x7F00, 0x7F40, 0x7F10, 0x7F20, 0x7F20, 0x7F00, 0x7F50, 0x7EF0, 0x7F20, 0x7EF0, 0x7EF0, 0x7F90, 0x7EE0, 0x7F10, 0x7F30, 0x7F00, + 0x7F80, 0x7F10, 0x7F10, 0x7EE0, 0x7EE0, 0x7F70, 0x7EE0, 0x7EF0, 0x7EF0, 0x7F00, 0x7F60, 0x7F10, 0x7E90, 0x7EB0, 0x7EF0, 0x7F30, + 0x7EE0, 0x7EC0, 0x7ED0, 0x7EE0, 0x7F00, 0x7F10, 0x7E90, 0x7EE0, 0x7F00, 0x7F10, 0x7F10, 0x7E90, 0x7F00, 0x7EF0, 0x7F10, 0x7F20, + 0x7EC0, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F00, 0x7F30, 0x7EF0, 0x7F10, 0x7F10, 0x7EF0, 0x7F40, 0x7EF0, 0x7F30, 0x7F20, 0x7F00, + 0x7F50, 0x7EF0, 0x7F40, 0x7F10, 0x7F00, 0x7F60, 0x7EF0, 0x7EF0, 0x7F10, 0x7F20, 0x7F70, 0x7F00, 0x7EE0, 0x7F00, 0x7F10, 0x7F30, + 0x7EE0, 0x7E70, 0x7EF0, 0x7F10, 0x7F30, 0x7ED0, 0x7EB0, 0x7F00, 0x7F00, 0x7EF0, 0x7F10, 0x7EA0, 0x7F20, 0x7F10, 0x7F00, 0x7F00, + 0x7EC0, 0x7F30, 0x7F00, 0x7F20, 0x7F40, 0x7F10, 0x7F40, 0x7F10, 0x7F10, 0x7F20, 0x7EE0, 0x7F80, 0x7F10, 0x7F20, 0x7F00, 0x7F20, + 0x7F80, 0x7F10, 0x7F10, 0x7EF0, 0x7EE0, 0x7F80, 0x7F10, 0x7F00, 0x7EF0, 0x7EF0, 0x7F70, 0x7F20, 0x7EE0, 0x7ED0, 0x7EB0, 0x7F30, + 0x7EF0, 0x7EB0, 0x7EC0, 0x7EC0, 0x7EF0, 0x7F10, 0x7EA0, 0x7ED0, 0x7F10, 0x7F10, 0x7F00, 0x7E90, 0x7EB0, 0x7F00, 0x7EF0, 0x7EF0, + 0x7F00, 0x7F20, 0x7F40, 0x7F20, 0x7F20, 0x7F00, 0x7F10, 0x7F10, 0x7F20, 0x7EF0, 0x7EF0, 0x7F70, 0x7F10, 0x7F20, 0x7F20, 0x7F10, + 0x7F50, 0x7F10, 0x7F20, 0x7EF0, 0x7F10, 0x7F30, 0x7F00, 0x7EF0, 0x7F10, 0x7F10, 0x7F60, 0x7EF0, 0x7ED0, 0x7EF0, 0x7F10, 0x7F70, + 0x7EE0, 0x7EA0, 0x7EF0, 0x7F10, 0x7F30, 0x7EE0, 0x7EC0, 0x7F10, 0x7F20, 0x7F40, 0x7EF0, 0x7E90, 0x7F00, 0x7EE0, 0x7EF0, 0x7F10, + 0x7EA0, 0x7EC0, 0x7ED0, 0x7F10, 0x7F00, 0x7E90, 0x7EF0, 0x7F20, 0x7F20, 0x7F10, 0x7EC0, 0x7EF0, 0x7F20, 0x7F20, 0x7F20, 0x7F00, + 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F40, 0x7EF0, 0x7F10, 0x7F10, 0x7F20, 0x7F60, 0x7F10, 0x7F40, 0x7F00, 0x7EE0, 0x7EF0, + 0x7F10, 0x7F20, 0x7EF0, 0x7EF0, 0x7F10, 0x7F20, 0x7F00, 0x7C50, 0x7A30, 0x78F0, 0x7900, 0x7AA0, 0x7CD0, 0x7EB0, 0x7F10, 0x7F20, + 0x7F40, 0x7F10, 0x7F10, 0x7EE0, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F00, 0x7F40, 0x7F30, 0x7F30, 0x7F30, 0x7F10, 0x7F30, 0x7F30, + 0x7F40, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F40, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F50, 0x7F40, 0x7F30, 0x7F30, + 0x7F30, 0x7F40, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7DB0, 0x7B60, 0x7880, 0x7480, 0x7030, 0x6BE0, 0x6720, 0x6250, + 0x5D80, 0x57E0, 0x5290, 0x4D90, 0x4920, 0x4480, 0x4010, 0x3AD0, 0x3570, 0x2FE0, 0x2A00, 0x24B0, 0x1FF0, 0x1C40, 0x1950, 0x1710, + 0x15C0, 0x1520, 0x14C0, 0x1400, 0x1380, 0x1210, 0x1010, 0x1030, 0x1160, 0x14E0, 0x1A40, 0x2190, 0x2AF0, 0x34E0, 0x3F60, 0x49C0, + 0x5490, 0x5F30, 0x6900, 0x7200, 0x79C0, 0x7E90, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7A70, 0x6E20, + 0x6280, 0x5830, 0x5170, 0x4CA0, 0x48B0, 0x4370, 0x3BD0, 0x2F40, 0x1FB0, 0x0C30, 0xF600, 0xDF40, 0xC700, 0xAFE0, 0x9900, 0x88F0, + 0x8520, 0x84D0, 0x84D0, 0x8490, 0x8470, 0x8460, 0x8450, 0x8440, 0x8440, 0x8430, 0x8430, 0x8420, 0x8410, 0x8410, 0x8400, 0x8400, + 0x8400, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83E0, 0x83F0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83F0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, + 0x83E0, 0x83E0, 0x83E0, 0x83D0, 0x83F0, 0x83F0, 0x8420, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, + 0x8400, 0x8400, 0x8400, 0x8400, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8400, 0x8400, 0x8400, 0x8400, + 0x8400, 0x83F0, 0x83F0, 0x83F0, 0x83E0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, + 0x83E0, 0x83E0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, + 0x83C0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x8350, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83A0, + 0x83A0, 0x83A0, 0x83A0, 0x83A0, 0x83A0, 0x83A0, 0x83A0, 0x83B0, 0x83B0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83D0, 0x83D0, + 0x83D0, 0x83D0, 0x83D0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83F0, 0x8410, 0x8400, 0x8410, 0x8410, 0x8420, 0x8430, 0x8440, + 0x8460, 0x8460, 0x8470, 0x8490, 0x8490, 0x84A0, 0x84B0, 0x84A0, 0x8490, 0x8490, 0x8480, 0x8480, 0x8470, 0x8470, 0x8470, 0x8470, + 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8490, 0x8490, 0x84A0, 0x84C0, 0x84E0, 0x8530, 0x86D0, 0x9220, 0xA740, 0xBC00, + 0xD030, 0xE410, 0xF4A0, 0x0250, 0x0C60, 0x1180, 0x13C0, 0x1240, 0x0E30, 0x0870, 0x01E0, 0xFB90, 0xF4D0, 0xEF00, 0xEB70, 0xEB80, + 0xEEA0, 0xF460, 0xFD10, 0x0650, 0x0F30, 0x17C0, 0x1F50, 0x2630, 0x2DF0, 0x3720, 0x42B0, 0x4FD0, 0x5EB0, 0x6E60, 0x7C10, 0x7F00, + 0x7F10, 0x7F30, 0x7EB0, 0x7E70, 0x7EF0, 0x7EF0, 0x7F30, 0x7F20, 0x7EB0, 0x7F00, 0x7F10, 0x7F10, 0x7F10, 0x7EA0, 0x7F10, 0x7EF0, + 0x7F20, 0x7F00, 0x7EC0, 0x7F30, 0x7F10, 0x7F20, 0x7F40, 0x7F10, 0x7F70, 0x7EE0, 0x7F10, 0x7F20, 0x7F00, 0x7F70, 0x7EF0, 0x7F20, + 0x7F20, 0x7F00, 0x7F90, 0x7F20, 0x7F20, 0x7EF0, 0x7EF0, 0x7F60, 0x7EE0, 0x7ED0, 0x7EF0, 0x7F10, 0x7F10, 0x7EF0, 0x7F60, 0x7EF0, + 0x7EF0, 0x7F00, 0x7ED0, 0x7F30, 0x7F00, 0x7EC0, 0x7ED0, 0x7EE0, 0x7F20, 0x7F00, 0x7EB0, 0x7EB0, 0x7EE0, 0x7F10, 0x7F10, 0x7E90, + 0x7EE0, 0x7EF0, 0x7F10, 0x7EF0, 0x7E90, 0x7F00, 0x7F20, 0x7F00, 0x7F10, 0x7F00, 0x7F20, 0x7F00, 0x7F10, 0x7F10, 0x7EE0, 0x7F40, + 0x7F10, 0x7F20, 0x7F20, 0x7F00, 0x7F50, 0x7F20, 0x7F40, 0x7F10, 0x7F10, 0x7F30, 0x7EE0, 0x7EF0, 0x7F10, 0x7F20, 0x7F50, 0x7F00, + 0x7F00, 0x7F00, 0x7F10, 0x7F30, 0x7EE0, 0x7EA0, 0x7EF0, 0x7EE0, 0x7F50, 0x7ED0, 0x7EB0, 0x7F00, 0x7F00, 0x7F10, 0x7F10, 0x7EA0, + 0x7EF0, 0x7EF0, 0x7EF0, 0x7EF0, 0x7EB0, 0x7F20, 0x7F00, 0x7F10, 0x7F10, 0x7EC0, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7EE0, 0x7F50, + 0x7F10, 0x7F20, 0x7F10, 0x7F10, 0x7F60, 0x7F00, 0x7F10, 0x7F10, 0x7EF0, 0x7F60, 0x7EF0, 0x7F20, 0x7EF0, 0x7EF0, 0x7F80, 0x7F20, + 0x7F00, 0x7EF0, 0x7ED0, 0x7F30, 0x7F10, 0x7EB0, 0x7EE0, 0x7EE0, 0x7EF0, 0x7F10, 0x7EA0, 0x7EC0, 0x7ED0, 0x7F50, 0x7F10, 0x7E90, + 0x7EB0, 0x7EE0, 0x7EF0, 0x7F10, 0x7EA0, 0x7F00, 0x7F10, 0x7F10, 0x7F20, 0x7EC0, 0x7F10, 0x7F10, 0x7F00, 0x7EF0, 0x7EF0, 0x7F00, + 0x7F00, 0x7F10, 0x7F10, 0x7F20, 0x7F60, 0x7F10, 0x7F10, 0x7EF0, 0x7F10, 0x7F50, 0x7EF0, 0x7F20, 0x7EF0, 0x7EF0, 0x7F80, 0x7F00, + 0x7EE0, 0x7F00, 0x7F00, 0x7F90, 0x7EF0, 0x7EE0, 0x7EE0, 0x7EF0, 0x7F30, 0x7F00, 0x7EC0, 0x7F10, 0x7F10, 0x7F30, 0x7EE0, 0x7E90, + 0x7F00, 0x7EF0, 0x7EF0, 0x7EB0, 0x7E70, 0x7EF0, 0x7EF0, 0x7F10, 0x7F20, 0x7F00, 0x7F10, 0x7F10, 0x7F10, 0x7F10, 0x7F00, 0x7F20, + 0x7EF0, 0x7F10, 0x7F30, 0x7F20, 0x7F80, 0x7F00, 0x7F20, 0x7F40, 0x7F10, 0x7F70, 0x7EE0, 0x7EF0, 0x7EF0, 0x7F00, 0x7F90, 0x7F10, + 0x7F20, 0x7F10, 0x7EF0, 0x7F70, 0x7F00, 0x7EC0, 0x7ED0, 0x7EF0, 0x7F60, 0x7EF0, 0x7EB0, 0x7EE0, 0x7EE0, 0x7F10, 0x7F10, 0x7E90, + 0x7ED0, 0x7ED0, 0x7F10, 0x7F00, 0x7E90, 0x7EF0, 0x7F10, 0x7F20, 0x7F20, 0x7EB0, 0x7F00, 0x7F10, 0x7F10, 0x7F10, 0x7EE0, 0x7F40, + 0x7F10, 0x7F30, 0x7EF0, 0x7F00, 0x7F30, 0x7F20, 0x7F00, 0x7550, 0x6A30, 0x5DF0, 0x5140, 0x4300, 0x35C0, 0x2880, 0x1AA0, 0x0CE0, + 0xFF10, 0xF1B0, 0xE390, 0xD540, 0xC680, 0xB900, 0xAB90, 0x9E60, 0x91D0, 0x8950, 0x8610, 0x8560, 0x84F0, 0x84D0, 0x84C0, 0x84B0, + 0x84A0, 0x8490, 0x8490, 0x8480, 0x8480, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, + 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, + 0x8450, 0x8450, 0x8450, 0x8450, 0x8460, 0x8460, 0x8460, 0x8470, 0x8470, 0x8480, 0x8480, 0x8490, 0x8490, 0x84A0, 0x84A0, 0x84B0, + 0x84C0, 0x84C0, 0x84D0, 0x84D0, 0x84E0, 0x84F0, 0x84F0, 0x84F0, 0x8500, 0x84F0, 0x8500, 0x8500, 0x84E0, 0x84D0, 0x84D0, 0x84D0, + 0x84E0, 0x84C0, 0x84B0, 0x84B0, 0x84B0, 0x84A0, 0x84B0, 0x8490, 0x8480, 0x8480, 0x8470, 0x8470, 0x8440, 0x8460, 0x8450, 0x8450, + 0x8450, 0x8440, 0x8440, 0x8430, 0x8440, 0x8430, 0x8430, 0x8430, 0x8430, 0x8420, 0x8420, 0x8410, 0x8410, 0x8410, 0x8410, 0x8400, + 0x8400, 0x83F0, 0x83F0, 0x83F0, 0x8400, 0x83E0, 0x83E0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, + 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83D0, 0x83D0, 0x83D0, 0x83C0, 0x83E0, 0x83E0, + 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83F0, 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8410, 0x8410, 0x8410, 0x8420, 0x8420, + 0x8410, 0x8420, 0x8420, 0x8460, 0x8430, 0x8430, 0x8440, 0x8440, 0x8440, 0x8450, 0x8460, 0x8460, 0x8470, 0x8480, 0x8490, 0x8490, + 0x84B0, 0x84C0, 0x84E0, 0x8530, 0x8680, 0x8FA0, 0xA270, 0xB450, 0xC540, 0xD480, 0xE140, 0xEC80, 0xF3C0, 0xF840, 0xF990, 0xF7B0, + 0xF350, 0xECE0, 0xE4B0, 0xDBB0, 0xD170, 0xC6D0, 0xBC80, 0xB2F0, 0xAAC0, 0xA380, 0x9C40, 0x9590, 0x8E80, 0x88D0, 0x85E0, 0x8500, + 0x84C0, 0x84A0, 0x8480, 0x8470, 0x8460, 0x8450, 0x8450, 0x8470, 0x8430, 0x8430, 0x8410, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, + 0x8430, 0x8430, 0x8430, 0x8430, 0x8440, 0x8440, 0x8440, 0x8440, 0x8450, 0x8450, 0x8450, 0x8460, 0x8460, 0x8470, 0x8470, 0x8480, + 0x8480, 0x8490, 0x8490, 0x84B0, 0x84B0, 0x84D0, 0x84F0, 0x8540, 0x8600, 0x88C0, 0x9170, 0x9DF0, 0xA9F0, 0xB690, 0xC1E0, 0xCCB0, + 0xD770, 0xE130, 0xEB20, 0xF450, 0xFD10, 0x05C0, 0x0DE0, 0x15C0, 0x1DF0, 0x25F0, 0x2F20, 0x3780, 0x4050, 0x4960, 0x51E0, 0x5C10, + 0x6520, 0x6E80, 0x76D0, 0x7D70, 0x7F20, 0x7F00, 0x7F50, 0x7F10, 0x7F20, 0x7F10, 0x7F10, 0x7F30, 0x7EF0, 0x7F10, 0x7F10, 0x7F20, + 0x7F60, 0x7F10, 0x7F20, 0x7F00, 0x7F10, 0x7F50, 0x7EF0, 0x7EE0, 0x7EF0, 0x7F10, 0x7F50, 0x7F00, 0x7F00, 0x7F00, 0x7F10, 0x7F30, + 0x7EE0, 0x7E70, 0x7EF0, 0x7F10, 0x7F30, 0x7EC0, 0x7E90, 0x7F00, 0x7F00, 0x7F20, 0x7F10, 0x7EB0, 0x7F00, 0x7F10, 0x7F10, 0x7F00, + 0x7EC0, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7EC0, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F60, 0x7EE0, 0x7EF0, 0x7F20, 0x7EF0, + 0x7F80, 0x7F20, 0x7F20, 0x7F10, 0x7EF0, 0x7F70, 0x7EE0, 0x7F10, 0x7EF0, 0x7EE0, 0x7F60, 0x7EF0, 0x7ED0, 0x7EE0, 0x7EE0, 0x7F30, + 0x7F00, 0x7EC0, 0x7ED0, 0x7ED0, 0x7F10, 0x7F00, 0x7E90, 0x7ED0, 0x7F10, 0x7EF0, 0x7F10, 0x7EA0, 0x7F00, 0x7F10, 0x7F10, 0x7F00, + 0x7EC0, 0x7F10, 0x7F00, 0x7F20, 0x7EF0, 0x7F00, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7EF0, 0x7F10, + 0x7F60, 0x7F00, 0x7F20, 0x7EF0, 0x7F10, 0x7F60, 0x7F00, 0x7F10, 0x7EF0, 0x7EE0, 0x7F60, 0x7EF0, 0x7EB0, 0x7EF0, 0x7EF0, 0x7F70, + 0x7F00, 0x7EC0, 0x7EF0, 0x7F10, 0x7F20, 0x7EC0, 0x7EB0, 0x7EE0, 0x7EF0, 0x7F10, 0x7F00, 0x7EA0, 0x7F00, 0x7EB0, 0x7EE0, 0x7EF0, + 0x7F30, 0x7EE0, 0x7EC0, 0x7ED0, 0x7EE0, 0x7EF0, 0x7F10, 0x7EB0, 0x7F20, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7F10, 0x7F10, 0x7F00, + 0x7F20, 0x7EF0, 0x7F80, 0x7F20, 0x7F20, 0x7F10, 0x7F20, 0x7F80, 0x7F10, 0x7F10, 0x7EF0, 0x7EE0, 0x7F80, 0x7F10, 0x7F00, 0x7F20, + 0x7F00, 0x7F80, 0x7F10, 0x7EF0, 0x7EE0, 0x7EE0, 0x7F50, 0x7F10, 0x7F10, 0x7F00, 0x7F00, 0x7F50, 0x7F10, 0x7EA0, 0x7EC0, 0x7ED0, + 0x7F10, 0x7F10, 0x7E90, 0x7EB0, 0x7EF0, 0x7F10, 0x7F20, 0x7EC0, 0x7F00, 0x7F10, 0x7F20, 0x7F20, 0x7F00, 0x7F10, 0x7F10, 0x7F20, + 0x7EF0, 0x7EF0, 0x7DB0, 0x7A40, 0x7640, 0x72F0, 0x6F00, 0x6B20, 0x6690, 0x6200, 0x5DB0, 0x5940, 0x53B0, 0x4EA0, 0x48F0, 0x4490, + 0x3F30, 0x3A60, 0x3540, 0x3050, 0x2C70, 0x27C0, 0x23F0, 0x2110, 0x1D70, 0x1B00, 0x1890, 0x15F0, 0x14A0, 0x1360, 0x12E0, 0x12C0, + 0x12B0, 0x13A0, 0x1460, 0x15E0, 0x1710, 0x18F0, 0x1BC0, 0x1E40, 0x2170, 0x2470, 0x2720, 0x2B50, 0x2EB0, 0x32B0, 0x3670, 0x3A00, + 0x3E00, 0x4080, 0x42D0, 0x4550, 0x46E0, 0x49A0, 0x4B10, 0x4D70, 0x4F10, 0x50C0, 0x5250, 0x5370, 0x5430, 0x54E0, 0x5490, 0x54B0, + 0x54A0, 0x5460, 0x5420, 0x5380, 0x53D0, 0x53B0, 0x53A0, 0x5420, 0x53C0, 0x5450, 0x54A0, 0x54E0, 0x54D0, 0x5430, 0x5340, 0x5180, + 0x4E90, 0x4C90, 0x4A00, 0x47C0, 0x4570, 0x42F0, 0x4120, 0x3D90, 0x39D0, 0x34C0, 0x2E80, 0x2810, 0x1FB0, 0x1580, 0x0A80, 0xFE70, + 0xF1A0, 0xE2E0, 0xD3C0, 0xC370, 0xB270, 0xA170, 0x8F60, 0x8720, 0x8530, 0x84E0, 0x84C0, 0x84B0, 0x84B0, 0x8490, 0x84A0, 0x84B0, + 0x84B0, 0x84D0, 0x84F0, 0x8530, 0x85D0, 0x8790, 0x8B90, 0x92C0, 0x9A70, 0xA1B0, 0xA810, 0xAE50, 0xB470, 0xB960, 0xBCF0, 0xBE10, + 0xBC90, 0xB7B0, 0xB090, 0xA6F0, 0x9BF0, 0x9090, 0x8900, 0x85F0, 0x8510, 0x84D0, 0x84B0, 0x8490, 0x8480, 0x8470, 0x8470, 0x8460, + 0x8460, 0x8460, 0x8450, 0x8460, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8460, 0x8460, 0x8470, 0x8470, 0x8480, 0x8480, + 0x8490, 0x8490, 0x8490, 0x84A0, 0x84B0, 0x84D0, 0x84B0, 0x84C0, 0x84D0, 0x84D0, 0x84E0, 0x84F0, 0x8510, 0x8530, 0x8560, 0x85B0, + 0x8620, 0x86D0, 0x87E0, 0x8940, 0x8B10, 0x8CE0, 0x8FB0, 0x9360, 0x9820, 0x9E20, 0xA5C0, 0xAEE0, 0xB8C0, 0xC450, 0xD140, 0xDF00, + 0xEFF0, 0xFFC0, 0x1050, 0x20B0, 0x3080, 0x3FA0, 0x4D90, 0x5AD0, 0x6630, 0x7100, 0x7A00, 0x7EB0, 0x7F60, 0x7EF0, 0x7F10, 0x7F10, + 0x7F20, 0x7F60, 0x7F10, 0x7F20, 0x7F10, 0x7F00, 0x7EE0, 0x7EF0, 0x7F10, 0x7F20, 0x7F20, 0x7F00, 0x7F10, 0x7F10, 0x7F20, 0x7F10, + 0x7EF0, 0x7F30, 0x7F20, 0x7F10, 0x7F10, 0x7F00, 0x7F20, 0x6050, 0x2690, 0xF290, 0xC6B0, 0xA370, 0x9090, 0x8AC0, 0x8C60, 0x9630, + 0xA670, 0xB800, 0xC930, 0xD780, 0xE2C0, 0xEA60, 0xEE50, 0xF130, 0xF4C0, 0xFAB0, 0x0310, 0x0EB0, 0x1B40, 0x27B0, 0x3060, 0x3580, + 0x3750, 0x3730, 0x3620, 0x3540, 0x3480, 0x33B0, 0x3380, 0x32E0, 0x3110, 0x2E10, 0x29E0, 0x25C0, 0x2110, 0x1D10, 0x1970, 0x1620, + 0x13D0, 0x1110, 0x0D70, 0x0A40, 0x06B0, 0x0250, 0xFE20, 0xFB00, 0xF7A0, 0xF4A0, 0xF140, 0xEE20, 0xEB50, 0xE7D0, 0xE4B0, 0xE240, + 0xE100, 0xE0B0, 0xE210, 0xE3A0, 0xE620, 0xE920, 0xEC20, 0xEFB0, 0xF230, 0xF470, 0xF6C0, 0xF840, 0xF960, 0xF9A0, 0xFA10, 0xF990, + 0xF830, 0xF670, 0xF350, 0xF0B0, 0xEDF0, 0xEC60, 0xEBF0, 0xEC80, 0xEEC0, 0xF2A0, 0xF6D0, 0xFB30, 0xFF00, 0x01C0, 0x02D0, 0x02A0, + 0x0140, 0xFF70, 0xFCF0, 0xFAF0, 0xF970, 0xF7D0, 0xF670, 0xF4E0, 0xF440, 0xF450, 0xF580, 0x0B90, 0x1820, 0x2810, 0x3A10, 0x4BA0, + 0x5BA0, 0x6800, 0x7050, 0x7520, 0x7780, 0x7910, 0x7B10, 0x7DA0, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, + 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F30, 0x7F20, + 0x7F10, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F10, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F10, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7EF0, + 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F90, 0x7F30, 0x7EE0, 0x7F20, 0x7F10, 0x7F50, 0x7F20, 0x7EA0, 0x7F10, 0x7F10, 0x7F40, 0x7F00, + 0x7E90, 0x7E90, 0x7EE0, 0x7EF0, 0x7ED0, 0x7EA0, 0x7F00, 0x7F10, 0x7F30, 0x7F00, 0x7EC0, 0x7F10, 0x7F00, 0x7F00, 0x7F10, 0x7F00, + 0x7F20, 0x7EF0, 0x7F10, 0x7F00, 0x7F00, 0x7D40, 0x78B0, 0x71B0, 0x6970, 0x5E00, 0x51C0, 0x43D0, 0x34B0, 0x24B0, 0x1400, 0x02F0, + 0xF250, 0xE0A0, 0xCF60, 0xC000, 0xB2A0, 0xA7B0, 0xA100, 0x9EA0, 0xA130, 0xA970, 0xB700, 0xC950, 0xDD40, 0xF2A0, 0x06D0, 0x1970, + 0x2860, 0x34E0, 0x3DD0, 0x43E0, 0x4840, 0x4AA0, 0x4BD0, 0x4D20, 0x4DA0, 0x4F10, 0x5080, 0x5270, 0x5420, 0x5430, 0x5270, 0x4D00, + 0x4790, 0x43E0, 0x44C0, 0x4BC0, 0x53F0, 0x59F0, 0x5860, 0x4D40, 0x3950, 0x1EA0, 0x0100, 0xE270, 0xC550, 0xAA30, 0x9040, 0x8580, + 0x84D0, 0x8490, 0x8480, 0x8470, 0x8460, 0x8460, 0x8450, 0x8450, 0x8450, 0x8440, 0x8430, 0x8410, 0x83F0, 0x83E0, 0x83C0, 0x83A0, + 0x8390, 0x8380, 0x8370, 0x8370, 0x8370, 0x8370, 0x8370, 0x8380, 0x8380, 0x8390, 0x8390, 0x8390, 0x8390, 0x8390, 0x83A0, 0x83A0, + 0x83A0, 0x83A0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83C0, 0x83C0, 0x83C0, 0x83D0, 0x8400, 0x83D0, 0x83D0, 0x83E0, + 0x83A0, 0x83E0, 0x83E0, 0x83F0, 0x8380, 0x8400, 0x8400, 0x8410, 0x8420, 0x8410, 0x8410, 0x8430, 0x8440, 0x8410, 0x8420, 0x8420, + 0x8420, 0x8430, 0x8430, 0x8430, 0x8430, 0x8440, 0x83F0, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8460, 0x8450, 0x8450, 0x8450, + 0x8450, 0x8450, 0x8440, 0x8440, 0x8440, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8440, 0x8440, 0x8450, + 0x8450, 0x8450, 0x8470, 0x8460, 0x8460, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8480, 0x8480, 0x8480, 0x8480, 0x8490, + 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84B0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, + 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8480, 0x8480, 0x8480, 0x8430, 0x8480, 0x8480, 0x8470, 0x8470, 0x8470, 0x8470, 0x8460, + 0x8460, 0x8460, 0x8460, 0x8450, 0x8450, 0x8450, 0x8440, 0x8440, 0x8460, 0x8440, 0x8440, 0x8440, 0x8460, 0x8440, 0x8440, 0x8440, + 0x8440, 0x8440, 0x8440, 0x8440, 0x8450, 0x8450, 0x8480, 0x8450, 0x8460, 0x8460, 0x8440, 0x8470, 0x8470, 0x8480, 0x8480, 0x8490, + 0x84A0, 0x84B0, 0x84E0, 0x8530, 0x8690, 0x9090, 0xA450, 0xB7A0, 0xCB60, 0xDE10, 0xF040, 0x0300, 0x14D0, 0x2700, 0x3860, 0x4B40, + 0x5C80, 0x6E40, 0x7BD0, 0x7F10, 0x7F10, 0x7EE0, 0x7F50, 0x7F10, 0x7F20, 0x7F20, 0x7EF0, 0x7F70, 0x7F00, 0x7F40, 0x7F10, 0x7F10, + 0x7F60, 0x7EE0, 0x7ED0, 0x7EE0, 0x7EF0, 0x7F80, 0x7F00, 0x7EE0, 0x7F10, 0x7F10, 0x7F30, 0x7EE0, 0x7EB0, 0x7EE0, 0x7EF0, 0x7F30, + 0x7EE0, 0x7EC0, 0x7F10, 0x7F10, 0x7F20, 0x7EE0, 0x7E90, 0x7F10, 0x7EF0, 0x7EF0, 0x7F10, 0x7F00, 0x7F20, 0x7F00, 0x7F10, 0x7F20, + 0x7F00, 0x7F10, 0x7EF0, 0x7F00, 0x7F20, 0x7EF0, 0x7F80, 0x7EE0, 0x7F10, 0x7EF0, 0x7F10, 0x7F70, 0x7F00, 0x7F10, 0x7EF0, 0x7EE0, + 0x7F70, 0x7EF0, 0x7EF0, 0x7EF0, 0x7F00, 0x7F70, 0x7F00, 0x7ED0, 0x7EB0, 0x7F00, 0x7F70, 0x7F10, 0x7EB0, 0x7EC0, 0x7EC0, 0x7EF0, + 0x7F20, 0x7EA0, 0x7ED0, 0x7EE0, 0x7F20, 0x7F10, 0x7E90, 0x7EF0, 0x7F00, 0x7EF0, 0x7EF0, 0x7E70, 0x7EE0, 0x7F10, 0x7F10, 0x7F20, + 0x7F00, 0x7F10, 0x7F10, 0x7F20, 0x7EF0, 0x7F00, 0x7F20, 0x7EF0, 0x7F10, 0x7F10, 0x7F00, 0x7F60, 0x7EF0, 0x7F40, 0x7F10, 0x7F00, + 0x7F30, 0x7EE0, 0x7F10, 0x7F10, 0x7F00, 0x7F70, 0x7EF0, 0x7F10, 0x7F00, 0x7F10, 0x7F50, 0x7EB0, 0x7E70, 0x7EE0, 0x7EF0, 0x7F30, + 0x7EC0, 0x7EB0, 0x7F10, 0x7F00, 0x7F40, 0x7EF0, 0x7E90, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7EA0, 0x7EF0, 0x7F10, 0x7F20, 0x7F40, + 0x7F00, 0x7F20, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7F40, 0x7EF0, 0x7F30, 0x7F20, 0x7F00, 0x7F60, 0x7F10, 0x7F10, 0x7F10, 0x7EE0, + 0x7F70, 0x7F10, 0x7F20, 0x7F20, 0x7EF0, 0x7F90, 0x7F20, 0x6280, 0x3EC0, 0x16D0, 0xEC60, 0xC040, 0x90E0, 0x8500, 0x84B0, 0x8480, + 0x8470, 0x8460, 0x8480, 0x8450, 0x8440, 0x8440, 0x8440, 0x8430, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, + 0x8440, 0x8450, 0x8440, 0x8440, 0x8450, 0x8450, 0x8440, 0x8440, 0x8440, 0x8430, 0x8430, 0x8430, 0x8430, 0x8420, 0x8420, 0x8420, + 0x8420, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x83F0, 0x83F0, 0x83F0, + 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8400, 0x8410, 0x8410, 0x8410, 0x8420, + 0x8430, 0x8430, 0x8430, 0x8440, 0x8450, 0x8450, 0x8460, 0x8460, 0x8470, 0x8470, 0x8480, 0x8490, 0x8490, 0x84A0, 0x84D0, 0x84C0, + 0x84D0, 0x84D0, 0x84C0, 0x84B0, 0x84A0, 0x8490, 0x8480, 0x8470, 0x8460, 0x8450, 0x8440, 0x8440, 0x8430, 0x8430, 0x8420, 0x8420, + 0x8410, 0x8410, 0x8410, 0x8410, 0x8400, 0x8400, 0x8400, 0x8410, 0x8410, 0x8410, 0x8410, 0x8420, 0x8420, 0x8430, 0x8430, 0x8440, + 0x8440, 0x8450, 0x8450, 0x8460, 0x8470, 0x8480, 0x8480, 0x8490, 0x8490, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84B0, 0x84A0, 0x84A0, + 0x84A0, 0x84A0, 0x8490, 0x8490, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84B0, 0x84B0, 0x84C0, 0x84C0, 0x84D0, 0x84E0, 0x84E0, 0x84F0, + 0x8500, 0x8510, 0x8530, 0x8560, 0x85A0, 0x8610, 0x86F0, 0x8840, 0x8A20, 0x8CC0, 0x8F90, 0x9270, 0x9540, 0x97A0, 0x9990, 0x9B10, + 0x9CD0, 0x9E40, 0x9F80, 0xA070, 0xA0D0, 0xA170, 0xA2F0, 0xA450, 0xA5E0, 0xA7E0, 0xA9C0, 0xABE0, 0xADE0, 0xB0B0, 0xB460, 0xB8D0, + 0xBD70, 0xC1F0, 0xC700, 0xCC80, 0xD1C0, 0xD760, 0xDD50, 0xE430, 0xEAA0, 0xF110, 0xF7A0, 0xFE00, 0x03F0, 0x0A30, 0x1150, 0x1820, + 0x1F10, 0x2530, 0x2AE0, 0x30C0, 0x3650, 0x3BB0, 0x4130, 0x4700, 0x4C50, 0x5240, 0x5740, 0x5B70, 0x6110, 0x65E0, 0x69D0, 0x6E50, + 0x7180, 0x7500, 0x77C0, 0x7970, 0x7B90, 0x7BE0, 0x7C80, 0x7CD0, 0x7C70, 0x7BF0, 0x7460, 0x7150, 0x6D90, 0x68B0, 0x6400, 0x5E10, + 0x5910, 0x5320, 0x4BF0, 0x4550, 0x3DB0, 0x3680, 0x2EE0, 0x2640, 0x1ED0, 0x16A0, 0x0F60, 0x0870, 0x0230, 0xFD70, 0xF8C0, 0xF580, + 0xF290, 0xF090, 0xF020, 0xEF80, 0xEFD0, 0xEF60, 0xEF20, 0xEED0, 0xEDF0, 0xEC60, 0xEA40, 0xE6F0, 0xE3B0, 0xDF30, 0xDA10, 0xD4C0, + 0xCE80, 0xC8F0, 0xC2E0, 0xBCD0, 0xB670, 0xAFD0, 0xA850, 0xA0D0, 0x9980, 0x9160, 0x8BA0, 0x8820, 0x8650, 0x8580, 0x8530, 0x8500, + 0x84E0, 0x84D0, 0x84C0, 0x84C0, 0x84B0, 0x84B0, 0x84A0, 0x84A0, 0x84A0, 0x8490, 0x84A0, 0x84A0, 0x8490, 0x8490, 0x8490, 0x8490, + 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x84A0, 0x84A0, 0x8490, 0x8490, + 0x8490, 0x8480, 0x8480, 0x8480, 0x8470, 0x8460, 0x8450, 0x8440, 0x8440, 0x8450, 0x8430, 0x8420, 0x8410, 0x8420, 0x8410, 0x8410, + 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8400, 0x8420, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8410, 0x8410, + 0x8420, 0x8420, 0x8430, 0x8440, 0x8450, 0x8460, 0x8470, 0x8490, 0x84A0, 0x84A0, 0x84F0, 0x8580, 0x8910, 0x99C0, 0xAAC0, 0xB990, + 0xC570, 0xCF20, 0xD6A0, 0xDC10, 0xDFE0, 0xE2A0, 0xE560, 0xE790, 0xE870, 0xE8C0, 0xE770, 0xE450, 0xDF20, 0xD7B0, 0xCF10, 0xC4B0, + 0xB9C0, 0xAD00, 0x9EF0, 0x90B0, 0x87B0, 0x8530, 0x84D0, 0x84B0, 0x8490, 0x8480, 0x8470, 0x8460, 0x8450, 0x8450, 0x8440, 0x8430, + 0x8430, 0x8430, 0x8420, 0x8420, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8420, 0x8420, 0x8420, 0x8430, 0x8430, + 0x8430, 0x8440, 0x8450, 0x8450, 0x8450, 0x8460, 0x8460, 0x8470, 0x8480, 0x8480, 0x8490, 0x84B0, 0x84C0, 0x84F0, 0x8550, 0x86A0, + 0x8BF0, 0x97D0, 0xA370, 0xAE50, 0xB880, 0xC250, 0xCAC0, 0xD1F0, 0xD700, 0xDAF0, 0xDE40, 0xE120, 0xE490, 0xE910, 0xECC0, 0xF290, + 0xF770, 0xFD20, 0x02E0, 0x0830, 0x0E00, 0x1320, 0x1960, 0x1FD0, 0x2770, 0x2F40, 0x3710, 0x3FF0, 0x47E0, 0x4F70, 0x5800, 0x5E80, + 0x6560, 0x6C60, 0x71F0, 0x7790, 0x7C10, 0x7EC0, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7F40, 0x7F10, 0x7F10, 0x7F20, 0x7EF0, 0x7F80, + 0x7F10, 0x7F20, 0x7F10, 0x7F10, 0x7F70, 0x7F00, 0x7F10, 0x7F10, 0x7EE0, 0x7F60, 0x7EF0, 0x7EF0, 0x7EE0, 0x7EF0, 0x7F70, 0x7F20, + 0x7EC0, 0x7ED0, 0x7ED0, 0x7F30, 0x7F20, 0x7EB0, 0x7EE0, 0x7EC0, 0x7EF0, 0x7F10, 0x7EA0, 0x7EC0, 0x7F10, 0x7F10, 0x7F10, 0x7E90, + 0x7EA0, 0x7E80, 0x7F10, 0x7F10, 0x7EC0, 0x7F10, 0x7F10, 0x7F10, 0x7F10, 0x7F00, 0x7F40, 0x7F10, 0x7F10, 0x7EE0, 0x7EF0, 0x7F50, + 0x7F20, 0x7EF0, 0x7EF0, 0x7F10, 0x7F60, 0x7F10, 0x7F10, 0x7EF0, 0x7EF0, 0x7F50, 0x7EF0, 0x7EF0, 0x7EF0, 0x7EF0, 0x7F70, 0x7F00, + 0x7EC0, 0x7EF0, 0x7F00, 0x7F50, 0x7EB0, 0x7EA0, 0x7EF0, 0x7EF0, 0x7F30, 0x7EE0, 0x7EC0, 0x7EF0, 0x7F10, 0x7F20, 0x7EE0, 0x7E90, + 0x7F00, 0x7EE0, 0x7EF0, 0x7F10, 0x7E70, 0x7EF0, 0x7EF0, 0x7F10, 0x7F20, 0x7F00, 0x7F50, 0x7F10, 0x7F20, 0x7F10, 0x7F00, 0x7F40, + 0x7EF0, 0x7F10, 0x7F30, 0x7F00, 0x7F80, 0x7F10, 0x7F20, 0x7F40, 0x7F10, 0x7F70, 0x7EF0, 0x7EF0, 0x7EF0, 0x7F00, 0x7F60, 0x7F00, + 0x7F00, 0x7EF0, 0x7EF0, 0x7F30, 0x7F20, 0x7EC0, 0x7ED0, 0x7EE0, 0x7F40, 0x7EF0, 0x7EB0, 0x7EE0, 0x7EE0, 0x7F10, 0x7F10, 0x7EA0, + 0x7EE0, 0x7ED0, 0x7F00, 0x7F20, 0x7E90, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F00, 0x7F20, 0x7F40, 0x7F10, 0x7F10, 0x7F00, 0x7F40, + 0x7EF0, 0x7F30, 0x7F20, 0x7F00, 0x7F60, 0x7EA0, 0x79D0, 0x7490, 0x6E30, 0x6760, 0x5FC0, 0x5790, 0x4ED0, 0x4610, 0x3C60, 0x31F0, + 0x2610, 0x1930, 0x0B30, 0xFC20, 0xEC70, 0xDA80, 0xCAD0, 0xBAB0, 0xAB70, 0x9D40, 0x91A0, 0x8A90, 0x8780, 0x8660, 0x85D0, 0x8580, + 0x8530, 0x84F0, 0x84D0, 0x84C0, 0x84A0, 0x8490, 0x8490, 0x8480, 0x8480, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, + 0x8480, 0x8480, 0x8490, 0x84A0, 0x84B0, 0x84C0, 0x84C0, 0x84B0, 0x84A0, 0x8490, 0x8490, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, + 0x8490, 0x8490, 0x8490, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8490, 0x8480, + 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8490, 0x8490, 0x8490, 0x84A0, 0x84C0, 0x84C0, 0x84D0, 0x84E0, 0x8500, 0x8530, 0x8570, + 0x85C0, 0x8700, 0x88E0, 0x8C50, 0x9210, 0x97E0, 0x9E00, 0xA460, 0xAA90, 0xB0E0, 0xB790, 0xBDC0, 0xC330, 0xC950, 0xCED0, 0xD4B0, + 0xDA60, 0xE140, 0xE7F0, 0xEF30, 0xF740, 0xFF40, 0x0820, 0x1170, 0x1AE0, 0x2530, 0x2EE0, 0x38D0, 0x4290, 0x4CC0, 0x56F0, 0x61B0, + 0x6B70, 0x7590, 0x7D90, 0x7F30, 0x7F20, 0x7F20, 0x7F40, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F30, + 0x7F20, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F30, 0x7F20, + 0x7F40, 0x7F30, 0x7F30, 0x7F40, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F20, 0x7F20, 0x7F30, + 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F20, + 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F10, 0x7F30, + 0x7F40, 0x7F30, 0x73B0, 0x6620, 0x5840, 0x49B0, 0x3B50, 0x2D20, 0x1FA0, 0x10F0, 0x03A0, 0xF640, 0xE880, 0xDB20, 0xCD40, 0xBFE0, + 0xB2F0, 0xA6C0, 0x9A50, 0x8F40, 0x88B0, 0x8600, 0x8530, 0x84E0, 0x84D0, 0x84C0, 0x84B0, 0x84A0, 0x8490, 0x84A0, 0x8480, 0x8470, + 0x8470, 0x8470, 0x8460, 0x8460, 0x8460, 0x8450, 0x8450, 0x8450, 0x8440, 0x8450, 0x8450, 0x8440, 0x8450, 0x8440, 0x8480, 0x8450, + 0x8460, 0x8450, 0x8450, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8450, 0x8450, 0x8450, 0x8440, 0x8430, 0x8430, 0x8410, + 0x8400, 0x83F0, 0x83E0, 0x83D0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83B0, 0x83C0, 0x83C0, 0x83C0, 0x83B0, 0x83B0, 0x83B0, + 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83A0, 0x83A0, 0x83A0, 0x83A0, 0x8390, 0x8390, 0x83A0, 0x83A0, 0x83A0, 0x83A0, 0x83B0, 0x83B0, + 0x83C0, 0x83C0, 0x83D0, 0x83E0, 0x83F0, 0x83F0, 0x8400, 0x8410, 0x8410, 0x8420, 0x8430, 0x8430, 0x8450, 0x8460, 0x8480, 0x8480, + 0x8490, 0x84C0, 0x84E0, 0x8520, 0x8580, 0x85B0, 0x85F0, 0x85B0, 0x85A0, 0x8590, 0x8540, 0x85C0, 0x85F0, 0x8660, 0x86F0, 0x87B0, + 0x8840, 0x88D0, 0x8930, 0x8970, 0x89D0, 0x89F0, 0x8970, 0x88E0, 0x87B0, 0x8510, 0x84F0, 0x84F0, 0x84C0, 0x84C0, 0x84B0, 0x84B0, + 0x8490, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84A0, 0x8490, 0x8490, 0x8490, 0x8480, 0x8480, 0x8480, + 0x8480, 0x8470, 0x8450, 0x8400, 0x8460, 0x8460, 0x8450, 0x8450, 0x8450, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, + 0x8440, 0x8440, 0x8440, 0x8440, 0x8450, 0x8450, 0x8460, 0x8470, 0x8490, 0x84B0, 0x8520, 0x8A30, 0xA9D0, 0xC2F0, 0xD340, 0xDF30, + 0xE870, 0xF160, 0xFA70, 0x05A0, 0x1160, 0x1D50, 0x2B30, 0x36A0, 0x4270, 0x4DD0, 0x5930, 0x6580, 0x7180, 0x7CD0, 0x7F10, 0x7F40, + 0x7F10, 0x7EB0, 0x7F00, 0x7EF0, 0x7EF0, 0x7F30, 0x7F00, 0x7F40, 0x7F20, 0x7F10, 0x7F10, 0x7F00, 0x7F20, 0x7EF0, 0x7F10, 0x7F30, + 0x7F20, 0x7F40, 0x7EF0, 0x7F20, 0x7F20, 0x7F00, 0x7F90, 0x7F10, 0x7F00, 0x7EE0, 0x7F10, 0x7F60, 0x7EF0, 0x7EF0, 0x7EF0, 0x7F00, + 0x7F60, 0x7F10, 0x7E90, 0x7F10, 0x7F10, 0x7F20, 0x7EF0, 0x7F70, 0x7F00, 0x7F10, 0x7EF0, 0x7EE0, 0x7F60, 0x7F10, 0x7EE0, 0x7F00, + 0x7EF0, 0x7F70, 0x7F20, 0x7EC0, 0x7ED0, 0x7EB0, 0x7F30, 0x7EF0, 0x7E90, 0x7EB0, 0x7EC0, 0x7EF0, 0x7F10, 0x7EA0, 0x7EE0, 0x7F10, + 0x7F10, 0x7F10, 0x7E90, 0x7EC0, 0x7F00, 0x7EF0, 0x7F10, 0x7F00, 0x7F20, 0x7F10, 0x7D30, 0x65E0, 0x4F80, 0x37D0, 0x2010, 0x0830, + 0xF240, 0xDE10, 0xCBB0, 0xBBB0, 0xAC50, 0xA140, 0x99E0, 0x9730, 0x9A90, 0xA470, 0xB530, 0xCA70, 0xE2D0, 0xFDE0, 0x1640, 0x2C20, + 0x4090, 0x53B0, 0x6520, 0x7480, 0x7E90, 0x7F00, 0x7F90, 0x7ED0, 0x7EB0, 0x7EE0, 0x7EF0, 0x7F30, 0x7F00, 0x7EC0, 0x7F10, 0x7F00, + 0x7F10, 0x7EB0, 0x7E70, 0x7EE0, 0x7EF0, 0x7F10, 0x7F20, 0x7F00, 0x7F10, 0x7F10, 0x7F20, 0x7F40, 0x7E00, 0x6F10, 0x61E0, 0x5570, + 0x4B90, 0x4340, 0x3E40, 0x39C0, 0x3620, 0x32A0, 0x2E20, 0x2950, 0x2590, 0x2370, 0x2540, 0x29B0, 0x2FF0, 0x36A0, 0x3960, 0x37B0, + 0x2F10, 0x1F60, 0x09F0, 0xED30, 0xD020, 0xB130, 0x9380, 0x8610, 0x84E0, 0x84B0, 0x84A0, 0x8480, 0x8480, 0x8470, 0x8480, 0x8480, + 0x8480, 0x8490, 0x84B0, 0x84D0, 0x8570, 0x8EE0, 0xADF0, 0xC8C0, 0xDF00, 0xF0B0, 0xFD20, 0x05E0, 0x0A90, 0x0CB0, 0x0CC0, 0x0B30, + 0x0970, 0x0760, 0x0600, 0x0610, 0x0870, 0x0C70, 0x11E0, 0x1990, 0x2240, 0x2BE0, 0x3790, 0x4430, 0x5320, 0x62A0, 0x72C0, 0x7EB0, + 0x7EF0, 0x7F60, 0x7F00, 0x7F00, 0x7F10, 0x7F10, 0x7F60, 0x7EE0, 0x7EB0, 0x7F00, 0x7EF0, 0x7F50, 0x7ED0, 0x7EB0, 0x7F00, 0x7F00, + 0x7F10, 0x7F10, 0x7EC0, 0x7F10, 0x7EF0, 0x7EF0, 0x7F00, 0x7EC0, 0x7F10, 0x7F00, 0x7F20, 0x7F10, 0x7F00, 0x7F40, 0x7F10, 0x7F10, + 0x7F20, 0x7EE0, 0x7F50, 0x7F10, 0x7EF0, 0x7EF0, 0x7F10, 0x7F70, 0x7F00, 0x7F10, 0x7EF0, 0x7EF0, 0x7F60, 0x7EE0, 0x7EF0, 0x7EF0, + 0x7F00, 0x7F70, 0x7F00, 0x7EF0, 0x7EF0, 0x7EE0, 0x7F70, 0x7F10, 0x7EB0, 0x7EE0, 0x7EC0, 0x7EF0, 0x7F10, 0x7EA0, 0x7EC0, 0x7EE0, + 0x7F30, 0x7F00, 0x7E90, 0x7EB0, 0x7F00, 0x7EF0, 0x7EF0, 0x7EB0, 0x7EE0, 0x7EF0, 0x7EF0, 0x7F10, 0x7F00, 0x7F40, 0x7F10, 0x7F10, + 0x7F00, 0x7EB0, 0x7F20, 0x7F00, 0x7EF0, 0x7F10, 0x7F00, 0x7F60, 0x7F10, 0x7F10, 0x7F20, 0x7F00, 0x7F50, 0x7EF0, 0x7F00, 0x7EE0, + 0x7EF0, 0x7F80, 0x7F00, 0x7EF0, 0x7F10, 0x7F20, 0x7F60, 0x7ED0, 0x7EB0, 0x7EF0, 0x7EE0, 0x7F30, 0x7EE0, 0x7EA0, 0x7EF0, 0x7F10, + 0x7F30, 0x7EE0, 0x7E90, 0x7F10, 0x7EF0, 0x7F40, 0x7EF0, 0x7EA0, 0x7F20, 0x7EF0, 0x7F10, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7F20, + 0x7EF0, 0x7F10, 0x7F20, 0x7F40, 0x7F40, 0x7F20, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F10, 0x7EF0, 0x7F10, 0x7F10, 0x7F30, 0x7F20, + 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, + 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F30, 0x7F40, 0x7F40, 0x7F30, 0x7F30, + 0x7F20, 0x7F40, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7740, 0x6BF0, 0x5FB0, 0x5230, 0x4440, + 0x34F0, 0x2550, 0x14B0, 0x0300, 0xEF80, 0xDCB0, 0xC960, 0xB520, 0xA090, 0x8CF0, 0x85D0, 0x84F0, 0x84B0, 0x8490, 0x8480, 0x8470, + 0x8460, 0x8460, 0x8450, 0x8450, 0x8440, 0x8440, 0x8430, 0x8430, 0x8430, 0x8430, 0x8420, 0x8420, 0x8420, 0x8420, 0x8430, 0x8420, + 0x8420, 0x8410, 0x8410, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8410, 0x8410, 0x8420, 0x8410, 0x8410, 0x8410, + 0x8410, 0x8410, 0x8400, 0x8400, 0x8400, 0x8420, 0x8400, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, + 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8410, 0x8420, 0x8420, 0x8420, 0x8430, 0x8430, 0x8440, 0x8440, + 0x8450, 0x8450, 0x8460, 0x8470, 0x8480, 0x8490, 0x84B0, 0x84E0, 0x85A0, 0x8C00, 0xA450, 0xBB10, 0xD010, 0xE380, 0xF770, 0x0910, + 0x1A30, 0x2B10, 0x3B90, 0x4B30, 0x59E0, 0x6840, 0x7510, 0x7E70, 0x7F20, 0x7F40, 0x7F30, 0x7F10, 0x7F20, 0x7F40, 0x7F50, 0x7F30, + 0x7F80, 0x7F30, 0x7F00, 0x7EE0, 0x7EF0, 0x7EF0, 0x7F20, 0x7F00, 0x7F40, 0x7EF0, 0x7F20, 0x7F00, 0x7EF0, 0x7ED0, 0x7F10, 0x7F40, + 0x7ED0, 0x7E90, 0x7EE0, 0x7EF0, 0x7F50, 0x7EE0, 0x7EA0, 0x7F40, 0x7F10, 0x7F10, 0x7EF0, 0x7E90, 0x7F20, 0x7EE0, 0x7EF0, 0x7F10, + 0x7EB0, 0x7F20, 0x7F00, 0x7F10, 0x7F20, 0x7EC0, 0x7F10, 0x7F10, 0x7F00, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x75F0, 0x6A80, 0x5D90, + 0x5050, 0x42F0, 0x3540, 0x2850, 0x1C10, 0x10B0, 0x0700, 0x0010, 0xFB80, 0xF900, 0xF8D0, 0xFB50, 0xFF30, 0x06A0, 0x0F20, 0x1A90, + 0x2730, 0x3460, 0x4360, 0x52F0, 0x6270, 0x7220, 0x7D90, 0x7ED0, 0x7F00, 0x7F30, 0x7F10, 0x7EB0, 0x7EA0, 0x7EC0, 0x7F10, 0x7F10, + 0x7EC0, 0x7ED0, 0x7F20, 0x7F20, 0x7F10, 0x7EB0, 0x7F00, 0x7F00, 0x7EF0, 0x7F10, 0x7EC0, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7EF0, + 0x7F30, 0x7EF0, 0x7F10, 0x7F10, 0x7EE0, 0x7F40, 0x7EF0, 0x7F20, 0x7F00, 0x7F00, 0x7F80, 0x7EF0, 0x7F10, 0x7F10, 0x7EF0, 0x7F60, + 0x7EE0, 0x7ED0, 0x7F00, 0x7F00, 0x7F50, 0x7EF0, 0x7EB0, 0x7F00, 0x7F10, 0x7F10, 0x7EB0, 0x7E70, 0x7EF0, 0x7EF0, 0x7F10, 0x7ED0, + 0x7EB0, 0x7F00, 0x7F00, 0x7F10, 0x7F10, 0x7EA0, 0x7F20, 0x7F10, 0x7F00, 0x7F20, 0x7EC0, 0x7F30, 0x7F00, 0x7F20, 0x7F40, 0x7F10, + 0x7F60, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F80, 0x7F10, 0x7F20, 0x7F00, 0x7F10, 0x7F70, 0x7F00, 0x7F10, 0x7EF0, 0x7EF0, 0x7F60, + 0x7EF0, 0x7EB0, 0x7EE0, 0x7EE0, 0x7F50, 0x7F10, 0x7EA0, 0x7ED0, 0x7F10, 0x7F70, 0x7EE0, 0x7EF0, 0x7F10, 0x7F10, 0x7F60, 0x7ED0, + 0x7EB0, 0x7EE0, 0x7EF0, 0x7F30, 0x7EE0, 0x7E90, 0x7EE0, 0x7EF0, 0x7F30, 0x7F00, 0x7EC0, 0x7F10, 0x7F10, 0x7F00, 0x7F20, 0x7EC0, + 0x7F10, 0x7EF0, 0x7F00, 0x7F10, 0x7F00, 0x7F60, 0x7E90, 0x7F00, 0x7EE0, 0x7EF0, 0x7F10, 0x7F00, 0x7F40, 0x7F10, 0x7F10, 0x7F20, + 0x7EF0, 0x7F80, 0x7F10, 0x7F20, 0x7F10, 0x7F20, 0x7FA0, 0x7EF0, 0x7B50, 0x7570, 0x6F60, 0x6850, 0x60B0, 0x5830, 0x4F10, 0x45C0, + 0x3B70, 0x3130, 0x2610, 0x1B00, 0x0FA0, 0x0450, 0xF990, 0xEE10, 0xE450, 0xDAC0, 0xD0F0, 0xC7F0, 0xBE30, 0xB5A0, 0xAD30, 0xA5C0, + 0x9EF0, 0x98C0, 0x93E0, 0x9060, 0x8DF0, 0x8CC0, 0x8C30, 0x8D10, 0x8F60, 0x9320, 0x9890, 0x9F00, 0xA690, 0xAF70, 0xB910, 0xC370, + 0xCDD0, 0xD860, 0xE3C0, 0xEE10, 0xF8C0, 0x02C0, 0x0CF0, 0x16F0, 0x2070, 0x2A60, 0x32F0, 0x3BB0, 0x4340, 0x49F0, 0x50F0, 0x56B0, + 0x5BF0, 0x60F0, 0x6590, 0x69B0, 0x6D90, 0x7050, 0x7260, 0x73E0, 0x7550, 0x75D0, 0x75B0, 0x75A0, 0x7500, 0x7440, 0x72F0, 0x7130, + 0x6FE0, 0x6DC0, 0x6BD0, 0x6980, 0x65A0, 0x6300, 0x5E80, 0x5B00, 0x5720, 0x5300, 0x4F90, 0x4B00, 0x46A0, 0x4180, 0x3B30, 0x3500, + 0x2E40, 0x2750, 0x2000, 0x1720, 0x0F40, 0x05F0, 0xFC10, 0xF1A0, 0xE520, 0xD9D0, 0xCDD0, 0xC1C0, 0xB5A0, 0xA910, 0x9C90, 0x9090, + 0x88D0, 0x85D0, 0x8510, 0x84E0, 0x84C0, 0x84B0, 0x84A0, 0x8490, 0x8480, 0x8470, 0x8470, 0x8460, 0x8460, 0x8450, 0x8450, 0x8470, + 0x8440, 0x8440, 0x8440, 0x8430, 0x8440, 0x8440, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8440, 0x8440, 0x8450, 0x8450, + 0x8460, 0x8460, 0x8460, 0x8470, 0x8470, 0x8460, 0x8460, 0x8460, 0x8450, 0x8450, 0x8450, 0x8440, 0x8440, 0x8430, 0x8430, 0x8430, + 0x8420, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8400, 0x8400, 0x8400, 0x8400, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, + 0x83F0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x8400, + 0x8400, 0x8400, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8420, 0x8420, 0x8420, 0x8430, 0x8420, 0x8430, 0x8420, 0x8430, + 0x8430, 0x8440, 0x83E0, 0x8440, 0x8450, 0x8440, 0x8450, 0x8460, 0x8450, 0x8450, 0x8410, 0x8460, 0x8460, 0x8450, 0x8460, 0x8460, + 0x8460, 0x83F0, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8410, + 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8430, 0x8430, 0x8440, 0x8430, 0x8430, 0x8430, 0x8430, 0x8440, + 0x8440, 0x8440, 0x8440, 0x8450, 0x8450, 0x8460, 0x8460, 0x8460, 0x8470, 0x8470, 0x8460, 0x8480, 0x8480, 0x8490, 0x8490, 0x84C0, + 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8480, 0x8480, 0x8480, 0x8470, 0x8470, + 0x8470, 0x8470, 0x8470, 0x8470, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8450, 0x8450, 0x8450, 0x84A0, 0x8450, 0x8450, + 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8460, 0x8460, 0x8460, 0x8490, 0x8460, + 0x8460, 0x8460, 0x8470, 0x8470, 0x8470, 0x8480, 0x8480, 0x8490, 0x84B0, 0x84C0, 0x8500, 0x85E0, 0x8C10, 0xA140, 0xB4F0, 0xC8F0, + 0xDA20, 0xE8F0, 0xF720, 0x0320, 0x0EE0, 0x1990, 0x2360, 0x2BE0, 0x3440, 0x3AD0, 0x4100, 0x4720, 0x4BD0, 0x5050, 0x5480, 0x5820, + 0x5B70, 0x5E70, 0x6120, 0x6340, 0x6510, 0x6630, 0x66B0, 0x66A0, 0x64D0, 0x6210, 0x5E60, 0x5A00, 0x54D0, 0x4F70, 0x4960, 0x4340, + 0x3CB0, 0x35D0, 0x2E60, 0x2690, 0x1F00, 0x1820, 0x1110, 0x0930, 0x0110, 0xF7C0, 0xECD0, 0xDFF0, 0xCFA0, 0xBEE0, 0xAE00, 0x9C30, + 0x8D30, 0x8690, 0x8530, 0x84E0, 0x84C0, 0x84B0, 0x84A0, 0x8490, 0x8490, 0x8480, 0x8480, 0x8480, 0x8480, 0x8490, 0x8490, 0x8490, + 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8460, 0x8480, 0x8480, + 0x8480, 0x8490, 0x8490, 0x84B0, 0x84C0, 0x84E0, 0x8530, 0x8650, 0x8BF0, 0x9E90, 0xAF70, 0xC050, 0xD030, 0xDFB0, 0xEEF0, 0xFE40, + 0x0D50, 0x1D00, 0x2D40, 0x3C10, 0x4B00, 0x5880, 0x65C0, 0x7150, 0x7AB0, 0x7F20, 0x7F20, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, + 0x7F10, 0x7F20, 0x7F10, 0x7F30, 0x7E70, 0x7EE0, 0x7EF0, 0x7F00, 0x7F00, 0x7F00, 0x7F10, 0x7ED0, 0x7F00, 0x7EB0, 0x7E60, 0x7EC0, + 0x7ED0, 0x7F30, 0x7F20, 0x7F00, 0x7F50, 0x7F10, 0x7F20, 0x7F40, 0x7F10, 0x7F10, 0x7EF0, 0x7F00, 0x7EF0, 0x7F10, 0x7F20, 0x7EF0, + 0x7F20, 0x7F00, 0x7F00, 0x7F50, 0x7F10, 0x7EE0, 0x7EE0, 0x7EF0, 0x7F70, 0x7EE0, 0x7ED0, 0x7F10, 0x7F10, 0x7F40, 0x7ED0, 0x7E90, + 0x7F10, 0x7F10, 0x7F30, 0x7EB0, 0x7E70, 0x7EF0, 0x7F10, 0x7F20, 0x7F00, 0x7EC0, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7EC0, 0x7F10, + 0x7F10, 0x7F20, 0x7F40, 0x7EC0, 0x7F30, 0x7F20, 0x7F40, 0x7F10, 0x7F10, 0x7F60, 0x7EE0, 0x7F10, 0x7F20, 0x7EF0, 0x7F80, 0x7F10, + 0x7F20, 0x7F10, 0x7F10, 0x77F0, 0x6E60, 0x63C0, 0x5B50, 0x53B0, 0x4DA0, 0x49C0, 0x4750, 0x4780, 0x4970, 0x4D70, 0x5340, 0x5940, + 0x6090, 0x68F0, 0x7130, 0x7940, 0x7E00, 0x7ED0, 0x7F00, 0x7EF0, 0x7F10, 0x7EB0, 0x7F00, 0x7F00, 0x7F10, 0x7F10, 0x7EA0, 0x7F00, + 0x7F10, 0x7F00, 0x7F00, 0x70C0, 0x5750, 0x3DA0, 0x2040, 0xFCD0, 0xD0B0, 0x95B0, 0x84D0, 0x84A0, 0x8470, 0x8450, 0x8470, 0x8440, + 0x8440, 0x8440, 0x8430, 0x8420, 0x8420, 0x8410, 0x8400, 0x83F0, 0x8400, 0x83E0, 0x83D0, 0x83C0, 0x83C0, 0x83C0, 0x83B0, 0x8390, + 0x83A0, 0x83A0, 0x83A0, 0x8390, 0x8390, 0x8390, 0x8390, 0x83B0, 0x83A0, 0x83A0, 0x83A0, 0x8390, 0x83B0, 0x83C0, 0x83D0, 0x83D0, + 0x83E0, 0x83E0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8400, 0x83F0, 0x8400, 0x8400, 0x8400, 0x8410, 0x8400, 0x8400, + 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83E0, 0x83E0, 0x83D0, 0x83D0, 0x83E0, 0x83C0, 0x83B0, 0x83B0, + 0x83E0, 0x83A0, 0x83A0, 0x83A0, 0x83A0, 0x83A0, 0x83A0, 0x83B0, 0x83E0, 0x83C0, 0x83C0, 0x83E0, 0x83E0, 0x83F0, 0x83F0, 0x83F0, + 0x8400, 0x8410, 0x8410, 0x8420, 0x8430, 0x8430, 0x8450, 0x8460, 0x8490, 0x8490, 0x84A0, 0x84D0, 0x85B0, 0x8B50, 0xA8F0, 0xC4E0, + 0xE1D0, 0xFB60, 0x12C0, 0x2990, 0x3E00, 0x51C0, 0x63E0, 0x73C0, 0x7E70, 0x7F00, 0x7F10, 0x7F10, 0x7F20, 0x7EF0, 0x7EF0, 0x7F70, + 0x7F00, 0x7F20, 0x7F20, 0x7F10, 0x7F50, 0x7EF0, 0x7F20, 0x7F20, 0x7F00, 0x7F60, 0x7F00, 0x7F10, 0x7F20, 0x7F00, 0x7F50, 0x7F10, + 0x7F20, 0x7EF0, 0x7EF0, 0x7F80, 0x7F10, 0x7F20, 0x7EF0, 0x7F10, 0x7F80, 0x7F20, 0x7F10, 0x7EF0, 0x7EF0, 0x7F70, 0x7F00, 0x7EF0, + 0x7ED0, 0x7EB0, 0x7EF0, 0x7EF0, 0x7E90, 0x7ED0, 0x7ED0, 0x7F30, 0x7F20, 0x7EA0, 0x7ED0, 0x7F10, 0x7F00, 0x7F00, 0x7EC0, 0x7EB0, + 0x7F00, 0x7EF0, 0x7F10, 0x7F00, 0x7F20, 0x7DE0, 0x73D0, 0x6830, 0x5890, 0x48B0, 0x36E0, 0x2320, 0x0EB0, 0xF800, 0xE020, 0xC6B0, + 0xAB70, 0x8F30, 0x85B0, 0x8500, 0x84A0, 0x8480, 0x84A0, 0x8460, 0x8450, 0x8450, 0x8440, 0x8430, 0x8430, 0x8450, 0x8420, 0x8410, + 0x8410, 0x8450, 0x8410, 0x8410, 0x8410, 0x8430, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8420, 0x8430, 0x8430, 0x8430, 0x8460, + 0x8430, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8460, 0x8450, 0x8450, 0x8460, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, + 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8440, 0x8440, 0x8440, 0x8440, 0x8430, 0x8430, 0x8430, 0x8430, 0x8420, 0x8420, + 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8420, 0x8410, 0x8410, 0x8420, 0x8420, 0x8420, 0x8430, 0x8430, 0x8430, + 0x8440, 0x8440, 0x8450, 0x8450, 0x8460, 0x8460, 0x8470, 0x8480, 0x8490, 0x84A0, 0x84C0, 0x84F0, 0x85A0, 0x8E80, 0xA990, 0xC530, + 0xE260, 0x0100, 0x1FB0, 0x3DB0, 0x5C40, 0x73B0, 0x7EF0, 0x7EE0, 0x7F50, 0x7EF0, 0x7F10, 0x7F00, 0x7F10, 0x7F60, 0x7F00, 0x7F10, + 0x7F10, 0x7EF0, 0x7F60, 0x7EE0, 0x7EB0, 0x7F10, 0x7EF0, 0x7F70, 0x7F00, 0x7EC0, 0x7EF0, 0x7EF0, 0x7F20, 0x7ED0, 0x7E90, 0x7EF0, + 0x7EE0, 0x7EF0, 0x7EF0, 0x7EA0, 0x7F20, 0x7F00, 0x7F10, 0x7F10, 0x7EC0, 0x7F10, 0x7EF0, 0x7EE0, 0x7F10, 0x7F00, 0x7F30, 0x7F00, + 0x7F10, 0x7F20, 0x7F00, 0x7F50, 0x7EF0, 0x7F10, 0x7EF0, 0x7EF0, 0x7F90, 0x7F00, 0x7EF0, 0x7EF0, 0x7F00, 0x7F60, 0x7F10, 0x7EF0, + 0x7EB0, 0x7EE0, 0x7F50, 0x7EE0, 0x7EF0, 0x7EF0, 0x7F00, 0x7F60, 0x7F10, 0x7E90, 0x7EB0, 0x7EC0, 0x7F50, 0x7F10, 0x7E70, 0x7EC0, + 0x7F00, 0x7F00, 0x7F10, 0x7F00, 0x7F00, 0x7F10, 0x7F10, 0x7F10, 0x7F20, 0x7F10, 0x7F10, 0x7F00, 0x7F10, 0x7F10, 0x7F20, 0x7F20, + 0x7F20, 0x7F10, 0x7F10, 0x7F10, 0x7F10, 0x7F10, 0x7F20, 0x7F10, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F20, 0x7F30, 0x7F30, + 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F10, 0x7F30, 0x7F30, 0x7F20, + 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F00, 0x7F30, 0x7F30, 0x7F30, 0x7F30, 0x7F00, 0x7F20, 0x7F30, 0x7F30, 0x7F20, + 0x7F40, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F10, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F40, + 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F20, 0x7F40, 0x7F30, + 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F10, 0x7F20, 0x7F10, 0x7F10, + 0x7F00, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, + 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7150, 0x5A60, 0x4260, + 0x2B10, 0x13D0, 0xFAD0, 0xE4D0, 0xCF30, 0xBB00, 0xA880, 0x97E0, 0x8C50, 0x8770, 0x8600, 0x85A0, 0x85C0, 0x85E0, 0x86B0, 0x88E0, + 0x8E30, 0x96E0, 0x9E70, 0xA3E0, 0xA710, 0xA6A0, 0xA450, 0x9ED0, 0x9760, 0x8F10, 0x88F0, 0x8600, 0x8520, 0x84D0, 0x84B0, 0x84A0, + 0x8480, 0x8470, 0x8470, 0x8460, 0x8450, 0x8420, 0x8440, 0x8430, 0x8430, 0x8420, 0x8420, 0x8420, 0x8410, 0x8400, 0x8400, 0x83F0, + 0x8400, 0x83E0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83C0, 0x83C0, 0x83C0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83A0, 0x83A0, 0x83A0, + 0x83A0, 0x83A0, 0x83C0, 0x83B0, 0x83A0, 0x83B0, 0x83D0, 0x83C0, 0x83E0, 0x83D0, 0x83E0, 0x83E0, 0x83E0, 0x8410, 0x83F0, 0x83F0, + 0x83F0, 0x8400, 0x83F0, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8410, 0x8410, 0x8410, 0x8420, 0x8420, 0x8430, 0x8430, 0x8440, + 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8430, 0x8440, 0x8450, 0x8450, 0x8460, 0x8470, 0x8470, 0x8480, 0x8480, 0x8480, + 0x8480, 0x8480, 0x8470, 0x8480, 0x8470, 0x8470, 0x8480, 0x8480, 0x8480, 0x8480, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x84A0, + 0x84B0, 0x84C0, 0x84E0, 0x8570, 0x8A10, 0xA5E0, 0xC170, 0xDB00, 0xF170, 0x0370, 0x1080, 0x1980, 0x1FB0, 0x22A0, 0x22E0, 0x2190, + 0x1CC0, 0x1590, 0x0A50, 0xFD60, 0xEED0, 0xDE80, 0xCD10, 0xBAE0, 0xA7F0, 0x9550, 0x8890, 0x8540, 0x84E0, 0x84B0, 0x84A0, 0x8480, + 0x8470, 0x8470, 0x8460, 0x8450, 0x8440, 0x8440, 0x8430, 0x8430, 0x8420, 0x8420, 0x8410, 0x8410, 0x8400, 0x8400, 0x8400, 0x83F0, + 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83E0, 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8410, 0x8420, 0x8430, + 0x8410, 0x8450, 0x8470, 0x8480, 0x8490, 0x84B0, 0x84C0, 0x8500, 0x8610, 0x93D0, 0xB140, 0xCDE0, 0xE9B0, 0x0350, 0x1B80, 0x3270, + 0x4890, 0x5ED0, 0x7160, 0x7ED0, 0x7F10, 0x7F70, 0x7EE0, 0x7ED0, 0x7F10, 0x7F10, 0x7F70, 0x7EF0, 0x7ED0, 0x7F00, 0x7F10, 0x7F30, + 0x7EB0, 0x7E70, 0x7EF0, 0x7EE0, 0x7F30, 0x7ED0, 0x7EA0, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7EC0, 0x7F10, 0x7EC0, 0x7EF0, 0x7F10, + 0x7F50, 0x7ED0, 0x7E70, 0x7EE0, 0x7EF0, 0x7F30, 0x7F00, 0x7EC0, 0x7F10, 0x7F10, 0x7F10, 0x7EF0, 0x7E70, 0x7EF0, 0x7EF0, 0x7F10, + 0x7F20, 0x7F00, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7EC0, 0x7F30, 0x7F10, 0x7F20, 0x7F40, 0x7EE0, 0x7F50, 0x7F10, 0x7F20, 0x7F20, + 0x7F10, 0x7F90, 0x7EF0, 0x7EE0, 0x7F10, 0x7EF0, 0x7F70, 0x7EE0, 0x7EF0, 0x7EF0, 0x7F00, 0x7F60, 0x7F10, 0x7EE0, 0x7F00, 0x7EF0, + 0x7F30, 0x7F10, 0x7E70, 0x7EC0, 0x7EF0, 0x7F20, 0x7EF0, 0x7E90, 0x7EE0, 0x7F00, 0x7F10, 0x7F10, 0x7EA0, 0x7F00, 0x7F10, 0x7F00, + 0x7EE0, 0x7EC0, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F30, 0x7F10, 0x7F00, 0x7300, 0x5A00, 0x4780, 0x3820, 0x29E0, 0x1DD0, + 0x1690, 0x1740, 0x22A0, 0x37D0, 0x5670, 0x75B0, 0x7F60, 0x7EF0, 0x7EF0, 0x7F20, 0x7EF0, 0x7F90, 0x7F00, 0x7EE0, 0x7EF0, 0x7F10, + 0x7F30, 0x7EC0, 0x7EC0, 0x5410, 0x1730, 0xD8B0, 0xA040, 0x8600, 0x84E0, 0x84D0, 0x84E0, 0x8510, 0x8610, 0x8A80, 0x9360, 0x9740, + 0x96F0, 0x9440, 0x92C0, 0x93C0, 0x96A0, 0x9CD0, 0xADB0, 0xAEA0, 0xAEB0, 0xAD30, 0xAD30, 0xAD60, 0xADB0, 0xAEC0, 0xAF90, 0xB0C0, + 0xB110, 0xB150, 0xB1A0, 0xB170, 0xB160, 0xB150, 0xB200, 0xB2C0, 0xB370, 0xB470, 0xB4C0, 0xB510, 0xB450, 0xB340, 0xB120, 0xAE00, + 0xAA20, 0xA5D0, 0xA030, 0x9A80, 0x94B0, 0x8E10, 0x8930, 0x8680, 0x8560, 0x8500, 0x84D0, 0x8450, 0x84A0, 0x8490, 0x8480, 0x8430, + 0x8470, 0x8460, 0x8450, 0x8440, 0x8440, 0x8430, 0x8420, 0x8420, 0x8410, 0x8410, 0x8400, 0x8400, 0x83F0, 0x83F0, 0x83F0, 0x83F0, + 0x83E0, 0x83D0, 0x83D0, 0x83F0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, + 0x83D0, 0x8400, 0x83E0, 0x83E0, 0x83E0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8410, 0x8410, 0x8420, 0x8420, 0x8430, + 0x8430, 0x8440, 0x8450, 0x8450, 0x8460, 0x8460, 0x8470, 0x8470, 0x8480, 0x8480, 0x8490, 0x8490, 0x84A0, 0x84A0, 0x84A0, 0x84B0, + 0x84B0, 0x84C0, 0x84C0, 0x84D0, 0x84E0, 0x84F0, 0x8500, 0x8530, 0x8570, 0x85E0, 0x8660, 0x8690, 0x8630, 0x8590, 0x8520, 0x84E0, + 0x84C0, 0x84B0, 0x8490, 0x8480, 0x8430, 0x8470, 0x8470, 0x8460, 0x8460, 0x8450, 0x8450, 0x8450, 0x8470, 0x8450, 0x8440, 0x8440, + 0x83F0, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8440, 0x8440, + 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8430, 0x8450, 0x8450, 0x8450, 0x8450, + 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8440, 0x8440, 0x8430, 0x8430, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, + 0x8420, 0x8430, 0x8430, 0x8440, 0x8440, 0x8450, 0x8470, 0x8490, 0x84D0, 0x92F0, 0xDA30, 0x1BC0, 0x5750, 0x7ED0, 0x7F30, 0x7F20, + 0x7F40, 0x7F30, 0x7F20, 0x7F10, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F10, + 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, + 0x7F20, 0x7F10, 0x7F30, 0x7F30, 0x7F00, 0x7F20, 0x7F30, 0x7F20, 0x7F40, 0x7EF0, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, + 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F30, 0x7F20, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, + 0x7F30, 0x7F30, 0x7F40, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F20, + 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F40, 0x7F20, 0x7F20, 0x7F30, 0x7F30, + 0x7F20, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x75C0, 0x66F0, 0x5830, 0x4960, 0x3B40, 0x2E10, 0x2180, 0x1720, + 0x0EC0, 0x07F0, 0x0360, 0xFF20, 0xFC60, 0xF9C0, 0xF690, 0xF300, 0xEFB0, 0xEBD0, 0xE810, 0xE460, 0xE090, 0xDD90, 0xDAF0, 0xD970, + 0xD7B0, 0xD690, 0xD4B0, 0xD210, 0xCE40, 0xC960, 0xC390, 0xBD10, 0xB7D0, 0xB290, 0xB020, 0xAE70, 0xAF60, 0xB1F0, 0xB5A0, 0xBA40, + 0xBF50, 0xC4F0, 0xCAD0, 0xCF70, 0xD360, 0xD5F0, 0xD6A0, 0xD490, 0xCFF0, 0xC8B0, 0xBE40, 0xAF30, 0x9D00, 0x8A60, 0x8530, 0x84C0, + 0x8490, 0x8470, 0x8460, 0x8440, 0x8430, 0x8420, 0x8410, 0x8400, 0x8400, 0x8400, 0x83F0, 0x83F0, 0x83E0, 0x83E0, 0x83D0, 0x83D0, + 0x83D0, 0x83C0, 0x83C0, 0x83C0, 0x83D0, 0x83D0, 0x83D0, 0x83E0, 0x83E0, 0x83F0, 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8400, 0x8410, + 0x8410, 0x8410, 0x8410, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8440, 0x8440, + 0x8440, 0x8450, 0x8480, 0x8460, 0x8460, 0x8470, 0x8430, 0x8490, 0x84A0, 0x84B0, 0x84F0, 0x85E0, 0x90C0, 0xADB0, 0xCA10, 0xE730, + 0x0340, 0x1E60, 0x3A30, 0x5640, 0x6D50, 0x7E30, 0x7F00, 0x7EF0, 0x7EF0, 0x7F50, 0x7F20, 0x7F40, 0x7F10, 0x7F10, 0x7F60, 0x7F20, + 0x7F10, 0x7F10, 0x7EF0, 0x7F60, 0x7ED0, 0x7F20, 0x7EF0, 0x7EF0, 0x7F70, 0x7F00, 0x7EE0, 0x7EF0, 0x7F10, 0x7F30, 0x7EF0, 0x7EB0, + 0x7EE0, 0x7EF0, 0x7F30, 0x7EE0, 0x7EA0, 0x7F00, 0x7EF0, 0x7F30, 0x7EE0, 0x7EC0, 0x7F10, 0x7F00, 0x7EF0, 0x7F10, 0x7F00, 0x7F20, + 0x7F10, 0x7F20, 0x7F20, 0x7ED0, 0x7F20, 0x7EE0, 0x7EF0, 0x7F10, 0x7F10, 0x7F20, 0x7EF0, 0x7F10, 0x7F30, 0x7F20, 0x7F80, 0x7F10, + 0x7F10, 0x7EF0, 0x7F10, 0x7F70, 0x7EE0, 0x7EF0, 0x7EF0, 0x7F00, 0x7F70, 0x7F20, 0x7ED0, 0x7030, 0x6020, 0x4F40, 0x3F30, 0x2E30, + 0x1EA0, 0x0ED0, 0xFED0, 0xF080, 0xE220, 0xD980, 0xD610, 0xD820, 0xE2C0, 0xF350, 0x09B0, 0x22E0, 0x3D50, 0x5910, 0x6F70, 0x7E80, + 0x7F10, 0x7F20, 0x7F20, 0x7F00, 0x7F50, 0x7F10, 0x7F20, 0x7F10, 0x7F00, 0x7F20, 0x7EF0, 0x7F10, 0x7F10, 0x7F20, 0x7F60, 0x7EA0, + 0x7F00, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7EF0, 0x7F20, 0x7EF0, 0x7F10, 0x7F60, 0x7F00, 0x7EF0, 0x7F20, 0x7F00, 0x7F50, + 0x7EF0, 0x7EE0, 0x7EE0, 0x7EF0, 0x7F70, 0x7EE0, 0x7ED0, 0x7F10, 0x7F00, 0x7F60, 0x7ED0, 0x7E90, 0x7F00, 0x7EE0, 0x7EF0, 0x7EB0, + 0x7EA0, 0x7EF0, 0x7F10, 0x7F20, 0x7F20, 0x7EC0, 0x7F10, 0x7F00, 0x72B0, 0x6420, 0x56C0, 0x4BF0, 0x4190, 0x3700, 0x2DD0, 0x24C0, + 0x1C70, 0x1500, 0x0F10, 0x0B90, 0x0A10, 0x0B40, 0x1040, 0x18D0, 0x2610, 0x3560, 0x4690, 0x5660, 0x63C0, 0x6F80, 0x77D0, 0x7DF0, + 0x7EE0, 0x7EE0, 0x7EF0, 0x7EE0, 0x7F60, 0x7F10, 0x7EE0, 0x7F00, 0x7EE0, 0x7F30, 0x7F10, 0x7E70, 0x7ED0, 0x7EB0, 0x7F30, 0x7EF0, + 0x7EB0, 0x7EE0, 0x7F20, 0x7F10, 0x7F10, 0x7E90, 0x7EB0, 0x7F00, 0x7EF0, 0x7EF0, 0x7EB0, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7E90, + 0x7F00, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7F40, 0x7ED0, 0x7940, 0x71C0, 0x67F0, 0x5C20, 0x4EE0, 0x4090, 0x3230, 0x2270, 0x12E0, + 0x0250, 0xF2E0, 0xE470, 0xD5D0, 0xC6F0, 0xB700, 0xA660, 0x95F0, 0x8970, 0x8570, 0x84F0, 0x84C0, 0x84B0, 0x84A0, 0x8490, 0x8480, + 0x8470, 0x8470, 0x8460, 0x8450, 0x8450, 0x8440, 0x8430, 0x8430, 0x8420, 0x8420, 0x8410, 0x8400, 0x8400, 0x83F0, 0x83F0, 0x83F0, + 0x83E0, 0x83E0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83F0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83B0, + 0x83B0, 0x83B0, 0x8390, 0x83B0, 0x83B0, 0x83B0, 0x83A0, 0x83A0, 0x83B0, 0x83B0, 0x83A0, 0x83A0, 0x83B0, 0x83A0, 0x83A0, 0x8380, + 0x83A0, 0x83A0, 0x83A0, 0x83A0, 0x83A0, 0x83B0, 0x8390, 0x8390, 0x8390, 0x8390, 0x8390, 0x8390, 0x8390, 0x8390, 0x8390, 0x8390, + 0x83A0, 0x83D0, 0x83E0, 0x83B0, 0x83C0, 0x83E0, 0x83F0, 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8400, 0x8400, 0x8410, 0x8410, 0x8420, + 0x83D0, 0x8420, 0x8430, 0x8430, 0x8430, 0x8440, 0x8440, 0x8450, 0x8460, 0x8480, 0x84A0, 0x84E0, 0x88F0, 0xBCD0, 0xE9A0, 0x1150, + 0x30A0, 0x48A0, 0x5980, 0x63F0, 0x6C20, 0x7140, 0x7610, 0x7930, 0x7B70, 0x7CC0, 0x7C30, 0x7B10, 0x78C0, 0x7590, 0x72F0, 0x70A0, + 0x7080, 0x7200, 0x7400, 0x7820, 0x7C00, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F00, 0x7F20, 0x7F40, 0x7F10, 0x7F10, 0x7EE0, 0x7F50, + 0x7EF0, 0x7EF0, 0x7F10, 0x7F00, 0x7F60, 0x7F10, 0x7F10, 0x7EF0, 0x7F20, 0x7F50, 0x7EF0, 0x7F00, 0x7EE0, 0x7EF0, 0x7F80, 0x7F00, + 0x7EE0, 0x7EF0, 0x7EF0, 0x7F00, 0x7F10, 0x7EE0, 0x7EF0, 0x7EF0, 0x7EF0, 0x7EF0, 0x7F10, 0x7F20, 0x7F20, 0x7EF0, 0x7F10, 0x7F10, + 0x7F00, 0x7F00, 0x7EF0, 0x7F10, 0x7F00, 0x7EF0, 0x7F20, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, + 0x7F30, 0x7F50, 0x7F30, 0x7F20, 0x7F20, 0x7F20, 0x7F40, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F30, + 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F20, + 0x7F20, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F10, 0x7F30, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F10, 0x7F20, + 0x7F10, 0x7F20, 0x7F10, 0x7F10, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, + 0x7F30, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F40, 0x7F30, 0x7F20, 0x7F20, 0x7F20, 0x7F30, 0x7F20, 0x7F00, 0x7F10, 0x7F30, + 0x7F30, 0x7F20, 0x7F00, 0x7F10, 0x7F10, 0x7F20, 0x7F30, 0x7EF0, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F30, + 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F40, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F20, + 0x7F30, 0x7F20, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, + 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F10, 0x7F30, 0x7F20, 0x7F20, + 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F20, 0x7F50, 0x7F10, 0x7EB0, 0x7EF0, 0x7EF0, 0x7EF0, 0x7F30, 0x7E70, 0x7ED0, 0x7EF0, + 0x7EF0, 0x7F00, 0x7E80, 0x7EC0, 0x7EB0, 0x7F10, 0x7EF0, 0x7E90, 0x7EB0, 0x7F00, 0x7EF0, 0x7F10, 0x7F00, 0x7F60, 0x7F20, 0x7F20, + 0x7F20, 0x7F10, 0x7F50, 0x7EF0, 0x7F00, 0x7EE0, 0x7EF0, 0x7F30, 0x7EE0, 0x7F10, 0x7F00, 0x7F00, 0x7F60, 0x7EF0, 0x7EF0, 0x7F00, + 0x7EF0, 0x7F60, 0x7EE0, 0x7EF0, 0x7F30, 0x7F20, 0x7F40, 0x7ED0, 0x7E90, 0x7EF0, 0x7F00, 0x7F30, 0x7EB0, 0x7E70, 0x7F20, 0x7EF0, + 0x7F30, 0x7F20, 0x7EC0, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7EB0, 0x7F20, 0x7EE0, 0x7EF0, 0x7F30, 0x7EC0, 0x7F40, 0x7F10, 0x7520, + 0x5EC0, 0x4840, 0x3310, 0x1F30, 0x0CB0, 0xF9F0, 0xE910, 0xD8C0, 0xC950, 0xB900, 0xA970, 0x9960, 0x8B80, 0x8630, 0x8500, 0x84D0, + 0x84B0, 0x84C0, 0x8480, 0x8480, 0x8460, 0x8450, 0x8440, 0x8430, 0x8420, 0x83F0, 0x8400, 0x83F0, 0x83E0, 0x83D0, 0x83D0, 0x83C0, + 0x83B0, 0x83A0, 0x8390, 0x8390, 0x8380, 0x8380, 0x8370, 0x8370, 0x8360, 0x8360, 0x8360, 0x8360, 0x8360, 0x8360, 0x8360, 0x8360, + 0x8370, 0x8370, 0x8370, 0x8370, 0x8370, 0x8370, 0x8370, 0x8370, 0x8370, 0x8370, 0x8370, 0x8380, 0x8370, 0x8380, 0x8380, 0x8380, + 0x8390, 0x8390, 0x8390, 0x8390, 0x8390, 0x83A0, 0x83A0, 0x83A0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83C0, 0x83C0, 0x83D0, 0x83D0, + 0x83E0, 0x83E0, 0x83E0, 0x83F0, 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8400, 0x8400, 0x8410, 0x8410, 0x8410, 0x8420, 0x8420, 0x8430, + 0x8430, 0x8440, 0x8450, 0x8470, 0x8480, 0x8490, 0x84C0, 0x84E0, 0x85B0, 0x8BA0, 0xA340, 0xBA50, 0xD210, 0xE9E0, 0x0220, 0x1A90, + 0x3250, 0x4C20, 0x6310, 0x7790, 0x7EE0, 0x7EE0, 0x7F50, 0x7F10, 0x7EB0, 0x7EE0, 0x7EF0, 0x7F60, 0x7F20, 0x7E90, 0x7EB0, 0x7EB0, + 0x7EF0, 0x7F00, 0x7F60, 0x7F10, 0x7EB0, 0x7EB0, 0x7EE0, 0x7EF0, 0x7F20, 0x7EC0, 0x7ED0, 0x7EF0, 0x7F00, 0x7EF0, 0x7EC0, 0x7F10, + 0x7F20, 0x7EF0, 0x7F10, 0x7F00, 0x7F20, 0x7F10, 0x7F10, 0x7F10, 0x7EE0, 0x7F50, 0x7F00, 0x7F00, 0x7EF0, 0x7F10, 0x7F60, 0x7F00, + 0x7F10, 0x7F10, 0x7F00, 0x7F30, 0x7EF0, 0x7F20, 0x7EF0, 0x7F10, 0x7F60, 0x7F00, 0x7EF0, 0x7F10, 0x7F00, 0x7F80, 0x7EF0, 0x7EB0, + 0x7EF0, 0x7EF0, 0x7F50, 0x7EF0, 0x7EA0, 0x7EF0, 0x7F10, 0x7F30, 0x7EE0, 0x7EC0, 0x7F10, 0x7EF0, 0x7EF0, 0x7EF0, 0x7E90, 0x7F00, + 0x7EE0, 0x7EF0, 0x7F10, 0x7F00, 0x7F40, 0x7F10, 0x7F10, 0x7F10, 0x7F00, 0x7F20, 0x7EE0, 0x7EF0, 0x7F10, 0x7F10, 0x7F60, 0x7F00, + 0x7F10, 0x7F20, 0x7F00, 0x7F90, 0x7F10, 0x7F10, 0x7EE0, 0x7EF0, 0x7F70, 0x7F00, 0x7EF0, 0x7EF0, 0x7F00, 0x7F60, 0x7F10, 0x7EB0, + 0x7EB0, 0x7EE0, 0x7F50, 0x7F00, 0x7E70, 0x7ED0, 0x7ED0, 0x7F10, 0x7F20, 0x7EC0, 0x7ED0, 0x7EE0, 0x7F00, 0x7F10, 0x7E90, 0x7EE0, + 0x7F00, 0x7ED0, 0x7F10, 0x7F00, 0x7F00, 0x7F20, 0x7F10, 0x7F10, 0x7F00, 0x7F20, 0x7F00, 0x7F10, 0x7F10, 0x7EE0, 0x7F40, 0x7F10, + 0x7F20, 0x7F20, 0x7F10, 0x7F50, 0x7F10, 0x7F00, 0x7F10, 0x7F10, 0x7F30, 0x7EE0, 0x7F10, 0x7F10, 0x7F20, 0x7F70, 0x7ED0, 0x7F00, + 0x7F00, 0x7F10, 0x7F50, 0x7EB0, 0x7E70, 0x7EF0, 0x7F10, 0x7F20, 0x7ED0, 0x7EB0, 0x7F00, 0x7F00, 0x7F10, 0x7EF0, 0x7EA0, 0x7EE0, + 0x7EF0, 0x7EF0, 0x7EF0, 0x7EB0, 0x7F00, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7F40, 0x7EF0, 0x7F10, 0x7F20, 0x7EE0, 0x7F50, 0x7F10, + 0x7F20, 0x7F20, 0x7F10, 0x7F60, 0x7F00, 0x7F10, 0x7F10, 0x7EF0, 0x7F60, 0x7EF0, 0x7F10, 0x7F00, 0x7EE0, 0x7F80, 0x7F10, 0x7F00, + 0x7F00, 0x7ED0, 0x7F30, 0x7F00, 0x7E70, 0x7EE0, 0x7EE0, 0x7EF0, 0x7F10, 0x7EB0, 0x6DE0, 0x4EC0, 0x2E30, 0x0E30, 0xEAF0, 0xCAD0, + 0xABD0, 0x8ED0, 0x8590, 0x84D0, 0x84B0, 0x8490, 0x8480, 0x8480, 0x8470, 0x8470, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, + 0x8450, 0x8450, 0x8450, 0x8440, 0x8440, 0x8440, 0x8430, 0x8430, 0x8420, 0x8420, 0x8410, 0x8410, 0x8420, 0x8400, 0x83F0, 0x83F0, + 0x8430, 0x83E0, 0x83E0, 0x83E0, 0x83D0, 0x83D0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83F0, 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8410, + 0x8410, 0x8420, 0x8430, 0x8430, 0x8430, 0x8440, 0x8440, 0x8450, 0x8460, 0x8460, 0x8470, 0x8490, 0x84A0, 0x84D0, 0x8520, 0x8730, + 0x98F0, 0xB1D0, 0xC970, 0xE120, 0x29D0, 0x38A0, 0x4830, 0x5310, 0x5C20, 0x6450, 0x6A90, 0x7030, 0x7460, 0x7820, 0x7A90, 0x7C90, + 0x7DE0, 0x7EC0, 0x7F10, 0x7F20, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F20, + 0x7F20, 0x7F10, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F00, 0x7F40, 0x7F30, 0x7F30, 0x7F30, + 0x7F40, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F30, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F40, + 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F20, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F10, + 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F20, 0x6410, + 0x3FF0, 0x1AD0, 0xF5C0, 0xD150, 0xAD90, 0x8D60, 0x8520, 0x84B0, 0x8490, 0x8480, 0x8470, 0x8460, 0x8450, 0x8440, 0x8430, 0x8420, + 0x8410, 0x8400, 0x83F0, 0x83F0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83D0, 0x83D0, 0x83E0, 0x83E0, 0x83E0, 0x83D0, 0x83E0, 0x83D0, + 0x83D0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x8420, 0x8400, 0x8400, 0x8410, 0x8420, + 0x8420, 0x8430, 0x8440, 0x8450, 0x8460, 0x8470, 0x8490, 0x8500, 0x8600, 0xA2A0, 0xCC70, 0xF550, 0x1DD0, 0x49D0, 0x6E70, 0x7F40, + 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F50, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, + 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F60, 0x7EF0, 0x7EF0, 0x7F00, 0x7F20, + 0x7F40, 0x7F20, 0x7F00, 0x7F00, 0x7ED0, 0x7F10, 0x7EE0, 0x7ED0, 0x7ED0, 0x7F00, 0x7F40, 0x7EF0, 0x7EF0, 0x7EE0, 0x7EE0, 0x7F10, + 0x7F10, 0x7E70, 0x7EE0, 0x7EB0, 0x7EF0, 0x7F20, 0x7E90, 0x7EF0, 0x7F00, 0x7F20, 0x7F10, 0x7E90, 0x7F00, 0x7F00, 0x7F10, 0x7EF0, + 0x7EA0, 0x7EE0, 0x7F10, 0x7F20, 0x7F00, 0x7F00, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7EF0, 0x7F20, 0x7EF0, 0x7F10, 0x7F10, 0x7F00, + 0x7F30, 0x7F00, 0x7F10, 0x7F10, 0x7EF0, 0x7F40, 0x7EF0, 0x7F10, 0x7EF0, 0x7EE0, 0x7F70, 0x7EF0, 0x7EE0, 0x7F00, 0x7F10, 0x7F30, + 0x7F00, 0x7ED0, 0x7EF0, 0x7EF0, 0x7F20, 0x7ED0, 0x7EB0, 0x7F00, 0x7F00, 0x7F30, 0x7F00, 0x7EA0, 0x7F10, 0x7F10, 0x7F10, 0x7F00, + 0x7EC0, 0x7F30, 0x7EE0, 0x7EF0, 0x7F10, 0x7F00, 0x7F40, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F20, 0x7EF0, 0x7F10, 0x7F30, 0x7F20, + 0x7F80, 0x7EF0, 0x7F10, 0x7EF0, 0x7B60, 0x73D0, 0x6D30, 0x65F0, 0x5FA0, 0x58F0, 0x53B0, 0x4FA0, 0x4D40, 0x4E10, 0x5030, 0x54A0, + 0x5AF0, 0x61B0, 0x68E0, 0x7000, 0x75D0, 0x7B90, 0x7E60, 0x7EC0, 0x7ED0, 0x7F10, 0x7F20, 0x7EC0, 0x7F10, 0x7F10, 0x7F00, 0x7F10, + 0x7EA0, 0x7EC0, 0x7F10, 0x7F10, 0x7F20, 0x7F00, 0x7F40, 0x7F10, 0x7F20, 0x7F20, 0x7F00, 0x7F30, 0x7F20, 0x7F20, 0x7ED0, 0x7F10, + 0x7F60, 0x7EF0, 0x7F30, 0x7F20, 0x7F00, 0x7F50, 0x7EF0, 0x7EF0, 0x7EE0, 0x7EF0, 0x7F30, 0x7EE0, 0x7EF0, 0x7F10, 0x7C70, 0x71F0, + 0x6810, 0x5C90, 0x5100, 0x42C0, 0x3490, 0x2570, 0x1570, 0x0580, 0xF550, 0xE410, 0xD320, 0xC190, 0xAE30, 0x9BF0, 0x8C40, 0x8640, + 0x8510, 0x84D0, 0x84B0, 0x8490, 0x8490, 0x8480, 0x8470, 0x8460, 0x8460, 0x8450, 0x8450, 0x8450, 0x8450, 0x8440, 0x8450, 0x8440, + 0x8440, 0x8450, 0x8440, 0x8450, 0x8450, 0x8450, 0x8450, 0x8440, 0x8440, 0x8470, 0x8460, 0x8450, 0x8450, 0x8470, 0x8440, 0x8440, + 0x8440, 0x8410, 0x8430, 0x8420, 0x8420, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8420, 0x8430, 0x8440, 0x8430, + 0x8430, 0x8430, 0x8440, 0x8440, 0x8440, 0x8440, 0x8430, 0x8450, 0x8460, 0x8470, 0x8480, 0x84A0, 0x84C0, 0x8530, 0x89B0, 0xA7C0, + 0xC710, 0xE030, 0xF720, 0x0B40, 0x1C50, 0x2C60, 0x3A60, 0x4770, 0x5390, 0x5F50, 0x68A0, 0x7120, 0x7740, 0x7B90, 0x7DB0, 0x7EA0, + 0x7EE0, 0x7F50, 0x7EF0, 0x7F10, 0x7F00, 0x7F20, 0x7F70, 0x7EF0, 0x7EE0, 0x7F00, 0x7F10, 0x7F80, 0x7F00, 0x7EC0, 0x7F10, 0x7F10, + 0x7F30, 0x7EE0, 0x7E90, 0x7F10, 0x7EE0, 0x77D0, 0x6B50, 0x5C70, 0x4B40, 0x37D0, 0x2200, 0x0B30, 0xF200, 0xD590, 0xBA20, 0x9DB0, + 0x8900, 0x8510, 0x84C0, 0x84A0, 0x8490, 0x8480, 0x8470, 0x8460, 0x8450, 0x8450, 0x8440, 0x8430, 0x8430, 0x8420, 0x8410, 0x8410, + 0x8410, 0x8440, 0x8400, 0x8400, 0x8400, 0x8400, 0x83F0, 0x83F0, 0x8400, 0x83F0, 0x8400, 0x83F0, 0x8400, 0x8400, 0x8400, 0x8400, + 0x8410, 0x8410, 0x8410, 0x8420, 0x8410, 0x8410, 0x8410, 0x8410, 0x83D0, 0x8400, 0x83F0, 0x83F0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, + 0x83D0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83F0, 0x83F0, 0x83F0, 0x8400, 0x8410, 0x8420, 0x8430, 0x8430, 0x8440, 0x8440, + 0x8450, 0x8450, 0x8460, 0x8470, 0x8490, 0x84C0, 0x8540, 0x8AF0, 0xA910, 0xC0D0, 0xD480, 0xE470, 0xF2A0, 0xFE10, 0x09C0, 0x11C0, + 0x16B0, 0x19B0, 0x18E0, 0x1660, 0x10C0, 0x09B0, 0x0140, 0xF850, 0xF090, 0xE900, 0xE140, 0xDA70, 0xD1A0, 0xC770, 0xBBA0, 0xAD50, + 0x9D50, 0x8EB0, 0x8710, 0x8530, 0x84E0, 0x84C0, 0x84A0, 0x8490, 0x8480, 0x8470, 0x8470, 0x8460, 0x8450, 0x8450, 0x8450, 0x8440, + 0x8440, 0x8440, 0x8440, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, + 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8450, 0x8450, 0x8450, 0x8410, 0x8450, + 0x8450, 0x8450, 0x8460, 0x8460, 0x8460, 0x8470, 0x8470, 0x8470, 0x8480, 0x8490, 0x8490, 0x84A0, 0x84A0, 0x84B0, 0x84C0, 0x84C0, + 0x84D0, 0x84E0, 0x84F0, 0x8500, 0x8510, 0x8510, 0x8510, 0x8500, 0x8500, 0x84F0, 0x84F0, 0x84F0, 0x84E0, 0x84E0, 0x84D0, 0x84D0, + 0x84C0, 0x84C0, 0x84B0, 0x84B0, 0x84B0, 0x84A0, 0x84A0, 0x8460, 0x84A0, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, + 0x8490, 0x8490, 0x8490, 0x8490, 0x84A0, 0x84B0, 0x84B0, 0x84D0, 0x84F0, 0x8510, 0x8570, 0x8610, 0x8720, 0x87E0, 0x87C0, 0x86A0, + 0x8580, 0x84F0, 0x84C0, 0x8490, 0x8480, 0x8460, 0x8450, 0x8450, 0x8440, 0x8440, 0x8440, 0x8430, 0x8430, 0x8420, 0x8420, 0x8410, + 0x8410, 0x8400, 0x8410, 0x8400, 0x8400, 0x8400, 0x8410, 0x8410, 0x8420, 0x8440, 0x8430, 0x8430, 0x8440, 0x8450, 0x8470, 0x8490, + 0x84E0, 0x8680, 0x98E0, 0xAA00, 0xB670, 0xC210, 0xD0A0, 0xE450, 0xF900, 0x0C50, 0x1B90, 0x24C0, 0x2760, 0x2410, 0x1CC0, 0x1350, + 0x0880, 0xFF00, 0xF630, 0xD4E0, 0xCBB0, 0xC400, 0xBEC0, 0xBC80, 0xBDE0, 0xC340, 0xCAC0, 0xD530, 0xE0E0, 0xEE30, 0xFC10, 0x09E0, + 0x18C0, 0x26D0, 0x3640, 0x4570, 0x5510, 0x6480, 0x7340, 0x7E40, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, + 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F20, 0x7F30, 0x7F10, 0x7F20, 0x7F30, 0x7F10, 0x7F20, + 0x7F40, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7D20, 0x69E0, 0x5950, 0x4A80, 0x3F00, 0x3740, 0x3150, 0x2DE0, 0x2BD0, + 0x2AB0, 0x29F0, 0x2940, 0x2870, 0x26F0, 0x2430, 0x1FD0, 0x1920, 0x0E90, 0x0330, 0xF5A0, 0xE710, 0xD7D0, 0xC8D0, 0xBA00, 0xABF0, + 0x9E30, 0x9100, 0x88D0, 0x85C0, 0x8500, 0x84D0, 0x84B0, 0x8490, 0x8480, 0x8470, 0x8460, 0x8450, 0x8440, 0x8430, 0x8430, 0x8420, + 0x8410, 0x8410, 0x8400, 0x8400, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8400, 0x8400, + 0x8410, 0x8410, 0x8410, 0x8420, 0x8420, 0x8430, 0x8430, 0x8430, 0x8440, 0x8440, 0x8440, 0x8450, 0x8450, 0x8440, 0x8460, 0x8470, + 0x8480, 0x8480, 0x8490, 0x84A0, 0x84B0, 0x84D0, 0x84F0, 0x8560, 0x8690, 0x8A40, 0x9160, 0x97A0, 0x9CC0, 0xA160, 0xA5A0, 0xAAA0, + 0xB1A0, 0xB8E0, 0xBFF0, 0xC730, 0xCE00, 0xD3C0, 0xD900, 0xDD90, 0xE120, 0xE540, 0xE830, 0xEAC0, 0xED20, 0xEDD0, 0xEE30, 0xEDB0, + 0xED20, 0xEC90, 0xEC00, 0xEC80, 0xECD0, 0xEFB0, 0xF300, 0xF6A0, 0xFB50, 0x0030, 0x05E0, 0x0BF0, 0x1130, 0x1760, 0x1D20, 0x22B0, + 0x27F0, 0x2C80, 0x3140, 0x3390, 0x3520, 0x3540, 0x3350, 0x3110, 0x2D30, 0x2940, 0x23B0, 0x1F60, 0x1B20, 0x1640, 0x1310, 0x1100, + 0x0F80, 0x10D0, 0x1370, 0x18A0, 0x1F60, 0x27D0, 0x32A0, 0x3C20, 0x44F0, 0x4C10, 0x5160, 0x5500, 0x5650, 0x55B0, 0x5400, 0x5010, + 0x4C10, 0x48A0, 0x4660, 0x47C0, 0x4BA0, 0x5380, 0x5CC0, 0x6550, 0x6CA0, 0x7040, 0x7290, 0x7510, 0x7A60, 0x7F00, 0x7ED0, 0x7F30, + 0x7F20, 0x7EF0, 0x7F10, 0x7F00, 0x7F40, 0x7F10, 0x7F10, 0x7F20, 0x7EE0, 0x7F80, 0x7F00, 0x7F00, 0x7EF0, 0x7F10, 0x7F80, 0x7F20, + 0x7F10, 0x7EF0, 0x7EE0, 0x7F70, 0x7EF0, 0x7EF0, 0x7EE0, 0x7ED0, 0x7F50, 0x7F10, 0x7EA0, 0x7ED0, 0x7F00, 0x7F60, 0x7F10, 0x7E90, + 0x7EB0, 0x7EC0, 0x7EF0, 0x7F10, 0x7EA0, 0x7EC0, 0x7ED0, 0x7F10, 0x7F00, 0x7EC0, 0x7F10, 0x7F00, 0x7F00, 0x7EF0, 0x7EA0, 0x7F00, + 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7F40, 0x7F10, 0x7F10, 0x7F10, 0x7F10, 0x7F30, 0x7EF0, 0x7F10, 0x7F10, 0x7F10, 0x7F60, 0x7F00, + 0x7F20, 0x7F00, 0x7F10, 0x7F50, 0x7EF0, 0x7EE0, 0x7EF0, 0x7EF0, 0x7F70, 0x7EE0, 0x7EF0, 0x7F10, 0x7F20, 0x7F60, 0x7ED0, 0x5FB0, + 0x3A00, 0x10C0, 0xE0F0, 0xB2F0, 0x8950, 0x84C0, 0x8430, 0x8420, 0x8410, 0x8410, 0x8400, 0x8400, 0x83F0, 0x83F0, 0x83F0, 0x83F0, + 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8400, 0x8410, 0x8420, 0x8430, 0x8430, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, + 0x8440, 0x8440, 0x8440, 0x8440, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8460, 0x8460, + 0x8460, 0x8470, 0x84A0, 0x8490, 0x84B0, 0x84D0, 0x84E0, 0x84E0, 0x84D0, 0x84D0, 0x84B0, 0x8490, 0x8490, 0x8480, 0x8480, 0x8470, + 0x8470, 0x8490, 0x8460, 0x8460, 0x8460, 0x8450, 0x8450, 0x8490, 0x8460, 0x8470, 0x8480, 0x8440, 0x84C0, 0x8510, 0x8720, 0x9A00, + 0xAE70, 0xBFB0, 0xCCD0, 0xD5C0, 0xDAD0, 0xDC70, 0xDAE0, 0xD620, 0xCF40, 0xC860, 0xC130, 0xBAB0, 0xB580, 0xB200, 0xB080, 0xB080, + 0xB310, 0xB6B0, 0xBC10, 0xC170, 0xC8B0, 0xD080, 0xD8A0, 0xE1A0, 0xEB40, 0xF550, 0x01B0, 0x0D00, 0x18F0, 0x2470, 0x2FE0, 0x3C70, + 0x4850, 0x5580, 0x6280, 0x7150, 0x7D90, 0x7EA0, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7EE0, 0x7F40, 0x7EF0, 0x7EF0, 0x7F10, 0x7F00, + 0x7F60, 0x7F00, 0x7F10, 0x7F10, 0x7EF0, 0x7F50, 0x7EF0, 0x7F10, 0x7EF0, 0x7EF0, 0x7F90, 0x7F00, 0x7F00, 0x7EF0, 0x7F00, 0x7F60, + 0x7F10, 0x7EF0, 0x7EE0, 0x7EE0, 0x7EF0, 0x7F10, 0x7EB0, 0x7ED0, 0x7ED0, 0x7F30, 0x7F20, 0x7EC0, 0x7ED0, 0x7EB0, 0x7F00, 0x7EF0, + 0x7E90, 0x7EA0, 0x7EE0, 0x7F10, 0x7F20, 0x7EA0, 0x7F00, 0x7F10, 0x7F10, 0x7F10, 0x7E90, 0x7F10, 0x7F00, 0x7EF0, 0x7EF0, 0x7F00, + 0x7F60, 0x7F20, 0x7F20, 0x7F20, 0x7F00, 0x7F50, 0x7F10, 0x7F20, 0x7EF0, 0x7EF0, 0x7F60, 0x7EF0, 0x7F10, 0x7F10, 0x7F20, 0x7F60, + 0x7ED0, 0x7EF0, 0x7EF0, 0x7EE0, 0x7F70, 0x7EE0, 0x7EE0, 0x7EF0, 0x7F10, 0x7F60, 0x7EE0, 0x7E90, 0x7F10, 0x7F00, 0x7F30, 0x7EB0, + 0x7EA0, 0x7EE0, 0x7EF0, 0x7F10, 0x7F20, 0x7F00, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7EB0, 0x7F20, 0x7F20, 0x7EF0, 0x7F30, 0x7EC0, + 0x7F40, 0x7F10, 0x7F20, 0x7F40, 0x7F10, 0x7F90, 0x7F00, 0x7F20, 0x7F10, 0x7F00, 0x7F60, 0x7EF0, 0x7F10, 0x7F10, 0x7F00, 0x7F70, + 0x7F10, 0x7F20, 0x7F10, 0x7EF0, 0x7F30, 0x7F00, 0x7EC0, 0x7ED0, 0x7EE0, 0x7F30, 0x7F10, 0x7EB0, 0x7F00, 0x7EE0, 0x7F10, 0x7F10, + 0x7E70, 0x7EC0, 0x7ED0, 0x7F00, 0x7F00, 0x7B90, 0x7230, 0x6720, 0x5AA0, 0x4D80, 0x3F10, 0x30A0, 0x1FD0, 0x1070, 0x0170, 0xF2C0, + 0xE3D0, 0xD520, 0xC640, 0xB7C0, 0xA8D0, 0x99D0, 0x8DE0, 0x87B0, 0x85D0, 0x8530, 0x8500, 0x84E0, 0x84D0, 0x84D0, 0x84C0, 0x84B0, + 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84C0, 0x84C0, 0x84F0, 0x84F0, 0x8520, 0x8590, 0x8700, 0x8BF0, + 0x9750, 0xA330, 0xAF20, 0xBC00, 0xC800, 0xD490, 0xE140, 0xEF50, 0xFCF0, 0x09F0, 0x1760, 0x24E0, 0x3290, 0x40A0, 0x4E60, 0x5C40, + 0x6A30, 0x75E0, 0x7E40, 0x7F30, 0x7F30, 0x7F30, 0x7F40, 0x7F50, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, + 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F40, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F20, + 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F10, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F20, 0x7F20, + 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F10, + 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7EF0, 0x7F30, + 0x7F30, 0x7F40, 0x7F30, 0x7F00, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F20, 0x7F20, 0x7F40, 0x7F30, 0x7F30, + 0x7F20, 0x7F40, 0x7F50, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F40, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F50, 0x7F30, 0x7F20, 0x7F20, + 0x7F10, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F20, 0x7F30, + 0x7F20, 0x7F20, 0x7F30, 0x7F10, 0x7F20, 0x7F40, 0x7F10, 0x7F30, 0x7EF0, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F70, 0x7F10, 0x7EF0, + 0x7F20, 0x7F40, 0x7F50, 0x7F30, 0x7EA0, 0x7EE0, 0x7EF0, 0x7F30, 0x7F00, 0x7E60, 0x7EB0, 0x7F20, 0x7F20, 0x7EF0, 0x7E90, 0x7EB0, + 0x7EE0, 0x7EF0, 0x7F10, 0x7E70, 0x7EF0, 0x7F10, 0x7F20, 0x7F40, 0x7EC0, 0x7F30, 0x7EF0, 0x7EF0, 0x7EF0, 0x7EA0, 0x7F20, 0x7EF0, + 0x7F10, 0x7F20, 0x7F20, 0x7F80, 0x7950, 0x6FC0, 0x6790, 0x5F70, 0x5790, 0x50A0, 0x4950, 0x4310, 0x3D10, 0x37C0, 0x32F0, 0x2E60, + 0x2BA0, 0x2840, 0x2510, 0x2270, 0x1FA0, 0x1CF0, 0x1A10, 0x1720, 0x1450, 0x10F0, 0x0E30, 0x0BA0, 0x08D0, 0x06B0, 0x03E0, 0x0100, + 0xFDB0, 0xFA10, 0xF770, 0xF450, 0xF120, 0xEE20, 0xEB70, 0xE910, 0xE680, 0xE3D0, 0xE110, 0xDE70, 0xDCA0, 0xDA60, 0xD8C0, 0xD6D0, + 0xD450, 0xD2C0, 0xD030, 0xCE20, 0xCCC0, 0xCB10, 0xCB50, 0xCB40, 0xCBE0, 0xCC70, 0xCD70, 0xCF00, 0xD000, 0xD110, 0xD220, 0xD2A0, + 0xD390, 0xD510, 0xD6B0, 0xD8F0, 0xDB10, 0xDDF0, 0xE0E0, 0xE2F0, 0xE5F0, 0xE840, 0xEB20, 0xED90, 0xF0B0, 0xF400, 0xF6F0, 0xFB00, + 0xFE20, 0x01C0, 0x0520, 0x0870, 0x0BA0, 0x0F00, 0x12B0, 0x16A0, 0x1A40, 0x1E10, 0x2280, 0x2600, 0x2AA0, 0x2E80, 0x32B0, 0x3740, + 0x3A80, 0x3EE0, 0x41E0, 0x4500, 0x4790, 0x4A50, 0x4DB0, 0x5070, 0x5330, 0x5620, 0x5870, 0x5BD0, 0x5EB0, 0x6120, 0x63C0, 0x6650, + 0x6990, 0x6C80, 0x6EF0, 0x7170, 0x7300, 0x74F0, 0x7600, 0x76F0, 0x7770, 0x77D0, 0x7850, 0x7900, 0x7940, 0x7910, 0x77F0, 0x77E0, + 0x7760, 0x7650, 0x76B0, 0x75F0, 0x7690, 0x7730, 0x7760, 0x78E0, 0x7980, 0x7AB0, 0x7C00, 0x7CC0, 0x7DB0, 0x7E20, 0x7EC0, 0x7F10, + 0x7F20, 0x7F20, 0x7F00, 0x7F50, 0x7F10, 0x7F40, 0x7F10, 0x7F00, 0x7F30, 0x7EF0, 0x7F40, 0x7F10, 0x7F00, 0x7F00, 0x7D30, 0x7A60, + 0x7740, 0x72D0, 0x6DF0, 0x6860, 0x61E0, 0x5A50, 0x5160, 0x45E0, 0x0B40, 0xFB40, 0xE9D0, 0xD6C0, 0xC340, 0xAD50, 0x95A0, 0x8720, + 0x84F0, 0x84B0, 0x8490, 0x8470, 0x8460, 0x8450, 0x8440, 0x8430, 0x8420, 0x8410, 0x8430, 0x8400, 0x83F0, 0x83F0, 0x83E0, 0x83D0, + 0x83D0, 0x83E0, 0x83C0, 0x83B0, 0x83B0, 0x83B0, 0x83A0, 0x83A0, 0x83D0, 0x8390, 0x8390, 0x8390, 0x83B0, 0x8390, 0x8390, 0x8390, + 0x83C0, 0x8380, 0x8390, 0x8390, 0x8390, 0x8390, 0x8390, 0x8390, 0x8390, 0x8390, 0x83C0, 0x83A0, 0x83B0, 0x83A0, 0x83A0, 0x83B0, + 0x83A0, 0x8340, 0x83B0, 0x83A0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, + 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83B0, 0x83C0, 0x83C0, + 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, + 0x83D0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83F0, 0x83F0, 0x83F0, 0x8420, 0x8400, 0x8410, 0x8410, 0x8420, 0x8430, + 0x8430, 0x8440, 0x8450, 0x8460, 0x84B0, 0x8480, 0x84A0, 0x84C0, 0x84E0, 0x8560, 0x8760, 0x90B0, 0x9E90, 0xAAA0, 0xB490, 0xBC90, + 0xC310, 0xC7D0, 0xCC10, 0xCE70, 0xD090, 0xD260, 0xD410, 0xD630, 0xD800, 0xD9E0, 0xDB80, 0xDC30, 0xDC60, 0xDB90, 0xDA10, 0xD750, + 0xD400, 0xD060, 0xCC30, 0xC730, 0xC1A0, 0xBB90, 0xB650, 0xB070, 0xAA90, 0xA500, 0x9F30, 0x98F0, 0x9170, 0x8A40, 0x86A0, 0x8550, + 0x84F0, 0x84D0, 0x84C0, 0x84B0, 0x84A0, 0x84A0, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, + 0x8490, 0x8480, 0x8490, 0x8490, 0x8490, 0x84A0, 0x84B0, 0x84B0, 0x84C0, 0x84D0, 0x84D0, 0x84E0, 0x84F0, 0x8500, 0x8510, 0x8520, + 0x8530, 0x8520, 0x8510, 0x8500, 0x84E0, 0x84C0, 0x84B0, 0x8490, 0x8480, 0x8470, 0x8460, 0x8460, 0x8450, 0x8440, 0x8430, 0x8420, + 0x8420, 0x8410, 0x8400, 0x8400, 0x83F0, 0x83F0, 0x83F0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83D0, 0x83D0, 0x83E0, 0x83E0, + 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83D0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83F0, 0x83F0, 0x83F0, 0x8400, 0x8410, + 0x8410, 0x8420, 0x8430, 0x8440, 0x8450, 0x8450, 0x8470, 0x8480, 0x8490, 0x84B0, 0x84E0, 0x8550, 0x8780, 0x9380, 0xA410, 0xB1F0, + 0xBF60, 0xCAD0, 0xD590, 0xDF20, 0xE6C0, 0xED30, 0xF1D0, 0xF430, 0xF6A0, 0xF790, 0xF8A0, 0xF920, 0xFA10, 0xFB30, 0xFC30, 0xFDA0, + 0xFFF0, 0x0200, 0x0490, 0x06F0, 0x0930, 0x0AE0, 0x0CC0, 0x0F10, 0x1190, 0x1460, 0x1730, 0x1A30, 0x1D40, 0x2040, 0x22B0, 0x23F0, + 0x2510, 0x2530, 0x24B0, 0x2490, 0x2500, 0x2620, 0x26C0, 0x2730, 0x2800, 0x2790, 0x26F0, 0x2570, 0x2380, 0x2160, 0x1D80, 0x1870, + 0x11E0, 0x08D0, 0xFE30, 0xF130, 0xE210, 0xD3A0, 0xC500, 0xB7A0, 0xABF0, 0xA270, 0x9A60, 0x94A0, 0x8FB0, 0x8BC0, 0x8900, 0x8700, + 0x85C0, 0x8540, 0x8500, 0x84D0, 0x84C0, 0x84A0, 0x8490, 0x8480, 0x8470, 0x8460, 0x8480, 0x8440, 0x8430, 0x8430, 0x8420, 0x8410, + 0x8400, 0x8400, 0x83F0, 0x83F0, 0x83E0, 0x83E0, 0x83D0, 0x83D0, 0x83C0, 0x83C0, 0x83C0, 0x83B0, 0x83B0, 0x8370, 0x83B0, 0x83B0, + 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83A0, 0x83A0, 0x83A0, 0x83A0, 0x8390, 0x8390, 0x8390, 0x8390, + 0x8340, 0x8390, 0x83A0, 0x83A0, 0x83A0, 0x83A0, 0x83A0, 0x83A0, 0x83B0, 0x83B0, 0x83B0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, + 0x83B0, 0x83C0, 0x83C0, 0x83B0, 0x83B0, 0x83A0, 0x83A0, 0x8390, 0x8390, 0x8390, 0x8390, 0x8390, 0x8390, 0x8390, 0x83A0, 0x83B0, + 0x83B0, 0x83C0, 0x83C0, 0x83C0, 0x83D0, 0x83D0, 0x83E0, 0x83E0, 0x83E0, 0x8430, 0x8400, 0x8400, 0x8410, 0x8410, 0x8420, 0x8430, + 0x8430, 0x8440, 0x8440, 0x8450, 0x8470, 0x8480, 0x8490, 0x84A0, 0x84C0, 0x84F0, 0x8530, 0x8640, 0x8A10, 0x9580, 0xA250, 0xAF70, + 0xBD60, 0xCBD0, 0xDDB0, 0xF040, 0x04C0, 0x1AF0, 0x32B0, 0x4B00, 0x62A0, 0x76F0, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, + 0x7F30, 0x7F30, 0x7FA0, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F40, 0x7F10, 0x7F10, 0x7EB0, 0x7EF0, 0x7F40, 0x7EB0, 0x7EE0, 0x7EC0, + 0x7ED0, 0x7F30, 0x7F40, 0x7EF0, 0x7ED0, 0x7F00, 0x7F70, 0x7F10, 0x7EB0, 0x7EE0, 0x7ED0, 0x7F30, 0x7F30, 0x7EA0, 0x7EF0, 0x7EE0, + 0x7F30, 0x7F50, 0x7E90, 0x7EB0, 0x7EE0, 0x7EF0, 0x7F30, 0x7EA0, 0x7EC0, 0x7F10, 0x7F10, 0x7F00, 0x7EC0, 0x7F10, 0x7F10, 0x7F00, + 0x7F10, 0x7E90, 0x7F20, 0x7F00, 0x7F10, 0x7F10, 0x7EA0, 0x7F00, 0x7EF0, 0x7F10, 0x7F40, 0x7EC0, 0x7F40, 0x7EF0, 0x7F20, 0x7F40, + 0x7F10, 0x7F80, 0x7EF0, 0x7F20, 0x7F20, 0x7F10, 0x7F80, 0x7EF0, 0x7EF0, 0x7EF0, 0x7F00, 0x7F60, 0x7F00, 0x7F00, 0x7F00, 0x7F00, + 0x7F50, 0x7F10, 0x7EA0, 0x7EC0, 0x7ED0, 0x7F30, 0x7EF0, 0x7EB0, 0x7EE0, 0x7EE0, 0x7F10, 0x7F10, 0x7E90, 0x7EE0, 0x7EF0, 0x7F10, + 0x7F00, 0x7EC0, 0x7EB0, 0x7F10, 0x7F20, 0x7F10, 0x7F00, 0x7F20, 0x7F10, 0x7F10, 0x7F10, 0x7EE0, 0x7F40, 0x7F10, 0x7F20, 0x7F20, + 0x7EE0, 0x6B50, 0x5520, 0x3A80, 0x1E30, 0xFF90, 0xE070, 0xC160, 0xA390, 0x8BB0, 0x8550, 0x84E0, 0x84C0, 0x84B0, 0x84C0, 0x84B0, + 0x84E0, 0x8570, 0x90C0, 0xC3B0, 0xFAC0, 0x39F0, 0x7810, 0x7EB0, 0x7F20, 0x7F00, 0x7F10, 0x7ED0, 0x7EC0, 0x7ED0, 0x7F10, 0x7F20, + 0x7EE0, 0x7E90, 0x7F10, 0x7F00, 0x7F00, 0x7F10, 0x7EA0, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7EE0, 0x7F40, 0x7F10, 0x7EE0, 0x7F10, + 0x7F00, 0x7F60, 0x7F00, 0x7F10, 0x7EF0, 0x7EF0, 0x7F60, 0x7EF0, 0x7F10, 0x7EE0, 0x7EF0, 0x7F80, 0x7F00, 0x7F00, 0x7EF0, 0x7ED0, + 0x7F60, 0x7F10, 0x7ED0, 0x7EB0, 0x7EC0, 0x7EF0, 0x7F10, 0x7EA0, 0x7EC0, 0x7ED0, 0x7F30, 0x7F00, 0x7E90, 0x7EB0, 0x7EE0, 0x7EE0, + 0x7EF0, 0x7E90, 0x7EC0, 0x7ED0, 0x7F10, 0x7F10, 0x7EC0, 0x7F00, 0x7F10, 0x7F00, 0x7ED0, 0x7F00, 0x7F00, 0x7E90, 0x7ED0, 0x7F00, + 0x7EF0, 0x7F10, 0x7F00, 0x7F20, 0x7F10, 0x7F10, 0x7EF0, 0x7EE0, 0x7F50, 0x7F10, 0x7F00, 0x7EE0, 0x7EF0, 0x7F60, 0x7F00, 0x7F20, + 0x7F10, 0x7EF0, 0x7F50, 0x7EF0, 0x7F10, 0x7EE0, 0x7EF0, 0x7F80, 0x7EF0, 0x7EE0, 0x7F00, 0x7F10, 0x7F60, 0x7EE0, 0x7EB0, 0x7EF0, + 0x7EE0, 0x7F20, 0x7ED0, 0x7EB0, 0x7EE0, 0x7EF0, 0x7F30, 0x7F00, 0x7EC0, 0x7F10, 0x7EF0, 0x7EF0, 0x7F00, 0x7E90, 0x7EF0, 0x7EE0, + 0x7ED0, 0x7F10, 0x7F00, 0x7F40, 0x7ED0, 0x7F10, 0x7F40, 0x7F00, 0x7F30, 0x7EE0, 0x7F00, 0x7EF0, 0x7F10, 0x7F70, 0x7F00, 0x7F20, + 0x7F20, 0x7F00, 0x7F90, 0x7EF0, 0x7EF0, 0x7EE0, 0x7ED0, 0x7F70, 0x7EE0, 0x7EF0, 0x7EF0, 0x7F00, 0x7F60, 0x7F10, 0x7E90, 0x7EB0, + 0x7EC0, 0x7F30, 0x7F00, 0x7E70, 0x7ED0, 0x7ED0, 0x7F20, 0x7F20, 0x7E90, 0x7E90, 0x7EE0, 0x7F10, 0x7F10, 0x7EA0, 0x7EE0, 0x7EF0, + 0x7F10, 0x7F20, 0x7F00, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F00, 0x7F30, 0x7F20, 0x7F10, 0x7F10, 0x7EE0, 0x7F40, 0x7F30, 0x7F20, + 0x7F00, 0x7F10, 0x7F50, 0x7EF0, 0x7EF0, 0x7F10, 0x7F00, 0x7F40, 0x7EF0, 0x7F10, 0x7F10, 0x7F20, 0x78D0, 0x6A50, 0x5860, 0x4580, + 0x30D0, 0x1AF0, 0x0440, 0xEAF0, 0xD0D0, 0xB560, 0x9960, 0x8710, 0x84F0, 0x84D0, 0x84C0, 0x8480, 0x8470, 0x8470, 0x8450, 0x8450, + 0x8440, 0x8460, 0x8430, 0x8420, 0x83C0, 0x8410, 0x8410, 0x8400, 0x8400, 0x8400, 0x83F0, 0x8430, 0x83F0, 0x83F0, 0x83F0, 0x83E0, + 0x83E0, 0x83E0, 0x83D0, 0x83D0, 0x83F0, 0x83D0, 0x83D0, 0x83C0, 0x83D0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, + 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83C0, 0x83D0, 0x83C0, 0x83D0, 0x83D0, 0x83C0, 0x83D0, 0x83D0, + 0x83E0, 0x83E0, 0x83E0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, + 0x8410, 0x8410, 0x8420, 0x8430, 0x8430, 0x8440, 0x8450, 0x8460, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, + 0x8470, 0x8470, 0x8470, 0x8470, 0x8480, 0x8480, 0x8480, 0x8490, 0x8490, 0x8490, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x8490, 0x8490, + 0x8480, 0x8470, 0x8460, 0x8450, 0x8450, 0x8440, 0x8440, 0x8430, 0x8430, 0x8420, 0x8410, 0x8410, 0x8400, 0x8400, 0x8400, 0x83F0, + 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83E0, 0x83F0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83C0, 0x83D0, + 0x83D0, 0x83C0, 0x83D0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83E0, 0x83D0, 0x83D0, 0x83D0, + 0x83E0, 0x83D0, 0x83E0, 0x83E0, 0x83F0, 0x83E0, 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8400, 0x8410, 0x8460, 0x8420, 0x8430, 0x8420, + 0x8440, 0x8440, 0x8450, 0x84A0, 0x8460, 0x8470, 0x8480, 0x8490, 0x84A0, 0x84C0, 0x84E0, 0x8550, 0x87F0, 0x9910, 0xAED0, 0xC520, + 0xDB80, 0xF570, 0x0DE0, 0x2700, 0x4080, 0x5A30, 0x70D0, 0x7F20, 0x7F20, 0x7F40, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, + 0x7EF0, 0x7F10, 0x7F30, 0x7F20, 0x7F10, 0x7EF0, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F40, + 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F50, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F50, 0x7F20, 0x7F40, 0x7A10, 0x5F20, 0x4070, 0x2210, + 0x02B0, 0xE220, 0xC0F0, 0x9E90, 0x8740, 0x84E0, 0x84D0, 0x8480, 0x8470, 0x8460, 0x8450, 0x8440, 0x8430, 0x8430, 0x8420, 0x8420, + 0x8410, 0x8400, 0x8400, 0x83F0, 0x83F0, 0x83F0, 0x83E0, 0x83E0, 0x83E0, 0x83D0, 0x83E0, 0x83D0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, + 0x83C0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83A0, 0x83A0, 0x83A0, 0x83A0, 0x83A0, 0x83A0, 0x83A0, 0x83B0, + 0x83B0, 0x83B0, 0x83C0, 0x83C0, 0x83F0, 0x83D0, 0x83E0, 0x83E0, 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8400, 0x8400, 0x8410, 0x8400, + 0x8400, 0x8400, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83F0, 0x83F0, 0x8430, 0x8400, + 0x8410, 0x8420, 0x8430, 0x8430, 0x8440, 0x8450, 0x8460, 0x8470, 0x8480, 0x84A0, 0x8550, 0x85F0, 0xA040, 0xC580, 0xE180, 0xF450, + 0xFDB0, 0x0030, 0xFEB0, 0xFDB0, 0xFF40, 0x04D0, 0x0EF0, 0x1CB0, 0x2C40, 0x3D00, 0x4B40, 0x55C0, 0x5C90, 0x6050, 0x6430, 0x6920, + 0x6F50, 0x7790, 0x7EA0, 0x7EF0, 0x7F10, 0x7F80, 0x7F00, 0x7F40, 0x7F10, 0x7EF0, 0x7F60, 0x7EF0, 0x7F10, 0x7F00, 0x7EF0, 0x7F70, + 0x7F10, 0x7EE0, 0x7F10, 0x7ED0, 0x7F30, 0x7F00, 0x7ED0, 0x7EF0, 0x7EE0, 0x7EF0, 0x7EF0, 0x7EA0, 0x7F00, 0x7F00, 0x7F10, 0x7F20, + 0x7EC0, 0x7ED0, 0x7F10, 0x7F00, 0x7EF0, 0x7EC0, 0x7F10, 0x7EF0, 0x7EF0, 0x7F10, 0x7F00, 0x7160, 0x5290, 0x3970, 0x2790, 0x1D20, + 0x1B50, 0x23A0, 0x3460, 0x4D50, 0x6AF0, 0x7F60, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7F50, 0x7EF0, 0x7F10, 0x7EE0, 0x7EF0, 0x7F80, + 0x7F00, 0x7EC0, 0x7EF0, 0x7F00, 0x7F60, 0x7EF0, 0x7EB0, 0x7EF0, 0x7EE0, 0x7EF0, 0x7ED0, 0x7E70, 0x7EF0, 0x7EF0, 0x7F30, 0x7EE0, + 0x7EC0, 0x7EF0, 0x7EF0, 0x7EF0, 0x7ED0, 0x7E90, 0x7EE0, 0x7EF0, 0x7EF0, 0x7F20, 0x7F00, 0x7F40, 0x7EF0, 0x7F00, 0x7F20, 0x7F00, + 0x7EB0, 0x7E70, 0x7EF0, 0x7F10, 0x7EA0, 0x7F00, 0x7F00, 0x7F00, 0x7F00, 0x7E90, 0x7F00, 0x7F00, 0x7EF0, 0x7F10, 0x7F00, 0x7F10, + 0x7F00, 0x7EE0, 0x7EF0, 0x7F00, 0x7F60, 0x7F20, 0x7F10, 0x7F10, 0x7F00, 0x7F50, 0x7EF0, 0x7F00, 0x7EE0, 0x7EF0, 0x7F50, 0x7F00, + 0x7F00, 0x7F10, 0x7F00, 0x7F60, 0x7EF0, 0x7ED0, 0x7EF0, 0x7EE0, 0x7F50, 0x7ED0, 0x7EC0, 0x7EF0, 0x7F10, 0x7F30, 0x7EE0, 0x7EC0, + 0x7F10, 0x7F00, 0x7EF0, 0x7EF0, 0x7EA0, 0x7F00, 0x7EF0, 0x7F10, 0x7F20, 0x7F00, 0x7F40, 0x7F10, 0x7F20, 0x7F10, 0x7F00, 0x7F30, + 0x7EE0, 0x7EF0, 0x7F30, 0x7F10, 0x7F70, 0x7F10, 0x7F20, 0x7F40, 0x7F10, 0x7F90, 0x7F00, 0x7F20, 0x7F10, 0x7F20, 0x7F40, 0x7F10, + 0x7F70, 0x7EF0, 0x7F00, 0x7F30, 0x7F00, 0x7F80, 0x7F10, 0x7F10, 0x7EE0, 0x7EE0, 0x7F70, 0x7F10, 0x7EE0, 0x7ED0, 0x7EF0, 0x7F60, + 0x7F20, 0x7EC0, 0x7EB0, 0x7EB0, 0x7EF0, 0x7F10, 0x7E70, 0x7EC0, 0x7ED0, 0x7F10, 0x7B00, 0x5E80, 0x43D0, 0x2AB0, 0x1240, 0x00C0, + 0xF200, 0xE570, 0xDAE0, 0xD280, 0xCD90, 0xCB60, 0xCDA0, 0xD2E0, 0xDAC0, 0xE440, 0xEDE0, 0xF5D0, 0xFB20, 0xFC20, 0xFAF0, 0xF6C0, + 0xF240, 0xEE80, 0xECE0, 0xEDC0, 0xF0C0, 0xF610, 0xFD50, 0x0410, 0x0A40, 0x0E70, 0x0E30, 0x0A60, 0x0210, 0xF710, 0xE960, 0xDAA0, + 0xCB50, 0xBB80, 0xAA60, 0x9A70, 0x8BC0, 0x8610, 0x8500, 0x84D0, 0x84B0, 0x8490, 0x8490, 0x8470, 0x8460, 0x8460, 0x8450, 0x8450, + 0x8440, 0x8440, 0x8450, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8460, 0x8430, 0x8430, 0x8430, 0x83C0, 0x8430, 0x8430, 0x8460, + 0x8430, 0x8440, 0x8430, 0x8430, 0x8430, 0x8430, 0x8410, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8430, 0x8430, 0x8430, + 0x8430, 0x8430, 0x8430, 0x8440, 0x8440, 0x8440, 0x8450, 0x8460, 0x8470, 0x8470, 0x8490, 0x84A0, 0x84D0, 0x8550, 0x8A40, 0xA760, + 0xC390, 0xE090, 0xFB20, 0x1420, 0x2CE0, 0x4490, 0x5BB0, 0x7120, 0x7EC0, 0x7F10, 0x7F00, 0x7F40, 0x7F10, 0x7F10, 0x7F00, 0x7EE0, + 0x7F40, 0x7F10, 0x7F20, 0x7F10, 0x7F10, 0x7F60, 0x7F00, 0x7ED0, 0x7F10, 0x7EF0, 0x7F60, 0x7EF0, 0x7F00, 0x7EE0, 0x7EF0, 0x7F80, + 0x7F00, 0x7EC0, 0x7F10, 0x7F10, 0x7F30, 0x7EF0, 0x7EB0, 0x7EF0, 0x7F20, 0x7EF0, 0x7ED0, 0x7EA0, 0x7F00, 0x7F00, 0x7F30, 0x7F00, + 0x7EC0, 0x7F10, 0x7EF0, 0x7EF0, 0x7EF0, 0x7F00, 0x7F30, 0x7EF0, 0x7F10, 0x7F20, 0x7F00, 0x7F40, 0x7F10, 0x7F10, 0x7F20, 0x7EF0, + 0x7F30, 0x7EE0, 0x7EF0, 0x7EF0, 0x7F10, 0x7F70, 0x7F00, 0x7F10, 0x7EF0, 0x7F00, 0x7F90, 0x7F10, 0x7EF0, 0x7EE0, 0x7EF0, 0x7F70, + 0x7F20, 0x7EC0, 0x7EF0, 0x7F00, 0x7F60, 0x7F10, 0x7E90, 0x7EB0, 0x7EC0, 0x7EF0, 0x7F10, 0x7E70, 0x7ED0, 0x7ED0, 0x7F00, 0x7F00, + 0x7E90, 0x7E90, 0x7F00, 0x7F20, 0x7F10, 0x7EA0, 0x7EE0, 0x7EF0, 0x7F10, 0x7F20, 0x7F00, 0x7F40, 0x7F10, 0x7F20, 0x7F10, 0x7F00, + 0x7F30, 0x7F20, 0x7EF0, 0x7EF0, 0x7F10, 0x7F60, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F50, 0x7EF0, 0x7EE0, 0x7EF0, 0x7EF0, 0x7F40, + 0x7EF0, 0x7EF0, 0x7F10, 0x7F20, 0x7F70, 0x7ED0, 0x7EB0, 0x7EE0, 0x7F10, 0x7F30, 0x7EE0, 0x7EA0, 0x7EF0, 0x7F10, 0x7F20, 0x7F00, + 0x7E90, 0x7F00, 0x7F00, 0x7F10, 0x7EE0, 0x7EF0, 0x7F10, 0x7EF0, 0x7ED0, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F00, 0x7F00, + 0x7F10, 0x7F10, 0x7F20, 0x7EF0, 0x7EF0, 0x7F20, 0x7F20, 0x7F40, 0x7F10, 0x7F20, 0x7F10, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, + 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F30, + 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F10, 0x7F30, 0x7F20, 0x7AA0, 0x6270, 0x4B00, 0x3240, + 0x1850, 0xFDB0, 0xE1C0, 0xC600, 0xAA40, 0x90E0, 0x8620, 0x8500, 0x84D0, 0x84D0, 0x84D0, 0x84F0, 0x8530, 0x8650, 0x8B80, 0x9590, + 0x9700, 0x8F00, 0x86C0, 0x84F0, 0x84B0, 0x8490, 0x8480, 0x8470, 0x8460, 0x8450, 0x8440, 0x8450, 0x8430, 0x8420, 0x8420, 0x8410, + 0x8410, 0x8410, 0x8420, 0x8420, 0x8430, 0x8440, 0x8450, 0x8460, 0x8480, 0x8490, 0x84B0, 0x84F0, 0x86B0, 0xA680, 0xD0B0, 0xFB60, + 0x2500, 0x4C40, 0x6D50, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F30, 0x7F40, 0x7F30, 0x7F30, 0x7F20, + 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, + 0x7F30, 0x7F20, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F40, 0x7F30, 0x7F20, 0x7F20, 0x7F30, + 0x7F20, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7E20, 0x6F90, 0x6090, 0x50A0, 0x3F60, 0x2CB0, 0x1850, + 0x02D0, 0xEB40, 0xCFE0, 0xB430, 0x96A0, 0x8620, 0x84B0, 0x84A0, 0x8480, 0x8460, 0x8460, 0x8440, 0x8460, 0x8430, 0x8420, 0x8410, + 0x8410, 0x8400, 0x83F0, 0x83F0, 0x83F0, 0x83E0, 0x83D0, 0x83D0, 0x83D0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83B0, 0x83C0, + 0x83C0, 0x83B0, 0x83B0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83E0, 0x83F0, + 0x83E0, 0x83F0, 0x83E0, 0x83F0, 0x8400, 0x8400, 0x83F0, 0x8400, 0x8400, 0x8410, 0x8410, 0x8410, 0x8420, 0x8410, 0x8420, 0x8420, + 0x8420, 0x8420, 0x8420, 0x8420, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8440, 0x8440, 0x8440, 0x8450, 0x8450, 0x8460, 0x8470, + 0x8480, 0x8490, 0x84C0, 0x8500, 0x8650, 0x9710, 0xB330, 0xCCD0, 0xE540, 0xFB60, 0x0F40, 0x20B0, 0x30C0, 0x3DF0, 0x48B0, 0x52E0, + 0x5B40, 0x6250, 0x6A10, 0x7030, 0x7740, 0x7D30, 0x7F00, 0x7F00, 0x7EC0, 0x7F10, 0x7F00, 0x7F20, 0x7EF0, 0x7F00, 0x7EE0, 0x7F10, + 0x7F10, 0x7F20, 0x7F00, 0x7F50, 0x7F10, 0x7F10, 0x7F00, 0x7F10, 0x7F30, 0x7EF0, 0x7F10, 0x7F10, 0x7F10, 0x7F60, 0x7F00, 0x7F10, + 0x7F20, 0x7F00, 0x7F50, 0x7EF0, 0x7EE0, 0x7EF0, 0x7F10, 0x7F70, 0x7F00, 0x7EF0, 0x7F10, 0x7F20, 0x7F60, 0x7ED0, 0x7E90, 0x7F00, + 0x7EE0, 0x7EF0, 0x7EE0, 0x7E70, 0x7EF0, 0x7F10, 0x7F20, 0x7F20, 0x7EC0, 0x7F10, 0x7F00, 0x7F10, 0x7F10, 0x7EA0, 0x7F20, 0x7EF0, + 0x7F10, 0x7F20, 0x7F20, 0x7F50, 0x7F10, 0x7F20, 0x7F40, 0x7F10, 0x7F60, 0x7EE0, 0x7F10, 0x7EF0, 0x7F10, 0x7F70, 0x7F10, 0x7F20, + 0x7F20, 0x7F00, 0x7F90, 0x7F10, 0x7EE0, 0x7EE0, 0x7EF0, 0x7F60, 0x7F10, 0x7ED0, 0x7EF0, 0x7F00, 0x7F50, 0x7F10, 0x7E90, 0x7EE0, + 0x7ED0, 0x7F30, 0x7F00, 0x7E80, 0x7ED0, 0x7F10, 0x7F20, 0x7F20, 0x7EB0, 0x7F00, 0x7F00, 0x7EF0, 0x7F10, 0x7EA0, 0x7F00, 0x7EC0, + 0x7F10, 0x7F00, 0x7EF0, 0x7D50, 0x7500, 0x6DC0, 0x6750, 0x6190, 0x5D40, 0x5980, 0x5680, 0x54A0, 0x5470, 0x55E0, 0x5900, 0x5F40, + 0x6750, 0x7170, 0x7C60, 0x7EC0, 0x7F10, 0x7F10, 0x7F00, 0x7F20, 0x6710, 0x4210, 0x1820, 0xEC80, 0xC310, 0x9CE0, 0x86D0, 0x84E0, + 0x8490, 0x8490, 0x8480, 0x8470, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, + 0x8460, 0x8460, 0x8460, 0x8460, 0x8450, 0x8450, 0x8450, 0x8440, 0x8450, 0x8450, 0x8450, 0x8450, 0x8460, 0x8460, 0x8460, 0x8470, + 0x8470, 0x8460, 0x8470, 0x8470, 0x8480, 0x8480, 0x84B0, 0x84B0, 0x8480, 0x8490, 0x84C0, 0x8490, 0x84D0, 0x84B0, 0x84C0, 0x84B0, + 0x84C0, 0x8490, 0x84E0, 0x8510, 0x85A0, 0x8830, 0x94F0, 0xA720, 0xB640, 0xC250, 0xCBD0, 0xD1F0, 0xD500, 0xD560, 0xD470, 0xD270, + 0xD0F0, 0xD010, 0xD090, 0xD1F0, 0xD350, 0xD4D0, 0xD630, 0xD6F0, 0xD6C0, 0xD580, 0xD440, 0xD2C0, 0xD170, 0xD210, 0xD360, 0xD7A0, + 0xDD10, 0xE4B0, 0xEEE0, 0xF9C0, 0x0600, 0x12E0, 0x1FE0, 0x2D10, 0x3900, 0x43A0, 0x4D40, 0x55B0, 0x5D60, 0x6300, 0x6790, 0x6B60, + 0x6DA0, 0x6EE0, 0x6E50, 0x6C30, 0x6960, 0x6550, 0x61F0, 0x5D00, 0x5760, 0x5180, 0x4A50, 0x4330, 0x3B40, 0x30B0, 0x2600, 0x1AC0, + 0x0E50, 0x0010, 0xF090, 0xE0A0, 0xCEF0, 0xBD50, 0xA980, 0x9650, 0x88D0, 0x8540, 0x84D0, 0x84B0, 0x8490, 0x8480, 0x8470, 0x8460, + 0x8450, 0x8410, 0x8440, 0x8430, 0x8430, 0x8430, 0x8420, 0x8420, 0x8410, 0x8410, 0x8410, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, + 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, + 0x83F0, 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8410, 0x8400, 0x8400, 0x8410, 0x8410, 0x8410, 0x8400, 0x8400, + 0x8400, 0x8400, 0x8400, 0x83F0, 0x83F0, 0x83F0, 0x8400, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x8420, 0x8400, 0x8400, + 0x8400, 0x8420, 0x8420, 0x8440, 0x8480, 0x8460, 0x8470, 0x8490, 0x84B0, 0x84E0, 0x8550, 0x8820, 0x9A70, 0xAF30, 0xC340, 0xD580, + 0xE770, 0xF560, 0x00F0, 0x09D0, 0x1090, 0x15A0, 0x1770, 0x16F0, 0x14E0, 0x0E70, 0x05B0, 0xF9C0, 0xEA40, 0xD840, 0xC370, 0xADF0, + 0x9740, 0x8840, 0x8520, 0x84D0, 0x84B0, 0x84A0, 0x8480, 0x8480, 0x8470, 0x8470, 0x8460, 0x8460, 0x8450, 0x8450, 0x8450, 0x8480, + 0x8450, 0x8450, 0x8400, 0x8450, 0x8450, 0x8470, 0x8440, 0x8440, 0x8450, 0x8450, 0x8440, 0x8450, 0x8460, 0x8450, 0x8450, 0x8450, + 0x8450, 0x8450, 0x8460, 0x8460, 0x84A0, 0x8470, 0x8470, 0x8480, 0x8480, 0x8490, 0x84A0, 0x84A0, 0x84B0, 0x84C0, 0x84E0, 0x84F0, + 0x8510, 0x8530, 0x8570, 0x85B0, 0x8600, 0x8670, 0x8760, 0x8A00, 0x90F0, 0x9C80, 0xAA40, 0xB8E0, 0xC760, 0xD4F0, 0xE160, 0xEB80, + 0xF4B0, 0xFBA0, 0x0180, 0x05E0, 0x0960, 0x0B40, 0x0BA0, 0x0A20, 0x07C0, 0x0470, 0x0060, 0xFC00, 0xF780, 0xF290, 0xEE60, 0xEAB0, + 0xE6D0, 0xE360, 0xDFD0, 0xDC70, 0xD8F0, 0xD530, 0xD150, 0xCD40, 0xC890, 0xC360, 0xBE40, 0xB890, 0xB270, 0xAC80, 0xA620, 0x9FE0, + 0x9880, 0x90A0, 0x89B0, 0x8650, 0x8530, 0x84E0, 0x84F0, 0x84A0, 0x8480, 0x8470, 0x8460, 0x8450, 0x8440, 0x8430, 0x8420, 0x8420, + 0x8410, 0x8400, 0x8400, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83D0, 0x83D0, 0x83D0, 0x83C0, 0x83C0, + 0x83C0, 0x83C0, 0x83C0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83E0, 0x83D0, 0x83E0, 0x83E0, 0x83F0, 0x83E0, 0x83F0, 0x8400, + 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8400, 0x8410, 0x8410, 0x8410, 0x8420, + 0x8420, 0x8430, 0x8440, 0x8450, 0x8460, 0x8470, 0x8480, 0x84A0, 0x84D0, 0x8500, 0x8610, 0x8E90, 0xA4A0, 0xB8B0, 0xCC80, 0xDE90, + 0xF050, 0x00E0, 0x1060, 0x2030, 0x2E70, 0x3B20, 0x46A0, 0x5110, 0x5A60, 0x6220, 0x6900, 0x6F30, 0x7520, 0x79E0, 0x7D50, 0x7EF0, + 0x7F20, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F90, 0x7F20, 0x7EE0, 0x7F10, 0x7F00, + 0x7F20, 0x7EF0, 0x7ED0, 0x7F20, 0x7F00, 0x7F10, 0x7E10, 0x7CC0, 0x7B80, 0x7A50, 0x78F0, 0x7760, 0x7490, 0x71D0, 0x6D90, 0x6800, + 0x6150, 0x5930, 0x5100, 0x47C0, 0x3D30, 0x32D0, 0x2700, 0x1B10, 0x0E90, 0x00A0, 0xF3D0, 0xE5D0, 0xD7F0, 0xC940, 0xB9E0, 0xAA80, + 0x9BA0, 0x8E10, 0x8710, 0x8550, 0x84F0, 0x84D0, 0x84B0, 0x84A0, 0x8490, 0x8490, 0x8480, 0x8470, 0x8470, 0x8470, 0x8460, 0x8460, + 0x8450, 0x8450, 0x8440, 0x8440, 0x8440, 0x8430, 0x8430, 0x8420, 0x8420, 0x8420, 0x8410, 0x8410, 0x8410, 0x8400, 0x8400, 0x8400, + 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x83F0, 0x83F0, 0x8400, 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8400, 0x8430, 0x8400, 0x8400, + 0x8410, 0x8400, 0x8410, 0x8410, 0x8430, 0x8410, 0x8410, 0x8420, 0x8440, 0x8420, 0x8420, 0x8450, 0x8450, 0x8430, 0x8440, 0x8470, + 0x8450, 0x8450, 0x8470, 0x84A0, 0x8480, 0x8490, 0x84C0, 0x8500, 0x86D0, 0x9C90, 0xBBD0, 0xD790, 0xF290, 0x0B70, 0x2210, 0x36B0, + 0x49F0, 0x5A20, 0x68D0, 0x7600, 0x7E30, 0x7F10, 0x7E90, 0x7EB0, 0x7F00, 0x7EF0, 0x7F10, 0x7F00, 0x7ED0, 0x7F10, 0x7F20, 0x7F20, + 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7EF0, 0x7EB0, 0x7F20, 0x7F00, 0x7F10, 0x7F10, 0x7F20, 0x7F60, 0x7F10, 0x7F10, 0x7F20, 0x7F10, + 0x7F30, 0x7EF0, 0x7F00, 0x7EF0, 0x7F10, 0x7F60, 0x7F00, 0x7F10, 0x7F20, 0x7F00, 0x7F90, 0x7EF0, 0x7EB0, 0x7EE0, 0x7EF0, 0x7F30, + 0x7EE0, 0x7EC0, 0x7F10, 0x7F20, 0x7F40, 0x7ED0, 0x7E90, 0x7F00, 0x7EE0, 0x7F10, 0x7EE0, 0x7EA0, 0x7EF0, 0x7F10, 0x7F20, 0x7F20, + 0x7F00, 0x7F30, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7F40, 0x7EF0, 0x7F10, 0x7F30, 0x7F00, 0x7F50, 0x7F10, 0x7F20, 0x7F30, 0x7F10, + 0x7F70, 0x7EE0, 0x7EF0, 0x7F00, 0x7F40, 0x7F10, 0x7F10, 0x7F60, 0x7EF0, 0x7F20, 0x7F20, 0x7F00, 0x7F90, 0x7F10, 0x7EF0, 0x7EE0, + 0x7ED0, 0x7F70, 0x7EF0, 0x7EF0, 0x7F00, 0x7F00, 0x7F60, 0x7F10, 0x6C30, 0x55C0, 0x3CE0, 0x2070, 0x06B0, 0xECA0, 0xD1F0, 0xB5E0, + 0x97B0, 0x86A0, 0x84D0, 0x84A0, 0x8480, 0x8470, 0x8450, 0x8440, 0x8440, 0x8430, 0x8410, 0x8410, 0x8400, 0x8400, 0x83F0, 0x83F0, + 0x83E0, 0x83F0, 0x83E0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83E0, 0x83E0, 0x83F0, 0x83F0, 0x83F0, + 0x8400, 0x8400, 0x8400, 0x8400, 0x8410, 0x8410, 0x8410, 0x8410, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8410, + 0x8420, 0x8420, 0x8430, 0x8430, 0x8440, 0x8440, 0x8450, 0x8450, 0x8460, 0x8470, 0x8480, 0x8490, 0x84B0, 0x8500, 0x85D0, 0x91F0, + 0xB130, 0xD040, 0xF090, 0x1280, 0x3860, 0x5CF0, 0x7B90, 0x7F20, 0x7F40, 0x7F10, 0x7F10, 0x7EF0, 0x7F60, 0x7F10, 0x7F10, 0x7F00, + 0x7EE0, 0x7F50, 0x7F10, 0x7F20, 0x7F00, 0x7F10, 0x7F60, 0x7F00, 0x7F10, 0x7F10, 0x7EF0, 0x7F60, 0x7ED0, 0x7EB0, 0x7F00, 0x7EF0, + 0x7F70, 0x7F00, 0x7EC0, 0x7F00, 0x7F10, 0x7F20, 0x7EE0, 0x7E90, 0x7EF0, 0x7EE0, 0x7EF0, 0x7EF0, 0x7EB0, 0x7F20, 0x7F10, 0x7F10, + 0x7EA0, 0x6980, 0x5A10, 0x4D90, 0x4400, 0x3F60, 0x3D80, 0x3FD0, 0x45E0, 0x4EC0, 0x5D00, 0x6C00, 0x7C00, 0x7F10, 0x7F10, 0x7F20, + 0x7EF0, 0x7F90, 0x7F10, 0x7F10, 0x7EF0, 0x7F10, 0x7F70, 0x7F00, 0x7F10, 0x7EF0, 0x7EE0, 0x7F60, 0x7F00, 0x7EE0, 0x7EE0, 0x7ED0, + 0x7F30, 0x7F20, 0x7EC0, 0x7ED0, 0x7EB0, 0x7F50, 0x7F10, 0x7E90, 0x7EB0, 0x7EE0, 0x7F10, 0x7F10, 0x7EA0, 0x7F00, 0x7F00, 0x7F20, + 0x7F20, 0x7EC0, 0x7F00, 0x7F00, 0x7EF0, 0x7EF0, 0x7F00, 0x7F00, 0x7F10, 0x7F10, 0x7F20, 0x7F00, 0x7F50, 0x7F10, 0x7F20, 0x7EF0, + 0x7F10, 0x7F60, 0x7EF0, 0x7F10, 0x7F10, 0x7F20, 0x7F60, 0x7EF0, 0x7EF0, 0x7F00, 0x7F10, 0x7F50, 0x7EE0, 0x7EE0, 0x7EF0, 0x7F10, + 0x7F60, 0x7F00, 0x7ED0, 0x7F00, 0x7F00, 0x7F50, 0x7ED0, 0x7EA0, 0x7EE0, 0x7EF0, 0x7F10, 0x7EE0, 0x7E90, 0x7F10, 0x7F20, 0x7F20, + 0x7F10, 0x7EB0, 0x7F10, 0x7EE0, 0x7F10, 0x7F10, 0x7EC0, 0x7F10, 0x7EF0, 0x7F20, 0x7F20, 0x7F10, 0x7F80, 0x7F00, 0x7F10, 0x7F10, + 0x7F00, 0x7F60, 0x7EF0, 0x7F10, 0x7F10, 0x7F00, 0x7F80, 0x7F00, 0x7F20, 0x7F00, 0x7EF0, 0x7F30, 0x7EF0, 0x7EC0, 0x7ED0, 0x7EE0, + 0x7F60, 0x7EF0, 0x7EB0, 0x7EE0, 0x7EE0, 0x7F10, 0x7F10, 0x7E70, 0x7ED0, 0x7EE0, 0x7EF0, 0x7F10, 0x7F00, 0x7F00, 0x7F10, 0x7F20, + 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7EF0, 0x7EF0, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F10, 0x7F20, + 0x7F10, 0x7F20, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, + 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F00, + 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7EF0, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F20, 0x7F20, 0x7F20, + 0x7F10, 0x7F10, 0x7F10, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F10, 0x7F50, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F30, + 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F10, + 0x7F20, 0x7F10, 0x7F20, 0x7F20, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F30, + 0x7F20, 0x7F40, 0x7F30, 0x7F20, 0x7F40, 0x72D0, 0x4900, 0x1BA0, 0xEB90, 0xBA70, 0x8D10, 0x84E0, 0x84A0, 0x8480, 0x8470, 0x8460, + 0x8450, 0x8440, 0x8440, 0x8430, 0x8430, 0x8420, 0x8420, 0x8420, 0x8420, 0x8410, 0x8410, 0x83B0, 0x8410, 0x8410, 0x8410, 0x8400, + 0x8400, 0x8400, 0x8400, 0x8400, 0x83F0, 0x8400, 0x8400, 0x8420, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83E0, 0x83E0, 0x83F0, 0x83E0, + 0x83E0, 0x83E0, 0x83E0, 0x8400, 0x83E0, 0x83F0, 0x83F0, 0x83E0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x8410, 0x8400, 0x8400, + 0x8400, 0x8400, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, + 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83E0, 0x83E0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, + 0x83C0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83A0, 0x8390, 0x8390, 0x8380, 0x8370, 0x8370, 0x8360, 0x8350, 0x8370, 0x8350, 0x8350, + 0x8350, 0x8380, 0x8350, 0x8360, 0x8310, 0x8370, 0x8370, 0x8370, 0x8380, 0x8380, 0x8380, 0x83C0, 0x8390, 0x8390, 0x8390, 0x8390, + 0x8390, 0x8390, 0x8390, 0x8390, 0x8390, 0x83A0, 0x83A0, 0x83A0, 0x83B0, 0x83C0, 0x83C0, 0x83D0, 0x83F0, 0x8400, 0x8410, 0x8430, + 0x8450, 0x8470, 0x84B0, 0x86E0, 0xBE00, 0xF710, 0x2C80, 0x5C80, 0x7E60, 0x7EE0, 0x7E90, 0x7F10, 0x7F10, 0x7F30, 0x7EB0, 0x7E70, + 0x7EF0, 0x7EF0, 0x7F20, 0x7F20, 0x7EC0, 0x7F10, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7F20, 0x7EE0, 0x7EF0, 0x7F30, 0x7EC0, 0x7F40, + 0x7F10, 0x7F20, 0x7F40, 0x7F10, 0x7F70, 0x7EF0, 0x7F00, 0x7F10, 0x7EF0, 0x7F60, 0x7EF0, 0x7F10, 0x7F00, 0x7F00, 0x7F80, 0x7F10, + 0x7F00, 0x7EF0, 0x7EF0, 0x7F30, 0x7F00, 0x7EC0, 0x7ED0, 0x7EE0, 0x7F20, 0x7F10, 0x7EB0, 0x7EE0, 0x7ED0, 0x7F10, 0x7F10, 0x7E70, + 0x7ED0, 0x7F10, 0x7F00, 0x7EF0, 0x7E90, 0x7F00, 0x7F00, 0x7F10, 0x7F10, 0x7EB0, 0x7F20, 0x7F10, 0x7F10, 0x7EF0, 0x7EC0, 0x7F40, + 0x7F20, 0x7F20, 0x7F00, 0x7F10, 0x7F40, 0x7F20, 0x7F10, 0x7F10, 0x7EF0, 0x7F40, 0x7EF0, 0x7F10, 0x7F10, 0x7EF0, 0x7F50, 0x7F00, + 0x7F00, 0x7F10, 0x7F10, 0x7F60, 0x7EE0, 0x7EC0, 0x7EF0, 0x7EE0, 0x7F50, 0x7EF0, 0x7EB0, 0x7F20, 0x7F10, 0x7F10, 0x7EB0, 0x7EC0, + 0x7F10, 0x7F00, 0x7F20, 0x7EF0, 0x7EB0, 0x7F20, 0x6890, 0x5130, 0x3720, 0x1AD0, 0xFF50, 0xE350, 0xC900, 0xB080, 0x9A90, 0x8B20, + 0x8610, 0x8520, 0x84E0, 0x84C0, 0x84B0, 0x8490, 0x8480, 0x8470, 0x8470, 0x8480, 0x8450, 0x8440, 0x8420, 0x8430, 0x8420, 0x8410, + 0x8410, 0x8400, 0x8400, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83E0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, + 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83E0, 0x83F0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, + 0x83D0, 0x83E0, 0x83E0, 0x83D0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83F0, 0x83F0, 0x8410, 0x83F0, 0x83F0, 0x83F0, 0x83F0, + 0x83F0, 0x8400, 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x83E0, 0x8400, 0x8400, 0x8400, 0x83F0, 0x8400, 0x8400, + 0x8400, 0x8400, 0x8410, 0x8410, 0x8410, 0x8420, 0x8430, 0x8430, 0x8430, 0x8440, 0x8440, 0x8440, 0x8450, 0x8450, 0x8450, 0x8450, + 0x8450, 0x8450, 0x8440, 0x8450, 0x8440, 0x8440, 0x8490, 0x8440, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, + 0x8420, 0x8420, 0x8420, 0x8420, 0x8460, 0x8430, 0x8430, 0x8430, 0x8440, 0x8440, 0x8440, 0x8450, 0x8460, 0x8460, 0x8470, 0x8480, + 0x8490, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x8490, 0x8490, 0x8490, 0x8480, 0x8480, 0x8480, 0x8480, 0x8490, 0x8E20, 0xBB50, 0xE9E0, + 0x17E0, 0x4640, 0x6E50, 0x7F20, 0x7EE0, 0x7E90, 0x7F10, 0x7EF0, 0x7F30, 0x7F00, 0x7EC0, 0x7F10, 0x7F00, 0x7EF0, 0x7F00, 0x7EC0, + 0x7F20, 0x7F00, 0x7F10, 0x7F10, 0x7F10, 0x7F60, 0x7EF0, 0x7F10, 0x7F20, 0x7EF0, 0x7F80, 0x7F00, 0x7F20, 0x7F10, 0x7EF0, 0x7F70, + 0x7F20, 0x7EF0, 0x7EF0, 0x7EE0, 0x7F70, 0x7F10, 0x7F00, 0x7F00, 0x7EF0, 0x7F30, 0x7F00, 0x7ED0, 0x7ED0, 0x7EB0, 0x7EF0, 0x7EF0, + 0x7E90, 0x7ED0, 0x7F00, 0x7F10, 0x7F20, 0x7EA0, 0x7ED0, 0x7F10, 0x7F00, 0x7F00, 0x7EC0, 0x7F10, 0x7F20, 0x7EF0, 0x7F10, 0x7F00, + 0x7F20, 0x7850, 0x6A10, 0x5F30, 0x55E0, 0x4F10, 0x4A30, 0x4800, 0x49C0, 0x4D70, 0x53E0, 0x5D60, 0x68E0, 0x7690, 0x7EF0, 0x7F70, + 0x7F10, 0x7F10, 0x7EF0, 0x7EF0, 0x7F80, 0x7F00, 0x7EE0, 0x7F00, 0x7F10, 0x7F70, 0x7EF0, 0x7ED0, 0x7EF0, 0x7EF0, 0x7F30, 0x7ED0, + 0x7EB0, 0x7EF0, 0x7EF0, 0x7F30, 0x7F00, 0x7EC0, 0x7F10, 0x7F10, 0x7F00, 0x7F00, 0x7E90, 0x7F00, 0x7EF0, 0x7EF0, 0x7F20, 0x7F00, + 0x7F40, 0x7F10, 0x7F10, 0x7F40, 0x7F00, 0x7F30, 0x7EF0, 0x7F00, 0x7EF0, 0x7F10, 0x7F20, 0x7F10, 0x7F20, 0x7EE0, 0x7EF0, 0x7F10, + 0x7F20, 0x7F20, 0x7F20, 0x7F10, 0x7F20, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F00, 0x7F10, 0x7F10, 0x7F20, + 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F20, 0x7F20, + 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F30, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, + 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F00, 0x7F10, 0x7F10, 0x7F10, 0x7F20, 0x7EF0, 0x7EF0, + 0x7F20, 0x7F20, 0x7F10, 0x7EF0, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F20, 0x7F20, 0x7F40, 0x7F10, 0x7F30, + 0x7F20, 0x7F20, 0x7F40, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F20, 0x7F20, + 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F20, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F10, + 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, + 0x7F30, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F40, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F20, 0x7F20, 0x7F20, 0x7F10, 0x7F20, + 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F30, 0x7F10, 0x7F30, 0x7F10, 0x7F20, + 0x7F40, 0x7F30, 0x7F30, 0x7EE0, 0x7F20, 0x7F30, 0x7F20, 0x7F20, 0x7EF0, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F70, 0x7F20, 0x7EF0, + 0x7F30, 0x7F30, 0x7F30, 0x7EF0, 0x7E90, 0x7F10, 0x7F20, 0x7EF0, 0x7EF0, 0x7E80, 0x7D80, 0x4F00, 0x2090, 0xF470, 0xCC20, 0xAB70, + 0x9120, 0x8730, 0x8550, 0x84F0, 0x84D0, 0x8470, 0x84A0, 0x8480, 0x8480, 0x8470, 0x8470, 0x8460, 0x8410, 0x8460, 0x8460, 0x8460, + 0x8460, 0x8460, 0x8460, 0x8450, 0x8450, 0x8450, 0x8450, 0x8440, 0x8440, 0x8440, 0x8440, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, + 0x8420, 0x8430, 0x8420, 0x8420, 0x8420, 0x8440, 0x8420, 0x8410, 0x8420, 0x8420, 0x8420, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, + 0x8420, 0x8410, 0x8410, 0x8410, 0x83E0, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8400, 0x8410, 0x8430, + 0x8410, 0x8410, 0x83C0, 0x8410, 0x8410, 0x8410, 0x83F0, 0x8420, 0x8420, 0x8420, 0x8450, 0x8420, 0x8420, 0x8410, 0x8430, 0x8420, + 0x8430, 0x8430, 0x8430, 0x8430, 0x8450, 0x8430, 0x8420, 0x8430, 0x8430, 0x8430, 0x8430, 0x8450, 0x8440, 0x8430, 0x8430, 0x8460, + 0x8440, 0x8440, 0x8450, 0x8450, 0x8450, 0x8460, 0x8490, 0x8480, 0x8470, 0x8480, 0x84A0, 0x8490, 0x8490, 0x8490, 0x84D0, 0x84A0, + 0x84B0, 0x84C0, 0x84C0, 0x84B0, 0x84C0, 0x84D0, 0x84E0, 0x84E0, 0x84E0, 0x84D0, 0x84B0, 0x84A0, 0x8480, 0x8470, 0x8470, 0x8470, + 0x8450, 0x8440, 0x8430, 0x8440, 0x8410, 0x8400, 0x8400, 0x8400, 0x83F0, 0x83F0, 0x8410, 0x83F0, 0x83E0, 0x83E0, 0x8400, 0x83E0, + 0x83E0, 0x83E0, 0x83F0, 0x83D0, 0x83D0, 0x8370, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83B0, 0x83B0, 0x8380, 0x83B0, 0x83B0, 0x83B0, + 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83A0, 0x83B0, 0x83A0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, + 0x83A0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x8360, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, + 0x83B0, 0x83B0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83E0, 0x83E0, 0x83F0, 0x83F0, 0x83F0, + 0x83F0, 0x8410, 0x8400, 0x8400, 0x83B0, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, + 0x8400, 0x8400, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x8390, 0x83F0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83D0, + 0x83E0, 0x83E0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, + 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83B0, 0x83C0, 0x83B0, 0x83C0, 0x83C0, 0x83C0, 0x83D0, 0x83D0, 0x83D0, 0x83E0, 0x83E0, 0x83E0, + 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8410, 0x8410, 0x8420, 0x8420, 0x8430, 0x8430, 0x8440, 0x8450, 0x8460, 0x8470, + 0x8480, 0x8490, 0x84A0, 0x84B0, 0x84D0, 0x84E0, 0x8520, 0x85A0, 0x8730, 0x8D90, 0x9B30, 0xA9A0, 0xB860, 0xC790, 0xD820, 0xE800, + 0xF880, 0x0A10, 0x1D60, 0x33C0, 0x4D00, 0x6850, 0x7E60, 0x7F10, 0x7F10, 0x7F00, 0x7F40, 0x7EF0, 0x7F20, 0x7F20, 0x7F00, 0x7F90, + 0x7F00, 0x7F20, 0x7EF0, 0x7EF0, 0x7F70, 0x7EE0, 0x7EF0, 0x7F10, 0x7F00, 0x7F80, 0x7F10, 0x7F20, 0x7F00, 0x7EF0, 0x7F50, 0x7F00, + 0x7EA0, 0x7ED0, 0x7EE0, 0x7F40, 0x7EF0, 0x7EB0, 0x7EE0, 0x7EE0, 0x7F10, 0x7F10, 0x7E90, 0x7ED0, 0x7ED0, 0x7F00, 0x7EE0, 0x7E90, + 0x7F00, 0x7F00, 0x7F00, 0x7F10, 0x7EA0, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7EE0, 0x7F40, 0x7F30, 0x7F20, 0x7EF0, 0x7F00, 0x7F40, + 0x7F40, 0x7F10, 0x7F10, 0x7EF0, 0x7F40, 0x7EF0, 0x7F20, 0x7EE0, 0x7EF0, 0x7F50, 0x7F00, 0x7F00, 0x7F10, 0x7F10, 0x7F60, 0x7EF0, + 0x7EF0, 0x7830, 0x5070, 0x2950, 0x01D0, 0xDAE0, 0xB4C0, 0x8FE0, 0x8510, 0x84D0, 0x8490, 0x8470, 0x8460, 0x8480, 0x8450, 0x8450, + 0x8440, 0x8470, 0x8440, 0x8450, 0x8420, 0x8450, 0x8450, 0x8450, 0x8420, 0x8450, 0x8450, 0x8460, 0x8450, 0x8440, 0x8440, 0x8440, + 0x8440, 0x8430, 0x8430, 0x8440, 0x8440, 0x8480, 0x8460, 0x8480, 0x84B0, 0x8530, 0x91F0, 0xB790, 0xD450, 0xE980, 0xFC20, 0x0F10, + 0x23F0, 0x3D30, 0x5720, 0x6FE0, 0x7ED0, 0x7F20, 0x7EF0, 0x7F10, 0x7F60, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7F60, 0x7EF0, 0x7F00, + 0x7EE0, 0x7EF0, 0x7F80, 0x7F00, 0x7EC0, 0x7F00, 0x7F10, 0x7F60, 0x7EF0, 0x7EB0, 0x7F00, 0x7EE0, 0x7EF0, 0x7F20, 0x7F00, 0x7F10, + 0x7F10, 0x7EE0, 0x7EF0, 0x7F10, 0x7F20, 0x7F20, 0x7F40, 0x7F10, 0x7F20, 0x7F20, 0x7F20, 0x7F40, 0x7F10, 0x7F00, 0x7F20, 0x7F10, + 0x7F30, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F30, 0x7F40, 0x7F30, 0x7F30, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, + 0x7F20, 0x7F40, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F40, + 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F20, 0x7F20, 0x7F30, + 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F20, 0x7F10, 0x7F20, 0x7F20, 0x7F20, 0x7F30, + 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7EF0, 0x7F20, 0x7F10, 0x7F30, 0x7F30, 0x7F00, 0x7F20, 0x7F30, 0x7F30, + 0x7F20, 0x7EF0, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F20, + 0x7F40, 0x7F10, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F20, 0x7F20, 0x7F10, + 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F10, 0x7F30, + 0x7F20, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F30, + 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F20, + 0x7F40, 0x7F00, 0x7F20, 0x7F40, 0x7F10, 0x7F10, 0x7EE0, 0x7F20, 0x7EF0, 0x7ED0, 0x7F00, 0x7EC0, 0x7EC0, 0x7EE0, 0x7F20, 0x7EC0, + 0x7F10, 0x7F30, 0x7EC0, 0x7EF0, 0x7F10, 0x7EE0, 0x7F40, 0x7ED0, 0x7F00, 0x7F20, 0x7F00, 0x7F50, 0x7F10, 0x7EE0, 0x7F10, 0x7EF0, + 0x7F30, 0x7EE0, 0x7E90, 0x7F30, 0x7F00, 0x7F20, 0x7EE0, 0x7EA0, 0x7F00, 0x7ED0, 0x7F10, 0x7F00, 0x7EA0, 0x7F10, 0x7F10, 0x7EF0, + 0x7EF0, 0x7EB0, 0x7F30, 0x7F00, 0x7F10, 0x7F30, 0x7EE0, 0x7F20, 0x7F10, 0x7F00, 0x7F20, 0x7EF0, 0x7F80, 0x7F00, 0x7F40, 0x7EF0, + 0x7EF0, 0x7F60, 0x7F10, 0x7F10, 0x7EF0, 0x7EE0, 0x7F60, 0x7F10, 0x7EF0, 0x7F00, 0x7EF0, 0x7F60, 0x7F20, 0x7ED0, 0x7ED0, 0x7EB0, + 0x7EF0, 0x7EF0, 0x7E90, 0x7EE0, 0x7EC0, 0x7F30, 0x7F20, 0x7EA0, 0x7ED0, 0x7F10, 0x7F10, 0x7F00, 0x7E90, 0x7EB0, 0x7F00, 0x7EF0, + 0x7F10, 0x7F00, 0x7F20, 0x7F40, 0x7F10, 0x7F20, 0x7F00, 0x7F10, 0x7F10, 0x7F20, 0x7EF0, 0x7EF0, 0x7F70, 0x7960, 0x6450, 0x4DE0, + 0x3320, 0x15F0, 0xF6D0, 0xD580, 0xB410, 0x9110, 0x8530, 0x84B0, 0x8480, 0x8460, 0x8460, 0x8450, 0x8440, 0x8410, 0x8420, 0x8420, + 0x8410, 0x8410, 0x8410, 0x8400, 0x8400, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, + 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83D0, 0x83D0, 0x83D0, 0x83E0, 0x83C0, 0x83C0, 0x83B0, 0x83C0, 0x83B0, 0x83B0, + 0x83A0, 0x83A0, 0x83A0, 0x83A0, 0x83A0, 0x8390, 0x8390, 0x83C0, 0x8390, 0x83A0, 0x8390, 0x8390, 0x8390, 0x8390, 0x8390, 0x8390, + 0x83B0, 0x8390, 0x8390, 0x8390, 0x8390, 0x8390, 0x8390, 0x8390, 0x83A0, 0x83A0, 0x83A0, 0x83A0, 0x83A0, 0x83A0, 0x83A0, 0x83A0, + 0x83A0, 0x83A0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83C0, 0x83C0, 0x83D0, 0x83C0, 0x83D0, 0x83D0, 0x83D0, 0x83E0, + 0x83E0, 0x83E0, 0x83E0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8400, 0x8420, 0x8400, 0x8400, 0x8410, + 0x8400, 0x8400, 0x83F0, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8410, + 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8420, 0x8420, 0x8420, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, + 0x8430, 0x8430, 0x8420, 0x8420, 0x8420, 0x8410, 0x8410, 0x8410, 0x8410, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, + 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8410, 0x8410, 0x8400, 0x8410, 0x8410, 0x8410, 0x8410, 0x8420, + 0x8420, 0x8410, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8440, 0x8420, 0x8420, 0x8420, 0x8470, 0x8420, 0x8420, 0x8410, + 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8430, 0x8410, 0x8410, 0x8410, 0x8410, 0x8400, + 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8440, 0x8410, 0x8410, 0x8440, 0x8410, 0x8430, 0x8420, 0x8420, + 0x8430, 0x8430, 0x8440, 0x8440, 0x8450, 0x8460, 0x8470, 0x8490, 0x84C0, 0x8540, 0x9210, 0xBC50, 0xE680, 0x0B60, 0x2F80, 0x51B0, + 0x7030, 0x7E70, 0x7EC0, 0x7F10, 0x7F10, 0x7EF0, 0x7F10, 0x7EB0, 0x7F20, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7F40, 0x7F10, 0x7F00, + 0x7F20, 0x7EF0, 0x7F60, 0x7F00, 0x7F40, 0x7F10, 0x7EF0, 0x7F80, 0x7F10, 0x7F10, 0x7EF0, 0x7EE0, 0x7F70, 0x7F10, 0x7F00, 0x7F00, + 0x7F00, 0x7F60, 0x7F00, 0x7ED0, 0x7EB0, 0x7EB0, 0x7EF0, 0x7EF0, 0x7EB0, 0x7EE0, 0x7ED0, 0x7F30, 0x7F20, 0x7EA0, 0x7ED0, 0x7EF0, + 0x7F00, 0x7EE0, 0x7E90, 0x7EB0, 0x7EE0, 0x7EF0, 0x7F10, 0x7F00, 0x7F00, 0x7F10, 0x7F10, 0x7F20, 0x7EC0, 0x7F10, 0x7F00, 0x7F00, + 0x7EF0, 0x7F10, 0x7F60, 0x7F40, 0x7F10, 0x7F20, 0x7F00, 0x7F50, 0x7EF0, 0x7F10, 0x7EE0, 0x7EF0, 0x7F80, 0x7EE0, 0x7EF0, 0x7F10, + 0x7F10, 0x7F70, 0x7EF0, 0x7ED0, 0x7EF0, 0x7EE0, 0x7F70, 0x7EE0, 0x7EC0, 0x7EF0, 0x7F10, 0x7F30, 0x7EE0, 0x7EC0, 0x7F10, 0x7F00, + 0x7F40, 0x7ED0, 0x7EA0, 0x7EE0, 0x7EF0, 0x7EF0, 0x7F20, 0x7F00, 0x7F10, 0x7F10, 0x7F20, 0x7F40, 0x7F00, 0x7F30, 0x7EF0, 0x7F00, + 0x7F40, 0x7F00, 0x7F40, 0x7EF0, 0x7F20, 0x7F20, 0x7F00, 0x7F90, 0x7F10, 0x7F00, 0x7F10, 0x7F10, 0x7F70, 0x7EF0, 0x7EF0, 0x7F10, + 0x7F00, 0x7F20, 0x7F10, 0x7EE0, 0x7EF0, 0x7EF0, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F10, 0x7F20, + 0x7F10, 0x7F10, 0x7F20, 0x7F00, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F40, + 0x7F40, 0x7F30, 0x7F30, 0x7F40, 0x7F40, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F50, 0x7F40, + 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7890, 0x6BB0, 0x5DE0, 0x4F80, 0x3FF0, 0x2FD0, 0x1F70, 0x0DE0, + 0xFB10, 0xE5F0, 0xD170, 0xBCD0, 0xA760, 0x9290, 0x8740, 0x8510, 0x84D0, 0x84D0, 0x8490, 0x8480, 0x8470, 0x8460, 0x8460, 0x8450, + 0x8450, 0x8440, 0x8430, 0x8430, 0x8420, 0x8420, 0x8410, 0x8410, 0x8410, 0x8400, 0x8400, 0x8400, 0x8400, 0x83F0, 0x83F0, 0x83F0, + 0x83F0, 0x83E0, 0x83F0, 0x83E0, 0x83D0, 0x8380, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83B0, 0x83E0, 0x83B0, 0x83B0, 0x83B0, 0x83C0, + 0x83C0, 0x83C0, 0x8400, 0x83D0, 0x83E0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8400, 0x8400, 0x8410, 0x8410, 0x8410, + 0x8410, 0x8410, 0x8410, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, + 0x8430, 0x8430, 0x8430, 0x8440, 0x8450, 0x8440, 0x8450, 0x8450, 0x8450, 0x8460, 0x8460, 0x8470, 0x8470, 0x8480, 0x8490, 0x84A0, + 0x84C0, 0x84E0, 0x8540, 0x86E0, 0x9320, 0xA5E0, 0xB910, 0xCC50, 0xDF50, 0xF2E0, 0x0680, 0x19F0, 0x2DB0, 0x4340, 0x5710, 0x6990, + 0x79D0, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7ED0, 0x7EF0, 0x7F00, 0x7EF0, 0x7EF0, 0x7E90, 0x7F00, 0x7F00, 0x7F00, 0x7F00, + 0x7E80, 0x7ED0, 0x7EF0, 0x7F10, 0x7EF0, 0x7E80, 0x7F00, 0x7F20, 0x7EF0, 0x7F10, 0x7F00, 0x7F40, 0x7F00, 0x7F10, 0x7F10, 0x7EE0, + 0x7EF0, 0x7F00, 0x7F00, 0x7EF0, 0x7EF0, 0x7F30, 0x7F00, 0x7F40, 0x7F10, 0x7EB0, 0x4110, 0x16D0, 0xFCB0, 0xF4A0, 0xFBE0, 0x0CF0, + 0x23F0, 0x3B80, 0x51C0, 0x64B0, 0x72A0, 0x7CA0, 0x7ED0, 0x7F10, 0x7EF0, 0x7F30, 0x7ED0, 0x7EB0, 0x7EE0, 0x7EF0, 0x7F30, 0x7C00, + 0x7960, 0x7C50, 0x7EF0, 0x7F20, 0x7F00, 0x7EB0, 0x7F00, 0x7EF0, 0x7EF0, 0x7F10, 0x7F00, 0x7F40, 0x7F10, 0x7F10, 0x7F40, 0x7F00, + 0x7F30, 0x7EF0, 0x7F00, 0x7EF0, 0x7F10, 0x7F80, 0x7F00, 0x7F20, 0x7F20, 0x7F20, 0x7F90, 0x7EF0, 0x7F10, 0x7EE0, 0x7EF0, 0x7F70, + 0x7F20, 0x7EF0, 0x7EF0, 0x7F00, 0x7F60, 0x7F10, 0x7EB0, 0x7EB0, 0x7EE0, 0x7F50, 0x7F00, 0x7EA0, 0x7ED0, 0x7ED0, 0x7F30, 0x7F20, + 0x7EC0, 0x7ED0, 0x7EE0, 0x7F10, 0x7F10, 0x7EA0, 0x7EE0, 0x7EF0, 0x7F10, 0x7F20, 0x7F00, 0x7F00, 0x7F20, 0x7F20, 0x7F10, 0x6390, + 0x36E0, 0x04E0, 0xCE10, 0x9550, 0x84E0, 0x8480, 0x8480, 0x8450, 0x8430, 0x8430, 0x8420, 0x8410, 0x8410, 0x8400, 0x8400, 0x83F0, + 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x8410, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, + 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, + 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, + 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8430, 0x8430, 0x8420, 0x8420, 0x8430, 0x8430, 0x8430, 0x8430, + 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8420, 0x8420, 0x8420, 0x8410, 0x8410, 0x8400, 0x8400, 0x83F0, 0x83F0, + 0x83E0, 0x83E0, 0x83D0, 0x83D0, 0x83C0, 0x83C0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83A0, 0x83A0, 0x83A0, 0x83A0, + 0x83A0, 0x83A0, 0x83A0, 0x83A0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83C0, 0x83B0, 0x83B0, 0x83C0, 0x83C0, + 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83E0, 0x83E0, 0x83E0, 0x83F0, 0x83F0, + 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8400, 0x8410, 0x8400, 0x8410, 0x8410, 0x8410, 0x8420, 0x8420, 0x8420, 0x8420, 0x8430, 0x8430, + 0x8430, 0x8440, 0x8440, 0x8450, 0x8450, 0x8460, 0x8460, 0x8470, 0x8470, 0x8470, 0x8480, 0x8480, 0x8490, 0x8490, 0x84B0, 0x84C0, + 0x84F0, 0x8540, 0x8670, 0x8D80, 0x9BC0, 0xA8A0, 0xB380, 0xBB50, 0xC0E0, 0xC420, 0xC570, 0xC520, 0xC2E0, 0xC030, 0xBB90, 0xB660, + 0xB0D0, 0xAAB0, 0xA410, 0x9D20, 0x9530, 0x8E50, 0x89D0, 0x87C0, 0x86D0, 0x8690, 0x86D0, 0x87D0, 0x8B00, 0x93B0, 0xA100, 0xAFA0, + 0xBEE0, 0xCE30, 0xDD00, 0xEAE0, 0xF830, 0x0500, 0x1260, 0x2210, 0x3120, 0x42C0, 0x5500, 0x6710, 0x77F0, 0x7F20, 0x7EF0, 0x7EF0, + 0x7F60, 0x7EF0, 0x7F10, 0x7F10, 0x7F20, 0x7F60, 0x7EF0, 0x7EF0, 0x7F00, 0x7F10, 0x7F70, 0x7EE0, 0x7EE0, 0x7ED0, 0x7F10, 0x7F60, + 0x7EE0, 0x7E90, 0x7F20, 0x7F20, 0x6D70, 0x4A30, 0x2330, 0xFB70, 0xD4A0, 0xB0F0, 0x9280, 0x8670, 0x8500, 0x84D0, 0x84C0, 0x84E0, + 0x84B0, 0x84B0, 0x84B0, 0x84D0, 0x84F0, 0x8540, 0x86B0, 0x8F50, 0xA3C0, 0xBA40, 0xD1F0, 0xEBF0, 0x07B0, 0x2650, 0x4370, 0x5EE0, + 0x7660, 0x7EF0, 0x7F30, 0x7F20, 0x7F00, 0x7F80, 0x7F20, 0x7F20, 0x7F10, 0x7EF0, 0x7F60, 0x7EE0, 0x7ED0, 0x7EF0, 0x7EE0, 0x7F50, + 0x7F10, 0x7EC0, 0x7EE0, 0x7ED0, 0x7F10, 0x7F00, 0x7E70, 0x7EC0, 0x7EB0, 0x7EF0, 0x7EF0, 0x7E90, 0x7EE0, 0x7F20, 0x7F10, 0x7F10, + 0x7EA0, 0x7EF0, 0x7F10, 0x7F00, 0x7EE0, 0x7EC0, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F00, 0x7F40, 0x7F40, 0x7F10, 0x7EF0, 0x7EE0, + 0x7F50, 0x7EF0, 0x7F20, 0x7EF0, 0x7EF0, 0x7F60, 0x7F00, 0x7F10, 0x7F10, 0x7EF0, 0x7F60, 0x7EE0, 0x7F00, 0x7EE0, 0x7EF0, 0x7F70, + 0x7EF0, 0x7EB0, 0x7F00, 0x7F10, 0x7F10, 0x7EE0, 0x7E90, 0x7EF0, 0x7EF0, 0x7EF0, 0x7ED0, 0x7EB0, 0x7F00, 0x7F00, 0x7F30, 0x7F00, + 0x7EC0, 0x7F10, 0x7EF0, 0x7F00, 0x7EF0, 0x7F00, 0x7F00, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7F00, 0x7F10, 0x7F30, 0x7F00, 0x7F10, + 0x7F10, 0x7F20, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F10, 0x7F10, 0x7F10, 0x7F10, 0x7F20, 0x7F10, 0x7F30, 0x7F30, 0x7F20, 0x7F40, + 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F10, 0x53F0, 0x2AD0, 0x01E0, 0xD960, 0xB0B0, 0x8C80, 0x8510, + 0x84B0, 0x8480, 0x8470, 0x8460, 0x8450, 0x8440, 0x8440, 0x8430, 0x8430, 0x8430, 0x8410, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, + 0x8440, 0x8420, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8440, 0x8440, 0x8450, 0x8450, 0x8450, 0x8440, 0x8440, 0x8440, 0x8430, + 0x8430, 0x8420, 0x8430, 0x8430, 0x8430, 0x8430, 0x8440, 0x8440, 0x8450, 0x8450, 0x8460, 0x8470, 0x8470, 0x8490, 0x84A0, 0x84D0, + 0x8500, 0x8550, 0x8560, 0x84E0, 0x84C0, 0x8490, 0x8480, 0x8480, 0x8490, 0x84B0, 0x94D0, 0xB0B0, 0xCD30, 0xEA60, 0x05E0, 0x1BF0, + 0x28B0, 0x26C0, 0x1340, 0xED10, 0xB420, 0x8570, 0x8480, 0x8450, 0x8430, 0x8410, 0x8400, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, + 0x8400, 0x8400, 0x8400, 0x8400, 0x83F0, 0x83F0, 0x8430, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83E0, 0x83F0, 0x83E0, 0x83E0, 0x83E0, + 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83D0, + 0x83D0, 0x83D0, 0x83E0, 0x83E0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83E0, 0x83E0, 0x83E0, 0x83D0, + 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83E0, 0x83D0, 0x83E0, 0x8390, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, + 0x83E0, 0x83E0, 0x83E0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, + 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8440, 0x8410, 0x8410, 0x8410, 0x8410, 0x8430, 0x8420, 0x8440, + 0x8420, 0x8430, 0x8430, 0x8430, 0x8450, 0x8400, 0x8460, 0x8480, 0x84B0, 0x84D0, 0x85B0, 0x9400, 0xB1E0, 0xCC00, 0xE330, 0xF8A0, + 0x0980, 0x17F0, 0x22A0, 0x2A40, 0x2DF0, 0x2D50, 0x2A20, 0x23E0, 0x1A10, 0x0EE0, 0x0160, 0xF290, 0xE2B0, 0xD230, 0xC180, 0xB1D0, + 0xA330, 0x9680, 0x8DD0, 0x8940, 0x8730, 0x8640, 0x85E0, 0x85B0, 0x85B0, 0x85C0, 0x8610, 0x86C0, 0x8820, 0x8B30, 0x9080, 0x9750, + 0x9E40, 0xA650, 0xAE90, 0xB740, 0xBE40, 0xC370, 0xC540, 0xC480, 0xC140, 0xBD40, 0xBA40, 0xB9E0, 0xBDD0, 0xC7D0, 0xD750, 0xEC50, + 0x0720, 0x2840, 0x4CC0, 0x7180, 0x7F10, 0x7EF0, 0x7F10, 0x7F00, 0x7F60, 0x7F00, 0x7F10, 0x7F10, 0x7EF0, 0x7F60, 0x7EF0, 0x7F20, + 0x7EF0, 0x7ED0, 0x7F80, 0x7F00, 0x7F00, 0x7ED0, 0x7EF0, 0x7F70, 0x7F10, 0x7EF0, 0x7EE0, 0x7EE0, 0x7EF0, 0x7F10, 0x7EB0, 0x7EC0, + 0x7EE0, 0x7F30, 0x7F00, 0x7E90, 0x7EB0, 0x7EE0, 0x7EE0, 0x7EF0, 0x7EA0, 0x7EC0, 0x7EF0, 0x7F10, 0x7F20, 0x7EC0, 0x7F10, 0x7F10, + 0x7F00, 0x7EE0, 0x7EB0, 0x7F00, 0x7F00, 0x7EF0, 0x7F10, 0x7F00, 0x7F60, 0x7F10, 0x7F10, 0x7F00, 0x7F10, 0x7F30, 0x7EF0, 0x7F00, + 0x7EF0, 0x7F10, 0x7F60, 0x7F00, 0x7F20, 0x7F20, 0x7F00, 0x7F80, 0x7EF0, 0x7EE0, 0x7EE0, 0x7EF0, 0x7F50, 0x7EE0, 0x7ED0, 0x7F10, + 0x7F20, 0x7F50, 0x7ED0, 0x7E90, 0x7F00, 0x7EE0, 0x7F30, 0x7EE0, 0x7EA0, 0x7EF0, 0x7F10, 0x7F20, 0x7F20, 0x7EC0, 0x7F10, 0x7E90, + 0x7D90, 0x7B00, 0x7960, 0x7A80, 0x7C30, 0x7EE0, 0x7EF0, 0x7F10, 0x7F20, 0x7F00, 0x7F40, 0x7F10, 0x7F10, 0x7F10, 0x7F00, 0x7F30, + 0x7EE0, 0x7EF0, 0x7F30, 0x7F10, 0x7F80, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F90, 0x7F00, 0x7F00, 0x7EF0, 0x7EF0, 0x7F70, 0x7EF0, + 0x7F10, 0x7F00, 0x7F00, 0x7F70, 0x7F10, 0x7EB0, 0x7EC0, 0x7ED0, 0x7F30, 0x7EE0, 0x7EA0, 0x7ED0, 0x7EE0, 0x7F20, 0x7F10, 0x7E90, + 0x7EF0, 0x7EE0, 0x7F10, 0x7F10, 0x7E70, 0x7EE0, 0x7F10, 0x7F20, 0x7F20, 0x7F00, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F00, 0x7F20, + 0x7EF0, 0x7F10, 0x7F10, 0x7EE0, 0x7F50, 0x7F30, 0x7F20, 0x76C0, 0x6BF0, 0x6070, 0x52C0, 0x4360, 0x30F0, 0x1D70, 0x0760, 0xEE80, + 0xD420, 0xB900, 0x9C40, 0x87F0, 0x8500, 0x84C0, 0x84A0, 0x8490, 0x8480, 0x8470, 0x8470, 0x8470, 0x8460, 0x8450, 0x8450, 0x8450, + 0x8450, 0x8450, 0x8440, 0x8430, 0x8450, 0x8440, 0x8460, 0x8460, 0x8470, 0x8470, 0x8470, 0x8460, 0x8450, 0x8430, 0x8420, 0x8410, + 0x8400, 0x83F0, 0x83E0, 0x83E0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83E0, 0x83F0, 0x8400, 0x8410, 0x8420, 0x8440, 0x8450, 0x8470, + 0x8480, 0x84A0, 0x84D0, 0x8530, 0x88C0, 0xA340, 0xBDA0, 0xD370, 0xE2E0, 0xEC90, 0xF090, 0xF0F0, 0xEF90, 0xEF30, 0xF120, 0xF6A0, + 0xFF50, 0x0BB0, 0x19A0, 0x28F0, 0x3910, 0x4700, 0x5370, 0x5D40, 0x65B0, 0x6D00, 0x73C0, 0x79C0, 0x7DB0, 0x7F00, 0x7EC0, 0x7F10, + 0x7F20, 0x7F00, 0x7EF0, 0x7F10, 0x7F60, 0x7F20, 0x7F20, 0x7F20, 0x7F00, 0x7F50, 0x7EF0, 0x7F20, 0x7EE0, 0x7EF0, 0x7F80, 0x7EE0, + 0x7EF0, 0x7F10, 0x7F20, 0x7F70, 0x7EF0, 0x7ED0, 0x7EF0, 0x7EE0, 0x7F70, 0x7EE0, 0x7EC0, 0x7EF0, 0x7F10, 0x7F30, 0x7EE0, 0x7EC0, + 0x7F10, 0x7F00, 0x7F40, 0x7ED0, 0x7EA0, 0x7EE0, 0x7EF0, 0x7F10, 0x7F20, 0x7F00, 0x7F10, 0x7F10, 0x7F20, 0x7F40, 0x7F00, 0x7F30, + 0x7EE0, 0x7EF0, 0x7F30, 0x7F00, 0x6D10, 0x4A50, 0x27D0, 0x0770, 0xE920, 0xCC50, 0xB070, 0x9530, 0x8640, 0x84E0, 0x84B0, 0x84A0, + 0x8480, 0x8480, 0x8480, 0x8470, 0x8470, 0x8480, 0x8480, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x8480, 0x8480, 0x8470, + 0x8470, 0x8460, 0x8450, 0x8450, 0x8440, 0x8430, 0x8430, 0x8420, 0x8410, 0x8410, 0x8410, 0x8410, 0x8420, 0x8420, 0x8430, 0x8440, + 0x8460, 0x8470, 0x84A0, 0x8500, 0x87C0, 0x9FA0, 0xB360, 0xC390, 0xD290, 0xE5A0, 0xFA80, 0x1350, 0x2EB0, 0x4BE0, 0x68F0, 0x7E90, + 0x7F20, 0x7F20, 0x7F10, 0x7F60, 0x7F00, 0x7F00, 0x7F00, 0x7EE0, 0x7F10, 0x7F00, 0x7EF0, 0x7EF0, 0x7F10, 0x7F00, 0x7F20, 0x7F10, + 0x7F10, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7EF0, 0x7F20, 0x7F20, 0x7F10, 0x7F20, 0x7EE0, 0x7F10, 0x7F10, 0x7F20, + 0x7F20, 0x7F40, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F40, 0x7F30, 0x7F20, 0x7F20, 0x7F20, + 0x7F40, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F40, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F10, 0x7F30, + 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F10, 0x7F20, 0x7EF0, 0x7F10, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F20, 0x7F10, 0x7F30, + 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F20, 0x7F20, 0x7F20, 0x7F30, 0x7F20, 0x7F20, + 0x7F10, 0x7F10, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F10, 0x7F10, 0x7F10, 0x7F20, 0x7F10, + 0x7F30, 0x7F30, 0x7F00, 0x7F20, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7EF0, 0x7F20, 0x7F10, 0x7F30, + 0x7F20, 0x7F00, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F40, 0x7F20, + 0x7F40, 0x7B30, 0x4570, 0x0FE0, 0xD6C0, 0x9A20, 0x84F0, 0x8480, 0x8450, 0x8440, 0x8420, 0x8410, 0x8400, 0x83F0, 0x83E0, 0x83D0, + 0x8390, 0x83C0, 0x83C0, 0x83E0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, + 0x83C0, 0x83C0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83E0, 0x83E0, 0x83E0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83E0, 0x83F0, + 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8410, 0x8400, 0x8400, + 0x8400, 0x8400, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, + 0x8400, 0x83F0, 0x8400, 0x8400, 0x8400, 0x8410, 0x8410, 0x8420, 0x8430, 0x8440, 0x8440, 0x8440, 0x8450, 0x8450, 0x8460, 0x8460, + 0x8460, 0x8470, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8460, 0x8460, 0x8470, + 0x8470, 0x8480, 0x8490, 0x84A0, 0x84C0, 0x8500, 0x85C0, 0x8B10, 0x9DA0, 0xAD60, 0xBA20, 0xC3D0, 0xCA90, 0xCF20, 0xD190, 0xD460, + 0xD6D0, 0xD8E0, 0xDB60, 0xDCE0, 0xDD30, 0xD8C0, 0xCF20, 0xC050, 0xABE0, 0x9330, 0x8620, 0x84E0, 0x84C0, 0x8490, 0x8480, 0x8470, + 0x8470, 0x8470, 0x8460, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8440, 0x8440, 0x8430, 0x8450, 0x8430, 0x8430, 0x8420, 0x8420, + 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8410, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8430, 0x8430, 0x8430, 0x8430, + 0x8430, 0x8460, 0x8420, 0x8410, 0x8400, 0x8400, 0x83F0, 0x83F0, 0x83E0, 0x83D0, 0x83D0, 0x83C0, 0x83C0, 0x83B0, 0x83B0, 0x83B0, + 0x83B0, 0x83B0, 0x83A0, 0x83A0, 0x83A0, 0x83A0, 0x8390, 0x8390, 0x8390, 0x8390, 0x83D0, 0x8390, 0x8390, 0x8390, 0x8390, 0x8380, + 0x8380, 0x8360, 0x8380, 0x8380, 0x8380, 0x8380, 0x8380, 0x8380, 0x8380, 0x8380, 0x8380, 0x8380, 0x8380, 0x8390, 0x8380, 0x8380, + 0x8380, 0x8380, 0x8380, 0x8380, 0x8380, 0x8380, 0x8380, 0x8380, 0x8380, 0x8380, 0x83D0, 0x8380, 0x8380, 0x8380, 0x8380, 0x8380, + 0x8370, 0x8370, 0x8370, 0x8380, 0x8370, 0x8380, 0x8380, 0x8380, 0x8390, 0x8390, 0x8340, 0x83A0, 0x83B0, 0x83B0, 0x83C0, 0x83C0, + 0x83D0, 0x83E0, 0x8440, 0x8400, 0x8410, 0x8430, 0x8450, 0x8470, 0x84A0, 0x8640, 0xC110, 0x02F0, 0x4240, 0x76F0, 0x7F10, 0x7F00, + 0x7EF0, 0x7EF0, 0x7EA0, 0x7EE0, 0x7EF0, 0x7F30, 0x7F20, 0x7EC0, 0x7F10, 0x7F10, 0x7F00, 0x7F10, 0x7EB0, 0x7F00, 0x7EE0, 0x7EF0, + 0x7F10, 0x7F00, 0x7F60, 0x7F10, 0x7F20, 0x7F40, 0x7F10, 0x7F50, 0x7EF0, 0x7F00, 0x7EF0, 0x7EF0, 0x7F70, 0x7EF0, 0x7F10, 0x7F00, + 0x7F00, 0x7F80, 0x7F10, 0x7EB0, 0x7EE0, 0x7ED0, 0x7F30, 0x7EE0, 0x7ED0, 0x7ED0, 0x7EE0, 0x7F40, 0x7F10, 0x7E90, 0x7EB0, 0x7ED0, + 0x7F10, 0x7F00, 0x7E70, 0x7EC0, 0x7EF0, 0x7F10, 0x7F20, 0x7EC0, 0x7EB0, 0x7F00, 0x7F00, 0x7F10, 0x7EA0, 0x7F00, 0x7F00, 0x7EF0, + 0x7F10, 0x7EC0, 0x7F10, 0x7F10, 0x7F20, 0x7F00, 0x7F10, 0x7F30, 0x7EF0, 0x7F00, 0x7F10, 0x7EF0, 0x7F40, 0x7EF0, 0x7F10, 0x7F00, + 0x7F00, 0x7F80, 0x7EF0, 0x7F20, 0x7F10, 0x7EF0, 0x7F60, 0x7EE0, 0x7ED0, 0x7F10, 0x7F20, 0x7F40, 0x7EF0, 0x7EB0, 0x7F00, 0x7F10, + 0x7F30, 0x7EB0, 0x7E70, 0x7EF0, 0x7F10, 0x7F20, 0x7ED0, 0x7EB0, 0x7F00, 0x7F00, 0x7F10, 0x7F10, 0x7EA0, 0x7F20, 0x7EF0, 0x7F00, + 0x7F00, 0x7EC0, 0x7F30, 0x7F00, 0x7F20, 0x7F40, 0x7F10, 0x7F40, 0x7F10, 0x7F10, 0x7F20, 0x7EE0, 0x7F70, 0x7EF0, 0x7F20, 0x7F00, + 0x7EF0, 0x7F80, 0x7F00, 0x7F10, 0x7EF0, 0x7EF0, 0x7F60, 0x7EF0, 0x7ED0, 0x7EE0, 0x7EE0, 0x7F70, 0x7F10, 0x7EB0, 0x7EE0, 0x7ED0, + 0x7F10, 0x7F00, 0x7E90, 0x7EB0, 0x7EB0, 0x7EF0, 0x7EF0, 0x7EB0, 0x7F00, 0x7F00, 0x7F10, 0x7F20, 0x7EC0, 0x7F10, 0x7F10, 0x7F00, + 0x7F00, 0x7EC0, 0x7F30, 0x7F20, 0x7EF0, 0x7F10, 0x7F00, 0x7F40, 0x7F40, 0x7F10, 0x7F00, 0x7EE0, 0x7F50, 0x7EF0, 0x7F20, 0x7EF0, + 0x7EF0, 0x7F50, 0x7F00, 0x7F00, 0x7F10, 0x7F10, 0x7F60, 0x7EF0, 0x7EF0, 0x7EE0, 0x7EF0, 0x7F70, 0x7EF0, 0x7EA0, 0x7F00, 0x7F10, + 0x7F60, 0x7EE0, 0x7E90, 0x7EF0, 0x7EF0, 0x7EF0, 0x7EF0, 0x7EB0, 0x7EE0, 0x7EF0, 0x7F30, 0x7EA0, 0x7EC0, 0x7F10, 0x7EF0, 0x7F00, + 0x7F20, 0x7E90, 0x7F10, 0x7EE0, 0x7EF0, 0x7F10, 0x7F00, 0x7F60, 0x7F10, 0x7F10, 0x7F20, 0x7F10, 0x7F50, 0x7EF0, 0x7F00, 0x7EF0, + 0x7EF0, 0x7F80, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7F80, 0x7F10, 0x7EB0, 0x7EE0, 0x7ED0, 0x7F50, 0x7EE0, 0x7EE0, 0x7ED0, 0x7EE0, + 0x7F30, 0x7F00, 0x7E90, 0x7EB0, 0x7EE0, 0x7F10, 0x7F10, 0x7E70, 0x7EC0, 0x7F00, 0x7F00, 0x7F10, 0x7F00, 0x7F00, 0x7F10, 0x7F10, + 0x7F10, 0x7F00, 0x7EF0, 0x7F10, 0x7F00, 0x7EF0, 0x7F10, 0x7F10, 0x7F20, 0x7F10, 0x7F10, 0x7F10, 0x7F00, 0x7F10, 0x7F10, 0x7F00, + 0x7F10, 0x7F10, 0x7F30, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F20, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F10, + 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F00, 0x7F20, 0x7F20, 0x7F30, 0x7F20, 0x7F00, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F10, + 0x7F30, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F40, 0x7F30, 0x7F20, 0x7F20, 0x7F20, 0x7F40, 0x7F10, + 0x7F20, 0x7F20, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F30, 0x7F10, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F20, + 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F20, 0x7F10, 0x7F20, 0x7F10, + 0x7F30, 0x7F20, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F10, 0x7F10, 0x7F10, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F20, + 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F20, 0x7F30, + 0x7F10, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F00, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7EF0, 0x7F20, 0x7F20, 0x7F40, 0x7F30, 0x7F00, + 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7EF0, 0x7F30, 0x7F30, 0x7C20, 0x6A70, 0x59D0, 0x48F0, 0x3860, 0x2820, 0x1790, 0x0800, 0xF960, + 0xEB60, 0xDE10, 0xD170, 0xC550, 0xB9E0, 0xAF40, 0xA610, 0x9D20, 0x9130, 0x8780, 0x8500, 0x84B0, 0x8490, 0x8480, 0x8470, 0x8460, + 0x8460, 0x8460, 0x8460, 0x8460, 0x8450, 0x8460, 0x8460, 0x8450, 0x8450, 0x8440, 0x8440, 0x8430, 0x8430, 0x8420, 0x8410, 0x8450, + 0x83F0, 0x83E0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83C0, 0x83D0, 0x83C0, 0x83D0, 0x83D0, 0x83D0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, + 0x83E0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8410, 0x8410, 0x8420, 0x8430, 0x8420, 0x8450, 0x8460, 0x8480, 0x84B0, + 0x8510, 0x8E10, 0xBAA0, 0xE380, 0x09C0, 0x3040, 0x5110, 0x6D30, 0x7EE0, 0x7EE0, 0x7F40, 0x7F30, 0x7F20, 0x7F20, 0x7F00, 0x7F60, + 0x7F20, 0x7F10, 0x7F10, 0x7EF0, 0x7F40, 0x7EF0, 0x7F10, 0x7EE0, 0x7EC0, 0x7F30, 0x7F00, 0x7F40, 0x7F10, 0x7F00, 0x7F60, 0x7EF0, + 0x7F00, 0x7F20, 0x7F10, 0x7F80, 0x7F00, 0x7F40, 0x7F10, 0x7EF0, 0x7F60, 0x7F00, 0x7F00, 0x7F00, 0x7EF0, 0x7F30, 0x7EE0, 0x7EC0, + 0x7ED0, 0x7EE0, 0x7F50, 0x7F10, 0x7EB0, 0x7EE0, 0x7ED0, 0x7F10, 0x7F00, 0x7E70, 0x7EC0, 0x7EB0, 0x7EF0, 0x7EF0, 0x7EB0, 0x7F00, + 0x7F00, 0x7F10, 0x7F10, 0x7EA0, 0x7E90, 0x7F10, 0x7F10, 0x7EE0, 0x7EC0, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F00, 0x7F40, 0x7F40, + 0x7F10, 0x7F10, 0x7EE0, 0x7F50, 0x7EF0, 0x7F20, 0x7EF0, 0x7F10, 0x7F60, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7F60, 0x7EE0, 0x7F00, + 0x7EE0, 0x7EF0, 0x7F70, 0x7F00, 0x7EA0, 0x7F00, 0x7F10, 0x7F10, 0x7EE0, 0x7E90, 0x7EF0, 0x7EE0, 0x7EF0, 0x7ED0, 0x7EB0, 0x7F00, + 0x7F00, 0x7F30, 0x7F00, 0x7EC0, 0x7F10, 0x7F10, 0x7F00, 0x7F00, 0x7ED0, 0x7F30, 0x7EF0, 0x7EF0, 0x7F20, 0x7F00, 0x7F40, 0x7F10, + 0x7F10, 0x7EF0, 0x7EE0, 0x7F30, 0x7EF0, 0x7F00, 0x7EF0, 0x7F10, 0x7F70, 0x7F00, 0x7ED0, 0x7EF0, 0x7F00, 0x7F90, 0x7EF0, 0x7EE0, + 0x7EE0, 0x7ED0, 0x7F50, 0x7F10, 0x7F70, 0x7EF0, 0x7EF0, 0x7EF0, 0x7EF0, 0x7F70, 0x7F10, 0x7EB0, 0x7EB0, 0x7EE0, 0x7EF0, 0x7F10, + 0x7EA0, 0x7EC0, 0x7F00, 0x7F30, 0x7F20, 0x7E90, 0x7EB0, 0x7EA0, 0x7EE0, 0x7EF0, 0x7EB0, 0x7F20, 0x7EF0, 0x7F10, 0x7F20, 0x7F00, + 0x7F10, 0x7F10, 0x7F00, 0x7F00, 0x7EF0, 0x7F20, 0x7F00, 0x7EF0, 0x7F10, 0x7F00, 0x7F60, 0x7F10, 0x7F10, 0x7EF0, 0x7F10, 0x7F50, + 0x7EF0, 0x7F20, 0x7EF0, 0x7F10, 0x7F70, 0x7F00, 0x7ED0, 0x7F10, 0x7F20, 0x7F80, 0x7EF0, 0x7EB0, 0x7F20, 0x7EF0, 0x7F30, 0x7EE0, + 0x7EC0, 0x7F10, 0x7F10, 0x7F40, 0x7ED0, 0x7E90, 0x7F00, 0x7EE0, 0x7EF0, 0x7EE0, 0x7E70, 0x7EF0, 0x7F10, 0x7F20, 0x7F20, 0x7F00, + 0x7F10, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7F40, 0x7EF0, 0x7F10, 0x7F30, 0x7F20, 0x7F90, 0x7F20, 0x7F40, 0x7F40, 0x7F10, 0x7F70, + 0x7EE0, 0x7EF0, 0x7EF0, 0x7F00, 0x7F80, 0x7C10, 0x6C20, 0x5CC0, 0x4AD0, 0x37F0, 0x24B0, 0x1060, 0xFC40, 0xE470, 0xCDE0, 0xB780, + 0xA000, 0x8BB0, 0x8580, 0x84D0, 0x84B0, 0x8490, 0x8480, 0x8470, 0x8460, 0x8450, 0x8450, 0x8410, 0x8430, 0x8450, 0x8430, 0x8410, + 0x8410, 0x8400, 0x8400, 0x83F0, 0x8400, 0x83F0, 0x83E0, 0x83E0, 0x83F0, 0x83D0, 0x83D0, 0x8380, 0x83C0, 0x83C0, 0x83C0, 0x8340, + 0x83B0, 0x83B0, 0x83B0, 0x83C0, 0x83B0, 0x83B0, 0x8350, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83C0, 0x83B0, 0x83B0, + 0x83B0, 0x8340, 0x83C0, 0x83C0, 0x83E0, 0x83C0, 0x83C0, 0x83C0, 0x83F0, 0x83C0, 0x83D0, 0x83C0, 0x83F0, 0x83B0, 0x83C0, 0x8380, + 0x83B0, 0x83B0, 0x83B0, 0x8350, 0x83B0, 0x83B0, 0x83C0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83C0, 0x83B0, 0x83C0, 0x83C0, 0x83B0, + 0x83C0, 0x83F0, 0x83C0, 0x83F0, 0x83C0, 0x83C0, 0x83C0, 0x83B0, 0x83E0, 0x83C0, 0x83B0, 0x83B0, 0x83E0, 0x83B0, 0x83B0, 0x83B0, + 0x83B0, 0x83B0, 0x83B0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83D0, 0x83C0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83E0, 0x8400, 0x83F0, + 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8410, 0x8410, 0x8420, 0x8420, 0x8430, 0x8470, 0x8480, 0x8460, 0x8470, 0x8480, 0x8490, 0x84A0, + 0x84D0, 0x84E0, 0x8520, 0x8600, 0x88C0, 0x8F10, 0x96B0, 0x9E60, 0xA510, 0xACF0, 0xB640, 0xC1D0, 0xD020, 0xE220, 0xF520, 0x0940, + 0x1E90, 0x35E0, 0x4D00, 0x6370, 0x77D0, 0x7EA0, 0x7F10, 0x7F10, 0x7F30, 0x7EE0, 0x7E90, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7EB0, + 0x7F00, 0x7F10, 0x7F10, 0x7F10, 0x7EC0, 0x7F40, 0x7EF0, 0x7F20, 0x7F10, 0x7F00, 0x7F20, 0x7F10, 0x7F10, 0x7F00, 0x7F10, 0x7F10, + 0x7F00, 0x7F20, 0x7F10, 0x7F20, 0x7F20, 0x7F20, 0x7F40, 0x7F20, 0x7F20, 0x7F30, 0x7F10, 0x7F30, 0x7F20, 0x7EF0, 0x7F20, 0x7F00, + 0x6E30, 0x5BF0, 0x4870, 0x34E0, 0x2090, 0x0C20, 0xF7A0, 0xE2C0, 0xCE90, 0xB910, 0xA500, 0x9200, 0x8770, 0x8540, 0x84E0, 0x84B0, + 0x84A0, 0x8490, 0x8470, 0x8470, 0x8460, 0x8450, 0x8440, 0x8430, 0x8430, 0x8420, 0x8420, 0x8410, 0x8410, 0x8410, 0x8400, 0x83F0, + 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8410, 0x8400, 0x8410, 0x8400, 0x8410, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, + 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, + 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8430, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, + 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x83F0, 0x83F0, 0x8400, 0x83F0, 0x83F0, + 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x8430, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83D0, 0x8370, 0x83E0, 0x83E0, 0x83E0, + 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83B0, + 0x83F0, 0x83F0, 0x83F0, 0x83E0, 0x83E0, 0x83E0, 0x8400, 0x83D0, 0x83D0, 0x83D0, 0x83C0, 0x83C0, 0x83B0, 0x83B0, 0x83B0, 0x8350, + 0x83A0, 0x83A0, 0x83A0, 0x8390, 0x8390, 0x8390, 0x8390, 0x8390, 0x8390, 0x8390, 0x8390, 0x8380, 0x83A0, 0x83A0, 0x83A0, 0x83B0, + 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83B0, 0x83C0, 0x83B0, 0x83B0, 0x83B0, + 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83E0, 0x83E0, + 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83F0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, + 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83C0, 0x83D0, 0x83D0, 0x83C0, 0x83D0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, + 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83C0, 0x83C0, + 0x83C0, 0x83C0, 0x83D0, 0x83D0, 0x83E0, 0x83E0, 0x83E0, 0x83F0, 0x83F0, 0x8400, 0x8430, 0x8410, 0x8410, 0x8400, 0x8420, 0x8420, + 0x8430, 0x8420, 0x8440, 0x8440, 0x8450, 0x8450, 0x8460, 0x8470, 0x8460, 0x8480, 0x8490, 0x84B0, 0x84C0, 0x84F0, 0x8550, 0x8640, + 0x8850, 0x8BC0, 0x8F70, 0x9160, 0x9220, 0x9110, 0x8ED0, 0x8BF0, 0x8910, 0x86F0, 0x85B0, 0x8520, 0x84F0, 0x84C0, 0x84D0, 0x84A0, + 0x8490, 0x8490, 0x8480, 0x8470, 0x8470, 0x8460, 0x8460, 0x8460, 0x8460, 0x8450, 0x8450, 0x8440, 0x8470, 0x8440, 0x8440, 0x8430, + 0x8430, 0x8430, 0x8420, 0x8420, 0x8420, 0x8410, 0x8410, 0x8400, 0x8400, 0x8400, 0x8410, 0x8410, 0x8420, 0x8430, 0x8440, 0x8460, + 0x8470, 0x8480, 0x84C0, 0x8500, 0x8750, 0xA400, 0xC9D0, 0xF3D0, 0x1FE0, 0x4BE0, 0x7200, 0x7F30, 0x7EF0, 0x7F10, 0x7F10, 0x7EF0, + 0x7F60, 0x7ED0, 0x7EF0, 0x7F00, 0x7F00, 0x7F50, 0x7F00, 0x7EE0, 0x7F10, 0x7F10, 0x7F30, 0x7EC0, 0x7E90, 0x7F10, 0x7F20, 0x7F30, + 0x7ED0, 0x7EB0, 0x7F20, 0x7F10, 0x7F10, 0x7EF0, 0x7F50, 0x7EE0, 0x7EA0, 0x7F00, 0x7F10, 0x7F10, 0x7EE0, 0x7E90, 0x7F10, 0x7F20, + 0x7F10, 0x7F10, 0x7F00, 0x7F20, 0x7EE0, 0x7F10, 0x7F00, 0x7EC0, 0x7F30, 0x7F10, 0x7F20, 0x7F40, 0x7F10, 0x7F70, 0x7EE0, 0x7F10, + 0x7F10, 0x7EE0, 0x7F70, 0x7EF0, 0x7F20, 0x7F00, 0x7F00, 0x7F50, 0x7F00, 0x7F00, 0x7EF0, 0x7EF0, 0x7F60, 0x7EE0, 0x7EC0, 0x7ED0, + 0x7EE0, 0x7F50, 0x7F10, 0x7EA0, 0x7EC0, 0x7ED0, 0x7F10, 0x7F00, 0x7E70, 0x7ED0, 0x7EB0, 0x7EE0, 0x7EF0, 0x7E90, 0x7F00, 0x7F20, + 0x7F10, 0x7F10, 0x7EB0, 0x7F00, 0x7F10, 0x7F00, 0x7F20, 0x7EC0, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F00, 0x7F40, 0x7F10, 0x7F10, + 0x7EF0, 0x7EE0, 0x7F40, 0x7EF0, 0x7F10, 0x7EF0, 0x7EF0, 0x7F30, 0x7F00, 0x7F00, 0x7EF0, 0x7EF0, 0x7F60, 0x7ED0, 0x7EF0, 0x7EE0, + 0x7EF0, 0x7F50, 0x7EE0, 0x7EA0, 0x7F00, 0x7EF0, 0x7F10, 0x7EE0, 0x7E90, 0x7EF0, 0x7EE0, 0x7EF0, 0x7EF0, 0x7EA0, 0x7F20, 0x7F00, + 0x7F20, 0x7F20, 0x7EC0, 0x7F10, 0x7EF0, 0x7F00, 0x7F00, 0x7EF0, 0x7F60, 0x7EF0, 0x7F10, 0x7F20, 0x7F20, 0x7F60, 0x7F10, 0x7F10, + 0x7EF0, 0x7EF0, 0x7F70, 0x7EE0, 0x7F10, 0x7EF0, 0x7F10, 0x7F70, 0x7F00, 0x7EF0, 0x7EF0, 0x7F00, 0x7F80, 0x7F10, 0x7EE0, 0x7EE0, + 0x7ED0, 0x7F30, 0x7F20, 0x7EC0, 0x7EF0, 0x7EE0, 0x7F40, 0x7F10, 0x7E90, 0x7EB0, 0x7EE0, 0x7EF0, 0x7F10, 0x7E80, 0x7EC0, 0x7F00, + 0x7F20, 0x7F20, 0x7EC0, 0x7F10, 0x7F00, 0x7EF0, 0x7F10, 0x7EA0, 0x7F00, 0x7F10, 0x7F10, 0x7F20, 0x7F00, 0x7F50, 0x7EF0, 0x7F20, + 0x7EF0, 0x7F10, 0x7F30, 0x7EF0, 0x7EF0, 0x7F10, 0x7F20, 0x7F60, 0x7F10, 0x7F20, 0x7F00, 0x7F10, 0x7F70, 0x7EE0, 0x7EC0, 0x7EF0, + 0x7F10, 0x7F60, 0x7EF0, 0x7EB0, 0x7F00, 0x7F00, 0x7EF0, 0x7EB0, 0x7E70, 0x7EE0, 0x7EF0, 0x7F30, 0x7EC0, 0x7E90, 0x7F10, 0x7F00, + 0x7F00, 0x7F10, 0x7EB0, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7EC0, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F00, 0x7F30, 0x7F00, 0x7F10, + 0x7F10, 0x7F00, 0x7F60, 0x7EF0, 0x7F10, 0x7EF0, 0x7EF0, 0x7F90, 0x7F00, 0x7F40, 0x7EF0, 0x7EF0, 0x7F70, 0x7EE0, 0x7F10, 0x7EF0, + 0x7EE0, 0x7F70, 0x7F10, 0x7EB0, 0x7EE0, 0x7ED0, 0x7F10, 0x7F20, 0x7EC0, 0x7ED0, 0x7EB0, 0x7F00, 0x7EF0, 0x7E90, 0x7F00, 0x7F20, + 0x7F10, 0x7F20, 0x7EA0, 0x7EC0, 0x7F10, 0x7F10, 0x7F00, 0x7EC0, 0x7F40, 0x7F00, 0x7470, 0x5D80, 0x4500, 0x2C60, 0x1380, 0xFA40, + 0xE270, 0xCAA0, 0xB1E0, 0x9CA0, 0x8A90, 0x8580, 0x8530, 0x84C0, 0x84A0, 0x8490, 0x84B0, 0x8470, 0x8460, 0x8460, 0x8480, 0x8450, + 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8420, 0x8420, 0x8420, 0x8420, + 0x8430, 0x8430, 0x8430, 0x8440, 0x8440, 0x8490, 0x8450, 0x8460, 0x8470, 0x8480, 0x8490, 0x84B0, 0x84D0, 0x84E0, 0x8500, 0x84E0, + 0x8510, 0x8530, 0x8500, 0x8500, 0x8500, 0x84F0, 0x84D0, 0x84C0, 0x84A0, 0x8490, 0x8480, 0x8480, 0x8470, 0x8470, 0x8470, 0x8470, + 0x8470, 0x8470, 0x8480, 0x8470, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8490, 0x8490, 0x84A0, 0x84B0, 0x84B0, 0x84C0, + 0x84C0, 0x84C0, 0x84C0, 0x84D0, 0x84C0, 0x84C0, 0x84C0, 0x84B0, 0x84A0, 0x8490, 0x8490, 0x8480, 0x8470, 0x8460, 0x8460, 0x8450, + 0x8460, 0x8430, 0x8430, 0x8420, 0x8410, 0x8410, 0x8400, 0x83F0, 0x83F0, 0x83E0, 0x83E0, 0x83D0, 0x83D0, 0x83C0, 0x83C0, 0x83B0, + 0x83B0, 0x83B0, 0x83A0, 0x83A0, 0x8390, 0x8390, 0x8390, 0x8380, 0x83B0, 0x8380, 0x8380, 0x8370, 0x8370, 0x8370, 0x8370, 0x8370, + 0x8370, 0x8370, 0x8360, 0x8350, 0x8360, 0x8360, 0x8380, 0x8360, 0x8360, 0x8370, 0x8370, 0x8360, 0x8370, 0x8370, 0x8370, 0x8380, + 0x8380, 0x8380, 0x83B0, 0x8390, 0x8390, 0x8390, 0x8390, 0x83A0, 0x83A0, 0x83A0, 0x83B0, 0x83B0, 0x83D0, 0x83B0, 0x83C0, 0x83C0, + 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83D0, 0x83D0, 0x83D0, 0x83C0, 0x83C0, 0x83C0, 0x83B0, 0x83B0, 0x83A0, 0x83A0, 0x8390, 0x8380, + 0x8380, 0x8380, 0x8370, 0x8360, 0x8360, 0x8360, 0x8350, 0x8350, 0x8350, 0x8350, 0x8340, 0x8340, 0x8340, 0x8340, 0x8340, 0x8340, + 0x8340, 0x8340, 0x8340, 0x8340, 0x8350, 0x8350, 0x8350, 0x8350, 0x8350, 0x8360, 0x8360, 0x8360, 0x8360, 0x8360, 0x8360, 0x8360, + 0x8360, 0x8360, 0x8360, 0x8360, 0x8360, 0x8360, 0x8360, 0x8360, 0x8360, 0x8360, 0x8360, 0x8360, 0x8370, 0x8370, 0x8370, 0x8380, + 0x8380, 0x8380, 0x8380, 0x8390, 0x8390, 0x83A0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83C0, 0x83C0, 0x83D0, 0x83D0, 0x83E0, 0x83E0, + 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8410, 0x8420, 0x8430, 0x8430, 0x8450, 0x8460, 0x8480, 0x84A0, 0x84F0, 0x8840, 0xB250, 0xE0E0, + 0x1110, 0x4450, 0x7500, 0x7F20, 0x7EF0, 0x7EA0, 0x7F20, 0x7F10, 0x7F10, 0x7F10, 0x7EC0, 0x7F20, 0x7EF0, 0x7EE0, 0x7EF0, 0x7ED0, + 0x7F30, 0x7F00, 0x7F10, 0x7F10, 0x7EF0, 0x7F60, 0x7EF0, 0x7F10, 0x7EF0, 0x7EF0, 0x7F80, 0x7F00, 0x7F20, 0x7EF0, 0x7ED0, 0x7F60, + 0x7F00, 0x7EF0, 0x7EB0, 0x7EE0, 0x7F50, 0x7EF0, 0x7EB0, 0x7EE0, 0x7ED0, 0x7F30, 0x7F00, 0x7EA0, 0x7EB0, 0x7EB0, 0x7EE0, 0x7EF0, + 0x7E90, 0x7EA0, 0x7EC0, 0x7EF0, 0x7F10, 0x7EA0, 0x7F00, 0x7F10, 0x7F00, 0x7EE0, 0x7E90, 0x7EE0, 0x7F00, 0x7EF0, 0x7EF0, 0x7F00, + 0x7F40, 0x7F10, 0x7F10, 0x7F00, 0x7F00, 0x7F30, 0x7EF0, 0x7F00, 0x7EF0, 0x7EF0, 0x7F30, 0x7F00, 0x7F10, 0x7F00, 0x7F00, 0x7F50, + 0x7ED0, 0x7EF0, 0x7EE0, 0x7EE0, 0x7F50, 0x7EE0, 0x7EE0, 0x7EF0, 0x7F10, 0x7F60, 0x7EE0, 0x7E90, 0x7F00, 0x7EE0, 0x7F50, 0x7EB0, + 0x7E70, 0x7EE0, 0x7EF0, 0x7F20, 0x7F00, 0x7EC0, 0x7F10, 0x7F00, 0x7F20, 0x7F10, 0x7EB0, 0x7F00, 0x7EE0, 0x7EF0, 0x7F10, 0x7F00, + 0x7EF0, 0x7F10, 0x7F20, 0x7F40, 0x7F10, 0x7F30, 0x7EF0, 0x7F00, 0x7EF0, 0x7EF0, 0x7F60, 0x7EF0, 0x7F10, 0x7F10, 0x7F00, 0x7F80, + 0x7EF0, 0x7EE0, 0x7EF0, 0x7EF0, 0x7F60, 0x7EE0, 0x7ED0, 0x7EF0, 0x7F00, 0x7F40, 0x7EF0, 0x7F60, 0x7EF0, 0x7EF0, 0x7F00, 0x7F00, + 0x7F50, 0x7F00, 0x7EA0, 0x7ED0, 0x7ED0, 0x7F30, 0x7F20, 0x7EC0, 0x6BD0, 0x3AC0, 0x0FD0, 0xE790, 0xC2E0, 0xA170, 0x8960, 0x8510, + 0x84C0, 0x84A0, 0x8490, 0x8480, 0x8470, 0x8470, 0x8460, 0x8470, 0x8400, 0x8460, 0x8460, 0x8460, 0x8440, 0x8450, 0x8460, 0x8460, + 0x8460, 0x8470, 0x8470, 0x8470, 0x84A0, 0x84B0, 0x84F0, 0x85F0, 0x93E0, 0xB320, 0xD0C0, 0xEE40, 0x09A0, 0x2480, 0x3D00, 0x5380, + 0x6790, 0x78F0, 0x7F20, 0x7EF0, 0x7EF0, 0x7F80, 0x7EF0, 0x7F10, 0x7F10, 0x7F00, 0x7F80, 0x7F10, 0x7EF0, 0x7EE0, 0x7EE0, 0x7F70, + 0x7F00, 0x7EE0, 0x7EF0, 0x7EF0, 0x7F60, 0x7F20, 0x7E90, 0x7EB0, 0x7EE0, 0x7F30, 0x7F10, 0x7E70, 0x7EC0, 0x7ED0, 0x7EF0, 0x6860, + 0x4A40, 0x24A0, 0xFCE0, 0xD100, 0xA410, 0x8670, 0x84C0, 0x8490, 0x8470, 0x8460, 0x8450, 0x8470, 0x8440, 0x8430, 0x8420, 0x8420, + 0x8410, 0x8410, 0x8400, 0x8400, 0x8400, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x8400, 0x8400, + 0x8400, 0x8400, 0x8400, 0x8400, 0x8420, 0x8420, 0x8420, 0x8430, 0x8450, 0x8460, 0x8470, 0x8480, 0x8490, 0x84A0, 0x84B0, 0x84D0, + 0x84F0, 0x8520, 0x8580, 0x85C0, 0x85C0, 0x8580, 0x8560, 0x8500, 0x84D0, 0x84D0, 0x84A0, 0x8490, 0x8490, 0x8480, 0x8480, 0x8470, + 0x8490, 0x8490, 0x8460, 0x8460, 0x8480, 0x8450, 0x8450, 0x8450, 0x8450, 0x8440, 0x8440, 0x83E0, 0x8440, 0x8430, 0x8440, 0x8400, + 0x8430, 0x8430, 0x8460, 0x8420, 0x8450, 0x8430, 0x8420, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8440, 0x8470, 0x8450, 0x8450, + 0x8460, 0x8470, 0x8490, 0x84B0, 0x8540, 0x9770, 0xC440, 0xED20, 0x0FC0, 0x2AD0, 0x3CC0, 0x4580, 0x4800, 0x4610, 0x4830, 0x50A0, + 0x6250, 0x7970, 0x7F20, 0x7F00, 0x7EF0, 0x7F50, 0x7F20, 0x7F10, 0x7F10, 0x7F10, 0x7F60, 0x7F00, 0x7F10, 0x7EF0, 0x7EE0, 0x7F50, + 0x7EF0, 0x7EE0, 0x7EF0, 0x7EF0, 0x7F70, 0x7F00, 0x7EC0, 0x7EF0, 0x7F00, 0x7F70, 0x7ED0, 0x7E90, 0x7EE0, 0x7EF0, 0x7EF0, 0x7F00, + 0x7EA0, 0x7EF0, 0x7F00, 0x7F20, 0x7F00, 0x7E90, 0x7F10, 0x7EE0, 0x7EF0, 0x7F10, 0x7EA0, 0x7EF0, 0x7EF0, 0x7F10, 0x7F20, 0x7F00, + 0x7F50, 0x7EF0, 0x7F00, 0x7F10, 0x7EF0, 0x7F60, 0x7EE0, 0x7F10, 0x7F10, 0x7F00, 0x7F60, 0x7F10, 0x7F20, 0x7F00, 0x7EF0, 0x7F70, + 0x7EE0, 0x7EE0, 0x7ED0, 0x7EE0, 0x7F60, 0x7EF0, 0x7EE0, 0x7EE0, 0x7EE0, 0x7F50, 0x7EF0, 0x7E70, 0x7EC0, 0x7ED0, 0x7EF0, 0x7EF0, + 0x7F00, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7F00, 0x7EF0, 0x7F10, 0x7F10, 0x7F20, 0x7F10, 0x7F20, 0x7F20, + 0x7F10, 0x7F10, 0x7F10, 0x7F00, 0x7EF0, 0x7F10, 0x7F00, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F10, + 0x7F20, 0x7F20, 0x7F20, 0x7F30, 0x7F20, 0x7F20, 0x7F20, 0x7F30, 0x7F20, 0x7F10, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F10, 0x7F30, + 0x7F20, 0x7F30, 0x7F30, 0x7F00, 0x7F20, 0x7F10, 0x7F30, 0x7F30, 0x7F00, 0x7F20, 0x7F20, 0x7F20, 0x7F10, 0x7EF0, 0x7F20, 0x7F20, + 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F40, 0x7F40, 0x7F30, 0x7F30, 0x7AC0, 0x3B30, 0x00F0, 0xC340, 0x89C0, + 0x84B0, 0x8470, 0x8450, 0x8460, 0x8420, 0x8400, 0x83F0, 0x83F0, 0x83D0, 0x83C0, 0x83C0, 0x83B0, 0x83A0, 0x8390, 0x8390, 0x8390, + 0x8390, 0x8390, 0x83A0, 0x83A0, 0x83B0, 0x83B0, 0x83E0, 0x83C0, 0x83D0, 0x8370, 0x83C0, 0x83C0, 0x83B0, 0x83B0, 0x83A0, 0x83A0, + 0x8390, 0x8390, 0x8380, 0x8380, 0x8380, 0x8380, 0x8380, 0x8380, 0x8380, 0x8390, 0x8390, 0x8390, 0x8390, 0x8390, 0x8390, 0x8390, + 0x8390, 0x8390, 0x8390, 0x83A0, 0x83A0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83E0, + 0x83B0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83D0, 0x83D0, 0x83C0, 0x83D0, 0x83D0, 0x83F0, + 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8400, 0x8400, + 0x8400, 0x8400, 0x8410, 0x8420, 0x8420, 0x8430, 0x8440, 0x8450, 0x8460, 0x8470, 0x8490, 0x84D0, 0x86E0, 0xB6C0, 0xEFC0, 0x29C0, + 0x6360, 0x7F00, 0x7F00, 0x7F40, 0x7EF0, 0x7F10, 0x7F20, 0x7EE0, 0x7F80, 0x7F10, 0x7F00, 0x7EF0, 0x7F10, 0x7F60, 0x7F00, 0x7F10, + 0x7EF0, 0x7EE0, 0x7F40, 0x7EF0, 0x7EF0, 0x7EE0, 0x7ED0, 0x7F70, 0x7F00, 0x7EC0, 0x7ED0, 0x7EB0, 0x7F60, 0x7F10, 0x7E90, 0x7EE0, + 0x7EC0, 0x7EF0, 0x7F10, 0x7EA0, 0x7F00, 0x7EE0, 0x7F00, 0x7F00, 0x7E90, 0x7F10, 0x7F00, 0x7EF0, 0x7F10, 0x7F00, 0x6960, 0x33C0, + 0xFCD0, 0xC740, 0x9470, 0x84F0, 0x84B0, 0x8490, 0x8480, 0x8470, 0x8480, 0x8480, 0x8480, 0x8490, 0x8490, 0x8490, 0x84A0, 0x84A0, + 0x84A0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84A0, 0x8490, 0x8480, 0x8470, 0x8460, 0x8460, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, + 0x8450, 0x8450, 0x8450, 0x8460, 0x8470, 0x8470, 0x8490, 0x84A0, 0x84D0, 0x8510, 0x85E0, 0x87D0, 0x8890, 0x8750, 0x85D0, 0x8550, + 0x8520, 0x8540, 0x85C0, 0x8850, 0x9810, 0xAB50, 0xBF30, 0xD3A0, 0xE990, 0x0090, 0x1740, 0x2E40, 0x4190, 0x5260, 0x5EC0, 0x66D0, + 0x6E30, 0x75A0, 0x7DA0, 0x7EF0, 0x7EF0, 0x7F00, 0x7EF0, 0x7F80, 0x7F20, 0x7EE0, 0x7EF0, 0x7ED0, 0x7F30, 0x7EF0, 0x7E90, 0x7EB0, + 0x7EE0, 0x7EF0, 0x7F10, 0x7EA0, 0x7EC0, 0x7F00, 0x7F10, 0x7F10, 0x7E90, 0x7ED0, 0x7F00, 0x7EE0, 0x7EF0, 0x7EB0, 0x7F20, 0x7F20, + 0x7F10, 0x7F20, 0x7F00, 0x7F10, 0x7F10, 0x7F10, 0x7EE0, 0x7EF0, 0x7F50, 0x7F20, 0x7EF0, 0x7F10, 0x7F00, 0x7F60, 0x7F10, 0x7F10, + 0x7F00, 0x7EE0, 0x7F50, 0x7EF0, 0x7EF0, 0x7EF0, 0x7F10, 0x7F70, 0x7F00, 0x7ED0, 0x7F10, 0x7F00, 0x7F80, 0x7EF0, 0x7EB0, 0x7EE0, + 0x7EF0, 0x7F30, 0x7EE0, 0x7D20, 0x5710, 0x2BF0, 0x0070, 0xD200, 0xA150, 0x8570, 0x84D0, 0x8470, 0x83F0, 0x8400, 0x83F0, 0x83F0, + 0x8410, 0x83D0, 0x83C0, 0x8360, 0x83B0, 0x83A0, 0x8390, 0x8350, 0x8380, 0x83B0, 0x8370, 0x8370, 0x8360, 0x8360, 0x8350, 0x8350, + 0x8350, 0x8350, 0x8350, 0x8340, 0x8350, 0x8350, 0x8350, 0x8350, 0x8350, 0x8340, 0x8350, 0x8350, 0x8340, 0x8350, 0x8350, 0x8350, + 0x8350, 0x8360, 0x8360, 0x8360, 0x8370, 0x8350, 0x8380, 0x8380, 0x8390, 0x8390, 0x83A0, 0x83B0, 0x83A0, 0x83C0, 0x83D0, 0x83E0, + 0x83E0, 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8410, 0x8410, 0x8410, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, + 0x8410, 0x8410, 0x8410, 0x8400, 0x8400, 0x8400, 0x8400, 0x83F0, 0x83F0, 0x83F0, 0x8400, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83D0, + 0x83D0, 0x83D0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83D0, 0x83D0, 0x83E0, 0x83F0, 0x83F0, 0x8400, + 0x8410, 0x8410, 0x8430, 0x8440, 0x8450, 0x84D0, 0x85F0, 0xA270, 0xCC20, 0xF470, 0x1B70, 0x4120, 0x6470, 0x7E90, 0x7EB0, 0x7F00, + 0x7F00, 0x7EF0, 0x7F10, 0x7F00, 0x7F20, 0x7F40, 0x7F10, 0x7F10, 0x7EF0, 0x7F40, 0x7F10, 0x7F10, 0x7F00, 0x7EF0, 0x7F50, 0x7F10, + 0x7F20, 0x7F00, 0x7F00, 0x7F60, 0x7EF0, 0x7F10, 0x7EF0, 0x7EE0, 0x7F70, 0x7EF0, 0x7EB0, 0x7EF0, 0x7F10, 0x7F70, 0x7F00, 0x7EC0, + 0x7EF0, 0x7EF0, 0x7F20, 0x7ED0, 0x7EA0, 0x7EE0, 0x7EF0, 0x7F30, 0x7F00, 0x7EC0, 0x7F10, 0x7EF0, 0x7F00, 0x7EF0, 0x7E90, 0x7F00, + 0x7EE0, 0x7EF0, 0x7F10, 0x7F00, 0x7F60, 0x7F10, 0x7F20, 0x7F20, 0x7F00, 0x7F30, 0x7EF0, 0x7EF0, 0x7EF0, 0x7EF0, 0x7F80, 0x7EF0, + 0x7F10, 0x7F20, 0x7F00, 0x7F80, 0x7F10, 0x7EF0, 0x7EE0, 0x7EF0, 0x7F70, 0x7EE0, 0x7EF0, 0x7EF0, 0x7F00, 0x7F60, 0x7F10, 0x7E90, + 0x7EB0, 0x7EF0, 0x4D90, 0x0FF0, 0xD240, 0x9590, 0x84E0, 0x8490, 0x8460, 0x8490, 0x8430, 0x8420, 0x8410, 0x8400, 0x8400, 0x83F0, + 0x83D0, 0x83E0, 0x83E0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83D0, 0x83D0, 0x83D0, + 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83C0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83E0, 0x83F0, 0x83F0, 0x8400, 0x8420, 0x8420, + 0x8440, 0x8460, 0x8480, 0x84C0, 0x8700, 0xC400, 0x0640, 0x4DB0, 0x7EB0, 0x7EA0, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7EC0, 0x7F10, + 0x7EF0, 0x7EF0, 0x7F10, 0x7EB0, 0x7F20, 0x7F00, 0x7F10, 0x7F10, 0x7EE0, 0x7F10, 0x7EF0, 0x7F00, 0x7F00, 0x7EF0, 0x7F80, 0x7F00, + 0x7F20, 0x7EB0, 0x7EE0, 0x7EF0, 0x7F10, 0x7F00, 0x7F00, 0x7F10, 0x7F10, 0x7F20, 0x7F00, 0x7F10, 0x7F10, 0x7F10, 0x7F00, 0x7F10, + 0x7F10, 0x7F20, 0x7EF0, 0x7F10, 0x7F20, 0x7F20, 0x7F40, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, + 0x7F30, 0x7F40, 0x7F30, 0x7F30, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F20, + 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F10, 0x7F10, 0x7F20, 0x7F30, + 0x7F30, 0x7F20, 0x7EF0, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F00, 0x7F20, 0x7F40, 0x7F10, 0x7F10, 0x7EF0, 0x7F20, 0x7F10, 0x7F10, + 0x7F20, 0x7F10, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F40, 0x7F20, 0x7F30, 0x7F30, 0x7F20, + 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F20, 0x7F20, 0x7F20, + 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F30, + 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F30, + 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F20, + 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F20, 0x7EE0, 0x7F10, 0x7F10, 0x7F30, 0x7F20, 0x7EF0, 0x7F30, 0x7F20, 0x7F20, + 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F20, 0x7F60, 0x7EF0, 0x7EB0, 0x7F10, 0x7F40, 0x7F10, 0x7ED0, 0x7E80, 0x7F40, 0x7F10, + 0x7EB0, 0x7E70, 0x7E60, 0x7EF0, 0x7EF0, 0x7F20, 0x7ED0, 0x7E90, 0x7F00, 0x7F00, 0x7F10, 0x7F10, 0x7EC0, 0x7F40, 0x7EF0, 0x7EE0, + 0x7EF0, 0x7ED0, 0x7F30, 0x7F00, 0x7F20, 0x7F10, 0x7EF0, 0x7F30, 0x7EF0, 0x7F10, 0x7EF0, 0x7EE0, 0x7F80, 0x7F10, 0x7F20, 0x7F00, + 0x7EF0, 0x7F60, 0x7F00, 0x7F10, 0x7F10, 0x7EE0, 0x7F40, 0x7EF0, 0x7EB0, 0x7EF0, 0x7ED0, 0x7F30, 0x7F20, 0x7EC0, 0x7ED0, 0x7EB0, + 0x7960, 0x5D40, 0x4F90, 0x4DB0, 0x5260, 0x5840, 0x5D90, 0x5E00, 0x5B40, 0x54D0, 0x4C30, 0x4460, 0x3C40, 0x3680, 0x3120, 0x2A20, + 0x22F0, 0x1A40, 0x10A0, 0x05F0, 0xFB90, 0xF240, 0xEAE0, 0xE570, 0xE190, 0xDE30, 0xDBF0, 0xD890, 0xD510, 0xD0C0, 0xCAD0, 0xC5D0, + 0xC0C0, 0xBCB0, 0xB9D0, 0xB810, 0xB810, 0xB8B0, 0xB9B0, 0xBB60, 0xBB90, 0xB980, 0xB4B0, 0xAC20, 0x9FD0, 0x90C0, 0x8750, 0x8520, + 0x84D0, 0x84B0, 0x84A0, 0x8490, 0x8490, 0x8490, 0x84A0, 0x84C0, 0x8530, 0x8CB0, 0xAD10, 0xC270, 0xC760, 0xBAC0, 0x9E70, 0x8660, + 0x84C0, 0x8490, 0x8470, 0x8460, 0x8460, 0x8460, 0x8450, 0x8460, 0x8470, 0x8470, 0x8490, 0x84B0, 0x84F0, 0x8580, 0x8700, 0x8940, + 0x8C00, 0x9150, 0x9D30, 0xAFB0, 0xC8F0, 0xE260, 0xFB00, 0x10C0, 0x2230, 0x30B0, 0x3C40, 0x4650, 0x50B0, 0x5B00, 0x6490, 0x6D10, + 0x7470, 0x7B20, 0x7E60, 0x7ED0, 0x7F00, 0x7F20, 0x7F10, 0x7EB0, 0x7EE0, 0x7F10, 0x7F10, 0x7F10, 0x7EA0, 0x7F00, 0x7F10, 0x7F00, + 0x7EF0, 0x7EC0, 0x7F20, 0x7F20, 0x7F40, 0x7F10, 0x7F10, 0x7F60, 0x7F10, 0x7F10, 0x7F00, 0x7EF0, 0x7F50, 0x7F20, 0x7F20, 0x7F10, + 0x7F10, 0x7F60, 0x7F10, 0x7F10, 0x7F00, 0x7EE0, 0x7F70, 0x7EF0, 0x7EE0, 0x7F00, 0x7F10, 0x7F80, 0x7F00, 0x7ED0, 0x6A90, 0x2140, + 0x1530, 0x0EC0, 0x0A70, 0x08C0, 0x0870, 0x0A70, 0x0CA0, 0x0F50, 0x1300, 0x1660, 0x1B40, 0x1F70, 0x2230, 0x23A0, 0x2180, 0x1CB0, + 0x13B0, 0x05D0, 0xF690, 0xE5B0, 0xD3B0, 0xC080, 0xAC50, 0x9820, 0x88F0, 0x8550, 0x84E0, 0x84B0, 0x84C0, 0x8490, 0x8480, 0x8480, + 0x8470, 0x8470, 0x8470, 0x8490, 0x8470, 0x8470, 0x8470, 0x8480, 0x8480, 0x8480, 0x8490, 0x8490, 0x84A0, 0x84B0, 0x84D0, 0x8500, + 0x85B0, 0x8950, 0x9A70, 0xAE60, 0xC020, 0xD1D0, 0xDF30, 0xE920, 0xF060, 0xF350, 0xF390, 0xEFF0, 0xE8A0, 0xDE60, 0xD050, 0xC2F0, + 0xB6D0, 0xAEE0, 0xACE0, 0xB0A0, 0xB980, 0xC680, 0xD590, 0xE810, 0xF900, 0x0A60, 0x1AC0, 0x2910, 0x35F0, 0x3F60, 0x4600, 0x4990, + 0x4940, 0x46D0, 0x3FD0, 0x3560, 0x26B0, 0x1400, 0xFEC0, 0xE590, 0xC980, 0xA8B0, 0x8C30, 0x8520, 0x84C0, 0x84A0, 0x8490, 0x8480, + 0x8470, 0x8470, 0x8410, 0x8460, 0x8460, 0x8460, 0x8470, 0x8470, 0x8470, 0x8480, 0x8490, 0x84A0, 0x84C0, 0x84F0, 0x85E0, 0x8FE0, + 0xA8A0, 0xBEA0, 0xD1F0, 0xE200, 0xF0E0, 0xFB50, 0x0350, 0x0A00, 0x0E80, 0x10D0, 0x1170, 0x0EE0, 0x0B80, 0x0510, 0xFDC0, 0xF5F0, + 0xEC50, 0xE2B0, 0xD890, 0xCDE0, 0xC2F0, 0xB7E0, 0xABC0, 0x9FB0, 0x9300, 0x8A30, 0x8660, 0x8540, 0x84F0, 0x84D0, 0x84E0, 0x84B0, + 0x84B0, 0x84B0, 0x84B0, 0x84C0, 0x84D0, 0x8500, 0x8570, 0x8830, 0x9EC0, 0xBA90, 0xD830, 0xF620, 0x1360, 0x2E40, 0x4430, 0x5700, + 0x6460, 0x6E90, 0x7600, 0x7A80, 0x7E00, 0x7F10, 0x7F00, 0x7F00, 0x7EC0, 0x7F10, 0x7F00, 0x7EF0, 0x7F10, 0x7F00, 0x7F40, 0x7F10, + 0x7F10, 0x7F00, 0x7EE0, 0x7F10, 0x7F00, 0x7EF0, 0x7F10, 0x7EB0, 0x7F20, 0x7F10, 0x6F50, 0x5080, 0x2A10, 0x0230, 0xD520, 0xA540, + 0x8690, 0x84C0, 0x84A0, 0x8490, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, 0x8470, 0x8470, 0x8470, 0x8470, 0x8490, 0x8460, 0x8460, + 0x8470, 0x8470, 0x8470, 0x8480, 0x8490, 0x8490, 0x84B0, 0x84D0, 0x8530, 0x8AE0, 0xB430, 0xE0F0, 0x1160, 0x4170, 0x6DC0, 0x7ED0, + 0x7F30, 0x7F20, 0x7E90, 0x7EB0, 0x7EE0, 0x7EF0, 0x7F10, 0x7EA0, 0x7F00, 0x7F10, 0x7F10, 0x7F20, 0x7EC0, 0x7F10, 0x7F10, 0x7F00, + 0x7EF0, 0x7EF0, 0x7F00, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7F60, 0x7F10, 0x7F10, 0x7EF0, 0x7F10, 0x7F30, 0x7EF0, 0x7F00, 0x7EF0, + 0x7F10, 0x7F60, 0x7F00, 0x7ED0, 0x7F00, 0x7F00, 0x7F90, 0x7EF0, 0x7EE0, 0x7EF0, 0x7EF0, 0x7F30, 0x7EE0, 0x7ED0, 0x7F00, 0x7F20, + 0x7F50, 0x7ED0, 0x7E90, 0x7F00, 0x7F10, 0x7EE0, 0x7F20, 0x7F10, 0x7F10, 0x7F00, 0x7F20, 0x7EF0, 0x7F10, 0x7F10, 0x7F20, 0x7F40, + 0x7F30, 0x7F20, 0x7F20, 0x7F20, 0x7F50, 0x7F10, 0x7F10, 0x7F10, 0x7F20, 0x7F30, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, + 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, + 0x7F40, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, + 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, + 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F10, 0x7F20, 0x7F30, 0x7F20, 0x7F20, + 0x7EF0, 0x7F10, 0x7F20, 0x7F20, 0x7F20, 0x7F10, 0x7F20, 0x7F10, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F40, + 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F50, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F40, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F30, + 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F20, 0x7F20, 0x7F20, 0x7F20, 0x7F30, 0x7F30, + 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F20, 0x7F20, + 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F10, + 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F30, 0x7F60, 0x7F40, 0x7F20, 0x7F20, 0x7F00, 0x7F50, 0x7F10, 0x7EF0, 0x7EE0, 0x7EF0, + 0x7EF0, 0x6120, 0x30C0, 0xFD30, 0xC530, 0x8CB0, 0x84C0, 0x8480, 0x8450, 0x8440, 0x8420, 0x8410, 0x8400, 0x83F0, 0x83F0, 0x83E0, + 0x83E0, 0x83D0, 0x83D0, 0x8390, 0x83D0, 0x83D0, 0x83D0, 0x83B0, 0x83D0, 0x83D0, 0x83D0, 0x83C0, 0x83C0, 0x83C0, 0x83A0, 0x83B0, + 0x83A0, 0x83A0, 0x8380, 0x8390, 0x83C0, 0x8380, 0x83A0, 0x8380, 0x8380, 0x8390, 0x83A0, 0x8370, 0x8380, 0x8310, 0x8380, 0x8380, + 0x83B0, 0x8390, 0x8390, 0x83A0, 0x83B0, 0x83B0, 0x83B0, 0x83F0, 0x83D0, 0x83D0, 0x83D0, 0x8370, 0x83E0, 0x83E0, 0x83F0, 0x83F0, + 0x8430, 0x8410, 0x8410, 0x8420, 0x8430, 0x8440, 0x8450, 0x8460, 0x8470, 0x8490, 0x84A0, 0x84D0, 0x8520, 0x86C0, 0x9370, 0xA810, + 0xBAA0, 0xCC60, 0xDF40, 0xEF30, 0xFF20, 0x0D50, 0x1B00, 0x27F0, 0x3300, 0x3E60, 0x48F0, 0x5360, 0x5D40, 0x6600, 0x6FB0, 0x7860, + 0x7EE0, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F60, 0x7F20, 0x7F40, 0x7F10, 0x7F00, 0x7F30, 0x7EE0, 0x7EF0, 0x7EE0, 0x7EF0, 0x7F80, + 0x7F00, 0x7F00, 0x7F10, 0x7F10, 0x7F30, 0x7EE0, 0x7ED0, 0x7EF0, 0x7EE0, 0x7F50, 0x7ED0, 0x7EB0, 0x7F00, 0x7F00, 0x7F10, 0x7EE0, + 0x7EC0, 0x7F10, 0x7EF0, 0x7EF0, 0x7EF0, 0x7EC0, 0x7F20, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7F40, 0x7EF0, 0x7F10, 0x7F20, 0x7EF0, + 0x7F80, 0x7EF0, 0x7EF0, 0x7F10, 0x7F20, 0x7F70, 0x7F00, 0x7F10, 0x7EF0, 0x7EE0, 0x7F90, 0x7EF0, 0x7F00, 0x7EE0, 0x7EF0, 0x7F70, + 0x7F00, 0x7EE0, 0x7ED0, 0x7F00, 0x7F60, 0x7F10, 0x7EB0, 0x7EE0, 0x7EC0, 0x7EF0, 0x7F10, 0x7EA0, 0x7ED0, 0x7ED0, 0x7F20, 0x7F20, + 0x7E90, 0x7EB0, 0x7F00, 0x7EF0, 0x7EF0, 0x7E70, 0x7EE0, 0x7EF0, 0x7F10, 0x7F20, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7F10, 0x7EB0, + 0x7F20, 0x7EB0, 0x7ED0, 0x7ED0, 0x7F00, 0x7F00, 0x7E90, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7EA0, 0x7F00, 0x7F10, 0x7F10, 0x7F00, + 0x7EE0, 0x7F40, 0x7F30, 0x7F20, 0x7EF0, 0x7F10, 0x7F60, 0x7F20, 0x7F10, 0x7F10, 0x7F00, 0x7F60, 0x7EF0, 0x7F20, 0x7EE0, 0x7EF0, + 0x7F70, 0x7F00, 0x7F00, 0x7F10, 0x7ED0, 0x78F0, 0x7140, 0x6910, 0x61E0, 0x59F0, 0x51A0, 0x48F0, 0x4010, 0x3760, 0x2E00, 0x23F0, + 0x1AE0, 0x1140, 0x0810, 0xFEA0, 0xF560, 0xED00, 0xE4D0, 0xDDD0, 0xD6E0, 0xD010, 0xC9A0, 0xC310, 0xBCE0, 0xB6D0, 0xB1B0, 0xADA0, + 0xAAE0, 0xA970, 0xA890, 0xA830, 0xA870, 0xA8E0, 0xA920, 0xA9E0, 0xAA90, 0xAB80, 0xACD0, 0xADD0, 0xAFB0, 0xB150, 0xB2A0, 0xB3C0, + 0xB450, 0xB540, 0xB560, 0xB530, 0xB3D0, 0xB1F0, 0xB030, 0xAD80, 0xAAF0, 0xA820, 0xA5D0, 0xA450, 0xA320, 0xA260, 0xA200, 0xA220, + 0xA360, 0xA530, 0xA900, 0xAD80, 0xB3F0, 0xBCE0, 0xC600, 0xD140, 0xDBF0, 0xE7D0, 0xF4C0, 0x01C0, 0x0FC0, 0x1EB0, 0x2E40, 0x3D80, + 0x4BB0, 0x59E0, 0x6660, 0x7140, 0x7AF0, 0x7F00, 0x7F60, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7EF0, 0x7F00, 0x7EF0, 0x7F10, + 0x7F50, 0x7EF0, 0x7F20, 0x7F20, 0x7F10, 0x7F90, 0x7D70, 0x7560, 0x6DA0, 0x6430, 0x5AB0, 0x5120, 0x4690, 0x3D10, 0x32C0, 0x27D0, + 0x1E10, 0x1400, 0x09F0, 0x0180, 0xFA30, 0xF4E0, 0xF020, 0xED40, 0xEBA0, 0xEAB0, 0xEB00, 0xEBB0, 0xED40, 0xEF20, 0xF0D0, 0xF3B0, + 0xF620, 0xF970, 0xFCF0, 0xFF50, 0x0140, 0x0040, 0xFD10, 0xF760, 0xEF50, 0xE630, 0xDC90, 0xD2E0, 0xCAC0, 0xC3E0, 0xBF40, 0xBD00, + 0xBDA0, 0xC190, 0xC890, 0xD2D0, 0xDE90, 0xEB10, 0xF740, 0xFFB0, 0x0500, 0x06C0, 0x0490, 0x00D0, 0xFA80, 0xF320, 0xE9F0, 0xDDF0, + 0xD040, 0xBF80, 0xABF0, 0x9560, 0x8720, 0x8500, 0x84B0, 0x8490, 0x8480, 0x8470, 0x8460, 0x8450, 0x8440, 0x8440, 0x8430, 0x8430, + 0x8420, 0x8420, 0x8420, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x83F0, 0x83F0, + 0x83F0, 0x83F0, 0x83F0, 0x83E0, 0x83E0, 0x83E0, 0x83D0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, + 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8400, 0x8410, 0x8430, 0x8420, 0x8420, 0x8420, 0x8420, 0x8450, 0x8430, 0x8430, 0x8440, 0x8430, + 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8430, 0x8440, 0x8430, 0x8420, 0x8420, 0x8420, 0x8420, 0x8410, + 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8400, 0x8400, 0x8400, 0x83F0, 0x83F0, 0x8400, 0x83F0, 0x83F0, 0x83E0, 0x83E0, 0x83D0, + 0x83C0, 0x83D0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, + 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83C0, 0x83C0, 0x83C0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, + 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83D0, + 0x83C0, 0x83C0, 0x83D0, 0x83D0, 0x83D0, 0x83E0, 0x83E0, 0x83E0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8410, 0x8410, + 0x8410, 0x8420, 0x8430, 0x8430, 0x8440, 0x8450, 0x8440, 0x8460, 0x8470, 0x8480, 0x8490, 0x84B0, 0x84D0, 0x8500, 0x8590, 0x8820, + 0x9220, 0xA120, 0xAD70, 0xB760, 0xBF60, 0xC570, 0xC8D0, 0xC9C0, 0xC9C0, 0xC830, 0xC610, 0xC470, 0xC2B0, 0xC180, 0xBF30, 0xBC50, + 0xB710, 0xAF70, 0xA570, 0x9860, 0x8BB0, 0x8600, 0x84F0, 0x84C0, 0x84A0, 0x8480, 0x8470, 0x8460, 0x8450, 0x8440, 0x8440, 0x8430, + 0x8450, 0x8420, 0x8420, 0x8420, 0x8420, 0x8430, 0x8440, 0x8450, 0x8460, 0x8460, 0x84A0, 0x8470, 0x8490, 0x8480, 0x8490, 0x8490, + 0x84A0, 0x84B0, 0x84B0, 0x84D0, 0x84E0, 0x8500, 0x8560, 0x8690, 0x8B00, 0x9820, 0xA6A0, 0xB4D0, 0xC190, 0xCD90, 0xD850, 0xE1B0, + 0xEAD0, 0xF230, 0xF990, 0x0170, 0x09C0, 0x12E0, 0x1C90, 0x26D0, 0x3120, 0x3CF0, 0x47F0, 0x53A0, 0x5E70, 0x6970, 0x72F0, 0x7B40, + 0x7F00, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F90, 0x7F30, 0x7F00, 0x7F40, 0x7F30, 0x7F50, 0x7F40, 0x7EE0, + 0x7F10, 0x7F10, 0x7EF0, 0x7EF0, 0x7EB0, 0x7470, 0x6620, 0x5590, 0x4370, 0x2E30, 0x1800, 0xFEC0, 0xE330, 0xC380, 0xA440, 0x8970, + 0x84F0, 0x84B0, 0x8490, 0x8470, 0x8460, 0x8450, 0x8440, 0x8430, 0x8420, 0x8420, 0x8420, 0x8410, 0x8410, 0x8400, 0x8400, 0x83F0, + 0x83F0, 0x83E0, 0x83E0, 0x83D0, 0x83C0, 0x83C0, 0x83B0, 0x83A0, 0x8390, 0x8390, 0x8380, 0x8370, 0x8360, 0x8360, 0x8350, 0x8350, + 0x8350, 0x8340, 0x8340, 0x8340, 0x8340, 0x8340, 0x8340, 0x8340, 0x8340, 0x8340, 0x8340, 0x8340, 0x8340, 0x8340, 0x8340, 0x8350, + 0x8350, 0x8350, 0x8350, 0x8360, 0x8360, 0x8360, 0x8360, 0x8370, 0x8370, 0x8370, 0x8370, 0x8370, 0x8370, 0x8380, 0x8380, 0x8380, + 0x8380, 0x8390, 0x8390, 0x8390, 0x8390, 0x8390, 0x83A0, 0x83B0, 0x83B0, 0x83C0, 0x83C0, 0x83D0, 0x83E0, 0x83E0, 0x83F0, 0x8400, + 0x8410, 0x8420, 0x8430, 0x8440, 0x8450, 0x8470, 0x8480, 0x84A0, 0x84C0, 0x8510, 0x8700, 0x9830, 0xAD10, 0xBE50, 0xCD10, 0xD900, + 0xE450, 0xEDF0, 0xF6E0, 0xFF80, 0x0850, 0x1260, 0x1BA0, 0x2680, 0x3180, 0x3EA0, 0x4C90, 0x5B30, 0x6B70, 0x7A00, 0x7F20, 0x7F10, + 0x7F20, 0x7F20, 0x7ED0, 0x7F30, 0x7F20, 0x7F40, 0x7F10, 0x7F10, 0x7F30, 0x7EF0, 0x7F10, 0x7EF0, 0x7EF0, 0x7F50, 0x7F00, 0x7F20, + 0x7F00, 0x7F10, 0x7F70, 0x7EE0, 0x7F10, 0x7F10, 0x7EF0, 0x7F60, 0x7EF0, 0x7EB0, 0x7F00, 0x7F00, 0x7F10, 0x7F00, 0x7EC0, 0x7F10, + 0x7F10, 0x7F20, 0x7EE0, 0x7E90, 0x7F10, 0x7F20, 0x7EF0, 0x7F10, 0x7E60, 0x68E0, 0x5310, 0x3D10, 0x2870, 0x1500, 0x0290, 0xF120, + 0xE1A0, 0xD4D0, 0xC9A0, 0xC030, 0xB820, 0xB150, 0xAC80, 0xA860, 0xA580, 0xA3B0, 0xA260, 0xA1A0, 0xA100, 0xA080, 0x9FF0, 0x9E60, + 0x9C10, 0x9860, 0x9340, 0x8560, 0x8500, 0x84E0, 0x84C0, 0x84C0, 0x84C0, 0x84B0, 0x84B0, 0x84C0, 0x84D0, 0x84F0, 0x8550, 0x8800, + 0x9DE0, 0xBB00, 0xD950, 0xF7B0, 0x15A0, 0x31C0, 0x4CC0, 0x67A0, 0x7BC0, 0x7EF0, 0x7ED0, 0x7F00, 0x7EE0, 0x7F30, 0x7F10, 0x7E70, + 0x7ED0, 0x7EB0, 0x7F10, 0x7EF0, 0x7E90, 0x7ED0, 0x7F00, 0x7F00, 0x7F10, 0x7EA0, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7EC0, 0x7F10, + 0x7F10, 0x7F20, 0x7EF0, 0x7F00, 0x7F20, 0x7F40, 0x7F10, 0x7F10, 0x7EF0, 0x7F60, 0x7EF0, 0x7F10, 0x7EE0, 0x7EF0, 0x7F50, 0x7F10, + 0x7F20, 0x7F10, 0x7F10, 0x7F70, 0x7EF0, 0x7F10, 0x7EF0, 0x7F20, 0x7F70, 0x7EF0, 0x7EB0, 0x7F00, 0x7F10, 0x7F70, 0x7F00, 0x7EC0, + 0x7EF0, 0x7EF0, 0x7F20, 0x7ED0, 0x7E90, 0x7F00, 0x7EF0, 0x7F10, 0x7F00, 0x7EA0, 0x7F00, 0x7F10, 0x7F00, 0x7F00, 0x7EC0, 0x7F00, + 0x7EE0, 0x7EF0, 0x7F10, 0x7F00, 0x7F40, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7F50, 0x7EF0, 0x7F00, 0x7EF0, 0x7EF0, 0x7F80, 0x7F00, + 0x7F10, 0x7F20, 0x7F00, 0x7F80, 0x7EF0, 0x7EF0, 0x7EE0, 0x7EE0, 0x7F50, 0x7F10, 0x7EE0, 0x7ED0, 0x7EF0, 0x7F60, 0x7F00, 0x7E90, + 0x7EB0, 0x7EB0, 0x7EF0, 0x7F00, 0x7E70, 0x7EC0, 0x7ED0, 0x7F10, 0x7F20, 0x7EC0, 0x7F10, 0x7F10, 0x7F00, 0x7F10, 0x7E90, 0x7EE0, + 0x7F00, 0x7EF0, 0x7F10, 0x7F00, 0x7F40, 0x7F10, 0x7F20, 0x7F00, 0x7ED0, 0x7F30, 0x7EF0, 0x7F00, 0x7EF0, 0x7F10, 0x7F40, 0x7EF0, + 0x7F20, 0x7F00, 0x7F00, 0x7F50, 0x7EF0, 0x7EF0, 0x7EE0, 0x7EF0, 0x7F30, 0x7EE0, 0x7ED0, 0x7F10, 0x7F00, 0x7F60, 0x7ED0, 0x7E90, + 0x7F00, 0x7F10, 0x7F30, 0x7EB0, 0x7E70, 0x7EF0, 0x7F10, 0x7F20, 0x7F00, 0x7EB0, 0x7F00, 0x7F00, 0x7F10, 0x7F10, 0x7EA0, 0x7F20, + 0x7EF0, 0x7F10, 0x7EE0, 0x7EC0, 0x7F10, 0x7F00, 0x7F20, 0x7F40, 0x7F10, 0x7F30, 0x7EE0, 0x7F10, 0x7F10, 0x7EE0, 0x7F60, 0x7EF0, + 0x7F20, 0x7F00, 0x7F00, 0x7F50, 0x7F00, 0x7F10, 0x7EF0, 0x7EF0, 0x7F60, 0x7EE0, 0x7ED0, 0x7EF0, 0x7EE0, 0x7F70, 0x7F10, 0x7EE0, + 0x7EE0, 0x7ED0, 0x7F30, 0x7EF0, 0x7E70, 0x7EC0, 0x7EB0, 0x7EF0, 0x7EF0, 0x7E90, 0x7EE0, 0x7F00, 0x7F10, 0x7F10, 0x7EA0, 0x7ED0, + 0x7F10, 0x7F00, 0x7EE0, 0x7EC0, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F00, 0x7F40, 0x7F40, 0x6780, 0x4630, 0x28A0, 0x0CA0, 0xEF90, + 0xCF00, 0xA5A0, 0x86C0, 0x84C0, 0x8480, 0x8470, 0x8460, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8460, 0x8470, + 0x8480, 0x84D0, 0x8FB0, 0xEAA0, 0x3190, 0x6730, 0x7EB0, 0x7F20, 0x7ED0, 0x7EB0, 0x7F20, 0x7F10, 0x7EB0, 0x7EF0, 0x7EF0, 0x7F10, + 0x7F20, 0x7F20, 0x7F20, 0x7F10, 0x7F20, 0x7F20, 0x63C0, 0x3AB0, 0x0D30, 0xDFD0, 0xB580, 0x8F10, 0x8500, 0x84B0, 0x84B0, 0x8470, + 0x8450, 0x8440, 0x8430, 0x8420, 0x8410, 0x8400, 0x8400, 0x83F0, 0x83E0, 0x83C0, 0x83C0, 0x83A0, 0x8390, 0x8390, 0x8390, 0x8390, + 0x8390, 0x8390, 0x8390, 0x8380, 0x8380, 0x8380, 0x8390, 0x8390, 0x8390, 0x83A0, 0x83A0, 0x83A0, 0x83E0, 0x83A0, 0x8390, 0x8390, + 0x8390, 0x8390, 0x83B0, 0x83B0, 0x83B0, 0x83C0, 0x83C0, 0x83E0, 0x83D0, 0x83D0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, + 0x83E0, 0x83E0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x8390, 0x83F0, 0x83F0, 0x83E0, 0x83F0, 0x83F0, 0x83F0, 0x8400, 0x8410, 0x8420, + 0x8450, 0x8440, 0x8450, 0x8460, 0x8480, 0x8490, 0x84B0, 0x84E0, 0x8650, 0xA820, 0xDE50, 0x1F90, 0x6820, 0x7F10, 0x7F30, 0x7F20, + 0x7F20, 0x7F10, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F20, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F20, + 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F20, 0x7F20, 0x7F20, 0x7F30, 0x7F20, 0x7F20, 0x7F20, + 0x7F10, 0x7F20, 0x7F10, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F10, 0x7F10, 0x7F10, 0x7F20, 0x7F10, 0x7EF0, + 0x7F20, 0x7F00, 0x7F20, 0x7F20, 0x7F20, 0x7F20, 0x7EF0, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F10, 0x7F10, 0x7F20, + 0x7F00, 0x7F10, 0x7F30, 0x7F10, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F10, 0x7F10, 0x7F30, 0x7F20, 0x7EA0, 0x7F10, 0x7F20, 0x7F40, + 0x7EF0, 0x7E90, 0x7EF0, 0x7EF0, 0x7EF0, 0x7EF0, 0x7E80, 0x7EA0, 0x7ED0, 0x7F20, 0x7F00, 0x7EC0, 0x7F00, 0x7EB0, 0x7F20, 0x7F20, + 0x7F00, 0x7F20, 0x7EF0, 0x7F10, 0x7F30, 0x7F20, 0x7F60, 0x7EF0, 0x7F10, 0x7F00, 0x7F10, 0x7F30, 0x7EE0, 0x7EF0, 0x7ED0, 0x7EF0, + 0x7F60, 0x7F00, 0x7F10, 0x7F20, 0x7F00, 0x7F70, 0x7F10, 0x7EB0, 0x7EF0, 0x7ED0, 0x7F10, 0x7EE0, 0x7EC0, 0x7EF0, 0x7EE0, 0x7F20, + 0x7F10, 0x7E90, 0x7EF0, 0x7EE0, 0x7F10, 0x7F00, 0x7E70, 0x7ED0, 0x7F10, 0x7F20, 0x7F20, 0x7F00, 0x7F10, 0x7F20, 0x7F10, 0x7F10, + 0x7F00, 0x7F20, 0x7EF0, 0x7F10, 0x7F10, 0x7F20, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F30, 0x7EF0, 0x7EF0, 0x7EF0, 0x7EE0, + 0x7F50, 0x7EF0, 0x7F20, 0x7F20, 0x7F10, 0x7F70, 0x7EB0, 0x7A40, 0x7550, 0x7060, 0x6B70, 0x6680, 0x6000, 0x5920, 0x5100, 0x4810, + 0x3F50, 0x3580, 0x2CF0, 0x2470, 0x1BE0, 0x1420, 0x0CF0, 0x0610, 0xFF90, 0xF9A0, 0xF3C0, 0xEE70, 0xEAE0, 0xE780, 0xE410, 0xE1A0, + 0xDF40, 0xDDC0, 0xDC90, 0xDB60, 0xDAF0, 0xDAC0, 0xDAE0, 0xDB00, 0xDC20, 0xDD90, 0xDF10, 0xE170, 0xE480, 0xE770, 0xEB70, 0xEDC0, + 0xF030, 0xF2D0, 0xF500, 0xF780, 0xFAB0, 0xFDA0, 0x0020, 0x01B0, 0x0310, 0x0360, 0x0350, 0x0310, 0x0130, 0xFF60, 0xFC80, 0xF930, + 0xF560, 0xF0A0, 0xEB50, 0xE530, 0xDEC0, 0xD860, 0xD140, 0xC900, 0xC020, 0xB6A0, 0xAD60, 0xA360, 0x9930, 0x8FE0, 0x8940, 0x8640, + 0x8540, 0x84F0, 0x84D0, 0x84C0, 0x84B0, 0x84A0, 0x8490, 0x8490, 0x8480, 0x8480, 0x8470, 0x8470, 0x8470, 0x8460, 0x8460, 0x8460, + 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8470, 0x8470, 0x8480, 0x8490, 0x84A0, 0x84B0, 0x84D0, 0x84F0, 0x8530, + 0x85A0, 0x85F0, 0x8600, 0x85D0, 0x85D0, 0xB680, 0xCEF0, 0xE410, 0xF290, 0xFBF0, 0x0370, 0x0E60, 0x1E00, 0x2E30, 0x3760, 0x2AD0, + 0xFE30, 0xA990, 0x84B0, 0x8460, 0x8440, 0x8420, 0x8410, 0x8400, 0x83F0, 0x83E0, 0x83E0, 0x83D0, 0x83D0, 0x83E0, 0x83F0, 0x8400, + 0x8420, 0x8440, 0x8460, 0x8470, 0x8480, 0x8490, 0x84A0, 0x84B0, 0x84E0, 0x8520, 0x8520, 0x84E0, 0x84A0, 0x8470, 0x8460, 0x8440, + 0x8430, 0x8420, 0x8420, 0x8410, 0x8410, 0x8400, 0x8400, 0x83F0, 0x83F0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, + 0x83E0, 0x83E0, 0x83D0, 0x83E0, 0x83E0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83E0, 0x83E0, 0x83E0, + 0x83E0, 0x83D0, 0x83E0, 0x83E0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83C0, 0x83C0, 0x83C0, + 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83A0, 0x83A0, 0x83A0, 0x83A0, 0x83A0, + 0x83A0, 0x8390, 0x8390, 0x8390, 0x8390, 0x8390, 0x8350, 0x8390, 0x8390, 0x8390, 0x8390, 0x8390, 0x8390, 0x8330, 0x8390, 0x8390, + 0x8390, 0x8390, 0x8390, 0x83A0, 0x83A0, 0x83A0, 0x83A0, 0x83A0, 0x83B0, 0x83B0, 0x83A0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x8370, + 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83A0, 0x83A0, 0x8370, 0x83A0, 0x83A0, 0x83A0, 0x8390, 0x8390, + 0x8390, 0x83C0, 0x83B0, 0x8380, 0x8380, 0x8390, 0x8380, 0x8370, 0x8370, 0x8350, 0x8360, 0x8360, 0x8370, 0x8350, 0x8350, 0x8350, + 0x8360, 0x8340, 0x8340, 0x8340, 0x8350, 0x8340, 0x8340, 0x8370, 0x8360, 0x8340, 0x8340, 0x8380, 0x8350, 0x8350, 0x8350, 0x8380, + 0x8350, 0x8360, 0x8380, 0x8370, 0x8380, 0x8390, 0x8390, 0x8390, 0x83A0, 0x83D0, 0x83B0, 0x83B0, 0x83C0, 0x83C0, 0x83D0, 0x83D0, + 0x8390, 0x83E0, 0x83E0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x8410, 0x8400, 0x8400, 0x8400, 0x8410, 0x8410, 0x8410, 0x8420, 0x8430, + 0x8430, 0x8440, 0x8450, 0x8460, 0x8470, 0x8490, 0x84A0, 0x84D0, 0x8520, 0x8670, 0x8F20, 0xA190, 0xB330, 0xC370, 0xD2E0, 0xE080, + 0xECF0, 0xF7F0, 0x0410, 0x0F20, 0x1C20, 0x2A40, 0x3950, 0x4890, 0x56A0, 0x6410, 0x7080, 0x7C60, 0x7EF0, 0x7EF0, 0x7F00, 0x7F00, + 0x7F70, 0x7F10, 0x7EB0, 0x7EC0, 0x7ED0, 0x7F30, 0x7F00, 0x7EA0, 0x7ED0, 0x7EE0, 0x7F20, 0x7F20, 0x7E90, 0x7EE0, 0x7EE0, 0x7F10, + 0x7F10, 0x7E70, 0x7EF0, 0x7F10, 0x7F20, 0x7F20, 0x7E90, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F00, 0x7F00, 0x7EF0, 0x7F20, 0x7F20, + 0x7F10, 0x7F10, 0x7F10, 0x7C00, 0x6F50, 0x6410, 0x59B0, 0x5020, 0x46F0, 0x3E30, 0x3580, 0x2D20, 0x2620, 0x2190, 0x21B0, 0x27D0, + 0x3590, 0x4C30, 0x69F0, 0x7EF0, 0x7F30, 0x7F00, 0x7F20, 0x7F40, 0x7F30, 0x7F20, 0x7F00, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F40, + 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F50, 0x7F30, + 0x7F20, 0x7F20, 0x7F30, 0x7F40, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F20, + 0x7F10, 0x7F10, 0x7F10, 0x7F20, 0x7EF0, 0x7F10, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F10, + 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F10, 0x48C0, 0x16C0, 0xEEC0, 0xD730, 0xD1D0, 0xDED0, 0xFA00, + 0x20F0, 0x4740, 0x6880, 0x7E50, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F30, + 0x7F10, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F10, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F00, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F00, + 0x7F20, 0x7F40, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F30, 0x7F20, + 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F20, 0x7560, 0x6310, 0x4E30, 0x3670, 0x1D20, 0x02A0, 0xE730, 0xCC50, 0xAF20, + 0x9450, 0x8690, 0x84E0, 0x84C0, 0x8490, 0x8480, 0x8470, 0x8460, 0x8450, 0x8440, 0x8440, 0x8440, 0x8440, 0x8430, 0x8430, 0x8430, + 0x8460, 0x8430, 0x8440, 0x8490, 0x8440, 0x8440, 0x8440, 0x8450, 0x8450, 0x8450, 0x8490, 0x8450, 0x8450, 0x8460, 0x8460, 0x8470, + 0x8470, 0x8480, 0x84B0, 0x84A0, 0x84B0, 0x84C0, 0x84E0, 0x8520, 0x85F0, 0x8C10, 0xA380, 0xBDB0, 0xDA90, 0xF5B0, 0x0FE0, 0x27C0, + 0x3D50, 0x5030, 0x5F70, 0x6CA0, 0x7610, 0x7DE0, 0x7EF0, 0x7F10, 0x7F00, 0x7EA0, 0x7F40, 0x7F10, 0x7F10, 0x7F00, 0x7E90, 0x7F30, + 0x7EF0, 0x7EF0, 0x7F10, 0x7F00, 0x7F20, 0x7D40, 0x7590, 0x6E20, 0x66C0, 0x5F80, 0x5870, 0x5030, 0x4920, 0x4210, 0x3B90, 0x35E0, + 0x3080, 0x2BF0, 0x2740, 0x2180, 0x1A10, 0x0FB0, 0x0130, 0xEF70, 0xDAC0, 0xC380, 0xAEC0, 0x9D00, 0x8F30, 0x8870, 0x8630, 0x85B0, + 0x8510, 0x84F0, 0x84C0, 0x84C0, 0x84B0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84B0, 0x84C0, 0x84C0, 0x84D0, 0x84F0, + 0x8510, 0x8530, 0x8580, 0x8610, 0x8730, 0x8990, 0x8CB0, 0x90D0, 0x9420, 0x9770, 0x9B30, 0x9F30, 0xA510, 0xACD0, 0xB630, 0xC250, + 0xD080, 0xE060, 0xF160, 0x0450, 0x1990, 0x2FF0, 0x49D0, 0x6130, 0x76F0, 0x7EE0, 0x7EF0, 0x7F10, 0x7F20, 0x7F60, 0x7ED0, 0x7EE0, + 0x7F10, 0x7F10, 0x7F30, 0x7EE0, 0x7EA0, 0x7EF0, 0x7F10, 0x7F20, 0x7ED0, 0x7EB0, 0x7F00, 0x7F00, 0x7F10, 0x7F10, 0x7EA0, 0x7F00, + 0x7EF0, 0x7F00, 0x7F00, 0x7EC0, 0x7F20, 0x7F00, 0x7F20, 0x7F10, 0x7F10, 0x7F40, 0x7F10, 0x7F10, 0x7F20, 0x7EE0, 0x7F50, 0x7F00, + 0x7F20, 0x7F00, 0x7EF0, 0x7F70, 0x7F00, 0x7F10, 0x7EF0, 0x7EE0, 0x7F60, 0x7EF0, 0x7ED0, 0x7EE0, 0x7ED0, 0x7F60, 0x7F00, 0x7EC0, + 0x7ED0, 0x7ED0, 0x7EF0, 0x7F00, 0x7E90, 0x7EB0, 0x7EC0, 0x7EF0, 0x7F10, 0x7EA0, 0x7EE0, 0x7F00, 0x7F10, 0x7F00, 0x7E90, 0x7ED0, + 0x7F00, 0x7EE0, 0x7EF0, 0x7EC0, 0x7F20, 0x7F20, 0x7F10, 0x7EE0, 0x7EF0, 0x7F10, 0x7EA0, 0x7F00, 0x7F10, 0x7F00, 0x7EE0, 0x7EC0, + 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7EF0, 0x7F40, 0x7F20, 0x7F10, 0x7EF0, 0x7EE0, 0x7F40, 0x7EF0, 0x7F10, 0x7F00, 0x7EF0, 0x7F50, + 0x7F00, 0x7F10, 0x7EF0, 0x7EF0, 0x7F60, 0x7ED0, 0x7EB0, 0x7EE0, 0x7EF0, 0x7F50, 0x7EF0, 0x7EA0, 0x7F00, 0x7F10, 0x7F10, 0x7EE0, + 0x7E90, 0x7EF0, 0x7EE0, 0x7EF0, 0x7EF0, 0x7EB0, 0x7F20, 0x7F00, 0x7F10, 0x7F20, 0x7EC0, 0x7F10, 0x7EF0, 0x7F00, 0x7F00, 0x7EE0, + 0x7F50, 0x7F00, 0x7F10, 0x7F20, 0x7F20, 0x7F60, 0x7F10, 0x7F10, 0x7EF0, 0x7EE0, 0x7F80, 0x7EF0, 0x7F00, 0x7EF0, 0x7F10, 0x7F70, + 0x7F00, 0x7DD0, 0x3C90, 0xFB60, 0xB160, 0x8580, 0x8490, 0x8470, 0x8450, 0x8440, 0x8440, 0x8440, 0x8450, 0x8470, 0x8490, 0x84F0, + 0x9370, 0xD410, 0x0D20, 0x4250, 0x7200, 0x7EA0, 0x7ED0, 0x7F10, 0x7F20, 0x7F20, 0x7EC0, 0x7F10, 0x7F10, 0x7F00, 0x7EF0, 0x7EA0, + 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F00, 0x7F50, 0x7F10, 0x7F10, 0x7F10, 0x7F10, 0x7F30, 0x7EF0, 0x7EF0, 0x7EF0, 0x7F10, 0x7F60, + 0x7F00, 0x7F20, 0x7F00, 0x7F00, 0x7F90, 0x7EF0, 0x7EE0, 0x7EE0, 0x7EF0, 0x7F30, 0x7EE0, 0x7ED0, 0x7F10, 0x7F00, 0x7F40, 0x7ED0, + 0x7E90, 0x7EF0, 0x7EE0, 0x7F30, 0x7EE0, 0x7EA0, 0x7ED0, 0x7F10, 0x7F20, 0x7F20, 0x7E90, 0x7F10, 0x7F00, 0x7F10, 0x7F10, 0x7F00, + 0x7F20, 0x7EF0, 0x7F20, 0x7F20, 0x7F20, 0x7F30, 0x7F00, 0x7F40, 0x7F40, 0x7F10, 0x7F70, 0x7EE0, 0x7EF0, 0x7F10, 0x7EF0, 0x7F80, + 0x7F10, 0x7F20, 0x7F00, 0x7A10, 0x6F90, 0x64F0, 0x5920, 0x4C30, 0x3FB0, 0x32C0, 0x25C0, 0x18C0, 0x0CC0, 0x01C0, 0xF830, 0xF0D0, + 0xEBC0, 0xEA10, 0xEB80, 0xEF50, 0xF770, 0x0040, 0x0C10, 0x18A0, 0x2660, 0x36F0, 0x45B0, 0x54E0, 0x63D0, 0x7110, 0x7C30, 0x7EC0, + 0x7F40, 0x7F10, 0x7F20, 0x7EF0, 0x7F00, 0x7F30, 0x7F20, 0x7F40, 0x7F10, 0x7F00, 0x7F60, 0x7F10, 0x7F20, 0x7F00, 0x7EF0, 0x7F50, + 0x7F00, 0x7F20, 0x7F10, 0x7F10, 0x7F60, 0x7F00, 0x7F10, 0x7F00, 0x7EE0, 0x7F70, 0x7EF0, 0x7EB0, 0x7F00, 0x7F10, 0x7F70, 0x7F00, + 0x7EC0, 0x7F10, 0x7F10, 0x7F20, 0x7EE0, 0x7E90, 0x7EE0, 0x7EF0, 0x7F10, 0x7F10, 0x7EA0, 0x7F10, 0x7F10, 0x7F10, 0x7F20, 0x7E90, + 0x7F10, 0x7EF0, 0x7EF0, 0x7F10, 0x7F00, 0x7F60, 0x7F00, 0x7F10, 0x7F20, 0x7F00, 0x7F50, 0x7F10, 0x7F20, 0x7EF0, 0x7EF0, 0x7F90, + 0x7F20, 0x7F10, 0x7F20, 0x7F00, 0x7F80, 0x7F10, 0x7EF0, 0x7EE0, 0x7EE0, 0x7EF0, 0x7EF0, 0x7EE0, 0x7EF0, 0x7EF0, 0x7F20, 0x7F10, + 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7EF0, 0x7F10, 0x7F20, 0x7F20, 0x7F20, 0x7F10, 0x7F20, 0x7F20, 0x7F40, 0x7F30, 0x7F10, 0x7F20, + 0x7EF0, 0x7F10, 0x7F00, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F20, 0x7F40, 0x7F30, + 0x7F30, 0x7EE0, 0x5370, 0x2A50, 0x02D0, 0xE320, 0xC800, 0xAFF0, 0x9B90, 0x8BE0, 0x8630, 0x8540, 0x84E0, 0x84B0, 0x84A0, 0x8490, + 0x8480, 0x8480, 0x8470, 0x8470, 0x8460, 0x8460, 0x8460, 0x8450, 0x8450, 0x8440, 0x8450, 0x8450, 0x8440, 0x8440, 0x8440, 0x8440, + 0x8440, 0x8440, 0x8440, 0x8470, 0x8440, 0x8440, 0x8450, 0x8440, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, + 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8400, 0x8440, 0x8430, 0x8430, 0x8430, 0x8420, 0x8420, 0x8410, 0x8400, 0x8400, + 0x83F0, 0x83F0, 0x83F0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83F0, 0x83E0, 0x83E0, 0x83F0, + 0x83E0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, + 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8400, 0x8400, 0x8400, 0x83F0, + 0x83F0, 0x83F0, 0x83E0, 0x83E0, 0x83D0, 0x83D0, 0x83D0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83D0, 0x83D0, + 0x83D0, 0x83E0, 0x83D0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83F0, 0x83E0, 0x8390, 0x83F0, 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8400, + 0x8410, 0x8410, 0x8420, 0x8420, 0x8430, 0x8430, 0x8430, 0x8440, 0x8440, 0x8450, 0x8450, 0x8460, 0x8460, 0x8460, 0x8470, 0x8490, + 0x8490, 0x8480, 0x8480, 0x8440, 0x84A0, 0x84A0, 0x84C0, 0x84D0, 0x84F0, 0x8530, 0x85D0, 0x8840, 0x9210, 0xA0C0, 0xB000, 0xC030, + 0xF970, 0x0860, 0x1820, 0x27C0, 0x3700, 0x4740, 0x5600, 0x6530, 0x7400, 0x7E10, 0x7F00, 0x7EE0, 0x7F30, 0x7F30, 0x7F20, 0x7F40, + 0x7F10, 0x7F40, 0x7EF0, 0x7F20, 0x7F40, 0x7F00, 0x7F10, 0x7EF0, 0x7EE0, 0x7EF0, 0x7EF0, 0x7F60, 0x7EF0, 0x7EF0, 0x7F00, 0x7F20, + 0x7F60, 0x7ED0, 0x7EB0, 0x7F00, 0x7F10, 0x7F30, 0x7EE0, 0x7E90, 0x7EF0, 0x7F10, 0x7F20, 0x7F10, 0x7EB0, 0x7F00, 0x7F10, 0x7F10, + 0x7F10, 0x7EA0, 0x7F10, 0x7EF0, 0x7F20, 0x7F00, 0x7EC0, 0x7F30, 0x7F00, 0x7F20, 0x7F10, 0x7F10, 0x7F60, 0x7EE0, 0x7F10, 0x7F20, + 0x7EF0, 0x7F80, 0x7F10, 0x7F20, 0x7F10, 0x7ED0, 0x7F70, 0x7F00, 0x7F10, 0x7EF0, 0x7EE0, 0x7F60, 0x7EF0, 0x7EE0, 0x7EE0, 0x7EE0, + 0x7F70, 0x7F20, 0x7EC0, 0x7ED0, 0x7EB0, 0x7F30, 0x7EF0, 0x7E90, 0x7ED0, 0x7EC0, 0x7EF0, 0x7F10, 0x7EA0, 0x7EE0, 0x7F10, 0x7F10, + 0x7F00, 0x7EC0, 0x7EF0, 0x7F00, 0x7EF0, 0x7EF0, 0x7F00, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F00, 0x7F40, 0x7F10, 0x7F10, 0x7EE0, + 0x7EF0, 0x7F70, 0x7F00, 0x7F20, 0x7F10, 0x7F00, 0x7F60, 0x7EF0, 0x7F10, 0x7F00, 0x7EE0, 0x7F50, 0x7EF0, 0x7EE0, 0x7EF0, 0x7F10, + 0x7F70, 0x7F00, 0x7ED0, 0x7F10, 0x7F00, 0x7F30, 0x7EF0, 0x7EB0, 0x7EE0, 0x7EF0, 0x7F30, 0x7F00, 0x7EC0, 0x7F10, 0x7F10, 0x7F40, + 0x7F00, 0x7EB0, 0x7F00, 0x7EE0, 0x7EF0, 0x7F10, 0x7F00, 0x7F40, 0x7F10, 0x7F20, 0x7F20, 0x7F00, 0x7F30, 0x7F00, 0x7F20, 0x7EF0, + 0x7F10, 0x7F40, 0x7EF0, 0x7F30, 0x7F30, 0x7F00, 0x7F90, 0x7F10, 0x7F10, 0x7EF0, 0x7F20, 0x7F20, 0x7F10, 0x7F90, 0x7730, 0x6600, + 0x5650, 0x47A0, 0x3AE0, 0x3050, 0x2730, 0x1FA0, 0x17E0, 0x0F40, 0x0570, 0xF960, 0xEC70, 0xDE40, 0xCF70, 0xC120, 0xB3A0, 0xA740, + 0x9CC0, 0x9190, 0x8A40, 0x8660, 0x8530, 0x84E0, 0x84C0, 0x84A0, 0x8490, 0x8480, 0x8470, 0x8470, 0x8470, 0x8460, 0x8460, 0x8460, + 0x8460, 0x8460, 0x8460, 0x8460, 0x8450, 0x8450, 0x8440, 0x8440, 0x8440, 0x8430, 0x8430, 0x8430, 0x8420, 0x8420, 0x8410, 0x8410, + 0x8410, 0x8410, 0x8400, 0x8400, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, + 0x83E0, 0x83E0, 0x83E0, 0x83D0, 0x83E0, 0x83E0, 0x83F0, 0x83E0, 0x83E0, 0x83E0, 0x83F0, 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8410, + 0x8420, 0x8430, 0x8430, 0x8440, 0x8450, 0x8460, 0x8470, 0x8490, 0x84A0, 0x84E0, 0x8560, 0x88B0, 0x9A70, 0xACC0, 0xBD40, 0xCB60, + 0xD830, 0xE2A0, 0xEBF0, 0xF360, 0xF980, 0xFED0, 0x0300, 0x0620, 0x08C0, 0x0A30, 0x0C30, 0x0DE0, 0x0ED0, 0x1010, 0x1080, 0x11D0, + 0x11D0, 0x1110, 0x10F0, 0x1000, 0x0F10, 0x0D70, 0x0BE0, 0x0BB0, 0x0AE0, 0x0AC0, 0x0A60, 0x09C0, 0x08F0, 0x0740, 0x0510, 0x0230, + 0xFE60, 0xFA40, 0xF600, 0xF150, 0xEC30, 0xE5E0, 0xDF30, 0xD880, 0xD160, 0xC9D0, 0xC250, 0xBAE0, 0xB2C0, 0xAAB0, 0xA290, 0x99C0, + 0x9250, 0x8C50, 0x8880, 0x8680, 0x8590, 0x8530, 0x8500, 0x84E0, 0x84D0, 0x84B0, 0x84A0, 0x84A0, 0x8490, 0x8480, 0x8480, 0x8460, + 0x8450, 0x8440, 0x8430, 0x8420, 0x8410, 0x8410, 0x8400, 0x8400, 0x83F0, 0x8410, 0x83E0, 0x83E0, 0x83D0, 0x83D0, 0x83D0, 0x83C0, + 0x83C0, 0x83E0, 0x83C0, 0x83C0, 0x83D0, 0x83C0, 0x83D0, 0x83F0, 0x8400, 0x83D0, 0x83E0, 0x8390, 0x83E0, 0x83F0, 0x8400, 0x83F0, + 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8410, 0x8410, 0x8400, 0x8410, 0x8410, 0x8410, 0x8410, 0x8420, 0x8420, 0x8420, 0x8420, + 0x8420, 0x8420, 0x8430, 0x8420, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8440, 0x8440, 0x8440, 0x8450, 0x8450, 0x8450, 0x8450, + 0x8450, 0x8460, 0x8460, 0x8460, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8460, 0x8460, 0x8460, 0x8460, 0x8450, 0x8450, + 0x8450, 0x8450, 0x8450, 0x8450, 0x8440, 0x8440, 0x8430, 0x8430, 0x8430, 0x8420, 0x8420, 0x8410, 0x8410, 0x8410, 0x8400, 0x8400, + 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83E0, 0x83E0, 0x83D0, + 0x83C0, 0x83B0, 0x83B0, 0x83B0, 0x83A0, 0x83A0, 0x83B0, 0x83B0, 0x83B0, 0x83C0, 0x83D0, 0x83D0, 0x83E0, 0x83F0, 0x83F0, 0x83F0, + 0x8420, 0x8400, 0x8410, 0x8420, 0x8420, 0x8430, 0x8440, 0x8450, 0x8450, 0x8460, 0x8470, 0x8480, 0x8480, 0x8480, 0x8480, 0x8490, + 0x8490, 0x8490, 0x8490, 0x8490, 0x8480, 0x8470, 0x8470, 0x8460, 0x8460, 0x8450, 0x8440, 0x8440, 0x8430, 0x8430, 0x8420, 0x8410, + 0x8400, 0x8400, 0x83F0, 0x83F0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, + 0x83E0, 0x83E0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8400, 0x8410, 0x8410, 0x8410, 0x8420, 0x8420, + 0x8430, 0x8430, 0x8460, 0x8440, 0x8440, 0x8440, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8460, 0x8460, 0x8460, 0x8460, + 0x8450, 0x8460, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8460, 0x8460, 0x8460, 0x8470, 0x8470, 0x8470, 0x8480, 0x8470, 0x84A0, + 0x84B0, 0x84D0, 0x8510, 0x8620, 0x9000, 0xA780, 0xBE40, 0xD390, 0xE950, 0xFC10, 0x0C70, 0x1C40, 0x2AE0, 0x37E0, 0x43B0, 0x4EA0, + 0x58C0, 0x6150, 0x6860, 0x6DD0, 0x7280, 0x7610, 0x78B0, 0x7B20, 0x7C40, 0x7D50, 0x7DC0, 0x7E10, 0x7E50, 0x7E90, 0x7EA0, 0x7EC0, + 0x7EB0, 0x7EB0, 0x7E70, 0x7E40, 0x7DF0, 0x7D20, 0x7CA0, 0x7C30, 0x7C30, 0x7C90, 0x7D40, 0x7E40, 0x7F00, 0x7F20, 0x7F20, 0x7EF0, + 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, + 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F00, 0x7F50, 0x7F30, 0x7EF0, 0x7EF0, 0x7EE0, 0x7F30, 0x7F20, 0x7F00, 0x7F00, 0x7EB0, + 0x7F00, 0x7ED0, 0x7F10, 0x7EB0, 0x7EE0, 0x7EF0, 0x7F00, 0x7F20, 0x7F40, 0x7F10, 0x7F60, 0x7F00, 0x7ED0, 0x7EF0, 0x7F00, 0x7F40, + 0x7EF0, 0x7EB0, 0x7EF0, 0x7EF0, 0x7F30, 0x7F20, 0x7EC0, 0x7F40, 0x7F10, 0x7F20, 0x7EE0, 0x7E90, 0x7EF0, 0x7EE0, 0x7EF0, 0x7F10, + 0x7EB0, 0x7F40, 0x7F10, 0x7F10, 0x7F00, 0x7EC0, 0x7C10, 0x71B0, 0x67E0, 0x5F80, 0x56F0, 0x4FE0, 0x49E0, 0x4450, 0x4090, 0x3D60, + 0x3A80, 0x3830, 0x35B0, 0x33E0, 0x3240, 0x2FF0, 0x2E60, 0x2B20, 0x2890, 0x24C0, 0x2040, 0x1C40, 0x1790, 0x12F0, 0x0DF0, 0x0850, + 0x03B0, 0xFEE0, 0xF8F0, 0xF350, 0xEDB0, 0xE900, 0xE4B0, 0xE180, 0xDEA0, 0xDCF0, 0xDD10, 0xDE10, 0xE0A0, 0xE440, 0xE910, 0xEEA0, + 0xF520, 0xFC90, 0x0330, 0x0900, 0x0E50, 0x12D0, 0x16E0, 0x19E0, 0x1CA0, 0x1F70, 0x21C0, 0x2400, 0x25D0, 0x27A0, 0x29F0, 0x3760, + 0x3DB0, 0x4470, 0x4BA0, 0x5410, 0x5B00, 0x6100, 0x6680, 0x6A30, 0x6DA0, 0x6F40, 0x7130, 0x72E0, 0x7460, 0x7740, 0x7A40, 0x7D80, + 0x7EE0, 0x7F00, 0x7EF0, 0x7F10, 0x7F80, 0x7EF0, 0x7F30, 0x7F20, 0x7F00, 0x7F80, 0x7F10, 0x7EF0, 0x7EE0, 0x7EF0, 0x7F70, 0x7EF0, + 0x7EF0, 0x7EF0, 0x7F00, 0x7F60, 0x7F00, 0x7ED0, 0x7EB0, 0x7EE0, 0x7F50, 0x7F10, 0x7E70, 0x7EC0, 0x7ED0, 0x7F10, 0x7F20, 0x7EC0, + 0x7EB0, 0x7F00, 0x7F00, 0x7F10, 0x7E90, 0x7F00, 0x7F00, 0x7EF0, 0x7F10, 0x7EA0, 0x7EF0, 0x7F10, 0x7F20, 0x7F20, 0x7F00, 0x7F30, + 0x7F20, 0x7F20, 0x7F10, 0x7EF0, 0x7F40, 0x7EF0, 0x7F30, 0x7F00, 0x7A40, 0x7610, 0x7290, 0x6E20, 0x69D0, 0x63F0, 0x5CA0, 0x53A0, + 0x4890, 0x3F30, 0x34C0, 0x2A70, 0x1FF0, 0x15A0, 0x0BE0, 0x02D0, 0xF970, 0xF0A0, 0xE7E0, 0xDFA0, 0xB9E0, 0xB030, 0xA5D0, 0x9AA0, + 0x9040, 0x88E0, 0x85E0, 0x8520, 0x84E0, 0x84C0, 0x84A0, 0x8490, 0x8480, 0x8470, 0x8470, 0x8460, 0x8460, 0x8450, 0x8450, 0x8480, + 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8450, 0x8460, 0x8470, 0x8480, 0x8490, 0x84C0, 0x8530, 0x8AF0, + 0xAE50, 0xCF10, 0xEC50, 0x0560, 0x19C0, 0x2950, 0x35C0, 0x3DF0, 0x4550, 0x4C70, 0x5430, 0x5D60, 0x6690, 0x70A0, 0x79E0, 0x7F50, + 0x7F10, 0x7EC0, 0x7EE0, 0x7ED0, 0x7F10, 0x7F00, 0x7EA0, 0x7ED0, 0x7EE0, 0x7EF0, 0x7F10, 0x7EB0, 0x7F00, 0x7F00, 0x7F10, 0x7F10, + 0x7EC0, 0x7F10, 0x7F10, 0x7F00, 0x7EF0, 0x7EC0, 0x7F30, 0x7F20, 0x7F40, 0x7F10, 0x7F00, 0x7F40, 0x7EF0, 0x7F10, 0x7F00, 0x7EE0, + 0x7F50, 0x7F10, 0x7F20, 0x7EF0, 0x7D30, 0x6DF0, 0x5DF0, 0x4CF0, 0x3C30, 0x2A90, 0x18F0, 0x07C0, 0xF560, 0xE540, 0xD5A0, 0xC6B0, + 0xB920, 0xABB0, 0x9E90, 0x9170, 0x88C0, 0x85C0, 0x84F0, 0x84D0, 0x84B0, 0x8490, 0x8490, 0x8480, 0x8470, 0x8460, 0x8460, 0x8450, + 0x8490, 0x8440, 0x8440, 0x8430, 0x8430, 0x8430, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, + 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8450, 0x8410, 0x8410, 0x8410, 0x8410, 0x8420, 0x8420, 0x8400, 0x8420, 0x8420, + 0x8430, 0x8420, 0x8430, 0x8430, 0x8440, 0x8440, 0x8450, 0x8450, 0x84A0, 0x8470, 0x8470, 0x8470, 0x8490, 0x84B0, 0x84D0, 0x8510, + 0x8610, 0x8C40, 0x9F60, 0xB150, 0xC400, 0xD3C0, 0xE330, 0xF180, 0xFE00, 0x09C0, 0x13D0, 0x1C30, 0x22B0, 0x2810, 0x2BD0, 0x2EF0, + 0x32A0, 0x36D0, 0x3CD0, 0x44B0, 0x4EA0, 0x5A50, 0x66A0, 0x71C0, 0x7B50, 0x7EF0, 0x7F60, 0x7EE0, 0x7ED0, 0x7F10, 0x7F20, 0x7F80, + 0x7EF0, 0x7EE0, 0x7F00, 0x7F10, 0x7F30, 0x7EB0, 0x7EA0, 0x7890, 0x6C70, 0x60F0, 0x56C0, 0x4DB0, 0x47A0, 0x43A0, 0x40B0, 0x3F00, + 0x3D00, 0x3A10, 0x3610, 0x31A0, 0x2E60, 0x2A80, 0x28B0, 0x27B0, 0x2860, 0x29E0, 0x2A40, 0x2960, 0x2650, 0x1FF0, 0x18B0, 0x0FE0, + 0x0670, 0xFDD0, 0xF5E0, 0xEE90, 0xE830, 0xE230, 0xDCA0, 0xD690, 0xD080, 0xCA70, 0xC570, 0xC1A0, 0xBEE0, 0xBD40, 0xBDE0, 0xBF80, + 0xC380, 0xC820, 0xCE50, 0xD5B0, 0xDD90, 0xE710, 0xF0B0, 0xFB30, 0x0660, 0x1140, 0x1C80, 0x26E0, 0x30A0, 0x3950, 0x40B0, 0x4740, + 0x4C10, 0x5110, 0x5530, 0x5840, 0x5BC0, 0x5E00, 0x60B0, 0x63C0, 0x65D0, 0x68E0, 0x6B80, 0x6E80, 0x7190, 0x73F0, 0x7670, 0x78C0, + 0x7B00, 0x7CE0, 0x7E40, 0x7F00, 0x7F00, 0x7F10, 0x7F00, 0x7F10, 0x7F10, 0x7F10, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7EF0, + 0x7EB0, 0x7E10, 0x7D40, 0x7C80, 0x7BF0, 0x7B70, 0x7B20, 0x7A90, 0x7A70, 0x7AA0, 0x7B90, 0x7C40, 0x7D70, 0x7E60, 0x7EE0, 0x7F30, + 0x7F30, 0x7F40, 0x7F30, 0x7F00, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F30, 0x7F40, 0x7F30, 0x7F20, 0x7F40, 0x7F40, 0x7F30, 0x7F30, + 0x7F20, 0x7F40, 0x7F50, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F40, 0x7F40, 0x7F10, 0x7F30, 0x7F20, 0x7F50, 0x7F30, 0x7F20, 0x7F20, + 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F20, 0x7F20, 0x7F20, 0x6790, 0x48A0, 0x2A70, 0x0E50, 0xF480, 0xDD60, 0xC6D0, 0xB480, + 0xA360, 0x93C0, 0x8990, 0x85F0, 0x8520, 0x84E0, 0x84C0, 0x84B0, 0x84A0, 0x8490, 0x8490, 0x8490, 0x8480, 0x8480, 0x8480, 0x84C0, + 0x8470, 0x8470, 0x8480, 0x8480, 0x8490, 0x84D0, 0x84B0, 0x84E0, 0x8530, 0x8690, 0x8EB0, 0xA060, 0xB150, 0xC2D0, 0xD4B0, 0xE7B0, + 0xFC30, 0x11E0, 0x29E0, 0x3F70, 0x50E0, 0x5C90, 0x5FB0, 0x5920, 0x46C0, 0x2810, 0xFEF0, 0xCAC0, 0x9860, 0x8530, 0x84B0, 0x8490, + 0x8480, 0x8470, 0x8470, 0x8460, 0x8460, 0x8460, 0x8460, 0x8410, 0x8470, 0x8480, 0x84B0, 0x8520, 0x91E0, 0xBC50, 0xD5C0, 0xE310, + 0xE710, 0xE560, 0xE220, 0xE040, 0xE0D0, 0xE3A0, 0xE780, 0xEA50, 0xEB70, 0xE770, 0xDDD0, 0xCD40, 0xB5B0, 0x98F0, 0x86C0, 0x8500, + 0x84A0, 0x8480, 0x8470, 0x8460, 0x8450, 0x8440, 0x8430, 0x8430, 0x8420, 0x8410, 0x8410, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, + 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8410, 0x8410, 0x8420, 0x8430, 0x8440, 0x8450, 0x8460, 0x8480, + 0x84A0, 0x84D0, 0x8550, 0x8EE0, 0xB030, 0xD000, 0xF050, 0x10E0, 0x3090, 0x4E50, 0x6930, 0x7CA0, 0x7F10, 0x7F00, 0x7EA0, 0x7EF0, + 0x7EF0, 0x7F20, 0x7F20, 0x7EC0, 0x7F10, 0x7F00, 0x7ED0, 0x7EF0, 0x7EA0, 0x7F00, 0x7EF0, 0x7F10, 0x7F20, 0x7F00, 0x7F10, 0x7F20, + 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7EF0, 0x7EF0, 0x7F30, 0x7EE0, 0x7F40, 0x7F10, 0x7F20, 0x7F40, 0x7F10, 0x7F30, 0x7EE0, 0x7EC0, + 0x7EF0, 0x7EF0, 0x7F60, 0x7ED0, 0x7ED0, 0x7F00, 0x7F00, 0x7F50, 0x7ED0, 0x7EC0, 0x7F10, 0x7F10, 0x7F30, 0x7EC0, 0x7E90, 0x7EF0, + 0x7F10, 0x7F20, 0x7ED0, 0x7EB0, 0x7F00, 0x7F00, 0x7F10, 0x7F10, 0x7EC0, 0x7F10, 0x7EF0, 0x7EE0, 0x7F10, 0x7F00, 0x7F30, 0x7F00, + 0x7F10, 0x7F10, 0x7F00, 0x7F60, 0x7EF0, 0x7F10, 0x7EF0, 0x7EF0, 0x7F80, 0x7F10, 0x7F20, 0x7F00, 0x7EF0, 0x7F70, 0x7F00, 0x7F10, + 0x7EF0, 0x7EE0, 0x7F60, 0x7EF0, 0x7EB0, 0x7EE0, 0x7ED0, 0x7F70, 0x7F20, 0x7EC0, 0x7ED0, 0x7EB0, 0x7F10, 0x7EF0, 0x7E90, 0x7EB0, + 0x7EC0, 0x7EF0, 0x7F10, 0x7EA0, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7E90, 0x7F00, 0x7F00, 0x7EF0, 0x7EF0, 0x7F00, 0x7F20, 0x7F20, + 0x7F10, 0x7F20, 0x7F00, 0x7F40, 0x7F10, 0x7F20, 0x7EE0, 0x7EF0, 0x7F50, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7F60, 0x7ED0, 0x7F10, + 0x7EF0, 0x7EE0, 0x7F50, 0x7EE0, 0x7EE0, 0x7EF0, 0x7F10, 0x7F70, 0x7F00, 0x7EC0, 0x7EF0, 0x7F00, 0x7F50, 0x7ED0, 0x7EA0, 0x7EE0, + 0x7EF0, 0x7F30, 0x7F00, 0x7EC0, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7EB0, 0x7F00, 0x7EE0, 0x7EF0, 0x7F30, 0x7F00, 0x7EE0, 0x7F10, + 0x7F10, 0x7F00, 0x7EC0, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F00, 0x7F10, 0x7F20, 0x7F20, 0x7ED0, 0x7F00, 0x7F40, 0x7EB0, 0x7F00, + 0x7F20, 0x7F10, 0x7F10, 0x7F00, 0x7F40, 0x7F00, 0x7F00, 0x7EF0, 0x7F00, 0x7F30, 0x7F20, 0x7F40, 0x7F10, 0x7F00, 0x7F40, 0x7F10, + 0x7F10, 0x7F00, 0x7EF0, 0x7F50, 0x7F00, 0x7F20, 0x7F10, 0x7F10, 0x7F60, 0x7E80, 0x7C90, 0x7A30, 0x77A0, 0x74A0, 0x7150, 0x6DB0, + 0x69F0, 0x6650, 0x6270, 0x5EA0, 0x5A10, 0x55D0, 0x5120, 0x4BB0, 0x46E0, 0x4000, 0x39B0, 0x3290, 0x2AF0, 0x23F0, 0x1D00, 0x15C0, + 0x0EF0, 0x0710, 0xFFB0, 0xF880, 0xF170, 0xEB20, 0xE4F0, 0xDF90, 0xDAC0, 0xD5B0, 0xD1C0, 0xCD30, 0xC970, 0xC5C0, 0xC1D0, 0xBE60, + 0xBA00, 0xB6A0, 0xB2F0, 0xAF60, 0xAB90, 0xA7D0, 0xA450, 0xA0B0, 0x9CC0, 0x9930, 0x9530, 0x9160, 0x8D70, 0x8A50, 0x8860, 0x8700, + 0x8640, 0x85C0, 0x8570, 0x8540, 0x8520, 0x8510, 0x8500, 0x84F0, 0x84F0, 0x84F0, 0x84F0, 0x84F0, 0x84F0, 0x84F0, 0x84F0, 0x84F0, + 0x84F0, 0x84F0, 0x84F0, 0x84F0, 0x84F0, 0x84F0, 0x8520, 0x84D0, 0x84C0, 0x84C0, 0x84C0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, + 0x84A0, 0x84A0, 0x84A0, 0x84B0, 0x84A0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84C0, 0x84D0, 0x84E0, 0x84F0, 0x8520, 0x8580, + 0x8670, 0x8940, 0x9190, 0x9F20, 0xAC70, 0xBAC0, 0xC990, 0xD870, 0xE720, 0xF440, 0x0090, 0x0B80, 0x1670, 0x2050, 0x2850, 0x3000, + 0x3480, 0x35D0, 0x3510, 0x3100, 0x2BA0, 0x24B0, 0x1E50, 0x18A0, 0x1400, 0x1190, 0x1170, 0x13C0, 0x1880, 0x1F90, 0x2800, 0x2F90, + 0x3670, 0x3D40, 0x4260, 0x4650, 0x48F0, 0x4960, 0x48C0, 0x4410, 0x3D20, 0x3440, 0x29B0, 0x1F90, 0x1420, 0x0840, 0xFC10, 0xEF70, + 0xE090, 0xD110, 0xC090, 0xAEE0, 0x9B40, 0x8A60, 0x8550, 0x84D0, 0x84B0, 0x8490, 0x8470, 0x8460, 0x8450, 0x8440, 0x8430, 0x8420, + 0x8410, 0x8410, 0x8400, 0x8400, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8410, 0x8410, 0x8410, 0x8420, + 0x8420, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8440, 0x8440, 0x8460, 0x8450, 0x8460, 0x8470, 0x8470, 0x8480, + 0x84A0, 0x84D0, 0x8550, 0x8C10, 0xAB40, 0xC8B0, 0xE510, 0xFC50, 0x0FB0, 0x1EF0, 0x2AA0, 0x32C0, 0x3790, 0x3A80, 0x3AC0, 0x3960, + 0x3540, 0x2EF0, 0x2610, 0x19B0, 0x0B00, 0xF870, 0xE2F0, 0xCC60, 0xB210, 0x98B0, 0x87D0, 0x8500, 0x84C0, 0x8490, 0x8480, 0x8470, + 0x8450, 0x8450, 0x8440, 0x8430, 0x8420, 0x8420, 0x8410, 0x8410, 0x8410, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, + 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8420, 0x8420, 0x8420, 0x8420, 0x8430, 0x8430, 0x8430, 0x8440, 0x8440, 0x8450, + 0x8450, 0x8460, 0x8460, 0x8470, 0x8470, 0x8480, 0x8490, 0x8490, 0x8490, 0x84A0, 0x84A0, 0x8490, 0x84A0, 0x8490, 0x8490, 0x8480, + 0x84A0, 0x8480, 0x8470, 0x8470, 0x8460, 0x8460, 0x8450, 0x8450, 0x8440, 0x8440, 0x8430, 0x8430, 0x8430, 0x8420, 0x8420, 0x8420, + 0x8420, 0x8420, 0x8420, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8450, 0x8440, + 0x8440, 0x8460, 0x8450, 0x8450, 0x8450, 0x8460, 0x8460, 0x8460, 0x8470, 0x8470, 0x8470, 0x8480, 0x8480, 0x8480, 0x8480, 0x8480, + 0x8480, 0x8480, 0x8480, 0x8480, 0x8470, 0x8470, 0x8470, 0x8470, 0x8470, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8450, 0x8460, + 0x8450, 0x8450, 0x8450, 0x8450, 0x8480, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8440, + 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, + 0x8440, 0x8440, 0x8490, 0x8450, 0x8450, 0x8450, 0x8450, 0x8450, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, + 0x8450, 0x8450, 0x8450, 0x8450, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, + 0x8440, 0x8440, 0x8460, 0x8440, 0x8440, 0x8450, 0x8450, 0x8450, 0x8460, 0x8460, 0x8460, 0x8470, 0x8480, 0x8480, 0x8490, 0x8490, + 0x84B0, 0x84D0, 0x84F0, 0x8540, 0x8630, 0x8960, 0x9230, 0x9DB0, 0xA810, 0xB270, 0xBBD0, 0xC560, 0xCE70, 0xD8C0, 0xE260, 0xEBD0, + 0xF5C0, 0xFE90, 0x0690, 0x0CB0, 0x1130, 0x1560, 0x1930, 0x1D70, 0x21C0, 0x2570, 0x2980, 0x2D60, 0x3140, 0x33B0, 0x3510, 0x3620, + 0x3500, 0x3270, 0x2DA0, 0x26C0, 0x1E90, 0x1400, 0x0800, 0xFB40, 0xEB80, 0xDD90, 0xCF10, 0xC0E0, 0xB3A0, 0xA700, 0x9B50, 0x90A0, + 0x8900, 0x85C0, 0x8500, 0x84C0, 0x84A0, 0x8480, 0x8470, 0x8460, 0x8450, 0x8440, 0x8430, 0x8430, 0x8420, 0x8410, 0x8400, 0x8400, + 0x8400, 0x83F0, 0x83F0, 0x83F0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83E0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, + 0x83D0, 0x83E0, 0x83E0, 0x83E0, 0x83F0, 0x8400, 0x8400, 0x8410, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, + 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x83F0, 0x8400, 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, + 0x8400, 0x83C0, 0x8410, 0x8410, 0x8410, 0x8440, 0x8410, 0x8410, 0x8410, 0x8420, 0x8420, 0x8420, 0x8440, 0x8430, 0x8440, 0x8450, + 0x8450, 0x8460, 0x8470, 0x8470, 0x8490, 0x84A0, 0x84C0, 0x8500, 0x85C0, 0x8730, 0x8B90, 0x9360, 0x9A90, 0xA260, 0xAB90, 0xB6D0, + 0xC420, 0xD270, 0xE120, 0xEEF0, 0xFB60, 0x03C0, 0x0810, 0x0770, 0x0360, 0xFBE0, 0xF1B0, 0xE570, 0xD790, 0xC890, 0xBF00, 0xBDF0, + 0xCA50, 0xE430, 0x0B90, 0x39A0, 0x66C0, 0x7EF0, 0x7EA0, 0x7EC0, 0x7EC0, 0x7F10, 0x7F20, 0x7EC0, 0x7F10, 0x7F10, 0x7F00, 0x7F10, + 0x7EA0, 0x7F00, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7F60, 0x7F10, 0x7F20, 0x7F10, 0x7F10, 0x7F30, 0x7EF0, 0x7F00, 0x7EF0, 0x7F00, + 0x7F60, 0x7EF0, 0x7F20, 0x7F00, 0x7F00, 0x7F90, 0x7EF0, 0x7EE0, 0x7EE0, 0x7EF0, 0x7F60, 0x7EE0, 0x7ED0, 0x7F10, 0x7F00, 0x7F40, + 0x7EC0, 0x7E90, 0x7EF0, 0x7EF0, 0x7F00, 0x7F00, 0x7F50, 0x7ED0, 0x7E70, 0x7EF0, 0x7F10, 0x7F20, 0x7F00, 0x7EC0, 0x7F10, 0x7EF0, + 0x7EE0, 0x7EF0, 0x7EA0, 0x7EE0, 0x7EF0, 0x7F10, 0x7F20, 0x7F00, 0x7F40, 0x7EF0, 0x7F00, 0x7F10, 0x7F00, 0x7F30, 0x7EE0, 0x7EF0, + 0x7F30, 0x7F10, 0x7F60, 0x7F10, 0x7F20, 0x7F20, 0x7EF0, 0x7F70, 0x7EF0, 0x7EE0, 0x7EF0, 0x7EF0, 0x7F60, 0x7EF0, 0x7F10, 0x7F00, + 0x7F00, 0x7F50, 0x7F10, 0x7EA0, 0x7EC0, 0x7ED0, 0x7F30, 0x7EE0, 0x7E90, 0x7ED0, 0x7EE0, 0x7F20, 0x7F10, 0x7ED0, 0x7EF0, 0x7EE0, + 0x7EF0, 0x7ED0, 0x7EA0, 0x7F00, 0x7F10, 0x7F10, 0x7EE0, 0x7E90, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7EC0, 0x7F10, 0x7F10, 0x7F20, + 0x7F40, 0x7EB0, 0x7F20, 0x7F10, 0x7F10, 0x7F10, 0x7EE0, 0x7F50, 0x7EF0, 0x7F20, 0x7F20, 0x7EF0, 0x7F80, 0x7F10, 0x7F20, 0x7F10, + 0x7EF0, 0x7F70, 0x7F00, 0x7F10, 0x7EF0, 0x7EE0, 0x7F60, 0x7F10, 0x7D30, 0x6860, 0x56E0, 0x4670, 0x3700, 0x29F0, 0x1EF0, 0x1430, + 0x09B0, 0x0040, 0xF740, 0xEF10, 0xE720, 0xDF70, 0xD9E0, 0xD460, 0xD0A0, 0xCCD0, 0xC970, 0xC620, 0xC2C0, 0xBEC0, 0xB9E0, 0xB4E0, + 0xB040, 0xAB20, 0xA6F0, 0xA460, 0xA270, 0xA2D0, 0xA3A0, 0xA630, 0xAA30, 0xAF90, 0xB700, 0xC180, 0xCEF0, 0xDF80, 0xF340, 0x0A40, + 0x24C0, 0x3EC0, 0x5690, 0x6990, 0x77E0, 0x7E70, 0x7F70, 0x7EF0, 0x7EE0, 0x7EF0, 0x7F10, 0x7F70, 0x7F00, 0x7ED0, 0x7F10, 0x7F00, + 0x7F30, 0x7ED0, 0x7EB0, 0x7EE0, 0x7EF0, 0x7F30, 0x7F00, 0x7EA0, 0x7F10, 0x7E10, 0x6C70, 0x5D90, 0x5200, 0x4890, 0x4260, 0x3E50, + 0x3D50, 0x3E10, 0x4140, 0x4560, 0x4A00, 0x4F40, 0x5340, 0x5590, 0x5630, 0x5470, 0x5260, 0x4F50, 0x4C30, 0x49F0, 0x48F0, 0x4A10, + 0x4BC0, 0x4DE0, 0x5110, 0x5370, 0x56A0, 0x5940, 0x5CB0, 0x6070, 0x6540, 0x6B10, 0x70F0, 0x7740, 0x7CC0, 0x7E90, 0x7EB0, 0x7EF0, + 0x7F50, 0x7F10, 0x7E70, 0x7EC0, 0x7ED0, 0x7F10, 0x7F20, 0x7EC0, 0x7ED0, 0x7F00, 0x7F00, 0x7010, 0x5E00, 0x4B20, 0x3900, 0x2850, + 0x1C90, 0x1340, 0x0F40, 0x0E90, 0x1120, 0x1600, 0x1BD0, 0x22B0, 0x2960, 0x2E60, 0x31B0, 0x3270, 0x30C0, 0x2D50, 0x2A10, 0x2860, + 0x2960, 0x2D90, 0x37F0, 0x4900, 0x5D50, 0x7200, 0x7F20, 0x7EE0, 0x7EF0, 0x7F10, 0x7F20, 0x7F60, 0x7F00, 0x7F00, 0x7F00, 0x7ED0, + 0x7F30, 0x7EE0, 0x7EA0, 0x7EF0, 0x7F10, 0x7F40, 0x7ED0, 0x7EB0, 0x7F00, 0x7F00, 0x7F10, 0x7E90, 0x7EA0, 0x7F00, 0x7F10, 0x7F20, + 0x7EE0, 0x7EC0, 0x7F10, 0x7F20, 0x7F20, 0x7F40, 0x7F10, 0x7F20, 0x7F10, 0x7F20, 0x7EF0, 0x7EF0, 0x7F10, 0x7EF0, 0x7F30, 0x7F20, + 0x7F00, 0x7590, 0x6B50, 0x61F0, 0x5AE0, 0x57C0, 0x5A10, 0x6170, 0x6C60, 0x7890, 0x7EF0, 0x7F20, 0x7F20, 0x7F20, 0x7F10, 0x7F20, + 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, + 0x7F30, 0x7F20, 0x7200, 0x6030, 0x4F20, 0x3F70, 0x32A0, 0x28D0, 0x2130, 0x1C60, 0x1970, 0x18B0, 0x1A10, 0x1D30, 0x2350, 0x2C30, + 0x3860, 0x4760, 0x57A0, 0x68C0, 0x7660, 0x7E80, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F10, 0x7F30, 0x7F20, + 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F10, 0x7F20, 0x7F40, 0x7F40, 0x7F30, 0x7EC0, + 0x7210, 0x63F0, 0x5470, 0x4480, 0x34E0, 0x2530, 0x1660, 0x07B0, 0xFB50, 0xF080, 0xE650, 0xDD70, 0xD550, 0xCD60, 0xC560, 0xBD70, + 0xB480, 0xABA0, 0xA1C0, 0x9630, 0x8B30, 0x8620, 0x8500, 0x84C0, 0x84B0, 0x8480, 0x8470, 0x8470, 0x8460, 0x8460, 0x8460, 0x8450, + 0x8450, 0x8440, 0x8430, 0x8420, 0x8420, 0x8410, 0x8410, 0x8410, 0x8410, 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8410, 0x8430, + 0x8420, 0x8420, 0x8420, 0x8420, 0x8420, 0x8410, 0x8410, 0x8410, 0x8410, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x83F0, 0x83F0, + 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x8410, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x8400, 0x8400, + 0x83F0, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8410, 0x8410, 0x8420, 0x8420, 0x8430, 0x8440, 0x8440, 0x8450, 0x8460, 0x8460, + 0x8470, 0x8470, 0x8470, 0x8480, 0x8480, 0x8490, 0x8490, 0x8490, 0x8490, 0x8490, 0x84A0, 0x84A0, 0x84B0, 0x84C0, 0x84C0, 0x84D0, + 0x84E0, 0x84F0, 0x8510, 0x8510, 0x8520, 0x8520, 0x8520, 0x8540, 0x8570, 0x8620, 0x8830, 0x8F00, 0x99A0, 0x9F60, 0xA220, 0xA020, + 0x9C50, 0x96C0, 0x9190, 0x8D80, 0x8B00, 0x89D0, 0x8990, 0x89C0, 0x8AF0, 0x8D30, 0x92A0, 0x9B90, 0xA6F0, 0xB5B0, 0xC700, 0xD7F0, + 0xE850, 0xF830, 0x0670, 0x1390, 0x1FF0, 0x2CE0, 0x38C0, 0x4690, 0x52C0, 0x5E40, 0x68B0, 0x71B0, 0x7970, 0x7E40, 0x7F50, 0x7F20, + 0x7EF0, 0x7EF0, 0x7F00, 0x7F60, 0x7F10, 0x7E90, 0x7EB0, 0x7EC0, 0x7EF0, 0x7F10, 0x7E70, 0x7EC0, 0x7ED0, 0x7F10, 0x7F20, 0x7EC0, + 0x7F10, 0x7F10, 0x7F10, 0x7F10, 0x7EB0, 0x7F00, 0x7F00, 0x7EF0, 0x7F10, 0x7F00, 0x7F40, 0x7F30, 0x7E00, 0x7540, 0x6B10, 0x5FF0, + 0x5360, 0x44C0, 0x35F0, 0x2520, 0x1240, 0xFF50, 0xEAB0, 0xD670, 0xC070, 0xAA80, 0x9450, 0x8750, 0x8510, 0x84D0, 0x84A0, 0x8490, + 0x8480, 0x8470, 0x8460, 0x8450, 0x8440, 0x8440, 0x8430, 0x8420, 0x8420, 0x8410, 0x8400, 0x8400, 0x83F0, 0x83E0, 0x8400, 0x83D0, + 0x83C0, 0x83D0, 0x83C0, 0x83B0, 0x83B0, 0x83E0, 0x83B0, 0x83C0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83C0, 0x83F0, 0x83C0, + 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83C0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83C0, 0x83B0, 0x83A0, 0x83B0, + 0x83A0, 0x83A0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83B0, 0x83C0, 0x83C0, 0x83C0, 0x83D0, 0x83E0, 0x83E0, 0x83F0, 0x83F0, + 0x8400, 0x8410, 0x8410, 0x8420, 0x8430, 0x8430, 0x8440, 0x8450, 0x8460, 0x8470, 0x8480, 0x8490, 0x84B0, 0x84D0, 0x8520, 0x8640, + 0x8C30, 0x9C40, 0xAA60, 0xB710, 0xC240, 0xEB00, 0xF3D0, 0xFBF0, 0x0380, 0x0C40, 0x1530, 0x1F60, 0x2A30, 0x3590, 0x4310, 0x5160, + 0x5FF0, 0x6E30, 0x7AB0, 0x7F00, 0x7F10, 0x7F60, 0x7F00, 0x7F00, 0x7F10, 0x7F10, 0x7F60, 0x7EE0, 0x7E90, 0x7F10, 0x7EF0, 0x7F70, + 0x7F00, 0x7EA0, 0x7F00, 0x7F10, 0x7F20, 0x7EE0, 0x7EA0, 0x7EF0, 0x7F00, 0x7EF0, 0x7EF0, 0x7EB0, 0x7F20, 0x7F00, 0x7F10, 0x7F10, + 0x7EC0, 0x7F10, 0x7F10, 0x7F00, 0x7F20, 0x7EF0, 0x7F50, 0x7F20, 0x7F40, 0x7F30, 0x7F20, 0x7F60, 0x7F10, 0x7F10, 0x7F10, 0x7EE0, + 0x7F80, 0x7F10, 0x7F20, 0x7EF0, 0x7F10, 0x7F70, 0x7F00, 0x7EF0, 0x7EF0, 0x7EE0, 0x7F40, 0x7F10, 0x7EE0, 0x7EE0, 0x7ED0, 0x7F50, + 0x7F20, 0x7EC0, 0x7ED0, 0x7ED0, 0x7F40, 0x7F10, 0x7E90, 0x7EB0, 0x7EE0, 0x7EF0, 0x7F10, 0x7EA0, 0x7F00, 0x7E90, 0x7F10, 0x7F20, + 0x7EC0, 0x7F10, 0x7F10, 0x7F00, 0x7EF0, 0x7EF0, 0x7F00, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7F60, 0x7F10, 0x7F10, 0x7EF0, 0x7F10, + 0x7F30, 0x7EF0, 0x7F00, 0x7EF0, 0x7F10, 0x7F60, 0x7F00, 0x7EF0, 0x7F20, 0x7F10, 0x7F90, 0x7EF0, 0x7EE0, 0x7EE0, 0x7EF0, 0x7F30, + 0x7F00, 0x7ED0, 0x7A80, 0x6A20, 0x5970, 0x4850, 0x3630, 0x23E0, 0x1140, 0xFE30, 0xE9B0, 0xD640, 0x8E50, 0x8670, 0x8500, 0x84D0, + 0x84B0, 0x84A0, 0x84B0, 0x8480, 0x8470, 0x8470, 0x8470, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8470, + 0x8460, 0x8460, 0x8470, 0x8460, 0x8470, 0x8470, 0x84A0, 0x8470, 0x8480, 0x8480, 0x84B0, 0x84A0, 0x84A0, 0x84A0, 0x84B0, 0x84B0, + 0x84C0, 0x84B0, 0x84B0, 0x84B0, 0x84C0, 0x84B0, 0x84B0, 0x84C0, 0x84B0, 0x84C0, 0x84C0, 0x84C0, 0x84D0, 0x84D0, 0x84E0, 0x8530, + 0x8520, 0x8570, 0x8630, 0x87A0, 0x8B70, 0x9260, 0x9AC0, 0xA240, 0xA9B0, 0xB2A0, 0xBA20, 0xC1F0, 0xC960, 0xD060, 0xD810, 0xE000, + 0xE8A0, 0xF1A0, 0xFBF0, 0x06E0, 0x1240, 0x1ED0, 0x2C30, 0x3A60, 0x4AC0, 0x5A50, 0x6970, 0x77C0, 0x7EF0, 0x7F10, 0x7F00, 0x7F60, + 0x7EF0, 0x7F30, 0x7F20, 0x7F00, 0x7F90, 0x7F00, 0x7F40, 0x7F10, 0x7EF0, 0x7F70, 0x7EE0, 0x7EF0, 0x7EF0, 0x7F00, 0x7F50, 0x7F10, + 0x7EE0, 0x7F00, 0x7EF0, 0x7F30, 0x7F00, 0x7E70, 0x7ED0, 0x7EB0, 0x7F20, 0x7EF0, 0x7E90, 0x7EB0, 0x7F00, 0x7F10, 0x7F10, 0x7EA0, + 0x7ED0, 0x7F10, 0x7F10, 0x7F00, 0x7EC0, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F00, 0x7F20, 0x7F40, 0x7F10, 0x7F10, 0x7F00, 0x7F60, + 0x7EF0, 0x7F20, 0x7EF0, 0x7EF0, 0x7F70, 0x7F00, 0x7F40, 0x7F10, 0x7F10, 0x7F00, 0x7F10, 0x7F20, 0x7F00, 0x7F10, 0x7EF0, 0x7F00, + 0x7F00, 0x7F10, 0x7F10, 0x7EF0, 0x7F20, 0x7EF0, 0x7F10, 0x7F20, 0x7F00, 0x7F40, 0x7F20, 0x7F20, 0x7F10, 0x7EF0, 0x7F00, 0x7F30, + 0x7F10, 0x7F30, 0x7F30, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F40, 0x7F20, 0x7F20, 0x7F30, + 0x7F30, 0x7F40, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F50, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F20, + 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F10, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F10, 0x7F10, 0x7F20, + 0x7F10, 0x7F10, 0x7F00, 0x7F00, 0x7F10, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F30, 0x7F20, 0x7F40, + 0x7F30, 0x7F30, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F30, + 0x7F20, 0x7F20, 0x7F40, 0x7F10, 0x7F20, 0x7F40, 0x7F30, 0x7F20, 0x7EE0, 0x7F10, 0x7F30, 0x7F30, 0x7F20, 0x7EF0, 0x7F30, 0x7F20, + 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F40, 0x7F30, 0x7460, 0x5E10, 0x42A0, 0x2420, 0x02E0, 0xDFC0, 0xBB80, 0x9760, 0x8580, + 0x84C0, 0x8490, 0x8470, 0x8460, 0x8450, 0x8440, 0x8430, 0x8430, 0x8410, 0x8410, 0x8420, 0x8400, 0x83F0, 0x83F0, 0x83F0, 0x83E0, + 0x83E0, 0x83E0, 0x83E0, 0x8410, 0x83E0, 0x83E0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83E0, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, + 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8410, 0x83F0, 0x83F0, 0x83F0, 0x83F0, + 0x83E0, 0x83F0, 0x83E0, 0x83D0, 0x83D0, 0x83D0, 0x83C0, 0x83C0, 0x83B0, 0x83B0, 0x83A0, 0x83A0, 0x83A0, 0x8390, 0x8390, 0x8380, + 0x8390, 0x8390, 0x83A0, 0x83A0, 0x83A0, 0x83A0, 0x83B0, 0x83C0, 0x83C0, 0x83D0, 0x83E0, 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8400, + 0x8410, 0x8410, 0x8420, 0x8430, 0x8430, 0x8440, 0x8440, 0x8450, 0x8450, 0x8450, 0x8460, 0x8460, 0x8470, 0x8480, 0x8490, 0x84A0, + 0x84D0, 0x8570, 0x92F0, 0xB400, 0xD110, 0xE9B0, 0xFDC0, 0x0DB0, 0x1AB0, 0x26A0, 0x3260, 0x3FF0, 0x4F00, 0x5E00, 0x6CF0, 0x7A30, + 0x7F00, 0x7F20, 0x7F00, 0x7F50, 0x7EF0, 0x7F10, 0x7F30, 0x7F20, 0x7F60, 0x7F10, 0x7F10, 0x7EF0, 0x62A0, 0x3C70, 0x1460, 0xE820, + 0xB980, 0x8C80, 0x84E0, 0x84A0, 0x8480, 0x8470, 0x8460, 0x8460, 0x8460, 0x8460, 0x8460, 0x8470, 0x8470, 0x8470, 0x8490, 0x84B0, + 0x84F0, 0x8880, 0xB970, 0xEC10, 0x1C00, 0x46A0, 0x6800, 0x7E00, 0x7EA0, 0x7ED0, 0x7EB0, 0x7F20, 0x7F10, 0x7E90, 0x7F10, 0x7F00, + 0x7EF0, 0x7F10, 0x7EA0, 0x7F00, 0x7F10, 0x7F20, 0x7F20, 0x7F00, 0x7F50, 0x7F10, 0x7F20, 0x7F10, 0x7F10, 0x7F60, 0x7EF0, 0x7F10, + 0x7F10, 0x7F00, 0x7F60, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F70, 0x7EE0, 0x7EC0, 0x7EF0, 0x7F10, 0x7F60, 0x7ED0, 0x7ED0, 0x7F00, + 0x7F00, 0x7F10, 0x7EB0, 0x7E70, 0x7EE0, 0x7EF0, 0x7F30, 0x7EC0, 0x7E90, 0x7F10, 0x7F00, 0x7F00, 0x7F10, 0x7EB0, 0x7F00, 0x7F10, + 0x7F10, 0x7F00, 0x7EC0, 0x7F10, 0x7F10, 0x7F20, 0x7F40, 0x7F00, 0x7F20, 0x7F00, 0x7F10, 0x7F10, 0x7EF0, 0x7F60, 0x7EF0, 0x7F10, + 0x7EF0, 0x7EF0, 0x7F80, 0x7F00, 0x7F20, 0x7EF0, 0x7EF0, 0x7F60, 0x7EE0, 0x7F10, 0x7EE0, 0x7EE0, 0x7F50, 0x7F10, 0x7EB0, 0x7EE0, + 0x7ED0, 0x7F10, 0x7F00, 0x7EC0, 0x7EB0, 0x7EB0, 0x7EF0, 0x7F00, 0x7F60, 0x7F10, 0x7EB0, 0x7EB0, 0x7EC0, 0x7EF0, 0x7F10, 0x7EA0, + 0x7ED0, 0x7ED0, 0x7F00, 0x7EE0, 0x7E90, 0x7F00, 0x7F20, 0x7F20, 0x7F10, 0x7EA0, 0x7F00, 0x7F10, 0x7F10, 0x7F00, 0x7EE0, 0x7F40, + 0x7F10, 0x7F20, 0x7EF0, 0x7F00, 0x7F60, 0x7F20, 0x7F10, 0x7F10, 0x7EF0, 0x7F40, 0x7EF0, 0x7F10, 0x7EE0, 0x7EF0, 0x7F50, 0x7F00, + 0x7F00, 0x7F10, 0x7F10, 0x7F30, 0x7EF0, 0x7ED0, 0x7EF0, 0x7EE0, 0x7F50, 0x7ED0, 0x7EA0, 0x7F00, 0x7F10, 0x7F30, 0x7EE0, 0x7EC0, + 0x7EF0, 0x7F00, 0x7EF0, 0x7EF0, 0x7EB0, 0x7F20, 0x7EF0, 0x7F10, 0x7F20, 0x7EC0, 0x7F40, 0x7F10, 0x7F10, 0x7F20, 0x7EF0, 0x7F20, + 0x7EE0, 0x7EF0, 0x7F30, 0x7F20, 0x7F60, 0x7F10, 0x7F10, 0x7C30, 0x6F60, 0x63F0, 0x5930, 0x4E20, 0x4440, 0x3A10, 0x2FF0, 0x26E0, + 0x1CE0, 0x1380, 0x0A00, 0x0140, 0xF8D0, 0xF030, 0xE860, 0xE0D0, 0xD990, 0xD400, 0xCE90, 0xCAB0, 0xC7D0, 0xC660, 0xC680, 0xC7D0, + 0xCA80, 0xCD10, 0xD0C0, 0xD570, 0xD920, 0xDCC0, 0xDF70, 0xE020, 0xDFE0, 0xDCC0, 0xD7D0, 0xD060, 0xC4E0, 0xB810, 0xA730, 0x93E0, + 0x8710, 0x84F0, 0x84B0, 0x8480, 0x8470, 0x8450, 0x8430, 0x8420, 0x8410, 0x83F0, 0x83F0, 0x83D0, 0x83D0, 0x83C0, 0x83C0, 0x83C0, + 0x83C0, 0x83C0, 0x83C0, 0x83D0, 0x83D0, 0x83D0, 0x83D0, 0x83E0, 0x83E0, 0x83E0, 0x83F0, 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8400, + 0x8410, 0x8410, 0x8410, 0x8420, 0x8430, 0x8430, 0x8440, 0x8440, 0x8450, 0x8460, 0x8470, 0x8480, 0x8490, 0x84B0, 0x84C0, 0x84E0, + 0x8520, 0x8580, 0x8690, 0x8890, 0x8C50, 0x9140, 0x96C0, 0x9C20, 0xA150, 0xA640, 0xAB20, 0xB050, 0xB510, 0xB980, 0xBE10, 0xC320, + 0xC800, 0xCDC0, 0xD310, 0xD960, 0xE0C0, 0xE890, 0xF150, 0xFAB0, 0x0520, 0x10D0, 0x1C70, 0x29A0, 0x3720, 0x4670, 0x54C0, 0x62C0, + 0x7090, 0x7C10, 0x7F00, 0x7EF0, 0x7E90, 0x7F00, 0x7ED0, 0x7F10, 0x7F20, 0x7EA0, 0x7F00, 0x7F10, 0x7F30, 0x7EE0, 0x7EA0, 0x7EF0, + 0x7F10, 0x7F20, 0x7F10, 0x7E90, 0x7F00, 0x7EF0, 0x7F10, 0x7F20, 0x7F00, 0x7F10, 0x7EE0, 0x7EF0, 0x7F30, 0x7F20, 0x7F60, 0x7F10, + 0x7F10, 0x7F10, 0x7F00, 0x7F50, 0x7EF0, 0x7F20, 0x7EF0, 0x7EF0, 0x7F80, 0x7F00, 0x7F00, 0x7F10, 0x7F00, 0x7F70, 0x7F10, 0x7EB0, + 0x7EE0, 0x7ED0, 0x7F50, 0x7F20, 0x7ED0, 0x7ED0, 0x7EE0, 0x7F30, 0x7F10, 0x7E90, 0x7EB0, 0x7EE0, 0x7EF0, 0x7F10, 0x7E70, 0x7EC0, + 0x7F10, 0x7F20, 0x7F20, 0x7EC0, 0x7F10, 0x7F10, 0x7F20, 0x7F10, 0x7EB0, 0x7F20, 0x7F00, 0x7F10, 0x7F20, 0x7F10, 0x7F10, 0x7F00, + 0x7EF0, 0x7EF0, 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F20, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F20, 0x7EF0, 0x7F10, 0x7F20, + 0x7F10, 0x7F10, 0x7F10, 0x7F20, 0x7F40, 0x7F30, 0x7F30, 0x7F00, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F10, 0x7F30, 0x7F20, 0x7F40, + 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F50, 0x7F30, 0x7F30, 0x7F30, 0x7F30, 0x7F30, 0x7F30, 0x7F40, 0x7F40, 0x7F30, + 0x75F0, 0x6AC0, 0x6080, 0x5750, 0x5100, 0x4BD0, 0x4710, 0x41D0, 0x3BC0, 0x34C0, 0x2CD0, 0x24A0, 0x1B50, 0x1300, 0x0B10, 0x0400, + 0xFD80, 0xF790, 0xF270, 0xEDD0, 0xEA10, 0xE6D0, 0xE460, 0xE250, 0xE0F0, 0xDF30, 0xDD50, 0xDB60, 0xD8A0, 0xD490, 0xCDF0, 0xC5A0, + 0xBAD0, 0xAD50, 0x9D00, 0x8C90, 0x85F0, 0x84F0, 0x84B0, 0x8490, 0x8480, 0x8470, 0x8460, 0x8450, 0x8450, 0x8440, 0x8430, 0x8430, + 0x8420, 0x8420, 0x8410, 0x8400, 0x8410, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, + 0x8410, 0x8410, 0x8430, 0x8420, 0x8430, 0x8430, 0x8430, 0x8440, 0x8440, 0x8460, 0x8460, 0x8460, 0x84A0, 0x8480, 0x84B0, 0x8490, + 0x84B0, 0x84C0, 0x84E0, 0x8510, 0x85D0, 0x8840, 0x9170, 0x9F60, 0xAC30, 0xB920, 0xC600, 0xD2A0, 0xDF50, 0xED00, 0xF9A0, 0x0650, + 0x12F0, 0x1F70, 0x2BF0, 0x37E0, 0x4350, 0x4EF0, 0x5A40, 0x6550, 0x6F30, 0x7870, 0x7EA0, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F30, + 0x7F30, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7F10, 0x7F20, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7F20, 0x7F40, 0x7F50, + 0x7F30, 0x7FC0, 0x7F40, 0x7EF0, 0x7EF0, 0x7EF0, 0x7EF0, 0x7F30, 0x7E90, 0x7F00, 0x7EF0, 0x7F30, 0x7F00, 0x7EA0, 0x7EC0, 0x7EF0, + 0x7F10, 0x7EF0, 0x7E90, 0x7EB0, 0x7EE0, 0x7EF0, 0x7F10, 0x7EA0, 0x7F40, 0x7F10, 0x7F10, 0x7EF0, 0x7E90, 0x7F10, 0x7EE0, 0x7EE0, + 0x7EF0, 0x7F00, 0x7F30, 0x7F00, 0x7F10, 0x7F20, 0x7F00, 0x7F40, 0x7F10, 0x7F20, 0x7EE0, 0x7EF0, 0x7F10, 0x7F00, 0x7EF0, 0x7F30, + 0x7F00, 0x7F40, 0x7EF0, 0x7F10, 0x7F20, 0x7EE0, 0x7F40, 0x7EE0, 0x7F00, 0x7EF0, 0x7F10, 0x7F70, 0x7F00, 0x7EC0, 0x7EF0, 0x7EF0, + 0x7F70, 0x7ED0, 0x7EA0, 0x7EE0, 0x7EF0, 0x7F10, 0x7F00, 0x7EC0, 0x7F10, 0x7F10, 0x7F20, 0x7F10, 0x7EB0, 0x7F10, 0x7EE0, 0x7EF0, + 0x7F10, 0x7F00, 0x7EF0, 0x7F10, 0x7F20, 0x7F20, 0x7F00, 0x7F50, 0x7EF0, 0x7F20, 0x7EF0, 0x7F00, 0x7F60, 0x7EF0, 0x7F10, 0x7F20, + 0x7F20, 0x7F80, 0x7F10, 0x7EF0, 0x7F10, 0x7F10, 0x7F70, 0x7EF0, 0x7EE0, 0x7EF0, 0x7EF0, 0x7F60, 0x7F20, 0x6C80, 0x5570, 0x3F10, + 0x2BF0, 0x1DB0, 0x12E0, 0x0CA0, 0x0890, 0x0600, 0x0370, 0x0090, 0xFE00, 0xFB20, 0xF900, 0xF870, 0xFAB0, 0xFFA0, 0x06C0, 0x1050, + 0x1B20, 0x2680, 0x3230, 0x3D30, 0x46E0, 0x5060, 0x57C0, 0x5EB0, 0x6400, 0x6850, 0x6D30, 0x7160, 0x75C0, 0x7A10, 0x7DE0, 0x7F00, + 0x7F00, 0x7F70, 0x7F20, 0x7F40, 0x7ED0, 0x7F10, 0x7F60, 0x7EE0, 0x7ED0, 0x7F10, 0x7EF0, 0x7F50, 0x7F00, 0x7EE0, 0x7F00, 0x7D80, + 0x77F0, 0x7270, 0x6CE0, 0x6830, 0x64B0, 0x61F0, 0x5FF0, 0x5CF0, 0x59E0, 0x5540, 0x4E50, 0x4710, 0x3CC0, 0x32D0, 0x2780, 0x1BB0, + 0x1040, 0x0580, 0xFB90, 0xF3D0, 0xEE20, 0xEB30, 0xEB00, 0xEC40, 0xEE10, 0xEFF0, 0xF0B0, 0xEE40, 0xE9D0, 0xE310, 0xD8C0, 0xCE90, + 0xC210, 0xB520, 0xA890, 0x9C70, 0x92F0, 0x8CA0, 0x8970, 0x8820, 0x87B0, 0x86F0, 0x86F0, 0x8750, 0x87C0, 0x8890, 0x89E0, 0x8AF0, + 0x8BA0, 0x8B30, 0x8A20, 0x8910, 0x87B0, 0x86F0, 0x8650, 0x85D0, 0x8590, 0x8560, 0x8530, 0x8510, 0x8500, 0x84F0, 0x84E0, 0x84D0, + 0x84C0, 0x84C0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84A0, 0x84C0, 0x84A0, 0x84A0, 0x84A0, 0x8470, + 0x84B0, 0x84B0, 0x84C0, 0x84C0, 0x84C0, 0x84D0, 0x84C0, 0x84D0, 0x84D0, 0x84E0, 0x84E0, 0x84E0, 0x84E0, 0x84D0, 0x84E0, 0x84E0, + 0x84F0, 0x84F0, 0x8500, 0x8510, 0x8520, 0x8530, 0x8560, 0x85A0, 0x8620, 0x86B0, 0x87D0, 0x8940, 0x8B40, 0x8E00, 0x9140, 0x9450, + 0x9850, 0x9B70, 0x9F40, 0xA290, 0xA630, 0xA930, 0xAA90, 0xAC30, 0xACC0, 0xAC20, 0xAB50, 0xA970, 0xA7B0, 0xA5C0, 0xA590, 0xA460, + 0xA360, 0xA1E0, 0x9EC0, 0x98F0, 0x9030, 0x87E0, 0x8530, 0x84C0, 0x8490, 0x8480, 0x8460, 0x8440, 0x8430, 0x8420, 0x8410, 0x8400, + 0x8400, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8400, 0x8400, 0x8410, 0x8410, 0x8410, 0x8450, 0x8450, 0x8420, + 0x8440, 0x8440, 0x8440, 0x8450, 0x8490, 0x8460, 0x8490, 0x8470, 0x8480, 0x8480, 0x8490, 0x8490, 0x84A0, 0x84B0, 0x84C0, 0x84C0, + 0x84D0, 0x84D0, 0x84E0, 0x84C0, 0x84D0, 0x84C0, 0x84C0, 0x84B0, 0x84B0, 0x84A0, 0x8490, 0x8490, 0x8490, 0x8490, 0x8480, 0x8470, + 0x8470, 0x8470, 0x8460, 0x8460, 0x8460, 0x8450, 0x8470, 0x8450, 0x8450, 0x8440, 0x8440, 0x8440, 0x8440, 0x8430, 0x8430, 0x8430, + 0x8430, 0x8420, 0x8420, 0x8420, 0x8410, 0x8410, 0x8410, 0x8410, 0x8400, 0x8400, 0x8400, 0x83F0, 0x83F0, 0x83F0, 0x83E0, 0x83E0, + 0x83E0, 0x83D0, 0x83D0, 0x83D0, 0x83C0, 0x83C0, 0x83B0, 0x83B0, 0x83A0, 0x83A0, 0x8390, 0x8380, 0x8380, 0x8370, 0x8370, 0x8370, + 0x8370, 0x8370, 0x8360, 0x8370, 0x8370, 0x8370, 0x8380, 0x8380, 0x8390, 0x8390, 0x8390, 0x83A0, 0x83B0, 0x83B0, 0x83B0, 0x83C0, + 0x83C0, 0x83D0, 0x83D0, 0x83E0, 0x83E0, 0x83F0, 0x83F0, 0x8400, 0x8400, 0x8400, 0x8400, 0x8410, 0x8410, 0x8410, 0x8410, 0x8420, + 0x8410, 0x8410, 0x83F0, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8410, 0x8420, 0x8420, 0x8430, 0x8430, 0x8430, 0x8440, 0x8440, + 0x8440, 0x8440, 0x8450, 0x8450, 0x8450, 0x8460, 0x8460, 0x8470, 0x8470, 0x8480, 0x8480, 0x8490, 0x8490, 0x8490, 0x84A0, 0x84A0, + 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84B0, 0x84A0, 0x8490, 0x8490, 0x8490, 0x8480, 0x8480, 0x8470, 0x8470, 0x8460, + 0x8460, 0x8450, 0x8460, 0x8450, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, 0x8440, + 0x8450, 0x8450, 0x8460, 0x8470, 0x8480, 0x8490, 0x8490, 0x84B0, 0x84C0, 0x84E0, 0x8500, 0x8550, 0x85F0, 0x8770, 0x8AE0, 0x91C0, + 0x9950, 0xA140, 0xA940, 0xB210, 0xBC20, 0xC660, 0xD0D0, 0xDC90, 0xE8C0, 0xF580, 0x02C0, 0x1010, 0x1DF0, 0x2D40, 0x3B90, 0x49F0, + 0x5940, 0x67C0, 0x7530, 0x7E90, 0x7F20, 0x7F00, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F10, 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7EF0, + 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7B00, 0x61B0, 0x4950, 0x3100, 0x1890, 0x0380, 0xEFE0, 0xDDD0, 0xCC60, 0xBC10, 0xAC80, 0x9D60, + 0x8F90, 0x8740, 0x8540, 0x84E0, 0x84B0, 0x8490, 0x8490, 0x8470, 0x8470, 0x8460, 0x8460, 0x8470, 0x8460, 0x8460, 0x8460, 0x8450, + 0x8450, 0x8440, 0x8430, 0x8430, 0x8420, 0x8410, 0x8410, 0x8400, 0x8400, 0x83F0, 0x83F0, 0x83F0, 0x8400, 0x8410, 0x8420, 0x8430, + 0x8430, 0x8440, 0x8450, 0x8450, 0x8460, 0x84A0, 0x8470, 0x8490, 0x84B0, 0x8500, 0x87A0, 0x9FE0, 0xB640, 0xC630, 0xD170, 0xD810, + 0xDC20, 0xDDF0, 0xDED0, 0xDEA0, 0xDDA0, 0xDCC0, 0xDDA0, 0xE1C0, 0xEA50, 0xF930, 0x0CA0, 0x24C0, 0x3FF0, 0x5B60, 0x73B0, 0x7F40, + 0x7F30, 0x7F20, 0x7F20, 0x7F40, 0x7F30, 0x7F20, 0x7F20, 0x7F40, 0x7F30, 0x7F20, 0x7EF0, 0x7F30, 0x7F30, 0x7F20, 0x7F20, 0x7EF0, + 0x7F30, 0x7F20, 0x7F30, 0x7F30, 0x7F00, 0x7F20, 0x7F10, 0x7F30, 0x7F20, 0x7F40, 0x7F20, 0x7F30, 0x7F20, 0x7F40, 0x7F30, 0x7F30, + 0x7F20, 0x7F20, 0x7F30, 0x7F30, 0x7EF0, 0x7E90, 0x7F30, 0x7F20, 0x7F20, 0x7F00, 0x7E90, 0x7F10, 0x7EB0, 0x7EF0, 0x7EB0, 0x7E60, + 0x7ED0, 0x7ED0, 0x7F30, 0x7F20, 0x7F00, 0x7F50, 0x7F20, 0x7F10, 0x7F10, 0x7F00, 0x7F20, 0x7EF0, 0x7F10, 0x7F20, 0x7F00, 0x7F40, + 0x7F00, 0x7F20, 0x7F00, 0x7EF0, 0x7F30, 0x7F00, 0x7EE0, 0x7EC0, 0x7EE0, 0x7F60, 0x7EF0, 0x7EF0, 0x7F00, 0x7EE0, 0x7EF0, 0x7EF0, + 0x7E70, 0x7F10, 0x7EB0, 0x7F30, 0x7EE0, 0x7E90, 0x7ED0, 0x7F00, 0x7F00, 0x7F10, 0x7EA0, 0x7EC0, 0x7EC0, 0x7F10, 0x7F00, 0x7EA0, + 0x7EF0, 0x7F10, 0x7F20, 0x7EF0, 0x7EB0, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F00, 0x7F40, 0x7EF0, 0x7F10, 0x7EF0, 0x7EF0, 0x7F70, + 0x7F10, 0x7F40, 0x7F10, 0x7F10, 0x7F30, 0x7F10, 0x7F10, 0x7F00, 0x7EE0, 0x7F70, 0x7EF0, 0x7EE0, 0x7F00, 0x7F10, 0x7F70, 0x7F00, + 0x7ED0, 0x7F10, 0x7F00, 0x7F30, 0x7ED0, 0x7E90, 0x7F00, 0x7EF0, 0x7F30, 0x7F00, 0x7EC0, 0x7F10, 0x7F10, 0x7F10, 0x7F00, 0x7EC0, + 0x7F00, 0x7F00, 0x7EF0, 0x7F10, 0x7F00, 0x7F20, 0x7F10, 0x7F10, 0x7F20, 0x7F00, 0x7F30, 0x7F00, 0x7F00, 0x7EF0, 0x7F10, 0x7F80, + 0x7F00, 0x7F40, 0x7F30, 0x7F00, 0x7F90, 0x7F10, 0x7F10, 0x7EE0, 0x7EF0, 0x7F50, 0x7F10, 0x7EF0, 0x7EF0, 0x7F00, 0x7F60, 0x7F10, + 0x7EB0, 0x7EB0, 0x7EC0, 0x7EF0, 0x7F10, 0x7E70, 0x7ED0, 0x7ED0, 0x7F20, 0x7F20, 0x7EC0, 0x7ED0, 0x7F00, 0x7F10, 0x7F10, 0x7EB0, + 0x7EE0, 0x7EF0, 0x7F10, 0x7F20, 0x7F00, 0x7F40, 0x7F20, 0x7F20, 0x7F10, 0x7F00, 0x7F20, 0x7F20, 0x7F10, 0x7F10, 0x7F10, 0x7F40, + 0x7F10, 0x7F20, 0x7F20, 0x7F10, 0x7F50, 0x7EF0, 0x7F00, 0x7EF0, 0x7F00, 0x7F40, 0x7EF0, 0x7F10, 0x7F00, 0x7F20, 0x7F70, 0x7ED0, + 0x7EB0, 0x7F10, 0x7F10, 0x7F30, 0x7EE0, 0x7EC0, 0x7F10, 0x7F20, 0x7F40, 0x7EC0, 0x7A30, 0x7740, 0x74B0, 0x76C0, 0x7A10, 0x7D20, + 0x7EC0, 0x7ED0, 0x7F10, 0x7F00, 0x7F40, 0x7ED0, 0x7EB0, 0x7EF0, 0x7F10, 0x7F30, 0x7F00, 0x7EC0, 0x7F10, 0x7F10, 0x7F20, 0x7F00, + 0x7EA0, 0x7F00, 0x7EF0, 0x7EF0, 0x7F20, 0x7F00, 0x7F40, 0x7F10, 0x7F10, 0x7F40, 0x7F00, 0x7F30, 0x7F00, 0x7F00, 0x7F40, 0x7F10, + 0x7F70, 0x7F00, 0x7F20, 0x7F20, 0x7F00, 0x7F90, 0x7F00, 0x7F20, 0x7EF0, 0x7ED0, 0x7F70, 0x7EF0, 0x7F10, 0x7F10, 0x7F00, 0x7F70, + 0x7F10, 0x7EB0, 0x7EB0, 0x7EE0, 0x7F30, 0x7F00, 0x7EC0, 0x7ED0, 0x7ED0, 0x7F20, 0x7F20, 0x7E90, 0x7EB0, 0x7EE0, 0x7F10, 0x7F10, + 0x7E70, 0x7EE0, 0x7F10, 0x7F10, 0x7F20, 0x7F00, 0x7F00, 0x7F20, 0x7F10, 0x7F10, 0x7F00, 0x7F20, 0x7F10, 0x7F10, 0x7F10, 0x7EE0, + 0x7F40, 0x7F30, 0x7F20, 0x7F10, 0x7F10, 0x7F30, 0x7EE0, 0x7EF0, 0x7F10, 0x7EE0, 0x7F50, 0x7EF0, 0x7F20, 0x7F20, 0x7F10, 0x7F90, + 0x7EF0, 0x7F10, 0x7F10, 0x7F10, 0x7F60, 0x7EE0, 0x7EB0, 0x7F10, 0x7F20, 0x7F40, 0x7F00, 0x7EA0, 0x7F10, 0x7F10, 0x7F20, 0x7EE0, + 0x7EC0, 0x7F10, 0x7F10, 0x7EF0, 0x7F10, 0x7EB0, 0x7F20, 0x7F10, 0x7F10, 0x7F10, 0x7F00, 0x7F40, 0x7F00, 0x7F00, 0x7F10, 0x7F00, + 0x7F60, 0x7F20, 0x7F40, 0x7F10, 0x7F00, 0x7F80, 0x7F10, 0x7F10, 0x7F00, 0x7EF0, 0x7F90, 0x7F10, 0x7F20, 0x7F00, 0x7F10, 0x7F70, + 0x7F10, 0x7EF0, 0x7EB0, 0x7B20, 0x72F0, 0x6A50, 0x6030, 0x5570, 0x4A50, 0x3F30, 0x3500, 0x29F0, 0x1FB0, 0x14D0, 0x0A30, 0x0050, + 0xF4F0, 0xEA40, 0xDFB0, 0xD4D0, 0xCA60, 0xC000, 0xB560, 0xAB10, 0xA170, 0x97B0, 0x9010, 0x8AB0, 0x8800, 0x86A0, 0x8600, 0x85B0, + 0x8580, 0x8580, 0x8590, 0x8580, 0x8610, 0x8690, 0x8790, 0x8970, 0x8CC0, 0x9260, 0x9910, 0xA0A0, 0xA830, 0xB070, 0xB880, 0xC040, + 0xC8B0, 0xD0E0, 0xD9F0, 0xE270, 0xEBE0, 0xF500, 0xFE20, 0x0770, 0x1050, 0x1960, 0x2190, 0x29B0, 0x3260, 0x3AD0, 0x41F0, 0x4970, + 0x5000, 0x5680, 0x5CB0, 0x61F0, 0x6720, 0x6C00, 0x7120, 0x7500, 0x7890, 0x7C30, 0x7E00, 0x7F00, 0x7EF0, 0x7F10, 0x7F30, 0x7EC0, + 0x7F30, 0x7F20, 0x7F20, 0x7F40, 0x7F10, 0x7F70, 0x7EE0, 0x7EF0, 0x7F20, 0x7EE0, 0x7F80, 0x7F10, 0x7F20, 0x7F00, 0x7EF0, 0x7F50, + 0x7F00, 0x7F10, 0x7EF0, 0x7EF0, 0x7F60, 0x7EF0, 0x7ED0, 0x7F00, 0x7F00, 0x7F30, 0x7F20, 0x7EC0, 0x7ED0, 0x7ED0, 0x7F30, 0x7F00, + 0x7E80, 0x7AF0, 0x75E0, 0x6EF0, 0x68F0, 0x6230, 0x5BC0, 0x5490, 0x4D30, 0x4630, 0x3EC0, 0x3740, 0x2FA0, 0x27E0, 0x20F0, 0x1980, + 0x1220, 0x0AE0, 0x0390, 0xFA70, 0xF400, 0xED20, 0xE760, 0xE100, 0xDB80, 0xD650, 0xD0C0, 0xCC00, 0xC710, 0xC2D0, 0xBEB0, 0xBAE0, + 0xB7C0, 0xB4F0, 0xB230, 0xAFD0, 0xADE0, 0xAB90, 0xA9E0, 0xA8C0, 0xA850, 0xA7A0, 0xA780, 0xA750, 0xA7E0, 0xA7F0, 0xA9A0, 0xAA90, + 0xAC00, 0xADB0, 0xAFB0, 0xB270, 0xB510, 0xB800, 0xBB70, 0xBF60, 0xC3E0, 0xC790, 0xCCA0, 0xD130, 0xD640, 0xDBE0, 0xE130, 0xE710, + 0xEDA0, 0xF3F0, 0xFAA0, 0x0150, 0x07B0, 0x0EA0, 0x1570, 0x1BF0, 0x2340, 0x2AC0, 0x31D0, 0x3870, 0x3F40, 0x4590, 0x4B30, 0x5100, + 0x5640, 0x5AF0, 0x5FA0, 0x6330, 0x6670, 0x68D0, 0x6AE0, 0x6CA0, 0x6E20, 0x6F10, 0x6FB0, 0x7000, 0x7070, 0x7090, 0x6FE0, 0x6F80, + 0x6ED0, 0x6EB0, 0x6DD0, 0x6D80, 0x6CB0, 0x6C00, 0x6B60, 0x6AC0, 0x6A50, 0x6780, 0x66C0, 0x6640, 0x6550, 0x64C0, 0x6410, 0x6390, + 0x62E0, 0x6200, 0x6190, 0x6070, 0x5FC0, 0x5EC0, 0x5D50, 0x5C10, 0x5A70, 0x58A0, 0x56C0, 0x54D0, 0x52B0, 0x5060, 0x4E50, 0x4AD0, + 0x4790, 0x44A0, 0x40E0, 0x3D70, 0x3950, 0x35E0, 0x3240, 0x2ED0, 0x2AA0, 0x2780, 0x2350, 0x2090, 0x1D00, 0x1A40, 0x1750, 0x14D0, + 0x1210, 0x0FA0, 0x0D10, 0x0A30, 0x0840, 0x05C0, 0x03B0, 0x0170, 0xFF20, 0xFCC0, 0xF9B0, 0xF6E0, 0xF3C0, 0xF110, 0xEE30, 0xEB50, + 0xE8A0, 0xE610, 0xE450, 0xE300, 0xE1B0, 0xE110, 0xE070, 0xE0C0, 0xE0A0, 0xE110, 0xE1B0, 0xE300, 0xE480, 0xE610, 0xE7E0, 0xEA30, + 0xEC50, 0xEE40, 0xF000, 0xF260, 0xF440, 0xF620, 0xF7E0, 0xF950, 0xFAD0, 0xFBB0, 0xFCF0, 0xFDC0, 0xFE80, 0xFED0, 0xFF20, 0xFF90, + 0x0010, 0x0050, 0x0120, 0x0210, 0x02D0, 0x03D0, 0x04E0, 0x05D0, 0x0710, 0x08A0, 0x09C0, 0x0BA0, 0x0D80, 0x0F40, 0x11A0, 0x12F0, + 0x1540, 0x1700, 0x18F0, 0x1AD0, 0x1C70, 0x1EF0, 0x2140, 0x2350, 0x2540, 0x2840, 0x2AB0, 0x2CA0, 0x2E60, 0x30C0, 0x3270, 0x3470, + 0x36E0, 0x3870, 0x3B30, 0x3CC0, 0x3F10, 0x40F0, 0x41F0, 0x4460, 0x45D0, 0x4790, 0x4960, 0x4A50, 0x4C70, 0x4DB0, 0x4F20, 0x5050, + 0x5130, 0x5220, 0x5300, 0x53D0, 0x54B0, 0x54C0, 0x5590, 0x5680, 0x56B0, 0x57A0, 0x57C0, 0x58B0, 0x5940, 0x5980, 0x59D0, 0x59C0, + 0x5A60, 0x59D0, 0x59F0, 0x5A20, 0x5960, 0x5940, 0x5920, 0x58C0, 0x5840, 0x57B0, 0x5820, 0x5760, 0x5710, 0x5730, 0x5670, 0x5680, + 0x5630, 0x55F0, 0x5660, 0x55F0, 0x5660, 0x5600, 0x5550, 0x5590, 0x54E0, 0x54E0, 0x5480, 0x5370, 0x52F0, 0x51C0, 0x5140, 0x5000, + 0x4E60, 0x4E10, 0x4CB0, 0x4CA0, 0x4BA0, 0x4AC0, 0x4A50, 0x4980, 0x4840, 0x4780, 0x45F0, 0x4520, 0x4440, 0x4350, 0x41C0, 0x4020, + 0x3F30, 0x3DB0, 0x3C30, 0x3A70, 0x3870, 0x3730, 0x35A0, 0x3410, 0x32F0, 0x30E0, 0x2FE0, 0x2E80, 0x2C40, 0x2B40, 0x2910, 0x27D0, + 0x25F0, 0x23E0, 0x22C0, 0x20A0, 0x1F70, 0x1D90, 0x1B90, 0x1A20, 0x1840, 0x1750, 0x1590, 0x13E0, 0x1240, 0x1040, 0x0E70, 0x0CC0, + 0x0A10, 0x0890, 0x0650, 0x0500, 0x0310, 0x0130, 0xFFF0, 0xFE50, 0xFCF0, 0xFBE0, 0xFA60, 0xF9D0, 0xF860, 0xF720, 0xF5E0, 0xF550, + 0xF460, 0xF420, 0xF2D0, 0xF210, 0xF230, 0xF250, 0xF150, 0xF170, 0xF130, 0xF120, 0xF180, 0xF130, 0xF160, 0xF180, 0xF190, 0xF1D0, + 0xF220, 0xF2A0, 0xF2E0, 0xF3C0, 0xF3E0, 0xF3F0, 0xF430, 0xF4C0, 0xF4F0, 0xF530, 0xF590, 0xF570, 0xF5D0, 0xF5A0, 0xF670, 0xF680, + 0xF630, 0xF720, 0xF700, 0xF740, 0xF6C0, 0xF780, 0xF800, 0xF810, 0xF830, 0xF920, 0xF870, 0xF8D0, 0xF8C0, 0xF960, 0xFB50, 0xFBB0, + 0xFC80, 0xFCF0, 0xFDC0, 0xFE30, 0xFEC0, 0xFF90, 0x0010, 0x0120, 0x0180, 0x0200, 0x0270, 0x02C0, 0x0370, 0x0390, 0x03C0, 0x0400, + 0x0460, 0x0530, 0x05B0, 0x0680, 0x0710, 0x0790, 0x0860, 0x0940, 0x09F0, 0x0A90, 0x0B40, 0x0C40, 0x0CB0, 0x0D60, 0x0E20, 0x0ED0, + 0x0FE0, 0x10C0, 0x1150, 0x11F0, 0x12B0, 0x1390, 0x13D0, 0x1440, 0x1500, 0x1550, 0x1650, 0x1700, 0x1740, 0x1810, 0x1820, 0x1920, + 0x1990, 0x19B0, 0x1A20, 0x1A60, 0x1AD0, 0x1AF0, 0x1B60, 0x1B80, 0x1C10, 0x1C60, 0x1CA0, 0x1C40, 0x1CC0, 0x1C80, 0x1C60, 0x1C90, + 0x1BC0, 0x1BE0, 0x1BD0, 0x1B90, 0x1B10, 0x1AC0, 0x1A90, 0x1A70, 0x19C0, 0x1990, 0x19B0, 0x1960, 0x18A0, 0x1850, 0x17D0, 0x16F0, + 0x16A0, 0x1580, 0x1470, 0x1400, 0x12C0, 0x1270, 0x1170, 0x10E0, 0x0F80, 0x0E70, 0x0D60, 0x0BD0, 0x0A70, 0x0970, 0x0860, 0x0750, + 0x0630, 0x0460, 0x0440, 0x0200, 0x00B0, 0xFF40, 0xFDB0, 0xFCF0, 0xFC00, 0xFAA0, 0xF9C0, 0xF880, 0xF700, 0xF580, 0xF430, 0xF2B0, + 0xF140, 0xF000, 0xEE50, 0xECC0, 0xEBA0, 0xE9D0, 0xE880, 0xE6F0, 0xE5A0, 0xE3F0, 0xE280, 0xE1C0, 0xDFF0, 0xDF30, 0xDE40, 0xDCD0, + 0xDC60, 0xDB60, 0xDA40, 0xD910, 0xD7D0, 0xD6B0, 0xD560, 0xD430, 0xD2F0, 0xD1F0, 0xD150, 0xD030, 0xCF30, 0xCE60, 0xCD50, 0xCC30, + 0xCB40, 0xC990, 0xC880, 0xC7B0, 0xC700, 0xC5E0, 0xC510, 0xC4A0, 0xC3E0, 0xC2F0, 0xC1B0, 0xC0C0, 0xC060, 0xBFC0, 0xBF00, 0xBEA0, + 0xBD90, 0xBD00, 0xBC20, 0xBB50, 0xBAB0, 0xB970, 0xB910, 0xB830, 0xB770, 0xB6A0, 0xB5C0, 0xB540, 0xB460, 0xB360, 0xB200, 0xB0D0, + 0xB030, 0xAEF0, 0xAD70, 0xAC90, 0xABC0, 0xAAD0, 0xA9A0, 0xA870, 0xA780, 0xA660, 0xA550, 0xA420, 0xA2F0, 0xA250, 0xA160, 0xA040, + 0x9F40, 0x9DE0, 0x9CD0, 0x9BD0, 0x9A80, 0x99D0, 0x9890, 0x97D0, 0x9690, 0x95F0, 0x94C0, 0x9350, 0x9200, 0x90E0, 0x8F90, 0x8E90, + 0x8D80, 0x8CF0, 0x8C70, 0x8BB0, 0x8B60, 0x8AB0, 0x8A50, 0x89B0, 0x8950, 0x88D0, 0x8890, 0x8840, 0x87F0, 0x87C0, 0x8790, 0x8760, + 0x8730, 0x86F0, 0x86D0, 0x8680, 0x86A0, 0x8690, 0x8690, 0x8680, 0x8670, 0x8670, 0x8650, 0x8650, 0x8650, 0x8650, 0x8640, 0x8650, + 0x8660, 0x8640, 0x8650, 0x8640, 0x8640, 0x8680, 0x8660, 0x8640, 0x8640, 0x8660, 0x8640, 0x8640, 0x8650, 0x8660, 0x8660, 0x8660, + 0x8670, 0x8680, 0x8670, 0x8670, 0x8680, 0x8670, 0x8680, 0x8670, 0x8680, 0x8680, 0x8670, 0x8670, 0x8670, 0x8680, 0x8660, 0x8650, + 0x8660, 0x8650, 0x8640, 0x8630, 0x8630, 0x8630, 0x8620, 0x8620, 0x8620, 0x8610, 0x8610, 0x8600, 0x8600, 0x8600, 0x8600, 0x8600, + 0x8610, 0x8630, 0x8600, 0x8600, 0x85F0, 0x85F0, 0x85F0, 0x85F0, 0x85F0, 0x8600, 0x8600, 0x8610, 0x8620, 0x8630, 0x8640, 0x8640, + 0x8640, 0x8650, 0x8650, 0x8670, 0x8680, 0x86A0, 0x86B0, 0x86D0, 0x8710, 0x8700, 0x8720, 0x8730, 0x8760, 0x8790, 0x87B0, 0x87E0, + 0x8800, 0x8810, 0x8850, 0x8860, 0x88B0, 0x8900, 0x8970, 0x8A10, 0x8A70, 0x8AF0, 0x8B90, 0x8C30, 0x8CC0, 0x8D40, 0x8DC0, 0x8E90, + 0x8F00, 0x8F70, 0x9030, 0x9120, 0x9200, 0x92B0, 0x93E0, 0x9450, 0x9510, 0x9600, 0x96C0, 0x9770, 0x98B0, 0x99A0, 0x9AB0, 0x9BC0, + 0x9C80, 0x9D50, 0x9DC0, 0x9E80, 0x9EF0, 0xA030, 0xA130, 0xA210, 0xA2E0, 0xA470, 0xA540, 0xA680, 0xA7A0, 0xA880, 0xA990, 0xAAB0, + 0xAB80, 0xAC80, 0xAD40, 0xAE40, 0xAF20, 0xAFD0, 0xB0E0, 0xB1A0, 0xB2B0, 0xB320, 0xB420, 0xB4C0, 0xB5A0, 0xB610, 0xB6D0, 0xB790, + 0xB830, 0xB8E0, 0xB9A0, 0xBA70, 0xBB40, 0xBC40, 0xBD20, 0xBDB0, 0xBEA0, 0xBF80, 0xBFE0, 0xC020, 0xC0D0, 0xC110, 0xC1B0, 0xC230, + 0xC240, 0xC2C0, 0xC330, 0xC3A0, 0xC440, 0xC4D0, 0xC570, 0xC620, 0xC6E0, 0xC710, 0xC750, 0xC780, 0xC850, 0xC8A0, 0xC910, 0xC970, + 0xC9F0, 0xCA50, 0xCAE0, 0xCB30, 0xCB40, 0xCB70, 0xCBE0, 0xCC70, 0xCCC0, 0xCD60, 0xCD90, 0xCE40, 0xCDD0, 0xCE70, 0xCE90, 0xCE50, + 0xCE80, 0xCEF0, 0xCEF0, 0xCF60, 0xCF70, 0xCF60, 0xCF80, 0xD010, 0xD090, 0xD0E0, 0xD130, 0xD150, 0xD130, 0xD130, 0xD130, 0xD170, + 0xD1B0, 0xD1B0, 0xD1F0, 0xD1B0, 0xD220, 0xD290, 0xD2C0, 0xD2D0, 0xD3A0, 0xD3D0, 0xD3F0, 0xD430, 0xD420, 0xD410, 0xD410, 0xD430, + 0xD460, 0xD440, 0xD440, 0xD430, 0xD3E0, 0xD3E0, 0xD3B0, 0xD3D0, 0xD420, 0xD3D0, 0xD410, 0xD460, 0xD450, 0xD430, 0xD3B0, 0xD400, + 0xD390, 0xD360, 0xD370, 0xD320, 0xD330, 0xD320, 0xD300, 0xD310, 0xD330, 0xD2D0, 0xD2C0, 0xD2C0, 0xD2F0, 0xD250, 0xD270, 0xD1D0, + 0xD1B0, 0xD190, 0xD0B0, 0xD0A0, 0xD030, 0xD000, 0xCFB0, 0xCF60, 0xCF00, 0xCF00, 0xCED0, 0xCE40, 0xCD80, 0xCDC0, 0xCD20, 0xCD80, + 0xCCD0, 0xCC40, 0xCC40, 0xCBB0, 0xCB60, 0xCAF0, 0xCA50, 0xCA30, 0xC9A0, 0xC990, 0xC8F0, 0xC8D0, 0xC8A0, 0xC810, 0xC790, 0xC6E0, + 0xC630, 0xC5C0, 0xC510, 0xC490, 0xC410, 0xC3D0, 0xC350, 0xC2F0, 0xC270, 0xC200, 0xC190, 0xC1A0, 0xC140, 0xC010, 0xBFF0, 0xBF20, + 0xBEE0, 0xBD90, 0xBCE0, 0xBCA0, 0xBC30, 0xBBB0, 0xBB40, 0xBA40, 0xB9C0, 0xB920, 0xB820, 0xB790, 0xB710, 0xB670, 0xB610, 0xB570, + 0xB570, 0xB510, 0xB500, 0xB440, 0xB3F0, 0xB3B0, 0xB2F0, 0xB280, 0xB240, 0xB190, 0xB110, 0xB020, 0xAFF0, 0xAF30, 0xAE50, 0xADE0, + 0xAD80, 0xAD30, 0xAC70, 0xABC0, 0xABA0, 0xAAF0, 0xAB20, 0xAAB0, 0xAA30, 0xAA50, 0xAA50, 0xA9B0, 0xA940, 0xA910, 0xA8C0, 0xA840, + 0xA820, 0xA7E0, 0xA790, 0xA6F0, 0xA710, 0xA630, 0xA5A0, 0xA4C0, 0xA4B0, 0xA450, 0xA430, 0xA400, 0xA3F0, 0xA3B0, 0xA2F0, 0xA280, + 0xA270, 0xA150, 0xA160, 0xA0E0, 0xA0A0, 0xA030, 0xA020, 0xA040, 0xA000, 0x9FB0, 0x9FB0, 0x9F70, 0x9EE0, 0x9EF0, 0x9E90, 0x9E00, + 0x9D50, 0x9D40, 0x9C80, 0x9C40, 0x9C30, 0x9BA0, 0x9B90, 0x9B70, 0x9AC0, 0x9AB0, 0x9A30, 0x99E0, 0x99E0, 0x9970, 0x9960, 0x9970, + 0x9950, 0x9920, 0x9850, 0x9880, 0x9810, 0x97B0, 0x9770, 0x9700, 0x9730, 0x96E0, 0x96C0, 0x9680, 0x9600, 0x95E0, 0x95A0, 0x9580, + 0x9510, 0x94E0, 0x9500, 0x94B0, 0x94E0, 0x94A0, 0x94B0, 0x9470, 0x9430, 0x9440, 0x9400, 0x9430, 0x9400, 0x93D0, 0x9440, 0x9420, + 0x9440, 0x9450, 0x9430, 0x9460, 0x9480, 0x9480, 0x9490, 0x9420, 0x9470, 0x9430, 0x9410, 0x9410, 0x9420, 0x9470, 0x9450, 0x9410, + 0x9470, 0x93F0, 0x9450, 0x94A0, 0x94A0, 0x9460, 0x9490, 0x94B0, 0x94E0, 0x94D0, 0x9510, 0x9520, 0x9530, 0x9550, 0x9590, 0x95C0, + 0x95D0, 0x95C0, 0x9550, 0x9510, 0x9570, 0x95A0, 0x9580, 0x95C0, 0x9650, 0x96F0, 0x96F0, 0x96F0, 0x9700, 0x9700, 0x96F0, 0x9720, + 0x9710, 0x9720, 0x9720, 0x97D0, 0x98A0, 0x98F0, 0x9930, 0x9910, 0x9960, 0x98D0, 0x9890, 0x98B0, 0x9890, 0x98D0, 0x9900, 0x9920, + 0x9960, 0x9940, 0x9A10, 0x9A30, 0x9A60, 0x9A70, 0x9A80, 0x9A80, 0x9A40, 0x9A40, 0x9AC0, 0x9AF0, 0x9B70, 0x9B40, 0x9B30, 0x9B50, + 0x9B60, 0x9B80, 0x9B50, 0x9B30, 0x9BA0, 0x9C00, 0x9CB0, 0x9CD0, 0x9D40, 0x9DC0, 0x9DD0, 0x9E20, 0x9E10, 0x9DC0, 0x9E20, 0x9E60, + 0x9E50, 0x9EB0, 0x9ED0, 0x9EC0, 0x9F10, 0x9ED0, 0x9F60, 0x9F40, 0x9F90, 0x9FD0, 0x9FF0, 0xA030, 0xA050, 0xA110, 0xA120, 0xA170, + 0xA1A0, 0xA1E0, 0xA270, 0xA2A0, 0xA340, 0xA390, 0xA3B0, 0xA420, 0xA470, 0xA480, 0xA4E0, 0xA4C0, 0xA4C0, 0xA4D0, 0xA4C0, 0xA4F0, + 0xA510, 0xA580, 0xA530, 0xA540, 0xA570, 0xA580, 0xA5B0, 0xA5E0, 0xA600, 0xA6E0, 0xA740, 0xA810, 0xA860, 0xA910, 0xA980, 0xAA00, + 0xAA10, 0xAA90, 0xAA70, 0xAAE0, 0xAB60, 0xABA0, 0xAC00, 0xABD0, 0xABB0, 0xABA0, 0xAB80, 0xABA0, 0xABB0, 0xABC0, 0xABF0, 0xAC10, + 0xAC80, 0xAC60, 0xACF0, 0xACE0, 0xACF0, 0xAD00, 0xAD50, 0xAE20, 0xAE40, 0xAED0, 0xAF30, 0xAFA0, 0xAFF0, 0xB030, 0xAFD0, 0xB080, + 0xB050, 0xB060, 0xB0D0, 0xB070, 0xB0F0, 0xB0E0, 0xB160, 0xB1B0, 0xB1B0, 0xB260, 0xB200, 0xB230, 0xB230, 0xB200, 0xB1E0, 0xB230, + 0xB220, 0xB280, 0xB230, 0xB330, 0xB300, 0xB300, 0xB310, 0xB300, 0xB3A0, 0xB390, 0xB380, 0xB3C0, 0xB3B0, 0xB400, 0xB400, 0xB3A0, + 0xB3D0, 0xB3C0, 0xB3C0, 0xB3D0, 0xB3B0, 0xB400, 0xB3A0, 0xB440, 0xB410, 0xB430, 0xB4B0, 0xB4A0, 0xB4D0, 0xB500, 0xB530, 0xB5C0, + 0xB5B0, 0xB660, 0xB670, 0xB630, 0xB650, 0xB5F0, 0xB650, 0xB670, 0xB630, 0xB6C0, 0xB6E0, 0xB710, 0xB770, 0xB780, 0xB7F0, 0xB7C0, + 0xB800, 0xB840, 0xB7F0, 0xB810, 0xB800, 0xB800, 0xB7F0, 0xB7F0, 0xB7D0, 0xB820, 0xB810, 0xB820, 0xB870, 0xB900, 0xB8F0, 0xB8F0, + 0xB9B0, 0xBA20, 0xBAC0, 0xBB50, 0xBB70, 0xBBD0, 0xBBE0, 0xBB80, 0xBB60, 0xBB50, 0xBAC0, 0xBA70, 0xBA60, 0xBA40, 0xBA30, 0xBA50, + 0xBA60, 0xBA90, 0xBA30, 0xBA80, 0xBAE0, 0xBA80, 0xBB10, 0xBB20, 0xBB60, 0xBB60, 0xBB90, 0xBBA0, 0xBBA0, 0xBBD0, 0xBBF0, 0xBC00, + 0xBC70, 0xBCD0, 0xBD70, 0xBDA0, 0xBDB0, 0xBDA0, 0xBD60, 0xBD90, 0xBDB0, 0xBDA0, 0xBE20, 0xBE80, 0xBEE0, 0xBEF0, 0xBED0, 0xBF10, + 0xBF60, 0xBF40, 0xBFD0, 0xC010, 0xC040, 0xC080, 0xC0F0, 0xC110, 0xC140, 0xC170, 0xC1E0, 0xC1B0, 0xC1F0, 0xC220, 0xC280, 0xC2E0, + 0xC2D0, 0xC2C0, 0xC2E0, 0xC2D0, 0xC340, 0xC380, 0xC3C0, 0xC430, 0xC480, 0xC4B0, 0xC4D0, 0xC520, 0xC550, 0xC5E0, 0xC5B0, 0xC600, + 0xC650, 0xC670, 0xC6C0, 0xC6A0, 0xC6B0, 0xC6E0, 0xC6E0, 0xC6D0, 0xC7A0, 0xC780, 0xC7D0, 0xC810, 0xC820, 0xC850, 0xC830, 0xC810, + 0xC830, 0xC810, 0xC840, 0xC820, 0xC830, 0xC830, 0xC860, 0xC840, 0xC890, 0xC8E0, 0xC8A0, 0xC860, 0xC880, 0xC8C0, 0xC8F0, 0xC8F0, + 0xC910, 0xC910, 0xC960, 0xC8F0, 0xC950, 0xC920, 0xC930, 0xC940, 0xC930, 0xC930, 0xC960, 0xC960, 0xC940, 0xC9B0, 0xC990, 0xC980, + 0xC9D0, 0xC9A0, 0xC990, 0xCA00, 0xCA10, 0xCA20, 0xCA10, 0xC9D0, 0xC9E0, 0xC9F0, 0xC9F0, 0xC9F0, 0xC9F0, 0xCA50, 0xCA30, 0xCA00, + 0xC9E0, 0xC9E0, 0xC980, 0xC940, 0xC990, 0xC980, 0xC900, 0xC9B0, 0xC9D0, 0xCA50, 0xCA20, 0xCA30, 0xCAA0, 0xCA50, 0xCAC0, 0xCAA0, + 0xCAE0, 0xCAD0, 0xCAB0, 0xCB40, 0xCB30, 0xCB30, 0xCB00, 0xCAC0, 0xCAB0, 0xCAB0, 0xCA80, 0xCA80, 0xCA80, 0xCA40, 0xC9D0, 0xC9D0, + 0xCA00, 0xC9E0, 0xC9A0, 0xC990, 0xC9F0, 0xCA40, 0xCAA0, 0xCAE0, 0xCAE0, 0xCAE0, 0xCBB0, 0xCBD0, 0xCB70, 0xCC40, 0xCBE0, 0xCC30, + 0xCC40, 0xCBC0, 0xCC50, 0xCC00, 0xCC60, 0xCC90, 0xCC50, 0xCC50, 0xCC20, 0xCC70, 0xCC40, 0xCC20, 0xCC40, 0xCCC0, 0xCD40, 0xCD70, + 0xCD50, 0xCDB0, 0xCDD0, 0xCDD0, 0xCDE0, 0xCDB0, 0xCDE0, 0xCE10, 0xCDF0, 0xCE00, 0xCDA0, 0xCE30, 0xCE70, 0xCEA0, 0xCE80, 0xCE90, + 0xCEC0, 0xCEB0, 0xCEC0, 0xCE60, 0xCE30, 0xCE60, 0xCE70, 0xCE60, 0xCEF0, 0xCE60, 0xCEE0, 0xCED0, 0xCED0, 0xCF20, 0xCF10, 0xCF70, + 0xCF80, 0xCF40, 0xCF70, 0xCF00, 0xCF70, 0xCF80, 0xCF50, 0xD050, 0xD050, 0xD040, 0xD050, 0xD030, 0xD100, 0xD080, 0xD0D0, 0xD100, + 0xD0E0, 0xD130, 0xD100, 0xD140, 0xD160, 0xD190, 0xD1A0, 0xD190, 0xD180, 0xD180, 0xD110, 0xD190, 0xD160, 0xD190, 0xD1A0, 0xD1B0, + 0xD1F0, 0xD210, 0xD1E0, 0xD1E0, 0xD170, 0xD1F0, 0xD1E0, 0xD180, 0xD190, 0xD180, 0xD1B0, 0xD1C0, 0xD190, 0xD1E0, 0xD1C0, 0xD1F0, + 0xD1F0, 0xD1D0, 0xD240, 0xD260, 0xD2F0, 0xD2D0, 0xD2D0, 0xD300, 0xD310, 0xD370, 0xD320, 0xD2F0, 0xD300, 0xD2D0, 0xD310, 0xD300, + 0xD2D0, 0xD320, 0xD310, 0xD370, 0xD360, 0xD360, 0xD380, 0xD3A0, 0xD3C0, 0xD3D0, 0xD3A0, 0xD440, 0xD450, 0xD450, 0xD490, 0xD470, + 0xD4A0, 0xD470, 0xD430, 0xD480, 0xD3E0, 0xD430, 0xD470, 0xD4F0, 0xD500, 0xD540, 0xD580, 0xD500, 0xD530, 0xD520, 0xD4F0, 0xD580, + 0xD520, 0xD560, 0xD550, 0xD570, 0xD580, 0xD5C0, 0xD570, 0xD5A0, 0xD580, 0xD580, 0xD5F0, 0xD570, 0xD640, 0xD5D0, 0xD600, 0xD600, + 0xD5A0, 0xD5D0, 0xD590, 0xD590, 0xD510, 0xD490, 0xD510, 0xD4E0, 0xD4F0, 0xD4A0, 0xD450, 0xD4C0, 0xD500, 0xD520, 0xD520, 0xD4F0, + 0xD580, 0xD5A0, 0xD580, 0xD5C0, 0xD540, 0xD590, 0xD590, 0xD5A0, 0xD580, 0xD4C0, 0xD510, 0xD4D0, 0xD4F0, 0xD4C0, 0xD4C0, 0xD4D0, + 0xD4B0, 0xD480, 0xD490, 0xD480, 0xD490, 0xD480, 0xD4D0, 0xD4E0, 0xD4A0, 0xD480, 0xD470, 0xD490, 0xD430, 0xD3F0, 0xD440, 0xD3C0, + 0xD3D0, 0xD3B0, 0xD320, 0xD390, 0xD380, 0xD370, 0xD340, 0xD2B0, 0xD2C0, 0xD2A0, 0xD280, 0xD250, 0xD250, 0xD290, 0xD270, 0xD260, + 0xD260, 0xD250, 0xD240, 0xD210, 0xD240, 0xD230, 0xD1D0, 0xD1D0, 0xD180, 0xD150, 0xD180, 0xD100, 0xD0D0, 0xD0C0, 0xD0B0, 0xD0A0, + 0xCFA0, 0xCFC0, 0xCF60, 0xCFE0, 0xCFB0, 0xCF60, 0xD010, 0xD000, 0xCFF0, 0xD010, 0xCF70, 0xCF40, 0xCF20, 0xCEA0, 0xCE50, 0xCE90, + 0xCE90, 0xCE20, 0xCDB0, 0xCDF0, 0xCDD0, 0xCD80, 0xCD50, 0xCDB0, 0xCDA0, 0xCD90, 0xCD90, 0xCD00, 0xCCB0, 0xCCF0, 0xCC90, 0xCC70, + 0xCC90, 0xCC50, 0xCC90, 0xCC90, 0xCCD0, 0xCCB0, 0xCD00, 0xCCF0, 0xCCC0, 0xCC60, 0xCC80, 0xCC30, 0xCC20, 0xCB40, 0xCB20, 0xCAD0, + 0xCA30, 0xCAC0, 0xC9F0, 0xC9C0, 0xC960, 0xC950, 0xC9E0, 0xC990, 0xC9B0, 0xC980, 0xC980, 0xC9F0, 0xC9A0, 0xC9D0, 0xC990, 0xC970, + 0xC9A0, 0xC950, 0xC9B0, 0xC970, 0xC940, 0xC930, 0xC920, 0xC930, 0xC940, 0xC890, 0xC890, 0xC840, 0xC810, 0xC870, 0xC840, 0xC860, + 0xC890, 0xC7D0, 0xC820, 0xC830, 0xC890, 0xC860, 0xC850, 0xC8B0, 0xC880, 0xC8B0, 0xC920, 0xC8D0, 0xC990, 0xC940, 0xC950, 0xC910, + 0xC8F0, 0xC8F0, 0xC8F0, 0xC890, 0xC8C0, 0xC880, 0xC890, 0xC8B0, 0xC8A0, 0xC900, 0xC8B0, 0xC8D0, 0xC8E0, 0xC8C0, 0xC8B0, 0xC880, + 0xC8F0, 0xC8F0, 0xC910, 0xC970, 0xC950, 0xC9B0, 0xC9D0, 0xC9D0, 0xCA20, 0xC9F0, 0xCA80, 0xCA80, 0xCAA0, 0xCB40, 0xCB90, 0xCB90, + 0xCBB0, 0xCC40, 0xCBD0, 0xCBE0, 0xCC00, 0xCC30, 0xCBD0, 0xCC30, 0xCBD0, 0xCC80, 0xCC30, 0xCC00, 0xCC70, 0xCC80, 0xCCD0, 0xCCC0, + 0xCCB0, 0xCDA0, 0xCDA0, 0xCE20, 0xCDF0, 0xCD90, 0xCE00, 0xCE00, 0xCE50, 0xCE10, 0xCE10, 0xCE80, 0xCE70, 0xCEE0, 0xCEE0, 0xCF40, + 0xCFD0, 0xD030, 0xD040, 0xD050, 0xD0B0, 0xD070, 0xD080, 0xD0E0, 0xD0E0, 0xD0F0, 0xD150, 0xD140, 0xD0F0, 0xD110, 0xD170, 0xD180, + 0xD160, 0xD150, 0xD170, 0xD1C0, 0xD1C0, 0xD1D0, 0xD1F0, 0xD2A0, 0xD290, 0xD2E0, 0xD300, 0xD310, 0xD350, 0xD390, 0xD3A0, 0xD3F0, + 0xD3C0, 0xD430, 0xD400, 0xD440, 0xD450, 0xD420, 0xD470, 0xD470, 0xD470, 0xD4A0, 0xD490, 0xD4F0, 0xD530, 0xD520, 0xD510, 0xD520, + 0xD550, 0xD5C0, 0xD5B0, 0xD620, 0xD660, 0xD650, 0xD670, 0xD660, 0xD660, 0xD5F0, 0xD610, 0xD640, 0xD630, 0xD6B0, 0xD690, 0xD6E0, + 0xD740, 0xD710, 0xD7B0, 0xD790, 0xD780, 0xD7D0, 0xD730, 0xD7A0, 0xD7C0, 0xD7E0, 0xD7E0, 0xD830, 0xD870, 0xD8C0, 0xD860, 0xD870, + 0xD810, 0xD7A0, 0xD790, 0xD780, 0xD760, 0xD780, 0xD740, 0xD790, 0xD7D0, 0xD7C0, 0xD790, 0xD750, 0xD730, 0xD720, 0xD7D0, 0xD780, + 0xD7D0, 0xD7C0, 0xD7B0, 0xD7F0, 0xD850, 0xD850, 0xD8C0, 0xD8D0, 0xD920, 0xD960, 0xD970, 0xD930, 0xD9F0, 0xDA00, 0xDA20, 0xDA30, + 0xDA10, 0xDA10, 0xD9E0, 0xD9B0, 0xDA00, 0xDA20, 0xD9E0, 0xDA30, 0xDA20, 0xDA40, 0xDA40, 0xDA50, 0xDA60, 0xDA60, 0xDAB0, 0xDA80, + 0xDAF0, 0xDAE0, 0xDB10, 0xDB30, 0xDB20, 0xDB50, 0xDB40, 0xDBB0, 0xDC50, 0xDC20, 0xDCD0, 0xDD20, 0xDCE0, 0xDCD0, 0xDD40, 0xDD20, + 0xDD20, 0xDD20, 0xDCF0, 0xDCB0, 0xDD00, 0xDCC0, 0xDCC0, 0xDC70, 0xDC90, 0xDCA0, 0xDC50, 0xDC90, 0xDCB0, 0xDC70, 0xDC70, 0xDC70, + 0xDC80, 0xDC90, 0xDC50, 0xDC40, 0xDC70, 0xDC30, 0xDC50, 0xDCA0, 0xDCD0, 0xDD10, 0xDD70, 0xDD80, 0xDD80, 0xDE00, 0xDE00, 0xDE90, + 0xDE50, 0xDEC0, 0xDE60, 0xDE50, 0xDE70, 0xDE80, 0xDE20, 0xDE50, 0xDEA0, 0xDEC0, 0xDEC0, 0xDED0, 0xDEE0, 0xDEF0, 0xDF10, 0xDEA0, + 0xDE60, 0xDEA0, 0xDEE0, 0xDEF0, 0xDF60, 0xDF40, 0xDFA0, 0xDFD0, 0xE000, 0xE020, 0xE030, 0xE080, 0xE0A0, 0xE0C0, 0xE0C0, 0xE110, + 0xE150, 0xE170, 0xE150, 0xE130, 0xE150, 0xE0E0, 0xE100, 0xE110, 0xE0C0, 0xE0F0, 0xE130, 0xE1C0, 0xE1F0, 0xE250, 0xE290, 0xE2A0, + 0xE350, 0xE340, 0xE310, 0xE330, 0xE390, 0xE3A0, 0xE3A0, 0xE3D0, 0xE350, 0xE340, 0xE2F0, 0xE2F0, 0xE2D0, 0xE2E0, 0xE2E0, 0xE2C0, + 0xE300, 0xE360, 0xE340, 0xE340, 0xE340, 0xE380, 0xE390, 0xE390, 0xE3B0, 0xE3E0, 0xE460, 0xE3D0, 0xE3F0, 0xE450, 0xE440, 0xE480, + 0xE4D0, 0xE530, 0xE5C0, 0xE650, 0xE6F0, 0xE7A0, 0xE7E0, 0xE880, 0xE870, 0xE870, 0xE830, 0xE8B0, 0xE860, 0xE860, 0xE870, 0xE7D0, + 0xE7E0, 0xE7E0, 0xE790, 0xE7E0, 0xE7B0, 0xE7D0, 0xE870, 0xE830, 0xE900, 0xE8B0, 0xE870, 0xE8C0, 0xE8A0, 0xE910, 0xE920, 0xE940, + 0xE9B0, 0xE950, 0xE9F0, 0xE9D0, 0xE950, 0xE960, 0xE940, 0xE940, 0xE940, 0xE930, 0xE9A0, 0xE9A0, 0xE9B0, 0xE9A0, 0xE9C0, 0xEA10, + 0xEA20, 0xEA60, 0xEA50, 0xEA80, 0xEB20, 0xEB50, 0xEBF0, 0xEBF0, 0xEC40, 0xEC50, 0xEC00, 0xEBE0, 0xEBA0, 0xEBB0, 0xEBE0, 0xEC20, + 0xEC20, 0xEC70, 0xECA0, 0xEC40, 0xECA0, 0xEC50, 0xEC70, 0xEC70, 0xECD0, 0xECB0, 0xECD0, 0xED60, 0xED00, 0xED90, 0xED80, 0xED90, + 0xEDB0, 0xED60, 0xEDC0, 0xED90, 0xED70, 0xEDA0, 0xEDA0, 0xEDF0, 0xEDF0, 0xEDB0, 0xEE00, 0xEE20, 0xEE70, 0xEEC0, 0xEE90, 0xEF30, + 0xEF30, 0xEF90, 0xEFF0, 0xF010, 0xF050, 0xF080, 0xF0C0, 0xF090, 0xF070, 0xF070, 0xF060, 0xF010, 0xF090, 0xF060, 0xF020, 0xF000, + 0xF020, 0xEFF0, 0xEFE0, 0xF050, 0xEFF0, 0xEFE0, 0xF010, 0xF030, 0xF0A0, 0xF0A0, 0xF090, 0xF060, 0xF0A0, 0xF0F0, 0xF150, 0xF130, + 0xF1B0, 0xF1A0, 0xF250, 0xF250, 0xF1A0, 0xF1C0, 0xF220, 0xF250, 0xF290, 0xF210, 0xF2B0, 0xF210, 0xF260, 0xF210, 0xF1D0, 0xF220, + 0xF220, 0xF250, 0xF280, 0xF250, 0xF2E0, 0xF350, 0xF3B0, 0xF3E0, 0xF3C0, 0xF400, 0xF3B0, 0xF3F0, 0xF420, 0xF3C0, 0xF470, 0xF430, + 0xF3E0, 0xF420, 0xF420, 0xF470, 0xF470, 0xF4A0, 0xF480, 0xF440, 0xF480, 0xF470, 0xF440, 0xF4A0, 0xF480, 0xF4E0, 0xF540, 0xF550, + 0xF5E0, 0xF5B0, 0xF5F0, 0xF5D0, 0xF5B0, 0xF5E0, 0xF5C0, 0xF630, 0xF680, 0xF600, 0xF680, 0xF6B0, 0xF6B0, 0xF680, 0xF650, 0xF670, + 0xF640, 0xF680, 0xF670, 0xF660, 0xF600, 0xF630, 0xF660, 0xF640, 0xF6C0, 0xF6B0, 0xF6C0, 0xF750, 0xF760, 0xF760, 0xF750, 0xF700, + 0xF700, 0xF720, 0xF710, 0xF730, 0xF720, 0xF760, 0xF710, 0xF760, 0xF730, 0xF770, 0xF750, 0xF7A0, 0xF7B0, 0xF7D0, 0xF7A0, 0xF800, + 0xF7F0, 0xF850, 0xF810, 0xF800, 0xF790, 0xF790, 0xF770, 0xF7A0, 0xF730, 0xF7A0, 0xF7A0, 0xF790, 0xF880, 0xF890, 0xF900, 0xF910, + 0xF890, 0xF8E0, 0xF840, 0xF800, 0xF860, 0xF870, 0xF8E0, 0xF900, 0xF900, 0xF920, 0xF8D0, 0xF8F0, 0xF880, 0xF8E0, 0xF890, 0xF860, + 0xF900, 0xF900, 0xF8F0, 0xF900, 0xF820, 0xF890, 0xF870, 0xF850, 0xF860, 0xF840, 0xF8D0, 0xF8D0, 0xF930, 0xF960, 0xF940, 0xF950, + 0xF950, 0xF970, 0xF9C0, 0xF990, 0xFA30, 0xFA20, 0xF9C0, 0xFA30, 0xFA10, 0xFA60, 0xFA20, 0xF9C0, 0xF9E0, 0xF980, 0xF990, 0xF9B0, + 0xF960, 0xFA20, 0xFA00, 0xF9E0, 0xF9B0, 0xF970, 0xF950, 0xF960, 0xF9A0, 0xF950, 0xF950, 0xF9F0, 0xFA60, 0xFA40, 0xFA80, 0xFA50, + 0xFB40, 0xFB00, 0xFB20, 0xFB40, 0xFA40, 0xFAB0, 0xFAA0, 0xFAA0, 0xFA70, 0xFA50, 0xFAD0, 0xFB00, 0xFB20, 0xFB50, 0xFB30, 0xFB60, + 0xFB40, 0xFB70, 0xFB30, 0xFB00, 0xFB00, 0xFB10, 0xFA90, 0xFAB0, 0xFAA0, 0xFB40, 0xFB90, 0xFB60, 0xFBD0, 0xFC30, 0xFC30, 0xFC20, + 0xFC00, 0xFBF0, 0xFBF0, 0xFC00, 0xFC10, 0xFB90, 0xFBE0, 0xFBC0, 0xFB90, 0xFB90, 0xFB60, 0xFB50, 0xFB20, 0xFB30, 0xFB80, 0xFB90, +}; + +#endif // MIC_BLOW_H diff --git a/src/frontend/qt_sdl/AudioSettingsDialog.cpp b/src/frontend/qt_sdl/AudioSettingsDialog.cpp new file mode 100644 index 0000000..2ff5307 --- /dev/null +++ b/src/frontend/qt_sdl/AudioSettingsDialog.cpp @@ -0,0 +1,103 @@ +/* + Copyright 2016-2020 Arisotura + + This file is part of melonDS. + + melonDS is free software: you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + melonDS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with melonDS. If not, see http://www.gnu.org/licenses/. +*/ + +#include <stdio.h> +#include <QFileDialog> + +#include "types.h" +#include "Platform.h" +#include "Config.h" +#include "PlatformConfig.h" + +#include "AudioSettingsDialog.h" +#include "ui_AudioSettingsDialog.h" + + +AudioSettingsDialog* AudioSettingsDialog::currentDlg = nullptr; + +extern char* EmuDirectory; + + +AudioSettingsDialog::AudioSettingsDialog(QWidget* parent) : QDialog(parent), ui(new Ui::AudioSettingsDialog) +{ + ui->setupUi(this); + setAttribute(Qt::WA_DeleteOnClose); + + oldVolume = Config::AudioVolume; + + ui->slVolume->setValue(Config::AudioVolume); + + grpMicMode = new QButtonGroup(this); + grpMicMode->addButton(ui->rbMicNone, 0); + grpMicMode->addButton(ui->rbMicExternal, 1); + grpMicMode->addButton(ui->rbMicNoise, 2); + grpMicMode->addButton(ui->rbMicWav, 3); + connect(grpMicMode, SIGNAL(buttonClicked(int)), this, SLOT(onChangeMicMode(int))); + grpMicMode->button(Config::MicInputType)->setChecked(true); + + ui->txtMicWavPath->setText(Config::MicWavPath); + + bool iswav = (Config::MicInputType == 3); + ui->txtMicWavPath->setEnabled(iswav); + ui->btnMicWavBrowse->setEnabled(iswav); +} + +AudioSettingsDialog::~AudioSettingsDialog() +{ + delete ui; +} + +void AudioSettingsDialog::on_AudioSettingsDialog_accepted() +{ + Config::MicInputType = grpMicMode->checkedId(); + strncpy(Config::MicWavPath, ui->txtMicWavPath->text().toStdString().c_str(), 1023); Config::MicWavPath[1023] = '\0'; + Config::Save(); + + closeDlg(); +} + +void AudioSettingsDialog::on_AudioSettingsDialog_rejected() +{ + Config::AudioVolume = oldVolume; + + closeDlg(); +} + +void AudioSettingsDialog::on_slVolume_valueChanged(int val) +{ + Config::AudioVolume = val; +} + +void AudioSettingsDialog::onChangeMicMode(int mode) +{ + bool iswav = (mode == 3); + ui->txtMicWavPath->setEnabled(iswav); + ui->btnMicWavBrowse->setEnabled(iswav); +} + +void AudioSettingsDialog::on_btnMicWavBrowse_clicked() +{ + QString file = QFileDialog::getOpenFileName(this, + "Select WAV file...", + EmuDirectory, + "WAV files (*.wav);;Any file (*.*)"); + + if (file.isEmpty()) return; + + ui->txtMicWavPath->setText(file); +} diff --git a/src/frontend/qt_sdl/AudioSettingsDialog.h b/src/frontend/qt_sdl/AudioSettingsDialog.h new file mode 100644 index 0000000..3bafa30 --- /dev/null +++ b/src/frontend/qt_sdl/AudioSettingsDialog.h @@ -0,0 +1,69 @@ +/* + Copyright 2016-2020 Arisotura + + This file is part of melonDS. + + melonDS is free software: you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + melonDS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with melonDS. If not, see http://www.gnu.org/licenses/. +*/ + +#ifndef AUDIOSETTINGSDIALOG_H +#define AUDIOSETTINGSDIALOG_H + +#include <QDialog> +#include <QButtonGroup> + +namespace Ui { class AudioSettingsDialog; } +class AudioSettingsDialog; + +class AudioSettingsDialog : public QDialog +{ + Q_OBJECT + +public: + explicit AudioSettingsDialog(QWidget* parent); + ~AudioSettingsDialog(); + + static AudioSettingsDialog* currentDlg; + static AudioSettingsDialog* openDlg(QWidget* parent) + { + if (currentDlg) + { + currentDlg->activateWindow(); + return currentDlg; + } + + currentDlg = new AudioSettingsDialog(parent); + currentDlg->show(); + return currentDlg; + } + static void closeDlg() + { + currentDlg = nullptr; + } + +private slots: + void on_AudioSettingsDialog_accepted(); + void on_AudioSettingsDialog_rejected(); + + void on_slVolume_valueChanged(int val); + void onChangeMicMode(int mode); + void on_btnMicWavBrowse_clicked(); + +private: + Ui::AudioSettingsDialog* ui; + + int oldVolume; + QButtonGroup* grpMicMode; +}; + +#endif // AUDIOSETTINGSDIALOG_H diff --git a/src/frontend/qt_sdl/AudioSettingsDialog.ui b/src/frontend/qt_sdl/AudioSettingsDialog.ui new file mode 100644 index 0000000..bcaf937 --- /dev/null +++ b/src/frontend/qt_sdl/AudioSettingsDialog.ui @@ -0,0 +1,174 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>AudioSettingsDialog</class> + <widget class="QDialog" name="AudioSettingsDialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>482</width> + <height>230</height> + </rect> + </property> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="windowTitle"> + <string>Audio settings - melonDS</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <property name="sizeConstraint"> + <enum>QLayout::SetFixedSize</enum> + </property> + <item> + <widget class="QGroupBox" name="groupBox"> + <property name="title"> + <string>Audio output</string> + </property> + <layout class="QGridLayout" name="gridLayout_2"> + <item row="0" column="0"> + <widget class="QLabel" name="label"> + <property name="text"> + <string>Volume:</string> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QSlider" name="slVolume"> + <property name="whatsThis"> + <string><html><head/><body><p>Controls the volume of the audio output.</p></body></html></string> + </property> + <property name="maximum"> + <number>256</number> + </property> + <property name="pageStep"> + <number>16</number> + </property> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QGroupBox" name="groupBox_2"> + <property name="title"> + <string>Microphone input</string> + </property> + <layout class="QGridLayout" name="gridLayout"> + <item row="3" column="1"> + <widget class="QLineEdit" name="txtMicWavPath"> + <property name="minimumSize"> + <size> + <width>290</width> + <height>0</height> + </size> + </property> + <property name="whatsThis"> + <string><html><head/><body><p>Forward a WAV file to the emulated microphone.</p><p>This input mode is activated by holding the microphone hotkey (see Input and Hotkeys).</p></body></html></string> + </property> + </widget> + </item> + <item row="3" column="0"> + <widget class="QRadioButton" name="rbMicWav"> + <property name="whatsThis"> + <string><html><head/><body><p>Forward a WAV file to the emulated microphone.</p><p>This input mode is activated by holding the microphone hotkey (see Input and Hotkeys).</p></body></html></string> + </property> + <property name="text"> + <string>WAV file:</string> + </property> + </widget> + </item> + <item row="3" column="2"> + <widget class="QPushButton" name="btnMicWavBrowse"> + <property name="text"> + <string>Browse...</string> + </property> + </widget> + </item> + <item row="1" column="0" colspan="3"> + <widget class="QRadioButton" name="rbMicExternal"> + <property name="whatsThis"> + <string><html><head/><body><p>Input from an external microphone, if available, will be forwarded to the emulated microphone.</p></body></html></string> + </property> + <property name="text"> + <string>External microphone</string> + </property> + </widget> + </item> + <item row="2" column="0" colspan="3"> + <widget class="QRadioButton" name="rbMicNoise"> + <property name="whatsThis"> + <string><html><head/><body><p>Noise will be forwarded to the emulated microphone, simulating blowing into the microphone.</p><p>This input mode is activated by holding the microphone hotkey (see Input and Hotkeys).</p></body></html></string> + </property> + <property name="text"> + <string>Blow noise</string> + </property> + </widget> + </item> + <item row="0" column="0" colspan="3"> + <widget class="QRadioButton" name="rbMicNone"> + <property name="whatsThis"> + <string><html><head/><body><p>No microphone input.</p></body></html></string> + </property> + <property name="text"> + <string>None</string> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> + </property> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections> + <connection> + <sender>buttonBox</sender> + <signal>accepted()</signal> + <receiver>AudioSettingsDialog</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel"> + <x>248</x> + <y>254</y> + </hint> + <hint type="destinationlabel"> + <x>157</x> + <y>274</y> + </hint> + </hints> + </connection> + <connection> + <sender>buttonBox</sender> + <signal>rejected()</signal> + <receiver>AudioSettingsDialog</receiver> + <slot>reject()</slot> + <hints> + <hint type="sourcelabel"> + <x>316</x> + <y>260</y> + </hint> + <hint type="destinationlabel"> + <x>286</x> + <y>274</y> + </hint> + </hints> + </connection> + </connections> +</ui> diff --git a/src/frontend/qt_sdl/CMakeLists.txt b/src/frontend/qt_sdl/CMakeLists.txt index 0b39a1c..1559cd4 100644 --- a/src/frontend/qt_sdl/CMakeLists.txt +++ b/src/frontend/qt_sdl/CMakeLists.txt @@ -2,56 +2,93 @@ project(qt_sdl) SET(SOURCES_QT_SDL main.cpp + main_shaders.h + EmuSettingsDialog.cpp + InputConfigDialog.cpp + VideoSettingsDialog.cpp + AudioSettingsDialog.cpp + WifiSettingsDialog.cpp + Input.cpp + LAN_PCap.cpp + LAN_Socket.cpp + OSD.cpp + OSD_shaders.h + font.h Platform.cpp PlatformConfig.cpp - + ../Util_ROM.cpp + ../Util_Video.cpp ../Util_Audio.cpp ../FrontendUtil.h + ../mic_blow.h + + ../../../melon.qrc ) if (WIN32) set(CMAKE_RC_COMPILE_OBJECT "<CMAKE_RC_COMPILER> -i <SOURCE> -o <OBJECT>") endif() -find_package(Qt5 COMPONENTS Core REQUIRED) -find_package(Qt5 COMPONENTS Gui REQUIRED) -find_package(Qt5 COMPONENTS Widgets REQUIRED) -find_package(Threads REQUIRED) +if (BUILD_STATIC AND QT5_STATIC_DIR) + set(QT5_STATIC_BASE ${QT5_STATIC_DIR}/lib/cmake/Qt5) + set(Qt5_DIR ${QT5_STATIC_BASE}) + set(Qt5Core_DIR ${QT5_STATIC_BASE}Core) + set(Qt5Gui_DIR ${QT5_STATIC_BASE}Gui) + set(Qt5Widgets_DIR ${QT5_STATIC_BASE}Widgets) +endif() + +find_package(Qt5 COMPONENTS Core Gui Widgets REQUIRED) set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTOUIC ON) +set(CMAKE_AUTORCC ON) find_package(PkgConfig REQUIRED) pkg_check_modules(SDL2 REQUIRED sdl2) -add_executable(melonDS ${SOURCES_QT_SDL}) +if (WIN32 AND (CMAKE_BUILD_TYPE STREQUAL Release)) + add_executable(melonDS WIN32 ${SOURCES_QT_SDL}) +else() + add_executable(melonDS ${SOURCES_QT_SDL}) +endif() + target_include_directories(melonDS PRIVATE ${SDL2_INCLUDE_DIRS}) +target_include_directories(melonDS PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}") target_include_directories(melonDS PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/..") target_include_directories(melonDS PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/../..") -target_link_libraries(melonDS core ${SDL2_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT}) +target_link_libraries(melonDS core) + +if (BUILD_STATIC) + target_link_libraries(melonDS -static ${SDL2_LIBRARIES}) +else() + target_link_libraries(melonDS ${SDL2_LIBRARIES}) +endif() if (UNIX) option(PORTABLE "Make a portable build that looks for its configuration in the current directory" OFF) - - if (CMAKE_SYSTEM_NAME STREQUAL "Linux") - target_link_libraries(melonDS dl Qt5::Core Qt5::Gui Qt5::Widgets) - endif () + target_link_libraries(melonDS dl Qt5::Core Qt5::Gui Qt5::Widgets) elseif (WIN32) option(PORTABLE "Make a portable build that looks for its configuration in the current directory" ON) target_sources(melonDS PUBLIC "${CMAKE_SOURCE_DIR}/melon.rc") - target_link_libraries(melonDS comctl32 d2d1 dwrite uxtheme ws2_32 iphlpapi gdi32 Qt5::Core Qt5::Gui Qt5::Widgets) -endif () + + target_link_libraries(melonDS comctl32 d2d1 dwrite uxtheme ws2_32 iphlpapi gdi32) + if (BUILD_STATIC) + target_link_libraries(melonDS imm32 winmm version setupapi -static Qt5::Core Qt5::Gui Qt5::Widgets z zstd) + else() + target_link_libraries(melonDS Qt5::Core Qt5::Gui Qt5::Widgets) + endif() +endif() if (PORTABLE) add_definitions(-DPORTABLE) endif() -install(FILES ../../net.kuribo64.melonDS.desktop DESTINATION ${CMAKE_INSTALL_PREFIX}/share/applications) -install(FILES ../../icon/melon_16x16.png DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/16x16/apps RENAME net.kuribo64.melonDS.png) -install(FILES ../../icon/melon_32x32.png DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/32x32/apps RENAME net.kuribo64.melonDS.png) -install(FILES ../../icon/melon_48x48.png DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/48x48/apps RENAME net.kuribo64.melonDS.png) -install(FILES ../../icon/melon_64x64.png DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/64x64/apps RENAME net.kuribo64.melonDS.png) -install(FILES ../../icon/melon_128x128.png DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/128x128/apps RENAME net.kuribo64.melonDS.png) -install(FILES ../../icon/melon_256x256.png DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/256x256/apps RENAME net.kuribo64.melonDS.png) -install(FILES ../../romlist.bin DESTINATION ${CMAKE_INSTALL_PREFIX}/share/melonDS) +install(FILES ../../../net.kuribo64.melonDS.desktop DESTINATION ${CMAKE_INSTALL_PREFIX}/share/applications) +install(FILES ../../../icon/melon_16x16.png DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/16x16/apps RENAME net.kuribo64.melonDS.png) +install(FILES ../../../icon/melon_32x32.png DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/32x32/apps RENAME net.kuribo64.melonDS.png) +install(FILES ../../../icon/melon_48x48.png DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/48x48/apps RENAME net.kuribo64.melonDS.png) +install(FILES ../../../icon/melon_64x64.png DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/64x64/apps RENAME net.kuribo64.melonDS.png) +install(FILES ../../../icon/melon_128x128.png DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/128x128/apps RENAME net.kuribo64.melonDS.png) +install(FILES ../../../icon/melon_256x256.png DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/256x256/apps RENAME net.kuribo64.melonDS.png) install(TARGETS melonDS RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin) diff --git a/src/frontend/qt_sdl/EmuSettingsDialog.cpp b/src/frontend/qt_sdl/EmuSettingsDialog.cpp new file mode 100644 index 0000000..09faf4e --- /dev/null +++ b/src/frontend/qt_sdl/EmuSettingsDialog.cpp @@ -0,0 +1,213 @@ +/* + Copyright 2016-2020 Arisotura + + This file is part of melonDS. + + melonDS is free software: you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + melonDS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with melonDS. If not, see http://www.gnu.org/licenses/. +*/ + +#include <stdio.h> +#include <QFileDialog> +#include <QMessageBox> + +#include "types.h" +#include "Platform.h" +#include "Config.h" +#include "PlatformConfig.h" + +#include "EmuSettingsDialog.h" +#include "ui_EmuSettingsDialog.h" + + +EmuSettingsDialog* EmuSettingsDialog::currentDlg = nullptr; + +extern char* EmuDirectory; + + +EmuSettingsDialog::EmuSettingsDialog(QWidget* parent) : QDialog(parent), ui(new Ui::EmuSettingsDialog) +{ + ui->setupUi(this); + setAttribute(Qt::WA_DeleteOnClose); + + ui->txtBIOS9Path->setText(Config::BIOS9Path); + ui->txtBIOS7Path->setText(Config::BIOS7Path); + ui->txtFirmwarePath->setText(Config::FirmwarePath); + + ui->txtDSiBIOS9Path->setText(Config::DSiBIOS9Path); + ui->txtDSiBIOS7Path->setText(Config::DSiBIOS7Path); + ui->txtDSiFirmwarePath->setText(Config::DSiFirmwarePath); + ui->txtDSiNANDPath->setText(Config::DSiNANDPath); + + ui->cbxConsoleType->addItem("DS"); + ui->cbxConsoleType->addItem("DSi (experimental)"); + ui->cbxConsoleType->setCurrentIndex(Config::ConsoleType); + + ui->chkDirectBoot->setChecked(Config::DirectBoot != 0); +} + +EmuSettingsDialog::~EmuSettingsDialog() +{ + delete ui; +} + +void EmuSettingsDialog::verifyFirmware() +{ + // verify the firmware + // + // there are dumps of an old hacked firmware floating around on the internet + // and those are problematic + // the hack predates WFC, and, due to this, any game that alters the WFC + // access point data will brick that firmware due to it having critical + // data in the same area. it has the same problem on hardware. + // + // but this should help stop users from reporting that issue over and over + // again, when the issue is not from melonDS but from their firmware dump. + // + // I don't know about all the firmware hacks in existence, but the one I + // looked at has 0x180 bytes from the header repeated at 0x3FC80, but + // bytes 0x0C-0x14 are different. + + char filename[1024]; + strncpy(filename, ui->txtFirmwarePath->text().toStdString().c_str(), 1023); filename[1023] = '\0'; + FILE* f = Platform::OpenLocalFile(filename, "rb"); + u8 chk1[0x180], chk2[0x180]; + + fseek(f, 0, SEEK_SET); + fread(chk1, 1, 0x180, f); + fseek(f, -0x380, SEEK_END); + fread(chk2, 1, 0x180, f); + + memset(&chk1[0x0C], 0, 8); + memset(&chk2[0x0C], 0, 8); + + fclose(f); + + if (!memcmp(chk1, chk2, 0x180)) + { + QMessageBox::warning((QWidget*)this->parent(), + "Problematic firmware dump", + "You are using an old hacked firmware dump.\n" + "Firmware boot will stop working if you run any game that alters WFC settings.\n\n" + "Note that the issue is not from melonDS, it would also happen on an actual DS."); + } +} + +void EmuSettingsDialog::on_EmuSettingsDialog_accepted() +{ + verifyFirmware(); + + strncpy(Config::BIOS9Path, ui->txtBIOS9Path->text().toStdString().c_str(), 1023); Config::BIOS9Path[1023] = '\0'; + strncpy(Config::BIOS7Path, ui->txtBIOS7Path->text().toStdString().c_str(), 1023); Config::BIOS7Path[1023] = '\0'; + strncpy(Config::FirmwarePath, ui->txtFirmwarePath->text().toStdString().c_str(), 1023); Config::FirmwarePath[1023] = '\0'; + + strncpy(Config::DSiBIOS9Path, ui->txtDSiBIOS9Path->text().toStdString().c_str(), 1023); Config::DSiBIOS9Path[1023] = '\0'; + strncpy(Config::DSiBIOS7Path, ui->txtDSiBIOS7Path->text().toStdString().c_str(), 1023); Config::DSiBIOS7Path[1023] = '\0'; + strncpy(Config::DSiFirmwarePath, ui->txtDSiFirmwarePath->text().toStdString().c_str(), 1023); Config::DSiFirmwarePath[1023] = '\0'; + strncpy(Config::DSiNANDPath, ui->txtDSiNANDPath->text().toStdString().c_str(), 1023); Config::DSiNANDPath[1023] = '\0'; + + Config::ConsoleType = ui->cbxConsoleType->currentIndex(); + Config::DirectBoot = ui->chkDirectBoot->isChecked() ? 1:0; + + Config::Save(); + + closeDlg(); +} + +void EmuSettingsDialog::on_EmuSettingsDialog_rejected() +{ + closeDlg(); +} + +void EmuSettingsDialog::on_btnBIOS9Browse_clicked() +{ + QString file = QFileDialog::getOpenFileName(this, + "Select DS-mode ARM9 BIOS...", + EmuDirectory, + "BIOS files (*.bin *.rom);;Any file (*.*)"); + + if (file.isEmpty()) return; + + ui->txtBIOS9Path->setText(file); +} + +void EmuSettingsDialog::on_btnBIOS7Browse_clicked() +{ + QString file = QFileDialog::getOpenFileName(this, + "Select DS-mode ARM7 BIOS...", + EmuDirectory, + "BIOS files (*.bin *.rom);;Any file (*.*)"); + + if (file.isEmpty()) return; + + ui->txtBIOS7Path->setText(file); +} + +void EmuSettingsDialog::on_btnFirmwareBrowse_clicked() +{ + QString file = QFileDialog::getOpenFileName(this, + "Select DS-mode firmware...", + EmuDirectory, + "Firmware files (*.bin *.rom);;Any file (*.*)"); + + if (file.isEmpty()) return; + + ui->txtFirmwarePath->setText(file); +} + +void EmuSettingsDialog::on_btnDSiBIOS9Browse_clicked() +{ + QString file = QFileDialog::getOpenFileName(this, + "Select DSi-mode ARM9 BIOS...", + EmuDirectory, + "BIOS files (*.bin *.rom);;Any file (*.*)"); + + if (file.isEmpty()) return; + + ui->txtDSiBIOS9Path->setText(file); +} + +void EmuSettingsDialog::on_btnDSiBIOS7Browse_clicked() +{ + QString file = QFileDialog::getOpenFileName(this, + "Select DSi-mode ARM7 BIOS...", + EmuDirectory, + "BIOS files (*.bin *.rom);;Any file (*.*)"); + + if (file.isEmpty()) return; + + ui->txtDSiBIOS7Path->setText(file); +} + +void EmuSettingsDialog::on_btnDSiFirmwareBrowse_clicked() +{ + QString file = QFileDialog::getOpenFileName(this, + "Select DSi DS-mode firmware...", + EmuDirectory, + "Firmware files (*.bin *.rom);;Any file (*.*)"); + + if (file.isEmpty()) return; + + ui->txtDSiFirmwarePath->setText(file); +} + +void EmuSettingsDialog::on_btnDSiNANDBrowse_clicked() +{ + QString file = QFileDialog::getOpenFileName(this, + "Select DSi NAND...", + EmuDirectory, + "NAND files (*.bin *.rom);;Any file (*.*)"); + + if (file.isEmpty()) return; + + ui->txtDSiNANDPath->setText(file); +} diff --git a/src/frontend/qt_sdl/EmuSettingsDialog.h b/src/frontend/qt_sdl/EmuSettingsDialog.h new file mode 100644 index 0000000..f604ba5 --- /dev/null +++ b/src/frontend/qt_sdl/EmuSettingsDialog.h @@ -0,0 +1,72 @@ +/* + Copyright 2016-2020 Arisotura + + This file is part of melonDS. + + melonDS is free software: you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + melonDS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with melonDS. If not, see http://www.gnu.org/licenses/. +*/ + +#ifndef EMUSETTINGSDIALOG_H +#define EMUSETTINGSDIALOG_H + +#include <QDialog> + +namespace Ui { class EmuSettingsDialog; } +class EmuSettingsDialog; + +class EmuSettingsDialog : public QDialog +{ + Q_OBJECT + +public: + explicit EmuSettingsDialog(QWidget* parent); + ~EmuSettingsDialog(); + + static EmuSettingsDialog* currentDlg; + static EmuSettingsDialog* openDlg(QWidget* parent) + { + if (currentDlg) + { + currentDlg->activateWindow(); + return currentDlg; + } + + currentDlg = new EmuSettingsDialog(parent); + currentDlg->show(); + return currentDlg; + } + static void closeDlg() + { + currentDlg = nullptr; + } + +private slots: + void on_EmuSettingsDialog_accepted(); + void on_EmuSettingsDialog_rejected(); + + void on_btnBIOS9Browse_clicked(); + void on_btnBIOS7Browse_clicked(); + void on_btnFirmwareBrowse_clicked(); + + void on_btnDSiBIOS9Browse_clicked(); + void on_btnDSiBIOS7Browse_clicked(); + void on_btnDSiFirmwareBrowse_clicked(); + void on_btnDSiNANDBrowse_clicked(); + +private: + void verifyFirmware(); + + Ui::EmuSettingsDialog* ui; +}; + +#endif // EMUSETTINGSDIALOG_H diff --git a/src/frontend/qt_sdl/EmuSettingsDialog.ui b/src/frontend/qt_sdl/EmuSettingsDialog.ui new file mode 100644 index 0000000..4894fa5 --- /dev/null +++ b/src/frontend/qt_sdl/EmuSettingsDialog.ui @@ -0,0 +1,313 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>EmuSettingsDialog</class> + <widget class="QDialog" name="EmuSettingsDialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>490</width> + <height>392</height> + </rect> + </property> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="windowTitle"> + <string>Emu settings - melonDS</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <property name="sizeConstraint"> + <enum>QLayout::SetFixedSize</enum> + </property> + <item> + <widget class="QGroupBox" name="groupBox"> + <property name="title"> + <string>DS mode</string> + </property> + <layout class="QGridLayout" name="gridLayout_2"> + <item row="0" column="1"> + <widget class="QLineEdit" name="txtBIOS9Path"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>290</width> + <height>0</height> + </size> + </property> + <property name="statusTip"> + <string/> + </property> + <property name="whatsThis"> + <string><html><head/><body><p>DS-mode ARM9 BIOS</p><p>Size should be 4 KB</p></body></html></string> + </property> + </widget> + </item> + <item row="2" column="0"> + <widget class="QLabel" name="label_3"> + <property name="text"> + <string>DS firmware:</string> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="label_2"> + <property name="text"> + <string>DS ARM7 BIOS:</string> + </property> + </widget> + </item> + <item row="0" column="0"> + <widget class="QLabel" name="label"> + <property name="text"> + <string>DS ARM9 BIOS:</string> + </property> + </widget> + </item> + <item row="0" column="2"> + <widget class="QPushButton" name="btnBIOS9Browse"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Browse...</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QLineEdit" name="txtBIOS7Path"> + <property name="whatsThis"> + <string><html><head/><body><p>DS-mode ARM7 BIOS</p><p>Size should be 16 KB</p></body></html></string> + </property> + </widget> + </item> + <item row="1" column="2"> + <widget class="QPushButton" name="btnBIOS7Browse"> + <property name="text"> + <string>Browse...</string> + </property> + </widget> + </item> + <item row="2" column="1"> + <widget class="QLineEdit" name="txtFirmwarePath"> + <property name="whatsThis"> + <string><html><head/><body><p>DS-mode firmware</p><p><br/></p><p>Possible firmwares:</p><p>* 128 KB: DS-mode firmware from a DSi or 3DS. Not bootable.</p><p>* 256 KB: regular DS firmware.</p><p>* 512 KB: iQue DS firmware.</p></body></html></string> + </property> + </widget> + </item> + <item row="2" column="2"> + <widget class="QPushButton" name="btnFirmwareBrowse"> + <property name="text"> + <string>Browse...</string> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QGroupBox" name="groupBox_3"> + <property name="title"> + <string>DSi mode</string> + </property> + <layout class="QGridLayout" name="gridLayout_3"> + <item row="0" column="2"> + <widget class="QPushButton" name="btnDSiBIOS9Browse"> + <property name="text"> + <string>Browse...</string> + </property> + </widget> + </item> + <item row="0" column="0"> + <widget class="QLabel" name="label_5"> + <property name="text"> + <string>DSi ARM9 BIOS:</string> + </property> + </widget> + </item> + <item row="2" column="2"> + <widget class="QPushButton" name="btnDSiFirmwareBrowse"> + <property name="text"> + <string>Browse...</string> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QLineEdit" name="txtDSiBIOS7Path"> + <property name="whatsThis"> + <string><html><head/><body><p>DSi-mode ARM7 BIOS</p><p><br/></p><p>Size should be 64 KB</p></body></html></string> + </property> + </widget> + </item> + <item row="2" column="1"> + <widget class="QLineEdit" name="txtDSiFirmwarePath"> + <property name="whatsThis"> + <string><html><head/><body><p>DSi-mode firmware (used for DS-mode backwards compatibility)</p><p><br/></p><p>Size should be 128 KB</p></body></html></string> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="label_6"> + <property name="text"> + <string>DSi ARM7 BIOS:</string> + </property> + </widget> + </item> + <item row="2" column="0"> + <widget class="QLabel" name="label_7"> + <property name="text"> + <string>DSi firmware:</string> + </property> + </widget> + </item> + <item row="1" column="2"> + <widget class="QPushButton" name="btnDSiBIOS7Browse"> + <property name="text"> + <string>Browse...</string> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QLineEdit" name="txtDSiBIOS9Path"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="whatsThis"> + <string><html><head/><body><p>DSi-mode ARM9 BIOS</p><p><br/></p><p>Size should be 64 KB</p></body></html></string> + </property> + </widget> + </item> + <item row="3" column="0"> + <widget class="QLabel" name="label_8"> + <property name="text"> + <string>DSi NAND:</string> + </property> + </widget> + </item> + <item row="3" column="1"> + <widget class="QLineEdit" name="txtDSiNANDPath"> + <property name="whatsThis"> + <string><html><head/><body><p>DSi NAND dump</p><p><br/></p><p>Should have 'nocash footer' at the end</p></body></html></string> + </property> + </widget> + </item> + <item row="3" column="2"> + <widget class="QPushButton" name="btnDSiNANDBrowse"> + <property name="text"> + <string>Browse...</string> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QGroupBox" name="groupBox_2"> + <property name="title"> + <string>General</string> + </property> + <layout class="QGridLayout" name="gridLayout"> + <item row="0" column="0"> + <widget class="QLabel" name="label_4"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Console type:</string> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QComboBox" name="cbxConsoleType"> + <property name="sizePolicy"> + <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="whatsThis"> + <string><html><head/><body><p>The type of console to emulate</p></body></html></string> + </property> + </widget> + </item> + <item row="1" column="0" colspan="2"> + <widget class="QCheckBox" name="chkDirectBoot"> + <property name="whatsThis"> + <string><html><head/><body><p>When loading a ROM, completely skip the regular boot process (&quot;Nintendo DS&quot; screen) to boot the ROM directly.</p><p><br/></p><p>Note: if your firmware dump isn't bootable, the ROM will be booted directly regardless of this setting.</p></body></html></string> + </property> + <property name="text"> + <string>Boot game directly</string> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> + </property> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections> + <connection> + <sender>buttonBox</sender> + <signal>accepted()</signal> + <receiver>EmuSettingsDialog</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel"> + <x>248</x> + <y>254</y> + </hint> + <hint type="destinationlabel"> + <x>157</x> + <y>274</y> + </hint> + </hints> + </connection> + <connection> + <sender>buttonBox</sender> + <signal>rejected()</signal> + <receiver>EmuSettingsDialog</receiver> + <slot>reject()</slot> + <hints> + <hint type="sourcelabel"> + <x>316</x> + <y>260</y> + </hint> + <hint type="destinationlabel"> + <x>286</x> + <y>274</y> + </hint> + </hints> + </connection> + </connections> +</ui> diff --git a/src/frontend/qt_sdl/Input.cpp b/src/frontend/qt_sdl/Input.cpp new file mode 100644 index 0000000..84d20ad --- /dev/null +++ b/src/frontend/qt_sdl/Input.cpp @@ -0,0 +1,244 @@ +/* + Copyright 2016-2020 Arisotura + + This file is part of melonDS. + + melonDS is free software: you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + melonDS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with melonDS. If not, see http://www.gnu.org/licenses/. +*/ + +#include <QKeyEvent> +#include <SDL2/SDL.h> + +#include "Input.h" +#include "PlatformConfig.h" + + +namespace Input +{ + +int JoystickID; +SDL_Joystick* Joystick = nullptr; + +u32 KeyInputMask, JoyInputMask; +u32 KeyHotkeyMask, JoyHotkeyMask; +u32 HotkeyMask, LastHotkeyMask; +u32 HotkeyPress, HotkeyRelease; + +u32 InputMask; + + +void Init() +{ + KeyInputMask = 0xFFF; + JoyInputMask = 0xFFF; + InputMask = 0xFFF; + + KeyHotkeyMask = 0; + JoyHotkeyMask = 0; + HotkeyMask = 0; + LastHotkeyMask = 0; +} + + +void OpenJoystick() +{ + if (Joystick) SDL_JoystickClose(Joystick); + + int num = SDL_NumJoysticks(); + if (num < 1) + { + Joystick = nullptr; + return; + } + + if (JoystickID >= num) + JoystickID = 0; + + Joystick = SDL_JoystickOpen(JoystickID); +} + +void CloseJoystick() +{ + if (Joystick) + { + SDL_JoystickClose(Joystick); + Joystick = nullptr; + } +} + + +int GetEventKeyVal(QKeyEvent* event) +{ + int key = event->key(); + int mod = event->modifiers(); + bool ismod = (key == Qt::Key_Control || + key == Qt::Key_Alt || + key == Qt::Key_AltGr || + key == Qt::Key_Shift || + key == Qt::Key_Meta); + + if (!ismod) + key |= mod; + else if (Input::IsRightModKey(event)) + key |= (1<<31); + + return key; +} + +void KeyPress(QKeyEvent* event) +{ + int keyHK = GetEventKeyVal(event); + int keyKP = keyHK & ~event->modifiers(); + + for (int i = 0; i < 12; i++) + if (keyKP == Config::KeyMapping[i]) + KeyInputMask &= ~(1<<i); + + for (int i = 0; i < HK_MAX; i++) + if (keyHK == Config::HKKeyMapping[i]) + KeyHotkeyMask |= (1<<i); +} + +void KeyRelease(QKeyEvent* event) +{ + int keyHK = GetEventKeyVal(event); + int keyKP = keyHK & ~event->modifiers(); + + for (int i = 0; i < 12; i++) + if (keyKP == Config::KeyMapping[i]) + KeyInputMask |= (1<<i); + + for (int i = 0; i < HK_MAX; i++) + if (keyHK == Config::HKKeyMapping[i]) + KeyHotkeyMask &= ~(1<<i); +} + + +bool JoystickButtonDown(int val) +{ + if (val == -1) return false; + + bool hasbtn = ((val & 0xFFFF) != 0xFFFF); + + if (hasbtn) + { + if (val & 0x100) + { + int hatnum = (val >> 4) & 0xF; + int hatdir = val & 0xF; + Uint8 hatval = SDL_JoystickGetHat(Joystick, hatnum); + + bool pressed = false; + if (hatdir == 0x1) pressed = (hatval & SDL_HAT_UP); + else if (hatdir == 0x4) pressed = (hatval & SDL_HAT_DOWN); + else if (hatdir == 0x2) pressed = (hatval & SDL_HAT_RIGHT); + else if (hatdir == 0x8) pressed = (hatval & SDL_HAT_LEFT); + + if (pressed) return true; + } + else + { + int btnnum = val & 0xFFFF; + Uint8 btnval = SDL_JoystickGetButton(Joystick, btnnum); + + if (btnval) return true; + } + } + + if (val & 0x10000) + { + int axisnum = (val >> 24) & 0xF; + int axisdir = (val >> 20) & 0xF; + Sint16 axisval = SDL_JoystickGetAxis(Joystick, axisnum); + + switch (axisdir) + { + case 0: // positive + if (axisval > 16384) return true; + break; + + case 1: // negative + if (axisval < -16384) return true; + break; + + case 2: // trigger + if (axisval > 0) return true; + break; + } + } + + return false; +} + +void Process() +{ + SDL_JoystickUpdate(); + + if (Joystick) + { + if (!SDL_JoystickGetAttached(Joystick)) + { + SDL_JoystickClose(Joystick); + Joystick = NULL; + } + } + if (!Joystick && (SDL_NumJoysticks() > 0)) + { + JoystickID = Config::JoystickID; + OpenJoystick(); + } + + JoyInputMask = 0xFFF; + for (int i = 0; i < 12; i++) + if (JoystickButtonDown(Config::JoyMapping[i])) + JoyInputMask &= ~(1<<i); + + InputMask = KeyInputMask & JoyInputMask; + + JoyHotkeyMask = 0; + for (int i = 0; i < HK_MAX; i++) + if (JoystickButtonDown(Config::HKJoyMapping[i])) + JoyHotkeyMask |= (1<<i); + + HotkeyMask = KeyHotkeyMask | JoyHotkeyMask; + HotkeyPress = HotkeyMask & ~LastHotkeyMask; + HotkeyRelease = LastHotkeyMask & ~HotkeyMask; + LastHotkeyMask = HotkeyMask; +} + + +bool HotkeyDown(int id) { return HotkeyMask & (1<<id); } +bool HotkeyPressed(int id) { return HotkeyPress & (1<<id); } +bool HotkeyReleased(int id) { return HotkeyRelease & (1<<id); } + + +// TODO: MacOS version of this! +// distinguish between left and right modifier keys (Ctrl, Alt, Shift) +// Qt provides no real cross-platform way to do this, so here we go +// for Windows and Linux we can distinguish via scancodes (but both +// provide different scancodes) +#ifdef __WIN32__ +bool IsRightModKey(QKeyEvent* event) +{ + quint32 scan = event->nativeScanCode(); + return (scan == 0x11D || scan == 0x138 || scan == 0x36); +} +#else +bool IsRightModKey(QKeyEvent* event) +{ + quint32 scan = event->nativeScanCode(); + return (scan == 0x69 || scan == 0x6C || scan == 0x3E); +} +#endif + +} diff --git a/src/frontend/qt_sdl/Input.h b/src/frontend/qt_sdl/Input.h new file mode 100644 index 0000000..14e7ea8 --- /dev/null +++ b/src/frontend/qt_sdl/Input.h @@ -0,0 +1,51 @@ +/* + Copyright 2016-2020 Arisotura + + This file is part of melonDS. + + melonDS is free software: you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + melonDS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with melonDS. If not, see http://www.gnu.org/licenses/. +*/ + +#ifndef INPUT_H +#define INPUT_H + +#include "types.h" + +namespace Input +{ + +extern int JoystickID; +extern SDL_Joystick* Joystick; + +extern u32 InputMask; + +void Init(); + +// set joystickID before calling openJoystick() +void OpenJoystick(); +void CloseJoystick(); + +void KeyPress(QKeyEvent* event); +void KeyRelease(QKeyEvent* event); + +void Process(); + +bool HotkeyDown(int id); +bool HotkeyPressed(int id); +bool HotkeyReleased(int id); + +bool IsRightModKey(QKeyEvent* event); + +} + +#endif // INPUT_H diff --git a/src/frontend/qt_sdl/InputConfigDialog.cpp b/src/frontend/qt_sdl/InputConfigDialog.cpp new file mode 100644 index 0000000..81baa65 --- /dev/null +++ b/src/frontend/qt_sdl/InputConfigDialog.cpp @@ -0,0 +1,494 @@ +/* + Copyright 2016-2020 Arisotura + + This file is part of melonDS. + + melonDS is free software: you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + melonDS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with melonDS. If not, see http://www.gnu.org/licenses/. +*/ + +#include <QGroupBox> +#include <QLabel> +#include <QKeyEvent> + +#include <SDL2/SDL.h> + +#include "types.h" +#include "Config.h" +#include "PlatformConfig.h" + +#include "Input.h" +#include "InputConfigDialog.h" +#include "ui_InputConfigDialog.h" + + +InputConfigDialog* InputConfigDialog::currentDlg = nullptr; + +const int dskeyorder[12] = {0, 1, 10, 11, 5, 4, 6, 7, 9, 8, 2, 3}; +const char* dskeylabels[12] = {"A", "B", "X", "Y", "Left", "Right", "Up", "Down", "L", "R", "Select", "Start"}; + +const int hk_addons[] = +{ + HK_SolarSensorIncrease, + HK_SolarSensorDecrease, +}; + +const char* hk_addons_labels[] = +{ + "[Boktai] Sunlight + ", + "[Boktai] Sunlight - ", +}; + +const int hk_general[] = +{ + HK_Pause, + HK_Reset, + HK_FastForward, + HK_FastForwardToggle, + HK_Lid, + HK_Mic, +}; + +const char* hk_general_labels[] = +{ + "Pause/resume", + "Reset", + "Fast forward", + "Toggle FPS limit", + "Close/open lid", + "Microphone", +}; + + +InputConfigDialog::InputConfigDialog(QWidget* parent) : QDialog(parent), ui(new Ui::InputConfigDialog) +{ + ui->setupUi(this); + setAttribute(Qt::WA_DeleteOnClose); + + for (int i = 0; i < 12; i++) + { + keypadKeyMap[i] = Config::KeyMapping[dskeyorder[i]]; + keypadJoyMap[i] = Config::JoyMapping[dskeyorder[i]]; + } + + for (int i = 0; i < 2; i++) + { + addonsKeyMap[i] = Config::HKKeyMapping[hk_addons[i]]; + addonsJoyMap[i] = Config::HKJoyMapping[hk_addons[i]]; + } + + for (int i = 0; i < 6; i++) + { + hkGeneralKeyMap[i] = Config::HKKeyMapping[hk_general[i]]; + hkGeneralJoyMap[i] = Config::HKJoyMapping[hk_general[i]]; + } + + populatePage(ui->tabInput, 12, dskeylabels, keypadKeyMap, keypadJoyMap); + populatePage(ui->tabAddons, 2, hk_addons_labels, addonsKeyMap, addonsJoyMap); + populatePage(ui->tabHotkeysGeneral, 6, hk_general_labels, hkGeneralKeyMap, hkGeneralJoyMap); + + int njoy = SDL_NumJoysticks(); + if (njoy > 0) + { + for (int i = 0; i < njoy; i++) + { + const char* name = SDL_JoystickNameForIndex(i); + ui->cbxJoystick->addItem(QString(name)); + } + ui->cbxJoystick->setCurrentIndex(Input::JoystickID); + } + else + { + ui->cbxJoystick->addItem("(no joysticks available)"); + ui->cbxJoystick->setEnabled(false); + } +} + +InputConfigDialog::~InputConfigDialog() +{ + delete ui; +} + +void InputConfigDialog::populatePage(QWidget* page, int num, const char** labels, int* keymap, int* joymap) +{ + // kind of a hack + bool ishotkey = (page != ui->tabInput); + + QHBoxLayout* main_layout = new QHBoxLayout(); + + QGroupBox* group; + QGridLayout* group_layout; + + group = new QGroupBox("Keyboard mappings:"); + main_layout->addWidget(group); + group_layout = new QGridLayout(); + group_layout->setSpacing(1); + for (int i = 0; i < num; i++) + { + QLabel* label = new QLabel(QString(labels[i])+":"); + KeyMapButton* btn = new KeyMapButton(&keymap[i], ishotkey); + + group_layout->addWidget(label, i, 0); + group_layout->addWidget(btn, i, 1); + } + group_layout->setRowStretch(num, 1); + group->setLayout(group_layout); + group->setMinimumWidth(275); + + group = new QGroupBox("Joystick mappings:"); + main_layout->addWidget(group); + group_layout = new QGridLayout(); + group_layout->setSpacing(1); + for (int i = 0; i < num; i++) + { + QLabel* label = new QLabel(QString(labels[i])+":"); + JoyMapButton* btn = new JoyMapButton(&joymap[i], ishotkey); + + group_layout->addWidget(label, i, 0); + group_layout->addWidget(btn, i, 1); + } + group_layout->setRowStretch(num, 1); + group->setLayout(group_layout); + group->setMinimumWidth(275); + + page->setLayout(main_layout); +} + +void InputConfigDialog::on_InputConfigDialog_accepted() +{ + for (int i = 0; i < 12; i++) + { + Config::KeyMapping[dskeyorder[i]] = keypadKeyMap[i]; + Config::JoyMapping[dskeyorder[i]] = keypadJoyMap[i]; + } + + for (int i = 0; i < 2; i++) + { + Config::HKKeyMapping[hk_addons[i]] = addonsKeyMap[i]; + Config::HKJoyMapping[hk_addons[i]] = addonsJoyMap[i]; + } + + for (int i = 0; i < 6; i++) + { + Config::HKKeyMapping[hk_general[i]] = hkGeneralKeyMap[i]; + Config::HKJoyMapping[hk_general[i]] = hkGeneralJoyMap[i]; + } + + Config::JoystickID = Input::JoystickID; + Config::Save(); + + closeDlg(); +} + +void InputConfigDialog::on_InputConfigDialog_rejected() +{ + Input::JoystickID = Config::JoystickID; + Input::OpenJoystick(); + + closeDlg(); +} + +void InputConfigDialog::on_cbxJoystick_currentIndexChanged(int id) +{ + // prevent a spurious change + if (ui->cbxJoystick->count() < 2) return; + + Input::JoystickID = id; + Input::OpenJoystick(); +} + + +KeyMapButton::KeyMapButton(int* mapping, bool hotkey) : QPushButton() +{ + this->mapping = mapping; + this->isHotkey = hotkey; + + setCheckable(true); + setText(mappingText()); + + connect(this, &KeyMapButton::clicked, this, &KeyMapButton::onClick); +} + +KeyMapButton::~KeyMapButton() +{ +} + +void KeyMapButton::keyPressEvent(QKeyEvent* event) +{ + if (!isChecked()) return QPushButton::keyPressEvent(event); + + printf("KEY PRESSED = %08X %08X | %08X %08X %08X\n", event->key(), event->modifiers(), event->nativeVirtualKey(), event->nativeModifiers(), event->nativeScanCode()); + + int key = event->key(); + int mod = event->modifiers(); + bool ismod = (key == Qt::Key_Control || + key == Qt::Key_Alt || + key == Qt::Key_AltGr || + key == Qt::Key_Shift || + key == Qt::Key_Meta); + + if (!mod) + { + if (key == Qt::Key_Escape) { click(); return; } + if (key == Qt::Key_Backspace) { *mapping = -1; click(); return; } + } + + if (isHotkey) + { + if (ismod) + return; + } + + if (!ismod) + key |= mod; + else if (Input::IsRightModKey(event)) + key |= (1<<31); + + *mapping = key; + click(); +} + +void KeyMapButton::focusOutEvent(QFocusEvent* event) +{ + if (isChecked()) + { + // if we lost the focus while mapping, consider it 'done' + click(); + } + + QPushButton::focusOutEvent(event); +} + +void KeyMapButton::onClick() +{ + if (isChecked()) + { + setText("[press key]"); + } + else + { + setText(mappingText()); + } +} + +QString KeyMapButton::mappingText() +{ + int key = *mapping; + + if (key == -1) return "None"; + + QString isright = (key & (1<<31)) ? "Right " : "Left "; + key &= ~(1<<31); + + switch (key) + { + case Qt::Key_Control: return isright + "Ctrl"; + case Qt::Key_Alt: return "Alt"; + case Qt::Key_AltGr: return "AltGr"; + case Qt::Key_Shift: return isright + "Shift"; + case Qt::Key_Meta: return "Meta"; + } + + QKeySequence seq(key); + QString ret = seq.toString(); + + // weak attempt at detecting garbage key names + if (ret.length() == 2 && ret[0].unicode() > 0xFF) + return QString("[%1]").arg(key, 8, 16); + + return ret.replace("&", "&&"); +} + + +JoyMapButton::JoyMapButton(int* mapping, bool hotkey) : QPushButton() +{ + this->mapping = mapping; + this->isHotkey = hotkey; + + setCheckable(true); + setText(mappingText()); + + connect(this, &JoyMapButton::clicked, this, &JoyMapButton::onClick); + + timerID = 0; +} + +JoyMapButton::~JoyMapButton() +{ +} + +void JoyMapButton::keyPressEvent(QKeyEvent* event) +{ + if (!isChecked()) return QPushButton::keyPressEvent(event); + + int key = event->key(); + int mod = event->modifiers(); + + if (!mod) + { + if (key == Qt::Key_Escape) { click(); return; } + if (key == Qt::Key_Backspace) { *mapping = -1; click(); return; } + } +} + +void JoyMapButton::focusOutEvent(QFocusEvent* event) +{ + if (isChecked()) + { + // if we lost the focus while mapping, consider it 'done' + click(); + } + + QPushButton::focusOutEvent(event); +} + +void JoyMapButton::timerEvent(QTimerEvent* event) +{ + SDL_Joystick* joy = Input::Joystick; + if (!joy) { click(); return; } + if (!SDL_JoystickGetAttached(joy)) { click(); return; } + + int oldmap; + if (*mapping == -1) oldmap = 0xFFFF; + else oldmap = *mapping; + + int nbuttons = SDL_JoystickNumButtons(joy); + for (int i = 0; i < nbuttons; i++) + { + if (SDL_JoystickGetButton(joy, i)) + { + *mapping = (oldmap & 0xFFFF0000) | i; + click(); + return; + } + } + + int nhats = SDL_JoystickNumHats(joy); + if (nhats > 16) nhats = 16; + for (int i = 0; i < nhats; i++) + { + Uint8 blackhat = SDL_JoystickGetHat(joy, i); + if (blackhat) + { + if (blackhat & 0x1) blackhat = 0x1; + else if (blackhat & 0x2) blackhat = 0x2; + else if (blackhat & 0x4) blackhat = 0x4; + else blackhat = 0x8; + + *mapping = (oldmap & 0xFFFF0000) | 0x100 | blackhat | (i << 4); + click(); + return; + } + } + + int naxes = SDL_JoystickNumAxes(joy); + if (naxes > 16) naxes = 16; + for (int i = 0; i < naxes; i++) + { + Sint16 axisval = SDL_JoystickGetAxis(joy, i); + int diff = abs(axisval - axesRest[i]); + + if (axesRest[i] < -16384 && axisval >= 0) + { + *mapping = (oldmap & 0xFFFF) | 0x10000 | (2 << 20) | (i << 24); + click(); + return; + } + else if (diff > 16384) + { + int axistype; + if (axisval > 0) axistype = 0; + else axistype = 1; + + *mapping = (oldmap & 0xFFFF) | 0x10000 | (axistype << 20) | (i << 24); + click(); + return; + } + } +} + +void JoyMapButton::onClick() +{ + if (isChecked()) + { + setText("[press button/axis]"); + timerID = startTimer(50); + + memset(axesRest, 0, sizeof(axesRest)); + if (Input::Joystick && SDL_JoystickGetAttached(Input::Joystick)) + { + int naxes = SDL_JoystickNumAxes(Input::Joystick); + if (naxes > 16) naxes = 16; + for (int a = 0; a < naxes; a++) + { + axesRest[a] = SDL_JoystickGetAxis(Input::Joystick, a); + } + } + } + else + { + setText(mappingText()); + if (timerID) { killTimer(timerID); timerID = 0; } + } +} + +QString JoyMapButton::mappingText() +{ + int id = *mapping; + + if (id == -1) return "None"; + + bool hasbtn = ((id & 0xFFFF) != 0xFFFF); + QString str; + + if (hasbtn) + { + if (id & 0x100) + { + int hatnum = ((id >> 4) & 0xF) + 1; + + switch (id & 0xF) + { + case 0x1: str = "Hat %1 up"; break; + case 0x2: str = "Hat %1 right"; break; + case 0x4: str = "Hat %1 down"; break; + case 0x8: str = "Hat %1 left"; break; + } + + str = str.arg(hatnum); + } + else + { + str = QString("Button %1").arg((id & 0xFFFF) + 1); + } + } + else + { + str = ""; + } + + if (id & 0x10000) + { + int axisnum = ((id >> 24) & 0xF) + 1; + + if (hasbtn) str += " / "; + + switch ((id >> 20) & 0xF) + { + case 0: str += QString("Axis %1 +").arg(axisnum); break; + case 1: str += QString("Axis %1 -").arg(axisnum); break; + case 2: str += QString("Trigger %1").arg(axisnum); break; + } + } + + return str; +} diff --git a/src/frontend/qt_sdl/InputConfigDialog.h b/src/frontend/qt_sdl/InputConfigDialog.h new file mode 100644 index 0000000..de57414 --- /dev/null +++ b/src/frontend/qt_sdl/InputConfigDialog.h @@ -0,0 +1,123 @@ +/* + Copyright 2016-2020 Arisotura + + This file is part of melonDS. + + melonDS is free software: you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + melonDS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with melonDS. If not, see http://www.gnu.org/licenses/. +*/ + +#ifndef INPUTCONFIGDIALOG_H +#define INPUTCONFIGDIALOG_H + +#include <QDialog> +#include <QPushButton> + +namespace Ui { class InputConfigDialog; } +class InputConfigDialog; + +class InputConfigDialog : public QDialog +{ + Q_OBJECT + +public: + explicit InputConfigDialog(QWidget* parent); + ~InputConfigDialog(); + + static InputConfigDialog* currentDlg; + static InputConfigDialog* openDlg(QWidget* parent) + { + if (currentDlg) + { + currentDlg->activateWindow(); + return currentDlg; + } + + currentDlg = new InputConfigDialog(parent); + currentDlg->open(); + return currentDlg; + } + static void closeDlg() + { + currentDlg = nullptr; + } + +private slots: + void on_InputConfigDialog_accepted(); + void on_InputConfigDialog_rejected(); + + void on_cbxJoystick_currentIndexChanged(int id); + +private: + void populatePage(QWidget* page, int num, const char** labels, int* keymap, int* joymap); + + Ui::InputConfigDialog* ui; + + int keypadKeyMap[12], keypadJoyMap[12]; + int addonsKeyMap[2], addonsJoyMap[2]; + int hkGeneralKeyMap[6], hkGeneralJoyMap[6]; +}; + + +class KeyMapButton : public QPushButton +{ + Q_OBJECT + +public: + explicit KeyMapButton(int* mapping, bool hotkey); + ~KeyMapButton(); + +protected: + void keyPressEvent(QKeyEvent* event) override; + void focusOutEvent(QFocusEvent* event) override; + + bool focusNextPrevChild(bool next) override { return false; } + +private slots: + void onClick(); + +private: + QString mappingText(); + + int* mapping; + bool isHotkey; +}; + +class JoyMapButton : public QPushButton +{ + Q_OBJECT + +public: + explicit JoyMapButton(int* mapping, bool hotkey); + ~JoyMapButton(); + +protected: + void keyPressEvent(QKeyEvent* event) override; + void focusOutEvent(QFocusEvent* event) override; + void timerEvent(QTimerEvent* event) override; + + bool focusNextPrevChild(bool next) override { return false; } + +private slots: + void onClick(); + +private: + QString mappingText(); + + int* mapping; + bool isHotkey; + + int timerID; + int axesRest[16]; +}; + +#endif // INPUTCONFIGDIALOG_H diff --git a/src/frontend/qt_sdl/InputConfigDialog.ui b/src/frontend/qt_sdl/InputConfigDialog.ui new file mode 100644 index 0000000..655da16 --- /dev/null +++ b/src/frontend/qt_sdl/InputConfigDialog.ui @@ -0,0 +1,131 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>InputConfigDialog</class> + <widget class="QDialog" name="InputConfigDialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>488</width> + <height>365</height> + </rect> + </property> + <property name="windowTitle"> + <string>Input and hotkeys - melonDS</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <property name="sizeConstraint"> + <enum>QLayout::SetFixedSize</enum> + </property> + <item> + <widget class="QTabWidget" name="tabWidget"> + <property name="currentIndex"> + <number>0</number> + </property> + <widget class="QWidget" name="tabInput"> + <attribute name="title"> + <string>DS keypad</string> + </attribute> + </widget> + <widget class="QWidget" name="tabAddons"> + <attribute name="title"> + <string>Add-ons</string> + </attribute> + </widget> + <widget class="QWidget" name="tabHotkeysGeneral"> + <attribute name="title"> + <string>General hotkeys</string> + </attribute> + </widget> + </widget> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout"> + <property name="leftMargin"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="rightMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> + <number>0</number> + </property> + <item> + <widget class="QLabel" name="label"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Joystick:</string> + </property> + </widget> + </item> + <item> + <widget class="QComboBox" name="cbxJoystick"> + <property name="sizePolicy"> + <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="whatsThis"> + <string><html><head/><body><p>Selects which joystick will be used for joystick input, if any is present.</p></body></html></string> + </property> + </widget> + </item> + </layout> + </item> + <item> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> + </property> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections> + <connection> + <sender>buttonBox</sender> + <signal>accepted()</signal> + <receiver>InputConfigDialog</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel"> + <x>248</x> + <y>254</y> + </hint> + <hint type="destinationlabel"> + <x>157</x> + <y>274</y> + </hint> + </hints> + </connection> + <connection> + <sender>buttonBox</sender> + <signal>rejected()</signal> + <receiver>InputConfigDialog</receiver> + <slot>reject()</slot> + <hints> + <hint type="sourcelabel"> + <x>316</x> + <y>260</y> + </hint> + <hint type="destinationlabel"> + <x>286</x> + <y>274</y> + </hint> + </hints> + </connection> + </connections> +</ui> diff --git a/src/frontend/qt_sdl/LAN_PCap.cpp b/src/frontend/qt_sdl/LAN_PCap.cpp new file mode 100644 index 0000000..ce278bc --- /dev/null +++ b/src/frontend/qt_sdl/LAN_PCap.cpp @@ -0,0 +1,387 @@ +/* + Copyright 2016-2020 Arisotura + + This file is part of melonDS. + + melonDS is free software: you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + melonDS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with melonDS. If not, see http://www.gnu.org/licenses/. +*/ + +// direct LAN interface. Currently powered by libpcap, may change. + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <SDL2/SDL.h> +#include <pcap/pcap.h> +#include "../Wifi.h" +#include "LAN_PCap.h" +#include "PlatformConfig.h" + +#ifdef __WIN32__ + #include <iphlpapi.h> +#else + #include <sys/types.h> + #include <ifaddrs.h> + #include <netinet/in.h> + #include <linux/if_packet.h> +#endif + + +// welp +#ifndef PCAP_OPENFLAG_PROMISCUOUS +#define PCAP_OPENFLAG_PROMISCUOUS 1 +#endif + + +#define DECL_PCAP_FUNC(ret, name, args, args2) \ + typedef ret (*type_##name) args; \ + type_##name ptr_##name = NULL; \ + ret name args { return ptr_##name args2; } + +DECL_PCAP_FUNC(int, pcap_findalldevs, (pcap_if_t** alldevs, char* errbuf), (alldevs,errbuf)) +DECL_PCAP_FUNC(void, pcap_freealldevs, (pcap_if_t* alldevs), (alldevs)) +DECL_PCAP_FUNC(pcap_t*, pcap_open_live, (const char* src, int snaplen, int flags, int readtimeout, char* errbuf), (src,snaplen,flags,readtimeout,errbuf)) +DECL_PCAP_FUNC(void, pcap_close, (pcap_t* dev), (dev)) +DECL_PCAP_FUNC(int, pcap_setnonblock, (pcap_t* dev, int nonblock, char* errbuf), (dev,nonblock,errbuf)) +DECL_PCAP_FUNC(int, pcap_sendpacket, (pcap_t* dev, const u_char* data, int len), (dev,data,len)) +DECL_PCAP_FUNC(int, pcap_dispatch, (pcap_t* dev, int num, pcap_handler callback, u_char* data), (dev,num,callback,data)) +DECL_PCAP_FUNC(const u_char*, pcap_next, (pcap_t* dev, struct pcap_pkthdr* hdr), (dev,hdr)) + + +namespace LAN_PCap +{ + +const char* PCapLibNames[] = +{ +#ifdef __WIN32__ + // TODO: name for npcap in non-WinPCap mode + "wpcap.dll", +#else + // Linux lib names + "libpcap.so.1", + "libpcap.so", +#endif + NULL +}; + +AdapterData* Adapters = NULL; +int NumAdapters = 0; + +void* PCapLib = NULL; +pcap_t* PCapAdapter = NULL; +AdapterData* PCapAdapterData; + +u8 PacketBuffer[2048]; +int PacketLen; +volatile int RXNum; + + +#define LOAD_PCAP_FUNC(sym) \ + ptr_##sym = (type_##sym)SDL_LoadFunction(lib, #sym); \ + if (!ptr_##sym) return false; + +bool TryLoadPCap(void* lib) +{ + LOAD_PCAP_FUNC(pcap_findalldevs) + LOAD_PCAP_FUNC(pcap_freealldevs) + LOAD_PCAP_FUNC(pcap_open_live) + LOAD_PCAP_FUNC(pcap_close) + LOAD_PCAP_FUNC(pcap_setnonblock) + LOAD_PCAP_FUNC(pcap_sendpacket) + LOAD_PCAP_FUNC(pcap_dispatch) + LOAD_PCAP_FUNC(pcap_next) + + return true; +} + +bool Init(bool open_adapter) +{ + // TODO: how to deal with cases where an adapter is unplugged or changes config?? + if (!PCapLib) + { + PCapLib = NULL; + + for (int i = 0; PCapLibNames[i]; i++) + { + void* lib = SDL_LoadObject(PCapLibNames[i]); + if (!lib) continue; + + if (!TryLoadPCap(lib)) + { + SDL_UnloadObject(lib); + continue; + } + + printf("PCap: lib %s, init successful\n", PCapLibNames[i]); + PCapLib = lib; + break; + } + + if (PCapLib == NULL) + { + printf("PCap: init failed\n"); + return false; + } + } + + PCapAdapter = NULL; + PacketLen = 0; + RXNum = 0; + + NumAdapters = 0; + + char errbuf[PCAP_ERRBUF_SIZE]; + int ret; + + pcap_if_t* alldevs; + ret = pcap_findalldevs(&alldevs, errbuf); + if (ret < 0 || alldevs == NULL) + { + printf("PCap: no devices available\n"); + return false; + } + + pcap_if_t* dev = alldevs; + while (dev) { NumAdapters++; dev = dev->next; } + + Adapters = new AdapterData[NumAdapters]; + memset(Adapters, 0, sizeof(AdapterData)*NumAdapters); + + AdapterData* adata = &Adapters[0]; + dev = alldevs; + while (dev) + { + adata->Internal = dev; + +#ifdef __WIN32__ + // hax + int len = strlen(dev->name); + len -= 12; if (len > 127) len = 127; + strncpy(adata->DeviceName, &dev->name[12], len); + adata->DeviceName[len] = '\0'; +#else + strncpy(adata->DeviceName, dev->name, 127); + adata->DeviceName[127] = '\0'; + + strncpy(adata->FriendlyName, adata->DeviceName, 127); + adata->FriendlyName[127] = '\0'; +#endif // __WIN32__ + + dev = dev->next; + adata++; + } + +#ifdef __WIN32__ + + ULONG bufsize = 16384; + IP_ADAPTER_ADDRESSES* buf = (IP_ADAPTER_ADDRESSES*)HeapAlloc(GetProcessHeap(), 0, bufsize); + ULONG uret = GetAdaptersAddresses(AF_INET, 0, NULL, buf, &bufsize); + if (uret == ERROR_BUFFER_OVERFLOW) + { + HeapFree(GetProcessHeap(), 0, buf); + buf = (IP_ADAPTER_ADDRESSES*)HeapAlloc(GetProcessHeap(), 0, bufsize); + uret = GetAdaptersAddresses(AF_INET, 0, NULL, buf, &bufsize); + } + if (uret != ERROR_SUCCESS) + { + printf("GetAdaptersAddresses() shat itself: %08X\n", uret); + return false; + } + + for (int i = 0; i < NumAdapters; i++) + { + adata = &Adapters[i]; + IP_ADAPTER_ADDRESSES* addr = buf; + while (addr) + { + if (strcmp(addr->AdapterName, adata->DeviceName)) + { + addr = addr->Next; + continue; + } + + WideCharToMultiByte(CP_UTF8, 0, addr->FriendlyName, 127, adata->FriendlyName, 127, NULL, NULL); + adata->FriendlyName[127] = '\0'; + + WideCharToMultiByte(CP_UTF8, 0, addr->Description, 127, adata->Description, 127, NULL, NULL); + adata->Description[127] = '\0'; + + if (addr->PhysicalAddressLength != 6) + { + printf("weird MAC addr length %d for %s\n", addr->PhysicalAddressLength, addr->AdapterName); + } + else + memcpy(adata->MAC, addr->PhysicalAddress, 6); + + IP_ADAPTER_UNICAST_ADDRESS* ipaddr = addr->FirstUnicastAddress; + while (ipaddr) + { + SOCKADDR* sa = ipaddr->Address.lpSockaddr; + if (sa->sa_family == AF_INET) + { + struct in_addr sa4 = ((sockaddr_in*)sa)->sin_addr; + memcpy(adata->IP_v4, &sa4, 4); + } + + ipaddr = ipaddr->Next; + } + + break; + } + } + + HeapFree(GetProcessHeap(), 0, buf); + +#else + + struct ifaddrs* addrs; + if (getifaddrs(&addrs) != 0) + { + printf("getifaddrs() shat itself :(\n"); + return false; + } + + for (int i = 0; i < NumAdapters; i++) + { + adata = &Adapters[i]; + struct ifaddrs* curaddr = addrs; + while (curaddr) + { + if (strcmp(curaddr->ifa_name, adata->DeviceName)) + { + curaddr = curaddr->ifa_next; + continue; + } + + if (!curaddr->ifa_addr) + { + printf("Device (%s) does not have an address :/\n", curaddr->ifa_name); + curaddr = curaddr->ifa_next; + continue; + } + + u16 af = curaddr->ifa_addr->sa_family; + if (af == AF_INET) + { + struct sockaddr_in* sa = (sockaddr_in*)curaddr->ifa_addr; + memcpy(adata->IP_v4, &sa->sin_addr, 4); + } + else if (af == AF_PACKET) + { + struct sockaddr_ll* sa = (sockaddr_ll*)curaddr->ifa_addr; + if (sa->sll_halen != 6) + printf("weird MAC length %d for %s\n", sa->sll_halen, curaddr->ifa_name); + else + memcpy(adata->MAC, sa->sll_addr, 6); + } + + curaddr = curaddr->ifa_next; + } + } + + freeifaddrs(addrs); + +#endif // __WIN32__ + + if (!open_adapter) return true; + if (PCapAdapter) pcap_close(PCapAdapter); + + // open pcap device + PCapAdapterData = &Adapters[0]; + for (int i = 0; i < NumAdapters; i++) + { + if (!strncmp(Adapters[i].DeviceName, Config::LANDevice, 128)) + PCapAdapterData = &Adapters[i]; + } + + dev = (pcap_if_t*)PCapAdapterData->Internal; + PCapAdapter = pcap_open_live(dev->name, 2048, PCAP_OPENFLAG_PROMISCUOUS, 1, errbuf); + if (!PCapAdapter) + { + printf("PCap: failed to open adapter %s\n", errbuf); + return false; + } + + pcap_freealldevs(alldevs); + + if (pcap_setnonblock(PCapAdapter, 1, errbuf) < 0) + { + printf("PCap: failed to set nonblocking mode\n"); + pcap_close(PCapAdapter); PCapAdapter = NULL; + return false; + } + + return true; +} + +void DeInit() +{ + if (PCapLib) + { + if (PCapAdapter) + { + pcap_close(PCapAdapter); + PCapAdapter = NULL; + } + + SDL_UnloadObject(PCapLib); + PCapLib = NULL; + } +} + + +void RXCallback(u_char* blarg, const struct pcap_pkthdr* header, const u_char* data) +{ + while (RXNum > 0); + + if (header->len > 2048-64) return; + + PacketLen = header->len; + memcpy(PacketBuffer, data, PacketLen); + RXNum = 1; +} + +int SendPacket(u8* data, int len) +{ + if (PCapAdapter == NULL) + return 0; + + if (len > 2048) + { + printf("LAN_SendPacket: error: packet too long (%d)\n", len); + return 0; + } + + pcap_sendpacket(PCapAdapter, data, len); + // TODO: check success + return len; +} + +int RecvPacket(u8* data) +{ + if (PCapAdapter == NULL) + return 0; + + int ret = 0; + if (RXNum > 0) + { + memcpy(data, PacketBuffer, PacketLen); + ret = PacketLen; + RXNum = 0; + } + + pcap_dispatch(PCapAdapter, 1, RXCallback, NULL); + return ret; +} + +} diff --git a/src/frontend/qt_sdl/LAN_PCap.h b/src/frontend/qt_sdl/LAN_PCap.h new file mode 100644 index 0000000..250b8e9 --- /dev/null +++ b/src/frontend/qt_sdl/LAN_PCap.h @@ -0,0 +1,53 @@ +/* + Copyright 2016-2020 Arisotura + + This file is part of melonDS. + + melonDS is free software: you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + melonDS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with melonDS. If not, see http://www.gnu.org/licenses/. +*/ + +#ifndef LAN_PCAP_H +#define LAN_PCAP_H + +#include "../types.h" + +namespace LAN_PCap +{ + +typedef struct +{ + char DeviceName[128]; + char FriendlyName[128]; + char Description[128]; + + u8 MAC[6]; + u8 IP_v4[4]; + + void* Internal; + +} AdapterData; + + +extern AdapterData* Adapters; +extern int NumAdapters; + + +bool Init(bool open_adapter); +void DeInit(); + +int SendPacket(u8* data, int len); +int RecvPacket(u8* data); + +} + +#endif // LAN_PCAP_H diff --git a/src/frontend/qt_sdl/LAN_Socket.cpp b/src/frontend/qt_sdl/LAN_Socket.cpp new file mode 100644 index 0000000..c6fbd4b --- /dev/null +++ b/src/frontend/qt_sdl/LAN_Socket.cpp @@ -0,0 +1,1145 @@ +/* + Copyright 2016-2020 Arisotura + + This file is part of melonDS. + + melonDS is free software: you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + melonDS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with melonDS. If not, see http://www.gnu.org/licenses/. +*/ + +// indirect LAN interface, powered by BSD sockets. + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include "../Wifi.h" +#include "LAN_Socket.h" +#include "../Config.h" + +#ifdef __WIN32__ + #include <winsock2.h> + #include <ws2tcpip.h> + #define socket_t SOCKET + #define sockaddr_t SOCKADDR +#else + #include <unistd.h> + #include <arpa/inet.h> + #include <netinet/in.h> + #include <sys/types.h> + #include <sys/select.h> + #include <sys/socket.h> + #include <netdb.h> + #define socket_t int + #define sockaddr_t struct sockaddr + #define closesocket close +#endif + +#ifndef INVALID_SOCKET +#define INVALID_SOCKET (socket_t)-1 +#endif + + +namespace LAN_Socket +{ + +const u32 kSubnet = 0x0A400000; +const u32 kServerIP = kSubnet | 0x01; +const u32 kDNSIP = kSubnet | 0x02; +const u32 kClientIP = kSubnet | 0x10; + +const u8 kServerMAC[6] = {0x00, 0xAB, 0x33, 0x28, 0x99, 0x44}; +const u8 kDNSMAC[6] = {0x00, 0xAB, 0x33, 0x28, 0x99, 0x55}; + +u8 PacketBuffer[2048]; +int PacketLen; +volatile int RXNum; + +u16 IPv4ID; + + +// TODO: UDP sockets +// * use FIFO list +// * assign new socket when seeing new IP/port + + +typedef struct +{ + u8 DestIP[4]; + u16 SourcePort; + u16 DestPort; + + u32 SeqNum; // sequence number for incoming frames + u32 AckNum; + + // 0: unused + // 1: connected + u8 Status; + + socket_t Backend; + +} TCPSocket; + +typedef struct +{ + u8 DestIP[4]; + u16 SourcePort; + u16 DestPort; + + socket_t Backend; + struct sockaddr_in BackendAddr; + +} UDPSocket; + +TCPSocket TCPSocketList[16]; +UDPSocket UDPSocketList[4]; + +int UDPSocketID = 0; + + +bool Init() +{ + // TODO: how to deal with cases where an adapter is unplugged or changes config?? + //if (PCapLib) return true; + + //Lib = NULL; + PacketLen = 0; + RXNum = 0; + + IPv4ID = 1; + + memset(TCPSocketList, 0, sizeof(TCPSocketList)); + memset(UDPSocketList, 0, sizeof(UDPSocketList)); + + UDPSocketID = 0; + + return true; +} + +void DeInit() +{ + for (int i = 0; i < (sizeof(TCPSocketList)/sizeof(TCPSocket)); i++) + { + TCPSocket* sock = &TCPSocketList[i]; + if (sock->Backend) closesocket(sock->Backend); + } + + for (int i = 0; i < (sizeof(UDPSocketList)/sizeof(UDPSocket)); i++) + { + UDPSocket* sock = &UDPSocketList[i]; + if (sock->Backend) closesocket(sock->Backend); + } +} + + +void FinishUDPFrame(u8* data, int len) +{ + u8* ipheader = &data[0xE]; + u8* udpheader = &data[0x22]; + + // lengths + *(u16*)&ipheader[2] = htons(len - 0xE); + *(u16*)&udpheader[4] = htons(len - (0xE + 0x14)); + + // IP checksum + u32 tmp = 0; + + for (int i = 0; i < 20; i += 2) + tmp += ntohs(*(u16*)&ipheader[i]); + while (tmp >> 16) + tmp = (tmp & 0xFFFF) + (tmp >> 16); + tmp ^= 0xFFFF; + *(u16*)&ipheader[10] = htons(tmp); + + // UDP checksum + // (note: normally not mandatory, but some older sgIP versions require it) + tmp = 0; + tmp += ntohs(*(u16*)&ipheader[12]); + tmp += ntohs(*(u16*)&ipheader[14]); + tmp += ntohs(*(u16*)&ipheader[16]); + tmp += ntohs(*(u16*)&ipheader[18]); + tmp += ntohs(0x1100); + tmp += (len-0x22); + for (u8* i = udpheader; i < &udpheader[len-0x23]; i += 2) + tmp += ntohs(*(u16*)i); + if (len & 1) + tmp += ntohs((u_short)udpheader[len-0x23]); + while (tmp >> 16) + tmp = (tmp & 0xFFFF) + (tmp >> 16); + tmp ^= 0xFFFF; + if (tmp == 0) tmp = 0xFFFF; + *(u16*)&udpheader[6] = htons(tmp); +} + +void FinishTCPFrame(u8* data, int len) +{ + u8* ipheader = &data[0xE]; + u8* tcpheader = &data[0x22]; + + // lengths + *(u16*)&ipheader[2] = htons(len - 0xE); + + // IP checksum + u32 tmp = 0; + + for (int i = 0; i < 20; i += 2) + tmp += ntohs(*(u16*)&ipheader[i]); + while (tmp >> 16) + tmp = (tmp & 0xFFFF) + (tmp >> 16); + tmp ^= 0xFFFF; + *(u16*)&ipheader[10] = htons(tmp); + + u32 tcplen = ntohs(*(u16*)&ipheader[2]) - 0x14; + + // TCP checksum + tmp = 0; + tmp += ntohs(*(u16*)&ipheader[12]); + tmp += ntohs(*(u16*)&ipheader[14]); + tmp += ntohs(*(u16*)&ipheader[16]); + tmp += ntohs(*(u16*)&ipheader[18]); + tmp += ntohs(0x0600); + tmp += tcplen; + for (u8* i = tcpheader; i < &tcpheader[tcplen-1]; i += 2) + tmp += ntohs(*(u16*)i); + if (tcplen & 1) + tmp += ntohs((u_short)tcpheader[tcplen-1]); + while (tmp >> 16) + tmp = (tmp & 0xFFFF) + (tmp >> 16); + tmp ^= 0xFFFF; + *(u16*)&tcpheader[16] = htons(tmp); +} + + +void HandleDHCPFrame(u8* data, int len) +{ + u8 type = 0xFF; + + u32 transid = *(u32*)&data[0x2E]; + + u8* options = &data[0x11A]; + for (;;) + { + if (options >= &data[len]) break; + u8 opt = *options++; + if (opt == 255) break; + + u8 len = *options++; + switch (opt) + { + case 53: // frame type + type = options[0]; + break; + } + + options += len; + } + + if (type == 0xFF) + { + printf("DHCP: bad frame\n"); + return; + } + + printf("DHCP: frame type %d, transid %08X\n", type, transid); + + if (type == 1 || // discover + type == 3) // request + { + u8 resp[512]; + u8* out = &resp[0]; + + // ethernet + memcpy(out, &data[6], 6); out += 6; + memcpy(out, kServerMAC, 6); out += 6; + *(u16*)out = htons(0x0800); out += 2; + + // IP + u8* ipheader = out; + *out++ = 0x45; + *out++ = 0x00; + *(u16*)out = 0; out += 2; // total length + *(u16*)out = htons(IPv4ID); out += 2; IPv4ID++; + *out++ = 0x00; + *out++ = 0x00; + *out++ = 0x80; // TTL + *out++ = 0x11; // protocol (UDP) + *(u16*)out = 0; out += 2; // checksum + *(u32*)out = htonl(kServerIP); out += 4; // source IP + if (type == 1) + { + *(u32*)out = htonl(0xFFFFFFFF); out += 4; // destination IP + } + else if (type == 3) + { + *(u32*)out = htonl(kClientIP); out += 4; // destination IP + } + + // UDP + u8* udpheader = out; + *(u16*)out = htons(67); out += 2; // source port + *(u16*)out = htons(68); out += 2; // destination port + *(u16*)out = 0; out += 2; // length + *(u16*)out = 0; out += 2; // checksum + + // DHCP + u8* body = out; + *out++ = 0x02; + *out++ = 0x01; + *out++ = 0x06; + *out++ = 0x00; + *(u32*)out = transid; out += 4; + *(u16*)out = 0; out += 2; // seconds elapsed + *(u16*)out = 0; out += 2; + *(u32*)out = htonl(0x00000000); out += 4; // client IP + *(u32*)out = htonl(kClientIP); out += 4; // your IP + *(u32*)out = htonl(kServerIP); out += 4; // server IP + *(u32*)out = htonl(0x00000000); out += 4; // gateway IP + memcpy(out, &data[6], 6); out += 6; + memset(out, 0, 10); out += 10; + memset(out, 0, 192); out += 192; + *(u32*)out = 0x63538263; out += 4; // DHCP magic + + // DHCP options + *out++ = 53; *out++ = 1; + *out++ = (type==1) ? 2 : 5; // DHCP type: offer/ack + *out++ = 1; *out++ = 4; + *(u32*)out = htonl(0xFFFFFF00); out += 4; // subnet mask + *out++ = 3; *out++ = 4; + *(u32*)out = htonl(kServerIP); out += 4; // router + *out++ = 51; *out++ = 4; + *(u32*)out = htonl(442030); out += 4; // lease time + *out++ = 54; *out++ = 4; + *(u32*)out = htonl(kServerIP); out += 4; // DHCP server + *out++ = 6; *out++ = 4; + *(u32*)out = htonl(kDNSIP); out += 4; // DNS (hax) + + *out++ = 0xFF; + memset(out, 0, 20); out += 20; + + u32 framelen = (u32)(out - &resp[0]); + if (framelen & 1) { *out++ = 0; framelen++; } + FinishUDPFrame(resp, framelen); + + // TODO: if there is already a packet queued, this will overwrite it + // that being said, this will only happen during DHCP setup, so probably + // not a big deal + + PacketLen = framelen; + memcpy(PacketBuffer, resp, PacketLen); + RXNum = 1; + } +} + +void HandleDNSFrame(u8* data, int len) +{ + u8* ipheader = &data[0xE]; + u8* udpheader = &data[0x22]; + u8* dnsbody = &data[0x2A]; + + u32 srcip = ntohl(*(u32*)&ipheader[12]); + u16 srcport = ntohs(*(u16*)&udpheader[0]); + + u16 id = ntohs(*(u16*)&dnsbody[0]); + u16 flags = ntohs(*(u16*)&dnsbody[2]); + u16 numquestions = ntohs(*(u16*)&dnsbody[4]); + u16 numanswers = ntohs(*(u16*)&dnsbody[6]); + u16 numauth = ntohs(*(u16*)&dnsbody[8]); + u16 numadd = ntohs(*(u16*)&dnsbody[10]); + + printf("DNS: ID=%04X, flags=%04X, Q=%d, A=%d, auth=%d, add=%d\n", + id, flags, numquestions, numanswers, numauth, numadd); + + // for now we only take 'simple' DNS requests + if (flags & 0x8000) return; + if (numquestions != 1 || numanswers != 0) return; + + u8 resp[1024]; + u8* out = &resp[0]; + + // ethernet + memcpy(out, &data[6], 6); out += 6; + memcpy(out, kServerMAC, 6); out += 6; + *(u16*)out = htons(0x0800); out += 2; + + // IP + u8* resp_ipheader = out; + *out++ = 0x45; + *out++ = 0x00; + *(u16*)out = 0; out += 2; // total length + *(u16*)out = htons(IPv4ID); out += 2; IPv4ID++; + *out++ = 0x00; + *out++ = 0x00; + *out++ = 0x80; // TTL + *out++ = 0x11; // protocol (UDP) + *(u16*)out = 0; out += 2; // checksum + *(u32*)out = htonl(kDNSIP); out += 4; // source IP + *(u32*)out = htonl(srcip); out += 4; // destination IP + + // UDP + u8* resp_udpheader = out; + *(u16*)out = htons(53); out += 2; // source port + *(u16*)out = htons(srcport); out += 2; // destination port + *(u16*)out = 0; out += 2; // length + *(u16*)out = 0; out += 2; // checksum + + // DNS + u8* resp_body = out; + *(u16*)out = htons(id); out += 2; // ID + *(u16*)out = htons(0x8000); out += 2; // flags + *(u16*)out = htons(numquestions); out += 2; // num questions + *(u16*)out = htons(numquestions); out += 2; // num answers + *(u16*)out = 0; out += 2; // num authority + *(u16*)out = 0; out += 2; // num additional + + u32 curoffset = 12; + for (u16 i = 0; i < numquestions; i++) + { + if (curoffset >= (len-0x2A)) return; + + u8 bitlength = 0; + while ((bitlength = dnsbody[curoffset++]) != 0) + curoffset += bitlength; + + curoffset += 4; + } + + u32 qlen = curoffset-12; + if (qlen > 512) return; + memcpy(out, &dnsbody[12], qlen); out += qlen; + + curoffset = 12; + for (u16 i = 0; i < numquestions; i++) + { + // assemble the requested domain name + u8 bitlength = 0; + char domainname[256] = ""; int o = 0; + while ((bitlength = dnsbody[curoffset++]) != 0) + { + if ((o+bitlength) >= 255) + { + // welp. atleast try not to explode. + domainname[o++] = '\0'; + break; + } + + strncpy(&domainname[o], (const char *)&dnsbody[curoffset], bitlength); + o += bitlength; + + curoffset += bitlength; + if (dnsbody[curoffset] != 0) + domainname[o++] = '.'; + else + domainname[o++] = '\0'; + } + + u16 type = ntohs(*(u16*)&dnsbody[curoffset]); + u16 cls = ntohs(*(u16*)&dnsbody[curoffset+2]); + + printf("- q%d: %04X %04X %s", i, type, cls, domainname); + + // get answer + struct addrinfo dns_hint; + struct addrinfo* dns_res; + u32 addr_res; + + memset(&dns_hint, 0, sizeof(dns_hint)); + dns_hint.ai_family = AF_INET; // TODO: other address types (INET6, etc) + if (getaddrinfo(domainname, "0", &dns_hint, &dns_res) == 0) + { + struct addrinfo* p = dns_res; + while (p) + { + struct sockaddr_in* addr = (struct sockaddr_in*)p->ai_addr; + /*printf(" -> %d.%d.%d.%d", + addr->sin_addr.S_un.S_un_b.s_b1, addr->sin_addr.S_un.S_un_b.s_b2, + addr->sin_addr.S_un.S_un_b.s_b3, addr->sin_addr.S_un.S_un_b.s_b4);*/ + + //addr_res = addr->sin_addr.S_un.S_addr; + addr_res = *(u32*)&addr->sin_addr; + p = p->ai_next; + } + } + else + { + printf(" shat itself :("); + addr_res = 0; + } + + printf("\n"); + curoffset += 4; + + // TODO: betterer support + // (under which conditions does the C00C marker work?) + *(u16*)out = htons(0xC00C); out += 2; + *(u16*)out = htons(type); out += 2; + *(u16*)out = htons(cls); out += 2; + *(u32*)out = htonl(3600); out += 4; // TTL (hardcoded for now) + *(u16*)out = htons(4); out += 2; // address length + *(u32*)out = addr_res; out += 4; // address + } + + u32 framelen = (u32)(out - &resp[0]); + if (framelen & 1) { *out++ = 0; framelen++; } + FinishUDPFrame(resp, framelen); + + // TODO: if there is already a packet queued, this will overwrite it + // that being said, this will only happen during DHCP setup, so probably + // not a big deal + + PacketLen = framelen; + memcpy(PacketBuffer, resp, PacketLen); + RXNum = 1; +} + +void UDP_BuildIncomingFrame(UDPSocket* sock, u8* data, int len) +{ + u8 resp[2048]; + u8* out = &resp[0]; + + if (len > 1536) return; + + // ethernet + memcpy(out, Wifi::GetMAC(), 6); out += 6; // hurf + memcpy(out, kServerMAC, 6); out += 6; + *(u16*)out = htons(0x0800); out += 2; + + // IP + u8* resp_ipheader = out; + *out++ = 0x45; + *out++ = 0x00; + *(u16*)out = 0; out += 2; // total length + *(u16*)out = htons(IPv4ID); out += 2; IPv4ID++; + *out++ = 0x00; + *out++ = 0x00; + *out++ = 0x80; // TTL + *out++ = 0x11; // protocol (UDP) + *(u16*)out = 0; out += 2; // checksum + memcpy(out, sock->DestIP, 4); out += 4; // source IP + *(u32*)out = htonl(kClientIP); out += 4; // destination IP + + // UDP + u8* resp_tcpheader = out; + *(u16*)out = htons(sock->DestPort); out += 2; // source port + *(u16*)out = htons(sock->SourcePort); out += 2; // destination port + *(u16*)out = htons(len+8); out += 2; // length of header+data + *(u16*)out = 0; out += 2; // checksum + + memcpy(out, data, len); out += len; + + u32 framelen = (u32)(out - &resp[0]); + FinishUDPFrame(resp, framelen); + + // TODO: if there is already a packet queued, this will overwrite it + // that being said, this will only happen during DHCP setup, so probably + // not a big deal + + PacketLen = framelen; + memcpy(PacketBuffer, resp, PacketLen); + RXNum = 1; +} + +void HandleUDPFrame(u8* data, int len) +{ + u8* ipheader = &data[0xE]; + u8* udpheader = &data[0x22]; + + // debug + /*for (int j = 0; j < len; j += 16) + { + int rem = len - j; + if (rem > 16) rem = 16; + for (int i = 0; i < rem; i++) + { + printf("%02X ", data[i+j]); + } + printf("\n"); + }*/ + + u16 srcport = ntohs(*(u16*)&udpheader[0]); + u16 dstport = ntohs(*(u16*)&udpheader[2]); + + int sockid = -1; + UDPSocket* sock; + for (int i = 0; i < (sizeof(UDPSocketList)/sizeof(UDPSocket)); i++) + { + sock = &UDPSocketList[i]; + if (sock->Backend != 0 && !memcmp(&sock->DestIP, &ipheader[16], 4) && + sock->SourcePort == srcport && sock->DestPort == dstport) + { + sockid = i; + break; + } + } + + if (sockid == -1) + { + sockid = UDPSocketID; + sock = &UDPSocketList[sockid]; + + UDPSocketID++; + if (UDPSocketID >= (sizeof(UDPSocketList)/sizeof(UDPSocket))) + UDPSocketID = 0; + + if (sock->Backend != 0) + { + printf("LANMAGIC: closing previous UDP socket #%d\n", sockid); + closesocket(sock->Backend); + } + + sock->Backend = socket(AF_INET, SOCK_DGRAM, 0); + + memcpy(sock->DestIP, &ipheader[16], 4); + sock->SourcePort = srcport; + sock->DestPort = dstport; + + memset(&sock->BackendAddr, 0, sizeof(sock->BackendAddr)); + sock->BackendAddr.sin_family = AF_INET; + sock->BackendAddr.sin_port = htons(dstport); + memcpy(&sock->BackendAddr.sin_addr, &ipheader[16], 4); + /*if (bind(sock->Backend, (struct sockaddr*)&sock->BackendAddr, sizeof(sock->BackendAddr)) == -1) + { + printf("bind() shat itself :(\n"); + }*/ + + printf("LANMAGIC: opening UDP socket #%d to %d.%d.%d.%d:%d, srcport %d\n", + sockid, + ipheader[16], ipheader[17], ipheader[18], ipheader[19], + dstport, srcport); + } + + u16 udplen = ntohs(*(u16*)&udpheader[4]) - 8; + + printf("UDP: socket %d sending %d bytes\n", sockid, udplen); + sendto(sock->Backend, (char*)&udpheader[8], udplen, 0, + (struct sockaddr*)&sock->BackendAddr, sizeof(sock->BackendAddr)); +} + +void TCP_SYNACK(TCPSocket* sock, u8* data, int len) +{ + u8 resp[128]; + u8* out = &resp[0]; + + u8* ipheader = &data[0xE]; + u8* tcpheader = &data[0x22]; + + u32 seqnum = htonl(*(u32*)&tcpheader[4]); + seqnum++; + sock->AckNum = seqnum; + + //printf("SYNACK SEQ=%08X|%08X\n", sock->SeqNum, sock->AckNum); + + // ethernet + memcpy(out, &data[6], 6); out += 6; + memcpy(out, kServerMAC, 6); out += 6; + *(u16*)out = htons(0x0800); out += 2; + + // IP + u8* resp_ipheader = out; + *out++ = 0x45; + *out++ = 0x00; + *(u16*)out = 0; out += 2; // total length + *(u16*)out = htons(IPv4ID); out += 2; IPv4ID++; + *out++ = 0x00; + *out++ = 0x00; + *out++ = 0x80; // TTL + *out++ = 0x06; // protocol (TCP) + *(u16*)out = 0; out += 2; // checksum + *(u32*)out = *(u32*)&ipheader[16]; out += 4; // source IP + *(u32*)out = *(u32*)&ipheader[12]; out += 4; // destination IP + + // TCP + u8* resp_tcpheader = out; + *(u16*)out = *(u16*)&tcpheader[2]; out += 2; // source port + *(u16*)out = *(u16*)&tcpheader[0]; out += 2; // destination port + *(u32*)out = htonl(sock->SeqNum); out += 4; sock->SeqNum++; // seq number + *(u32*)out = htonl(seqnum); out += 4; // ack seq number + *(u16*)out = htons(0x8012); out += 2; // flags (SYN+ACK) + *(u16*)out = htons(0x7000); out += 2; // window size (uuuh) + *(u16*)out = 0; out += 2; // checksum + *(u16*)out = 0; out += 2; // urgent pointer + + // TCP options + *out++ = 0x02; *out++ = 0x04; // max segment size + *(u16*)out = htons(0x05B4); out += 2; + *out++ = 0x01; + *out++ = 0x01; + *out++ = 0x04; *out++ = 0x02; // SACK permitted + *out++ = 0x01; + *out++ = 0x03; *out++ = 0x03; // window size + *out++ = 0x08; + + u32 framelen = (u32)(out - &resp[0]); + //if (framelen & 1) { *out++ = 0; framelen++; } + FinishTCPFrame(resp, framelen); + + // TODO: if there is already a packet queued, this will overwrite it + // that being said, this will only happen during DHCP setup, so probably + // not a big deal + + PacketLen = framelen; + memcpy(PacketBuffer, resp, PacketLen); + RXNum = 1; +} + +void TCP_ACK(TCPSocket* sock, bool fin) +{ + u8 resp[64]; + u8* out = &resp[0]; + + u16 flags = 0x5010; + if (fin) flags |= 0x0001; + + //printf("%sACK SEQ=%08X|%08X\n", fin?"FIN":" ", sock->SeqNum, sock->AckNum); + + // ethernet + memcpy(out, Wifi::GetMAC(), 6); out += 6; + memcpy(out, kServerMAC, 6); out += 6; + *(u16*)out = htons(0x0800); out += 2; + + // IP + u8* resp_ipheader = out; + *out++ = 0x45; + *out++ = 0x00; + *(u16*)out = 0; out += 2; // total length + *(u16*)out = htons(IPv4ID); out += 2; IPv4ID++; + *out++ = 0x00; + *out++ = 0x00; + *out++ = 0x80; // TTL + *out++ = 0x06; // protocol (TCP) + *(u16*)out = 0; out += 2; // checksum + *(u32*)out = *(u32*)&sock->DestIP; out += 4; // source IP + *(u32*)out = htonl(kClientIP); out += 4; // destination IP + + // TCP + u8* resp_tcpheader = out; + *(u16*)out = htonl(sock->DestPort); out += 2; // source port + *(u16*)out = htonl(sock->SourcePort); out += 2; // destination port + *(u32*)out = htonl(sock->SeqNum); out += 4; // seq number + *(u32*)out = htonl(sock->AckNum); out += 4; // ack seq number + *(u16*)out = htons(flags); out += 2; // flags + *(u16*)out = htons(0x7000); out += 2; // window size (uuuh) + *(u16*)out = 0; out += 2; // checksum + *(u16*)out = 0; out += 2; // urgent pointer + + u32 framelen = (u32)(out - &resp[0]); + //if (framelen & 1) { *out++ = 0; framelen++; } + FinishTCPFrame(resp, framelen); + + // TODO: if there is already a packet queued, this will overwrite it + // that being said, this will only happen during DHCP setup, so probably + // not a big deal + + PacketLen = framelen; + memcpy(PacketBuffer, resp, PacketLen); + RXNum = 1; +} + +void TCP_BuildIncomingFrame(TCPSocket* sock, u8* data, int len) +{ + u8 resp[2048]; + u8* out = &resp[0]; + + if (len > 1536) return; +//printf("INCOMING SEQ=%08X|%08X\n", sock->SeqNum, sock->AckNum); + // ethernet + memcpy(out, Wifi::GetMAC(), 6); out += 6; // hurf + memcpy(out, kServerMAC, 6); out += 6; + *(u16*)out = htons(0x0800); out += 2; + + // IP + u8* resp_ipheader = out; + *out++ = 0x45; + *out++ = 0x00; + *(u16*)out = 0; out += 2; // total length + *(u16*)out = htons(IPv4ID); out += 2; IPv4ID++; + *out++ = 0x00; + *out++ = 0x00; + *out++ = 0x80; // TTL + *out++ = 0x06; // protocol (TCP) + *(u16*)out = 0; out += 2; // checksum + memcpy(out, sock->DestIP, 4); out += 4; // source IP + *(u32*)out = htonl(kClientIP); out += 4; // destination IP + + // TCP + u8* resp_tcpheader = out; + *(u16*)out = htons(sock->DestPort); out += 2; // source port + *(u16*)out = htons(sock->SourcePort); out += 2; // destination port + *(u32*)out = htonl(sock->SeqNum); out += 4; // seq number + *(u32*)out = htonl(sock->AckNum); out += 4; // ack seq number + *(u16*)out = htons(0x5018); out += 2; // flags (ACK, PSH) + *(u16*)out = htons(0x7000); out += 2; // window size (uuuh) + *(u16*)out = 0; out += 2; // checksum + *(u16*)out = 0; out += 2; // urgent pointer + + memcpy(out, data, len); out += len; + + u32 framelen = (u32)(out - &resp[0]); + FinishTCPFrame(resp, framelen); + + // TODO: if there is already a packet queued, this will overwrite it + // that being said, this will only happen during DHCP setup, so probably + // not a big deal + + PacketLen = framelen; + memcpy(PacketBuffer, resp, PacketLen); + RXNum = 1; + + sock->SeqNum += len; +} + +void HandleTCPFrame(u8* data, int len) +{ + u8* ipheader = &data[0xE]; + u8* tcpheader = &data[0x22]; + + u16 srcport = ntohs(*(u16*)&tcpheader[0]); + u16 dstport = ntohs(*(u16*)&tcpheader[2]); + u16 flags = ntohs(*(u16*)&tcpheader[12]); + + u32 tcpheaderlen = 4 * (flags >> 12); + u32 tcplen = ntohs(*(u16*)&ipheader[2]) - 0x14; + u32 tcpdatalen = tcplen - tcpheaderlen; + + /*printf("tcpflags=%04X header=%d data=%d seq=%08X|%08X\n", + flags, tcpheaderlen, tcpdatalen, + ntohl(*(u32*)&tcpheader[4]), + ntohl(*(u32*)&tcpheader[8]));*/ + + if (flags & 0x002) // SYN + { + int sockid = -1; + TCPSocket* sock; + for (int i = 0; i < (sizeof(TCPSocketList)/sizeof(TCPSocket)); i++) + { + sock = &TCPSocketList[i]; + if (sock->Status != 0 && !memcmp(&sock->DestIP, &ipheader[16], 4) && + sock->SourcePort == srcport && sock->DestPort == dstport) + { + printf("LANMAGIC: duplicate TCP socket\n"); + sockid = i; + break; + } + } + + if (sockid == -1) + { + for (int i = 0; i < (sizeof(TCPSocketList)/sizeof(TCPSocket)); i++) + { + sock = &TCPSocketList[i]; + if (sock->Status == 0) + { + sockid = i; + break; + } + } + } + + if (sockid == -1) + { + printf("LANMAGIC: !! TCP SOCKET LIST FULL\n"); + return; + } + + printf("LANMAGIC: opening TCP socket #%d to %d.%d.%d.%d:%d, srcport %d\n", + sockid, + ipheader[16], ipheader[17], ipheader[18], ipheader[19], + dstport, srcport); + + // keep track of it + sock->Status = 1; + memcpy(sock->DestIP, &ipheader[16], 4); + sock->DestPort = dstport; + sock->SourcePort = srcport; + sock->SeqNum = 0x13370000; + sock->AckNum = 0; + + // open backend socket + if (!sock->Backend) + { + sock->Backend = socket(AF_INET, SOCK_STREAM, 0); + } + + struct sockaddr_in conn_addr; + memset(&conn_addr, 0, sizeof(conn_addr)); + conn_addr.sin_family = AF_INET; + memcpy(&conn_addr.sin_addr, &ipheader[16], 4); + conn_addr.sin_port = htons(dstport); + if (connect(sock->Backend, (sockaddr*)&conn_addr, sizeof(conn_addr)) == -1) + { + printf("connect() shat itself :(\n"); + } + else + { + // acknowledge it + TCP_SYNACK(sock, data, len); + } + } + else + { + int sockid = -1; + TCPSocket* sock; + for (int i = 0; i < (sizeof(TCPSocketList)/sizeof(TCPSocket)); i++) + { + sock = &TCPSocketList[i]; + if (sock->Status != 0 && !memcmp(&sock->DestIP, &ipheader[16], 4) && + sock->SourcePort == srcport && sock->DestPort == dstport) + { + sockid = i; + break; + } + } + + if (sockid == -1) + { + printf("LANMAGIC: bad TCP packet\n"); + return; + } + + // TODO: check those + u32 seqnum = ntohl(*(u32*)&tcpheader[4]); + u32 acknum = ntohl(*(u32*)&tcpheader[8]); + sock->SeqNum = acknum; + sock->AckNum = seqnum + tcpdatalen; + + // send data over the socket + if (tcpdatalen > 0) + { + u8* tcpdata = &tcpheader[tcpheaderlen]; + + printf("TCP: socket %d sending %d bytes (flags=%04X)\n", sockid, tcpdatalen, flags); + send(sock->Backend, (char*)tcpdata, tcpdatalen, 0); + + // kind of a hack, there + TCP_ACK(sock, false); + } + + if (flags & 0x001) // FIN + { + // TODO: timeout etc + printf("TCP: socket %d closing\n", sockid); + + sock->Status = 0; + closesocket(sock->Backend); + sock->Backend = 0; + } + } +} + +void HandleARPFrame(u8* data, int len) +{ + u16 protocol = ntohs(*(u16*)&data[0x10]); + if (protocol != 0x0800) return; + + u16 op = ntohs(*(u16*)&data[0x14]); + u32 targetip = ntohl(*(u32*)&data[0x26]); + + // TODO: handle ARP to the client + // this only handles ARP to the DHCP/router + + if (op == 1) + { + // opcode 1=req 2=reply + // sender MAC + // sender IP + // target MAC + // target IP + + const u8* targetmac; + if (targetip == kServerIP) targetmac = kServerMAC; + else if (targetip == kDNSIP) targetmac = kDNSMAC; + else return; + + u8 resp[64]; + u8* out = &resp[0]; + + // ethernet + memcpy(out, &data[6], 6); out += 6; + memcpy(out, kServerMAC, 6); out += 6; + *(u16*)out = htons(0x0806); out += 2; + + // ARP + *(u16*)out = htons(0x0001); out += 2; // hardware type + *(u16*)out = htons(0x0800); out += 2; // protocol + *out++ = 6; // MAC address size + *out++ = 4; // IP address size + *(u16*)out = htons(0x0002); out += 2; // opcode + memcpy(out, targetmac, 6); out += 6; + *(u32*)out = htonl(targetip); out += 4; + memcpy(out, &data[0x16], 6+4); out += 6+4; + + u32 framelen = (u32)(out - &resp[0]); + + // TODO: if there is already a packet queued, this will overwrite it + // that being said, this will only happen during DHCP setup, so probably + // not a big deal + + PacketLen = framelen; + memcpy(PacketBuffer, resp, PacketLen); + RXNum = 1; + } + else + { + printf("wat??\n"); + } +} + +void HandlePacket(u8* data, int len) +{ + u16 ethertype = ntohs(*(u16*)&data[0xC]); + + if (ethertype == 0x0800) // IPv4 + { + u8 protocol = data[0x17]; + if (protocol == 0x11) // UDP + { + u16 srcport = ntohs(*(u16*)&data[0x22]); + u16 dstport = ntohs(*(u16*)&data[0x24]); + if (srcport == 68 && dstport == 67) // DHCP + { + printf("LANMAGIC: DHCP packet\n"); + return HandleDHCPFrame(data, len); + } + else if (dstport == 53 && htonl(*(u32*)&data[0x1E]) == kDNSIP) // DNS + { + printf("LANMAGIC: DNS packet\n"); + return HandleDNSFrame(data, len); + } + + printf("LANMAGIC: UDP packet %d->%d\n", srcport, dstport); + return HandleUDPFrame(data, len); + } + else if (protocol == 0x06) // TCP + { + printf("LANMAGIC: TCP packet\n"); + return HandleTCPFrame(data, len); + } + else + printf("LANMAGIC: unsupported IP protocol %02X\n", protocol); + } + else if (ethertype == 0x0806) // ARP + { + printf("LANMAGIC: ARP packet\n"); + return HandleARPFrame(data, len); + } + else + printf("LANMAGIC: unsupported ethernet type %04X\n", ethertype); +} + +int SendPacket(u8* data, int len) +{ + if (len > 2048) + { + printf("LAN_SendPacket: error: packet too long (%d)\n", len); + return 0; + } + + HandlePacket(data, len); + return len; +} + +int RecvPacket(u8* data) +{ + int ret = 0; + if (RXNum > 0) + { + memcpy(data, PacketBuffer, PacketLen); + ret = PacketLen; + RXNum = 0; + } + + for (int i = 0; i < (sizeof(TCPSocketList)/sizeof(TCPSocket)); i++) + { + TCPSocket* sock = &TCPSocketList[i]; + if (sock->Status != 1) continue; + + fd_set fd; + struct timeval tv; + + FD_ZERO(&fd); + FD_SET(sock->Backend, &fd); + tv.tv_sec = 0; + tv.tv_usec = 0; + + if (!select(sock->Backend+1, &fd, 0, 0, &tv)) + { + continue; + } + + u8 recvbuf[1024]; + int recvlen = recv(sock->Backend, (char*)recvbuf, 1024, 0); + if (recvlen < 1) + { + if (recvlen == 0) + { + // socket has closed from the other side + printf("TCP: socket %d closed from other side\n", i); + sock->Status = 2; + TCP_ACK(sock, true); + } + continue; + } + + printf("TCP: socket %d receiving %d bytes\n", i, recvlen); + TCP_BuildIncomingFrame(sock, recvbuf, recvlen); + + // debug + /*for (int j = 0; j < recvlen; j += 16) + { + int rem = recvlen - j; + if (rem > 16) rem = 16; + for (int k = 0; k < rem; k++) + { + printf("%02X ", recvbuf[k+j]); + } + printf("\n"); + }*/ + + //recvlen = recv(sock->Backend, (char*)recvbuf, 1024, 0); + //if (recvlen == 0) printf("it closed immediately after\n"); + } + + for (int i = 0; i < (sizeof(UDPSocketList)/sizeof(UDPSocket)); i++) + { + UDPSocket* sock = &UDPSocketList[i]; + if (sock->Backend == 0) continue; + + fd_set fd; + struct timeval tv; + + FD_ZERO(&fd); + FD_SET(sock->Backend, &fd); + tv.tv_sec = 0; + tv.tv_usec = 0; + + if (!select(sock->Backend+1, &fd, 0, 0, &tv)) + { + continue; + } + + u8 recvbuf[1024]; + sockaddr_t fromAddr; + socklen_t fromLen = sizeof(sockaddr_t); + int recvlen = recvfrom(sock->Backend, (char*)recvbuf, 1024, 0, &fromAddr, &fromLen); + if (recvlen < 1) continue; + + if (fromAddr.sa_family != AF_INET) continue; + struct sockaddr_in* fromAddrIn = (struct sockaddr_in*)&fromAddr; + if (memcmp(&fromAddrIn->sin_addr, sock->DestIP, 4)) continue; + if (ntohs(fromAddrIn->sin_port) != sock->DestPort) continue; + + printf("UDP: socket %d receiving %d bytes\n", i, recvlen); + UDP_BuildIncomingFrame(sock, recvbuf, recvlen); + } + + return ret; +} + +} diff --git a/src/frontend/qt_sdl/LAN_Socket.h b/src/frontend/qt_sdl/LAN_Socket.h new file mode 100644 index 0000000..8453a5f --- /dev/null +++ b/src/frontend/qt_sdl/LAN_Socket.h @@ -0,0 +1,38 @@ +/* + Copyright 2016-2020 Arisotura + + This file is part of melonDS. + + melonDS is free software: you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + melonDS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with melonDS. If not, see http://www.gnu.org/licenses/. +*/ + +#ifndef LAN_SOCKET_H +#define LAN_SOCKET_H + +#include "../types.h" + +namespace LAN_Socket +{ + +// + + +bool Init(); +void DeInit(); + +int SendPacket(u8* data, int len); +int RecvPacket(u8* data); + +} + +#endif // LAN_SOCKET_H diff --git a/src/frontend/qt_sdl/OSD.cpp b/src/frontend/qt_sdl/OSD.cpp new file mode 100644 index 0000000..4e4e40f --- /dev/null +++ b/src/frontend/qt_sdl/OSD.cpp @@ -0,0 +1,474 @@ +/* + Copyright 2016-2020 Arisotura + + This file is part of melonDS. + + melonDS is free software: you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + melonDS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with melonDS. If not, see http://www.gnu.org/licenses/. +*/ + +#include <stdio.h> +#include <string.h> +#include <deque> +#include <SDL2/SDL.h> +#include "../types.h" + +#include "main.h" +#include <QPainter> + +#include "OSD.h" +#include "OSD_shaders.h" +#include "font.h" + +#include "PlatformConfig.h" + +extern MainWindow* mainWindow; + +namespace OSD +{ + +const u32 kOSDMargin = 6; + +struct Item +{ + Uint32 Timestamp; + char Text[256]; + u32 Color; + + u32 Width, Height; + u32* Bitmap; + + bool NativeBitmapLoaded; + QImage NativeBitmap; + + bool GLTextureLoaded; + GLuint GLTexture; + +}; + +std::deque<Item> ItemQueue; + +QOpenGLShaderProgram* Shader; +GLint uScreenSize, uOSDPos, uOSDSize; +GLuint OSDVertexArray; +GLuint OSDVertexBuffer; + +volatile bool Rendering; + + +bool Init(QOpenGLFunctions_3_2_Core* f) +{ + if (f) + { + Shader = new QOpenGLShaderProgram(); + Shader->addShaderFromSourceCode(QOpenGLShader::Vertex, kScreenVS_OSD); + Shader->addShaderFromSourceCode(QOpenGLShader::Fragment, kScreenFS_OSD); + + GLuint pid = Shader->programId(); + f->glBindAttribLocation(pid, 0, "vPosition"); + f->glBindFragDataLocation(pid, 0, "oColor"); + + Shader->link(); + + Shader->bind(); + Shader->setUniformValue("OSDTex", (GLint)0); + Shader->release(); + + uScreenSize = Shader->uniformLocation("uScreenSize"); + uOSDPos = Shader->uniformLocation("uOSDPos"); + uOSDSize = Shader->uniformLocation("uOSDSize"); + + float vertices[6*2] = + { + 0, 0, + 1, 1, + 1, 0, + 0, 0, + 0, 1, + 1, 1 + }; + + f->glGenBuffers(1, &OSDVertexBuffer); + f->glBindBuffer(GL_ARRAY_BUFFER, OSDVertexBuffer); + f->glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); + + f->glGenVertexArrays(1, &OSDVertexArray); + f->glBindVertexArray(OSDVertexArray); + f->glEnableVertexAttribArray(0); // position + f->glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, (void*)(0)); + } + + return true; +} + +void DeInit(QOpenGLFunctions_3_2_Core* f) +{ + for (auto it = ItemQueue.begin(); it != ItemQueue.end(); ) + { + Item& item = *it; + + if (item.GLTextureLoaded && f) f->glDeleteTextures(1, &item.GLTexture); + if (item.Bitmap) delete[] item.Bitmap; + + it = ItemQueue.erase(it); + } + + if (f) delete Shader; +} + + +int FindBreakPoint(const char* text, int i) +{ + // i = character that went out of bounds + + for (int j = i; j >= 0; j--) + { + if (text[j] == ' ') + return j; + } + + return i; +} + +void LayoutText(const char* text, u32* width, u32* height, int* breaks) +{ + u32 w = 0; + u32 h = 14; + u32 totalw = 0; + u32 maxw = mainWindow->panel->width() - (kOSDMargin*2); + int lastbreak = -1; + int numbrk = 0; + u16* ptr; + + memset(breaks, 0, sizeof(int)*64); + + for (int i = 0; text[i] != '\0'; ) + { + int glyphsize; + if (text[i] == ' ') + { + glyphsize = 6; + } + else + { + u32 ch = text[i]; + if (ch < 0x10 || ch > 0x7E) ch = 0x7F; + + ptr = &font[(ch-0x10) << 4]; + glyphsize = ptr[0]; + if (!glyphsize) glyphsize = 6; + else glyphsize += 2; // space around the character + } + + w += glyphsize; + if (w > maxw) + { + // wrap shit as needed + if (text[i] == ' ') + { + if (numbrk >= 64) break; + breaks[numbrk++] = i; + i++; + } + else + { + int brk = FindBreakPoint(text, i); + if (brk != lastbreak) i = brk; + + if (numbrk >= 64) break; + breaks[numbrk++] = i; + + lastbreak = brk; + } + + w = 0; + h += 14; + } + else + i++; + + if (w > totalw) totalw = w; + } + + *width = totalw; + *height = h; +} + +u32 RainbowColor(u32 inc) +{ + // inspired from Acmlmboard + + if (inc < 100) return 0xFFFF9B9B + (inc << 8); + else if (inc < 200) return 0xFFFFFF9B - ((inc-100) << 16); + else if (inc < 300) return 0xFF9BFF9B + (inc-200); + else if (inc < 400) return 0xFF9BFFFF - ((inc-300) << 8); + else if (inc < 500) return 0xFF9B9BFF + ((inc-400) << 16); + else return 0xFFFF9BFF - (inc-500); +} + +void RenderText(u32 color, const char* text, Item* item) +{ + u32 w, h; + int breaks[64]; + + bool rainbow = (color == 0); + u32 rainbowinc = ((text[0] * 17) + (SDL_GetTicks() * 13)) % 600; + + color |= 0xFF000000; + const u32 shadow = 0xE0000000; + + LayoutText(text, &w, &h, breaks); + + item->Width = w; + item->Height = h; + item->Bitmap = new u32[w*h]; + memset(item->Bitmap, 0, w*h*sizeof(u32)); + + u32 x = 0, y = 1; + u32 maxw = mainWindow->panel->width() - (kOSDMargin*2); + int curline = 0; + u16* ptr; + + for (int i = 0; text[i] != '\0'; ) + { + int glyphsize; + if (text[i] == ' ') + { + x += 6; + } + else + { + u32 ch = text[i]; + if (ch < 0x10 || ch > 0x7E) ch = 0x7F; + + ptr = &font[(ch-0x10) << 4]; + int glyphsize = ptr[0]; + if (!glyphsize) x += 6; + else + { + x++; + + if (rainbow) + { + color = RainbowColor(rainbowinc); + rainbowinc = (rainbowinc + 30) % 600; + } + + // draw character + for (int cy = 0; cy < 12; cy++) + { + u16 val = ptr[4+cy]; + + for (int cx = 0; cx < glyphsize; cx++) + { + if (val & (1<<cx)) + item->Bitmap[((y+cy) * w) + x+cx] = color; + } + } + + x += glyphsize; + x++; + } + } + + i++; + if (breaks[curline] && i >= breaks[curline]) + { + i = breaks[curline++]; + if (text[i] == ' ') i++; + + x = 0; + y += 14; + } + } + + // shadow + for (y = 0; y < h; y++) + { + for (x = 0; x < w; x++) + { + u32 val; + + val = item->Bitmap[(y * w) + x]; + if ((val >> 24) == 0xFF) continue; + + if (x > 0) val = item->Bitmap[(y * w) + x-1]; + if (x < w-1) val |= item->Bitmap[(y * w) + x+1]; + if (y > 0) + { + if (x > 0) val |= item->Bitmap[((y-1) * w) + x-1]; + val |= item->Bitmap[((y-1) * w) + x]; + if (x < w-1) val |= item->Bitmap[((y-1) * w) + x+1]; + } + if (y < h-1) + { + if (x > 0) val |= item->Bitmap[((y+1) * w) + x-1]; + val |= item->Bitmap[((y+1) * w) + x]; + if (x < w-1) val |= item->Bitmap[((y+1) * w) + x+1]; + } + + if ((val >> 24) == 0xFF) + item->Bitmap[(y * w) + x] = shadow; + } + } +} + + +void AddMessage(u32 color, const char* text) +{ + if (!Config::ShowOSD) return; + + while (Rendering); + + Item item; + + item.Timestamp = SDL_GetTicks(); + strncpy(item.Text, text, 255); item.Text[255] = '\0'; + item.Color = color; + item.Bitmap = nullptr; + + item.NativeBitmapLoaded = false; + item.GLTextureLoaded = false; + + ItemQueue.push_back(item); +} + +void Update(QOpenGLFunctions_3_2_Core* f) +{ + if (!Config::ShowOSD) + { + Rendering = true; + for (auto it = ItemQueue.begin(); it != ItemQueue.end(); ) + { + Item& item = *it; + + if (item.GLTextureLoaded && f) f->glDeleteTextures(1, &item.GLTexture); + if (item.Bitmap) delete[] item.Bitmap; + + it = ItemQueue.erase(it); + } + Rendering = false; + return; + } + + Rendering = true; + + Uint32 tick_now = SDL_GetTicks(); + Uint32 tick_min = tick_now - 2500; + + for (auto it = ItemQueue.begin(); it != ItemQueue.end(); ) + { + Item& item = *it; + + if (item.Timestamp < tick_min) + { + if (item.GLTextureLoaded) f->glDeleteTextures(1, &item.GLTexture); + if (item.Bitmap) delete[] item.Bitmap; + + it = ItemQueue.erase(it); + continue; + } + + if (!item.Bitmap) + { + RenderText(item.Color, item.Text, &item); + } + + it++; + } + + Rendering = false; +} + +void DrawNative(QPainter& painter) +{ + if (!Config::ShowOSD) return; + + Rendering = true; + + u32 y = kOSDMargin; + + painter.resetTransform(); + + for (auto it = ItemQueue.begin(); it != ItemQueue.end(); ) + { + Item& item = *it; + + if (!item.NativeBitmapLoaded) + { + item.NativeBitmap = QImage((const uchar*)item.Bitmap, item.Width, item.Height, QImage::Format_ARGB32_Premultiplied); + item.NativeBitmapLoaded = true; + } + + painter.drawImage(kOSDMargin, y, item.NativeBitmap); + + y += item.Height; + it++; + } + + Rendering = false; +} + +void DrawGL(QOpenGLFunctions_3_2_Core* f, float w, float h) +{ + if (!Config::ShowOSD) return; + if (!mainWindow || !mainWindow->panel) return; + + Rendering = true; + + u32 y = kOSDMargin; + + Shader->bind(); + + f->glUniform2f(uScreenSize, w, h); + + f->glBindBuffer(GL_ARRAY_BUFFER, OSDVertexBuffer); + f->glBindVertexArray(OSDVertexArray); + + f->glActiveTexture(GL_TEXTURE0); + + f->glEnable(GL_BLEND); + f->glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); + + for (auto it = ItemQueue.begin(); it != ItemQueue.end(); ) + { + Item& item = *it; + + if (!item.GLTextureLoaded) + { + f->glGenTextures(1, &item.GLTexture); + f->glBindTexture(GL_TEXTURE_2D, item.GLTexture); + f->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + f->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + f->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + f->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + f->glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, item.Width, item.Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, item.Bitmap); + + item.GLTextureLoaded = true; + } + + f->glBindTexture(GL_TEXTURE_2D, item.GLTexture); + f->glUniform2i(uOSDPos, kOSDMargin, y); + f->glUniform2i(uOSDSize, item.Width, item.Height); + f->glDrawArrays(GL_TRIANGLES, 0, 2*3); + + y += item.Height; + it++; + } + + f->glDisable(GL_BLEND); + Shader->release(); + + Rendering = false; +} + +} diff --git a/src/frontend/qt_sdl/OSD.h b/src/frontend/qt_sdl/OSD.h new file mode 100644 index 0000000..79d9df0 --- /dev/null +++ b/src/frontend/qt_sdl/OSD.h @@ -0,0 +1,36 @@ +/* + Copyright 2016-2020 Arisotura + + This file is part of melonDS. + + melonDS is free software: you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + melonDS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with melonDS. If not, see http://www.gnu.org/licenses/. +*/ + +#ifndef OSD_H +#define OSD_H + +namespace OSD +{ + +bool Init(QOpenGLFunctions_3_2_Core* f); +void DeInit(QOpenGLFunctions_3_2_Core* f); + +void AddMessage(u32 color, const char* text); + +void Update(QOpenGLFunctions_3_2_Core* f); +void DrawNative(QPainter& painter); +void DrawGL(QOpenGLFunctions_3_2_Core* f, float w, float h); + +} + +#endif // OSD_H diff --git a/src/frontend/qt_sdl/OSD_shaders.h b/src/frontend/qt_sdl/OSD_shaders.h new file mode 100644 index 0000000..5a64f66 --- /dev/null +++ b/src/frontend/qt_sdl/OSD_shaders.h @@ -0,0 +1,65 @@ +/* + Copyright 2016-2020 Arisotura + + This file is part of melonDS. + + melonDS is free software: you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + melonDS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with melonDS. If not, see http://www.gnu.org/licenses/. +*/ + +#ifndef OSD_SHADERS_H +#define OSD_SHADERS_H + +const char* kScreenVS_OSD = R"(#version 140 + +uniform vec2 uScreenSize; + +uniform ivec2 uOSDPos; +uniform ivec2 uOSDSize; + +in vec2 vPosition; + +smooth out vec2 fTexcoord; + +void main() +{ + vec4 fpos; + + vec2 osdpos = (vPosition * vec2(uOSDSize)); + fTexcoord = osdpos; + osdpos += uOSDPos; + + fpos.xy = ((osdpos * 2.0) / uScreenSize) - 1.0; + fpos.y *= -1; + fpos.z = 0.0; + fpos.w = 1.0; + + gl_Position = fpos; +} +)"; + +const char* kScreenFS_OSD = R"(#version 140 + +uniform sampler2D OSDTex; + +smooth in vec2 fTexcoord; + +out vec4 oColor; + +void main() +{ + vec4 pixel = texelFetch(OSDTex, ivec2(fTexcoord), 0); + oColor = pixel.bgra; +} +)"; + +#endif // OSD_SHADERS_H diff --git a/src/frontend/qt_sdl/Platform.cpp b/src/frontend/qt_sdl/Platform.cpp index 125e7ea..47befb0 100644 --- a/src/frontend/qt_sdl/Platform.cpp +++ b/src/frontend/qt_sdl/Platform.cpp @@ -27,8 +27,9 @@ #include "Platform.h" #include "PlatformConfig.h" -//#include "LAN_Socket.h" -//#include "LAN_PCap.h" +#include "LAN_Socket.h" +#include "LAN_PCap.h" +#include <string> #ifdef __WIN32__ #define NTDDI_VERSION 0x06000000 // GROSS FUCKING HACK @@ -56,9 +57,10 @@ #endif -extern char* EmuDirectory; +char* EmuDirectory; -void Stop(bool internal); +void emuStop(); +void* oglGetProcAddress(const char* proc); namespace Platform @@ -71,11 +73,57 @@ u8 PacketBuffer[2048]; #define NIFI_VER 1 +void Init(int argc, char** argv) +{ +#if defined(__WIN32__) || defined(UNIX_PORTABLE) + if (argc > 0 && strlen(argv[0]) > 0) + { + int len = strlen(argv[0]); + while (len > 0) + { + if (argv[0][len] == '/') break; + if (argv[0][len] == '\\') break; + len--; + } + if (len > 0) + { + EmuDirectory = new char[len+1]; + strncpy(EmuDirectory, argv[0], len); + EmuDirectory[len] = '\0'; + } + else + { + EmuDirectory = new char[2]; + strcpy(EmuDirectory, "."); + } + } + else + { + EmuDirectory = new char[2]; + strcpy(EmuDirectory, "."); + } +#else + QString confdir; + QDir config(QStandardPaths::writableLocation(QStandardPaths::ConfigLocation)); + config.mkdir("melonDS"); + confdir = config.absolutePath() + "/melonDS/"; + EmuDirectory = new char[confdir.length() + 1]; + memcpy(EmuDirectory, confdir.toUtf8().data(), confdir.length()); +#endif +} + +void DeInit() +{ + delete[] EmuDirectory; +} + + void StopEmu() { - //Stop(true); + emuStop(); } + FILE* OpenFile(const char* path, const char* mode, bool mustexist) { QFile f(path); @@ -200,30 +248,30 @@ void Semaphore_Post(void* sema) void* GL_GetProcAddress(const char* proc) { - return (void*) QOpenGLContext::globalShareContext()->getProcAddress(proc); + return oglGetProcAddress(proc); } bool MP_Init() { - int opt_true = 1; - int res; + int opt_true = 1; + int res; #ifdef __WIN32__ - WSADATA wsadata; - if (WSAStartup(MAKEWORD(2, 2), &wsadata) != 0) - { - return false; - } + WSADATA wsadata; + if (WSAStartup(MAKEWORD(2, 2), &wsadata) != 0) + { + return false; + } #endif // __WIN32__ - MPSocket = socket(AF_INET, SOCK_DGRAM, 0); + MPSocket = socket(AF_INET, SOCK_DGRAM, 0); if (MPSocket < 0) { return false; } - res = setsockopt(MPSocket, SOL_SOCKET, SO_REUSEADDR, (const char*) &opt_true, sizeof(int)); + res = setsockopt(MPSocket, SOL_SOCKET, SO_REUSEADDR, (const char*)&opt_true, sizeof(int)); if (res < 0) { closesocket(MPSocket); @@ -233,8 +281,8 @@ bool MP_Init() sockaddr_t saddr; saddr.sa_family = AF_INET; - *(u32*) &saddr.sa_data[2] = htonl(Config::SocketBindAnyAddr ? INADDR_ANY : INADDR_LOOPBACK); - *(u16*) &saddr.sa_data[0] = htons(7064); + *(u32*)&saddr.sa_data[2] = htonl(Config::SocketBindAnyAddr ? INADDR_ANY : INADDR_LOOPBACK); + *(u16*)&saddr.sa_data[0] = htons(7064); res = bind(MPSocket, &saddr, sizeof(sockaddr_t)); if (res < 0) { @@ -243,7 +291,7 @@ bool MP_Init() return false; } - res = setsockopt(MPSocket, SOL_SOCKET, SO_BROADCAST, (const char*) &opt_true, sizeof(int)); + res = setsockopt(MPSocket, SOL_SOCKET, SO_BROADCAST, (const char*)&opt_true, sizeof(int)); if (res < 0) { closesocket(MPSocket); @@ -252,50 +300,50 @@ bool MP_Init() } MPSendAddr.sa_family = AF_INET; - *(u32*) &MPSendAddr.sa_data[2] = htonl(INADDR_BROADCAST); - *(u16*) &MPSendAddr.sa_data[0] = htons(7064); + *(u32*)&MPSendAddr.sa_data[2] = htonl(INADDR_BROADCAST); + *(u16*)&MPSendAddr.sa_data[0] = htons(7064); return true; } void MP_DeInit() { - if (MPSocket >= 0) - closesocket(MPSocket); + if (MPSocket >= 0) + closesocket(MPSocket); #ifdef __WIN32__ - WSACleanup(); + WSACleanup(); #endif // __WIN32__ } int MP_SendPacket(u8* data, int len) { - if (MPSocket < 0) - return 0; - - if (len > 2048 - 8) - { - printf("MP_SendPacket: error: packet too long (%d)\n", len); - return 0; - } - - *(u32*) &PacketBuffer[0] = htonl(0x4946494E); // NIFI - PacketBuffer[4] = NIFI_VER; - PacketBuffer[5] = 0; - *(u16*) &PacketBuffer[6] = htons(len); - memcpy(&PacketBuffer[8], data, len); - - int slen = sendto(MPSocket, (const char*) PacketBuffer, len + 8, 0, &MPSendAddr, sizeof(sockaddr_t)); - if (slen < 8) return 0; - return slen - 8; + if (MPSocket < 0) + return 0; + + if (len > 2048-8) + { + printf("MP_SendPacket: error: packet too long (%d)\n", len); + return 0; + } + + *(u32*)&PacketBuffer[0] = htonl(0x4946494E); // NIFI + PacketBuffer[4] = NIFI_VER; + PacketBuffer[5] = 0; + *(u16*)&PacketBuffer[6] = htons(len); + memcpy(&PacketBuffer[8], data, len); + + int slen = sendto(MPSocket, (const char*)PacketBuffer, len+8, 0, &MPSendAddr, sizeof(sockaddr_t)); + if (slen < 8) return 0; + return slen - 8; } int MP_RecvPacket(u8* data, bool block) { - if (MPSocket < 0) - return 0; + if (MPSocket < 0) + return 0; - fd_set fd; + fd_set fd; struct timeval tv; FD_ZERO(&fd); @@ -303,83 +351,82 @@ int MP_RecvPacket(u8* data, bool block) tv.tv_sec = 0; tv.tv_usec = block ? 5000 : 0; - if (!select(MPSocket + 1, &fd, 0, 0, &tv)) - { - return 0; - } - - sockaddr_t fromAddr; - socklen_t fromLen = sizeof(sockaddr_t); - int rlen = recvfrom(MPSocket, (char*) PacketBuffer, 2048, 0, &fromAddr, &fromLen); - if (rlen < 8 + 24) - { - return 0; - } - rlen -= 8; - - if (ntohl(*(u32*) &PacketBuffer[0]) != 0x4946494E) - { - return 0; - } - - if (PacketBuffer[4] != NIFI_VER) - { - return 0; - } - - if (ntohs(*(u16*) &PacketBuffer[6]) != rlen) - { - return 0; - } - - memcpy(data, &PacketBuffer[8], rlen); - return rlen; + if (!select(MPSocket+1, &fd, 0, 0, &tv)) + { + return 0; + } + + sockaddr_t fromAddr; + socklen_t fromLen = sizeof(sockaddr_t); + int rlen = recvfrom(MPSocket, (char*)PacketBuffer, 2048, 0, &fromAddr, &fromLen); + if (rlen < 8+24) + { + return 0; + } + rlen -= 8; + + if (ntohl(*(u32*)&PacketBuffer[0]) != 0x4946494E) + { + return 0; + } + + if (PacketBuffer[4] != NIFI_VER) + { + return 0; + } + + if (ntohs(*(u16*)&PacketBuffer[6]) != rlen) + { + return 0; + } + + memcpy(data, &PacketBuffer[8], rlen); + return rlen; } + bool LAN_Init() { - /*if (Config::DirectLAN) - { - if (!LAN_PCap::Init(true)) - return false; - } - else - { - if (!LAN_Socket::Init()) - return false; - }*/ - - return true; + if (Config::DirectLAN) + { + if (!LAN_PCap::Init(true)) + return false; + } + else + { + if (!LAN_Socket::Init()) + return false; + } + + return true; } void LAN_DeInit() { - // checkme. blarg - //if (Config::DirectLAN) - // LAN_PCap::DeInit(); - //else - // LAN_Socket::DeInit(); - /*LAN_PCap::DeInit(); - LAN_Socket::DeInit();*/ + // checkme. blarg + //if (Config::DirectLAN) + // LAN_PCap::DeInit(); + //else + // LAN_Socket::DeInit(); + LAN_PCap::DeInit(); + LAN_Socket::DeInit(); } int LAN_SendPacket(u8* data, int len) { - /*if (Config::DirectLAN) - return LAN_PCap::SendPacket(data, len); - else - return LAN_Socket::SendPacket(data, len);*/ - return 0; + if (Config::DirectLAN) + return LAN_PCap::SendPacket(data, len); + else + return LAN_Socket::SendPacket(data, len); } int LAN_RecvPacket(u8* data) { - /*if (Config::DirectLAN) - return LAN_PCap::RecvPacket(data); - else - return LAN_Socket::RecvPacket(data);*/ - return 0; + if (Config::DirectLAN) + return LAN_PCap::RecvPacket(data); + else + return LAN_Socket::RecvPacket(data); } diff --git a/src/frontend/qt_sdl/PlatformConfig.cpp b/src/frontend/qt_sdl/PlatformConfig.cpp index f78b195..06128d7 100644 --- a/src/frontend/qt_sdl/PlatformConfig.cpp +++ b/src/frontend/qt_sdl/PlatformConfig.cpp @@ -40,16 +40,24 @@ int ScreenRotation; int ScreenGap; int ScreenLayout; int ScreenSizing; +int IntegerScaling; int ScreenFilter; int ScreenUseGL; int ScreenVSync; -int ScreenRatio; +int ScreenVSyncInterval; + +int _3DRenderer; +int Threaded3D; + +int GL_ScaleFactor; +int GL_Antialias; int LimitFPS; int AudioSync; int ShowOSD; +int ConsoleType; int DirectBoot; int SocketBindAnyAddr; @@ -60,25 +68,25 @@ int SavestateRelocSRAM; int AudioVolume; int MicInputType; -char MicWavPath[512]; +char MicWavPath[1024]; -char LastROMFolder[512]; +char LastROMFolder[1024]; ConfigEntry PlatformConfigFile[] = { - {"Key_A", 0, &KeyMapping[0], 32, NULL, 0}, - {"Key_B", 0, &KeyMapping[1], 31, NULL, 0}, - {"Key_Select", 0, &KeyMapping[2], 57, NULL, 0}, - {"Key_Start", 0, &KeyMapping[3], 28, NULL, 0}, - {"Key_Right", 0, &KeyMapping[4], 333, NULL, 0}, - {"Key_Left", 0, &KeyMapping[5], 331, NULL, 0}, - {"Key_Up", 0, &KeyMapping[6], 328, NULL, 0}, - {"Key_Down", 0, &KeyMapping[7], 336, NULL, 0}, - {"Key_R", 0, &KeyMapping[8], 54, NULL, 0}, - {"Key_L", 0, &KeyMapping[9], 86, NULL, 0}, - {"Key_X", 0, &KeyMapping[10], 17, NULL, 0}, - {"Key_Y", 0, &KeyMapping[11], 30, NULL, 0}, + {"Key_A", 0, &KeyMapping[0], -1, NULL, 0}, + {"Key_B", 0, &KeyMapping[1], -1, NULL, 0}, + {"Key_Select", 0, &KeyMapping[2], -1, NULL, 0}, + {"Key_Start", 0, &KeyMapping[3], -1, NULL, 0}, + {"Key_Right", 0, &KeyMapping[4], -1, NULL, 0}, + {"Key_Left", 0, &KeyMapping[5], -1, NULL, 0}, + {"Key_Up", 0, &KeyMapping[6], -1, NULL, 0}, + {"Key_Down", 0, &KeyMapping[7], -1, NULL, 0}, + {"Key_R", 0, &KeyMapping[8], -1, NULL, 0}, + {"Key_L", 0, &KeyMapping[9], -1, NULL, 0}, + {"Key_X", 0, &KeyMapping[10], -1, NULL, 0}, + {"Key_Y", 0, &KeyMapping[11], -1, NULL, 0}, {"Joy_A", 0, &JoyMapping[0], -1, NULL, 0}, {"Joy_B", 0, &JoyMapping[1], -1, NULL, 0}, @@ -93,14 +101,14 @@ ConfigEntry PlatformConfigFile[] = {"Joy_X", 0, &JoyMapping[10], -1, NULL, 0}, {"Joy_Y", 0, &JoyMapping[11], -1, NULL, 0}, - {"HKKey_Lid", 0, &HKKeyMapping[HK_Lid], 0x0D, NULL, 0}, - {"HKKey_Mic", 0, &HKKeyMapping[HK_Mic], 0x35, NULL, 0}, - {"HKKey_Pause", 0, &HKKeyMapping[HK_Pause], -1, NULL, 0}, - {"HKKey_Reset", 0, &HKKeyMapping[HK_Reset], -1, NULL, 0}, - {"HKKey_FastForward", 0, &HKKeyMapping[HK_FastForward], 0x0F, NULL, 0}, - {"HKKey_FastForwardToggle", 0, &HKKeyMapping[HK_FastForwardToggle], -1, NULL, 0}, - {"HKKey_SolarSensorDecrease", 0, &HKKeyMapping[HK_SolarSensorDecrease], 0x4B, NULL, 0}, - {"HKKey_SolarSensorIncrease", 0, &HKKeyMapping[HK_SolarSensorIncrease], 0x4D, NULL, 0}, + {"HKKey_Lid", 0, &HKKeyMapping[HK_Lid], -1, NULL, 0}, + {"HKKey_Mic", 0, &HKKeyMapping[HK_Mic], -1, NULL, 0}, + {"HKKey_Pause", 0, &HKKeyMapping[HK_Pause], -1, NULL, 0}, + {"HKKey_Reset", 0, &HKKeyMapping[HK_Reset], -1, NULL, 0}, + {"HKKey_FastForward", 0, &HKKeyMapping[HK_FastForward], -1, NULL, 0}, + {"HKKey_FastForwardToggle", 0, &HKKeyMapping[HK_FastForwardToggle], -1, NULL, 0}, + {"HKKey_SolarSensorDecrease", 0, &HKKeyMapping[HK_SolarSensorDecrease], -1, NULL, 0}, + {"HKKey_SolarSensorIncrease", 0, &HKKeyMapping[HK_SolarSensorIncrease], -1, NULL, 0}, {"HKJoy_Lid", 0, &HKJoyMapping[HK_Lid], -1, NULL, 0}, {"HKJoy_Mic", 0, &HKJoyMapping[HK_Mic], -1, NULL, 0}, @@ -121,16 +129,24 @@ ConfigEntry PlatformConfigFile[] = {"ScreenGap", 0, &ScreenGap, 0, NULL, 0}, {"ScreenLayout", 0, &ScreenLayout, 0, NULL, 0}, {"ScreenSizing", 0, &ScreenSizing, 0, NULL, 0}, + {"IntegerScaling", 0, &IntegerScaling, 0, NULL, 0}, {"ScreenFilter", 0, &ScreenFilter, 1, NULL, 0}, - {"ScreenUseGL", 0, &ScreenUseGL, 1, NULL, 0}, - {"ScreenVSync", 0, &ScreenVSync, 0, NULL, 0}, - {"ScreenRatio", 0, &ScreenRatio, 0, NULL, 0}, + {"ScreenUseGL", 0, &ScreenUseGL, 1, NULL, 0}, + {"ScreenVSync", 0, &ScreenVSync, 0, NULL, 0}, + {"ScreenVSyncInterval", 0, &ScreenVSyncInterval, 1, NULL, 0}, + + {"3DRenderer", 0, &_3DRenderer, 1, NULL, 0}, + {"Threaded3D", 0, &Threaded3D, 1, NULL, 0}, + + {"GL_ScaleFactor", 0, &GL_ScaleFactor, 1, NULL, 0}, + {"GL_Antialias", 0, &GL_Antialias, 0, NULL, 0}, {"LimitFPS", 0, &LimitFPS, 0, NULL, 0}, {"AudioSync", 0, &AudioSync, 1, NULL, 0}, {"ShowOSD", 0, &ShowOSD, 1, NULL, 0}, + {"ConsoleType", 0, &ConsoleType, 0, NULL, 0}, {"DirectBoot", 0, &DirectBoot, 1, NULL, 0}, {"SockBindAnyAddr", 0, &SocketBindAnyAddr, 0, NULL, 0}, @@ -141,9 +157,9 @@ ConfigEntry PlatformConfigFile[] = {"AudioVolume", 0, &AudioVolume, 256, NULL, 0}, {"MicInputType", 0, &MicInputType, 1, NULL, 0}, - {"MicWavPath", 1, MicWavPath, 0, "", 511}, + {"MicWavPath", 1, MicWavPath, 0, "", 1023}, - {"LastROMFolder", 1, LastROMFolder, 0, "", 511}, + {"LastROMFolder", 1, LastROMFolder, 0, "", 1023}, {"", -1, NULL, 0, NULL, 0} }; diff --git a/src/frontend/qt_sdl/PlatformConfig.h b/src/frontend/qt_sdl/PlatformConfig.h index d0f765b..791bb07 100644 --- a/src/frontend/qt_sdl/PlatformConfig.h +++ b/src/frontend/qt_sdl/PlatformConfig.h @@ -53,16 +53,24 @@ extern int ScreenRotation; extern int ScreenGap; extern int ScreenLayout; extern int ScreenSizing; +extern int IntegerScaling; extern int ScreenFilter; extern int ScreenUseGL; extern int ScreenVSync; -extern int ScreenRatio; +extern int ScreenVSyncInterval; + +extern int _3DRenderer; +extern int Threaded3D; + +extern int GL_ScaleFactor; +extern int GL_Antialias; extern int LimitFPS; extern int AudioSync; extern int ShowOSD; +extern int ConsoleType; extern int DirectBoot; extern int SocketBindAnyAddr; @@ -73,9 +81,9 @@ extern int SavestateRelocSRAM; extern int AudioVolume; extern int MicInputType; -extern char MicWavPath[512]; +extern char MicWavPath[1024]; -extern char LastROMFolder[512]; +extern char LastROMFolder[1024]; } diff --git a/src/frontend/qt_sdl/VideoSettingsDialog.cpp b/src/frontend/qt_sdl/VideoSettingsDialog.cpp new file mode 100644 index 0000000..ba433c3 --- /dev/null +++ b/src/frontend/qt_sdl/VideoSettingsDialog.cpp @@ -0,0 +1,169 @@ +/* + Copyright 2016-2020 Arisotura + + This file is part of melonDS. + + melonDS is free software: you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + melonDS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with melonDS. If not, see http://www.gnu.org/licenses/. +*/ + +#include <stdio.h> +#include <QFileDialog> + +#include "types.h" +#include "Platform.h" +#include "Config.h" +#include "PlatformConfig.h" + +#include "VideoSettingsDialog.h" +#include "ui_VideoSettingsDialog.h" + + +VideoSettingsDialog* VideoSettingsDialog::currentDlg = nullptr; + + +VideoSettingsDialog::VideoSettingsDialog(QWidget* parent) : QDialog(parent), ui(new Ui::VideoSettingsDialog) +{ + ui->setupUi(this); + setAttribute(Qt::WA_DeleteOnClose); + + oldRenderer = Config::_3DRenderer; + oldGLDisplay = Config::ScreenUseGL; + oldVSync = Config::ScreenVSync; + oldVSyncInterval = Config::ScreenVSyncInterval; + oldSoftThreaded = Config::Threaded3D; + oldGLScale = Config::GL_ScaleFactor; + + grp3DRenderer = new QButtonGroup(this); + grp3DRenderer->addButton(ui->rb3DSoftware, 0); + grp3DRenderer->addButton(ui->rb3DOpenGL, 1); + connect(grp3DRenderer, SIGNAL(buttonClicked(int)), this, SLOT(onChange3DRenderer(int))); + grp3DRenderer->button(Config::_3DRenderer)->setChecked(true); + + ui->cbGLDisplay->setChecked(Config::ScreenUseGL != 0); + + ui->cbVSync->setChecked(Config::ScreenVSync != 0); + ui->sbVSyncInterval->setValue(Config::ScreenVSyncInterval); + + ui->cbSoftwareThreaded->setChecked(Config::Threaded3D != 0); + + for (int i = 1; i <= 16; i++) + ui->cbxGLResolution->addItem(QString("%1x native (%2x%3)").arg(i).arg(256*i).arg(192*i)); + ui->cbxGLResolution->setCurrentIndex(Config::GL_ScaleFactor-1); + + if (!Config::ScreenVSync) + ui->sbVSyncInterval->setEnabled(false); + + if (Config::_3DRenderer == 0) + { + ui->cbGLDisplay->setEnabled(true); + ui->cbSoftwareThreaded->setEnabled(true); + ui->cbxGLResolution->setEnabled(false); + } + else + { + ui->cbGLDisplay->setEnabled(false); + ui->cbSoftwareThreaded->setEnabled(false); + ui->cbxGLResolution->setEnabled(true); + } +} + +VideoSettingsDialog::~VideoSettingsDialog() +{ + delete ui; +} + +void VideoSettingsDialog::on_VideoSettingsDialog_accepted() +{ + Config::Save(); + + closeDlg(); +} + +void VideoSettingsDialog::on_VideoSettingsDialog_rejected() +{ + bool old_gl = (Config::ScreenUseGL != 0) || (Config::_3DRenderer != 0); + + Config::_3DRenderer = oldRenderer; + Config::ScreenUseGL = oldGLDisplay; + Config::ScreenVSync = oldVSync; + Config::ScreenVSyncInterval = oldVSyncInterval; + Config::Threaded3D = oldSoftThreaded; + Config::GL_ScaleFactor = oldGLScale; + + bool new_gl = (Config::ScreenUseGL != 0) || (Config::_3DRenderer != 0); + emit updateVideoSettings(old_gl != new_gl); + + closeDlg(); +} + +void VideoSettingsDialog::onChange3DRenderer(int renderer) +{ + bool old_gl = (Config::ScreenUseGL != 0) || (Config::_3DRenderer != 0); + + Config::_3DRenderer = renderer; + + if (renderer == 0) + { + ui->cbGLDisplay->setEnabled(true); + ui->cbSoftwareThreaded->setEnabled(true); + ui->cbxGLResolution->setEnabled(false); + } + else + { + ui->cbGLDisplay->setEnabled(false); + ui->cbSoftwareThreaded->setEnabled(false); + ui->cbxGLResolution->setEnabled(true); + } + + bool new_gl = (Config::ScreenUseGL != 0) || (Config::_3DRenderer != 0); + emit updateVideoSettings(old_gl != new_gl); +} + +void VideoSettingsDialog::on_cbGLDisplay_stateChanged(int state) +{ + bool old_gl = (Config::ScreenUseGL != 0) || (Config::_3DRenderer != 0); + + Config::ScreenUseGL = (state != 0); + + bool new_gl = (Config::ScreenUseGL != 0) || (Config::_3DRenderer != 0); + emit updateVideoSettings(old_gl != new_gl); +} + +void VideoSettingsDialog::on_cbVSync_stateChanged(int state) +{ + bool vsync = (state != 0); + ui->sbVSyncInterval->setEnabled(vsync); + Config::ScreenVSync = vsync; +} + +void VideoSettingsDialog::on_sbVSyncInterval_valueChanged(int val) +{ + Config::ScreenVSyncInterval = val; +} + +void VideoSettingsDialog::on_cbSoftwareThreaded_stateChanged(int state) +{ + Config::Threaded3D = (state != 0); + + emit updateVideoSettings(false); +} + +void VideoSettingsDialog::on_cbxGLResolution_currentIndexChanged(int idx) +{ + // prevent a spurious change + if (ui->cbxGLResolution->count() < 16) return; + + Config::GL_ScaleFactor = idx+1; + + emit updateVideoSettings(false); +} diff --git a/src/frontend/qt_sdl/VideoSettingsDialog.h b/src/frontend/qt_sdl/VideoSettingsDialog.h new file mode 100644 index 0000000..2311d4d --- /dev/null +++ b/src/frontend/qt_sdl/VideoSettingsDialog.h @@ -0,0 +1,84 @@ +/* + Copyright 2016-2020 Arisotura + + This file is part of melonDS. + + melonDS is free software: you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + melonDS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with melonDS. If not, see http://www.gnu.org/licenses/. +*/ + +#ifndef VIDEOSETTINGSDIALOG_H +#define VIDEOSETTINGSDIALOG_H + +#include <QDialog> +#include <QButtonGroup> + +namespace Ui { class VideoSettingsDialog; } +class VideoSettingsDialog; + +class VideoSettingsDialog : public QDialog +{ + Q_OBJECT + +public: + explicit VideoSettingsDialog(QWidget* parent); + ~VideoSettingsDialog(); + + static VideoSettingsDialog* currentDlg; + static VideoSettingsDialog* openDlg(QWidget* parent) + { + if (currentDlg) + { + currentDlg->activateWindow(); + return currentDlg; + } + + currentDlg = new VideoSettingsDialog(parent); + currentDlg->show(); + return currentDlg; + } + static void closeDlg() + { + currentDlg = nullptr; + } + +signals: + void updateVideoSettings(bool glchange); + +private slots: + void on_VideoSettingsDialog_accepted(); + void on_VideoSettingsDialog_rejected(); + + void onChange3DRenderer(int renderer); + void on_cbGLDisplay_stateChanged(int state); + void on_cbVSync_stateChanged(int state); + void on_sbVSyncInterval_valueChanged(int val); + + void on_cbxGLResolution_currentIndexChanged(int idx); + + void on_cbSoftwareThreaded_stateChanged(int state); + +private: + Ui::VideoSettingsDialog* ui; + + QButtonGroup* grp3DRenderer; + + int oldRenderer; + int oldGLDisplay; + int oldVSync; + int oldVSyncInterval; + int oldSoftThreaded; + int oldGLScale; +}; + +#endif // VIDEOSETTINGSDIALOG_H + diff --git a/src/frontend/qt_sdl/VideoSettingsDialog.ui b/src/frontend/qt_sdl/VideoSettingsDialog.ui new file mode 100644 index 0000000..6cdd5d8 --- /dev/null +++ b/src/frontend/qt_sdl/VideoSettingsDialog.ui @@ -0,0 +1,229 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>VideoSettingsDialog</class> + <widget class="QDialog" name="VideoSettingsDialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>482</width> + <height>237</height> + </rect> + </property> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="windowTitle"> + <string>Video settings - melonDS</string> + </property> + <layout class="QGridLayout" name="gridLayout"> + <property name="sizeConstraint"> + <enum>QLayout::SetFixedSize</enum> + </property> + <item row="1" column="1"> + <widget class="QGroupBox" name="groupBox_3"> + <property name="title"> + <string>OpenGL renderer</string> + </property> + <layout class="QGridLayout" name="gridLayout_4"> + <item row="0" column="0"> + <widget class="QLabel" name="label_3"> + <property name="text"> + <string>Internal resolution:</string> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QComboBox" name="cbxGLResolution"> + <property name="whatsThis"> + <string><html><head/><body><p>The resolution at which the 3D graphics will be rendered. Higher resolutions improve graphics quality when the main window is enlarged, but may also cause glitches.</p></body></html></string> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item row="0" column="1"> + <widget class="QGroupBox" name="groupBox_2"> + <property name="title"> + <string>Software renderer</string> + </property> + <layout class="QGridLayout" name="gridLayout_3"> + <item row="0" column="0"> + <widget class="QCheckBox" name="cbSoftwareThreaded"> + <property name="whatsThis"> + <string><html><head/><body><p>Run the software renderer on a separate thread. Yields better performance on multi-core CPUs.</p></body></html></string> + </property> + <property name="text"> + <string>Use separate thread</string> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item row="4" column="0" colspan="2"> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> + </property> + </widget> + </item> + <item row="2" column="1"> + <spacer name="verticalSpacer_2"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + <item row="0" column="0" rowspan="3"> + <widget class="QGroupBox" name="groupBox"> + <property name="title"> + <string>Display settings</string> + </property> + <layout class="QGridLayout" name="gridLayout_2"> + <item row="6" column="0"> + <widget class="QLabel" name="label_2"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="whatsThis"> + <string><html><head/><body><p>The interval at which to synchronize to the monitor's refresh rate. Set to 1 for a 60Hz monitor, 2 for 120Hz, ...</p></body></html></string> + </property> + <property name="text"> + <string>VSync interval:</string> + </property> + </widget> + </item> + <item row="6" column="1"> + <widget class="QSpinBox" name="sbVSyncInterval"> + <property name="whatsThis"> + <string><html><head/><body><p>The interval at which to synchronize to the monitor's refresh rate. Set to 1 for a 60Hz monitor, 2 for 120Hz, ...</p></body></html></string> + </property> + <property name="minimum"> + <number>1</number> + </property> + <property name="maximum"> + <number>20</number> + </property> + </widget> + </item> + <item row="4" column="0" colspan="2"> + <widget class="QCheckBox" name="cbGLDisplay"> + <property name="whatsThis"> + <string><html><head/><body><p>Use OpenGL to draw the DS screens to the main window. May result in better frame pacing. Mandatory when using the OpenGL 3D renderer.</p></body></html></string> + </property> + <property name="text"> + <string>OpenGL display</string> + </property> + </widget> + </item> + <item row="5" column="0" colspan="2"> + <widget class="QCheckBox" name="cbVSync"> + <property name="whatsThis"> + <string><html><head/><body><p>When using OpenGL, synchronize the video output to your monitor's refresh rate.</p></body></html></string> + </property> + <property name="text"> + <string>VSync</string> + </property> + </widget> + </item> + <item row="3" column="0" colspan="2"> + <spacer name="verticalSpacer"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::Fixed</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item row="2" column="0" colspan="2"> + <widget class="QRadioButton" name="rb3DOpenGL"> + <property name="whatsThis"> + <string><html><head/><body><p>The OpenGL renderer may be faster than software and supports graphical enhancements, but is more prone to glitches.</p></body></html></string> + </property> + <property name="text"> + <string>OpenGL</string> + </property> + </widget> + </item> + <item row="1" column="0" colspan="2"> + <widget class="QRadioButton" name="rb3DSoftware"> + <property name="whatsThis"> + <string><html><head/><body><p>The software renderer is more accurate and less prone to rendering glitches, but requires more CPU power.</p></body></html></string> + </property> + <property name="text"> + <string>Software</string> + </property> + </widget> + </item> + <item row="0" column="0" colspan="2"> + <widget class="QLabel" name="label"> + <property name="text"> + <string>3D renderer:</string> + </property> + </widget> + </item> + </layout> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections> + <connection> + <sender>buttonBox</sender> + <signal>accepted()</signal> + <receiver>VideoSettingsDialog</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel"> + <x>248</x> + <y>254</y> + </hint> + <hint type="destinationlabel"> + <x>157</x> + <y>274</y> + </hint> + </hints> + </connection> + <connection> + <sender>buttonBox</sender> + <signal>rejected()</signal> + <receiver>VideoSettingsDialog</receiver> + <slot>reject()</slot> + <hints> + <hint type="sourcelabel"> + <x>316</x> + <y>260</y> + </hint> + <hint type="destinationlabel"> + <x>286</x> + <y>274</y> + </hint> + </hints> + </connection> + </connections> +</ui> diff --git a/src/frontend/qt_sdl/WifiSettingsDialog.cpp b/src/frontend/qt_sdl/WifiSettingsDialog.cpp new file mode 100644 index 0000000..457a78d --- /dev/null +++ b/src/frontend/qt_sdl/WifiSettingsDialog.cpp @@ -0,0 +1,140 @@ +/* + Copyright 2016-2020 Arisotura + + This file is part of melonDS. + + melonDS is free software: you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + melonDS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with melonDS. If not, see http://www.gnu.org/licenses/. +*/ + +#include <stdio.h> +#include <QFileDialog> + +#include "types.h" +#include "Platform.h" +#include "Config.h" +#include "PlatformConfig.h" + +#include "LAN_Socket.h" +#include "LAN_PCap.h" +#include "Wifi.h" + +#include "WifiSettingsDialog.h" +#include "ui_WifiSettingsDialog.h" + + +#ifdef __WIN32__ +#define PCAP_NAME "winpcap/npcap" +#else +#define PCAP_NAME "libpcap" +#endif + + +WifiSettingsDialog* WifiSettingsDialog::currentDlg = nullptr; + + +WifiSettingsDialog::WifiSettingsDialog(QWidget* parent) : QDialog(parent), ui(new Ui::WifiSettingsDialog) +{ + ui->setupUi(this); + setAttribute(Qt::WA_DeleteOnClose); + + LAN_Socket::Init(); + haspcap = LAN_PCap::Init(false); + + ui->cbDirectMode->setText("Direct mode (requires " PCAP_NAME " and ethernet connection)"); + + ui->cbBindAnyAddr->setChecked(Config::SocketBindAnyAddr != 0); + + int sel = 0; + for (int i = 0; i < LAN_PCap::NumAdapters; i++) + { + LAN_PCap::AdapterData* adapter = &LAN_PCap::Adapters[i]; + + ui->cbxDirectAdapter->addItem(QString(adapter->FriendlyName)); + + if (!strncmp(adapter->DeviceName, Config::LANDevice, 128)) + sel = i; + } + ui->cbxDirectAdapter->setCurrentIndex(sel); + + ui->cbDirectMode->setChecked(Config::DirectLAN != 0); + if (!haspcap) ui->cbDirectMode->setEnabled(false); + + updateAdapterControls(); +} + +WifiSettingsDialog::~WifiSettingsDialog() +{ + delete ui; +} + +void WifiSettingsDialog::on_WifiSettingsDialog_accepted() +{ + Config::SocketBindAnyAddr = ui->cbBindAnyAddr->isChecked() ? 1:0; + Config::DirectLAN = ui->cbDirectMode->isChecked() ? 1:0; + + int sel = ui->cbxDirectAdapter->currentIndex(); + if (sel < 0 || sel >= LAN_PCap::NumAdapters) sel = 0; + if (LAN_PCap::NumAdapters < 1) + { + Config::LANDevice[0] = '\0'; + } + else + { + strncpy(Config::LANDevice, LAN_PCap::Adapters[sel].DeviceName, 127); + Config::LANDevice[127] = '\0'; + } + + Config::Save(); + + closeDlg(); +} + +void WifiSettingsDialog::on_WifiSettingsDialog_rejected() +{ + closeDlg(); +} + +void WifiSettingsDialog::on_cbDirectMode_stateChanged(int state) +{ + updateAdapterControls(); +} + +void WifiSettingsDialog::on_cbxDirectAdapter_currentIndexChanged(int sel) +{ + if (!haspcap) return; + + if (sel < 0 || sel >= LAN_PCap::NumAdapters) return; + if (LAN_PCap::NumAdapters < 1) return; + + LAN_PCap::AdapterData* adapter = &LAN_PCap::Adapters[sel]; + char tmp[64]; + + sprintf(tmp, "MAC: %02X:%02X:%02X:%02X:%02X:%02X", + adapter->MAC[0], adapter->MAC[1], adapter->MAC[2], + adapter->MAC[3], adapter->MAC[4], adapter->MAC[5]); + ui->lblAdapterMAC->setText(QString(tmp)); + + sprintf(tmp, "IP: %d.%d.%d.%d", + adapter->IP_v4[0], adapter->IP_v4[1], + adapter->IP_v4[2], adapter->IP_v4[3]); + ui->lblAdapterIP->setText(QString(tmp)); +} + +void WifiSettingsDialog::updateAdapterControls() +{ + bool enable = haspcap && ui->cbDirectMode->isChecked(); + + ui->cbxDirectAdapter->setEnabled(enable); + ui->lblAdapterMAC->setEnabled(enable); + ui->lblAdapterIP->setEnabled(enable); +} diff --git a/src/frontend/qt_sdl/WifiSettingsDialog.h b/src/frontend/qt_sdl/WifiSettingsDialog.h new file mode 100644 index 0000000..f8aad1b --- /dev/null +++ b/src/frontend/qt_sdl/WifiSettingsDialog.h @@ -0,0 +1,68 @@ +/* + Copyright 2016-2020 Arisotura + + This file is part of melonDS. + + melonDS is free software: you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + melonDS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with melonDS. If not, see http://www.gnu.org/licenses/. +*/ + +#ifndef WIFISETTINGSDIALOG_H +#define WIFISETTINGSDIALOG_H + +#include <QDialog> + +namespace Ui { class WifiSettingsDialog; } +class WifiSettingsDialog; + +class WifiSettingsDialog : public QDialog +{ + Q_OBJECT + +public: + explicit WifiSettingsDialog(QWidget* parent); + ~WifiSettingsDialog(); + + static WifiSettingsDialog* currentDlg; + static WifiSettingsDialog* openDlg(QWidget* parent) + { + if (currentDlg) + { + currentDlg->activateWindow(); + return currentDlg; + } + + currentDlg = new WifiSettingsDialog(parent); + currentDlg->show(); + return currentDlg; + } + static void closeDlg() + { + currentDlg = nullptr; + } + +private slots: + void on_WifiSettingsDialog_accepted(); + void on_WifiSettingsDialog_rejected(); + + void on_cbDirectMode_stateChanged(int state); + void on_cbxDirectAdapter_currentIndexChanged(int sel); + +private: + Ui::WifiSettingsDialog* ui; + + bool haspcap; + + void updateAdapterControls(); +}; + +#endif // WIFISETTINGSDIALOG_H diff --git a/src/frontend/qt_sdl/WifiSettingsDialog.ui b/src/frontend/qt_sdl/WifiSettingsDialog.ui new file mode 100644 index 0000000..bfee1fd --- /dev/null +++ b/src/frontend/qt_sdl/WifiSettingsDialog.ui @@ -0,0 +1,165 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>WifiSettingsDialog</class> + <widget class="QDialog" name="WifiSettingsDialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>479</width> + <height>217</height> + </rect> + </property> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="windowTitle"> + <string>Wifi settings - melonDS</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <property name="sizeConstraint"> + <enum>QLayout::SetFixedSize</enum> + </property> + <item> + <widget class="QGroupBox" name="groupBox"> + <property name="title"> + <string>Local</string> + </property> + <layout class="QGridLayout" name="gridLayout"> + <item row="0" column="0"> + <widget class="QCheckBox" name="cbBindAnyAddr"> + <property name="whatsThis"> + <string><html><head/><body><p>Enabling this allows (theoretically) playing local multiplayer games over a local network. It may or may not help make for a better connection in general.</p></body></html></string> + </property> + <property name="text"> + <string>Bind socket to any address</string> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QGroupBox" name="groupBox_2"> + <property name="title"> + <string>Online</string> + </property> + <layout class="QGridLayout" name="gridLayout_2"> + <item row="2" column="0"> + <widget class="QLabel" name="label_2"> + <property name="text"> + <string>MAC address:</string> + </property> + </widget> + </item> + <item row="0" column="0" colspan="2"> + <widget class="QCheckBox" name="cbDirectMode"> + <property name="whatsThis"> + <string><html><head/><body><p>Direct mode directly routes network traffic to the host network. It is the most reliable, but requires an ethernet connection.</p><p><br/></p><p>Non-direct mode uses a layer of emulation to get around this, but is more prone to problems.</p></body></html></string> + </property> + <property name="text"> + <string>Direct mode [TEXT PLACEHOLDER]</string> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QComboBox" name="cbxDirectAdapter"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>350</width> + <height>0</height> + </size> + </property> + <property name="whatsThis"> + <string><html><head/><body><p>Selects the network adapter through which to route network traffic under direct mode.</p></body></html></string> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="label"> + <property name="text"> + <string>Network adapter:</string> + </property> + </widget> + </item> + <item row="3" column="0"> + <widget class="QLabel" name="label_3"> + <property name="text"> + <string>IP address:</string> + </property> + </widget> + </item> + <item row="2" column="1"> + <widget class="QLabel" name="lblAdapterMAC"> + <property name="text"> + <string>[PLACEHOLDER]</string> + </property> + </widget> + </item> + <item row="3" column="1"> + <widget class="QLabel" name="lblAdapterIP"> + <property name="text"> + <string>[PLACEHOLDER]</string> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> + </property> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections> + <connection> + <sender>buttonBox</sender> + <signal>accepted()</signal> + <receiver>WifiSettingsDialog</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel"> + <x>248</x> + <y>254</y> + </hint> + <hint type="destinationlabel"> + <x>157</x> + <y>274</y> + </hint> + </hints> + </connection> + <connection> + <sender>buttonBox</sender> + <signal>rejected()</signal> + <receiver>WifiSettingsDialog</receiver> + <slot>reject()</slot> + <hints> + <hint type="sourcelabel"> + <x>316</x> + <y>260</y> + </hint> + <hint type="destinationlabel"> + <x>286</x> + <y>274</y> + </hint> + </hints> + </connection> + </connections> +</ui> diff --git a/src/frontend/qt_sdl/font.h b/src/frontend/qt_sdl/font.h new file mode 100644 index 0000000..f2e4f87 --- /dev/null +++ b/src/frontend/qt_sdl/font.h @@ -0,0 +1,135 @@ +/* + Copyright 2016-2020 Arisotura + + This file is part of melonDS. + + melonDS is free software: you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + melonDS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with melonDS. If not, see http://www.gnu.org/licenses/. +*/ + +#ifndef FONT_H +#define FONT_H +unsigned short font[] = { + 12, 0, 0, 0,0x0C03, 0x0E07, 0x070E, 0x039C, 0x01F8, 0x00F0, 0x00F0, 0x01F8, 0x039C, 0x070E, 0x0E07, 0x0C03, + 12, 0, 0, 0,0x01C0, 0x00E0, 0x0060, 0x0860, 0x0C60, 0x0FE0, 0x07F0, 0x0038, 0x001C, 0x000E, 0x0007, 0x0003, + 12, 0, 0, 0,0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 12, 0, 0, 0,0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 12, 0, 0, 0,0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 12, 0, 0, 0,0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 12, 0, 0, 0,0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 12, 0, 0, 0,0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 12, 0, 0, 0,0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 12, 0, 0, 0,0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 12, 0, 0, 0,0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 12, 0, 0, 0,0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 12, 0, 0, 0,0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 12, 0, 0, 0,0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 12, 0, 0, 0,0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 12, 0, 0, 0,0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0,0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0000, 0x0000, 0x0003, 0x0003, 0x0000, 0x0000, + 9, 0, 0, 0,0x01EF, 0x01EF, 0x018C, 0x01CE, 0x00E7, 0x0063, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 10, 0, 0, 0,0x00CC, 0x00CC, 0x03FF, 0x03FF, 0x00CC, 0x00CC, 0x03FF, 0x03FF, 0x00CC, 0x00CC, 0x0000, 0x0000, + 8, 0, 0, 0,0x0018, 0x00FE, 0x00FF, 0x001B, 0x007F, 0x00FE, 0x00D8, 0x00FF, 0x007F, 0x0018, 0x0000, 0x0000, + 10, 0, 0, 0,0x0306, 0x038F, 0x01CF, 0x00E6, 0x0070, 0x0038, 0x019C, 0x03CE, 0x03C7, 0x0183, 0x0000, 0x0000, + 10, 0, 0, 0,0x007C, 0x00FE, 0x00C6, 0x00EE, 0x007C, 0x037E, 0x03E7, 0x01F3, 0x03BF, 0x031E, 0x0000, 0x0000, + 4, 0, 0, 0,0x000F, 0x000F, 0x000C, 0x000E, 0x0007, 0x0003, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 4, 0, 0, 0,0x000C, 0x000E, 0x0007, 0x0003, 0x0003, 0x0003, 0x0003, 0x0007, 0x000E, 0x000C, 0x0000, 0x0000, + 4, 0, 0, 0,0x0003, 0x0007, 0x000E, 0x000C, 0x000C, 0x000C, 0x000C, 0x000E, 0x0007, 0x0003, 0x0000, 0x0000, + 10, 0, 0, 0,0x0030, 0x0333, 0x03B7, 0x01FE, 0x00FC, 0x00FC, 0x01FE, 0x03B7, 0x0333, 0x0030, 0x0000, 0x0000, + 10, 0, 0, 0,0x0030, 0x0030, 0x0030, 0x0030, 0x03FF, 0x03FF, 0x0030, 0x0030, 0x0030, 0x0030, 0x0000, 0x0000, + 4, 0, 0, 0,0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000F, 0x000F, 0x000C, 0x000E, 0x0007, 0x0003, + 10, 0, 0, 0,0x0000, 0x0000, 0x0000, 0x0000, 0x03FF, 0x03FF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 3, 0, 0, 0,0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0007, 0x0007, 0x0007, 0x0000, 0x0000, + 10, 0, 0, 0,0x0300, 0x0380, 0x01C0, 0x00E0, 0x0070, 0x0038, 0x001C, 0x000E, 0x0007, 0x0003, 0x0000, 0x0000, + 8, 0, 0, 0,0x007E, 0x00FF, 0x00C3, 0x00C3, 0x00C3, 0x00C3, 0x00C3, 0x00C3, 0x00FF, 0x007E, 0x0000, 0x0000, + 4, 0, 0, 0,0x0006, 0x0007, 0x0007, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x000F, 0x000F, 0x0000, 0x0000, + 8, 0, 0, 0,0x007E, 0x00FF, 0x00C3, 0x00C0, 0x00FE, 0x007F, 0x0003, 0x0003, 0x00FF, 0x00FF, 0x0000, 0x0000, + 8, 0, 0, 0,0x007F, 0x00FF, 0x00C0, 0x00C0, 0x007C, 0x00FC, 0x00C0, 0x00C0, 0x00FF, 0x007F, 0x0000, 0x0000, + 8, 0, 0, 0,0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x00FF, 0x00FE, 0x0060, 0x0060, 0x0000, 0x0000, + 8, 0, 0, 0,0x00FF, 0x00FF, 0x0003, 0x0003, 0x007F, 0x00FF, 0x00C0, 0x00C0, 0x00FF, 0x007F, 0x0000, 0x0000, + 8, 0, 0, 0,0x007E, 0x007F, 0x0003, 0x0003, 0x007F, 0x00FF, 0x00C3, 0x00C3, 0x00FF, 0x007E, 0x0000, 0x0000, + 8, 0, 0, 0,0x00FF, 0x00FF, 0x00C0, 0x00E0, 0x0070, 0x0038, 0x001C, 0x000C, 0x000C, 0x000C, 0x0000, 0x0000, + 8, 0, 0, 0,0x007E, 0x00FF, 0x00C3, 0x00C3, 0x007E, 0x00FF, 0x00C3, 0x00C3, 0x00FF, 0x007E, 0x0000, 0x0000, + 8, 0, 0, 0,0x007E, 0x00FF, 0x00C3, 0x00C3, 0x00FF, 0x00FE, 0x00C0, 0x00C0, 0x00FE, 0x007E, 0x0000, 0x0000, + 3, 0, 0, 0,0x0000, 0x0000, 0x0007, 0x0007, 0x0000, 0x0000, 0x0000, 0x0007, 0x0007, 0x0000, 0x0000, 0x0000, + 4, 0, 0, 0,0x0000, 0x0000, 0x000E, 0x000E, 0x0000, 0x0000, 0x000C, 0x000E, 0x0007, 0x0003, 0x0000, 0x0000, + 6, 0, 0, 0,0x0030, 0x0038, 0x001C, 0x000E, 0x0007, 0x0007, 0x000E, 0x001C, 0x0038, 0x0030, 0x0000, 0x0000, + 7, 0, 0, 0,0x0000, 0x0000, 0x0000, 0x007F, 0x007F, 0x0000, 0x0000, 0x007F, 0x007F, 0x0000, 0x0000, 0x0000, + 6, 0, 0, 0,0x0003, 0x0007, 0x000E, 0x001C, 0x0038, 0x0038, 0x001C, 0x000E, 0x0007, 0x0003, 0x0000, 0x0000, + 8, 0, 0, 0,0x007E, 0x00FF, 0x00C3, 0x00C3, 0x00F0, 0x0078, 0x0018, 0x0000, 0x0018, 0x0018, 0x0000, 0x0000, + 10, 0, 0, 0,0x00FC, 0x01FE, 0x0387, 0x0333, 0x037B, 0x03FB, 0x01F3, 0x0007, 0x03FE, 0x03FC, 0x0000, 0x0000, + 9, 0, 0, 0,0x00FE, 0x01FF, 0x0183, 0x0183, 0x0183, 0x01FF, 0x01FF, 0x0183, 0x0183, 0x0183, 0x0000, 0x0000, + 9, 0, 0, 0,0x00FF, 0x01FF, 0x0183, 0x0183, 0x00FF, 0x01FF, 0x0183, 0x0183, 0x01FF, 0x00FF, 0x0000, 0x0000, + 8, 0, 0, 0,0x00FE, 0x00FF, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x00FF, 0x00FE, 0x0000, 0x0000, + 9, 0, 0, 0,0x007F, 0x00FF, 0x01C3, 0x0183, 0x0183, 0x0183, 0x0183, 0x01C3, 0x00FF, 0x007F, 0x0000, 0x0000, + 9, 0, 0, 0,0x01FF, 0x01FF, 0x0003, 0x0003, 0x00FF, 0x00FF, 0x0003, 0x0003, 0x01FF, 0x01FF, 0x0000, 0x0000, + 9, 0, 0, 0,0x01FF, 0x01FF, 0x0003, 0x0003, 0x00FF, 0x00FF, 0x0003, 0x0003, 0x0003, 0x0003, 0x0000, 0x0000, + 9, 0, 0, 0,0x01FE, 0x01FF, 0x0003, 0x0003, 0x01F3, 0x01F3, 0x0183, 0x0183, 0x01FF, 0x00FE, 0x0000, 0x0000, + 9, 0, 0, 0,0x0183, 0x0183, 0x0183, 0x0183, 0x01FF, 0x01FF, 0x0183, 0x0183, 0x0183, 0x0183, 0x0000, 0x0000, + 6, 0, 0, 0,0x003F, 0x003F, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x003F, 0x003F, 0x0000, 0x0000, + 9, 0, 0, 0,0x01F0, 0x01F0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C3, 0x00C3, 0x00FF, 0x007E, 0x0000, 0x0000, + 9, 0, 0, 0,0x0183, 0x01C3, 0x00E3, 0x0073, 0x003F, 0x003F, 0x0073, 0x00E3, 0x01C3, 0x0183, 0x0000, 0x0000, + 7, 0, 0, 0,0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x007F, 0x007F, 0x0000, 0x0000, + 10, 0, 0, 0,0x0303, 0x0387, 0x03CF, 0x03FF, 0x037B, 0x0333, 0x0303, 0x0303, 0x0303, 0x0303, 0x0000, 0x0000, + 10, 0, 0, 0,0x0303, 0x0307, 0x030F, 0x031F, 0x033B, 0x0373, 0x03E3, 0x03C3, 0x0383, 0x0303, 0x0000, 0x0000, + 10, 0, 0, 0,0x01FE, 0x03FF, 0x0303, 0x0303, 0x0303, 0x0303, 0x0303, 0x0303, 0x03FF, 0x01FE, 0x0000, 0x0000, + 9, 0, 0, 0,0x00FF, 0x01FF, 0x0183, 0x0183, 0x01FF, 0x00FF, 0x0003, 0x0003, 0x0003, 0x0003, 0x0000, 0x0000, + 10, 0, 0, 0,0x01FE, 0x03FF, 0x0303, 0x0303, 0x0333, 0x0373, 0x03E3, 0x01C3, 0x03FF, 0x037E, 0x0000, 0x0000, + 9, 0, 0, 0,0x00FF, 0x01FF, 0x0183, 0x0183, 0x01FF, 0x00FF, 0x0073, 0x00E3, 0x01C3, 0x0183, 0x0000, 0x0000, + 10, 0, 0, 0,0x01FE, 0x01FF, 0x0003, 0x0003, 0x01FF, 0x03FE, 0x0300, 0x0300, 0x03FE, 0x01FE, 0x0000, 0x0000, + 10, 0, 0, 0,0x03FF, 0x03FF, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0000, 0x0000, + 9, 0, 0, 0,0x0183, 0x0183, 0x0183, 0x0183, 0x0183, 0x0183, 0x0183, 0x0183, 0x01FF, 0x00FE, 0x0000, 0x0000, + 10, 0, 0, 0,0x0303, 0x0303, 0x0303, 0x0303, 0x0303, 0x0387, 0x01CE, 0x00FC, 0x0078, 0x0030, 0x0000, 0x0000, + 10, 0, 0, 0,0x0303, 0x0303, 0x0303, 0x0303, 0x0333, 0x037B, 0x03FF, 0x03CF, 0x0387, 0x0303, 0x0000, 0x0000, + 10, 0, 0, 0,0x0303, 0x0387, 0x01CE, 0x00FC, 0x0078, 0x0078, 0x00FC, 0x01CE, 0x0387, 0x0303, 0x0000, 0x0000, + 10, 0, 0, 0,0x0303, 0x0387, 0x01CE, 0x00FC, 0x0078, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0000, 0x0000, + 10, 0, 0, 0,0x03FF, 0x03FF, 0x01C0, 0x00E0, 0x0070, 0x0038, 0x001C, 0x000E, 0x03FF, 0x03FF, 0x0000, 0x0000, + 4, 0, 0, 0,0x000F, 0x000F, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x000F, 0x000F, 0x0000, 0x0000, + 10, 0, 0, 0,0x0003, 0x0007, 0x000E, 0x001C, 0x0038, 0x0070, 0x00E0, 0x01C0, 0x0380, 0x0300, 0x0000, 0x0000, + 4, 0, 0, 0,0x000F, 0x000F, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000F, 0x000F, 0x0000, 0x0000, + 8, 0, 0, 0,0x0018, 0x003C, 0x007E, 0x00E7, 0x00C3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 10, 0, 0, 0,0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03FF, 0x03FF, + 4, 0, 0, 0,0x000F, 0x000F, 0x0003, 0x0007, 0x000E, 0x000C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 7, 0, 0, 0,0x0000, 0x0000, 0x003E, 0x007E, 0x0060, 0x007E, 0x007F, 0x0063, 0x007F, 0x007E, 0x0000, 0x0000, + 7, 0, 0, 0,0x0003, 0x0003, 0x0003, 0x003F, 0x007F, 0x0063, 0x0063, 0x0063, 0x007F, 0x003F, 0x0000, 0x0000, + 7, 0, 0, 0,0x0000, 0x0000, 0x007E, 0x007F, 0x0003, 0x0003, 0x0003, 0x0003, 0x007F, 0x007E, 0x0000, 0x0000, + 7, 0, 0, 0,0x0060, 0x0060, 0x0060, 0x007E, 0x007F, 0x0063, 0x0063, 0x0063, 0x007F, 0x007E, 0x0000, 0x0000, + 7, 0, 0, 0,0x0000, 0x0000, 0x003E, 0x007F, 0x0063, 0x007F, 0x003F, 0x0003, 0x003F, 0x003E, 0x0000, 0x0000, + 6, 0, 0, 0,0x003C, 0x003E, 0x0006, 0x0006, 0x001F, 0x001F, 0x0006, 0x0006, 0x0006, 0x0006, 0x0000, 0x0000, + 7, 0, 0, 0,0x0000, 0x0000, 0x007E, 0x007F, 0x0063, 0x0063, 0x007F, 0x007E, 0x0060, 0x0060, 0x007E, 0x003E, + 7, 0, 0, 0,0x0003, 0x0003, 0x0003, 0x003F, 0x007F, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0000, 0x0000, + 2, 0, 0, 0,0x0003, 0x0003, 0x0000, 0x0000, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0000, 0x0000, + 7, 0, 0, 0,0x0060, 0x0060, 0x0000, 0x0000, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0063, 0x007F, 0x003E, + 8, 0, 0, 0,0x0003, 0x0003, 0x00E3, 0x0073, 0x003B, 0x001F, 0x001F, 0x003B, 0x0073, 0x00E3, 0x0000, 0x0000, + 4, 0, 0, 0,0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x000F, 0x000E, 0x0000, 0x0000, + 10, 0, 0, 0,0x0000, 0x0000, 0x01FF, 0x03FF, 0x0333, 0x0333, 0x0333, 0x0333, 0x0333, 0x0333, 0x0000, 0x0000, + 7, 0, 0, 0,0x0000, 0x0000, 0x003F, 0x007F, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0000, 0x0000, + 8, 0, 0, 0,0x0000, 0x0000, 0x007E, 0x00FF, 0x00C3, 0x00C3, 0x00C3, 0x00C3, 0x00FF, 0x007E, 0x0000, 0x0000, + 7, 0, 0, 0,0x0000, 0x0000, 0x003F, 0x007F, 0x0063, 0x0063, 0x007F, 0x003F, 0x0003, 0x0003, 0x0003, 0x0003, + 7, 0, 0, 0,0x0000, 0x0000, 0x007E, 0x007F, 0x0063, 0x0063, 0x007F, 0x007E, 0x0060, 0x0060, 0x0060, 0x0060, + 7, 0, 0, 0,0x0000, 0x0000, 0x003B, 0x007F, 0x0067, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0000, 0x0000, + 8, 0, 0, 0,0x0000, 0x0000, 0x007E, 0x007F, 0x0003, 0x007F, 0x00FE, 0x00C0, 0x00FE, 0x007E, 0x0000, 0x0000, + 6, 0, 0, 0,0x0006, 0x0006, 0x003F, 0x003F, 0x0006, 0x0006, 0x0006, 0x0006, 0x003E, 0x003C, 0x0000, 0x0000, + 7, 0, 0, 0,0x0000, 0x0000, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x007F, 0x007E, 0x0000, 0x0000, + 10, 0, 0, 0,0x0000, 0x0000, 0x0303, 0x0303, 0x0303, 0x0387, 0x01CE, 0x00FC, 0x0078, 0x0030, 0x0000, 0x0000, + 10, 0, 0, 0,0x0000, 0x0000, 0x0303, 0x0303, 0x0333, 0x037B, 0x03FF, 0x03CF, 0x0387, 0x0303, 0x0000, 0x0000, + 8, 0, 0, 0,0x0000, 0x0000, 0x00C3, 0x00E7, 0x007E, 0x003C, 0x003C, 0x007E, 0x00E7, 0x00C3, 0x0000, 0x0000, + 10, 0, 0, 0,0x0000, 0x0000, 0x0303, 0x0307, 0x038E, 0x01DC, 0x00F8, 0x0070, 0x0038, 0x001C, 0x000E, 0x0006, + 8, 0, 0, 0,0x0000, 0x0000, 0x00FF, 0x00FF, 0x0070, 0x0038, 0x001C, 0x000E, 0x00FF, 0x00FF, 0x0000, 0x0000, + 6, 0, 0, 0,0x0038, 0x003C, 0x000C, 0x000C, 0x000F, 0x000F, 0x000C, 0x000C, 0x003C, 0x0038, 0x0000, 0x0000, + 2, 0, 0, 0,0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0000, 0x0000, + 6, 0, 0, 0,0x0007, 0x000F, 0x000C, 0x000C, 0x003C, 0x003C, 0x000C, 0x000C, 0x000F, 0x0007, 0x0000, 0x0000, + 10, 0, 0, 0,0x0000, 0x0000, 0x0000, 0x031C, 0x03BE, 0x01F7, 0x00E3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 11, 0, 0, 0,0x0555, 0x0000, 0x0401, 0x0000, 0x0401, 0x0000, 0x0401, 0x0000, 0x0401, 0x0000, 0x0555, 0x0000, +}; +#endif diff --git a/src/frontend/qt_sdl/main.cpp b/src/frontend/qt_sdl/main.cpp index 81fa16f..fa542ad 100644 --- a/src/frontend/qt_sdl/main.cpp +++ b/src/frontend/qt_sdl/main.cpp @@ -27,18 +27,28 @@ #include <QFileDialog> #include <QPaintEvent> #include <QPainter> -#include <QStandardPaths> +#include <QKeyEvent> +#include <QMimeData> #include <SDL2/SDL.h> #include "main.h" +#include "Input.h" +#include "EmuSettingsDialog.h" +#include "InputConfigDialog.h" +#include "VideoSettingsDialog.h" +#include "AudioSettingsDialog.h" +#include "WifiSettingsDialog.h" #include "types.h" #include "version.h" #include "FrontendUtil.h" +#include "OSD.h" #include "NDS.h" +#include "GBACart.h" +#include "OpenGLSupport.h" #include "GPU.h" #include "SPU.h" #include "Wifi.h" @@ -48,21 +58,34 @@ #include "Savestate.h" +#include "main_shaders.h" -// TODO: uniform variable spelling -char* EmuDirectory; +// TODO: uniform variable spelling bool RunningSomething; MainWindow* mainWindow; EmuThread* emuThread; +int autoScreenSizing = 0; + +int videoRenderer; +GPU::RenderSettings videoSettings; +bool videoSettingsDirty; + SDL_AudioDeviceID audioDevice; int audioFreq; SDL_cond* audioSync; SDL_mutex* audioSyncLock; +SDL_AudioDeviceID micDevice; +s16 micExtBuffer[2048]; +u32 micExtBufferWritePos; + +u32 micWavLength; +s16* micWavBuffer; + void audioCallback(void* data, Uint8* stream, int len) { @@ -97,7 +120,134 @@ void audioCallback(void* data, Uint8* stream, int len) num_in = len_in-margin; } - Frontend::AudioOut_Resample(buf_in, num_in, (s16*)stream, len); + Frontend::AudioOut_Resample(buf_in, num_in, (s16*)stream, len, Config::AudioVolume); +} + + +void micLoadWav(const char* name) +{ + SDL_AudioSpec format; + memset(&format, 0, sizeof(SDL_AudioSpec)); + + if (micWavBuffer) delete[] micWavBuffer; + micWavBuffer = nullptr; + micWavLength = 0; + + u8* buf; + u32 len; + if (!SDL_LoadWAV(name, &format, &buf, &len)) + return; + + const u64 dstfreq = 44100; + + if (format.format == AUDIO_S16 || format.format == AUDIO_U16) + { + int srcinc = format.channels; + len /= (2 * srcinc); + + micWavLength = (len * dstfreq) / format.freq; + if (micWavLength < 735) micWavLength = 735; + micWavBuffer = new s16[micWavLength]; + + float res_incr = len / (float)micWavLength; + float res_timer = 0; + int res_pos = 0; + + for (int i = 0; i < micWavLength; i++) + { + u16 val = ((u16*)buf)[res_pos]; + if (SDL_AUDIO_ISUNSIGNED(format.format)) val ^= 0x8000; + + micWavBuffer[i] = val; + + res_timer += res_incr; + while (res_timer >= 1.0) + { + res_timer -= 1.0; + res_pos += srcinc; + } + } + } + else if (format.format == AUDIO_S8 || format.format == AUDIO_U8) + { + int srcinc = format.channels; + len /= srcinc; + + micWavLength = (len * dstfreq) / format.freq; + if (micWavLength < 735) micWavLength = 735; + micWavBuffer = new s16[micWavLength]; + + float res_incr = len / (float)micWavLength; + float res_timer = 0; + int res_pos = 0; + + for (int i = 0; i < micWavLength; i++) + { + u16 val = buf[res_pos] << 8; + if (SDL_AUDIO_ISUNSIGNED(format.format)) val ^= 0x8000; + + micWavBuffer[i] = val; + + res_timer += res_incr; + while (res_timer >= 1.0) + { + res_timer -= 1.0; + res_pos += srcinc; + } + } + } + else + printf("bad WAV format %08X\n", format.format); + + SDL_FreeWAV(buf); +} + +void micCallback(void* data, Uint8* stream, int len) +{ + s16* input = (s16*)stream; + len /= sizeof(s16); + + int maxlen = sizeof(micExtBuffer) / sizeof(s16); + + if ((micExtBufferWritePos + len) > maxlen) + { + u32 len1 = maxlen - micExtBufferWritePos; + memcpy(&micExtBuffer[micExtBufferWritePos], &input[0], len1*sizeof(s16)); + memcpy(&micExtBuffer[0], &input[len1], (len - len1)*sizeof(s16)); + micExtBufferWritePos = len - len1; + } + else + { + memcpy(&micExtBuffer[micExtBufferWritePos], input, len*sizeof(s16)); + micExtBufferWritePos += len; + } +} + +void micProcess() +{ + int type = Config::MicInputType; + bool cmd = Input::HotkeyDown(HK_Mic); + + if (type != 1 && !cmd) + { + type = 0; + } + + switch (type) + { + case 0: // no mic + Frontend::Mic_FeedSilence(); + break; + + case 1: // host mic + case 3: // WAV + Frontend::Mic_FeedExternalBuffer(); + break; + + case 2: // white noise + Frontend::Mic_FeedNoise(); + break; + } } @@ -107,41 +257,94 @@ EmuThread::EmuThread(QObject* parent) : QThread(parent) EmuRunning = 2; RunningSomething = false; + connect(this, SIGNAL(windowUpdate()), mainWindow->panel, SLOT(update())); connect(this, SIGNAL(windowTitleChange(QString)), mainWindow, SLOT(onTitleUpdate(QString))); connect(this, SIGNAL(windowEmuStart()), mainWindow, SLOT(onEmuStart())); connect(this, SIGNAL(windowEmuStop()), mainWindow, SLOT(onEmuStop())); + connect(this, SIGNAL(windowEmuPause()), mainWindow->actPause, SLOT(trigger())); + connect(this, SIGNAL(windowEmuReset()), mainWindow->actReset, SLOT(trigger())); + connect(this, SIGNAL(screenLayoutChange()), mainWindow->panel, SLOT(onScreenLayoutChanged())); - emit windowEmuStop(); + if (mainWindow->hasOGL) initOpenGL(); } -void EmuThread::run() +void EmuThread::initOpenGL() { - NDS::Init(); + QOpenGLContext* windowctx = mainWindow->getOGLContext(); + QSurfaceFormat format = windowctx->format(); - /*MainScreenPos[0] = 0; - MainScreenPos[1] = 0; - MainScreenPos[2] = 0; - AutoScreenSizing = 0;*/ + format.setSwapInterval(0); - /*if (Screen_UseGL) + oglSurface = new QOffscreenSurface(); + oglSurface->setFormat(format); + oglSurface->create(); + if (!oglSurface->isValid()) { - uiGLMakeContextCurrent(GLContext); - GPU3D::InitRenderer(true); - uiGLMakeContextCurrent(NULL); + // TODO handle this! + printf("oglSurface shat itself :(\n"); + delete oglSurface; + return; + } + + oglContext = new QOpenGLContext(); + oglContext->setFormat(oglSurface->format()); + oglContext->setShareContext(windowctx); + if (!oglContext->create()) + { + // TODO handle this! + printf("oglContext shat itself :(\n"); + delete oglContext; + delete oglSurface; + return; } - else*/ + + oglContext->moveToThread(this); +} + +void EmuThread::deinitOpenGL() +{ + delete oglContext; + delete oglSurface; +} + +void* oglGetProcAddress(const char* proc) +{ + return emuThread->oglGetProcAddress(proc); +} + +void* EmuThread::oglGetProcAddress(const char* proc) +{ + return (void*)oglContext->getProcAddress(proc); +} + +void EmuThread::run() +{ + bool hasOGL = mainWindow->hasOGL; + u32 mainScreenPos[3]; + + NDS::Init(); + + mainScreenPos[0] = 0; + mainScreenPos[1] = 0; + mainScreenPos[2] = 0; + autoScreenSizing = 0; + + videoSettingsDirty = false; + videoSettings.Soft_Threaded = Config::Threaded3D != 0; + videoSettings.GL_ScaleFactor = Config::GL_ScaleFactor; + + if (hasOGL) { - GPU3D::InitRenderer(false); + oglContext->makeCurrent(oglSurface); + videoRenderer = OpenGL::Init() ? Config::_3DRenderer : 0; } + else + videoRenderer = 0; + + GPU::InitRenderer(videoRenderer); + GPU::SetRenderSettings(videoRenderer, videoSettings); - /*Touching = false; - KeyInputMask = 0xFFF; - JoyInputMask = 0xFFF; - KeyHotkeyMask = 0; - JoyHotkeyMask = 0; - HotkeyMask = 0; - LastHotkeyMask = 0; - LidStatus = false;*/ + Input::Init(); u32 nframes = 0; u32 starttick = SDL_GetTicks(); @@ -153,69 +356,81 @@ void EmuThread::run() while (EmuRunning != 0) { - /*ProcessInput(); + Input::Process(); - if (HotkeyPressed(HK_FastForwardToggle)) - { - Config::LimitFPS = !Config::LimitFPS; - uiQueueMain(UpdateFPSLimit, NULL); - } - // TODO: similar hotkeys for video/audio sync? + if (Input::HotkeyPressed(HK_FastForwardToggle)) emit windowLimitFPSChange(); - if (HotkeyPressed(HK_Pause)) uiQueueMain(TogglePause, NULL); - if (HotkeyPressed(HK_Reset)) uiQueueMain(Reset, NULL); + if (Input::HotkeyPressed(HK_Pause)) emit windowEmuPause(); + if (Input::HotkeyPressed(HK_Reset)) emit windowEmuReset(); if (GBACart::CartInserted && GBACart::HasSolarSensor) { - if (HotkeyPressed(HK_SolarSensorDecrease)) + if (Input::HotkeyPressed(HK_SolarSensorDecrease)) { if (GBACart_SolarSensor::LightLevel > 0) GBACart_SolarSensor::LightLevel--; char msg[64]; sprintf(msg, "Solar sensor level set to %d", GBACart_SolarSensor::LightLevel); OSD::AddMessage(0, msg); } - if (HotkeyPressed(HK_SolarSensorIncrease)) + if (Input::HotkeyPressed(HK_SolarSensorIncrease)) { if (GBACart_SolarSensor::LightLevel < 10) GBACart_SolarSensor::LightLevel++; char msg[64]; sprintf(msg, "Solar sensor level set to %d", GBACart_SolarSensor::LightLevel); OSD::AddMessage(0, msg); } - }*/ + } if (EmuRunning == 1) { EmuStatus = 1; + // update render settings if needed + if (videoSettingsDirty) + { + if (hasOGL != mainWindow->hasOGL) + { + hasOGL = mainWindow->hasOGL; + if (hasOGL) + { + oglContext->makeCurrent(oglSurface); + videoRenderer = OpenGL::Init() ? Config::_3DRenderer : 0; + } + else + videoRenderer = 0; + } + else + videoRenderer = hasOGL ? Config::_3DRenderer : 0; + + videoSettingsDirty = false; + videoSettings.Soft_Threaded = Config::Threaded3D != 0; + videoSettings.GL_ScaleFactor = Config::GL_ScaleFactor; + GPU::SetRenderSettings(videoRenderer, videoSettings); + } + // process input and hotkeys - NDS::SetKeyMask(0xFFF); - /*NDS::SetKeyMask(KeyInputMask & JoyInputMask); + NDS::SetKeyMask(Input::InputMask); - if (HotkeyPressed(HK_Lid)) + if (Input::HotkeyPressed(HK_Lid)) { - LidStatus = !LidStatus; - NDS::SetLidClosed(LidStatus); - OSD::AddMessage(0, LidStatus ? "Lid closed" : "Lid opened"); - }*/ + bool lid = !NDS::IsLidClosed(); + NDS::SetLidClosed(lid); + OSD::AddMessage(0, lid ? "Lid closed" : "Lid opened"); + } // microphone input - /*FeedMicInput(); - - if (Screen_UseGL) - { - uiGLBegin(GLContext); - uiGLMakeContextCurrent(GLContext); - }*/ + micProcess(); // auto screen layout - /*{ - MainScreenPos[2] = MainScreenPos[1]; - MainScreenPos[1] = MainScreenPos[0]; - MainScreenPos[0] = NDS::PowerControl9 >> 15; + if (Config::ScreenSizing == 3) + { + mainScreenPos[2] = mainScreenPos[1]; + mainScreenPos[1] = mainScreenPos[0]; + mainScreenPos[0] = NDS::PowerControl9 >> 15; int guess; - if (MainScreenPos[0] == MainScreenPos[2] && - MainScreenPos[0] != MainScreenPos[1]) + if (mainScreenPos[0] == mainScreenPos[2] && + mainScreenPos[0] != mainScreenPos[1]) { // constant flickering, likely displaying 3D on both screens // TODO: when both screens are used for 2D only...??? @@ -223,18 +438,18 @@ void EmuThread::run() } else { - if (MainScreenPos[0] == 1) + if (mainScreenPos[0] == 1) guess = 1; else guess = 2; } - if (guess != AutoScreenSizing) + if (guess != autoScreenSizing) { - AutoScreenSizing = guess; - SetupScreenRects(WindowWidth, WindowHeight); + autoScreenSizing = guess; + emit screenLayoutChange(); } - }*/ + } // emulate u32 nlines = NDS::RunFrame(); @@ -245,16 +460,9 @@ void EmuThread::run() if (EmuRunning == 0) break; - /*if (Screen_UseGL) - { - GLScreen_DrawScreen(); - uiGLEnd(GLContext); - } - uiAreaQueueRedrawAll(MainDrawArea);*/ - mainWindow->update(); + emit windowUpdate(); - bool fastforward = false; - //bool fastforward = HotkeyDown(HK_FastForward); + bool fastforward = Input::HotkeyDown(HK_FastForward); if (Config::AudioSync && (!fastforward) && audioDevice) { @@ -324,46 +532,28 @@ void EmuThread::run() lastmeasuretick = lasttick; fpslimitcount = 0; - if (EmuRunning == 2) - { - /*if (Screen_UseGL) - { - uiGLBegin(GLContext); - uiGLMakeContextCurrent(GLContext); - GLScreen_DrawScreen(); - uiGLEnd(GLContext); - } - uiAreaQueueRedrawAll(MainDrawArea);*/ - mainWindow->update(); - } - - //if (Screen_UseGL) uiGLMakeContextCurrent(NULL); + emit windowUpdate(); EmuStatus = EmuRunning; sprintf(melontitle, "melonDS " MELONDS_VERSION); changeWindowTitle(melontitle); - SDL_Delay(100); + SDL_Delay(75); } } EmuStatus = 0; - //if (Screen_UseGL) uiGLMakeContextCurrent(GLContext); - + GPU::DeInitRenderer(); NDS::DeInit(); //Platform::LAN_DeInit(); - /*if (Screen_UseGL) + if (hasOGL) { - OSD::DeInit(true); - GLScreen_DeInit(); + oglContext->doneCurrent(); + deinitOpenGL(); } - else - OSD::DeInit(false);*/ - - //if (Screen_UseGL) uiGLMakeContextCurrent(NULL); } void EmuThread::changeWindowTitle(char* title) @@ -379,25 +569,25 @@ void EmuThread::emuRun() // checkme emit windowEmuStart(); if (audioDevice) SDL_PauseAudioDevice(audioDevice, 0); + if (micDevice) SDL_PauseAudioDevice(micDevice, 0); } -void EmuThread::emuPause(bool refresh) +void EmuThread::emuPause() { - int status = refresh ? 2:3; PrevEmuStatus = EmuRunning; - EmuRunning = status; - while (EmuStatus != status); + EmuRunning = 2; + while (EmuStatus != 2); - //emit windowEmuPause(); if (audioDevice) SDL_PauseAudioDevice(audioDevice, 1); + if (micDevice) SDL_PauseAudioDevice(micDevice, 1); } void EmuThread::emuUnpause() { EmuRunning = PrevEmuStatus; - //emit windowEmuUnpause(); if (audioDevice) SDL_PauseAudioDevice(audioDevice, 0); + if (micDevice) SDL_PauseAudioDevice(micDevice, 0); } void EmuThread::emuStop() @@ -405,6 +595,7 @@ void EmuThread::emuStop() EmuRunning = 0; if (audioDevice) SDL_PauseAudioDevice(audioDevice, 1); + if (micDevice) SDL_PauseAudioDevice(micDevice, 1); } bool EmuThread::emuIsRunning() @@ -413,19 +604,140 @@ bool EmuThread::emuIsRunning() } -MainWindowPanel::MainWindowPanel(QWidget* parent) : QWidget(parent) +void ScreenHandler::screenSetupLayout(int w, int h) { - screen[0] = new QImage(256, 192, QImage::Format_RGB32); - screen[1] = new QImage(256, 192, QImage::Format_RGB32); + int sizing = Config::ScreenSizing; + if (sizing == 3) sizing = autoScreenSizing; + + Frontend::SetupScreenLayout(w, h, + Config::ScreenLayout, + Config::ScreenRotation, + sizing, + Config::ScreenGap, + Config::IntegerScaling != 0); + + Frontend::GetScreenTransforms(screenMatrix[0], screenMatrix[1]); } -MainWindowPanel::~MainWindowPanel() +QSize ScreenHandler::screenGetMinSize() { - delete screen[0]; - delete screen[1]; + bool isHori = (Config::ScreenRotation == 1 || Config::ScreenRotation == 3); + int gap = Config::ScreenGap; + + int w = 256; + int h = 192; + + if (Config::ScreenLayout == 0) // natural + { + if (isHori) + return QSize(h+gap+h, w); + else + return QSize(w, h+gap+h); + } + else if (Config::ScreenLayout == 1) // vertical + { + if (isHori) + return QSize(h, w+gap+w); + else + return QSize(w, h+gap+h); + } + else // horizontal + { + if (isHori) + return QSize(h+gap+h, w); + else + return QSize(w+gap+w, h); + } } -void MainWindowPanel::paintEvent(QPaintEvent* event) +void ScreenHandler::screenOnMousePress(QMouseEvent* event) +{ + event->accept(); + if (event->button() != Qt::LeftButton) return; + + int x = event->pos().x(); + int y = event->pos().y(); + + Frontend::GetTouchCoords(x, y); + + if (x >= 0 && x < 256 && y >= 0 && y < 192) + { + touching = true; + NDS::TouchScreen(x, y); + } +} + +void ScreenHandler::screenOnMouseRelease(QMouseEvent* event) +{ + event->accept(); + if (event->button() != Qt::LeftButton) return; + + if (touching) + { + touching = false; + NDS::ReleaseScreen(); + } +} + +void ScreenHandler::screenOnMouseMove(QMouseEvent* event) +{ + event->accept(); + if (!(event->buttons() & Qt::LeftButton)) return; + if (!touching) return; + + int x = event->pos().x(); + int y = event->pos().y(); + + Frontend::GetTouchCoords(x, y); + + // clamp to screen range + if (x < 0) x = 0; + else if (x > 255) x = 255; + if (y < 0) y = 0; + else if (y > 191) y = 191; + + NDS::TouchScreen(x, y); +} + + +ScreenPanelNative::ScreenPanelNative(QWidget* parent) : QWidget(parent) +{ + screen[0] = QImage(256, 192, QImage::Format_RGB32); + screen[1] = QImage(256, 192, QImage::Format_RGB32); + + screenTrans[0].reset(); + screenTrans[1].reset(); + + touching = false; + + OSD::Init(nullptr); +} + +ScreenPanelNative::~ScreenPanelNative() +{ + OSD::DeInit(nullptr); +} + +void ScreenPanelNative::setupScreenLayout() +{ + int w = width(); + int h = height(); + float* mtx; + + screenSetupLayout(w, h); + + mtx = screenMatrix[0]; + screenTrans[0].setMatrix(mtx[0], mtx[1], 0.f, + mtx[2], mtx[3], 0.f, + mtx[4], mtx[5], 1.f); + + mtx = screenMatrix[1]; + screenTrans[1].setMatrix(mtx[0], mtx[1], 0.f, + mtx[2], mtx[3], 0.f, + mtx[4], mtx[5], 1.f); +} + +void ScreenPanelNative::paintEvent(QPaintEvent* event) { QPainter painter(this); @@ -435,22 +747,242 @@ void MainWindowPanel::paintEvent(QPaintEvent* event) int frontbuf = GPU::FrontBuffer; if (!GPU::Framebuffer[frontbuf][0] || !GPU::Framebuffer[frontbuf][1]) return; - memcpy(screen[0]->scanLine(0), GPU::Framebuffer[frontbuf][0], 256*192*4); - memcpy(screen[1]->scanLine(0), GPU::Framebuffer[frontbuf][1], 256*192*4); + memcpy(screen[0].scanLine(0), GPU::Framebuffer[frontbuf][0], 256*192*4); + memcpy(screen[1].scanLine(0), GPU::Framebuffer[frontbuf][1], 256*192*4); + + painter.setRenderHint(QPainter::SmoothPixmapTransform, Config::ScreenFilter!=0); + + QRect screenrc(0, 0, 256, 192); + + painter.setTransform(screenTrans[0]); + painter.drawImage(screenrc, screen[0]); + + painter.setTransform(screenTrans[1]); + painter.drawImage(screenrc, screen[1]); + + OSD::Update(nullptr); + OSD::DrawNative(painter); +} + +void ScreenPanelNative::resizeEvent(QResizeEvent* event) +{ + setupScreenLayout(); +} + +void ScreenPanelNative::mousePressEvent(QMouseEvent* event) +{ + screenOnMousePress(event); +} + +void ScreenPanelNative::mouseReleaseEvent(QMouseEvent* event) +{ + screenOnMouseRelease(event); +} + +void ScreenPanelNative::mouseMoveEvent(QMouseEvent* event) +{ + screenOnMouseMove(event); +} + +void ScreenPanelNative::onScreenLayoutChanged() +{ + setMinimumSize(screenGetMinSize()); + setupScreenLayout(); +} + + +ScreenPanelGL::ScreenPanelGL(QWidget* parent) : QOpenGLWidget(parent) +{ + touching = false; + +} + +ScreenPanelGL::~ScreenPanelGL() +{ + makeCurrent(); + + OSD::DeInit(this); + + glDeleteTextures(1, &screenTexture); - QRect src = QRect(0, 0, 256, 192); + glDeleteVertexArrays(1, &screenVertexArray); + glDeleteBuffers(1, &screenVertexBuffer); - QRect dstTop = QRect(0, 0, 256, 192); // TODO - QRect dstBot = QRect(0, 192, 256, 192); // TODO + delete screenShader; - painter.drawImage(dstTop, *screen[0]); - painter.drawImage(dstBot, *screen[1]); + doneCurrent(); +} + +void ScreenPanelGL::setupScreenLayout() +{ + int w = width(); + int h = height(); + + screenSetupLayout(w, h); +} + +void ScreenPanelGL::initializeGL() +{ + initializeOpenGLFunctions(); + + const GLubyte* renderer = glGetString(GL_RENDERER); // get renderer string + const GLubyte* version = glGetString(GL_VERSION); // version as a string + printf("OpenGL: renderer: %s\n", renderer); + printf("OpenGL: version: %s\n", version); + + glClearColor(0, 0, 0, 1); + + screenShader = new QOpenGLShaderProgram(this); + screenShader->addShaderFromSourceCode(QOpenGLShader::Vertex, kScreenVS); + screenShader->addShaderFromSourceCode(QOpenGLShader::Fragment, kScreenFS); + + GLuint pid = screenShader->programId(); + glBindAttribLocation(pid, 0, "vPosition"); + glBindAttribLocation(pid, 1, "vTexcoord"); + glBindFragDataLocation(pid, 0, "oColor"); + + screenShader->link(); + + screenShader->bind(); + screenShader->setUniformValue("ScreenTex", (GLint)0); + screenShader->release(); + + + float vertices[] = + { + 0, 0, 0, 0, + 0, 192, 0, 0.5, + 256, 192, 1, 0.5, + 0, 0, 0, 0, + 256, 192, 1, 0.5, + 256, 0, 1, 0, + + 0, 0, 0, 0.5, + 0, 192, 0, 1, + 256, 192, 1, 1, + 0, 0, 0, 0.5, + 256, 192, 1, 1, + 256, 0, 1, 0.5 + }; + + glGenBuffers(1, &screenVertexBuffer); + glBindBuffer(GL_ARRAY_BUFFER, screenVertexBuffer); + glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); + + glGenVertexArrays(1, &screenVertexArray); + glBindVertexArray(screenVertexArray); + glEnableVertexAttribArray(0); // position + glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 4*4, (void*)(0)); + glEnableVertexAttribArray(1); // texcoord + glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 4*4, (void*)(2*4)); + + glGenTextures(1, &screenTexture); + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, screenTexture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256, 192*2, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); + + OSD::Init(this); +} + +void ScreenPanelGL::paintGL() +{ + int w = width(); + int h = height(); + float factor = devicePixelRatioF(); + + glClear(GL_COLOR_BUFFER_BIT); + + glViewport(0, 0, w*factor, h*factor); + + screenShader->bind(); + + screenShader->setUniformValue("uScreenSize", (float)w*factor, (float)h*factor); + + int frontbuf = GPU::FrontBuffer; + glActiveTexture(GL_TEXTURE0); + + if (GPU::Renderer != 0) + { + // hardware-accelerated render + GPU::GLCompositor::BindOutputTexture(); + } + else + { + // regular render + glBindTexture(GL_TEXTURE_2D, screenTexture); + + if (GPU::Framebuffer[frontbuf][0] && GPU::Framebuffer[frontbuf][1]) + { + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 256, 192, GL_RGBA, + GL_UNSIGNED_BYTE, GPU::Framebuffer[frontbuf][0]); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 192, 256, 192, GL_RGBA, + GL_UNSIGNED_BYTE, GPU::Framebuffer[frontbuf][1]); + } + } + + GLint filter = Config::ScreenFilter ? GL_LINEAR : GL_NEAREST; + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filter); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filter); + + glBindBuffer(GL_ARRAY_BUFFER, screenVertexBuffer); + glBindVertexArray(screenVertexArray); + + GLint transloc = screenShader->uniformLocation("uTransform"); + + glUniformMatrix2x3fv(transloc, 1, GL_TRUE, screenMatrix[0]); + glDrawArrays(GL_TRIANGLES, 0, 2*3); + + glUniformMatrix2x3fv(transloc, 1, GL_TRUE, screenMatrix[1]); + glDrawArrays(GL_TRIANGLES, 2*3, 2*3); + + screenShader->release(); + + OSD::Update(this); + OSD::DrawGL(this, w*factor, h*factor); +} + +void ScreenPanelGL::resizeEvent(QResizeEvent* event) +{ + setupScreenLayout(); + + QOpenGLWidget::resizeEvent(event); +} + +void ScreenPanelGL::resizeGL(int w, int h) +{ +} + +void ScreenPanelGL::mousePressEvent(QMouseEvent* event) +{ + screenOnMousePress(event); +} + +void ScreenPanelGL::mouseReleaseEvent(QMouseEvent* event) +{ + screenOnMouseRelease(event); +} + +void ScreenPanelGL::mouseMoveEvent(QMouseEvent* event) +{ + screenOnMouseMove(event); +} + +void ScreenPanelGL::onScreenLayoutChanged() +{ + setMinimumSize(screenGetMinSize()); + setupScreenLayout(); } MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent) { setWindowTitle("melonDS " MELONDS_VERSION); + setAttribute(Qt::WA_DeleteOnClose); + setAcceptDrops(true); QMenuBar* menubar = new QMenuBar(); { @@ -470,9 +1002,7 @@ MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent) for (int i = 1; i < 9; i++) { - char title[16]; - sprintf(title, "%d", i); - actSaveState[i] = submenu->addAction(title); + actSaveState[i] = submenu->addAction(QString("%1").arg(i)); actSaveState[i]->setShortcut(QKeySequence(Qt::ShiftModifier | (Qt::Key_F1+i-1))); actSaveState[i]->setData(QVariant(i)); connect(actSaveState[i], &QAction::triggered, this, &MainWindow::onSaveState); @@ -488,9 +1018,7 @@ MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent) for (int i = 1; i < 9; i++) { - char title[16]; - sprintf(title, "%d", i); - actLoadState[i] = submenu->addAction(title); + actLoadState[i] = submenu->addAction(QString("%1").arg(i)); actLoadState[i]->setShortcut(QKeySequence(Qt::Key_F1+i-1)); actLoadState[i]->setData(QVariant(i)); connect(actLoadState[i], &QAction::triggered, this, &MainWindow::onLoadState); @@ -524,38 +1052,373 @@ MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent) actStop = menu->addAction("Stop"); connect(actStop, &QAction::triggered, this, &MainWindow::onStop); } + { + QMenu* menu = menubar->addMenu("Config"); + + actEmuSettings = menu->addAction("Emu settings"); + connect(actEmuSettings, &QAction::triggered, this, &MainWindow::onOpenEmuSettings); + + actInputConfig = menu->addAction("Input and hotkeys"); + connect(actInputConfig, &QAction::triggered, this, &MainWindow::onOpenInputConfig); + + actVideoSettings = menu->addAction("Video settings"); + connect(actVideoSettings, &QAction::triggered, this, &MainWindow::onOpenVideoSettings); + + actAudioSettings = menu->addAction("Audio settings"); + connect(actAudioSettings, &QAction::triggered, this, &MainWindow::onOpenAudioSettings); + + actWifiSettings = menu->addAction("Wifi settings"); + connect(actWifiSettings, &QAction::triggered, this, &MainWindow::onOpenWifiSettings); + + { + QMenu* submenu = menu->addMenu("Savestate settings"); + + actSavestateSRAMReloc = submenu->addAction("Separate savefiles"); + actSavestateSRAMReloc->setCheckable(true); + connect(actSavestateSRAMReloc, &QAction::triggered, this, &MainWindow::onChangeSavestateSRAMReloc); + } + + menu->addSeparator(); + + { + QMenu* submenu = menu->addMenu("Screen size"); + + for (int i = 0; i < 4; i++) + { + int data = i+1; + actScreenSize[i] = submenu->addAction(QString("%1x").arg(data)); + actScreenSize[i]->setData(QVariant(data)); + connect(actScreenSize[i], &QAction::triggered, this, &MainWindow::onChangeScreenSize); + } + } + { + QMenu* submenu = menu->addMenu("Screen rotation"); + grpScreenRotation = new QActionGroup(submenu); + + for (int i = 0; i < 4; i++) + { + int data = i*90; + actScreenRotation[i] = submenu->addAction(QString("%1°").arg(data)); + actScreenRotation[i]->setActionGroup(grpScreenRotation); + actScreenRotation[i]->setData(QVariant(i)); + actScreenRotation[i]->setCheckable(true); + } + + connect(grpScreenRotation, &QActionGroup::triggered, this, &MainWindow::onChangeScreenRotation); + } + { + QMenu* submenu = menu->addMenu("Screen gap"); + grpScreenGap = new QActionGroup(submenu); + + const int screengap[] = {0, 1, 8, 64, 90, 128}; + + for (int i = 0; i < 6; i++) + { + int data = screengap[i]; + actScreenGap[i] = submenu->addAction(QString("%1 px").arg(data)); + actScreenGap[i]->setActionGroup(grpScreenGap); + actScreenGap[i]->setData(QVariant(data)); + actScreenGap[i]->setCheckable(true); + } + + connect(grpScreenGap, &QActionGroup::triggered, this, &MainWindow::onChangeScreenGap); + } + { + QMenu* submenu = menu->addMenu("Screen layout"); + grpScreenLayout = new QActionGroup(submenu); + + const char* screenlayout[] = {"Natural", "Vertical", "Horizontal"}; + + for (int i = 0; i < 3; i++) + { + actScreenLayout[i] = submenu->addAction(QString(screenlayout[i])); + actScreenLayout[i]->setActionGroup(grpScreenLayout); + actScreenLayout[i]->setData(QVariant(i)); + actScreenLayout[i]->setCheckable(true); + } + + connect(grpScreenLayout, &QActionGroup::triggered, this, &MainWindow::onChangeScreenLayout); + } + { + QMenu* submenu = menu->addMenu("Screen sizing"); + grpScreenSizing = new QActionGroup(submenu); + + const char* screensizing[] = {"Even", "Emphasize top", "Emphasize bottom", "Auto"}; + + for (int i = 0; i < 4; i++) + { + actScreenSizing[i] = submenu->addAction(QString(screensizing[i])); + actScreenSizing[i]->setActionGroup(grpScreenSizing); + actScreenSizing[i]->setData(QVariant(i)); + actScreenSizing[i]->setCheckable(true); + } + + connect(grpScreenSizing, &QActionGroup::triggered, this, &MainWindow::onChangeScreenSizing); + + submenu->addSeparator(); + + actIntegerScaling = submenu->addAction("Force integer scaling"); + actIntegerScaling->setCheckable(true); + connect(actIntegerScaling, &QAction::triggered, this, &MainWindow::onChangeIntegerScaling); + } + + actScreenFiltering = menu->addAction("Screen filtering"); + actScreenFiltering->setCheckable(true); + connect(actScreenFiltering, &QAction::triggered, this, &MainWindow::onChangeScreenFiltering); + + actShowOSD = menu->addAction("Show OSD"); + actShowOSD->setCheckable(true); + connect(actShowOSD, &QAction::triggered, this, &MainWindow::onChangeShowOSD); + + menu->addSeparator(); + + actLimitFramerate = menu->addAction("Limit framerate"); + actLimitFramerate->setCheckable(true); + connect(actLimitFramerate, &QAction::triggered, this, &MainWindow::onChangeLimitFramerate); + + actAudioSync = menu->addAction("Audio sync"); + actAudioSync->setCheckable(true); + connect(actAudioSync, &QAction::triggered, this, &MainWindow::onChangeAudioSync); + } setMenuBar(menubar); - panel = new MainWindowPanel(this); - setCentralWidget(panel); - panel->setMinimumSize(256, 384); + resize(Config::WindowWidth, Config::WindowHeight); + + show(); + createScreenPanel(); + + for (int i = 0; i < 9; i++) + { + actSaveState[i]->setEnabled(false); + actLoadState[i]->setEnabled(false); + } + actUndoStateLoad->setEnabled(false); + + actPause->setEnabled(false); + actReset->setEnabled(false); + actStop->setEnabled(false); + + + actSavestateSRAMReloc->setChecked(Config::SavestateRelocSRAM != 0); + + actScreenRotation[Config::ScreenRotation]->setChecked(true); + + for (int i = 0; i < 6; i++) + { + if (actScreenGap[i]->data().toInt() == Config::ScreenGap) + { + actScreenGap[i]->setChecked(true); + break; + } + } + + actScreenLayout[Config::ScreenLayout]->setChecked(true); + actScreenSizing[Config::ScreenSizing]->setChecked(true); + actIntegerScaling->setChecked(Config::IntegerScaling != 0); + + actScreenFiltering->setChecked(Config::ScreenFilter != 0); + actShowOSD->setChecked(Config::ShowOSD != 0); + + actLimitFramerate->setChecked(Config::LimitFPS != 0); + actAudioSync->setChecked(Config::AudioSync != 0); } MainWindow::~MainWindow() { } +void MainWindow::createScreenPanel() +{ + hasOGL = (Config::ScreenUseGL != 0) || (Config::_3DRenderer != 0); + + if (hasOGL) + { + ScreenPanelGL* panelGL = new ScreenPanelGL(this); + panelGL->show(); + + if (!panelGL->isValid()) + hasOGL = false; + else + { + QSurfaceFormat fmt = panelGL->format(); + if (fmt.majorVersion() < 3 || (fmt.majorVersion() == 3 && fmt.minorVersion() < 2)) + hasOGL = false; + } + + if (!hasOGL) + delete panelGL; + else + panel = panelGL; + } + + if (!hasOGL) + { + panel = new ScreenPanelNative(this); + panel->show(); + } + + setCentralWidget(panel); + connect(this, SIGNAL(screenLayoutChange()), panel, SLOT(onScreenLayoutChanged())); + emit screenLayoutChange(); +} + +QOpenGLContext* MainWindow::getOGLContext() +{ + if (!hasOGL) return nullptr; + + QOpenGLWidget* glpanel = (QOpenGLWidget*)panel; + return glpanel->context(); +} + +void MainWindow::resizeEvent(QResizeEvent* event) +{ + int w = event->size().width(); + int h = event->size().height(); + + Config::WindowWidth = w; + Config::WindowHeight = h; + + // TODO: detect when the window gets maximized! +} void MainWindow::keyPressEvent(QKeyEvent* event) { - printf("key press. %d %d %08X %08X\n", event->key(), event->nativeScanCode(), event->modifiers(), event->nativeModifiers()); + if (event->isAutoRepeat()) return; + + Input::KeyPress(event); +} + +void MainWindow::keyReleaseEvent(QKeyEvent* event) +{ + if (event->isAutoRepeat()) return; + + Input::KeyRelease(event); +} + + +void MainWindow::dragEnterEvent(QDragEnterEvent* event) +{ + if (!event->mimeData()->hasUrls()) return; + + QList<QUrl> urls = event->mimeData()->urls(); + if (urls.count() > 1) return; // not handling more than one file at once + + QString filename = urls.at(0).toLocalFile(); + QString ext = filename.right(3); + + if (ext == "nds" || ext == "srl" || (ext == "gba" && RunningSomething)) + event->acceptProposedAction(); +} + +void MainWindow::dropEvent(QDropEvent* event) +{ + if (!event->mimeData()->hasUrls()) return; + + QList<QUrl> urls = event->mimeData()->urls(); + if (urls.count() > 1) return; // not handling more than one file at once + + emuThread->emuPause(); + + QString filename = urls.at(0).toLocalFile(); + QString ext = filename.right(3); + + char _filename[1024]; + strncpy(_filename, filename.toStdString().c_str(), 1023); _filename[1023] = '\0'; + + int slot; int res; + if (ext == "gba") + { + slot = 1; + res = Frontend::LoadROM(_filename, Frontend::ROMSlot_GBA); + } + else + { + slot = 0; + res = Frontend::LoadROM(_filename, Frontend::ROMSlot_NDS); + } + + if (res != Frontend::Load_OK) + { + QMessageBox::critical(this, + "melonDS", + loadErrorStr(res)); + emuThread->emuUnpause(); + } + else if (slot == 1) + { + // checkme + emuThread->emuUnpause(); + } + else + { + emuThread->emuRun(); + } +} + + +QString MainWindow::loadErrorStr(int error) +{ + switch (error) + { + case Frontend::Load_BIOS9Missing: + return "DS ARM9 BIOS was not found or could not be accessed. Check your emu settings."; + case Frontend::Load_BIOS9Bad: + return "DS ARM9 BIOS is not a valid BIOS dump."; + + case Frontend::Load_BIOS7Missing: + return "DS ARM7 BIOS was not found or could not be accessed. Check your emu settings."; + case Frontend::Load_BIOS7Bad: + return "DS ARM7 BIOS is not a valid BIOS dump."; + + case Frontend::Load_FirmwareMissing: + return "DS firmware was not found or could not be accessed. Check your emu settings."; + case Frontend::Load_FirmwareBad: + return "DS firmware is not a valid firmware dump."; + case Frontend::Load_FirmwareNotBootable: + return "DS firmware is not bootable."; + + case Frontend::Load_DSiBIOS9Missing: + return "DSi ARM9 BIOS was not found or could not be accessed. Check your emu settings."; + case Frontend::Load_DSiBIOS9Bad: + return "DSi ARM9 BIOS is not a valid BIOS dump."; + + case Frontend::Load_DSiBIOS7Missing: + return "DSi ARM7 BIOS was not found or could not be accessed. Check your emu settings."; + case Frontend::Load_DSiBIOS7Bad: + return "DSi ARM7 BIOS is not a valid BIOS dump."; + + case Frontend::Load_DSiNANDMissing: + return "DSi NAND was not found or could not be accessed. Check your emu settings."; + case Frontend::Load_DSiNANDBad: + return "DSi NAND is not a valid NAND dump."; + + case Frontend::Load_ROMLoadError: + return "Failed to load the ROM. Make sure the file is accessible and isn't used by another application."; + + default: return "Unknown error during launch; smack Arisotura."; + } } void MainWindow::onOpenFile() { - emuThread->emuPause(true); + emuThread->emuPause(); QString filename = QFileDialog::getOpenFileName(this, "Open ROM", Config::LastROMFolder, - "DS ROMs (*.nds *.srl);;GBA ROMs (*.gba);;Any file (*.*)"); + "DS ROMs (*.nds *.dsi *.srl);;GBA ROMs (*.gba);;Any file (*.*)"); if (filename.isEmpty()) { emuThread->emuUnpause(); return; } + // TODO: validate the input file!! + // * check that it is a proper ROM + // * ensure the binary offsets are sane + // * etc + // this shit is stupid char file[1024]; strncpy(file, filename.toStdString().c_str(), 1023); file[1023] = '\0'; @@ -566,7 +1429,7 @@ void MainWindow::onOpenFile() Config::LastROMFolder[pos] = '\0'; char* ext = &file[strlen(file)-3]; - int slot; bool res; + int slot; int res; if (!strcasecmp(ext, "gba")) { slot = 1; @@ -578,11 +1441,11 @@ void MainWindow::onOpenFile() res = Frontend::LoadROM(file, Frontend::ROMSlot_NDS); } - if (!res) + if (res != Frontend::Load_OK) { QMessageBox::critical(this, "melonDS", - "Failed to load the ROM.\n\nMake sure the file is accessible and isn't used by another application."); + loadErrorStr(res)); emuThread->emuUnpause(); } else if (slot == 1) @@ -598,16 +1461,16 @@ void MainWindow::onOpenFile() void MainWindow::onBootFirmware() { - // TODO: ensure the firmware is actually bootable!! // TODO: check the whole GBA cart shito - emuThread->emuPause(true); + emuThread->emuPause(); - bool res = Frontend::LoadBIOS(); - if (!res) + int res = Frontend::LoadBIOS(); + if (res != Frontend::Load_OK) { - // TODO! - + QMessageBox::critical(this, + "melonDS", + loadErrorStr(res)); emuThread->emuUnpause(); } else @@ -620,7 +1483,7 @@ void MainWindow::onSaveState() { int slot = ((QAction*)sender())->data().toInt(); - emuThread->emuPause(true); + emuThread->emuPause(); char filename[1024]; if (slot > 0) @@ -645,13 +1508,16 @@ void MainWindow::onSaveState() if (Frontend::SaveState(filename)) { - // TODO: OSD message + char msg[64]; + if (slot > 0) sprintf(msg, "State saved to slot %d", slot); + else sprintf(msg, "State saved to file"); + OSD::AddMessage(0, msg); actLoadState[slot]->setEnabled(true); } else { - // TODO: OSD error message? + OSD::AddMessage(0xFFA0A0, "State save failed"); } emuThread->emuUnpause(); @@ -661,7 +1527,7 @@ void MainWindow::onLoadState() { int slot = ((QAction*)sender())->data().toInt(); - emuThread->emuPause(true); + emuThread->emuPause(); char filename[1024]; if (slot > 0) @@ -686,10 +1552,10 @@ void MainWindow::onLoadState() if (!Platform::FileExists(filename)) { - /*char msg[64]; + char msg[64]; if (slot > 0) sprintf(msg, "State slot %d is empty", slot); else sprintf(msg, "State file does not exist"); - OSD::AddMessage(0xFFA0A0, msg);*/ + OSD::AddMessage(0xFFA0A0, msg); emuThread->emuUnpause(); return; @@ -697,11 +1563,14 @@ void MainWindow::onLoadState() if (Frontend::LoadState(filename)) { - // TODO: OSD message + char msg[64]; + if (slot > 0) sprintf(msg, "State loaded from slot %d", slot); + else sprintf(msg, "State loaded from file"); + OSD::AddMessage(0, msg); } else { - // TODO: OSD error message? + OSD::AddMessage(0xFFA0A0, "State load failed"); } emuThread->emuUnpause(); @@ -709,9 +1578,11 @@ void MainWindow::onLoadState() void MainWindow::onUndoStateLoad() { - emuThread->emuPause(true); + emuThread->emuPause(); Frontend::UndoStateLoad(); emuThread->emuUnpause(); + + OSD::AddMessage(0, "State load undone"); } void MainWindow::onQuit() @@ -722,24 +1593,220 @@ void MainWindow::onQuit() void MainWindow::onPause(bool checked) { - if (emuThread->emuIsRunning()) + if (!RunningSomething) return; + + if (checked) { - emuThread->emuPause(true); + emuThread->emuPause(); + OSD::AddMessage(0, "Paused"); } else { emuThread->emuUnpause(); + OSD::AddMessage(0, "Resumed"); } } void MainWindow::onReset() { - // + if (!RunningSomething) return; + + emuThread->emuPause(); + + actUndoStateLoad->setEnabled(false); + + int res = Frontend::Reset(); + if (res != Frontend::Load_OK) + { + QMessageBox::critical(this, + "melonDS", + loadErrorStr(res)); + emuThread->emuUnpause(); + } + else + { + OSD::AddMessage(0, "Reset"); + emuThread->emuRun(); + } } void MainWindow::onStop() { - // + if (!RunningSomething) return; + + emuThread->emuPause(); + NDS::Stop(); +} + + +void MainWindow::onOpenEmuSettings() +{ + EmuSettingsDialog::openDlg(this); +} + +void MainWindow::onOpenInputConfig() +{ + emuThread->emuPause(); + + InputConfigDialog* dlg = InputConfigDialog::openDlg(this); + connect(dlg, &InputConfigDialog::finished, this, &MainWindow::onInputConfigFinished); +} + +void MainWindow::onInputConfigFinished(int res) +{ + emuThread->emuUnpause(); +} + +void MainWindow::onOpenVideoSettings() +{ + VideoSettingsDialog* dlg = VideoSettingsDialog::openDlg(this); + connect(dlg, &VideoSettingsDialog::updateVideoSettings, this, &MainWindow::onUpdateVideoSettings); +} + +void MainWindow::onOpenAudioSettings() +{ + AudioSettingsDialog* dlg = AudioSettingsDialog::openDlg(this); + connect(dlg, &AudioSettingsDialog::finished, this, &MainWindow::onAudioSettingsFinished); +} + +void MainWindow::onAudioSettingsFinished(int res) +{ + if (Config::MicInputType == 3) + { + micLoadWav(Config::MicWavPath); + Frontend::Mic_SetExternalBuffer(micWavBuffer, micWavLength); + } + else + { + delete[] micWavBuffer; + micWavBuffer = nullptr; + + if (Config::MicInputType == 1) + Frontend::Mic_SetExternalBuffer(micExtBuffer, sizeof(micExtBuffer)/sizeof(s16)); + else + Frontend::Mic_SetExternalBuffer(NULL, 0); + } +} + +void MainWindow::onOpenWifiSettings() +{ + WifiSettingsDialog* dlg = WifiSettingsDialog::openDlg(this); + connect(dlg, &WifiSettingsDialog::finished, this, &MainWindow::onWifiSettingsFinished); +} + +void MainWindow::onWifiSettingsFinished(int res) +{ + emuThread->emuPause(); + + if (Wifi::MPInited) + { + Platform::MP_DeInit(); + Platform::MP_Init(); + } + + Platform::LAN_DeInit(); + Platform::LAN_Init(); + + emuThread->emuUnpause(); +} + +void MainWindow::onChangeSavestateSRAMReloc(bool checked) +{ + Config::SavestateRelocSRAM = checked?1:0; +} + +void MainWindow::onChangeScreenSize() +{ + int factor = ((QAction*)sender())->data().toInt(); + + bool isHori = (Config::ScreenRotation == 1 || Config::ScreenRotation == 3); + int gap = Config::ScreenGap; + + int w = 256*factor; + int h = 192*factor; + + QSize diff = size() - panel->size(); + + if (Config::ScreenLayout == 0) // natural + { + if (isHori) + resize(QSize(h+gap+h, w) + diff); + else + resize(QSize(w, h+gap+h) + diff); + } + else if (Config::ScreenLayout == 1) // vertical + { + if (isHori) + resize(QSize(h, w+gap+w) + diff); + else + resize(QSize(w, h+gap+h) + diff); + } + else // horizontal + { + if (isHori) + resize(QSize(h+gap+h, w) + diff); + else + resize(QSize(w+gap+w, h) + diff); + } +} + +void MainWindow::onChangeScreenRotation(QAction* act) +{ + int rot = act->data().toInt(); + Config::ScreenRotation = rot; + + emit screenLayoutChange(); +} + +void MainWindow::onChangeScreenGap(QAction* act) +{ + int gap = act->data().toInt(); + Config::ScreenGap = gap; + + emit screenLayoutChange(); +} + +void MainWindow::onChangeScreenLayout(QAction* act) +{ + int layout = act->data().toInt(); + Config::ScreenLayout = layout; + + emit screenLayoutChange(); +} + +void MainWindow::onChangeScreenSizing(QAction* act) +{ + int sizing = act->data().toInt(); + Config::ScreenSizing = sizing; + + emit screenLayoutChange(); +} + +void MainWindow::onChangeIntegerScaling(bool checked) +{ + Config::IntegerScaling = checked?1:0; + + emit screenLayoutChange(); +} + +void MainWindow::onChangeScreenFiltering(bool checked) +{ + Config::ScreenFilter = checked?1:0; +} + +void MainWindow::onChangeShowOSD(bool checked) +{ + Config::ShowOSD = checked?1:0; +} + +void MainWindow::onChangeLimitFramerate(bool checked) +{ + Config::LimitFPS = checked?1:0; +} + +void MainWindow::onChangeAudioSync(bool checked) +{ + Config::AudioSync = checked?1:0; } @@ -757,7 +1824,7 @@ void MainWindow::onEmuStart() } actSaveState[0]->setEnabled(true); actLoadState[0]->setEnabled(true); - actUndoStateLoad->setEnabled(true); + actUndoStateLoad->setEnabled(false); actPause->setEnabled(true); actPause->setChecked(false); @@ -767,6 +1834,8 @@ void MainWindow::onEmuStart() void MainWindow::onEmuStop() { + emuThread->emuPause(); + for (int i = 0; i < 9; i++) { actSaveState[i]->setEnabled(false); @@ -779,17 +1848,40 @@ void MainWindow::onEmuStop() actStop->setEnabled(false); } -void MainWindow::onEmuPause() +void MainWindow::onUpdateVideoSettings(bool glchange) { - // + if (glchange) + { + emuThread->emuPause(); + + if (hasOGL) emuThread->deinitOpenGL(); + delete panel; + createScreenPanel(); + connect(emuThread, SIGNAL(windowUpdate()), panel, SLOT(update())); + if (hasOGL) emuThread->initOpenGL(); + } + + videoSettingsDirty = true; + + if (glchange) + emuThread->emuUnpause(); } -void MainWindow::onEmuUnpause() + +void emuStop() { - // + RunningSomething = false; + + Frontend::UnloadROM(Frontend::ROMSlot_NDS); + Frontend::UnloadROM(Frontend::ROMSlot_GBA); + + emit emuThread->windowEmuStop(); + + OSD::AddMessage(0xFFC040, "Shutdown"); } + int main(int argc, char** argv) { srand(time(NULL)); @@ -797,40 +1889,10 @@ int main(int argc, char** argv) printf("melonDS " MELONDS_VERSION "\n"); printf(MELONDS_URL "\n"); -#if defined(__WIN32__) || defined(UNIX_PORTABLE) - if (argc > 0 && strlen(argv[0]) > 0) - { - int len = strlen(argv[0]); - while (len > 0) - { - if (argv[0][len] == '/') break; - if (argv[0][len] == '\\') break; - len--; - } - if (len > 0) - { - EmuDirectory = new char[len+1]; - strncpy(EmuDirectory, argv[0], len); - EmuDirectory[len] = '\0'; - } - else - { - EmuDirectory = new char[2]; - strcpy(EmuDirectory, "."); - } - } - else - { - EmuDirectory = new char[2]; - strcpy(EmuDirectory, "."); - } -#else - QString confdir = QStandardPaths::writableLocation(QStandardPaths::ConfigLocation) + "/melonDS"; - EmuDirectory = new char[confdir.length() + 1]; - strcat(EmuDirectory, confdir.toStdString().c_str()); -#endif + Platform::Init(argc, argv); QApplication melon(argc, argv); + melon.setWindowIcon(QIcon(":/melon-icon")); // http://stackoverflow.com/questions/14543333/joystick-wont-work-using-sdl SDL_SetHint(SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS, "1"); @@ -849,107 +1911,26 @@ int main(int argc, char** argv) Config::Load(); - //if (Config::AudioVolume < 0) Config::AudioVolume = 0; - //else if (Config::AudioVolume > 256) Config::AudioVolume = 256; - - // TODO: those should be checked before running anything - // (as to let the user specify their own BIOS/firmware path etc) -#if 0 - if (!Platform::LocalFileExists("bios7.bin") || - !Platform::LocalFileExists("bios9.bin") || - !Platform::LocalFileExists("firmware.bin")) - { -#if defined(__WIN32__) || defined(UNIX_PORTABLE) - const char* locationName = "the directory you run melonDS from"; -#else - char* locationName = EmuDirectory; -#endif - char msgboxtext[512]; - sprintf(msgboxtext, - "One or more of the following required files don't exist or couldn't be accessed:\n\n" - "bios7.bin -- ARM7 BIOS\n" - "bios9.bin -- ARM9 BIOS\n" - "firmware.bin -- firmware image\n\n" - "Dump the files from your DS and place them in %s.\n" - "Make sure that the files can be accessed.", - locationName - ); - - uiMsgBoxError(NULL, "BIOS/Firmware not found", msgboxtext); - - uiUninit(); - SDL_Quit(); - return 0; - } - if (!Platform::LocalFileExists("firmware.bin.bak")) - { - // verify the firmware - // - // there are dumps of an old hacked firmware floating around on the internet - // and those are problematic - // the hack predates WFC, and, due to this, any game that alters the WFC - // access point data will brick that firmware due to it having critical - // data in the same area. it has the same problem on hardware. - // - // but this should help stop users from reporting that issue over and over - // again, when the issue is not from melonDS but from their firmware dump. - // - // I don't know about all the firmware hacks in existence, but the one I - // looked at has 0x180 bytes from the header repeated at 0x3FC80, but - // bytes 0x0C-0x14 are different. - - FILE* f = Platform::OpenLocalFile("firmware.bin", "rb"); - u8 chk1[0x180], chk2[0x180]; - - fseek(f, 0, SEEK_SET); - fread(chk1, 1, 0x180, f); - fseek(f, -0x380, SEEK_END); - fread(chk2, 1, 0x180, f); - - memset(&chk1[0x0C], 0, 8); - memset(&chk2[0x0C], 0, 8); - - fclose(f); - - if (!memcmp(chk1, chk2, 0x180)) - { - uiMsgBoxError(NULL, - "Problematic firmware dump", - "You are using an old hacked firmware dump.\n" - "Firmware boot will stop working if you run any game that alters WFC settings.\n\n" - "Note that the issue is not from melonDS, it would also happen on an actual DS."); - } - } - { - const char* romlist_missing = "Save memory type detection will not work correctly.\n\n" - "You should use the latest version of romlist.bin (provided in melonDS release packages)."; -#if !defined(UNIX_PORTABLE) && !defined(__WIN32__) - std::string missingstr = std::string(romlist_missing) + - "\n\nThe ROM list should be placed in " + g_get_user_data_dir() + "/melonds/, otherwise " - "melonDS will search for it in the current working directory."; - const char* romlist_missing_text = missingstr.c_str(); -#else - const char* romlist_missing_text = romlist_missing; -#endif - - FILE* f = Platform::OpenDataFile("romlist.bin"); - if (f) - { - u32 data; - fread(&data, 4, 1, f); - fclose(f); - - if ((data >> 24) == 0) // old CRC-based list - { - uiMsgBoxError(NULL, "Your version of romlist.bin is outdated.", romlist_missing_text); - } - } - else - { - uiMsgBoxError(NULL, "romlist.bin not found.", romlist_missing_text); - } - } -#endif +#define SANITIZE(var, min, max) { if (var < min) var = min; else if (var > max) var = max; } + SANITIZE(Config::ConsoleType, 0, 1); + SANITIZE(Config::_3DRenderer, 0, 1); + SANITIZE(Config::ScreenVSyncInterval, 1, 20); + SANITIZE(Config::GL_ScaleFactor, 1, 16); + SANITIZE(Config::AudioVolume, 0, 256); + SANITIZE(Config::MicInputType, 0, 3); + SANITIZE(Config::ScreenRotation, 0, 3); + SANITIZE(Config::ScreenGap, 0, 500); + SANITIZE(Config::ScreenLayout, 0, 2); + SANITIZE(Config::ScreenSizing, 0, 3); +#undef SANITIZE + + QSurfaceFormat format; + format.setDepthBufferSize(24); + format.setStencilBufferSize(8); + format.setVersion(3, 2); + format.setProfile(QSurfaceFormat::CoreProfile); + format.setSwapInterval(0); + QSurfaceFormat::setDefaultFormat(format); audioSync = SDL_CreateCond(); audioSyncLock = SDL_CreateMutex(); @@ -974,17 +1955,49 @@ int main(int argc, char** argv) SDL_PauseAudioDevice(audioDevice, 1); } + memset(&whatIwant, 0, sizeof(SDL_AudioSpec)); + whatIwant.freq = 44100; + whatIwant.format = AUDIO_S16LSB; + whatIwant.channels = 1; + whatIwant.samples = 1024; + whatIwant.callback = micCallback; + micDevice = SDL_OpenAudioDevice(NULL, 1, &whatIwant, &whatIget, 0); + if (!micDevice) + { + printf("Mic init failed: %s\n", SDL_GetError()); + } + else + { + SDL_PauseAudioDevice(micDevice, 1); + } + + + memset(micExtBuffer, 0, sizeof(micExtBuffer)); + micExtBufferWritePos = 0; + micWavBuffer = nullptr; + Frontend::Init_ROM(); Frontend::Init_Audio(audioFreq); + if (Config::MicInputType == 1) + { + Frontend::Mic_SetExternalBuffer(micExtBuffer, sizeof(micExtBuffer)/sizeof(s16)); + } + else if (Config::MicInputType == 3) + { + micLoadWav(Config::MicWavPath); + Frontend::Mic_SetExternalBuffer(micWavBuffer, micWavLength); + } + + Input::JoystickID = Config::JoystickID; + Input::OpenJoystick(); + mainWindow = new MainWindow(); - mainWindow->show(); emuThread = new EmuThread(); emuThread->start(); - emuThread->emuPause(true); + emuThread->emuPause(); - #if 0 if (argc > 1) { char* file = argv[1]; @@ -992,51 +2005,46 @@ int main(int argc, char** argv) if (!strcasecmp(ext, "nds") || !strcasecmp(ext, "srl")) { - strncpy(ROMPath[0], file, 1023); - ROMPath[0][1023] = '\0'; - - //SetupSRAMPath(0); - - //if (NDS::LoadROM(ROMPath[0], SRAMPath[0], Config::DirectBoot)) - // Run(); - } - - if (argc > 2) - { - file = argv[2]; - ext = &file[strlen(file)-3]; + int res = Frontend::LoadROM(file, Frontend::ROMSlot_NDS); - if (!strcasecmp(ext, "gba")) + if (res == Frontend::Load_OK) { - strncpy(ROMPath[1], file, 1023); - ROMPath[1][1023] = '\0'; + if (argc > 2) + { + file = argv[2]; + ext = &file[strlen(file)-3]; - //SetupSRAMPath(1); + if (!strcasecmp(ext, "gba")) + { + Frontend::LoadROM(file, Frontend::ROMSlot_GBA); + } + } - //NDS::LoadGBAROM(ROMPath[1], SRAMPath[1]); + emuThread->emuRun(); } } } - #endif int ret = melon.exec(); emuThread->emuStop(); emuThread->wait(); + delete emuThread; + + Input::CloseJoystick(); - //if (Joystick) SDL_JoystickClose(Joystick); if (audioDevice) SDL_CloseAudioDevice(audioDevice); - //if (MicDevice) SDL_CloseAudioDevice(MicDevice); + if (micDevice) SDL_CloseAudioDevice(micDevice); SDL_DestroyCond(audioSync); SDL_DestroyMutex(audioSyncLock); - //if (MicWavBuffer) delete[] MicWavBuffer; + if (micWavBuffer) delete[] micWavBuffer; Config::Save(); SDL_Quit(); - delete[] EmuDirectory; + Platform::DeInit(); return ret; } diff --git a/src/frontend/qt_sdl/main.h b/src/frontend/qt_sdl/main.h index 30cef1f..279aed8 100644 --- a/src/frontend/qt_sdl/main.h +++ b/src/frontend/qt_sdl/main.h @@ -21,8 +21,17 @@ #include <QThread> #include <QWidget> +#include <QWindow> #include <QMainWindow> #include <QImage> +#include <QActionGroup> + +#include <QOffscreenSurface> +#include <QOpenGLWidget> +#include <QOpenGLContext> +#include <QOpenGLFunctions> +#include <QOpenGLFunctions_3_2_Core> +#include <QOpenGLShaderProgram> class EmuThread : public QThread @@ -33,43 +42,124 @@ class EmuThread : public QThread public: explicit EmuThread(QObject* parent = nullptr); + void initOpenGL(); + void deinitOpenGL(); + + void* oglGetProcAddress(const char* proc); + void changeWindowTitle(char* title); // to be called from the UI thread void emuRun(); - void emuPause(bool refresh); + void emuPause(); void emuUnpause(); void emuStop(); bool emuIsRunning(); signals: + void windowUpdate(); void windowTitleChange(QString title); void windowEmuStart(); void windowEmuStop(); - void windowPauseToggle(); + void windowEmuPause(); + void windowEmuReset(); + + void windowLimitFPSChange(); + + void screenLayoutChange(); private: volatile int EmuStatus; int PrevEmuStatus; int EmuRunning; + + QOffscreenSurface* oglSurface; + QOpenGLContext* oglContext; +}; + + +class ScreenHandler +{ + Q_GADGET + +public: + virtual ~ScreenHandler() {} + +protected: + void screenSetupLayout(int w, int h); + + QSize screenGetMinSize(); + + void screenOnMousePress(QMouseEvent* event); + void screenOnMouseRelease(QMouseEvent* event); + void screenOnMouseMove(QMouseEvent* event); + + float screenMatrix[2][6]; + + bool touching; }; -class MainWindowPanel : public QWidget +class ScreenPanelNative : public QWidget, public ScreenHandler { Q_OBJECT public: - explicit MainWindowPanel(QWidget* parent); - ~MainWindowPanel(); + explicit ScreenPanelNative(QWidget* parent); + ~ScreenPanelNative(); protected: void paintEvent(QPaintEvent* event) override; + void resizeEvent(QResizeEvent* event) override; + + void mousePressEvent(QMouseEvent* event) override; + void mouseReleaseEvent(QMouseEvent* event) override; + void mouseMoveEvent(QMouseEvent* event) override; + +private slots: + void onScreenLayoutChanged(); + private: - QImage* screen[2]; + void setupScreenLayout(); + + QImage screen[2]; + QTransform screenTrans[2]; +}; + + +class ScreenPanelGL : public QOpenGLWidget, public ScreenHandler, protected QOpenGLFunctions_3_2_Core +{ + Q_OBJECT + +public: + explicit ScreenPanelGL(QWidget* parent); + ~ScreenPanelGL(); + +protected: + void initializeGL() override; + + void paintGL() override; + + void resizeEvent(QResizeEvent* event) override; + void resizeGL(int w, int h) override; + + void mousePressEvent(QMouseEvent* event) override; + void mouseReleaseEvent(QMouseEvent* event) override; + void mouseMoveEvent(QMouseEvent* event) override; + +private slots: + void onScreenLayoutChanged(); + +private: + void setupScreenLayout(); + + QOpenGLShaderProgram* screenShader; + GLuint screenVertexBuffer; + GLuint screenVertexArray; + GLuint screenTexture; }; @@ -81,8 +171,20 @@ public: explicit MainWindow(QWidget* parent = nullptr); ~MainWindow(); + bool hasOGL; + QOpenGLContext* getOGLContext(); + protected: + void resizeEvent(QResizeEvent* event) override; + void keyPressEvent(QKeyEvent* event) override; + void keyReleaseEvent(QKeyEvent* event) override; + + void dragEnterEvent(QDragEnterEvent* event) override; + void dropEvent(QDropEvent* event) override; + +signals: + void screenLayoutChange(); private slots: void onOpenFile(); @@ -96,15 +198,40 @@ private slots: void onReset(); void onStop(); + void onOpenEmuSettings(); + void onOpenInputConfig(); + void onInputConfigFinished(int res); + void onOpenVideoSettings(); + void onOpenAudioSettings(); + void onAudioSettingsFinished(int res); + void onOpenWifiSettings(); + void onWifiSettingsFinished(int res); + void onChangeSavestateSRAMReloc(bool checked); + void onChangeScreenSize(); + void onChangeScreenRotation(QAction* act); + void onChangeScreenGap(QAction* act); + void onChangeScreenLayout(QAction* act); + void onChangeScreenSizing(QAction* act); + void onChangeIntegerScaling(bool checked); + void onChangeScreenFiltering(bool checked); + void onChangeShowOSD(bool checked); + void onChangeLimitFramerate(bool checked); + void onChangeAudioSync(bool checked); + void onTitleUpdate(QString title); void onEmuStart(); void onEmuStop(); - void onEmuPause(); - void onEmuUnpause(); + + void onUpdateVideoSettings(bool glchange); private: - MainWindowPanel* panel; + void createScreenPanel(); + + QString loadErrorStr(int error); + +public: + QWidget* panel; QAction* actOpenROM; QAction* actBootFirmware; @@ -116,6 +243,27 @@ private: QAction* actPause; QAction* actReset; QAction* actStop; + + QAction* actEmuSettings; + QAction* actInputConfig; + QAction* actVideoSettings; + QAction* actAudioSettings; + QAction* actWifiSettings; + QAction* actSavestateSRAMReloc; + QAction* actScreenSize[4]; + QActionGroup* grpScreenRotation; + QAction* actScreenRotation[4]; + QActionGroup* grpScreenGap; + QAction* actScreenGap[6]; + QActionGroup* grpScreenLayout; + QAction* actScreenLayout[3]; + QActionGroup* grpScreenSizing; + QAction* actScreenSizing[4]; + QAction* actIntegerScaling; + QAction* actScreenFiltering; + QAction* actShowOSD; + QAction* actLimitFramerate; + QAction* actAudioSync; }; #endif // MAIN_H diff --git a/src/frontend/qt_sdl/main_shaders.h b/src/frontend/qt_sdl/main_shaders.h new file mode 100644 index 0000000..c55f79e --- /dev/null +++ b/src/frontend/qt_sdl/main_shaders.h @@ -0,0 +1,64 @@ +/* + Copyright 2016-2020 Arisotura + + This file is part of melonDS. + + melonDS is free software: you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + melonDS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with melonDS. If not, see http://www.gnu.org/licenses/. +*/ + +#ifndef MAIN_SHADERS_H +#define MAIN_SHADERS_H + +const char* kScreenVS = R"(#version 140 + +uniform vec2 uScreenSize; +uniform mat2x3 uTransform; + +in vec2 vPosition; +in vec2 vTexcoord; + +smooth out vec2 fTexcoord; + +void main() +{ + vec4 fpos; + + fpos.xy = vec3(vPosition, 1.0) * uTransform; + + fpos.xy = ((fpos.xy * 2.0) / uScreenSize) - 1.0; + fpos.y *= -1; + fpos.z = 0.0; + fpos.w = 1.0; + + gl_Position = fpos; + fTexcoord = vTexcoord; +} +)"; + +const char* kScreenFS = R"(#version 140 + +uniform sampler2D ScreenTex; + +smooth in vec2 fTexcoord; + +out vec4 oColor; + +void main() +{ + vec4 pixel = texture(ScreenTex, fTexcoord); + + oColor = vec4(pixel.bgr, 1.0); +} +)"; + +#endif // MAIN_SHADERS_H diff --git a/src/pcap/bluetooth.h b/src/frontend/qt_sdl/pcap/bluetooth.h index 15dc5a8..15dc5a8 100644 --- a/src/pcap/bluetooth.h +++ b/src/frontend/qt_sdl/pcap/bluetooth.h diff --git a/src/pcap/bpf.h b/src/frontend/qt_sdl/pcap/bpf.h index 1a953a9..1a953a9 100644 --- a/src/pcap/bpf.h +++ b/src/frontend/qt_sdl/pcap/bpf.h diff --git a/src/pcap/can_socketcan.h b/src/frontend/qt_sdl/pcap/can_socketcan.h index 332d9ff..332d9ff 100644 --- a/src/pcap/can_socketcan.h +++ b/src/frontend/qt_sdl/pcap/can_socketcan.h diff --git a/src/pcap/compiler-tests.h b/src/frontend/qt_sdl/pcap/compiler-tests.h index 8876c67..8876c67 100644 --- a/src/pcap/compiler-tests.h +++ b/src/frontend/qt_sdl/pcap/compiler-tests.h diff --git a/src/pcap/dlt.h b/src/frontend/qt_sdl/pcap/dlt.h index 609bcaf..609bcaf 100644 --- a/src/pcap/dlt.h +++ b/src/frontend/qt_sdl/pcap/dlt.h diff --git a/src/pcap/funcattrs.h b/src/frontend/qt_sdl/pcap/funcattrs.h index d1cc2bf..d1cc2bf 100644 --- a/src/pcap/funcattrs.h +++ b/src/frontend/qt_sdl/pcap/funcattrs.h diff --git a/src/pcap/ipnet.h b/src/frontend/qt_sdl/pcap/ipnet.h index 5330847..5330847 100644 --- a/src/pcap/ipnet.h +++ b/src/frontend/qt_sdl/pcap/ipnet.h diff --git a/src/pcap/namedb.h b/src/frontend/qt_sdl/pcap/namedb.h index 73fb40a..73fb40a 100644 --- a/src/pcap/namedb.h +++ b/src/frontend/qt_sdl/pcap/namedb.h diff --git a/src/pcap/nflog.h b/src/frontend/qt_sdl/pcap/nflog.h index 29a71d2..29a71d2 100644 --- a/src/pcap/nflog.h +++ b/src/frontend/qt_sdl/pcap/nflog.h diff --git a/src/pcap/pcap-inttypes.h b/src/frontend/qt_sdl/pcap/pcap-inttypes.h index af2c23c..af2c23c 100644 --- a/src/pcap/pcap-inttypes.h +++ b/src/frontend/qt_sdl/pcap/pcap-inttypes.h diff --git a/src/pcap/pcap.h b/src/frontend/qt_sdl/pcap/pcap.h index d32e2a9..d32e2a9 100644 --- a/src/pcap/pcap.h +++ b/src/frontend/qt_sdl/pcap/pcap.h diff --git a/src/pcap/sll.h b/src/frontend/qt_sdl/pcap/sll.h index c4d0886..c4d0886 100644 --- a/src/pcap/sll.h +++ b/src/frontend/qt_sdl/pcap/sll.h diff --git a/src/pcap/usb.h b/src/frontend/qt_sdl/pcap/usb.h index e485ec8..e485ec8 100644 --- a/src/pcap/usb.h +++ b/src/frontend/qt_sdl/pcap/usb.h diff --git a/src/pcap/vlan.h b/src/frontend/qt_sdl/pcap/vlan.h index b29dd73..b29dd73 100644 --- a/src/pcap/vlan.h +++ b/src/frontend/qt_sdl/pcap/vlan.h diff --git a/src/sha1/sha1.c b/src/sha1/sha1.c new file mode 100644 index 0000000..3729550 --- /dev/null +++ b/src/sha1/sha1.c @@ -0,0 +1,277 @@ + +/* from valgrind tests */ + +/* ================ sha1.c ================ */ +/* +SHA-1 in C +By Steve Reid <steve@edmweb.com> +100% Public Domain + +Test Vectors (from FIPS PUB 180-1) +"abc" + A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D +"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" + 84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1 +A million repetitions of "a" + 34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F +*/ + +/* #define LITTLE_ENDIAN * This should be #define'd already, if true. */ +/* #define SHA1HANDSOFF * Copies data before messing with it. */ + +#define SHA1HANDSOFF + +#include <stdio.h> +#include <string.h> +#include <sys/types.h> /* for u_int*_t */ +#if defined(__sun) +#include "solarisfixes.h" +#endif +#include "sha1.h" + +#ifndef BYTE_ORDER +#if (BSD >= 199103) +# include <machine/endian.h> +#else +#if defined(linux) || defined(__linux__) +# include <endian.h> +#else +#define LITTLE_ENDIAN 1234 /* least-significant byte first (vax, pc) */ +#define BIG_ENDIAN 4321 /* most-significant byte first (IBM, net) */ +#define PDP_ENDIAN 3412 /* LSB first in word, MSW first in long (pdp)*/ + +#if defined(vax) || defined(ns32000) || defined(sun386) || defined(__i386__) || \ + defined(MIPSEL) || defined(_MIPSEL) || defined(BIT_ZERO_ON_RIGHT) || \ + defined(__alpha__) || defined(__alpha) || \ + defined(__WIN32__) +#define BYTE_ORDER LITTLE_ENDIAN +#endif + +#if defined(sel) || defined(pyr) || defined(mc68000) || defined(sparc) || \ + defined(is68k) || defined(tahoe) || defined(ibm032) || defined(ibm370) || \ + defined(MIPSEB) || defined(_MIPSEB) || defined(_IBMR2) || defined(DGUX) ||\ + defined(apollo) || defined(__convex__) || defined(_CRAY) || \ + defined(__hppa) || defined(__hp9000) || \ + defined(__hp9000s300) || defined(__hp9000s700) || \ + defined (BIT_ZERO_ON_LEFT) || defined(m68k) || defined(__sparc) +#define BYTE_ORDER BIG_ENDIAN +#endif +#endif /* linux */ +#endif /* BSD */ +#endif /* BYTE_ORDER */ + +#if defined(__BYTE_ORDER) && !defined(BYTE_ORDER) +#if (__BYTE_ORDER == __LITTLE_ENDIAN) +#define BYTE_ORDER LITTLE_ENDIAN +#else +#define BYTE_ORDER BIG_ENDIAN +#endif +#endif + +#if !defined(BYTE_ORDER) || \ + (BYTE_ORDER != BIG_ENDIAN && BYTE_ORDER != LITTLE_ENDIAN && \ + BYTE_ORDER != PDP_ENDIAN) + /* you must determine what the correct bit order is for + * your compiler - the next line is an intentional error + * which will force your compiles to bomb until you fix + * the above macros. + */ +#error "Undefined or invalid BYTE_ORDER" +#endif + +#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits)))) + +/* blk0() and blk() perform the initial expand. */ +/* I got the idea of expanding during the round function from SSLeay */ +#if BYTE_ORDER == LITTLE_ENDIAN +#define blk0(i) (block->l[i] = (rol(block->l[i],24)&0xFF00FF00) \ + |(rol(block->l[i],8)&0x00FF00FF)) +#elif BYTE_ORDER == BIG_ENDIAN +#define blk0(i) block->l[i] +#else +#error "Endianness not defined!" +#endif +#define blk(i) (block->l[i&15] = rol(block->l[(i+13)&15]^block->l[(i+8)&15] \ + ^block->l[(i+2)&15]^block->l[i&15],1)) + +/* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */ +#define R0(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk0(i)+0x5A827999+rol(v,5);w=rol(w,30); +#define R1(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk(i)+0x5A827999+rol(v,5);w=rol(w,30); +#define R2(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0x6ED9EBA1+rol(v,5);w=rol(w,30); +#define R3(v,w,x,y,z,i) z+=(((w|x)&y)|(w&x))+blk(i)+0x8F1BBCDC+rol(v,5);w=rol(w,30); +#define R4(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0xCA62C1D6+rol(v,5);w=rol(w,30); + + +/* Hash a single 512-bit block. This is the core of the algorithm. */ + +void SHA1Transform(uint32_t state[5], const unsigned char buffer[64]) +{ +uint32_t a, b, c, d, e; +typedef union { + unsigned char c[64]; + uint32_t l[16]; +} CHAR64LONG16; +#ifdef SHA1HANDSOFF +CHAR64LONG16 block[1]; /* use array to appear as a pointer */ + memcpy(block, buffer, 64); +#else + /* The following had better never be used because it causes the + * pointer-to-const buffer to be cast into a pointer to non-const. + * And the result is written through. I threw a "const" in, hoping + * this will cause a diagnostic. + */ +CHAR64LONG16* block = (const CHAR64LONG16*)buffer; +#endif + /* Copy context->state[] to working vars */ + a = state[0]; + b = state[1]; + c = state[2]; + d = state[3]; + e = state[4]; + /* 4 rounds of 20 operations each. Loop unrolled. */ + R0(a,b,c,d,e, 0); R0(e,a,b,c,d, 1); R0(d,e,a,b,c, 2); R0(c,d,e,a,b, 3); + R0(b,c,d,e,a, 4); R0(a,b,c,d,e, 5); R0(e,a,b,c,d, 6); R0(d,e,a,b,c, 7); + R0(c,d,e,a,b, 8); R0(b,c,d,e,a, 9); R0(a,b,c,d,e,10); R0(e,a,b,c,d,11); + R0(d,e,a,b,c,12); R0(c,d,e,a,b,13); R0(b,c,d,e,a,14); R0(a,b,c,d,e,15); + R1(e,a,b,c,d,16); R1(d,e,a,b,c,17); R1(c,d,e,a,b,18); R1(b,c,d,e,a,19); + R2(a,b,c,d,e,20); R2(e,a,b,c,d,21); R2(d,e,a,b,c,22); R2(c,d,e,a,b,23); + R2(b,c,d,e,a,24); R2(a,b,c,d,e,25); R2(e,a,b,c,d,26); R2(d,e,a,b,c,27); + R2(c,d,e,a,b,28); R2(b,c,d,e,a,29); R2(a,b,c,d,e,30); R2(e,a,b,c,d,31); + R2(d,e,a,b,c,32); R2(c,d,e,a,b,33); R2(b,c,d,e,a,34); R2(a,b,c,d,e,35); + R2(e,a,b,c,d,36); R2(d,e,a,b,c,37); R2(c,d,e,a,b,38); R2(b,c,d,e,a,39); + R3(a,b,c,d,e,40); R3(e,a,b,c,d,41); R3(d,e,a,b,c,42); R3(c,d,e,a,b,43); + R3(b,c,d,e,a,44); R3(a,b,c,d,e,45); R3(e,a,b,c,d,46); R3(d,e,a,b,c,47); + R3(c,d,e,a,b,48); R3(b,c,d,e,a,49); R3(a,b,c,d,e,50); R3(e,a,b,c,d,51); + R3(d,e,a,b,c,52); R3(c,d,e,a,b,53); R3(b,c,d,e,a,54); R3(a,b,c,d,e,55); + R3(e,a,b,c,d,56); R3(d,e,a,b,c,57); R3(c,d,e,a,b,58); R3(b,c,d,e,a,59); + R4(a,b,c,d,e,60); R4(e,a,b,c,d,61); R4(d,e,a,b,c,62); R4(c,d,e,a,b,63); + R4(b,c,d,e,a,64); R4(a,b,c,d,e,65); R4(e,a,b,c,d,66); R4(d,e,a,b,c,67); + R4(c,d,e,a,b,68); R4(b,c,d,e,a,69); R4(a,b,c,d,e,70); R4(e,a,b,c,d,71); + R4(d,e,a,b,c,72); R4(c,d,e,a,b,73); R4(b,c,d,e,a,74); R4(a,b,c,d,e,75); + R4(e,a,b,c,d,76); R4(d,e,a,b,c,77); R4(c,d,e,a,b,78); R4(b,c,d,e,a,79); + /* Add the working vars back into context.state[] */ + state[0] += a; + state[1] += b; + state[2] += c; + state[3] += d; + state[4] += e; + /* Wipe variables */ + a = b = c = d = e = 0; +#ifdef SHA1HANDSOFF + memset(block, '\0', sizeof(block)); +#endif +} + + +/* SHA1Init - Initialize new context */ + +void SHA1Init(SHA1_CTX* context) +{ + /* SHA1 initialization constants */ + context->state[0] = 0x67452301; + context->state[1] = 0xEFCDAB89; + context->state[2] = 0x98BADCFE; + context->state[3] = 0x10325476; + context->state[4] = 0xC3D2E1F0; + context->count[0] = context->count[1] = 0; +} + + +/* Run your data through this. */ + +void SHA1Update(SHA1_CTX* context, const unsigned char* data, uint32_t len) +{ +uint32_t i; +uint32_t j; + + j = context->count[0]; + if ((context->count[0] += len << 3) < j) + context->count[1]++; + context->count[1] += (len>>29); + j = (j >> 3) & 63; + if ((j + len) > 63) { + memcpy(&context->buffer[j], data, (i = 64-j)); + SHA1Transform(context->state, context->buffer); + for ( ; i + 63 < len; i += 64) { + SHA1Transform(context->state, &data[i]); + } + j = 0; + } + else i = 0; + memcpy(&context->buffer[j], &data[i], len - i); +} + + +/* Add padding and return the message digest. */ + +void SHA1Final(unsigned char digest[20], SHA1_CTX* context) +{ +unsigned i; +unsigned char finalcount[8]; +unsigned char c; + +#if 0 /* untested "improvement" by DHR */ + /* Convert context->count to a sequence of bytes + * in finalcount. Second element first, but + * big-endian order within element. + * But we do it all backwards. + */ + unsigned char *fcp = &finalcount[8]; + + for (i = 0; i < 2; i++) + { + uint32_t t = context->count[i]; + int j; + + for (j = 0; j < 4; t >>= 8, j++) + *--fcp = (unsigned char) t + } +#else + for (i = 0; i < 8; i++) { + finalcount[i] = (unsigned char)((context->count[(i >= 4 ? 0 : 1)] + >> ((3-(i & 3)) * 8) ) & 255); /* Endian independent */ + } +#endif + c = 0200; + SHA1Update(context, &c, 1); + while ((context->count[0] & 504) != 448) { + c = 0000; + SHA1Update(context, &c, 1); + } + SHA1Update(context, finalcount, 8); /* Should cause a SHA1Transform() */ + for (i = 0; i < 20; i++) { + digest[i] = (unsigned char) + ((context->state[i>>2] >> ((3-(i & 3)) * 8) ) & 255); + } + /* Wipe variables */ + memset(context, '\0', sizeof(*context)); + memset(&finalcount, '\0', sizeof(finalcount)); +} +/* ================ end of sha1.c ================ */ + +#if 0 +#define BUFSIZE 4096 + +int +main(int argc, char **argv) +{ + SHA1_CTX ctx; + unsigned char hash[20], buf[BUFSIZE]; + int i; + + for(i=0;i<BUFSIZE;i++) + buf[i] = i; + + SHA1Init(&ctx); + for(i=0;i<1000;i++) + SHA1Update(&ctx, buf, BUFSIZE); + SHA1Final(hash, &ctx); + + printf("SHA1="); + for(i=0;i<20;i++) + printf("%02x", hash[i]); + printf("\n"); + return 0; +} + +#endif diff --git a/src/sha1/sha1.h b/src/sha1/sha1.h new file mode 100644 index 0000000..56ffa56 --- /dev/null +++ b/src/sha1/sha1.h @@ -0,0 +1,19 @@ +/* ================ sha1.h ================ */ +/* +SHA-1 in C +By Steve Reid <steve@edmweb.com> +100% Public Domain +*/ + +#include <stdint.h> + +typedef struct { + uint32_t state[5]; + uint32_t count[2]; + unsigned char buffer[64]; +} SHA1_CTX; + +void SHA1Transform(uint32_t state[5], const unsigned char buffer[64]); +void SHA1Init(SHA1_CTX* context); +void SHA1Update(SHA1_CTX* context, const unsigned char* data, uint32_t len); +void SHA1Final(unsigned char digest[20], SHA1_CTX* context); diff --git a/src/tiny-AES-c/README.md b/src/tiny-AES-c/README.md new file mode 100644 index 0000000..e32e25e --- /dev/null +++ b/src/tiny-AES-c/README.md @@ -0,0 +1,80 @@ +### Tiny AES in C + +This is a small and portable implementation of the AES [ECB](https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Electronic_Codebook_.28ECB.29), [CTR](https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Counter_.28CTR.29) and [CBC](https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Cipher_Block_Chaining_.28CBC.29) encryption algorithms written in C. + +You can override the default key-size of 128 bit with 192 or 256 bit by defining the symbols AES192 or AES256 in `aes.h`. + +The API is very simple and looks like this (I am using C99 `<stdint.h>`-style annotated types): + +```C +/* Initialize context calling one of: */ +void AES_init_ctx(struct AES_ctx* ctx, const uint8_t* key); +void AES_init_ctx_iv(struct AES_ctx* ctx, const uint8_t* key, const uint8_t* iv); + +/* ... or reset IV at random point: */ +void AES_ctx_set_iv(struct AES_ctx* ctx, const uint8_t* iv); + +/* Then start encrypting and decrypting with the functions below: */ +void AES_ECB_encrypt(const struct AES_ctx* ctx, uint8_t* buf); +void AES_ECB_decrypt(const struct AES_ctx* ctx, uint8_t* buf); + +void AES_CBC_encrypt_buffer(struct AES_ctx* ctx, uint8_t* buf, uint32_t length); +void AES_CBC_decrypt_buffer(struct AES_ctx* ctx, uint8_t* buf, uint32_t length); + +/* Same function for encrypting as for decrypting in CTR mode */ +void AES_CTR_xcrypt_buffer(struct AES_ctx* ctx, uint8_t* buf, uint32_t length); +``` + +Note: + * No padding is provided so for CBC and ECB all buffers should be multiples of 16 bytes. For padding [PKCS7](https://en.wikipedia.org/wiki/Padding_(cryptography)#PKCS7) is recommendable. + * ECB mode is considered unsafe for most uses and is not implemented in streaming mode. If you need this mode, call the function for every block of 16 bytes you need encrypted. See [wikipedia's article on ECB](https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Electronic_Codebook_(ECB)) for more details. + +You can choose to use any or all of the modes-of-operations, by defining the symbols CBC, CTR or ECB. See the header file for clarification. + +C++ users should `#include` [aes.hpp](https://github.com/kokke/tiny-AES-c/blob/master/aes.hpp) instead of [aes.h](https://github.com/kokke/tiny-AES-c/blob/master/aes.h) + +There is no built-in error checking or protection from out-of-bounds memory access errors as a result of malicious input. + +The module uses less than 200 bytes of RAM and 1-2K ROM when compiled for ARM, but YMMV depending on which modes are enabled. + +It is one of the smallest implementations in C I've seen yet, but do contact me if you know of something smaller (or have improvements to the code here). + +I've successfully used the code on 64bit x86, 32bit ARM and 8 bit AVR platforms. + + +GCC size output when only CTR mode is compiled for ARM: + + $ arm-none-eabi-gcc -Os -DCBC=0 -DECB=0 -DCTR=1 -c aes.c + $ size aes.o + text data bss dec hex filename + 1343 0 0 1343 53f aes.o + +.. and when compiling for the THUMB instruction set, we end up just below 1K in code size. + + $ arm-none-eabi-gcc -Os -mthumb -DCBC=0 -DECB=0 -DCTR=1 -c aes.c + $ size aes.o + text data bss dec hex filename + 979 0 0 979 3d3 aes.o + + +I am using the Free Software Foundation, ARM GCC compiler: + + $ arm-none-eabi-gcc --version + arm-none-eabi-gcc (GNU Tools for Arm Embedded Processors 8-2018-q4-major) 8.2.1 20181213 (release) + Copyright (C) 2018 Free Software Foundation, Inc. + This is free software; see the source for copying conditions. There is NO + warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + + +This implementation is verified against the data in: + +[National Institute of Standards and Technology Special Publication 800-38A 2001 ED](http://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38a.pdf) Appendix F: Example Vectors for Modes of Operation of the AES. + +The other appendices in the document are valuable for implementation details on e.g. padding, generation of IVs and nonces in CTR-mode etc. + + +A heartfelt thank-you to all the nice people out there who have contributed to this project. + + +All material in this repository is in the public domain. diff --git a/src/tiny-AES-c/aes.c b/src/tiny-AES-c/aes.c new file mode 100644 index 0000000..313ff71 --- /dev/null +++ b/src/tiny-AES-c/aes.c @@ -0,0 +1,572 @@ +/* + +This is an implementation of the AES algorithm, specifically ECB, CTR and CBC mode. +Block size can be chosen in aes.h - available choices are AES128, AES192, AES256. + +The implementation is verified against the test vectors in: + National Institute of Standards and Technology Special Publication 800-38A 2001 ED + +ECB-AES128 +---------- + + plain-text: + 6bc1bee22e409f96e93d7e117393172a + ae2d8a571e03ac9c9eb76fac45af8e51 + 30c81c46a35ce411e5fbc1191a0a52ef + f69f2445df4f9b17ad2b417be66c3710 + + key: + 2b7e151628aed2a6abf7158809cf4f3c + + resulting cipher + 3ad77bb40d7a3660a89ecaf32466ef97 + f5d3d58503b9699de785895a96fdbaaf + 43b1cd7f598ece23881b00e3ed030688 + 7b0c785e27e8ad3f8223207104725dd4 + + +NOTE: String length must be evenly divisible by 16byte (str_len % 16 == 0) + You should pad the end of the string with zeros if this is not the case. + For AES192/256 the key size is proportionally larger. + +*/ + + +/*****************************************************************************/ +/* Includes: */ +/*****************************************************************************/ +#include <stdint.h> +#include <string.h> // CBC mode, for memset +#include "aes.h" + +/*****************************************************************************/ +/* Defines: */ +/*****************************************************************************/ +// The number of columns comprising a state in AES. This is a constant in AES. Value=4 +#define Nb 4 + +#if defined(AES256) && (AES256 == 1) + #define Nk 8 + #define Nr 14 +#elif defined(AES192) && (AES192 == 1) + #define Nk 6 + #define Nr 12 +#else + #define Nk 4 // The number of 32 bit words in a key. + #define Nr 10 // The number of rounds in AES Cipher. +#endif + +// jcallan@github points out that declaring Multiply as a function +// reduces code size considerably with the Keil ARM compiler. +// See this link for more information: https://github.com/kokke/tiny-AES-C/pull/3 +#ifndef MULTIPLY_AS_A_FUNCTION + #define MULTIPLY_AS_A_FUNCTION 0 +#endif + + + + +/*****************************************************************************/ +/* Private variables: */ +/*****************************************************************************/ +// state - array holding the intermediate results during decryption. +typedef uint8_t state_t[4][4]; + + + +// The lookup-tables are marked const so they can be placed in read-only storage instead of RAM +// The numbers below can be computed dynamically trading ROM for RAM - +// This can be useful in (embedded) bootloader applications, where ROM is often limited. +static const uint8_t sbox[256] = { + //0 1 2 3 4 5 6 7 8 9 A B C D E F + 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, + 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, + 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, + 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, + 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, + 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, + 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, + 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, + 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, + 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, + 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, + 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, + 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, + 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, + 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, + 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 }; + +static const uint8_t rsbox[256] = { + 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, + 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, + 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, + 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, + 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, + 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, + 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, + 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, + 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, + 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, + 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, + 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, + 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, + 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, + 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, + 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d }; + +// The round constant word array, Rcon[i], contains the values given by +// x to the power (i-1) being powers of x (x is denoted as {02}) in the field GF(2^8) +static const uint8_t Rcon[11] = { + 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36 }; + +/* + * Jordan Goulder points out in PR #12 (https://github.com/kokke/tiny-AES-C/pull/12), + * that you can remove most of the elements in the Rcon array, because they are unused. + * + * From Wikipedia's article on the Rijndael key schedule @ https://en.wikipedia.org/wiki/Rijndael_key_schedule#Rcon + * + * "Only the first some of these constants are actually used – up to rcon[10] for AES-128 (as 11 round keys are needed), + * up to rcon[8] for AES-192, up to rcon[7] for AES-256. rcon[0] is not used in AES algorithm." + */ + + +/*****************************************************************************/ +/* Private functions: */ +/*****************************************************************************/ +/* +static uint8_t getSBoxValue(uint8_t num) +{ + return sbox[num]; +} +*/ +#define getSBoxValue(num) (sbox[(num)]) +/* +static uint8_t getSBoxInvert(uint8_t num) +{ + return rsbox[num]; +} +*/ +#define getSBoxInvert(num) (rsbox[(num)]) + +// This function produces Nb(Nr+1) round keys. The round keys are used in each round to decrypt the states. +static void KeyExpansion(uint8_t* RoundKey, const uint8_t* Key) +{ + unsigned i, j, k; + uint8_t tempa[4]; // Used for the column/row operations + + // The first round key is the key itself. + for (i = 0; i < Nk; ++i) + { + RoundKey[(i * 4) + 0] = Key[(i * 4) + 0]; + RoundKey[(i * 4) + 1] = Key[(i * 4) + 1]; + RoundKey[(i * 4) + 2] = Key[(i * 4) + 2]; + RoundKey[(i * 4) + 3] = Key[(i * 4) + 3]; + } + + // All other round keys are found from the previous round keys. + for (i = Nk; i < Nb * (Nr + 1); ++i) + { + { + k = (i - 1) * 4; + tempa[0]=RoundKey[k + 0]; + tempa[1]=RoundKey[k + 1]; + tempa[2]=RoundKey[k + 2]; + tempa[3]=RoundKey[k + 3]; + + } + + if (i % Nk == 0) + { + // This function shifts the 4 bytes in a word to the left once. + // [a0,a1,a2,a3] becomes [a1,a2,a3,a0] + + // Function RotWord() + { + const uint8_t u8tmp = tempa[0]; + tempa[0] = tempa[1]; + tempa[1] = tempa[2]; + tempa[2] = tempa[3]; + tempa[3] = u8tmp; + } + + // SubWord() is a function that takes a four-byte input word and + // applies the S-box to each of the four bytes to produce an output word. + + // Function Subword() + { + tempa[0] = getSBoxValue(tempa[0]); + tempa[1] = getSBoxValue(tempa[1]); + tempa[2] = getSBoxValue(tempa[2]); + tempa[3] = getSBoxValue(tempa[3]); + } + + tempa[0] = tempa[0] ^ Rcon[i/Nk]; + } +#if defined(AES256) && (AES256 == 1) + if (i % Nk == 4) + { + // Function Subword() + { + tempa[0] = getSBoxValue(tempa[0]); + tempa[1] = getSBoxValue(tempa[1]); + tempa[2] = getSBoxValue(tempa[2]); + tempa[3] = getSBoxValue(tempa[3]); + } + } +#endif + j = i * 4; k=(i - Nk) * 4; + RoundKey[j + 0] = RoundKey[k + 0] ^ tempa[0]; + RoundKey[j + 1] = RoundKey[k + 1] ^ tempa[1]; + RoundKey[j + 2] = RoundKey[k + 2] ^ tempa[2]; + RoundKey[j + 3] = RoundKey[k + 3] ^ tempa[3]; + } +} + +void AES_init_ctx(struct AES_ctx* ctx, const uint8_t* key) +{ + KeyExpansion(ctx->RoundKey, key); +} +#if (defined(CBC) && (CBC == 1)) || (defined(CTR) && (CTR == 1)) +void AES_init_ctx_iv(struct AES_ctx* ctx, const uint8_t* key, const uint8_t* iv) +{ + KeyExpansion(ctx->RoundKey, key); + memcpy (ctx->Iv, iv, AES_BLOCKLEN); +} +void AES_ctx_set_iv(struct AES_ctx* ctx, const uint8_t* iv) +{ + memcpy (ctx->Iv, iv, AES_BLOCKLEN); +} +#endif + +// This function adds the round key to state. +// The round key is added to the state by an XOR function. +static void AddRoundKey(uint8_t round, state_t* state, const uint8_t* RoundKey) +{ + uint8_t i,j; + for (i = 0; i < 4; ++i) + { + for (j = 0; j < 4; ++j) + { + (*state)[i][j] ^= RoundKey[(round * Nb * 4) + (i * Nb) + j]; + } + } +} + +// The SubBytes Function Substitutes the values in the +// state matrix with values in an S-box. +static void SubBytes(state_t* state) +{ + uint8_t i, j; + for (i = 0; i < 4; ++i) + { + for (j = 0; j < 4; ++j) + { + (*state)[j][i] = getSBoxValue((*state)[j][i]); + } + } +} + +// The ShiftRows() function shifts the rows in the state to the left. +// Each row is shifted with different offset. +// Offset = Row number. So the first row is not shifted. +static void ShiftRows(state_t* state) +{ + uint8_t temp; + + // Rotate first row 1 columns to left + temp = (*state)[0][1]; + (*state)[0][1] = (*state)[1][1]; + (*state)[1][1] = (*state)[2][1]; + (*state)[2][1] = (*state)[3][1]; + (*state)[3][1] = temp; + + // Rotate second row 2 columns to left + temp = (*state)[0][2]; + (*state)[0][2] = (*state)[2][2]; + (*state)[2][2] = temp; + + temp = (*state)[1][2]; + (*state)[1][2] = (*state)[3][2]; + (*state)[3][2] = temp; + + // Rotate third row 3 columns to left + temp = (*state)[0][3]; + (*state)[0][3] = (*state)[3][3]; + (*state)[3][3] = (*state)[2][3]; + (*state)[2][3] = (*state)[1][3]; + (*state)[1][3] = temp; +} + +static uint8_t xtime(uint8_t x) +{ + return ((x<<1) ^ (((x>>7) & 1) * 0x1b)); +} + +// MixColumns function mixes the columns of the state matrix +static void MixColumns(state_t* state) +{ + uint8_t i; + uint8_t Tmp, Tm, t; + for (i = 0; i < 4; ++i) + { + t = (*state)[i][0]; + Tmp = (*state)[i][0] ^ (*state)[i][1] ^ (*state)[i][2] ^ (*state)[i][3] ; + Tm = (*state)[i][0] ^ (*state)[i][1] ; Tm = xtime(Tm); (*state)[i][0] ^= Tm ^ Tmp ; + Tm = (*state)[i][1] ^ (*state)[i][2] ; Tm = xtime(Tm); (*state)[i][1] ^= Tm ^ Tmp ; + Tm = (*state)[i][2] ^ (*state)[i][3] ; Tm = xtime(Tm); (*state)[i][2] ^= Tm ^ Tmp ; + Tm = (*state)[i][3] ^ t ; Tm = xtime(Tm); (*state)[i][3] ^= Tm ^ Tmp ; + } +} + +// Multiply is used to multiply numbers in the field GF(2^8) +// Note: The last call to xtime() is unneeded, but often ends up generating a smaller binary +// The compiler seems to be able to vectorize the operation better this way. +// See https://github.com/kokke/tiny-AES-c/pull/34 +#if MULTIPLY_AS_A_FUNCTION +static uint8_t Multiply(uint8_t x, uint8_t y) +{ + return (((y & 1) * x) ^ + ((y>>1 & 1) * xtime(x)) ^ + ((y>>2 & 1) * xtime(xtime(x))) ^ + ((y>>3 & 1) * xtime(xtime(xtime(x)))) ^ + ((y>>4 & 1) * xtime(xtime(xtime(xtime(x)))))); /* this last call to xtime() can be omitted */ + } +#else +#define Multiply(x, y) \ + ( ((y & 1) * x) ^ \ + ((y>>1 & 1) * xtime(x)) ^ \ + ((y>>2 & 1) * xtime(xtime(x))) ^ \ + ((y>>3 & 1) * xtime(xtime(xtime(x)))) ^ \ + ((y>>4 & 1) * xtime(xtime(xtime(xtime(x)))))) \ + +#endif + +#if (defined(CBC) && CBC == 1) || (defined(ECB) && ECB == 1) +// MixColumns function mixes the columns of the state matrix. +// The method used to multiply may be difficult to understand for the inexperienced. +// Please use the references to gain more information. +static void InvMixColumns(state_t* state) +{ + int i; + uint8_t a, b, c, d; + for (i = 0; i < 4; ++i) + { + a = (*state)[i][0]; + b = (*state)[i][1]; + c = (*state)[i][2]; + d = (*state)[i][3]; + + (*state)[i][0] = Multiply(a, 0x0e) ^ Multiply(b, 0x0b) ^ Multiply(c, 0x0d) ^ Multiply(d, 0x09); + (*state)[i][1] = Multiply(a, 0x09) ^ Multiply(b, 0x0e) ^ Multiply(c, 0x0b) ^ Multiply(d, 0x0d); + (*state)[i][2] = Multiply(a, 0x0d) ^ Multiply(b, 0x09) ^ Multiply(c, 0x0e) ^ Multiply(d, 0x0b); + (*state)[i][3] = Multiply(a, 0x0b) ^ Multiply(b, 0x0d) ^ Multiply(c, 0x09) ^ Multiply(d, 0x0e); + } +} + + +// The SubBytes Function Substitutes the values in the +// state matrix with values in an S-box. +static void InvSubBytes(state_t* state) +{ + uint8_t i, j; + for (i = 0; i < 4; ++i) + { + for (j = 0; j < 4; ++j) + { + (*state)[j][i] = getSBoxInvert((*state)[j][i]); + } + } +} + +static void InvShiftRows(state_t* state) +{ + uint8_t temp; + + // Rotate first row 1 columns to right + temp = (*state)[3][1]; + (*state)[3][1] = (*state)[2][1]; + (*state)[2][1] = (*state)[1][1]; + (*state)[1][1] = (*state)[0][1]; + (*state)[0][1] = temp; + + // Rotate second row 2 columns to right + temp = (*state)[0][2]; + (*state)[0][2] = (*state)[2][2]; + (*state)[2][2] = temp; + + temp = (*state)[1][2]; + (*state)[1][2] = (*state)[3][2]; + (*state)[3][2] = temp; + + // Rotate third row 3 columns to right + temp = (*state)[0][3]; + (*state)[0][3] = (*state)[1][3]; + (*state)[1][3] = (*state)[2][3]; + (*state)[2][3] = (*state)[3][3]; + (*state)[3][3] = temp; +} +#endif // #if (defined(CBC) && CBC == 1) || (defined(ECB) && ECB == 1) + +// Cipher is the main function that encrypts the PlainText. +static void Cipher(state_t* state, const uint8_t* RoundKey) +{ + uint8_t round = 0; + + // Add the First round key to the state before starting the rounds. + AddRoundKey(0, state, RoundKey); + + // There will be Nr rounds. + // The first Nr-1 rounds are identical. + // These Nr-1 rounds are executed in the loop below. + for (round = 1; round < Nr; ++round) + { + SubBytes(state); + ShiftRows(state); + MixColumns(state); + AddRoundKey(round, state, RoundKey); + } + + // The last round is given below. + // The MixColumns function is not here in the last round. + SubBytes(state); + ShiftRows(state); + AddRoundKey(Nr, state, RoundKey); +} + +#if (defined(CBC) && CBC == 1) || (defined(ECB) && ECB == 1) +static void InvCipher(state_t* state, const uint8_t* RoundKey) +{ + uint8_t round = 0; + + // Add the First round key to the state before starting the rounds. + AddRoundKey(Nr, state, RoundKey); + + // There will be Nr rounds. + // The first Nr-1 rounds are identical. + // These Nr-1 rounds are executed in the loop below. + for (round = (Nr - 1); round > 0; --round) + { + InvShiftRows(state); + InvSubBytes(state); + AddRoundKey(round, state, RoundKey); + InvMixColumns(state); + } + + // The last round is given below. + // The MixColumns function is not here in the last round. + InvShiftRows(state); + InvSubBytes(state); + AddRoundKey(0, state, RoundKey); +} +#endif // #if (defined(CBC) && CBC == 1) || (defined(ECB) && ECB == 1) + +/*****************************************************************************/ +/* Public functions: */ +/*****************************************************************************/ +#if defined(ECB) && (ECB == 1) + + +void AES_ECB_encrypt(const struct AES_ctx* ctx, uint8_t* buf) +{ + // The next function call encrypts the PlainText with the Key using AES algorithm. + Cipher((state_t*)buf, ctx->RoundKey); +} + +void AES_ECB_decrypt(const struct AES_ctx* ctx, uint8_t* buf) +{ + // The next function call decrypts the PlainText with the Key using AES algorithm. + InvCipher((state_t*)buf, ctx->RoundKey); +} + + +#endif // #if defined(ECB) && (ECB == 1) + + + + + +#if defined(CBC) && (CBC == 1) + + +static void XorWithIv(uint8_t* buf, const uint8_t* Iv) +{ + uint8_t i; + for (i = 0; i < AES_BLOCKLEN; ++i) // The block in AES is always 128bit no matter the key size + { + buf[i] ^= Iv[i]; + } +} + +void AES_CBC_encrypt_buffer(struct AES_ctx *ctx, uint8_t* buf, uint32_t length) +{ + uintptr_t i; + uint8_t *Iv = ctx->Iv; + for (i = 0; i < length; i += AES_BLOCKLEN) + { + XorWithIv(buf, Iv); + Cipher((state_t*)buf, ctx->RoundKey); + Iv = buf; + buf += AES_BLOCKLEN; + //printf("Step %d - %d", i/16, i); + } + /* store Iv in ctx for next call */ + memcpy(ctx->Iv, Iv, AES_BLOCKLEN); +} + +void AES_CBC_decrypt_buffer(struct AES_ctx* ctx, uint8_t* buf, uint32_t length) +{ + uintptr_t i; + uint8_t storeNextIv[AES_BLOCKLEN]; + for (i = 0; i < length; i += AES_BLOCKLEN) + { + memcpy(storeNextIv, buf, AES_BLOCKLEN); + InvCipher((state_t*)buf, ctx->RoundKey); + XorWithIv(buf, ctx->Iv); + memcpy(ctx->Iv, storeNextIv, AES_BLOCKLEN); + buf += AES_BLOCKLEN; + } + +} + +#endif // #if defined(CBC) && (CBC == 1) + + + +#if defined(CTR) && (CTR == 1) + +/* Symmetrical operation: same function for encrypting as for decrypting. Note any IV/nonce should never be reused with the same key */ +void AES_CTR_xcrypt_buffer(struct AES_ctx* ctx, uint8_t* buf, uint32_t length) +{ + uint8_t buffer[AES_BLOCKLEN]; + + unsigned i; + int bi; + for (i = 0, bi = AES_BLOCKLEN; i < length; ++i, ++bi) + { + if (bi == AES_BLOCKLEN) /* we need to regen xor compliment in buffer */ + { + + memcpy(buffer, ctx->Iv, AES_BLOCKLEN); + Cipher((state_t*)buffer,ctx->RoundKey); + + /* Increment Iv and handle overflow */ + for (bi = (AES_BLOCKLEN - 1); bi >= 0; --bi) + { + /* inc will overflow */ + if (ctx->Iv[bi] == 255) + { + ctx->Iv[bi] = 0; + continue; + } + ctx->Iv[bi] += 1; + break; + } + bi = 0; + } + + buf[i] = (buf[i] ^ buffer[bi]); + } +} + +#endif // #if defined(CTR) && (CTR == 1) + diff --git a/src/tiny-AES-c/aes.h b/src/tiny-AES-c/aes.h new file mode 100644 index 0000000..87f1471 --- /dev/null +++ b/src/tiny-AES-c/aes.h @@ -0,0 +1,90 @@ +#ifndef _AES_H_ +#define _AES_H_ + +#include <stdint.h> + +// #define the macros below to 1/0 to enable/disable the mode of operation. +// +// CBC enables AES encryption in CBC-mode of operation. +// CTR enables encryption in counter-mode. +// ECB enables the basic ECB 16-byte block algorithm. All can be enabled simultaneously. + +// The #ifndef-guard allows it to be configured before #include'ing or at compile time. +#ifndef CBC + #define CBC 1 +#endif + +#ifndef ECB + #define ECB 1 +#endif + +#ifndef CTR + #define CTR 1 +#endif + + +#define AES128 1 +//#define AES192 1 +//#define AES256 1 + +#define AES_BLOCKLEN 16 //Block length in bytes AES is 128b block only + +#if defined(AES256) && (AES256 == 1) + #define AES_KEYLEN 32 + #define AES_keyExpSize 240 +#elif defined(AES192) && (AES192 == 1) + #define AES_KEYLEN 24 + #define AES_keyExpSize 208 +#else + #define AES_KEYLEN 16 // Key length in bytes + #define AES_keyExpSize 176 +#endif + +struct AES_ctx +{ + uint8_t RoundKey[AES_keyExpSize]; +#if (defined(CBC) && (CBC == 1)) || (defined(CTR) && (CTR == 1)) + uint8_t Iv[AES_BLOCKLEN]; +#endif +}; + +void AES_init_ctx(struct AES_ctx* ctx, const uint8_t* key); +#if (defined(CBC) && (CBC == 1)) || (defined(CTR) && (CTR == 1)) +void AES_init_ctx_iv(struct AES_ctx* ctx, const uint8_t* key, const uint8_t* iv); +void AES_ctx_set_iv(struct AES_ctx* ctx, const uint8_t* iv); +#endif + +#if defined(ECB) && (ECB == 1) +// buffer size is exactly AES_BLOCKLEN bytes; +// you need only AES_init_ctx as IV is not used in ECB +// NB: ECB is considered insecure for most uses +void AES_ECB_encrypt(const struct AES_ctx* ctx, uint8_t* buf); +void AES_ECB_decrypt(const struct AES_ctx* ctx, uint8_t* buf); + +#endif // #if defined(ECB) && (ECB == !) + + +#if defined(CBC) && (CBC == 1) +// buffer size MUST be mutile of AES_BLOCKLEN; +// Suggest https://en.wikipedia.org/wiki/Padding_(cryptography)#PKCS7 for padding scheme +// NOTES: you need to set IV in ctx via AES_init_ctx_iv() or AES_ctx_set_iv() +// no IV should ever be reused with the same key +void AES_CBC_encrypt_buffer(struct AES_ctx* ctx, uint8_t* buf, uint32_t length); +void AES_CBC_decrypt_buffer(struct AES_ctx* ctx, uint8_t* buf, uint32_t length); + +#endif // #if defined(CBC) && (CBC == 1) + + +#if defined(CTR) && (CTR == 1) + +// Same function for encrypting as for decrypting. +// IV is incremented for every block, and used after encryption as XOR-compliment for output +// Suggesting https://en.wikipedia.org/wiki/Padding_(cryptography)#PKCS7 for padding scheme +// NOTES: you need to set IV in ctx with AES_init_ctx_iv() or AES_ctx_set_iv() +// no IV should ever be reused with the same key +void AES_CTR_xcrypt_buffer(struct AES_ctx* ctx, uint8_t* buf, uint32_t length); + +#endif // #if defined(CTR) && (CTR == 1) + + +#endif //_AES_H_ diff --git a/src/tiny-AES-c/aes.hpp b/src/tiny-AES-c/aes.hpp new file mode 100644 index 0000000..ade1642 --- /dev/null +++ b/src/tiny-AES-c/aes.hpp @@ -0,0 +1,12 @@ +#ifndef _AES_HPP_ +#define _AES_HPP_ + +#ifndef __cplusplus +#error Do not include the hpp header in a c project! +#endif //__cplusplus + +extern "C" { +#include "aes.h" +} + +#endif //_AES_HPP_ diff --git a/src/tiny-AES-c/unlicense.txt b/src/tiny-AES-c/unlicense.txt new file mode 100644 index 0000000..68a49da --- /dev/null +++ b/src/tiny-AES-c/unlicense.txt @@ -0,0 +1,24 @@ +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to <http://unlicense.org/> |