From 5150c059cdd69988342568d81da337a44a08aebb Mon Sep 17 00:00:00 2001 From: 3DSGuy <3dsguy.dev@gmail.com> Date: Sun, 30 Mar 2014 16:29:00 +0800 Subject: [PATCH] makerom v0.4 --- Application.rsf | 89 -- Application2.rsf | 297 ----- makerom.h => Forgot to backup source | 0 Makefile | 58 - accessdesc_sig.h | 320 ------ blz.c | 336 ------ blz.h | 9 - certs.c | 139 --- certs.h | 47 - cia.c | 617 ----------- cia.h | 108 -- cia_certificates.h | 670 ------------ crypto.c | 423 ------- crypto.h | 101 -- elf.c | 977 ----------------- elf.h | 87 -- elf_hdr.h | 177 --- exefs.c | 179 --- exefs.h | 54 - exheader.c | 1522 -------------------------- exheader.h | 233 ---- keys_common.h | 83 -- keys_debug.h | 805 -------------- keys_retail.h | 553 ---------- keyset.c | 231 ---- keyset.h | 83 -- lib.h | 35 - logo_data.h | 29 - makerom.c | 126 --- makerom.exe | Bin 0 -> 586171 bytes ncch.c | 1087 ------------------ ncch.h | 236 ---- ncsd.c | 564 ---------- ncsd.h | 163 --- romfs.c | 39 - romfs.h | 15 - srl.h | 96 -- tik.c | 86 -- tik.h | 80 -- titleid.c | 243 ---- titleid.h | 99 -- tmd.c | 92 -- tmd.h | 68 -- types.h | 39 - usersettings.c | 847 -------------- usersettings.h | 265 ----- utils.c | 373 ------- utils.h | 46 - yaml_ctr.c | 437 -------- yaml_ctr.h | 60 - yamlsettings.c | 374 ------- yamlsettings.h | 14 - 52 files changed, 13711 deletions(-) delete mode 100644 Application.rsf delete mode 100644 Application2.rsf rename makerom.h => Forgot to backup source (100%) delete mode 100644 Makefile delete mode 100644 accessdesc_sig.h delete mode 100644 blz.c delete mode 100644 blz.h delete mode 100644 certs.c delete mode 100644 certs.h delete mode 100644 cia.c delete mode 100644 cia.h delete mode 100644 cia_certificates.h delete mode 100644 crypto.c delete mode 100644 crypto.h delete mode 100644 elf.c delete mode 100644 elf.h delete mode 100644 elf_hdr.h delete mode 100644 exefs.c delete mode 100644 exefs.h delete mode 100644 exheader.c delete mode 100644 exheader.h delete mode 100644 keys_common.h delete mode 100644 keys_debug.h delete mode 100644 keys_retail.h delete mode 100644 keyset.c delete mode 100644 keyset.h delete mode 100644 lib.h delete mode 100644 logo_data.h delete mode 100644 makerom.c create mode 100644 makerom.exe delete mode 100644 ncch.c delete mode 100644 ncch.h delete mode 100644 ncsd.c delete mode 100644 ncsd.h delete mode 100644 romfs.c delete mode 100644 romfs.h delete mode 100644 srl.h delete mode 100644 tik.c delete mode 100644 tik.h delete mode 100644 titleid.c delete mode 100644 titleid.h delete mode 100644 tmd.c delete mode 100644 tmd.h delete mode 100644 types.h delete mode 100644 usersettings.c delete mode 100644 usersettings.h delete mode 100644 utils.c delete mode 100644 utils.h delete mode 100644 yaml_ctr.c delete mode 100644 yaml_ctr.h delete mode 100644 yamlsettings.c delete mode 100644 yamlsettings.h diff --git a/Application.rsf b/Application.rsf deleted file mode 100644 index 40c230e..0000000 --- a/Application.rsf +++ /dev/null @@ -1,89 +0,0 @@ -# Default value for application -BasicInfo: - Title : "Homebrew" - CompanyCode : "00" - MediaSize : 128MB # 128MB / 256MB / 512MB / 1GB / 2GB - MediaFootPadding: false - ProductCode : "CTR-P-HAXX" - ContentType : Application # Application / SystemUpdate / Manual / Child / Trial - Logo : Licensed # Nintendo / Licensed / Distributed - BackupMemoryType: None # None / 128KB / 512KB - -Rom: - # Specifies the root path of the file system to include in the ROM. - #HostRoot: "$(ROMFS_ROOT)" - SaveDataSize: 512KB - DefaultReject: - - .* - File: - - "*" - - -TitleInfo: - UniqueId: 0xff3ff - #TargetCategory: Contents - Category: Application - #DemoIndex: 1 - Version: 0 - -CardInfo: - #WritableAddress: 0x200 - #CardType : S2 # S1 / S2 - #CryptoType : 3 # 0 - 3 - CardDevice : NorFlash # NorFlash(0), None(1), BT(2) - #MediaType : CARD1 # Card1 / Card2 - BackupWriteWaitTime: 0 - -Option: - UseOnSD: true # true if App is to be installed to SD - EnableCompress: true - FreeProductCode: true - EnableCrypt : false - -ExeFs: - ReadOnly: - - .rodata - - RO - ReadWrite: - - .data - - RO - Text: - - .text - - STUP_ENTRY - -PlainRegion: - - .module_id - -AccessControlInfo: - #UseOtherVariationSaveData : true - #UseExtSaveData : true - #ExtSaveDataId: 0xffffffff - SystemSaveDataId1: 0x220 - SystemSaveDataId2: 0x00040010 - #OtherUserSaveDataId1: 0x220 - #OtherUserSaveDataId2: 0x330 - #OtherUserSaveDataId3: 0x440 - UseExtendedSaveDataAccessControl: true - AccessibleSaveDataIds: [0x101, 0x202, 0x303, 0x404, 0x505, 0x606] - FileSystemAccess: - #- CategorySystemApplication #0x1 - #- CategoryHardwareCheck #0x2 - #- CategoryFileSystemTool #0x4 - - Debug #0x8 - #- TwlCardBackup #0x10 - #- TwlNandData #0x20 - #- Boss #0x40 - - DirectSdmc #0x80 - #- Core #0x100 - #- CtrNandRo #0x200 - #- CtrNandRw #0x400 - #- CtrNandRoWrite #0x800 - #- CategorySystemSettings #0x1000 - #- CardBoard #0x2000 - #- ExportImportIvs #0x4000 - - DirectSdmcWrite #0x8000 - -SystemControlInfo: - RemasterVersion: 5 - StackSize: 0x40000 - #JumpId: 0 \ No newline at end of file diff --git a/Application2.rsf b/Application2.rsf deleted file mode 100644 index 0784ef3..0000000 --- a/Application2.rsf +++ /dev/null @@ -1,297 +0,0 @@ -# Default value for application -BasicInfo: - Title : "Homebrew" - CompanyCode : "00" - MediaSize : 128MB # 128MB / 256MB / 512MB / 1GB / 2GB - MediaFootPadding: false - ProductCode : "CTR-P-HAXX" - ContentType : Application # Application / SystemUpdate / Manual / Child / Trial - Logo : Licensed # Nintendo / Licensed / Distributed - BackupMemoryType: None # None / 128KB / 512KB - -Rom: - # Specifies the root path of the file system to include in the ROM. - #HostRoot: "$(ROMFS_ROOT)" - SaveDataSize: 512KB - DefaultReject: - - .* - File: - - "*" - - -TitleInfo: - UniqueId: 0xff3ff - #TargetCategory: Contents - Category: Application - #DemoIndex: 1 - Version: 0 - -CardInfo: - #WritableAddress: 0x200 - #CardType : S2 # S1 / S2 - #CryptoType : 3 # 0 - 3 - CardDevice : NorFlash # NorFlash(0), None(1), BT(2) - #MediaType : CARD1 # Card1 / Card2 - BackupWriteWaitTime: 0 - -Option: - UseOnSD: true # true if App is to be installed to SD - EnableCompress: true - FreeProductCode: true - EnableCrypt : false - -ExeFs: - ReadOnly: - - .rodata - - RO - ReadWrite: - - .data - - RO - Text: - - .text - - STUP_ENTRY - -PlainRegion: - - .module_id - -AccessControlInfo: - MaxCpu: 0x0 # 0x9E - DisableDebug : true - EnableForceDebug : true - CanWriteSharedPage : true - CanUsePrivilegedPriority : true - CanUseNonAlphabetAndNumber : true - PermitMainFunctionArgument : true - CanShareDeviceMemory : true - #UseOtherVariationSaveData : true - #UseExtSaveData : true - RunnableOnSleep : true - SpecialMemoryArrange : true - #ExtSaveDataId: 0xffffffff - SystemSaveDataId1: 0x220 - SystemSaveDataId2: 0x00040010 - #OtherUserSaveDataId1: 0x220 - #OtherUserSaveDataId2: 0x330 - #OtherUserSaveDataId3: 0x440 - UseExtendedSaveDataAccessControl: true - AccessibleSaveDataIds: [0x101, 0x202, 0x303, 0x404, 0x505, 0x606] - IoAccessControl: - - FsMountNand # 0x1 - - FsMountNandRoWrite #0x2 - - FsMountTwln #0x4 - - FsMountWnand # 0x8 - - FsMountCardSpi #0x10 - - UseSdif3 # 0x20 - - CreateSeed # 0x40 - - UseCardSpi # 0x80 - FileSystemAccess: - - CategorySystemApplication #0x1 - - CategoryHardwareCheck #0x2 - - CategoryFileSystemTool #0x4 - - Debug #0x8 - - TwlCardBackup #0x10 - - TwlNandData #0x20 - - Boss #0x40 - - DirectSdmc #0x80 - - Core #0x100 - - CtrNandRo #0x200 - - CtrNandRw #0x400 - - CtrNandRoWrite #0x800 - - CategorySystemSettings #0x1000 - - CardBoard #0x2000 - - ExportImportIvs #0x4000 - - DirectSdmcWrite #0x8000 - InterruptNumbers: - - 0x1 - AffinityMask: 1 - DescVersion: 2 - DisableDebug: false - SystemCallAccess: - ArbitrateAddress: 34 - Break: 60 - CancelTimer: 28 - ClearEvent: 25 - ClearTimer: 29 - CloseHandle: 35 - ConnectToPort: 45 - ControlMemory: 1 - CreateAddressArbiter: 33 - CreateEvent: 23 - CreateMemoryBlock: 30 - CreateMutex: 19 - CreateSemaphore: 21 - CreateThread: 8 - CreateTimer: 26 - DuplicateHandle: 39 - ExitProcess: 3 - ExitThread: 9 - GetCurrentProcessorNumber: 17 - GetHandleInfo: 41 - GetProcessId: 53 - GetProcessIdOfThread: 54 - GetProcessIdealProcessor: 6 - GetProcessInfo: 43 - GetResourceLimit: 56 - GetResourceLimitCurrentValues: 58 - GetResourceLimitLimitValues: 57 - GetSystemInfo: 42 - GetSystemTick: 40 - GetThreadContext: 59 - GetThreadId: 55 - GetThreadIdealProcessor: 15 - GetThreadInfo: 44 - GetThreadPriority: 11 - MapMemoryBlock: 31 - OutputDebugString: 61 - QueryMemory: 2 - ReleaseMutex: 20 - ReleaseSemaphore: 22 - SendSyncRequest1: 46 - SendSyncRequest2: 47 - SendSyncRequest3: 48 - SendSyncRequest4: 49 - SendSyncRequest: 50 - SetThreadPriority: 12 - SetTimer: 27 - SignalEvent: 24 - SleepThread: 10 - UnmapMemoryBlock: 32 - WaitSynchronization1: 36 - WaitSynchronizationN: 37 - HandleTableSize: 512 - IORegisterMapping: - - 1ff50000-1ff57fff - - 1ff70000-1ff77fff - IdealProcessor: 0 - MemoryMapping: - - 1f000000-1f5fffff:r - MemoryType: Application - Priority: 16 - ProgramId: 0x00040000ffffff00L - ReleaseKernelMajor: "02" - ReleaseKernelMinor: "33" - ServiceAccessControl: - - APT:U - - $hioFIO - - $hostio0 - - $hostio1 - - ac:u - - boss:U - - cam:u - - cecd:u - - cfg:u - - dlp:FKCL - - dlp:SRVR - - dsp::DSP - - frd:u - - fs:USER - - gsp::Gpu - - hid:USER - - http:C - - mic:u - - ndm:u - - news:u - - nwm::UDS - - ptm:u - - pxi:dev - - soc:U - - ssl:C - - y2r:u - - ldr:ro - - ir:USER - CoreVersion: 2 - StorageId: - - 0 - -SystemControlInfo: - RemasterVersion: 5 - Dependency: - ac: 0x0004013000002402L - am: 0x0004013000001502L - boss: 0x0004013000003402L - camera: 0x0004013000001602L - cecd: 0x0004013000002602L - cfg: 0x0004013000001702L - codec: 0x0004013000001802L - csnd: 0x0004013000002702L - dlp: 0x0004013000002802L - dsp: 0x0004013000001a02L - friends: 0x0004013000003202L - gpio: 0x0004013000001b02L - gsp: 0x0004013000001c02L - hid: 0x0004013000001d02L - http: 0x0004013000002902L - i2c: 0x0004013000001e02L - ir: 0x0004013000003302L - mcu: 0x0004013000001f02L - mic: 0x0004013000002002L - ndm: 0x0004013000002b02L - news: 0x0004013000003502L - nim: 0x0004013000002c02L - nwm: 0x0004013000002d02L - pdn: 0x0004013000002102L - ps: 0x0004013000003102L - ptm: 0x0004013000002202L - ro: 0x0004013000003702L - socket: 0x0004013000002e02L - spi: 0x0004013000002302L - ssl: 0x0004013000002f02L - StackSize: 0x40000 - -CommonHeaderKey: - D: | - jL2yO86eUQnYbXIrzgFVMm7FVze0LglZ2f5g+c42hWoEdnb5BOotaMQPBfqt - aUyAEmzQPaoi/4l4V+hTJRXQfthVRqIEx27B84l8LA6Tl5Fy9PaQaQ+4yRfP - g6ylH2l0EikrIVjy2uMlFgl0QJCrG+QGKHftxhaGCifdAwFNmiZuyJ/TmktZ - 0RCb66lYcr2h/p2G7SnpKUliS9h9KnpmG+UEgVYQUK+4SCfByUa9PxYGpT0E - nw1UcRz0gsBmdOqcgzwnAd9vVqgb42hVn6uQZyAl+j1RKiMWywZarazIR/k5 - Lmr4+groimSEa+3ajyoIho9WaWTDmFU3mkhA2tUDIQ== - DP: | - pD8c9uymjXDj6oyhx7EmQcrEDizxsj6hTjJ0x3G/PYNv/v2/DA9gp3X30h35 - uRZ1O+SgonWCGVnOJ7Wfjr4w2cOcSzxpzT3PQsS6Gs9z0RvcDsUHRL5f2EiT - 6A1ZPj6xyzmo9Ts6w9yfxCwaHci0f2hP9bq9FimfFKigCoNcFBE= - DQ: | - y+6Pado7N+SIZJgQ7zEGyQ7/SxGHHEy5uW04HHde9IqHD5HFGG2GegF655mM - iI9ja1eTCh/AFs8xjAg0drQEvB5q80TjPNKtwVUT8ghOlN3xTzpdaLwX0d+c - Twy74VY4KPawcdDeLaGFtXknhFOdGmIbx+BInibz7NZ9eLqGwaE= - Exponent: | - AQAB - InverseQ: | - tc9/lcF837g8AdfyeuCyuLyd36Zm1ZmJ1VSSuH8y3/1ZhBYZkOFXxU7EhMvJ - FyAu4qyCA9otzCXM+cqKxE3ZCkSconsXOu8szZTwuINSkwHlt22FtiTfPt+V - /g5kjtkjoZVOGfSvvfel9Smwy1yrFvKfi/yJsjATeNFjiEquV/w= - Modulus: | - z+yySANtuAnjXGxiLKlJ4fT0DGzD5S+dUKArWgDGcgALowRdlEbnABtIhbVh - LMl0yitDE8F4l1wzLwfHhfDa22CWUA98S3rXF53k5cOrb12leDKtBN2Wbtx1 - /8Iv+qLuRonNrmmSpEi8RkfEjIlj4QpNHNxGL1twinzpIpwJC6iXQMoqfYSh - BEou29fQZEOc0HgRQYgz3TFikC0X8sapK5xwq9zTq13a7j1sDoH/9mdaRPms - Bz0jlHVlkyAMxXYdD2UGPSGi8JaAtwpJUzijXcB0PKTZQDaFH4zRLRX57ySp - fp2yHvigcoEXd3OxVn+tBaLSMFr1068PEEpS2AlHlw== - P: | - 6SdD3AiAybNamgUgGJduyFWO1/LeakmoJm+23IEJADyU4nz+reGjxQnMrR+x - syuB8VPGuf1z0SInfRIu9PEjIfW9/H/fZ59GwckQuJbneODjW7KU1jM3cTVX - +AWvaxWDwlCUmVSYD2OySUJlo3szGmBYh/o/tKAq7kElaaOt+cc= - Q: | - 5EyO8bCyfqgLTfipAG/nNLObQbqMyARdQfudxh4eQqHmzblEM3jareuA8eUZ - K8pIaP+U9UfxwWTeFsOulrpsm04j4gS71WGNx3YwOIRPXXOn7zBkxA3AO9qq - K8lMeV3gNsdt4Fz8Zh2F68HSP4avB+ThO2S18SXMyIkcM7Sbw7E= - Signature: | - 3xyLmORvojVswxgXmPPOVH4ULn8e2G3PvClO/jIuwRGtRprGcOruKFUi4TYF - HASKzg8Mg4/I1t4RjurPrZvPgQ3rcROz066DAkwOEFBZPO5gBvuMf8IgJAFi - VYdgD636cy72ZWLS5RBFaXA5A9E57FDB1CU5spARTpXLGevKD7X6x7Di1+Bx - w+VVM55c3E07URENMXiWytcYWO4A6SjyaHbUV/5lsUtJP/amWErH/MS7YbxY - jVVl5gp5OUG4gGH3BcP+1osJgsJfplb57h0OBj6fP/GTmk+i1ZGHiv7Pw/yK - scR46dEa97HTIMuDvgPVyqVeF6aRENS+I9ZLTwOprg== - Descriptor: | - AP///wAABAACAAAAAAAFGJ4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiIAAAAAAAABBUFQ6VQAAACRo - aW9GSU8AJGhvc3RpbzAkaG9zdGlvMWFjOnUAAAAAYm9zczpVAABjYW06dQAA - AGNlY2Q6dQAAY2ZnOnUAAABkbHA6RktDTGRscDpTUlZSZHNwOjpEU1BmcmQ6 - dQAAAGZzOlVTRVIAZ3NwOjpHcHVoaWQ6VVNFUmh0dHA6QwAAbWljOnUAAABu - ZG06dQAAAG5ld3M6dQAAbndtOjpVRFNwdG06dQAAAHB4aTpkZXYAc29jOlUA - AABzc2w6QwAAAHkycjp1AAAAbGRyOnJvAABpcjpVU0VSAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAABOn/rw/7//8ec/APIA8JH/APaR/1D/gf9Y/4H/cP+B/3j/gf8B - AQD/AAIA/iECAPz///////////////////////////////////////////// - ////////////////////////////////////////AAAAAAAAAAAAAAAAAAAA - AAADAAAAAAAAAAAAAAAAAAI= \ No newline at end of file diff --git a/makerom.h b/Forgot to backup source similarity index 100% rename from makerom.h rename to Forgot to backup source diff --git a/Makefile b/Makefile deleted file mode 100644 index 26672a5..0000000 --- a/Makefile +++ /dev/null @@ -1,58 +0,0 @@ -# Makerom Sources -UTILS_OBJS = utils.o keyset.o titleid.o -CIA_OBJS = cia.o certs.o tik.o tmd.o -NCCH_OBJS = ncch.o exheader.o exefs.o elf.o romfs.o -NCSD_OBJS = ncsd.o -SETTINGS_OBJS = usersettings.o yamlsettings.o -LIB_API_OBJS = crypto.o yaml_ctr.o blz.o - -OBJS = makerom.o $(UTILS_OBJS) $(LIB_API_OBJS) $(SETTINGS_OBJS) $(NCSD_OBJS) $(NCCH_OBJS) $(CIA_OBJS) - -# Libraries -POLAR_OBJS = polarssl/aes.o polarssl/bignum.o polarssl/rsa.o polarssl/sha1.o polarssl/sha2.o polarssl/padlock.o polarssl/md.o polarssl/md_wrap.o polarssl/md2.o polarssl/md4.o polarssl/md5.o polarssl/sha4.o polarssl/base64.o polarssl/cipher.o polarssl/cipher_wrap.o polarssl/camellia.o polarssl/des.o polarssl/blowfish.o -YAML_OBJS = libyaml/api.o libyaml/dumper.o libyaml/emitter.o libyaml/loader.o libyaml/parser.o libyaml/reader.o libyaml/scanner.o libyaml/writer.o - -# Compiler Settings -LIBS = -static-libgcc -static-libstdc++ -CXXFLAGS = -I. -CFLAGS = --std=c99 -Wall -I. -DMAKEROM_VER_MAJOR=$(VER_MAJOR) -DMAKEROM_VER_MINOR=$(VER_MINOR) $(MAKEROM_BUILD_FLAGS) -CC = gcc - -# MAKEROM Build Settings -MAKEROM_BUILD_FLAGS = #-DDEBUG #-DELF_DEBUG -VER_MAJOR = 0 -VER_MINOR = 3 -OUTPUT = makerom - -main: build - -rebuild: clean build - -build: $(OBJS) $(POLAR_OBJS) $(YAML_OBJS) - g++ -o $(OUTPUT) $(LIBS) $(OBJS) $(POLAR_OBJS) $(YAML_OBJS) - -clean: - rm -rf $(OUTPUT) $(OBJS) $(POLAR_OBJS) $(YAML_OBJS) *.cci *.cia *.cxi *.cfa - -# Winfail compatibility -rebuildwin: cleanwin build -cleanwin: - del /Q objs $(OUTPUT).exe *.o polarssl\*.o libyaml\*.o *.cci *.cia *.cxi *.cfa - -#Test Functions - -ccigen_sdk: - ctr_makerom32 -f card -rsf testdata\Application.rsf -o content_test_sdk.cci -content testdata\app_zeroskey.cxi:0 -content testdata\manual_zeroskey.cfa:1 -content testdata\dlp_zeroskey.cfa:2 -content testdata\update_zeroskey.cfa:7 - del content_test_sdk.cci.xml - -ccigen: - $(OUTPUT) -f card -rsf testdata\Application.rsf -o content_test.cci -content testdata\app_zeroskey.cxi:0 -content testdata\manual_zeroskey.cfa:1 -content testdata\dlp_zeroskey.cfa:2 -content testdata\update_zeroskey.cfa:7 - -ciagen_sdk: - ctr_makecia32 -o content_test.cia -i testdata\app_zeroskey.cxi:0 -i testdata\manual_zeroskey.cfa:1 -i testdata\dlp_zeroskey.cfa:2 - -ciagen: - $(OUTPUT) -f cia -o content_test.cia -content testdata\app_zeroskey.cxi:0 -content testdata\manual_zeroskey.cfa:1 -content testdata\dlp_zeroskey.cfa:2 -encryptcia - -pyramids: - $(OUTPUT) -f cxi -accessdesc app -o pyramids.cxi -code pyramids\code.bin -exheader pyramids\exheader.bin -rsf pyramids\app.rsf -desc pyramids\build.desc -icon pyramids\icon.icn -banner pyramids\banner.bnr -romfs pyramids\romfs.bin diff --git a/accessdesc_sig.h b/accessdesc_sig.h deleted file mode 100644 index 8cbe2ee..0000000 --- a/accessdesc_sig.h +++ /dev/null @@ -1,320 +0,0 @@ -#ifndef _ACCESSDESC_SIG_H_ -#define _ACCESSDESC_SIG_H_ - -/* CTR_SDK 1 (1.2.0) */ -// DependencyList -static const unsigned char sdk1_dep_list[0x180] = -{ - 0x02, 0x24, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x15, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x34, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x16, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x26, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x17, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x18, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x27, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x28, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1A, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x32, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1B, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1C, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1D, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x29, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1E, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1F, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x20, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2B, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x35, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2C, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2D, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x21, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x31, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x22, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2E, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x23, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2F, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -// APP -static const unsigned char App_sdk1_HdrPubK[0x100] = -{ - 0x9B, 0x82, 0x9C, 0x19, 0x01, 0x73, 0x23, 0x50, 0x89, 0xE3, 0x0B, 0xC8, 0x8F, 0xFB, 0xA5, 0xE4, 0xFD, 0x44, 0xAE, 0x49, 0x32, 0xC7, 0xEF, 0x0A, 0x7E, 0x93, 0x95, 0xBA, 0xA2, 0x48, 0x4D, 0x8E, 0x18, 0x82, 0x34, 0x66, 0xFE, 0xDA, 0x7A, 0x45, 0x4A, 0x7D, 0xD5, 0x3C, 0xC6, 0x5C, 0xE0, 0x71, 0xFC, 0xD0, 0x82, 0xCC, 0xB2, 0xCF, 0x77, 0x0E, 0xAD, 0xCD, 0xD2, 0xAC, 0x1D, 0x66, 0x1B, 0xC1, 0xEA, 0xAC, 0x39, 0x96, 0x2C, 0x52, 0xDE, 0xFF, 0xF2, 0x74, 0xF6, 0xC5, 0xCA, 0x99, 0x31, 0x95, 0x13, 0xBB, 0x3F, 0xED, 0x30, 0xAE, 0x0A, 0xD3, 0x86, 0x0D, 0x0B, 0xF5, 0x56, 0x7D, 0x33, 0xBA, 0xA1, 0x39, 0xA2, 0xF5, 0xB6, 0x47, 0x78, 0x1F, 0xFD, 0x04, 0xA3, 0x49, 0xA9, 0x10, 0xD3, 0x41, 0x2E, 0x92, 0x7D, 0xE1, 0xA4, 0xA8, 0x02, 0x18, 0x01, 0x2C, 0xC2, 0x61, 0xB1, 0xAC, 0xCB, 0xB3, 0x7A, 0x64, 0xB1, 0xC3, 0xE6, 0x3B, 0x50, 0xAD, 0xDD, 0x55, 0xAB, 0x28, 0xDA, 0x59, 0xE7, 0x57, 0x6A, 0x76, 0x4F, 0x6B, 0x08, 0xD1, 0x61, 0x7D, 0x28, 0xD5, 0x88, 0x7B, 0x8E, 0x80, 0x78, 0xF3, 0xFF, 0x50, 0x00, 0xBD, 0x73, 0xFB, 0x62, 0xB3, 0xCA, 0xA8, 0x05, 0x48, 0xE6, 0xE6, 0x71, 0xB5, 0xAC, 0xDA, 0xE9, 0xC6, 0x1F, 0x9B, 0x72, 0x98, 0x2E, 0xFF, 0xB2, 0x9C, 0x36, 0x9F, 0x7E, 0x7D, 0x25, 0x65, 0x6F, 0xB0, 0x60, 0xB1, 0xB5, 0x5F, 0xCF, 0x74, 0x29, 0x91, 0x9D, 0xAB, 0x84, 0x97, 0x1A, 0x27, 0x5D, 0x69, 0x49, 0x16, 0xF8, 0x77, 0x31, 0x26, 0x3E, 0x6F, 0x97, 0x41, 0x4A, 0x26, 0xFD, 0x5B, 0xAB, 0x65, 0x77, 0x45, 0x1C, 0x76, 0x15, 0xDC, 0x1A, 0x63, 0x0F, 0x51, 0x2D, 0xA0, 0x07, 0x6E, 0xE5, 0x29, 0xD3, 0x37, 0x4B, 0xE5, 0x7F, 0xBB, 0x23, 0xD0, 0x2B, 0xB9, 0x76, 0x1F -}; - -static const unsigned char App_sdk1_HdrPrivK[0x100] = -{ - 0x66, 0x9F, 0xB5, 0xC5, 0xA6, 0xB8, 0x45, 0xD8, 0xD3, 0x75, 0xFB, 0x03, 0xBB, 0x48, 0xF5, 0x7C, 0x7D, 0x4B, 0x02, 0xBD, 0x19, 0x7E, 0xE9, 0x98, 0x02, 0x5A, 0x00, 0xD8, 0x6E, 0x59, 0xCA, 0x9C, 0x78, 0x3E, 0x0C, 0xB8, 0xDF, 0x7C, 0x6C, 0x6E, 0x27, 0xAF, 0x8C, 0xB6, 0x13, 0xAD, 0x9D, 0x0C, 0x7C, 0x2B, 0x59, 0xF6, 0x1E, 0x16, 0x5D, 0x5A, 0x59, 0x86, 0x57, 0x7D, 0xEF, 0xD4, 0xBF, 0x82, 0xA4, 0x0C, 0x4D, 0xE0, 0x75, 0x95, 0xA6, 0xC6, 0x3F, 0x49, 0xC2, 0xC4, 0x5A, 0x63, 0xE8, 0x5D, 0x99, 0xEC, 0xDB, 0x4D, 0xFA, 0xEF, 0x10, 0x03, 0xF1, 0x15, 0xD1, 0x0B, 0x71, 0xAD, 0x24, 0x23, 0x08, 0x5C, 0x91, 0xD7, 0x17, 0x18, 0x69, 0x04, 0xAB, 0x23, 0x91, 0x62, 0x7D, 0xE8, 0xB5, 0x90, 0xF1, 0x5C, 0x09, 0x28, 0x8C, 0x51, 0xB7, 0x38, 0x02, 0x26, 0x78, 0x8C, 0xA2, 0x05, 0x07, 0x53, 0x7D, 0x99, 0x46, 0xFD, 0x12, 0x77, 0x32, 0x0E, 0xA8, 0x54, 0xE3, 0x32, 0x0E, 0x93, 0x05, 0x10, 0xFA, 0x59, 0x7A, 0x5D, 0x2E, 0xDE, 0x32, 0xE8, 0xE9, 0xF0, 0x27, 0x4E, 0x08, 0x83, 0x08, 0xD4, 0x92, 0x58, 0x4D, 0x6D, 0x34, 0x9F, 0xD9, 0xAF, 0xA9, 0x01, 0x62, 0xB5, 0x1A, 0x1D, 0x7E, 0x8D, 0xBB, 0x8A, 0x58, 0xBA, 0xFF, 0xB4, 0xD3, 0x75, 0xF3, 0x44, 0xE7, 0x13, 0x05, 0xC6, 0xC5, 0xA4, 0xD2, 0x6B, 0x18, 0x31, 0x9F, 0xBE, 0x42, 0x45, 0x82, 0x2E, 0x47, 0x9B, 0x26, 0x73, 0x28, 0xD7, 0x9A, 0x64, 0xA6, 0x3D, 0x38, 0x9C, 0x11, 0x36, 0x01, 0x5B, 0x82, 0x2F, 0x7E, 0xA8, 0xC4, 0x82, 0x15, 0x6C, 0x0B, 0xBA, 0x1C, 0x58, 0xF5, 0x81, 0xF9, 0x45, 0xA9, 0xC6, 0x05, 0x6A, 0x2C, 0xA6, 0xCF, 0xF5, 0xDF, 0xEB, 0xBB, 0xC0, 0x92, 0xE3, 0xA6, 0x9D, 0x23, 0x09, 0x09, 0x0E, 0x98, 0x39 -}; - -static const unsigned char App_sdk1_AcexData[0x200] = -{ - 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x50, 0x54, 0x3A, 0x55, 0x00, 0x00, 0x00, 0x24, 0x68, 0x69, 0x6F, 0x46, 0x49, 0x4F, 0x00, 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x30, 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x31, 0x61, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x00, 0x62, 0x6F, 0x73, 0x73, 0x3A, 0x55, 0x00, 0x00, 0x63, 0x61, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x63, 0x65, 0x63, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x63, 0x66, 0x67, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x64, 0x6C, 0x70, 0x3A, 0x46, 0x4B, 0x43, 0x4C, 0x64, 0x6C, 0x70, 0x3A, 0x53, 0x52, 0x56, 0x52, 0x64, 0x73, 0x70, 0x3A, 0x3A, 0x44, 0x53, 0x50, 0x66, 0x72, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x66, 0x73, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x00, 0x67, 0x73, 0x70, 0x3A, 0x3A, 0x47, 0x70, 0x75, 0x68, 0x69, 0x64, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x43, 0x00, 0x00, 0x6D, 0x69, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6E, 0x64, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6E, 0x65, 0x77, 0x73, 0x3A, 0x75, 0x00, 0x00, 0x6E, 0x77, 0x6D, 0x3A, 0x3A, 0x55, 0x44, 0x53, 0x70, 0x74, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x70, 0x78, 0x69, 0x3A, 0x64, 0x65, 0x76, 0x00, 0x73, 0x6F, 0x63, 0x3A, 0x55, 0x00, 0x00, 0x00, 0x73, 0x73, 0x6C, 0x3A, 0x43, 0x00, 0x00, 0x00, 0x79, 0x32, 0x72, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x69, 0x72, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFB, 0xF0, 0xFF, 0xBF, 0xFF, 0xF1, 0xE7, 0x3F, 0x00, 0xF2, 0x00, 0xF0, 0x91, 0xFF, 0x00, 0xF6, 0x91, 0xFF, 0x50, 0xFF, 0x81, 0xFF, 0x58, 0xFF, 0x81, 0xFF, 0x70, 0xFF, 0x81, 0xFF, 0x78, 0xFF, 0x81, 0xFF, 0x01, 0x01, 0x00, 0xFF, 0x00, 0x02, 0x00, 0xFE, 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, 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, 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, 0x02 -}; - -static const unsigned char App_sdk1_AcexSig[0x100] = -{ - 0x05, 0x90, 0xAF, 0x65, 0x16, 0x9F, 0x18, 0x2C, 0x17, 0x78, 0x9F, 0xDF, 0xB6, 0x37, 0xCF, 0x26, 0x9B, 0x1B, 0x75, 0x51, 0xB8, 0x57, 0xA3, 0x8F, 0xD7, 0x93, 0x19, 0x61, 0x81, 0x0D, 0x3D, 0xBC, 0x36, 0x50, 0x53, 0xDA, 0x7D, 0xA9, 0x7F, 0xAA, 0x3E, 0x51, 0x2C, 0x75, 0xA1, 0xB9, 0xB1, 0x56, 0xEB, 0x2A, 0x46, 0x21, 0xEC, 0x4F, 0xA7, 0x0C, 0xA1, 0xA8, 0xFD, 0xEE, 0xA3, 0x4A, 0xFD, 0x54, 0xB0, 0x3A, 0x49, 0x5C, 0x8F, 0x8D, 0xB2, 0xBC, 0x32, 0x50, 0x7E, 0x2C, 0x50, 0xD2, 0x1A, 0x6B, 0x61, 0xCB, 0x2A, 0xC9, 0x7E, 0x6E, 0x6A, 0xC8, 0xD6, 0x9B, 0x21, 0xE7, 0x3B, 0xB8, 0x39, 0x1C, 0xD7, 0xEB, 0x69, 0x35, 0xF5, 0xBC, 0xB5, 0x23, 0x54, 0x81, 0x4F, 0x73, 0xAB, 0x9C, 0x55, 0xF0, 0x04, 0x0B, 0x4A, 0xEA, 0x54, 0x08, 0xBF, 0x36, 0x28, 0x12, 0x5E, 0x44, 0x41, 0xF5, 0x3D, 0xFE, 0xA7, 0x6B, 0x35, 0xF2, 0x9A, 0xF2, 0x88, 0xCD, 0xD6, 0x2E, 0x7B, 0xF3, 0xF5, 0x0D, 0x06, 0x2E, 0x13, 0x4F, 0x78, 0xEE, 0x27, 0xAB, 0x31, 0x06, 0x62, 0xE9, 0xB2, 0x3E, 0xC6, 0x99, 0xD7, 0xA9, 0xCC, 0x21, 0x70, 0xD7, 0xCD, 0x9F, 0x03, 0x66, 0x91, 0x7E, 0xBD, 0x3E, 0x83, 0xC4, 0xFF, 0xC9, 0xAA, 0x7E, 0x27, 0xAE, 0x5C, 0x37, 0x7D, 0x93, 0x57, 0x60, 0xB9, 0x0B, 0x71, 0x43, 0x8A, 0x2F, 0x43, 0x50, 0x94, 0xF8, 0x0D, 0x40, 0xCC, 0x64, 0x16, 0x09, 0x70, 0xCD, 0x03, 0xCA, 0x95, 0x30, 0x20, 0xE2, 0x85, 0x2F, 0x2A, 0xCF, 0x65, 0xAA, 0xE9, 0xCF, 0x1F, 0x57, 0xC1, 0x8F, 0xD5, 0x46, 0x51, 0x5A, 0x99, 0x60, 0x65, 0x93, 0xA9, 0xBB, 0xEA, 0x5F, 0xA0, 0x47, 0xD7, 0x11, 0x04, 0xC7, 0xB4, 0x82, 0x66, 0x24, 0x17, 0x17, 0x5E, 0x9D, 0xC8, 0x50, 0x80, 0x63, 0x28, 0xB3, 0xF8, 0xE3 -}; - -// DLP -static const unsigned char Dlp_sdk1_HdrPubK[0x100] = -{ - 0xD9, 0xF0, 0xC9, 0x35, 0x1E, 0x55, 0xD8, 0x7E, 0x96, 0x53, 0x33, 0x34, 0xBB, 0x8A, 0xAE, 0x03, 0x92, 0x35, 0xE2, 0x05, 0x58, 0x7C, 0xCC, 0x08, 0xB2, 0xDF, 0x43, 0x41, 0xB7, 0x7A, 0xB5, 0x29, 0xEE, 0x4E, 0xF3, 0xC7, 0x35, 0x3B, 0x7E, 0xC5, 0xEE, 0x74, 0xF0, 0xAA, 0x7E, 0x60, 0xF1, 0x28, 0x35, 0x17, 0xD6, 0xC9, 0x9A, 0xF2, 0x84, 0xFE, 0xC8, 0x93, 0x86, 0xF7, 0xA7, 0x36, 0xA6, 0xB0, 0x28, 0xDC, 0xE8, 0x38, 0x0B, 0x54, 0x42, 0x8D, 0x4E, 0x4B, 0x55, 0x0F, 0x4A, 0x0D, 0x72, 0xA0, 0x23, 0xC9, 0x68, 0x22, 0x37, 0x31, 0x88, 0x2C, 0x05, 0x49, 0x86, 0x80, 0x9A, 0xFC, 0x1D, 0x02, 0xE3, 0x20, 0x15, 0x0C, 0x7E, 0x28, 0x40, 0x57, 0xEF, 0xA7, 0xBC, 0xAA, 0xC5, 0xD6, 0xD7, 0x6F, 0xF9, 0x26, 0x9A, 0x32, 0xB2, 0x9E, 0x10, 0x5F, 0x93, 0xE6, 0xB2, 0xC6, 0xB2, 0x62, 0x34, 0x6A, 0xB0, 0xD9, 0x71, 0x3B, 0x0F, 0x34, 0x6C, 0xB1, 0xFE, 0x3A, 0x39, 0xDE, 0x3D, 0x6A, 0xCB, 0x32, 0x95, 0xFA, 0x18, 0x4F, 0xF4, 0xEB, 0x5F, 0x20, 0xE4, 0xEF, 0x64, 0xC5, 0x06, 0x27, 0xC3, 0x44, 0x2A, 0x39, 0x35, 0xD8, 0x00, 0xDF, 0x00, 0xAD, 0xC4, 0x98, 0x06, 0x52, 0xD8, 0x4A, 0xC5, 0x2A, 0x7F, 0x77, 0x50, 0x62, 0x7E, 0x05, 0x3E, 0x8C, 0x28, 0x0A, 0x26, 0xD2, 0x6C, 0x9B, 0x27, 0x65, 0xE9, 0x77, 0x68, 0xE9, 0xE6, 0xAA, 0xBA, 0xF5, 0x85, 0xFC, 0x75, 0x07, 0x84, 0xB2, 0xCA, 0x35, 0x85, 0x52, 0x10, 0x08, 0xEF, 0x85, 0xD3, 0x70, 0x17, 0x31, 0xE1, 0x44, 0xF6, 0x34, 0xDF, 0x7C, 0x42, 0xF7, 0x74, 0xAA, 0xFC, 0xC3, 0xE4, 0x84, 0x2D, 0xBF, 0x15, 0x1E, 0x84, 0x00, 0xE3, 0x80, 0xD7, 0x89, 0x56, 0xEE, 0x60, 0x09, 0x1F, 0xD3, 0xBF, 0xBF, 0x50, 0x8F, 0xA3, 0x0C, 0x72, 0x3F -}; - -static const unsigned char Dlp_sdk1_HdrPrivK[0x100] = -{ - 0x10, 0x19, 0x3A, 0x33, 0xA3, 0x47, 0x02, 0x13, 0xEF, 0xB4, 0xBB, 0x9E, 0x94, 0x8F, 0xDC, 0xE4, 0xC4, 0xA3, 0x18, 0x4B, 0xFE, 0xCA, 0x51, 0x23, 0xFF, 0x5A, 0x80, 0x94, 0x55, 0x22, 0x4A, 0x49, 0x8B, 0xA1, 0xE7, 0x5D, 0xFA, 0xAF, 0xA7, 0x60, 0xA5, 0x89, 0x9B, 0xD1, 0x6C, 0x3E, 0x6A, 0xF1, 0xE6, 0x62, 0x19, 0x6A, 0x90, 0xF8, 0x83, 0x1C, 0x72, 0xE2, 0x7A, 0xE0, 0xC6, 0x48, 0x42, 0x2D, 0xD7, 0x06, 0xE2, 0x5C, 0x69, 0x71, 0xD2, 0xEC, 0xAF, 0x30, 0xDF, 0x5A, 0x9E, 0xC4, 0xB9, 0x87, 0xDC, 0xBC, 0xDE, 0xE5, 0x50, 0x20, 0x67, 0x87, 0xA0, 0xE8, 0x5A, 0x78, 0x1B, 0x7A, 0xAE, 0x05, 0xED, 0x93, 0x0C, 0x1A, 0xFD, 0x22, 0xAA, 0x06, 0x14, 0xDC, 0xD6, 0x11, 0xE3, 0x45, 0x48, 0x6A, 0xAC, 0x03, 0xCE, 0xF6, 0x19, 0xBD, 0x95, 0x46, 0x0A, 0x1D, 0xCB, 0x6C, 0xE3, 0xF6, 0x5F, 0x1A, 0xB3, 0x81, 0xC7, 0xE2, 0xAB, 0xFE, 0xEF, 0xFB, 0xEC, 0xFE, 0x88, 0x36, 0x26, 0x60, 0x47, 0x43, 0x78, 0x36, 0xA7, 0xC8, 0xC9, 0x40, 0x98, 0x2E, 0xF2, 0x7E, 0xE4, 0x0D, 0x6C, 0x45, 0x88, 0x2A, 0x32, 0x9B, 0xA2, 0x7C, 0x39, 0x20, 0xAA, 0x6B, 0x64, 0x35, 0xC6, 0xA9, 0x20, 0x71, 0x4A, 0x78, 0x6E, 0x55, 0x3C, 0x9B, 0xEA, 0x10, 0x73, 0xBB, 0xA7, 0xD8, 0xFE, 0x69, 0x42, 0xB8, 0xE7, 0xA1, 0xE5, 0xDF, 0x8A, 0xDE, 0x4C, 0x2B, 0x3A, 0x92, 0xB8, 0x3E, 0x5E, 0x2C, 0x29, 0x0D, 0xC1, 0x3D, 0x10, 0x65, 0x1E, 0xF1, 0x95, 0xE5, 0xF6, 0x45, 0x15, 0xBF, 0xE2, 0x30, 0xA6, 0x70, 0x19, 0xA4, 0x11, 0x57, 0x12, 0x1C, 0x81, 0x4B, 0x54, 0x04, 0xBE, 0x67, 0xF5, 0x00, 0x22, 0x06, 0xDA, 0x6B, 0xCE, 0x23, 0x3F, 0x86, 0xE4, 0x70, 0x6A, 0xD1, 0x3E, 0xE5, 0x74, 0x44, 0x86, 0xDA, 0xBE, 0x79 -}; - -static const unsigned char Dlp_sdk1_AcexData[0x200] = -{ - 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x50, 0x54, 0x3A, 0x55, 0x00, 0x00, 0x00, 0x24, 0x68, 0x69, 0x6F, 0x46, 0x49, 0x4F, 0x00, 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x30, 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x31, 0x61, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x00, 0x62, 0x6F, 0x73, 0x73, 0x3A, 0x55, 0x00, 0x00, 0x63, 0x61, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x63, 0x65, 0x63, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x63, 0x66, 0x67, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x64, 0x6C, 0x70, 0x3A, 0x46, 0x4B, 0x43, 0x4C, 0x64, 0x6C, 0x70, 0x3A, 0x53, 0x52, 0x56, 0x52, 0x64, 0x73, 0x70, 0x3A, 0x3A, 0x44, 0x53, 0x50, 0x66, 0x72, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x66, 0x73, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x00, 0x67, 0x73, 0x70, 0x3A, 0x3A, 0x47, 0x70, 0x75, 0x68, 0x69, 0x64, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x43, 0x00, 0x00, 0x6D, 0x69, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6E, 0x64, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6E, 0x65, 0x77, 0x73, 0x3A, 0x75, 0x00, 0x00, 0x6E, 0x77, 0x6D, 0x3A, 0x3A, 0x55, 0x44, 0x53, 0x70, 0x74, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x70, 0x78, 0x69, 0x3A, 0x64, 0x65, 0x76, 0x00, 0x73, 0x6F, 0x63, 0x3A, 0x55, 0x00, 0x00, 0x00, 0x73, 0x73, 0x6C, 0x3A, 0x43, 0x00, 0x00, 0x00, 0x79, 0x32, 0x72, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x69, 0x72, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFB, 0xF0, 0xFF, 0xBF, 0xFF, 0xF1, 0xE7, 0x3F, 0x00, 0xF2, 0x00, 0xF0, 0x91, 0xFF, 0x00, 0xF6, 0x91, 0xFF, 0x50, 0xFF, 0x81, 0xFF, 0x58, 0xFF, 0x81, 0xFF, 0x70, 0xFF, 0x81, 0xFF, 0x78, 0xFF, 0x81, 0xFF, 0x01, 0x01, 0x00, 0xFF, 0x00, 0x02, 0x00, 0xFE, 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, 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, 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, 0x02 -}; - -static const unsigned char Dlp_sdk1_AcexSig[0x100] = -{ - 0x13, 0xB2, 0xF4, 0x89, 0xBB, 0xB4, 0xFF, 0x55, 0x7E, 0x3E, 0x9B, 0x90, 0x44, 0x45, 0xC6, 0x8A, 0x17, 0x32, 0x91, 0x77, 0x7D, 0xCB, 0x4A, 0x26, 0x3D, 0xCA, 0xD8, 0x6E, 0x72, 0x27, 0x93, 0x9C, 0xE4, 0x27, 0xFE, 0x54, 0xDC, 0xE7, 0xDC, 0x02, 0x17, 0x9C, 0x82, 0xA8, 0xB0, 0xE8, 0x69, 0x07, 0xE3, 0x34, 0x0E, 0xBF, 0x17, 0x05, 0x58, 0x23, 0x5F, 0x6D, 0xDA, 0xE8, 0xC6, 0xEE, 0x49, 0x29, 0xEF, 0xD7, 0x48, 0x48, 0x41, 0xE2, 0x2A, 0x57, 0x2B, 0x21, 0x13, 0x64, 0xD4, 0x79, 0x5A, 0xE3, 0x84, 0xDA, 0x63, 0x9A, 0x07, 0x39, 0xE2, 0x7E, 0xA7, 0x56, 0x34, 0x1C, 0xE2, 0xAF, 0xCD, 0x65, 0xD1, 0xC0, 0x1B, 0x72, 0xB1, 0x1D, 0xFC, 0xE2, 0x6E, 0x0F, 0xC7, 0xB0, 0xF5, 0x84, 0x0F, 0xA5, 0x2B, 0xDF, 0x3A, 0xCF, 0x43, 0xE8, 0xE4, 0x07, 0x29, 0xC6, 0x41, 0x0E, 0x7B, 0xEE, 0x35, 0xF9, 0xFC, 0xE7, 0x15, 0xF3, 0x8C, 0x3A, 0xB4, 0x77, 0xBD, 0x88, 0x70, 0x83, 0x4A, 0x03, 0x9E, 0x01, 0x9B, 0xBB, 0xD2, 0xE4, 0xA5, 0xBE, 0xF7, 0x80, 0x92, 0x5A, 0x9F, 0x14, 0x9B, 0x49, 0x5D, 0x3D, 0xDC, 0x32, 0x34, 0x7E, 0xC0, 0xD4, 0xAC, 0xDA, 0x8C, 0xF7, 0xA1, 0xE1, 0xCA, 0x29, 0xF5, 0x58, 0x5E, 0xEB, 0x02, 0xB6, 0x67, 0x42, 0x89, 0x46, 0x4C, 0xA6, 0xA8, 0xBD, 0xEB, 0xEB, 0xDD, 0x8F, 0x2E, 0x72, 0x26, 0x49, 0x70, 0x01, 0x7D, 0x5B, 0x03, 0x06, 0x2C, 0x92, 0x1E, 0x55, 0xB2, 0xDA, 0xD7, 0x0D, 0x70, 0x74, 0x42, 0xD5, 0x62, 0x42, 0x3C, 0xC1, 0x70, 0x8E, 0x67, 0xB1, 0xD9, 0xF3, 0x7E, 0xB2, 0xBA, 0x6D, 0x0F, 0x42, 0x65, 0x24, 0x79, 0xE8, 0x8F, 0xB4, 0x4B, 0x32, 0x35, 0xCA, 0x39, 0x70, 0xFE, 0x8E, 0x81, 0x49, 0x73, 0x8D, 0x3C, 0xCD, 0x60, 0xAF, 0xA3, 0x52, 0x45, 0xEE -}; - -/* CTR_SDK 2 (2.3.4) */ -static const unsigned char sdk2_dep_list[0x180] = -{ - 0x02, 0x24, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x15, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x34, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x16, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x26, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x17, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x18, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x27, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x28, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1A, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x32, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1B, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1C, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1D, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x29, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1E, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1F, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x20, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2B, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x35, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2C, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2D, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x21, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x31, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x22, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2E, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x23, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2F, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -// APP -static const unsigned char App_sdk2_HdrPubK[0x100] = -{ - 0xE9, 0x45, 0xF0, 0xC6, 0x96, 0xD5, 0x6F, 0x7E, 0xAE, 0x03, 0x92, 0x2E, 0xEA, 0xCB, 0xFD, 0xEA, 0xA4, 0x7A, 0x9F, 0x12, 0xDA, 0x4C, 0x10, 0x0A, 0xBE, 0x08, 0x9D, 0x87, 0xE0, 0x14, 0xAC, 0x7F, 0x39, 0xD2, 0xFE, 0x9D, 0x88, 0xB2, 0x81, 0xF6, 0x1A, 0x9E, 0x15, 0x57, 0xD4, 0xE2, 0x31, 0x08, 0x07, 0xEC, 0x4F, 0x10, 0x00, 0xDE, 0xEF, 0x8B, 0x6F, 0xCF, 0x84, 0xE7, 0x3B, 0x41, 0x08, 0x64, 0x3B, 0x1C, 0x00, 0x7C, 0x73, 0xBB, 0x59, 0x4D, 0xD8, 0xD6, 0xE7, 0x7B, 0xBE, 0xDD, 0x50, 0x98, 0xA1, 0x1A, 0xD5, 0xAA, 0x37, 0x69, 0xB8, 0x25, 0xCB, 0x7B, 0x03, 0x00, 0x90, 0x25, 0xF3, 0x7E, 0x9A, 0x0F, 0xA3, 0xAA, 0xC4, 0xB9, 0x3B, 0x3A, 0x18, 0x2B, 0xBC, 0x9C, 0x11, 0x04, 0x92, 0x16, 0x6E, 0xC3, 0xFA, 0x01, 0xD3, 0x00, 0x02, 0xF3, 0x2E, 0xD5, 0x60, 0xA8, 0xAF, 0xAB, 0xEE, 0x2F, 0x9D, 0x30, 0x3E, 0x0E, 0xDC, 0xB8, 0xEC, 0x87, 0x9E, 0x4A, 0xA9, 0x01, 0x34, 0x69, 0x2C, 0x4C, 0x34, 0xB7, 0x7D, 0xB9, 0x7A, 0x17, 0x74, 0x31, 0xB0, 0x29, 0xC4, 0x7D, 0x27, 0x1F, 0xBA, 0xBA, 0x3F, 0x5B, 0x62, 0xF6, 0x90, 0xB8, 0x37, 0x33, 0xFC, 0x73, 0xD6, 0x19, 0x11, 0xCA, 0x83, 0x2A, 0x58, 0x62, 0x9C, 0xB1, 0x83, 0x43, 0x1D, 0x2C, 0x00, 0xA2, 0xE5, 0x87, 0x97, 0x12, 0x63, 0x31, 0x83, 0x0E, 0xB1, 0x1E, 0x69, 0x99, 0x02, 0xAF, 0xDF, 0xFF, 0x0F, 0xA9, 0x7C, 0x1B, 0x33, 0x9E, 0xFF, 0x9C, 0x14, 0x19, 0xA6, 0xCA, 0xFD, 0xB9, 0x17, 0xE0, 0x22, 0xCF, 0xB5, 0x00, 0x77, 0x2E, 0x31, 0xAD, 0xF7, 0xE5, 0xAD, 0x98, 0x14, 0xDF, 0x19, 0xF0, 0xC9, 0xBE, 0x37, 0xF6, 0xF0, 0x23, 0x66, 0xCF, 0x34, 0xE3, 0xD5, 0x8F, 0xD4, 0x07, 0xBA, 0x06, 0x56, 0x00, 0x66, 0x9A, 0xEB, 0x93 -}; - -static const unsigned char App_sdk2_HdrPrivK[0x100] = -{ - 0xBC, 0x49, 0x29, 0xB9, 0x01, 0x52, 0x31, 0x76, 0x4C, 0xBA, 0xB1, 0x29, 0x91, 0x77, 0x29, 0xF2, 0x54, 0xE4, 0x6C, 0xB5, 0x68, 0xE1, 0xF0, 0x28, 0xDB, 0x8E, 0x54, 0xA8, 0xB1, 0xA3, 0xBE, 0x3F, 0xCA, 0xCA, 0x95, 0x9D, 0x4E, 0x12, 0xD7, 0x77, 0x6F, 0xB0, 0x9D, 0x85, 0x91, 0x5D, 0x29, 0x3A, 0x54, 0x3A, 0xD6, 0xEE, 0x11, 0xE5, 0xDF, 0xEF, 0xEA, 0x45, 0xD3, 0xFE, 0x58, 0x03, 0x7B, 0xE4, 0x7B, 0x19, 0x75, 0x02, 0xFE, 0xDE, 0xFF, 0x8C, 0x28, 0x33, 0xFE, 0x10, 0x11, 0xD4, 0xCD, 0x13, 0x05, 0x26, 0x85, 0xC3, 0xA8, 0x8A, 0x7A, 0x8A, 0x77, 0x1D, 0x49, 0x25, 0x11, 0x34, 0xB0, 0xBF, 0x45, 0x56, 0xCE, 0x42, 0x2E, 0x1B, 0x5C, 0xC4, 0xDD, 0x71, 0xA0, 0x01, 0x50, 0x73, 0x21, 0xFF, 0x5D, 0x54, 0x6D, 0xDD, 0x3F, 0x14, 0x49, 0x4D, 0x44, 0x46, 0x12, 0x88, 0xD5, 0x92, 0xAE, 0xE2, 0xD0, 0xF6, 0x2C, 0x10, 0xD5, 0x67, 0x61, 0x87, 0x7F, 0x2A, 0x17, 0x9D, 0x4F, 0xC6, 0x79, 0xC3, 0xAF, 0x4D, 0x6F, 0xFB, 0x0F, 0x3B, 0x48, 0x5D, 0x46, 0x9A, 0xE8, 0x53, 0xB7, 0xC5, 0x69, 0xEC, 0x31, 0x25, 0xD1, 0xDC, 0x93, 0xAB, 0x2E, 0x53, 0x3B, 0x8E, 0x96, 0x27, 0x59, 0xD4, 0xF7, 0xB3, 0xAB, 0x51, 0x59, 0xAE, 0x6E, 0x26, 0x4F, 0xC2, 0x95, 0xCE, 0x42, 0xC6, 0xAF, 0x46, 0xC6, 0x2E, 0x32, 0x09, 0x7B, 0xAF, 0x67, 0x4E, 0x57, 0xC8, 0x93, 0x5F, 0x8C, 0xD5, 0x66, 0x7B, 0xCC, 0xE9, 0xBE, 0x86, 0xB9, 0xBB, 0xD0, 0xC8, 0xD2, 0xDC, 0x5F, 0x95, 0x83, 0x28, 0x55, 0x21, 0x1E, 0xEE, 0xCF, 0x23, 0xB7, 0x6D, 0xE0, 0x9A, 0x87, 0x99, 0xFB, 0x82, 0x50, 0xD0, 0x2D, 0xC4, 0xFB, 0xA0, 0x11, 0x2F, 0xDD, 0x05, 0x7E, 0x1C, 0xE3, 0xFB, 0x98, 0x69, 0xD4, 0x49, 0x2F, 0x0D, 0xF6, 0x61 -}; - -static const unsigned char App_sdk2_AcexData[0x200] = -{ - 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x50, 0x54, 0x3A, 0x55, 0x00, 0x00, 0x00, 0x24, 0x68, 0x69, 0x6F, 0x46, 0x49, 0x4F, 0x00, 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x30, 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x31, 0x61, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x00, 0x62, 0x6F, 0x73, 0x73, 0x3A, 0x55, 0x00, 0x00, 0x63, 0x61, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x63, 0x65, 0x63, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x63, 0x66, 0x67, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x64, 0x6C, 0x70, 0x3A, 0x46, 0x4B, 0x43, 0x4C, 0x64, 0x6C, 0x70, 0x3A, 0x53, 0x52, 0x56, 0x52, 0x64, 0x73, 0x70, 0x3A, 0x3A, 0x44, 0x53, 0x50, 0x66, 0x72, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x66, 0x73, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x00, 0x67, 0x73, 0x70, 0x3A, 0x3A, 0x47, 0x70, 0x75, 0x68, 0x69, 0x64, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x43, 0x00, 0x00, 0x6D, 0x69, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6E, 0x64, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6E, 0x65, 0x77, 0x73, 0x3A, 0x75, 0x00, 0x00, 0x6E, 0x77, 0x6D, 0x3A, 0x3A, 0x55, 0x44, 0x53, 0x70, 0x74, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x70, 0x78, 0x69, 0x3A, 0x64, 0x65, 0x76, 0x00, 0x73, 0x6F, 0x63, 0x3A, 0x55, 0x00, 0x00, 0x00, 0x73, 0x73, 0x6C, 0x3A, 0x43, 0x00, 0x00, 0x00, 0x79, 0x32, 0x72, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x69, 0x72, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x00, 0x6C, 0x64, 0x72, 0x3A, 0x72, 0x6F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFB, 0xF0, 0xFF, 0xBF, 0xFF, 0xF1, 0xE7, 0x3F, 0x00, 0xF2, 0x00, 0xF0, 0x91, 0xFF, 0x00, 0xF6, 0x91, 0xFF, 0x50, 0xFF, 0x81, 0xFF, 0x58, 0xFF, 0x81, 0xFF, 0x70, 0xFF, 0x81, 0xFF, 0x78, 0xFF, 0x81, 0xFF, 0x01, 0x01, 0x00, 0xFF, 0x00, 0x02, 0x00, 0xFE, 0x1D, 0x02, 0x00, 0xFC, 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, 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, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 -}; - -static const unsigned char App_sdk2_AcexSig[0x100] = -{ - 0x62, 0xFE, 0xD9, 0x12, 0x3D, 0x99, 0x53, 0xC4, 0x20, 0x25, 0xDE, 0x59, 0xEA, 0x6E, 0xF3, 0x16, 0x5B, 0x36, 0xBA, 0x1C, 0xB3, 0xB5, 0x48, 0x37, 0xD2, 0xA4, 0x04, 0xE5, 0x14, 0xC6, 0xE7, 0x22, 0x14, 0x40, 0x6F, 0x92, 0x6A, 0x9B, 0xDF, 0xDE, 0xFA, 0xCE, 0x3C, 0xBB, 0x4B, 0xC4, 0x66, 0xA8, 0x86, 0x58, 0xAC, 0xEB, 0x2F, 0xB7, 0xA3, 0xEC, 0xEA, 0x31, 0x23, 0x61, 0xF6, 0x72, 0x1E, 0x26, 0x8A, 0x1D, 0x68, 0x2A, 0x2A, 0x21, 0x5A, 0xA2, 0x6A, 0xBD, 0xCE, 0xC0, 0x19, 0x08, 0x61, 0x64, 0xB3, 0xF6, 0x90, 0xB1, 0x34, 0xF8, 0x50, 0x6F, 0x83, 0xB6, 0x8D, 0x35, 0x12, 0x7F, 0x9C, 0x7B, 0x6E, 0x3C, 0x4E, 0xD1, 0xFD, 0xC3, 0x30, 0xD2, 0xE8, 0x7E, 0x15, 0x1F, 0xAD, 0xDB, 0x1D, 0x92, 0xDA, 0x8C, 0x4E, 0xE9, 0x84, 0x83, 0xFF, 0x1A, 0x09, 0x77, 0x05, 0x5A, 0xCF, 0x5C, 0x8B, 0x4F, 0x68, 0x36, 0xC8, 0xDA, 0x5B, 0x1A, 0x5A, 0x49, 0xF9, 0xA1, 0xF2, 0xC8, 0x02, 0xFD, 0x69, 0x1F, 0x1D, 0xB3, 0xE8, 0xF8, 0xE1, 0x6B, 0x15, 0x9A, 0x5E, 0x41, 0x84, 0x06, 0x1F, 0x2A, 0xB3, 0xB2, 0xA1, 0xDC, 0x63, 0x81, 0xB3, 0x6B, 0x4B, 0x21, 0x67, 0x19, 0x82, 0x52, 0xFE, 0x75, 0x96, 0xA1, 0xDF, 0x02, 0xD4, 0x07, 0x1F, 0x1B, 0x88, 0x12, 0x5A, 0x76, 0x54, 0xC4, 0x06, 0x2D, 0xB1, 0xAA, 0x41, 0x3C, 0x9F, 0x43, 0xA2, 0x75, 0x20, 0x39, 0xB6, 0x06, 0xF9, 0x9C, 0xFC, 0x00, 0xC5, 0xBC, 0x84, 0x13, 0x80, 0xE4, 0x10, 0x1A, 0xCD, 0x95, 0xBB, 0xF2, 0xDC, 0x57, 0x7B, 0xBA, 0x87, 0x05, 0x0B, 0x96, 0xC1, 0xCD, 0x60, 0xC7, 0x10, 0x44, 0x78, 0x0E, 0x0F, 0x2F, 0x91, 0x54, 0x6C, 0xDE, 0xB8, 0x14, 0x46, 0xF3, 0x9C, 0xAC, 0x7B, 0xAA, 0xE7, 0x1B, 0x52, 0xD6, 0xBE, 0x71, 0x97, 0x22 -}; - -// DLP -static const unsigned char Dlp_sdk2_HdrPubK[0x100] = -{ - 0xB9, 0xDE, 0x3D, 0xC0, 0x55, 0xB9, 0xCC, 0x3F, 0x55, 0xE0, 0x61, 0x1D, 0x6F, 0xCF, 0x3E, 0x7F, 0xE2, 0xF7, 0xF5, 0xAD, 0x5C, 0x02, 0x7F, 0x17, 0x5B, 0x44, 0x2F, 0x2D, 0xDC, 0xD4, 0xA6, 0x63, 0xD2, 0xA7, 0x82, 0xD3, 0x00, 0x77, 0xC8, 0x0B, 0x28, 0x09, 0x3D, 0x81, 0x86, 0x93, 0xF5, 0xF6, 0xE4, 0x69, 0x3B, 0x60, 0x4C, 0x7F, 0x8D, 0x72, 0xA3, 0x22, 0x42, 0x86, 0x87, 0x06, 0xD8, 0x29, 0x89, 0x8A, 0x9F, 0x5F, 0x6C, 0x06, 0x0C, 0x96, 0x84, 0x00, 0x24, 0x5D, 0x0B, 0xEA, 0x15, 0xEC, 0xAD, 0x90, 0xA4, 0x0C, 0x7B, 0xAE, 0x0E, 0x85, 0x3E, 0xA2, 0x20, 0x04, 0xE8, 0xD9, 0x59, 0x0F, 0x31, 0x0E, 0xD4, 0x5D, 0xC1, 0x18, 0xED, 0x0E, 0xB4, 0xD2, 0x5E, 0x65, 0xA2, 0x78, 0x0C, 0x76, 0x03, 0x3A, 0x71, 0x18, 0xE4, 0x38, 0x44, 0x14, 0xE0, 0x93, 0x84, 0xFE, 0x34, 0x82, 0xCA, 0x0B, 0xB8, 0xF2, 0x41, 0xAB, 0x63, 0xF3, 0xDE, 0xAE, 0xF4, 0x36, 0x81, 0xA4, 0x78, 0x7B, 0xF9, 0xA8, 0xFB, 0xC9, 0xA7, 0x6E, 0xA4, 0xD5, 0xE2, 0xA9, 0xD8, 0xD9, 0xE8, 0x98, 0x1B, 0x25, 0x75, 0x00, 0x11, 0x51, 0x97, 0x62, 0x0D, 0xF0, 0x0C, 0xE9, 0x6B, 0x0C, 0xEE, 0xCE, 0x25, 0x2C, 0x3F, 0xDF, 0xBE, 0x54, 0xD5, 0xD6, 0x5E, 0xEE, 0x1F, 0x73, 0xFC, 0xE8, 0xEC, 0xB3, 0x8A, 0x48, 0x9F, 0x6A, 0xC1, 0x63, 0x85, 0xE4, 0x94, 0x85, 0x8F, 0x3D, 0x9D, 0x43, 0xB4, 0xA7, 0x4C, 0x82, 0xA3, 0x0B, 0x67, 0x43, 0x12, 0x31, 0x77, 0x89, 0xB0, 0xD5, 0x00, 0x1B, 0x52, 0x29, 0xCE, 0x54, 0xC7, 0xC4, 0x7D, 0xB6, 0x69, 0x7B, 0xFE, 0xDC, 0xDB, 0x4E, 0xD8, 0x58, 0x42, 0x14, 0x34, 0x72, 0x64, 0xBC, 0x09, 0x6D, 0xAC, 0xD3, 0xC4, 0x1B, 0x5C, 0x8E, 0xF9, 0xBE, 0x84, 0xCD, 0x9A, 0x86, 0x4B, 0x17 -}; - -static const unsigned char Dlp_sdk2_HdrPrivK[0x100] = -{ - 0xAA, 0x51, 0x62, 0x58, 0x9A, 0xB5, 0x74, 0xDA, 0x1C, 0xC1, 0x4D, 0x7C, 0x81, 0xF6, 0x70, 0x99, 0x13, 0xCC, 0x90, 0x0D, 0xD9, 0xA0, 0x58, 0x01, 0x79, 0x1A, 0x53, 0xF9, 0x3C, 0xC0, 0x87, 0xF0, 0x35, 0x1A, 0x56, 0xA1, 0x2F, 0x6E, 0x93, 0x9A, 0xD5, 0x87, 0x12, 0x1B, 0x5C, 0xCC, 0xBC, 0xB9, 0x0E, 0xB8, 0xF7, 0x35, 0xD9, 0x23, 0x90, 0xE4, 0x19, 0x64, 0xCD, 0x7D, 0x24, 0xC2, 0x3A, 0xD6, 0x65, 0x38, 0xE7, 0xAD, 0xB2, 0xF9, 0x20, 0x13, 0xD4, 0xC5, 0xA4, 0x8C, 0xB6, 0xDC, 0x3C, 0x56, 0xF2, 0xFC, 0xF5, 0xB6, 0x92, 0xA6, 0xFE, 0x9B, 0x4E, 0xB7, 0x95, 0x8B, 0xAA, 0x2B, 0x70, 0x96, 0xA1, 0x27, 0xAB, 0xA6, 0x75, 0xC9, 0x77, 0x80, 0xE0, 0x65, 0x5D, 0x26, 0xD8, 0xE8, 0x14, 0xD3, 0x17, 0x46, 0x38, 0x58, 0xCC, 0xD8, 0x5A, 0x5A, 0x9F, 0x27, 0xCE, 0xD8, 0x7A, 0x19, 0xD7, 0x35, 0xB2, 0x32, 0xAF, 0x47, 0x2E, 0x9F, 0x4B, 0x64, 0xEC, 0x1F, 0xC6, 0x40, 0xD0, 0x2C, 0x47, 0xD1, 0xEA, 0x33, 0xE5, 0x0E, 0x80, 0xFC, 0x68, 0xEC, 0x8C, 0x12, 0x33, 0xCE, 0x34, 0x28, 0x79, 0xFA, 0x05, 0x5D, 0x70, 0x15, 0xDE, 0xB1, 0x22, 0x85, 0x18, 0x63, 0x15, 0x35, 0x57, 0x04, 0x17, 0x64, 0x20, 0xC8, 0x52, 0x44, 0x64, 0x5E, 0x47, 0x4E, 0x5F, 0x80, 0x21, 0x16, 0x94, 0x4B, 0x18, 0x11, 0x36, 0x67, 0x3B, 0x6C, 0x69, 0x19, 0xCF, 0xC9, 0x05, 0x85, 0x9B, 0x3A, 0xDE, 0x12, 0x1E, 0x0A, 0xC6, 0x22, 0xA8, 0xC7, 0x9A, 0x34, 0x14, 0x98, 0xFD, 0xD9, 0x0F, 0xE8, 0x64, 0xE6, 0x89, 0x63, 0x6E, 0x17, 0x76, 0xD7, 0x1B, 0x6F, 0x92, 0x00, 0xD8, 0xBB, 0xF6, 0xA0, 0x65, 0x9D, 0xAA, 0x7A, 0x0E, 0x4B, 0x56, 0xA5, 0x33, 0xDA, 0x3F, 0x5D, 0xFE, 0xD3, 0xAD, 0x6E, 0x0E, 0xB3, 0xD4, 0x41 -}; - -static const unsigned char Dlp_sdk2_AcexData[0x200] = -{ - 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x50, 0x54, 0x3A, 0x55, 0x00, 0x00, 0x00, 0x24, 0x68, 0x69, 0x6F, 0x46, 0x49, 0x4F, 0x00, 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x30, 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x31, 0x61, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x00, 0x62, 0x6F, 0x73, 0x73, 0x3A, 0x55, 0x00, 0x00, 0x63, 0x61, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x63, 0x65, 0x63, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x63, 0x66, 0x67, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x64, 0x6C, 0x70, 0x3A, 0x46, 0x4B, 0x43, 0x4C, 0x64, 0x6C, 0x70, 0x3A, 0x53, 0x52, 0x56, 0x52, 0x64, 0x73, 0x70, 0x3A, 0x3A, 0x44, 0x53, 0x50, 0x66, 0x72, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x66, 0x73, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x00, 0x67, 0x73, 0x70, 0x3A, 0x3A, 0x47, 0x70, 0x75, 0x68, 0x69, 0x64, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x43, 0x00, 0x00, 0x6D, 0x69, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6E, 0x64, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6E, 0x65, 0x77, 0x73, 0x3A, 0x75, 0x00, 0x00, 0x6E, 0x77, 0x6D, 0x3A, 0x3A, 0x55, 0x44, 0x53, 0x70, 0x74, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x70, 0x78, 0x69, 0x3A, 0x64, 0x65, 0x76, 0x00, 0x73, 0x6F, 0x63, 0x3A, 0x55, 0x00, 0x00, 0x00, 0x73, 0x73, 0x6C, 0x3A, 0x43, 0x00, 0x00, 0x00, 0x79, 0x32, 0x72, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x69, 0x72, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x00, 0x6C, 0x64, 0x72, 0x3A, 0x72, 0x6F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFB, 0xF0, 0xFF, 0xBF, 0xFF, 0xF1, 0xE7, 0x3F, 0x00, 0xF2, 0x00, 0xF0, 0x91, 0xFF, 0x00, 0xF6, 0x91, 0xFF, 0x50, 0xFF, 0x81, 0xFF, 0x58, 0xFF, 0x81, 0xFF, 0x70, 0xFF, 0x81, 0xFF, 0x78, 0xFF, 0x81, 0xFF, 0x01, 0x01, 0x00, 0xFF, 0x00, 0x02, 0x00, 0xFE, 0x1D, 0x02, 0x00, 0xFC, 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, 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, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 -}; - -static const unsigned char Dlp_sdk2_AcexSig[0x100] = -{ - 0x97, 0x84, 0x97, 0xEE, 0x4F, 0x35, 0xCC, 0xBE, 0x08, 0xB4, 0x5D, 0x7E, 0x17, 0xC3, 0x94, 0x2B, 0x4D, 0x3A, 0xA5, 0xB5, 0x01, 0xD4, 0xAE, 0x2A, 0x90, 0x26, 0x21, 0x8F, 0x56, 0x05, 0xB9, 0xA2, 0x5E, 0xCE, 0x73, 0xC7, 0x42, 0xDC, 0x99, 0xD2, 0x7C, 0x08, 0x62, 0xBF, 0x10, 0x7A, 0xC1, 0x5D, 0x22, 0x53, 0x8F, 0x63, 0x2D, 0x73, 0xF3, 0x05, 0xDA, 0x9D, 0x6A, 0xF8, 0xB9, 0x5B, 0x80, 0xB4, 0x30, 0xB3, 0x11, 0xF7, 0x96, 0x8A, 0xCF, 0x70, 0xD7, 0x62, 0x6E, 0x99, 0x32, 0xFD, 0x74, 0x34, 0x16, 0xFD, 0x17, 0x1F, 0xB1, 0xEC, 0xA4, 0x0F, 0x52, 0x13, 0x9F, 0x62, 0x0D, 0xE0, 0x50, 0xA6, 0xA0, 0x7B, 0x69, 0x95, 0xE0, 0xE9, 0xBB, 0x38, 0x0C, 0x62, 0xE0, 0xE3, 0xCE, 0x82, 0xE0, 0xB9, 0xE0, 0xF6, 0x61, 0x50, 0xBF, 0xA8, 0x18, 0x15, 0x38, 0xFE, 0xFA, 0x8C, 0xBA, 0xA5, 0xB9, 0x9C, 0x05, 0xA6, 0x91, 0x5C, 0xA7, 0x13, 0x6F, 0x13, 0x3F, 0xF1, 0xF6, 0x68, 0xAF, 0x40, 0xEC, 0x27, 0xE0, 0x33, 0x6B, 0xCF, 0x26, 0x06, 0xF8, 0x6A, 0x13, 0x6C, 0xBC, 0xDB, 0xAF, 0x6F, 0x78, 0xA0, 0x80, 0x10, 0x8F, 0xB6, 0x91, 0x5A, 0x43, 0x2C, 0x5F, 0x1D, 0xBA, 0xB4, 0x5E, 0xBE, 0xAE, 0x53, 0x09, 0x17, 0x5B, 0x6C, 0xC1, 0x5E, 0x0F, 0x72, 0x6E, 0xD6, 0x10, 0x0B, 0xC3, 0x26, 0xDC, 0xAF, 0xCA, 0x28, 0xAB, 0x00, 0x67, 0x04, 0xE3, 0x54, 0xE8, 0x95, 0xC6, 0x23, 0xB6, 0x79, 0x70, 0xA4, 0x87, 0x6D, 0x12, 0x48, 0xCC, 0x11, 0x86, 0xEC, 0x82, 0xF4, 0x30, 0xC9, 0xB1, 0x6D, 0x08, 0xA7, 0xEA, 0x8C, 0x6A, 0x97, 0xAA, 0x89, 0xD5, 0xC5, 0x07, 0xA9, 0xD5, 0xCF, 0x09, 0x08, 0xBC, 0x56, 0x63, 0x8D, 0x70, 0x2F, 0x64, 0xAF, 0x51, 0x9E, 0x22, 0xA4, 0x88, 0xF0, 0xDC, 0x56, 0x72, 0x28 -}; - - -/* CTR_SDK 4/5 (4.2.8) */ -// DependencyList -static const unsigned char sdk4_dep_list[0x180] = -{ - 0x02, 0x24, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x15, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x34, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x16, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x26, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x17, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x18, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x27, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x28, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1A, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x32, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1B, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1C, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1D, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x29, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1E, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x33, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1F, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x20, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2B, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x35, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2C, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2D, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x21, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x31, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x22, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x37, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2E, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x23, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2F, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -// APP -static const unsigned char App_sdk4_HdrPubK[0x100] = -{ - 0xCF, 0xEC, 0xB2, 0x48, 0x03, 0x6D, 0xB8, 0x09, 0xE3, 0x5C, 0x6C, 0x62, 0x2C, 0xA9, 0x49, 0xE1, 0xF4, 0xF4, 0x0C, 0x6C, 0xC3, 0xE5, 0x2F, 0x9D, 0x50, 0xA0, 0x2B, 0x5A, 0x00, 0xC6, 0x72, 0x00, 0x0B, 0xA3, 0x04, 0x5D, 0x94, 0x46, 0xE7, 0x00, 0x1B, 0x48, 0x85, 0xB5, 0x61, 0x2C, 0xC9, 0x74, 0xCA, 0x2B, 0x43, 0x13, 0xC1, 0x78, 0x97, 0x5C, 0x33, 0x2F, 0x07, 0xC7, 0x85, 0xF0, 0xDA, 0xDB, 0x60, 0x96, 0x50, 0x0F, 0x7C, 0x4B, 0x7A, 0xD7, 0x17, 0x9D, 0xE4, 0xE5, 0xC3, 0xAB, 0x6F, 0x5D, 0xA5, 0x78, 0x32, 0xAD, 0x04, 0xDD, 0x96, 0x6E, 0xDC, 0x75, 0xFF, 0xC2, 0x2F, 0xFA, 0xA2, 0xEE, 0x46, 0x89, 0xCD, 0xAE, 0x69, 0x92, 0xA4, 0x48, 0xBC, 0x46, 0x47, 0xC4, 0x8C, 0x89, 0x63, 0xE1, 0x0A, 0x4D, 0x1C, 0xDC, 0x46, 0x2F, 0x5B, 0x70, 0x8A, 0x7C, 0xE9, 0x22, 0x9C, 0x09, 0x0B, 0xA8, 0x97, 0x40, 0xCA, 0x2A, 0x7D, 0x84, 0xA1, 0x04, 0x4A, 0x2E, 0xDB, 0xD7, 0xD0, 0x64, 0x43, 0x9C, 0xD0, 0x78, 0x11, 0x41, 0x88, 0x33, 0xDD, 0x31, 0x62, 0x90, 0x2D, 0x17, 0xF2, 0xC6, 0xA9, 0x2B, 0x9C, 0x70, 0xAB, 0xDC, 0xD3, 0xAB, 0x5D, 0xDA, 0xEE, 0x3D, 0x6C, 0x0E, 0x81, 0xFF, 0xF6, 0x67, 0x5A, 0x44, 0xF9, 0xAC, 0x07, 0x3D, 0x23, 0x94, 0x75, 0x65, 0x93, 0x20, 0x0C, 0xC5, 0x76, 0x1D, 0x0F, 0x65, 0x06, 0x3D, 0x21, 0xA2, 0xF0, 0x96, 0x80, 0xB7, 0x0A, 0x49, 0x53, 0x38, 0xA3, 0x5D, 0xC0, 0x74, 0x3C, 0xA4, 0xD9, 0x40, 0x36, 0x85, 0x1F, 0x8C, 0xD1, 0x2D, 0x15, 0xF9, 0xEF, 0x24, 0xA9, 0x7E, 0x9D, 0xB2, 0x1E, 0xF8, 0xA0, 0x72, 0x81, 0x17, 0x77, 0x73, 0xB1, 0x56, 0x7F, 0xAD, 0x05, 0xA2, 0xD2, 0x30, 0x5A, 0xF5, 0xD3, 0xAF, 0x0F, 0x10, 0x4A, 0x52, 0xD8, 0x09, 0x47, 0x97 -}; - -static const unsigned char App_sdk4_HdrPrivK[0x100] = -{ - 0x8C, 0xBD, 0xB2, 0x3B, 0xCE, 0x9E, 0x51, 0x09, 0xD8, 0x6D, 0x72, 0x2B, 0xCE, 0x01, 0x55, 0x32, 0x6E, 0xC5, 0x57, 0x37, 0xB4, 0x2E, 0x09, 0x59, 0xD9, 0xFE, 0x60, 0xF9, 0xCE, 0x36, 0x85, 0x6A, 0x04, 0x76, 0x76, 0xF9, 0x04, 0xEA, 0x2D, 0x68, 0xC4, 0x0F, 0x05, 0xFA, 0xAD, 0x69, 0x4C, 0x80, 0x12, 0x6C, 0xD0, 0x3D, 0xAA, 0x22, 0xFF, 0x89, 0x78, 0x57, 0xE8, 0x53, 0x25, 0x15, 0xD0, 0x7E, 0xD8, 0x55, 0x46, 0xA2, 0x04, 0xC7, 0x6E, 0xC1, 0xF3, 0x89, 0x7C, 0x2C, 0x0E, 0x93, 0x97, 0x91, 0x72, 0xF4, 0xF6, 0x90, 0x69, 0x0F, 0xB8, 0xC9, 0x17, 0xCF, 0x83, 0xAC, 0xA5, 0x1F, 0x69, 0x74, 0x12, 0x29, 0x2B, 0x21, 0x58, 0xF2, 0xDA, 0xE3, 0x25, 0x16, 0x09, 0x74, 0x40, 0x90, 0xAB, 0x1B, 0xE4, 0x06, 0x28, 0x77, 0xED, 0xC6, 0x16, 0x86, 0x0A, 0x27, 0xDD, 0x03, 0x01, 0x4D, 0x9A, 0x26, 0x6E, 0xC8, 0x9F, 0xD3, 0x9A, 0x4B, 0x59, 0xD1, 0x10, 0x9B, 0xEB, 0xA9, 0x58, 0x72, 0xBD, 0xA1, 0xFE, 0x9D, 0x86, 0xED, 0x29, 0xE9, 0x29, 0x49, 0x62, 0x4B, 0xD8, 0x7D, 0x2A, 0x7A, 0x66, 0x1B, 0xE5, 0x04, 0x81, 0x56, 0x10, 0x50, 0xAF, 0xB8, 0x48, 0x27, 0xC1, 0xC9, 0x46, 0xBD, 0x3F, 0x16, 0x06, 0xA5, 0x3D, 0x04, 0x9F, 0x0D, 0x54, 0x71, 0x1C, 0xF4, 0x82, 0xC0, 0x66, 0x74, 0xEA, 0x9C, 0x83, 0x3C, 0x27, 0x01, 0xDF, 0x6F, 0x56, 0xA8, 0x1B, 0xE3, 0x68, 0x55, 0x9F, 0xAB, 0x90, 0x67, 0x20, 0x25, 0xFA, 0x3D, 0x51, 0x2A, 0x23, 0x16, 0xCB, 0x06, 0x5A, 0xAD, 0xAC, 0xC8, 0x47, 0xF9, 0x39, 0x2E, 0x6A, 0xF8, 0xFA, 0x0A, 0xE8, 0x8A, 0x64, 0x84, 0x6B, 0xED, 0xDA, 0x8F, 0x2A, 0x08, 0x86, 0x8F, 0x56, 0x69, 0x64, 0xC3, 0x98, 0x55, 0x37, 0x9A, 0x48, 0x40, 0xDA, 0xD5, 0x03, 0x21 -}; - -static const unsigned char App_sdk4_AcexData[0x200] = -{ - 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x18, 0x9E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x50, 0x54, 0x3A, 0x55, 0x00, 0x00, 0x00, 0x24, 0x68, 0x69, 0x6F, 0x46, 0x49, 0x4F, 0x00, 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x30, 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x31, 0x61, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x00, 0x62, 0x6F, 0x73, 0x73, 0x3A, 0x55, 0x00, 0x00, 0x63, 0x61, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x63, 0x65, 0x63, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x63, 0x66, 0x67, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x64, 0x6C, 0x70, 0x3A, 0x46, 0x4B, 0x43, 0x4C, 0x64, 0x6C, 0x70, 0x3A, 0x53, 0x52, 0x56, 0x52, 0x64, 0x73, 0x70, 0x3A, 0x3A, 0x44, 0x53, 0x50, 0x66, 0x72, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x66, 0x73, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x00, 0x67, 0x73, 0x70, 0x3A, 0x3A, 0x47, 0x70, 0x75, 0x68, 0x69, 0x64, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x43, 0x00, 0x00, 0x6D, 0x69, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6E, 0x64, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6E, 0x65, 0x77, 0x73, 0x3A, 0x75, 0x00, 0x00, 0x6E, 0x77, 0x6D, 0x3A, 0x3A, 0x55, 0x44, 0x53, 0x70, 0x74, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x70, 0x78, 0x69, 0x3A, 0x64, 0x65, 0x76, 0x00, 0x73, 0x6F, 0x63, 0x3A, 0x55, 0x00, 0x00, 0x00, 0x73, 0x73, 0x6C, 0x3A, 0x43, 0x00, 0x00, 0x00, 0x79, 0x32, 0x72, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6C, 0x64, 0x72, 0x3A, 0x72, 0x6F, 0x00, 0x00, 0x69, 0x72, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x9F, 0xFA, 0xF0, 0xFF, 0xBF, 0xFF, 0xF1, 0xE7, 0x3F, 0x00, 0xF2, 0x00, 0xF0, 0x91, 0xFF, 0x00, 0xF6, 0x91, 0xFF, 0x50, 0xFF, 0x81, 0xFF, 0x58, 0xFF, 0x81, 0xFF, 0x70, 0xFF, 0x81, 0xFF, 0x78, 0xFF, 0x81, 0xFF, 0x01, 0x01, 0x00, 0xFF, 0x00, 0x02, 0x00, 0xFE, 0x21, 0x02, 0x00, 0xFC, 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, 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, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 -}; - -static const unsigned char App_sdk4_AcexSig[0x100] = -{ - 0xDF, 0x1C, 0x8B, 0x98, 0xE4, 0x6F, 0xA2, 0x35, 0x6C, 0xC3, 0x18, 0x17, 0x98, 0xF3, 0xCE, 0x54, 0x7E, 0x14, 0x2E, 0x7F, 0x1E, 0xD8, 0x6D, 0xCF, 0xBC, 0x29, 0x4E, 0xFE, 0x32, 0x2E, 0xC1, 0x11, 0xAD, 0x46, 0x9A, 0xC6, 0x70, 0xEA, 0xEE, 0x28, 0x55, 0x22, 0xE1, 0x36, 0x05, 0x1C, 0x04, 0x8A, 0xCE, 0x0F, 0x0C, 0x83, 0x8F, 0xC8, 0xD6, 0xDE, 0x11, 0x8E, 0xEA, 0xCF, 0xAD, 0x9B, 0xCF, 0x81, 0x0D, 0xEB, 0x71, 0x13, 0xB3, 0xD3, 0xAE, 0x83, 0x02, 0x4C, 0x0E, 0x10, 0x50, 0x59, 0x3C, 0xEE, 0x60, 0x06, 0xFB, 0x8C, 0x7F, 0xC2, 0x20, 0x24, 0x01, 0x62, 0x55, 0x87, 0x60, 0x0F, 0xAD, 0xFA, 0x73, 0x2E, 0xF6, 0x65, 0x62, 0xD2, 0xE5, 0x10, 0x45, 0x69, 0x70, 0x39, 0x03, 0xD1, 0x39, 0xEC, 0x50, 0xC1, 0xD4, 0x25, 0x39, 0xB2, 0x90, 0x11, 0x4E, 0x95, 0xCB, 0x19, 0xEB, 0xCA, 0x0F, 0xB5, 0xFA, 0xC7, 0xB0, 0xE2, 0xD7, 0xE0, 0x71, 0xC3, 0xE5, 0x55, 0x33, 0x9E, 0x5C, 0xDC, 0x4D, 0x3B, 0x51, 0x11, 0x0D, 0x31, 0x78, 0x96, 0xCA, 0xD7, 0x18, 0x58, 0xEE, 0x00, 0xE9, 0x28, 0xF2, 0x68, 0x76, 0xD4, 0x57, 0xFE, 0x65, 0xB1, 0x4B, 0x49, 0x3F, 0xF6, 0xA6, 0x58, 0x4A, 0xC7, 0xFC, 0xC4, 0xBB, 0x61, 0xBC, 0x58, 0x8D, 0x55, 0x65, 0xE6, 0x0A, 0x79, 0x39, 0x41, 0xB8, 0x80, 0x61, 0xF7, 0x05, 0xC3, 0xFE, 0xD6, 0x8B, 0x09, 0x82, 0xC2, 0x5F, 0xA6, 0x56, 0xF9, 0xEE, 0x1D, 0x0E, 0x06, 0x3E, 0x9F, 0x3F, 0xF1, 0x93, 0x9A, 0x4F, 0xA2, 0xD5, 0x91, 0x87, 0x8A, 0xFE, 0xCF, 0xC3, 0xFC, 0x8A, 0xB1, 0xC4, 0x78, 0xE9, 0xD1, 0x1A, 0xF7, 0xB1, 0xD3, 0x20, 0xCB, 0x83, 0xBE, 0x03, 0xD5, 0xCA, 0xA5, 0x5E, 0x17, 0xA6, 0x91, 0x10, 0xD4, 0xBE, 0x23, 0xD6, 0x4B, 0x4F, 0x03, 0xA9, 0xAE -}; - -// DEMO -static const unsigned char Demo_sdk4_HdrPubK[0x100] = -{ - 0xB5, 0x11, 0x8D, 0x9E, 0x2D, 0xDB, 0x70, 0x6D, 0x6E, 0xEE, 0xAA, 0x21, 0xE0, 0x4E, 0x80, 0x0A, 0x96, 0x4A, 0x10, 0xD0, 0x9C, 0xD7, 0xD9, 0xD4, 0x94, 0x87, 0x72, 0xA2, 0xAF, 0x02, 0xA0, 0x05, 0x2E, 0xBF, 0x17, 0xEB, 0xFE, 0x5B, 0x9F, 0xB7, 0x0B, 0x1E, 0x3E, 0xF9, 0xAC, 0xBC, 0x7B, 0xB1, 0x56, 0x10, 0x24, 0x5F, 0x57, 0x2C, 0x08, 0xD0, 0x14, 0x79, 0x83, 0x84, 0x6A, 0x45, 0x25, 0xEB, 0xD9, 0xBE, 0x02, 0x21, 0xF7, 0x35, 0xC2, 0x74, 0x57, 0xC5, 0xAC, 0x34, 0x05, 0xC6, 0x9E, 0x82, 0xB8, 0xED, 0x78, 0xC4, 0x3B, 0xFD, 0x23, 0x59, 0x54, 0xD2, 0x0A, 0x0B, 0x5B, 0x25, 0xC0, 0x71, 0xC3, 0x84, 0x3A, 0xA7, 0xF9, 0x99, 0x86, 0xD8, 0xFE, 0x60, 0x10, 0x85, 0x77, 0x57, 0x76, 0x0C, 0x25, 0xE1, 0x18, 0x18, 0x3B, 0x83, 0xFD, 0x36, 0x7C, 0x84, 0x58, 0xC2, 0xC4, 0x68, 0x4F, 0xD1, 0xD7, 0x0A, 0x88, 0xFD, 0xCA, 0x97, 0xA1, 0xE5, 0xCE, 0x72, 0x63, 0xCF, 0x74, 0xD0, 0x20, 0xD9, 0xDE, 0x3F, 0xBB, 0x11, 0xF9, 0x21, 0xAB, 0x3F, 0x54, 0x41, 0xA7, 0xAA, 0xCA, 0xFC, 0xE1, 0x1A, 0x8C, 0x12, 0xC9, 0x39, 0x13, 0x5A, 0x81, 0x29, 0x49, 0xE8, 0xFB, 0x48, 0xC9, 0x4D, 0x50, 0x87, 0xAE, 0x51, 0xFB, 0x94, 0xFC, 0xF0, 0x9C, 0x70, 0x1C, 0xE8, 0x6E, 0x44, 0x53, 0x1E, 0x2F, 0x27, 0x5C, 0xB8, 0xEC, 0xBE, 0xFC, 0xD9, 0x98, 0x6A, 0x08, 0xD0, 0x5C, 0x4D, 0x78, 0x2D, 0x4D, 0x07, 0xAD, 0x5E, 0xB8, 0x51, 0x40, 0xE2, 0x2A, 0x7F, 0xB1, 0x54, 0x47, 0x5C, 0x99, 0x12, 0xC2, 0x6D, 0x5E, 0xED, 0x25, 0x30, 0x6A, 0x99, 0xC5, 0x0D, 0x65, 0x83, 0x68, 0x3A, 0xFD, 0x82, 0x59, 0x0D, 0xCE, 0x0B, 0x49, 0xBE, 0x17, 0x46, 0x51, 0xA9, 0xB6, 0x54, 0xE1, 0x18, 0xBD, 0x49, 0xE6, 0x7F -}; - -static const unsigned char Demo_sdk4_HdrPrivK[0x100] = -{ - 0x1D, 0x7B, 0x79, 0x32, 0xAB, 0x46, 0xD2, 0xBC, 0x8E, 0xD6, 0x7F, 0x8F, 0x3A, 0x85, 0xAD, 0xA5, 0x8B, 0xA9, 0x0D, 0xA9, 0xDA, 0x0F, 0xEF, 0x61, 0x04, 0xBA, 0x35, 0x39, 0x36, 0x03, 0xD8, 0x68, 0x5F, 0x9F, 0x2F, 0xD6, 0xF6, 0x38, 0x96, 0xFD, 0xE7, 0xEA, 0x89, 0xD8, 0x7F, 0x7E, 0xC5, 0x29, 0x2F, 0xD9, 0x3B, 0x02, 0xE7, 0x1F, 0xBD, 0x63, 0x9C, 0x21, 0xD8, 0xFF, 0x43, 0x8A, 0x74, 0xCD, 0x3D, 0x4C, 0x09, 0xEE, 0xDB, 0xE0, 0xBE, 0x03, 0xD1, 0x92, 0xD7, 0x22, 0x35, 0x5A, 0x8C, 0xCE, 0xBE, 0x2B, 0xB4, 0x81, 0x47, 0x3F, 0x45, 0x75, 0x33, 0x31, 0x6B, 0xFF, 0x43, 0x5D, 0x17, 0x43, 0xAE, 0xD1, 0x25, 0xF7, 0xD9, 0xD5, 0x5C, 0xB6, 0x92, 0x5C, 0xB3, 0xF3, 0xF7, 0x65, 0x9F, 0x4C, 0x05, 0x12, 0xEC, 0xA8, 0x6D, 0x70, 0x65, 0x57, 0x6C, 0xD8, 0xE3, 0xD6, 0xFA, 0xC1, 0xFD, 0x54, 0xE8, 0x34, 0x67, 0x4D, 0x0A, 0x14, 0x2F, 0xA3, 0xD4, 0x81, 0x8C, 0xC3, 0xD0, 0x8B, 0x09, 0x08, 0x90, 0x70, 0x68, 0xA0, 0x0E, 0xD1, 0x0B, 0xAA, 0x71, 0xEC, 0x9A, 0x1A, 0x83, 0xFF, 0xA1, 0x70, 0xEB, 0xAC, 0xF2, 0xE9, 0x80, 0xA1, 0xB8, 0x20, 0x31, 0x83, 0xF5, 0x37, 0x01, 0x72, 0x06, 0x50, 0x05, 0x3F, 0x14, 0xF9, 0x29, 0x48, 0x84, 0xA0, 0x0E, 0xF7, 0xB8, 0x1D, 0xA3, 0x36, 0x5A, 0x78, 0x6D, 0x83, 0x90, 0x27, 0xE3, 0x50, 0x49, 0x2F, 0x65, 0xE5, 0x61, 0xED, 0x65, 0xBE, 0xEA, 0x34, 0xA6, 0x6A, 0xEF, 0x49, 0xB4, 0xE0, 0xBC, 0xC2, 0xA5, 0xB8, 0xEB, 0xA9, 0x2F, 0xBA, 0x26, 0x76, 0xB2, 0x5A, 0x3A, 0x3B, 0xFD, 0xAD, 0xFB, 0xE4, 0x79, 0xE2, 0x85, 0x54, 0x5B, 0xAB, 0x1F, 0x0A, 0xE5, 0x8B, 0x77, 0x3A, 0x10, 0x98, 0x26, 0x74, 0xC8, 0xB0, 0x82, 0xB1, 0xF9, 0x8F, 0x68, 0x59 -}; - -static const unsigned char Demo_sdk4_AcexData[0x200] = -{ - 0xFF, 0xFF, 0xFF, 0xFF, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x18, 0x9E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x50, 0x54, 0x3A, 0x55, 0x00, 0x00, 0x00, 0x24, 0x68, 0x69, 0x6F, 0x46, 0x49, 0x4F, 0x00, 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x30, 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x31, 0x61, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x00, 0x62, 0x6F, 0x73, 0x73, 0x3A, 0x55, 0x00, 0x00, 0x63, 0x61, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x63, 0x65, 0x63, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x63, 0x66, 0x67, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x64, 0x6C, 0x70, 0x3A, 0x46, 0x4B, 0x43, 0x4C, 0x64, 0x6C, 0x70, 0x3A, 0x53, 0x52, 0x56, 0x52, 0x64, 0x73, 0x70, 0x3A, 0x3A, 0x44, 0x53, 0x50, 0x66, 0x72, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x66, 0x73, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x00, 0x67, 0x73, 0x70, 0x3A, 0x3A, 0x47, 0x70, 0x75, 0x68, 0x69, 0x64, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x43, 0x00, 0x00, 0x6D, 0x69, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6E, 0x64, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6E, 0x65, 0x77, 0x73, 0x3A, 0x75, 0x00, 0x00, 0x6E, 0x77, 0x6D, 0x3A, 0x3A, 0x55, 0x44, 0x53, 0x70, 0x74, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x70, 0x78, 0x69, 0x3A, 0x64, 0x65, 0x76, 0x00, 0x73, 0x6F, 0x63, 0x3A, 0x55, 0x00, 0x00, 0x00, 0x73, 0x73, 0x6C, 0x3A, 0x43, 0x00, 0x00, 0x00, 0x79, 0x32, 0x72, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6C, 0x64, 0x72, 0x3A, 0x72, 0x6F, 0x00, 0x00, 0x69, 0x72, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x9F, 0xFA, 0xF0, 0xFF, 0xBF, 0xFF, 0xF1, 0xE7, 0x3F, 0x00, 0xF2, 0x00, 0xF0, 0x91, 0xFF, 0x00, 0xF6, 0x91, 0xFF, 0x50, 0xFF, 0x81, 0xFF, 0x58, 0xFF, 0x81, 0xFF, 0x70, 0xFF, 0x81, 0xFF, 0x78, 0xFF, 0x81, 0xFF, 0x01, 0x01, 0x00, 0xFF, 0x00, 0x02, 0x00, 0xFE, 0x21, 0x02, 0x00, 0xFC, 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, 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, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 -}; - -static const unsigned char Demo_sdk4_AcexSig[0x100] = -{ - 0xD3, 0x7D, 0x42, 0xBA, 0x6A, 0x1E, 0xD8, 0x07, 0x3C, 0x4A, 0xC4, 0xCD, 0x8C, 0x68, 0x3D, 0xCD, 0xCD, 0xBD, 0x9D, 0xCE, 0xB5, 0x2A, 0xF9, 0x63, 0x3D, 0xA9, 0x54, 0x0A, 0x2E, 0x4C, 0xE1, 0x60, 0x4B, 0xD0, 0xC9, 0xEB, 0xEF, 0x31, 0x65, 0x70, 0xB9, 0x0E, 0x06, 0x3B, 0x3D, 0x42, 0x4C, 0x6E, 0x8D, 0x2C, 0xD4, 0x71, 0x29, 0x76, 0xB7, 0xDD, 0x8C, 0xDA, 0xE7, 0xE3, 0x96, 0xA7, 0xAA, 0xF8, 0xCA, 0x05, 0xE8, 0xA7, 0x0A, 0xDD, 0x01, 0x49, 0xBD, 0xF1, 0xA5, 0xE8, 0x16, 0x22, 0xEE, 0x47, 0x1F, 0xEF, 0x28, 0x48, 0x87, 0xA9, 0x2D, 0xFC, 0x4E, 0xD5, 0xA5, 0x98, 0xB1, 0xFE, 0x1B, 0xEB, 0xA9, 0x06, 0x3C, 0x76, 0xD9, 0xAA, 0x0E, 0x9C, 0x60, 0xFC, 0xE9, 0x77, 0x9D, 0x7F, 0x67, 0xAC, 0xF5, 0xC7, 0x49, 0x12, 0xFD, 0x76, 0xAC, 0xD2, 0x54, 0xDB, 0x73, 0x41, 0x10, 0x1F, 0x04, 0x3F, 0xD0, 0x6F, 0xE0, 0x80, 0x24, 0xCC, 0xEE, 0xBF, 0x25, 0x9D, 0x0D, 0x5A, 0x2A, 0x1C, 0xC5, 0xD4, 0xE3, 0x5D, 0x3A, 0xC1, 0x86, 0xD3, 0xD4, 0x52, 0x1C, 0x4C, 0xBF, 0x31, 0xEB, 0x54, 0xCA, 0x4C, 0x06, 0x50, 0x52, 0x87, 0xD4, 0x9D, 0x4A, 0x4B, 0x22, 0xE1, 0x4A, 0xE9, 0x4D, 0x05, 0xA8, 0x57, 0xEC, 0xF8, 0x90, 0xF8, 0x58, 0xC3, 0x8B, 0x3A, 0x0F, 0x88, 0x36, 0xF4, 0xE5, 0x44, 0x10, 0x80, 0x68, 0x86, 0x1D, 0xAE, 0x90, 0x20, 0x03, 0x22, 0x2D, 0x44, 0xBF, 0xAB, 0x2B, 0xA1, 0x14, 0xAD, 0x6B, 0x40, 0x57, 0xDB, 0xBB, 0xDA, 0x09, 0x4C, 0x51, 0x26, 0x9B, 0xE3, 0xD9, 0xF9, 0xE1, 0xBC, 0xF1, 0xF1, 0xCD, 0x30, 0xB4, 0xF5, 0x39, 0xD0, 0xBC, 0xF7, 0x98, 0x05, 0xAF, 0xA8, 0x33, 0x4B, 0xC1, 0x16, 0x0F, 0xF2, 0xC2, 0x79, 0x96, 0xEC, 0xBE, 0xA9, 0xF5, 0x55, 0x7C, 0x82, 0x95, 0x73 -}; - -// DLP -static const unsigned char Dlp_sdk4_HdrPubK[0x100] = -{ - 0xB3, 0x16, 0x68, 0xF1, 0xED, 0x59, 0xC8, 0x7F, 0xC6, 0x50, 0x21, 0xFE, 0x36, 0x7C, 0x55, 0xE7, 0x07, 0xF9, 0x1D, 0x1B, 0xF5, 0xB1, 0x2A, 0x6B, 0x3A, 0xDE, 0x2D, 0x4C, 0x51, 0xCD, 0x4C, 0x9F, 0xEE, 0x1D, 0xE4, 0xE8, 0xF0, 0xFD, 0x09, 0x8E, 0x0F, 0x92, 0x5F, 0xDB, 0x9C, 0x5C, 0x15, 0x55, 0x1A, 0x4D, 0x04, 0x8C, 0xB0, 0xA4, 0x88, 0x97, 0xC4, 0xD5, 0x92, 0x04, 0x42, 0x33, 0x84, 0x81, 0x06, 0xD6, 0xF2, 0x17, 0xDE, 0x83, 0x17, 0x50, 0xD0, 0x47, 0x61, 0x14, 0x0D, 0xB7, 0xC7, 0xA0, 0xC1, 0x8B, 0x82, 0x47, 0x13, 0xEE, 0x76, 0xA2, 0xA3, 0x8D, 0xCE, 0x55, 0xC1, 0xF3, 0x7A, 0xEA, 0x91, 0xE1, 0xB9, 0x2F, 0x8F, 0x9B, 0xC3, 0x7B, 0x51, 0x2F, 0xE7, 0xAD, 0x93, 0x9C, 0xFD, 0xDF, 0x19, 0xC8, 0x6C, 0x24, 0xC2, 0xE2, 0x91, 0x97, 0x1F, 0xEB, 0x4B, 0xD4, 0x46, 0x6C, 0x06, 0x93, 0xAF, 0xF5, 0x5E, 0x8F, 0x77, 0x25, 0xC4, 0x28, 0xC0, 0x82, 0x4A, 0x78, 0xE9, 0x14, 0x08, 0xC3, 0xC3, 0x58, 0x24, 0x44, 0x2D, 0x2B, 0xA7, 0xEE, 0x28, 0xEF, 0x1B, 0x6D, 0xAA, 0x9C, 0xED, 0x7F, 0x35, 0xCE, 0x86, 0x5C, 0x6B, 0x8A, 0x23, 0xD3, 0x9D, 0x05, 0x8F, 0xD2, 0x41, 0x93, 0x1D, 0x1D, 0x7E, 0xB0, 0x46, 0x23, 0x63, 0x07, 0xEA, 0x5F, 0x26, 0xE3, 0x81, 0x27, 0xB3, 0x95, 0xB1, 0x93, 0x59, 0xD4, 0x1A, 0xB8, 0x73, 0xD0, 0x09, 0x95, 0x2B, 0xE8, 0x8B, 0xE2, 0x73, 0x5F, 0x34, 0xB9, 0x98, 0x82, 0xF0, 0x11, 0xC6, 0x8F, 0x12, 0x4D, 0x09, 0x57, 0x10, 0x97, 0x22, 0x0E, 0xC8, 0x7D, 0x40, 0xC1, 0x9D, 0x12, 0x1F, 0x71, 0xFE, 0x1E, 0x1A, 0x8C, 0x3F, 0x56, 0xAC, 0x43, 0xC3, 0x66, 0x0C, 0x81, 0xAE, 0xC1, 0x8F, 0x68, 0xFF, 0x87, 0x07, 0x3C, 0xCD, 0x0A, 0x23, 0xDE, 0xBA, 0x9B -}; - -static const unsigned char Dlp_sdk4_HdrPrivK[0x100] = -{ - 0x77, 0xC2, 0x7A, 0xB7, 0x9E, 0x13, 0xB6, 0x62, 0xCC, 0x09, 0x76, 0x51, 0xFB, 0xB9, 0xB5, 0xF0, 0x63, 0x82, 0x91, 0x96, 0xCA, 0xFC, 0x88, 0xF3, 0x60, 0x50, 0x87, 0x56, 0x4C, 0x35, 0xD0, 0x11, 0xFB, 0x38, 0x7E, 0x85, 0xCF, 0xF2, 0x46, 0xDB, 0x7B, 0x4A, 0x55, 0x54, 0x15, 0x01, 0xF7, 0x3A, 0x0B, 0xF6, 0x89, 0x1E, 0x54, 0x5A, 0x13, 0x05, 0xFB, 0x19, 0x1F, 0x26, 0x3D, 0xE7, 0x19, 0xAA, 0xF7, 0x19, 0xF2, 0x97, 0x47, 0xB3, 0xBE, 0x79, 0xCA, 0x6E, 0x91, 0x5A, 0xC9, 0xB9, 0xA6, 0x83, 0xB8, 0x2A, 0x45, 0x1A, 0xA7, 0x17, 0x86, 0xBA, 0x48, 0x49, 0x62, 0x3C, 0x33, 0x11, 0x51, 0x97, 0x5F, 0xAA, 0xE5, 0x1E, 0x0B, 0x19, 0x0C, 0xE6, 0x80, 0x6A, 0x5A, 0xB1, 0xD6, 0xCE, 0xDB, 0x6E, 0xC0, 0x5D, 0x29, 0x04, 0x84, 0x56, 0xE3, 0x29, 0x7E, 0xAC, 0xE8, 0xEE, 0xB1, 0x91, 0x37, 0xEB, 0x98, 0x9C, 0xBD, 0x02, 0x6A, 0x78, 0x61, 0xB0, 0x79, 0x1A, 0x9F, 0x30, 0x86, 0xF6, 0x71, 0x5A, 0x5A, 0x12, 0xA1, 0x9E, 0xA1, 0x68, 0x03, 0xE5, 0x95, 0xA8, 0x38, 0x58, 0x87, 0x08, 0x57, 0x35, 0x32, 0x47, 0x3B, 0xFC, 0x02, 0x6F, 0xCE, 0x55, 0x61, 0xA3, 0x2A, 0x6B, 0x2F, 0xF8, 0xEE, 0x8D, 0xFA, 0x43, 0x33, 0x02, 0x63, 0x47, 0x02, 0x78, 0x5A, 0x7F, 0x64, 0x07, 0x92, 0xB7, 0x7C, 0x09, 0x7C, 0xFE, 0x2D, 0x1C, 0xFC, 0x77, 0x9F, 0x19, 0x20, 0xDD, 0x6D, 0x4C, 0xFE, 0x49, 0x09, 0x47, 0xCA, 0x9B, 0x1C, 0x8C, 0x1F, 0x37, 0xAC, 0x14, 0x85, 0x56, 0xC0, 0xFD, 0xD6, 0x01, 0xB3, 0x40, 0xA3, 0x1A, 0x32, 0x78, 0xA0, 0xDD, 0x21, 0x75, 0xBF, 0x24, 0xD2, 0x93, 0x85, 0xED, 0x22, 0xAD, 0x99, 0x91, 0x87, 0x4A, 0xEC, 0xC0, 0x6C, 0x71, 0x00, 0x76, 0x08, 0x23, 0xA2, 0xF3, 0xCF, 0x61 -}; - -static const unsigned char Dlp_sdk4_AcexData[0x200] = -{ - 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x18, 0x9E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x50, 0x54, 0x3A, 0x55, 0x00, 0x00, 0x00, 0x24, 0x68, 0x69, 0x6F, 0x46, 0x49, 0x4F, 0x00, 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x30, 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x31, 0x61, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x00, 0x62, 0x6F, 0x73, 0x73, 0x3A, 0x55, 0x00, 0x00, 0x63, 0x61, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x63, 0x65, 0x63, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x63, 0x66, 0x67, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x64, 0x6C, 0x70, 0x3A, 0x46, 0x4B, 0x43, 0x4C, 0x64, 0x6C, 0x70, 0x3A, 0x53, 0x52, 0x56, 0x52, 0x64, 0x73, 0x70, 0x3A, 0x3A, 0x44, 0x53, 0x50, 0x66, 0x72, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x66, 0x73, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x00, 0x67, 0x73, 0x70, 0x3A, 0x3A, 0x47, 0x70, 0x75, 0x68, 0x69, 0x64, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x43, 0x00, 0x00, 0x6D, 0x69, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6E, 0x64, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6E, 0x65, 0x77, 0x73, 0x3A, 0x75, 0x00, 0x00, 0x6E, 0x77, 0x6D, 0x3A, 0x3A, 0x55, 0x44, 0x53, 0x70, 0x74, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x70, 0x78, 0x69, 0x3A, 0x64, 0x65, 0x76, 0x00, 0x73, 0x6F, 0x63, 0x3A, 0x55, 0x00, 0x00, 0x00, 0x73, 0x73, 0x6C, 0x3A, 0x43, 0x00, 0x00, 0x00, 0x79, 0x32, 0x72, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6C, 0x64, 0x72, 0x3A, 0x72, 0x6F, 0x00, 0x00, 0x69, 0x72, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x9F, 0xFA, 0xF0, 0xFF, 0xBF, 0xFF, 0xF1, 0xE7, 0x3F, 0x00, 0xF2, 0x00, 0xF0, 0x91, 0xFF, 0x00, 0xF6, 0x91, 0xFF, 0x50, 0xFF, 0x81, 0xFF, 0x58, 0xFF, 0x81, 0xFF, 0x70, 0xFF, 0x81, 0xFF, 0x78, 0xFF, 0x81, 0xFF, 0x01, 0x01, 0x00, 0xFF, 0x00, 0x02, 0x00, 0xFE, 0x21, 0x02, 0x00, 0xFC, 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, 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, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 -}; - -static const unsigned char Dlp_sdk4_AcexSig[0x100] = -{ - 0xAC, 0xE2, 0xA7, 0xC3, 0x00, 0xDE, 0xE8, 0xE9, 0xE0, 0x03, 0xB3, 0x54, 0x08, 0xA8, 0xF8, 0x3A, 0x2E, 0xD8, 0x10, 0x6B, 0xEC, 0xDC, 0x4E, 0xEE, 0x62, 0x10, 0x71, 0x49, 0xD4, 0x43, 0xB1, 0x0E, 0x6B, 0x8C, 0xD7, 0x54, 0xD5, 0x62, 0x28, 0x3F, 0xAA, 0xDE, 0xA9, 0x7D, 0xED, 0x37, 0x7C, 0xE7, 0x89, 0x0B, 0x02, 0xB2, 0x72, 0x4B, 0x17, 0xDB, 0xE2, 0xD3, 0x7C, 0x94, 0x12, 0x3F, 0x2E, 0xA1, 0x08, 0x99, 0xCC, 0x7F, 0x93, 0xE6, 0x38, 0xC9, 0x37, 0x84, 0xD7, 0x11, 0x9D, 0x02, 0x4D, 0x66, 0xB4, 0x70, 0x9F, 0xD8, 0xC6, 0xDD, 0xD5, 0x13, 0x52, 0xF0, 0xA6, 0x78, 0x8C, 0x8E, 0x15, 0xA0, 0xA1, 0xF3, 0xC4, 0xC3, 0x48, 0x45, 0xA5, 0xBE, 0xC9, 0x7A, 0x8B, 0xD3, 0x95, 0xA5, 0x4C, 0xF1, 0xB3, 0x0C, 0x6C, 0x76, 0xA7, 0x57, 0xA1, 0x77, 0xDF, 0x2F, 0xC8, 0x06, 0xA6, 0x0D, 0x1A, 0x09, 0xE4, 0x38, 0x64, 0x07, 0xBE, 0x6A, 0xD2, 0xA0, 0xC0, 0xEC, 0x09, 0x64, 0x9F, 0x0D, 0x93, 0x0C, 0x89, 0xA2, 0x71, 0xD6, 0xC6, 0xC2, 0x54, 0x79, 0x2A, 0xA4, 0x31, 0x28, 0x24, 0x1A, 0xF3, 0x56, 0x78, 0x63, 0x99, 0x97, 0xA5, 0xCE, 0x8F, 0x52, 0x7A, 0x79, 0x51, 0xEE, 0x4C, 0x8B, 0x00, 0x9D, 0x5C, 0x3E, 0xD5, 0xAA, 0x24, 0x9C, 0x94, 0xC6, 0xA3, 0x99, 0x1B, 0x2D, 0xD4, 0xFF, 0xB4, 0x25, 0x73, 0x13, 0x33, 0x9F, 0x03, 0x6F, 0x1E, 0x75, 0xC4, 0x70, 0xF4, 0x07, 0x4F, 0x18, 0xFE, 0xBD, 0x8F, 0x2C, 0x9B, 0x33, 0xD4, 0x30, 0xA7, 0x18, 0x4A, 0xF1, 0xA4, 0xDD, 0x78, 0x41, 0xA0, 0xB8, 0x02, 0x8D, 0x51, 0x96, 0xBE, 0xE7, 0x17, 0x94, 0x66, 0x65, 0x27, 0xF7, 0x69, 0x48, 0x7E, 0xA9, 0x08, 0x71, 0x20, 0x76, 0xB7, 0x8E, 0xD2, 0xBF, 0x5C, 0x7E, 0x5E, 0x06, 0x45, 0xAB, 0x7E, 0x2E -}; - - -/* SDK 7 (7.1.0) */ -static const unsigned char sdk7_dep_list[0x180] = -{ - 0x02, 0x24, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x38, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x15, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x34, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x16, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x26, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x17, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x18, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x27, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x28, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1A, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x32, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1B, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1C, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1D, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x29, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1E, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x33, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1F, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x20, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2B, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x35, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2C, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2D, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x21, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x31, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x22, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x37, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2E, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x23, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2F, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -// APP -static const unsigned char App_sdk7_HdrPubK[0x100] = -{ - 0x9B, 0x3B, 0x52, 0x2D, 0x61, 0xF5, 0x0D, 0x14, - 0x96, 0x09, 0x7A, 0x66, 0xC9, 0x86, 0x4C, 0x51, - 0x61, 0x7D, 0xF8, 0x9B, 0xFD, 0xB0, 0x3E, 0x44, - 0xC5, 0x0D, 0xC2, 0x6B, 0x6C, 0x66, 0x63, 0x3E, - 0xE7, 0xC8, 0x04, 0xCB, 0x06, 0xC8, 0x35, 0xC5, - 0x6D, 0xDB, 0x38, 0x36, 0xC5, 0x54, 0x32, 0xF0, - 0x60, 0x11, 0x44, 0x9F, 0xD9, 0xFA, 0x6A, 0x43, - 0xE1, 0x79, 0x56, 0xBF, 0xCF, 0xDD, 0xA8, 0x35, - 0x15, 0x23, 0x51, 0xF9, 0x4B, 0xDA, 0x1A, 0xD9, - 0x9D, 0x28, 0xF6, 0xCC, 0x1D, 0x53, 0x00, 0xC0, - 0x3C, 0x13, 0x32, 0xBC, 0x7F, 0x75, 0x82, 0xCD, - 0x79, 0xEF, 0x65, 0xBC, 0xCA, 0x98, 0x31, 0x0A, - 0x7B, 0xEF, 0x18, 0xD8, 0xF3, 0x8D, 0x3A, 0x10, - 0x22, 0xA0, 0xF2, 0x8D, 0xA5, 0xA8, 0xBE, 0xA0, - 0x62, 0xEC, 0xE2, 0xC7, 0x6C, 0xCF, 0x06, 0x6B, - 0xA7, 0xB5, 0xB8, 0x8C, 0xD5, 0x8E, 0xEF, 0xE3, - 0x42, 0xC9, 0xAD, 0x44, 0x46, 0x3A, 0x4E, 0x77, - 0x63, 0x02, 0xB4, 0x4E, 0xB4, 0x42, 0x65, 0x1D, - 0x68, 0x98, 0x37, 0x7A, 0x27, 0x87, 0x31, 0xBE, - 0x48, 0xFA, 0x4E, 0xD3, 0x85, 0xA6, 0xD6, 0xD2, - 0x2D, 0xCD, 0x10, 0xC9, 0x13, 0x59, 0x12, 0x48, - 0x14, 0x67, 0x3E, 0x40, 0xD3, 0xF8, 0x60, 0xA0, - 0xBD, 0x77, 0x31, 0x76, 0x78, 0x85, 0x55, 0x53, - 0x16, 0xF1, 0xB9, 0xFF, 0x7F, 0x3D, 0x9A, 0xF1, - 0x33, 0x1E, 0x67, 0x8F, 0x6B, 0x4A, 0x7A, 0x79, - 0x54, 0x8B, 0x43, 0xB5, 0xC2, 0xAF, 0xB8, 0x75, - 0x11, 0xDE, 0x4D, 0x34, 0x6A, 0xD6, 0x5A, 0x3B, - 0x48, 0x1F, 0x41, 0x9D, 0xF4, 0x58, 0x90, 0x67, - 0xA8, 0x71, 0xD4, 0x09, 0x67, 0xF7, 0x55, 0xEF, - 0xD3, 0x7C, 0x7D, 0x2F, 0x76, 0x84, 0x70, 0x6E, - 0xAA, 0x75, 0x7D, 0xA9, 0x95, 0x42, 0xEF, 0x28, - 0x29, 0x48, 0xCD, 0x79, 0xA8, 0x16, 0xB6, 0xB5 -}; - -static const unsigned char App_sdk7_AcexData[0x200] = -{ - 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x18, - 0x9E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x24, 0x68, 0x69, 0x6F, 0x46, 0x49, 0x4F, 0x00, - 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x30, - 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x31, - 0x63, 0x66, 0x67, 0x3A, 0x75, 0x00, 0x00, 0x00, - 0x66, 0x73, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x00, - 0x67, 0x73, 0x70, 0x3A, 0x3A, 0x47, 0x70, 0x75, - 0x68, 0x69, 0x64, 0x3A, 0x55, 0x53, 0x45, 0x52, - 0x6E, 0x64, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, - 0x70, 0x78, 0x69, 0x3A, 0x64, 0x65, 0x76, 0x00, - 0x41, 0x50, 0x54, 0x3A, 0x41, 0x00, 0x00, 0x00, - 0x61, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x00, - 0x61, 0x63, 0x74, 0x3A, 0x75, 0x00, 0x00, 0x00, - 0x61, 0x6D, 0x3A, 0x61, 0x70, 0x70, 0x00, 0x00, - 0x62, 0x6F, 0x73, 0x73, 0x3A, 0x55, 0x00, 0x00, - 0x63, 0x61, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, - 0x63, 0x65, 0x63, 0x64, 0x3A, 0x75, 0x00, 0x00, - 0x64, 0x6C, 0x70, 0x3A, 0x46, 0x4B, 0x43, 0x4C, - 0x64, 0x6C, 0x70, 0x3A, 0x53, 0x52, 0x56, 0x52, - 0x64, 0x73, 0x70, 0x3A, 0x3A, 0x44, 0x53, 0x50, - 0x66, 0x72, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x00, - 0x68, 0x74, 0x74, 0x70, 0x3A, 0x43, 0x00, 0x00, - 0x69, 0x72, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x00, - 0x6C, 0x64, 0x72, 0x3A, 0x72, 0x6F, 0x00, 0x00, - 0x6D, 0x69, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, - 0x6E, 0x65, 0x77, 0x73, 0x3A, 0x75, 0x00, 0x00, - 0x6E, 0x69, 0x6D, 0x3A, 0x61, 0x6F, 0x63, 0x00, - 0x6E, 0x77, 0x6D, 0x3A, 0x3A, 0x55, 0x44, 0x53, - 0x70, 0x74, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, - 0x73, 0x6F, 0x63, 0x3A, 0x55, 0x00, 0x00, 0x00, - 0x73, 0x73, 0x6C, 0x3A, 0x43, 0x00, 0x00, 0x00, - 0x79, 0x32, 0x72, 0x3A, 0x75, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x4E, 0x9F, 0xFA, 0xF0, 0xFF, 0xBF, 0xFF, 0xF1, - 0xE7, 0x3F, 0x00, 0xF2, 0x00, 0xF0, 0x91, 0xFF, - 0x00, 0xF6, 0x91, 0xFF, 0x50, 0xFF, 0x81, 0xFF, - 0x58, 0xFF, 0x81, 0xFF, 0x70, 0xFF, 0x81, 0xFF, - 0x78, 0xFF, 0x81, 0xFF, 0x01, 0x01, 0x00, 0xFF, - 0x00, 0x02, 0x00, 0xFE, 0x27, 0x02, 0x00, 0xFC, - 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, 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, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 -}; - -static const unsigned char App_sdk7_AcexSig[0x100] = -{ - 0x06, 0xDD, 0x68, 0x17, 0xAA, 0x40, 0x3A, 0x75, - 0xD2, 0xCF, 0xA2, 0x5A, 0xC8, 0x1B, 0x74, 0x9D, - 0x91, 0xCD, 0x38, 0x4E, 0xCA, 0x19, 0x60, 0x8E, - 0x39, 0x71, 0x6C, 0xB9, 0xF9, 0x9F, 0x68, 0x44, - 0xCF, 0x33, 0x94, 0x54, 0x72, 0xCC, 0xC6, 0x33, - 0x96, 0x9F, 0x12, 0x07, 0xE9, 0x38, 0x87, 0x70, - 0x11, 0x51, 0xFD, 0xBF, 0xD9, 0x2D, 0xFA, 0x3F, - 0x70, 0x42, 0x75, 0x39, 0xE3, 0x97, 0x85, 0xAF, - 0x7B, 0xC5, 0x87, 0x9B, 0x0B, 0xF9, 0xE4, 0x1C, - 0xC5, 0x6B, 0x44, 0x2A, 0x10, 0x14, 0x86, 0xAA, - 0xFE, 0x9E, 0x5B, 0x1D, 0x15, 0xBA, 0x8C, 0x34, - 0xA2, 0xAF, 0x14, 0xD0, 0xD4, 0x0E, 0x7B, 0x3A, - 0xD5, 0x3C, 0x53, 0xDB, 0x7C, 0xBE, 0x44, 0x58, - 0x79, 0x42, 0x23, 0x3A, 0x77, 0xA3, 0x2C, 0xB9, - 0xEB, 0x62, 0x19, 0x94, 0x2B, 0xA0, 0x67, 0x94, - 0xC6, 0xB2, 0x90, 0xC6, 0x61, 0xFD, 0x43, 0xEC, - 0xEA, 0x27, 0x7E, 0xA6, 0xB1, 0xED, 0xA9, 0x67, - 0xED, 0x56, 0x91, 0x90, 0xF9, 0x32, 0x4E, 0xC3, - 0x29, 0x5A, 0x84, 0x4C, 0xAB, 0x99, 0x75, 0x40, - 0x8E, 0x19, 0xD9, 0x12, 0xD1, 0x06, 0x2D, 0xD0, - 0x2C, 0xD9, 0x6C, 0x41, 0x35, 0x64, 0xDB, 0x80, - 0x63, 0xB2, 0x01, 0xF8, 0x29, 0xAB, 0xF5, 0x70, - 0x79, 0x4E, 0x0F, 0xFA, 0x23, 0x20, 0x2E, 0x04, - 0x75, 0x48, 0x15, 0x9B, 0x71, 0xD5, 0x85, 0x09, - 0x67, 0x7D, 0xAC, 0x6A, 0xFA, 0xC0, 0x16, 0xAF, - 0x58, 0x26, 0xCD, 0x6F, 0x1F, 0xB8, 0xF5, 0x8D, - 0xD1, 0x7D, 0x3D, 0x70, 0x2F, 0x08, 0xB8, 0x23, - 0x61, 0x24, 0xAE, 0x94, 0x31, 0xA3, 0xBD, 0x1E, - 0x18, 0xD7, 0x82, 0x92, 0xDD, 0x11, 0x79, 0x7D, - 0x1F, 0xEC, 0x03, 0x08, 0x82, 0xCC, 0x52, 0x62, - 0xC9, 0x27, 0x2D, 0x08, 0xD5, 0x6B, 0x4E, 0x86, - 0x2E, 0x3F, 0x50, 0x5C, 0xA3, 0xC1, 0xDF, 0xF5, -}; - -#endif \ No newline at end of file diff --git a/blz.c b/blz.c deleted file mode 100644 index 8fc2355..0000000 --- a/blz.c +++ /dev/null @@ -1,336 +0,0 @@ -/*----------------------------------------------------------------------------*/ -/*-- blz.c - Bottom LZ coding for Nintendo GBA/DS --*/ -/*-- Copyright (C) 2011 CUE --*/ -/*-- --*/ -/*-- This program is free software: you can redistribute it and/or modify --*/ -/*-- it under the terms of the GNU General Public License as published by --*/ -/*-- the Free Software Foundation, either version 3 of the License, or --*/ -/*-- (at your option) any later version. --*/ -/*-- --*/ -/*-- This program is distributed in the hope that it will be useful, --*/ -/*-- but WITHOUT ANY WARRANTY; without even the implied warranty of --*/ -/*-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the --*/ -/*-- GNU General Public License for more details. --*/ -/*-- --*/ -/*-- You should have received a copy of the GNU General Public License --*/ -/*-- along with this program. If not, see . --*/ -/*----------------------------------------------------------------------------*/ - -/*----------------------------------------------------------------------------*/ -#include "lib.h" -#include "blz.h" - -/*----------------------------------------------------------------------------*/ -#define CMD_DECODE 0x00 // decode -#define CMD_ENCODE 0x01 // encode - -#define BLZ_SHIFT 1 // bits to shift -#define BLZ_MASK 0x80 // bits to check: - // ((((1 << BLZ_SHIFT) - 1) << (8 - BLZ_SHIFT) - -#define BLZ_THRESHOLD 2 // max number of bytes to not encode -#define BLZ_N 0x1002 // max offset ((1 << 12) + 2) -#define BLZ_F 0x12 // max coded ((1 << 4) + BLZ_THRESHOLD) - -#define RAW_MINIM 0x00000000 // empty file, 0 bytes -#define RAW_MAXIM 0x00FFFFFF // 3-bytes length, 16MB - 1 - -#define BLZ_MINIM 0x00000004 // header only (empty RAW file) -#define BLZ_MAXIM 0x01400000 // 0x0120000A, padded to 20MB: - // * length, RAW_MAXIM - // * flags, (RAW_MAXIM + 7) / 8 - // * header, 11 - // 0x00FFFFFF + 0x00200000 + 12 + padding - -/*----------------------------------------------------------------------------*/ -#define BREAK(text) { printf(text); return; } -#define EXIT(text) { printf(text); exit(-1); } - -/*----------------------------------------------------------------------------*/ -u8 *Memory(int length, int size); - -u8 *BLZ_Code(u8 *raw_buffer, int raw_len, u32 *new_len, int best); -void BLZ_Invert(u8 *buffer, int length); - -/*----------------------------------------------------------------------------*/ -u8 *Memory(int length, int size) { - u8 *fb; - - fb = (u8 *) calloc(length * size, size); - if (fb == NULL) EXIT("\nMemory error\n"); - - return(fb); -} - -/*----------------------------------------------------------------------------*/ -void BLZ_Decode(char *filename) { - // u8 *pak_buffer, *raw_buffer, *pak, *raw, *pak_end, *raw_end; - // u32 pak_len, raw_len, len, pos, inc_len, hdr_len, enc_len, dec_len; - // u8 flags, mask; - - // printf("- decoding '%s'", filename); - - // // pak_buffer = Load(filename, &pak_len, BLZ_MINIM, BLZ_MAXIM); - - // inc_len = *(u32 *)(pak_buffer + pak_len - 4); - // if (!inc_len) { - // enc_len = 0; - // dec_len = pak_len - 4; - // pak_len = 0; - // raw_len = dec_len; - // } else { - // if (pak_len < 8) EXIT("File has a bad header\n"); - // hdr_len = pak_buffer[pak_len - 5]; - // if ((hdr_len < 0x08) || (hdr_len > 0x0B)) EXIT("Bad header length\n"); - // if (pak_len <= hdr_len) EXIT("Bad length\n"); - // enc_len = *(u32 *)(pak_buffer + pak_len - 8) & 0x00FFFFFF; - // dec_len = pak_len - enc_len; - // pak_len = enc_len - hdr_len; - // raw_len = dec_len + enc_len + inc_len; - // if (raw_len > RAW_MAXIM) EXIT("Bad decoded length\n"); - // } - - // raw_buffer = (u8 *) Memory(raw_len, sizeof(char)); - - // pak = pak_buffer; - // raw = raw_buffer; - // pak_end = pak_buffer + dec_len + pak_len; - // raw_end = raw_buffer + raw_len; - - // for (len = 0; len < dec_len; len++) *(raw++) = *(pak++); - - // BLZ_Invert(pak_buffer + dec_len, pak_len); - - // mask = 0; - - // while (raw < raw_end) { - // if (!(mask >>= BLZ_SHIFT)) { - // if (pak == pak_end) break; - // flags = *pak++; - // mask = BLZ_MASK; - // } - - // if (!(flags & mask)) { - // if (pak == pak_end) break; - // *raw++ = *pak++; - // } else { - // if (pak + 1 >= pak_end) break; - // pos = *pak++ << 8; - // pos |= *pak++; - // len = (pos >> 12) + BLZ_THRESHOLD + 1; - // if (raw + len > raw_end) { - // printf(", WARNING: wrong decoded length!"); - // len = raw_end - raw; - // } - // pos = (pos & 0xFFF) + 3; - // while (len--) *(raw++) = *(raw - pos); - // } - // } - - // BLZ_Invert(raw_buffer + dec_len, raw_len - dec_len); - - // raw_len = raw - raw_buffer; - - // if (raw != raw_end) printf(", WARNING: unexpected end of encoded file!"); - - // // Save(filename, raw_buffer, raw_len); - - // free(raw_buffer); - // free(pak_buffer); - - // printf("\n"); -} - -u8 *Load(char *filename, u32 *length, int min, int max) { - FILE *fp; - int fs; - u8 *fb; - - if ((fp = fopen(filename, "rb")) == NULL) EXIT("\nFile open error\n"); - fseek(fp, 0, SEEK_END); - fs = ftell(fp); - fseek(fp, 0, SEEK_SET); - if ((fs < min) || (fs > max)) EXIT("\nFile size error\n"); - fb = Memory(fs + 3, sizeof(char)); - if (fread(fb, 1, fs, fp) != fs) EXIT("\nFile read error\n"); - if (fclose(fp) == EOF) EXIT("\nFile close error\n"); - - *length = fs; - - return(fb); -} - -/*----------------------------------------------------------------------------*/ -u8* BLZ_Encode(char *filename, u32* pak_len, int mode) { - u8 *raw_buffer, *pak_buffer, *new_buffer; - u32 raw_len, new_len; - - raw_buffer = Load(filename, &raw_len, RAW_MINIM, RAW_MAXIM); - - pak_buffer = NULL; - *pak_len = BLZ_MAXIM + 1; - - new_buffer = BLZ_Code(raw_buffer, raw_len, &new_len, mode); - if (new_len < *pak_len) { - if (pak_buffer != NULL) free(pak_buffer); - pak_buffer = new_buffer; - *pak_len = new_len; - } - - return pak_buffer; -} - -/*----------------------------------------------------------------------------*/ -u8 *BLZ_Code(u8 *raw_buffer, int raw_len, u32 *new_len, int best) { - u8 *pak_buffer, *pak, *raw, *raw_end, *flg, *tmp; - u32 pak_len, inc_len, hdr_len, enc_len, len, pos, max; - u32 len_best, pos_best, len_next, pos_next, len_post, pos_post; - u32 pak_tmp, raw_tmp; - u8 mask; - -#define SEARCH(l,p) { \ - l = BLZ_THRESHOLD; \ - \ - max = raw - raw_buffer >= BLZ_N ? BLZ_N : raw - raw_buffer; \ - for (pos = 3; pos <= max; pos++) { \ - for (len = 0; len < BLZ_F; len++) { \ - if (raw + len == raw_end) break; \ - if (len >= pos) break; \ - if (*(raw + len) != *(raw + len - pos)) break; \ - } \ - \ - if (len > l) { \ - p = pos; \ - if ((l = len) == BLZ_F) break; \ - } \ - } \ -} - - pak_tmp = 0; - raw_tmp = raw_len; - - pak_len = raw_len + ((raw_len + 7) / 8) + 11; - pak_buffer = (u8 *) Memory(pak_len, sizeof(char)); - - BLZ_Invert(raw_buffer, raw_len); - - pak = pak_buffer; - raw = raw_buffer; - raw_end = raw_buffer + raw_len; - - mask = 0; - - while (raw < raw_end) { - if (!(mask >>= BLZ_SHIFT)) { - *(flg = pak++) = 0; - mask = BLZ_MASK; - } - - SEARCH(len_best, pos_best); - - // LZ-CUE optimization start - if (best) { - if (len_best > BLZ_THRESHOLD) { - if (raw + len_best < raw_end) { - raw += len_best; - SEARCH(len_next, pos_next); - raw -= len_best - 1; - SEARCH(len_post, pos_post); - raw--; - - if (len_next <= BLZ_THRESHOLD) len_next = 1; - if (len_post <= BLZ_THRESHOLD) len_post = 1; - - if (len_best + len_next <= 1 + len_post) len_best = 1; - } - } - } - // LZ-CUE optimization end - - *flg <<= 1; - if (len_best > BLZ_THRESHOLD) { - raw += len_best; - *flg |= 1; - *pak++ = ((len_best - (BLZ_THRESHOLD+1)) << 4) | ((pos_best - 3) >> 8); - *pak++ = (pos_best - 3) & 0xFF; - } else { - *pak++ = *raw++; - } - - if (pak - pak_buffer + raw_len - (raw - raw_buffer) < pak_tmp + raw_tmp) { - pak_tmp = pak - pak_buffer; - raw_tmp = raw_len - (raw - raw_buffer); - } - } - - while (mask && (mask != 1)) { - mask >>= BLZ_SHIFT; - *flg <<= 1; - } - - pak_len = pak - pak_buffer; - - BLZ_Invert(raw_buffer, raw_len); - BLZ_Invert(pak_buffer, pak_len); - - if (!pak_tmp || (raw_len + 4 < ((pak_tmp + raw_tmp + 3) & -4) + 8)) { - pak = pak_buffer; - raw = raw_buffer; - raw_end = raw_buffer + raw_len; - - while (raw < raw_end) *pak++ = *raw++; - - while ((pak - pak_buffer) & 3) *pak++ = 0; - - *(u32 *)pak = 0; pak += 4; - } else { - tmp = (u8 *) Memory(raw_tmp + pak_tmp + 11, sizeof(char)); - - for (len = 0; len < raw_tmp; len++) - tmp[len] = raw_buffer[len]; - - for (len = 0; len < pak_tmp; len++) - tmp[raw_tmp + len] = pak_buffer[len + pak_len - pak_tmp]; - - pak = pak_buffer; - pak_buffer = tmp; - - free(pak); - - pak = pak_buffer + raw_tmp + pak_tmp; - - enc_len = pak_tmp; - hdr_len = 8; - inc_len = raw_len - pak_tmp - raw_tmp; - - while ((pak - pak_buffer) & 3) { - *pak++ = 0xFF; - hdr_len++; - } - - *(u32 *)pak = enc_len + hdr_len; pak += 3; - *pak++ = hdr_len; - *(u32 *)pak = inc_len - hdr_len; pak += 4; - } - - *new_len = pak - pak_buffer; - - return(pak_buffer); -} - -/*----------------------------------------------------------------------------*/ -void BLZ_Invert(u8 *buffer, int length) { - u8 *bottom, ch; - - bottom = buffer + length - 1; - - while (buffer < bottom) { - ch = *buffer; - *buffer++ = *bottom; - *bottom-- = ch; - } -} - -/*----------------------------------------------------------------------------*/ -/*-- EOF Copyright (C) 2011 CUE --*/ -/*----------------------------------------------------------------------------*/ diff --git a/blz.h b/blz.h deleted file mode 100644 index d91ab4e..0000000 --- a/blz.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef _BLZ_H_ -#define _BLZ_H_ - -#define BLZ_NORMAL 0 // normal mode -#define BLZ_BEST 1 // best mode - -u8 *BLZ_Code(u8 *raw_buffer, int raw_len, u32 *new_len, int best); - -#endif diff --git a/certs.c b/certs.c deleted file mode 100644 index 5cec50a..0000000 --- a/certs.c +++ /dev/null @@ -1,139 +0,0 @@ -#include "lib.h" -#include "certs.h" - -// Cert Sizes - -u32 GetCertSize(u8 *cert) -{ - u32 SigSize = 0; - u32 SigPadding = 0; - GetCertSigSectionSizes(&SigSize,&SigPadding,cert); - if(!SigSize || !SigPadding) return 0; - - Cert_Struct *certcore = (Cert_Struct*)(cert+4+SigSize+SigPadding); - - u32 PubKSectionSize = GetCertPubkSectionSize((pubk_types)u8_to_u32(certcore->KeyType,BE)); - - return (4+SigSize+SigPadding+sizeof(Cert_Struct)+PubKSectionSize); -} - -void GetCertSigSectionSizes(u32 *SigSize, u32 *SigPadding, u8 *cert) -{ - sig_types sig = (sig_types)u8_to_u32(cert,BE); - switch(sig){ - case RSA_4096_SHA1 : - *SigSize = 0x200; - *SigPadding = 0x3C; - break; - case RSA_2048_SHA1 : - *SigSize = 0x100; - *SigPadding = 0x3C; - break; - case ECC_SHA1 : - *SigSize = 0x3C; - *SigPadding = 0x40; - break; - case RSA_4096_SHA256 : - *SigSize = 0x200; - *SigPadding = 0x3C; - break; - case RSA_2048_SHA256 : - *SigSize = 0x100; - *SigPadding = 0x3C; - break; - case ECC_SHA256 : - *SigSize = 0x3C; - *SigPadding = 0x40; - break; - default : - *SigSize = 0; - *SigPadding = 0; - break; - } - return; -} - -u32 GetCertPubkSectionSize(pubk_types type) -{ - switch(type){ - case RSA_4096_PUBK : return sizeof(rsa_4096_pubk_struct); - case RSA_2048_PUBK : return sizeof(rsa_2048_pubk_struct); - case ECC_PUBK : return sizeof(ecc_pubk_struct); - default : return 0; - } -} - -// Issuer/Name Functions -u8 *GetCertIssuer(u8 *cert) -{ - u32 SigSize = 0; - u32 SigPadding = 0; - GetCertSigSectionSizes(&SigSize,&SigPadding,cert); - if(!SigSize || !SigPadding) return 0; - - Cert_Struct *certcore = (Cert_Struct*)(cert+4+SigSize+SigPadding); - return certcore->Issuer; -} -u8 *GetCertName(u8 *cert) -{ - u32 SigSize = 0; - u32 SigPadding = 0; - GetCertSigSectionSizes(&SigSize,&SigPadding,cert); - if(!SigSize || !SigPadding) return 0; - - Cert_Struct *certcore = (Cert_Struct*)(cert+4+SigSize+SigPadding); - return certcore->Name; -} - -int GenCertChildIssuer(u8 *dest, u8 *cert) -{ - u8 *Issuer = GetCertIssuer(cert); - u8 *Name = GetCertName(cert); - - u32 out_size = strlen((char*)Issuer) + strlen((char*)Name) + 1; - if(out_size > 0x40) return MEM_ERROR; - - memcpy(dest,Issuer,strlen((char*)Issuer)); - dest[strlen((char*)Issuer)] = '-'; - memcpy((dest+strlen((char*)Issuer)+1),Name,strlen((char*)Name)); - return 0; -} - -// Pubk -pubk_types GetCertPubkType(u8 *cert) -{ - u32 SigSize = 0; - u32 SigPadding = 0; - GetCertSigSectionSizes(&SigSize,&SigPadding,cert); - if(!SigSize || !SigPadding) return 0; - - Cert_Struct *certcore = (Cert_Struct*)(cert+4+SigSize+SigPadding); - - return (pubk_types)u8_to_u32(certcore->KeyType,BE); -} -u8 *GetCertPubk(u8 *cert) -{ - u32 SigSize = 0; - u32 SigPadding = 0; - GetCertSigSectionSizes(&SigSize,&SigPadding,cert); - if(!SigSize || !SigPadding) return 0; - return (cert+4+SigSize+SigPadding+sizeof(Cert_Struct)); -} - -bool VerifyCert(u8 *cert, u8 *pubk) -{ - u32 SigSize = 0; - u32 SigPadding = 0; - GetCertSigSectionSizes(&SigSize,&SigPadding,cert); - if(!SigSize || !SigPadding) return 0; - - - u8 *signature = (cert+4); - u8 *data = (cert+4+SigSize+SigPadding); - u32 datasize = sizeof(Cert_Struct) + GetCertPubkSectionSize(GetCertPubkType(cert)); - - int result = ctr_sig(data,datasize,signature,pubk,NULL,u8_to_u32(cert,BE),CTR_RSA_VERIFY); - - if(result == 0) return true; - else return false; -} \ No newline at end of file diff --git a/certs.h b/certs.h deleted file mode 100644 index 3d8ef47..0000000 --- a/certs.h +++ /dev/null @@ -1,47 +0,0 @@ -#ifndef _CERTS_H_ -#define _CERTS_H_ - -typedef struct -{ - u8 Issuer[0x40]; - u8 KeyType[4]; - u8 Name[0x40]; - u8 Unknown[4]; -} Cert_Struct; - -typedef struct -{ - u8 Modulus[0x200]; - u8 PubExponent[4]; - u8 Padding[0x34]; -} rsa_4096_pubk_struct; - -typedef struct -{ - u8 Modulus[0x100]; - u8 PubExponent[4]; - u8 Padding[0x34]; -} rsa_2048_pubk_struct; - -typedef struct -{ - u8 PubK[0x3C]; - u8 Padding[0x3C]; -} ecc_pubk_struct; - -#endif -// Cert Sizes -u32 GetCertSize(u8 *cert); -void GetCertSigSectionSizes(u32 *SigSize, u32 *SigPadding, u8 *cert); -u32 GetCertPubkSectionSize(pubk_types type); - -// Issuer/Name Functions -u8 *GetCertIssuer(u8 *cert); -u8 *GetCertName(u8 *cert); -int GenCertChildIssuer(u8 *dest, u8 *cert); - -// Pubk -pubk_types GetCertPubkType(u8 *cert); -u8 *GetCertPubk(u8 *cert); - -bool VerifyCert(u8 *cert, u8 *pubk); \ No newline at end of file diff --git a/cia.c b/cia.c deleted file mode 100644 index 4879d91..0000000 --- a/cia.c +++ /dev/null @@ -1,617 +0,0 @@ -#include "lib.h" -#include "ncch.h" -#include "exheader.h" -#include "exefs.h" -#include "certs.h" -#include "cia.h" -#include "tik.h" -#include "tmd.h" -#include "titleid.h" -#include "srl.h" -#include "ncsd.h" - -// Private Prototypes -/* cia_settings tools */ -void init_CIASettings(cia_settings *set); -void free_CIASettings(cia_settings *set); -int get_CIASettings(cia_settings *ciaset, user_settings *usrset); - -int GetSettingsFromUsrset(cia_settings *ciaset, user_settings *usrset); -int GetSettingsFromNcch0(cia_settings *ciaset, u32 ncch0_offset); -int GetCIADataFromNcch(cia_settings *ciaset, NCCH_Header *NcchHdr, ExtendedHeader_Struct *ExHeader); -int GetMetaRegion(cia_settings *ciaset, ExtendedHeader_Struct *ExHeader, u8 *ExeFs); -int GetContentFilePtrs(cia_settings *ciaset, user_settings *usrset); -int GetSettingsFromSrl(cia_settings *ciaset); -int GetSettingsFromCci(cia_settings *ciaset); - -u16 SetupVersion(u16 Major, u16 Minor, u16 Micro); - -int BuildCIA_CertChain(cia_settings *ciaset); -int BuildCIA_Header(cia_settings *ciaset); - -int WriteCurrentSectionstoFile(cia_settings *ciaset); -int WriteContentsToFile(cia_settings *ciaset, user_settings *usrset); -int WriteTMDToFile(cia_settings *ciaset); - -int CryptContent(u8 *EncBuffer,u8 *DecBuffer,u64 size,u8 *title_key, u16 index, u8 mode); - - -int build_CIA(user_settings *usrset) -{ - int result = 0; - - // Init Settings - cia_settings *ciaset = malloc(sizeof(cia_settings)); - if(!ciaset) {fprintf(stderr,"[CIA ERROR] MEM ERROR\n"); return MEM_ERROR;} - init_CIASettings(ciaset); - - // Get Settings - result = get_CIASettings(ciaset,usrset); - if(result) goto finish; - - // Create Output File - ciaset->out = fopen(usrset->outfile,"wb"); - if(!ciaset->out){ - fprintf(stderr,"[CIA ERROR] Failed to create '%s'\n",usrset->outfile); - result = FAILED_TO_CREATE_OUTFILE; - goto finish; - } - - // Create CIA Sections - /* Certificate Chain */ - result = BuildCIA_CertChain(ciaset); - if(result) goto finish; - - /* Ticket */ - result = BuildTicket(ciaset); - if(result) goto finish; - - /* CIA Header */ - result = BuildCIA_Header(ciaset); - if(result) goto finish; - /* Write To File Current Sections to File */ - /* Explanation : - In order to conserve memory, only one Content is in memory at a time. - This however has the limitation of only being able to generate TMD after all content - has been processed (, encrypted) and written to file. - */ - result = WriteCurrentSectionstoFile(ciaset); - if(result) goto finish; - - result = WriteContentsToFile(ciaset, usrset); - if(result) goto finish; - - result = BuildTMD(ciaset); - if(result) goto finish; - - result = WriteTMDToFile(ciaset); - -finish: - if(result != FAILED_TO_CREATE_OUTFILE && ciaset->out) fclose(ciaset->out); - free_CIASettings(ciaset); - return result; -} - -void init_CIASettings(cia_settings *set) -{ - memset(set,0,sizeof(cia_settings)); -} - -void free_CIASettings(cia_settings *set) -{ - if(set->content.ContentFilePtrs){ - for(u32 i = 1; i < set->content.ContentCount; i++){ - fclose(set->content.ContentFilePtrs[i]); - } - free(set->content.ContentFilePtrs); - } - free(set->CIA_Sections.CertChain.buffer); - free(set->CIA_Sections.Ticket.buffer); - free(set->CIA_Sections.TitleMetaData.buffer); - free(set->CIA_Sections.CXI_MetaData.buffer); - - memset(set,0,sizeof(cia_settings)); - - free(set); -} - -int get_CIASettings(cia_settings *ciaset, user_settings *usrset) -{ - int result = 0; - - // Transfering data from usrset - result = GetSettingsFromUsrset(ciaset,usrset); - - if(usrset->Content0IsNcch){ - result = GetSettingsFromNcch0(ciaset,0); - if(result) return result; - result = GetContentFilePtrs(ciaset,usrset); - if(result) return result; - } - - else if(usrset->Content0IsSrl){ - result = GetSettingsFromSrl(ciaset); - if(result) return result; - } - - else if(usrset->ConvertCci){ - result = GetSettingsFromCci(ciaset); - if(result) return result; - } - - - return 0; -} - -int GetSettingsFromUsrset(cia_settings *ciaset, user_settings *usrset) -{ - // General Stuff - ciaset->keys = &usrset->keys; - ciaset->content.content0 = usrset->Content0.buffer; - ciaset->content.content0_FileLen = usrset->Content0.size; - u32_to_u8(ciaset->Title_type,TYPE_CTR,BE); - ciaset->content.EncryptContents = usrset->EncryptContents; - if(ciaset->keys->aes.CommonKey[ciaset->keys->aes.CurrentCommonKey] == NULL && ciaset->content.EncryptContents){ - fprintf(stderr,"[CIA WARNING] Common Key could not be loaded, CIA will not be encrypted\n"); - ciaset->content.EncryptContents = false; - } - - ciaset->cert.ca_crl_version = 0; - ciaset->cert.signer_crl_version = 0; - - for(int i = 0; i < 3; i++){ - ciaset->Version[i] = usrset->Version[i]; - } - - // Random Number generator - u8 hash[0x20]; - ctr_sha(ciaset->content.content0,0x100,hash,CTR_SHA_256); - - // Ticket Data - memcpy(ciaset->tik.TicketID,(hash+0x8),8); - if(usrset->RandomTitleKey){ - memcpy(ciaset->tik.TitleKey,(hash+0x10),16); - } - else{ - memcpy(ciaset->tik.TitleKey,usrset->keys.aes.NormalKey,16); - } - - ciaset->tik.ticket_format_ver = 1; - - int result = GenCertChildIssuer(ciaset->tik.TicketIssuer,usrset->keys.certs.tik_cert); - if(result) return result; - - // Tmd Stuff - if(usrset->ContentID[0] > 0xffffffff){ - ciaset->content.ContentId[0] = u8_to_u32(hash,BE); - } - else ciaset->content.ContentId[0] = usrset->ContentID[0]; - ciaset->tmd.tmd_format_ver = 1; - result = GenCertChildIssuer(ciaset->tmd.TMDIssuer,usrset->keys.certs.tmd_cert); - return 0; -} - -int GetSettingsFromNcch0(cia_settings *ciaset, u32 ncch0_offset) -{ - /* Sanity Checks */ - if(!ciaset->content.content0_FileLen) - return CIA_NO_NCCH0; - - u8 *ncch0 = (u8*)(ciaset->content.content0+ncch0_offset); - - if(!IsNCCH(NULL,ncch0)){ - fprintf(stderr,"[CIA ERROR] Content0 is not NCCH\n"); - return CIA_INVALID_NCCH0; - } - - /* Get Ncch0 Header */ - NCCH_Header *hdr = NULL; - hdr = GetNCCH_CommonHDR(hdr,NULL,ncch0); - if(IsCfa(hdr)){ - ciaset->content.IsCfa = true; - } - - ciaset->content.ContentOffset[0] = 0; - ciaset->content.ContentSize[0] = GetNCCH_MediaSize(hdr)*GetNCCH_MediaUnitSize(hdr); - ciaset->content.TotalContentSize = ciaset->content.ContentSize[0]; - - /* Get Ncch0 Import Context */ - NCCH_STRUCT *ncch_ctx = malloc(sizeof(NCCH_STRUCT)); - if(!ncch_ctx){ fprintf(stderr,"[CIA ERROR] MEM ERROR\n"); return MEM_ERROR; } - memset(ncch_ctx,0x0,sizeof(NCCH_STRUCT)); - GetCXIStruct(ncch_ctx,hdr); - - /* Verify Ncch0 (Sig&Hash Checks) */ - int result = VerifyNCCH(ncch0,ciaset->keys,true); - if(result == UNABLE_TO_LOAD_NCCH_KEY){ - ciaset->content.KeyNotFound = true; - if(!ciaset->content.IsCfa){ - fprintf(stderr,"[CIA WARNING] CXI AES Key could not be loaded\n"); - fprintf(stderr," Meta Region, SaveDataSize, Remaster Version cannot be obtained\n"); - } - } - else if(result != 0){ - fprintf(stderr,"[CIA ERROR] Content 0 Is Corrupt (res = %d)\n",result); - return CIA_INVALID_NCCH0; - } - - /* Gen Settings From Ncch0 */ - endian_memcpy(ciaset->TitleID,hdr->title_id,8,LE); - - - /* Getting ExeFs/ExHeader */ - u8 *ExeFs = malloc(ncch_ctx->exefs_size); - if(!ExeFs){ fprintf(stderr,"[CIA ERROR] MEM ERROR\n"); return MEM_ERROR; } - ExtendedHeader_Struct *ExHeader = malloc(ncch_ctx->exheader_size); - if(!ExHeader){ fprintf(stderr,"[CIA ERROR] MEM ERROR\n"); free(ExeFs); return MEM_ERROR; } - - if(!(ciaset->content.IsCfa||ciaset->content.KeyNotFound)) GetNCCHSection(ExeFs, ncch_ctx->exefs_size, 0, ncch0, ncch_ctx, ciaset->keys, ncch_exefs); - if(!(ciaset->content.IsCfa||ciaset->content.KeyNotFound)) GetNCCHSection((u8*)ExHeader, ncch_ctx->exheader_size, 0, ncch0, ncch_ctx, ciaset->keys, ncch_ExHeader); - - result = GetCIADataFromNcch(ciaset,hdr,ExHeader); // Data For TMD - if(result) goto finish; - result = GetMetaRegion(ciaset,ExHeader,ExeFs); // Meta Region - /* Finish */ -finish: - free(ExeFs); - free(ExHeader); - - /* Return */ - free(ncch_ctx); - return result; -} - -int GetCIADataFromNcch(cia_settings *ciaset, NCCH_Header *NcchHdr, ExtendedHeader_Struct *ExHeader) -{ - u16 Category = u8_to_u16((ciaset->TitleID+2),BE); - bool IsPatch = (Category == 0x000E); - if(IsPatch||ciaset->content.IsCfa||ciaset->content.KeyNotFound) u32_to_u8(ciaset->tmd.SaveDataSize,0,LE); - else u32_to_u8(ciaset->tmd.SaveDataSize,(u32)GetSaveDataSize_frm_exhdr(ExHeader),LE); - - - if(ciaset->content.IsCfa||ciaset->content.KeyNotFound){ - if(ciaset->Version[0] == 0xffff){ // '-major' wasn't set - if(ciaset->content.IsCfa){ // Is a CFA and can be decrypted - fprintf(stderr,"[CIA ERROR] Invalid major version. Use '-major' option.\n"); - return CIA_BAD_VERSION; - } - else // CXI which cannot be decrypted - ciaset->Version[0] = 0; - } - } - else{ // Is a CXI and can be decrypted - if(ciaset->Version[0] != 0xffff){ // '-major' was set - fprintf(stderr,"[CIA ERROR] Option '-major' cannot be applied for cxi.\n"); - return CIA_BAD_VERSION; - } - // Setting remaster ver - ciaset->Version[0] = GetRemasterVersion_frm_exhdr(ExHeader); - } - SetupVersion(ciaset->Version[0],ciaset->Version[1],ciaset->Version[2]); - - u16 version = SetupVersion(ciaset->Version[0],ciaset->Version[1],ciaset->Version[2]); - u16_to_u8(ciaset->tik.TicketVersion,version,BE); - u16_to_u8(ciaset->tmd.TitleVersion,version,BE); - return 0; -} - -int GetMetaRegion(cia_settings *ciaset, ExtendedHeader_Struct *ExHeader, u8 *ExeFs) -{ - if(ciaset->content.IsCfa || ciaset->content.KeyNotFound) return 0; - ciaset->CIA_Sections.CXI_MetaData.size = sizeof(MetaData_Struct) + GetExeFsSectionSize("icon",ExeFs); - ciaset->CIA_Sections.CXI_MetaData.buffer = malloc(ciaset->CIA_Sections.CXI_MetaData.size); - if(!ciaset->CIA_Sections.CXI_MetaData.buffer){ fprintf(stderr,"[CIA ERROR] MEM ERROR\n"); return MEM_ERROR; } - MetaData_Struct *hdr = (MetaData_Struct*)ciaset->CIA_Sections.CXI_MetaData.buffer; - memset(hdr,0,sizeof(MetaData_Struct)); - GetDependancyList_frm_exhdr(hdr->DependancyList,ExHeader); - GetCoreVersion_frm_exhdr(hdr->CoreVersion,ExHeader); - if(DoesExeFsSectionExist("icon",ExeFs)){ - u8 *IconDestPos = (ciaset->CIA_Sections.CXI_MetaData.buffer + sizeof(MetaData_Struct)); - memcpy(IconDestPos,GetExeFsSection("icon",ExeFs),GetExeFsSectionSize("icon",ExeFs)); - } - return 0; -} - -int GetContentFilePtrs(cia_settings *ciaset, user_settings *usrset) -{ - ciaset->content.ContentFilePtrs = malloc(sizeof(FILE*)*CIA_MAX_CONTENT); - if(!ciaset->content.ContentFilePtrs){ fprintf(stderr,"[CIA ERROR] MEM ERROR\n"); return MEM_ERROR; } - memset(ciaset->content.ContentFilePtrs,0,sizeof(FILE*)*CIA_MAX_CONTENT); - int j = 1; - NCCH_Header *hdr = malloc(sizeof(NCCH_Header)); - for(int i = 1; i < CIA_MAX_CONTENT; i++){ - if(usrset->ContentPath[i]){ - ciaset->content.ContentFilePtrs[j] = fopen(usrset->ContentPath[i],"rb"); - if(!ciaset->content.ContentFilePtrs[j]){ fprintf(stderr,"[CIA ERROR] Failed to open '%s'\n",usrset->ContentPath[i]); return FAILED_TO_OPEN_FILE; } - if(usrset->ContentID[i] == 0x100000000){ - u8 hash[0x20]; - ctr_sha(usrset->ContentPath[i],strlen(usrset->ContentPath[i]),hash,CTR_SHA_256); - ciaset->content.ContentId[j] = u8_to_u32(hash,BE); - } - else ciaset->content.ContentId[j] = (u32)usrset->ContentID[i]; - ciaset->content.ContentIndex[j] = (u16)i; - - // Get Data from ncch HDR - GetNCCH_CommonHDR(hdr,ciaset->content.ContentFilePtrs[j],NULL); - - // Get TitleID - memcpy(ciaset->content.ContentTitleId[j],hdr->title_id,8); - - // Get Size - ciaset->content.ContentSize[j] = GetNCCH_MediaSize(hdr)*GetNCCH_MediaUnitSize(hdr); - ciaset->content.ContentOffset[j] = ciaset->content.TotalContentSize; - - ciaset->content.TotalContentSize += ciaset->content.ContentSize[j]; - - - // Finish get next content - j++; - } - } - free(hdr); - ciaset->content.ContentCount = j; - - // Check Conflicting IDs - for(int i = 0; i < ciaset->content.ContentCount; i++){ - for(j = i+1; j < ciaset->content.ContentCount; j++){ - if(ciaset->content.ContentId[j] == ciaset->content.ContentId[i]){ - fprintf(stderr,"[CIA ERROR] CIA Content %d and %d, have conflicting IDs\n",ciaset->content.ContentIndex[j],ciaset->content.ContentIndex[i]); - return CIA_CONFILCTING_CONTENT_IDS; - } - } - } - return 0; -} - -int GetSettingsFromSrl(cia_settings *ciaset) -{ - SRL_Header *hdr = (SRL_Header*)ciaset->content.content0; - if(!hdr || ciaset->content.content0_FileLen < sizeof(SRL_Header)) { - fprintf(stderr,"[CIA ERROR] Invalid TWL SRL File\n"); - return FAILED_TO_IMPORT_FILE; - } - - // Check if TWL SRL File - if(u8_to_u16(&hdr->title_id[6],LE) != 0x0003){ - fprintf(stderr,"[CIA ERROR] Invalid TWL SRL File\n"); - return FAILED_TO_IMPORT_FILE; - } - - // Generate and store Converted TitleID - u64_to_u8(ciaset->TitleID,ConvertTwlIdToCtrId(u8_to_u64(hdr->title_id,LE)),BE); - //memdump(stdout,"SRL TID: ",ciaset->TitleID,8); - - // Get TWL Flag - ciaset->tmd.twl_flag = ((hdr->reserved_flags[3] & 6) >> 1); - - // Get Remaster Version - u16 version = SetupVersion(hdr->rom_version,ciaset->Version[1],0); - u16_to_u8(ciaset->tik.TicketVersion,version,BE); - u16_to_u8(ciaset->tmd.TitleVersion,version,BE); - - // Get SaveDataSize (Public and Private) - memcpy(ciaset->tmd.SaveDataSize,hdr->pub_save_data_size,4); - memcpy(ciaset->tmd.PrivSaveDataSize,hdr->priv_save_data_size,4); - - // Setting CIA Content Settings - ciaset->content.ContentCount = 1; - ciaset->content.ContentOffset[0] = 0; - ciaset->content.ContentSize[0] = ciaset->content.content0_FileLen; - ciaset->content.TotalContentSize = ciaset->content.content0_FileLen; - - return 0; -} - - - -int GetSettingsFromCci(cia_settings *ciaset) -{ - int result = 0; - - if(!IsCci(ciaset->content.content0)){ - fprintf(stderr,"[CIA ERROR] Invalid CCI file\n"); - return FAILED_TO_IMPORT_FILE; - } - - u32 ncch0_offset = GetPartitionOffset(ciaset->content.content0,0); - if(!ncch0_offset){ - fprintf(stderr,"[CIA ERROR] Invalid CCI file (invalid ncch0 size)\n"); - return FAILED_TO_IMPORT_FILE; - } - - result = GetSettingsFromNcch0(ciaset, ncch0_offset); - if(result){ - fprintf(stderr,"Import of Ncch 0 failed(%d)\n",result); - return result; - } - ciaset->content.ContentCount = 1; - ciaset->content.CCIContentOffsets[0] = ncch0_offset; - NCCH_Header *hdr = malloc(sizeof(NCCH_Header)); - for(int i = 1; i < 8; i++){ - if(GetPartitionSize(ciaset->content.content0,i)){ - ciaset->content.CCIContentOffsets[ciaset->content.ContentCount] = GetPartitionOffset(ciaset->content.content0,i); - - // Get Data from ncch HDR - GetNCCH_CommonHDR(hdr,NULL,GetPartition(ciaset->content.content0,i)); - - // Get Size - ciaset->content.ContentSize[ciaset->content.ContentCount] = GetPartitionSize(ciaset->content.content0,i); - ciaset->content.ContentOffset[ciaset->content.ContentCount] = ciaset->content.TotalContentSize; - - ciaset->content.TotalContentSize += ciaset->content.ContentSize[ciaset->content.ContentCount]; - - // Get ID - u8 hash[0x20]; - ctr_sha((u8*)hdr,0x200,hash,CTR_SHA_256); - ciaset->content.ContentId[ciaset->content.ContentCount] = u8_to_u32(hash,BE); - - // Get Index - ciaset->content.ContentIndex[ciaset->content.ContentCount] = i; - - // Increment Content Count - ciaset->content.ContentCount++; - } - } - free(hdr); - - return 0; -} - -u16 SetupVersion(u16 Major, u16 Minor, u16 Micro) -{ - return (((Major << 10) & 0xFC00) | ((Minor << 4) & 0x3F0) | (Micro & 0xf)); -} - -int BuildCIA_CertChain(cia_settings *ciaset) -{ - ciaset->CIA_Sections.CertChain.size = GetCertSize(ciaset->keys->certs.ca_cert) + GetCertSize(ciaset->keys->certs.tik_cert) + GetCertSize(ciaset->keys->certs.tmd_cert); - ciaset->CIA_Sections.CertChain.buffer = malloc(ciaset->CIA_Sections.CertChain.size); - if(!ciaset->CIA_Sections.CertChain.buffer) { fprintf(stderr,"[CIA ERROR] MEM ERROR\n"); return MEM_ERROR; } - memcpy(ciaset->CIA_Sections.CertChain.buffer,ciaset->keys->certs.ca_cert,GetCertSize(ciaset->keys->certs.ca_cert)); - memcpy((ciaset->CIA_Sections.CertChain.buffer+GetCertSize(ciaset->keys->certs.ca_cert)),ciaset->keys->certs.tik_cert,GetCertSize(ciaset->keys->certs.tik_cert)); - memcpy((ciaset->CIA_Sections.CertChain.buffer+GetCertSize(ciaset->keys->certs.ca_cert)+GetCertSize(ciaset->keys->certs.tik_cert)),ciaset->keys->certs.tmd_cert,GetCertSize(ciaset->keys->certs.tmd_cert)); - return 0; -} - -int BuildCIA_Header(cia_settings *ciaset) -{ - // Allocating memory for header - ciaset->CIA_Sections.Header.size = sizeof(CIA_Header); - ciaset->CIA_Sections.Header.buffer = malloc(ciaset->CIA_Sections.Header.size); - if(!ciaset->CIA_Sections.Header.buffer){ fprintf(stderr,"[CIA ERROR] MEM ERROR\n"); return MEM_ERROR; } - - CIA_Header *hdr = (CIA_Header*)ciaset->CIA_Sections.Header.buffer; - - // Clearing - memset(hdr,0,sizeof(CIA_Header)); - - // Predict TMD Size - ciaset->CIA_Sections.TitleMetaData.size = PredictTMDSize(ciaset->content.ContentCount); - - // Setting Data - u32_to_u8(hdr->HdrSize,sizeof(CIA_Header),LE); - u16_to_u8(hdr->Type,0x0,LE); - u16_to_u8(hdr->Version,0x0,LE); - u32_to_u8(hdr->CertChainSize,ciaset->CIA_Sections.CertChain.size,LE); - u32_to_u8(hdr->TicketSize,ciaset->CIA_Sections.Ticket.size,LE); - u32_to_u8(hdr->TitleMetaDataSize,ciaset->CIA_Sections.TitleMetaData.size,LE); - u32_to_u8(hdr->CXI_MetaSize,ciaset->CIA_Sections.CXI_MetaData.size,LE); - u64_to_u8(hdr->ContentSize,ciaset->content.TotalContentSize,LE); - - // Recording Offsets - ciaset->CIA_Sections.CertChainOffset = align_value(sizeof(CIA_Header),0x40); - ciaset->CIA_Sections.TicketOffset = align_value(ciaset->CIA_Sections.CertChainOffset+ciaset->CIA_Sections.CertChain.size,0x40); - ciaset->CIA_Sections.TitleMetaDataOffset = align_value(ciaset->CIA_Sections.TicketOffset+ciaset->CIA_Sections.Ticket.size,0x40); - ciaset->CIA_Sections.ContentOffset = align_value(ciaset->CIA_Sections.TitleMetaDataOffset+ciaset->CIA_Sections.TitleMetaData.size,0x40); - ciaset->CIA_Sections.CXI_MetaDataOffset = align_value(ciaset->CIA_Sections.ContentOffset+ciaset->content.TotalContentSize,0x40); - - // SetCIAContentIndex, actually works for all index values now. CIA files generated can now hold, with - // validity, 65536 contents. Or at least have a content with index value of 65535. - for(int i = 0; i < ciaset->content.ContentCount; i++){ - // This works by treating the 0x2000 byte index array as an array of 2048 u32 values - - // Used for determining which u32 chunk to write the value to - u16 section = ciaset->content.ContentIndex[i]/32; - - // Calculating the value added to the u32 - u32 value = 0x80000000/(1<content.ContentIndex[i]); - - // Retrieving current u32 block - u32 cur_content_index_section = u8_to_u32(hdr->ContentIndex+(sizeof(u32)*section),BE); - - // Adding value to block - cur_content_index_section += value; - - // Returning block - u32_to_u8(hdr->ContentIndex+(sizeof(u32)*section),cur_content_index_section,BE); - } - return 0; -} - -int WriteCurrentSectionstoFile(cia_settings *ciaset) -{ - WriteBuffer(ciaset->CIA_Sections.Header.buffer,ciaset->CIA_Sections.Header.size,0,ciaset->out); - WriteBuffer(ciaset->CIA_Sections.CertChain.buffer,ciaset->CIA_Sections.CertChain.size,ciaset->CIA_Sections.CertChainOffset,ciaset->out); - WriteBuffer(ciaset->CIA_Sections.Ticket.buffer,ciaset->CIA_Sections.Ticket.size,ciaset->CIA_Sections.TicketOffset,ciaset->out); - WriteBuffer(ciaset->CIA_Sections.CXI_MetaData.buffer,ciaset->CIA_Sections.CXI_MetaData.size,ciaset->CIA_Sections.CXI_MetaDataOffset,ciaset->out); - return 0; -} - -int WriteContentsToFile(cia_settings *ciaset, user_settings *usrset) -{ - u8 *Content0 = ciaset->content.content0; - if(usrset->ConvertCci) Content0 = (u8*)(ciaset->content.content0+ciaset->content.CCIContentOffsets[0]); - - ctr_sha(Content0,ciaset->content.ContentSize[0],ciaset->content.ContentHash[0],CTR_SHA_256); - if(ciaset->content.EncryptContents) { - ciaset->content.ContentType[0] |= Encrypted; - CryptContent(Content0,Content0,ciaset->content.ContentSize[0],ciaset->tik.TitleKey,ciaset->content.ContentIndex[0],ENC); - } - WriteBuffer(Content0,ciaset->content.ContentSize[0],ciaset->content.ContentOffset[0]+ciaset->CIA_Sections.ContentOffset,ciaset->out); - - // Free Buffer if Not CCI - if(!usrset->ConvertCci){ - free(usrset->Content0.buffer); - usrset->Content0.buffer = NULL; - usrset->Content0.size = 0; - } - - // Add additional contents, recreating them with their new TitleID - if(usrset->Content0IsNcch){ - u8 TitleId[8]; - endian_memcpy(TitleId,ciaset->TitleID,8,LE); - for(int i = 1; i < ciaset->content.ContentCount; i++){ - u8 *ContentBuff = RetargetNCCH(ciaset->content.ContentFilePtrs[i],ciaset->content.ContentSize[i],ciaset->content.ContentTitleId[i],TitleId,ciaset->keys); - if(!ContentBuff){ - fprintf(stderr,"[CIA ERROR] Could not import content %d to CIA\n",i); - return FAILED_TO_IMPORT_FILE; - } - ctr_sha(ContentBuff,ciaset->content.ContentSize[i],ciaset->content.ContentHash[i],CTR_SHA_256); - if(ciaset->content.EncryptContents) { - ciaset->content.ContentType[i] |= Encrypted; - CryptContent(ContentBuff,ContentBuff,ciaset->content.ContentSize[i],ciaset->tik.TitleKey,ciaset->content.ContentIndex[i],ENC); - } - WriteBuffer(ContentBuff,ciaset->content.ContentSize[i],ciaset->content.ContentOffset[i]+ciaset->CIA_Sections.ContentOffset,ciaset->out); - free(ContentBuff); - } - } - else if(usrset->ConvertCci){ - for(int i = 1; i < ciaset->content.ContentCount; i++){ - u8 *ContentBuff = (u8*)(ciaset->content.content0+ciaset->content.CCIContentOffsets[i]); - ctr_sha(ContentBuff,ciaset->content.ContentSize[i],ciaset->content.ContentHash[i],CTR_SHA_256); - if(ciaset->content.EncryptContents) { - ciaset->content.ContentType[i] |= Encrypted; - CryptContent(ContentBuff,ContentBuff,ciaset->content.ContentSize[i],ciaset->tik.TitleKey,ciaset->content.ContentIndex[i],ENC); - } - WriteBuffer(ContentBuff,ciaset->content.ContentSize[i],ciaset->content.ContentOffset[i]+ciaset->CIA_Sections.ContentOffset,ciaset->out); - } - free(usrset->Content0.buffer); - usrset->Content0.buffer = NULL; - usrset->Content0.size = 0; - } - - - return 0; -} - -int WriteTMDToFile(cia_settings *ciaset) -{ - WriteBuffer(ciaset->CIA_Sections.TitleMetaData.buffer,ciaset->CIA_Sections.TitleMetaData.size,ciaset->CIA_Sections.TitleMetaDataOffset,ciaset->out); - return 0; -} - -int CryptContent(u8 *EncBuffer,u8 *DecBuffer,u64 size,u8 *title_key, u16 index, u8 mode) -{ - //generating IV - u8 iv[16]; - memset(&iv,0x0,16); - iv[0] = (index >> 8) & 0xff; - iv[1] = index & 0xff; - //Crypting content - ctr_aes_context ctx; - memset(&ctx,0x0,sizeof(ctr_aes_context)); - ctr_init_aes_cbc(&ctx,title_key,iv,mode); - if(mode == ENC) ctr_aes_cbc(&ctx,DecBuffer,EncBuffer,size,ENC); - else ctr_aes_cbc(&ctx,EncBuffer,DecBuffer,size,DEC); - return 0; -} \ No newline at end of file diff --git a/cia.h b/cia.h deleted file mode 100644 index e932fa7..0000000 --- a/cia.h +++ /dev/null @@ -1,108 +0,0 @@ -// Enums -typedef enum -{ - CIA_NO_NCCH0 = -1, - CIA_INVALID_NCCH0 = -2, - CIA_CONFILCTING_CONTENT_IDS = -3, - CIA_BAD_VERSION = -4, -} cia_errors; - -// Structs -typedef struct -{ - u8 HdrSize[4]; - u8 Type[2]; - u8 Version[2]; - u8 CertChainSize[4]; - u8 TicketSize[4]; - u8 TitleMetaDataSize[4]; - u8 CXI_MetaSize[4]; - u8 ContentSize[8]; - u8 ContentIndex[0x2000]; -} CIA_Header; - -typedef struct -{ - u8 DependancyList[0x30*0x8]; - u8 Reserved0[0x180]; - u8 CoreVersion[4]; - u8 Reserved1[0xfc]; -} MetaData_Struct; - -typedef struct -{ - FILE *out; - - u8 TitleID[8]; - u8 Title_type[4]; - u16 Version[3]; - - keys_struct *keys; - - struct{ - u8 ca_crl_version; - u8 signer_crl_version; - } cert; - - struct{ - u8 TicketIssuer[0x40]; - u8 ticket_format_ver; - u8 TicketID[8]; - u8 DeviceID[8]; - u8 TicketVersion[3]; - u8 TitleKey[16]; - } tik; - - struct{ - u8 TMDIssuer[0x40]; - u8 tmd_format_ver; - u8 TitleVersion[3]; - u8 SaveDataSize[4]; - u8 PrivSaveDataSize[4]; - u8 twl_flag; - } tmd; - - struct{ - u8 *content0; - u64 content0_FileLen; - bool IsCfa; - bool KeyNotFound; - bool EncryptContents; - - FILE **ContentFilePtrs; - u64 CCIContentOffsets[CCI_MAX_CONTENT]; - u16 ContentCount; - u64 ContentSize[CIA_MAX_CONTENT]; - u64 ContentOffset[CIA_MAX_CONTENT]; - u16 ContentIndex[CIA_MAX_CONTENT]; - u16 ContentType[CIA_MAX_CONTENT]; - u32 ContentId[CIA_MAX_CONTENT]; - u8 ContentHash[CIA_MAX_CONTENT][0x20]; - - u8 ContentTitleId[CIA_MAX_CONTENT][8]; - u64 TotalContentSize; - } content; - - struct{ - COMPONENT_STRUCT Header; - - u32 CertChainOffset; - COMPONENT_STRUCT CertChain; - - u32 TicketOffset; - COMPONENT_STRUCT Ticket; - - u32 TitleMetaDataOffset; - COMPONENT_STRUCT TitleMetaData; - - u32 CXI_MetaDataOffset; - COMPONENT_STRUCT CXI_MetaData; - - u64 ContentOffset; - } CIA_Sections; - - // Finish CIA data req. -} cia_settings; - -// Public Prototypes -int build_CIA(user_settings *usrset); \ No newline at end of file diff --git a/cia_certificates.h b/cia_certificates.h deleted file mode 100644 index ec5016a..0000000 --- a/cia_certificates.h +++ /dev/null @@ -1,670 +0,0 @@ -#ifndef _CIA_CERTS_H_ -#define _CIA_CERTS_H_ - -//RetailCerts -static const unsigned char ca3_dpki_cert[0x400] = -{ - 0x00, 0x01, 0x00, 0x03, 0x70, 0x41, 0x38, 0xEF, - 0xBB, 0xBD, 0xA1, 0x6A, 0x98, 0x7D, 0xD9, 0x01, - 0x32, 0x6D, 0x1C, 0x94, 0x59, 0x48, 0x4C, 0x88, - 0xA2, 0x86, 0x1B, 0x91, 0xA3, 0x12, 0x58, 0x7A, - 0xE7, 0x0E, 0xF6, 0x23, 0x7E, 0xC5, 0x0E, 0x10, - 0x32, 0xDC, 0x39, 0xDD, 0xE8, 0x9A, 0x96, 0xA8, - 0xE8, 0x59, 0xD7, 0x6A, 0x98, 0xA6, 0xE7, 0xE3, - 0x6A, 0x0C, 0xFE, 0x35, 0x2C, 0xA8, 0x93, 0x05, - 0x82, 0x34, 0xFF, 0x83, 0x3F, 0xCB, 0x3B, 0x03, - 0x81, 0x1E, 0x9F, 0x0D, 0xC0, 0xD9, 0xA5, 0x2F, - 0x80, 0x45, 0xB4, 0xB2, 0xF9, 0x41, 0x1B, 0x67, - 0xA5, 0x1C, 0x44, 0xB5, 0xEF, 0x8C, 0xE7, 0x7B, - 0xD6, 0xD5, 0x6B, 0xA7, 0x57, 0x34, 0xA1, 0x85, - 0x6D, 0xE6, 0xD4, 0xBE, 0xD6, 0xD3, 0xA2, 0x42, - 0xC7, 0xC8, 0x79, 0x1B, 0x34, 0x22, 0x37, 0x5E, - 0x5C, 0x77, 0x9A, 0xBF, 0x07, 0x2F, 0x76, 0x95, - 0xEF, 0xA0, 0xF7, 0x5B, 0xCB, 0x83, 0x78, 0x9F, - 0xC3, 0x0E, 0x3F, 0xE4, 0xCC, 0x83, 0x92, 0x20, - 0x78, 0x40, 0x63, 0x89, 0x49, 0xC7, 0xF6, 0x88, - 0x56, 0x5F, 0x64, 0x9B, 0x74, 0xD6, 0x3D, 0x8D, - 0x58, 0xFF, 0xAD, 0xDA, 0x57, 0x1E, 0x95, 0x54, - 0x42, 0x6B, 0x13, 0x18, 0xFC, 0x46, 0x89, 0x83, - 0xD4, 0xC8, 0xA5, 0x62, 0x8B, 0x06, 0xB6, 0xFC, - 0x5D, 0x50, 0x7C, 0x13, 0xE7, 0xA1, 0x8A, 0xC1, - 0x51, 0x1E, 0xB6, 0xD6, 0x2E, 0xA5, 0x44, 0x8F, - 0x83, 0x50, 0x14, 0x47, 0xA9, 0xAF, 0xB3, 0xEC, - 0xC2, 0x90, 0x3C, 0x9D, 0xD5, 0x2F, 0x92, 0x2A, - 0xC9, 0xAC, 0xDB, 0xEF, 0x58, 0xC6, 0x02, 0x18, - 0x48, 0xD9, 0x6E, 0x20, 0x87, 0x32, 0xD3, 0xD1, - 0xD9, 0xD9, 0xEA, 0x44, 0x0D, 0x91, 0x62, 0x1C, - 0x7A, 0x99, 0xDB, 0x88, 0x43, 0xC5, 0x9C, 0x1F, - 0x2E, 0x2C, 0x7D, 0x9B, 0x57, 0x7D, 0x51, 0x2C, - 0x16, 0x6D, 0x6F, 0x7E, 0x1A, 0xAD, 0x4A, 0x77, - 0x4A, 0x37, 0x44, 0x7E, 0x78, 0xFE, 0x20, 0x21, - 0xE1, 0x4A, 0x95, 0xD1, 0x12, 0xA0, 0x68, 0xAD, - 0xA0, 0x19, 0xF4, 0x63, 0xC7, 0xA5, 0x56, 0x85, - 0xAA, 0xBB, 0x68, 0x88, 0xB9, 0x24, 0x64, 0x83, - 0xD1, 0x8B, 0x9C, 0x80, 0x6F, 0x47, 0x49, 0x18, - 0x33, 0x17, 0x82, 0x34, 0x4A, 0x4B, 0x85, 0x31, - 0x33, 0x4B, 0x26, 0x30, 0x32, 0x63, 0xD9, 0xD2, - 0xEB, 0x4F, 0x4B, 0xB9, 0x96, 0x02, 0xB3, 0x52, - 0xF6, 0xAE, 0x40, 0x46, 0xC6, 0x9A, 0x5E, 0x7E, - 0x8E, 0x4A, 0x18, 0xEF, 0x9B, 0xC0, 0xA2, 0xDE, - 0xD6, 0x13, 0x10, 0x41, 0x70, 0x12, 0xFD, 0x82, - 0x4C, 0xC1, 0x16, 0xCF, 0xB7, 0xC4, 0xC1, 0xF7, - 0xEC, 0x71, 0x77, 0xA1, 0x74, 0x46, 0xCB, 0xDE, - 0x96, 0xF3, 0xED, 0xD8, 0x8F, 0xCD, 0x05, 0x2F, - 0x0B, 0x88, 0x8A, 0x45, 0xFD, 0xAF, 0x2B, 0x63, - 0x13, 0x54, 0xF4, 0x0D, 0x16, 0xE5, 0xFA, 0x9C, - 0x2C, 0x4E, 0xDA, 0x98, 0xE7, 0x98, 0xD1, 0x5E, - 0x60, 0x46, 0xDC, 0x53, 0x63, 0xF3, 0x09, 0x6B, - 0x2C, 0x60, 0x7A, 0x9D, 0x8D, 0xD5, 0x5B, 0x15, - 0x02, 0xA6, 0xAC, 0x7D, 0x3C, 0xC8, 0xD8, 0xC5, - 0x75, 0x99, 0x8E, 0x7D, 0x79, 0x69, 0x10, 0xC8, - 0x04, 0xC4, 0x95, 0x23, 0x50, 0x57, 0xE9, 0x1E, - 0xCD, 0x26, 0x37, 0xC9, 0xC1, 0x84, 0x51, 0x51, - 0xAC, 0x6B, 0x9A, 0x04, 0x90, 0xAE, 0x3E, 0xC6, - 0xF4, 0x77, 0x40, 0xA0, 0xDB, 0x0B, 0xA3, 0x6D, - 0x07, 0x59, 0x56, 0xCE, 0xE7, 0x35, 0x4E, 0xA3, - 0xE9, 0xA4, 0xF2, 0x72, 0x0B, 0x26, 0x55, 0x0C, - 0x7D, 0x39, 0x43, 0x24, 0xBC, 0x0C, 0xB7, 0xE9, - 0x31, 0x7D, 0x8A, 0x86, 0x61, 0xF4, 0x21, 0x91, - 0xFF, 0x10, 0xB0, 0x82, 0x56, 0xCE, 0x3F, 0xD2, - 0x5B, 0x74, 0x5E, 0x51, 0x94, 0x90, 0x6B, 0x4D, - 0x61, 0xCB, 0x4C, 0x2E, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x52, 0x6F, 0x6F, 0x74, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x43, 0x41, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x33, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7B, 0xE8, 0xEF, 0x6C, - 0xB2, 0x79, 0xC9, 0xE2, 0xEE, 0xE1, 0x21, 0xC6, - 0xEA, 0xF4, 0x4F, 0xF6, 0x39, 0xF8, 0x8F, 0x07, - 0x8B, 0x4B, 0x77, 0xED, 0x9F, 0x95, 0x60, 0xB0, - 0x35, 0x82, 0x81, 0xB5, 0x0E, 0x55, 0xAB, 0x72, - 0x11, 0x15, 0xA1, 0x77, 0x70, 0x3C, 0x7A, 0x30, - 0xFE, 0x3A, 0xE9, 0xEF, 0x1C, 0x60, 0xBC, 0x1D, - 0x97, 0x46, 0x76, 0xB2, 0x3A, 0x68, 0xCC, 0x04, - 0xB1, 0x98, 0x52, 0x5B, 0xC9, 0x68, 0xF1, 0x1D, - 0xE2, 0xDB, 0x50, 0xE4, 0xD9, 0xE7, 0xF0, 0x71, - 0xE5, 0x62, 0xDA, 0xE2, 0x09, 0x22, 0x33, 0xE9, - 0xD3, 0x63, 0xF6, 0x1D, 0xD7, 0xC1, 0x9F, 0xF3, - 0xA4, 0xA9, 0x1E, 0x8F, 0x65, 0x53, 0xD4, 0x71, - 0xDD, 0x7B, 0x84, 0xB9, 0xF1, 0xB8, 0xCE, 0x73, - 0x35, 0xF0, 0xF5, 0x54, 0x05, 0x63, 0xA1, 0xEA, - 0xB8, 0x39, 0x63, 0xE0, 0x9B, 0xE9, 0x01, 0x01, - 0x1F, 0x99, 0x54, 0x63, 0x61, 0x28, 0x70, 0x20, - 0xE9, 0xCC, 0x0D, 0xAB, 0x48, 0x7F, 0x14, 0x0D, - 0x66, 0x26, 0xA1, 0x83, 0x6D, 0x27, 0x11, 0x1F, - 0x20, 0x68, 0xDE, 0x47, 0x72, 0x14, 0x91, 0x51, - 0xCF, 0x69, 0xC6, 0x1B, 0xA6, 0x0E, 0xF9, 0xD9, - 0x49, 0xA0, 0xF7, 0x1F, 0x54, 0x99, 0xF2, 0xD3, - 0x9A, 0xD2, 0x8C, 0x70, 0x05, 0x34, 0x82, 0x93, - 0xC4, 0x31, 0xFF, 0xBD, 0x33, 0xF6, 0xBC, 0xA6, - 0x0D, 0xC7, 0x19, 0x5E, 0xA2, 0xBC, 0xC5, 0x6D, - 0x20, 0x0B, 0xAF, 0x6D, 0x06, 0xD0, 0x9C, 0x41, - 0xDB, 0x8D, 0xE9, 0xC7, 0x20, 0x15, 0x4C, 0xA4, - 0x83, 0x2B, 0x69, 0xC0, 0x8C, 0x69, 0xCD, 0x3B, - 0x07, 0x3A, 0x00, 0x63, 0x60, 0x2F, 0x46, 0x2D, - 0x33, 0x80, 0x61, 0xA5, 0xEA, 0x6C, 0x91, 0x5C, - 0xD5, 0x62, 0x35, 0x79, 0xC3, 0xEB, 0x64, 0xCE, - 0x44, 0xEF, 0x58, 0x6D, 0x14, 0xBA, 0xAA, 0x88, - 0x34, 0x01, 0x9B, 0x3E, 0xEB, 0xEE, 0xD3, 0x79, - 0x00, 0x01, 0x00, 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 -}; - -static const unsigned char xsC_dpki_cert[0x300] = -{ - 0x00, 0x01, 0x00, 0x04, 0x91, 0x9E, 0xBE, 0x46, - 0x4A, 0xD0, 0xF5, 0x52, 0xCD, 0x1B, 0x72, 0xE7, - 0x88, 0x49, 0x10, 0xCF, 0x55, 0xA9, 0xF0, 0x2E, - 0x50, 0x78, 0x96, 0x41, 0xD8, 0x96, 0x68, 0x3D, - 0xC0, 0x05, 0xBD, 0x0A, 0xEA, 0x87, 0x07, 0x9D, - 0x8A, 0xC2, 0x84, 0xC6, 0x75, 0x06, 0x5F, 0x74, - 0xC8, 0xBF, 0x37, 0xC8, 0x80, 0x44, 0x40, 0x95, - 0x02, 0xA0, 0x22, 0x98, 0x0B, 0xB8, 0xAD, 0x48, - 0x38, 0x3F, 0x6D, 0x28, 0xA7, 0x9D, 0xE3, 0x96, - 0x26, 0xCC, 0xB2, 0xB2, 0x2A, 0x0F, 0x19, 0xE4, - 0x10, 0x32, 0xF0, 0x94, 0xB3, 0x9F, 0xF0, 0x13, - 0x31, 0x46, 0xDE, 0xC8, 0xF6, 0xC1, 0xA9, 0xD5, - 0x5C, 0xD2, 0x8D, 0x9E, 0x1C, 0x47, 0xB3, 0xD1, - 0x1F, 0x4F, 0x54, 0x26, 0xC2, 0xC7, 0x80, 0x13, - 0x5A, 0x27, 0x75, 0xD3, 0xCA, 0x67, 0x9B, 0xC7, - 0xE8, 0x34, 0xF0, 0xE0, 0xFB, 0x58, 0xE6, 0x88, - 0x60, 0xA7, 0x13, 0x30, 0xFC, 0x95, 0x79, 0x17, - 0x93, 0xC8, 0xFB, 0xA9, 0x35, 0xA7, 0xA6, 0x90, - 0x8F, 0x22, 0x9D, 0xEE, 0x2A, 0x0C, 0xA6, 0xB9, - 0xB2, 0x3B, 0x12, 0xD4, 0x95, 0xA6, 0xFE, 0x19, - 0xD0, 0xD7, 0x26, 0x48, 0x21, 0x68, 0x78, 0x60, - 0x5A, 0x66, 0x53, 0x8D, 0xBF, 0x37, 0x68, 0x99, - 0x90, 0x5D, 0x34, 0x45, 0xFC, 0x5C, 0x72, 0x7A, - 0x0E, 0x13, 0xE0, 0xE2, 0xC8, 0x97, 0x1C, 0x9C, - 0xFA, 0x6C, 0x60, 0x67, 0x88, 0x75, 0x73, 0x2A, - 0x4E, 0x75, 0x52, 0x3D, 0x2F, 0x56, 0x2F, 0x12, - 0xAA, 0xBD, 0x15, 0x73, 0xBF, 0x06, 0xC9, 0x40, - 0x54, 0xAE, 0xFA, 0x81, 0xA7, 0x14, 0x17, 0xAF, - 0x9A, 0x4A, 0x06, 0x6D, 0x0F, 0xFC, 0x5A, 0xD6, - 0x4B, 0xAB, 0x28, 0xB1, 0xFF, 0x60, 0x66, 0x1F, - 0x44, 0x37, 0xD4, 0x9E, 0x1E, 0x0D, 0x94, 0x12, - 0xEB, 0x4B, 0xCA, 0xCF, 0x4C, 0xFD, 0x6A, 0x34, - 0x08, 0x84, 0x79, 0x82, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x52, 0x6F, 0x6F, 0x74, 0x2D, 0x43, 0x41, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x33, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x58, 0x53, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x63, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x13, 0x7A, 0x08, 0x94, - 0xAD, 0x50, 0x5B, 0xB6, 0xC6, 0x7E, 0x2E, 0x5B, - 0xDD, 0x6A, 0x3B, 0xEC, 0x43, 0xD9, 0x10, 0xC7, - 0x72, 0xE9, 0xCC, 0x29, 0x0D, 0xA5, 0x85, 0x88, - 0xB7, 0x7D, 0xCC, 0x11, 0x68, 0x0B, 0xB3, 0xE2, - 0x9F, 0x4E, 0xAB, 0xBB, 0x26, 0xE9, 0x8C, 0x26, - 0x01, 0x98, 0x5C, 0x04, 0x1B, 0xB1, 0x43, 0x78, - 0xE6, 0x89, 0x18, 0x1A, 0xAD, 0x77, 0x05, 0x68, - 0xE9, 0x28, 0xA2, 0xB9, 0x81, 0x67, 0xEE, 0x3E, - 0x10, 0xD0, 0x72, 0xBE, 0xEF, 0x1F, 0xA2, 0x2F, - 0xA2, 0xAA, 0x3E, 0x13, 0xF1, 0x1E, 0x18, 0x36, - 0xA9, 0x2A, 0x42, 0x81, 0xEF, 0x70, 0xAA, 0xF4, - 0xE4, 0x62, 0x99, 0x82, 0x21, 0xC6, 0xFB, 0xB9, - 0xBD, 0xD0, 0x17, 0xE6, 0xAC, 0x59, 0x04, 0x94, - 0xE9, 0xCE, 0xA9, 0x85, 0x9C, 0xEB, 0x2D, 0x2A, - 0x4C, 0x17, 0x66, 0xF2, 0xC3, 0x39, 0x12, 0xC5, - 0x8F, 0x14, 0xA8, 0x03, 0xE3, 0x6F, 0xCC, 0xDC, - 0xCC, 0xDC, 0x13, 0xFD, 0x7A, 0xE7, 0x7C, 0x7A, - 0x78, 0xD9, 0x97, 0xE6, 0xAC, 0xC3, 0x55, 0x57, - 0xE0, 0xD3, 0xE9, 0xEB, 0x64, 0xB4, 0x3C, 0x92, - 0xF4, 0xC5, 0x0D, 0x67, 0xA6, 0x02, 0xDE, 0xB3, - 0x91, 0xB0, 0x66, 0x61, 0xCD, 0x32, 0x88, 0x0B, - 0xD6, 0x49, 0x12, 0xAF, 0x1C, 0xBC, 0xB7, 0x16, - 0x2A, 0x06, 0xF0, 0x25, 0x65, 0xD3, 0xB0, 0xEC, - 0xE4, 0xFC, 0xEC, 0xDD, 0xAE, 0x8A, 0x49, 0x34, - 0xDB, 0x8E, 0xE6, 0x7F, 0x30, 0x17, 0x98, 0x62, - 0x21, 0x15, 0x5D, 0x13, 0x1C, 0x6C, 0x3F, 0x09, - 0xAB, 0x19, 0x45, 0xC2, 0x06, 0xAC, 0x70, 0xC9, - 0x42, 0xB3, 0x6F, 0x49, 0xA1, 0x18, 0x3B, 0xCD, - 0x78, 0xB6, 0xE4, 0xB4, 0x7C, 0x6C, 0x5C, 0xAC, - 0x0F, 0x8D, 0x62, 0xF8, 0x97, 0xC6, 0x95, 0x3D, - 0xD1, 0x2F, 0x28, 0xB7, 0x0C, 0x5B, 0x7D, 0xF7, - 0x51, 0x81, 0x9A, 0x98, 0x34, 0x65, 0x26, 0x25, - 0x00, 0x01, 0x00, 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 -}; - -static const unsigned char cpB_dpki_cert[0x300] = -{ - 0x00, 0x01, 0x00, 0x04, 0x2E, 0xA6, 0x6C, 0x66, - 0xCF, 0xF3, 0x35, 0x79, 0x7D, 0x04, 0x97, 0xB7, - 0x7A, 0x19, 0x7F, 0x9F, 0xE5, 0x1A, 0xB5, 0xA4, - 0x13, 0x75, 0xDC, 0x73, 0xFD, 0x9E, 0x0B, 0x10, - 0x66, 0x9B, 0x1B, 0x9A, 0x5B, 0x7E, 0x8A, 0xB2, - 0x8F, 0x01, 0xB6, 0x7B, 0x62, 0x54, 0xC1, 0x4A, - 0xA1, 0x33, 0x14, 0x18, 0xF2, 0x5B, 0xA5, 0x49, - 0x00, 0x4C, 0x37, 0x8D, 0xD7, 0x2F, 0x0C, 0xE6, - 0x3B, 0x1F, 0x70, 0x91, 0xAA, 0xFE, 0x38, 0x09, - 0xB7, 0xAC, 0x6C, 0x28, 0x76, 0xA6, 0x1D, 0x60, - 0x51, 0x6C, 0x43, 0xA6, 0x37, 0x29, 0x16, 0x2D, - 0x28, 0x0B, 0xE2, 0x1B, 0xE8, 0xE2, 0xFE, 0x05, - 0x7D, 0x8E, 0xB6, 0xE2, 0x04, 0x24, 0x22, 0x45, - 0x73, 0x1A, 0xB6, 0xFE, 0xE3, 0x0E, 0x53, 0x35, - 0x37, 0x3E, 0xEB, 0xA9, 0x70, 0xD5, 0x31, 0xBB, - 0xA2, 0xCB, 0x22, 0x2D, 0x96, 0x84, 0x38, 0x7D, - 0x5F, 0x2A, 0x1B, 0xF7, 0x52, 0x00, 0xCE, 0x06, - 0x56, 0xE3, 0x90, 0xCE, 0x19, 0x13, 0x5B, 0x59, - 0xE1, 0x4F, 0x0F, 0xA5, 0xC1, 0x28, 0x1A, 0x73, - 0x86, 0xCC, 0xD1, 0xC8, 0xEC, 0x3F, 0xAD, 0x70, - 0xFB, 0xCE, 0x74, 0xDE, 0xEE, 0x1F, 0xD0, 0x5F, - 0x46, 0x33, 0x0B, 0x51, 0xF9, 0xB7, 0x9E, 0x1D, - 0xDB, 0xF4, 0xE3, 0x3F, 0x14, 0x88, 0x9D, 0x05, - 0x28, 0x29, 0x24, 0xC5, 0xF5, 0xDC, 0x27, 0x66, - 0xEF, 0x06, 0x27, 0xD7, 0xEE, 0xDC, 0x73, 0x6E, - 0x67, 0xC2, 0xE5, 0xB9, 0x38, 0x34, 0x66, 0x80, - 0x72, 0x21, 0x6D, 0x1C, 0x78, 0xB8, 0x23, 0xA0, - 0x72, 0xD3, 0x4F, 0xF3, 0xEC, 0xF9, 0xBD, 0x11, - 0xA2, 0x9A, 0xF1, 0x6C, 0x33, 0xBD, 0x09, 0xAF, - 0xB2, 0xD7, 0x4D, 0x53, 0x4E, 0x02, 0x7C, 0x19, - 0x24, 0x0D, 0x59, 0x5A, 0x68, 0xEB, 0xB3, 0x05, - 0xAC, 0xC4, 0x4A, 0xB3, 0x8A, 0xB8, 0x20, 0xC6, - 0xD4, 0x26, 0x56, 0x0C, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x52, 0x6F, 0x6F, 0x74, 0x2D, 0x43, 0x41, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x33, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x43, 0x50, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x62, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x13, 0x7A, 0x08, 0x0B, - 0xA6, 0x89, 0xC5, 0x90, 0xFD, 0x0B, 0x2F, 0x0D, - 0x4F, 0x56, 0xB6, 0x32, 0xFB, 0x93, 0x4E, 0xD0, - 0x73, 0x95, 0x17, 0xB3, 0x3A, 0x79, 0xDE, 0x04, - 0x0E, 0xE9, 0x2D, 0xC3, 0x1D, 0x37, 0xC7, 0xF7, - 0x3B, 0xF0, 0x4B, 0xD3, 0xE4, 0x4E, 0x20, 0xAB, - 0x5A, 0x6F, 0xEA, 0xF5, 0x98, 0x4C, 0xC1, 0xF6, - 0x06, 0x2E, 0x9A, 0x9F, 0xE5, 0x6C, 0x32, 0x85, - 0xDC, 0x6F, 0x25, 0xDD, 0xD5, 0xD0, 0xBF, 0x9F, - 0xE2, 0xEF, 0xE8, 0x35, 0xDF, 0x26, 0x34, 0xED, - 0x93, 0x7F, 0xAB, 0x02, 0x14, 0xD1, 0x04, 0x80, - 0x9C, 0xF7, 0x4B, 0x86, 0x0E, 0x6B, 0x04, 0x83, - 0xF4, 0xCD, 0x2D, 0xAB, 0x2A, 0x96, 0x02, 0xBC, - 0x56, 0xF0, 0xD6, 0xBD, 0x94, 0x6A, 0xED, 0x6E, - 0x0B, 0xE4, 0xF0, 0x8F, 0x26, 0x68, 0x6B, 0xD0, - 0x9E, 0xF7, 0xDB, 0x32, 0x5F, 0x82, 0xB1, 0x8F, - 0x6A, 0xF2, 0xED, 0x52, 0x5B, 0xFD, 0x82, 0x8B, - 0x65, 0x3F, 0xEE, 0x6E, 0xCE, 0x40, 0x0D, 0x5A, - 0x48, 0xFF, 0xE2, 0x2D, 0x53, 0x8B, 0xB5, 0x33, - 0x5B, 0x41, 0x53, 0x34, 0x2D, 0x43, 0x35, 0xAC, - 0xF5, 0x90, 0xD0, 0xD3, 0x0A, 0xE2, 0x04, 0x3C, - 0x7F, 0x5A, 0xD2, 0x14, 0xFC, 0x9C, 0x0F, 0xE6, - 0xFA, 0x40, 0xA5, 0xC8, 0x65, 0x06, 0xCA, 0x63, - 0x69, 0xBC, 0xEE, 0x44, 0xA3, 0x2D, 0x9E, 0x69, - 0x5C, 0xF0, 0x0B, 0x4F, 0xD7, 0x9A, 0xDB, 0x56, - 0x8D, 0x14, 0x9C, 0x20, 0x28, 0xA1, 0x4C, 0x9D, - 0x71, 0xB8, 0x50, 0xCA, 0x36, 0x5B, 0x37, 0xF7, - 0x0B, 0x65, 0x77, 0x91, 0xFC, 0x5D, 0x72, 0x8C, - 0x4E, 0x18, 0xFD, 0x22, 0x55, 0x7C, 0x40, 0x62, - 0xD7, 0x47, 0x71, 0x53, 0x3C, 0x70, 0x17, 0x9D, - 0x3D, 0xAE, 0x8F, 0x92, 0xB1, 0x17, 0xE4, 0x5C, - 0xB3, 0x32, 0xF3, 0xB3, 0xC2, 0xA2, 0x2E, 0x70, - 0x5C, 0xFE, 0xC6, 0x6F, 0x6D, 0xA3, 0x77, 0x2B, - 0x00, 0x01, 0x00, 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 -}; - -//DevCerts -static const unsigned char ca4_dpki_cert[0x400] = -{ - 0x00, 0x01, 0x00, 0x03, 0x19, 0x49, 0x42, 0x9D, - 0x1E, 0x58, 0xA6, 0x2E, 0x7E, 0x8B, 0x56, 0xD1, - 0xB7, 0x6A, 0xE3, 0x02, 0xFD, 0x8B, 0x97, 0x49, - 0x1F, 0x77, 0x87, 0x45, 0xF7, 0x53, 0x88, 0xC4, - 0xDD, 0x0B, 0xEB, 0x1D, 0xF1, 0x22, 0xFB, 0x96, - 0x42, 0x15, 0x14, 0x97, 0x76, 0x4A, 0x53, 0xCF, - 0x78, 0x15, 0x18, 0x45, 0xE4, 0x2C, 0xA8, 0xFD, - 0xE4, 0x86, 0xFD, 0x2A, 0x4F, 0x53, 0xF8, 0xA1, - 0xBA, 0x00, 0x8A, 0x74, 0x85, 0xFF, 0x73, 0xB3, - 0xBF, 0x7E, 0x3C, 0x98, 0x07, 0x29, 0xD0, 0x65, - 0x6B, 0x69, 0x32, 0x19, 0xAD, 0xE8, 0x35, 0xEB, - 0x5F, 0xFF, 0xFC, 0xCB, 0x7C, 0xBB, 0x5E, 0x30, - 0x7F, 0xE0, 0x68, 0x8B, 0x88, 0x8E, 0xF2, 0xD2, - 0x05, 0x3F, 0xB7, 0xE7, 0x91, 0xE9, 0x85, 0xFD, - 0x15, 0xEF, 0x10, 0xD7, 0x9C, 0xCA, 0x88, 0xD6, - 0xBB, 0x15, 0xE8, 0xE4, 0x71, 0x4A, 0x98, 0xEE, - 0x09, 0xBF, 0x7B, 0x8A, 0xF0, 0x53, 0x23, 0x2B, - 0x64, 0x50, 0xE6, 0xD5, 0xFD, 0xFF, 0xC2, 0x0A, - 0x6D, 0x1E, 0xA6, 0xA2, 0x38, 0x12, 0xE1, 0x01, - 0x45, 0x25, 0xD5, 0x6D, 0x40, 0x82, 0x70, 0x3B, - 0x86, 0x98, 0x69, 0x59, 0xA7, 0x3C, 0xD1, 0xA1, - 0x43, 0x64, 0xD2, 0xC2, 0xDA, 0xEA, 0x96, 0xB0, - 0x95, 0xF7, 0x6C, 0x46, 0xE4, 0xFF, 0x41, 0x55, - 0x46, 0x5E, 0x70, 0xEF, 0x1E, 0xD3, 0x10, 0x53, - 0xD9, 0x70, 0x11, 0xE0, 0x10, 0xCC, 0x93, 0xE7, - 0x91, 0x40, 0x13, 0x68, 0x7F, 0xA3, 0xA8, 0x02, - 0x99, 0x6D, 0x1E, 0x55, 0x7B, 0x1C, 0xCC, 0x7A, - 0x7E, 0x8F, 0x58, 0x65, 0xC1, 0x74, 0x2E, 0x28, - 0xE2, 0x6D, 0xEF, 0x38, 0xA9, 0x3A, 0xB5, 0xD8, - 0x2D, 0x43, 0xEC, 0xCC, 0xBF, 0x0B, 0xEF, 0x22, - 0xE1, 0xFD, 0x57, 0xE2, 0x86, 0x43, 0x33, 0x58, - 0x2F, 0xED, 0xEA, 0xBC, 0x01, 0x2F, 0x98, 0x6D, - 0xDF, 0xC3, 0xE9, 0x44, 0x79, 0x73, 0x47, 0x03, - 0x08, 0x45, 0x5B, 0xDC, 0x57, 0xAA, 0x17, 0x0B, - 0x84, 0x42, 0x7F, 0x73, 0xA2, 0x9B, 0x48, 0xF6, - 0xDA, 0x13, 0x5F, 0x66, 0xC7, 0x45, 0xC1, 0x42, - 0xA8, 0x4A, 0xFB, 0x0E, 0x6A, 0x5E, 0xED, 0x85, - 0xD7, 0xB9, 0x71, 0x99, 0x36, 0xF8, 0xCE, 0x2B, - 0x62, 0x1F, 0x39, 0x5F, 0x40, 0xDC, 0x03, 0xBE, - 0xF8, 0x85, 0x4C, 0x11, 0x17, 0xFF, 0x0C, 0x12, - 0x86, 0x41, 0xCC, 0x78, 0x43, 0xB9, 0x7B, 0x43, - 0x46, 0xDB, 0x22, 0x6F, 0x60, 0x26, 0xAC, 0xB5, - 0x6C, 0x27, 0x8B, 0x8E, 0x0E, 0xA7, 0x9A, 0x2D, - 0x65, 0xEF, 0x79, 0x8E, 0x10, 0x78, 0xAD, 0x80, - 0xED, 0x4B, 0x96, 0x04, 0xD2, 0xF0, 0x8B, 0x2C, - 0xD6, 0x4A, 0x23, 0xA3, 0xDB, 0x27, 0x08, 0x33, - 0xB4, 0x02, 0xF8, 0x08, 0x51, 0xF3, 0x5B, 0xED, - 0x3E, 0xE4, 0x57, 0x7C, 0x66, 0x60, 0xFB, 0xF1, - 0x6D, 0x94, 0x13, 0xE0, 0x9C, 0x91, 0x7A, 0x49, - 0xD4, 0x2C, 0x6D, 0xA3, 0x75, 0xBC, 0x27, 0xF0, - 0x23, 0x0D, 0xB9, 0x8F, 0x89, 0x73, 0xAB, 0x02, - 0x7B, 0x52, 0x2C, 0xD5, 0x7E, 0xC0, 0x3D, 0x25, - 0xE8, 0xB3, 0xFC, 0x34, 0x94, 0xC9, 0x7F, 0xB1, - 0x08, 0xFE, 0x18, 0xC6, 0x8A, 0x43, 0x36, 0xE4, - 0x6C, 0x26, 0xB6, 0xF2, 0x80, 0xD2, 0x7E, 0x34, - 0xBE, 0x28, 0x7C, 0x3E, 0x46, 0x87, 0xBC, 0x9D, - 0x77, 0x6B, 0x76, 0xD9, 0x28, 0xD1, 0xB6, 0x35, - 0x2E, 0xC0, 0x34, 0x7D, 0x72, 0x94, 0xAA, 0x93, - 0x60, 0x26, 0x8D, 0x26, 0xF5, 0xF6, 0x52, 0x06, - 0x4A, 0xF2, 0x40, 0xD7, 0xD0, 0x0C, 0x7C, 0x5E, - 0xA3, 0xC3, 0x2D, 0xE6, 0x2D, 0x9B, 0x5C, 0x4B, - 0x4C, 0xAB, 0x6F, 0xD7, 0xBD, 0x37, 0x1D, 0x57, - 0xC2, 0x16, 0x60, 0x95, 0x91, 0x0E, 0x4A, 0xD8, - 0xE9, 0xED, 0x18, 0x1E, 0xF7, 0x61, 0x93, 0x61, - 0x53, 0x89, 0x2D, 0x77, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x52, 0x6F, 0x6F, 0x74, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x43, 0x41, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x34, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x81, 0x12, 0x2A, 0x46, - 0xC9, 0xCC, 0x2D, 0xC4, 0xDF, 0x29, 0x30, 0xE4, - 0xDF, 0x3F, 0x8C, 0x70, 0xA0, 0x78, 0x94, 0x87, - 0x75, 0xAD, 0x5E, 0x9A, 0xA6, 0x04, 0xC5, 0xB4, - 0xD8, 0xEA, 0xFF, 0x2A, 0xA1, 0xD2, 0x14, 0x67, - 0x65, 0x64, 0xEF, 0xCA, 0x28, 0xCC, 0x00, 0x15, - 0x45, 0x54, 0xA1, 0xA3, 0xEA, 0x13, 0x79, 0xE9, - 0xE6, 0xCA, 0xAC, 0xED, 0x15, 0x93, 0xFE, 0x88, - 0xD8, 0x9A, 0xC6, 0xB8, 0xAC, 0xCC, 0xAB, 0x6E, - 0x20, 0x7C, 0xEB, 0x7C, 0xCA, 0x29, 0x80, 0x9E, - 0x29, 0x80, 0x44, 0x06, 0x62, 0xB7, 0xD4, 0x38, - 0x2A, 0x15, 0xDA, 0x43, 0x08, 0x57, 0x45, 0xA9, - 0xAA, 0xE5, 0x9A, 0xA0, 0x5B, 0xDB, 0x32, 0xF6, - 0x68, 0x69, 0xA2, 0xDD, 0x42, 0x95, 0x38, 0x6C, - 0x87, 0xEC, 0xDD, 0x35, 0x08, 0xA2, 0xCF, 0x60, - 0xD0, 0x1E, 0x23, 0xEC, 0x2F, 0xE6, 0x98, 0xF4, - 0x70, 0xD6, 0x00, 0x15, 0x49, 0xA2, 0xF0, 0x67, - 0x59, 0x13, 0x1E, 0x53, 0x4C, 0x70, 0x06, 0x05, - 0x7D, 0xEF, 0x1D, 0x18, 0xA8, 0x3F, 0x0A, 0xC7, - 0x9C, 0xFE, 0x80, 0xFF, 0x5A, 0x91, 0xF2, 0xBE, - 0xD4, 0xA0, 0x83, 0x70, 0x61, 0x19, 0x0A, 0x03, - 0x29, 0x90, 0x21, 0x65, 0x40, 0x3C, 0x9A, 0x90, - 0x8F, 0xB6, 0x15, 0x73, 0x9F, 0x3C, 0xE3, 0x3B, - 0xF1, 0xBA, 0xEA, 0x16, 0xC2, 0x5B, 0xCE, 0xD7, - 0x96, 0x3F, 0xAC, 0xC9, 0xD2, 0x4D, 0x9C, 0x0A, - 0xD7, 0x6F, 0xC0, 0x20, 0xB2, 0xC4, 0xB8, 0x4C, - 0x10, 0xA7, 0x41, 0xA2, 0xCC, 0x7D, 0x9B, 0xAC, - 0x3A, 0xAC, 0xCC, 0xA3, 0x52, 0x9B, 0xAC, 0x31, - 0x6A, 0x9A, 0xA7, 0x5D, 0x2A, 0x26, 0xC7, 0xD7, - 0xD2, 0x88, 0xCB, 0xA4, 0x66, 0xC5, 0xFE, 0x5F, - 0x45, 0x4A, 0xE6, 0x79, 0x74, 0x4A, 0x90, 0xA1, - 0x57, 0x72, 0xDB, 0x3B, 0x0E, 0x47, 0xA4, 0x9A, - 0xF0, 0x31, 0xD1, 0x6D, 0xBE, 0xAB, 0x33, 0x2B, - 0x00, 0x01, 0x00, 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 -}; - -static const unsigned char xs9_dpki_cert[0x300] = -{ - 0x00, 0x01, 0x00, 0x04, 0x63, 0x80, 0x5A, 0x35, - 0x1A, 0x43, 0x7B, 0xA2, 0x43, 0x19, 0xBB, 0x3A, - 0x77, 0x7B, 0x7A, 0xF3, 0x5E, 0x72, 0x4B, 0x15, - 0x0A, 0x06, 0x39, 0x6C, 0x5F, 0xEC, 0x38, 0x45, - 0xB1, 0x88, 0x76, 0x26, 0x8D, 0x5E, 0xDA, 0xE6, - 0x2F, 0x14, 0xBA, 0x02, 0xFA, 0xD6, 0xFC, 0x3B, - 0x2B, 0xBE, 0x87, 0x07, 0x63, 0x8E, 0x55, 0xBF, - 0x05, 0x5A, 0xFC, 0xFC, 0xB3, 0x47, 0x69, 0x11, - 0x89, 0xDB, 0x1C, 0xAF, 0x4B, 0x43, 0x76, 0x62, - 0x3E, 0x30, 0x89, 0x0A, 0x9D, 0x3B, 0xBB, 0x3E, - 0x50, 0xBD, 0xF7, 0xA6, 0xC0, 0xF7, 0xF8, 0xBB, - 0x0D, 0xB5, 0x6A, 0xBB, 0xC6, 0xC3, 0x50, 0xC8, - 0x88, 0xBB, 0x9D, 0xF0, 0x9B, 0xD1, 0x30, 0x64, - 0x60, 0x69, 0xDD, 0x34, 0x67, 0xA7, 0x00, 0xEB, - 0xDC, 0xF9, 0x8C, 0xB0, 0xF7, 0x93, 0x0E, 0x81, - 0xFE, 0x98, 0xD9, 0x72, 0x45, 0x8B, 0x94, 0x7E, - 0x59, 0xE2, 0xBE, 0x4E, 0x91, 0x2D, 0x75, 0xCA, - 0x1B, 0x8E, 0x2E, 0xF4, 0x6D, 0x73, 0xB1, 0x6B, - 0x35, 0xB5, 0x67, 0x0D, 0x63, 0x2D, 0x51, 0x38, - 0x53, 0x28, 0x19, 0x1D, 0x9D, 0xAE, 0x8D, 0xC6, - 0x61, 0xCC, 0xEF, 0xA4, 0xAB, 0xE2, 0xF3, 0xB0, - 0x4C, 0x7B, 0xE2, 0x71, 0xB5, 0xF9, 0x2C, 0xFA, - 0x55, 0xCD, 0x88, 0x8B, 0x72, 0xCC, 0xBE, 0x67, - 0xFA, 0xDF, 0xEF, 0x6B, 0x53, 0x3C, 0x45, 0xD8, - 0xCB, 0xDF, 0xB2, 0x76, 0x41, 0x46, 0xD6, 0xC2, - 0x6F, 0x27, 0x16, 0xC5, 0x07, 0xF3, 0xF4, 0x44, - 0x66, 0xA3, 0x15, 0xD2, 0x77, 0xF2, 0x89, 0xDA, - 0xFD, 0xD5, 0x50, 0xCF, 0xA4, 0x9B, 0xEA, 0xCA, - 0xC9, 0x7B, 0xE5, 0x46, 0x0E, 0xED, 0x9B, 0xFB, - 0x04, 0xA9, 0xDA, 0x19, 0x58, 0xD9, 0x2A, 0x20, - 0x8A, 0xAC, 0xC1, 0xF4, 0x8E, 0xE9, 0x14, 0xD8, - 0x8A, 0xD7, 0x41, 0xD5, 0x5B, 0x9B, 0x64, 0x22, - 0xD8, 0xAF, 0xAE, 0xC7, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x52, 0x6F, 0x6F, 0x74, 0x2D, 0x43, 0x41, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x34, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x58, 0x53, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x39, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x18, 0xA3, 0x47, 0xA4, - 0xC0, 0x84, 0x4C, 0xEB, 0x7E, 0xB0, 0xCF, 0xF0, - 0xAE, 0xB7, 0x77, 0x69, 0x85, 0x93, 0xE4, 0x99, - 0x5A, 0x95, 0x4E, 0x58, 0x17, 0x38, 0xCE, 0xD6, - 0x81, 0xB0, 0xBD, 0x77, 0x09, 0xE7, 0xF8, 0x9A, - 0xDF, 0xAD, 0x05, 0x48, 0x83, 0xF6, 0xC3, 0xFD, - 0xDF, 0x7B, 0x83, 0xE0, 0x0C, 0x26, 0x81, 0x54, - 0x43, 0x29, 0xEA, 0x82, 0x6C, 0x89, 0xF0, 0xA6, - 0x74, 0x42, 0x86, 0x4D, 0x32, 0x60, 0x32, 0x7D, - 0xA7, 0x7A, 0x13, 0x40, 0x66, 0x59, 0xDA, 0x3E, - 0x41, 0x6B, 0x27, 0x94, 0x03, 0x4F, 0xAA, 0x22, - 0x9D, 0xD5, 0x54, 0x52, 0xDB, 0x27, 0x0A, 0x6A, - 0xA2, 0x3D, 0x19, 0xB1, 0x66, 0x1B, 0x19, 0x7D, - 0xAB, 0xC7, 0x0E, 0x88, 0x17, 0x91, 0xA1, 0x2A, - 0xB4, 0x3C, 0x6C, 0xCB, 0xF5, 0xAA, 0x7C, 0x3A, - 0xDD, 0x36, 0xFB, 0x35, 0x71, 0x7B, 0x20, 0x01, - 0x59, 0x00, 0xD6, 0xF6, 0x90, 0x39, 0x35, 0x41, - 0x31, 0xF8, 0xC1, 0xC0, 0x57, 0x3A, 0x35, 0x18, - 0x58, 0x90, 0xB1, 0xAD, 0x9A, 0x0E, 0xEC, 0xE0, - 0xF4, 0x7A, 0x7D, 0xA5, 0x27, 0x48, 0xC9, 0x72, - 0xAB, 0x0D, 0x08, 0x7B, 0x62, 0x35, 0x40, 0x91, - 0x14, 0x2B, 0xB1, 0x1D, 0x1A, 0xFA, 0xF9, 0xCD, - 0x5C, 0x17, 0x13, 0x53, 0x52, 0x71, 0xCA, 0xE2, - 0x2A, 0x78, 0xB1, 0x7F, 0x4A, 0xCD, 0x59, 0xD8, - 0xBA, 0x1D, 0x7D, 0x70, 0x5F, 0x78, 0x1B, 0x9F, - 0x9D, 0x37, 0x18, 0x8E, 0xD7, 0xCD, 0x0D, 0x49, - 0x57, 0x74, 0x69, 0x88, 0x3A, 0x6B, 0x8E, 0x4E, - 0x1B, 0x85, 0xDD, 0xBE, 0x39, 0x45, 0x05, 0x89, - 0x56, 0x12, 0x97, 0x59, 0x9A, 0x09, 0xA4, 0xC8, - 0x2D, 0x2F, 0xF5, 0xCF, 0xB4, 0x73, 0x70, 0xDB, - 0x58, 0x1E, 0xB2, 0x4E, 0x77, 0x6F, 0xA4, 0x7E, - 0x62, 0xDF, 0xB7, 0x05, 0xE8, 0x80, 0x42, 0x5C, - 0xB8, 0x78, 0x87, 0x97, 0x7F, 0x66, 0x2C, 0x5F, - 0x00, 0x01, 0x00, 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 -}; - -static const unsigned char cpA_dpki_cert[0x300] = -{ - 0x00, 0x01, 0x00, 0x04, 0x50, 0x05, 0xD7, 0x5E, - 0x6D, 0xDE, 0xB8, 0x78, 0x3C, 0x81, 0xE9, 0xEF, - 0x0D, 0x17, 0xCD, 0x58, 0xF5, 0x94, 0x26, 0xA3, - 0xFD, 0x6F, 0x69, 0x90, 0xE8, 0xF8, 0x32, 0x87, - 0x12, 0x2E, 0xC2, 0x5C, 0xA1, 0x4B, 0x99, 0x24, - 0x23, 0x37, 0xBA, 0x91, 0xA7, 0x5B, 0x0F, 0x7C, - 0x59, 0xFB, 0xF7, 0xD1, 0x89, 0x27, 0x22, 0xC4, - 0xE6, 0xAF, 0xC7, 0xDE, 0xC7, 0x4A, 0x6E, 0x00, - 0x7F, 0x43, 0x4A, 0x88, 0x8A, 0x82, 0x15, 0xE8, - 0xDF, 0x2B, 0x52, 0xED, 0x42, 0x00, 0xBC, 0x69, - 0xB4, 0xDA, 0x7F, 0xEB, 0x74, 0x6C, 0x7A, 0x2D, - 0x96, 0x56, 0x5B, 0x45, 0x59, 0x7B, 0x8F, 0xAE, - 0xB1, 0x6B, 0xDC, 0x76, 0xC1, 0xC8, 0x0C, 0x47, - 0xF5, 0x0D, 0xA9, 0xC3, 0xE1, 0xFE, 0x28, 0x50, - 0x1C, 0x26, 0xA2, 0xD1, 0x54, 0x4B, 0xD1, 0x60, - 0x4A, 0x9E, 0x8F, 0x32, 0x2A, 0xEF, 0x31, 0x5F, - 0xEA, 0x48, 0x22, 0x67, 0x22, 0xB7, 0xCB, 0x37, - 0x2F, 0xF3, 0x5F, 0x5E, 0x61, 0x6A, 0x53, 0x44, - 0xA5, 0x85, 0xE5, 0xA0, 0x8A, 0x2E, 0x17, 0x77, - 0x57, 0x2B, 0x7A, 0x9A, 0xF7, 0xD2, 0xD8, 0xC4, - 0x9C, 0xD0, 0xA0, 0x54, 0xBF, 0x8A, 0x9D, 0xB4, - 0x9F, 0xC6, 0x60, 0x61, 0x7C, 0xB8, 0x35, 0x4E, - 0x25, 0x7F, 0x68, 0x68, 0x2F, 0x94, 0xB3, 0xCC, - 0x53, 0x8C, 0x42, 0x6F, 0x88, 0xC5, 0x48, 0x5C, - 0xBE, 0xC1, 0xD0, 0x48, 0x04, 0x74, 0x96, 0x5A, - 0x7E, 0x82, 0x59, 0xAA, 0x9F, 0xB6, 0x61, 0x46, - 0xCE, 0x59, 0x21, 0xC6, 0xF0, 0xC1, 0x75, 0x1F, - 0x21, 0x91, 0x7F, 0x24, 0x96, 0xCB, 0x0C, 0x70, - 0x15, 0x7A, 0xB7, 0xBB, 0x3A, 0x9F, 0x57, 0x56, - 0x56, 0x5C, 0x38, 0x92, 0x2E, 0xFD, 0xC8, 0xF1, - 0x70, 0xB9, 0xAE, 0xA1, 0xAE, 0x36, 0xF5, 0x5E, - 0x35, 0x26, 0x63, 0x0A, 0xBA, 0xB2, 0x05, 0x0F, - 0xF0, 0x0C, 0xDC, 0xBB, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x52, 0x6F, 0x6F, 0x74, 0x2D, 0x43, 0x41, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x34, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x43, 0x50, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x61, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x18, 0xA3, 0x4D, 0x5B, - 0xAA, 0x7F, 0x93, 0x80, 0x28, 0x9B, 0xE8, 0x98, - 0x63, 0x10, 0x7A, 0xE1, 0x0C, 0x59, 0x2C, 0x2F, - 0x7C, 0xFF, 0xBD, 0xAA, 0xDD, 0x74, 0xF4, 0xA2, - 0xFB, 0xAC, 0xD7, 0x6F, 0x00, 0x93, 0x42, 0x06, - 0x34, 0x71, 0x56, 0xD8, 0x40, 0x49, 0x72, 0x9F, - 0x3E, 0x24, 0xFA, 0x5E, 0x19, 0xD1, 0x5B, 0x63, - 0x5C, 0xD2, 0xEF, 0x09, 0xDE, 0x32, 0xEE, 0x6B, - 0x6F, 0xC8, 0xFA, 0x32, 0x8E, 0x2E, 0x96, 0xB9, - 0x94, 0x41, 0x04, 0x7D, 0x07, 0x62, 0x95, 0xDA, - 0x0D, 0x91, 0xD8, 0x09, 0x35, 0xD0, 0xDE, 0x8E, - 0x6B, 0xC6, 0xAB, 0x14, 0x27, 0x01, 0x9C, 0xFE, - 0x49, 0x96, 0xFC, 0x9B, 0x54, 0x79, 0x4D, 0xEB, - 0xD7, 0xC6, 0x66, 0x73, 0xA6, 0xDD, 0x3A, 0x77, - 0x65, 0x47, 0x94, 0xEC, 0x1C, 0x87, 0xAA, 0x46, - 0xD9, 0x78, 0xA9, 0x7D, 0xDB, 0x11, 0x22, 0x6E, - 0xD4, 0x12, 0xC2, 0x78, 0x4B, 0x21, 0x83, 0x92, - 0xC7, 0x10, 0xC7, 0x74, 0x19, 0xFF, 0xAA, 0xF6, - 0x0B, 0x75, 0xD8, 0x23, 0xDD, 0x33, 0xC3, 0xA1, - 0x5B, 0xA7, 0x2D, 0x30, 0xA5, 0xA4, 0xD8, 0xF8, - 0x0F, 0xD6, 0x73, 0xFD, 0x26, 0xCB, 0x29, 0xA6, - 0xEF, 0x50, 0x39, 0xE2, 0x5F, 0x59, 0x61, 0x84, - 0x6B, 0xDA, 0x2E, 0xC7, 0xCB, 0xE4, 0x38, 0x4B, - 0x28, 0xFB, 0x0D, 0xD5, 0x8E, 0x7C, 0xAA, 0x7D, - 0x4B, 0x37, 0x3A, 0xD7, 0x81, 0xDD, 0x73, 0xE3, - 0x09, 0x93, 0xBD, 0xBD, 0x7E, 0x08, 0x55, 0x4A, - 0x8C, 0xA5, 0xC9, 0x84, 0x2D, 0x71, 0x01, 0xA2, - 0x2A, 0x01, 0xB0, 0x15, 0xFB, 0x30, 0x78, 0xB9, - 0x13, 0xF4, 0xC7, 0x3F, 0xB5, 0xA6, 0xF1, 0xA2, - 0x5E, 0x22, 0xB0, 0x02, 0xB6, 0xE0, 0x09, 0x54, - 0x7F, 0x0F, 0xBD, 0xF0, 0xFE, 0xA5, 0x50, 0x1D, - 0x93, 0x15, 0xF9, 0x3D, 0x83, 0x0F, 0x0F, 0x0E, - 0x3D, 0xE2, 0x3D, 0x96, 0xE7, 0x09, 0xD9, 0x77, - 0x00, 0x01, 0x00, 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 -}; - -#endif \ No newline at end of file diff --git a/crypto.c b/crypto.c deleted file mode 100644 index 90dc016..0000000 --- a/crypto.c +++ /dev/null @@ -1,423 +0,0 @@ -#include "lib.h" -#include "crypto.h" - -// API for polarssl adapted/copied from CTRTOOL by neimod -void ctr_sha(void *data, u64 size, u8 *hash, int mode) -{ - switch(mode){ - case(CTR_SHA_1): sha1((u8*)data, size, hash); break; - case(CTR_SHA_256): sha2((u8*)data, size, hash, 0); break; - } -} - -void ctr_add_counter(ctr_aes_context* ctx, u32 carry) -{ - u32 counter[4]; - u32 sum; - int i; - - for(i=0; i<4; i++) - counter[i] = (ctx->ctr[i*4+0]<<24) | (ctx->ctr[i*4+1]<<16) | (ctx->ctr[i*4+2]<<8) | (ctx->ctr[i*4+3]<<0); - - for(i=3; i>=0; i--) - { - sum = counter[i] + carry; - - if (sum < counter[i]) - carry = 1; - else - carry = 0; - - counter[i] = sum; - } - - for(i=0; i<4; i++) - { - ctx->ctr[i*4+0] = counter[i]>>24; - ctx->ctr[i*4+1] = counter[i]>>16; - ctx->ctr[i*4+2] = counter[i]>>8; - ctx->ctr[i*4+3] = counter[i]>>0; - } -} - -void ctr_init_counter(ctr_aes_context* ctx, u8 key[16], u8 ctr[16]) -{ - aes_setkey_enc(&ctx->aes, key, 128); - memcpy(ctx->ctr, ctr, 16); -} - -void ctr_crypt_counter_block(ctr_aes_context* ctx, u8 input[16], u8 output[16]) -{ - int i; - u8 stream[16]; - - - aes_crypt_ecb(&ctx->aes, AES_ENCRYPT, ctx->ctr, stream); - - - if (input) - { - for(i=0; i<16; i++) - { - output[i] = stream[i] ^ input[i]; - } - } - else - { - for(i=0; i<16; i++) - output[i] = stream[i]; - } - - ctr_add_counter(ctx, 1); -} - -void ctr_crypt_counter(ctr_aes_context* ctx, u8* input, u8* output, u32 size) -{ - u8 stream[16]; - u32 i; - - while(size >= 16) - { - ctr_crypt_counter_block(ctx, input, output); - - if (input) - input += 16; - if (output) - output += 16; - - size -= 16; - } - - if (size) - { - memset(stream, 0, 16); - ctr_crypt_counter_block(ctx, stream, stream); - - if (input) - { - for(i=0; iaes, key, 128); break; - case(DEC): aes_setkey_dec(&ctx->aes, key, 128); break; - } - memcpy(ctx->iv, iv, 16); -} - -void ctr_aes_cbc(ctr_aes_context* ctx,u8* input,u8* output,u32 size,u8 mode) -{ - switch(mode){ - case(ENC): aes_crypt_cbc(&ctx->aes, AES_ENCRYPT, size, ctx->iv, input, output); break; - case(DEC): aes_crypt_cbc(&ctx->aes, AES_DECRYPT, size, ctx->iv, input, output); break; - } -} - -void ctr_rsa_free(ctr_rsa_context* ctx) -{ - rsa_free(&ctx->rsa); -} - -int ctr_rsa_init(ctr_rsa_context* ctx, u8 *modulus, u8 *private_exp, u8 *exponent, u8 rsa_type, u8 mode) -{ - // Sanity Check - if(ctx == NULL || modulus == NULL ||(private_exp == NULL && mode == RSAKEY_PRIV) || (exponent == NULL && mode == RSAKEY_PUB)) - return Fail; - rsa_init(&ctx->rsa, RSA_PKCS_V15, 0); - u16 n_size = 0; - u16 d_size = 0; - u16 e_size = 0; - switch(rsa_type){ - case RSA_2048: - ctx->rsa.len = 0x100; - n_size = 0x100; - d_size = 0x100; - e_size = 3; - break; - case RSA_4096: - ctx->rsa.len = 0x200; - n_size = 0x200; - d_size = 0x200; - e_size = 3; - break; - default: return Fail; - } - - switch(mode){ - case(RSAKEY_PUB): - if (mpi_read_binary(&ctx->rsa.N, modulus, n_size)) - goto clean; - if (mpi_read_binary(&ctx->rsa.E, exponent, e_size)) - goto clean; - break; - case(RSAKEY_PRIV): - if (mpi_read_binary(&ctx->rsa.N, modulus, n_size)) - goto clean; - if (mpi_read_binary(&ctx->rsa.D, private_exp, d_size)) - goto clean; - break; - default: return Fail; - } - - return Good; -clean: - ctr_rsa_free(ctx); - return Fail; -} - -int ctr_sig(void *data, u64 size, u8 *signature, u8 *modulus, u8 *private_exp, u32 type, u8 mode) -{ - int result = 0; - int hashtype, hashlen, sigtype; - if(data == NULL || signature == NULL || modulus == NULL ||(private_exp == NULL && mode == CTR_RSA_SIGN)) - return Fail; - - switch(type){ - case RSA_4096_SHA1: - hashtype = CTR_SHA_1; - hashlen = 0x14; - sigtype = RSA_4096; - case RSA_4096_SHA256: - hashtype = CTR_SHA_256; - hashlen = 0x20; - sigtype = RSA_4096; - break; - case RSA_2048_SHA1: - hashtype = CTR_SHA_1; - hashlen = 0x14; - sigtype = RSA_2048; - case RSA_2048_SHA256: - hashtype = CTR_SHA_256; - hashlen = 0x20; - sigtype = RSA_2048; - break; - case ECC_SHA1: - hashtype = CTR_SHA_1; - hashlen = 0x14; - sigtype = ECC; - case ECC_SHA256: - hashtype = CTR_SHA_256; - hashlen = 0x20; - sigtype = ECC; - break; - default: return Fail; - } - - u8 hash[hashlen]; - memset(hash,0,hashlen); - ctr_sha(data,size,hash,hashtype); - //memdump(stdout,"Data: ",data,size); - //memdump(stdout,"HashFor Sig: ",hash,hashlen); - - if(sigtype == RSA_2048 || sigtype == RSA_4096) - result = ctr_rsa(hash,signature,modulus,private_exp,type,mode); - else if(sigtype == ECC){ - printf("[!] ECC is not yet implemented\n"); - result = Fail; - } - return result; -} - -int ctr_rsa(u8 *hash, u8 *signature, u8 *modulus, u8 *private_exp, u32 type, u8 mode) -{ - int result = 0; - // Sanity Check - if(hash == NULL || signature == NULL || modulus == NULL ||(private_exp == NULL && mode == CTR_RSA_SIGN)) - return Fail; - - // Getting details from sig type - int hashtype; - int hashlen; - int sigtype; - switch(type){ - case RSA_4096_SHA1: - hashtype = SIG_RSA_SHA1; - hashlen = 0x14; - sigtype = RSA_4096; - break; - case RSA_4096_SHA256: - hashtype = SIG_RSA_SHA256; - hashlen = 0x14; - sigtype = RSA_4096; - break; - case RSA_2048_SHA1: - hashtype = SIG_RSA_SHA1; - hashlen = 0x20; - sigtype = RSA_2048; - break; - case RSA_2048_SHA256: - hashtype = SIG_RSA_SHA256; - hashlen = 0x20; - sigtype = RSA_2048; - break; - default: return Fail; - } - - // Setting up - ctr_rsa_context ctx; - u8 exponent[3] = {0x01,0x00,0x01}; - switch(mode){ - case CTR_RSA_VERIFY: - result = ctr_rsa_init(&ctx,modulus,NULL,(u8*)exponent,sigtype,RSAKEY_PUB); - break; - case CTR_RSA_SIGN: - result = ctr_rsa_init(&ctx,modulus,private_exp,NULL,sigtype,RSAKEY_PRIV); - break; - } - if(result)return result; - - switch(mode){ - case CTR_RSA_VERIFY: - return rsa_pkcs1_verify(&ctx.rsa,RSA_PUBLIC,hashtype,hashlen,hash,signature); - case CTR_RSA_SIGN: - return ctr_rsa_rsassa_pkcs1_v15_sign(&ctx.rsa,RSA_PRIVATE,hashtype,hashlen,hash,signature); - } - return Fail; -} - - -/** -* Hacked from rsa.c, polarssl doesn't like generating signatures when only D and N are present -**/ -int ctr_rsa_rsassa_pkcs1_v15_sign( rsa_context *ctx, - int mode, - int hash_id, - unsigned int hashlen, - const unsigned char *hash, - unsigned char *sig ) -{ - size_t nb_pad, olen, ret; - unsigned char *p = sig; - - if( ctx->padding != RSA_PKCS_V15 ) - return( POLARSSL_ERR_RSA_BAD_INPUT_DATA ); - - olen = ctx->len; - - switch( hash_id ) - { - case SIG_RSA_RAW: - nb_pad = olen - 3 - hashlen; - break; - - case SIG_RSA_MD2: - case SIG_RSA_MD4: - case SIG_RSA_MD5: - nb_pad = olen - 3 - 34; - break; - - case SIG_RSA_SHA1: - nb_pad = olen - 3 - 35; - break; - - case SIG_RSA_SHA224: - nb_pad = olen - 3 - 47; - break; - - case SIG_RSA_SHA256: - nb_pad = olen - 3 - 51; - break; - - case SIG_RSA_SHA384: - nb_pad = olen - 3 - 67; - break; - - case SIG_RSA_SHA512: - nb_pad = olen - 3 - 83; - break; - - - default: - return( POLARSSL_ERR_RSA_BAD_INPUT_DATA ); - } - - if( ( nb_pad < 8 ) || ( nb_pad > olen ) ) - return( POLARSSL_ERR_RSA_BAD_INPUT_DATA ); - - *p++ = 0; - *p++ = RSA_SIGN; - memset( p, 0xFF, nb_pad ); - p += nb_pad; - *p++ = 0; - - switch( hash_id ) - { - case SIG_RSA_RAW: - memcpy( p, hash, hashlen ); - break; - - case SIG_RSA_MD2: - memcpy( p, ASN1_HASH_MDX, 18 ); - memcpy( p + 18, hash, 16 ); - p[13] = 2; break; - - case SIG_RSA_MD4: - memcpy( p, ASN1_HASH_MDX, 18 ); - memcpy( p + 18, hash, 16 ); - p[13] = 4; break; - - case SIG_RSA_MD5: - memcpy( p, ASN1_HASH_MDX, 18 ); - memcpy( p + 18, hash, 16 ); - p[13] = 5; break; - - case SIG_RSA_SHA1: - memcpy( p, ASN1_HASH_SHA1, 15 ); - memcpy( p + 15, hash, 20 ); - break; - - case SIG_RSA_SHA224: - memcpy( p, ASN1_HASH_SHA2X, 19 ); - memcpy( p + 19, hash, 28 ); - p[1] += 28; p[14] = 4; p[18] += 28; break; - - case SIG_RSA_SHA256: - memcpy( p, ASN1_HASH_SHA2X, 19 ); - memcpy( p + 19, hash, 32 ); - p[1] += 32; p[14] = 1; p[18] += 32; break; - - case SIG_RSA_SHA384: - memcpy( p, ASN1_HASH_SHA2X, 19 ); - memcpy( p + 19, hash, 48 ); - p[1] += 48; p[14] = 2; p[18] += 48; break; - - case SIG_RSA_SHA512: - memcpy( p, ASN1_HASH_SHA2X, 19 ); - memcpy( p + 19, hash, 64 ); - p[1] += 64; p[14] = 3; p[18] += 64; break; - - default: - return( POLARSSL_ERR_RSA_BAD_INPUT_DATA ); - } - - mpi T, T1, T2; - - mpi_init( &T ); mpi_init( &T1 ); mpi_init( &T2 ); - - MPI_CHK( mpi_read_binary( &T, sig, ctx->len ) ); - - if( mpi_cmp_mpi( &T, &ctx->N ) >= 0 ) - { - mpi_free( &T ); - return( POLARSSL_ERR_RSA_BAD_INPUT_DATA ); - } - - MPI_CHK( mpi_exp_mod( &T, &T, &ctx->D, &ctx->N, &ctx->RN ) ); - - MPI_CHK( mpi_write_binary( &T, sig, olen ) ); - -cleanup: - - mpi_free( &T ); mpi_free( &T1 ); mpi_free( &T2 ); - - return( 0 ); -} \ No newline at end of file diff --git a/crypto.h b/crypto.h deleted file mode 100644 index 1380d1b..0000000 --- a/crypto.h +++ /dev/null @@ -1,101 +0,0 @@ -#ifndef _CTR_CRYPTO_H_ -#define _CTR_CRYPTO_H_ - -#include "polarssl/config.h" -#include "polarssl/aes.h" -#include "polarssl/rsa.h" -#include "polarssl/sha1.h" -#include "polarssl/sha2.h" - -typedef enum -{ - RSA_4096_SHA1 = 0x00010000, - RSA_2048_SHA1 = 0x00010001, - ECC_SHA1 = 0x00010002, - RSA_4096_SHA256 = 0x00010003, - RSA_2048_SHA256 = 0x00010004, - ECC_SHA256 = 0x00010005 -} sig_types; - -typedef enum -{ - RSA_2048 = 0, - RSA_4096 = 1, - ECC = 2, -} ctr_sig_types; - -typedef enum -{ - CTR_RSA_VERIFY = 0, - CTR_RSA_SIGN = 1, -} ctr_rsa_functions; - -typedef enum -{ - CTR_SHA_1 = 1, - CTR_SHA_256 = 256, -} ctr_sha_modes; - -typedef enum -{ - RSA_4096_PUBK = 0, - RSA_2048_PUBK, - ECC_PUBK -} pubk_types; - -typedef enum -{ - ENC, - DEC -} aescbcmode; - -typedef enum -{ - RSAKEY_INVALID, - RSAKEY_PRIV, - RSAKEY_PUB -} rsakeytype; - -typedef struct -{ - u8 ctr[16]; - u8 iv[16]; - aes_context aes; -} ctr_aes_context; - -typedef struct -{ - rsa_context rsa; -} ctr_rsa_context; - -#ifdef __cplusplus -extern "C" { -#endif -// SHA -void ctr_sha(void *data, u64 size, u8 *hash, int mode); -// AES -void ctr_add_counter(ctr_aes_context* ctx, u32 carry); -void ctr_init_counter(ctr_aes_context* ctx, u8 key[16],u8 ctr[16]); -void ctr_crypt_counter_block(ctr_aes_context* ctx, u8 input[16], u8 output[16]); -void ctr_crypt_counter(ctr_aes_context* ctx, u8* input, u8* output, u32 size); -void ctr_init_aes_cbc(ctr_aes_context* ctx,u8 key[16],u8 iv[16], u8 mode); -void ctr_aes_cbc(ctr_aes_context* ctx,u8* input,u8* output,u32 size,u8 mode); -// RSA -void ctr_rsa_free(ctr_rsa_context* ctx); -int ctr_rsa_init(ctr_rsa_context* ctx, u8 *modulus, u8 *private_exp, u8 *exponent, u8 rsa_type, u8 mode); -int ctr_rsa(u8 *hash, u8 *signature, u8 *modulus, u8 *private_exp, u32 type, u8 mode); -int ctr_rsa_rsassa_pkcs1_v15_sign( rsa_context *ctx, - int mode, - int hash_id, - unsigned int hashlen, - const unsigned char *hash, - unsigned char *sig ); - -// Signature Functions -int ctr_sig(void *data, u64 size, u8 *signature, u8 *modulus, u8 *private_exp, u32 type, u8 mode); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/elf.c b/elf.c deleted file mode 100644 index 63f7e8f..0000000 --- a/elf.c +++ /dev/null @@ -1,977 +0,0 @@ -#include "lib.h" -#include "ncch.h" -#include "elf_hdr.h" -#include "elf.h" -#include "blz.h" - -int ImportPlainRegionFromFile(ncch_settings *ncchset); -int ImportExeFsCodeBinaryFromFile(ncch_settings *ncchset); - -u32 GetPageSize(ncch_settings *ncchset); -u32 SizeToPage(u32 memorySize, ElfContext *elf); - -int GetBSS_SizeFromElf(ElfContext *elf, u8 *ElfFile, ncch_settings *ncchset); -int ImportPlainRegionFromElf(ElfContext *elf, u8 *ElfFile, ncch_settings *ncchset); -int CreateExeFsCode(ElfContext *elf, u8 *ElfFile, ncch_settings *ncchset); -int CreateCodeSegmentFromElf(CodeSegment *out, ElfContext *elf, u8 *ElfFile, char **Names, u32 NameNum); -ElfSegment** GetContinuousSegments(u16 *ContinuousSegmentNum, ElfContext *elf, char **Names, u32 NameNum); -ElfSegment** GetSegments(u16 *SegmentNum, ElfContext *elf, char **Names, u32 NameNum); - -// ELF Functions -int GetElfContext(ElfContext *elf, u8 *ElfFile); -int GetElfSectionEntries(ElfContext *elf, u8 *ElfFile); -int GetElfProgramEntries(ElfContext *elf, u8 *ElfFile); -void PrintElfContext(ElfContext *elf, u8 *ElfFile); -int ReadElfHdr(ElfContext *elf, u8 *ElfFile); - -int CreateElfSegments(ElfContext *elf, u8 *ElfFile); -bool IsIgnoreSection(ElfSectionEntry info); - -/* ELF Section Entry Functions */ -u8* GetELFSectionHeader(u16 Index, ElfContext *elf, u8 *ElfFile); -u8* GetELFSectionEntry(u16 Index, ElfContext *elf, u8 *ElfFile); -char* GetELFSectionEntryName(u16 Index, ElfContext *elf, u8 *ElfFile); -u64 GetELFSectionEntryType(u16 Index, ElfContext *elf, u8 *ElfFile); -u64 GetELFSectionEntryFlags(u16 Index, ElfContext *elf, u8 *ElfFile); -u64 GetELFSectionEntryAddress(u16 Index, ElfContext *elf, u8 *ElfFile); -u64 GetELFSectionEntryFileOffset(u16 Index, ElfContext *elf, u8 *ElfFile); -u64 GetELFSectionEntrySize(u16 Index, ElfContext *elf, u8 *ElfFile); -u64 GetELFSectionEntryAlignment(u16 Index, ElfContext *elf, u8 *ElfFile); - -u16 GetElfSectionIndexFromName(char *Name, ElfContext *elf, u8 *ElfFile); - -bool IsBss(ElfSectionEntry *Section); -bool IsData(ElfSectionEntry *Section); -bool IsRO(ElfSectionEntry *Section); -bool IsText(ElfSectionEntry *Section); - -/* ELF Program Entry Functions */ -u8* GetELFProgramHeader(u16 Index, ElfContext *elf, u8 *ElfFile); -u8* GetELFProgramEntry(u16 Index, ElfContext *elf, u8 *ElfFile); -u64 GetELFProgramEntryType(u16 Index, ElfContext *elf, u8 *ElfFile); -u64 GetELFProgramEntryFlags(u16 Index, ElfContext *elf, u8 *ElfFile); -u64 GetELFProgramEntryFileSize(u16 Index, ElfContext *elf, u8 *ElfFile); -u64 GetELFProgramEntryFileOffset(u16 Index, ElfContext *elf, u8 *ElfFile); -u64 GetELFProgramEntryMemorySize(u16 Index, ElfContext *elf, u8 *ElfFile); -u64 GetELFProgramEntryVAddress(u16 Index, ElfContext *elf, u8 *ElfFile); -u64 GetELFProgramEntryPAddress(u16 Index, ElfContext *elf, u8 *ElfFile); -u64 GetELFProgramEntryAlignment(u16 Index, ElfContext *elf, u8 *ElfFile); - - -int BuildExeFsCode(ncch_settings *ncchset) -{ - int result = 0; - if(ncchset->ComponentFilePtrs.plainregion){ // Import PlainRegion from file - result = ImportPlainRegionFromFile(ncchset); - if(result) return result; - } - if(!ncchset->Options.IsBuildingCodeSection){ // Import ExeFs Code from file and return - result = ImportExeFsCodeBinaryFromFile(ncchset); - return result; - } - -#ifdef DEBUG - printf("[DEBUG] Import ELF\n"); -#endif - /* Import ELF */ - u8 *ElfFile = malloc(ncchset->ComponentFilePtrs.elf_size); - if(!ElfFile) {fprintf(stderr,"[ELF ERROR] MEM ERROR\n"); return MEM_ERROR;} - ReadFile_64(ElfFile,ncchset->ComponentFilePtrs.elf_size,0,ncchset->ComponentFilePtrs.elf); - -#ifdef DEBUG - printf("[DEBUG] Create ELF Context\n"); -#endif - /* Create ELF Context */ - ElfContext *elf = malloc(sizeof(ElfContext)); - if(!elf) {fprintf(stderr,"[ELF ERROR] MEM ERROR\n"); free(ElfFile); return MEM_ERROR;} - memset(elf,0,sizeof(ElfContext)); - - result = GetElfContext(elf,ElfFile); - if(result) goto finish; - - /* Setting Page Size */ - elf->PageSize = GetPageSize(ncchset); - - if(!ncchset->ComponentFilePtrs.plainregion){ - result = ImportPlainRegionFromElf(elf,ElfFile,ncchset); - if(result) goto finish; - } - -#ifdef ELF_DEBUG - PrintElfContext(elf,ElfFile); -#endif - -#ifdef DEBUG - PrintElfContext(elf,ElfFile); -#endif - -#ifdef DEBUG - printf("[DEBUG] Create ExeFs Code\n"); -#endif - result = CreateExeFsCode(elf,ElfFile,ncchset); - if(result) goto finish; -#ifdef DEBUG - printf("[DEBUG] Get BSS Size\n"); -#endif - result = GetBSS_SizeFromElf(elf,ElfFile,ncchset); - if(result) goto finish; - -finish: - if(result){ - if(result == NOT_ELF_FILE) fprintf(stderr,"[ELF ERROR] Not ELF File\n"); - else if(result == NOT_ARM_ELF) fprintf(stderr,"[ELF ERROR] Not ARM ELF\n"); - else if(result == NON_EXECUTABLE_ELF) fprintf(stderr,"[ELF ERROR] Not Executeable ELF\n"); - else if(result == NOT_FIND_BSS_SIZE) fprintf(stderr,"[ELF ERROR] BSS Size Could not be found\n"); - else if(result == NOT_FIND_CODE_SECTIONS) fprintf(stderr,"[ELF ERROR] Failed to retrieve code sections from ELF\n"); - else fprintf(stderr,"[ELF ERROR] Failed to process ELF file (%d)\n",result); - } -#ifdef DEBUG - printf("[DEBUG] Free Segment Header/Sections\n"); -#endif - for(int i = 0; i < elf->ActiveSegments; i++){ -#ifdef DEBUG - printf("[DEBUG] %d\n",i); -#endif - free(elf->Segments[i].Sections); - } -#ifdef DEBUG - printf("[DEBUG] Free others\n"); -#endif - free(ElfFile); - free(elf->Sections); - free(elf->ProgramHeaders); - free(elf->Segments); - free(elf); - return result; -} - -int ImportPlainRegionFromFile(ncch_settings *ncchset) -{ - ncchset->Sections.PlainRegion.size = align_value(ncchset->ComponentFilePtrs.plainregion_size,ncchset->Options.MediaSize); - ncchset->Sections.PlainRegion.buffer = malloc(ncchset->Sections.PlainRegion.size); - if(!ncchset->Sections.PlainRegion.buffer) {fprintf(stderr,"[ELF ERROR] MEM ERROR\n"); return MEM_ERROR;} - ReadFile_64(ncchset->Sections.PlainRegion.buffer,ncchset->ComponentFilePtrs.plainregion_size,0,ncchset->ComponentFilePtrs.plainregion); - return 0; -} - -int ImportExeFsCodeBinaryFromFile(ncch_settings *ncchset) -{ - u32 size = ncchset->ComponentFilePtrs.code_size; - u8 *buffer = malloc(size); - if(!buffer) {fprintf(stderr,"[ELF ERROR] MEM ERROR\n"); return MEM_ERROR;} - ReadFile_64(buffer,size,0,ncchset->ComponentFilePtrs.code); - - ncchset->ExeFs_Sections.Code.size = ncchset->ComponentFilePtrs.code_size; - ncchset->ExeFs_Sections.Code.buffer = malloc(ncchset->ExeFs_Sections.Code.size); - if(!ncchset->ExeFs_Sections.Code.buffer) {fprintf(stderr,"[ELF ERROR] MEM ERROR\n"); return MEM_ERROR;} - ReadFile_64(ncchset->ExeFs_Sections.Code.buffer,ncchset->ExeFs_Sections.Code.size,0,ncchset->ComponentFilePtrs.code); - if(ncchset->Options.CompressCode){ - u32 new_len; - ncchset->ExeFs_Sections.Code.buffer = BLZ_Code(buffer,size,&new_len,BLZ_NORMAL); - ncchset->ExeFs_Sections.Code.size = new_len; - free(buffer); - } - else{ - ncchset->ExeFs_Sections.Code.size = size; - ncchset->ExeFs_Sections.Code.buffer = buffer; - } - return 0; -} - -u32 GetPageSize(ncch_settings *ncchset) -{ - if(ncchset->yaml_set->Option.PageSize) - return strtoul(ncchset->yaml_set->Option.PageSize,NULL,10); - return 0x1000; -} - -u32 SizeToPage(u32 memorySize, ElfContext *elf) -{ - return align_value(memorySize,elf->PageSize)/elf->PageSize; -} - - -int GetBSS_SizeFromElf(ElfContext *elf, u8 *ElfFile, ncch_settings *ncchset) -{ - for(int i = 0; i < elf->SectionTableEntryCount; i++){ - if(IsBss(&elf->Sections[i])) { - ncchset->CodeDetails.BSS_Size = elf->Sections[i].Size; - return 0; - } - } - return NOT_FIND_BSS_SIZE; -} - -int ImportPlainRegionFromElf(ElfContext *elf, u8 *ElfFile, ncch_settings *ncchset) // Doesn't work same as N makerom -{ - if(!ncchset->yaml_set->PlainRegionNum) return 0; - u16 *Index = malloc(sizeof(u16)*ncchset->yaml_set->PlainRegionNum); - - /* Getting Index Values for each section */ - for(int i = 0; i < ncchset->yaml_set->PlainRegionNum; i++){ - Index[i] = GetElfSectionIndexFromName(ncchset->yaml_set->PlainRegion[i],elf,ElfFile); - } - - // Eliminating Duplicated Sections - for(int i = ncchset->yaml_set->PlainRegionNum - 1; i >= 0; i--){ - for(int j = i-1; j >= 0; j--){ - if(Index[i] == Index[j]) Index[i] = 0; - } - } - - /* Calculating Total Size of Data */ - u64 TotalSize = 0; - for(int i = 0; i < ncchset->yaml_set->PlainRegionNum; i++){ - TotalSize += elf->Sections[Index[i]].Size; - } - - /* Creating Output Buffer */ - ncchset->Sections.PlainRegion.size = align_value(TotalSize,ncchset->Options.MediaSize); - ncchset->Sections.PlainRegion.buffer = malloc(ncchset->Sections.PlainRegion.size); - if(!ncchset->Sections.PlainRegion.buffer) {fprintf(stderr,"[ELF ERROR] MEM ERROR\n"); return MEM_ERROR;} - memset(ncchset->Sections.PlainRegion.buffer,0,ncchset->Sections.PlainRegion.size); - - /* Storing Sections */ - u64 pos = 0; - for(int i = 0; i < ncchset->yaml_set->PlainRegionNum; i++){ - memcpy((ncchset->Sections.PlainRegion.buffer+pos),elf->Sections[Index[i]].Ptr,elf->Sections[Index[i]].Size); - pos += elf->Sections[Index[i]].Size; - } - return 0; -} - -int CreateExeFsCode(ElfContext *elf, u8 *ElfFile, ncch_settings *ncchset) -{ - /* Getting Code Segments */ - CodeSegment Text; - memset(&Text,0,sizeof(CodeSegment)); - CodeSegment RO; - memset(&RO,0,sizeof(CodeSegment)); - CodeSegment Data; - memset(&Data,0,sizeof(CodeSegment)); - - int result = CreateCodeSegmentFromElf(&Text,elf,ElfFile,ncchset->yaml_set->ExeFs.Text,ncchset->yaml_set->ExeFs.TextNum); - if(result) return result; - result = CreateCodeSegmentFromElf(&RO,elf,ElfFile,ncchset->yaml_set->ExeFs.ReadOnly,ncchset->yaml_set->ExeFs.ReadOnlyNum); - if(result) return result; - result = CreateCodeSegmentFromElf(&Data,elf,ElfFile,ncchset->yaml_set->ExeFs.ReadWrite,ncchset->yaml_set->ExeFs.ReadWriteNum); - if(result) return result; - - /* Allocating Buffer for ExeFs Code */ - u32 size = (Text.MaxPageNum + RO.MaxPageNum + Data.MaxPageNum)*elf->PageSize; - u8 *code = malloc(size); - - /* Writing Code into Buffer */ - u8 *TextPos = (code + 0); - u8 *ROPos = (code + Text.MaxPageNum*elf->PageSize); - u8 *DataPos = (code + (Text.MaxPageNum + RO.MaxPageNum)*elf->PageSize); - if(Text.Size) memcpy(TextPos,Text.Data,Text.Size); - if(RO.Size) memcpy(ROPos,RO.Data,RO.Size); - if(Data.Size) memcpy(DataPos,Data.Data,Data.Size); - - - /* Compressing If needed */ - if(ncchset->Options.CompressCode){ - u32 new_len; - ncchset->ExeFs_Sections.Code.buffer = BLZ_Code(code,size,&new_len,BLZ_NORMAL); - ncchset->ExeFs_Sections.Code.size = new_len; - free(code); - } - else{ - ncchset->ExeFs_Sections.Code.size = size; - ncchset->ExeFs_Sections.Code.buffer = code; - } - - /* Setting CodeSegment Data and freeing original buffers */ - ncchset->CodeDetails.TextAddress = Text.Address; - ncchset->CodeDetails.TextMaxPages = Text.MaxPageNum; - ncchset->CodeDetails.TextSize = Text.Size; - if(Text.Size) free(Text.Data); - - ncchset->CodeDetails.ROAddress = RO.Address; - ncchset->CodeDetails.ROMaxPages = RO.MaxPageNum; - ncchset->CodeDetails.ROSize = RO.Size; - if(RO.Size) free(RO.Data); - - ncchset->CodeDetails.DataAddress = Data.Address; - ncchset->CodeDetails.DataMaxPages = Data.MaxPageNum; - ncchset->CodeDetails.DataSize = Data.Size; - if(Data.Size) free(Data.Data); - - /* Return */ - return 0; -} - -int CreateCodeSegmentFromElf(CodeSegment *out, ElfContext *elf, u8 *ElfFile, char **Names, u32 NameNum) -{ - u16 ContinuousSegmentNum = 0; - memset(out,0,sizeof(CodeSegment)); - ElfSegment **ContinuousSegments = GetContinuousSegments(&ContinuousSegmentNum,elf,Names,NameNum); - if (ContinuousSegments == NULL){ - if(!ContinuousSegmentNum) // Nothing Was Found - return 0; - else // Error with found segments - return ELF_SEGMENTS_NOT_CONTINUOUS; - } - - /* Getting Segment Size/Settings */ - u32 vAddr = 0; - u32 memorySize = 0; - for(int i = 0; i < ContinuousSegmentNum; i++){ - if (i==0){ - vAddr = ContinuousSegments[i]->VAddr; - } - else{ // Add rounded size from previous segment - u32 num = ContinuousSegments[i]->VAddr - (vAddr + memorySize); - memorySize += num; - } - - memorySize += ContinuousSegments[i]->Header->SizeInMemory; - for (int j = 0; j < ContinuousSegments[i]->SectionNum; j++){ - ElfSectionEntry *Section = &ContinuousSegments[i]->Sections[j]; - if (IsBss(Section) && j == (ContinuousSegments[i]->SectionNum-1)) - memorySize -= Section->Size; - } - } - - // For Check -#ifdef ELF_DEBUG - printf("Address: 0x%x\n",vAddr); - printf("Size: 0x%x\n",memorySize); -#endif - - out->Address = vAddr; - out->Size = memorySize; - out->MaxPageNum = SizeToPage(memorySize,elf); - out->Data = malloc(memorySize); - - /* Writing Segment to Buffer */ - vAddr = 0; - memorySize = 0; - for(int i = 0; i < ContinuousSegmentNum; i++){ - if (i==0){ - vAddr = ContinuousSegments[i]->VAddr; - } - else{ - u32 num = ContinuousSegments[i]->VAddr - (vAddr + memorySize); - memorySize += num; - } - u32 size = 0; - for (int j = 0; j < ContinuousSegments[i]->SectionNum; j++){ - ElfSectionEntry *Section = &ContinuousSegments[i]->Sections[j]; - if (!IsBss(Section)){ - u8 *pos = (out->Data + memorySize + size); - memcpy(pos,Section->Ptr,Section->Size); - size += Section->Size; - } - - else if (j == (ContinuousSegments[i]->SectionNum-1)) - memorySize -= Section->Size; - else - size += Section->Size; - } - } - - free(ContinuousSegments); - return 0; -} - - -ElfSegment** GetContinuousSegments(u16 *ContinuousSegmentNum, ElfContext *elf, char **Names, u32 NameNum) -{ - u16 SegmentNum = 0; - ElfSegment **Segments = GetSegments(&SegmentNum, elf, Names, NameNum); - if (Segments == NULL || SegmentNum == 0){ // No Segments for the names were found - //printf("Not Found Segment\n"); - return NULL; - } - - if (SegmentNum == 1){ //Return as there is no need to check - *ContinuousSegmentNum = SegmentNum; - return Segments; - } - - u32 vAddr = Segments[0]->VAddr + Segments[0]->Header->SizeInMemory; - for (int i = 1; i < SegmentNum; i++){ - if (Segments[i]->VAddr != (u32)align_value(vAddr,Segments[i]->Header->Alignment)){ //Each Segment must start after each other - fprintf(stderr,"[ELF ERROR] %s segment and %s segment are not continuous\n", Segments[i]->Name, Segments[i - 1]->Name); - free(Segments); - *ContinuousSegmentNum = 0xffff; // Signify to function that an error occured - return NULL; - } - } - *ContinuousSegmentNum = SegmentNum; - return Segments; -} - - -ElfSegment** GetSegments(u16 *SegmentNum, ElfContext *elf, char **Names, u32 NameNum) -{ - if (Names == NULL) - { - return NULL; - } - - ElfSegment **Segments = malloc(sizeof(ElfSegment*)*NameNum); - *SegmentNum = 0; // There can be a max of NameNum Segments, however, they might not all exist - for (int i = 0; i < NameNum; i++){ - for(int j = 0; j < elf->ActiveSegments; j++){ - if(strcmp(Names[i],elf->Segments[j].Name) == 0){ // If there is a match, store Segment data pointer & increment index - Segments[*SegmentNum] = &elf->Segments[j]; - *SegmentNum = *SegmentNum + 1; - } - } - } - return Segments; -} - -// ELF Functions - -int GetElfContext(ElfContext *elf, u8 *ElfFile) -{ - if(u8_to_u32(ElfFile,BE) != ELF_MAGIC) return NOT_ELF_FILE; - - elf->Is64bit = (ElfFile[4] == elf_64_bit); - elf->IsLittleEndian = (ElfFile[5] == elf_little_endian); - - int result = ReadElfHdr(elf,ElfFile); - if(result) return result; - - result = GetElfSectionEntries(elf,ElfFile); - if(result) return result; - - result = GetElfProgramEntries(elf,ElfFile); - if(result) return result; - - result = CreateElfSegments(elf,ElfFile); - if(result) return result; - - return 0; -} - -int GetElfSectionEntries(ElfContext *elf, u8 *ElfFile) -{ - elf->Sections = malloc(sizeof(ElfSectionEntry)*elf->SectionTableEntryCount); - if(!elf->Sections) {fprintf(stderr,"[ELF ERROR] MEM ERROR\n"); return MEM_ERROR;} - - for(int i = 0; i < elf->SectionTableEntryCount; i++){ - elf->Sections[i].Name = GetELFSectionEntryName(i,elf,ElfFile); - elf->Sections[i].Type = GetELFSectionEntryType(i,elf,ElfFile); - elf->Sections[i].Flags = GetELFSectionEntryFlags(i,elf,ElfFile); - elf->Sections[i].Ptr = GetELFSectionEntry(i,elf,ElfFile); - elf->Sections[i].OffsetInFile = GetELFSectionEntryFileOffset(i,elf,ElfFile); - elf->Sections[i].Size = GetELFSectionEntrySize(i,elf,ElfFile); - elf->Sections[i].Address = GetELFSectionEntryAddress(i,elf,ElfFile); - elf->Sections[i].Alignment = GetELFSectionEntryAlignment(i,elf,ElfFile); - } - return 0; -} - -int GetElfProgramEntries(ElfContext *elf, u8 *ElfFile) -{ - elf->ProgramHeaders = malloc(sizeof(ElfProgramEntry)*elf->ProgramTableEntryCount); - if(!elf->ProgramHeaders) {fprintf(stderr,"[ELF ERROR] MEM ERROR\n"); return MEM_ERROR;} - - for(int i = 0; i < elf->ProgramTableEntryCount; i++){ - elf->ProgramHeaders[i].Type = GetELFProgramEntryType(i,elf,ElfFile); - elf->ProgramHeaders[i].Flags = GetELFProgramEntryFlags(i,elf,ElfFile); - elf->ProgramHeaders[i].Ptr = GetELFProgramEntry(i,elf,ElfFile); - elf->ProgramHeaders[i].OffsetInFile = GetELFProgramEntryFileOffset(i,elf,ElfFile); - elf->ProgramHeaders[i].SizeInFile = GetELFProgramEntryFileSize(i,elf,ElfFile); - elf->ProgramHeaders[i].PhysicalAddress = GetELFProgramEntryPAddress(i,elf,ElfFile); - elf->ProgramHeaders[i].VirtualAddress = GetELFProgramEntryVAddress(i,elf,ElfFile); - elf->ProgramHeaders[i].SizeInMemory = GetELFProgramEntryMemorySize(i,elf,ElfFile); - elf->ProgramHeaders[i].Alignment = GetELFProgramEntryAlignment(i,elf,ElfFile); - } - - return 0; -} - -void PrintElfContext(ElfContext *elf, u8 *ElfFile) -{ - printf("[+] Basic Details\n"); - printf(" Class: %s\n",elf->Is64bit ? "64-bit" : "32-bit"); - printf(" Data: %s\n",elf->IsLittleEndian ? "Little Endian" : "Big Endian"); - printf("\n[+] Program Table Data\n"); - printf(" Offset: 0x%lx\n",elf->ProgramTableOffset); - printf(" Size: 0x%x\n",elf->ProgramTableEntrySize); - printf(" Count: 0x%x\n",elf->ProgramTableEntryCount); - printf("\n[+] Section Table Data\n"); - printf(" Offset: 0x%lx\n",elf->SectionTableOffset); - printf(" Size: 0x%x\n",elf->SectionTableEntrySize); - printf(" Count: 0x%x\n",elf->SectionTableEntryCount); - printf(" Lable Index: 0x%x\n",elf->SectionHeaderNameEntryIndex); - for(int i = 0; i < elf->ActiveSegments; i++){ - printf(" Segment [%d][%s]\n",i,elf->Segments[i].Name); - printf(" > Size : 0x%x\n",elf->Segments[i].Header->SizeInFile); - printf(" > Address : 0x%x\n",elf->Segments[i].VAddr); - printf(" > Sections : %d\n",elf->Segments[i].SectionNum); - for(int j = 0; j < elf->Segments[i].SectionNum; j++){ - printf(" > Section [%d][%s]\n",j,elf->Segments[i].Sections[j].Name); - } - - /* - char outpath[100]; - memset(&outpath,0,100); - sprintf(outpath,"%s.bin",elf->Sections[i].Name); - chdir("elfsections"); - FILE *tmp = fopen(outpath,"wb"); - WriteBuffer(elf->Sections[i].Ptr,elf->Sections[i].Size,0,tmp); - fclose(tmp); - chdir(".."); - */ - } - -} - -int ReadElfHdr(ElfContext *elf, u8 *ElfFile) -{ - if(elf->Is64bit){ - elf_64_hdr *hdr = (elf_64_hdr*)ElfFile; - - u16 Architecture = u8_to_u16(hdr->TargetArchitecture,elf->IsLittleEndian); - u16 Type = u8_to_u16(hdr->Type,elf->IsLittleEndian); - if(Architecture != elf_arm) return NOT_ARM_ELF; - if(Type != elf_executeable) return NON_EXECUTABLE_ELF; - - elf->ProgramTableOffset = u8_to_u64(hdr->ProgramHeaderTableOffset,elf->IsLittleEndian); - elf->ProgramTableEntrySize = u8_to_u16(hdr->ProgramHeaderEntrySize,elf->IsLittleEndian); - elf->ProgramTableEntryCount = u8_to_u16(hdr->ProgramHeaderEntryCount,elf->IsLittleEndian); - - elf->SectionTableOffset = u8_to_u64(hdr->SectionHeaderTableOffset,elf->IsLittleEndian); - elf->SectionTableEntrySize = u8_to_u16(hdr->SectionTableEntrySize,elf->IsLittleEndian); - elf->SectionTableEntryCount = u8_to_u16(hdr->SectionHeaderEntryCount,elf->IsLittleEndian); - - elf->SectionHeaderNameEntryIndex = u8_to_u16(hdr->SectionHeaderNameEntryIndex,elf->IsLittleEndian); - } - else{ - elf_32_hdr *hdr = (elf_32_hdr*)ElfFile; - - u16 Architecture = u8_to_u16(hdr->TargetArchitecture,elf->IsLittleEndian); - u16 Type = u8_to_u16(hdr->Type,elf->IsLittleEndian); - if(Architecture != elf_arm) return NOT_ARM_ELF; - if(Type != elf_executeable) return NON_EXECUTABLE_ELF; - - elf->ProgramTableOffset = u8_to_u32(hdr->ProgramHeaderTableOffset,elf->IsLittleEndian); - elf->ProgramTableEntrySize = u8_to_u16(hdr->ProgramHeaderEntrySize,elf->IsLittleEndian); - elf->ProgramTableEntryCount = u8_to_u16(hdr->ProgramHeaderEntryCount,elf->IsLittleEndian); - - elf->SectionTableOffset = u8_to_u32(hdr->SectionHeaderTableOffset,elf->IsLittleEndian); - elf->SectionTableEntrySize = u8_to_u16(hdr->SectionTableEntrySize,elf->IsLittleEndian); - elf->SectionTableEntryCount = u8_to_u16(hdr->SectionHeaderEntryCount,elf->IsLittleEndian); - - elf->SectionHeaderNameEntryIndex = u8_to_u16(hdr->SectionHeaderNameEntryIndex,elf->IsLittleEndian); - } - return 0; -} - -/* Section Hdr Functions */ - -u8* GetELFSectionHeader(u16 Index, ElfContext *elf, u8 *ElfFile) -{ - if(Index >= elf->SectionTableEntryCount) return NULL; - - return (ElfFile + elf->SectionTableOffset + elf->SectionTableEntrySize*Index); -} - -u8* GetELFSectionEntry(u16 Index, ElfContext *elf, u8 *ElfFile) -{ - if(Index >= elf->SectionTableEntryCount) return NULL; - - return (u8*) (ElfFile + GetELFSectionEntryFileOffset(Index,elf,ElfFile)); -} - -char* GetELFSectionEntryName(u16 Index, ElfContext *elf, u8 *ElfFile) -{ - if(Index >= elf->SectionTableEntryCount) return 0; - - u64 NameIndex = 0; - if(elf->Is64bit){ - elf_64_shdr *shdr = (elf_64_shdr*)GetELFSectionHeader(Index,elf,ElfFile); - NameIndex = u8_to_u64(shdr->sh_name,elf->IsLittleEndian); - } - else{ - elf_32_shdr *shdr = (elf_32_shdr*)GetELFSectionHeader(Index,elf,ElfFile); - NameIndex = u8_to_u32(shdr->sh_name,elf->IsLittleEndian); - } - - u8 *NameTable = GetELFSectionEntry(elf->SectionHeaderNameEntryIndex,elf,ElfFile); - - return (char*)(NameTable+NameIndex); -} - -u64 GetELFSectionEntryType(u16 Index, ElfContext *elf, u8 *ElfFile) -{ - if(Index >= elf->SectionTableEntryCount) return 0; - - if(elf->Is64bit){ - elf_64_shdr *shdr = (elf_64_shdr*)GetELFSectionHeader(Index,elf,ElfFile); - return u8_to_u64(shdr->sh_type,elf->IsLittleEndian); - } - else{ - elf_32_shdr *shdr = (elf_32_shdr*)GetELFSectionHeader(Index,elf,ElfFile); - return u8_to_u32(shdr->sh_type,elf->IsLittleEndian); - } - - return 0; -} - -u64 GetELFSectionEntryFlags(u16 Index, ElfContext *elf, u8 *ElfFile) -{ - if(Index >= elf->SectionTableEntryCount) return 0; - - if(elf->Is64bit){ - elf_64_shdr *shdr = (elf_64_shdr*)GetELFSectionHeader(Index,elf,ElfFile); - return u8_to_u64(shdr->sh_flags,elf->IsLittleEndian); - } - else{ - elf_32_shdr *shdr = (elf_32_shdr*)GetELFSectionHeader(Index,elf,ElfFile); - return u8_to_u32(shdr->sh_flags,elf->IsLittleEndian); - } - - return 0; -} - -u64 GetELFSectionEntryAddress(u16 Index, ElfContext *elf, u8 *ElfFile) -{ - if(Index >= elf->SectionTableEntryCount) return 0; - - if(elf->Is64bit){ - elf_64_shdr *shdr = (elf_64_shdr*)GetELFSectionHeader(Index,elf,ElfFile); - return u8_to_u64(shdr->sh_addr,elf->IsLittleEndian); - } - else{ - elf_32_shdr *shdr = (elf_32_shdr*)GetELFSectionHeader(Index,elf,ElfFile); - return u8_to_u32(shdr->sh_addr,elf->IsLittleEndian); - } - - return 0; -} - -u64 GetELFSectionEntryFileOffset(u16 Index, ElfContext *elf, u8 *ElfFile) -{ - if(Index >= elf->SectionTableEntryCount) return 0; - - if(elf->Is64bit){ - elf_64_shdr *shdr = (elf_64_shdr*)GetELFSectionHeader(Index,elf,ElfFile); - return u8_to_u64(shdr->sh_offset,elf->IsLittleEndian); - } - else{ - elf_32_shdr *shdr = (elf_32_shdr*)GetELFSectionHeader(Index,elf,ElfFile); - return u8_to_u32(shdr->sh_offset,elf->IsLittleEndian); - } - - return 0; -} - -u64 GetELFSectionEntrySize(u16 Index, ElfContext *elf, u8 *ElfFile) -{ - if(Index >= elf->SectionTableEntryCount) return 0; - - if(elf->Is64bit){ - elf_64_shdr *shdr = (elf_64_shdr*)GetELFSectionHeader(Index,elf,ElfFile); - return u8_to_u64(shdr->sh_size,elf->IsLittleEndian); - } - else{ - elf_32_shdr *shdr = (elf_32_shdr*)GetELFSectionHeader(Index,elf,ElfFile); - return u8_to_u32(shdr->sh_size,elf->IsLittleEndian); - } - - return 0; -} - -u64 GetELFSectionEntryAlignment(u16 Index, ElfContext *elf, u8 *ElfFile) -{ - if(Index >= elf->SectionTableEntryCount) return 0; - - if(elf->Is64bit){ - elf_64_shdr *shdr = (elf_64_shdr*)GetELFSectionHeader(Index,elf,ElfFile); - return u8_to_u64(shdr->sh_addralign,elf->IsLittleEndian); - } - else{ - elf_32_shdr *shdr = (elf_32_shdr*)GetELFSectionHeader(Index,elf,ElfFile); - return u8_to_u32(shdr->sh_addralign,elf->IsLittleEndian); - } - - return 0; -} - - -u16 GetElfSectionIndexFromName(char *Name, ElfContext *elf, u8 *ElfFile) -{ - for(int i = 0; i < elf->SectionTableEntryCount; i++){ - if(strcmp(Name,elf->Sections[i].Name) == 0) return i; - } - return 0; // Assuming 0 is always empty -} - -bool IsBss(ElfSectionEntry *Section) -{ - if(Section->Type == 8 && Section->Flags == 3) - return true; - return false; -} - -bool IsData(ElfSectionEntry *Section) -{ - if(Section->Type == 1 && Section->Flags == 3) - return true; - return false; -} - -bool IsRO(ElfSectionEntry *Section) -{ - if(Section->Type == 1 && Section->Flags == 2) - return true; - return false; -} - -bool IsText(ElfSectionEntry *Section) -{ - if(Section->Type == 1 && Section->Flags == 6) - return true; - return false; -} - -/* ProgramHeader Functions */ - -u8* GetELFProgramHeader(u16 Index, ElfContext *elf, u8 *ElfFile) -{ - if(Index >= elf->ProgramTableEntryCount) return NULL; - - return (ElfFile + elf->ProgramTableOffset + elf->ProgramTableEntrySize*Index); -} - -u8* GetELFProgramEntry(u16 Index, ElfContext *elf, u8 *ElfFile) -{ - if(Index >= elf->ProgramTableEntryCount) return NULL; - - return (u8*) (ElfFile + GetELFProgramEntryFileOffset(Index,elf,ElfFile)); - - return NULL; -} - -u64 GetELFProgramEntryType(u16 Index, ElfContext *elf, u8 *ElfFile) -{ - if(Index >= elf->ProgramTableEntryCount) return 0; - - if(elf->Is64bit){ - elf_64_phdr *phdr = (elf_64_phdr*)GetELFProgramHeader(Index,elf,ElfFile); - return u8_to_u64(phdr->p_type,elf->IsLittleEndian); - } - else{ - elf_32_phdr *phdr = (elf_32_phdr*)GetELFProgramHeader(Index,elf,ElfFile); - return u8_to_u32(phdr->p_type,elf->IsLittleEndian); - } - - return 0; -} - -u64 GetELFProgramEntryFlags(u16 Index, ElfContext *elf, u8 *ElfFile) -{ - if(Index >= elf->ProgramTableEntryCount) return 0; - - if(elf->Is64bit){ - elf_64_phdr *phdr = (elf_64_phdr*)GetELFProgramHeader(Index,elf,ElfFile); - return u8_to_u64(phdr->p_flags,elf->IsLittleEndian); - } - else{ - elf_32_phdr *phdr = (elf_32_phdr*)GetELFProgramHeader(Index,elf,ElfFile); - return u8_to_u32(phdr->p_flags,elf->IsLittleEndian); - } - - return 0; -} - -u64 GetELFProgramEntryFileSize(u16 Index, ElfContext *elf, u8 *ElfFile) -{ - if(Index >= elf->ProgramTableEntryCount) return 0; - - if(elf->Is64bit){ - elf_64_phdr *phdr = (elf_64_phdr*)GetELFProgramHeader(Index,elf,ElfFile); - return u8_to_u64(phdr->p_filesz,elf->IsLittleEndian); - } - else{ - elf_32_phdr *phdr = (elf_32_phdr*)GetELFProgramHeader(Index,elf,ElfFile); - return u8_to_u32(phdr->p_filesz,elf->IsLittleEndian); - } - - return 0; -} - -u64 GetELFProgramEntryFileOffset(u16 Index, ElfContext *elf, u8 *ElfFile) -{ - if(Index >= elf->ProgramTableEntryCount) return 0; - - if(elf->Is64bit){ - elf_64_phdr *phdr = (elf_64_phdr*)GetELFProgramHeader(Index,elf,ElfFile); - return u8_to_u64(phdr->p_offset,elf->IsLittleEndian); - } - else{ - elf_32_phdr *phdr = (elf_32_phdr*)GetELFProgramHeader(Index,elf,ElfFile); - return u8_to_u32(phdr->p_offset,elf->IsLittleEndian); - } - - return 0; -} - -u64 GetELFProgramEntryMemorySize(u16 Index, ElfContext *elf, u8 *ElfFile) -{ - if(Index >= elf->ProgramTableEntryCount) return 0; - - if(elf->Is64bit){ - elf_64_phdr *phdr = (elf_64_phdr*)GetELFProgramHeader(Index,elf,ElfFile); - return u8_to_u64(phdr->p_memsz,elf->IsLittleEndian); - } - else{ - elf_32_phdr *phdr = (elf_32_phdr*)GetELFProgramHeader(Index,elf,ElfFile); - return u8_to_u32(phdr->p_memsz,elf->IsLittleEndian); - } - - return 0; -} - -u64 GetELFProgramEntryVAddress(u16 Index, ElfContext *elf, u8 *ElfFile) -{ - if(Index >= elf->ProgramTableEntryCount) return 0; - - if(elf->Is64bit){ - elf_64_phdr *phdr = (elf_64_phdr*)GetELFProgramHeader(Index,elf,ElfFile); - return u8_to_u64(phdr->p_vaddr,elf->IsLittleEndian); - } - else{ - elf_32_phdr *phdr = (elf_32_phdr*)GetELFProgramHeader(Index,elf,ElfFile); - return u8_to_u32(phdr->p_vaddr,elf->IsLittleEndian); - } - - return 0; -} - -u64 GetELFProgramEntryPAddress(u16 Index, ElfContext *elf, u8 *ElfFile) -{ - if(Index >= elf->ProgramTableEntryCount) return 0; - - if(elf->Is64bit){ - elf_64_phdr *phdr = (elf_64_phdr*)GetELFProgramHeader(Index,elf,ElfFile); - return u8_to_u64(phdr->p_paddr,elf->IsLittleEndian); - } - else{ - elf_32_phdr *phdr = (elf_32_phdr*)GetELFProgramHeader(Index,elf,ElfFile); - return u8_to_u32(phdr->p_paddr,elf->IsLittleEndian); - } - - return 0; -} - - -u64 GetELFProgramEntryAlignment(u16 Index, ElfContext *elf, u8 *ElfFile) -{ - if(Index >= elf->ProgramTableEntryCount) return 0; - - if(elf->Is64bit){ - elf_64_phdr *phdr = (elf_64_phdr*)GetELFProgramHeader(Index,elf,ElfFile); - return u8_to_u64(phdr->p_align,elf->IsLittleEndian); - } - else{ - elf_32_phdr *phdr = (elf_32_phdr*)GetELFProgramHeader(Index,elf,ElfFile); - return u8_to_u32(phdr->p_align,elf->IsLittleEndian); - } - - return 0; -} - - -int CreateElfSegments(ElfContext *elf, u8 *ElfFile) -{ - int num = 0; - // Interate through Each Program Header - elf->ActiveSegments = 0; - elf->Segments = malloc(sizeof(ElfSegment)*elf->ProgramTableEntryCount); - ElfSegment *segment = malloc(sizeof(ElfSegment)); // Temporary Buffer - for (int i = 0; i < elf->ProgramTableEntryCount; i++){ - if (elf->ProgramHeaders[i].SizeInMemory != 0 && elf->ProgramHeaders[i].Type == 1){ - memset(segment,0,sizeof(ElfSegment)); - - bool flag = false; - u32 size = 0; - u32 vAddr = elf->ProgramHeaders[i].VirtualAddress; - u32 memorySize = elf->ProgramHeaders[i].SizeInMemory; - - u16 SectionInfoCapacity = 10; - segment->SectionNum = 0; - segment->Sections = malloc(sizeof(ElfSectionEntry)*SectionInfoCapacity); - - // Itterate Through Section Headers - for (int j = num; j < elf->SectionTableEntryCount; j++){ - if (!flag){ - if (elf->Sections[j].Address != vAddr) - goto Skip; - - while (j < (int)elf->Sections[j].Size && elf->Sections[j].Address == vAddr && !IsIgnoreSection(elf->Sections[j])) - j++; - - j--; - - flag = true; - segment->VAddr = elf->Sections[j].Address; - segment->Name = elf->Sections[j].Name; - } - - if(segment->SectionNum < SectionInfoCapacity) - memcpy(&segment->Sections[segment->SectionNum],&elf->Sections[j],sizeof(ElfSectionEntry)); - else{ - SectionInfoCapacity = SectionInfoCapacity*2; - ElfSectionEntry *tmp = malloc(sizeof(ElfSectionEntry)*SectionInfoCapacity); - for(int k = 0; k < segment->SectionNum; k++) - memcpy(&tmp[k],&segment->Sections[k],sizeof(ElfSectionEntry)); - free(segment->Sections); - segment->Sections = tmp; - memcpy(&segment->Sections[segment->SectionNum],&elf->Sections[j],sizeof(ElfSectionEntry)); - } - segment->SectionNum++; - - size += elf->Sections[j].Size; - - if (size == memorySize) - break; - - if (size > memorySize){ - fprintf(stderr,"[ELF ERROR] Too large section size.\n Segment size = 0x%x\n Section Size = 0x%x\n", memorySize, size); - return ELF_SEGMENT_SECTION_SIZE_MISMATCH; - } - Skip: ; - } - if(segment->SectionNum){ - segment->Header = &elf->ProgramHeaders[i]; - memcpy(&elf->Segments[elf->ActiveSegments],segment,sizeof(ElfSegment)); - elf->ActiveSegments++; - } - else{ - free(segment->Sections); - free(segment); - fprintf(stderr,"[ELF ERROR] Program Header Has no corresponding Sections, ELF Cannot be proccessed\n"); - return ELF_SEGMENTS_NOT_FOUND; - } - } - } - - free(segment); - return 0; -} - -bool IsIgnoreSection(ElfSectionEntry info) -{ - if (info.Address) - return false; - - if (info.Type != 1 && info.Type != 0) - return true; - - char IgnoreSectionNames[7][20] = { ".debug_abbrev", ".debug_frame", ".debug_info", ".debug_line", ".debug_loc", ".debug_pubnames", ".comment" }; - for (int i = 0; i < 7; i++){ - if (strcmp(IgnoreSectionNames[i],info.Name) == 0) - return true; - } - return false; - -} diff --git a/elf.h b/elf.h deleted file mode 100644 index ece978c..0000000 --- a/elf.h +++ /dev/null @@ -1,87 +0,0 @@ -#ifndef _ELF_H_ -#define _ELF_H_ - -typedef enum -{ - NOT_ELF_FILE = -10, - NOT_ARM_ELF = -11, - NON_EXECUTABLE_ELF = -12, - ELF_SECTION_NOT_FOUND = -13, - NOT_FIND_BSS_SIZE = -14, - NOT_FIND_CODE_SECTIONS = -15, - ELF_SEGMENT_SECTION_SIZE_MISMATCH = -16, - ELF_SEGMENTS_NOT_CONTINUOUS = -17, - ELF_SEGMENTS_NOT_FOUND = -18, -} elf_errors; - -typedef struct -{ - char *Name; - u64 Type; - u64 Flags; - u8 *Ptr; - u64 OffsetInFile; - u64 Size; - u64 Address; - u64 Alignment; -} ElfSectionEntry; - -typedef struct -{ - u64 Type; - u64 Flags; - u8 *Ptr; - u64 OffsetInFile; - u64 SizeInFile; - u64 VirtualAddress; - u64 PhysicalAddress; - u64 SizeInMemory; - u64 Alignment; - -} ElfProgramEntry; - -typedef struct -{ - char *Name; - u64 VAddr; - - ElfProgramEntry *Header; - u32 SectionNum; - ElfSectionEntry *Sections; -} ElfSegment; - -typedef struct -{ - u32 Address; - u32 Size; - u32 MaxPageNum; - u8 *Data; -} CodeSegment; - -typedef struct -{ - u32 PageSize; - bool IsLittleEndian; - bool Is64bit; - - u64 ProgramTableOffset; - u16 ProgramTableEntrySize; - u16 ProgramTableEntryCount; - - u64 SectionTableOffset; - u16 SectionTableEntrySize; - u16 SectionTableEntryCount; - - u16 SectionHeaderNameEntryIndex; - - ElfSectionEntry *Sections; - ElfProgramEntry *ProgramHeaders; - - u16 ActiveSegments; - ElfSegment *Segments; - -} ElfContext; - -#endif - -int BuildExeFsCode(ncch_settings *ncchset); \ No newline at end of file diff --git a/elf_hdr.h b/elf_hdr.h deleted file mode 100644 index 260f420..0000000 --- a/elf_hdr.h +++ /dev/null @@ -1,177 +0,0 @@ -#ifndef _ELF_HDR_H_ -#define _ELF_HDR_H_ - -static const u32 ELF_MAGIC = 0x7f454c46; - -typedef enum -{ - elf_32_bit = 1, - elf_64_bit = 2, -} elf_bit_format_types; - -typedef enum -{ - elf_little_endian = 1, - elf_big_endian = 2, -} elf_endianness; - -typedef enum -{ - elf_relocatable = 1, - elf_executeable = 2, - elf_shared = 3, - elf_core = 4, -} elf_type; - -typedef enum -{ - elf_arm = 0x28, -} elf_target_architecture; - -typedef struct -{ - u8 Magic[4]; - u8 BitFormat; - u8 Endianness; - u8 ELF_Version; - u8 OS; - u8 Padding_0[8]; - u8 Type[2]; - u8 TargetArchitecture[2]; - u8 Version[4]; - u8 EntryPoint[4]; - u8 ProgramHeaderTableOffset[4]; - u8 SectionHeaderTableOffset[4]; - u8 Flags[4]; - u8 HeaderSize[2]; - u8 ProgramHeaderEntrySize[2]; - u8 ProgramHeaderEntryCount[2]; - u8 SectionTableEntrySize[2]; - u8 SectionHeaderEntryCount[2]; - u8 SectionHeaderNameEntryIndex[2]; -} elf_32_hdr; - -typedef struct -{ - u8 Magic[4]; - u8 BitFormat; - u8 Endianness; - u8 ELF_Version; - u8 OS; - u8 Padding_0[8]; - u8 Type[2]; - u8 TargetArchitecture[2]; - u8 Version[4]; - u8 EntryPoint[8]; - u8 ProgramHeaderTableOffset[8]; - u8 SectionHeaderTableOffset[8]; - u8 Flags[4]; - u8 HeaderSize[2]; - u8 ProgramHeaderEntrySize[2]; - u8 ProgramHeaderEntryCount[2]; - u8 SectionTableEntrySize[2]; - u8 SectionHeaderEntryCount[2]; - u8 SectionHeaderNameEntryIndex[2]; -} elf_64_hdr; - - -/* Section header. */ - -/* Legal values for sh_type (section type). */ - -#define SHT_NULL 0 /* Section header table entry unused */ -#define SHT_PROGBITS 1 /* Program data */ -#define SHT_SYMTAB 2 /* Symbol table */ -#define SHT_STRTAB 3 /* String table */ -#define SHT_RELA 4 /* Relocation entries with addends */ -#define SHT_HASH 5 /* Symbol hash table */ -#define SHT_DYNAMIC 6 /* Dynamic linking information */ -#define SHT_NOTE 7 /* Notes */ -#define SHT_NOBITS 8 /* Program space with no data (bss) */ -#define SHT_REL 9 /* Relocation entries, no addends */ -#define SHT_SHLIB 10 /* Reserved */ -#define SHT_DYNSYM 11 /* Dynamic linker symbol table */ -#define SHT_NUM 12 /* Number of defined types. */ -#define SHT_LOOS 0x60000000 /* Start OS-specific */ -#define SHT_LOSUNW 0x6ffffffb /* Sun-specific low bound. */ -#define SHT_SUNW_COMDAT 0x6ffffffb -#define SHT_SUNW_syminfo 0x6ffffffc -#define SHT_GNU_verdef 0x6ffffffd /* Version definition section. */ -#define SHT_GNU_verneed 0x6ffffffe /* Version needs section. */ -#define SHT_GNU_versym 0x6fffffff /* Version symbol table. */ -#define SHT_HISUNW 0x6fffffff /* Sun-specific high bound. */ -#define SHT_HIOS 0x6fffffff /* End OS-specific type */ -#define SHT_LOPROC 0x70000000 /* Start of processor-specific */ -#define SHT_HIPROC 0x7fffffff /* End of processor-specific */ -#define SHT_LOUSER 0x80000000 /* Start of application-specific */ -#define SHT_HIUSER 0x8fffffff /* End of application-specific */ - - -typedef struct -{ - u8 sh_name[4]; /* Section name (string tbl index) */ - u8 sh_type[4]; /* Section type */ - u8 sh_flags[4]; /* Section flags */ - u8 sh_addr[4]; /* Section virtual addr at execution */ - u8 sh_offset[4]; /* Section file offset */ - u8 sh_size[4]; /* Section size in bytes */ - u8 sh_link[4]; /* Link to another section */ - u8 sh_info[4]; /* Additional section information */ - u8 sh_addralign[4]; /* Section alignment */ - u8 sh_entsize[4]; /* Entry size if section holds table */ -} elf_32_shdr; - -typedef struct -{ - u8 sh_name[8]; /* Section name (string tbl index) */ - u8 sh_type[8]; /* Section type */ - u8 sh_flags[8]; /* Section flags */ - u8 sh_addr[8]; /* Section virtual addr at execution */ - u8 sh_offset[8]; /* Section file offset */ - u8 sh_size[8]; /* Section size in bytes */ - u8 sh_link[8]; /* Link to another section */ - u8 sh_info[8]; /* Additional section information */ - u8 sh_addralign[8]; /* Section alignment */ - u8 sh_entsize[8]; /* Entry size if section holds table */ -} elf_64_shdr; - -/* Program segment header. */ - -/* p_type legal values */ -#define PT_NULL 0 /* Program header table entry unused */ -#define PT_LOAD 1 /* Loadable program segment */ -#define PT_DYNAMIC 2 /* Dynamic linking information */ -#define PT_INTERP 3 /* Program interpreter */ -#define PT_NOTE 4 /* Auxiliary information */ -#define PT_SHLIB 5 /* Reserved */ -#define PT_PHDR 6 /* Entry for header table itself */ -#define PT_NUM 7 /* Number of defined types. */ -#define PT_LOOS 0x60000000 /* Start of OS-specific */ -#define PT_HIOS 0x6fffffff /* End of OS-specific */ -#define PT_LOPROC 0x70000000 /* Start of processor-specific */ -#define PT_HIPROC 0x7fffffff /* End of processor-specific */ - -typedef struct -{ - u8 p_type[4]; /* Segment type */ - u8 p_offset[4]; /* Segment file offset */ - u8 p_vaddr[4]; /* Segment virtual address */ - u8 p_paddr[4]; /* Segment physical address */ - u8 p_filesz[4]; /* Segment size in file */ - u8 p_memsz[4]; /* Segment size in memory */ - u8 p_flags[4]; /* Segment flags */ - u8 p_align[4]; /* Segment alignment */ -} elf_32_phdr; - -typedef struct -{ - u8 p_type[8]; /* Segment type */ - u8 p_flags[8]; /* Segment flags */ - u8 p_offset[8]; /* Segment file offset */ - u8 p_vaddr[8]; /* Segment virtual address */ - u8 p_paddr[8]; /* Segment physical address */ - u8 p_filesz[8]; /* Segment size in file */ - u8 p_memsz[8]; /* Segment size in memory */ - u8 p_align[8]; /* Segment alignment */ -} elf_64_phdr; -#endif \ No newline at end of file diff --git a/exefs.c b/exefs.c deleted file mode 100644 index 15dd4ae..0000000 --- a/exefs.c +++ /dev/null @@ -1,179 +0,0 @@ -#include "lib.h" -#include "ncch.h" -#include "exefs.h" - -// Private Prototypes -u32 PredictExeFS_Size(ExeFs_BuildContext *ctx); -int GenerateExeFS_Header(ExeFs_BuildContext *ctx, u8 *outbuff); -void InitialiseExeFSContext(ExeFs_BuildContext *ctx); -void FreeExeFSContext(ExeFs_BuildContext *ctx); -int ImportDatatoExeFS(ExeFs_BuildContext *ctx, u8 *outbuff); -int ImportToExeFSContext(ExeFs_BuildContext *ctx, char *lable, u8 *buffer, u32 size); - -// ExeFs Build Functions -int BuildExeFs(ncch_settings *ncchset) -{ - /* Intialising ExeFs Build Context */ - ExeFs_BuildContext *ctx = malloc(sizeof(ExeFs_BuildContext)); - if(!ctx) {fprintf(stderr,"[EXEFS ERROR] MEM ERROR\n"); return MEM_ERROR;} - InitialiseExeFSContext(ctx); - ctx->media_unit = ncchset->Options.MediaSize; - - /* Importing ExeFs */ - if(ncchset->ExeFs_Sections.Code.size) - ImportToExeFSContext(ctx,".code",ncchset->ExeFs_Sections.Code.buffer,ncchset->ExeFs_Sections.Code.size); - if(ncchset->ExeFs_Sections.Banner.size) - ImportToExeFSContext(ctx,"banner",ncchset->ExeFs_Sections.Banner.buffer,ncchset->ExeFs_Sections.Banner.size); - if(ncchset->ExeFs_Sections.Icon.size) - ImportToExeFSContext(ctx,"icon",ncchset->ExeFs_Sections.Icon.buffer,ncchset->ExeFs_Sections.Icon.size); - if(ncchset->Sections.Logo.size && ncchset->Options.IncludeExeFsLogo) - ImportToExeFSContext(ctx,"logo",ncchset->Sections.Logo.buffer,ncchset->Sections.Logo.size); - - /* Allocating Memory for ExeFs */ - ncchset->Sections.ExeFs.size = PredictExeFS_Size(ctx); - ncchset->Sections.ExeFs.buffer = malloc(ncchset->Sections.ExeFs.size); - if(!ncchset->Sections.ExeFs.buffer){ - printf("[EXEFS ERROR] Could Not Allocate Memory for ExeFS\n"); - return Fail; - } - memset(ncchset->Sections.ExeFs.buffer,0,ncchset->Sections.ExeFs.size); - - /* Generating Header, and writing sections to buffer */ - GenerateExeFS_Header(ctx,ncchset->Sections.ExeFs.buffer); - ImportDatatoExeFS(ctx,ncchset->Sections.ExeFs.buffer); - - /* Finish */ - FreeExeFSContext(ctx); - return 0; -} - -u32 PredictExeFS_Size(ExeFs_BuildContext *ctx) -{ - u32 exefs_size = 0x200; // Size of header - for(int i = 0; i < ctx->section_count; i++){ - exefs_size += align_value(ctx->section_size[i],ctx->media_unit); - } - //exefs_size = align_value(ctx->exefs_size,ctx->media_unit); - return exefs_size; -} - -int GenerateExeFS_Header(ExeFs_BuildContext *ctx, u8 *outbuff) -{ - for(int i = 0; i < ctx->section_count; i++){ - if(i == 0) - ctx->section_offset[i] = 0; - else - ctx->section_offset[i] = align_value((ctx->section_offset[i-1]+ctx->section_size[i-1]),ctx->media_unit); - - memcpy(ctx->file_header[i].name,ctx->lable[i],8); - u32_to_u8(ctx->file_header[i].offset,ctx->section_offset[i],LE); - u32_to_u8(ctx->file_header[i].size,ctx->section_size[i],LE); - ctr_sha(ctx->section[i],ctx->section_size[i],ctx->file_hashes[9-i],CTR_SHA_256); - } - memcpy(outbuff,ctx->file_header,sizeof(ExeFs_FileHeader)*10); - memcpy(outbuff+0xc0,ctx->file_hashes,0x20*10); - return 0; -} - -void InitialiseExeFSContext(ExeFs_BuildContext *ctx) -{ - memset(ctx,0,sizeof(ExeFs_BuildContext)); -} - -void FreeExeFSContext(ExeFs_BuildContext *ctx) -{ - /* - if(ctx->outbuff != NULL) - free(ctx->outbuff); - for(int i = 0; i < 10; i++){ - if(ctx->section[i] != NULL) - free(ctx->section[i]); - } - */ - memset(ctx,0,sizeof(ExeFs_BuildContext)); - free(ctx); -} - -int ImportDatatoExeFS(ExeFs_BuildContext *ctx, u8 *outbuff) -{ - for(int i = 0; i < ctx->section_count; i++){ - memcpy(outbuff+ctx->section_offset[i]+0x200,ctx->section[i],ctx->section_size[i]); - } - return 0; -} - -int ImportToExeFSContext(ExeFs_BuildContext *ctx, char *lable, u8 *buffer, u32 size) -{ - if(ctx == NULL || lable == NULL || buffer == NULL){ - printf("[!] PTR ERROR\n"); - return PTR_ERROR; - } - if(ctx->section_count >= 10){ - printf("[!] Maximum ExeFS Capacity Reached\n"); - return EXEFS_MAX_REACHED; - } - if(strlen(lable) > 8){ - printf("[!] ExeFS Section Name: '%s' is too large\n",lable); - return EXEFS_SECTION_NAME_ERROR; - } - - ctx->section_count++; - ctx->section[ctx->section_count - 1] = buffer; - ctx->section_size[ctx->section_count - 1] = size; - strcpy(ctx->lable[ctx->section_count - 1],lable); - return 0; -} - -// ExeFs Read Functions -bool DoesExeFsSectionExist(char *section, u8 *ExeFs) -{ - ExeFs_Header *hdr = (ExeFs_Header*) ExeFs; - for(int i = 0; i < MAX_EXEFS_SECTIONS; i++){ - if(strncmp(hdr->SectionHdr[i].name,section,8) == 0) return true; - } - return false; -} -u8* GetExeFsSection(char *section, u8 *ExeFs) -{ - ExeFs_Header *hdr = (ExeFs_Header*) ExeFs; - for(int i = 0; i < MAX_EXEFS_SECTIONS; i++){ - if(strncmp(hdr->SectionHdr[i].name,section,8) == 0){ - u32 offset = u8_to_u32(hdr->SectionHdr[i].offset,LE) + sizeof(ExeFs_Header); - return (u8*)(ExeFs+offset); - } - } - return NULL; -} - -u8* GetExeFsSectionHash(char *section, u8 *ExeFs) -{ - ExeFs_Header *hdr = (ExeFs_Header*) ExeFs; - for(int i = 0; i < MAX_EXEFS_SECTIONS; i++){ - if(strncmp(hdr->SectionHdr[i].name,section,8) == 0){ - return (u8*)(hdr->SectionHashes[MAX_EXEFS_SECTIONS-1-i]); - } - } - return NULL; -} - -u32 GetExeFsSectionSize(char *section, u8 *ExeFs) -{ - ExeFs_Header *hdr = (ExeFs_Header*) ExeFs; - for(int i = 0; i < MAX_EXEFS_SECTIONS; i++){ - if(strncmp(hdr->SectionHdr[i].name,section,8) == 0){ - return u8_to_u32(hdr->SectionHdr[i].size,LE); - } - } - return 0; -} - -u32 GetExeFsSectionOffset(char *section, u8 *ExeFs) -{ - ExeFs_Header *hdr = (ExeFs_Header*) ExeFs; - for(int i = 0; i < MAX_EXEFS_SECTIONS; i++){ - if(strncmp(hdr->SectionHdr[i].name,section,8) == 0){ - return u8_to_u32(hdr->SectionHdr[i].offset,LE) + sizeof(ExeFs_Header); - } - } - return 0; -} \ No newline at end of file diff --git a/exefs.h b/exefs.h deleted file mode 100644 index 4564fc5..0000000 --- a/exefs.h +++ /dev/null @@ -1,54 +0,0 @@ -#ifndef _EXEFS_H_ -#define _EXEFS_H_ - -#define MAX_EXEFS_SECTIONS 10 // DO NOT CHANGE - -typedef enum -{ - PTR_ERROR = -10, - EXEFS_MAX_REACHED = -11, - EXEFS_SECTION_NAME_ERROR = -12, - -} exefs_errors; - -typedef struct -{ - char name[8]; - u8 offset[4]; - u8 size[4]; -} ExeFs_FileHeader; - -typedef struct -{ - //Input - int section_count; - u8 *section[10]; - u32 section_size[10]; - u32 section_offset[10]; - char lable[10][8]; - u32 media_unit; - - //Working Data - ExeFs_FileHeader file_header[10]; - u8 file_hashes[10][0x20]; - -} ExeFs_BuildContext; - -typedef struct -{ - ExeFs_FileHeader SectionHdr[MAX_EXEFS_SECTIONS]; - u8 Reserved[0x20]; - u8 SectionHashes[MAX_EXEFS_SECTIONS][0x20]; -} ExeFs_Header; - -#endif - -/* ExeFs Build Functions */ -int BuildExeFs(ncch_settings *ncchset); - -/* ExeFs Read Functions */ -bool DoesExeFsSectionExist(char *section, u8 *ExeFs); -u8* GetExeFsSection(char *section, u8 *ExeFs); -u8* GetExeFsSectionHash(char *section, u8 *ExeFs); -u32 GetExeFsSectionSize(char *section, u8 *ExeFs); -u32 GetExeFsSectionOffset(char *section, u8 *ExeFs); diff --git a/exheader.c b/exheader.c deleted file mode 100644 index 22e948c..0000000 --- a/exheader.c +++ /dev/null @@ -1,1522 +0,0 @@ -#include "lib.h" -#include "ncch.h" -#include "exheader.h" - -#include "titleid.h" -#include "polarssl/base64.h" - -#include "accessdesc_sig.h" // For AccessDesc Presets - -/* Prototypes */ -void init_ExHeaderSettings(exheader_settings *exhdrset); -void free_ExHeaderSettings(exheader_settings *exhdrset); -int get_ExHeaderSettingsFromNcchset(exheader_settings *exhdrset, ncch_settings *ncchset); -int get_ExHeaderSettingsFromYaml(exheader_settings *exhdrset); - -int get_ExHeaderCodeSetInfo(exhdr_CodeSetInfo *CodeSetInfo, rsf_settings *yaml); -int get_ExHeaderDependencyList(u8 *DependencyList, rsf_settings *yaml); -int get_ExHeaderSystemInfo(exhdr_SystemInfo *SystemInfo, rsf_settings *yaml); -int get_ExHeaderARM11SystemLocalInfo(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *yaml, bool UseAccessDescPreset); -int SetARM11SystemLocalInfoFlags(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *yaml); -int GetAppType(int *AppType, rsf_settings *yaml); -int SetARM11ResLimitDesc(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *yaml); -int SetARM11StorageInfo(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *yaml); -int SetARM11StorageInfoSystemSaveDataId(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *yaml); -int SetARM11StorageInfoExtSaveDataId(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *yaml); -int SetARM11StorageInfoOtherUserSaveData(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *yaml); -bool CheckCondiditionsForNewAccessibleSaveDataIds(rsf_settings *yaml); -int SetARM11StorageInfoAccessibleSaveDataIds(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *yaml); -int SetARM11ServiceAccessControl(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *yaml); -int get_ExHeaderARM11KernelInfo(exhdr_ARM11KernelCapabilities *arm11, rsf_settings *yaml); -int SetARM11KernelDescSysCallControl(ARM11KernelCapabilityDescriptor *desc, rsf_settings *yaml); -int GetARM11SysCalls(ARM11KernelCapabilityDescriptor *desc, rsf_settings *yaml); -void EnableSystemCall(ARM11KernelCapabilityDescriptor *desc, int SysCall); -void DisableSystemCall(ARM11KernelCapabilityDescriptor *desc, int SysCall); -int SetARM11KernelDescInteruptNumList(ARM11KernelCapabilityDescriptor *desc, rsf_settings *yaml); -int GetARM11Interupts(ARM11KernelCapabilityDescriptor *desc, rsf_settings *yaml); -void EnableInterupt(ARM11KernelCapabilityDescriptor *desc, int Interrupt, int i); -int SetARM11KernelDescAddressMapping(ARM11KernelCapabilityDescriptor *desc, rsf_settings *yaml); -int GetARM11IOMappings(ARM11KernelCapabilityDescriptor *desc, rsf_settings *yaml); -int GetARM11StaticMappings(ARM11KernelCapabilityDescriptor *desc, rsf_settings *yaml); -bool IsEndAddress(u32 Address); -bool IsStartAddress(u32 Address); -u32 GetIOMappingDesc(u32 Address); -u32 GetStaticMappingDesc(u32 Address, bool IsReadOnly); -u32 GetMappingDesc(u32 Address, u32 PrefixVal, s32 numPrefixBits, bool IsRO); -int SetARM11KernelDescOtherCapabilities(ARM11KernelCapabilityDescriptor *desc, rsf_settings *yaml); -int SetARM11KernelDescHandleTableSize(ARM11KernelCapabilityDescriptor *desc, rsf_settings *yaml); -int SetARM11KernelDescReleaseKernelVersion(ARM11KernelCapabilityDescriptor *desc, rsf_settings *yaml); -void SetARM11KernelDescValue(ARM11KernelCapabilityDescriptor *desc, u16 Index, u32 Value); -void SetARM11KernelDescBitmask(ARM11KernelCapabilityDescriptor *desc, u32 Bitmask); -void AllocateARM11KernelDescMemory(ARM11KernelCapabilityDescriptor *desc, u16 Num); -u32 GetDescPrefixMask(int numPrefixBits); -u32 GetDescPrefixBits(int numPrefixBits, u32 PrefixVal); -int get_ExHeaderARM9AccessControlInfo(exhdr_ARM9AccessControlInfo *arm9, rsf_settings *yaml); -int set_AccessDesc(exheader_settings *exhdrset, ncch_settings *ncchset); -int accessdesc_SignWithKey(exheader_settings *exhdrset, ncch_settings *ncchset); -int accessdesc_GetSignFromRsf(exheader_settings *exhdrset, ncch_settings *ncchset); -int accessdesc_GetSignFromPreset(exheader_settings *exhdrset, ncch_settings *ncchset); - -/* ExHeader Signature Functions */ -int SignAccessDesc(ExtendedHeader_Struct *ExHdr, keys_struct *keys) -{ - u8 *AccessDesc = (u8*) &ExHdr->AccessDescriptor.ncchpubkeymodulus; - u8 *Signature = (u8*) &ExHdr->AccessDescriptor.signature; - return ctr_sig(AccessDesc,0x300,Signature,keys->rsa.AccessDesc_Pub,keys->rsa.AccessDesc_Priv,RSA_2048_SHA256,CTR_RSA_SIGN); -} - -int CheckAccessDescSignature(ExtendedHeader_Struct *ExHdr, keys_struct *keys) -{ - u8 *AccessDesc = (u8*) &ExHdr->AccessDescriptor.ncchpubkeymodulus; - u8 *Signature = (u8*) &ExHdr->AccessDescriptor.signature; - return ctr_sig(AccessDesc,0x300,Signature,keys->rsa.AccessDesc_Pub,NULL,RSA_2048_SHA256,CTR_RSA_VERIFY); -} - -/* ExHeader Build Functions */ -int BuildExHeader(ncch_settings *ncchset) -{ - int result = 0; - - exheader_settings *exhdrset = malloc(sizeof(exheader_settings)); - if(!exhdrset) {fprintf(stderr,"[EXHEADER ERROR] MEM ERROR\n"); return MEM_ERROR;} - init_ExHeaderSettings(exhdrset); - - // Get Settings - result = get_ExHeaderSettingsFromNcchset(exhdrset,ncchset); - if(result) goto finish; - - result = get_ExHeaderSettingsFromYaml(exhdrset); - if(result) goto finish; - - result = set_AccessDesc(exhdrset,ncchset); - if(result) goto finish; - - exhdrset->ExHdr->AccessDescriptor.ARM11SystemLocalCapabilities.Flags[6] = 5; - -finish: - if(result) fprintf(stderr,"[EXHEADER ERROR] Failed to create ExHeader\n"); - free_ExHeaderSettings(exhdrset); - return result; -} - - -void init_ExHeaderSettings(exheader_settings *exhdrset) -{ - memset(exhdrset,0,sizeof(exheader_settings)); -} - -void free_ExHeaderSettings(exheader_settings *exhdrset) -{ - free(exhdrset); -} - -int get_ExHeaderSettingsFromNcchset(exheader_settings *exhdrset, ncch_settings *ncchset) -{ - /* Transfer settings */ - exhdrset->keys = ncchset->keys; - exhdrset->yaml = ncchset->yaml_set; - exhdrset->UseAccessDescPreset = ncchset->keys->AccessDescSign.PresetType != not_preset; - - /* Creating Output Buffer */ - ncchset->Sections.ExHeader.size = 0x800; - ncchset->Sections.ExHeader.buffer = malloc(ncchset->Sections.ExHeader.size); - if(!ncchset->Sections.ExHeader.buffer) {fprintf(stderr,"[EXHEADER ERROR] MEM ERROR\n"); return MEM_ERROR;} - memset(ncchset->Sections.ExHeader.buffer,0,ncchset->Sections.ExHeader.size); - - /* Import ExHeader Code Section template */ - if(ncchset->ComponentFilePtrs.exheader_size){ - u32 import_size = 0x30; min_u64(0x30,ncchset->ComponentFilePtrs.exheader_size); - u32 import_offset = 0x10; - if((import_size+import_offset) > ncchset->ComponentFilePtrs.exheader_size){ - fprintf(stderr,"[EXHEADER ERROR] Exheader Template is too small\n"); - } - ReadFile_64((ncchset->Sections.ExHeader.buffer+import_offset),import_size,import_offset,ncchset->ComponentFilePtrs.exheader); - } - - /* Create ExHeader Struct for output */ - exhdrset->ExHdr = (ExtendedHeader_Struct*)ncchset->Sections.ExHeader.buffer; - - /* Set Code Info if Code Section was built not imported */ - if(ncchset->Options.IsBuildingCodeSection){ - /* BSS Size */ - u32_to_u8(exhdrset->ExHdr->CodeSetInfo.BssSize,ncchset->CodeDetails.BSS_Size,LE); - /* Data */ - u32_to_u8(exhdrset->ExHdr->CodeSetInfo.DataSectionInfo.Address,ncchset->CodeDetails.DataAddress,LE); - u32_to_u8(exhdrset->ExHdr->CodeSetInfo.DataSectionInfo.CodeSize,ncchset->CodeDetails.DataSize,LE); - u32_to_u8(exhdrset->ExHdr->CodeSetInfo.DataSectionInfo.NumMaxPages,ncchset->CodeDetails.DataMaxPages,LE); - /* RO */ - u32_to_u8(exhdrset->ExHdr->CodeSetInfo.ReadOnlySectionInfo.Address,ncchset->CodeDetails.ROAddress,LE); - u32_to_u8(exhdrset->ExHdr->CodeSetInfo.ReadOnlySectionInfo.CodeSize,ncchset->CodeDetails.ROSize,LE); - u32_to_u8(exhdrset->ExHdr->CodeSetInfo.ReadOnlySectionInfo.NumMaxPages,ncchset->CodeDetails.ROMaxPages,LE); - /* Text */ - u32_to_u8(exhdrset->ExHdr->CodeSetInfo.TextSectionInfo.Address,ncchset->CodeDetails.TextAddress,LE); - u32_to_u8(exhdrset->ExHdr->CodeSetInfo.TextSectionInfo.CodeSize,ncchset->CodeDetails.TextSize,LE); - u32_to_u8(exhdrset->ExHdr->CodeSetInfo.TextSectionInfo.NumMaxPages,ncchset->CodeDetails.TextMaxPages,LE); - } - - /* Set Simple Flags */ - if(ncchset->Options.CompressCode) - exhdrset->ExHdr->CodeSetInfo.Flags.flag |= ExeFsCodeCompress; - if(ncchset->Options.UseOnSD) - exhdrset->ExHdr->CodeSetInfo.Flags.flag |= RetailSDAppFlag; - if(!ncchset->Options.UseRomFS) // Move this later - exhdrset->ExHdr->ARM11SystemLocalCapabilities.StorageInfo.OtherAttributes |= 1 << attribute_NOT_USE_ROMFS; - - return 0; -} - -int get_ExHeaderSettingsFromYaml(exheader_settings *exhdrset) -{ - int result = 0; - result = get_ExHeaderCodeSetInfo(&exhdrset->ExHdr->CodeSetInfo, exhdrset->yaml); - if(result) goto finish; - - if(!exhdrset->UseAccessDescPreset){ - result = get_ExHeaderDependencyList((u8*)&exhdrset->ExHdr->DependencyList[0], exhdrset->yaml); - if(result) goto finish; - } - - result = get_ExHeaderSystemInfo(&exhdrset->ExHdr->SystemInfo, exhdrset->yaml); - if(result) goto finish; - - result = get_ExHeaderARM11SystemLocalInfo(&exhdrset->ExHdr->ARM11SystemLocalCapabilities, exhdrset->yaml, exhdrset->UseAccessDescPreset); - if(result) goto finish; - - if(!exhdrset->UseAccessDescPreset){ - result = get_ExHeaderARM11KernelInfo(&exhdrset->ExHdr->ARM11KernelCapabilities, exhdrset->yaml); - if(result) goto finish; - - result = get_ExHeaderARM9AccessControlInfo(&exhdrset->ExHdr->ARM9AccessControlInfo, exhdrset->yaml); - if(result) goto finish; - } - -finish: - return result; -} - -int get_ExHeaderCodeSetInfo(exhdr_CodeSetInfo *CodeSetInfo, rsf_settings *yaml) -{ - /* Name */ - if(yaml->BasicInfo.Title){ - if(strlen(yaml->BasicInfo.Title) > 8){ - fprintf(stderr,"[EXHEADER ERROR] Parameter Too Long 'BasicInfo/Title'\n"); - return EXHDR_BAD_YAML_OPT; - } - strcpy((char*)CodeSetInfo->Name,yaml->BasicInfo.Title); - } - else{ - fprintf(stderr,"[EXHEADER ERROR] Parameter Not Found: 'BasicInfo/Title'\n"); - return EXHDR_BAD_YAML_OPT; - } - /* Stack Size */ - if(yaml->SystemControlInfo.StackSize){ - u32 StackSize = strtoul(yaml->SystemControlInfo.StackSize,NULL,0); - u32_to_u8(CodeSetInfo->StackSize,StackSize,LE); - } - else{ - fprintf(stderr,"[EXHEADER ERROR] Parameter Not Found: 'SystemControlInfo/StackSize'\n"); - return EXHDR_BAD_YAML_OPT; - } - /* Remaster Version */ - if(yaml->SystemControlInfo.RemasterVersion){ - u16 RemasterVersion = strtol(yaml->SystemControlInfo.RemasterVersion,NULL,0); - u16_to_u8(CodeSetInfo->Flags.remasterVersion,RemasterVersion,LE); - } - else{ - u16_to_u8(CodeSetInfo->Flags.remasterVersion,0,LE); - } - return 0; -} - -int get_ExHeaderDependencyList(u8 *DependencyList, rsf_settings *yaml) -{ - if(yaml->SystemControlInfo.DependencyNum > 0x30){ - fprintf(stderr,"[EXHEADER ERROR] Too Many Dependency IDs\n"); - return EXHDR_BAD_YAML_OPT; - } - for(int i = 0; i < yaml->SystemControlInfo.DependencyNum; i++){ - u8 *pos = (DependencyList + 0x8*i); - u64 TitleID = strtoull(yaml->SystemControlInfo.Dependency[i],NULL,0); - u64_to_u8(pos,TitleID,LE); - } - return 0; -} - -int get_ExHeaderSystemInfo(exhdr_SystemInfo *SystemInfo, rsf_settings *yaml) -{ - /* SaveDataSize */ - if(yaml->Rom.SaveDataSize){ - u64 SaveDataSize = strtoull(yaml->Rom.SaveDataSize,NULL,10); - if(strstr(yaml->Rom.SaveDataSize,"K")){ - char *str = strstr(yaml->Rom.SaveDataSize,"K"); - if(strcmp(str,"K") == 0 || strcmp(str,"KB") == 0 ){ - SaveDataSize *= KB; - } - } - else if(strstr(yaml->Rom.SaveDataSize,"M")){ - char *str = strstr(yaml->Rom.SaveDataSize,"M"); - if(strcmp(str,"M") == 0 || strcmp(str,"MB") == 0 ){ - SaveDataSize *= MB; - } - } - else if(strstr(yaml->Rom.SaveDataSize,"G")){ - char *str = strstr(yaml->Rom.SaveDataSize,"G"); - if(strcmp(str,"G") == 0 || strcmp(str,"GB") == 0 ){ - SaveDataSize *= GB; - } - } - else{ - fprintf(stderr,"[EXHEADER ERROR] Invalid save data size format.\n"); - return EXHDR_BAD_YAML_OPT; - } - if((SaveDataSize & 65536) != 0){ - fprintf(stderr,"[EXHEADER ERROR] Save data size must be aligned to 64K.\n"); - return EXHDR_BAD_YAML_OPT; - } - u64_to_u8(SystemInfo->SaveDataSize,SaveDataSize,LE); - } - else{ - u64_to_u8(SystemInfo->SaveDataSize,0,LE); - } - /* Jump Id */ - if(yaml->SystemControlInfo.JumpId){ - u64 JumpId = strtoull(yaml->SystemControlInfo.JumpId,NULL,0); - u64_to_u8(SystemInfo->JumpId,JumpId,LE); - } - else{ - u64 JumpId = 0; - int result = GetProgramID(&JumpId,yaml,false); - if(result) return result; - u64_to_u8(SystemInfo->JumpId,JumpId,LE); - } - return 0; -} - -int get_ExHeaderARM11SystemLocalInfo(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *yaml, bool UseAccessDescPreset) -{ - /* Program Id */ - u64 ProgramId = 0; - int result = GetProgramID(&ProgramId,yaml,true); - if(result) return result; - u64_to_u8(arm11->ProgramId,ProgramId,LE); - - if(!UseAccessDescPreset){ - /* Flags */ - result = SetARM11SystemLocalInfoFlags(arm11, yaml); - if(result) return result; - - /* Resource Limit Descriptors */ - result = SetARM11ResLimitDesc(arm11, yaml); - if(result) return result; - } - - /* Storage Info */ - result = SetARM11StorageInfo(arm11, yaml); - if(result) return result; - - if(!UseAccessDescPreset){ - /* Service Access Control */ - result = SetARM11ServiceAccessControl(arm11, yaml); - if(result) return result; - - /* Resource Limit Category */ - if(yaml->AccessControlInfo.ResourceLimitCategory){ - if(strcasecmp(yaml->AccessControlInfo.ResourceLimitCategory,"application") == 0) arm11->ResourceLimitCategory = resrc_limit_APPLICATION; - else if(strcasecmp(yaml->AccessControlInfo.ResourceLimitCategory,"sysapplet") == 0) arm11->ResourceLimitCategory = resrc_limit_SYS_APPLET; - else if(strcasecmp(yaml->AccessControlInfo.ResourceLimitCategory,"libapplet") == 0) arm11->ResourceLimitCategory = resrc_limit_LIB_APPLET; - else if(strcasecmp(yaml->AccessControlInfo.ResourceLimitCategory,"other") == 0) arm11->ResourceLimitCategory = resrc_limit_OTHER; - } - } - /* Finish */ - return 0; -} - -int SetARM11SystemLocalInfoFlags(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *yaml) -{ - /* Core Version */ - if(yaml->AccessControlInfo.CoreVersion){ - u32 Version = strtoul(yaml->AccessControlInfo.CoreVersion,NULL,0); - u32_to_u8(&arm11->Flags[0],Version,LE); - } - else{ - fprintf(stderr,"[EXHEADER ERROR] Parameter Not Found: 'AccessControlInfo/CoreVersion'\n"); - return EXHDR_BAD_YAML_OPT; - } - - /* Byte[6] */ - u8 AffinityMask = 0; - u8 IdealProcessor = 0; - u8 SystemMode = 0; - if(yaml->AccessControlInfo.AffinityMask){ - AffinityMask = strtol(yaml->AccessControlInfo.AffinityMask,NULL,0); - if(AffinityMask > 1){ - fprintf(stderr,"[EXHEADER ERROR] Unexpected AffinityMask: %d. Expected range: 0x0 - 0x1\n",AffinityMask); - return EXHDR_BAD_YAML_OPT; - } - } - if(yaml->AccessControlInfo.IdealProcessor){ - IdealProcessor = strtol(yaml->AccessControlInfo.IdealProcessor,NULL,0); - if(IdealProcessor > 1){ - fprintf(stderr,"[EXHEADER ERROR] Unexpected IdealProcessor: %d. Expected range: 0x0 - 0x1\n",IdealProcessor); - return EXHDR_BAD_YAML_OPT; - } - } - if(yaml->AccessControlInfo.SystemMode){ - SystemMode = strtol(yaml->AccessControlInfo.SystemMode,NULL,0); - if(SystemMode > 15){ - fprintf(stderr,"[EXHEADER ERROR] Unexpected SystemMode: 0x%x. Expected range: 0x0 - 0xf\n",SystemMode); - return EXHDR_BAD_YAML_OPT; - } - } - arm11->Flags[6] = (u8)(SystemMode << 4 | AffinityMask << 2 | IdealProcessor); - - /* Thread Priority */ - if(yaml->AccessControlInfo.Priority){ - u8 Priority = strtoul(yaml->AccessControlInfo.Priority,NULL,0); - int ProccessType = 0; - GetAppType(&ProccessType,yaml); - if(ProccessType == processtype_APPLICATION || ProccessType == processtype_DEFAULT){ - Priority += 32; - } - if(Priority > 127){ - fprintf(stderr,"[EXHEADER ERROR] Invalid Priority: %d\n",Priority); - return EXHDR_BAD_YAML_OPT; - } - arm11->Flags[7] = Priority; - } - else{ - fprintf(stderr,"[EXHEADER ERROR] Parameter Not Found: 'AccessControlInfo/Priority'\n"); - return EXHDR_BAD_YAML_OPT; - } - - return 0; -} - -int GetAppType(int *AppType, rsf_settings *yaml) -{ - *AppType = processtype_DEFAULT; - if(yaml->SystemControlInfo.AppType){ - if(strcasecmp(yaml->SystemControlInfo.AppType,"application") == 0) *AppType = processtype_APPLICATION; - else if(strcasecmp(yaml->SystemControlInfo.AppType,"system") == 0) *AppType = processtype_SYSTEM; - } - return 0; -} - -int SetARM11ResLimitDesc(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *yaml) -{ - for(int i = 0; i < 16; i++){ - if(i == 0){ - /* MaxCpu */ - // N's makerom actually reads this from the pre-made accessdesc. Damn cheaters. But we can improvise - if(yaml->AccessControlInfo.MaxCpu){ - arm11->ResourceLimitDescriptor[i][0] = strtol(yaml->AccessControlInfo.MaxCpu,NULL,0); - } - } - } - - return 0; -} - -int SetARM11StorageInfo(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *yaml) -{ - if(yaml->AccessControlInfo.UseExtendedSaveDataAccessControl || yaml->AccessControlInfo.AccessibleSaveDataIds){ - /* Accessible SaveData IDs */ - if(!CheckCondiditionsForNewAccessibleSaveDataIds(yaml)) - return EXHDR_BAD_YAML_OPT; - SetARM11StorageInfoAccessibleSaveDataIds(arm11,yaml); - } - else{ - /* Extdata Id */ - int ret = SetARM11StorageInfoExtSaveDataId(arm11,yaml); - if(ret) return ret; - /* OtherUserSaveData */ - SetARM11StorageInfoOtherUserSaveData(arm11,yaml); - } - - /* System Savedata Id */ - SetARM11StorageInfoSystemSaveDataId(arm11,yaml); - - /* FileSystem Access Info */ - u32 AccessInfo = 0; - for(int i = 0; i < yaml->AccessControlInfo.FileSystemAccessNum; i++){ - if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"CategorySystemApplication") == 0) - AccessInfo |= 1 << fsaccess_CATEGORY_SYSTEM_APPLICATION; - else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"CategoryHardwareCheck") == 0) - AccessInfo |= 1 << fsaccess_CATEGORY_HARDWARE_CHECK; - else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"CategoryFileSystemTool") == 0) - AccessInfo |= 1 << fsaccess_CATEGORY_FILE_SYSTEM_TOOL; - else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"Debug") == 0) - AccessInfo |= 1 << fsaccess_DEBUG; - else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"TwlCardBackup") == 0) - AccessInfo |= 1 << fsaccess_TWL_CARD_BACKUP; - else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"TwlNandData") == 0) - AccessInfo |= 1 << fsaccess_TWL_NAND_DATA; - else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"Boss") == 0) - AccessInfo |= 1 << fsaccess_BOSS; - else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"DirectSdmc") == 0) - AccessInfo |= 1 << fsaccess_DIRECT_SDMC; - else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"Core") == 0) - AccessInfo |= 1 << fsaccess_CORE; - else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"CtrNandRo") == 0) - AccessInfo |= 1 << fsaccess_CTR_NAND_RO; - else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"CtrNandRw") == 0) - AccessInfo |= 1 << fsaccess_CTR_NAND_RW; - else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"CtrNandRoWrite") == 0) - AccessInfo |= 1 << fsaccess_CTR_NAND_RO_WRITE; - else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"CategorySystemSettings") == 0) - AccessInfo |= 1 << fsaccess_CATEGORY_SYSTEM_SETTINGS; - else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"CardBoard") == 0) - AccessInfo |= 1 << fsaccess_CARD_BOARD; - else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"ExportImportIvs") == 0) - AccessInfo |= 1 << fsaccess_EXPORT_IMPORT_IVS; - else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"DirectSdmcWrite") == 0) - AccessInfo |= 1 << fsaccess_DIRECT_SDMC_WRITE; - else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"SwitchCleanup") == 0) - AccessInfo |= 1 << fsaccess_SWITCH_CLEANUP; - else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"SaveDataMove") == 0) - AccessInfo |= 1 << fsaccess_SAVE_DATA_MOVE; - else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"Shop") == 0) - AccessInfo |= 1 << fsaccess_SHOP; - else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"Shell") == 0) - AccessInfo |= 1 << fsaccess_SHELL; - else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"CategoryHomeMenu") == 0) - AccessInfo |= 1 << fsaccess_CATEGORY_HOME_MENU; - else{ - fprintf(stderr,"[EXHEADER ERROR] Invalid FileSystemAccess Name: '%s'\n",yaml->AccessControlInfo.FileSystemAccess[i]); - return EXHDR_BAD_YAML_OPT; - } - } - u32_to_u8(arm11->StorageInfo.AccessInfo,AccessInfo,LE); - return 0; -} - -int SetARM11StorageInfoSystemSaveDataId(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *yaml) -{ - if(yaml->AccessControlInfo.SystemSaveDataId1){ - u32 SaveId = strtoul(yaml->AccessControlInfo.SystemSaveDataId1,NULL,0); - u32_to_u8(arm11->StorageInfo.SystemSaveDataId,SaveId,LE); - } - if(yaml->AccessControlInfo.SystemSaveDataId2){ - u32 SaveId = strtoul(yaml->AccessControlInfo.SystemSaveDataId2,NULL,0); - u32_to_u8(&arm11->StorageInfo.SystemSaveDataId[4],SaveId,LE); - } - return 0; -} - -int SetARM11StorageInfoExtSaveDataId(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *yaml) -{ - if(yaml->AccessControlInfo.ExtSaveDataId){ - if(!yaml->AccessControlInfo.UseExtSaveData){ - fprintf(stderr,"[EXHEADER ERROR] Failed to set ExtSaveDataId. UseExtSaveData must be true.\n"); - return EXHDR_BAD_YAML_OPT; - } - u64 ExtdataId = strtoull(yaml->AccessControlInfo.ExtSaveDataId,NULL,0); - u64_to_u8(arm11->StorageInfo.ExtSaveDataId,ExtdataId,LE); - } - return 0; -} - -int SetARM11StorageInfoOtherUserSaveData(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *yaml) -{ - u64 Value = 0; - if(yaml->AccessControlInfo.OtherUserSaveDataId1) - Value = 0xffffff & strtoul(yaml->AccessControlInfo.OtherUserSaveDataId1,NULL,0); - Value = Value << 20; - if(yaml->AccessControlInfo.OtherUserSaveDataId2) - Value |= 0xffffff & strtoul(yaml->AccessControlInfo.OtherUserSaveDataId2,NULL,0); - Value = Value << 20; - if(yaml->AccessControlInfo.OtherUserSaveDataId3) - Value |= 0xffffff & strtoul(yaml->AccessControlInfo.OtherUserSaveDataId3,NULL,0); - - /* UseOtherVariationSaveData Flag */ - if(yaml->AccessControlInfo.UseOtherVariationSaveData){ - Value |= 0x1000000000000000; - } - u64_to_u8(arm11->StorageInfo.StorageAccessableUniqueIds,Value,LE); - return 0; -} - -bool CheckCondiditionsForNewAccessibleSaveDataIds(rsf_settings *yaml) -{ - if(!yaml->AccessControlInfo.UseExtendedSaveDataAccessControl){ - if(yaml->AccessControlInfo.AccessibleSaveDataIds) - fprintf(stderr,"[EXHEADER ERROR] AccessibleSaveDataIds is unavailable if UseExtendedSaveDataAccessControl is false.\n"); - return false; - } - - /* - if(yaml->AccessControlInfo.AccessibleSaveDataIdsNum == 0){ - fprintf(stderr,"[EXHEADER ERROR] AccessibleSaveDataIds must be specified if UseExtendedSaveDataAccessControl is true.\n"); - return false; - } - */ - - if(yaml->AccessControlInfo.AccessibleSaveDataIdsNum > 6){ - fprintf(stderr,"[EXHEADER ERROR] Too many UniqueId in \"AccessibleSaveDataIds\".\n"); - return false; - } - - if(yaml->AccessControlInfo.UseExtSaveData){ - fprintf(stderr,"[EXHEADER ERROR] UseExtSaveData must be false if AccessibleSaveDataIds is specified.\n"); - return false; - } - if (yaml->AccessControlInfo.ExtSaveDataId){ - fprintf(stderr,"[EXHEADER ERROR] ExtSaveDataId is unavailable if AccessibleSaveDataIds is specified.\n"); - return false; - } - if (yaml->AccessControlInfo.OtherUserSaveDataId1){ - if(strtoul(yaml->AccessControlInfo.OtherUserSaveDataId1,NULL,0) > 0){ - fprintf(stderr,"[EXHEADER ERROR] OtherUserSaveDataId1 must be 0 if AccessibleSaveDataIds is specified.\n"); - return false; - } - } - if (yaml->AccessControlInfo.OtherUserSaveDataId2){ - if(strtoul(yaml->AccessControlInfo.OtherUserSaveDataId2,NULL,0) > 0){ - fprintf(stderr,"[EXHEADER ERROR] OtherUserSaveDataId2 must be 0 if AccessibleSaveDataIds is specified.\n"); - return false; - } - } - if (yaml->AccessControlInfo.OtherUserSaveDataId3){ - if(strtoul(yaml->AccessControlInfo.OtherUserSaveDataId3,NULL,0) > 0){ - fprintf(stderr,"[EXHEADER ERROR] OtherUserSaveDataId3 must be 0 if AccessibleSaveDataIds is specified.\n"); - return false; - } - } - return true; -} - -int SetARM11StorageInfoAccessibleSaveDataIds(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *yaml) -{ - u64 RegionExtSaveDataId = 0; - u64 RegionOtherUseSaveData = 0; - - if(yaml->AccessControlInfo.AccessibleSaveDataIdsNum > 0){ - u32 Max = yaml->AccessControlInfo.AccessibleSaveDataIdsNum < 3 ? yaml->AccessControlInfo.AccessibleSaveDataIdsNum : 3; - for(int i = 0; i < Max; i++){ - u32 UniqueID = 0xffffff & strtoul(yaml->AccessControlInfo.AccessibleSaveDataIds[i],NULL,0); - RegionOtherUseSaveData = RegionOtherUseSaveData << 20; - RegionOtherUseSaveData |= UniqueID; - } - } - if(yaml->AccessControlInfo.AccessibleSaveDataIdsNum > 3){ - for(int i = 3; i < yaml->AccessControlInfo.AccessibleSaveDataIdsNum; i++){ - u32 UniqueID = 0xffffff & strtoul(yaml->AccessControlInfo.AccessibleSaveDataIds[i],NULL,0); - RegionExtSaveDataId = RegionExtSaveDataId << 20; - RegionExtSaveDataId |= UniqueID; - } - } - - arm11->StorageInfo.OtherAttributes |= 1 << attribute_USE_EXTENDED_SAVEDATA_ACCESS_CONTROL; - - /* UseOtherVariationSaveData Flag */ - if(yaml->AccessControlInfo.UseOtherVariationSaveData){ - RegionOtherUseSaveData |= 0x1000000000000000; - } - - u64_to_u8(arm11->StorageInfo.ExtSaveDataId,RegionExtSaveDataId,LE); - u64_to_u8(arm11->StorageInfo.StorageAccessableUniqueIds,RegionOtherUseSaveData,LE); - return 0; -} - -int SetARM11ServiceAccessControl(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *yaml) -{ - if(yaml->AccessControlInfo.ServiceAccessControl){ - if(yaml->AccessControlInfo.ServiceAccessControlNum > 32){ - fprintf(stderr,"[EXHEADER ERROR] Too Many Service Names, maximum is 32\n"); - return EXHDR_BAD_YAML_OPT; - } - for(int i = 0; i < yaml->AccessControlInfo.ServiceAccessControlNum; i++){ - int svc_handle_len = strlen(yaml->AccessControlInfo.ServiceAccessControl[i]); - if(svc_handle_len > 8){ - fprintf(stderr,"[EXHEADER ERROR] Service Name: \"%s\" is too long\n",yaml->AccessControlInfo.ServiceAccessControl[i]); - return EXHDR_BAD_YAML_OPT; - } - memcpy(arm11->ServiceAccessControl[i],yaml->AccessControlInfo.ServiceAccessControl[i],svc_handle_len); - } - } - else{ - fprintf(stderr,"[EXHEADER ERROR] Parameter Not Found: \"AccessControlInfo/ServiceAccessControl\"\n"); - return EXHDR_BAD_YAML_OPT; - } - return 0; -} - -int get_ExHeaderARM11KernelInfo(exhdr_ARM11KernelCapabilities *arm11, rsf_settings *yaml) -{ - int result = 0; - ARM11KernelCapabilityDescriptor desc[6]; - memset(&desc,0,sizeof(ARM11KernelCapabilityDescriptor)*6); - - /* Get Descriptors */ - result = SetARM11KernelDescSysCallControl(&desc[0],yaml); - if(result) goto finish; - result = SetARM11KernelDescInteruptNumList(&desc[1],yaml); - if(result) goto finish; - result = SetARM11KernelDescAddressMapping(&desc[2],yaml); - if(result) goto finish; - result = SetARM11KernelDescOtherCapabilities(&desc[3],yaml); - if(result) goto finish; - result = SetARM11KernelDescHandleTableSize(&desc[4],yaml); - if(result) goto finish; - result = SetARM11KernelDescReleaseKernelVersion(&desc[5],yaml); - - /* Write Descriptors To Exheader */ - u16 TotalDesc = 0; - for(int i = 0; i < 6; i++){ - TotalDesc += desc[i].num; - } - if(TotalDesc >= 28){ - fprintf(stderr,"[EXHEADER ERROR] Too many Kernel Capabilities.\n"); - result = EXHDR_BAD_YAML_OPT; - goto finish; - } - u16 DescIndex = 0; - for(int i = 0; i < 6; i++){ - for(int j = 0; j < desc[i].num; j++){ - u32_to_u8(arm11->descriptors[DescIndex],desc[i].Data[j],LE); - DescIndex++; - } - } - - /* Fill Remaining Descriptors with 0xffffffff */ - for(int i = DescIndex; i < 28; i++){ - u32_to_u8(arm11->descriptors[i],0xffffffff,LE); - } - -finish: - for(int i = 0; i < 6; i++){ - free(desc[i].Data); - } - return result; -} - -int SetARM11KernelDescSysCallControl(ARM11KernelCapabilityDescriptor *desc, rsf_settings *yaml) -{ - int ret = 0; - - // Create Temporary Descriptor - ARM11KernelCapabilityDescriptor tmp; - memset(&tmp,0,sizeof(ARM11KernelCapabilityDescriptor)); - - AllocateARM11KernelDescMemory(&tmp,8); - for(int i = 0; i < 8; i++) - SetARM11KernelDescValue(&tmp,i,desc_SysCallControl | (i << 24)); - - // Get SysCalls - ret = GetARM11SysCalls(&tmp,yaml); - if(ret) goto finish; - - // Count Active Syscall Descs - u16 ActiveSysCallDesc = 0; - for(int i = 0; i < 8; i++) - if((tmp.Data[i] & 0x00ffffff) != 0) - ActiveSysCallDesc++; - - // Transfer Active Syscall Descs to out Descriptor - AllocateARM11KernelDescMemory(desc,ActiveSysCallDesc); - u16 SysCallDescPos = 0; - for(int i = 0; i < 8; i++){ - if((tmp.Data[i] & 0x00ffffff) != 0) { - SetARM11KernelDescValue(desc,SysCallDescPos,tmp.Data[i]); - SysCallDescPos++; - } - } - -finish: - // Free data in Temporary Descriptor - free(tmp.Data); - return ret; -} - -int GetARM11SysCalls(ARM11KernelCapabilityDescriptor *desc, rsf_settings *yaml) -{ - if(!yaml->AccessControlInfo.SystemCallAccess){ - fprintf(stderr,"[EXHEADER ERROR] Parameter not found: 'AccessControlInfo/SystemCallAccess'\n"); - return EXHDR_BAD_YAML_OPT; - } - for(int i = 0; i < yaml->AccessControlInfo.SystemCallAccessNum; i++){ - int SysCall = strtoul(yaml->AccessControlInfo.SystemCallAccess[i],NULL,0); - if(SysCall > 184){ - fprintf(stderr,"[EXHEADER ERROR] Unexpected Syscall: 0x%02x. Expected Range: 0x00 - 0xB8\n",SysCall); - return EXHDR_BAD_YAML_OPT; - } - EnableSystemCall(desc,SysCall); - } - - return 0; -} - -void EnableSystemCall(ARM11KernelCapabilityDescriptor *desc, int SysCall) -{ - int num = SysCall / 24; - int num1 = SysCall % 24; - desc->Data[num] |= 1 << (num1 & 31); -} - -void DisableSystemCall(ARM11KernelCapabilityDescriptor *desc, int SysCall) -{ - int num = SysCall / 24; - int num1 = SysCall % 24; - desc->Data[num] = desc->Data[num] & ~(1 << (num1 & 31)); -} - -int SetARM11KernelDescInteruptNumList(ARM11KernelCapabilityDescriptor *desc, rsf_settings *yaml) -{ - int ret = 0; - - // Create Temporary Descriptor - ARM11KernelCapabilityDescriptor tmp; - memset(&tmp,0,sizeof(ARM11KernelCapabilityDescriptor)); - - AllocateARM11KernelDescMemory(&tmp,8); - - // Get Interupts - ret = GetARM11Interupts(&tmp,yaml); - if(ret) goto finish; - - // Count Active Interupt Descs - u16 ActiveInteruptDesc = 0; - for(int i = 0; i < 8; i++) - if(tmp.Data[i]) - ActiveInteruptDesc++; - - // Transfer Active Interupt Descs to output Descriptor - AllocateARM11KernelDescMemory(desc,ActiveInteruptDesc); - u16 InteruptDescPos = 0; - for(int i = 0; i < 8; i++){ - if(tmp.Data[i]) { - SetARM11KernelDescValue(desc,InteruptDescPos,(tmp.Data[i] & 0x0fffffff) | desc_InteruptNumList); - InteruptDescPos++; - } - } - -finish: - // Free data in Temporary Descriptor - free(tmp.Data); - return ret; -} - -int GetARM11Interupts(ARM11KernelCapabilityDescriptor *desc, rsf_settings *yaml) -{ - if(!yaml->AccessControlInfo.InterruptNumbers){ - return 0; - } - if(yaml->AccessControlInfo.InterruptNumbersNum > 32){ - fprintf(stderr,"[EXHEADER ERROR] Too many Interupts. Maximum is 32\n"); - return EXHDR_BAD_YAML_OPT; - } - for(int i = 0; i < yaml->AccessControlInfo.InterruptNumbersNum; i++){ - int Interrupt = strtoul(yaml->AccessControlInfo.InterruptNumbers[i],NULL,0); - if(Interrupt > 0x7f){ - fprintf(stderr,"[EXHEADER ERROR] Unexpected Interupt: 0x%02x. Expected Range: 0x00 - 0x7f\n",Interrupt); - return EXHDR_BAD_YAML_OPT; - } - EnableInterupt(desc,Interrupt,i); - } - - return 0; -} - -void EnableInterupt(ARM11KernelCapabilityDescriptor *desc, int Interrupt, int i) -{ - int num = i / 4; - if(num*4 == i) desc->Data[num] |= 0xffffffff; - desc->Data[num] = desc->Data[num] << 7; - desc->Data[num] |= Interrupt; -} - -int SetARM11KernelDescAddressMapping(ARM11KernelCapabilityDescriptor *desc, rsf_settings *yaml) -{ - int ret = 0; - // Create Temporary Descriptors - ARM11KernelCapabilityDescriptor io_tmp; - memset(&io_tmp,0,sizeof(ARM11KernelCapabilityDescriptor)); - ARM11KernelCapabilityDescriptor static_tmp; - memset(&static_tmp,0,sizeof(ARM11KernelCapabilityDescriptor)); - - // Getting IO Mapping - ret = GetARM11IOMappings(&io_tmp,yaml); - if(ret) goto finish; - - // Getting Static Mapping - ret = GetARM11StaticMappings(&static_tmp,yaml); - if(ret) goto finish; - - - // Creating Output Descriptor and Combining the two MemMap Descriptors - AllocateARM11KernelDescMemory(desc,io_tmp.num+static_tmp.num); - u16 MemMapDescPos = 0; - for(int i = 0; i < io_tmp.num; i++){ - SetARM11KernelDescValue(desc,MemMapDescPos,io_tmp.Data[i]); - MemMapDescPos++; - } - for(int i = 0; i < static_tmp.num; i++){ - SetARM11KernelDescValue(desc,MemMapDescPos,static_tmp.Data[i]); - MemMapDescPos++; - } - -finish: - free(io_tmp.Data); - free(static_tmp.Data); - return ret; -} - -int GetARM11IOMappings(ARM11KernelCapabilityDescriptor *desc, rsf_settings *yaml) -{ - if(!yaml->AccessControlInfo.IORegisterMapping) - return 0; - - AllocateARM11KernelDescMemory(desc,yaml->AccessControlInfo.IORegisterMappingNum*2); - u16 DescUsed = 0; - for(int i = 0; i < yaml->AccessControlInfo.IORegisterMappingNum; i++){ - if(strlen(yaml->AccessControlInfo.IORegisterMapping[i])){ - // Parse Address String - char *AddressStartStr = yaml->AccessControlInfo.IORegisterMapping[i]; - char *AddressEndStr = strstr(AddressStartStr,"-"); - if(AddressEndStr){ - if(strlen(AddressEndStr) > 1) // if not just '-' - AddressEndStr = (AddressEndStr+1); // Setting the str to the expected start of address string - else - AddressEndStr = NULL; - } - - - u32 AddressStart = strtoul(AddressStartStr,NULL,16); - if(!IsStartAddress(AddressStart)){ - fprintf(stderr,"[EXHEADER ERROR] Address 0x%x is not valid mapping start address.\n",AddressStart); - return EXHDR_BAD_YAML_OPT; - } - if(!AddressEndStr){ // No End Addr Was Specified - SetARM11KernelDescValue(desc,DescUsed,GetIOMappingDesc(AddressStart)); - DescUsed++; - goto skip; - } - - u32 AddressEnd = strtoul(AddressEndStr,NULL,16); - if(!IsEndAddress(AddressEnd)){ - fprintf(stderr,"[EXHEADER ERROR] Address 0x%x is not valid mapping end address.\n",AddressEnd); - return EXHDR_BAD_YAML_OPT; - } - - u32 DescStartAddr = GetStaticMappingDesc(AddressStart,false); - u32 DescEndAddr = GetStaticMappingDesc(AddressEnd+0x1000,false); - if(DescStartAddr != DescEndAddr){ - SetARM11KernelDescValue(desc,DescUsed,DescStartAddr); - SetARM11KernelDescValue(desc,DescUsed+1,DescEndAddr); - DescUsed += 2; - goto skip; - } - else{ - SetARM11KernelDescValue(desc,DescUsed,GetIOMappingDesc(AddressStart)); - DescUsed++; - goto skip; - } - } - - skip: ; - } - desc->num = DescUsed; - return 0; -} - -int GetARM11StaticMappings(ARM11KernelCapabilityDescriptor *desc, rsf_settings *yaml) -{ - if(!yaml->AccessControlInfo.MemoryMapping) - return 0; - - AllocateARM11KernelDescMemory(desc,yaml->AccessControlInfo.MemoryMappingNum*2); - u16 DescUsed = 0; - for(int i = 0; i < yaml->AccessControlInfo.MemoryMappingNum; i++){ - if(strlen(yaml->AccessControlInfo.MemoryMapping[i])){ - char *AddressStartStr = yaml->AccessControlInfo.MemoryMapping[i]; - char *AddressEndStr = strstr(AddressStartStr,"-"); - char *ROFlagStr = strstr(AddressStartStr,":"); - bool IsRO = false; - if(ROFlagStr) - IsRO = strcasecmp(ROFlagStr,":r") == 0 ? true : false; - - if(AddressEndStr){ - if(strlen(AddressEndStr) > 1) { - AddressEndStr = (AddressEndStr+1); - if(AddressEndStr == ROFlagStr) - AddressEndStr = NULL; - } - else - AddressEndStr = NULL; - } - u32 AddressStart = strtoul(AddressStartStr,NULL,16); - if(!IsStartAddress(AddressStart)){ - fprintf(stderr,"[EXHEADER ERROR] Address 0x%x (%s) is not valid mapping start address.\n",AddressStart,AddressStartStr); - return EXHDR_BAD_YAML_OPT; - } - if(!AddressEndStr){ // No End Addr Was Specified - SetARM11KernelDescValue(desc,DescUsed,GetStaticMappingDesc(AddressStart,IsRO)); - SetARM11KernelDescValue(desc,DescUsed+1,GetStaticMappingDesc(AddressStart+0x1000, true)); - DescUsed += 2; - goto skip; - } - - u32 AddressEnd = strtoul(AddressEndStr,NULL,16); - if(!IsEndAddress(AddressEnd)){ - fprintf(stderr,"[EXHEADER ERROR] Address 0x%x (%s) is not valid mapping end address.\n",AddressEnd,AddressEndStr); - return EXHDR_BAD_YAML_OPT; - } - - u32 DescStartAddr = GetStaticMappingDesc(AddressStart,IsRO); - u32 DescEndAddr = GetStaticMappingDesc(AddressEnd+0x1000,true); - if(DescStartAddr != DescEndAddr){ - SetARM11KernelDescValue(desc,DescUsed,DescStartAddr); - SetARM11KernelDescValue(desc,DescUsed+1,DescEndAddr); - DescUsed += 2; - goto skip; - } - else{ - SetARM11KernelDescValue(desc,DescUsed,GetStaticMappingDesc(AddressStart,IsRO)); - SetARM11KernelDescValue(desc,DescUsed+1,GetStaticMappingDesc(AddressStart+0x1000, true)); - DescUsed += 2; - goto skip; - } - } - - skip: ; - } - desc->num = DescUsed; - return 0; -} - -bool IsEndAddress(u32 Address) -{ - return (Address & 0x0fff) == 0x0fff; -} - -bool IsStartAddress(u32 Address) -{ - return (Address & 0x0fff) == 0; -} - -u32 GetIOMappingDesc(u32 Address) -{ - return GetMappingDesc(Address,0xFFE,0xC,false); -} - -u32 GetStaticMappingDesc(u32 Address, bool IsReadOnly) -{ - return GetMappingDesc(Address,0x7FC,0xB,IsReadOnly); -} - -u32 GetMappingDesc(u32 Address, u32 PrefixVal, s32 numPrefixBits, bool IsRO) -{ - u32 PrefixMask = GetDescPrefixMask(numPrefixBits); - u32 PrefixBits = GetDescPrefixBits(numPrefixBits,PrefixVal); - u32 Desc = (Address >> 12 & ~PrefixMask) | PrefixBits; - if (IsRO) - Desc |= 0x100000; - return Desc; -} - -int SetARM11KernelDescOtherCapabilities(ARM11KernelCapabilityDescriptor *desc, rsf_settings *yaml) -{ - u32 OtherCapabilities = 0; - - if(!yaml->AccessControlInfo.DisableDebug) - OtherCapabilities |= 1 << othcap_PERMIT_DEBUG; - if(yaml->AccessControlInfo.EnableForceDebug) - OtherCapabilities |= 1 << othcap_FORCE_DEBUG; - if(yaml->AccessControlInfo.CanUseNonAlphabetAndNumber) - OtherCapabilities |= 1 << othcap_CAN_USE_NON_ALPHABET_AND_NUMBER; - if(yaml->AccessControlInfo.CanWriteSharedPage) - OtherCapabilities |= 1 << othcap_CAN_WRITE_SHARED_PAGE; - if(yaml->AccessControlInfo.CanUsePrivilegedPriority) - OtherCapabilities |= 1 << othcap_CAN_USE_PRIVILEGE_PRIORITY; - if(yaml->AccessControlInfo.PermitMainFunctionArgument) - OtherCapabilities |= 1 << othcap_PERMIT_MAIN_FUNCTION_ARGUMENT; - if(yaml->AccessControlInfo.CanShareDeviceMemory) - OtherCapabilities |= 1 << othcap_CAN_SHARE_DEVICE_MEMORY; - if(yaml->AccessControlInfo.RunnableOnSleep) - OtherCapabilities |= 1 << othcap_RUNNABLE_ON_SLEEP; - if(yaml->AccessControlInfo.SpecialMemoryArrange) - OtherCapabilities |= 1 << othcap_SPECIAL_MEMORY_ARRANGE; - - if(yaml->AccessControlInfo.MemoryType){ - u32 MemType = 0; - if(strcasecmp(yaml->AccessControlInfo.MemoryType,"application") == 0) - MemType = memtype_APPLICATION; - else if(strcasecmp(yaml->AccessControlInfo.MemoryType,"system") == 0) - MemType = memtype_SYSTEM; - else if(strcasecmp(yaml->AccessControlInfo.MemoryType,"base") == 0) - MemType = memtype_BASE; - else{ - fprintf(stderr,"[EXHEADER ERROR] Invalid memory type: '%s'\n",yaml->AccessControlInfo.MemoryType); - return EXHDR_BAD_YAML_OPT; - } - OtherCapabilities = (OtherCapabilities & 0xffffff0f) | MemType << 8; - } - - if(OtherCapabilities){ - AllocateARM11KernelDescMemory(desc,1); - SetARM11KernelDescBitmask(desc,desc_OtherCapabilities); - SetARM11KernelDescValue(desc,0,OtherCapabilities); - } - return 0; -} - -int SetARM11KernelDescHandleTableSize(ARM11KernelCapabilityDescriptor *desc, rsf_settings *yaml) -{ - if(yaml->AccessControlInfo.HandleTableSize){ - u16 HandleTableSize = strtoul(yaml->AccessControlInfo.HandleTableSize,NULL,0); - if(HandleTableSize > 1023){ - fprintf(stderr,"[EXHEADER ERROR] Too large handle table size\n"); - return EXHDR_BAD_YAML_OPT; - } - AllocateARM11KernelDescMemory(desc,1); - SetARM11KernelDescBitmask(desc,desc_HandleTableSize); - SetARM11KernelDescValue(desc,0,HandleTableSize); - } - else{ - fprintf(stderr,"[EXHEADER ERROR] Parameter Not Found: 'AccessControlInfo/HandleTableSize'\n"); - return EXHDR_BAD_YAML_OPT; - } - return 0; -} - -int SetARM11KernelDescReleaseKernelVersion(ARM11KernelCapabilityDescriptor *desc, rsf_settings *yaml) -{ - if(yaml->AccessControlInfo.ReleaseKernelMajor && yaml->AccessControlInfo.ReleaseKernelMinor){ - u32 releaseKernelMajor = strtoul(yaml->AccessControlInfo.ReleaseKernelMajor,NULL,0); - u32 releaseKernelMinor = strtoul(yaml->AccessControlInfo.ReleaseKernelMinor,NULL,0); - if (releaseKernelMajor > 255 || releaseKernelMinor > 255){ - fprintf(stderr,"[EXHEADER ERROR] Invalid release kernel version"); - } - AllocateARM11KernelDescMemory(desc,1); - SetARM11KernelDescBitmask(desc,desc_KernelReleaseVersion); - SetARM11KernelDescValue(desc,0,(releaseKernelMajor << 8 | releaseKernelMinor)); - } - return 0; -} - -void SetARM11KernelDescValue(ARM11KernelCapabilityDescriptor *desc, u16 Index, u32 Value) -{ - if(Index >= desc->num) return; - desc->Data[Index] |= Value; -} - -void SetARM11KernelDescBitmask(ARM11KernelCapabilityDescriptor *desc, u32 Bitmask) -{ - for(int i = 0; i < desc->num; i++) - SetARM11KernelDescValue(desc,i,Bitmask); -} - -void AllocateARM11KernelDescMemory(ARM11KernelCapabilityDescriptor *desc, u16 Num) -{ - if(Num == 0) return; - desc->num = Num; - desc->Data = malloc(sizeof(u32)*Num); - memset(desc->Data,0,sizeof(u32)*Num); - return; -} - -u32 GetDescPrefixMask(int numPrefixBits) -{ - return (u32)(~((1 << (32 - (numPrefixBits & 31))) - 1)); -} - -u32 GetDescPrefixBits(int numPrefixBits, u32 PrefixVal) -{ - return PrefixVal << (32 - (numPrefixBits & 31)); -} - -int get_ExHeaderARM9AccessControlInfo(exhdr_ARM9AccessControlInfo *arm9, rsf_settings *yaml) -{ - u32 Arm9AccessControl = 0; - for(int i = 0; i < yaml->AccessControlInfo.IoAccessControlNum; i++){ - if(strcmp(yaml->AccessControlInfo.IoAccessControl[i],"FsMountNand") == 0) - Arm9AccessControl |= 1 << arm9cap_FS_MOUNT_NAND; - else if(strcmp(yaml->AccessControlInfo.IoAccessControl[i],"FsMountNandRoWrite") == 0) - Arm9AccessControl |= 1 << arm9cap_FS_MOUNT_NAND_RO_WRITE; - else if(strcmp(yaml->AccessControlInfo.IoAccessControl[i],"FsMountTwln") == 0) - Arm9AccessControl |= 1 << arm9cap_FS_MOUNT_TWLN; - else if(strcmp(yaml->AccessControlInfo.IoAccessControl[i],"FsMountWnand") == 0) - Arm9AccessControl |= 1 << arm9cap_FS_MOUNT_WNAND; - else if(strcmp(yaml->AccessControlInfo.IoAccessControl[i],"FsMountCardSpi") == 0) - Arm9AccessControl |= 1 << arm9cap_FS_MOUNT_CARD_SPI; - else if(strcmp(yaml->AccessControlInfo.IoAccessControl[i],"UseSdif3") == 0) - Arm9AccessControl |= 1 << arm9cap_USE_SDIF3; - else if(strcmp(yaml->AccessControlInfo.IoAccessControl[i],"CreateSeed") == 0) - Arm9AccessControl |= 1 << arm9cap_CREATE_SEED; - else if(strcmp(yaml->AccessControlInfo.IoAccessControl[i],"UseCardSpi") == 0) - Arm9AccessControl |= 1 << arm9cap_USE_CARD_SPI; - else{ - fprintf(stderr,"[EXHEADER ERROR] Invalid IoAccessControl Name: '%s'\n",yaml->AccessControlInfo.IoAccessControl[i]); - return EXHDR_BAD_YAML_OPT; - } - } - - for(int i = 0; i < yaml->AccessControlInfo.FileSystemAccessNum; i++){ - if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"DirectSdmc") == 0) - Arm9AccessControl |= 1 << arm9cap_USE_DIRECT_SDMC; - } - - if(yaml->Option.UseOnSD) - Arm9AccessControl |= 1 << arm9cap_SD_APPLICATION; - - u32_to_u8(arm9->descriptors,Arm9AccessControl,LE); - - if(yaml->AccessControlInfo.DescVersion){ - arm9->descriptors[15] = strtol(yaml->AccessControlInfo.DescVersion,NULL,0); - } - else{ - fprintf(stderr,"[EXHEADER ERROR] Parameter Not Found: 'AccessControlInfo/DescVersion'\n"); - return EXHDR_BAD_YAML_OPT; - } - - return 0; -} - - - -int set_AccessDesc(exheader_settings *exhdrset, ncch_settings *ncchset) -{ - if(ncchset->keys->AccessDescSign.PresetType == not_preset){ - if(ncchset->yaml_set->CommonHeaderKey.Found) - return accessdesc_GetSignFromRsf(exhdrset,ncchset); - else if(!ncchset->keys->rsa.RequiresPresignedDesc) - return accessdesc_SignWithKey(exhdrset,ncchset); - else{ - fprintf(stderr,"[EXHEADER ERROR] Current keyset cannot sign AccessDesc, please appropriatly setup RSF, or specify a preset with -accessdesc\n"); - return CANNOT_SIGN_ACCESSDESC; - } - } - return accessdesc_GetSignFromPreset(exhdrset,ncchset); -} - -int accessdesc_SignWithKey(exheader_settings *exhdrset, ncch_settings *ncchset) -{ - /* Set RSA Keys */ - memcpy(ncchset->CxiRsaKey.PrivK,exhdrset->keys->rsa.CFA_Priv,0x100); - memcpy(ncchset->CxiRsaKey.PubK,exhdrset->keys->rsa.CFA_Pub,0x100); - memcpy(&exhdrset->ExHdr->AccessDescriptor.ncchpubkeymodulus,exhdrset->keys->rsa.CFA_Pub,0x100); - /* Copy Data From ExHeader */ - memcpy(&exhdrset->ExHdr->AccessDescriptor.ARM11SystemLocalCapabilities,&exhdrset->ExHdr->ARM11SystemLocalCapabilities,sizeof(exhdr_ARM11SystemLocalCapabilities)); - u8 *byte6 = &exhdrset->ExHdr->AccessDescriptor.ARM11SystemLocalCapabilities.Flags[6]; - u8 SystemMode = (*byte6>>4)&0xF; - u8 AffinityMask = (*byte6>>2)&0x3; - u8 IdealProcessor = ((*byte6>>0)&0x3)+1; - *byte6 = (u8)(SystemMode << 4 | AffinityMask << 2 | IdealProcessor); - - memcpy(&exhdrset->ExHdr->AccessDescriptor.ARM11KernelCapabilities,&exhdrset->ExHdr->ARM11KernelCapabilities,sizeof(exhdr_ARM11KernelCapabilities)); - memcpy(&exhdrset->ExHdr->AccessDescriptor.ARM9AccessControlInfo,&exhdrset->ExHdr->ARM9AccessControlInfo,sizeof(exhdr_ARM9AccessControlInfo)); - /* Sign AccessDesc */ - return SignAccessDesc(exhdrset->ExHdr,exhdrset->keys); -} - -int accessdesc_GetSignFromRsf(exheader_settings *exhdrset, ncch_settings *ncchset) -{ - /* Yaml Option Sanity Checks */ - if(!exhdrset->yaml->CommonHeaderKey.Found){ - fprintf(stderr,"[EXHEADER ERROR] RSF Section 'CommonHeaderKey' not found\n"); - return COMMON_HEADER_KEY_NOT_FOUND; - } - if(!exhdrset->yaml->CommonHeaderKey.D){ - fprintf(stderr,"[EXHEADER ERROR] 'CommonHeaderKey/D' not found\n"); - return COMMON_HEADER_KEY_NOT_FOUND; - } - if(strlen(exhdrset->yaml->CommonHeaderKey.D) != 350){ - fprintf(stderr,"[EXHEADER ERROR] 'CommonHeaderKey/D' has invalid length (%d)\n",strlen(exhdrset->yaml->CommonHeaderKey.D)); - return COMMON_HEADER_KEY_NOT_FOUND; - } - if(!exhdrset->yaml->CommonHeaderKey.Modulus){ - fprintf(stderr,"[EXHEADER ERROR] 'CommonHeaderKey/Modulus' not found\n"); - return COMMON_HEADER_KEY_NOT_FOUND; - } - if(strlen(exhdrset->yaml->CommonHeaderKey.Modulus) != 350){ - fprintf(stderr,"[EXHEADER ERROR] 'CommonHeaderKey/Modulus' has invalid length (%d)\n",strlen(exhdrset->yaml->CommonHeaderKey.Modulus)); - return COMMON_HEADER_KEY_NOT_FOUND; - } - if(!exhdrset->yaml->CommonHeaderKey.AccCtlDescSign){ - fprintf(stderr,"[EXHEADER ERROR] 'CommonHeaderKey/Signature' not found\n"); - return COMMON_HEADER_KEY_NOT_FOUND; - } - if(strlen(exhdrset->yaml->CommonHeaderKey.AccCtlDescSign) != 350){ - fprintf(stderr,"[EXHEADER ERROR] 'CommonHeaderKey/Signature' has invalid length (%d)\n",strlen(exhdrset->yaml->CommonHeaderKey.AccCtlDescSign)); - return COMMON_HEADER_KEY_NOT_FOUND; - } - if(!exhdrset->yaml->CommonHeaderKey.AccCtlDescBin){ - fprintf(stderr,"[EXHEADER ERROR] 'CommonHeaderKey/Descriptor' not found\n"); - return COMMON_HEADER_KEY_NOT_FOUND; - } - if(strlen(exhdrset->yaml->CommonHeaderKey.AccCtlDescBin) != 695){ - fprintf(stderr,"[EXHEADER ERROR] 'CommonHeaderKey/Descriptor' has invalid length (%d)\n",strlen(exhdrset->yaml->CommonHeaderKey.AccCtlDescBin)); - return COMMON_HEADER_KEY_NOT_FOUND; - } - /* Set RSA Keys */ - int result = 0; - u32 out = 0x500; - u8 *tmp = malloc(0x500); - result = base64_decode(tmp,&out,(const u8*)exhdrset->yaml->CommonHeaderKey.Modulus,strlen(exhdrset->yaml->CommonHeaderKey.Modulus)); - if(result) goto finish; - memcpy(ncchset->CxiRsaKey.PubK,tmp,0x100); - out = 0x500; - result = base64_decode(tmp,&out,(const u8*)exhdrset->yaml->CommonHeaderKey.D,strlen(exhdrset->yaml->CommonHeaderKey.D)); - if(result) goto finish; - memcpy(ncchset->CxiRsaKey.PrivK,tmp,0x100); - /* Set AccessDesc */ - out = 0x500; - result = base64_decode(tmp,&out,(const u8*)exhdrset->yaml->CommonHeaderKey.AccCtlDescSign,strlen(exhdrset->yaml->CommonHeaderKey.AccCtlDescSign)); - if(result) goto finish; - memcpy(exhdrset->ExHdr->AccessDescriptor.signature,tmp,0x100); - memcpy(exhdrset->ExHdr->AccessDescriptor.ncchpubkeymodulus,ncchset->CxiRsaKey.PubK,0x100); - out = 0x500; - result = base64_decode(tmp,&out,(const u8*)exhdrset->yaml->CommonHeaderKey.AccCtlDescBin,strlen(exhdrset->yaml->CommonHeaderKey.AccCtlDescBin)); - if(result) goto finish; - memcpy(&exhdrset->ExHdr->AccessDescriptor.ARM11SystemLocalCapabilities,tmp,0x200); -finish: - free(tmp); - return result; -} - -int accessdesc_GetSignFromPreset(exheader_settings *exhdrset, ncch_settings *ncchset) -{ - u8 *AccessDescSig = NULL; - u8 *AccessDescData = NULL; - u8 *DepList = NULL; - - u8 *CXI_Pubk = NULL; - u8 *CXI_Privk = NULL; - - if(ncchset->keys->AccessDescSign.PresetType == app){ - switch(ncchset->keys->AccessDescSign.TargetFirmware){ - case 1: - AccessDescSig = (u8*)App_sdk1_AcexSig; - AccessDescData = (u8*)App_sdk1_AcexData; - DepList = (u8*)sdk1_dep_list; - CXI_Pubk = (u8*)App_sdk1_HdrPubK; - CXI_Privk = (u8*)App_sdk1_HdrPrivK; - break; - case 2: - AccessDescSig = (u8*)App_sdk2_AcexSig; - AccessDescData = (u8*)App_sdk2_AcexData; - DepList = (u8*)sdk2_dep_list; - CXI_Pubk = (u8*)App_sdk2_HdrPubK; - CXI_Privk = (u8*)App_sdk2_HdrPrivK; - break; - case 4: - case 5: - AccessDescSig = (u8*)App_sdk4_AcexSig; - AccessDescData = (u8*)App_sdk4_AcexData; - DepList = (u8*)sdk4_dep_list; - CXI_Pubk = (u8*)App_sdk4_HdrPubK; - CXI_Privk = (u8*)App_sdk4_HdrPrivK; - break; - case 7: - AccessDescSig = NULL; - AccessDescData = (u8*)App_sdk7_AcexData; - DepList = (u8*)sdk7_dep_list; - CXI_Pubk = NULL; - CXI_Privk = NULL; - break; - - } - } - else if(ncchset->keys->AccessDescSign.PresetType == dlp){ - switch(ncchset->keys->AccessDescSign.TargetFirmware){ - case 1: - AccessDescSig = (u8*)Dlp_sdk1_AcexSig; - AccessDescData = (u8*)Dlp_sdk1_AcexData; - DepList = (u8*)sdk1_dep_list; - CXI_Pubk = (u8*)Dlp_sdk1_HdrPubK; - CXI_Privk = (u8*)Dlp_sdk1_HdrPrivK; - break; - case 2: - AccessDescSig = (u8*)Dlp_sdk2_AcexSig; - AccessDescData = (u8*)Dlp_sdk2_AcexData; - DepList = (u8*)sdk2_dep_list; - CXI_Pubk = (u8*)Dlp_sdk2_HdrPubK; - CXI_Privk = (u8*)Dlp_sdk2_HdrPrivK; - break; - case 4: - case 5: - AccessDescSig = (u8*)Dlp_sdk4_AcexSig; - AccessDescData = (u8*)Dlp_sdk4_AcexData; - DepList = (u8*)sdk4_dep_list; - CXI_Pubk = (u8*)Dlp_sdk4_HdrPubK; - CXI_Privk = (u8*)Dlp_sdk4_HdrPrivK; - break; - } - } - else if(ncchset->keys->AccessDescSign.PresetType == demo){ - switch(ncchset->keys->AccessDescSign.TargetFirmware){ - case 4: - case 5: - AccessDescSig = (u8*)Demo_sdk4_AcexSig; - AccessDescData = (u8*)Demo_sdk4_AcexData; - DepList = (u8*)sdk4_dep_list; - CXI_Pubk = (u8*)Demo_sdk4_HdrPubK; - CXI_Privk = (u8*)Demo_sdk4_HdrPrivK; - break; - } - } - - // Error Checking - if(!AccessDescData || !DepList){ - fprintf(stderr,"[EXHEADER ERROR] AccessDesc preset is unavailable, please configure RSF file\n"); - return CANNOT_SIGN_ACCESSDESC; - } - - if((!CXI_Pubk || !CXI_Privk || !AccessDescSig) && ncchset->keys->rsa.RequiresPresignedDesc){ - fprintf(stderr,"[EXHEADER ERROR] This AccessDesc preset needs to be signed, the current keyset is incapable of doing so. Please configure RSF file with the appropriate signature data.\n"); - return CANNOT_SIGN_ACCESSDESC; - } - - // Setting data in Exheader - // Dependency List - memcpy(exhdrset->ExHdr->DependencyList,DepList,0x180); - - // ARM11 Local Capabilities - exhdr_ARM11SystemLocalCapabilities *arm11local = (exhdr_ARM11SystemLocalCapabilities*)(AccessDescData); - // Backing Up Non Preset Details - u8 ProgramID[8]; - memcpy(ProgramID,exhdrset->ExHdr->ARM11SystemLocalCapabilities.ProgramId,8); - exhdr_StorageInfo StorageInfoBackup; - memcpy(&StorageInfoBackup,&exhdrset->ExHdr->ARM11SystemLocalCapabilities.StorageInfo,sizeof(exhdr_StorageInfo)); - - // Setting Preset Data - memcpy(&exhdrset->ExHdr->ARM11SystemLocalCapabilities,arm11local,sizeof(exhdr_ARM11SystemLocalCapabilities)); - - // Restoring Non Preset Data - memcpy(exhdrset->ExHdr->ARM11SystemLocalCapabilities.ProgramId,ProgramID,8); - memcpy(&exhdrset->ExHdr->ARM11SystemLocalCapabilities.StorageInfo,&StorageInfoBackup,sizeof(exhdr_StorageInfo)); - - // Adjusting flags to prevent errors - u8 *byte6 = &exhdrset->ExHdr->ARM11SystemLocalCapabilities.Flags[6]; - u8 SystemMode = (*byte6>>4)&0xF; - u8 AffinityMask = (*byte6>>2)&0x3; - u8 IdealProcessor = ((*byte6>>0)&0x3)-1; - *byte6 = (u8)(SystemMode << 4 | AffinityMask << 2 | IdealProcessor); - exhdrset->ExHdr->ARM11SystemLocalCapabilities.Flags[7] = 0x30; - - // ARM11 Kernel Capabilities - exhdr_ARM11KernelCapabilities *arm11kernel = (exhdr_ARM11KernelCapabilities*)(AccessDescData+sizeof(exhdr_ARM11SystemLocalCapabilities)); - memcpy(&exhdrset->ExHdr->ARM11KernelCapabilities,arm11kernel,(sizeof(exhdr_ARM11KernelCapabilities))); - - // ARM9 Access Control - exhdr_ARM9AccessControlInfo *arm9 = (exhdr_ARM9AccessControlInfo*)(AccessDescData+sizeof(exhdr_ARM11SystemLocalCapabilities)+sizeof(exhdr_ARM11KernelCapabilities)); - memcpy(&exhdrset->ExHdr->ARM9AccessControlInfo,arm9,(sizeof(exhdr_ARM9AccessControlInfo))); - - // Setting AccessDesc Area - // Signing normally if possible - if(!ncchset->keys->rsa.RequiresPresignedDesc) - return accessdesc_SignWithKey(exhdrset,ncchset); - - // Otherwise set static data & ncch hdr sig info - memcpy(ncchset->CxiRsaKey.PubK,CXI_Pubk,0x100); - memcpy(ncchset->CxiRsaKey.PrivK,CXI_Privk,0x100); - memcpy(&exhdrset->ExHdr->AccessDescriptor.signature,AccessDescSig,0x100); - memcpy(&exhdrset->ExHdr->AccessDescriptor.ncchpubkeymodulus,CXI_Pubk,0x100); - memcpy(&exhdrset->ExHdr->AccessDescriptor.ARM11SystemLocalCapabilities,AccessDescData,0x200); - - return 0; -} - -/* ExHeader Binary Print Functions */ -void exhdr_Print_ServiceAccessControl(ExtendedHeader_Struct *hdr) -{ - printf("[+] Service Access Control\n"); - for(int i = 0; i < 32; i ++){ - char *SVC_Handle = (char*)hdr->ARM11SystemLocalCapabilities.ServiceAccessControl[i]; - if(SVC_Handle[0] == 0) break; - printf("%.8s\n",hdr->ARM11SystemLocalCapabilities.ServiceAccessControl[i]); - } -} - -/* ExHeader Binary Read Functions */ -u8* GetAccessDescSig_frm_exhdr(ExtendedHeader_Struct *hdr) -{ - if(!hdr) return NULL; - return hdr->AccessDescriptor.signature ; -} - -u8* GetNcchHdrPubKey_frm_exhdr(ExtendedHeader_Struct *hdr) -{ - if(!hdr) return NULL; - return hdr->AccessDescriptor.ncchpubkeymodulus; -} - -u8* GetAccessDesc_frm_exhdr(ExtendedHeader_Struct *hdr) -{ - if(!hdr) return NULL; - return hdr->AccessDescriptor.ncchpubkeymodulus; -} - -u16 GetRemasterVersion_frm_exhdr(ExtendedHeader_Struct *hdr) -{ - return u8_to_u16(hdr->CodeSetInfo.Flags.remasterVersion,LE); -} - -u64 GetSaveDataSize_frm_exhdr(ExtendedHeader_Struct *hdr) -{ - return u8_to_u64(hdr->SystemInfo.SaveDataSize,LE); -} - -int GetCoreVersion_frm_exhdr(u8 *Dest, ExtendedHeader_Struct *hdr) -{ - return (int) memcpy(Dest,hdr->ARM11SystemLocalCapabilities.Flags,4); -} - -int GetDependancyList_frm_exhdr(u8 *Dest,ExtendedHeader_Struct *hdr) -{ - if(!Dest) return -1; - for(int i = 0; i < 0x30; i++){ - memcpy(Dest,hdr->DependencyList,0x30*8); - } - return 0; -} - -/* ExHeader Settings Read from Yaml */ -int GetSaveDataSize_yaml(u64 *SaveDataSize, user_settings *usrset) -{ - - if(usrset->yaml_set.Rom.SaveDataSize){ - *SaveDataSize = strtoull(usrset->yaml_set.Rom.SaveDataSize,NULL,10); - if(strstr(usrset->yaml_set.Rom.SaveDataSize,"K")){ - char *str = strstr(usrset->yaml_set.Rom.SaveDataSize,"K"); - if(strcmp(str,"K") == 0 || strcmp(str,"KB") == 0 ){ - *SaveDataSize = *SaveDataSize*KB; - } - } - else if(strstr(usrset->yaml_set.Rom.SaveDataSize,"M")){ - char *str = strstr(usrset->yaml_set.Rom.SaveDataSize,"M"); - if(strcmp(str,"M") == 0 || strcmp(str,"MB") == 0 ){ - *SaveDataSize = *SaveDataSize*MB; - } - } - else if(strstr(usrset->yaml_set.Rom.SaveDataSize,"G")){ - char *str = strstr(usrset->yaml_set.Rom.SaveDataSize,"G"); - if(strcmp(str,"G") == 0 || strcmp(str,"GB") == 0 ){ - *SaveDataSize = *SaveDataSize*GB; - } - } - else{ - fprintf(stderr,"[EXHEADER ERROR] Invalid save data size format.\n"); - return EXHDR_BAD_YAML_OPT; - } - if((*SaveDataSize & 65536) != 0){ - fprintf(stderr,"[EXHEADER ERROR] Save data size must be aligned to 64K.\n"); - return EXHDR_BAD_YAML_OPT; - } - } - else{ - *SaveDataSize = 0; - } - return 0; -} - -int GetRemasterVersion_yaml(u16 *RemasterVersion, user_settings *usrset) -{ - char *Str = usrset->yaml_set.SystemControlInfo.RemasterVersion; - if(!Str){ - *RemasterVersion = 0; - return 0; - } - *RemasterVersion = strtol(Str,NULL,0); - return 0; -} diff --git a/exheader.h b/exheader.h deleted file mode 100644 index d606995..0000000 --- a/exheader.h +++ /dev/null @@ -1,233 +0,0 @@ -#ifndef _EXHEADER_H_ -#define _EXHEADER_H_ - -typedef enum -{ - COMMON_HEADER_KEY_NOT_FOUND = -10, - EXHDR_BAD_YAML_OPT = -11, - CANNOT_SIGN_ACCESSDESC = -12 -} exheader_errors; - -typedef enum -{ - ExeFsCodeCompress = 1, - RetailSDAppFlag = 2, -} SystemInfoFlags_Flagbitmask; - -typedef enum -{ - memtype_APPLICATION = 1, - memtype_SYSTEM = 2, - memtype_BASE = 3 -} MemoryTypeName; - -typedef enum -{ - processtype_DEFAULT = -1, - processtype_SYSTEM = 0, - processtype_APPLICATION = 1 -} ProcessTypeName; - -typedef enum -{ - resrc_limit_APPLICATION, - resrc_limit_SYS_APPLET, - resrc_limit_LIB_APPLET, - resrc_limit_OTHER -} ResourceLimitCategoryName; - -typedef enum -{ - othcap_PERMIT_DEBUG, - othcap_FORCE_DEBUG, - othcap_CAN_USE_NON_ALPHABET_AND_NUMBER, - othcap_CAN_WRITE_SHARED_PAGE, - othcap_CAN_USE_PRIVILEGE_PRIORITY, - othcap_PERMIT_MAIN_FUNCTION_ARGUMENT, - othcap_CAN_SHARE_DEVICE_MEMORY, - othcap_RUNNABLE_ON_SLEEP, - othcap_SPECIAL_MEMORY_ARRANGE = 12, -} OtherCapabilities_Flagbitmask; - -typedef enum -{ - fsaccess_CATEGORY_SYSTEM_APPLICATION, - fsaccess_CATEGORY_HARDWARE_CHECK, - fsaccess_CATEGORY_FILE_SYSTEM_TOOL, - fsaccess_DEBUG, - fsaccess_TWL_CARD_BACKUP, - fsaccess_TWL_NAND_DATA, - fsaccess_BOSS, - fsaccess_DIRECT_SDMC, - fsaccess_CORE, - fsaccess_CTR_NAND_RO, - fsaccess_CTR_NAND_RW, - fsaccess_CTR_NAND_RO_WRITE, - fsaccess_CATEGORY_SYSTEM_SETTINGS, - fsaccess_CARD_BOARD, - fsaccess_EXPORT_IMPORT_IVS, - fsaccess_DIRECT_SDMC_WRITE, - fsaccess_SWITCH_CLEANUP, - fsaccess_SAVE_DATA_MOVE, - fsaccess_SHOP, - fsaccess_SHELL, - fsaccess_CATEGORY_HOME_MENU -} FileSystemAccess; - -typedef enum -{ - attribute_NOT_USE_ROMFS, - attribute_USE_EXTENDED_SAVEDATA_ACCESS_CONTROL -} AttributeName; - -typedef enum -{ - arm9cap_FS_MOUNT_NAND, - arm9cap_FS_MOUNT_NAND_RO_WRITE, - arm9cap_FS_MOUNT_TWLN, - arm9cap_FS_MOUNT_WNAND, - arm9cap_FS_MOUNT_CARD_SPI, - arm9cap_USE_SDIF3, - arm9cap_CREATE_SEED, - arm9cap_USE_CARD_SPI, - arm9cap_SD_APPLICATION, - arm9cap_USE_DIRECT_SDMC -} Arm9Capability; - -typedef struct -{ - u8 reserved[5]; - u8 flag; - u8 remasterVersion[2]; // le u16 -} exhdr_SystemInfoFlags; - -typedef struct -{ - u8 Address[4]; // le u32 - u8 NumMaxPages[4]; // le u32 - u8 CodeSize[4]; // le u32 -} exhdr_CodeSegmentInfo; - -typedef struct -{ - u8 Name[8]; - exhdr_SystemInfoFlags Flags; - exhdr_CodeSegmentInfo TextSectionInfo; - u8 StackSize[4]; // le u32 - exhdr_CodeSegmentInfo ReadOnlySectionInfo; - u8 Reserved[4]; - exhdr_CodeSegmentInfo DataSectionInfo; - u8 BssSize[4]; // le u32 -} exhdr_CodeSetInfo; - -typedef struct -{ - u8 SaveDataSize[8]; - u8 JumpId[8]; - u8 Reserved[0x30]; -} exhdr_SystemInfo; - -typedef struct -{ - u8 ExtSaveDataId[8]; - u8 SystemSaveDataId[8]; - u8 StorageAccessableUniqueIds[8]; - u8 AccessInfo[7]; - u8 OtherAttributes; -} exhdr_StorageInfo; - -typedef struct -{ - u8 ProgramId[8]; - u8 Flags[8]; - u8 ResourceLimitDescriptor[16][2]; - exhdr_StorageInfo StorageInfo; - u8 ServiceAccessControl[32][8]; // Those char[8] svc handles - u8 Reserved1[0x1f]; - u8 ResourceLimitCategory; -} exhdr_ARM11SystemLocalCapabilities; - -typedef struct -{ - u16 num; - u32 *Data; -} ARM11KernelCapabilityDescriptor; - -typedef enum -{ - desc_InteruptNumList = 0xe0000000, - desc_SysCallControl = 0xf0000000, - desc_KernelReleaseVersion = 0xfc000000, - desc_HandleTableSize = 0xfe000000, - desc_OtherCapabilities = 0xff000000, - desc_MappingStatic = 0xff800000, - desc_MappingIO = 0xffc00000, -} ARM11KernelCapabilityDescriptorBitmask; - -typedef struct -{ - u8 descriptors[28][4];// Descripters are a collection of u32s, with bitmask idents so they can be identified, 'no matter the pos' - u8 reserved[0x10]; -} exhdr_ARM11KernelCapabilities; - -typedef struct -{ - u8 descriptors[16]; //descriptors[15] = DescVersion -} exhdr_ARM9AccessControlInfo; - -typedef struct -{ - // systemcontrol info { - // coreinfo { - exhdr_CodeSetInfo CodeSetInfo; - u8 DependencyList[0x30][8]; - // } - exhdr_SystemInfo SystemInfo; - // } - // accesscontrolinfo { - exhdr_ARM11SystemLocalCapabilities ARM11SystemLocalCapabilities; - exhdr_ARM11KernelCapabilities ARM11KernelCapabilities; - exhdr_ARM9AccessControlInfo ARM9AccessControlInfo; - // } - struct { - u8 signature[0x100]; - u8 ncchpubkeymodulus[0x100]; - exhdr_ARM11SystemLocalCapabilities ARM11SystemLocalCapabilities; - exhdr_ARM11KernelCapabilities ARM11KernelCapabilities; - exhdr_ARM9AccessControlInfo ARM9AccessControlInfo; - } AccessDescriptor; -} ExtendedHeader_Struct; - -typedef struct -{ - keys_struct *keys; - rsf_settings *yaml; - bool UseAccessDescPreset; - - /* Output */ - ExtendedHeader_Struct *ExHdr; // is the exheader output buffer ptr(in ncchset) cast as exheader struct ptr; -} exheader_settings; - -#endif -/* ExHeader Signature Functions */ -int SignAccessDesc(ExtendedHeader_Struct *ExHdr, keys_struct *keys); -int CheckAccessDescSignature(ExtendedHeader_Struct *ExHdr, keys_struct *keys); - -/* ExHeader Build Functions */ -int BuildExHeader(ncch_settings *ncchset); - -/* ExHeader Binary Print Functions */ -void exhdr_Print_ServiceAccessControl(ExtendedHeader_Struct *hdr); - -/* ExHeader Binary Read Functions */ -u8* GetAccessDescSig_frm_exhdr(ExtendedHeader_Struct *hdr); -u8* GetNcchHdrPubKey_frm_exhdr(ExtendedHeader_Struct *hdr); -u8* GetAccessDesc_frm_exhdr(ExtendedHeader_Struct *hdr); -u16 GetRemasterVersion_frm_exhdr(ExtendedHeader_Struct *hdr); -u64 GetSaveDataSize_frm_exhdr(ExtendedHeader_Struct *hdr); -int GetDependancyList_frm_exhdr(u8 *Dest,ExtendedHeader_Struct *hdr); -int GetCoreVersion_frm_exhdr(u8 *Dest, ExtendedHeader_Struct *hdr); - -/* ExHeader Settings Read from Yaml */ -int GetSaveDataSize_yaml(u64 *SaveDataSize, user_settings *usrset); -int GetRemasterVersion_yaml(u16 *RemasterVersion, user_settings *usrset); \ No newline at end of file diff --git a/keys_common.h b/keys_common.h deleted file mode 100644 index 2a83f1e..0000000 --- a/keys_common.h +++ /dev/null @@ -1,83 +0,0 @@ -#ifndef _KEYS_COMMON_H_ -#define _KEYS_COMMON_H_ - -// AES KEYS -static const unsigned char zeros_fixed_aesKey[16] = //zeros_fixed_aesKey -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -// RSA KEYS -static const unsigned char Dummy_rsa_privExp[256] = //Dummy_rsa_privExp -{ - 0xE3, 0xC6, 0x76, 0x57, 0x2E, 0xCB, 0xA5, 0xE6, - 0x0C, 0x01, 0xBD, 0x5C, 0x32, 0x2D, 0x90, 0xE0, - 0xFF, 0x9A, 0x80, 0xE8, 0x66, 0x8D, 0x84, 0xDC, - 0xF7, 0x75, 0x5F, 0x3F, 0x98, 0x7C, 0x97, 0x40, - 0x20, 0x21, 0xB7, 0x24, 0xC0, 0x61, 0x2D, 0x83, - 0xB0, 0x91, 0x8E, 0xE3, 0xC2, 0xD0, 0x2C, 0xA1, - 0x2C, 0x99, 0x4F, 0x48, 0xF7, 0x4E, 0x13, 0xD3, - 0x01, 0x71, 0x25, 0x9B, 0x3C, 0x75, 0x7C, 0xC4, - 0xE5, 0x89, 0x7E, 0xDA, 0xF9, 0x99, 0x5C, 0x83, - 0xE4, 0xDD, 0x36, 0x62, 0x5B, 0x0E, 0x12, 0x91, - 0xD6, 0x39, 0x45, 0x69, 0x62, 0x20, 0xCA, 0xF4, - 0xBA, 0x6B, 0x28, 0x1A, 0x7C, 0xBF, 0xB9, 0x97, - 0x37, 0x46, 0xC2, 0x7A, 0xCF, 0x10, 0x68, 0xC2, - 0xC9, 0xF1, 0x48, 0xDA, 0x8A, 0x2F, 0x4C, 0xBC, - 0x3B, 0x1C, 0xB8, 0x8F, 0x04, 0x7F, 0xFD, 0x9D, - 0xE2, 0x0A, 0xD2, 0x09, 0x39, 0xC7, 0xD9, 0x81, - 0x59, 0x17, 0x73, 0xB2, 0xEC, 0xEB, 0x36, 0x67, - 0xA5, 0xA8, 0xD5, 0x71, 0xD9, 0x38, 0x6A, 0xD1, - 0x28, 0xB9, 0x46, 0x85, 0x3A, 0x81, 0x85, 0x4E, - 0x55, 0xA7, 0x74, 0x79, 0xBB, 0xC5, 0x97, 0xF7, - 0xEF, 0xE0, 0x81, 0x20, 0xE0, 0xEA, 0x45, 0x8F, - 0xED, 0x70, 0x8E, 0xD6, 0xFF, 0x49, 0xCF, 0x7F, - 0xF2, 0xFF, 0x22, 0x20, 0x3F, 0xE9, 0x92, 0x99, - 0xDE, 0x81, 0xD6, 0x27, 0xF7, 0xB8, 0x3A, 0x1D, - 0x4F, 0xA2, 0x50, 0xFB, 0xA5, 0xE7, 0x98, 0x08, - 0xB5, 0x2B, 0xA2, 0x94, 0xA9, 0x17, 0x1A, 0xA8, - 0x34, 0xF6, 0x5E, 0x24, 0x2D, 0x40, 0x2F, 0xCB, - 0x3C, 0xB0, 0xF8, 0x7E, 0x84, 0xB4, 0x87, 0x82, - 0x19, 0xAF, 0x87, 0xB6, 0xFA, 0xA9, 0x67, 0x27, - 0x07, 0x28, 0xBA, 0x2E, 0xA5, 0x8E, 0xDD, 0xE5, - 0xD4, 0xFD, 0x06, 0x09, 0xDF, 0xBD, 0x87, 0x95, - 0x95, 0x25, 0x05, 0x5E, 0xB2, 0x00, 0x18, 0x41 -}; - -static const unsigned char Dummy_rsa_pubMod[256] = //Dummy_rsa_pubMod -{ - 0xE6, 0x64, 0x06, 0x6C, 0x49, 0x6B, 0xEC, 0xEE, - 0x59, 0xAE, 0x11, 0x92, 0xF1, 0x03, 0x43, 0x87, - 0x8E, 0xEB, 0x4D, 0x70, 0xA9, 0x71, 0xB4, 0x6D, - 0x25, 0x19, 0x02, 0x4A, 0x9E, 0x4D, 0xA3, 0x10, - 0xFD, 0xB2, 0x27, 0x56, 0xA3, 0xFB, 0xDD, 0xE5, - 0xE4, 0x4E, 0xE0, 0x62, 0x8F, 0xC3, 0x2E, 0xEE, - 0x8F, 0x9D, 0x4D, 0x6E, 0x00, 0xDB, 0x88, 0x49, - 0xA2, 0xFC, 0x30, 0xFE, 0x94, 0xF3, 0x06, 0x92, - 0x75, 0x61, 0x11, 0x1D, 0x24, 0x07, 0xE9, 0x12, - 0xB6, 0xB1, 0x57, 0xF5, 0xDC, 0x01, 0xF7, 0x54, - 0xBF, 0xC3, 0xAC, 0x8C, 0x73, 0x2C, 0x73, 0x17, - 0x8E, 0xBF, 0x2F, 0x68, 0x3C, 0x61, 0x75, 0x32, - 0x15, 0x39, 0x93, 0xDD, 0xBA, 0x12, 0x42, 0xD3, - 0x25, 0x85, 0xFA, 0xA6, 0x4B, 0xAF, 0x81, 0x4B, - 0xCA, 0xD2, 0x9C, 0xF1, 0x3D, 0x37, 0xAE, 0xB9, - 0xFD, 0x77, 0x59, 0x78, 0xB9, 0x32, 0x95, 0x19, - 0xD1, 0x47, 0xE1, 0xC6, 0xE1, 0x16, 0x13, 0x5D, - 0xCC, 0x99, 0x31, 0x63, 0xAD, 0xBB, 0xA5, 0x4F, - 0xE4, 0x41, 0x67, 0xFD, 0x7F, 0x1E, 0xA8, 0x9A, - 0x35, 0x65, 0xEB, 0xC4, 0x4D, 0xD4, 0xC4, 0x29, - 0x0F, 0x40, 0x95, 0xFD, 0x8A, 0x30, 0x67, 0x79, - 0xFB, 0xD4, 0x76, 0x6F, 0xD1, 0xDE, 0x8C, 0x72, - 0x32, 0x05, 0x97, 0x5A, 0x26, 0x0D, 0x37, 0xCA, - 0x12, 0x2C, 0xDC, 0x14, 0x3F, 0xD3, 0x59, 0x00, - 0x66, 0xD2, 0x8E, 0xF5, 0x6E, 0x22, 0x08, 0x63, - 0x59, 0xB5, 0x3F, 0xBB, 0x3A, 0x4D, 0xD4, 0xD1, - 0xC1, 0x21, 0xA7, 0x4D, 0x02, 0x96, 0x08, 0xF5, - 0x2B, 0x11, 0xE5, 0x85, 0xD2, 0x6E, 0x91, 0xD6, - 0x8F, 0x77, 0x72, 0xEF, 0x37, 0xE3, 0x79, 0x19, - 0xA9, 0xEE, 0x58, 0x5D, 0x52, 0x9B, 0x2D, 0x47, - 0x7D, 0x27, 0xB8, 0xC3, 0x76, 0xCA, 0xDA, 0xC2, - 0xF4, 0xFC, 0xF4, 0x53, 0x7C, 0xD8, 0x43, 0x87 -}; -#endif \ No newline at end of file diff --git a/keys_debug.h b/keys_debug.h deleted file mode 100644 index ee5ba02..0000000 --- a/keys_debug.h +++ /dev/null @@ -1,805 +0,0 @@ -#ifndef _KEYS_DEBUG_H_ -#define _KEYS_DEBUG_H_ - -static const unsigned char system_fixed_aesKey[16] = //system_fixed_aesKey -{ - 0x52, 0x7C, 0xE6, 0x30, 0xA9, 0xCA, 0x30, 0x5F, - 0x36, 0x96, 0xF3, 0xCD, 0xE9, 0x54, 0x19, 0x4B -}; - -static const unsigned char ctr_aes_common_key_dev0[16] = //ctr_aes_common_key_dev0 -{ - 0x55, 0xA3, 0xF8, 0x72, 0xBD, 0xC8, 0x0C, 0x55, - 0x5A, 0x65, 0x43, 0x81, 0x13, 0x9E, 0x15, 0x3B -}; - -static const unsigned char ctr_aes_common_key_dev1[16] = //ctr_aes_common_key_dev1 -{ - 0x44, 0x34, 0xED, 0x14, 0x82, 0x0C, 0xA1, 0xEB, - 0xAB, 0x82, 0xC1, 0x6E, 0x7B, 0xEF, 0x0C, 0x25 -}; - -static const unsigned char common_dpki_aesKey[16] = //common_dpki_aesKey a.k.a. DSi DevCommonKey -{ - 0xA1, 0x60, 0x4A, 0x6A, 0x71, 0x23, 0xB5, 0x29, - 0xAE, 0x8B, 0xEC, 0x32, 0xC8, 0x16, 0xFC, 0xAA -}; - -//ECC Keys - -static const unsigned char xs_dpki_eccPubKey[60] = //xs_dpki_eccPubKey -{ - 0x01, 0xD5, 0xA2, 0x3C, 0xE8, 0xE9, 0xDF, 0x8C, - 0x0A, 0xA5, 0xAA, 0xE1, 0x76, 0xE1, 0x24, 0x7C, - 0x90, 0x97, 0xA6, 0xFE, 0x2A, 0xD3, 0x8C, 0xB4, - 0xDE, 0x74, 0x32, 0xDE, 0x5B, 0x84, 0x01, 0xAC, - 0xB2, 0x13, 0x71, 0x9D, 0x4B, 0x9C, 0xEB, 0xD4, - 0x13, 0xC2, 0x27, 0x66, 0xC5, 0x5F, 0x83, 0x97, - 0xC4, 0x83, 0xA3, 0x9E, 0x3B, 0xFC, 0xE8, 0xA9, - 0xB5, 0x10, 0x3A, 0x7B -}; - -//RSA Keys - -static const unsigned char dev_cert_root_rsa_pubk[0x200] = -{ - 0xD0, 0x1F, 0xE1, 0x00, 0xD4, 0x35, 0x56, 0xB2, - 0x4B, 0x56, 0xDA, 0xE9, 0x71, 0xB5, 0xA5, 0xD3, - 0x84, 0xB9, 0x30, 0x03, 0xBE, 0x1B, 0xBF, 0x28, - 0xA2, 0x30, 0x5B, 0x06, 0x06, 0x45, 0x46, 0x7D, - 0x5B, 0x02, 0x51, 0xD2, 0x56, 0x1A, 0x27, 0x4F, - 0x9E, 0x9F, 0x9C, 0xEC, 0x64, 0x61, 0x50, 0xAB, - 0x3D, 0x2A, 0xE3, 0x36, 0x68, 0x66, 0xAC, 0xA4, - 0xBA, 0xE8, 0x1A, 0xE3, 0xD7, 0x9A, 0xA6, 0xB0, - 0x4A, 0x8B, 0xCB, 0xA7, 0xE6, 0xFB, 0x64, 0x89, - 0x45, 0xEB, 0xDF, 0xDB, 0x85, 0xBA, 0x09, 0x1F, - 0xD7, 0xD1, 0x14, 0xB5, 0xA3, 0xA7, 0x80, 0xE3, - 0xA2, 0x2E, 0x6E, 0xCD, 0x87, 0xB5, 0xA4, 0xC6, - 0xF9, 0x10, 0xE4, 0x03, 0x22, 0x08, 0x81, 0x4B, - 0x0C, 0xEE, 0xA1, 0xA1, 0x7D, 0xF7, 0x39, 0x69, - 0x5F, 0x61, 0x7E, 0xF6, 0x35, 0x28, 0xDB, 0x94, - 0x96, 0x37, 0xA0, 0x56, 0x03, 0x7F, 0x7B, 0x32, - 0x41, 0x38, 0x95, 0xC0, 0xA8, 0xF1, 0x98, 0x2E, - 0x15, 0x65, 0xE3, 0x8E, 0xED, 0xC2, 0x2E, 0x59, - 0x0E, 0xE2, 0x67, 0x7B, 0x86, 0x09, 0xF4, 0x8C, - 0x2E, 0x30, 0x3F, 0xBC, 0x40, 0x5C, 0xAC, 0x18, - 0x04, 0x2F, 0x82, 0x20, 0x84, 0xE4, 0x93, 0x68, - 0x03, 0xDA, 0x7F, 0x41, 0x34, 0x92, 0x48, 0x56, - 0x2B, 0x8E, 0xE1, 0x2F, 0x78, 0xF8, 0x03, 0x24, - 0x63, 0x30, 0xBC, 0x7B, 0xE7, 0xEE, 0x72, 0x4A, - 0xF4, 0x58, 0xA4, 0x72, 0xE7, 0xAB, 0x46, 0xA1, - 0xA7, 0xC1, 0x0C, 0x2F, 0x18, 0xFA, 0x07, 0xC3, - 0xDD, 0xD8, 0x98, 0x06, 0xA1, 0x1C, 0x9C, 0xC1, - 0x30, 0xB2, 0x47, 0xA3, 0x3C, 0x8D, 0x47, 0xDE, - 0x67, 0xF2, 0x9E, 0x55, 0x77, 0xB1, 0x1C, 0x43, - 0x49, 0x3D, 0x5B, 0xBA, 0x76, 0x34, 0xA7, 0xE4, - 0xE7, 0x15, 0x31, 0xB7, 0xDF, 0x59, 0x81, 0xFE, - 0x24, 0xA1, 0x14, 0x55, 0x4C, 0xBD, 0x8F, 0x00, - 0x5C, 0xE1, 0xDB, 0x35, 0x08, 0x5C, 0xCF, 0xC7, - 0x78, 0x06, 0xB6, 0xDE, 0x25, 0x40, 0x68, 0xA2, - 0x6C, 0xB5, 0x49, 0x2D, 0x45, 0x80, 0x43, 0x8F, - 0xE1, 0xE5, 0xA9, 0xED, 0x75, 0xC5, 0xED, 0x45, - 0x1D, 0xCE, 0x78, 0x94, 0x39, 0xCC, 0xC3, 0xBA, - 0x28, 0xA2, 0x31, 0x2A, 0x1B, 0x87, 0x19, 0xEF, - 0x0F, 0x73, 0xB7, 0x13, 0x95, 0x0C, 0x02, 0x59, - 0x1A, 0x74, 0x62, 0xA6, 0x07, 0xF3, 0x7C, 0x0A, - 0xA7, 0xA1, 0x8F, 0xA9, 0x43, 0xA3, 0x6D, 0x75, - 0x2A, 0x5F, 0x41, 0x92, 0xF0, 0x13, 0x61, 0x00, - 0xAA, 0x9C, 0xB4, 0x1B, 0xBE, 0x14, 0xBE, 0xB1, - 0xF9, 0xFC, 0x69, 0x2F, 0xDF, 0xA0, 0x94, 0x46, - 0xDE, 0x5A, 0x9D, 0xDE, 0x2C, 0xA5, 0xF6, 0x8C, - 0x1C, 0x0C, 0x21, 0x42, 0x92, 0x87, 0xCB, 0x2D, - 0xAA, 0xA3, 0xD2, 0x63, 0x75, 0x2F, 0x73, 0xE0, - 0x9F, 0xAF, 0x44, 0x79, 0xD2, 0x81, 0x74, 0x29, - 0xF6, 0x98, 0x00, 0xAF, 0xDE, 0x6B, 0x59, 0x2D, - 0xC1, 0x98, 0x82, 0xBD, 0xF5, 0x81, 0xCC, 0xAB, - 0xF2, 0xCB, 0x91, 0x02, 0x9E, 0xF3, 0x5C, 0x4C, - 0xFD, 0xBB, 0xFF, 0x49, 0xC1, 0xFA, 0x1B, 0x2F, - 0xE3, 0x1D, 0xE7, 0xA5, 0x60, 0xEC, 0xB4, 0x7E, - 0xBC, 0xFE, 0x32, 0x42, 0x5B, 0x95, 0x6F, 0x81, - 0xB6, 0x99, 0x17, 0x48, 0x7E, 0x3B, 0x78, 0x91, - 0x51, 0xDB, 0x2E, 0x78, 0xB1, 0xFD, 0x2E, 0xBE, - 0x7E, 0x62, 0x6B, 0x3E, 0xA1, 0x65, 0xB4, 0xFB, - 0x00, 0xCC, 0xB7, 0x51, 0xAF, 0x50, 0x73, 0x29, - 0xC4, 0xA3, 0x93, 0x9E, 0xA6, 0xDD, 0x9C, 0x50, - 0xA0, 0xE7, 0x38, 0x6B, 0x01, 0x45, 0x79, 0x6B, - 0x41, 0xAF, 0x61, 0xF7, 0x85, 0x55, 0x94, 0x4F, - 0x3B, 0xC2, 0x2D, 0xC3, 0xBD, 0x0D, 0x00, 0xF8, - 0x79, 0x8A, 0x42, 0xB1, 0xAA, 0xA0, 0x83, 0x20, - 0x65, 0x9A, 0xC7, 0x39, 0x5A, 0xB4, 0xF3, 0x29 -}; - -static const unsigned char cpA_dpki_rsa_privExp[256] = //cpA_dpki_rsa_privExp -{ - 0x28, 0xCE, 0xDC, 0x39, 0x02, 0x7F, 0x3E, 0x8E, - 0xAA, 0xB7, 0x59, 0x11, 0xE0, 0x68, 0xBF, 0x80, - 0xA6, 0x44, 0x77, 0xDB, 0x1B, 0xA2, 0x50, 0xA3, - 0x69, 0xE5, 0x96, 0xB2, 0xC4, 0xCA, 0x7A, 0x35, - 0x0D, 0xFC, 0x4A, 0xB2, 0xFB, 0xC0, 0x18, 0xA5, - 0x30, 0xB4, 0x9D, 0x10, 0x44, 0xD1, 0xAD, 0x33, - 0xFD, 0x15, 0xA7, 0x8D, 0x0F, 0x17, 0xD5, 0xA4, - 0xF5, 0x5E, 0x7F, 0x33, 0xF6, 0x80, 0x04, 0x27, - 0x6A, 0xEA, 0x9C, 0xEE, 0x68, 0x04, 0x1A, 0xA5, - 0xD4, 0x35, 0xA2, 0x25, 0xA2, 0x31, 0xD9, 0xF2, - 0xF0, 0xAC, 0xDE, 0x69, 0xB6, 0x64, 0x56, 0x75, - 0x2E, 0x9B, 0xEA, 0xDE, 0x2A, 0xBB, 0xD6, 0x00, - 0xAA, 0xE6, 0x9B, 0xC2, 0xF6, 0x9F, 0x60, 0xCD, - 0x0E, 0xFA, 0xB1, 0x14, 0x4A, 0x47, 0xD6, 0x63, - 0x9A, 0xCD, 0x9C, 0x93, 0xB9, 0x09, 0x42, 0xDA, - 0x8F, 0xFB, 0xE5, 0x7B, 0xF1, 0x4F, 0x96, 0x33, - 0xF9, 0x45, 0x5B, 0xCC, 0x84, 0xAB, 0xC2, 0xD8, - 0xC4, 0x0C, 0x85, 0xFA, 0x51, 0x28, 0xB9, 0x97, - 0x95, 0x23, 0x8C, 0xB3, 0x1D, 0x4E, 0xB6, 0x1C, - 0xCC, 0x60, 0x41, 0xFB, 0x26, 0xC7, 0xD6, 0xCB, - 0x77, 0x18, 0xF7, 0xEA, 0xCD, 0x10, 0x3C, 0x5B, - 0xA3, 0xC0, 0x77, 0x4C, 0x11, 0xF3, 0x74, 0x50, - 0xEE, 0x23, 0x80, 0xC4, 0x5D, 0xDD, 0x57, 0xF5, - 0x7D, 0x49, 0x57, 0x4A, 0xBA, 0x62, 0xBF, 0x06, - 0xD9, 0xD1, 0x7F, 0x91, 0x10, 0x89, 0x6F, 0x49, - 0x09, 0xD7, 0xE9, 0xAF, 0x4C, 0x9F, 0x67, 0x9D, - 0x89, 0x82, 0xE4, 0xD5, 0xC1, 0x9A, 0xDC, 0x55, - 0x79, 0xE7, 0xE9, 0x2D, 0x81, 0x42, 0x14, 0x55, - 0x61, 0x47, 0x9B, 0xED, 0x76, 0x92, 0x1D, 0x2F, - 0xB5, 0x7C, 0x28, 0x4B, 0xFF, 0x7B, 0xC2, 0x3B, - 0x36, 0x73, 0x99, 0xA6, 0x21, 0x43, 0x0E, 0xA1, - 0x1F, 0x82, 0xB8, 0x91, 0x71, 0x11, 0xB2, 0xC1 -}; - -static const unsigned char cpA_dpki_rsa_pubMod[256] = //cpA_dpki_rsa_pubMod -{ - 0xAA, 0x7F, 0x93, 0x80, 0x28, 0x9B, 0xE8, 0x98, - 0x63, 0x10, 0x7A, 0xE1, 0x0C, 0x59, 0x2C, 0x2F, - 0x7C, 0xFF, 0xBD, 0xAA, 0xDD, 0x74, 0xF4, 0xA2, - 0xFB, 0xAC, 0xD7, 0x6F, 0x00, 0x93, 0x42, 0x06, - 0x34, 0x71, 0x56, 0xD8, 0x40, 0x49, 0x72, 0x9F, - 0x3E, 0x24, 0xFA, 0x5E, 0x19, 0xD1, 0x5B, 0x63, - 0x5C, 0xD2, 0xEF, 0x09, 0xDE, 0x32, 0xEE, 0x6B, - 0x6F, 0xC8, 0xFA, 0x32, 0x8E, 0x2E, 0x96, 0xB9, - 0x94, 0x41, 0x04, 0x7D, 0x07, 0x62, 0x95, 0xDA, - 0x0D, 0x91, 0xD8, 0x09, 0x35, 0xD0, 0xDE, 0x8E, - 0x6B, 0xC6, 0xAB, 0x14, 0x27, 0x01, 0x9C, 0xFE, - 0x49, 0x96, 0xFC, 0x9B, 0x54, 0x79, 0x4D, 0xEB, - 0xD7, 0xC6, 0x66, 0x73, 0xA6, 0xDD, 0x3A, 0x77, - 0x65, 0x47, 0x94, 0xEC, 0x1C, 0x87, 0xAA, 0x46, - 0xD9, 0x78, 0xA9, 0x7D, 0xDB, 0x11, 0x22, 0x6E, - 0xD4, 0x12, 0xC2, 0x78, 0x4B, 0x21, 0x83, 0x92, - 0xC7, 0x10, 0xC7, 0x74, 0x19, 0xFF, 0xAA, 0xF6, - 0x0B, 0x75, 0xD8, 0x23, 0xDD, 0x33, 0xC3, 0xA1, - 0x5B, 0xA7, 0x2D, 0x30, 0xA5, 0xA4, 0xD8, 0xF8, - 0x0F, 0xD6, 0x73, 0xFD, 0x26, 0xCB, 0x29, 0xA6, - 0xEF, 0x50, 0x39, 0xE2, 0x5F, 0x59, 0x61, 0x84, - 0x6B, 0xDA, 0x2E, 0xC7, 0xCB, 0xE4, 0x38, 0x4B, - 0x28, 0xFB, 0x0D, 0xD5, 0x8E, 0x7C, 0xAA, 0x7D, - 0x4B, 0x37, 0x3A, 0xD7, 0x81, 0xDD, 0x73, 0xE3, - 0x09, 0x93, 0xBD, 0xBD, 0x7E, 0x08, 0x55, 0x4A, - 0x8C, 0xA5, 0xC9, 0x84, 0x2D, 0x71, 0x01, 0xA2, - 0x2A, 0x01, 0xB0, 0x15, 0xFB, 0x30, 0x78, 0xB9, - 0x13, 0xF4, 0xC7, 0x3F, 0xB5, 0xA6, 0xF1, 0xA2, - 0x5E, 0x22, 0xB0, 0x02, 0xB6, 0xE0, 0x09, 0x54, - 0x7F, 0x0F, 0xBD, 0xF0, 0xFE, 0xA5, 0x50, 0x1D, - 0x93, 0x15, 0xF9, 0x3D, 0x83, 0x0F, 0x0F, 0x0E, - 0x3D, 0xE2, 0x3D, 0x96, 0xE7, 0x09, 0xD9, 0x77 -}; - -static const unsigned char xs9_dpki_rsa_privExp[256] = //xs9_dpki_rsa_privExp -{ - 0x74, 0xCB, 0xCF, 0x1E, 0xD0, 0x2D, 0xD4, 0xF9, - 0xE0, 0x05, 0xCE, 0x9C, 0x66, 0x3D, 0xE3, 0x62, - 0x66, 0x62, 0x4E, 0xB5, 0x82, 0xE1, 0x24, 0x1B, - 0x5F, 0x73, 0x2A, 0x7F, 0x1D, 0xB3, 0x6E, 0x50, - 0x07, 0x83, 0xA0, 0xC0, 0xED, 0xCE, 0xB7, 0xF9, - 0x3D, 0xAC, 0x61, 0xC5, 0x7B, 0x99, 0xA0, 0xBC, - 0xCE, 0x42, 0x8F, 0xD3, 0xB0, 0xA5, 0xBF, 0x2A, - 0x3D, 0x3E, 0x5E, 0xDC, 0x56, 0xC3, 0xA5, 0xDE, - 0x35, 0xCD, 0x0A, 0x00, 0xF8, 0x17, 0x6B, 0x20, - 0x79, 0xEF, 0xD8, 0x83, 0x23, 0xBF, 0x21, 0x28, - 0xFF, 0x38, 0x7D, 0x80, 0x07, 0x15, 0x18, 0x6C, - 0xB9, 0x20, 0xF8, 0x85, 0x77, 0xBC, 0xD9, 0x2A, - 0x35, 0x1C, 0xFE, 0xE3, 0xF1, 0xE8, 0x98, 0x2E, - 0xA0, 0x4A, 0x48, 0x77, 0x35, 0x03, 0xC9, 0x7A, - 0xAC, 0xDA, 0xBE, 0x6D, 0x1D, 0xFB, 0xE4, 0xDE, - 0xEC, 0x70, 0x65, 0xFA, 0x10, 0x65, 0xA4, 0xB8, - 0x6A, 0xDF, 0x32, 0x6B, 0x8E, 0x28, 0x79, 0x25, - 0x87, 0x72, 0xC0, 0x7C, 0x5B, 0x81, 0xBC, 0x81, - 0x92, 0x44, 0x7D, 0xEA, 0x61, 0xBD, 0x3C, 0x48, - 0xF3, 0x0E, 0x18, 0xDC, 0x8D, 0x89, 0xA0, 0x34, - 0xC3, 0xAE, 0x9C, 0x57, 0x72, 0xA6, 0xD7, 0x7C, - 0x79, 0xF7, 0xE9, 0x14, 0x6E, 0x15, 0xAC, 0x01, - 0xFA, 0xFF, 0xC8, 0xA2, 0x2A, 0x3A, 0xAB, 0x24, - 0x3C, 0x7E, 0x2E, 0xC5, 0xDA, 0x83, 0xD5, 0x9D, - 0x24, 0x10, 0x83, 0x7A, 0xF4, 0xBB, 0xA3, 0x6F, - 0x88, 0xCE, 0xEC, 0x24, 0x1B, 0xF4, 0x36, 0x2E, - 0x96, 0xC9, 0x6D, 0x19, 0x02, 0xFE, 0xAA, 0x21, - 0x3E, 0x95, 0xA7, 0xFE, 0x83, 0xC8, 0x99, 0x7F, - 0xD1, 0xCB, 0x7C, 0x1F, 0x91, 0x30, 0xDB, 0xA4, - 0xD3, 0xDD, 0xDA, 0x9B, 0x12, 0x4E, 0x24, 0xD1, - 0xA5, 0x6F, 0x15, 0xFC, 0x2C, 0x72, 0x98, 0x2C, - 0x89, 0xC5, 0x7D, 0x89, 0xDE, 0x2B, 0x4E, 0x01 -}; - -static const unsigned char xs9_dpki_rsa_pubMod[256] = //xs9_dpki_rsa_pubMod -{ - 0xC0, 0x84, 0x4C, 0xEB, 0x7E, 0xB0, 0xCF, 0xF0, - 0xAE, 0xB7, 0x77, 0x69, 0x85, 0x93, 0xE4, 0x99, - 0x5A, 0x95, 0x4E, 0x58, 0x17, 0x38, 0xCE, 0xD6, - 0x81, 0xB0, 0xBD, 0x77, 0x09, 0xE7, 0xF8, 0x9A, - 0xDF, 0xAD, 0x05, 0x48, 0x83, 0xF6, 0xC3, 0xFD, - 0xDF, 0x7B, 0x83, 0xE0, 0x0C, 0x26, 0x81, 0x54, - 0x43, 0x29, 0xEA, 0x82, 0x6C, 0x89, 0xF0, 0xA6, - 0x74, 0x42, 0x86, 0x4D, 0x32, 0x60, 0x32, 0x7D, - 0xA7, 0x7A, 0x13, 0x40, 0x66, 0x59, 0xDA, 0x3E, - 0x41, 0x6B, 0x27, 0x94, 0x03, 0x4F, 0xAA, 0x22, - 0x9D, 0xD5, 0x54, 0x52, 0xDB, 0x27, 0x0A, 0x6A, - 0xA2, 0x3D, 0x19, 0xB1, 0x66, 0x1B, 0x19, 0x7D, - 0xAB, 0xC7, 0x0E, 0x88, 0x17, 0x91, 0xA1, 0x2A, - 0xB4, 0x3C, 0x6C, 0xCB, 0xF5, 0xAA, 0x7C, 0x3A, - 0xDD, 0x36, 0xFB, 0x35, 0x71, 0x7B, 0x20, 0x01, - 0x59, 0x00, 0xD6, 0xF6, 0x90, 0x39, 0x35, 0x41, - 0x31, 0xF8, 0xC1, 0xC0, 0x57, 0x3A, 0x35, 0x18, - 0x58, 0x90, 0xB1, 0xAD, 0x9A, 0x0E, 0xEC, 0xE0, - 0xF4, 0x7A, 0x7D, 0xA5, 0x27, 0x48, 0xC9, 0x72, - 0xAB, 0x0D, 0x08, 0x7B, 0x62, 0x35, 0x40, 0x91, - 0x14, 0x2B, 0xB1, 0x1D, 0x1A, 0xFA, 0xF9, 0xCD, - 0x5C, 0x17, 0x13, 0x53, 0x52, 0x71, 0xCA, 0xE2, - 0x2A, 0x78, 0xB1, 0x7F, 0x4A, 0xCD, 0x59, 0xD8, - 0xBA, 0x1D, 0x7D, 0x70, 0x5F, 0x78, 0x1B, 0x9F, - 0x9D, 0x37, 0x18, 0x8E, 0xD7, 0xCD, 0x0D, 0x49, - 0x57, 0x74, 0x69, 0x88, 0x3A, 0x6B, 0x8E, 0x4E, - 0x1B, 0x85, 0xDD, 0xBE, 0x39, 0x45, 0x05, 0x89, - 0x56, 0x12, 0x97, 0x59, 0x9A, 0x09, 0xA4, 0xC8, - 0x2D, 0x2F, 0xF5, 0xCF, 0xB4, 0x73, 0x70, 0xDB, - 0x58, 0x1E, 0xB2, 0x4E, 0x77, 0x6F, 0xA4, 0x7E, - 0x62, 0xDF, 0xB7, 0x05, 0xE8, 0x80, 0x42, 0x5C, - 0xB8, 0x78, 0x87, 0x97, 0x7F, 0x66, 0x2C, 0x5F -}; - -static const unsigned char DevNcsdCfa_privExp[256] = //DevNcsdCfa_privExp -{ - 0x32, 0x36, 0x43, 0xC2, 0xB3, 0x1A, 0x7E, 0x13, - 0xAB, 0xA2, 0xB6, 0x8B, 0x4F, 0x05, 0xA7, 0xA6, - 0xCD, 0xE7, 0xA6, 0x74, 0x47, 0x49, 0xE6, 0x51, - 0xE4, 0x71, 0x74, 0x15, 0x76, 0x91, 0xF7, 0x92, - 0xB1, 0x4E, 0xF6, 0x99, 0x73, 0x1E, 0xCF, 0xB5, - 0x1D, 0x7C, 0xAF, 0xC5, 0xEA, 0x57, 0x01, 0xE5, - 0x5C, 0x10, 0x47, 0xEA, 0x3A, 0x54, 0x86, 0x03, - 0x2A, 0x76, 0x05, 0x72, 0x53, 0x16, 0xC2, 0xAE, - 0x2D, 0xBE, 0x71, 0xF7, 0x17, 0x6B, 0x23, 0xDD, - 0x2C, 0xB8, 0x8D, 0x13, 0x14, 0xE5, 0xDA, 0x3B, - 0xC7, 0x33, 0x7A, 0xBA, 0xE5, 0x2A, 0x2B, 0x7D, - 0x5A, 0x12, 0x27, 0x38, 0x56, 0xDF, 0xED, 0x70, - 0x03, 0x0E, 0xED, 0x64, 0xC7, 0xF6, 0x54, 0xAC, - 0xFE, 0x1D, 0x77, 0xA4, 0xE4, 0xBC, 0xEB, 0xB9, - 0xA6, 0xC5, 0xFE, 0x3A, 0xAF, 0x58, 0x81, 0xE4, - 0x3F, 0xA0, 0xE6, 0x93, 0x13, 0x2D, 0x98, 0x7D, - 0xB3, 0xE2, 0xC9, 0xC8, 0xD6, 0x31, 0x91, 0x73, - 0x9D, 0xCA, 0xC9, 0x44, 0xEF, 0xD0, 0x39, 0xBF, - 0x38, 0xFD, 0x1C, 0x91, 0x72, 0x93, 0x40, 0xA9, - 0x8A, 0x0D, 0x3E, 0x32, 0xC4, 0x59, 0x4B, 0x0C, - 0xC7, 0xEA, 0x50, 0x41, 0x9F, 0xF5, 0xE2, 0xB7, - 0x50, 0x7C, 0xE3, 0xC9, 0xEC, 0x46, 0x18, 0xAC, - 0xB4, 0x91, 0x2A, 0x32, 0xE0, 0xD8, 0x10, 0x6F, - 0xFC, 0x81, 0xB3, 0x95, 0xF3, 0xFC, 0x78, 0xC0, - 0xEF, 0xE5, 0x7B, 0x8D, 0x14, 0xD4, 0x36, 0x26, - 0x5F, 0xC6, 0x32, 0xC0, 0x19, 0x87, 0x5C, 0x77, - 0x26, 0x37, 0xD8, 0xAE, 0x66, 0xD6, 0x0B, 0x28, - 0x26, 0x43, 0x7C, 0x25, 0xDB, 0x6D, 0x5C, 0xE8, - 0x94, 0x8F, 0xA9, 0x77, 0x07, 0xB2, 0xC0, 0x85, - 0xCD, 0x41, 0xBA, 0x48, 0x88, 0x73, 0x34, 0xD5, - 0x20, 0x8A, 0x0F, 0xE3, 0x9E, 0x99, 0xF0, 0xC8, - 0xE8, 0xD9, 0x2C, 0x2A, 0x21, 0x69, 0xE4, 0xC1 -}; - -static const unsigned char DevNcsdCfa_pubMod[256] = //DevNcsdCfa_pubMod -{ - 0xB9, 0x0C, 0xC4, 0xC6, 0x78, 0xF8, 0x6E, 0x30, - 0x05, 0x28, 0xC1, 0xCB, 0xD2, 0xCF, 0xA7, 0x80, - 0x5C, 0x57, 0x4D, 0x16, 0x9C, 0xAF, 0xA6, 0xCD, - 0x01, 0xBB, 0x83, 0x33, 0xAD, 0x03, 0xBB, 0x06, - 0x63, 0xD8, 0x17, 0xF5, 0xE3, 0xDF, 0xDA, 0x0D, - 0x3B, 0x86, 0x0E, 0xA2, 0x80, 0x47, 0x94, 0x44, - 0x6F, 0xD9, 0x97, 0x7E, 0x78, 0x6A, 0xC3, 0x93, - 0x93, 0xEF, 0x02, 0xFC, 0x22, 0x9F, 0x80, 0x77, - 0x8C, 0x70, 0x92, 0x1C, 0x43, 0xB1, 0x37, 0x4C, - 0x76, 0xE0, 0x57, 0x3B, 0xAB, 0x89, 0xFF, 0xEF, - 0xE5, 0xBB, 0x3E, 0xAB, 0x91, 0x39, 0xB8, 0xD9, - 0x66, 0x0B, 0x64, 0x28, 0x91, 0x92, 0xE9, 0xD0, - 0xB3, 0xDF, 0xD1, 0x4B, 0xC1, 0x73, 0xB5, 0x3F, - 0x56, 0xA0, 0x40, 0x10, 0xFE, 0x15, 0x2B, 0x1F, - 0xA2, 0x7A, 0xDE, 0x31, 0xB0, 0x26, 0x40, 0xC3, - 0x57, 0xFD, 0x35, 0xCB, 0xF0, 0xFA, 0xFF, 0xFB, - 0x6F, 0xDB, 0xCD, 0x34, 0x1D, 0x51, 0x2D, 0x2D, - 0x81, 0x18, 0xFF, 0x0C, 0x08, 0x51, 0xD5, 0xB4, - 0x4B, 0x56, 0x16, 0x02, 0x9F, 0x4E, 0x6A, 0xDF, - 0x06, 0x6E, 0xCB, 0x72, 0x85, 0xE9, 0x2E, 0x43, - 0xA2, 0x08, 0x78, 0x0C, 0x38, 0x9C, 0x19, 0xBD, - 0x7B, 0x74, 0x74, 0x68, 0xC4, 0x2D, 0xC1, 0x35, - 0x9E, 0x65, 0x3B, 0xD8, 0x99, 0x04, 0x1C, 0x8B, - 0x93, 0x8E, 0x7E, 0x92, 0x7C, 0xBB, 0xDD, 0x60, - 0xEC, 0xE7, 0xFE, 0x0E, 0x9D, 0x4F, 0x36, 0x46, - 0xE6, 0xF1, 0x5C, 0x94, 0x70, 0xEE, 0x67, 0x5F, - 0x36, 0x2B, 0x70, 0x44, 0x8D, 0xCA, 0x09, 0xB9, - 0x58, 0x67, 0xD2, 0x9F, 0xAD, 0x1F, 0x13, 0x54, - 0x74, 0xAD, 0xA6, 0x84, 0x44, 0x28, 0xF3, 0xDE, - 0x7E, 0x4C, 0x20, 0x2B, 0xC5, 0xE9, 0x12, 0xE9, - 0x5E, 0xFB, 0x8D, 0x77, 0xA9, 0xA4, 0xD2, 0x0D, - 0x3C, 0x38, 0x24, 0xBE, 0xF5, 0x8A, 0xB5, 0xF5 -}; - -static const unsigned char AccessDesc_privExp[256] = //AccessDesc_privExp -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -static const unsigned char AccessDesc_pubMod[256] = //AccessDesc_pubMod -{ - 0xF4, 0x3C, 0x45, 0x82, 0xFB, 0xF8, 0x90, 0x5D, - 0x07, 0x02, 0x9F, 0x2A, 0x98, 0x8B, 0x63, 0xB7, - 0xD3, 0x8F, 0x3C, 0xE2, 0xE0, 0xE0, 0x93, 0xBF, - 0xDF, 0x32, 0x43, 0x4D, 0xBE, 0xF4, 0xD1, 0x7A, - 0x3A, 0x4E, 0x54, 0x31, 0xD7, 0x73, 0xAE, 0x99, - 0x4C, 0xC4, 0x1F, 0x3C, 0x3E, 0xF0, 0x57, 0x05, - 0xA3, 0x8A, 0x45, 0x54, 0x60, 0xD8, 0x8F, 0xD9, - 0x1D, 0x68, 0x0D, 0x0E, 0x2E, 0xEF, 0xC8, 0xE8, - 0x3D, 0xC9, 0x19, 0xF3, 0x73, 0x1E, 0x2D, 0xDA, - 0x77, 0x88, 0x3E, 0xCA, 0x5E, 0x25, 0x70, 0x4B, - 0xF7, 0x70, 0x95, 0x83, 0x54, 0x24, 0xE0, 0xC3, - 0x1A, 0x75, 0xDF, 0x61, 0x3D, 0xD1, 0x42, 0xEC, - 0x35, 0x1B, 0x38, 0xD6, 0xC1, 0xF6, 0x7E, 0x18, - 0x2A, 0x84, 0x85, 0xDD, 0x57, 0x74, 0x1F, 0x0A, - 0x2E, 0xF6, 0xB2, 0x94, 0xA2, 0x3E, 0xE9, 0xA1, - 0xD0, 0x09, 0xF7, 0x3A, 0x99, 0x80, 0x05, 0xAF, - 0x57, 0x55, 0xEF, 0x52, 0xFA, 0x24, 0x3E, 0x7F, - 0xD4, 0x7C, 0x41, 0x44, 0x7B, 0x06, 0x7F, 0xB9, - 0x5B, 0x2E, 0x8E, 0x96, 0xAE, 0x46, 0x12, 0x4D, - 0x64, 0x21, 0xE5, 0x0F, 0x85, 0xCC, 0xEB, 0x92, - 0xE5, 0xF0, 0xF5, 0xA7, 0x42, 0x27, 0x3B, 0xEC, - 0xF8, 0xE7, 0x81, 0x75, 0x6F, 0x63, 0x0A, 0x8B, - 0x0D, 0x77, 0x38, 0x51, 0xE6, 0x66, 0x33, 0xBA, - 0x79, 0xDC, 0x2F, 0x2C, 0x8F, 0xC3, 0x28, 0x06, - 0xBB, 0x03, 0x9C, 0xDB, 0xD1, 0x64, 0x0A, 0x66, - 0xF0, 0xF8, 0xC1, 0x2A, 0x49, 0x1D, 0x0C, 0x6E, - 0x35, 0xBB, 0xEA, 0xB3, 0x5C, 0x0D, 0xE9, 0x95, - 0x7C, 0x67, 0xBE, 0x65, 0x77, 0xEC, 0x07, 0xC0, - 0x23, 0x05, 0x0A, 0x72, 0x48, 0x86, 0xE9, 0x9E, - 0xFC, 0x25, 0x15, 0xE7, 0xC8, 0x21, 0x65, 0xE0, - 0x1B, 0xD5, 0xD5, 0x0E, 0xD3, 0x11, 0x54, 0xBB, - 0x29, 0x78, 0xBF, 0x2A, 0x3C, 0x3B, 0xB6, 0xB1 -}; - -static const unsigned char CrrDevKey_privExp[256] = //CrrDevKey_privExp -{ - 0x8D, 0x27, 0x29, 0x6B, 0xC7, 0xA7, 0xED, 0xCD, - 0x94, 0x2D, 0x36, 0x5E, 0x86, 0xA8, 0x26, 0xE7, - 0x43, 0x9E, 0x64, 0xC8, 0xAA, 0x9A, 0x58, 0x21, - 0x07, 0xF7, 0xB3, 0xFB, 0xCF, 0x8D, 0x3E, 0x53, - 0xF0, 0x02, 0x25, 0x7B, 0x80, 0x18, 0x2E, 0x0D, - 0x84, 0x7D, 0x6C, 0xE0, 0xDA, 0xC0, 0x17, 0xA6, - 0xA5, 0x13, 0xE6, 0xFD, 0xBF, 0x98, 0xFC, 0x87, - 0x9A, 0x9E, 0x0E, 0x13, 0x87, 0x66, 0x24, 0x8D, - 0xA5, 0x6C, 0x58, 0x86, 0x10, 0x80, 0x90, 0x89, - 0xEE, 0xFD, 0x40, 0x94, 0xCB, 0x1F, 0x26, 0xAB, - 0xD1, 0xD3, 0xFF, 0xE9, 0x7B, 0x76, 0xDC, 0x65, - 0xC0, 0x15, 0xD8, 0x9B, 0xF6, 0x29, 0xE1, 0x49, - 0xE9, 0xDC, 0xBE, 0x24, 0x17, 0xFF, 0x09, 0x2C, - 0xD6, 0xC4, 0x6D, 0x50, 0x33, 0xDC, 0xA0, 0x9D, - 0x9D, 0xCC, 0xDD, 0x6E, 0x7B, 0xDF, 0x42, 0x22, - 0x4D, 0x80, 0xC7, 0xEB, 0xCB, 0xB1, 0x60, 0x2F, - 0x04, 0xEE, 0x04, 0x0E, 0x4C, 0x76, 0x49, 0x55, - 0x92, 0xA5, 0xC1, 0x13, 0x60, 0x0A, 0x80, 0x15, - 0x3D, 0x1C, 0xC6, 0x46, 0x57, 0x2E, 0x7C, 0xB0, - 0x3D, 0x87, 0x06, 0x87, 0xFD, 0x31, 0xF8, 0xE7, - 0x14, 0x97, 0x2A, 0x57, 0x40, 0xAC, 0x94, 0x61, - 0xCD, 0xCF, 0xDE, 0x8C, 0x40, 0x46, 0x95, 0xA0, - 0xD6, 0xF9, 0x2C, 0x08, 0x9B, 0x12, 0xBF, 0xF1, - 0x88, 0x9C, 0x5D, 0x40, 0x32, 0x6D, 0x9D, 0x99, - 0xA4, 0x80, 0xA6, 0xC2, 0x45, 0x5A, 0xD3, 0x22, - 0xFE, 0xFA, 0x17, 0x54, 0x11, 0xEA, 0x41, 0xB4, - 0xBD, 0x68, 0x1E, 0xDD, 0x3F, 0xE5, 0x92, 0xCB, - 0x9E, 0xF8, 0xC0, 0x0A, 0x8B, 0xF5, 0x89, 0xA4, - 0x03, 0x68, 0xF8, 0xF8, 0x99, 0x7C, 0xFE, 0xAD, - 0x32, 0xDD, 0x5C, 0xB4, 0x06, 0x29, 0xDA, 0x96, - 0x8B, 0xBA, 0xCB, 0x15, 0xDE, 0x38, 0x0D, 0xCA, - 0xF7, 0x01, 0x65, 0xF6, 0x2D, 0x36, 0x6E, 0x71 -}; - -static const unsigned char CrrDevKey_pubMod[256] = //CrrDevKey_pubMod -{ - 0xE2, 0xAD, 0xA6, 0xEA, 0xCA, 0xA3, 0xE8, 0xCC, - 0xA9, 0x70, 0x1D, 0x2E, 0x23, 0x4B, 0xC6, 0x55, - 0xCE, 0x13, 0xD9, 0xA7, 0x58, 0xB4, 0xC7, 0x73, - 0x96, 0x1D, 0xE8, 0xC3, 0x09, 0x4D, 0x9B, 0xC3, - 0xEB, 0x69, 0xA2, 0x37, 0x83, 0x5D, 0xD8, 0x37, - 0x04, 0x72, 0x7A, 0x4F, 0xEA, 0x53, 0x98, 0x9D, - 0x0E, 0x01, 0x34, 0x70, 0x9A, 0x82, 0x06, 0xE7, - 0x6A, 0xC9, 0xF8, 0x0E, 0x49, 0x5A, 0xA4, 0xE7, - 0x0E, 0xFA, 0xD4, 0xAB, 0x3B, 0xC5, 0xD7, 0xF1, - 0xA4, 0xFC, 0x92, 0x7F, 0xD0, 0xF3, 0xCD, 0xD5, - 0xB9, 0x2A, 0x1A, 0x41, 0x62, 0xB3, 0x7B, 0x3E, - 0x1E, 0x35, 0x46, 0x41, 0x8E, 0xB2, 0x53, 0x1A, - 0x60, 0xF8, 0xC2, 0xD1, 0x94, 0xB3, 0x9D, 0x76, - 0x9F, 0x1D, 0x98, 0xAC, 0xF0, 0xCF, 0xE3, 0xA9, - 0x05, 0x85, 0xF2, 0xBF, 0x55, 0x76, 0x1B, 0x89, - 0x1C, 0xC3, 0x19, 0x2E, 0xEE, 0x94, 0xBE, 0x75, - 0x0F, 0xA3, 0x76, 0x8B, 0x24, 0x24, 0x97, 0xFA, - 0xC0, 0x53, 0x24, 0xF5, 0x85, 0x02, 0x19, 0x9D, - 0xC5, 0x11, 0x2E, 0x6B, 0xA3, 0x26, 0xFE, 0xF7, - 0x55, 0xD4, 0x23, 0x0A, 0x73, 0x3F, 0x37, 0x53, - 0xEA, 0xC2, 0xB7, 0xC1, 0xC9, 0xD8, 0xF3, 0x2F, - 0x78, 0x76, 0x4A, 0xA0, 0x69, 0x60, 0x91, 0xC2, - 0x7D, 0x11, 0x74, 0xEF, 0x96, 0xD9, 0x74, 0x53, - 0xB1, 0x1C, 0xB0, 0xC4, 0x32, 0x16, 0x82, 0x3B, - 0xAF, 0x61, 0xB2, 0xDE, 0x38, 0x87, 0x3E, 0x37, - 0x4B, 0xA3, 0x95, 0x88, 0x8E, 0xE0, 0x27, 0x9A, - 0x1F, 0x7D, 0xB8, 0x23, 0xC3, 0x63, 0xE8, 0x68, - 0x51, 0xD9, 0x8C, 0x4C, 0xC2, 0x59, 0x86, 0x49, - 0xF7, 0x46, 0x9E, 0x3C, 0xD7, 0x9F, 0x89, 0x23, - 0xB4, 0x73, 0x35, 0x2F, 0x18, 0x23, 0x76, 0xA3, - 0x9F, 0x40, 0x0B, 0x76, 0x90, 0x85, 0xC8, 0x89, - 0xDA, 0x65, 0xE7, 0x6E, 0xEF, 0x2E, 0xF5, 0x67 -}; - -//Certificates -static const unsigned char ca4_dpki_cert[0x400] = -{ - 0x00, 0x01, 0x00, 0x03, 0x19, 0x49, 0x42, 0x9D, - 0x1E, 0x58, 0xA6, 0x2E, 0x7E, 0x8B, 0x56, 0xD1, - 0xB7, 0x6A, 0xE3, 0x02, 0xFD, 0x8B, 0x97, 0x49, - 0x1F, 0x77, 0x87, 0x45, 0xF7, 0x53, 0x88, 0xC4, - 0xDD, 0x0B, 0xEB, 0x1D, 0xF1, 0x22, 0xFB, 0x96, - 0x42, 0x15, 0x14, 0x97, 0x76, 0x4A, 0x53, 0xCF, - 0x78, 0x15, 0x18, 0x45, 0xE4, 0x2C, 0xA8, 0xFD, - 0xE4, 0x86, 0xFD, 0x2A, 0x4F, 0x53, 0xF8, 0xA1, - 0xBA, 0x00, 0x8A, 0x74, 0x85, 0xFF, 0x73, 0xB3, - 0xBF, 0x7E, 0x3C, 0x98, 0x07, 0x29, 0xD0, 0x65, - 0x6B, 0x69, 0x32, 0x19, 0xAD, 0xE8, 0x35, 0xEB, - 0x5F, 0xFF, 0xFC, 0xCB, 0x7C, 0xBB, 0x5E, 0x30, - 0x7F, 0xE0, 0x68, 0x8B, 0x88, 0x8E, 0xF2, 0xD2, - 0x05, 0x3F, 0xB7, 0xE7, 0x91, 0xE9, 0x85, 0xFD, - 0x15, 0xEF, 0x10, 0xD7, 0x9C, 0xCA, 0x88, 0xD6, - 0xBB, 0x15, 0xE8, 0xE4, 0x71, 0x4A, 0x98, 0xEE, - 0x09, 0xBF, 0x7B, 0x8A, 0xF0, 0x53, 0x23, 0x2B, - 0x64, 0x50, 0xE6, 0xD5, 0xFD, 0xFF, 0xC2, 0x0A, - 0x6D, 0x1E, 0xA6, 0xA2, 0x38, 0x12, 0xE1, 0x01, - 0x45, 0x25, 0xD5, 0x6D, 0x40, 0x82, 0x70, 0x3B, - 0x86, 0x98, 0x69, 0x59, 0xA7, 0x3C, 0xD1, 0xA1, - 0x43, 0x64, 0xD2, 0xC2, 0xDA, 0xEA, 0x96, 0xB0, - 0x95, 0xF7, 0x6C, 0x46, 0xE4, 0xFF, 0x41, 0x55, - 0x46, 0x5E, 0x70, 0xEF, 0x1E, 0xD3, 0x10, 0x53, - 0xD9, 0x70, 0x11, 0xE0, 0x10, 0xCC, 0x93, 0xE7, - 0x91, 0x40, 0x13, 0x68, 0x7F, 0xA3, 0xA8, 0x02, - 0x99, 0x6D, 0x1E, 0x55, 0x7B, 0x1C, 0xCC, 0x7A, - 0x7E, 0x8F, 0x58, 0x65, 0xC1, 0x74, 0x2E, 0x28, - 0xE2, 0x6D, 0xEF, 0x38, 0xA9, 0x3A, 0xB5, 0xD8, - 0x2D, 0x43, 0xEC, 0xCC, 0xBF, 0x0B, 0xEF, 0x22, - 0xE1, 0xFD, 0x57, 0xE2, 0x86, 0x43, 0x33, 0x58, - 0x2F, 0xED, 0xEA, 0xBC, 0x01, 0x2F, 0x98, 0x6D, - 0xDF, 0xC3, 0xE9, 0x44, 0x79, 0x73, 0x47, 0x03, - 0x08, 0x45, 0x5B, 0xDC, 0x57, 0xAA, 0x17, 0x0B, - 0x84, 0x42, 0x7F, 0x73, 0xA2, 0x9B, 0x48, 0xF6, - 0xDA, 0x13, 0x5F, 0x66, 0xC7, 0x45, 0xC1, 0x42, - 0xA8, 0x4A, 0xFB, 0x0E, 0x6A, 0x5E, 0xED, 0x85, - 0xD7, 0xB9, 0x71, 0x99, 0x36, 0xF8, 0xCE, 0x2B, - 0x62, 0x1F, 0x39, 0x5F, 0x40, 0xDC, 0x03, 0xBE, - 0xF8, 0x85, 0x4C, 0x11, 0x17, 0xFF, 0x0C, 0x12, - 0x86, 0x41, 0xCC, 0x78, 0x43, 0xB9, 0x7B, 0x43, - 0x46, 0xDB, 0x22, 0x6F, 0x60, 0x26, 0xAC, 0xB5, - 0x6C, 0x27, 0x8B, 0x8E, 0x0E, 0xA7, 0x9A, 0x2D, - 0x65, 0xEF, 0x79, 0x8E, 0x10, 0x78, 0xAD, 0x80, - 0xED, 0x4B, 0x96, 0x04, 0xD2, 0xF0, 0x8B, 0x2C, - 0xD6, 0x4A, 0x23, 0xA3, 0xDB, 0x27, 0x08, 0x33, - 0xB4, 0x02, 0xF8, 0x08, 0x51, 0xF3, 0x5B, 0xED, - 0x3E, 0xE4, 0x57, 0x7C, 0x66, 0x60, 0xFB, 0xF1, - 0x6D, 0x94, 0x13, 0xE0, 0x9C, 0x91, 0x7A, 0x49, - 0xD4, 0x2C, 0x6D, 0xA3, 0x75, 0xBC, 0x27, 0xF0, - 0x23, 0x0D, 0xB9, 0x8F, 0x89, 0x73, 0xAB, 0x02, - 0x7B, 0x52, 0x2C, 0xD5, 0x7E, 0xC0, 0x3D, 0x25, - 0xE8, 0xB3, 0xFC, 0x34, 0x94, 0xC9, 0x7F, 0xB1, - 0x08, 0xFE, 0x18, 0xC6, 0x8A, 0x43, 0x36, 0xE4, - 0x6C, 0x26, 0xB6, 0xF2, 0x80, 0xD2, 0x7E, 0x34, - 0xBE, 0x28, 0x7C, 0x3E, 0x46, 0x87, 0xBC, 0x9D, - 0x77, 0x6B, 0x76, 0xD9, 0x28, 0xD1, 0xB6, 0x35, - 0x2E, 0xC0, 0x34, 0x7D, 0x72, 0x94, 0xAA, 0x93, - 0x60, 0x26, 0x8D, 0x26, 0xF5, 0xF6, 0x52, 0x06, - 0x4A, 0xF2, 0x40, 0xD7, 0xD0, 0x0C, 0x7C, 0x5E, - 0xA3, 0xC3, 0x2D, 0xE6, 0x2D, 0x9B, 0x5C, 0x4B, - 0x4C, 0xAB, 0x6F, 0xD7, 0xBD, 0x37, 0x1D, 0x57, - 0xC2, 0x16, 0x60, 0x95, 0x91, 0x0E, 0x4A, 0xD8, - 0xE9, 0xED, 0x18, 0x1E, 0xF7, 0x61, 0x93, 0x61, - 0x53, 0x89, 0x2D, 0x77, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x52, 0x6F, 0x6F, 0x74, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x43, 0x41, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x34, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x81, 0x12, 0x2A, 0x46, - 0xC9, 0xCC, 0x2D, 0xC4, 0xDF, 0x29, 0x30, 0xE4, - 0xDF, 0x3F, 0x8C, 0x70, 0xA0, 0x78, 0x94, 0x87, - 0x75, 0xAD, 0x5E, 0x9A, 0xA6, 0x04, 0xC5, 0xB4, - 0xD8, 0xEA, 0xFF, 0x2A, 0xA1, 0xD2, 0x14, 0x67, - 0x65, 0x64, 0xEF, 0xCA, 0x28, 0xCC, 0x00, 0x15, - 0x45, 0x54, 0xA1, 0xA3, 0xEA, 0x13, 0x79, 0xE9, - 0xE6, 0xCA, 0xAC, 0xED, 0x15, 0x93, 0xFE, 0x88, - 0xD8, 0x9A, 0xC6, 0xB8, 0xAC, 0xCC, 0xAB, 0x6E, - 0x20, 0x7C, 0xEB, 0x7C, 0xCA, 0x29, 0x80, 0x9E, - 0x29, 0x80, 0x44, 0x06, 0x62, 0xB7, 0xD4, 0x38, - 0x2A, 0x15, 0xDA, 0x43, 0x08, 0x57, 0x45, 0xA9, - 0xAA, 0xE5, 0x9A, 0xA0, 0x5B, 0xDB, 0x32, 0xF6, - 0x68, 0x69, 0xA2, 0xDD, 0x42, 0x95, 0x38, 0x6C, - 0x87, 0xEC, 0xDD, 0x35, 0x08, 0xA2, 0xCF, 0x60, - 0xD0, 0x1E, 0x23, 0xEC, 0x2F, 0xE6, 0x98, 0xF4, - 0x70, 0xD6, 0x00, 0x15, 0x49, 0xA2, 0xF0, 0x67, - 0x59, 0x13, 0x1E, 0x53, 0x4C, 0x70, 0x06, 0x05, - 0x7D, 0xEF, 0x1D, 0x18, 0xA8, 0x3F, 0x0A, 0xC7, - 0x9C, 0xFE, 0x80, 0xFF, 0x5A, 0x91, 0xF2, 0xBE, - 0xD4, 0xA0, 0x83, 0x70, 0x61, 0x19, 0x0A, 0x03, - 0x29, 0x90, 0x21, 0x65, 0x40, 0x3C, 0x9A, 0x90, - 0x8F, 0xB6, 0x15, 0x73, 0x9F, 0x3C, 0xE3, 0x3B, - 0xF1, 0xBA, 0xEA, 0x16, 0xC2, 0x5B, 0xCE, 0xD7, - 0x96, 0x3F, 0xAC, 0xC9, 0xD2, 0x4D, 0x9C, 0x0A, - 0xD7, 0x6F, 0xC0, 0x20, 0xB2, 0xC4, 0xB8, 0x4C, - 0x10, 0xA7, 0x41, 0xA2, 0xCC, 0x7D, 0x9B, 0xAC, - 0x3A, 0xAC, 0xCC, 0xA3, 0x52, 0x9B, 0xAC, 0x31, - 0x6A, 0x9A, 0xA7, 0x5D, 0x2A, 0x26, 0xC7, 0xD7, - 0xD2, 0x88, 0xCB, 0xA4, 0x66, 0xC5, 0xFE, 0x5F, - 0x45, 0x4A, 0xE6, 0x79, 0x74, 0x4A, 0x90, 0xA1, - 0x57, 0x72, 0xDB, 0x3B, 0x0E, 0x47, 0xA4, 0x9A, - 0xF0, 0x31, 0xD1, 0x6D, 0xBE, 0xAB, 0x33, 0x2B, - 0x00, 0x01, 0x00, 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 -}; - -static const unsigned char xs9_dpki_cert[0x300] = -{ - 0x00, 0x01, 0x00, 0x04, 0x63, 0x80, 0x5A, 0x35, - 0x1A, 0x43, 0x7B, 0xA2, 0x43, 0x19, 0xBB, 0x3A, - 0x77, 0x7B, 0x7A, 0xF3, 0x5E, 0x72, 0x4B, 0x15, - 0x0A, 0x06, 0x39, 0x6C, 0x5F, 0xEC, 0x38, 0x45, - 0xB1, 0x88, 0x76, 0x26, 0x8D, 0x5E, 0xDA, 0xE6, - 0x2F, 0x14, 0xBA, 0x02, 0xFA, 0xD6, 0xFC, 0x3B, - 0x2B, 0xBE, 0x87, 0x07, 0x63, 0x8E, 0x55, 0xBF, - 0x05, 0x5A, 0xFC, 0xFC, 0xB3, 0x47, 0x69, 0x11, - 0x89, 0xDB, 0x1C, 0xAF, 0x4B, 0x43, 0x76, 0x62, - 0x3E, 0x30, 0x89, 0x0A, 0x9D, 0x3B, 0xBB, 0x3E, - 0x50, 0xBD, 0xF7, 0xA6, 0xC0, 0xF7, 0xF8, 0xBB, - 0x0D, 0xB5, 0x6A, 0xBB, 0xC6, 0xC3, 0x50, 0xC8, - 0x88, 0xBB, 0x9D, 0xF0, 0x9B, 0xD1, 0x30, 0x64, - 0x60, 0x69, 0xDD, 0x34, 0x67, 0xA7, 0x00, 0xEB, - 0xDC, 0xF9, 0x8C, 0xB0, 0xF7, 0x93, 0x0E, 0x81, - 0xFE, 0x98, 0xD9, 0x72, 0x45, 0x8B, 0x94, 0x7E, - 0x59, 0xE2, 0xBE, 0x4E, 0x91, 0x2D, 0x75, 0xCA, - 0x1B, 0x8E, 0x2E, 0xF4, 0x6D, 0x73, 0xB1, 0x6B, - 0x35, 0xB5, 0x67, 0x0D, 0x63, 0x2D, 0x51, 0x38, - 0x53, 0x28, 0x19, 0x1D, 0x9D, 0xAE, 0x8D, 0xC6, - 0x61, 0xCC, 0xEF, 0xA4, 0xAB, 0xE2, 0xF3, 0xB0, - 0x4C, 0x7B, 0xE2, 0x71, 0xB5, 0xF9, 0x2C, 0xFA, - 0x55, 0xCD, 0x88, 0x8B, 0x72, 0xCC, 0xBE, 0x67, - 0xFA, 0xDF, 0xEF, 0x6B, 0x53, 0x3C, 0x45, 0xD8, - 0xCB, 0xDF, 0xB2, 0x76, 0x41, 0x46, 0xD6, 0xC2, - 0x6F, 0x27, 0x16, 0xC5, 0x07, 0xF3, 0xF4, 0x44, - 0x66, 0xA3, 0x15, 0xD2, 0x77, 0xF2, 0x89, 0xDA, - 0xFD, 0xD5, 0x50, 0xCF, 0xA4, 0x9B, 0xEA, 0xCA, - 0xC9, 0x7B, 0xE5, 0x46, 0x0E, 0xED, 0x9B, 0xFB, - 0x04, 0xA9, 0xDA, 0x19, 0x58, 0xD9, 0x2A, 0x20, - 0x8A, 0xAC, 0xC1, 0xF4, 0x8E, 0xE9, 0x14, 0xD8, - 0x8A, 0xD7, 0x41, 0xD5, 0x5B, 0x9B, 0x64, 0x22, - 0xD8, 0xAF, 0xAE, 0xC7, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x52, 0x6F, 0x6F, 0x74, 0x2D, 0x43, 0x41, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x34, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x58, 0x53, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x39, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x18, 0xA3, 0x47, 0xA4, - 0xC0, 0x84, 0x4C, 0xEB, 0x7E, 0xB0, 0xCF, 0xF0, - 0xAE, 0xB7, 0x77, 0x69, 0x85, 0x93, 0xE4, 0x99, - 0x5A, 0x95, 0x4E, 0x58, 0x17, 0x38, 0xCE, 0xD6, - 0x81, 0xB0, 0xBD, 0x77, 0x09, 0xE7, 0xF8, 0x9A, - 0xDF, 0xAD, 0x05, 0x48, 0x83, 0xF6, 0xC3, 0xFD, - 0xDF, 0x7B, 0x83, 0xE0, 0x0C, 0x26, 0x81, 0x54, - 0x43, 0x29, 0xEA, 0x82, 0x6C, 0x89, 0xF0, 0xA6, - 0x74, 0x42, 0x86, 0x4D, 0x32, 0x60, 0x32, 0x7D, - 0xA7, 0x7A, 0x13, 0x40, 0x66, 0x59, 0xDA, 0x3E, - 0x41, 0x6B, 0x27, 0x94, 0x03, 0x4F, 0xAA, 0x22, - 0x9D, 0xD5, 0x54, 0x52, 0xDB, 0x27, 0x0A, 0x6A, - 0xA2, 0x3D, 0x19, 0xB1, 0x66, 0x1B, 0x19, 0x7D, - 0xAB, 0xC7, 0x0E, 0x88, 0x17, 0x91, 0xA1, 0x2A, - 0xB4, 0x3C, 0x6C, 0xCB, 0xF5, 0xAA, 0x7C, 0x3A, - 0xDD, 0x36, 0xFB, 0x35, 0x71, 0x7B, 0x20, 0x01, - 0x59, 0x00, 0xD6, 0xF6, 0x90, 0x39, 0x35, 0x41, - 0x31, 0xF8, 0xC1, 0xC0, 0x57, 0x3A, 0x35, 0x18, - 0x58, 0x90, 0xB1, 0xAD, 0x9A, 0x0E, 0xEC, 0xE0, - 0xF4, 0x7A, 0x7D, 0xA5, 0x27, 0x48, 0xC9, 0x72, - 0xAB, 0x0D, 0x08, 0x7B, 0x62, 0x35, 0x40, 0x91, - 0x14, 0x2B, 0xB1, 0x1D, 0x1A, 0xFA, 0xF9, 0xCD, - 0x5C, 0x17, 0x13, 0x53, 0x52, 0x71, 0xCA, 0xE2, - 0x2A, 0x78, 0xB1, 0x7F, 0x4A, 0xCD, 0x59, 0xD8, - 0xBA, 0x1D, 0x7D, 0x70, 0x5F, 0x78, 0x1B, 0x9F, - 0x9D, 0x37, 0x18, 0x8E, 0xD7, 0xCD, 0x0D, 0x49, - 0x57, 0x74, 0x69, 0x88, 0x3A, 0x6B, 0x8E, 0x4E, - 0x1B, 0x85, 0xDD, 0xBE, 0x39, 0x45, 0x05, 0x89, - 0x56, 0x12, 0x97, 0x59, 0x9A, 0x09, 0xA4, 0xC8, - 0x2D, 0x2F, 0xF5, 0xCF, 0xB4, 0x73, 0x70, 0xDB, - 0x58, 0x1E, 0xB2, 0x4E, 0x77, 0x6F, 0xA4, 0x7E, - 0x62, 0xDF, 0xB7, 0x05, 0xE8, 0x80, 0x42, 0x5C, - 0xB8, 0x78, 0x87, 0x97, 0x7F, 0x66, 0x2C, 0x5F, - 0x00, 0x01, 0x00, 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 -}; - -static const unsigned char cpA_dpki_cert[0x300] = -{ - 0x00, 0x01, 0x00, 0x04, 0x50, 0x05, 0xD7, 0x5E, - 0x6D, 0xDE, 0xB8, 0x78, 0x3C, 0x81, 0xE9, 0xEF, - 0x0D, 0x17, 0xCD, 0x58, 0xF5, 0x94, 0x26, 0xA3, - 0xFD, 0x6F, 0x69, 0x90, 0xE8, 0xF8, 0x32, 0x87, - 0x12, 0x2E, 0xC2, 0x5C, 0xA1, 0x4B, 0x99, 0x24, - 0x23, 0x37, 0xBA, 0x91, 0xA7, 0x5B, 0x0F, 0x7C, - 0x59, 0xFB, 0xF7, 0xD1, 0x89, 0x27, 0x22, 0xC4, - 0xE6, 0xAF, 0xC7, 0xDE, 0xC7, 0x4A, 0x6E, 0x00, - 0x7F, 0x43, 0x4A, 0x88, 0x8A, 0x82, 0x15, 0xE8, - 0xDF, 0x2B, 0x52, 0xED, 0x42, 0x00, 0xBC, 0x69, - 0xB4, 0xDA, 0x7F, 0xEB, 0x74, 0x6C, 0x7A, 0x2D, - 0x96, 0x56, 0x5B, 0x45, 0x59, 0x7B, 0x8F, 0xAE, - 0xB1, 0x6B, 0xDC, 0x76, 0xC1, 0xC8, 0x0C, 0x47, - 0xF5, 0x0D, 0xA9, 0xC3, 0xE1, 0xFE, 0x28, 0x50, - 0x1C, 0x26, 0xA2, 0xD1, 0x54, 0x4B, 0xD1, 0x60, - 0x4A, 0x9E, 0x8F, 0x32, 0x2A, 0xEF, 0x31, 0x5F, - 0xEA, 0x48, 0x22, 0x67, 0x22, 0xB7, 0xCB, 0x37, - 0x2F, 0xF3, 0x5F, 0x5E, 0x61, 0x6A, 0x53, 0x44, - 0xA5, 0x85, 0xE5, 0xA0, 0x8A, 0x2E, 0x17, 0x77, - 0x57, 0x2B, 0x7A, 0x9A, 0xF7, 0xD2, 0xD8, 0xC4, - 0x9C, 0xD0, 0xA0, 0x54, 0xBF, 0x8A, 0x9D, 0xB4, - 0x9F, 0xC6, 0x60, 0x61, 0x7C, 0xB8, 0x35, 0x4E, - 0x25, 0x7F, 0x68, 0x68, 0x2F, 0x94, 0xB3, 0xCC, - 0x53, 0x8C, 0x42, 0x6F, 0x88, 0xC5, 0x48, 0x5C, - 0xBE, 0xC1, 0xD0, 0x48, 0x04, 0x74, 0x96, 0x5A, - 0x7E, 0x82, 0x59, 0xAA, 0x9F, 0xB6, 0x61, 0x46, - 0xCE, 0x59, 0x21, 0xC6, 0xF0, 0xC1, 0x75, 0x1F, - 0x21, 0x91, 0x7F, 0x24, 0x96, 0xCB, 0x0C, 0x70, - 0x15, 0x7A, 0xB7, 0xBB, 0x3A, 0x9F, 0x57, 0x56, - 0x56, 0x5C, 0x38, 0x92, 0x2E, 0xFD, 0xC8, 0xF1, - 0x70, 0xB9, 0xAE, 0xA1, 0xAE, 0x36, 0xF5, 0x5E, - 0x35, 0x26, 0x63, 0x0A, 0xBA, 0xB2, 0x05, 0x0F, - 0xF0, 0x0C, 0xDC, 0xBB, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x52, 0x6F, 0x6F, 0x74, 0x2D, 0x43, 0x41, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x34, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x43, 0x50, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x61, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x18, 0xA3, 0x4D, 0x5B, - 0xAA, 0x7F, 0x93, 0x80, 0x28, 0x9B, 0xE8, 0x98, - 0x63, 0x10, 0x7A, 0xE1, 0x0C, 0x59, 0x2C, 0x2F, - 0x7C, 0xFF, 0xBD, 0xAA, 0xDD, 0x74, 0xF4, 0xA2, - 0xFB, 0xAC, 0xD7, 0x6F, 0x00, 0x93, 0x42, 0x06, - 0x34, 0x71, 0x56, 0xD8, 0x40, 0x49, 0x72, 0x9F, - 0x3E, 0x24, 0xFA, 0x5E, 0x19, 0xD1, 0x5B, 0x63, - 0x5C, 0xD2, 0xEF, 0x09, 0xDE, 0x32, 0xEE, 0x6B, - 0x6F, 0xC8, 0xFA, 0x32, 0x8E, 0x2E, 0x96, 0xB9, - 0x94, 0x41, 0x04, 0x7D, 0x07, 0x62, 0x95, 0xDA, - 0x0D, 0x91, 0xD8, 0x09, 0x35, 0xD0, 0xDE, 0x8E, - 0x6B, 0xC6, 0xAB, 0x14, 0x27, 0x01, 0x9C, 0xFE, - 0x49, 0x96, 0xFC, 0x9B, 0x54, 0x79, 0x4D, 0xEB, - 0xD7, 0xC6, 0x66, 0x73, 0xA6, 0xDD, 0x3A, 0x77, - 0x65, 0x47, 0x94, 0xEC, 0x1C, 0x87, 0xAA, 0x46, - 0xD9, 0x78, 0xA9, 0x7D, 0xDB, 0x11, 0x22, 0x6E, - 0xD4, 0x12, 0xC2, 0x78, 0x4B, 0x21, 0x83, 0x92, - 0xC7, 0x10, 0xC7, 0x74, 0x19, 0xFF, 0xAA, 0xF6, - 0x0B, 0x75, 0xD8, 0x23, 0xDD, 0x33, 0xC3, 0xA1, - 0x5B, 0xA7, 0x2D, 0x30, 0xA5, 0xA4, 0xD8, 0xF8, - 0x0F, 0xD6, 0x73, 0xFD, 0x26, 0xCB, 0x29, 0xA6, - 0xEF, 0x50, 0x39, 0xE2, 0x5F, 0x59, 0x61, 0x84, - 0x6B, 0xDA, 0x2E, 0xC7, 0xCB, 0xE4, 0x38, 0x4B, - 0x28, 0xFB, 0x0D, 0xD5, 0x8E, 0x7C, 0xAA, 0x7D, - 0x4B, 0x37, 0x3A, 0xD7, 0x81, 0xDD, 0x73, 0xE3, - 0x09, 0x93, 0xBD, 0xBD, 0x7E, 0x08, 0x55, 0x4A, - 0x8C, 0xA5, 0xC9, 0x84, 0x2D, 0x71, 0x01, 0xA2, - 0x2A, 0x01, 0xB0, 0x15, 0xFB, 0x30, 0x78, 0xB9, - 0x13, 0xF4, 0xC7, 0x3F, 0xB5, 0xA6, 0xF1, 0xA2, - 0x5E, 0x22, 0xB0, 0x02, 0xB6, 0xE0, 0x09, 0x54, - 0x7F, 0x0F, 0xBD, 0xF0, 0xFE, 0xA5, 0x50, 0x1D, - 0x93, 0x15, 0xF9, 0x3D, 0x83, 0x0F, 0x0F, 0x0E, - 0x3D, 0xE2, 0x3D, 0x96, 0xE7, 0x09, 0xD9, 0x77, - 0x00, 0x01, 0x00, 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 -}; - -#endif \ No newline at end of file diff --git a/keys_retail.h b/keys_retail.h deleted file mode 100644 index 1b67784..0000000 --- a/keys_retail.h +++ /dev/null @@ -1,553 +0,0 @@ -#ifndef _KEYS_RETAIL_H_ -#define _KEYS_RETAIL_H_ - -#ifndef PUBLIC_BUILD -// AES KEYS -static const unsigned char common_key_prod_keyY0[16] = -{ - 0xD0, 0x7B, 0x33, 0x7F, 0x9C, 0xA4, 0x38, 0x59, - 0x32, 0xA2, 0xE2, 0x57, 0x23, 0x23, 0x2E, 0xB9 -}; - -static const unsigned char common_key_prod_keyY1[16] = -{ - 0x0C, 0x76, 0x72, 0x30, 0xF0, 0x99, 0x8F, 0x1C, - 0x46, 0x82, 0x82, 0x02, 0xFA, 0xAC, 0xBE, 0x4C -}; - -static const unsigned char common_key_prod_keyY2[16] = -{ - 0xC4, 0x75, 0xCB, 0x3A, 0xB8, 0xC7, 0x88, 0xBB, - 0x57, 0x5E, 0x12, 0xA1, 0x09, 0x07, 0xB8, 0xA4 -}; - -static const unsigned char common_key_prod_keyY3[16] = -{ - 0xE4, 0x86, 0xEE, 0xE3, 0xD0, 0xC0, 0x9C, 0x90, - 0x2F, 0x66, 0x86, 0xD4, 0xC0, 0x6F, 0x64, 0x9F -}; - -static const unsigned char common_key_prod_keyY4[16] = -{ - 0xED, 0x31, 0xBA, 0x9C, 0x04, 0xB0, 0x67, 0x50, - 0x6C, 0x44, 0x97, 0xA3, 0x5B, 0x78, 0x04, 0xFC -}; - -static const unsigned char common_key_prod_keyY5[16] = -{ - 0x5E, 0x66, 0x99, 0x8A, 0xB4, 0xE8, 0x93, 0x16, - 0x06, 0x85, 0x0F, 0xD7, 0xA1, 0x6D, 0xD7, 0x55 -}; - -// RSA KEYS -static const unsigned char retail_cert_root_rsa_pubk[0x200] = -{ - 0xF8, 0x24, 0x6C, 0x58, 0xBA, 0xE7, 0x50, 0x03, - 0x01, 0xFB, 0xB7, 0xC2, 0xEB, 0xE0, 0x01, 0x05, - 0x71, 0xDA, 0x92, 0x23, 0x78, 0xF0, 0x51, 0x4E, - 0xC0, 0x03, 0x1D, 0xD0, 0xD2, 0x1E, 0xD3, 0xD0, - 0x7E, 0xFC, 0x85, 0x20, 0x69, 0xB5, 0xDE, 0x9B, - 0xB9, 0x51, 0xA8, 0xBC, 0x90, 0xA2, 0x44, 0x92, - 0x6D, 0x37, 0x92, 0x95, 0xAE, 0x94, 0x36, 0xAA, - 0xA6, 0xA3, 0x02, 0x51, 0x0C, 0x7B, 0x1D, 0xED, - 0xD5, 0xFB, 0x20, 0x86, 0x9D, 0x7F, 0x30, 0x16, - 0xF6, 0xBE, 0x65, 0xD3, 0x83, 0xA1, 0x6D, 0xB3, - 0x32, 0x1B, 0x95, 0x35, 0x18, 0x90, 0xB1, 0x70, - 0x02, 0x93, 0x7E, 0xE1, 0x93, 0xF5, 0x7E, 0x99, - 0xA2, 0x47, 0x4E, 0x9D, 0x38, 0x24, 0xC7, 0xAE, - 0xE3, 0x85, 0x41, 0xF5, 0x67, 0xE7, 0x51, 0x8C, - 0x7A, 0x0E, 0x38, 0xE7, 0xEB, 0xAF, 0x41, 0x19, - 0x1B, 0xCF, 0xF1, 0x7B, 0x42, 0xA6, 0xB4, 0xED, - 0xE6, 0xCE, 0x8D, 0xE7, 0x31, 0x8F, 0x7F, 0x52, - 0x04, 0xB3, 0x99, 0x0E, 0x22, 0x67, 0x45, 0xAF, - 0xD4, 0x85, 0xB2, 0x44, 0x93, 0x00, 0x8B, 0x08, - 0xC7, 0xF6, 0xB7, 0xE5, 0x6B, 0x02, 0xB3, 0xE8, - 0xFE, 0x0C, 0x9D, 0x85, 0x9C, 0xB8, 0xB6, 0x82, - 0x23, 0xB8, 0xAB, 0x27, 0xEE, 0x5F, 0x65, 0x38, - 0x07, 0x8B, 0x2D, 0xB9, 0x1E, 0x2A, 0x15, 0x3E, - 0x85, 0x81, 0x80, 0x72, 0xA2, 0x3B, 0x6D, 0xD9, - 0x32, 0x81, 0x05, 0x4F, 0x6F, 0xB0, 0xF6, 0xF5, - 0xAD, 0x28, 0x3E, 0xCA, 0x0B, 0x7A, 0xF3, 0x54, - 0x55, 0xE0, 0x3D, 0xA7, 0xB6, 0x83, 0x26, 0xF3, - 0xEC, 0x83, 0x4A, 0xF3, 0x14, 0x04, 0x8A, 0xC6, - 0xDF, 0x20, 0xD2, 0x85, 0x08, 0x67, 0x3C, 0xAB, - 0x62, 0xA2, 0xC7, 0xBC, 0x13, 0x1A, 0x53, 0x3E, - 0x0B, 0x66, 0x80, 0x6B, 0x1C, 0x30, 0x66, 0x4B, - 0x37, 0x23, 0x31, 0xBD, 0xC4, 0xB0, 0xCA, 0xD8, - 0xD1, 0x1E, 0xE7, 0xBB, 0xD9, 0x28, 0x55, 0x48, - 0xAA, 0xEC, 0x1F, 0x66, 0xE8, 0x21, 0xB3, 0xC8, - 0xA0, 0x47, 0x69, 0x00, 0xC5, 0xE6, 0x88, 0xE8, - 0x0C, 0xCE, 0x3C, 0x61, 0xD6, 0x9C, 0xBB, 0xA1, - 0x37, 0xC6, 0x60, 0x4F, 0x7A, 0x72, 0xDD, 0x8C, - 0x7B, 0x3E, 0x3D, 0x51, 0x29, 0x0D, 0xAA, 0x6A, - 0x59, 0x7B, 0x08, 0x1F, 0x9D, 0x36, 0x33, 0xA3, - 0x46, 0x7A, 0x35, 0x61, 0x09, 0xAC, 0xA7, 0xDD, - 0x7D, 0x2E, 0x2F, 0xB2, 0xC1, 0xAE, 0xB8, 0xE2, - 0x0F, 0x48, 0x92, 0xD8, 0xB9, 0xF8, 0xB4, 0x6F, - 0x4E, 0x3C, 0x11, 0xF4, 0xF4, 0x7D, 0x8B, 0x75, - 0x7D, 0xFE, 0xFE, 0xA3, 0x89, 0x9C, 0x33, 0x59, - 0x5C, 0x5E, 0xFD, 0xEB, 0xCB, 0xAB, 0xE8, 0x41, - 0x3E, 0x3A, 0x9A, 0x80, 0x3C, 0x69, 0x35, 0x6E, - 0xB2, 0xB2, 0xAD, 0x5C, 0xC4, 0xC8, 0x58, 0x45, - 0x5E, 0xF5, 0xF7, 0xB3, 0x06, 0x44, 0xB4, 0x7C, - 0x64, 0x06, 0x8C, 0xDF, 0x80, 0x9F, 0x76, 0x02, - 0x5A, 0x2D, 0xB4, 0x46, 0xE0, 0x3D, 0x7C, 0xF6, - 0x2F, 0x34, 0xE7, 0x02, 0x45, 0x7B, 0x02, 0xA4, - 0xCF, 0x5D, 0x9D, 0xD5, 0x3C, 0xA5, 0x3A, 0x7C, - 0xA6, 0x29, 0x78, 0x8C, 0x67, 0xCA, 0x08, 0xBF, - 0xEC, 0xCA, 0x43, 0xA9, 0x57, 0xAD, 0x16, 0xC9, - 0x4E, 0x1C, 0xD8, 0x75, 0xCA, 0x10, 0x7D, 0xCE, - 0x7E, 0x01, 0x18, 0xF0, 0xDF, 0x6B, 0xFE, 0xE5, - 0x1D, 0xDB, 0xD9, 0x91, 0xC2, 0x6E, 0x60, 0xCD, - 0x48, 0x58, 0xAA, 0x59, 0x2C, 0x82, 0x00, 0x75, - 0xF2, 0x9F, 0x52, 0x6C, 0x91, 0x7C, 0x6F, 0xE5, - 0x40, 0x3E, 0xA7, 0xD4, 0xA5, 0x0C, 0xEC, 0x3B, - 0x73, 0x84, 0xDE, 0x88, 0x6E, 0x82, 0xD2, 0xEB, - 0x4D, 0x4E, 0x42, 0xB5, 0xF2, 0xB1, 0x49, 0xA8, - 0x1E, 0xA7, 0xCE, 0x71, 0x44, 0xDC, 0x29, 0x94, - 0xCF, 0xC4, 0x4E, 0x1F, 0x91, 0xCB, 0xD4, 0x95 -}; - -static const unsigned char RetailAccessDesc_pubMod[0x100] = -{ - 0xB1, 0xE3, 0xE3, 0x5F, 0x01, 0x39, 0x80, 0xD1, - 0x56, 0x78, 0x9D, 0xB7, 0x06, 0xF7, 0x1D, 0xBF, - 0x3E, 0x22, 0x76, 0xED, 0xF9, 0x5D, 0xA2, 0x36, - 0xB6, 0x30, 0x61, 0x05, 0x96, 0xD3, 0x00, 0xB9, - 0xED, 0xF1, 0xD7, 0xE0, 0x1D, 0xA0, 0x4F, 0xB7, - 0xCF, 0x5A, 0x19, 0x87, 0x75, 0x49, 0x88, 0x40, - 0xED, 0xE3, 0x6F, 0x7C, 0x90, 0x4A, 0x64, 0x45, - 0x98, 0xD7, 0x04, 0xB9, 0x5A, 0x6B, 0x45, 0xAA, - 0x7E, 0x94, 0xC0, 0xB3, 0xB7, 0xDB, 0x7B, 0x66, - 0x59, 0x20, 0xB7, 0x08, 0xE2, 0xF3, 0x83, 0xA3, - 0x7F, 0xE3, 0x20, 0x21, 0xA0, 0xEB, 0xB7, 0x28, - 0x0F, 0xF3, 0x2B, 0x15, 0xA4, 0xC9, 0xD0, 0xAB, - 0x89, 0x39, 0x99, 0x7E, 0x76, 0x5F, 0x9E, 0x4D, - 0x1E, 0x01, 0x22, 0x8D, 0x74, 0xA6, 0xEB, 0x9A, - 0xA3, 0x9D, 0x45, 0xE5, 0x10, 0x61, 0x6E, 0x20, - 0xFD, 0x23, 0x75, 0xC0, 0xC5, 0x05, 0x03, 0xC5, - 0x4C, 0x02, 0x4F, 0x54, 0x4B, 0x57, 0x08, 0xB4, - 0x46, 0xC3, 0x2C, 0xF1, 0xF9, 0x52, 0x6C, 0xCD, - 0x14, 0x55, 0xA8, 0x55, 0x92, 0x6D, 0xE2, 0x4A, - 0x41, 0x46, 0xEB, 0x08, 0xC5, 0xF3, 0xB4, 0x8D, - 0x0D, 0x5E, 0x21, 0xEA, 0xAF, 0x4D, 0x27, 0x4D, - 0xDE, 0x77, 0x93, 0x97, 0xE2, 0xC7, 0x6B, 0x66, - 0x1F, 0xDB, 0x2D, 0x6E, 0xA9, 0x5F, 0x61, 0x14, - 0x17, 0x7B, 0x2B, 0x66, 0x5A, 0xB5, 0x01, 0x89, - 0xF2, 0x23, 0x75, 0x25, 0x25, 0x9C, 0x86, 0x9A, - 0x89, 0xFF, 0x64, 0x1D, 0x5B, 0xCE, 0xD7, 0x7E, - 0x3F, 0x2D, 0xA8, 0xDA, 0xB5, 0x5A, 0xC5, 0x5F, - 0x59, 0x20, 0xB0, 0xED, 0x1C, 0x91, 0xFF, 0xA3, - 0x27, 0xB8, 0x8E, 0xCF, 0x82, 0x15, 0xE5, 0x49, - 0xEF, 0xE4, 0x58, 0xE1, 0x5F, 0x8F, 0x53, 0xB9, - 0x33, 0x2A, 0x56, 0x24, 0xAA, 0xA1, 0xD3, 0x6E, - 0x47, 0x1A, 0x63, 0x44, 0x19, 0xB3, 0x8E, 0xA5 -}; - -static const unsigned char RetailNcsdCfa_pubMod[0x100] = -{ - 0xFB, 0xDE, 0xB8, 0x2B, 0x40, 0x93, 0x0F, 0xF6, - 0xB1, 0x9A, 0x08, 0x06, 0x1B, 0x86, 0xFE, 0xD0, - 0xDF, 0x10, 0x79, 0x17, 0x3D, 0x8C, 0xE2, 0x7A, - 0xCE, 0x8F, 0x23, 0x45, 0xB9, 0x0A, 0x6D, 0xED, - 0x30, 0x0E, 0xC1, 0xA8, 0x92, 0xC4, 0xBD, 0x1A, - 0xCE, 0xA7, 0xAC, 0x77, 0xAA, 0x47, 0xE5, 0x20, - 0x4A, 0x44, 0x91, 0xDF, 0x1C, 0xFE, 0x86, 0x28, - 0x12, 0x2D, 0x66, 0xDF, 0xBE, 0xAD, 0x96, 0x61, - 0xED, 0xF2, 0xF7, 0x41, 0x7B, 0x57, 0x88, 0x6B, - 0x24, 0x1E, 0x7D, 0xEC, 0xBE, 0x98, 0x65, 0x65, - 0x36, 0x65, 0x99, 0xA9, 0xFE, 0x24, 0x67, 0x85, - 0x99, 0xEE, 0x2A, 0xAE, 0xEE, 0xB1, 0x81, 0x1A, - 0x22, 0xE3, 0x6D, 0x75, 0x6E, 0x21, 0xBC, 0xEF, - 0x11, 0x5C, 0x61, 0xAF, 0x0C, 0x30, 0x00, 0xB6, - 0xA2, 0x23, 0xED, 0xFE, 0x70, 0x15, 0xDA, 0x52, - 0xE1, 0xE6, 0x2D, 0xCE, 0x34, 0xE8, 0xAA, 0x4C, - 0xF1, 0xD6, 0x67, 0x56, 0x57, 0xD3, 0xDB, 0xC0, - 0x90, 0x49, 0x6F, 0x45, 0x73, 0x93, 0x4E, 0x30, - 0x30, 0x70, 0xF5, 0xC9, 0x8F, 0x31, 0x25, 0xF2, - 0xC2, 0xE7, 0x33, 0x7F, 0x4E, 0xB6, 0xF5, 0x2A, - 0xDF, 0x20, 0x00, 0xE5, 0x79, 0xB2, 0xD0, 0xF9, - 0x17, 0xF7, 0x7E, 0x16, 0x90, 0x40, 0x00, 0x57, - 0x91, 0x44, 0x78, 0xEF, 0x1C, 0xE0, 0x85, 0x09, - 0xDA, 0xF4, 0x14, 0x7E, 0x4B, 0xD7, 0x35, 0xD6, - 0x87, 0x54, 0x8F, 0x2A, 0xB5, 0xA7, 0x6F, 0x50, - 0xD0, 0xF7, 0xD1, 0xF1, 0x19, 0xC9, 0xAC, 0x22, - 0x7E, 0x05, 0x11, 0xF5, 0xF2, 0x6D, 0xEE, 0x92, - 0x27, 0x57, 0x5F, 0xE5, 0x15, 0x0D, 0x27, 0x68, - 0xBF, 0x52, 0x65, 0x74, 0x73, 0xA6, 0x58, 0x6D, - 0x79, 0x18, 0xAC, 0x31, 0xDD, 0xDD, 0x80, 0x8B, - 0x75, 0x24, 0xE1, 0x17, 0xE1, 0x95, 0x25, 0x16, - 0x29, 0xAB, 0x69, 0x69, 0xC8, 0x28, 0xEE, 0x5D -}; - -static const unsigned char retail_firm_pubk[0x100] = -{ - 0xDE, 0xCF, 0xB6, 0xFC, 0x3D, 0x33, 0xE9, 0x55, - 0xFD, 0xAC, 0x90, 0xE8, 0x88, 0x17, 0xB0, 0x03, - 0xA1, 0x6B, 0x9A, 0xAB, 0x72, 0x70, 0x79, 0x32, - 0xA2, 0xA0, 0x8C, 0xBB, 0x33, 0x6F, 0xB0, 0x76, - 0x96, 0x2E, 0xC4, 0xE9, 0x2E, 0xD8, 0x8F, 0x92, - 0xC0, 0x2D, 0x4D, 0x41, 0x0F, 0xDE, 0x45, 0x1B, - 0x25, 0x3C, 0xBE, 0x37, 0x6B, 0x45, 0x82, 0x21, - 0xE6, 0x4D, 0xB1, 0x23, 0x81, 0x82, 0xB6, 0x81, - 0x62, 0xB7, 0x30, 0xF4, 0x60, 0x4B, 0xC7, 0xF7, - 0xF0, 0x17, 0x0C, 0xB5, 0x75, 0x88, 0x77, 0x93, - 0x52, 0x63, 0x70, 0xF0, 0x0B, 0xC6, 0x73, 0x43, - 0x41, 0xEE, 0xE4, 0xF0, 0x71, 0xEC, 0xC8, 0xC1, - 0x32, 0xC4, 0xDC, 0xA9, 0x99, 0x1D, 0x31, 0xB8, - 0xA4, 0x7E, 0xDD, 0x19, 0x04, 0x0F, 0x02, 0xA8, - 0x1A, 0xAF, 0xB3, 0x48, 0x9A, 0x29, 0x29, 0x5E, - 0x49, 0x84, 0xE0, 0x94, 0x11, 0xD1, 0x7E, 0xAB, - 0xB2, 0xC0, 0x44, 0x7E, 0xA1, 0x1B, 0x5E, 0x9D, - 0x0D, 0x1A, 0xF9, 0x02, 0x9A, 0x2E, 0x53, 0x03, - 0x2D, 0x48, 0x96, 0x7C, 0x2C, 0xA6, 0xD7, 0xAC, - 0xF1, 0xED, 0x2B, 0x18, 0xBB, 0x01, 0xCB, 0x13, - 0xB9, 0xAC, 0xA6, 0xEE, 0x55, 0x00, 0x37, 0x7C, - 0x69, 0x61, 0x62, 0x89, 0x01, 0x54, 0x77, 0x9F, - 0x07, 0x5D, 0x26, 0x34, 0x3A, 0xA9, 0x49, 0xA5, - 0xAF, 0xF2, 0x5E, 0x06, 0x51, 0xB7, 0x1C, 0xE0, - 0xDE, 0xDA, 0x5C, 0x0B, 0x9F, 0x98, 0xC2, 0x15, - 0xFD, 0xBA, 0xD8, 0xA9, 0x99, 0x00, 0xAB, 0xA4, - 0x8E, 0x4A, 0x16, 0x9D, 0x66, 0x2A, 0xE8, 0x56, - 0x64, 0xB2, 0xB6, 0xC0, 0x93, 0xAF, 0x4D, 0x38, - 0xA0, 0x16, 0x5C, 0xE4, 0xBD, 0x62, 0xC2, 0x46, - 0x6B, 0xC9, 0x5A, 0x59, 0x4A, 0x72, 0x58, 0xFD, - 0xB2, 0xCC, 0x36, 0x87, 0x30, 0x85, 0xE8, 0xA1, - 0x04, 0x5B, 0xE0, 0x17, 0x9B, 0xD0, 0xEC, 0x9B -}; -#endif - -//Certificates -static const unsigned char ca3_dpki_cert[0x400] = -{ - 0x00, 0x01, 0x00, 0x03, 0x70, 0x41, 0x38, 0xEF, - 0xBB, 0xBD, 0xA1, 0x6A, 0x98, 0x7D, 0xD9, 0x01, - 0x32, 0x6D, 0x1C, 0x94, 0x59, 0x48, 0x4C, 0x88, - 0xA2, 0x86, 0x1B, 0x91, 0xA3, 0x12, 0x58, 0x7A, - 0xE7, 0x0E, 0xF6, 0x23, 0x7E, 0xC5, 0x0E, 0x10, - 0x32, 0xDC, 0x39, 0xDD, 0xE8, 0x9A, 0x96, 0xA8, - 0xE8, 0x59, 0xD7, 0x6A, 0x98, 0xA6, 0xE7, 0xE3, - 0x6A, 0x0C, 0xFE, 0x35, 0x2C, 0xA8, 0x93, 0x05, - 0x82, 0x34, 0xFF, 0x83, 0x3F, 0xCB, 0x3B, 0x03, - 0x81, 0x1E, 0x9F, 0x0D, 0xC0, 0xD9, 0xA5, 0x2F, - 0x80, 0x45, 0xB4, 0xB2, 0xF9, 0x41, 0x1B, 0x67, - 0xA5, 0x1C, 0x44, 0xB5, 0xEF, 0x8C, 0xE7, 0x7B, - 0xD6, 0xD5, 0x6B, 0xA7, 0x57, 0x34, 0xA1, 0x85, - 0x6D, 0xE6, 0xD4, 0xBE, 0xD6, 0xD3, 0xA2, 0x42, - 0xC7, 0xC8, 0x79, 0x1B, 0x34, 0x22, 0x37, 0x5E, - 0x5C, 0x77, 0x9A, 0xBF, 0x07, 0x2F, 0x76, 0x95, - 0xEF, 0xA0, 0xF7, 0x5B, 0xCB, 0x83, 0x78, 0x9F, - 0xC3, 0x0E, 0x3F, 0xE4, 0xCC, 0x83, 0x92, 0x20, - 0x78, 0x40, 0x63, 0x89, 0x49, 0xC7, 0xF6, 0x88, - 0x56, 0x5F, 0x64, 0x9B, 0x74, 0xD6, 0x3D, 0x8D, - 0x58, 0xFF, 0xAD, 0xDA, 0x57, 0x1E, 0x95, 0x54, - 0x42, 0x6B, 0x13, 0x18, 0xFC, 0x46, 0x89, 0x83, - 0xD4, 0xC8, 0xA5, 0x62, 0x8B, 0x06, 0xB6, 0xFC, - 0x5D, 0x50, 0x7C, 0x13, 0xE7, 0xA1, 0x8A, 0xC1, - 0x51, 0x1E, 0xB6, 0xD6, 0x2E, 0xA5, 0x44, 0x8F, - 0x83, 0x50, 0x14, 0x47, 0xA9, 0xAF, 0xB3, 0xEC, - 0xC2, 0x90, 0x3C, 0x9D, 0xD5, 0x2F, 0x92, 0x2A, - 0xC9, 0xAC, 0xDB, 0xEF, 0x58, 0xC6, 0x02, 0x18, - 0x48, 0xD9, 0x6E, 0x20, 0x87, 0x32, 0xD3, 0xD1, - 0xD9, 0xD9, 0xEA, 0x44, 0x0D, 0x91, 0x62, 0x1C, - 0x7A, 0x99, 0xDB, 0x88, 0x43, 0xC5, 0x9C, 0x1F, - 0x2E, 0x2C, 0x7D, 0x9B, 0x57, 0x7D, 0x51, 0x2C, - 0x16, 0x6D, 0x6F, 0x7E, 0x1A, 0xAD, 0x4A, 0x77, - 0x4A, 0x37, 0x44, 0x7E, 0x78, 0xFE, 0x20, 0x21, - 0xE1, 0x4A, 0x95, 0xD1, 0x12, 0xA0, 0x68, 0xAD, - 0xA0, 0x19, 0xF4, 0x63, 0xC7, 0xA5, 0x56, 0x85, - 0xAA, 0xBB, 0x68, 0x88, 0xB9, 0x24, 0x64, 0x83, - 0xD1, 0x8B, 0x9C, 0x80, 0x6F, 0x47, 0x49, 0x18, - 0x33, 0x17, 0x82, 0x34, 0x4A, 0x4B, 0x85, 0x31, - 0x33, 0x4B, 0x26, 0x30, 0x32, 0x63, 0xD9, 0xD2, - 0xEB, 0x4F, 0x4B, 0xB9, 0x96, 0x02, 0xB3, 0x52, - 0xF6, 0xAE, 0x40, 0x46, 0xC6, 0x9A, 0x5E, 0x7E, - 0x8E, 0x4A, 0x18, 0xEF, 0x9B, 0xC0, 0xA2, 0xDE, - 0xD6, 0x13, 0x10, 0x41, 0x70, 0x12, 0xFD, 0x82, - 0x4C, 0xC1, 0x16, 0xCF, 0xB7, 0xC4, 0xC1, 0xF7, - 0xEC, 0x71, 0x77, 0xA1, 0x74, 0x46, 0xCB, 0xDE, - 0x96, 0xF3, 0xED, 0xD8, 0x8F, 0xCD, 0x05, 0x2F, - 0x0B, 0x88, 0x8A, 0x45, 0xFD, 0xAF, 0x2B, 0x63, - 0x13, 0x54, 0xF4, 0x0D, 0x16, 0xE5, 0xFA, 0x9C, - 0x2C, 0x4E, 0xDA, 0x98, 0xE7, 0x98, 0xD1, 0x5E, - 0x60, 0x46, 0xDC, 0x53, 0x63, 0xF3, 0x09, 0x6B, - 0x2C, 0x60, 0x7A, 0x9D, 0x8D, 0xD5, 0x5B, 0x15, - 0x02, 0xA6, 0xAC, 0x7D, 0x3C, 0xC8, 0xD8, 0xC5, - 0x75, 0x99, 0x8E, 0x7D, 0x79, 0x69, 0x10, 0xC8, - 0x04, 0xC4, 0x95, 0x23, 0x50, 0x57, 0xE9, 0x1E, - 0xCD, 0x26, 0x37, 0xC9, 0xC1, 0x84, 0x51, 0x51, - 0xAC, 0x6B, 0x9A, 0x04, 0x90, 0xAE, 0x3E, 0xC6, - 0xF4, 0x77, 0x40, 0xA0, 0xDB, 0x0B, 0xA3, 0x6D, - 0x07, 0x59, 0x56, 0xCE, 0xE7, 0x35, 0x4E, 0xA3, - 0xE9, 0xA4, 0xF2, 0x72, 0x0B, 0x26, 0x55, 0x0C, - 0x7D, 0x39, 0x43, 0x24, 0xBC, 0x0C, 0xB7, 0xE9, - 0x31, 0x7D, 0x8A, 0x86, 0x61, 0xF4, 0x21, 0x91, - 0xFF, 0x10, 0xB0, 0x82, 0x56, 0xCE, 0x3F, 0xD2, - 0x5B, 0x74, 0x5E, 0x51, 0x94, 0x90, 0x6B, 0x4D, - 0x61, 0xCB, 0x4C, 0x2E, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x52, 0x6F, 0x6F, 0x74, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x43, 0x41, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x33, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7B, 0xE8, 0xEF, 0x6C, - 0xB2, 0x79, 0xC9, 0xE2, 0xEE, 0xE1, 0x21, 0xC6, - 0xEA, 0xF4, 0x4F, 0xF6, 0x39, 0xF8, 0x8F, 0x07, - 0x8B, 0x4B, 0x77, 0xED, 0x9F, 0x95, 0x60, 0xB0, - 0x35, 0x82, 0x81, 0xB5, 0x0E, 0x55, 0xAB, 0x72, - 0x11, 0x15, 0xA1, 0x77, 0x70, 0x3C, 0x7A, 0x30, - 0xFE, 0x3A, 0xE9, 0xEF, 0x1C, 0x60, 0xBC, 0x1D, - 0x97, 0x46, 0x76, 0xB2, 0x3A, 0x68, 0xCC, 0x04, - 0xB1, 0x98, 0x52, 0x5B, 0xC9, 0x68, 0xF1, 0x1D, - 0xE2, 0xDB, 0x50, 0xE4, 0xD9, 0xE7, 0xF0, 0x71, - 0xE5, 0x62, 0xDA, 0xE2, 0x09, 0x22, 0x33, 0xE9, - 0xD3, 0x63, 0xF6, 0x1D, 0xD7, 0xC1, 0x9F, 0xF3, - 0xA4, 0xA9, 0x1E, 0x8F, 0x65, 0x53, 0xD4, 0x71, - 0xDD, 0x7B, 0x84, 0xB9, 0xF1, 0xB8, 0xCE, 0x73, - 0x35, 0xF0, 0xF5, 0x54, 0x05, 0x63, 0xA1, 0xEA, - 0xB8, 0x39, 0x63, 0xE0, 0x9B, 0xE9, 0x01, 0x01, - 0x1F, 0x99, 0x54, 0x63, 0x61, 0x28, 0x70, 0x20, - 0xE9, 0xCC, 0x0D, 0xAB, 0x48, 0x7F, 0x14, 0x0D, - 0x66, 0x26, 0xA1, 0x83, 0x6D, 0x27, 0x11, 0x1F, - 0x20, 0x68, 0xDE, 0x47, 0x72, 0x14, 0x91, 0x51, - 0xCF, 0x69, 0xC6, 0x1B, 0xA6, 0x0E, 0xF9, 0xD9, - 0x49, 0xA0, 0xF7, 0x1F, 0x54, 0x99, 0xF2, 0xD3, - 0x9A, 0xD2, 0x8C, 0x70, 0x05, 0x34, 0x82, 0x93, - 0xC4, 0x31, 0xFF, 0xBD, 0x33, 0xF6, 0xBC, 0xA6, - 0x0D, 0xC7, 0x19, 0x5E, 0xA2, 0xBC, 0xC5, 0x6D, - 0x20, 0x0B, 0xAF, 0x6D, 0x06, 0xD0, 0x9C, 0x41, - 0xDB, 0x8D, 0xE9, 0xC7, 0x20, 0x15, 0x4C, 0xA4, - 0x83, 0x2B, 0x69, 0xC0, 0x8C, 0x69, 0xCD, 0x3B, - 0x07, 0x3A, 0x00, 0x63, 0x60, 0x2F, 0x46, 0x2D, - 0x33, 0x80, 0x61, 0xA5, 0xEA, 0x6C, 0x91, 0x5C, - 0xD5, 0x62, 0x35, 0x79, 0xC3, 0xEB, 0x64, 0xCE, - 0x44, 0xEF, 0x58, 0x6D, 0x14, 0xBA, 0xAA, 0x88, - 0x34, 0x01, 0x9B, 0x3E, 0xEB, 0xEE, 0xD3, 0x79, - 0x00, 0x01, 0x00, 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 -}; - -static const unsigned char xsC_dpki_cert[0x300] = -{ - 0x00, 0x01, 0x00, 0x04, 0x91, 0x9E, 0xBE, 0x46, - 0x4A, 0xD0, 0xF5, 0x52, 0xCD, 0x1B, 0x72, 0xE7, - 0x88, 0x49, 0x10, 0xCF, 0x55, 0xA9, 0xF0, 0x2E, - 0x50, 0x78, 0x96, 0x41, 0xD8, 0x96, 0x68, 0x3D, - 0xC0, 0x05, 0xBD, 0x0A, 0xEA, 0x87, 0x07, 0x9D, - 0x8A, 0xC2, 0x84, 0xC6, 0x75, 0x06, 0x5F, 0x74, - 0xC8, 0xBF, 0x37, 0xC8, 0x80, 0x44, 0x40, 0x95, - 0x02, 0xA0, 0x22, 0x98, 0x0B, 0xB8, 0xAD, 0x48, - 0x38, 0x3F, 0x6D, 0x28, 0xA7, 0x9D, 0xE3, 0x96, - 0x26, 0xCC, 0xB2, 0xB2, 0x2A, 0x0F, 0x19, 0xE4, - 0x10, 0x32, 0xF0, 0x94, 0xB3, 0x9F, 0xF0, 0x13, - 0x31, 0x46, 0xDE, 0xC8, 0xF6, 0xC1, 0xA9, 0xD5, - 0x5C, 0xD2, 0x8D, 0x9E, 0x1C, 0x47, 0xB3, 0xD1, - 0x1F, 0x4F, 0x54, 0x26, 0xC2, 0xC7, 0x80, 0x13, - 0x5A, 0x27, 0x75, 0xD3, 0xCA, 0x67, 0x9B, 0xC7, - 0xE8, 0x34, 0xF0, 0xE0, 0xFB, 0x58, 0xE6, 0x88, - 0x60, 0xA7, 0x13, 0x30, 0xFC, 0x95, 0x79, 0x17, - 0x93, 0xC8, 0xFB, 0xA9, 0x35, 0xA7, 0xA6, 0x90, - 0x8F, 0x22, 0x9D, 0xEE, 0x2A, 0x0C, 0xA6, 0xB9, - 0xB2, 0x3B, 0x12, 0xD4, 0x95, 0xA6, 0xFE, 0x19, - 0xD0, 0xD7, 0x26, 0x48, 0x21, 0x68, 0x78, 0x60, - 0x5A, 0x66, 0x53, 0x8D, 0xBF, 0x37, 0x68, 0x99, - 0x90, 0x5D, 0x34, 0x45, 0xFC, 0x5C, 0x72, 0x7A, - 0x0E, 0x13, 0xE0, 0xE2, 0xC8, 0x97, 0x1C, 0x9C, - 0xFA, 0x6C, 0x60, 0x67, 0x88, 0x75, 0x73, 0x2A, - 0x4E, 0x75, 0x52, 0x3D, 0x2F, 0x56, 0x2F, 0x12, - 0xAA, 0xBD, 0x15, 0x73, 0xBF, 0x06, 0xC9, 0x40, - 0x54, 0xAE, 0xFA, 0x81, 0xA7, 0x14, 0x17, 0xAF, - 0x9A, 0x4A, 0x06, 0x6D, 0x0F, 0xFC, 0x5A, 0xD6, - 0x4B, 0xAB, 0x28, 0xB1, 0xFF, 0x60, 0x66, 0x1F, - 0x44, 0x37, 0xD4, 0x9E, 0x1E, 0x0D, 0x94, 0x12, - 0xEB, 0x4B, 0xCA, 0xCF, 0x4C, 0xFD, 0x6A, 0x34, - 0x08, 0x84, 0x79, 0x82, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x52, 0x6F, 0x6F, 0x74, 0x2D, 0x43, 0x41, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x33, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x58, 0x53, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x63, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x13, 0x7A, 0x08, 0x94, - 0xAD, 0x50, 0x5B, 0xB6, 0xC6, 0x7E, 0x2E, 0x5B, - 0xDD, 0x6A, 0x3B, 0xEC, 0x43, 0xD9, 0x10, 0xC7, - 0x72, 0xE9, 0xCC, 0x29, 0x0D, 0xA5, 0x85, 0x88, - 0xB7, 0x7D, 0xCC, 0x11, 0x68, 0x0B, 0xB3, 0xE2, - 0x9F, 0x4E, 0xAB, 0xBB, 0x26, 0xE9, 0x8C, 0x26, - 0x01, 0x98, 0x5C, 0x04, 0x1B, 0xB1, 0x43, 0x78, - 0xE6, 0x89, 0x18, 0x1A, 0xAD, 0x77, 0x05, 0x68, - 0xE9, 0x28, 0xA2, 0xB9, 0x81, 0x67, 0xEE, 0x3E, - 0x10, 0xD0, 0x72, 0xBE, 0xEF, 0x1F, 0xA2, 0x2F, - 0xA2, 0xAA, 0x3E, 0x13, 0xF1, 0x1E, 0x18, 0x36, - 0xA9, 0x2A, 0x42, 0x81, 0xEF, 0x70, 0xAA, 0xF4, - 0xE4, 0x62, 0x99, 0x82, 0x21, 0xC6, 0xFB, 0xB9, - 0xBD, 0xD0, 0x17, 0xE6, 0xAC, 0x59, 0x04, 0x94, - 0xE9, 0xCE, 0xA9, 0x85, 0x9C, 0xEB, 0x2D, 0x2A, - 0x4C, 0x17, 0x66, 0xF2, 0xC3, 0x39, 0x12, 0xC5, - 0x8F, 0x14, 0xA8, 0x03, 0xE3, 0x6F, 0xCC, 0xDC, - 0xCC, 0xDC, 0x13, 0xFD, 0x7A, 0xE7, 0x7C, 0x7A, - 0x78, 0xD9, 0x97, 0xE6, 0xAC, 0xC3, 0x55, 0x57, - 0xE0, 0xD3, 0xE9, 0xEB, 0x64, 0xB4, 0x3C, 0x92, - 0xF4, 0xC5, 0x0D, 0x67, 0xA6, 0x02, 0xDE, 0xB3, - 0x91, 0xB0, 0x66, 0x61, 0xCD, 0x32, 0x88, 0x0B, - 0xD6, 0x49, 0x12, 0xAF, 0x1C, 0xBC, 0xB7, 0x16, - 0x2A, 0x06, 0xF0, 0x25, 0x65, 0xD3, 0xB0, 0xEC, - 0xE4, 0xFC, 0xEC, 0xDD, 0xAE, 0x8A, 0x49, 0x34, - 0xDB, 0x8E, 0xE6, 0x7F, 0x30, 0x17, 0x98, 0x62, - 0x21, 0x15, 0x5D, 0x13, 0x1C, 0x6C, 0x3F, 0x09, - 0xAB, 0x19, 0x45, 0xC2, 0x06, 0xAC, 0x70, 0xC9, - 0x42, 0xB3, 0x6F, 0x49, 0xA1, 0x18, 0x3B, 0xCD, - 0x78, 0xB6, 0xE4, 0xB4, 0x7C, 0x6C, 0x5C, 0xAC, - 0x0F, 0x8D, 0x62, 0xF8, 0x97, 0xC6, 0x95, 0x3D, - 0xD1, 0x2F, 0x28, 0xB7, 0x0C, 0x5B, 0x7D, 0xF7, - 0x51, 0x81, 0x9A, 0x98, 0x34, 0x65, 0x26, 0x25, - 0x00, 0x01, 0x00, 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 -}; - -static const unsigned char cpB_dpki_cert[0x300] = -{ - 0x00, 0x01, 0x00, 0x04, 0x2E, 0xA6, 0x6C, 0x66, - 0xCF, 0xF3, 0x35, 0x79, 0x7D, 0x04, 0x97, 0xB7, - 0x7A, 0x19, 0x7F, 0x9F, 0xE5, 0x1A, 0xB5, 0xA4, - 0x13, 0x75, 0xDC, 0x73, 0xFD, 0x9E, 0x0B, 0x10, - 0x66, 0x9B, 0x1B, 0x9A, 0x5B, 0x7E, 0x8A, 0xB2, - 0x8F, 0x01, 0xB6, 0x7B, 0x62, 0x54, 0xC1, 0x4A, - 0xA1, 0x33, 0x14, 0x18, 0xF2, 0x5B, 0xA5, 0x49, - 0x00, 0x4C, 0x37, 0x8D, 0xD7, 0x2F, 0x0C, 0xE6, - 0x3B, 0x1F, 0x70, 0x91, 0xAA, 0xFE, 0x38, 0x09, - 0xB7, 0xAC, 0x6C, 0x28, 0x76, 0xA6, 0x1D, 0x60, - 0x51, 0x6C, 0x43, 0xA6, 0x37, 0x29, 0x16, 0x2D, - 0x28, 0x0B, 0xE2, 0x1B, 0xE8, 0xE2, 0xFE, 0x05, - 0x7D, 0x8E, 0xB6, 0xE2, 0x04, 0x24, 0x22, 0x45, - 0x73, 0x1A, 0xB6, 0xFE, 0xE3, 0x0E, 0x53, 0x35, - 0x37, 0x3E, 0xEB, 0xA9, 0x70, 0xD5, 0x31, 0xBB, - 0xA2, 0xCB, 0x22, 0x2D, 0x96, 0x84, 0x38, 0x7D, - 0x5F, 0x2A, 0x1B, 0xF7, 0x52, 0x00, 0xCE, 0x06, - 0x56, 0xE3, 0x90, 0xCE, 0x19, 0x13, 0x5B, 0x59, - 0xE1, 0x4F, 0x0F, 0xA5, 0xC1, 0x28, 0x1A, 0x73, - 0x86, 0xCC, 0xD1, 0xC8, 0xEC, 0x3F, 0xAD, 0x70, - 0xFB, 0xCE, 0x74, 0xDE, 0xEE, 0x1F, 0xD0, 0x5F, - 0x46, 0x33, 0x0B, 0x51, 0xF9, 0xB7, 0x9E, 0x1D, - 0xDB, 0xF4, 0xE3, 0x3F, 0x14, 0x88, 0x9D, 0x05, - 0x28, 0x29, 0x24, 0xC5, 0xF5, 0xDC, 0x27, 0x66, - 0xEF, 0x06, 0x27, 0xD7, 0xEE, 0xDC, 0x73, 0x6E, - 0x67, 0xC2, 0xE5, 0xB9, 0x38, 0x34, 0x66, 0x80, - 0x72, 0x21, 0x6D, 0x1C, 0x78, 0xB8, 0x23, 0xA0, - 0x72, 0xD3, 0x4F, 0xF3, 0xEC, 0xF9, 0xBD, 0x11, - 0xA2, 0x9A, 0xF1, 0x6C, 0x33, 0xBD, 0x09, 0xAF, - 0xB2, 0xD7, 0x4D, 0x53, 0x4E, 0x02, 0x7C, 0x19, - 0x24, 0x0D, 0x59, 0x5A, 0x68, 0xEB, 0xB3, 0x05, - 0xAC, 0xC4, 0x4A, 0xB3, 0x8A, 0xB8, 0x20, 0xC6, - 0xD4, 0x26, 0x56, 0x0C, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x52, 0x6F, 0x6F, 0x74, 0x2D, 0x43, 0x41, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x33, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x43, 0x50, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x62, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x13, 0x7A, 0x08, 0x0B, - 0xA6, 0x89, 0xC5, 0x90, 0xFD, 0x0B, 0x2F, 0x0D, - 0x4F, 0x56, 0xB6, 0x32, 0xFB, 0x93, 0x4E, 0xD0, - 0x73, 0x95, 0x17, 0xB3, 0x3A, 0x79, 0xDE, 0x04, - 0x0E, 0xE9, 0x2D, 0xC3, 0x1D, 0x37, 0xC7, 0xF7, - 0x3B, 0xF0, 0x4B, 0xD3, 0xE4, 0x4E, 0x20, 0xAB, - 0x5A, 0x6F, 0xEA, 0xF5, 0x98, 0x4C, 0xC1, 0xF6, - 0x06, 0x2E, 0x9A, 0x9F, 0xE5, 0x6C, 0x32, 0x85, - 0xDC, 0x6F, 0x25, 0xDD, 0xD5, 0xD0, 0xBF, 0x9F, - 0xE2, 0xEF, 0xE8, 0x35, 0xDF, 0x26, 0x34, 0xED, - 0x93, 0x7F, 0xAB, 0x02, 0x14, 0xD1, 0x04, 0x80, - 0x9C, 0xF7, 0x4B, 0x86, 0x0E, 0x6B, 0x04, 0x83, - 0xF4, 0xCD, 0x2D, 0xAB, 0x2A, 0x96, 0x02, 0xBC, - 0x56, 0xF0, 0xD6, 0xBD, 0x94, 0x6A, 0xED, 0x6E, - 0x0B, 0xE4, 0xF0, 0x8F, 0x26, 0x68, 0x6B, 0xD0, - 0x9E, 0xF7, 0xDB, 0x32, 0x5F, 0x82, 0xB1, 0x8F, - 0x6A, 0xF2, 0xED, 0x52, 0x5B, 0xFD, 0x82, 0x8B, - 0x65, 0x3F, 0xEE, 0x6E, 0xCE, 0x40, 0x0D, 0x5A, - 0x48, 0xFF, 0xE2, 0x2D, 0x53, 0x8B, 0xB5, 0x33, - 0x5B, 0x41, 0x53, 0x34, 0x2D, 0x43, 0x35, 0xAC, - 0xF5, 0x90, 0xD0, 0xD3, 0x0A, 0xE2, 0x04, 0x3C, - 0x7F, 0x5A, 0xD2, 0x14, 0xFC, 0x9C, 0x0F, 0xE6, - 0xFA, 0x40, 0xA5, 0xC8, 0x65, 0x06, 0xCA, 0x63, - 0x69, 0xBC, 0xEE, 0x44, 0xA3, 0x2D, 0x9E, 0x69, - 0x5C, 0xF0, 0x0B, 0x4F, 0xD7, 0x9A, 0xDB, 0x56, - 0x8D, 0x14, 0x9C, 0x20, 0x28, 0xA1, 0x4C, 0x9D, - 0x71, 0xB8, 0x50, 0xCA, 0x36, 0x5B, 0x37, 0xF7, - 0x0B, 0x65, 0x77, 0x91, 0xFC, 0x5D, 0x72, 0x8C, - 0x4E, 0x18, 0xFD, 0x22, 0x55, 0x7C, 0x40, 0x62, - 0xD7, 0x47, 0x71, 0x53, 0x3C, 0x70, 0x17, 0x9D, - 0x3D, 0xAE, 0x8F, 0x92, 0xB1, 0x17, 0xE4, 0x5C, - 0xB3, 0x32, 0xF3, 0xB3, 0xC2, 0xA2, 0x2E, 0x70, - 0x5C, 0xFE, 0xC6, 0x6F, 0x6D, 0xA3, 0x77, 0x2B, - 0x00, 0x01, 0x00, 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 -}; - -#endif \ No newline at end of file diff --git a/keyset.c b/keyset.c deleted file mode 100644 index 6414026..0000000 --- a/keyset.c +++ /dev/null @@ -1,231 +0,0 @@ -#include "lib.h" - -// KeyData -#include "keys_common.h" -#include "keys_retail.h" -#ifndef PUBLIC_BUILD -#include "keys_debug.h" -#endif - -// Private Prototypes -int SetRsaKeySet(u8 **PrivDest, u8 *PrivSource, u8 **PubDest, u8 *PubSource); -int SetUnFixedKey(keys_struct *keys, u8 *UnFixedKey); -void InitCommonKeySlots(keys_struct *keys); - -int SetTIK_RsaKey(keys_struct *keys, u8 *PrivateExp, u8 *PublicMod); -int SetTMD_RsaKey(keys_struct *keys, u8 *PrivateExp, u8 *PublicMod); -int SetCFA_RsaKey(keys_struct *keys, u8 *PrivateExp, u8 *PublicMod); -int SetCCI_RsaKey(keys_struct *keys, u8 *PrivateExp, u8 *PublicMod); -int SetAccessDesc_RsaKey(keys_struct *keys, u8 *PrivateExp, u8 *PublicMod); -int SetCXI_RsaKey(keys_struct *keys, u8 *PrivateExp, u8 *PublicMod); - -int SetCaCert(keys_struct *keys, u8 *Cert); -int SetTikCert(keys_struct *keys, u8 *Cert); -int SetTmdCert(keys_struct *keys, u8 *Cert); - - -// Code -void InitKeys(keys_struct *keys) -{ - memset(keys,0,sizeof(keys_struct)); - InitCommonKeySlots(keys); -} - -void SetKeys(keys_struct *keys) -{ - if(keys->keyset == keyset_RETAIL){ - /* AES Keys */ - // CIA - //SetCommonKey(keys,(u8*)zeros_fixed_aesKey,1); - SetCurrentCommonKey(keys,1); - - // NCCH - keys->aes.NormalKey = (u8*)zeros_fixed_aesKey; - SetSystemFixedKey(keys,(u8*)system_fixed_aesKey); - - /* RSA Keys */ - keys->rsa.FalseSign = true; - // CIA - SetTIK_RsaKey(keys,(u8*)Dummy_rsa_privExp,(u8*)Dummy_rsa_pubMod); - SetTMD_RsaKey(keys,(u8*)Dummy_rsa_privExp,(u8*)Dummy_rsa_pubMod); - // CFA - SetCFA_RsaKey(keys,(u8*)Dummy_rsa_privExp,(u8*)Dummy_rsa_pubMod); - // CCI - SetCCI_RsaKey(keys,(u8*)Dummy_rsa_privExp,(u8*)Dummy_rsa_pubMod); - // CXI - SetAccessDesc_RsaKey(keys,(u8*)Dummy_rsa_privExp,(u8*)Dummy_rsa_pubMod); - - /* Certs */ - SetCaCert(keys,(u8*)ca3_dpki_cert); - SetTikCert(keys,(u8*)xsC_dpki_cert); - SetTmdCert(keys,(u8*)cpB_dpki_cert); - } -#ifndef PUBLIC_BUILD - else if(keys->keyset == keyset_DEBUG){ - /* AES Keys */ - // CIA - SetCommonKey(keys,(u8*)ctr_aes_common_key_dev0,0); - SetCommonKey(keys,(u8*)ctr_aes_common_key_dev1,1); - SetCurrentCommonKey(keys,0); - - // NCCH - keys->aes.NormalKey = (u8*)zeros_fixed_aesKey; - SetSystemFixedKey(keys,(u8*)system_fixed_aesKey); - - /* RSA Keys */ - // CIA - SetTIK_RsaKey(keys,(u8*)xs9_dpki_rsa_privExp,(u8*)xs9_dpki_rsa_pubMod); - SetTMD_RsaKey(keys,(u8*)cpA_dpki_rsa_privExp,(u8*)cpA_dpki_rsa_pubMod); - // CFA - SetCFA_RsaKey(keys,(u8*)DevNcsdCfa_privExp,(u8*)DevNcsdCfa_pubMod); - // CCI - SetCCI_RsaKey(keys,(u8*)DevNcsdCfa_privExp,(u8*)DevNcsdCfa_pubMod); - // CXI - SetAccessDesc_RsaKey(keys,(u8*)AccessDesc_privExp,(u8*)AccessDesc_pubMod); - - /* Certs */ - SetCaCert(keys,(u8*)ca4_dpki_cert); - SetTikCert(keys,(u8*)xs9_dpki_cert); - SetTmdCert(keys,(u8*)cpA_dpki_cert); - } -#endif - // Checking if AccessDesc can be signed - u8 *tmp = malloc(0x100); - memset(tmp,0,0x100); - if(memcmp(tmp,keys->rsa.AccessDesc_Priv,0x100) == 0) - keys->rsa.RequiresPresignedDesc = true; - else - keys->rsa.RequiresPresignedDesc = false; - - free(tmp); - - return; -} - -void FreeKeys(keys_struct *keys) -{ - // AES - if(keys->aes.CommonKey){ - for(int i = 0; i < 256; i++){ - free(keys->aes.CommonKey[i]); - } - } - free(keys->aes.CommonKey); - free(keys->aes.SystemFixedKey); - free(keys->aes.UnFixedKey); - - // RSA - free(keys->rsa.TIK_Priv); - free(keys->rsa.TIK_Pub); - free(keys->rsa.TMD_Priv); - free(keys->rsa.TMD_Pub); - - free(keys->rsa.CFA_Priv); - free(keys->rsa.CFA_Pub); - - free(keys->rsa.CCI_Priv); - free(keys->rsa.CCI_Pub); - - free(keys->rsa.AccessDesc_Priv); - free(keys->rsa.AccessDesc_Pub); - - // Certs - free(keys->certs.ca_cert); - free(keys->certs.tik_cert); - free(keys->certs.tmd_cert); - memset(keys,0,sizeof(keys_struct)); -} - -int SetRsaKeySet(u8 **PrivDest, u8 *PrivSource, u8 **PubDest, u8 *PubSource) -{ - int result = 0; - if(PrivSource){ - result = CopyData(PrivDest,PrivSource,0x100); - if(result) return result; - } - if(PubSource){ - result = CopyData(PubDest,PubSource,0x100); - if(result) return result; - } - return 0; -} - -int SetCommonKey(keys_struct *keys, u8 *CommonKey, u8 Index) -{ - if(!keys) return -1; - return CopyData(&keys->aes.CommonKey[Index],CommonKey,16); -} - -void InitCommonKeySlots(keys_struct *keys) -{ - if(!keys->aes.CommonKey){ - keys->aes.CommonKey = malloc(sizeof(u8*)*256); - memset(keys->aes.CommonKey,0,sizeof(u8*)*256); - } -} - -int SetCurrentCommonKey(keys_struct *keys, u8 Index) -{ - if(!keys) return -1; - keys->aes.CurrentCommonKey = Index; - return 0; -} - -int SetSystemFixedKey(keys_struct *keys, u8 *SystemFixedKey) -{ - if(!keys) return -1; - return CopyData(&keys->aes.SystemFixedKey,SystemFixedKey,16); -} - -int SetUnFixedKey(keys_struct *keys, u8 *UnFixedKey) -{ - if(!keys) return -1; - return CopyData(&keys->aes.UnFixedKey,UnFixedKey,16); -} - -int SetTIK_RsaKey(keys_struct *keys, u8 *PrivateExp, u8 *PublicMod) -{ - if(!keys) return -1; - return SetRsaKeySet(&keys->rsa.TIK_Priv,PrivateExp,&keys->rsa.TIK_Pub,PublicMod); -} - -int SetTMD_RsaKey(keys_struct *keys, u8 *PrivateExp, u8 *PublicMod) -{ - if(!keys) return -1; - return SetRsaKeySet(&keys->rsa.TMD_Priv,PrivateExp,&keys->rsa.TMD_Pub,PublicMod); -} - -int SetCFA_RsaKey(keys_struct *keys, u8 *PrivateExp, u8 *PublicMod) -{ - if(!keys) return -1; - return SetRsaKeySet(&keys->rsa.CFA_Priv,PrivateExp,&keys->rsa.CFA_Pub,PublicMod); -} - -int SetCCI_RsaKey(keys_struct *keys, u8 *PrivateExp, u8 *PublicMod) -{ - if(!keys) return -1; - return SetRsaKeySet(&keys->rsa.CCI_Priv,PrivateExp,&keys->rsa.CCI_Pub,PublicMod); -} - -int SetAccessDesc_RsaKey(keys_struct *keys, u8 *PrivateExp, u8 *PublicMod) -{ - if(!keys) return -1; - return SetRsaKeySet(&keys->rsa.AccessDesc_Priv,PrivateExp,&keys->rsa.AccessDesc_Pub,PublicMod); -} - -int SetCaCert(keys_struct *keys, u8 *Cert) -{ - if(!keys) return -1; - return CopyData(&keys->certs.ca_cert,Cert,0x400); -} -int SetTikCert(keys_struct *keys, u8 *Cert) -{ - if(!keys) return -1; - return CopyData(&keys->certs.tik_cert,Cert,0x300); -} - -int SetTmdCert(keys_struct *keys, u8 *Cert) -{ - if(!keys) return -1; - return CopyData(&keys->certs.tmd_cert,Cert,0x400); -} \ No newline at end of file diff --git a/keyset.h b/keyset.h deleted file mode 100644 index 1197679..0000000 --- a/keyset.h +++ /dev/null @@ -1,83 +0,0 @@ -#ifndef _KEYSET_H_ -#define _KEYSET_H_ - -typedef enum -{ - keyset_DEBUG, - keyset_RETAIL, -} keysets; - -typedef enum -{ - not_preset, - app, - dlp, - demo, -} fixed_accessdesc_type; - -// Structs - -typedef struct -{ - keysets keyset; - - struct - { - fixed_accessdesc_type PresetType; - u32 TargetFirmware; - } AccessDescSign; - - struct - { - // CIA - u8 **CommonKey; - u8 CurrentCommonKey; - - // NCCH Keys - u8 *NormalKey; - u8 *SystemFixedKey; - u8 *UnFixedKey; - } aes; - - struct - { - bool FalseSign; - // CIA RSA - u8 *TMD_Priv; - u8 *TMD_Pub; - u8 *TIK_Priv; - u8 *TIK_Pub; - - // CFA - u8 *CFA_Priv; - u8 *CFA_Pub; - - // CCI - u8 *CCI_Priv; - u8 *CCI_Pub; - - // CXI - bool RequiresPresignedDesc; - u8 *AccessDesc_Priv; - u8 *AccessDesc_Pub; - } rsa; - - struct - { - // CIA - u8 *ca_cert; - u8 *tik_cert; - u8 *tmd_cert; - } certs; -} keys_struct; - -#endif - -// Public Prototypes -void InitKeys(keys_struct *keys); -void SetKeys(keys_struct *keys); -void FreeKeys(keys_struct *keys); - -int SetCommonKey(keys_struct *keys, u8 *CommonKey, u8 Index); -int SetCurrentCommonKey(keys_struct *keys, u8 Index); -int SetSystemFixedKey(keys_struct *keys, u8 *SystemFixedKey); diff --git a/lib.h b/lib.h deleted file mode 100644 index 4dda1ab..0000000 --- a/lib.h +++ /dev/null @@ -1,35 +0,0 @@ -#define _LARGEFILE_SOURCE -#define _LARGEFILE64_SOURCE -#define _FILE_OFFSET_BITS 64 - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef _WIN32 - #include - #include - #include - //#include -#else - #include - #include -#endif - - -#include "types.h" -#include "utils.h" -#include "crypto.h" - -#include "keyset.h" -#include "usersettings.h" -#include "libyaml/yaml.h" -#include "yaml_ctr.h" - - diff --git a/logo_data.h b/logo_data.h deleted file mode 100644 index 66ec98a..0000000 --- a/logo_data.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef _LOGO_DATA_H_ -#define _LOGO_DATA_H_ - -static const unsigned char Nintendo_LZ[0x2000] = -{ - 0x11, 0x48, 0x65, 0x00, 0x00, 0x64, 0x61, 0x72, 0x63, 0xFF, 0xFE, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x28, 0x65, 0x00, 0x00, 0x83, 0x30, 0x09, 0x1C, 0x04, 0x00, 0x00, 0x40, 0x20, 0x03, 0x30, 0x13, 0xAB, 0x30, 0x18, 0x15, 0x20, 0x1D, 0x02, 0xA0, 0x0B, 0x06, 0x20, 0x2B, 0x30, 0x18, 0x5A, 0x09, 0x20, 0x35, 0x10, 0x20, 0x39, 0x30, 0x2B, 0xF8, 0x20, 0x41, 0x54, 0x85, 0x30, 0x0B, 0x05, 0x00, 0x00, 0xEC, 0x20, 0x4D, 0x98, 0x30, 0x17, 0xD0, 0x20, 0x28, 0x30, 0x17, 0xDC, 0x30, 0x23, 0x07, 0x00, 0x00, 0xCC, 0x09, 0x0C, 0x00, 0x00, 0x20, 0x20, 0x51, 0x20, 0x14, 0x20, 0x2B, 0xA0, 0x20, 0x0B, 0x64, 0x20, 0x5D, 0x80, 0x20, 0x00, 0x00, 0x4C, 0x99, 0x20, 0x5C, 0xA8, 0x01, 0x50, 0x53, 0x20, 0x22, 0x00, 0xB2, 0x20, 0x75, 0x34, 0xE0, 0x22, 0x20, 0x13, 0x20, 0x74, 0xE2, 0x20, 0x81, 0xA0, 0x25, 0x13, 0x00, 0x00, 0x3C, 0x20, 0x68, 0x12, 0x02, 0x50, 0x77, 0x30, 0x8F, 0x41, 0x1C, 0x20, 0x90, 0x00, 0x36, 0x00, 0x00, 0x28, 0x20, 0xAB, 0x4D, 0x3E, 0x20, 0x9C, 0x80, 0x3A, 0x20, 0x0B, 0x20, 0xAD, 0x60, 0x30, 0x17, 0x54, 0x3C, 0x50, 0x17, 0x82, 0x30, 0x17, 0x40, 0x20, 0x23, 0x08, 0x00, 0x2D, 0x00, 0xA4, 0x30, 0x2F, 0x49, 0x20, 0x67, 0x20, 0xE9, 0xC4, 0x30, 0x3B, 0x56, 0x4A, 0x50, 0x17, 0xDC, 0x30, 0x3B, 0x52, 0x20, 0x47, 0x20, 0xE0, 0xF4, 0xB2, 0x30, 0x53, 0x55, 0x20, 0x53, 0x30, 0xD4, 0x00, 0x2E, 0x21, 0x13, 0x61, 0x02, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x6D, 0x21, 0x1D, 0x4E, 0x82, 0x20, 0x07, 0x6E, 0x00, 0x74, 0x00, 0x65, 0x20, 0x11, 0x64, 0x0A, 0x00, 0x6F, 0x00, 0x4C, 0x20, 0x03, 0x67, 0x20, 0x07, 0x5F, 0x28, 0x00, 0x44, 0x20, 0x03, 0x30, 0x20, 0x01, 0x5F, 0x00, 0x53, 0x20, 0x00, 0x63, 0x40, 0x1F, 0x65, 0x00, 0x4F, 0x00, 0x75, 0xAB, 0x20, 0x2B, 0x41, 0x20, 0x43, 0x62, 0x20, 0x13, 0x6C, 0x40, 0x47, 0x02, 0x50, 0x43, 0x57, 0x42, 0x03, 0x20, 0x43, 0x43, 0x01, 0x80, 0x87, 0x55, 0x03, 0x20, 0xCB, 0x00, 0x90, 0x43, 0x01, 0x90, 0xCB, 0xD7, 0x00, 0x90, 0x87, 0xF0, 0xCB, 0x62, 0x21, 0x5D, 0x79, 0x21, 0x97, 0x01, 0x31, 0xA1, 0x71, 0x8D, 0xEA, 0x00, 0xF0, 0x2F, 0x71, 0x05, 0xD0, 0x2F, 0x74, 0x42, 0x09, 0x67, 0x23, 0x29, 0x33, 0xBD, 0x22, 0x01, 0x73, 0xA2, 0x01, 0xB0, 0x5B, 0x52, 0x2D, 0x00, 0x10, 0x21, 0x31, 0x01, 0x00, 0x21, 0x55, 0x32, 0x01, 0x00, 0x43, 0x33, 0xE0, 0x65, 0x4C, 0x23, 0x71, 0x4D, 0x22, 0xA3, 0x1F, 0x73, 0x00, 0x6B, 0x00, 0x40, 0x85, 0x30, 0x1F, 0x00, 0xB0, 0x17, 0xF0, 0x93, 0xF2, 0xE3, 0x41, 0x5F, 0x20, 0xB5, 0x32, 0x00, 0x38, 0x00, 0x78, 0x23, 0x68, 0x60, 0x34, 0xE0, 0xE1, 0x70, 0x02, 0x43, 0x4C, 0x41, 0x4E, 0xFF, 0x46, 0xFE, 0x23, 0xD0, 0x00, 0x02, 0x02, 0x34, 0x03, 0x33, 0x96, 0x70, 0x1D, 0x61, 0x74, 0x31, 0x23, 0x82, 0x44, 0x3E, 0x34, 0x59, 0x28, 0x33, 0x73, 0x10, 0xFF, 0xFF, 0xFF, 0x34, 0x4C, 0x53, 0x63, 0x65, 0x6E, 0x04, 0x65, 0x4F, 0x75, 0x74, 0x41, 0x24, 0x71, 0x47, 0x5F, 0x0C, 0x41, 0x5F, 0x30, 0x30, 0xA0, 0x4C, 0x40, 0x3B, 0x69, 0x31, 0xCD, 0x33, 0xA3, 0x50, 0x3F, 0x02, 0x00, 0x30, 0x59, 0x34, 0x9D, 0x68, 0x24, 0xA1, 0x00, 0x50, 0x5F, 0x4E, 0x69, 0x6E, 0x4C, 0x6F, 0x67, 0x70, 0x6F, 0xA0, 0x35, 0x34, 0xA0, 0x34, 0xBD, 0x43, 0x4C, 0x56, 0x43, 0x8F, 0x74, 0x3F, 0x00, 0x10, 0x02, 0x40, 0x87, 0x40, 0x0B, 0xD0, 0x5D, 0x20, 0x76, 0x20, 0x7F, 0x43, 0x34, 0xEC, 0x4E, 0x5F, 0x52, 0x6F, 0x6F, 0x73, 0x74, 0xD0, 0x7E, 0x00, 0x70, 0x4B, 0x80, 0x57, 0x00, 0x20, 0x20, 0x3B, 0x50, 0x3F, 0xF8, 0x00, 0x30, 0xFF, 0x34, 0xF7, 0xB0, 0xFF, 0x24, 0xD2, 0x80, 0xFF, 0x00, 0x00, 0x1E, 0xD5, 0x45, 0x4C, 0x70, 0xFF, 0x42, 0x40, 0xFF, 0x42, 0x00, 0x40, 0xFF, 0x9C, 0x80, 0x2D, 0xB2, 0x90, 0xFF, 0x5C, 0x01, 0xE0, 0xFF, 0x90, 0xB3, 0x34, 0xC2, 0x02, 0xD0, 0xF3, 0xC8, 0xFD, 0x20, 0xAA, 0xD0, 0xF3, 0x00, 0x70, 0xFF, 0xF1, 0xFF, 0x31, 0x39, 0x71, 0xFF, 0x65, 0x23, 0x31, 0xC5, 0xB1, 0xFF, 0x31, 0x84, 0x47, 0x5F, 0x43, 0x00, 0x81, 0xFF, 0x0F, 0xE1, 0xFF, 0x99, 0x02, 0x90, 0xFF, 0x12, 0xC3, 0x02, 0x31, 0xF3, 0x92, 0x3F, 0x80, 0xBF, 0x91, 0xF3, 0x7B, 0x60, 0x32, 0xB6, 0x00, 0x80, 0xFF, 0x36, 0xDF, 0x03, 0x32, 0xFF, 0x7C, 0x27, 0x27, 0x53, 0x3F, 0x55, 0x0D, 0x42, 0xFF, 0x48, 0x27, 0x9D, 0xB0, 0x27, 0xA1, 0xA4, 0x27, 0x8D, 0x60, 0x24, 0x27, 0x88, 0x36, 0xCB, 0x30, 0x03, 0x00, 0x00, 0xBC, 0xAD, 0x20, 0x03, 0x24, 0x27, 0xAB, 0x88, 0x37, 0x73, 0x27, 0x94, 0xB0, 0x26, 0xE7, 0x02, 0x74, 0x0A, 0x00, 0x00, 0x78, 0x0B, 0x32, 0xDF, 0x57, 0xF9, 0x00, 0x03, 0x5B, 0x37, 0x32, 0x27, 0x6E, 0x26, 0xB1, 0x33, 0xB7, 0x50, 0x41, 0x83, 0x2F, 0x71, 0x02, 0xF2, 0xE3, 0x73, 0xDB, 0x01, 0x13, 0x07, 0x50, 0x5F, 0x33, 0x00, 0x80, 0x67, 0x77, 0xB8, 0x60, 0x67, 0x20, 0xAA, 0x43, 0xC7, 0x38, 0x63, 0xC7, 0x30, 0x6F, 0x93, 0x9F, 0x53, 0xA0, 0x24, 0x0A, 0xA0, 0x27, 0xA5, 0x80, 0xBE, 0x24, 0x39, 0x23, 0x16, 0x23, 0xA0, 0xC0, 0x48, 0x79, 0x06, 0x02, 0x00, 0x30, 0x37, 0x70, 0x23, 0x00, 0x33, 0x33, 0xB3, 0x3F, 0xFC, 0x2D, 0xEC, 0xBC, 0x8C, 0x70, 0x0B, 0x0A, 0xD7, 0x23, 0x20, 0x0B, 0x30, 0x2F, 0x80, 0x3F, 0xBC, 0x48, 0xA9, 0x07, 0x01, 0xD0, 0x2F, 0xF4, 0x2F, 0xB0, 0x6B, 0x39, 0x0C, 0x40, 0x9D, 0x6F, 0x1C, 0x30, 0x97, 0x61, 0xEF, 0xCC, 0x28, 0x45, 0x30, 0x9B, 0x70, 0xF3, 0x24, 0x87, 0xDC, 0xE4, 0xB9, 0x71, 0x5B, 0x50, 0xF1, 0x5B, 0x29, 0x39, 0xD4, 0x8B, 0x80, 0x41, 0x17, 0xCD, 0xCC, 0xCC, 0x20, 0xEB, 0x20, 0x34, 0x02, 0x00, 0x41, 0x67, 0x00, 0x14, 0xBB, 0xE6, 0x30, 0x7F, 0x30, 0x2F, 0x71, 0x73, 0x44, 0x73, 0xF5, 0x38, 0x01, 0xA0, 0x7F, 0xC1, 0xA3, 0x20, 0x7F, 0x3E, 0x02, 0xD0, 0x7F, 0x52, 0x65, 0x64, 0x01, 0x70, 0xFF, 0xC1, 0xEB, 0x85, 0x45, 0x43, 0xC2, 0xB7, 0x6D, 0xDB, 0x20, 0x7F, 0x8C, 0x25, 0x02, 0x35, 0x20, 0xC1, 0x00, 0xD1, 0x8B, 0xB6, 0x1B, 0x5C, 0xA4, 0x87, 0xB4, 0x41, 0x3B, 0x0B, 0x92, 0x24, 0xE9, 0xC0, 0x60, 0x8B, 0x31, 0x00, 0x32, 0xE7, 0x35, 0x33, 0xD7, 0xF2, 0xE7, 0x92, 0x53, 0xF0, 0x26, 0x82, 0x20, 0x25, 0x1B, 0x90, 0x0B, 0x50, 0x97, 0xFA, 0x34, 0xEF, 0x00, 0x50, 0x97, 0x96, 0x53, 0x30, 0x3B, 0x77, 0x04, 0xAA, 0xF1, 0x17, 0x32, 0xFF, 0x02, 0x13, 0x73, 0x32, 0xF7, 0x50, 0x8B, 0x00, 0x96, 0x7B, 0x33, 0x1B, 0x57, 0x78, 0x00, 0x31, 0x7F, 0x3B, 0x90, 0x9B, 0x57, 0x07, 0x54, 0x53, 0x2A, 0xEE, 0x47, 0x73, 0x4C, 0x37, 0x8B, 0x2B, 0xD9, 0x76, 0x94, 0x63, 0x8B, 0x3B, 0x87, 0x3B, 0xD1, 0x24, 0x4B, 0xD5, 0x00, 0x01, 0x97, 0xC0, 0x1E, 0x39, 0x8E, 0xE3, 0x2B, 0x39, 0x51, 0x5B, 0x5B, 0xFD, 0x01, 0x20, 0x23, 0x03, 0x81, 0xF7, 0x6B, 0x40, 0x41, 0x9E, 0x15, 0x8D, 0xBD, 0x31, 0xA3, 0x1A, 0x9A, 0x99, 0xB9, 0x2B, 0x7D, 0x2C, 0x5A, 0x04, 0x01, 0x10, 0x23, 0x01, 0xAA, 0x01, 0x20, 0x8F, 0x01, 0x01, 0x20, 0x8F, 0x01, 0x00, 0x10, 0x8F, 0xC1, 0x20, 0x8F, 0x3D, 0xD8, 0x60, 0x8F, 0x44, 0x5B, 0x01, 0x00, 0x10, 0x8F, 0x00, 0x00, 0x23, 0x50, 0x5F, 0x42, 0x20, 0x6C, 0x6B, 0x03, 0xE1, 0x63, 0x9A, 0x99, 0x19, 0xC0, 0x0E, 0x3F, 0x74, 0xDA, 0x00, 0xC1, 0x63, 0x00, 0x40, 0x23, 0x04, 0x61, 0x63, 0x00, 0x30, 0x8F, 0xF1, 0x63, 0x00, 0x40, 0x23, 0xEA, 0x03, 0x81, 0x63, 0x00, 0x13, 0xBB, 0x00, 0x32, 0xC7, 0x58, 0x2E, 0x9D, 0x88, 0x66, 0x4F, 0xE8, 0xAB, 0x2E, 0xA9, 0x18, 0x2E, 0x95, 0x48, 0x2E, 0x99, 0x78, 0x62, 0xC7, 0xE3, 0xD3, 0xEF, 0x56, 0x3F, 0x60, 0x0B, 0x52, 0xD3, 0xF0, 0xC2, 0xD3, 0x01, 0xC0, 0x2F, 0x22, 0xDF, 0xD4, 0x33, 0x77, 0x40, 0x68, 0x03, 0x50, 0x0B, 0x52, 0xEB, 0xF0, 0xC2, 0xEB, 0x01, 0xB0, 0x2F, 0x32, 0xF7, 0xFF, 0x01, 0xB0, 0xBF, 0x33, 0x03, 0x01, 0xC0, 0x2F, 0x00, 0x10, 0xBF, 0x45, 0x73, 0x70, 0x0B, 0x53, 0x1B, 0x40, 0xBF, 0xFF, 0x83, 0x1B, 0x01, 0xB0, 0x2F, 0x63, 0x27, 0x03, 0xC1, 0xC3, 0x33, 0x27, 0x75, 0x97, 0x93, 0x33, 0x00, 0x91, 0xC3, 0xFF, 0x01, 0x00, 0x2F, 0x05, 0xE1, 0xC3, 0x00, 0xF0, 0xBF, 0xF1, 0xC3, 0x01, 0x00, 0x2F, 0x05, 0x01, 0xC3, 0x00, 0x16, 0xB7, 0x00, 0x36, 0x4F, 0xF5, 0x35, 0xCC, 0x33, 0x8B, 0x36, 0x53, 0x33, 0x8F, 0xA0, 0x69, 0xE3, 0xD0, 0x6D, 0xAB, 0xFF, 0xE6, 0xCF, 0x59, 0xC7, 0x26, 0x43, 0x00, 0x40, 0x17, 0x26, 0x37, 0xD6, 0xFF, 0x63, 0x57, 0x26, 0x2B, 0xFF, 0x00, 0x30, 0x17, 0x36, 0x1F, 0x00, 0x30, 0x5F, 0x36, 0x13, 0x00, 0x40, 0x17, 0x00, 0x10, 0x5F, 0x48, 0x6B, 0x35, 0xFB, 0xFF, 0x00, 0x30, 0x17, 0x65, 0xEF, 0x03, 0xC1, 0x03, 0x82, 0xC7, 0xE1, 0x03, 0x82, 0xDF, 0x02, 0xE1, 0x03, 0x73, 0x27, 0xF6, 0xF1, 0x03, 0x80, 0x17, 0x01, 0xE1, 0x03, 0x00, 0xFD, 0xDF, 0x54, 0xEC, 0xDF, 0x02, 0x7E, 0xDF, 0x04, 0xEA, 0x2F, 0xA4, 0x5F, 0x0D, 0xDC, 0xDF, 0x50, 0x2F, 0xCC, 0xB8, 0x2F, 0xD0, 0x20, 0xAA, 0x2F, 0xBC, 0xA0, 0x2F, 0xC0, 0x2C, 0x2C, 0xE3, 0xAC, 0x2C, 0xE7, 0x10, 0xA5, 0x2C, 0xDF, 0x74, 0x2C, 0xDF, 0xD8, 0x07, 0x2D, 0x17, 0x09, 0x2C, 0x31, 0xFD, 0x2C, 0xE3, 0x02, 0x9C, 0xDF, 0x3E, 0xCF, 0x00, 0xFC, 0xDF, 0x9E, 0xF3, 0x00, 0xBC, 0xDF, 0x7C, 0xEC, 0xDF, 0x7F, 0x2C, 0x6D, 0x5B, 0xDD, 0x4F, 0x4C, 0xE3, 0x8C, 0xD3, 0xD0, 0x17, 0x9C, 0xBB, 0x00, 0x30, 0x17, 0xFB, 0x00, 0x9F, 0xD3, 0x3F, 0xFD, 0x01, 0x1C, 0x8B, 0x00, 0x0D, 0xE7, 0xC3, 0xA3, 0xA0, 0x81, 0xF3, 0x00, 0x9F, 0xFB, 0xF6, 0x30, 0x23, 0x01, 0x1C, 0x73, 0x03, 0xD0, 0x67, 0x02, 0x7C, 0x5B, 0x70, 0x2B, 0xCB, 0x7C, 0x5B, 0x20, 0xFE, 0x3B, 0xDB, 0x00, 0xEB, 0xC3, 0x3E, 0x67, 0x7F, 0xD7, 0x5B, 0xCF, 0x00, 0xFC, 0x4F, 0x00, 0xDC, 0xDB, 0xF0, 0xFB, 0x2C, 0xCB, 0x80, 0x7F, 0x01, 0x2C, 0xDB, 0x30, 0x2F, 0x7F, 0xFB, 0xC8, 0x2F, 0x03, 0x7C, 0xDB, 0xFF, 0x5B, 0xE7, 0xAC, 0xDB, 0x00, 0x4C, 0x4F, 0x03, 0x3D, 0x67, 0x00, 0x1E, 0x67, 0xDD, 0x67, 0x04, 0x1C, 0x67, 0x41, 0xA3, 0xFF, 0x79, 0x93, 0x9D, 0x43, 0xCC, 0x67, 0x00, 0x60, 0x23, 0xCC, 0x67, 0x31, 0xEB, 0x89, 0x7B, 0x28, 0x2F, 0xFF, 0x00, 0x3C, 0x67, 0x00, 0x50, 0x23, 0xDC, 0x67, 0x00, 0x50, 0x8F, 0xDC, 0x67, 0x00, 0x60, 0x23, 0x00, 0x10, 0x8F, 0x79, 0x4B, 0xF3, 0x30, 0x8F, 0x00, 0x2C, 0x67, 0x00, 0x50, 0x23, 0x04, 0x1C, 0x67, 0x70, 0xC2, 0xA9, 0x33, 0x00, 0x81, 0x63, 0xFF, 0x00, 0x40, 0x23, 0x04, 0x61, 0x63, 0x00, 0x30, 0x8F, 0xF1, 0x63, 0x00, 0x40, 0x23, 0x03, 0x81, 0x63, 0x01, 0x5C, 0x67, 0x01, 0x9F, 0x2F, 0xFF, 0x43, 0xEB, 0x6F, 0x2F, 0x9F, 0x97, 0xDF, 0x2F, 0x00, 0x60, 0x23, 0xCF, 0x2F, 0x34, 0x33, 0x7F, 0x2F, 0xFF, 0x38, 0x2F, 0x00, 0x3F, 0x2F, 0x00, 0x50, 0x23, 0xDF, 0x2F, 0x00, 0x50, 0x8F, 0xDF, 0x2F, 0x00, 0x60, 0x23, 0x00, 0x10, 0x8F, 0xFF, 0x6F, 0x2F, 0x40, 0x8F, 0x00, 0x2F, 0x2F, 0x00, 0x50, 0x23, 0x01, 0x7C, 0x07, 0x01, 0xB1, 0x63, 0x9F, 0x2F, 0x00, 0x91, 0x63, 0xFF, 0x00, 0x40, 0x23, 0x04, 0x61, 0x63, 0x00, 0x30, 0x8F, 0xF1, 0x63, 0x00, 0x40, 0x23, 0x03, 0x81, 0x63, 0x01, 0x5B, 0xA7, 0x01, 0x95, 0x8F, 0xFF, 0x46, 0x27, 0x6F, 0x23, 0x9F, 0xDF, 0xD5, 0x8F, 0x00, 0x60, 0x23, 0xC5, 0x8F, 0x4F, 0xDF, 0x6F, 0x0B, 0xFF, 0x4F, 0xDF, 0x00, 0x25, 0x8F, 0x00, 0x50, 0x23, 0xD5, 0x8F, 0x00, 0x50, 0x8F, 0xD5, 0x8F, 0x00, 0x60, 0x23, 0x00, 0x10, 0x8F, 0xFF, 0x6E, 0xDB, 0x40, 0x8F, 0x00, 0x25, 0x8F, 0x00, 0x50, 0x23, 0x01, 0x7C, 0x07, 0x01, 0xB1, 0x63, 0x9E, 0xC3, 0x00, 0x91, 0x63, 0xFE, 0x00, 0x40, 0x23, 0x04, 0x61, 0x63, 0x00, 0x30, 0x8F, 0xF1, 0x63, 0x00, 0x40, 0x23, 0x03, 0x61, 0x63, 0x00, 0x7C, 0x5F, 0x4C, 0xF1, 0x2C, 0x5C, 0xBC, 0x5F, 0x3E, 0x51, 0x7C, 0x5F, 0x65, 0x00, 0x73, 0xCC, 0x5F, 0x8A, 0x3B, 0x9C, 0x47, 0x5F, 0x43, 0x00, 0x4C, 0x5F, 0xFC, 0x2E, 0xBB, 0x0F, 0xF5, 0x5B, 0x58, 0x4C, 0x5F, 0x3C, 0x82, 0x3B, 0xAB, 0xBC, 0x2F, 0xFF, 0xFC, 0x2F, 0xF8, 0x57, 0x3C, 0x2E, 0xDB, 0x7C, 0x2E, 0xDF, 0xBC, 0x2E, 0xE3, 0x00, 0x3C, 0x47, 0x3E, 0xC7, 0xCB, 0x5E, 0xFB, 0x00, 0x7A, 0x3B, 0x80, 0xBF, 0x9A, 0x3B, 0x60, 0x88, 0xC7, 0x00, 0x3C, 0x2B, 0xDD, 0x00, 0x70, 0x4B, 0x9F, 0x2B, 0xCA, 0x2A, 0xB7, 0x00, 0x9B, 0xCB, 0x01, 0x10, 0x3F, 0xF2, 0xA0, 0x3F, 0xF7, 0x00, 0x1B, 0xA3, 0x01, 0xD0, 0x3F, 0x00, 0x29, 0xEF, 0x01, 0x00, 0xBF, 0x8E, 0x2B, 0x77, 0x70, 0xFF, 0x00, 0x27, 0x67, 0xBB, 0x01, 0x00, 0xFF, 0x24, 0xF0, 0x3F, 0xDF, 0x83, 0x01, 0x01, 0x3F, 0x30, 0x00, 0x8E, 0xBB, 0x5E, 0xBF, 0x2A, 0x59, 0x54, 0x7E, 0xBF, 0xA8, 0x2E, 0xBC, 0x10, 0x2F, 0xFB, 0x6C, 0x19, 0x79, 0x74, 0x31, 0x3E, 0xD1, 0x4A, 0x9E, 0x00, 0xA0, 0x2D, 0xE7, 0x03, 0x70, 0x43, 0x74, 0x78, 0x6C, 0x31, 0x3F, 0xDF, 0x3F, 0xBF, 0x60, 0x04, 0x2F, 0xFF, 0x2D, 0x55, 0x74, 0x65, 0x6E, 0x64, 0x6F, 0x00, 0x5F, 0x31, 0x32, 0x38, 0x78, 0x36, 0x34, 0x2E, 0x05, 0x62, 0x63, 0x6C, 0x69, 0x6D, 0x2F, 0xFF, 0x6D, 0x2E, 0xFB, 0x70, 0x60, 0x62, 0x23, 0x30, 0x4B, 0x4D, 0x7F, 0x4C, 0x6F, 0x67, 0x6F, 0x8D, 0xAE, 0xE9, 0xFF, 0xFF, 0xFF, 0x30, 0x03, 0x00, 0x40, 0x02, 0x15, 0x5F, 0xE0, 0xF0, 0x30, 0x62, 0xAF, 0x72, 0x3E, 0x07, 0x5E, 0x0B, 0x70, 0x61, 0x6E, 0x31, 0x80, 0x3B, 0x4F, 0x01, 0x04, 0xFF, 0x00, 0x52, 0x6F, 0x6F, 0x07, 0x74, 0x50, 0x61, 0x6E, 0x65, 0x00, 0xB0, 0xDF, 0x00, 0x50, 0x47, 0x50, 0xD3, 0x0D, 0x70, 0x61, 0x73, 0x31, 0x3B, 0xA3, 0x70, 0x53, 0x03, 0x20, 0x53, 0x3D, 0x4E, 0x5F, 0x30, 0x55, 0x00, 0x0F, 0x96, 0x01, 0x20, 0x53, 0x4C, 0xD3, 0x42, 0x80, 0x53, 0x09, 0x69, 0x63, 0x31, 0x80, 0x3C, 0x0F, 0x07, 0xFF, 0x00, 0x41, 0x03, 0xF9, 0x7E, 0xE0, 0x2D, 0x5B, 0x82, 0x1F, 0x00, 0x20, 0xEF, 0x2F, 0x63, 0x80, 0x42, 0xF1, 0x2B, 0xE0, 0x71, 0x99, 0xCF, 0x23, 0xC1, 0x27, 0x80, 0x3F, 0x70, 0x61, 0x65, 0xC3, 0x60, 0xDB, 0x50, 0x07, 0x67, 0x72, 0x70, 0x31, 0x3C, 0x97, 0x31, 0x33, 0x0C, 0x47, 0x72, 0x6F, 0x75, 0x3C, 0x8F, 0x7F, 0xE7, 0x67, 0x72, 0xE3, 0x51, 0x07, 0x30, 0x23, 0x34, 0x57, 0x47, 0x5F, 0x41, 0xCF, 0xD3, 0x3F, 0xCF, 0xF1, 0xF1, 0x17, 0xF1, 0xD7, 0x30, 0x5F, 0x3F, 0xDF, 0x47, 0x5F, 0x42, 0xCF, 0x6D, 0xF9, 0x3F, 0xE7, 0x00, 0x90, 0x2B, 0xD4, 0x9F, 0x3F, 0xFB, 0xF1, 0x7F, 0x67, 0x72, 0x50, 0xC7, 0xAB, 0x01, 0x32, 0xBF, 0x3C, 0x22, 0xBC, 0x22, 0x00, 0x02, 0xBF, 0xC8, 0x82, 0xBF, 0x3D, 0x7F, 0x59, 0x07, 0x64, 0xBB, 0x2D, 0x2F, 0xFF, 0x2F, 0x08, 0x00, 0x4F, 0x34, 0xA1, 0xD1, 0x32, 0xF3, 0x2F, 0xFF, 0x78, 0x2F, 0xFB, 0x33, 0x64, 0x73, 0x62, 0xAD, 0xD5, 0x62, 0xD2, 0x80, 0x10, 0x31, 0xF0, 0x10, 0x32, 0xF0, 0x21, 0x33, 0x63, 0x05, 0x38, 0x4C, 0x54, 0x90, 0x3E, 0x30, 0x0B, 0x70, 0x39, 0x4C, 0x54, 0x4D, 0x38, 0x61, 0x73, 0x3C, 0xCC, 0x63, 0x2D, 0x33, 0x2B, 0xA8, 0x06, 0x00, 0x2A, 0x00, 0x0B, 0x2F, 0xFF, 0x38, 0x2F, 0xFF, 0x88, 0x2F, 0xFB, 0x08, 0xAA, 0x2F, 0xF4, 0x88, 0x2F, 0xF8, 0x08, 0x2F, 0xD4, 0x88, 0x2F, 0xD8, 0x4C, 0xA9, 0x2F, 0x10, 0xE8, 0x2F, 0x14, 0xAC, 0x23, 0x74, 0x48, 0x05, 0x2F, 0xD7, 0xDB, 0x20, 0x2F, 0x00, 0x35, 0x47, 0xAA, 0x53, 0x57, 0x00, 0x83, 0x53, 0x02, 0x00, 0xA3, 0x53, 0x00, 0x35, 0x57, 0xB6, 0x00, 0xB3, 0xA3, 0xD5, 0x20, 0xB3, 0x00, 0xB3, 0xA3, 0x40, 0x24, 0x20, 0x30, 0x03, 0x11, 0x86, 0x2F, 0xFB, 0x74, 0x06, 0x00, 0x04, 0x30, 0x03, 0x30, 0x0B, 0x65, 0x1E, 0x06, 0x00, 0x01, 0x30, 0x03, 0x30, 0x17, 0x31, 0x87, 0x5E, 0x03, 0x05, 0x9B, 0x2F, 0x47, 0x4F, 0x5F, 0x31, 0x32, 0x01, 0xB0, 0x7F, 0x01, 0x03, 0xE0, 0x7F, 0xD2, 0xB5, 0x07, 0x00, 0x00, 0x8C, 0x8C, 0x8C, 0x05, 0xA0, 0x7F, 0x00, 0x16, 0x97, 0x00, 0xF1, 0x7F, 0x7C, 0x03, 0x03, 0xC1, 0x7F, 0x00, 0x16, 0xD7, 0x45, 0xA7, 0x2F, 0xB4, 0x00, 0x25, 0xA7, 0x80, 0x3F, 0xB0, 0x23, 0x44, 0x04, 0x25, 0xA3, 0x30, 0x03, 0x06, 0x00, 0x06, 0x06, 0x0C, 0x73, 0x09, 0xED, 0xBE, 0x30, 0x03, 0x3F, 0xFB, 0x3A, 0x57, 0x37, 0xDE, 0x40, 0x30, 0x03, 0xE0, 0x13, 0xC0, 0x30, 0x03, 0x00, 0x75, 0xD3, 0x78, 0x54, 0x00, 0x10, 0x04, 0x00, 0x01, 0x10, 0x04, 0x10, 0x02, 0xA0, 0xA2, 0x37, 0x46, 0xF2, 0x37, 0x26, 0x06, 0x02, 0x05, 0x66, 0xF9, 0x23, 0x33, 0x00, 0x12, 0x43, 0x4D, 0x5F, 0x00, 0x35, 0xB6, 0x00, 0x36, 0x6A, 0x80, 0xEA, 0x23, 0x77, 0x61, 0x05, 0x26, 0x67, 0x30, 0x03, 0x30, 0x8E, 0xE3, 0xBE, 0x30, 0x03, 0xF7, 0xB0, 0xBF, 0xE0, 0x13, 0xC0, 0xBF, 0x50, 0xA7, 0x00, 0x00, 0xC0, 0xA7, 0x00, 0x21, 0x5F, 0xCF, 0x5F, 0x86, 0x01, 0xB1, 0x5F, 0x2F, 0xA1, 0xBD, 0xBF, 0x30, 0x03, 0x3F, 0xF7, 0xCE, 0x1B, 0x95, 0x17, 0x41, 0x30, 0x03, 0xE0, 0x13, 0xC1, 0x30, 0x03, 0x05, 0x21, 0x5F, 0xC3, 0x00, 0x00, 0xC3, 0x01, 0x31, 0x5F, 0x61, 0x0B, 0xB6, 0xBF, 0x30, 0x03, 0xB0, 0xBF, 0xFF, 0xE0, 0x13, 0xC0, 0xBF, 0x02, 0x61, 0x5F, 0xCD, 0xF7, 0x01, 0xB2, 0xBF, 0x3F, 0xF7, 0x50, 0x03, 0x5D, 0xA7, 0xFF, 0x50, 0x03, 0xC0, 0x13, 0x4F, 0xF7, 0x05, 0x22, 0xBF, 0x00, 0x00, 0xC3, 0x01, 0x32, 0xBF, 0x3F, 0xE3, 0x3F, 0xE7, 0xFF, 0xB0, 0xBF, 0xE0, 0x13, 0xC0, 0xBF, 0x01, 0xF2, 0xBF, 0x03, 0x59, 0x73, 0x57, 0x87, 0x00, 0x59, 0x73, 0x00, 0x1C, 0x63, 0xFA, 0x99, 0x1F, 0x40, 0x03, 0x00, 0x79, 0x1F, 0x3F, 0x93, 0xC9, 0x73, 0xA0, 0x4E, 0xC7, 0xF5, 0xC7, 0x00, 0x84, 0xD3, 0x70, 0x53, 0x46, 0x31, 0x32, 0x00, 0x63, 0x2F, 0x58, 0x2F, 0xFA, 0x9F, 0x41, 0x05, 0x4F, 0xF1, 0x00, 0x00, 0xCD, 0xCC, 0x4C, 0x28, 0x36, 0x3F, 0x80, 0x3F, 0x50, 0x07, 0x40, 0x0F, 0x4A, 0x9B, 0x50, 0x07, 0x9F, 0xEC, 0xE0, 0x0B, 0xFB, 0x40, 0x03, 0x00, 0x0A, 0x1B, 0x2A, 0xC3, 0x00, 0xA4, 0xB7, 0x60, 0xFB, 0x20, 0x01, 0xC0, 0xA7, 0x27, 0x62, 0xEC, 0x01, 0x00, 0xA7, 0x8A, 0x1B, 0x81, 0x2F, 0x91, 0x00, 0x84, 0xA3, 0x71, 0x83, 0x10, 0xF4, 0x5D, 0xBF, 0x01, 0xC1, 0x2F, 0x07, 0x04, 0xD1, 0x2F, 0x00, 0x80, 0xA7, 0x01, 0xF1, 0x2F, 0x08, 0x02, 0x41, 0x2F, 0xF7, 0x00, 0x5D, 0x8B, 0xE1, 0xB7, 0xEB, 0xD7, 0x00, 0xD2, 0x5F, 0x09, 0x04, 0xD2, 0x5F, 0x00, 0xB0, 0xA7, 0x01, 0xC3, 0x07, 0x7B, 0x0A, 0x01, 0xE2, 0x5F, 0x92, 0xE7, 0x00, 0x1F, 0xFB, 0x5F, 0xC7, 0xF8, 0x25, 0x6F, 0x3D, 0x07, 0x5A, 0xA0, 0x00, 0x68, 0x1F, 0x10, 0x43, 0xE3, 0x00, 0x5D, 0x03, 0x50, 0x43, 0x83, 0x00, 0x3F, 0x00, 0x44, 0x6D, 0x03, 0x30, 0x0F, 0x3E, 0x2B, 0x30, 0x0F, 0x2D, 0x03, 0x6D, 0x83, 0x3D, 0x03, 0x08, 0x6D, 0x83, 0x00, 0xC3, 0x67, 0x00, 0x70, 0x7F, 0x4D, 0x83, 0x41, 0xFE, 0xAF, 0x7F, 0x01, 0x01, 0x4D, 0x83, 0x00, 0x3E, 0x0B, 0x00, 0x1A, 0xEB, 0x01, 0x94, 0xEB, 0x00, 0x10, 0x87, 0x5F, 0xE9, 0x00, 0xEE, 0x0B, 0xBB, 0x7E, 0x8B, 0x01, 0x50, 0x7F, 0xFA, 0xEB, 0x02, 0xB0, 0x7F, 0x03, 0x8E, 0x8B, 0x9E, 0x7B, 0xDF, 0xFE, 0x9B, 0x00, 0x02, 0x0F, 0x03, 0x3F, 0x13, 0x00, 0x1A, 0xF3, 0x01, 0x91, 0x8F, 0x00, 0x12, 0x0F, 0x2A, 0x3A, 0xAF, 0x04, 0x8F, 0x13, 0xDC, 0x00, 0x2F, 0x13, 0x0C, 0x4F, 0x13, 0xD6, 0xB7, 0xFD, 0x97, 0xFD, 0x57, 0xFF, 0xFC, 0xE7, 0xFC, 0x77, 0xFC, 0x07, 0xFB, 0x97, 0xFA, 0xE3, 0xFA, 0x57, 0xF9, 0xA3, 0xF9, 0x17, 0xDD, 0xF8, 0x63, 0x3F, 0xEF, 0xCC, 0x00, 0x2F, 0xB3, 0x3E, 0x8F, 0x0A, 0x30, 0xCB, 0x2C, 0x41, 0xA7, 0x73, 0x43, 0xCF, 0x1B, 0x37, 0x0D, 0xF8, 0x5F, 0x67, 0x72, 0x56, 0xFF, 0x03, 0x40, 0x02, 0x04, 0x40, 0x00, 0x78, 0x80, 0x80, 0x34, 0x8F, 0x00, 0x00, 0x60, 0x0A, 0x2B, 0xA1, 0x20, 0x0B, 0xEF, 0x80, 0x80, 0xEF, 0xEF, 0x00, 0xFF, 0xF8, 0x0B, 0xBF, 0x70, 0x01, 0xFF, 0xF6, 0x82, 0x8F, 0xA5, 0x20, 0x00, 0x88, 0x40, 0x30, 0x50, 0x27, 0x1C, 0x0F, 0xCF, 0x00, 0x01, 0x30, 0x20, 0x0B, 0x30, 0x03, 0x38, 0x56, 0x4F, 0x99, 0x01, 0x87, 0x00, 0x05, 0xFD, 0xFC, 0x0B, 0x0A, 0x3F, 0xA5, 0x86, 0x3F, 0xA9, 0xFC, 0xFC, 0x0A, 0x0A, 0x30, 0x03, 0x2F, 0xE5, 0x83, 0x09, 0x00, 0x00, 0xF7, 0xF7, 0x3F, 0x30, 0xBF, 0xFF, 0x31, 0x9A, 0xC0, 0x20, 0x0B, 0x20, 0x0F, 0xFF, 0x9F, 0xCF, 0xFF, 0x1F, 0x2F, 0x20, 0xF6, 0x60, 0xAF, 0xD3, 0x81, 0x00, 0x00, 0xF3, 0xF3, 0x49, 0x01, 0x22, 0xD0, 0xCF, 0xFF, 0x30, 0x05, 0xF3, 0xF3, 0x40, 0x03, 0x04, 0x28, 0x00, 0x00, 0x5F, 0x5F, 0x40, 0x5F, 0x88, 0xFE, 0x1C, 0xCA, 0xFF, 0xCC, 0x30, 0x0B, 0x40, 0x0F, 0x7F, 0xEC, 0x88, 0x00, 0x19, 0x88, 0xFF, 0xCC, 0x2F, 0xEC, 0x30, 0x07, 0xCF, 0xFF, 0x22, 0x0E, 0x2E, 0xFC, 0xFC, 0x30, 0x7D, 0x0C, 0x22, 0xE0, 0x30, 0x03, 0x20, 0x1F, 0x06, 0x00, 0xFF, 0xCC, 0x0D, 0x0A, 0x00, 0x30, 0x00, 0x88, 0x3E, 0x60, 0x60, 0x50, 0xE7, 0x3F, 0xFD, 0x30, 0x0B, 0x40, 0x0F, 0x30, 0x3F, 0xCD, 0xC8, 0x20, 0x37, 0x50, 0x47, 0xCC, 0x02, 0x2D, 0xC7, 0x34, 0xFF, 0x33, 0xB5, 0x41, 0x0F, 0x33, 0x30, 0x07, 0x40, 0x3F, 0x0E, 0x30, 0xC7, 0x84, 0x25, 0xEB, 0x7C, 0xF8, 0x4F, 0xF3, 0x2F, 0xBF, 0x50, 0x0B, 0x20, 0x0F, 0x2F, 0x88, 0xAF, 0xFF, 0x60, 0x00, 0x30, 0xE7, 0x5F, 0xF7, 0x8E, 0xBF, 0xFF, 0x0E, 0x1E, 0x28, 0xF7, 0x70, 0x32, 0x84, 0xBF, 0x40, 0xC7, 0x00, 0x82, 0x00, 0x27, 0x00, 0xF4, 0x40, 0xC7, 0x4F, 0x4F, 0x3F, 0xF1, 0x50, 0xD7, 0x30, 0x0B, 0x80, 0x40, 0x0F, 0x80, 0x00, 0x88, 0xF1, 0xE1, 0xFF, 0xEF, 0x86, 0x70, 0x7F, 0xE1, 0xE1, 0x7F, 0x7F, 0x30, 0x03, 0xE0, 0xDF, 0xDC, 0x01, 0x00, 0x15, 0x00, 0x00, 0xEF, 0xFF, 0x05, 0x40, 0x41, 0x89, 0x3F, 0xFA, 0xD3, 0x40, 0xDF, 0x2E, 0xDE, 0xFD, 0xFA, 0x00, 0x0E, 0x2F, 0x9C, 0x2F, 0xD5, 0x07, 0x09, 0x01, 0xAA, 0xDD, 0x21, 0xEB, 0x31, 0xEF, 0x01, 0x01, 0x60, 0x60, 0x25, 0x5F, 0x40, 0x0F, 0xFF, 0x70, 0x00, 0xDE, 0x01, 0xC0, 0x30, 0x0B, 0x39, 0x89, 0xFF, 0xF6, 0x1C, 0xCF, 0x50, 0x00, 0x01, 0xFF, 0xF5, 0x30, 0x31, 0xFF, 0xFF, 0x5C, 0x46, 0xB7, 0x40, 0x50, 0x5F, 0xDF, 0xF5, 0xFF, 0xFF, 0x40, 0x00, 0xEE, 0x70, 0x10, 0xF1, 0xEF, 0x41, 0xFF, 0x2F, 0xFF, 0xFC, 0xFD, 0x0A, 0x0B, 0x30, 0xEB, 0x10, 0x30, 0x88, 0x51, 0xEF, 0x2F, 0x2F, 0x00, 0x00, 0xCA, 0x30, 0x03, 0x51, 0xFF, 0xE6, 0x10, 0x30, 0x0F, 0x2E, 0x2F, 0xFF, 0xF5, 0x40, 0x50, 0x30, 0xC7, 0xF5, 0x40, 0x02, 0x1D, 0xF3, 0xF2, 0x68, 0xDF, 0x20, 0x54, 0x7F, 0xC3, 0xF4, 0x2F, 0xB9, 0x00, 0x00, 0xD4, 0xEE, 0x41, 0xFB, 0xB1, 0xEF, 0x32, 0x0B, 0x4E, 0xB6, 0xBA, 0xF1, 0xEF, 0x20, 0x79, 0x00, 0x1E, 0x00, 0xEB, 0x10, 0x31, 0xFF, 0x34, 0x07, 0x00, 0x01, 0xEF, 0xB1, 0xFF, 0x00, 0x03, 0xEE, 0x11, 0xFF, 0x35, 0xFF, 0x33, 0x30, 0xF7, 0x21, 0xF2, 0x40, 0x33, 0x3F, 0xFF, 0x57, 0xFF, 0x55, 0xFF, 0xEE, 0x11, 0x16, 0xEE, 0x11, 0x55, 0x60, 0x07, 0x06, 0x87, 0x26, 0x51, 0xEF, 0x55, 0x06, 0xFF, 0x04, 0x0D, 0xEE, 0x11, 0x34, 0x61, 0x32, 0x0B, 0xE7, 0x04, 0x10, 0x1E, 0x1E, 0x00, 0x00, 0x30, 0x03, 0xF6, 0x60, 0x40, 0xCF, 0x2F, 0x0E, 0xF6, 0x50, 0x1E, 0x1F, 0x00, 0x00, 0x41, 0x1D, 0xAF, 0xC4, 0x01, 0x1C, 0xF3, 0xF3, 0xCF, 0x21, 0x2C, 0x97, 0x71, 0xEF, 0xF5, 0x50, 0x37, 0xFB, 0xE4, 0x42, 0x0B, 0x30, 0xC7, 0x61, 0xEF, 0x41, 0x6F, 0x7F, 0xF7, 0xE1, 0xF1, 0xAF, 0xFF, 0xD1, 0x20, 0x97, 0xC1, 0x70, 0x7F, 0x9F, 0x73, 0xF9, 0xFB, 0x10, 0x90, 0xFE, 0x20, 0x9D, 0x40, 0x65, 0x30, 0x9F, 0x01, 0xFB, 0xFF, 0x9F, 0x0B, 0x7C, 0xD8, 0x33, 0xB3, 0x2C, 0x8C, 0x06, 0x5B, 0xDA, 0x00, 0x4C, 0xD2, 0x43, 0x4C, 0x49, 0x08, 0x4D, 0xFF, 0xFE, 0x14, 0x2F, 0xFA, 0x02, 0x02, 0x28, 0xC1, 0x29, 0xF7, 0x3B, 0x5D, 0x69, 0x6D, 0x61, 0x67, 0x10, 0x4C, 0x9C, 0x18, 0x10, 0x00, 0x0D, 0x62, 0x33, 0x06, 0xD0, 0x01, 0x20, 0xA0, 0x00, 0x54, 0x71, 0x23, 0xDF, 0xFF, 0x33, 0xBF, 0xC0, 0x2E, 0xCB, 0xC0, 0xC0, 0x07, 0xAF, 0x9F, 0x00, 0x00, 0x9F, 0x20, 0x03, 0x73, 0x97, 0x80, 0x07, 0x81, 0xFF, 0xC0, 0x78, 0x00, 0x02, 0xFF, 0xFC, 0x3E, 0x4F, 0x9B, 0x87, 0x3F, 0xEE, 0x90, 0x90, 0xDF, 0xDF, 0x30, 0x03, 0x01, 0x9D, 0xDF, 0x50, 0x6F, 0xCA, 0x30, 0x6B, 0x40, 0x6F, 0x00, 0xB0, 0x44, 0x93, 0xDF, 0x22, 0x07, 0xD7, 0x3E, 0x00, 0xEE, 0x00, 0x0E, 0xCE, 0x42, 0x17, 0x20, 0x17, 0x70, 0x07, 0x40, 0x6F, 0x80, 0x81, 0x90, 0x6F, 0xC5, 0xFF, 0xCF, 0x7F, 0xDE, 0x00, 0x95, 0x9D, 0xEE, 0xC1, 0x7F, 0x63, 0x53, 0x71, 0x7F, 0x20, 0x71, 0x7F, 0xC2, 0xCF, 0x06, 0xB1, 0x8B, 0x50, 0xB0, 0xA8, 0x42, 0x70, 0x28, 0x4E, 0x2E, 0x06, 0x10, 0x00, 0x43, 0xFD, 0x89, 0x3A, 0xAF, 0x76, 0x00, 0x98, 0x6F, 0xC8, 0xCE, 0x47, 0x2D, 0xA3, 0x08, 0xFF, 0x7A, 0xFF, 0x45, 0x4F, 0xFE, 0xAA, 0x00, 0xBB, 0xA2, 0x4A, 0xCF, 0xBB, 0x50, 0x07, 0xFF, 0x23, 0xEF, 0x42, 0xB3, 0xFF, 0x11, 0x21, 0xFF, 0x53, 0x4F, 0xFF, 0x9A, 0x00, 0x68, 0x4A, 0xEF, 0x41, 0x24, 0x25, 0x1B, 0xFF, 0xAD, 0xFF, 0xFF, 0xC8, 0x3A, 0xFB, 0x68, 0xB3, 0x20, 0x0B, 0x2E, 0xA1, 0xFA, 0x56, 0x77, 0x27, 0xFF, 0x00, 0x7E, 0x4B, 0x85, 0x3F, 0x7B, 0xA7, 0x26, 0x8B, 0x2E, 0x0D, 0xB3, 0xC2, 0x07, 0xC0, 0x0A, 0x21, 0x1C, 0xF6, 0x22, 0xFF, 0x26, 0xC5, 0x86, 0x4F, 0x7F, 0xFD, 0x22, 0xFF, 0x46, 0x32, 0x4F, 0x7A, 0x43, 0xFF, 0x97, 0x6B, 0xE7, 0x37, 0x3B, 0x10, 0x03, 0xE7, 0xF2, 0xF4, 0xFF, 0xFF, 0xFC, 0x2F, 0x94, 0x30, 0x03, 0xA0, 0x9F, 0x9B, 0xDF, 0xAF, 0xA6, 0x0C, 0x09, 0xFF, 0x4F, 0x02, 0x00, 0x00, 0xFF, 0xAD, 0xBF, 0x04, 0x28, 0xFF, 0x00, 0x22, 0x6C, 0x03, 0x07, 0xE0, 0xF8, 0xD6, 0x00, 0xDD, 0x00, 0x48, 0x71, 0xDD, 0xD0, 0x26, 0x03, 0x61, 0xEF, 0x54, 0x00, 0x3D, 0x1D, 0xFF, 0xB8, 0xFF, 0xFE, 0x12, 0x00, 0x00, 0x51, 0x41, 0xEF, 0xFD, 0xA0, 0x97, 0x7F, 0x10, 0x06, 0x00, 0xFE, 0xFC, 0x10, 0xA0, 0x23, 0xF1, 0x6F, 0xFF, 0x2C, 0x01, 0xEF, 0x00, 0x03, 0xFF, 0xFF, 0x1E, 0x8F, 0xA1, 0x1B, 0x50, 0xEF, 0x21, 0x1F, 0xAF, 0x05, 0x94, 0x99, 0xA1, 0xF2, 0x00, 0x00, 0x70, 0xF2, 0x20, 0x03, 0x85, 0x89, 0x40, 0xD7, 0x37, 0xFF, 0x01, 0xBE, 0x88, 0x4D, 0xAF, 0x58, 0x00, 0x23, 0x4F, 0x7B, 0x64, 0xFF, 0xA7, 0x8B, 0x47, 0xE7, 0xDC, 0xFF, 0xED, 0x79, 0xA0, 0xDE, 0x28, 0x80, 0x30, 0xD2, 0x22, 0xCC, 0xFF, 0x50, 0xCF, 0x21, 0x00, 0x32, 0x42, 0xDF, 0x33, 0x47, 0x00, 0x26, 0x52, 0x73, 0x30, 0xFB, 0x3F, 0xB3, 0x40, 0x04, 0x63, 0x3F, 0x4C, 0x12, 0x38, 0x27, 0x7A, 0xEF, 0x35, 0x94, 0x72, 0xEF, 0x8E, 0xFF, 0x0B, 0xFF, 0x2F, 0x05, 0x4D, 0x2F, 0xCA, 0x6B, 0x03, 0xE4, 0x0C, 0x00, 0xB5, 0xFF, 0x74, 0x40, 0x29, 0xD4, 0x07, 0x55, 0xFF, 0x08, 0xC0, 0x7F, 0x91, 0x4A, 0x8B, 0x99, 0x00, 0x7E, 0x99, 0x5F, 0xB7, 0x5A, 0x97, 0x8F, 0xC7, 0x70, 0x17, 0x60, 0x1F, 0x8F, 0xE7, 0x56, 0x1B, 0xFF, 0x55, 0x01, 0x37, 0x97, 0x90, 0x1F, 0x78, 0x4F, 0xFF, 0x27, 0xC0, 0x9B, 0x4A, 0x27, 0x97, 0xFF, 0x2A, 0xA7, 0x27, 0x85, 0x35, 0x26, 0xBF, 0x24, 0x07, 0x88, 0x3F, 0xFF, 0x8B, 0xFF, 0x03, 0x44, 0x10, 0xC6, 0x00, 0xFF, 0x68, 0xD4, 0x80, 0x5F, 0x3F, 0xF0, 0x17, 0x9F, 0xF5, 0xEF, 0xFF, 0x07, 0x66, 0xCF, 0x45, 0x6F, 0x2B, 0x77, 0x3E, 0xEF, 0x3B, 0x7D, 0xAF, 0xF5, 0x30, 0x22, 0x20, 0xFB, 0x5F, 0x87, 0xF3, 0xF9, 0xF8, 0x90, 0x3F, 0x31, 0x4C, 0xB7, 0x22, 0x97, 0x00, 0x75, 0x85, 0xBF, 0x2F, 0xFF, 0xAF, 0x0D, 0x08, 0xFF, 0x9E, 0xFF, 0x45, 0x4F, 0x79, 0xA9, 0x00, 0x9A, 0xA2, 0x45, 0xBF, 0x89, 0x55, 0xA7, 0xFF, 0x22, 0xFF, 0x3E, 0x9F, 0x00, 0x0A, 0xFF, 0x75, 0xFF, 0xDA, 0x4F, 0xE3, 0x23, 0x35, 0xB7, 0x5E, 0x83, 0x8A, 0x8F, 0xFF, 0xFF, 0x7F, 0x8F, 0x52, 0x23, 0x0C, 0x0D, 0x92, 0x31, 0xEF, 0xE1, 0xEF, 0xE1, 0xFF, 0x7F, 0xC7, 0x02, 0x2D, 0x07, 0x30, 0x03, 0xF0, 0x0F, 0x01, 0x1D, 0xA6, 0x83, 0x45, 0x3E, 0x00, 0xFB, 0xB0, 0xFF, 0xFF, 0x25, 0x13, 0x4C, 0x5F, 0x9D, 0x5F, 0xFB, 0xF2, 0xD0, 0x28, 0x8B, 0x25, 0x31, 0x77, 0x11, 0x0D, 0xA5, 0x1B, 0xC1, 0x96, 0x44, 0x2D, 0x69, 0xFB, 0x01, 0x07, 0xF8, 0xF2, 0x86, 0x45, 0x04, 0x0E, 0x50, 0x00, 0x2F, 0x3F, 0x2C, 0x87, 0xE5, 0xFF, 0x09, 0xFF, 0x20, 0x00, 0xFA, 0x2D, 0xB1, 0x0D, 0x6F, 0x76, 0x87, 0x0E, 0x18, 0xEF, 0x00, 0x38, 0x77, 0x77, 0xC2, 0x5F, 0xAE, 0x4B, 0x6B, 0x1E, 0xFF, 0x01, 0xAF, 0x47, 0xCF, 0x4C, 0x6F, 0x26, 0x89, 0x00, 0x3E, 0x67, 0x3A, 0xE5, 0x0D, 0xB4, 0x2F, 0x04, 0xF1, 0xFF, 0x7F, 0xEB, 0xA0, 0xB0, 0x2C, 0x0D, 0xF4, 0x79, 0x7C, 0x0E, 0x00, 0x60, 0xFB, 0xFF, 0x28, 0x32, 0x00, 0xB0, 0x01, 0x24, 0x07, 0x4F, 0x3C, 0x08, 0x2F, 0x2C, 0x6F, 0x2E, 0xDD, 0xBD, 0xFE, 0xDB, 0x59, 0x00, 0xD8, 0xAD, 0x5E, 0x97, 0xA5, 0x37, 0x87, 0x61, 0x00, 0x17, 0x9F, 0x38, 0x93, 0x40, 0x96, 0x9E, 0xA5, 0x7D, 0xDF, 0xFE, 0x28, 0xAF, 0xD0, 0xE1, 0x39, 0xF1, 0x1A, 0x27, 0x87, 0xD8, 0x2F, 0xF7, 0x2F, 0xE3, 0x3F, 0x2B, 0x55, 0x98, 0xBE, 0x04, 0x07, 0xFF, 0x34, 0xFF, 0x08, 0x4F, 0x09, 0x0E, 0x13, 0xFF, 0x20, 0x4A, 0xBF, 0x22, 0x00, 0x47, 0x22, 0xC3, 0xEF, 0xDE, 0xFF, 0xDD, 0x55, 0x42, 0x60, 0x17, 0x30, 0x1F, 0x80, 0x49, 0x23, 0xFF, 0xED, 0xFF, 0x00, 0x31, 0x00, 0x95, 0xC9, 0x7A, 0xDB, 0x60, 0x37, 0xEE, 0x12, 0x2F, 0x61, 0x50, 0xFD, 0xDA, 0x11, 0x09, 0xFF, 0xBD, 0xFF, 0x69, 0x45, 0xE7, 0x14, 0x6B, 0x9B, 0x0F, 0x0D, 0x8E, 0x5E, 0x01, 0x9F, 0x6C, 0x52, 0x00, 0x1C, 0x2A, 0x35, 0x2E, 0xEF, 0x89, 0x2F, 0x03, 0xAD, 0x00, 0x47, 0x5A, 0x6F, 0xFD, 0x74, 0x4F, 0x9F, 0x1E, 0xB9, 0xFF, 0xDC, 0x4F, 0xFF, 0x28, 0x6C, 0x2B, 0xB2, 0x4F, 0x57, 0xBB, 0x6A, 0xFF, 0x2B, 0xAA, 0x2D, 0x64, 0x10, 0x60, 0xB7, 0x32, 0x35, 0xDC, 0x10, 0x15, 0x00, 0xB4, 0xEC, 0x2F, 0xD7, 0xF9, 0x7B, 0x78, 0xEF, 0x68, 0x9F, 0x10, 0x8B, 0xFF, 0x25, 0xAB, 0x8F, 0x6D, 0xFF, 0x8F, 0x02, 0x5F, 0x00, 0x3F, 0xCD, 0x6C, 0x01, 0xEC, 0xAC, 0xCE, 0x7F, 0x2E, 0xAB, 0xDE, 0x7F, 0x68, 0x7F, 0xC0, 0x9D, 0x2E, 0x04, 0x0E, 0x88, 0xFF, 0xEF, 0xEF, 0x8A, 0xAF, 0x8E, 0x00, 0x47, 0x24, 0xDD, 0x78, 0xDD, 0x77, 0x33, 0x11, 0x01, 0x33, 0x11, 0x8D, 0x7D, 0x13, 0x13, 0x7D, 0x20, 0x03, 0xBF, 0x8A, 0xBF, 0x77, 0x50, 0x17, 0x70, 0x07, 0xFF, 0x49, 0x30, 0x2B, 0xB0, 0x2F, 0xF0, 0x0F, 0xB7, 0x01, 0xB9, 0x7F, 0xA8, 0x6D, 0xEA, 0x7F, 0x7F, 0x10, 0x6F, 0x7F, 0x27, 0xB0, 0x04, 0xA1, 0x00, 0xA0, 0x0D, 0xB0, 0x01, 0x02, 0x60, 0xED, 0x61, 0xFF, 0x2C, 0xFF, 0xBE, 0x35, 0xFF, 0xF0, 0x3E, 0xB7, 0x00, 0xC0, 0xFF, 0x19, 0x00, 0x21, 0x1D, 0x01, 0x28, 0xFA, 0x18, 0xCC, 0xFF, 0x3A, 0x3B, 0x92, 0x40, 0x3F, 0x17, 0xFF, 0x6B, 0x8D, 0x27, 0x4C, 0x84, 0xFF, 0xE9, 0xBD, 0xB9, 0x3C, 0xB8, 0xFD, 0x23, 0x34, 0xE2, 0x30, 0x62, 0x4C, 0xDA, 0x40, 0x13, 0xF7, 0xFF, 0xF1, 0x20, 0x03, 0xEF, 0x08, 0xFF, 0xE8, 0xFF, 0xE0, 0x20, 0x03, 0xE1, 0xFF, 0xD9, 0x38, 0xFF, 0xD3, 0x50, 0x95, 0x2E, 0xE1, 0x21, 0x87, 0x57, 0xFF, 0x86, 0x34, 0xFF, 0xD1, 0x93, 0x69, 0x30, 0x41, 0xFA, 0x31, 0x9F, 0xAC, 0xFF, 0x44, 0xC7, 0x41, 0xA5, 0xD9, 0xFF, 0xE4, 0x50, 0x5B, 0xF6, 0xFF, 0x41, 0xF2, 0x20, 0x5D, 0xFB, 0xFF, 0xEE, 0xFF, 0xEA, 0x2F, 0x23, 0x54, 0xF5, 0x20, 0x05, 0xE4, 0x23, 0x97, 0xEA, 0x2E, 0x2E, 0xDA, 0xFF, 0x10, 0xDB, 0xFF, 0xD5, 0x2C, 0x6E, 0xC6, 0xFF, 0xD0, 0xFF, 0x05, 0xCB, 0xFF, 0xC1, 0xFF, 0xBC, 0x27, 0xE7, 0xE1, 0x20, 0x11, 0x41, 0xD2, 0x24, 0x7A, 0xDA, 0xFF, 0xCD, 0xFF, 0xCA, 0x20, 0x19, 0x04, 0xC1, 0xFF, 0xB7, 0xFF, 0xB3, 0x20, 0xFE, 0xBA, 0xFF, 0x14, 0xAF, 0xFF, 0xAB, 0x05, 0xD1, 0xFF, 0x5F, 0x62, 0x6D, 0x03, 0xFF, 0x51, 0x29, 0x20, 0xC2, 0xC2, 0xE1, 0x7F, 0x05, 0xFF, 0x9F, 0x22, 0x8D, 0x5B, 0x07, 0x21, 0x61, 0xA7, 0x20, 0x9A, 0x5F, 0xE9, 0x8A, 0xD9, 0x48, 0x38, 0x99, 0x50, 0xFE, 0x41, 0x01, 0xF7, 0x25, 0x34, 0xEA, 0xFF, 0xE0, 0x8D, 0xA2, 0xD1, 0x73, 0xF6, 0x80, 0x27, 0xF7, 0xFF, 0xEB, 0x25, 0x56, 0xE0, 0xA8, 0x21, 0x1D, 0xE9, 0x21, 0x25, 0xDE, 0x2F, 0x4A, 0xD4, 0xFF, 0xD3, 0x28, 0xFF, 0xC9, 0x2F, 0x52, 0xD3, 0x2B, 0x3D, 0xC9, 0xFF, 0xC8, 0xA8, 0x25, 0x49, 0xBD, 0x21, 0x07, 0xFC, 0x27, 0x46, 0xF0, 0xFF, 0xE6, 0xA2, 0x20, 0x2D, 0xE2, 0x25, 0x9E, 0xD5, 0xFF, 0xE3, 0x21, 0x95, 0xD6, 0xAA, 0x2D, 0xB0, 0xD0, 0x20, 0x21, 0xC3, 0x25, 0x10, 0xDA, 0x21, 0x3B, 0xCD, 0x28, 0xFF, 0xC5, 0x21, 0x4D, 0xC4, 0x25, 0x7B, 0xB6, 0xFF, 0xBF, 0x80, 0x21, 0x3D, 0xB2, 0xFF, 0xAB, 0xFF, 0xB0, 0xFF, 0xA9, 0x0A, 0xFF, 0xA3, 0xFF, 0x9C, 0x21, 0x51, 0xC0, 0x22, 0x4A, 0xB5, 0xA8, 0x21, 0x53, 0xAE, 0x21, 0xA8, 0xA2, 0x21, 0x59, 0xAA, 0xFF, 0xA8, 0xA0, 0x20, 0xC8, 0xA0, 0x2F, 0xE0, 0x95, 0xFF, 0x8C, 0xFF, 0xA6, 0x80, 0x2B, 0x49, 0x9A, 0xFF, 0x92, 0xFF, 0x96, 0xFF, 0x8F, 0xA8, 0x25, 0x33, 0x84, 0x20, 0x05, 0x87, 0x22, 0x2C, 0x7C, 0xFF, 0x7F, 0x2A, 0xFF, 0x79, 0x2B, 0x43, 0x6E, 0x22, 0x86, 0xB8, 0x20, 0x4B, 0xAA, 0x8C, 0x20, 0x53, 0xAD, 0xFF, 0xA4, 0x21, 0x00, 0x30, 0x53, 0x96, 0xFF, 0x54, 0x90, 0x2B, 0xFF, 0x92, 0x20, 0xFC, 0x85, 0x20, 0x4B, 0xA4, 0xFF, 0x41, 0x9B, 0x20, 0x3D, 0xA0, 0xFF, 0x9D, 0xFF, 0x93, 0x20, 0x17, 0x04, 0x8D, 0xFF, 0x89, 0xFF, 0x80, 0x20, 0x3F, 0x86, 0xFF, 0x50, 0x83, 0x20, 0x41, 0x76, 0x20, 0x0D, 0x83, 0xFF, 0x7D, 0xFF, 0x14, 0x77, 0xFF, 0x7E, 0x20, 0x4F, 0x72, 0x25, 0x87, 0x72, 0xFF, 0x04, 0x6C, 0xFF, 0x67, 0xFF, 0x62, 0x40, 0x03, 0x5C, 0xFF, 0x00, 0x58, 0xFF, 0x74, 0xFF, 0x70, 0xFF, 0x69, 0xFF, 0x50, 0x65, 0x25, 0xA1, 0x6A, 0x20, 0x15, 0x5F, 0xFF, 0x5E, 0xFF, 0x04, 0x5A, 0xFF, 0x53, 0xFF, 0x50, 0x22, 0x6C, 0x54, 0xFF, 0x14, 0x4D, 0xFF, 0x4A, 0x00, 0xD3, 0xFF, 0x16, 0x24, 0x1D, 0x6B, 0xFF, 0x6A, 0x15, 0x22, 0x66, 0x72, 0xD7, 0x85, 0x2F, 0xA8, 0xED, 0x5F, 0x95, 0xF9, 0xAA, 0x2E, 0xCE, 0xF0, 0x94, 0x3F, 0x75, 0x21, 0xBF, 0xD5, 0x84, 0x4D, 0x3D, 0xD5, 0x2F, 0xD0, 0xAF, 0xAC, 0xFD, 0x22, 0xFB, 0xE8, 0x26, 0x3B, 0xE0, 0x2F, 0xE7, 0x55, 0xF8, 0x2F, 0x06, 0xF1, 0x23, 0x03, 0xD9, 0x23, 0x01, 0xD3, 0x21, 0x7F, 0x55, 0xF0, 0x28, 0xC8, 0xE6, 0x21, 0x77, 0xD6, 0x23, 0x0F, 0xCC, 0x22, 0xD1, 0x55, 0xDD, 0x21, 0x89, 0xD5, 0x22, 0xBF, 0xC3, 0x22, 0xF6, 0xBB, 0x22, 0xB1, 0x55, 0xBF, 0x21, 0x61, 0xB5, 0x22, 0xB1, 0xA8, 0x21, 0x59, 0x9F, 0x22, 0xBB, 0x55, 0xAB, 0x21, 0x69, 0xA2, 0x21, 0x5F, 0x95, 0x2D, 0x23, 0x8C, 0x42, 0xD5, 0x5A, 0xD2, 0x21, 0x9F, 0xBF, 0x21, 0x95, 0x30, 0x1B, 0xCB, 0x27, 0x21, 0xC4, 0xAA, 0x21, 0xA7, 0xB0, 0x21, 0x9D, 0xA9, 0x21, 0x9F, 0xA6, 0x21, 0x7D, 0x9E, 0xAB, 0x21, 0x7F, 0x8F, 0x23, 0xA2, 0x87, 0x21, 0x77, 0x96, 0x26, 0xB9, 0x30, 0x0B, 0x51, 0x7F, 0x21, 0x19, 0x78, 0x21, 0x7F, 0x9E, 0xFF, 0x94, 0x20, 0x01, 0x45, 0x8A, 0x26, 0xCF, 0x82, 0xFF, 0x81, 0x20, 0x11, 0x8B, 0x20, 0x05, 0x62, 0x82, 0x20, 0x19, 0x30, 0x1B, 0x6E, 0xFF, 0x66, 0x21, 0xA5, 0x71, 0xA2, 0x21, 0x41, 0x68, 0x21, 0x3D, 0x63, 0xFF, 0x60, 0x21, 0x3B, 0x66, 0xA0, 0x21, 0x41, 0x5E, 0x2D, 0xBD, 0x57, 0xFF, 0x51, 0xFF, 0x4F, 0x2A, 0xFF, 0x48, 0x21, 0xC5, 0x70, 0x20, 0x21, 0x68, 0x80, 0x17, 0x6A, 0xAA, 0x20, 0x25, 0x63, 0x21, 0x63, 0x57, 0x20, 0x1D, 0x50, 0x20, 0x1F, 0x55, 0x20, 0xFF, 0x4E, 0x20, 0x01, 0x46, 0xFF, 0x47, 0xFF, 0x40, 0x0A, 0xFF, 0x3F, 0xFF, 0x39, 0x20, 0x07, 0x3F, 0x20, 0x09, 0x39, 0xA2, 0x20, 0x09, 0x32, 0x20, 0x01, 0x2C, 0xFF, 0x5D, 0x23, 0xF6, 0x53, 0xC0, 0x20, 0x23, 0x30, 0x03, 0x49, 0xFF, 0x44, 0xFF, 0x4B, 0xFF, 0x10, 0x45, 0xFF, 0x42, 0x21, 0x3E, 0x40, 0xFF, 0x3C, 0xFF, 0x05, 0x38, 0xFF, 0x34, 0xFF, 0x4A, 0x20, 0x39, 0x41, 0x21, 0x4E, 0x50, 0x43, 0x20, 0x05, 0x3B, 0x20, 0x11, 0x38, 0xFF, 0x35, 0xFF, 0x00, 0x31, 0xFF, 0x2E, 0xFF, 0x33, 0xFF, 0x30, 0xFF, 0x55, 0x2B, 0x23, 0x46, 0x3B, 0x20, 0x0F, 0x33, 0x20, 0x0F, 0x30, 0x24, 0xD2, 0x05, 0x2A, 0xFF, 0x26, 0xFF, 0x2D, 0x2B, 0x94, 0x27, 0x2D, 0xA5, 0x01, 0x23, 0xFF, 0x20, 0xFF, 0x1E, 0xFF, 0x1B, 0x23, 0x68, 0x50, 0x26, 0x40, 0x0B, 0x24, 0x2D, 0xB9, 0x1E, 0xFF, 0x1C, 0xFF, 0x05, 0x1D, 0xFF, 0x1A, 0xFF, 0x18, 0x21, 0xD2, 0x18, 0x24, 0xB8, 0x15, 0x13, 0xFF, 0x12, 0x33, 0x8B, 0x00, 0x20, 0x36, 0xD2, 0x6B, 0xF6, 0xB5, 0x34, 0x85, 0x00, 0x24, 0x87, 0x64, 0xB3, 0xFA, 0x2C, 0x0B, 0xEA, 0x24, 0x61, 0x55, 0xE4, 0x24, 0x57, 0xCC, 0x24, 0x59, 0xC6, 0x27, 0xFF, 0xDF, 0x24, 0x75, 0x52, 0xDA, 0x24, 0x5F, 0xC1, 0x24, 0x4D, 0xBC, 0x00, 0x22, 0xB6, 0x00, 0xC5, 0x23, 0x56, 0x43, 0x7B, 0xFE, 0xFF, 0xF2, 0x34, 0xA5, 0x00, 0x23, 0x4E, 0xAA, 0x24, 0xFD, 0xED, 0x2A, 0x35, 0xEA, 0x2C, 0x67, 0xD5, 0x24, 0xE9, 0xD2, 0xAA, 0x24, 0x91, 0xB7, 0x24, 0x8F, 0xB2, 0x29, 0x02, 0xCD, 0x24, 0xA5, 0xCA, 0xAA, 0x25, 0x7E, 0xAF, 0x24, 0x81, 0xAB, 0x25, 0x86, 0xB0, 0x23, 0x01, 0xAA, 0xAA, 0x23, 0x4B, 0x96, 0x23, 0x4D, 0x90, 0x23, 0x5B, 0xA4, 0x23, 0x09, 0x9F, 0xAA, 0x2E, 0xFF, 0x8A, 0x23, 0x35, 0x85, 0x22, 0xED, 0x7D, 0x22, 0xE9, 0x77, 0xAA, 0x22, 0xDB, 0x67, 0x22, 0xD9, 0x62, 0x22, 0xE7, 0x72, 0x23, 0x39, 0x6D, 0xAA, 0x22, 0xE3, 0x5C, 0x22, 0xE5, 0x57, 0x23, 0x6B, 0x9A, 0x23, 0x37, 0x96, 0xAA, 0x23, 0x17, 0x80, 0x23, 0x19, 0x7C, 0x23, 0x77, 0x93, 0x23, 0x29, 0x90, 0xAA, 0x25, 0x4A, 0x79, 0x23, 0x21, 0x76, 0x22, 0xFF, 0x6A, 0x23, 0x01, 0x65, 0xAA, 0x24, 0x7A, 0x53, 0x22, 0xF9, 0x50, 0x28, 0xA9, 0x62, 0x23, 0x09, 0x5F, 0xAA, 0x25, 0x6C, 0x4D, 0x23, 0x01, 0x4A, 0x21, 0x7F, 0x53, 0x25, 0x78, 0x4E, 0xA2, 0x21, 0x77, 0x42, 0x21, 0x79, 0x3D, 0xFF, 0x52, 0x21, 0x85, 0x4E, 0xAA, 0x21, 0x87, 0x40, 0x21, 0x7D, 0x3C, 0x21, 0x7F, 0x3A, 0x21, 0x69, 0x35, 0xAA, 0x21, 0x6F, 0x2D, 0x25, 0xA4, 0x28, 0x2E, 0xFD, 0x30, 0x21, 0x65, 0x2C, 0xAA, 0x41, 0x53, 0x1E, 0x21, 0x61, 0x1B, 0x21, 0x9F, 0x41, 0x21, 0xDD, 0x3D, 0xAA, 0x21, 0xAB, 0x31, 0x21, 0x99, 0x2D, 0x21, 0xA7, 0x3B, 0x21, 0xAF, 0x38, 0xAA, 0x21, 0x9F, 0x2B, 0x21, 0xA1, 0x29, 0x24, 0xE8, 0x23, 0x21, 0x95, 0x20, 0xAA, 0x21, 0x77, 0x18, 0x21, 0x79, 0x15, 0x21, 0x87, 0x1E, 0x2F, 0x43, 0x1C, 0xAA, 0x21, 0x83, 0x13, 0x23, 0x5E, 0x12, 0x2F, 0x4F, 0x1D, 0x40, 0x1B, 0x19, 0x8A, 0x23, 0x6C, 0x14, 0xFF, 0x11, 0x26, 0x72, 0x14, 0x23, 0x76, 0x11, 0xA8, 0x20, 0x09, 0x0E, 0x20, 0x01, 0x0B, 0x21, 0xA3, 0x10, 0xFF, 0x0F, 0x20, 0xFF, 0x0D, 0x40, 0x03, 0x0B, 0xFF, 0x0A, 0xFF, 0x0C, 0xAA, 0x20, 0x03, 0x09, 0x25, 0x24, 0x08, 0x25, 0x28, 0x06, 0x25, 0x32, 0x13, 0xAA, 0x20, 0x1D, 0x10, 0x20, 0x1F, 0x0C, 0x20, 0x15, 0x0A, 0x25, 0x3C, 0x0F, 0xAB, 0x20, 0x33, 0x0D, 0x20, 0x27, 0x08, 0x20, 0x1D, 0x07, 0x25, 0x52, 0x50, 0x25, 0x56, 0x04, 0x20, 0x01, 0x03, 0x25, 0x76, 0x02, 0x80, 0x07, 0x50, 0x01, 0x01, 0xAC, 0x00, 0xB9, 0x7F, 0x20, 0x2C, 0x1D, 0x03, 0x04, 0xE9, 0x7F, 0x10, 0x04, 0x80, 0x59, 0x30, 0xC2, 0x30, 0xFE, 0xE2, 0x2C, 0x3A, 0x3A, 0x46, 0x20, 0xF8, 0xE9, 0xFF, 0x0C, 0x00, 0x95, 0x00, 0xDC, 0x00, 0x3E, 0x2E, 0x03, 0x1F, 0xA9, 0x80, 0xF2, 0x18, 0x00, 0x10, 0xF9, 0x38, 0xEF, 0x4F, 0x02, 0x50, 0x90, 0xFF, 0x1F, 0xFF, 0xC0, 0xD0, 0x00, 0xDE, 0x98, 0xBF, 0x1B, 0xCB, 0xFF, 0x2F, 0x23, 0xF2, 0x7F, 0xE2, 0x4B, 0xFF, 0x01, 0xCF, 0x27, 0x10, 0x5B, 0x20, 0x2B, 0x10, 0x00, 0x11, 0x49, 0x71, 0x11, 0xFD, 0x60, 0x07, 0xF9, 0x7E, 0x70, 0x17, 0x0B, 0x10, 0x1F, 0x3A, 0x6E, 0x0C, 0xBA, 0x5C, 0x40, 0x41, 0xCD, 0x00, 0x30, 0xE3, 0xFF, 0x20, 0xF9, 0xB7, 0xFF, 0xFF, 0x00, 0xAF, 0xCF, 0x03, 0xD1, 0xF8, 0xFF, 0x7F, 0xFE, 0x00, 0xFF, 0x0C, 0x05, 0x06, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x90, 0x80, 0xED, 0xFF, 0xEE, 0xFF, 0x79, 0x0A, 0x00, 0x77, 0x00, 0xEE, 0x20, 0x07, 0x77, 0x20, 0x07, 0x00, 0x01, 0xAA, 0x00, 0x07, 0xFF, 0xFF, 0x3F, 0xCF, 0x2B, 0x90, 0x06, 0xA5, 0x00, 0x00, 0xF9, 0xF8, 0x70, 0x17, 0x80, 0x1F, 0x4A, 0x00, 0x00, 0xA0, 0x6F, 0x6F, 0xF0, 0x30, 0x00, 0x9B, 0x07, 0x00, 0x00, 0xEF, 0x23, 0x00, 0x80, 0x37, 0x80, 0x3F, 0xEA, 0x05, 0x8B, 0x00, 0x30, 0x1F, 0x80, 0xE8, 0xAB, 0x59, 0xF7, 0x59, 0x00, 0x60, 0x3F, 0x3B, 0xFC, 0xE0, 0x6B, 0xF2, 0x00, 0xE0, 0x5F, 0x00, 0x90, 0x7F, 0xA2, 0x00, 0x6A, 0xF4, 0xF3, 0x2A, 0x9F, 0x8F, 0x90, 0xBF, 0xDE, 0x20, 0xDF, 0x97, 0xDC, 0x48, 0x01, 0x00, 0x20, 0x10, 0x7B, 0xFF, 0x02, 0xAF, 0xFC, 0x30, 0x20, 0xFF, 0xFA, 0x39, 0xE3, 0x4E, 0xFF, 0x00, 0x04, 0x00, 0x00, 0x65, 0x50, 0x01, 0xA9, 0x88, 0x05, 0x04, 0xFF, 0x02, 0xF6, 0x1E, 0x8F, 0xB0, 0x50, 0xEF, 0x00, 0x4A, 0x9F, 0x01, 0x4B, 0x05, 0x08, 0x3C, 0x8F, 0x70, 0x90, 0x21, 0xCF, 0x70, 0xA1, 0xFA, 0x41, 0x45, 0x0C, 0xFF, 0xEF, 0x02, 0x00, 0x20, 0xC5, 0x2A, 0xD9, 0x80, 0x80, 0x80, 0x30, 0x03, 0xFF, 0xFE, 0x05, 0x0B, 0xF8, 0xE1, 0x6F, 0x81, 0x2B, 0x97, 0x80, 0x90, 0x00, 0x05, 0x60, 0x00, 0x2F, 0x66, 0x00, 0xB6, 0xFF, 0xFF, 0x25, 0x06, 0x06, 0x1F, 0xF8, 0x08, 0xF8, 0x9F, 0xF8, 0xF7, 0x2F, 0x73, 0x06, 0x07, 0xBB, 0x90, 0x21, 0x06, 0xD0, 0x40, 0x3B, 0xBB, 0xB8, 0x00, 0x6F, 0x6F, 0x00, 0x70, 0xF0, 0x6F, 0x6F, 0xE0, 0xE0, 0x68, 0xDF, 0x02, 0x50, 0xA0, 0xDF, 0xDF, 0x90, 0x90, 0x20, 0x0B, 0xF0, 0x08, 0x4B, 0x00, 0xB0, 0x00, 0x20, 0x0B, 0xA0, 0x9B, 0x00, 0x00, 0x70, 0x00, 0x89, 0xFF, 0xB6, 0x8D, 0xFF, 0xFF, 0x00, 0x04, 0x03, 0xAD, 0xFD, 0x23, 0x2F, 0xF3, 0xF3, 0x24, 0x9F, 0xAF, 0x20, 0x0B, 0x04, 0xBB, 0x2D, 0xB5, 0xF3, 0xF3, 0x00, 0xAF, 0xBF, 0xB2, 0x00, 0x8B, 0x00, 0xE8, 0xB0, 0x00, 0xFF, 0xEF, 0xC0, 0xC0, 0xFF, 0xFF, 0x49, 0x10, 0x0C, 0x81, 0xFD, 0x90, 0xC1, 0x2B, 0x9B, 0x20, 0x0B, 0x90, 0x00, 0x00, 0xBB, 0x00, 0xA0, 0x21, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0xB3, 0x00, 0xCC, 0x07, 0x7C, 0xFA, 0x68, 0xAC, 0x00, 0xFB, 0x89, 0x00, 0x0A, 0x95, 0xFA, 0x5F, 0x48, 0x00, 0xF8, 0xF9, 0x03, 0x06, 0x72, 0xFA, 0xBD, 0x21, 0x00, 0x9D, 0x01, 0x17, 0x0D, 0xF9, 0xF9, 0x01, 0x00, 0x00, 0xB7, 0x00, 0x58, 0xDF, 0xDB, 0xD8, 0x4F, 0x3F, 0x00, 0x30, 0x20, 0x3A, 0xFF, 0x00, 0x03, 0xFF, 0xFF, 0x01, 0x38, 0x6A, 0x4F, 0x4F, 0x20, 0x30, 0x3B, 0x2E, 0x19, 0x04, 0xFF, 0xFF, 0x4A, 0x0B, 0xBB, 0x2E, 0x18, 0x70, 0xFA, 0x00, 0xCC, 0x5E, 0xFF, 0xFF, 0x09, 0x08, 0xFA, 0xFA, 0x00, 0x8F, 0x8F, 0xF3, 0xF3, 0x8F, 0x7F, 0xFF, 0xFC, 0x00, 0x08, 0x3D, 0x91, 0x00, 0xDD, 0x00, 0xF3, 0xF9, 0x00, 0x8F, 0x9F, 0xBA, 0x00, 0x6B, 0x00, 0x00, 0xB0, 0x00, 0xC7, 0xAF, 0xF4, 0xF7, 0x6F, 0x7F, 0xDC, 0x70, 0x00, 0x19, 0xDF, 0x30, 0x30, 0xFF, 0xFF, 0xF5, 0xC0, 0x00, 0x6F, 0x9F, 0x10, 0x00, 0xD8, 0x00, 0x30, 0x60, 0x01, 0xFF, 0xEF, 0xDB, 0x12, 0x2A, 0x00, 0x31, 0x2E, 0x70, 0x20, 0x09, 0x0C, 0x34, 0xF2, 0xFF, 0xFE, 0x00, 0x10, 0xFD, 0x22, 0xFF, 0x09, 0x5B, 0xEB, 0x40, 0x40, 0xB0, 0x20, 0x2B, 0xFF, 0x0D, 0x9F, 0x1E, 0x08, 0x09, 0x20, 0x1F, 0xAE, 0x7F, 0x05, 0x09, 0xE4, 0x31, 0x08, 0x40, 0x00, 0xFF, 0xE4, 0x3F, 0x49, 0x9F, 0xFF, 0x02, 0x07, 0xBF, 0xFA, 0x30, 0xFF, 0xC8, 0x00, 0x0F, 0x49, 0x23, 0xFC, 0x24, 0x02, 0x7F, 0xEE, 0x24, 0x02, 0x40, 0x07, 0x00, 0x05, 0xFA, 0x60, 0x17, 0x70, 0x1F, 0x00, 0x05, 0xFA, 0x09, 0x90, 0x1F, 0x60, 0x87, 0xD0, 0xBF, 0x55, 0xFA, 0x20, 0xFB, 0xF9, 0xFF, 0xFF, 0x02, 0x8C, 0xAF, 0x03, 0xFF, 0x5E, 0x04, 0x10, 0x16, 0x4D, 0xE6, 0x43, 0x02, 0x4C, 0x49, 0x4D, 0xFF, 0xFE, 0x14, 0x2F, 0xFF, 0x02, 0x30, 0x02, 0x28, 0x26, 0xF7, 0x38, 0x90, 0x69, 0x6D, 0x61, 0x67, 0xA8, 0x37, 0x02, 0x80, 0x27, 0xBE, 0x0D, 0x67, 0x0F, 0x2B, 0xEA, 0x91, 0x00, 0xE1, 0x95, 0x34, 0xA7, 0x5B, 0x58, 0x01, 0xAD, 0x00, 0x9B, 0xEF, 0x2F, 0x93, 0x39, 0x5F, 0x2E, 0x47, 0x00, 0x1A, 0x26, 0x38, 0x61, 0xA5, 0x72, 0xFA, 0x4F, 0x00, 0xFE, 0x8B, 0x89, 0x49, 0xE9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -static const unsigned char Nintendo_LicensedBy_LZ[0x2000] = -{ - 0x11, 0x48, 0x65, 0x00, 0x00, 0x64, 0x61, 0x72, 0x63, 0xFF, 0xFE, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x28, 0x65, 0x00, 0x00, 0x83, 0x30, 0x09, 0x32, 0x04, 0x00, 0x00, 0x60, 0x20, 0x03, 0x30, 0x13, 0xAB, 0x30, 0x18, 0x15, 0x20, 0x1D, 0x02, 0xA0, 0x0B, 0x06, 0x20, 0x2B, 0x30, 0x18, 0x5A, 0x09, 0x20, 0x35, 0x10, 0x20, 0x39, 0x30, 0x2B, 0xF8, 0x20, 0x41, 0x54, 0x85, 0x30, 0x0B, 0x05, 0x00, 0x00, 0xEC, 0x20, 0x4D, 0x98, 0x30, 0x17, 0xD0, 0x20, 0x28, 0x30, 0x17, 0xDC, 0x30, 0x23, 0x07, 0x00, 0x00, 0xCC, 0x09, 0x0C, 0x00, 0x00, 0x20, 0x20, 0x51, 0x40, 0x14, 0x20, 0x2B, 0xA0, 0x20, 0x0B, 0x64, 0x20, 0x5D, 0xA0, 0x20, 0x00, 0x00, 0x4C, 0x99, 0x20, 0x5C, 0xA8, 0x01, 0x50, 0x53, 0x20, 0x22, 0x00, 0xB2, 0x30, 0x75, 0x0A, 0x23, 0x00, 0x00, 0xB4, 0x20, 0x74, 0xE2, 0x20, 0x81, 0xC0, 0x09, 0x25, 0x00, 0x00, 0x3C, 0x20, 0x68, 0x12, 0x02, 0x50, 0x77, 0xA0, 0x30, 0x8F, 0x1C, 0x20, 0x90, 0x00, 0x36, 0x00, 0x00, 0x28, 0xA6, 0x20, 0xAB, 0x3E, 0x20, 0x9C, 0x80, 0x3A, 0x20, 0x0B, 0x20, 0xAD, 0x60, 0xAA, 0x30, 0x17, 0x3C, 0x50, 0x17, 0x82, 0x30, 0x17, 0x40, 0x20, 0x23, 0x08, 0x16, 0x00, 0x00, 0xA4, 0x30, 0x2F, 0x49, 0x20, 0x67, 0x20, 0xE9, 0xC4, 0xAB, 0x30, 0x3B, 0x4A, 0x50, 0x17, 0xDC, 0x30, 0x3B, 0x52, 0x20, 0x47, 0x20, 0xE0, 0x59, 0xF4, 0x30, 0x53, 0x55, 0x20, 0x53, 0x30, 0xD4, 0x00, 0x2E, 0x21, 0x13, 0x01, 0x61, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x6D, 0x21, 0x1D, 0x41, 0x4E, 0x20, 0x07, 0x6E, 0x00, 0x74, 0x00, 0x65, 0x20, 0x11, 0x05, 0x64, 0x00, 0x6F, 0x00, 0x4C, 0x20, 0x03, 0x67, 0x20, 0x07, 0x14, 0x5F, 0x00, 0x44, 0x20, 0x03, 0x30, 0x20, 0x01, 0x5F, 0x00, 0x10, 0x53, 0x00, 0x63, 0x40, 0x1F, 0x65, 0x00, 0x4F, 0x00, 0x55, 0x75, 0x20, 0x2B, 0x41, 0x20, 0x43, 0x62, 0x20, 0x13, 0x6C, 0x40, 0x47, 0xAB, 0x02, 0x50, 0x43, 0x42, 0x03, 0x20, 0x43, 0x43, 0x01, 0x80, 0x87, 0x55, 0x03, 0x20, 0xCB, 0x00, 0x90, 0x43, 0xEB, 0x01, 0x90, 0xCB, 0x00, 0x90, 0x87, 0xF0, 0xCB, 0x62, 0x21, 0x5D, 0x79, 0x21, 0x97, 0x01, 0x31, 0xA1, 0xF5, 0x71, 0x8D, 0x00, 0xF0, 0x2F, 0x71, 0x05, 0xD0, 0x2F, 0x74, 0x42, 0x09, 0x67, 0x23, 0x29, 0x5E, 0x33, 0x22, 0x01, 0x73, 0xA2, 0x01, 0xB0, 0x5B, 0x52, 0x2D, 0x00, 0x10, 0x21, 0x31, 0xAA, 0x01, 0x00, 0x21, 0x32, 0x01, 0x00, 0x43, 0x33, 0xE0, 0x65, 0x4C, 0x23, 0x71, 0x4D, 0x8F, 0x22, 0xA3, 0x73, 0x00, 0x6B, 0x00, 0x40, 0x85, 0x30, 0x1F, 0x00, 0xB0, 0x17, 0xF0, 0x93, 0xAA, 0xF2, 0xE3, 0x5F, 0x22, 0xE5, 0x69, 0x62, 0xD3, 0x73, 0x22, 0xF9, 0x64, 0xA8, 0x22, 0x8D, 0x79, 0x22, 0xF1, 0x31, 0x20, 0xAB, 0x38, 0x00, 0x78, 0xB0, 0x23, 0x7E, 0x34, 0xE0, 0xF7, 0x00, 0x10, 0x02, 0x43, 0x4C, 0x41, 0x4E, 0x23, 0xFF, 0xFE, 0x23, 0xF0, 0x00, 0x02, 0x02, 0x34, 0x23, 0x33, 0xB6, 0x0E, 0x70, 0x61, 0x74, 0x31, 0x23, 0xA2, 0x44, 0x5E, 0x34, 0x79, 0x28, 0x88, 0x33, 0x93, 0xFF, 0xFF, 0xFF, 0x34, 0x6C, 0x53, 0x63, 0x65, 0x02, 0x6E, 0x65, 0x4F, 0x75, 0x74, 0x41, 0x24, 0x91, 0x47, 0x04, 0x5F, 0x41, 0x5F, 0x30, 0x30, 0xD0, 0x56, 0x70, 0x61, 0x33, 0x69, 0x31, 0x33, 0xC3, 0x50, 0x3F, 0x02, 0x00, 0x30, 0x59, 0x34, 0xBD, 0x40, 0x68, 0x24, 0xC1, 0x50, 0x5F, 0x4E, 0x69, 0x6E, 0x4C, 0x1C, 0x6F, 0x67, 0x6F, 0xA0, 0x35, 0x34, 0xC0, 0x34, 0xDD, 0x43, 0x4C, 0x23, 0x56, 0x43, 0x74, 0x5F, 0x00, 0x10, 0x02, 0x40, 0x87, 0x40, 0x0B, 0xC8, 0xD0, 0x5D, 0x20, 0x76, 0x7F, 0x43, 0x35, 0x0C, 0x4E, 0x5F, 0x52, 0x1C, 0x6F, 0x6F, 0x74, 0xD0, 0x7E, 0x00, 0x70, 0x4B, 0x80, 0x57, 0x00, 0x20, 0xFE, 0x20, 0x3B, 0x50, 0x3F, 0x00, 0x30, 0xFF, 0x35, 0x17, 0xB0, 0xFF, 0x24, 0xF2, 0x80, 0xFF, 0x00, 0x35, 0x00, 0x1E, 0x45, 0x6C, 0x70, 0xFF, 0x42, 0x40, 0xFF, 0x42, 0x00, 0x40, 0xFF, 0x6C, 0x9C, 0x80, 0x2D, 0x90, 0xFF, 0x5C, 0x01, 0xE0, 0xFF, 0x90, 0xB3, 0x34, 0xC2, 0xBE, 0x02, 0xD0, 0xF3, 0xC8, 0x20, 0xAA, 0xD0, 0xF3, 0x01, 0x71, 0xFF, 0x31, 0x39, 0x71, 0xFF, 0x65, 0xE2, 0x23, 0x51, 0xB1, 0xFF, 0x31, 0x84, 0x47, 0x5F, 0x43, 0x00, 0x81, 0xFF, 0x0F, 0xCC, 0xE1, 0xFF, 0x02, 0x90, 0xFF, 0x12, 0xC3, 0x02, 0x31, 0xF3, 0x92, 0x3F, 0x80, 0xBF, 0xBD, 0x91, 0xF3, 0x60, 0x32, 0xB6, 0x00, 0x82, 0xFF, 0x36, 0xFF, 0x03, 0x32, 0xFF, 0x7C, 0x27, 0x47, 0xAA, 0x53, 0x3F, 0x0D, 0x42, 0xFF, 0x48, 0x27, 0xBD, 0xB0, 0x27, 0xC1, 0xA4, 0xB0, 0x27, 0xAD, 0x24, 0x27, 0xA8, 0x36, 0xEB, 0x30, 0x03, 0x00, 0x00, 0x56, 0xBC, 0x20, 0x03, 0x24, 0x27, 0xCB, 0x88, 0x37, 0x93, 0x27, 0xB4, 0xB0, 0x81, 0x27, 0x07, 0x74, 0x0A, 0x00, 0x00, 0x78, 0x0B, 0x32, 0xDF, 0x7C, 0x57, 0x00, 0x03, 0x5B, 0x37, 0x52, 0x27, 0x8E, 0x26, 0xD1, 0x33, 0xB7, 0x50, 0x41, 0xB8, 0x83, 0x2F, 0x02, 0xF2, 0xE3, 0x73, 0xDB, 0x01, 0x13, 0x07, 0x50, 0x5F, 0x33, 0xBB, 0x00, 0x80, 0x67, 0xB8, 0x60, 0x67, 0x20, 0xAA, 0x43, 0xC7, 0x38, 0x63, 0xC7, 0x30, 0x6F, 0xA9, 0x93, 0x9F, 0xA0, 0x24, 0x0A, 0xA0, 0x27, 0xC5, 0x80, 0xBE, 0x24, 0x39, 0x91, 0x23, 0x16, 0xA0, 0xC0, 0x48, 0x99, 0x06, 0x02, 0x00, 0x30, 0x37, 0x80, 0x70, 0x23, 0x33, 0x33, 0xB3, 0x3F, 0xFC, 0x2D, 0xEC, 0x46, 0xBC, 0x70, 0x0B, 0x0A, 0xD7, 0x23, 0x20, 0x0B, 0x30, 0x2F, 0x80, 0x5E, 0x3F, 0x48, 0xC9, 0x07, 0x01, 0xD0, 0x2F, 0xF4, 0x2F, 0xB0, 0x6B, 0x39, 0x2C, 0x40, 0x37, 0x9D, 0x1C, 0x30, 0x97, 0x61, 0xEF, 0xCC, 0x28, 0x65, 0x30, 0x9B, 0x70, 0xF3, 0xEE, 0x24, 0x87, 0xE4, 0xB9, 0x71, 0x5B, 0x50, 0xF1, 0x5B, 0x29, 0x59, 0xD4, 0x8B, 0x80, 0x0B, 0x41, 0xCD, 0xCC, 0xCC, 0x20, 0xEB, 0x20, 0x34, 0x02, 0x00, 0x41, 0x67, 0xF3, 0x00, 0x14, 0xBB, 0x30, 0x7F, 0x30, 0x2F, 0x71, 0x73, 0x44, 0x73, 0xF5, 0x38, 0x01, 0xA0, 0x7F, 0x51, 0xC1, 0x20, 0x7F, 0x3E, 0x02, 0xD0, 0x7F, 0x52, 0x65, 0x64, 0x01, 0x70, 0xFF, 0xC2, 0xC1, 0xEB, 0x45, 0x43, 0xC2, 0xB7, 0x6D, 0xDB, 0x20, 0x7F, 0x8C, 0x9A, 0x25, 0x02, 0x20, 0xC1, 0x00, 0xD1, 0x8B, 0xB6, 0x72, 0x5C, 0xA4, 0x87, 0xB4, 0x85, 0x41, 0x3B, 0x92, 0x24, 0xE9, 0xC0, 0x60, 0x8B, 0x31, 0x00, 0x32, 0xE7, 0xEB, 0x35, 0x33, 0xF2, 0xE7, 0x92, 0x53, 0xF0, 0x26, 0x82, 0x20, 0x25, 0x1B, 0x90, 0x0B, 0xFD, 0x50, 0x97, 0x34, 0xEF, 0x00, 0x50, 0x97, 0x96, 0x53, 0x30, 0x3B, 0x77, 0x0E, 0xAA, 0xF1, 0x17, 0x7F, 0x32, 0x02, 0x13, 0x73, 0x32, 0xF7, 0x50, 0x8B, 0x00, 0x96, 0x7B, 0x33, 0x1B, 0x57, 0x82, 0x00, 0x31, 0x7F, 0xCD, 0x3B, 0xB0, 0x57, 0x07, 0x54, 0x53, 0x2B, 0x0E, 0x47, 0x73, 0x4C, 0x37, 0x8B, 0xBB, 0x2B, 0xF9, 0x94, 0x63, 0x8B, 0x3B, 0xA7, 0x3B, 0xF1, 0x24, 0x4B, 0xF5, 0x00, 0x01, 0x97, 0x0F, 0xC0, 0x39, 0x8E, 0xE3, 0x2B, 0x59, 0x51, 0x5B, 0x5C, 0x1D, 0x01, 0x20, 0x23, 0x40, 0x03, 0xF7, 0x6B, 0x40, 0x41, 0x9E, 0x15, 0x8D, 0xBD, 0x8D, 0x31, 0xA3, 0x9A, 0x99, 0xB9, 0x2B, 0x9D, 0x2C, 0x7A, 0x04, 0x01, 0x10, 0x23, 0x55, 0x01, 0x01, 0x20, 0x8F, 0x01, 0x01, 0x20, 0x8F, 0x01, 0x00, 0x10, 0x8F, 0xC1, 0x20, 0x8F, 0x6C, 0x3D, 0x60, 0x8F, 0x44, 0x5B, 0x01, 0x00, 0x10, 0x8F, 0x00, 0x00, 0x23, 0x50, 0x5F, 0x10, 0x42, 0x6C, 0x6B, 0x03, 0xE1, 0x63, 0x9A, 0x99, 0x19, 0xC0, 0x1F, 0x0E, 0x74, 0xDA, 0x00, 0xC1, 0x63, 0x00, 0x40, 0x23, 0x04, 0x61, 0x63, 0x00, 0x30, 0x8F, 0xF1, 0x63, 0xF5, 0x00, 0x40, 0x23, 0x03, 0x81, 0x63, 0x00, 0x13, 0xBB, 0x00, 0x32, 0xC7, 0x58, 0x2E, 0xBD, 0x88, 0x66, 0x4F, 0x55, 0xE8, 0x2E, 0xC9, 0x18, 0x2E, 0xB5, 0x48, 0x2E, 0xB9, 0x78, 0x62, 0xC7, 0xF7, 0xE3, 0xD3, 0x56, 0x3F, 0x60, 0x0B, 0x52, 0xD3, 0xF0, 0xC2, 0xD3, 0x01, 0xC0, 0x2F, 0x22, 0xDF, 0xBB, 0xD4, 0x33, 0x40, 0x68, 0x03, 0x50, 0x0B, 0x52, 0xEB, 0xF0, 0xC2, 0xEB, 0x01, 0xB0, 0x2F, 0xFF, 0x32, 0xF7, 0x01, 0xB0, 0xBF, 0x33, 0x03, 0x01, 0xC0, 0x2F, 0x00, 0x10, 0xBF, 0x45, 0x73, 0x70, 0x0B, 0x53, 0x1B, 0xFF, 0x40, 0xBF, 0x83, 0x1B, 0x01, 0xB0, 0x2F, 0x63, 0x27, 0x03, 0xC1, 0xC3, 0x33, 0x27, 0x75, 0x97, 0x93, 0x33, 0xFF, 0x00, 0x91, 0xC3, 0x01, 0x00, 0x2F, 0x05, 0xE1, 0xC3, 0x00, 0xF0, 0xBF, 0xF1, 0xC3, 0x01, 0x00, 0x2F, 0x05, 0x01, 0xC3, 0x00, 0x16, 0xB7, 0xFA, 0x00, 0x36, 0x4F, 0x35, 0xCC, 0x33, 0x8B, 0x36, 0x53, 0x33, 0x8F, 0xA0, 0x69, 0xE3, 0xD0, 0xFF, 0x6D, 0xAB, 0xE6, 0xCF, 0x59, 0xC7, 0x26, 0x43, 0x00, 0x40, 0x17, 0x26, 0x37, 0xD6, 0xFF, 0x63, 0x57, 0xFF, 0x26, 0x2B, 0x00, 0x30, 0x17, 0x36, 0x1F, 0x00, 0x30, 0x5F, 0x36, 0x13, 0x00, 0x40, 0x17, 0x00, 0x10, 0x5F, 0x48, 0x6B, 0xFF, 0x35, 0xFB, 0x00, 0x30, 0x17, 0x65, 0xEF, 0x03, 0xC1, 0x03, 0x82, 0xC7, 0xE1, 0x03, 0x82, 0xDF, 0x02, 0xE1, 0x03, 0xFB, 0x73, 0x27, 0xF1, 0x03, 0x80, 0x17, 0x01, 0xE1, 0x03, 0x00, 0xFF, 0xDF, 0x54, 0xEC, 0xDF, 0x02, 0x7E, 0xDF, 0x75, 0x04, 0x2F, 0xA4, 0x5F, 0x0D, 0xDC, 0xDF, 0x50, 0x2F, 0xCC, 0xB8, 0x2F, 0xD0, 0x55, 0x20, 0x2F, 0xBC, 0xA0, 0x2F, 0xC0, 0x2C, 0x2C, 0xE3, 0xAC, 0x2C, 0xE7, 0x52, 0x10, 0x2C, 0xDF, 0x74, 0x2C, 0xDF, 0xD8, 0x07, 0x2D, 0x17, 0x09, 0xFE, 0x2C, 0x31, 0x2C, 0xE3, 0x02, 0x9C, 0xDF, 0x3E, 0xCF, 0x00, 0xFC, 0xDF, 0x9E, 0xF3, 0x00, 0xBC, 0xDF, 0x7C, 0xBF, 0xEC, 0xDF, 0x2C, 0x6D, 0x5B, 0xDD, 0x4F, 0x4C, 0xE3, 0x8C, 0xD3, 0xD0, 0x17, 0x9C, 0xBB, 0xFD, 0x00, 0x30, 0x17, 0x00, 0x9F, 0xD3, 0x3F, 0xFD, 0x01, 0x1C, 0x8B, 0x00, 0x0D, 0xE7, 0xC3, 0xA3, 0xA0, 0x81, 0xF3, 0xFB, 0x00, 0x9F, 0xFB, 0x30, 0x23, 0x01, 0x1C, 0x73, 0x03, 0xD0, 0x67, 0x02, 0x7C, 0x5B, 0x70, 0x2B, 0xCB, 0x7C, 0x5B, 0x7F, 0x20, 0x3B, 0xDB, 0x00, 0xEB, 0xC3, 0x3E, 0x67, 0x7F, 0xD7, 0x5B, 0xCF, 0x00, 0xFC, 0x4F, 0x00, 0xDC, 0xDB, 0x7D, 0xF0, 0x2C, 0xCB, 0x80, 0x7F, 0x01, 0x2C, 0xDB, 0x30, 0x2F, 0x7F, 0xFB, 0xC8, 0x2F, 0x03, 0xFF, 0x7C, 0xDB, 0x5B, 0xE7, 0xAC, 0xDB, 0x00, 0x4C, 0x4F, 0x03, 0x3D, 0x67, 0x00, 0x1E, 0x67, 0xDD, 0x67, 0x04, 0x1C, 0x67, 0xFF, 0x41, 0xA3, 0x79, 0x93, 0x9D, 0x43, 0xCC, 0x67, 0x00, 0x60, 0x23, 0xCC, 0x67, 0x31, 0xEB, 0x89, 0x7B, 0xFF, 0x28, 0x2F, 0x00, 0x3C, 0x67, 0x00, 0x50, 0x23, 0xDC, 0x67, 0x00, 0x50, 0x8F, 0xDC, 0x67, 0x00, 0x60, 0x23, 0x00, 0x10, 0x8F, 0xF9, 0x79, 0x4B, 0x30, 0x8F, 0x00, 0x2C, 0x67, 0x00, 0x50, 0x23, 0x04, 0x1C, 0x67, 0x70, 0xC2, 0xA9, 0x33, 0xFF, 0x00, 0x81, 0x63, 0x00, 0x40, 0x23, 0x04, 0x61, 0x63, 0x00, 0x30, 0x8F, 0xF1, 0x63, 0x00, 0x40, 0x23, 0x03, 0x81, 0x63, 0x01, 0x5C, 0x67, 0xFF, 0x01, 0x9F, 0x2F, 0x43, 0xEB, 0x6F, 0x2F, 0x9F, 0x97, 0xDF, 0x2F, 0x00, 0x60, 0x23, 0xCF, 0x2F, 0x34, 0x33, 0xFF, 0x7F, 0x2F, 0x38, 0x2F, 0x00, 0x3F, 0x2F, 0x00, 0x50, 0x23, 0xDF, 0x2F, 0x00, 0x50, 0x8F, 0xDF, 0x2F, 0x00, 0x60, 0x23, 0xFF, 0x00, 0x10, 0x8F, 0x6F, 0x2F, 0x40, 0x8F, 0x00, 0x2F, 0x2F, 0x00, 0x50, 0x23, 0x01, 0x7C, 0x07, 0x01, 0xB1, 0x63, 0x9F, 0x2F, 0xFF, 0x00, 0x91, 0x63, 0x00, 0x40, 0x23, 0x04, 0x61, 0x63, 0x00, 0x30, 0x8F, 0xF1, 0x63, 0x00, 0x40, 0x23, 0x03, 0x81, 0x63, 0x01, 0x5B, 0xA7, 0xFF, 0x01, 0x95, 0x8F, 0x46, 0x27, 0x6F, 0x23, 0x9F, 0xDF, 0xD5, 0x8F, 0x00, 0x60, 0x23, 0xC5, 0x8F, 0x4F, 0xDF, 0xFF, 0x6F, 0x0B, 0x4F, 0xDF, 0x00, 0x25, 0x8F, 0x00, 0x50, 0x23, 0xD5, 0x8F, 0x00, 0x50, 0x8F, 0xD5, 0x8F, 0x00, 0x60, 0x23, 0xFF, 0x00, 0x10, 0x8F, 0x6E, 0xDB, 0x40, 0x8F, 0x00, 0x25, 0x8F, 0x00, 0x50, 0x23, 0x01, 0x7C, 0x07, 0x01, 0xB1, 0x63, 0x9E, 0xC3, 0xFF, 0x00, 0x91, 0x63, 0x00, 0x40, 0x23, 0x04, 0x61, 0x63, 0x00, 0x30, 0x8F, 0xF1, 0x63, 0x00, 0x40, 0x23, 0x03, 0x61, 0x63, 0x00, 0x7C, 0x5F, 0x78, 0x4C, 0x2C, 0x5C, 0xBC, 0x5F, 0x3E, 0x51, 0x7C, 0x5F, 0x65, 0x00, 0x73, 0xC5, 0xCC, 0x5F, 0x3B, 0x9C, 0x47, 0x5F, 0x43, 0x00, 0x4C, 0x5F, 0xFC, 0x2E, 0xBB, 0x7A, 0x0F, 0x5B, 0x58, 0x4C, 0x5F, 0x3C, 0x82, 0x3B, 0xAB, 0xBC, 0x2F, 0xFF, 0xFC, 0xAB, 0x2F, 0xF8, 0x3C, 0x2E, 0xDB, 0x7C, 0x2E, 0xDF, 0xBC, 0x2E, 0xE3, 0x00, 0x3C, 0x47, 0xE5, 0x3E, 0xC7, 0x5E, 0xFB, 0x00, 0x7A, 0x3B, 0x80, 0xBF, 0x9A, 0x3B, 0x60, 0x88, 0xC7, 0xEE, 0x00, 0x3C, 0x2B, 0x00, 0x70, 0x4B, 0x9F, 0x2B, 0xCA, 0x2A, 0xB7, 0x00, 0x9B, 0xCB, 0x01, 0x10, 0x3F, 0xF2, 0xFB, 0xA0, 0x3F, 0x00, 0x1B, 0xA3, 0x01, 0xD0, 0x3F, 0x00, 0x29, 0xEF, 0x01, 0x00, 0xBF, 0x8E, 0x2B, 0x77, 0x70, 0xFF, 0xDD, 0x00, 0x27, 0x67, 0x01, 0x00, 0xFF, 0x24, 0xF0, 0x3F, 0xDF, 0x83, 0x01, 0x01, 0x3F, 0x30, 0x00, 0x8E, 0xBB, 0x95, 0x5E, 0xBF, 0x59, 0x54, 0x7E, 0xBF, 0xB4, 0x2E, 0xBC, 0x10, 0x2F, 0xFB, 0x0C, 0x6C, 0x79, 0x74, 0x31, 0x3E, 0xD1, 0x4A, 0x9E, 0x00, 0xA0, 0x80, 0x2D, 0xE7, 0x70, 0x43, 0x74, 0x78, 0x6C, 0x31, 0x34, 0xB0, 0x61, 0xFB, 0x04, 0x2F, 0xFF, 0x2D, 0x55, 0x74, 0x65, 0x6E, 0x64, 0x08, 0x6F, 0x5F, 0x4C, 0x69, 0x2E, 0xD1, 0x73, 0x65, 0x64, 0x00, 0x42, 0x79, 0x5F, 0x31, 0x32, 0x38, 0x78, 0x36, 0x01, 0x34, 0x2E, 0x62, 0x63, 0x6C, 0x69, 0x6D, 0x3F, 0xEE, 0x5C, 0x6D, 0x2F, 0x07, 0x60, 0x62, 0x2F, 0x30, 0x57, 0x4D, 0x8B, 0x4C, 0x6F, 0x23, 0x67, 0x6F, 0xAE, 0xF5, 0xFF, 0xFF, 0xFF, 0x30, 0x03, 0x00, 0x40, 0x02, 0x7C, 0x15, 0x5F, 0xEC, 0x30, 0x6E, 0xAF, 0x7E, 0x3E, 0x13, 0x5E, 0x17, 0x70, 0x61, 0x20, 0x6E, 0x31, 0x3B, 0x5B, 0x01, 0x04, 0xFF, 0x00, 0x52, 0x01, 0x6F, 0x6F, 0x74, 0x50, 0x61, 0x6E, 0x65, 0x00, 0xB0, 0xEB, 0xC3, 0x00, 0x50, 0x47, 0x50, 0xDF, 0x70, 0x61, 0x73, 0x31, 0x3B, 0xAF, 0x70, 0x53, 0x4F, 0x03, 0x20, 0x53, 0x4E, 0x5F, 0x30, 0x55, 0x00, 0x0F, 0xA2, 0x01, 0x20, 0x53, 0x4C, 0xDF, 0x42, 0x42, 0x80, 0x53, 0x69, 0x63, 0x31, 0x80, 0x3C, 0x1B, 0x07, 0x7E, 0xFF, 0x00, 0x41, 0x03, 0x7E, 0xEC, 0x2D, 0x67, 0x82, 0x2B, 0x00, 0x20, 0xEF, 0x2F, 0x6F, 0x80, 0x78, 0x42, 0xF1, 0x2B, 0x71, 0xA5, 0xCF, 0x2F, 0xC1, 0x27, 0x80, 0x3F, 0x70, 0x30, 0x61, 0x65, 0x60, 0xDB, 0x50, 0x07, 0x67, 0x72, 0x70, 0x31, 0xC3, 0x3C, 0xA3, 0x31, 0x33, 0x47, 0x72, 0x6F, 0x75, 0x3C, 0x9B, 0x7F, 0xF3, 0x38, 0x67, 0x72, 0x51, 0x07, 0x30, 0x23, 0x34, 0x63, 0x47, 0x5F, 0x41, 0xFC, 0xCF, 0xDF, 0x3F, 0xDB, 0xF1, 0x17, 0xF1, 0xD7, 0x30, 0x5F, 0x3F, 0xEB, 0x47, 0x5F, 0x7E, 0x42, 0xCF, 0x79, 0x3F, 0xF3, 0x00, 0x90, 0x2B, 0xD4, 0xAB, 0x3F, 0xEF, 0xF1, 0x7F, 0x67, 0x6A, 0x72, 0x50, 0xC7, 0x00, 0x72, 0xBF, 0x3C, 0x22, 0xBC, 0x22, 0x00, 0x02, 0xBF, 0xC8, 0xD6, 0x82, 0xBF, 0x3D, 0x7F, 0x07, 0x64, 0xBB, 0x2D, 0x2F, 0xFF, 0x2F, 0x08, 0x00, 0x74, 0x4F, 0x34, 0xA1, 0x32, 0xF3, 0x2F, 0xFF, 0x78, 0x2F, 0xFB, 0x33, 0x64, 0x75, 0x73, 0x62, 0xA1, 0x62, 0xC7, 0x80, 0x10, 0x31, 0xF0, 0x10, 0x32, 0xF0, 0x21, 0x4E, 0x33, 0x62, 0xFA, 0x4C, 0x54, 0x90, 0x3E, 0x30, 0x0B, 0x70, 0x39, 0x4C, 0x0E, 0x54, 0x4D, 0x61, 0x73, 0x3C, 0xCC, 0x63, 0x22, 0x33, 0x1F, 0xA8, 0x0A, 0x06, 0x00, 0x00, 0x0B, 0x2F, 0xFF, 0x38, 0x2F, 0xFF, 0x88, 0xAA, 0x2F, 0xFB, 0x08, 0x2F, 0xF4, 0x88, 0x2F, 0xF8, 0x08, 0x2F, 0xD4, 0x88, 0xAA, 0x2F, 0xD8, 0x4C, 0x2F, 0x10, 0xE8, 0x2F, 0x14, 0xAC, 0x23, 0x74, 0x48, 0x76, 0x05, 0x2F, 0xD7, 0x20, 0x2F, 0x00, 0x35, 0x47, 0xAA, 0x53, 0x4B, 0x00, 0x83, 0x47, 0x02, 0xED, 0x00, 0xA3, 0x47, 0x00, 0x35, 0x57, 0x00, 0xB3, 0x97, 0xD5, 0x20, 0xB3, 0x00, 0xB3, 0x97, 0x40, 0x24, 0x20, 0xA1, 0x30, 0x03, 0x11, 0x2F, 0xFB, 0x74, 0x06, 0x00, 0x04, 0x30, 0x03, 0x87, 0x30, 0x0B, 0x65, 0x06, 0x00, 0x01, 0x30, 0x03, 0x30, 0x17, 0x31, 0x87, 0xA6, 0x5E, 0x03, 0x05, 0x2F, 0x47, 0x4F, 0x5F, 0x31, 0x32, 0x01, 0xB0, 0x7F, 0x01, 0xC1, 0x03, 0xE0, 0x7F, 0xD2, 0xA9, 0x00, 0x00, 0x8C, 0x8C, 0x8C, 0x05, 0xA0, 0x7F, 0xDF, 0x00, 0x16, 0x97, 0x00, 0xF1, 0x7F, 0x03, 0x03, 0xC1, 0x7F, 0x00, 0x16, 0xD7, 0x45, 0x9B, 0x2F, 0xB4, 0x00, 0x25, 0x9B, 0x2C, 0x80, 0x3F, 0x23, 0x44, 0x04, 0x25, 0x97, 0x30, 0x03, 0x06, 0x00, 0x03, 0x06, 0x06, 0x73, 0x09, 0xED, 0xBE, 0x30, 0x03, 0x3F, 0xFB, 0x0D, 0x3A, 0x57, 0xDE, 0x40, 0x30, 0x03, 0xE0, 0x13, 0xC0, 0x30, 0x03, 0xC0, 0x00, 0x75, 0xC7, 0x78, 0x54, 0x10, 0x04, 0x00, 0x01, 0x10, 0x04, 0x28, 0x10, 0x02, 0xA2, 0x37, 0x46, 0xF2, 0x37, 0x26, 0x06, 0x02, 0x3E, 0x05, 0x66, 0x23, 0x33, 0x00, 0x12, 0x43, 0x4D, 0x5F, 0x00, 0x35, 0xAA, 0x00, 0x36, 0x5E, 0x80, 0x58, 0xEA, 0x23, 0x77, 0x05, 0x26, 0x5B, 0x30, 0x03, 0x30, 0x8E, 0xE3, 0x7D, 0xBE, 0x30, 0x03, 0xB0, 0xBF, 0xE0, 0x13, 0xC0, 0xBF, 0x50, 0xA7, 0x00, 0x00, 0xC0, 0xA7, 0xE1, 0x00, 0x21, 0x5F, 0xCF, 0x5F, 0x01, 0xB1, 0x5F, 0x2F, 0xA1, 0xBD, 0xBF, 0x30, 0x03, 0x86, 0x3F, 0xF7, 0xCE, 0x95, 0x17, 0x41, 0x30, 0x03, 0xE0, 0x13, 0xC1, 0xF0, 0x30, 0x03, 0x05, 0x21, 0x5F, 0x00, 0x00, 0xC3, 0x01, 0x31, 0x5F, 0x61, 0x0B, 0xB6, 0xBF, 0xFF, 0x30, 0x03, 0xB0, 0xBF, 0xE0, 0x13, 0xC0, 0xBF, 0x02, 0x61, 0x5F, 0xCD, 0xF7, 0x01, 0xB2, 0xBF, 0x3F, 0xF7, 0xFF, 0x50, 0x03, 0x5D, 0xA7, 0x50, 0x03, 0xC0, 0x13, 0x4F, 0xF7, 0x05, 0x22, 0xBF, 0x00, 0x00, 0xC3, 0x01, 0x32, 0xBF, 0xFF, 0x3F, 0xE3, 0x3F, 0xE7, 0xB0, 0xBF, 0xE0, 0x13, 0xC0, 0xBF, 0x01, 0xF2, 0xBF, 0x03, 0x59, 0x67, 0x57, 0x87, 0xFE, 0x00, 0x59, 0x67, 0x00, 0x1C, 0x63, 0x99, 0x13, 0x40, 0x03, 0x00, 0x79, 0x13, 0x3F, 0x93, 0xC9, 0x67, 0xA0, 0xB1, 0x4E, 0xC7, 0xF5, 0x00, 0x84, 0xD3, 0x70, 0x53, 0x46, 0x31, 0x32, 0x00, 0x63, 0x2F, 0xD0, 0x58, 0x2F, 0xFA, 0x93, 0x05, 0x4F, 0xF1, 0x00, 0x00, 0xCD, 0xCC, 0x4F, 0x4C, 0x28, 0x36, 0x80, 0x3F, 0x50, 0x07, 0x40, 0x0F, 0x4A, 0x8F, 0x50, 0x07, 0xFE, 0x9F, 0xEC, 0xE0, 0x0B, 0x40, 0x03, 0x00, 0x0A, 0x0F, 0x2A, 0xB7, 0x00, 0xA4, 0xB7, 0x60, 0xFB, 0x20, 0xFB, 0x01, 0xC0, 0xA7, 0x27, 0x62, 0x01, 0x00, 0xA7, 0x8A, 0x0F, 0x81, 0x2F, 0x91, 0x00, 0x84, 0xA3, 0x71, 0x83, 0x17, 0x10, 0xF4, 0xBF, 0x01, 0xC1, 0x2F, 0x07, 0x04, 0xD1, 0x2F, 0x00, 0x80, 0xA7, 0x01, 0xF1, 0x2F, 0x7D, 0x08, 0x02, 0x41, 0x2F, 0x00, 0x5D, 0x8B, 0xE1, 0xB7, 0xEB, 0xCB, 0x00, 0xD2, 0x5F, 0x09, 0x04, 0xD2, 0x5F, 0xDE, 0x00, 0xB0, 0xA7, 0x01, 0xC3, 0x07, 0x0A, 0x01, 0xE2, 0x5F, 0x92, 0xE7, 0x00, 0x1F, 0xFB, 0x5F, 0xC7, 0xF8, 0xD6, 0x25, 0x6F, 0x3C, 0xFB, 0xA0, 0x00, 0x68, 0x1F, 0x10, 0x43, 0xE3, 0x00, 0x5C, 0xF7, 0x50, 0x8F, 0x43, 0x83, 0x00, 0x00, 0x44, 0x6C, 0xF7, 0x30, 0x0F, 0x3E, 0x1F, 0x30, 0x0F, 0xCF, 0x2C, 0xF7, 0x6D, 0x77, 0x03, 0x08, 0x6D, 0x77, 0x00, 0xC3, 0x67, 0x00, 0x70, 0x7F, 0x4D, 0x77, 0x5F, 0x41, 0xFE, 0xA3, 0x01, 0x01, 0x4D, 0x77, 0x00, 0x3D, 0xFF, 0x00, 0x1A, 0xEB, 0x01, 0x94, 0xEB, 0x00, 0x10, 0x87, 0xEE, 0x5F, 0xE9, 0x00, 0xED, 0xFF, 0x7E, 0x7F, 0x01, 0x50, 0x7F, 0xFA, 0xEB, 0x02, 0xB0, 0x7F, 0x03, 0xF7, 0x8E, 0x7F, 0x9E, 0x6F, 0xFE, 0x8F, 0x00, 0x02, 0x0F, 0x03, 0x3F, 0x07, 0x00, 0x1A, 0xF3, 0x01, 0x91, 0x8F, 0xEB, 0x00, 0x12, 0x0F, 0x2A, 0x3A, 0x04, 0x8F, 0x07, 0xDC, 0x00, 0x2F, 0x07, 0x0C, 0x4F, 0x07, 0xD6, 0xB7, 0xFF, 0xFD, 0x97, 0xFD, 0x57, 0xFC, 0xE7, 0xFC, 0x77, 0xFC, 0x07, 0xFB, 0x97, 0xFA, 0xE3, 0xFA, 0x57, 0xF7, 0xF9, 0xA3, 0xF9, 0x17, 0xF8, 0x63, 0x3F, 0xE3, 0xCC, 0x00, 0x2F, 0xA7, 0x3E, 0x8F, 0x0A, 0x30, 0xCB, 0x5C, 0x2C, 0x41, 0xA7, 0x43, 0xCF, 0x1B, 0x37, 0x0D, 0xF8, 0x5F, 0x67, 0x72, 0xC1, 0x56, 0xFF, 0x01, 0x48, 0xC3, 0x40, 0x00, 0x78, 0x80, 0x80, 0x34, 0x6F, 0x18, 0x00, 0x00, 0x0A, 0x2B, 0x81, 0x20, 0x0B, 0xEF, 0x80, 0x80, 0x00, 0xEF, 0xEF, 0xFF, 0xF8, 0x0B, 0xBF, 0x70, 0x01, 0x20, 0xFF, 0xF6, 0x8F, 0x85, 0x20, 0x00, 0x88, 0x40, 0x30, 0x83, 0x50, 0x27, 0x1C, 0xCF, 0x00, 0x01, 0x30, 0x20, 0x0B, 0x30, 0x03, 0xC0, 0x38, 0x36, 0x4F, 0x79, 0x87, 0x00, 0x05, 0xFD, 0xFC, 0x0B, 0x61, 0x0A, 0x3F, 0x85, 0x3F, 0x89, 0xFC, 0xFC, 0x0A, 0x0A, 0x30, 0x03, 0x82, 0x2F, 0xFA, 0x83, 0x00, 0x00, 0xF7, 0xF7, 0x3F, 0x10, 0xBF, 0x70, 0xFF, 0x31, 0x7A, 0x20, 0x0B, 0x20, 0x0F, 0xFF, 0x9F, 0xCF, 0xFF, 0x08, 0x1F, 0x2F, 0xF6, 0x60, 0xAF, 0xE5, 0x81, 0x00, 0x00, 0x12, 0xF3, 0xF3, 0x01, 0x22, 0xB0, 0xCF, 0xFF, 0x30, 0x05, 0xF3, 0x41, 0xF3, 0x40, 0x03, 0x28, 0x00, 0x00, 0x5F, 0x5F, 0x40, 0x5F, 0x07, 0x88, 0xFE, 0xCA, 0xFF, 0xCC, 0x30, 0x0B, 0x40, 0x0F, 0x7F, 0xEC, 0x06, 0x88, 0x00, 0x88, 0xFF, 0xCC, 0x2F, 0xCC, 0x30, 0x07, 0xCF, 0x4B, 0xFF, 0x21, 0xEE, 0xFC, 0xFC, 0x30, 0x7D, 0x0C, 0x22, 0xC0, 0x30, 0x03, 0x80, 0x20, 0x1F, 0x06, 0xFF, 0xCC, 0x0D, 0x0A, 0x00, 0x30, 0x0F, 0x00, 0x88, 0x60, 0x60, 0x50, 0xE7, 0x3F, 0xFF, 0x30, 0x0B, 0x40, 0x0F, 0xB2, 0x30, 0x3F, 0xCD, 0x20, 0x37, 0x50, 0x47, 0xCC, 0x02, 0x2D, 0xA7, 0x34, 0x2D, 0xFF, 0x33, 0x41, 0x0F, 0x33, 0x30, 0x07, 0x40, 0x3F, 0x0E, 0x30, 0xC7, 0x5F, 0x84, 0x25, 0xCB, 0xF8, 0x4F, 0xD3, 0x2F, 0x9F, 0x50, 0x0B, 0x20, 0x0F, 0x2F, 0xE8, 0x18, 0xAF, 0xFF, 0x00, 0x30, 0xE7, 0x5F, 0xD7, 0x8E, 0xBF, 0xFF, 0x0A, 0x0E, 0x1E, 0xF7, 0x70, 0x32, 0x64, 0xBF, 0x40, 0xC7, 0x00, 0x09, 0x82, 0x00, 0x00, 0xF4, 0x40, 0xC7, 0x4F, 0x4F, 0x3F, 0xFF, 0xE0, 0x50, 0xD7, 0x30, 0x0B, 0x40, 0x0F, 0x80, 0x00, 0x88, 0xF1, 0xE1, 0x21, 0xFF, 0xEF, 0x70, 0x7F, 0xE1, 0xE1, 0x7F, 0x7F, 0x30, 0x03, 0x80, 0xE0, 0xDF, 0xDC, 0x00, 0x15, 0x00, 0x00, 0xEF, 0xFF, 0x62, 0x05, 0x40, 0x41, 0x3F, 0xDA, 0xD3, 0x40, 0xDF, 0x2E, 0xBE, 0xFD, 0x67, 0xFA, 0x00, 0x0E, 0x0F, 0x2F, 0xB5, 0x07, 0x09, 0x01, 0xAA, 0xBD, 0x21, 0xEB, 0x31, 0xEF, 0x18, 0x01, 0x01, 0x60, 0x25, 0x3F, 0x40, 0x0F, 0xFF, 0x70, 0x00, 0x30, 0xDE, 0x01, 0x30, 0x0B, 0x39, 0x69, 0xFF, 0xF6, 0x1C, 0xCF, 0x00, 0x50, 0x00, 0xFF, 0xF5, 0x30, 0x31, 0xFF, 0xFF, 0x50, 0x5C, 0x46, 0x97, 0x50, 0x5F, 0xBF, 0xF5, 0xFF, 0xFF, 0x40, 0x1C, 0x00, 0xEE, 0x10, 0xF1, 0xEF, 0x41, 0xFF, 0x2F, 0xFF, 0xFC, 0xFD, 0x0C, 0x0A, 0x0B, 0xEB, 0x10, 0x30, 0x88, 0x51, 0xEF, 0x2F, 0x2F, 0x32, 0x00, 0x00, 0x30, 0x03, 0x51, 0xFF, 0xE6, 0x10, 0x30, 0x0F, 0x2E, 0x90, 0x2F, 0xE0, 0xF5, 0x50, 0x30, 0xC7, 0xF5, 0x40, 0x02, 0x1D, 0x1A, 0xF3, 0xF2, 0xDF, 0x20, 0x54, 0x7F, 0xF3, 0xF4, 0x2F, 0x99, 0x00, 0x3B, 0x00, 0xD4, 0x41, 0xFB, 0xB1, 0xEF, 0x32, 0x0B, 0x4E, 0xB6, 0x9A, 0xF1, 0xEF, 0x87, 0x20, 0x79, 0x00, 0x00, 0xEB, 0x10, 0x31, 0xFF, 0x33, 0xE7, 0x00, 0x01, 0xEF, 0x80, 0xB1, 0xFF, 0x00, 0xEE, 0x11, 0xFF, 0x35, 0xFF, 0x33, 0xD0, 0x30, 0xF7, 0x21, 0xF2, 0x33, 0x3F, 0xDF, 0x57, 0xFF, 0x55, 0xFF, 0x05, 0xEE, 0x11, 0xEE, 0x11, 0x55, 0x60, 0x07, 0x06, 0x87, 0x06, 0x81, 0x51, 0xEF, 0x55, 0xFF, 0x04, 0x0D, 0xEE, 0x11, 0x34, 0x41, 0x81, 0x32, 0x0B, 0xE7, 0x10, 0x1E, 0x1E, 0x00, 0x00, 0x30, 0x03, 0x10, 0xF6, 0x60, 0xCF, 0x2E, 0xEE, 0xF6, 0x50, 0x1E, 0x1F, 0x10, 0x00, 0x00, 0x1D, 0xAF, 0xA4, 0x01, 0x1C, 0xF3, 0xF3, 0x65, 0xCF, 0x21, 0x2C, 0x71, 0xEF, 0xF5, 0x50, 0x37, 0xDB, 0xE4, 0x42, 0x0B, 0xD0, 0x30, 0xC7, 0x61, 0xEF, 0x6F, 0x7F, 0xD7, 0xE1, 0xF1, 0xAF, 0xFF, 0x70, 0xD1, 0x20, 0x97, 0x70, 0x7F, 0x9F, 0xEF, 0xF9, 0xFB, 0x10, 0x90, 0x50, 0xFE, 0x20, 0x9D, 0x65, 0x30, 0x9F, 0x01, 0xFB, 0xFF, 0x9F, 0x36, 0x0B, 0x7C, 0x33, 0xB3, 0x2C, 0x6C, 0x06, 0x5B, 0xBA, 0x00, 0x4C, 0xB2, 0x43, 0x02, 0x4C, 0x49, 0x4D, 0xFF, 0xFE, 0x14, 0x2F, 0xFA, 0x02, 0x30, 0x02, 0x28, 0x29, 0xD7, 0x3B, 0x3D, 0x69, 0x6D, 0x61, 0x67, 0x46, 0x10, 0x4C, 0x7C, 0x10, 0x00, 0x0D, 0x62, 0x33, 0x06, 0xD0, 0x01, 0x20, 0x15, 0xA0, 0x00, 0x71, 0x23, 0xDF, 0xFF, 0x33, 0xBF, 0xC0, 0x2E, 0xAB, 0x01, 0xC0, 0xC0, 0xAF, 0x9F, 0x00, 0x00, 0x9F, 0x20, 0x03, 0xE0, 0x73, 0x97, 0x80, 0x07, 0xFF, 0xA0, 0x78, 0x00, 0x02, 0xFF, 0xFC, 0x61, 0x3E, 0x4F, 0x7B, 0x3F, 0xCE, 0x90, 0x90, 0xDF, 0xDF, 0x30, 0x03, 0xF2, 0x01, 0x9D, 0xBF, 0x50, 0x6F, 0x30, 0x6B, 0x40, 0x6F, 0x00, 0xB0, 0x44, 0x93, 0xDF, 0x8F, 0x22, 0x07, 0xD7, 0x00, 0xEE, 0x00, 0x0E, 0xAE, 0x42, 0x17, 0x20, 0x17, 0x70, 0x07, 0xA0, 0x40, 0x6F, 0x80, 0x90, 0x6F, 0xC5, 0xFF, 0xCF, 0x7F, 0xDE, 0x7B, 0x00, 0x95, 0x7D, 0xC1, 0x7F, 0x63, 0x53, 0x71, 0x7F, 0x20, 0x71, 0x7F, 0xC2, 0xCF, 0xAC, 0x06, 0xB1, 0x8B, 0x50, 0xA8, 0x22, 0x70, 0x28, 0x2E, 0x2D, 0xE6, 0x10, 0x00, 0x22, 0x43, 0xFD, 0x3A, 0x8F, 0x76, 0x00, 0x98, 0x6F, 0xA8, 0xCE, 0x42, 0x47, 0x2D, 0x83, 0xFF, 0x7A, 0xFF, 0x45, 0x4F, 0xDE, 0xAA, 0x28, 0x00, 0xBB, 0x4A, 0xAF, 0xBB, 0x50, 0x07, 0xFF, 0x23, 0xEF, 0x84, 0x42, 0xB3, 0xFF, 0x21, 0xFF, 0x53, 0x4F, 0xFE, 0x9A, 0x00, 0x50, 0x68, 0x4A, 0xCF, 0x24, 0x3F, 0xE8, 0xAD, 0xFF, 0xFF, 0xC8, 0xA8, 0x3A, 0xDB, 0xB3, 0x5F, 0xF4, 0xFA, 0x56, 0x77, 0x27, 0xFF, 0x00, 0x7E, 0x4B, 0x85, 0x3F, 0x7B, 0x87, 0x26, 0x8B, 0x2D, 0xED, 0xB3, 0xC2, 0x07, 0xC0, 0x0A, 0x21, 0x1C, 0xF6, 0x22, 0xFF, 0x26, 0xC5, 0x86, 0x4F, 0x7F, 0xDD, 0x22, 0xFF, 0x46, 0x32, 0x4F, 0x5A, 0x43, 0xFF, 0x97, 0x6B, 0xC7, 0x37, 0x3B, 0x10, 0x03, 0xE7, 0xF2, 0xF4, 0xFF, 0xFF, 0xFC, 0x2F, 0x74, 0x30, 0x03, 0xA0, 0x9F, 0x7B, 0xDF, 0xAF, 0x86, 0x0C, 0x09, 0xFF, 0x4F, 0x02, 0x00, 0x00, 0xFF, 0xAD, 0xBF, 0x04, 0x28, 0xFF, 0x00, 0x22, 0x6C, 0x03, 0x07, 0xE0, 0xF8, 0xD6, 0x00, 0xDD, 0x00, 0x48, 0x51, 0xDD, 0xD0, 0x26, 0x03, 0x61, 0xEF, 0x54, 0x00, 0x3C, 0xFD, 0xFF, 0xB8, 0xFF, 0xFE, 0x12, 0x00, 0x00, 0x51, 0x41, 0xEF, 0xFD, 0xA0, 0x97, 0x7F, 0x10, 0x06, 0x00, 0xFE, 0xFC, 0x10, 0xA0, 0x23, 0xF1, 0x6F, 0xE0, 0x2C, 0x01, 0xEF, 0x00, 0x03, 0xFF, 0xFF, 0x1E, 0x8F, 0xA1, 0x1B, 0x50, 0xEF, 0x21, 0x1F, 0xAF, 0x05, 0x94, 0x99, 0xA1, 0xF2, 0x00, 0x00, 0x70, 0xF2, 0x20, 0x03, 0x85, 0x89, 0x40, 0xD7, 0x37, 0xFF, 0x01, 0xBE, 0x88, 0x4D, 0x8F, 0x58, 0x00, 0x23, 0x4F, 0xFF, 0x64, 0xFF, 0xA7, 0x8B, 0x47, 0xE7, 0xDC, 0xFF, 0xED, 0x79, 0x80, 0xDE, 0x28, 0x80, 0x30, 0xD2, 0x22, 0xCC, 0xFF, 0x50, 0xCF, 0x21, 0x00, 0x32, 0x42, 0xDF, 0x33, 0x47, 0x00, 0x26, 0x52, 0x73, 0x30, 0xFB, 0x3F, 0x93, 0x40, 0x04, 0x63, 0x3F, 0x4C, 0x12, 0x38, 0x27, 0x7A, 0xEF, 0x35, 0x94, 0x72, 0xEF, 0x8E, 0xFF, 0x0B, 0xFF, 0x2F, 0x05, 0x4D, 0x2F, 0xAA, 0x6B, 0x03, 0xE4, 0x0C, 0x00, 0xB5, 0xFF, 0x74, 0x40, 0x29, 0xD4, 0x07, 0x55, 0xFF, 0x08, 0xC0, 0x7F, 0x91, 0x4A, 0x8B, 0x99, 0x00, 0x7E, 0x99, 0x5F, 0x97, 0x5A, 0x97, 0x8F, 0xA7, 0x70, 0x17, 0x60, 0x1F, 0x8F, 0xC7, 0x56, 0x1B, 0xFF, 0x55, 0x01, 0x37, 0x97, 0x90, 0x1F, 0x78, 0x4F, 0xE3, 0x27, 0xC0, 0x9B, 0x4A, 0x27, 0x97, 0xFF, 0x2A, 0xA7, 0x27, 0x85, 0x35, 0x26, 0xBF, 0x24, 0x07, 0x88, 0x3F, 0xE7, 0x8B, 0xFF, 0x03, 0x44, 0x10, 0xC6, 0x00, 0xFF, 0x68, 0xD4, 0x80, 0x5F, 0x3F, 0xFF, 0x17, 0x9F, 0xD5, 0xEF, 0xFF, 0x07, 0x66, 0xCF, 0x45, 0x6F, 0x2B, 0x77, 0x3E, 0xEF, 0x3B, 0x7D, 0xAF, 0xF1, 0x30, 0x22, 0x20, 0xFB, 0x5F, 0xEF, 0xF3, 0xF9, 0xF8, 0x90, 0x3F, 0x31, 0x4C, 0xB7, 0x22, 0x97, 0x00, 0x75, 0x85, 0xBF, 0x2F, 0xEA, 0xAF, 0x0D, 0x08, 0xFF, 0x9E, 0xFF, 0x45, 0x4F, 0xE1, 0xA9, 0x00, 0x9A, 0xA2, 0x45, 0xBF, 0x89, 0x55, 0xA7, 0xFF, 0x22, 0xFF, 0x3E, 0x7F, 0x00, 0x0A, 0xFF, 0x75, 0xFF, 0xDA, 0x4F, 0xFF, 0x23, 0x35, 0xB7, 0x5E, 0x83, 0x8A, 0x8F, 0xFF, 0xFF, 0x7F, 0x8F, 0x52, 0x23, 0x0C, 0x0D, 0x92, 0x31, 0xEF, 0xE1, 0xEF, 0xE1, 0xFF, 0x7F, 0xA7, 0x02, 0x2D, 0x07, 0x30, 0x03, 0xF0, 0x0F, 0x01, 0x1D, 0x86, 0x83, 0x45, 0x3E, 0x00, 0xFB, 0xB0, 0xFF, 0xFF, 0x25, 0x13, 0x4C, 0x5F, 0x9D, 0x5F, 0xE8, 0xF2, 0xD0, 0x28, 0x8B, 0x25, 0x31, 0x77, 0x11, 0x0D, 0xA5, 0x1B, 0xC1, 0x96, 0x44, 0x2D, 0x69, 0xFB, 0x01, 0x07, 0xF8, 0xF2, 0x86, 0x45, 0x04, 0x0E, 0x50, 0x00, 0x2F, 0x3F, 0x2C, 0x87, 0xE5, 0xFF, 0x09, 0xFF, 0x20, 0x00, 0xFA, 0x2D, 0xB1, 0x0D, 0x6F, 0x76, 0x87, 0x0E, 0x18, 0xEF, 0x00, 0x38, 0x77, 0x77, 0xC2, 0x5F, 0xAE, 0x2B, 0x6B, 0x1E, 0xFF, 0x01, 0xAF, 0x47, 0xCF, 0x4C, 0x6F, 0x26, 0x89, 0x00, 0x3E, 0x47, 0x3A, 0xE5, 0x0D, 0xB4, 0x2F, 0x04, 0xF1, 0xFF, 0x7F, 0xF1, 0xA0, 0xB0, 0x2C, 0x0D, 0xF4, 0x79, 0x7C, 0x0E, 0x00, 0x60, 0xFB, 0xFF, 0x28, 0x32, 0x00, 0xB0, 0x01, 0x24, 0x07, 0x4F, 0x3C, 0x08, 0x2F, 0x2C, 0x6F, 0x2E, 0xDD, 0xBD, 0xFE, 0xDB, 0x59, 0x00, 0xD8, 0xAD, 0x5E, 0x97, 0xA5, 0x37, 0x87, 0x61, 0x00, 0x17, 0x9F, 0x38, 0x93, 0x40, 0x96, 0x9E, 0xA5, 0x7D, 0xDF, 0xFE, 0x28, 0xAF, 0xD0, 0xE1, 0x39, 0xF1, 0x1A, 0x27, 0x87, 0xD8, 0x2F, 0xF7, 0x2F, 0xE3, 0x3F, 0x2B, 0x55, 0x98, 0xBE, 0x04, 0x07, 0xFF, 0x34, 0xFF, 0x08, 0x4F, 0x09, 0x0E, 0x13, 0xFF, 0x20, 0x4A, 0xBF, 0x22, 0x00, 0x47, 0x22, 0xC3, 0xEF, 0xDE, 0xFF, 0xDD, 0x55, 0x42, 0x60, 0x17, 0x30, 0x1F, 0x80, 0x49, 0x23, 0xFF, 0xED, 0xFF, 0x00, 0x31, 0x00, 0x95, 0xC9, 0x7A, 0xDB, 0x60, 0x37, 0xEE, 0x12, 0x2F, 0x61, 0x50, 0xFD, 0xDA, 0x11, 0x09, 0xFF, 0xBD, 0xFF, 0x69, 0x45, 0xE7, 0x14, 0x6B, 0x9B, 0x0F, 0x0D, 0x8E, 0x5E, 0x01, 0x9F, 0x6C, 0x52, 0x00, 0x1C, 0x2A, 0x35, 0x2E, 0xEF, 0x89, 0x2F, 0x03, 0xAD, 0x00, 0x47, 0x5A, 0x6F, 0xFD, 0x74, 0x4F, 0x9F, 0x1E, 0xB9, 0xFF, 0xDC, 0x4F, 0xFF, 0x28, 0x6C, 0x2B, 0xB2, 0x4F, 0x57, 0xBB, 0x6A, 0xFF, 0x2B, 0xAA, 0x2D, 0x64, 0x10, 0x60, 0xB7, 0x32, 0x35, 0xDC, 0x10, 0x15, 0x00, 0xB4, 0xEC, 0x2F, 0xD7, 0xF9, 0x7B, 0x78, 0xEF, 0x68, 0x9F, 0x10, 0x8B, 0xFF, 0x25, 0xAB, 0x8F, 0x6D, 0xFF, 0x8F, 0x02, 0x5F, 0x00, 0x3F, 0xCD, 0x6C, 0x01, 0xEC, 0xAC, 0xCE, 0x7F, 0x2E, 0xAB, 0xDE, 0x7F, 0x68, 0x7F, 0xC0, 0x9D, 0x2E, 0x04, 0x0E, 0x88, 0xFF, 0xEF, 0xEF, 0x8A, 0xAF, 0x8E, 0x00, 0x47, 0x24, 0xDD, 0x78, 0xDD, 0x77, 0x33, 0x11, 0x01, 0x33, 0x11, 0x8D, 0x7D, 0x13, 0x13, 0x7D, 0x20, 0x03, 0xBF, 0x8A, 0xBF, 0x77, 0x50, 0x17, 0x70, 0x07, 0xFF, 0x49, 0x30, 0x2B, 0xB0, 0x2F, 0xF0, 0x0F, 0xB7, 0x01, 0xB9, 0x7F, 0xA8, 0x6D, 0xEA, 0x7F, 0x7F, 0x10, 0x6F, 0x7F, 0x27, 0xB0, 0x04, 0xA1, 0x00, 0xA0, 0x0D, 0xB0, 0x01, 0x02, 0x60, 0xED, 0x61, 0xFF, 0x2C, 0xFF, 0xBE, 0x35, 0xFF, 0xF0, 0x3E, 0xB7, 0x00, 0xC0, 0xFF, 0x19, 0x00, 0x21, 0x1D, 0x01, 0x28, 0xFA, 0x18, 0xCC, 0xFF, 0x3A, 0x3B, 0x92, 0x40, 0x3F, 0x17, 0xFF, 0x6B, 0x8D, 0x27, 0x4C, 0x84, 0xFF, 0xE9, 0xBD, 0xB9, 0x3C, 0xB8, 0xFD, 0x23, 0x34, 0xE2, 0x30, 0x62, 0x4C, 0xDA, 0x40, 0x13, 0xF7, 0xFF, 0xF1, 0x20, 0x03, 0xEF, 0x08, 0xFF, 0xE8, 0xFF, 0xE0, 0x20, 0x03, 0xE1, 0xFF, 0xD9, 0x38, 0xFF, 0xD3, 0x50, 0x95, 0x2E, 0xE1, 0x21, 0x87, 0x57, 0xFF, 0x86, 0x34, 0xFF, 0xD1, 0x93, 0x69, 0x30, 0x41, 0xFA, 0x31, 0x9F, 0xAC, 0xFF, 0x44, 0xC7, 0x41, 0xA5, 0xD9, 0xFF, 0xE4, 0x50, 0x5B, 0xF6, 0xFF, 0x41, 0xF2, 0x20, 0x5D, 0xFB, 0xFF, 0xEE, 0xFF, 0xEA, 0x2F, 0x23, 0x54, 0xF5, 0x20, 0x05, 0xE4, 0x23, 0x97, 0xEA, 0x2E, 0x2E, 0xDA, 0xFF, 0x10, 0xDB, 0xFF, 0xD5, 0x2C, 0x6E, 0xC6, 0xFF, 0xD0, 0xFF, 0x05, 0xCB, 0xFF, 0xC1, 0xFF, 0xBC, 0x27, 0xE7, 0xE1, 0x20, 0x11, 0x41, 0xD2, 0x24, 0x7A, 0xDA, 0xFF, 0xCD, 0xFF, 0xCA, 0x20, 0x19, 0x04, 0xC1, 0xFF, 0xB7, 0xFF, 0xB3, 0x20, 0xFE, 0xBA, 0xFF, 0x14, 0xAF, 0xFF, 0xAB, 0x05, 0xD1, 0xFF, 0x5F, 0x62, 0x6D, 0x03, 0xFF, 0x51, 0x29, 0x20, 0xC2, 0xC2, 0xE1, 0x7F, 0x05, 0xFF, 0x9F, 0x22, 0x8D, 0x5B, 0x07, 0x21, 0x61, 0xA7, 0x20, 0x9A, 0x5F, 0xE9, 0x8A, 0xD9, 0x48, 0x38, 0x99, 0x50, 0xFE, 0x41, 0x01, 0xF7, 0x25, 0x34, 0xEA, 0xFF, 0xE0, 0x8D, 0xA2, 0xD1, 0x73, 0xF6, 0x80, 0x27, 0xF7, 0xFF, 0xEB, 0x25, 0x56, 0xE0, 0xA8, 0x21, 0x1D, 0xE9, 0x21, 0x25, 0xDE, 0x2F, 0x4A, 0xD4, 0xFF, 0xD3, 0x28, 0xFF, 0xC9, 0x2F, 0x52, 0xD3, 0x2B, 0x3D, 0xC9, 0xFF, 0xC8, 0xA8, 0x25, 0x49, 0xBD, 0x21, 0x07, 0xFC, 0x27, 0x46, 0xF0, 0xFF, 0xE6, 0xA2, 0x20, 0x2D, 0xE2, 0x25, 0x9E, 0xD5, 0xFF, 0xE3, 0x21, 0x95, 0xD6, 0xAA, 0x2D, 0xB0, 0xD0, 0x20, 0x21, 0xC3, 0x25, 0x10, 0xDA, 0x21, 0x3B, 0xCD, 0x28, 0xFF, 0xC5, 0x21, 0x4D, 0xC4, 0x25, 0x7B, 0xB6, 0xFF, 0xBF, 0x80, 0x21, 0x3D, 0xB2, 0xFF, 0xAB, 0xFF, 0xB0, 0xFF, 0xA9, 0x0A, 0xFF, 0xA3, 0xFF, 0x9C, 0x21, 0x51, 0xC0, 0x22, 0x4A, 0xB5, 0xA8, 0x21, 0x53, 0xAE, 0x21, 0xA8, 0xA2, 0x21, 0x59, 0xAA, 0xFF, 0xA8, 0xA0, 0x20, 0xC8, 0xA0, 0x2F, 0xE0, 0x95, 0xFF, 0x8C, 0xFF, 0xA6, 0x80, 0x2B, 0x49, 0x9A, 0xFF, 0x92, 0xFF, 0x96, 0xFF, 0x8F, 0xA8, 0x25, 0x33, 0x84, 0x20, 0x05, 0x87, 0x22, 0x2C, 0x7C, 0xFF, 0x7F, 0x2A, 0xFF, 0x79, 0x2B, 0x43, 0x6E, 0x22, 0x86, 0xB8, 0x20, 0x4B, 0xAA, 0x8C, 0x20, 0x53, 0xAD, 0xFF, 0xA4, 0x21, 0x00, 0x30, 0x53, 0x96, 0xFF, 0x54, 0x90, 0x2B, 0xFF, 0x92, 0x20, 0xFC, 0x85, 0x20, 0x4B, 0xA4, 0xFF, 0x41, 0x9B, 0x20, 0x3D, 0xA0, 0xFF, 0x9D, 0xFF, 0x93, 0x20, 0x17, 0x04, 0x8D, 0xFF, 0x89, 0xFF, 0x80, 0x20, 0x3F, 0x86, 0xFF, 0x50, 0x83, 0x20, 0x41, 0x76, 0x20, 0x0D, 0x83, 0xFF, 0x7D, 0xFF, 0x14, 0x77, 0xFF, 0x7E, 0x20, 0x4F, 0x72, 0x25, 0x87, 0x72, 0xFF, 0x04, 0x6C, 0xFF, 0x67, 0xFF, 0x62, 0x40, 0x03, 0x5C, 0xFF, 0x00, 0x58, 0xFF, 0x74, 0xFF, 0x70, 0xFF, 0x69, 0xFF, 0x50, 0x65, 0x25, 0xA1, 0x6A, 0x20, 0x15, 0x5F, 0xFF, 0x5E, 0xFF, 0x04, 0x5A, 0xFF, 0x53, 0xFF, 0x50, 0x22, 0x6C, 0x54, 0xFF, 0x14, 0x4D, 0xFF, 0x4A, 0x00, 0xD3, 0xFF, 0x16, 0x24, 0x1D, 0x6B, 0xFF, 0x6A, 0x15, 0x22, 0x66, 0x72, 0xD7, 0x85, 0x2F, 0xA8, 0xED, 0x5F, 0x95, 0xF9, 0xAA, 0x2E, 0xCE, 0xF0, 0x94, 0x3F, 0x75, 0x21, 0xBF, 0xD5, 0x84, 0x4D, 0x3D, 0xD5, 0x2F, 0xD0, 0xAF, 0xAC, 0xFD, 0x22, 0xFB, 0xE8, 0x26, 0x3B, 0xE0, 0x2F, 0xE7, 0x55, 0xF8, 0x2F, 0x06, 0xF1, 0x23, 0x03, 0xD9, 0x23, 0x01, 0xD3, 0x21, 0x7F, 0x55, 0xF0, 0x28, 0xC8, 0xE6, 0x21, 0x77, 0xD6, 0x23, 0x0F, 0xCC, 0x22, 0xD1, 0x55, 0xDD, 0x21, 0x89, 0xD5, 0x22, 0xBF, 0xC3, 0x22, 0xF6, 0xBB, 0x22, 0xB1, 0x55, 0xBF, 0x21, 0x61, 0xB5, 0x22, 0xB1, 0xA8, 0x21, 0x59, 0x9F, 0x22, 0xBB, 0x55, 0xAB, 0x21, 0x69, 0xA2, 0x21, 0x5F, 0x95, 0x2D, 0x23, 0x8C, 0x42, 0xD5, 0x5A, 0xD2, 0x21, 0x9F, 0xBF, 0x21, 0x95, 0x30, 0x1B, 0xCB, 0x27, 0x21, 0xC4, 0xAA, 0x21, 0xA7, 0xB0, 0x21, 0x9D, 0xA9, 0x21, 0x9F, 0xA6, 0x21, 0x7D, 0x9E, 0xAB, 0x21, 0x7F, 0x8F, 0x23, 0xA2, 0x87, 0x21, 0x77, 0x96, 0x26, 0xB9, 0x30, 0x0B, 0x51, 0x7F, 0x21, 0x19, 0x78, 0x21, 0x7F, 0x9E, 0xFF, 0x94, 0x20, 0x01, 0x45, 0x8A, 0x26, 0xCF, 0x82, 0xFF, 0x81, 0x20, 0x11, 0x8B, 0x20, 0x05, 0x62, 0x82, 0x20, 0x19, 0x30, 0x1B, 0x6E, 0xFF, 0x66, 0x21, 0xA5, 0x71, 0xA2, 0x21, 0x41, 0x68, 0x21, 0x3D, 0x63, 0xFF, 0x60, 0x21, 0x3B, 0x66, 0xA0, 0x21, 0x41, 0x5E, 0x2D, 0xBD, 0x57, 0xFF, 0x51, 0xFF, 0x4F, 0x2A, 0xFF, 0x48, 0x21, 0xC5, 0x70, 0x20, 0x21, 0x68, 0x80, 0x17, 0x6A, 0xAA, 0x20, 0x25, 0x63, 0x21, 0x63, 0x57, 0x20, 0x1D, 0x50, 0x20, 0x1F, 0x55, 0x20, 0xFF, 0x4E, 0x20, 0x01, 0x46, 0xFF, 0x47, 0xFF, 0x40, 0x0A, 0xFF, 0x3F, 0xFF, 0x39, 0x20, 0x07, 0x3F, 0x20, 0x09, 0x39, 0xA2, 0x20, 0x09, 0x32, 0x20, 0x01, 0x2C, 0xFF, 0x5D, 0x23, 0xF6, 0x53, 0xC0, 0x20, 0x23, 0x30, 0x03, 0x49, 0xFF, 0x44, 0xFF, 0x4B, 0xFF, 0x10, 0x45, 0xFF, 0x42, 0x21, 0x3E, 0x40, 0xFF, 0x3C, 0xFF, 0x05, 0x38, 0xFF, 0x34, 0xFF, 0x4A, 0x20, 0x39, 0x41, 0x21, 0x4E, 0x50, 0x43, 0x20, 0x05, 0x3B, 0x20, 0x11, 0x38, 0xFF, 0x35, 0xFF, 0x00, 0x31, 0xFF, 0x2E, 0xFF, 0x33, 0xFF, 0x30, 0xFF, 0x55, 0x2B, 0x23, 0x46, 0x3B, 0x20, 0x0F, 0x33, 0x20, 0x0F, 0x30, 0x24, 0xD2, 0x05, 0x2A, 0xFF, 0x26, 0xFF, 0x2D, 0x2B, 0x94, 0x27, 0x2D, 0xA5, 0x01, 0x23, 0xFF, 0x20, 0xFF, 0x1E, 0xFF, 0x1B, 0x23, 0x68, 0x50, 0x26, 0x40, 0x0B, 0x24, 0x2D, 0xB9, 0x1E, 0xFF, 0x1C, 0xFF, 0x05, 0x1D, 0xFF, 0x1A, 0xFF, 0x18, 0x21, 0xD2, 0x18, 0x24, 0xB8, 0x15, 0x13, 0xFF, 0x12, 0x33, 0x8B, 0x00, 0x20, 0x36, 0xD2, 0x6B, 0xF6, 0xB5, 0x34, 0x85, 0x00, 0x24, 0x87, 0x64, 0xB3, 0xFA, 0x2C, 0x0B, 0xEA, 0x24, 0x61, 0x55, 0xE4, 0x24, 0x57, 0xCC, 0x24, 0x59, 0xC6, 0x27, 0xFF, 0xDF, 0x24, 0x75, 0x52, 0xDA, 0x24, 0x5F, 0xC1, 0x24, 0x4D, 0xBC, 0x00, 0x22, 0xB6, 0x00, 0xC5, 0x23, 0x56, 0x43, 0x7B, 0xFE, 0xFF, 0xF2, 0x34, 0xA5, 0x00, 0x23, 0x4E, 0xAA, 0x24, 0xFD, 0xED, 0x2A, 0x35, 0xEA, 0x2C, 0x67, 0xD5, 0x24, 0xE9, 0xD2, 0xAA, 0x24, 0x91, 0xB7, 0x24, 0x8F, 0xB2, 0x29, 0x02, 0xCD, 0x24, 0xA5, 0xCA, 0xAA, 0x25, 0x7E, 0xAF, 0x24, 0x81, 0xAB, 0x25, 0x86, 0xB0, 0x23, 0x01, 0xAA, 0xAA, 0x23, 0x4B, 0x96, 0x23, 0x4D, 0x90, 0x23, 0x5B, 0xA4, 0x23, 0x09, 0x9F, 0xAA, 0x2E, 0xFF, 0x8A, 0x23, 0x35, 0x85, 0x22, 0xED, 0x7D, 0x22, 0xE9, 0x77, 0xAA, 0x22, 0xDB, 0x67, 0x22, 0xD9, 0x62, 0x22, 0xE7, 0x72, 0x23, 0x39, 0x6D, 0xAA, 0x22, 0xE3, 0x5C, 0x22, 0xE5, 0x57, 0x23, 0x6B, 0x9A, 0x23, 0x37, 0x96, 0xAA, 0x23, 0x17, 0x80, 0x23, 0x19, 0x7C, 0x23, 0x77, 0x93, 0x23, 0x29, 0x90, 0xAA, 0x25, 0x4A, 0x79, 0x23, 0x21, 0x76, 0x22, 0xFF, 0x6A, 0x23, 0x01, 0x65, 0xAA, 0x24, 0x7A, 0x53, 0x22, 0xF9, 0x50, 0x28, 0xA9, 0x62, 0x23, 0x09, 0x5F, 0xAA, 0x25, 0x6C, 0x4D, 0x23, 0x01, 0x4A, 0x21, 0x7F, 0x53, 0x25, 0x78, 0x4E, 0xA2, 0x21, 0x77, 0x42, 0x21, 0x79, 0x3D, 0xFF, 0x52, 0x21, 0x85, 0x4E, 0xAA, 0x21, 0x87, 0x40, 0x21, 0x7D, 0x3C, 0x21, 0x7F, 0x3A, 0x21, 0x69, 0x35, 0xAA, 0x21, 0x6F, 0x2D, 0x25, 0xA4, 0x28, 0x2E, 0xFD, 0x30, 0x21, 0x65, 0x2C, 0xAA, 0x41, 0x53, 0x1E, 0x21, 0x61, 0x1B, 0x21, 0x9F, 0x41, 0x21, 0xDD, 0x3D, 0xAA, 0x21, 0xAB, 0x31, 0x21, 0x99, 0x2D, 0x21, 0xA7, 0x3B, 0x21, 0xAF, 0x38, 0xAA, 0x21, 0x9F, 0x2B, 0x21, 0xA1, 0x29, 0x24, 0xE8, 0x23, 0x21, 0x95, 0x20, 0xAA, 0x21, 0x77, 0x18, 0x21, 0x79, 0x15, 0x21, 0x87, 0x1E, 0x2F, 0x43, 0x1C, 0xAA, 0x21, 0x83, 0x13, 0x23, 0x5E, 0x12, 0x2F, 0x4F, 0x1D, 0x40, 0x1B, 0x19, 0x8A, 0x23, 0x6C, 0x14, 0xFF, 0x11, 0x26, 0x72, 0x14, 0x23, 0x76, 0x11, 0xA8, 0x20, 0x09, 0x0E, 0x20, 0x01, 0x0B, 0x21, 0xA3, 0x10, 0xFF, 0x0F, 0x20, 0xFF, 0x0D, 0x40, 0x03, 0x0B, 0xFF, 0x0A, 0xFF, 0x0C, 0xAA, 0x20, 0x03, 0x09, 0x25, 0x24, 0x08, 0x25, 0x28, 0x06, 0x25, 0x32, 0x13, 0xAA, 0x20, 0x1D, 0x10, 0x20, 0x1F, 0x0C, 0x20, 0x15, 0x0A, 0x25, 0x3C, 0x0F, 0xAB, 0x20, 0x33, 0x0D, 0x20, 0x27, 0x08, 0x20, 0x1D, 0x07, 0x25, 0x52, 0x50, 0x25, 0x56, 0x04, 0x20, 0x01, 0x03, 0x25, 0x76, 0x02, 0x80, 0x07, 0x50, 0x01, 0x01, 0xAC, 0x00, 0xB9, 0x7F, 0x20, 0x2C, 0x1D, 0x03, 0x04, 0xE9, 0x7F, 0x10, 0x04, 0x80, 0x59, 0x30, 0xC2, 0x30, 0xFE, 0xE2, 0x2C, 0x3A, 0x3A, 0x46, 0x20, 0xF8, 0xE9, 0xFF, 0x0C, 0x00, 0x95, 0x00, 0xDC, 0x00, 0x3E, 0x2E, 0x03, 0x1F, 0xA9, 0x80, 0xF2, 0x18, 0x00, 0x10, 0xF9, 0x38, 0xEF, 0x4F, 0x02, 0x50, 0x90, 0xFF, 0x1F, 0xFF, 0xC0, 0xD0, 0x00, 0xDE, 0x98, 0xBF, 0x1B, 0xCB, 0xFF, 0x2F, 0x23, 0xF2, 0x7F, 0xE0, 0x4B, 0xFF, 0x01, 0xCF, 0x27, 0x10, 0x3A, 0x60, 0x2B, 0x20, 0x01, 0x1C, 0x20, 0x20, 0x22, 0x1E, 0x1D, 0x80, 0x0E, 0x20, 0x1D, 0x0D, 0x20, 0x0F, 0xCE, 0xA2, 0x25, 0xBE, 0xB0, 0x25, 0xCC, 0xA0, 0x00, 0x04, 0x27, 0x9B, 0x03, 0x00, 0x20, 0xCA, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0xCC, 0x00, 0xC0, 0xA3, 0x74, 0xA4, 0x0B, 0x05, 0x84, 0x14, 0x21, 0x0A, 0xBB, 0x3F, 0xFF, 0x01, 0x6C, 0x00, 0x90, 0x3F, 0xFF, 0x00, 0x12, 0xBB, 0x00, 0x06, 0x20, 0x00, 0xA5, 0xC9, 0x00, 0x20, 0x7B, 0xB6, 0xA0, 0x30, 0xAA, 0x1E, 0x18, 0x08, 0x00, 0xBA, 0x04, 0x09, 0x4F, 0xFF, 0xBA, 0x02, 0xDB, 0x80, 0x4F, 0xFF, 0x12, 0x20, 0xAB, 0x6C, 0x3C, 0x90, 0x70, 0x00, 0x4C, 0x3B, 0x80, 0x70, 0x38, 0x09, 0x2E, 0xB6, 0x0A, 0x29, 0x28, 0x03, 0xAC, 0x40, 0x3F, 0x4C, 0x90, 0x3F, 0x11, 0x00, 0x2B, 0xA6, 0xC9, 0xB8, 0x6C, 0xA6, 0xA0, 0x40, 0x02, 0xAA, 0x2E, 0x48, 0x00, 0xBA, 0x24, 0x30, 0x3F, 0x70, 0x0A, 0x10, 0xD5, 0x82, 0xDB, 0x38, 0x03, 0x09, 0x28, 0x1F, 0x3D, 0x00, 0x0C, 0x90, 0x60, 0x2E, 0xC7, 0xA0, 0xCA, 0x09, 0x90, 0x20, 0x59, 0x09, 0x07, 0x26, 0x5C, 0xC1, 0x00, 0x00, 0xD1, 0x20, 0xE1, 0x21, 0x40, 0x87, 0x00, 0x0B, 0x01, 0x6A, 0xE1, 0x00, 0xC1, 0x03, 0x00, 0xE1, 0xC1, 0x02, 0xAA, 0x7B, 0x02, 0xA7, 0xC4, 0xD0, 0x8B, 0x1C, 0x70, 0x58, 0x38, 0x50, 0x20, 0x00, 0x0A, 0x78, 0x41, 0xA0, 0xC5, 0x06, 0x01, 0xAE, 0x54, 0x5F, 0x10, 0x00, 0x38, 0x4F, 0x11, 0x99, 0x64, 0x10, 0x60, 0x0C, 0x11, 0x00, 0x5D, 0x11, 0x90, 0x15, 0x20, 0xB0, 0x2A, 0x80, 0x1F, 0x77, 0x1A, 0x22, 0xD0, 0x4A, 0xED, 0x80, 0x3F, 0xA8, 0x10, 0x02, 0x40, 0x3F, 0x20, 0x00, 0x37, 0x7C, 0xC0, 0x5F, 0x31, 0x6A, 0x1C, 0x27, 0x51, 0xC5, 0x00, 0x30, 0x9F, 0x1E, 0x05, 0x00, 0x40, 0xEA, 0x70, 0xDF, 0x3A, 0x6E, 0xA0, 0x0C, 0xBA, 0x5C, 0x40, 0x41, 0xCD, 0x30, 0xE3, 0xFF, 0x20, 0xF9, 0x00, 0xB7, 0xFF, 0xFF, 0xAF, 0xCF, 0x03, 0xD1, 0xF8, 0x01, 0xFF, 0x7F, 0xFE, 0xFF, 0x0C, 0x05, 0x06, 0x33, 0x15, 0x00, 0x00, 0x90, 0x80, 0xED, 0xFF, 0xEE, 0xFF, 0x79, 0x0A, 0x00, 0x77, 0x00, 0xEE, 0x20, 0x07, 0x77, 0x20, 0x07, 0x00, 0x01, 0xAA, 0x00, 0x07, 0xFF, 0xFF, 0x3F, 0xCF, 0x2B, 0x90, 0x06, 0xA5, 0x00, 0x00, 0xF9, 0xF8, 0x70, 0x17, 0x80, 0x1F, 0x4A, 0x00, 0x00, 0xA0, 0x6F, 0x6F, 0xF0, 0x30, 0x00, 0x9B, 0x07, 0x00, 0x00, 0xEF, 0x23, 0x00, 0x80, 0x37, 0x80, 0x3F, 0xEA, 0x05, 0x8B, 0x00, 0x30, 0x1F, 0x80, 0xE8, 0xAB, 0x59, 0xF7, 0x59, 0x00, 0x60, 0x3F, 0x3B, 0xFC, 0xE0, 0x6B, 0xF2, 0x00, 0xE0, 0x5F, 0x00, 0x90, 0x7F, 0xA2, 0x00, 0x6A, 0xF4, 0xF3, 0x2A, 0x9F, 0x8F, 0x90, 0xBF, 0xDE, 0x20, 0xDF, 0x97, 0xDC, 0x48, 0x01, 0x00, 0x20, 0x10, 0x7B, 0xFF, 0x02, 0xAF, 0xFC, 0x30, 0x24, 0xFF, 0xFA, 0x39, 0xE3, 0x4E, 0xFF, 0x24, 0xE5, 0x65, 0x50, 0x00, 0x01, 0xA9, 0x88, 0x05, 0x04, 0xFF, 0xF6, 0x1E, 0x0B, 0x8F, 0xB0, 0x50, 0xEF, 0x00, 0x4A, 0x9F, 0x01, 0x00, 0x32, 0x53, 0x07, 0x0C, 0xA2, 0x5C, 0x70, 0x25, 0x83, 0x90, 0x64, 0xF0, 0x41, 0xFA, 0x41, 0x45, 0xFF, 0xEF, 0x32, 0x02, 0x00, 0x20, 0xC5, 0x2A, 0xD9, 0x80, 0x80, 0x30, 0x03, 0xFF, 0x02, 0xFE, 0x05, 0x0B, 0xF8, 0xE1, 0x6F, 0x2B, 0x97, 0x80, 0x04, 0x90, 0x00, 0x05, 0x60, 0x00, 0x2F, 0x66, 0xB6, 0xFF, 0x00, 0xFF, 0x25, 0x06, 0x06, 0x1F, 0xF8, 0xF8, 0x9F, 0x22, 0xF8, 0xF7, 0x2F, 0x73, 0x06, 0x07, 0xBB, 0x25, 0xEC, 0xD0, 0x40, 0x40, 0x3B, 0xBB, 0xB8, 0x00, 0x6F, 0x6F, 0x70, 0xF0, 0x00, 0x6F, 0x6F, 0xE0, 0xE0, 0x68, 0xDF, 0x50, 0xA0, 0x08, 0xDF, 0xDF, 0x90, 0x90, 0x20, 0x0B, 0xF0, 0x4B, 0x00, 0x20, 0xB0, 0x00, 0x20, 0x0B, 0xA0, 0x9B, 0x00, 0x70, 0x00, 0x00, 0x89, 0xFF, 0xB6, 0x8D, 0xFF, 0xFF, 0x04, 0x03, 0x00, 0xAD, 0xFD, 0x23, 0x2F, 0xF3, 0xF3, 0x9F, 0xAF, 0x90, 0x20, 0x0B, 0x04, 0xBB, 0x2D, 0xB5, 0xF3, 0xF3, 0xAF, 0xBF, 0x00, 0xB2, 0x00, 0x8B, 0x00, 0xE8, 0xB0, 0xFF, 0xEF, 0x00, 0xC0, 0xC0, 0xFF, 0xFF, 0x49, 0x10, 0x81, 0xFD, 0x30, 0x90, 0xC1, 0x2B, 0x9B, 0x20, 0x0B, 0x90, 0x00, 0xBB, 0x00, 0x00, 0xA0, 0x21, 0xFF, 0xFF, 0x01, 0x00, 0xB3, 0x00, 0x00, 0xCC, 0x07, 0x7C, 0xFA, 0x68, 0xAC, 0xFB, 0x89, 0x00, 0x00, 0x0A, 0x95, 0xFA, 0x5F, 0x48, 0xF8, 0xF9, 0x00, 0x03, 0x06, 0x72, 0xFA, 0xBD, 0x21, 0x9D, 0x01, 0x00, 0x17, 0x0D, 0xF9, 0xF9, 0x01, 0x00, 0xB7, 0x00, 0x00, 0x58, 0xDF, 0xDB, 0xD8, 0x4F, 0x3F, 0x30, 0x20, 0x00, 0x3A, 0xFF, 0x00, 0x03, 0xFF, 0xFF, 0x38, 0x6A, 0x04, 0x4F, 0x4F, 0x20, 0x30, 0x3B, 0x2E, 0x19, 0xFF, 0xFF, 0x10, 0x4A, 0x0B, 0xBB, 0x2E, 0x18, 0x70, 0xFA, 0xCC, 0x5E, 0x00, 0xFF, 0xFF, 0x09, 0x08, 0xFA, 0xFA, 0x8F, 0x8F, 0x00, 0xF3, 0xF3, 0x8F, 0x7F, 0xFF, 0xFC, 0x08, 0x3D, 0x00, 0x91, 0x00, 0xDD, 0x00, 0xF3, 0xF9, 0x8F, 0x9F, 0x00, 0xBA, 0x00, 0x6B, 0x00, 0x00, 0xB0, 0xC7, 0xAF, 0x00, 0xF4, 0xF7, 0x6F, 0x7F, 0xDC, 0x70, 0x19, 0xDF, 0x00, 0x30, 0x30, 0xFF, 0xFF, 0xF5, 0xC0, 0x6F, 0x9F, 0x00, 0x10, 0x00, 0xD8, 0x00, 0x30, 0x60, 0xFF, 0xEF, 0x04, 0xDB, 0x12, 0x2A, 0x00, 0x31, 0x2E, 0x70, 0x09, 0x0C, 0x80, 0x34, 0xF2, 0xFF, 0xFE, 0x00, 0x10, 0xFD, 0xFF, 0x09, 0x88, 0x5B, 0xEB, 0x40, 0x40, 0xB0, 0x20, 0x2B, 0xFF, 0x9F, 0x1E, 0x68, 0x08, 0x36, 0x67, 0xAE, 0x7F, 0x05, 0x09, 0xE4, 0x31, 0x40, 0x00, 0xFF, 0x40, 0xE4, 0x3F, 0x49, 0x9F, 0xFF, 0x02, 0xBF, 0xFA, 0x30, 0x3B, 0xFF, 0xC8, 0x00, 0x0F, 0x49, 0x23, 0xFC, 0x24, 0x02, 0xEE, 0x24, 0x02, 0x40, 0x07, 0xFD, 0xA5, 0xFA, 0x5F, 0x74, 0x60, 0x17, 0x70, 0x1F, 0x00, 0x05, 0xDA, 0x09, 0x90, 0x1F, 0x87, 0xD0, 0xBF, 0x80, 0x55, 0xFA, 0x20, 0xFB, 0xF9, 0xFF, 0xFF, 0x8C, 0xAF, 0x08, 0x03, 0xFF, 0x5E, 0x04, 0x10, 0x16, 0x4D, 0xE6, 0x43, 0x4C, 0x49, 0x08, 0x4D, 0xFF, 0xFE, 0x14, 0x2F, 0xFF, 0x02, 0x02, 0x28, 0xC2, 0x26, 0xF7, 0x38, 0x90, 0x69, 0x6D, 0x61, 0x67, 0x37, 0x02, 0x80, 0xA0, 0x27, 0xBE, 0x0D, 0x67, 0x0F, 0x4A, 0x4A, 0xE3, 0x64, 0xDB, 0x00, 0xE2, 0x95, 0x36, 0xB4, 0xC5, 0xE8, 0xC1, 0x17, 0x00, 0xED, 0xFB, 0xAB, 0x9B, 0x18, 0xC3, 0x05, 0x24, 0x00, 0xB5, 0x7C, 0x77, 0xB7, 0xD1, 0x53, 0x44, 0x24, 0x00, 0xD2, 0xBC, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -static const unsigned char Nintendo_DistributedBy_LZ[0x2000] = -{ - 0x11, 0x48, 0x65, 0x00, 0x00, 0x64, 0x61, 0x72, 0x63, 0xFF, 0xFE, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x28, 0x65, 0x00, 0x00, 0x83, 0x30, 0x09, 0x38, 0x04, 0x00, 0x00, 0x60, 0x20, 0x03, 0x30, 0x13, 0xAB, 0x30, 0x18, 0x15, 0x20, 0x1D, 0x02, 0xA0, 0x0B, 0x06, 0x20, 0x2B, 0x30, 0x18, 0x5A, 0x09, 0x20, 0x35, 0x10, 0x20, 0x39, 0x30, 0x2B, 0xF8, 0x20, 0x41, 0x54, 0x85, 0x30, 0x0B, 0x05, 0x00, 0x00, 0xEC, 0x20, 0x4D, 0x98, 0x30, 0x17, 0xD0, 0x20, 0x28, 0x30, 0x17, 0xDC, 0x30, 0x23, 0x07, 0x00, 0x00, 0xCC, 0x09, 0x0C, 0x00, 0x00, 0x20, 0x20, 0x51, 0x40, 0x14, 0x20, 0x2B, 0xA0, 0x20, 0x0B, 0x64, 0x20, 0x5D, 0xA0, 0x20, 0x00, 0x00, 0x4C, 0x99, 0x20, 0x5C, 0xA8, 0x01, 0x50, 0x53, 0x20, 0x22, 0x00, 0xB2, 0x30, 0x75, 0x0A, 0x23, 0x00, 0x00, 0xB4, 0x20, 0x74, 0xE2, 0x20, 0x81, 0xC0, 0x09, 0x25, 0x00, 0x00, 0x3C, 0x20, 0x68, 0x12, 0x02, 0x50, 0x77, 0xA0, 0x30, 0x8F, 0x1C, 0x20, 0x90, 0x00, 0x36, 0x00, 0x00, 0x28, 0xA6, 0x20, 0xAB, 0x3E, 0x20, 0x9C, 0x80, 0x3A, 0x20, 0x0B, 0x20, 0xAD, 0x60, 0xAA, 0x30, 0x17, 0x3C, 0x50, 0x17, 0x82, 0x30, 0x17, 0x40, 0x20, 0x23, 0x08, 0x16, 0x00, 0x00, 0xA4, 0x30, 0x2F, 0x49, 0x20, 0x67, 0x20, 0xE9, 0xC4, 0xAB, 0x30, 0x3B, 0x4A, 0x50, 0x17, 0xDC, 0x30, 0x3B, 0x52, 0x20, 0x47, 0x20, 0xE0, 0x59, 0xF4, 0x30, 0x53, 0x55, 0x20, 0x53, 0x30, 0xD4, 0x00, 0x2E, 0x21, 0x13, 0x01, 0x61, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x6D, 0x21, 0x1D, 0x41, 0x4E, 0x20, 0x07, 0x6E, 0x00, 0x74, 0x00, 0x65, 0x20, 0x11, 0x05, 0x64, 0x00, 0x6F, 0x00, 0x4C, 0x20, 0x03, 0x67, 0x20, 0x07, 0x14, 0x5F, 0x00, 0x44, 0x20, 0x03, 0x30, 0x20, 0x01, 0x5F, 0x00, 0x10, 0x53, 0x00, 0x63, 0x40, 0x1F, 0x65, 0x00, 0x4F, 0x00, 0x55, 0x75, 0x20, 0x2B, 0x41, 0x20, 0x43, 0x62, 0x20, 0x13, 0x6C, 0x40, 0x47, 0xAB, 0x02, 0x50, 0x43, 0x42, 0x03, 0x20, 0x43, 0x43, 0x01, 0x80, 0x87, 0x55, 0x03, 0x20, 0xCB, 0x00, 0x90, 0x43, 0xEB, 0x01, 0x90, 0xCB, 0x00, 0x90, 0x87, 0xF0, 0xCB, 0x62, 0x21, 0x5D, 0x79, 0x21, 0x97, 0x01, 0x31, 0xA1, 0xF5, 0x71, 0x8D, 0x00, 0xF0, 0x2F, 0x71, 0x05, 0xD0, 0x2F, 0x74, 0x42, 0x09, 0x67, 0x23, 0x29, 0x5E, 0x33, 0x22, 0x01, 0x73, 0xA2, 0x01, 0xB0, 0x5B, 0x52, 0x2D, 0x00, 0x10, 0x21, 0x31, 0xAA, 0x01, 0x00, 0x21, 0x32, 0x01, 0x00, 0x43, 0x33, 0xE0, 0x65, 0x4C, 0x23, 0x71, 0x4D, 0x8F, 0x22, 0xA3, 0x73, 0x00, 0x6B, 0x00, 0x40, 0x85, 0x30, 0x1F, 0x00, 0xB0, 0x17, 0xF0, 0x93, 0xD1, 0xF2, 0xE3, 0x32, 0xDB, 0x69, 0x20, 0xE9, 0x74, 0x00, 0x72, 0x23, 0x05, 0x55, 0x62, 0x42, 0xD3, 0x65, 0x22, 0xFD, 0x42, 0x21, 0x71, 0x5F, 0x20, 0xD1, 0x05, 0x32, 0x00, 0x38, 0x00, 0x78, 0x23, 0x84, 0x34, 0xE0, 0xFD, 0x81, 0xB0, 0x02, 0x43, 0x4C, 0x41, 0x4E, 0xFF, 0xFE, 0x23, 0xF0, 0x18, 0x00, 0x02, 0x02, 0x34, 0x23, 0x33, 0xB6, 0x70, 0x61, 0x74, 0x74, 0x31, 0x23, 0xA2, 0x44, 0x5E, 0x34, 0x79, 0x28, 0x33, 0x93, 0xFF, 0xFF, 0x40, 0xFF, 0x34, 0x6C, 0x53, 0x63, 0x65, 0x6E, 0x65, 0x4F, 0x10, 0x75, 0x74, 0x41, 0x24, 0x91, 0x47, 0x5F, 0x41, 0x5F, 0x21, 0x30, 0x30, 0xD0, 0x50, 0x70, 0x61, 0x69, 0x31, 0x33, 0xC3, 0x9A, 0x50, 0x3F, 0x02, 0x00, 0x30, 0x59, 0x34, 0xBD, 0x68, 0x24, 0xC1, 0x50, 0x00, 0x5F, 0x4E, 0x69, 0x6E, 0x4C, 0x6F, 0x67, 0x6F, 0xE1, 0xA0, 0x35, 0x34, 0xC0, 0x34, 0xDD, 0x43, 0x4C, 0x56, 0x43, 0x74, 0x5F, 0x1E, 0x00, 0x10, 0x02, 0x40, 0x87, 0x40, 0x0B, 0xD0, 0x5D, 0x20, 0x76, 0x7F, 0x40, 0x43, 0x35, 0x0C, 0x4E, 0x5F, 0x52, 0x6F, 0x6F, 0x74, 0xE7, 0xD0, 0x7E, 0x00, 0x70, 0x4B, 0x80, 0x57, 0x00, 0x20, 0x20, 0x3B, 0x50, 0x3F, 0x00, 0x30, 0xFF, 0xF1, 0x35, 0x17, 0xB0, 0xFF, 0x24, 0xF2, 0x80, 0xFF, 0x00, 0x00, 0x1E, 0x45, 0x6C, 0xAB, 0x70, 0xFF, 0x42, 0x40, 0xFF, 0x42, 0x00, 0x40, 0xFF, 0x9C, 0x80, 0x2D, 0x90, 0xFF, 0x65, 0x5C, 0x01, 0xE0, 0xFF, 0x90, 0xB3, 0x34, 0xC2, 0x02, 0xD0, 0xF3, 0xC8, 0x20, 0xAA, 0xF7, 0xD0, 0xF3, 0x01, 0x71, 0xFF, 0x31, 0x39, 0x71, 0xFF, 0x65, 0x23, 0x51, 0xB1, 0xFF, 0x31, 0x84, 0x16, 0x47, 0x5F, 0x43, 0x00, 0x81, 0xFF, 0x0F, 0xE1, 0xFF, 0x02, 0x90, 0xFF, 0x12, 0x65, 0xC3, 0x02, 0x31, 0xF3, 0x92, 0x3F, 0x80, 0xBF, 0x91, 0xF3, 0x60, 0x32, 0xB6, 0xED, 0x00, 0x82, 0xFF, 0x36, 0xFF, 0x03, 0x32, 0xFF, 0x7C, 0x27, 0x47, 0x53, 0x3F, 0x0D, 0x42, 0xFF, 0x55, 0x48, 0x27, 0xBD, 0xB0, 0x27, 0xC1, 0xA4, 0x27, 0xAD, 0x24, 0x27, 0xA8, 0x82, 0x36, 0xEB, 0x30, 0x03, 0x00, 0x00, 0xBC, 0x20, 0x03, 0x24, 0xB4, 0x27, 0xCB, 0x88, 0x37, 0x93, 0x27, 0xB4, 0xB0, 0x27, 0x07, 0x74, 0x0A, 0x0B, 0x00, 0x00, 0x78, 0x0B, 0x32, 0xDF, 0x57, 0x00, 0x03, 0x5B, 0x37, 0x52, 0xE5, 0x27, 0x8E, 0x26, 0xD1, 0x33, 0xB7, 0x50, 0x41, 0x83, 0x2F, 0x02, 0xF2, 0xE3, 0xC5, 0x73, 0xDB, 0x01, 0x13, 0x07, 0x50, 0x5F, 0x33, 0x00, 0x80, 0x67, 0xB8, 0x60, 0x67, 0xDD, 0x20, 0xAA, 0x43, 0xC7, 0x38, 0x63, 0xC7, 0x30, 0x6F, 0x93, 0x9F, 0xA0, 0x24, 0x0A, 0x4C, 0xA0, 0x27, 0xC5, 0x80, 0xBE, 0x24, 0x39, 0x23, 0x16, 0xA0, 0xC0, 0x8C, 0x48, 0x99, 0x06, 0x02, 0x00, 0x30, 0x37, 0x70, 0x23, 0x33, 0x33, 0x02, 0xB3, 0x3F, 0xFC, 0x2D, 0xEC, 0xBC, 0x70, 0x0B, 0x0A, 0x32, 0xD7, 0x23, 0x20, 0x0B, 0x30, 0x2F, 0x80, 0x3F, 0x48, 0xC9, 0x07, 0xF1, 0x01, 0xD0, 0x2F, 0xF4, 0x2F, 0xB0, 0x6B, 0x39, 0x2C, 0x40, 0x9D, 0x1C, 0x30, 0x97, 0xBF, 0x61, 0xEF, 0xCC, 0x28, 0x65, 0x30, 0x9B, 0x70, 0xF3, 0x24, 0x87, 0xE4, 0xB9, 0x71, 0x5B, 0x70, 0x50, 0xF1, 0x5B, 0x29, 0x59, 0xD4, 0x8B, 0x80, 0x41, 0xCD, 0xCC, 0x5F, 0xCC, 0x20, 0xEB, 0x20, 0x34, 0x02, 0x00, 0x41, 0x67, 0x00, 0x14, 0xBB, 0x30, 0x7F, 0x30, 0x2F, 0x9A, 0x71, 0x73, 0x44, 0x73, 0xF5, 0x38, 0x01, 0xA0, 0x7F, 0xC1, 0x20, 0x7F, 0x3E, 0x8E, 0x02, 0xD0, 0x7F, 0x52, 0x65, 0x64, 0x01, 0x70, 0xFF, 0xC1, 0xEB, 0x45, 0x43, 0xC2, 0x14, 0xB7, 0x6D, 0xDB, 0x20, 0x7F, 0x8C, 0x25, 0x02, 0x20, 0xC1, 0xD4, 0x00, 0xD1, 0x8B, 0xB6, 0x6C, 0x5C, 0xA4, 0x87, 0xB4, 0x41, 0x3B, 0x92, 0x24, 0x2F, 0xE9, 0xC0, 0x60, 0x8B, 0x31, 0x00, 0x32, 0xE7, 0x35, 0x33, 0xF2, 0xE7, 0x92, 0x53, 0x5F, 0xF0, 0x26, 0x82, 0x20, 0x25, 0x1B, 0x90, 0x0B, 0x50, 0x97, 0x34, 0xEF, 0x00, 0x50, 0x97, 0xEB, 0x96, 0x53, 0x30, 0x3B, 0x77, 0x08, 0xAA, 0xF1, 0x17, 0x32, 0x02, 0x13, 0x73, 0x32, 0xF7, 0xFE, 0x50, 0x8B, 0x00, 0x96, 0x7B, 0x33, 0x1B, 0x57, 0x7C, 0x00, 0x31, 0x7F, 0x3B, 0xB0, 0x57, 0x07, 0x54, 0x6D, 0x53, 0x2B, 0x0E, 0x47, 0x73, 0x4C, 0x37, 0x8B, 0x2B, 0xF9, 0x94, 0x63, 0x8B, 0xD8, 0x3B, 0xA7, 0x3B, 0xF1, 0x24, 0x4B, 0xF5, 0x00, 0x01, 0x97, 0xC0, 0x39, 0x8E, 0x7A, 0xE3, 0x2B, 0x59, 0x51, 0x5B, 0x5C, 0x1D, 0x01, 0x20, 0x23, 0x03, 0xF7, 0x6B, 0x40, 0x04, 0x41, 0x9E, 0x15, 0x8D, 0xBD, 0x31, 0xA3, 0x9A, 0x99, 0x6A, 0xB9, 0x2B, 0x9D, 0x2C, 0x7A, 0x04, 0x01, 0x10, 0x23, 0x01, 0x01, 0x20, 0x8F, 0x01, 0xAB, 0x01, 0x20, 0x8F, 0x01, 0x00, 0x10, 0x8F, 0xC1, 0x20, 0x8F, 0x3D, 0x60, 0x8F, 0x44, 0x5B, 0x60, 0x01, 0x00, 0x10, 0x8F, 0x00, 0x00, 0x23, 0x50, 0x5F, 0x42, 0x6C, 0x6B, 0x80, 0x03, 0xE1, 0x63, 0x9A, 0x99, 0x19, 0xC0, 0x0E, 0x74, 0xDA, 0xFF, 0x00, 0xC1, 0x63, 0x00, 0x40, 0x23, 0x04, 0x61, 0x63, 0x00, 0x30, 0x8F, 0xF1, 0x63, 0x00, 0x40, 0x23, 0x03, 0x81, 0x63, 0x00, 0x13, 0xBB, 0xAA, 0x00, 0x32, 0xC7, 0x58, 0x2E, 0xBD, 0x88, 0x66, 0x4F, 0xE8, 0x2E, 0xC9, 0x18, 0xAF, 0x2E, 0xB5, 0x48, 0x2E, 0xB9, 0x78, 0x62, 0xC7, 0xE3, 0xD3, 0x56, 0x3F, 0x60, 0x0B, 0xBD, 0x52, 0xD3, 0xF0, 0xC2, 0xD3, 0x01, 0xC0, 0x2F, 0x22, 0xDF, 0xD4, 0x33, 0x40, 0x68, 0x03, 0xDF, 0x50, 0x0B, 0x52, 0xEB, 0xF0, 0xC2, 0xEB, 0x01, 0xB0, 0x2F, 0x32, 0xF7, 0x01, 0xB0, 0xBF, 0x33, 0x03, 0xFF, 0x01, 0xC0, 0x2F, 0x00, 0x10, 0xBF, 0x45, 0x73, 0x70, 0x0B, 0x53, 0x1B, 0x40, 0xBF, 0x83, 0x1B, 0x01, 0xB0, 0x2F, 0xFF, 0x63, 0x27, 0x03, 0xC1, 0xC3, 0x33, 0x27, 0x75, 0x97, 0x93, 0x33, 0x00, 0x91, 0xC3, 0x01, 0x00, 0x2F, 0x05, 0xE1, 0xC3, 0xFF, 0x00, 0xF0, 0xBF, 0xF1, 0xC3, 0x01, 0x00, 0x2F, 0x05, 0x01, 0xC3, 0x00, 0x16, 0xB7, 0x00, 0x36, 0x4F, 0x35, 0xCC, 0x33, 0x8B, 0xD7, 0x36, 0x53, 0x33, 0x8F, 0xA0, 0x69, 0xE3, 0xD0, 0x6D, 0xAB, 0xE6, 0xCF, 0x59, 0xC7, 0xFF, 0x26, 0x43, 0x00, 0x40, 0x17, 0x26, 0x37, 0xD6, 0xFF, 0x63, 0x57, 0x26, 0x2B, 0x00, 0x30, 0x17, 0x36, 0x1F, 0xFF, 0x00, 0x30, 0x5F, 0x36, 0x13, 0x00, 0x40, 0x17, 0x00, 0x10, 0x5F, 0x48, 0x6B, 0x35, 0xFB, 0x00, 0x30, 0x17, 0x65, 0xEF, 0xFF, 0x03, 0xC1, 0x03, 0x82, 0xC7, 0xE1, 0x03, 0x82, 0xDF, 0x02, 0xE1, 0x03, 0x73, 0x27, 0xF1, 0x03, 0x80, 0x17, 0xDB, 0x01, 0xE1, 0x03, 0x00, 0xFD, 0xDF, 0x54, 0xEC, 0xDF, 0x02, 0x7E, 0xDF, 0x04, 0x2F, 0xA4, 0x5F, 0x0D, 0xAA, 0xDC, 0xDF, 0x50, 0x2F, 0xCC, 0xB8, 0x2F, 0xD0, 0x20, 0x2F, 0xBC, 0xA0, 0xAA, 0x2F, 0xC0, 0x2C, 0x2C, 0xE3, 0xAC, 0x2C, 0xE7, 0x10, 0x2C, 0xDF, 0x74, 0x97, 0x2C, 0xDF, 0xD8, 0x07, 0x2D, 0x17, 0x09, 0x2C, 0x31, 0x2C, 0xE3, 0x02, 0x9C, 0xDF, 0xF5, 0x3E, 0xCF, 0x00, 0xFC, 0xDF, 0x9E, 0xF3, 0x00, 0xBC, 0xDF, 0x7C, 0xEC, 0xDF, 0x2C, 0x6D, 0x5B, 0xFF, 0xDD, 0x4F, 0x4C, 0xE3, 0x8C, 0xD3, 0xD0, 0x17, 0x9C, 0xBB, 0x00, 0x30, 0x17, 0x00, 0x9F, 0xD3, 0x3F, 0xFD, 0xEF, 0x01, 0x1C, 0x8B, 0x00, 0x0D, 0xE7, 0xC3, 0xA3, 0xA0, 0x81, 0xF3, 0x00, 0x9F, 0xFB, 0x30, 0x23, 0x01, 0x1C, 0x73, 0xDB, 0x03, 0xD0, 0x67, 0x02, 0x7C, 0x5B, 0x70, 0x2B, 0xCB, 0x7C, 0x5B, 0x20, 0x3B, 0xDB, 0x00, 0xEB, 0xC3, 0xFB, 0x3E, 0x67, 0x7F, 0xD7, 0x5B, 0xCF, 0x00, 0xFC, 0x4F, 0x00, 0xDC, 0xDB, 0xF0, 0x2C, 0xCB, 0x80, 0x7F, 0xEF, 0x01, 0x2C, 0xDB, 0x30, 0x2F, 0x7F, 0xFB, 0xC8, 0x2F, 0x03, 0x7C, 0xDB, 0x5B, 0xE7, 0xAC, 0xDB, 0xFF, 0x00, 0x4C, 0x4F, 0x03, 0x3D, 0x67, 0x00, 0x1E, 0x67, 0xDD, 0x67, 0x04, 0x1C, 0x67, 0x41, 0xA3, 0x79, 0x93, 0x9D, 0x43, 0xFF, 0xCC, 0x67, 0x00, 0x60, 0x23, 0xCC, 0x67, 0x31, 0xEB, 0x89, 0x7B, 0x28, 0x2F, 0x00, 0x3C, 0x67, 0x00, 0x50, 0x23, 0xFF, 0xDC, 0x67, 0x00, 0x50, 0x8F, 0xDC, 0x67, 0x00, 0x60, 0x23, 0x00, 0x10, 0x8F, 0x79, 0x4B, 0x30, 0x8F, 0x00, 0x2C, 0x67, 0xCF, 0x00, 0x50, 0x23, 0x04, 0x1C, 0x67, 0x70, 0xC2, 0xA9, 0x33, 0x00, 0x81, 0x63, 0x00, 0x40, 0x23, 0x04, 0x61, 0x63, 0xFF, 0x00, 0x30, 0x8F, 0xF1, 0x63, 0x00, 0x40, 0x23, 0x03, 0x81, 0x63, 0x01, 0x5C, 0x67, 0x01, 0x9F, 0x2F, 0x43, 0xEB, 0x6F, 0x2F, 0xFF, 0x9F, 0x97, 0xDF, 0x2F, 0x00, 0x60, 0x23, 0xCF, 0x2F, 0x34, 0x33, 0x7F, 0x2F, 0x38, 0x2F, 0x00, 0x3F, 0x2F, 0xFF, 0x00, 0x50, 0x23, 0xDF, 0x2F, 0x00, 0x50, 0x8F, 0xDF, 0x2F, 0x00, 0x60, 0x23, 0x00, 0x10, 0x8F, 0x6F, 0x2F, 0x40, 0x8F, 0xFF, 0x00, 0x2F, 0x2F, 0x00, 0x50, 0x23, 0x01, 0x7C, 0x07, 0x01, 0xB1, 0x63, 0x9F, 0x2F, 0x00, 0x91, 0x63, 0x00, 0x40, 0x23, 0x04, 0x61, 0x63, 0xFF, 0x00, 0x30, 0x8F, 0xF1, 0x63, 0x00, 0x40, 0x23, 0x03, 0x81, 0x63, 0x01, 0x5B, 0xA7, 0x01, 0x95, 0x8F, 0x46, 0x27, 0x6F, 0x23, 0xFF, 0x9F, 0xDF, 0xD5, 0x8F, 0x00, 0x60, 0x23, 0xC5, 0x8F, 0x4F, 0xDF, 0x6F, 0x0B, 0x4F, 0xDF, 0x00, 0x25, 0x8F, 0xFF, 0x00, 0x50, 0x23, 0xD5, 0x8F, 0x00, 0x50, 0x8F, 0xD5, 0x8F, 0x00, 0x60, 0x23, 0x00, 0x10, 0x8F, 0x6E, 0xDB, 0x40, 0x8F, 0xFF, 0x00, 0x25, 0x8F, 0x00, 0x50, 0x23, 0x01, 0x7C, 0x07, 0x01, 0xB1, 0x63, 0x9E, 0xC3, 0x00, 0x91, 0x63, 0x00, 0x40, 0x23, 0x04, 0x61, 0x63, 0xFB, 0x00, 0x30, 0x8F, 0xF1, 0x63, 0x00, 0x40, 0x23, 0x03, 0x61, 0x63, 0x00, 0x7C, 0x5F, 0x4C, 0x2C, 0x5C, 0xBC, 0x5F, 0xC6, 0x3E, 0x51, 0x7C, 0x5F, 0x65, 0x00, 0x73, 0xCC, 0x5F, 0x3B, 0x9C, 0x47, 0x2B, 0x5F, 0x43, 0x00, 0x4C, 0x5F, 0xFC, 0x2E, 0xBB, 0x0F, 0x5B, 0x58, 0x4C, 0x5F, 0xD5, 0x3C, 0x82, 0x3B, 0xAB, 0xBC, 0x2F, 0xFF, 0xFC, 0x2F, 0xF8, 0x3C, 0x2E, 0xDB, 0x5F, 0x7C, 0x2E, 0xDF, 0xBC, 0x2E, 0xE3, 0x00, 0x3C, 0x47, 0x3E, 0xC7, 0x5E, 0xFB, 0x00, 0x7A, 0x3B, 0x2F, 0x80, 0xBF, 0x9A, 0x3B, 0x60, 0x88, 0xC7, 0x00, 0x3C, 0x2B, 0x00, 0x70, 0x4B, 0x9F, 0x2B, 0x77, 0xCA, 0x2A, 0xB7, 0x00, 0x9B, 0xCB, 0x01, 0x10, 0x3F, 0xF2, 0xA0, 0x3F, 0x00, 0x1B, 0xA3, 0x01, 0xD0, 0x3F, 0xDE, 0x00, 0x29, 0xEF, 0x01, 0x00, 0xBF, 0x8E, 0x2B, 0x77, 0x70, 0xFF, 0x00, 0x27, 0x67, 0x01, 0x00, 0xFF, 0x24, 0xEC, 0xF0, 0x3F, 0xDF, 0x83, 0x01, 0x01, 0x3F, 0x30, 0x00, 0x8E, 0xBB, 0x5E, 0xBF, 0x59, 0x54, 0xA8, 0x7E, 0xBF, 0xB4, 0x2E, 0xBC, 0x10, 0x2F, 0xFB, 0x6C, 0x79, 0x74, 0x64, 0x31, 0x3E, 0xD1, 0x4A, 0x9E, 0x00, 0xA0, 0x2D, 0xE7, 0x70, 0x43, 0x05, 0x74, 0x78, 0x6C, 0x31, 0x34, 0x61, 0xFB, 0x04, 0x2F, 0xFF, 0x80, 0x2D, 0x55, 0x74, 0x65, 0x6E, 0x64, 0x6F, 0x5F, 0x44, 0x00, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x00, 0x65, 0x64, 0x42, 0x79, 0x5F, 0x31, 0x32, 0x38, 0x00, 0x78, 0x36, 0x34, 0x2E, 0x62, 0x63, 0x6C, 0x69, 0x17, 0x6D, 0x00, 0x6D, 0x2F, 0x07, 0x60, 0x62, 0x2F, 0x30, 0x57, 0x4D, 0x8B, 0x08, 0x4C, 0x6F, 0x67, 0x6F, 0xAE, 0xF5, 0xFF, 0xFF, 0xFF, 0xDF, 0x30, 0x03, 0x00, 0x40, 0x02, 0x15, 0x5F, 0xEC, 0x30, 0x6E, 0xAF, 0x7E, 0x3E, 0x13, 0x5E, 0x17, 0x08, 0x70, 0x61, 0x6E, 0x31, 0x3B, 0x5B, 0x01, 0x04, 0xFF, 0x00, 0x00, 0x52, 0x6F, 0x6F, 0x74, 0x50, 0x61, 0x6E, 0x70, 0x65, 0x00, 0xB0, 0xEB, 0x00, 0x50, 0x47, 0x50, 0xDF, 0x70, 0x61, 0x73, 0x31, 0xD3, 0x3B, 0xAF, 0x70, 0x53, 0x03, 0x20, 0x53, 0x4E, 0x5F, 0x30, 0x55, 0x00, 0x0F, 0xA2, 0xD0, 0x01, 0x20, 0x53, 0x4C, 0xDF, 0x42, 0x80, 0x53, 0x69, 0x63, 0x31, 0x80, 0x9F, 0x3C, 0x1B, 0x07, 0xFF, 0x00, 0x41, 0x03, 0x7E, 0xEC, 0x2D, 0x67, 0x82, 0x2B, 0x00, 0x20, 0xEF, 0x9E, 0x2F, 0x6F, 0x80, 0x42, 0xF1, 0x2B, 0x71, 0xA5, 0xCF, 0x2F, 0xC1, 0x27, 0x80, 0x0C, 0x3F, 0x70, 0x61, 0x65, 0x60, 0xDB, 0x50, 0x07, 0x67, 0x72, 0x30, 0x70, 0x31, 0x3C, 0xA3, 0x31, 0x33, 0x47, 0x72, 0x6F, 0x75, 0xCE, 0x3C, 0x9B, 0x7F, 0xF3, 0x67, 0x72, 0x51, 0x07, 0x30, 0x23, 0x34, 0x63, 0x47, 0x3F, 0x5F, 0x41, 0xCF, 0xDF, 0x3F, 0xDB, 0xF1, 0x17, 0xF1, 0xD7, 0x30, 0x5F, 0x3F, 0xEB, 0x1F, 0x47, 0x5F, 0x42, 0xCF, 0x79, 0x3F, 0xF3, 0x00, 0x90, 0x2B, 0xD4, 0xAB, 0x3F, 0xEF, 0x9A, 0xF1, 0x7F, 0x67, 0x72, 0x50, 0xC7, 0x00, 0x72, 0xBF, 0x3C, 0x22, 0xBC, 0x22, 0xB5, 0x00, 0x02, 0xBF, 0xC8, 0x82, 0xBF, 0x3D, 0x7F, 0x07, 0x64, 0xBB, 0x2D, 0x2F, 0xFF, 0x9D, 0x2F, 0x08, 0x00, 0x4F, 0x34, 0xA1, 0x32, 0xF3, 0x2F, 0xFF, 0x78, 0x2F, 0xFB, 0x1D, 0x33, 0x64, 0x73, 0x62, 0xA1, 0x62, 0xC4, 0x80, 0x10, 0x31, 0xF0, 0x10, 0x53, 0x32, 0xF0, 0x21, 0x33, 0x62, 0xF7, 0x4C, 0x54, 0x90, 0x3E, 0x30, 0x0B, 0x83, 0x70, 0x39, 0x4C, 0x54, 0x4D, 0x61, 0x73, 0x3C, 0xCC, 0xA3, 0x1F, 0x05, 0xA8, 0x06, 0x00, 0x00, 0x0B, 0x2F, 0xFF, 0x38, 0x2F, 0xFF, 0x55, 0x88, 0x2F, 0xFB, 0x08, 0x2F, 0xF4, 0x88, 0x2F, 0xF8, 0x08, 0x2F, 0xD4, 0x55, 0x88, 0x2F, 0xD8, 0x4C, 0x2F, 0x10, 0xE8, 0x2F, 0x14, 0xAC, 0x23, 0x74, 0x3B, 0x48, 0x05, 0x2F, 0xD7, 0x20, 0x2F, 0x00, 0x35, 0x47, 0xAA, 0x53, 0x4B, 0x00, 0x83, 0x47, 0x76, 0x02, 0x00, 0xA3, 0x47, 0x00, 0x35, 0x57, 0x00, 0xB3, 0x97, 0xD5, 0x20, 0xB3, 0x00, 0xB3, 0x97, 0x40, 0xD0, 0x24, 0x20, 0x30, 0x03, 0x11, 0x2F, 0xFB, 0x74, 0x06, 0x00, 0x04, 0xC3, 0x30, 0x03, 0x30, 0x0B, 0x65, 0x06, 0x00, 0x01, 0x30, 0x03, 0x30, 0x17, 0xD3, 0x31, 0x87, 0x5E, 0x03, 0x05, 0x2F, 0x47, 0x4F, 0x5F, 0x31, 0x32, 0x01, 0xB0, 0x7F, 0x60, 0x01, 0x03, 0xE0, 0x7F, 0xD2, 0xA9, 0x00, 0x00, 0x8C, 0x8C, 0x8C, 0xEF, 0x05, 0xA0, 0x7F, 0x00, 0x16, 0x97, 0x00, 0xF1, 0x7F, 0x03, 0x03, 0xC1, 0x7F, 0x00, 0x16, 0xD7, 0x45, 0x9B, 0x2F, 0xB4, 0x96, 0x00, 0x25, 0x9B, 0x80, 0x3F, 0x23, 0x44, 0x04, 0x25, 0x97, 0x30, 0x03, 0x06, 0x01, 0x00, 0x06, 0x06, 0x73, 0x09, 0xED, 0xBE, 0x30, 0x03, 0x86, 0x3F, 0xFB, 0x3A, 0x57, 0xDE, 0x40, 0x30, 0x03, 0xE0, 0x13, 0xC0, 0xE0, 0x30, 0x03, 0x00, 0x75, 0xC7, 0x78, 0x54, 0x10, 0x04, 0x00, 0x01, 0x10, 0x14, 0x04, 0x10, 0x02, 0xA2, 0x37, 0x46, 0xF2, 0x37, 0x26, 0x06, 0x1F, 0x02, 0x05, 0x66, 0x23, 0x33, 0x00, 0x12, 0x43, 0x4D, 0x5F, 0x00, 0x35, 0xAA, 0x00, 0x36, 0x5E, 0x2C, 0x80, 0xEA, 0x23, 0x77, 0x05, 0x26, 0x5B, 0x30, 0x03, 0x30, 0x8E, 0x3E, 0xE3, 0xBE, 0x30, 0x03, 0xB0, 0xBF, 0xE0, 0x13, 0xC0, 0xBF, 0x50, 0xA7, 0x00, 0xF0, 0x00, 0xC0, 0xA7, 0x00, 0x21, 0x5F, 0xCF, 0x5F, 0x01, 0xB1, 0x5F, 0x2F, 0xA1, 0xBD, 0xBF, 0xC3, 0x30, 0x03, 0x3F, 0xF7, 0xCE, 0x95, 0x17, 0x41, 0x30, 0x03, 0xE0, 0x13, 0x78, 0xC1, 0x30, 0x03, 0x05, 0x21, 0x5F, 0x00, 0x00, 0xC3, 0x01, 0x31, 0x5F, 0x61, 0x0B, 0xB6, 0x7F, 0xBF, 0x30, 0x03, 0xB0, 0xBF, 0xE0, 0x13, 0xC0, 0xBF, 0x02, 0x61, 0x5F, 0xCD, 0xF7, 0x01, 0xB2, 0xBF, 0xFF, 0x3F, 0xF7, 0x50, 0x03, 0x5D, 0xA7, 0x50, 0x03, 0xC0, 0x13, 0x4F, 0xF7, 0x05, 0x22, 0xBF, 0x00, 0x00, 0xC3, 0xFF, 0x01, 0x32, 0xBF, 0x3F, 0xE3, 0x3F, 0xE7, 0xB0, 0xBF, 0xE0, 0x13, 0xC0, 0xBF, 0x01, 0xF2, 0xBF, 0x03, 0x59, 0x67, 0xFF, 0x57, 0x87, 0x00, 0x59, 0x67, 0x00, 0x1C, 0x63, 0x99, 0x13, 0x40, 0x03, 0x00, 0x79, 0x13, 0x3F, 0x93, 0xC9, 0x67, 0x58, 0xA0, 0x4E, 0xC7, 0xF5, 0x00, 0x84, 0xD3, 0x70, 0x53, 0x46, 0x31, 0x32, 0xE8, 0x00, 0x63, 0x2F, 0x58, 0x2F, 0xFA, 0x93, 0x05, 0x4F, 0xF1, 0x00, 0x00, 0xCD, 0x27, 0xCC, 0x4C, 0x28, 0x36, 0x80, 0x3F, 0x50, 0x07, 0x40, 0x0F, 0x4A, 0x8F, 0xFF, 0x50, 0x07, 0x9F, 0xEC, 0xE0, 0x0B, 0x40, 0x03, 0x00, 0x0A, 0x0F, 0x2A, 0xB7, 0x00, 0xA4, 0xB7, 0x60, 0xFB, 0x7D, 0x20, 0x01, 0xC0, 0xA7, 0x27, 0x62, 0x01, 0x00, 0xA7, 0x8A, 0x0F, 0x81, 0x2F, 0x91, 0x00, 0x84, 0xA3, 0x8B, 0x71, 0x83, 0x10, 0xF4, 0xBF, 0x01, 0xC1, 0x2F, 0x07, 0x04, 0xD1, 0x2F, 0x00, 0x80, 0xA7, 0xBE, 0x01, 0xF1, 0x2F, 0x08, 0x02, 0x41, 0x2F, 0x00, 0x5D, 0x8B, 0xE1, 0xB7, 0xEB, 0xCB, 0x00, 0xD2, 0x5F, 0x09, 0xEF, 0x04, 0xD2, 0x5F, 0x00, 0xB0, 0xA7, 0x01, 0xC3, 0x07, 0x0A, 0x01, 0xE2, 0x5F, 0x92, 0xE7, 0x00, 0x1F, 0xFB, 0x5F, 0xC7, 0x6B, 0xF8, 0x25, 0x6F, 0x3C, 0xFB, 0xA0, 0x00, 0x68, 0x1F, 0x10, 0x43, 0xE3, 0x00, 0x5C, 0xF7, 0x47, 0x50, 0x43, 0x83, 0x00, 0x00, 0x44, 0x6C, 0xF7, 0x30, 0x0F, 0x3E, 0x1F, 0xE7, 0x30, 0x0F, 0x2C, 0xF7, 0x6D, 0x77, 0x03, 0x08, 0x6D, 0x77, 0x00, 0xC3, 0x67, 0x00, 0x70, 0x7F, 0xAF, 0x4D, 0x77, 0x41, 0xFE, 0xA3, 0x01, 0x01, 0x4D, 0x77, 0x00, 0x3D, 0xFF, 0x00, 0x1A, 0xEB, 0x01, 0x94, 0xEB, 0xF7, 0x00, 0x10, 0x87, 0x5F, 0xE9, 0x00, 0xED, 0xFF, 0x7E, 0x7F, 0x01, 0x50, 0x7F, 0xFA, 0xEB, 0x02, 0xB0, 0x7F, 0x7B, 0x03, 0x8E, 0x7F, 0x9E, 0x6F, 0xFE, 0x8F, 0x00, 0x02, 0x0F, 0x03, 0x3F, 0x07, 0x00, 0x1A, 0xF3, 0xF5, 0x01, 0x91, 0x8F, 0x00, 0x12, 0x0F, 0x2A, 0x3A, 0x04, 0x8F, 0x07, 0xDC, 0x00, 0x2F, 0x07, 0x0C, 0x4F, 0x07, 0xFF, 0xD6, 0xB7, 0xFD, 0x97, 0xFD, 0x57, 0xFC, 0xE7, 0xFC, 0x77, 0xFC, 0x07, 0xFB, 0x97, 0xFA, 0xE3, 0xFB, 0xFA, 0x57, 0xF9, 0xA3, 0xF9, 0x17, 0xF8, 0x63, 0x3F, 0xE3, 0xCC, 0x00, 0x2F, 0xA7, 0x3E, 0x8F, 0xAE, 0x0A, 0x30, 0xCB, 0x2C, 0x41, 0xA7, 0x43, 0xCF, 0x1B, 0x37, 0x0D, 0xF8, 0x5F, 0x67, 0x60, 0x72, 0x56, 0xFF, 0x01, 0x48, 0xC3, 0x40, 0x00, 0x78, 0x80, 0x80, 0x8C, 0x34, 0x6F, 0x00, 0x00, 0x0A, 0x2B, 0x81, 0x20, 0x0B, 0xEF, 0x80, 0x00, 0x80, 0xEF, 0xEF, 0xFF, 0xF8, 0x0B, 0xBF, 0x70, 0x10, 0x01, 0xFF, 0xF6, 0x8F, 0x85, 0x20, 0x00, 0x88, 0x40, 0x41, 0x30, 0x50, 0x27, 0x1C, 0xCF, 0x00, 0x01, 0x30, 0x20, 0x0B, 0xE0, 0x30, 0x03, 0x38, 0x36, 0x4F, 0x79, 0x87, 0x00, 0x05, 0xFD, 0xFC, 0x30, 0x0B, 0x0A, 0x3F, 0x85, 0x3F, 0x89, 0xFC, 0xFC, 0x0A, 0x0A, 0xC1, 0x30, 0x03, 0x2F, 0xFA, 0x83, 0x00, 0x00, 0xF7, 0xF7, 0x3F, 0x10, 0x38, 0xBF, 0xFF, 0x31, 0x7A, 0x20, 0x0B, 0x20, 0x0F, 0xFF, 0x9F, 0xCF, 0x04, 0xFF, 0x1F, 0x2F, 0xF6, 0x60, 0xAF, 0xE5, 0x81, 0x00, 0x09, 0x00, 0xF3, 0xF3, 0x01, 0x22, 0xB0, 0xCF, 0xFF, 0x30, 0x05, 0x20, 0xF3, 0xF3, 0x40, 0x03, 0x28, 0x00, 0x00, 0x5F, 0x5F, 0x83, 0x40, 0x5F, 0x88, 0xFE, 0xCA, 0xFF, 0xCC, 0x30, 0x0B, 0x40, 0x0F, 0x83, 0x7F, 0xEC, 0x88, 0x00, 0x88, 0xFF, 0xCC, 0x2F, 0xCC, 0x30, 0x07, 0x25, 0xCF, 0xFF, 0x21, 0xEE, 0xFC, 0xFC, 0x30, 0x7D, 0x0C, 0x22, 0xC0, 0xC0, 0x30, 0x03, 0x20, 0x1F, 0x06, 0xFF, 0xCC, 0x0D, 0x0A, 0x00, 0x07, 0x30, 0x00, 0x88, 0x60, 0x60, 0x50, 0xE7, 0x3F, 0xFF, 0x30, 0x0B, 0xD9, 0x40, 0x0F, 0x30, 0x3F, 0xCD, 0x20, 0x37, 0x50, 0x47, 0xCC, 0x02, 0x2D, 0xA7, 0x16, 0x34, 0xFF, 0x33, 0x41, 0x0F, 0x33, 0x30, 0x07, 0x40, 0x3F, 0x0E, 0xAF, 0x30, 0xC7, 0x84, 0x25, 0xCB, 0xF8, 0x4F, 0xD3, 0x2F, 0x9F, 0x50, 0x0B, 0x20, 0x0F, 0x8C, 0x2F, 0xE8, 0xAF, 0xFF, 0x00, 0x30, 0xE7, 0x5F, 0xD7, 0x8E, 0xBF, 0x05, 0xFF, 0x0E, 0x1E, 0xF7, 0x70, 0x32, 0x64, 0xBF, 0x40, 0xC7, 0x04, 0x00, 0x82, 0x00, 0x00, 0xF4, 0x40, 0xC7, 0x4F, 0x4F, 0xF0, 0x3F, 0xFF, 0x50, 0xD7, 0x30, 0x0B, 0x40, 0x0F, 0x80, 0x00, 0x88, 0xF1, 0x10, 0xE1, 0xFF, 0xEF, 0x70, 0x7F, 0xE1, 0xE1, 0x7F, 0x7F, 0xC0, 0x30, 0x03, 0xE0, 0xDF, 0xDC, 0x00, 0x15, 0x00, 0x00, 0xEF, 0x31, 0xFF, 0x05, 0x40, 0x41, 0x3F, 0xDA, 0xD3, 0x40, 0xDF, 0x2E, 0xBE, 0x33, 0xFD, 0xFA, 0x00, 0x0E, 0x0F, 0x2F, 0xB5, 0x07, 0x09, 0x01, 0xAA, 0xBD, 0x21, 0xEB, 0x8C, 0x31, 0xEF, 0x01, 0x01, 0x60, 0x25, 0x3F, 0x40, 0x0F, 0xFF, 0x70, 0x18, 0x00, 0xDE, 0x01, 0x30, 0x0B, 0x39, 0x69, 0xFF, 0xF6, 0x1C, 0x00, 0xCF, 0x50, 0x00, 0xFF, 0xF5, 0x30, 0x31, 0xFF, 0x28, 0xFF, 0x5C, 0x46, 0x97, 0x50, 0x5F, 0xBF, 0xF5, 0xFF, 0xFF, 0x0E, 0x40, 0x00, 0xEE, 0x10, 0xF1, 0xEF, 0x41, 0xFF, 0x2F, 0xFF, 0xFC, 0x06, 0xFD, 0x0A, 0x0B, 0xEB, 0x10, 0x30, 0x88, 0x51, 0xEF, 0x2F, 0x19, 0x2F, 0x00, 0x00, 0x30, 0x03, 0x51, 0xFF, 0xE6, 0x10, 0x30, 0x0F, 0x48, 0x2E, 0x2F, 0xE0, 0xF5, 0x50, 0x30, 0xC7, 0xF5, 0x40, 0x02, 0x0D, 0x1D, 0xF3, 0xF2, 0xDF, 0x20, 0x54, 0x7F, 0xF3, 0xF4, 0x2F, 0x99, 0x1D, 0x00, 0x00, 0xD4, 0x41, 0xFB, 0xB1, 0xEF, 0x32, 0x0B, 0x4E, 0xB6, 0x9A, 0xC3, 0xF1, 0xEF, 0x20, 0x79, 0x00, 0x00, 0xEB, 0x10, 0x31, 0xFF, 0x33, 0xE7, 0xC0, 0x00, 0x01, 0xEF, 0xB1, 0xFF, 0x00, 0xEE, 0x11, 0xFF, 0x35, 0xFF, 0x68, 0x33, 0x30, 0xF7, 0x21, 0xF2, 0x33, 0x3F, 0xDF, 0x57, 0xFF, 0x55, 0x02, 0xFF, 0xEE, 0x11, 0xEE, 0x11, 0x55, 0x60, 0x07, 0x06, 0xC0, 0x87, 0x06, 0x51, 0xEF, 0x55, 0xFF, 0x04, 0x0D, 0xEE, 0x11, 0xC0, 0x34, 0x41, 0x32, 0x0B, 0xE7, 0x10, 0x1E, 0x1E, 0x00, 0x00, 0x88, 0x30, 0x03, 0xF6, 0x60, 0xCF, 0x2E, 0xEE, 0xF6, 0x50, 0x1E, 0x08, 0x1F, 0x00, 0x00, 0x1D, 0xAF, 0xA4, 0x01, 0x1C, 0xF3, 0x32, 0xF3, 0xCF, 0x21, 0x2C, 0x71, 0xEF, 0xF5, 0x50, 0x37, 0xDB, 0xE4, 0xE8, 0x42, 0x0B, 0x30, 0xC7, 0x61, 0xEF, 0x6F, 0x7F, 0xD7, 0xE1, 0xF1, 0xAF, 0x38, 0xFF, 0xD1, 0x20, 0x97, 0x70, 0x7F, 0x9F, 0xEF, 0xF9, 0xFB, 0x10, 0x28, 0x90, 0xFE, 0x20, 0x9D, 0x65, 0x30, 0x9F, 0x01, 0xFB, 0xFF, 0x1B, 0x9F, 0x0B, 0x7C, 0x33, 0xB3, 0x2C, 0x6C, 0x06, 0x5B, 0xBA, 0x00, 0x4C, 0xB2, 0x01, 0x43, 0x4C, 0x49, 0x4D, 0xFF, 0xFE, 0x14, 0x2F, 0xFA, 0x18, 0x02, 0x02, 0x28, 0x29, 0xD7, 0x3B, 0x3D, 0x69, 0x6D, 0x61, 0x23, 0x67, 0x10, 0x4C, 0x7C, 0x10, 0x00, 0x0D, 0x62, 0x33, 0x06, 0xD0, 0x01, 0x0A, 0x20, 0xA0, 0x00, 0x71, 0x23, 0xDF, 0xFF, 0x33, 0xBF, 0xC0, 0x80, 0x2E, 0xAB, 0xC0, 0xC0, 0xAF, 0x9F, 0x00, 0x00, 0x9F, 0xF0, 0x20, 0x03, 0x73, 0x97, 0x80, 0x07, 0xFF, 0xA0, 0x78, 0x00, 0x02, 0xFF, 0x30, 0xFC, 0x3E, 0x4F, 0x7B, 0x3F, 0xCE, 0x90, 0x90, 0xDF, 0xDF, 0xF9, 0x30, 0x03, 0x01, 0x9D, 0xBF, 0x50, 0x6F, 0x30, 0x6B, 0x40, 0x6F, 0x00, 0xB0, 0x44, 0x93, 0x47, 0xDF, 0x22, 0x07, 0xD7, 0x00, 0xEE, 0x00, 0x0E, 0xAE, 0x42, 0x17, 0x20, 0x17, 0xD0, 0x70, 0x07, 0x40, 0x6F, 0x80, 0x90, 0x6F, 0xC5, 0xFF, 0xCF, 0x7F, 0x3D, 0xDE, 0x00, 0x95, 0x7D, 0xC1, 0x7F, 0x63, 0x53, 0x71, 0x7F, 0x20, 0x71, 0x7F, 0xD6, 0xC2, 0xCF, 0x06, 0xB1, 0x8B, 0x50, 0xA8, 0x22, 0x70, 0x28, 0x2E, 0x2D, 0xE6, 0x10, 0x11, 0x00, 0x43, 0xFD, 0x3A, 0x8F, 0x76, 0x00, 0x98, 0x6F, 0xA8, 0x21, 0xCE, 0x47, 0x2D, 0x83, 0xFF, 0x7A, 0xFF, 0x45, 0x4F, 0xDE, 0x14, 0xAA, 0x00, 0xBB, 0x4A, 0xAF, 0xBB, 0x50, 0x07, 0xFF, 0x23, 0x42, 0xEF, 0x42, 0xB3, 0xFF, 0x21, 0xFF, 0x53, 0x4F, 0xFE, 0x9A, 0x28, 0x00, 0x68, 0x4A, 0xCF, 0x24, 0x3F, 0xE8, 0xAD, 0xFF, 0xFF, 0x54, 0xC8, 0x3A, 0xDB, 0xB3, 0x5F, 0xF4, 0xFA, 0x56, 0x77, 0x27, 0xFF, 0x3F, 0x00, 0x4B, 0x85, 0x3F, 0x7B, 0x87, 0x26, 0x8B, 0x2D, 0xED, 0xB3, 0xC2, 0x07, 0xC0, 0x0A, 0x0E, 0x21, 0xF6, 0x22, 0xFF, 0x26, 0xC5, 0x86, 0x4F, 0x7F, 0xDD, 0x22, 0x23, 0xFF, 0x32, 0x4F, 0x5A, 0x43, 0xFF, 0x97, 0x6B, 0xC7, 0x37, 0x3B, 0x01, 0x10, 0xE7, 0xF2, 0xF4, 0xFF, 0xFF, 0xFC, 0x2F, 0x74, 0xD0, 0x30, 0x03, 0x9F, 0x7B, 0xDF, 0xAF, 0x86, 0x0C, 0x09, 0xFF, 0x4F, 0x00, 0x02, 0x00, 0xFF, 0xAD, 0xBF, 0x04, 0x28, 0xFF, 0x11, 0x00, 0x6C, 0x03, 0x07, 0xE0, 0xF8, 0xD6, 0x00, 0xDD, 0x00, 0x48, 0x51, 0x68, 0xDD, 0x26, 0x03, 0x61, 0xEF, 0x54, 0x00, 0x3C, 0xFD, 0xFF, 0xB8, 0xFF, 0x09, 0xFE, 0x00, 0x00, 0x51, 0x41, 0xEF, 0xFD, 0xA0, 0x97, 0x7F, 0x03, 0x10, 0x00, 0xFE, 0xFC, 0x10, 0xA0, 0x23, 0xF1, 0x6F, 0xE0, 0x00, 0x2C, 0xEF, 0x00, 0x03, 0xFF, 0xFF, 0x1E, 0x8F, 0xA8, 0xA1, 0x1B, 0xEF, 0x21, 0x1F, 0xAF, 0x05, 0x94, 0x99, 0xA1, 0xF2, 0x00, 0x38, 0x00, 0xF2, 0x20, 0x03, 0x85, 0x89, 0x40, 0xD7, 0x37, 0xFF, 0x01, 0x44, 0xBE, 0x4D, 0x8F, 0x58, 0x00, 0x23, 0x4F, 0xFF, 0x64, 0xFF, 0x45, 0xA7, 0x47, 0xE7, 0xDC, 0xFF, 0xED, 0x79, 0x80, 0xDE, 0x28, 0x80, 0x91, 0x30, 0xD2, 0xCC, 0xFF, 0x50, 0xCF, 0x21, 0x00, 0x32, 0x42, 0xDF, 0x23, 0x33, 0x00, 0x26, 0x52, 0x73, 0x30, 0xFB, 0x3F, 0x93, 0x40, 0x04, 0xA6, 0x63, 0x3F, 0x12, 0x38, 0x27, 0x7A, 0xEF, 0x35, 0x94, 0x72, 0xEF, 0x8E, 0x05, 0xFF, 0xFF, 0x2F, 0x05, 0x4D, 0x2F, 0xAA, 0x6B, 0x03, 0xE4, 0x0C, 0xBA, 0x00, 0xB5, 0xFF, 0x40, 0x29, 0xD4, 0x07, 0x55, 0xFF, 0x08, 0xC0, 0x7F, 0x91, 0x4A, 0x8B, 0x99, 0x3F, 0x00, 0x99, 0x5F, 0x97, 0x5A, 0x97, 0x8F, 0xA7, 0x70, 0x17, 0x60, 0x1F, 0x8F, 0xC7, 0x0D, 0x56, 0xFF, 0x55, 0x01, 0x37, 0x97, 0x90, 0x1F, 0x78, 0x4F, 0xE3, 0xCD, 0x27, 0xC0, 0x4A, 0x27, 0x97, 0xFF, 0x2A, 0xA7, 0x27, 0x85, 0x35, 0x26, 0xBF, 0xC4, 0x24, 0x07, 0x3F, 0xE7, 0x8B, 0xFF, 0x03, 0x44, 0x10, 0xC6, 0x00, 0x34, 0xFF, 0xD4, 0x80, 0x5F, 0x3F, 0xFF, 0x17, 0x9F, 0xD5, 0xEF, 0xFF, 0x33, 0x07, 0xCF, 0x45, 0x6F, 0x2B, 0x77, 0x3E, 0xEF, 0x3B, 0x7D, 0xAF, 0xF1, 0x11, 0x30, 0x20, 0xFB, 0x5F, 0xEF, 0xF3, 0xF9, 0xF8, 0x90, 0x3F, 0x26, 0x31, 0xB7, 0x22, 0x97, 0x00, 0x75, 0x85, 0xBF, 0x2F, 0xEA, 0xAF, 0x04, 0x0D, 0xFF, 0x9E, 0xFF, 0x45, 0x4F, 0xE1, 0xA9, 0x00, 0x51, 0x9A, 0x45, 0xBF, 0x89, 0x55, 0xA7, 0xFF, 0x22, 0xFF, 0x3E, 0x7F, 0x05, 0x00, 0xFF, 0x75, 0xFF, 0xDA, 0x4F, 0xFF, 0x23, 0x35, 0xB7, 0x41, 0x5E, 0x8A, 0x8F, 0xFF, 0xFF, 0x7F, 0x8F, 0x52, 0x23, 0x0C, 0xF7, 0x0D, 0x92, 0x31, 0xE1, 0xEF, 0xE1, 0xFF, 0x7F, 0xA7, 0x02, 0x2D, 0x07, 0x30, 0x03, 0xF0, 0x0F, 0xC1, 0x01, 0x1D, 0x86, 0x45, 0x3E, 0x00, 0xFB, 0xB0, 0xFF, 0xFF, 0x25, 0x13, 0xCE, 0x4C, 0x5F, 0x5F, 0xE8, 0xF2, 0xD0, 0x28, 0x8B, 0x25, 0x31, 0x77, 0x11, 0x0D, 0xE0, 0xA5, 0x1B, 0x96, 0x44, 0x2D, 0x69, 0xFB, 0x01, 0x07, 0xF8, 0xF2, 0x82, 0x86, 0x45, 0x0E, 0x50, 0x00, 0x2F, 0x3F, 0x2C, 0x87, 0xE5, 0x04, 0xFF, 0xFF, 0x20, 0x00, 0xFA, 0x2D, 0xB1, 0x0D, 0x6F, 0x87, 0x76, 0x87, 0x18, 0xEF, 0x00, 0x38, 0x77, 0x77, 0xC2, 0x5F, 0xAE, 0x2B, 0x0F, 0x6B, 0xFF, 0x01, 0xAF, 0x47, 0xCF, 0x4C, 0x6F, 0x26, 0x89, 0x00, 0x3E, 0x47, 0x72, 0x3A, 0x0D, 0xB4, 0x2F, 0x04, 0xF1, 0xFF, 0x7F, 0xF1, 0xA0, 0xB0, 0x2C, 0x0D, 0xF4, 0x87, 0x79, 0x7C, 0x00, 0x60, 0xFB, 0xFF, 0x28, 0x32, 0x00, 0xB0, 0x01, 0x24, 0x07, 0x1E, 0x4F, 0x08, 0x2F, 0x2C, 0x6F, 0x2E, 0xDD, 0xBD, 0xFE, 0xDB, 0x59, 0x00, 0x56, 0xD8, 0x5E, 0x97, 0xA5, 0x37, 0x87, 0x61, 0x00, 0x17, 0x9F, 0x38, 0x93, 0x40, 0xD2, 0x96, 0x9E, 0x7D, 0xDF, 0xFE, 0x28, 0xAF, 0xD0, 0xE1, 0x39, 0xF1, 0x1A, 0xEC, 0x27, 0x87, 0x2F, 0xF7, 0x2F, 0xE3, 0x3F, 0x2B, 0x55, 0x98, 0xBE, 0x04, 0x07, 0x1A, 0xFF, 0xFF, 0x08, 0x4F, 0x09, 0x0E, 0x13, 0xFF, 0x20, 0x4A, 0xBF, 0x22, 0x23, 0x00, 0x22, 0xC3, 0xEF, 0xDE, 0xFF, 0xDD, 0x55, 0x42, 0x60, 0x17, 0xC0, 0x30, 0x1F, 0x49, 0x23, 0xFF, 0xED, 0xFF, 0x00, 0x31, 0x00, 0x64, 0x95, 0x7A, 0xDB, 0x60, 0x37, 0xEE, 0x12, 0x2F, 0x61, 0x50, 0xFD, 0x84, 0xDA, 0x11, 0xFF, 0xBD, 0xFF, 0x69, 0x45, 0xE7, 0x14, 0x6B, 0x86, 0x9B, 0x0F, 0x8E, 0x5E, 0x01, 0x9F, 0x6C, 0x52, 0x00, 0x1C, 0x2A, 0x35, 0xC4, 0x2E, 0xEF, 0x2F, 0x03, 0xAD, 0x00, 0x47, 0x5A, 0x6F, 0xFD, 0x74, 0x8F, 0x4F, 0x9F, 0xB9, 0xFF, 0xDC, 0x4F, 0xFF, 0x28, 0x6C, 0x2B, 0xB2, 0x4F, 0x57, 0x35, 0xBB, 0xFF, 0x2B, 0xAA, 0x2D, 0x64, 0x10, 0x60, 0xB7, 0x32, 0x35, 0xDC, 0x0A, 0x10, 0x00, 0xB4, 0xEC, 0x2F, 0xD7, 0xF9, 0x7B, 0x78, 0xEF, 0x88, 0x68, 0x9F, 0x8B, 0xFF, 0x25, 0xAB, 0x8F, 0x6D, 0xFF, 0x8F, 0x2F, 0x02, 0x00, 0x3F, 0xCD, 0x6C, 0x01, 0xEC, 0xAC, 0xCE, 0x7F, 0x2E, 0xAB, 0xDE, 0x7F, 0xE0, 0x68, 0x7F, 0x9D, 0x2E, 0x04, 0x0E, 0x88, 0xFF, 0xEF, 0xEF, 0x8A, 0xAF, 0x00, 0x8E, 0x47, 0x24, 0xDD, 0x78, 0xDD, 0x77, 0x33, 0x00, 0x11, 0x33, 0x11, 0x8D, 0x7D, 0x13, 0x13, 0x7D, 0xDF, 0x20, 0x03, 0x8A, 0xBF, 0x77, 0x50, 0x17, 0x70, 0x07, 0xFF, 0x49, 0x30, 0x2B, 0xB0, 0x2F, 0xDB, 0xF0, 0x0F, 0x01, 0xB9, 0x7F, 0xA8, 0x6D, 0xEA, 0x7F, 0x7F, 0x10, 0x6F, 0x7F, 0x27, 0xB0, 0xD0, 0x04, 0xA1, 0x00, 0x0D, 0xB0, 0x01, 0x02, 0x60, 0xED, 0x61, 0xFF, 0x2C, 0xFF, 0x1A, 0xBE, 0xFF, 0xF0, 0x3E, 0xB7, 0x00, 0xC0, 0xFF, 0x19, 0x00, 0x21, 0x1D, 0x01, 0x8C, 0x28, 0xFA, 0xCC, 0xFF, 0x3A, 0x3B, 0x92, 0x40, 0x3F, 0x17, 0xFF, 0x46, 0x6B, 0x27, 0x4C, 0x84, 0xFF, 0xE9, 0xBD, 0xB9, 0x3C, 0xB8, 0xFD, 0xF1, 0x23, 0x34, 0x30, 0x62, 0x4C, 0xDA, 0x40, 0x13, 0xF7, 0xFF, 0xF1, 0x20, 0x03, 0x04, 0xEF, 0xFF, 0xE8, 0xFF, 0xE0, 0x20, 0x03, 0xE1, 0xFF, 0x1C, 0xD9, 0xFF, 0xD3, 0x50, 0x95, 0x2E, 0xE1, 0x21, 0x87, 0x57, 0xFF, 0x1A, 0x86, 0xFF, 0xD1, 0x93, 0x69, 0x30, 0x41, 0xFA, 0x31, 0x9F, 0xAC, 0x22, 0xFF, 0xC7, 0x41, 0xA5, 0xD9, 0xFF, 0xE4, 0x50, 0x5B, 0xF6, 0x20, 0xFF, 0xF2, 0x20, 0x5D, 0xFB, 0xFF, 0xEE, 0xFF, 0xEA, 0xAA, 0x2F, 0x23, 0xF5, 0x20, 0x05, 0xE4, 0x23, 0x97, 0xEA, 0x2E, 0x2E, 0xDA, 0x08, 0xFF, 0xDB, 0xFF, 0xD5, 0x2C, 0x6E, 0xC6, 0xFF, 0xD0, 0x02, 0xFF, 0xCB, 0xFF, 0xC1, 0xFF, 0xBC, 0x27, 0xE7, 0xE1, 0xA0, 0x20, 0x11, 0xD2, 0x24, 0x7A, 0xDA, 0xFF, 0xCD, 0xFF, 0xCA, 0x82, 0x20, 0x19, 0xC1, 0xFF, 0xB7, 0xFF, 0xB3, 0x20, 0xFE, 0xBA, 0x0A, 0xFF, 0xAF, 0xFF, 0xAB, 0x05, 0xD1, 0xFF, 0x5F, 0x62, 0x6D, 0x03, 0x28, 0xFF, 0x29, 0x20, 0xC2, 0xC2, 0xE1, 0x7F, 0x05, 0xFF, 0x9F, 0xAD, 0x22, 0x8D, 0x07, 0x21, 0x61, 0xA7, 0x20, 0x9A, 0x5F, 0xE9, 0x8A, 0xD9, 0x48, 0xA8, 0x38, 0x99, 0xFE, 0x41, 0x01, 0xF7, 0x25, 0x34, 0xEA, 0xFF, 0xE0, 0x51, 0x8D, 0xD1, 0x73, 0xF6, 0x80, 0x27, 0xF7, 0xFF, 0xEB, 0x25, 0x56, 0x54, 0xE0, 0x21, 0x1D, 0xE9, 0x21, 0x25, 0xDE, 0x2F, 0x4A, 0xD4, 0xFF, 0x14, 0xD3, 0xFF, 0xC9, 0x2F, 0x52, 0xD3, 0x2B, 0x3D, 0xC9, 0xFF, 0x54, 0xC8, 0x25, 0x49, 0xBD, 0x21, 0x07, 0xFC, 0x27, 0x46, 0xF0, 0xFF, 0x51, 0xE6, 0x20, 0x2D, 0xE2, 0x25, 0x9E, 0xD5, 0xFF, 0xE3, 0x21, 0x95, 0x55, 0xD6, 0x2D, 0xB0, 0xD0, 0x20, 0x21, 0xC3, 0x25, 0x10, 0xDA, 0x21, 0x3B, 0x14, 0xCD, 0xFF, 0xC5, 0x21, 0x4D, 0xC4, 0x25, 0x7B, 0xB6, 0xFF, 0x40, 0xBF, 0x21, 0x3D, 0xB2, 0xFF, 0xAB, 0xFF, 0xB0, 0xFF, 0x05, 0xA9, 0xFF, 0xA3, 0xFF, 0x9C, 0x21, 0x51, 0xC0, 0x22, 0x4A, 0x54, 0xB5, 0x21, 0x53, 0xAE, 0x21, 0xA8, 0xA2, 0x21, 0x59, 0xAA, 0xFF, 0x50, 0xA8, 0x20, 0xC8, 0xA0, 0x2F, 0xE0, 0x95, 0xFF, 0x8C, 0xFF, 0x40, 0xA6, 0x2B, 0x49, 0x9A, 0xFF, 0x92, 0xFF, 0x96, 0xFF, 0x54, 0x8F, 0x25, 0x33, 0x84, 0x20, 0x05, 0x87, 0x22, 0x2C, 0x7C, 0xFF, 0x15, 0x7F, 0xFF, 0x79, 0x2B, 0x43, 0x6E, 0x22, 0x86, 0xB8, 0x20, 0x4B, 0x46, 0xAA, 0x20, 0x53, 0xAD, 0xFF, 0xA4, 0x21, 0x00, 0x30, 0x53, 0x96, 0x2A, 0xFF, 0x90, 0x2B, 0xFF, 0x92, 0x20, 0xFC, 0x85, 0x20, 0x4B, 0xA4, 0x20, 0xFF, 0x9B, 0x20, 0x3D, 0xA0, 0xFF, 0x9D, 0xFF, 0x93, 0x82, 0x20, 0x17, 0x8D, 0xFF, 0x89, 0xFF, 0x80, 0x20, 0x3F, 0x86, 0x28, 0xFF, 0x83, 0x20, 0x41, 0x76, 0x20, 0x0D, 0x83, 0xFF, 0x7D, 0x0A, 0xFF, 0x77, 0xFF, 0x7E, 0x20, 0x4F, 0x72, 0x25, 0x87, 0x72, 0x02, 0xFF, 0x6C, 0xFF, 0x67, 0xFF, 0x62, 0x40, 0x03, 0x5C, 0x00, 0xFF, 0x58, 0xFF, 0x74, 0xFF, 0x70, 0xFF, 0x69, 0x28, 0xFF, 0x65, 0x25, 0xA1, 0x6A, 0x20, 0x15, 0x5F, 0xFF, 0x5E, 0x02, 0xFF, 0x5A, 0xFF, 0x53, 0xFF, 0x50, 0x22, 0x6C, 0x54, 0x0A, 0xFF, 0x4D, 0xFF, 0x4A, 0x00, 0xD3, 0xFF, 0x16, 0x24, 0x1D, 0x6B, 0x35, 0xFF, 0x15, 0x22, 0x66, 0x72, 0xD7, 0x85, 0x2F, 0xA8, 0xED, 0x5F, 0x95, 0x55, 0xF9, 0x2E, 0xCE, 0xF0, 0x94, 0x3F, 0x75, 0x21, 0xBF, 0xD5, 0x84, 0x4D, 0x6A, 0x3D, 0x2F, 0xD0, 0xAF, 0xAC, 0xFD, 0x22, 0xFB, 0xE8, 0x26, 0x3B, 0xE0, 0xAA, 0x2F, 0xE7, 0xF8, 0x2F, 0x06, 0xF1, 0x23, 0x03, 0xD9, 0x23, 0x01, 0xD3, 0xAA, 0x21, 0x7F, 0xF0, 0x28, 0xC8, 0xE6, 0x21, 0x77, 0xD6, 0x23, 0x0F, 0xCC, 0xAA, 0x22, 0xD1, 0xDD, 0x21, 0x89, 0xD5, 0x22, 0xBF, 0xC3, 0x22, 0xF6, 0xBB, 0xAA, 0x22, 0xB1, 0xBF, 0x21, 0x61, 0xB5, 0x22, 0xB1, 0xA8, 0x21, 0x59, 0x9F, 0xAA, 0x22, 0xBB, 0xAB, 0x21, 0x69, 0xA2, 0x21, 0x5F, 0x95, 0x2D, 0x23, 0x8C, 0xAD, 0x42, 0xD5, 0xD2, 0x21, 0x9F, 0xBF, 0x21, 0x95, 0x30, 0x1B, 0xCB, 0x27, 0x21, 0x55, 0xC4, 0x21, 0xA7, 0xB0, 0x21, 0x9D, 0xA9, 0x21, 0x9F, 0xA6, 0x21, 0x7D, 0x55, 0x9E, 0x21, 0x7F, 0x8F, 0x23, 0xA2, 0x87, 0x21, 0x77, 0x96, 0x26, 0xB9, 0xA8, 0x30, 0x0B, 0x7F, 0x21, 0x19, 0x78, 0x21, 0x7F, 0x9E, 0xFF, 0x94, 0xA2, 0x20, 0x01, 0x8A, 0x26, 0xCF, 0x82, 0xFF, 0x81, 0x20, 0x11, 0x8B, 0xB1, 0x20, 0x05, 0x82, 0x20, 0x19, 0x30, 0x1B, 0x6E, 0xFF, 0x66, 0x21, 0xA5, 0x51, 0x71, 0x21, 0x41, 0x68, 0x21, 0x3D, 0x63, 0xFF, 0x60, 0x21, 0x3B, 0x50, 0x66, 0x21, 0x41, 0x5E, 0x2D, 0xBD, 0x57, 0xFF, 0x51, 0xFF, 0x15, 0x4F, 0xFF, 0x48, 0x21, 0xC5, 0x70, 0x20, 0x21, 0x68, 0x80, 0x17, 0x55, 0x6A, 0x20, 0x25, 0x63, 0x21, 0x63, 0x57, 0x20, 0x1D, 0x50, 0x20, 0x1F, 0x10, 0x55, 0xFF, 0x4E, 0x20, 0x01, 0x46, 0xFF, 0x47, 0xFF, 0x05, 0x40, 0xFF, 0x3F, 0xFF, 0x39, 0x20, 0x07, 0x3F, 0x20, 0x09, 0x51, 0x39, 0x20, 0x09, 0x32, 0x20, 0x01, 0x2C, 0xFF, 0x5D, 0x23, 0xF6, 0x60, 0x53, 0x20, 0x23, 0x30, 0x03, 0x49, 0xFF, 0x44, 0xFF, 0x4B, 0x08, 0xFF, 0x45, 0xFF, 0x42, 0x21, 0x3E, 0x40, 0xFF, 0x3C, 0x02, 0xFF, 0x38, 0xFF, 0x34, 0xFF, 0x4A, 0x20, 0x39, 0x41, 0xA8, 0x21, 0x4E, 0x43, 0x20, 0x05, 0x3B, 0x20, 0x11, 0x38, 0xFF, 0x35, 0x00, 0xFF, 0x31, 0xFF, 0x2E, 0xFF, 0x33, 0xFF, 0x30, 0x2A, 0xFF, 0x2B, 0x23, 0x46, 0x3B, 0x20, 0x0F, 0x33, 0x20, 0x0F, 0x30, 0x82, 0x24, 0xD2, 0x2A, 0xFF, 0x26, 0xFF, 0x2D, 0x2B, 0x94, 0x27, 0x80, 0x2D, 0xA5, 0x23, 0xFF, 0x20, 0xFF, 0x1E, 0xFF, 0x1B, 0xA8, 0x23, 0x68, 0x26, 0x40, 0x0B, 0x24, 0x2D, 0xB9, 0x1E, 0xFF, 0x1C, 0x02, 0xFF, 0x1D, 0xFF, 0x1A, 0xFF, 0x18, 0x21, 0xD2, 0x18, 0x8A, 0x24, 0xB8, 0x13, 0xFF, 0x12, 0x33, 0x8B, 0x00, 0x20, 0x36, 0xD2, 0xDA, 0x6B, 0xF6, 0x34, 0x85, 0x00, 0x24, 0x87, 0x64, 0xB3, 0xFA, 0x2C, 0x0B, 0xEA, 0xAA, 0x24, 0x61, 0xE4, 0x24, 0x57, 0xCC, 0x24, 0x59, 0xC6, 0x27, 0xFF, 0xDF, 0xA9, 0x24, 0x75, 0xDA, 0x24, 0x5F, 0xC1, 0x24, 0x4D, 0xBC, 0x00, 0x22, 0xB6, 0x62, 0x00, 0x23, 0x56, 0x43, 0x7B, 0xFE, 0xFF, 0xF2, 0x34, 0xA5, 0x00, 0xD5, 0x23, 0x4E, 0x24, 0xFD, 0xED, 0x2A, 0x35, 0xEA, 0x2C, 0x67, 0xD5, 0x24, 0xE9, 0x55, 0xD2, 0x24, 0x91, 0xB7, 0x24, 0x8F, 0xB2, 0x29, 0x02, 0xCD, 0x24, 0xA5, 0x55, 0xCA, 0x25, 0x7E, 0xAF, 0x24, 0x81, 0xAB, 0x25, 0x86, 0xB0, 0x23, 0x01, 0x55, 0xAA, 0x23, 0x4B, 0x96, 0x23, 0x4D, 0x90, 0x23, 0x5B, 0xA4, 0x23, 0x09, 0x55, 0x9F, 0x2E, 0xFF, 0x8A, 0x23, 0x35, 0x85, 0x22, 0xED, 0x7D, 0x22, 0xE9, 0x55, 0x77, 0x22, 0xDB, 0x67, 0x22, 0xD9, 0x62, 0x22, 0xE7, 0x72, 0x23, 0x39, 0x55, 0x6D, 0x22, 0xE3, 0x5C, 0x22, 0xE5, 0x57, 0x23, 0x6B, 0x9A, 0x23, 0x37, 0x55, 0x96, 0x23, 0x17, 0x80, 0x23, 0x19, 0x7C, 0x23, 0x77, 0x93, 0x23, 0x29, 0x55, 0x90, 0x25, 0x4A, 0x79, 0x23, 0x21, 0x76, 0x22, 0xFF, 0x6A, 0x23, 0x01, 0x55, 0x65, 0x24, 0x7A, 0x53, 0x22, 0xF9, 0x50, 0x28, 0xA9, 0x62, 0x23, 0x09, 0x55, 0x5F, 0x25, 0x6C, 0x4D, 0x23, 0x01, 0x4A, 0x21, 0x7F, 0x53, 0x25, 0x78, 0x51, 0x4E, 0x21, 0x77, 0x42, 0x21, 0x79, 0x3D, 0xFF, 0x52, 0x21, 0x85, 0x55, 0x4E, 0x21, 0x87, 0x40, 0x21, 0x7D, 0x3C, 0x21, 0x7F, 0x3A, 0x21, 0x69, 0x55, 0x35, 0x21, 0x6F, 0x2D, 0x25, 0xA4, 0x28, 0x2E, 0xFD, 0x30, 0x21, 0x65, 0x55, 0x2C, 0x41, 0x53, 0x1E, 0x21, 0x61, 0x1B, 0x21, 0x9F, 0x41, 0x21, 0xDD, 0x55, 0x3D, 0x21, 0xAB, 0x31, 0x21, 0x99, 0x2D, 0x21, 0xA7, 0x3B, 0x21, 0xAF, 0x55, 0x38, 0x21, 0x9F, 0x2B, 0x21, 0xA1, 0x29, 0x24, 0xE8, 0x23, 0x21, 0x95, 0x55, 0x20, 0x21, 0x77, 0x18, 0x21, 0x79, 0x15, 0x21, 0x87, 0x1E, 0x2F, 0x43, 0x55, 0x1C, 0x21, 0x83, 0x13, 0x23, 0x5E, 0x12, 0x2F, 0x4F, 0x1D, 0x40, 0x1B, 0x45, 0x19, 0x23, 0x6C, 0x14, 0xFF, 0x11, 0x26, 0x72, 0x14, 0x23, 0x76, 0x54, 0x11, 0x20, 0x09, 0x0E, 0x20, 0x01, 0x0B, 0x21, 0xA3, 0x10, 0xFF, 0x10, 0x0F, 0xFF, 0x0D, 0x40, 0x03, 0x0B, 0xFF, 0x0A, 0xFF, 0x55, 0x0C, 0x20, 0x03, 0x09, 0x25, 0x24, 0x08, 0x25, 0x28, 0x06, 0x25, 0x32, 0x55, 0x13, 0x20, 0x1D, 0x10, 0x20, 0x1F, 0x0C, 0x20, 0x15, 0x0A, 0x25, 0x3C, 0x55, 0x0F, 0x20, 0x33, 0x0D, 0x20, 0x27, 0x08, 0x20, 0x1D, 0x07, 0x25, 0x52, 0xAB, 0x50, 0x25, 0x04, 0x20, 0x01, 0x03, 0x25, 0x76, 0x02, 0x80, 0x07, 0x50, 0x01, 0x56, 0x01, 0x00, 0xB9, 0x7F, 0x20, 0x2C, 0x1D, 0x03, 0x04, 0xE9, 0x7F, 0x10, 0x04, 0x80, 0x59, 0x30, 0x18, 0xC2, 0xFE, 0xE2, 0x2C, 0x3A, 0x3A, 0x46, 0x20, 0xF8, 0xE9, 0x06, 0xFF, 0x00, 0x95, 0x00, 0xDC, 0x00, 0x3E, 0x2E, 0x03, 0x1F, 0xA9, 0x80, 0x0C, 0xF2, 0x00, 0x10, 0xF9, 0x38, 0xEF, 0x4F, 0x02, 0x50, 0x90, 0x0F, 0xFF, 0xFF, 0xC0, 0xD0, 0x00, 0xDE, 0x98, 0xBF, 0x1B, 0xCB, 0xFF, 0x2F, 0x23, 0xF0, 0xF2, 0x7F, 0x4B, 0xFF, 0x01, 0xCF, 0x27, 0x10, 0x39, 0xE0, 0x2B, 0x80, 0x11, 0xCD, 0x90, 0x00, 0x90, 0x09, 0x08, 0x01, 0x9C, 0x00, 0x00, 0xB2, 0x00, 0x10, 0x0A, 0x0E, 0x90, 0x90, 0x08, 0x08, 0x90, 0x00, 0x80, 0x09, 0xBD, 0x00, 0x20, 0x2D, 0x1E, 0xB1, 0x00, 0x9C, 0x0A, 0x00, 0x01, 0x5B, 0x00, 0x00, 0x13, 0x10, 0x49, 0x00, 0xC3, 0x35, 0xC7, 0x02, 0xBA, 0x40, 0xA2, 0x00, 0x4B, 0x5B, 0xC7, 0x80, 0x5C, 0x4B, 0x13, 0xC5, 0x00, 0x21, 0xAC, 0x41, 0x31, 0xC0, 0xCA, 0x37, 0x13, 0x02, 0x00, 0x06, 0x00, 0x00, 0x0D, 0x7F, 0x30, 0x1F, 0x01, 0x00, 0x3B, 0x01, 0x3C, 0x13, 0x3A, 0x0C, 0x0C, 0xE4, 0x00, 0xC4, 0x0D, 0x8D, 0xC4, 0xB4, 0x01, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x00, 0x3C, 0x3B, 0x00, 0x86, 0x00, 0x04, 0x00, 0x97, 0xD6, 0x11, 0xDA, 0x4F, 0xFF, 0x07, 0x00, 0x00, 0x4B, 0xB7, 0x87, 0x20, 0x00, 0xA7, 0xC6, 0x20, 0x00, 0xCA, 0x1E, 0x3C, 0x4C, 0x4B, 0x1E, 0x08, 0x5C, 0x40, 0xD6, 0x47, 0xD9, 0x60, 0x00, 0x58, 0x00, 0x26, 0x00, 0x00, 0x00, 0x5C, 0xCE, 0x00, 0x41, 0x70, 0x70, 0x0A, 0x00, 0x0A, 0x90, 0xCA, 0x0A, 0x08, 0x4C, 0x3C, 0xC0, 0x04, 0xE1, 0x4C, 0xC8, 0xD0, 0x52, 0x37, 0xFE, 0x21, 0xBC, 0x20, 0x00, 0x0A, 0x36, 0x47, 0x00, 0xB1, 0x22, 0xBB, 0x13, 0x00, 0xA9, 0x7C, 0x49, 0x03, 0xAC, 0x23, 0x3C, 0xA8, 0x00, 0x5B, 0x30, 0x00, 0x99, 0xC1, 0x20, 0xAA, 0x01, 0x04, 0x1C, 0x00, 0x00, 0x1D, 0x1E, 0x28, 0x3E, 0x90, 0x00, 0x02, 0x07, 0x90, 0x90, 0x27, 0xBD, 0x1D, 0x20, 0x0F, 0x1E, 0x85, 0x20, 0x13, 0x90, 0x90, 0x0A, 0x06, 0x20, 0xC7, 0xAC, 0x38, 0x3E, 0x08, 0x01, 0x5D, 0x00, 0xB3, 0x68, 0x41, 0x2B, 0xD4, 0xD0, 0x00, 0xD0, 0x70, 0xD3, 0x6D, 0x10, 0x00, 0x33, 0x8A, 0x0B, 0x0C, 0x08, 0xDD, 0xD9, 0x0F, 0x35, 0xD8, 0x11, 0x49, 0x5C, 0x39, 0x77, 0xAF, 0x89, 0x65, 0x10, 0x60, 0x14, 0x11, 0x30, 0x1C, 0x39, 0x89, 0x22, 0x03, 0xD0, 0x32, 0xB5, 0x80, 0x1F, 0x21, 0x00, 0x50, 0x52, 0xA0, 0x3F, 0x22, 0x69, 0xBC, 0x20, 0x00, 0x40, 0x3F, 0xEF, 0x77, 0x5A, 0xA0, 0x1D, 0xC0, 0x5F, 0x31, 0x89, 0xFA, 0xA0, 0x81, 0xC0, 0x5F, 0x7A, 0x1B, 0x93, 0x00, 0x70, 0x5F, 0x20, 0xB0, 0x3A, 0x42, 0x7C, 0x09, 0x00, 0x40, 0xBF, 0xC0, 0xF6, 0xA0, 0x0C, 0x2A, 0x65, 0x40, 0x43, 0x37, 0x30, 0xE3, 0xFF, 0x20, 0xF9, 0x00, 0xB7, 0xFF, 0xFF, 0xAF, 0xCF, 0x03, 0xD1, 0xF8, 0x02, 0xFF, 0x7F, 0xFE, 0xFF, 0x0C, 0x05, 0x23, 0xB6, 0x50, 0x80, 0x23, 0x34, 0x80, 0xED, 0xFF, 0xEE, 0xFF, 0x79, 0x00, 0x14, 0x77, 0x00, 0xEE, 0x20, 0x07, 0x77, 0x20, 0x07, 0x00, 0xAA, 0x02, 0x00, 0x07, 0xFF, 0xFF, 0x3F, 0xCF, 0x2B, 0x90, 0xA5, 0x0C, 0x00, 0x00, 0xF9, 0xF8, 0x70, 0x17, 0x80, 0x1F, 0x4A, 0x00, 0x00, 0xA0, 0x6F, 0x6F, 0xF0, 0x30, 0x00, 0x9B, 0x00, 0x0F, 0x00, 0xEF, 0x23, 0x00, 0x80, 0x37, 0x80, 0x3F, 0xEA, 0x05, 0x00, 0x30, 0x1F, 0x17, 0x80, 0xE8, 0xAB, 0x59, 0xF7, 0x59, 0x00, 0x60, 0x3F, 0x52, 0x72, 0x4B, 0xF4, 0xC0, 0x00, 0xE0, 0x5F, 0x00, 0x90, 0x7F, 0xA2, 0x00, 0x6A, 0xF4, 0xF3, 0x9F, 0x54, 0x8F, 0x90, 0xBF, 0xDE, 0x20, 0xDF, 0x97, 0xDC, 0x48, 0x01, 0x20, 0x00, 0x10, 0x7B, 0xFF, 0x02, 0xAF, 0xFC, 0x30, 0xFF, 0x40, 0xFA, 0x39, 0xE3, 0x4E, 0xFF, 0x00, 0x04, 0x00, 0x65, 0x00, 0x50, 0x01, 0xA9, 0x88, 0x05, 0x04, 0xFF, 0xF6, 0x04, 0x1E, 0x8F, 0xB0, 0x50, 0xEF, 0x00, 0x4A, 0x9F, 0x01, 0x05, 0x96, 0x08, 0x3C, 0x8F, 0x70, 0x90, 0x25, 0x04, 0x70, 0xA1, 0xFA, 0x43, 0xB8, 0xFF, 0x19, 0xEF, 0x02, 0x00, 0x20, 0xC5, 0x2A, 0xD9, 0x80, 0x80, 0x30, 0x03, 0x01, 0xFF, 0xFE, 0x05, 0x0B, 0xF8, 0xE1, 0x6F, 0x2B, 0x97, 0x02, 0x80, 0x90, 0x00, 0x05, 0x60, 0x00, 0x2F, 0x66, 0xB6, 0x00, 0xFF, 0xFF, 0x25, 0x06, 0x06, 0x1F, 0xF8, 0xF8, 0x11, 0x9F, 0xF8, 0xF7, 0x2F, 0x73, 0x06, 0x07, 0xBB, 0x21, 0x06, 0x20, 0xD0, 0x40, 0x3B, 0xBB, 0xB8, 0x00, 0x6F, 0x6F, 0x70, 0x00, 0xF0, 0x6F, 0x6F, 0xE0, 0xE0, 0x68, 0xDF, 0x50, 0x04, 0xA0, 0xDF, 0xDF, 0x90, 0x90, 0x20, 0x0B, 0xF0, 0x4B, 0x10, 0x00, 0xB0, 0x00, 0x20, 0x0B, 0xA0, 0x9B, 0x00, 0x70, 0x00, 0x00, 0x89, 0xFF, 0xB6, 0x8D, 0xFF, 0xFF, 0x04, 0x00, 0x03, 0xAD, 0xFD, 0x23, 0x2F, 0xF3, 0xF3, 0x9F, 0x48, 0xAF, 0x20, 0x0B, 0x04, 0xBB, 0x2D, 0xB5, 0xF3, 0xF3, 0xAF, 0x00, 0xBF, 0xB2, 0x00, 0x8B, 0x00, 0xE8, 0xB0, 0xFF, 0x00, 0xEF, 0xC0, 0xC0, 0xFF, 0xFF, 0x49, 0x10, 0x81, 0x18, 0xFD, 0x90, 0xC1, 0x2B, 0x9B, 0x20, 0x0B, 0x90, 0x00, 0xBB, 0x02, 0x00, 0xA0, 0x21, 0xFF, 0xFF, 0x01, 0x25, 0x96, 0xCC, 0x00, 0x07, 0x7C, 0xFA, 0x68, 0xAC, 0xFB, 0x89, 0x00, 0x00, 0x0A, 0x95, 0xFA, 0x5F, 0x48, 0xF8, 0xF9, 0x03, 0x00, 0x06, 0x72, 0xFA, 0xBD, 0x21, 0x9D, 0x01, 0x17, 0x00, 0x0D, 0xF9, 0xF9, 0x01, 0x00, 0xB7, 0x00, 0x58, 0x00, 0xDF, 0xDB, 0xD8, 0x4F, 0x3F, 0x30, 0x20, 0x3A, 0x00, 0xFF, 0x00, 0x03, 0xFF, 0xFF, 0x38, 0x6A, 0x4F, 0x08, 0x4F, 0x20, 0x30, 0x3B, 0x2E, 0x19, 0xFF, 0xFF, 0x4A, 0x20, 0x0B, 0xBB, 0x2E, 0x18, 0x70, 0xFA, 0xCC, 0x5E, 0xFF, 0x00, 0xFF, 0x09, 0x08, 0xFA, 0xFA, 0x8F, 0x8F, 0xF3, 0x00, 0xF3, 0x8F, 0x7F, 0xFF, 0xFC, 0x08, 0x3D, 0x91, 0x00, 0x00, 0xDD, 0x00, 0xF3, 0xF9, 0x8F, 0x9F, 0xBA, 0x00, 0x00, 0x6B, 0x00, 0x00, 0xB0, 0xC7, 0xAF, 0xF4, 0x00, 0xF7, 0x6F, 0x7F, 0xDC, 0x70, 0x19, 0xDF, 0x30, 0x00, 0x30, 0xFF, 0xFF, 0xF5, 0xC0, 0x6F, 0x9F, 0x10, 0x00, 0x00, 0xD8, 0x00, 0x30, 0x60, 0xFF, 0xEF, 0xDB, 0x09, 0x12, 0x2A, 0x00, 0x31, 0x2E, 0x70, 0x09, 0x0C, 0x36, 0x5C, 0x01, 0xFF, 0xFE, 0x00, 0x10, 0xFD, 0xFF, 0x09, 0x5B, 0xEB, 0x10, 0x40, 0x40, 0xB0, 0x20, 0x2B, 0xFF, 0x9F, 0x1E, 0x08, 0xA8, 0x24, 0x37, 0x09, 0xAE, 0x7F, 0x05, 0x09, 0xE4, 0x31, 0x40, 0x00, 0xFF, 0x40, 0xE4, 0x3F, 0x49, 0x9F, 0xFF, 0x02, 0xBF, 0xFA, 0x30, 0x3B, 0xFF, 0xC8, 0x00, 0x0F, 0x49, 0x23, 0xFC, 0x24, 0x02, 0xEE, 0x24, 0x02, 0x40, 0x07, 0xFD, 0xC5, 0xFA, 0x3F, 0x7B, 0x60, 0x17, 0x70, 0x1F, 0x00, 0x05, 0x7A, 0x09, 0x90, 0x1F, 0x87, 0xD0, 0xBF, 0x80, 0x56, 0xF1, 0x20, 0xFB, 0xF9, 0xFF, 0xFF, 0x8C, 0xAF, 0x08, 0x03, 0xFF, 0x5E, 0x04, 0x10, 0x16, 0x4D, 0xE6, 0x43, 0x4C, 0x49, 0x08, 0x4D, 0xFF, 0xFE, 0x14, 0x2F, 0xFF, 0x02, 0x02, 0x28, 0xC2, 0x29, 0x6A, 0x39, 0x87, 0x69, 0x6D, 0x61, 0x67, 0x39, 0x75, 0x80, 0xA0, 0x27, 0xBE, 0x0D, 0x67, 0x0F, 0x6C, 0x1E, 0xCE, 0x25, 0x67, 0x00, 0xD5, 0x3B, 0x50, 0x41, 0x4B, 0x55, 0x53, 0xBB, 0x00, 0xB5, 0xA2, 0xE7, 0x03, 0x3F, 0x61, 0x30, 0xD2, 0x00, 0x45, 0x8F, 0x3B, 0x58, 0x49, 0xCA, 0xF6, 0xA4, 0x00, 0x24, 0x2D, 0x95, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -static const unsigned char iQue_with_ISBN_LZ[0x2000] = -{ - 0x11, 0x48, 0x70, 0x00, 0x00, 0x64, 0x61, 0x72, 0x63, 0xFF, 0xFE, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x28, 0x70, 0x00, 0x00, 0x83, 0x30, 0x09, 0x1C, 0x04, 0x00, 0x00, 0x40, 0x20, 0x03, 0x30, 0x13, 0xAB, 0x30, 0x18, 0x15, 0x20, 0x1D, 0x02, 0xA0, 0x0B, 0x06, 0x20, 0x2B, 0x30, 0x18, 0x5A, 0x09, 0x20, 0x35, 0x10, 0x20, 0x39, 0x30, 0x2B, 0x48, 0x20, 0x29, 0x54, 0x82, 0x20, 0x45, 0xA0, 0x05, 0x00, 0x00, 0x30, 0x20, 0x35, 0x98, 0xAA, 0x20, 0x51, 0xE0, 0x20, 0x28, 0x3C, 0x20, 0x41, 0xDC, 0x20, 0x5D, 0x20, 0x07, 0x08, 0x00, 0x00, 0xCC, 0x0C, 0x20, 0x07, 0x30, 0x51, 0x20, 0x50, 0x50, 0x54, 0x20, 0x0B, 0x64, 0x20, 0x5D, 0x60, 0x21, 0x00, 0x00, 0x4C, 0x4C, 0x20, 0x5C, 0xA8, 0x01, 0x50, 0x53, 0x20, 0x22, 0x00, 0xB2, 0x82, 0x20, 0x75, 0xC0, 0x23, 0x00, 0x00, 0x94, 0x20, 0x2F, 0xE2, 0xB3, 0x30, 0x23, 0x30, 0x20, 0x47, 0x20, 0x68, 0x12, 0x02, 0x50, 0x77, 0x30, 0x8F, 0x41, 0x1C, 0x20, 0x90, 0x00, 0x41, 0x00, 0x00, 0x28, 0x20, 0xAB, 0x4E, 0x3E, 0x20, 0x9C, 0x80, 0x45, 0x20, 0x0B, 0x30, 0x4F, 0x30, 0x17, 0x47, 0xAD, 0x50, 0x17, 0x82, 0x30, 0x17, 0x4B, 0x20, 0x23, 0x20, 0x7B, 0xA4, 0x30, 0x2F, 0xAA, 0x20, 0xA0, 0xA8, 0x20, 0xE9, 0xC4, 0x30, 0x3B, 0x55, 0x50, 0x17, 0xDC, 0xB5, 0x30, 0x3B, 0x5D, 0x20, 0x47, 0x20, 0xE0, 0xF4, 0x30, 0x53, 0x60, 0x20, 0x53, 0x90, 0x30, 0xD4, 0x00, 0x2E, 0x21, 0x13, 0x61, 0x00, 0x6E, 0x00, 0x14, 0x69, 0x00, 0x6D, 0x21, 0x1D, 0x4E, 0x20, 0x07, 0x6E, 0x00, 0x10, 0x74, 0x00, 0x65, 0x20, 0x11, 0x64, 0x00, 0x6F, 0x00, 0x51, 0x4C, 0x20, 0x03, 0x67, 0x20, 0x07, 0x5F, 0x00, 0x44, 0x20, 0x03, 0x41, 0x30, 0x20, 0x01, 0x5F, 0x00, 0x53, 0x00, 0x63, 0x40, 0x1F, 0x05, 0x65, 0x00, 0x4F, 0x00, 0x75, 0x20, 0x2B, 0x41, 0x20, 0x43, 0x5A, 0x62, 0x20, 0x13, 0x6C, 0x40, 0x47, 0x02, 0x50, 0x43, 0x42, 0x03, 0x20, 0x43, 0x43, 0xBE, 0x01, 0x80, 0x87, 0x55, 0x03, 0x20, 0xCB, 0x00, 0x90, 0x43, 0x01, 0x90, 0xCB, 0x00, 0x90, 0x87, 0xF0, 0xCB, 0x62, 0xBF, 0x21, 0x5D, 0x79, 0x21, 0x97, 0x01, 0x31, 0xA1, 0x71, 0x8D, 0x00, 0xF0, 0x2F, 0x71, 0x05, 0xD0, 0x2F, 0x55, 0x74, 0x42, 0x09, 0x67, 0x23, 0x29, 0x33, 0x22, 0x01, 0x73, 0xA2, 0x01, 0xEA, 0xB0, 0x5B, 0x52, 0x2D, 0x00, 0x10, 0x21, 0x31, 0x01, 0x00, 0x21, 0x32, 0x01, 0x00, 0x43, 0x33, 0xA8, 0xE0, 0x65, 0x4C, 0x23, 0x71, 0x4D, 0x22, 0xA3, 0x73, 0x00, 0x6B, 0xFA, 0x00, 0x40, 0x85, 0x30, 0x1F, 0x00, 0xB0, 0x17, 0xF0, 0x93, 0xF2, 0xE3, 0x5F, 0x20, 0xB5, 0x32, 0x00, 0x00, 0x38, 0x00, 0x78, 0x00, 0x36, 0x00, 0x34, 0xC0, 0xE0, 0xE1, 0x70, 0x02, 0x43, 0x4C, 0x41, 0x4E, 0xFF, 0xFE, 0x58, 0x14, 0x34, 0x21, 0x02, 0x34, 0x03, 0x33, 0x96, 0x70, 0x61, 0x74, 0x34, 0x31, 0x3C, 0x64, 0x3E, 0x34, 0x59, 0x28, 0x33, 0x73, 0xFF, 0xFF, 0x40, 0xFF, 0x34, 0x4C, 0x53, 0x63, 0x65, 0x6E, 0x65, 0x4F, 0x20, 0x75, 0x74, 0x23, 0xBA, 0x00, 0x47, 0x5F, 0x41, 0x5F, 0x60, 0x30, 0x23, 0xDB, 0xB0, 0x01, 0x70, 0x61, 0x69, 0x31, 0xF8, 0xCA, 0x24, 0x8D, 0x50, 0x3F, 0x03, 0x00, 0x30, 0x59, 0x20, 0x24, 0x9D, 0x6C, 0xA0, 0x24, 0xA1, 0xAC, 0x24, 0xA5, 0x50, 0x5F, 0x4E, 0x69, 0x6E, 0x0E, 0x4C, 0x6F, 0x67, 0x6F, 0xA0, 0x39, 0x34, 0xA4, 0x34, 0xC1, 0x43, 0x11, 0x4C, 0x56, 0x43, 0x74, 0x43, 0x00, 0x10, 0x02, 0x40, 0x8B, 0xE4, 0x40, 0x0B, 0xD0, 0x61, 0x24, 0x35, 0x7F, 0x43, 0x34, 0xF0, 0x4E, 0x5F, 0x0E, 0x52, 0x6F, 0x6F, 0x74, 0xD0, 0x82, 0x00, 0x70, 0x4B, 0x80, 0x57, 0x00, 0x61, 0x20, 0x20, 0x3B, 0x70, 0x3F, 0x49, 0x53, 0x42, 0x4E, 0xD0, 0xBF, 0xFE, 0x02, 0x70, 0x8B, 0x00, 0x70, 0x03, 0xB1, 0x5F, 0x35, 0x57, 0xB1, 0x5F, 0x25, 0x32, 0x81, 0x5F, 0x00, 0x35, 0x00, 0x1E, 0x45, 0xAC, 0x71, 0x5F, 0x42, 0x41, 0x5F, 0x42, 0x00, 0x41, 0x5F, 0x73, 0xE0, 0x80, 0x2D, 0x91, 0x5F, 0x24, 0xF6, 0x00, 0xA0, 0x01, 0xE1, 0x5F, 0x91, 0x13, 0x2F, 0x34, 0xC2, 0x02, 0xD1, 0x53, 0xC8, 0x20, 0xAE, 0x02, 0x11, 0x53, 0x00, 0x30, 0x7F, 0x00, 0xB1, 0x3F, 0xF7, 0x36, 0x8B, 0xB2, 0x9F, 0x31, 0xD5, 0x72, 0x9F, 0x65, 0x23, 0xD1, 0xB2, 0x9F, 0x32, 0x20, 0x15, 0x47, 0x5F, 0x43, 0x00, 0x42, 0x9F, 0xEC, 0x27, 0x2D, 0x0F, 0xE2, 0x9F, 0xE6, 0x31, 0x3F, 0x01, 0xF2, 0x9F, 0x92, 0x53, 0x12, 0xC3, 0x02, 0x32, 0x93, 0x92, 0xDF, 0x80, 0x5F, 0xBF, 0x92, 0x47, 0x60, 0x33, 0x5A, 0x47, 0xBC, 0x02, 0x51, 0x4B, 0x90, 0x8B, 0xF3, 0xDF, 0xDA, 0x37, 0xBF, 0x03, 0x33, 0xDF, 0x7C, 0x28, 0x07, 0x54, 0x1F, 0x0D, 0x43, 0xDF, 0x48, 0xAB, 0x28, 0x7D, 0xB0, 0x28, 0x81, 0xA4, 0x28, 0x6D, 0x24, 0x28, 0x68, 0x37, 0xAB, 0x05, 0x30, 0x03, 0x00, 0x00, 0xBC, 0x20, 0x03, 0x24, 0x28, 0x8B, 0x54, 0x88, 0x28, 0x53, 0xEC, 0x28, 0x74, 0xB0, 0x28, 0x43, 0x74, 0x0A, 0x0B, 0x00, 0x00, 0x78, 0x0B, 0x33, 0xBB, 0x57, 0x00, 0x04, 0x3B, 0x38, 0x12, 0xA5, 0x34, 0x2B, 0x44, 0x44, 0x97, 0x50, 0x41, 0x84, 0x0B, 0x02, 0xF3, 0xBF, 0xC5, 0x74, 0xBB, 0x01, 0x13, 0xE3, 0x50, 0x5F, 0x33, 0x00, 0x80, 0x67, 0xB8, 0x60, 0x67, 0xD6, 0x20, 0xAA, 0x44, 0xA7, 0x38, 0x29, 0x45, 0x68, 0x60, 0x6F, 0x94, 0x7B, 0xA0, 0x96, 0x28, 0xA5, 0xA0, 0x40, 0x28, 0xA1, 0xBE, 0x25, 0x19, 0x23, 0x96, 0xA0, 0x4C, 0xC0, 0x49, 0x59, 0x06, 0x02, 0x24, 0xDD, 0x90, 0x23, 0x33, 0x33, 0x02, 0xB3, 0x3F, 0xFC, 0x2D, 0xEC, 0xBC, 0x70, 0x0B, 0x0A, 0x32, 0xD7, 0x23, 0x20, 0x0B, 0x30, 0x2F, 0x80, 0x3F, 0x49, 0x89, 0x07, 0xF1, 0x01, 0xD0, 0x2F, 0xF5, 0x0B, 0xB0, 0x6B, 0x39, 0xEC, 0x40, 0x9D, 0x1C, 0x30, 0x97, 0xBF, 0x62, 0x2B, 0xCC, 0x20, 0x9F, 0x30, 0x9B, 0x70, 0xF3, 0x25, 0x63, 0xE5, 0x99, 0x71, 0x5B, 0x70, 0x50, 0xF1, 0x5B, 0x2A, 0x19, 0xD5, 0x67, 0x70, 0xC1, 0xCD, 0xCC, 0x53, 0xCC, 0x20, 0xEB, 0x20, 0x24, 0x82, 0xF8, 0xC1, 0x00, 0x31, 0x67, 0x00, 0x15, 0x97, 0xE6, 0x30, 0x7F, 0x30, 0x2F, 0x71, 0x73, 0x44, 0x73, 0xF6, 0x18, 0x01, 0x90, 0x7F, 0x3C, 0x51, 0xC2, 0x20, 0x7F, 0x3E, 0x02, 0xD0, 0x7F, 0x52, 0x65, 0x64, 0x01, 0x70, 0xFF, 0xC2, 0xC1, 0xEB, 0x46, 0x1F, 0xC2, 0xB7, 0x6D, 0xDB, 0x20, 0x7F, 0x8C, 0xBA, 0x25, 0x82, 0x20, 0x00, 0x40, 0xFF, 0x91, 0xF7, 0xB6, 0xFB, 0x5C, 0x85, 0x03, 0x00, 0x20, 0x00, 0xB4, 0x35, 0xBE, 0x00, 0x92, 0x24, 0xE9, 0xC0, 0xAD, 0x60, 0x8B, 0x31, 0x00, 0x32, 0xE7, 0x5C, 0x00, 0x22, 0xE7, 0x92, 0x53, 0xF0, 0x2B, 0x1D, 0x7F, 0x20, 0x25, 0x97, 0x90, 0x0B, 0x50, 0x97, 0x35, 0x6B, 0x00, 0x50, 0x97, 0x97, 0x2F, 0x30, 0x3B, 0xAF, 0x77, 0xE4, 0xAA, 0xF1, 0x17, 0x32, 0x02, 0x13, 0x73, 0x32, 0xF7, 0x50, 0x8B, 0x00, 0x97, 0x57, 0xF9, 0x33, 0x1B, 0x58, 0x58, 0x00, 0x31, 0x7F, 0x3C, 0x70, 0x57, 0xE3, 0x54, 0x53, 0x2C, 0x4A, 0xB7, 0x48, 0x53, 0x4C, 0x38, 0x6B, 0x2C, 0xB9, 0x94, 0x63, 0x8B, 0x3C, 0x67, 0x3C, 0xB1, 0x61, 0x24, 0x4C, 0xB5, 0x00, 0x01, 0x97, 0xC0, 0x39, 0x8E, 0xE3, 0x28, 0x96, 0xE8, 0x51, 0x5B, 0x5C, 0xDD, 0x01, 0x20, 0x23, 0x03, 0xF8, 0x47, 0x40, 0x41, 0x9E, 0x11, 0x15, 0x8D, 0xBD, 0x31, 0xA3, 0x9A, 0x99, 0xB9, 0x23, 0xD7, 0xAA, 0x2D, 0x3A, 0x04, 0x01, 0x10, 0x23, 0x01, 0x01, 0x20, 0x8F, 0x01, 0x01, 0x20, 0x8F, 0x01, 0xAD, 0x00, 0x10, 0x8F, 0xC1, 0x20, 0x8F, 0x3D, 0x60, 0x8F, 0x44, 0x5B, 0x01, 0x00, 0x10, 0x8F, 0x82, 0x00, 0x00, 0x23, 0x50, 0x5F, 0x42, 0x6C, 0x6B, 0x03, 0xE1, 0x63, 0x9A, 0x03, 0x99, 0x19, 0xC0, 0x0E, 0x74, 0xDA, 0x00, 0xC1, 0x63, 0x00, 0x40, 0x23, 0xFE, 0x04, 0x61, 0x63, 0x00, 0x30, 0x8F, 0xF1, 0x63, 0x00, 0x40, 0x23, 0x03, 0x81, 0x63, 0x00, 0x13, 0xBB, 0x00, 0x32, 0xC7, 0x58, 0xAB, 0x2F, 0x7D, 0x88, 0x66, 0x4F, 0xE8, 0x2F, 0x89, 0x18, 0x2F, 0x75, 0x3F, 0x4F, 0x7D, 0x78, 0x62, 0xC7, 0xE3, 0xD3, 0x56, 0x3F, 0x60, 0x0B, 0x52, 0xD3, 0xF0, 0xC2, 0xD3, 0xEE, 0x01, 0xC0, 0x2F, 0x22, 0xDF, 0xD4, 0x33, 0x40, 0x68, 0x3F, 0x50, 0x0B, 0x52, 0xEB, 0xF0, 0xFF, 0xC2, 0xEB, 0x01, 0xB0, 0x2F, 0x32, 0xF7, 0x01, 0xB0, 0xBF, 0x33, 0x03, 0x01, 0xC0, 0x2F, 0x00, 0x10, 0xBF, 0x46, 0x73, 0xFF, 0x70, 0x0B, 0x53, 0x1B, 0x40, 0xBF, 0x83, 0x1B, 0x01, 0xB0, 0x2F, 0x63, 0x27, 0x03, 0xC1, 0xC3, 0x33, 0x27, 0xFF, 0x75, 0x97, 0x93, 0x33, 0x00, 0x91, 0xC3, 0x01, 0x00, 0x2F, 0x05, 0xE1, 0xC3, 0x00, 0xF0, 0xBF, 0xF1, 0xC3, 0x01, 0x00, 0x2F, 0xFF, 0x05, 0x01, 0xC3, 0x00, 0x16, 0xB7, 0x00, 0x36, 0x4F, 0x35, 0xCC, 0x33, 0x8B, 0x36, 0x53, 0x33, 0x8F, 0x3D, 0x0F, 0xBF, 0x39, 0xE3, 0xD0, 0x6A, 0x5D, 0xE6, 0xCF, 0x59, 0xC7, 0x26, 0x43, 0x00, 0x40, 0x17, 0x26, 0x37, 0xFF, 0xD6, 0xFF, 0x63, 0x57, 0x26, 0x2B, 0x00, 0x30, 0x17, 0x36, 0x1F, 0x00, 0x30, 0x5F, 0x36, 0x13, 0x00, 0x40, 0x17, 0xFF, 0x00, 0x10, 0x5F, 0x49, 0x6B, 0x35, 0xFB, 0x00, 0x30, 0x17, 0x65, 0xEF, 0x03, 0xC1, 0x03, 0x82, 0xC7, 0xE1, 0x03, 0xFE, 0x82, 0xDF, 0x02, 0xE1, 0x03, 0x73, 0x27, 0xF1, 0x03, 0x80, 0x17, 0x01, 0xE1, 0x03, 0x00, 0xFF, 0x5F, 0x54, 0xDD, 0xEC, 0xDF, 0x02, 0x7F, 0x5F, 0x04, 0x2F, 0xF4, 0x5F, 0x8D, 0xDC, 0xDF, 0x50, 0x2F, 0xBF, 0x55, 0xB8, 0x2F, 0xC3, 0x20, 0x2F, 0xC4, 0xA0, 0x2F, 0xC8, 0x2C, 0x2C, 0xE3, 0x54, 0xAC, 0x2C, 0xE7, 0x10, 0x2C, 0xDF, 0x74, 0x2C, 0xDF, 0xD8, 0x07, 0xBF, 0x2D, 0x17, 0x09, 0x2F, 0x87, 0x2C, 0xE3, 0x02, 0x9C, 0xDF, 0x3F, 0x4B, 0x00, 0xFC, 0xDF, 0x9F, 0x6F, 0xAF, 0x00, 0xBC, 0xDF, 0x7C, 0xEC, 0xDF, 0x2C, 0x6D, 0x5B, 0xDD, 0x4F, 0x4C, 0xE3, 0x8C, 0xD3, 0xFF, 0xD0, 0x17, 0x9C, 0xBB, 0x00, 0x30, 0x17, 0x00, 0x9F, 0xCF, 0x3F, 0xFF, 0x01, 0x1C, 0x8B, 0x00, 0x0D, 0xE7, 0xC3, 0xA3, 0x7E, 0xA0, 0x2C, 0x7B, 0x00, 0x5C, 0x7F, 0xD0, 0x23, 0x01, 0x1C, 0x73, 0x03, 0xD0, 0x67, 0x02, 0x7C, 0x5B, 0x70, 0xDF, 0x2B, 0xCB, 0x7C, 0x5B, 0x20, 0x3B, 0xDB, 0x00, 0xED, 0x5B, 0x3E, 0x67, 0x7F, 0xC7, 0x5B, 0xCF, 0xDF, 0x00, 0xFC, 0x4F, 0x00, 0xDC, 0xDB, 0xF0, 0x2D, 0xCB, 0x80, 0x7F, 0x01, 0x2C, 0xDB, 0x30, 0x2F, 0x7F, 0xFB, 0x7F, 0xC8, 0x2F, 0x03, 0x7C, 0xDB, 0x5B, 0xE7, 0xAC, 0xDB, 0x00, 0x4C, 0x4F, 0x03, 0x3D, 0x67, 0x00, 0x1E, 0x67, 0xFF, 0xDD, 0x67, 0x04, 0x1C, 0x67, 0x41, 0xA3, 0x79, 0x93, 0x9D, 0x43, 0xCC, 0x67, 0x00, 0x60, 0x23, 0xCC, 0x67, 0xFF, 0x31, 0xEB, 0x89, 0x7B, 0x28, 0x2F, 0x00, 0x3C, 0x67, 0x00, 0x50, 0x23, 0xDC, 0x67, 0x00, 0x50, 0x8F, 0xDC, 0x67, 0xFE, 0x00, 0x60, 0x23, 0x00, 0x10, 0x8F, 0x79, 0x4B, 0x30, 0x8F, 0x00, 0x2C, 0x67, 0x00, 0x50, 0x23, 0x04, 0x1C, 0x67, 0x70, 0x7F, 0xC2, 0xA9, 0x33, 0x00, 0x81, 0x63, 0x00, 0x40, 0x23, 0x04, 0x61, 0x63, 0x00, 0x30, 0x8F, 0xF1, 0x63, 0x00, 0x40, 0x23, 0xFF, 0x03, 0x81, 0x63, 0x01, 0x5C, 0x67, 0x01, 0x9F, 0x2F, 0x43, 0xEB, 0x6F, 0x2F, 0x9F, 0x97, 0xDF, 0x2F, 0x00, 0x60, 0x23, 0xFF, 0xCF, 0x2F, 0x34, 0x33, 0x7F, 0x2F, 0x38, 0x2F, 0x00, 0x3F, 0x2F, 0x00, 0x50, 0x23, 0xDF, 0x2F, 0x00, 0x50, 0x8F, 0xFF, 0xDF, 0x2F, 0x00, 0x60, 0x23, 0x00, 0x10, 0x8F, 0x6F, 0x2F, 0x40, 0x8F, 0x00, 0x2F, 0x2F, 0x00, 0x50, 0x23, 0x01, 0x7C, 0x07, 0xFF, 0x01, 0xB1, 0x63, 0x9F, 0x2F, 0x00, 0x91, 0x63, 0x00, 0x40, 0x23, 0x04, 0x61, 0x63, 0x00, 0x30, 0x8F, 0xF1, 0x63, 0x00, 0x40, 0x23, 0xFF, 0x03, 0x81, 0x63, 0x01, 0x5B, 0xA7, 0x01, 0x95, 0x8F, 0x46, 0x27, 0x6F, 0x23, 0x9F, 0xDF, 0xD5, 0x8F, 0x00, 0x60, 0x23, 0xFF, 0xC5, 0x8F, 0x4F, 0xDF, 0x6F, 0x0B, 0x4F, 0xDF, 0x00, 0x25, 0x8F, 0x00, 0x50, 0x23, 0xD5, 0x8F, 0x00, 0x50, 0x8F, 0xFF, 0xD5, 0x8F, 0x00, 0x60, 0x23, 0x00, 0x10, 0x8F, 0x6E, 0xDB, 0x40, 0x8F, 0x00, 0x25, 0x8F, 0x00, 0x50, 0x23, 0x01, 0x7C, 0x07, 0xFF, 0x01, 0xB1, 0x63, 0x9E, 0xC3, 0x00, 0x91, 0x63, 0x00, 0x40, 0x23, 0x04, 0x61, 0x63, 0x00, 0x30, 0x8F, 0xF1, 0x63, 0x00, 0x40, 0x23, 0xDE, 0x03, 0x61, 0x63, 0x00, 0x7C, 0x5F, 0x4C, 0x2C, 0x5C, 0xBC, 0x5F, 0x3E, 0x51, 0x7C, 0x5F, 0x65, 0x31, 0x00, 0x73, 0xCC, 0x5F, 0x3B, 0x9C, 0x47, 0x5F, 0x43, 0x00, 0x4C, 0x5F, 0x5E, 0xFC, 0x2E, 0xBB, 0x0F, 0x5B, 0x58, 0x4C, 0x5F, 0x3C, 0x82, 0x3B, 0xAB, 0xBC, 0xAA, 0x2F, 0xFF, 0xFC, 0x2F, 0xF8, 0x3C, 0x2E, 0xDB, 0x7C, 0x2E, 0xDF, 0xBC, 0xF9, 0x2E, 0xE3, 0x00, 0x3C, 0x47, 0x3E, 0xC7, 0x5E, 0xFB, 0x00, 0x7A, 0x3B, 0x80, 0xBF, 0x9A, 0x3B, 0x7B, 0x60, 0x88, 0xC7, 0x00, 0x3C, 0x2B, 0x00, 0x70, 0x4B, 0x9F, 0x2B, 0xCA, 0x2A, 0xB7, 0x00, 0x9B, 0xCB, 0xBE, 0x01, 0x10, 0x3F, 0xF2, 0xA0, 0x3F, 0x00, 0x1B, 0xA3, 0x01, 0xD0, 0x3F, 0x00, 0x29, 0xEF, 0x01, 0x00, 0xBF, 0x8E, 0xF7, 0x2B, 0x77, 0x70, 0xFF, 0x00, 0x27, 0x67, 0x01, 0x00, 0xFF, 0x24, 0xF0, 0x3F, 0xDF, 0x83, 0x01, 0x01, 0x3F, 0x65, 0x30, 0x00, 0x8E, 0xBB, 0x5E, 0xBF, 0x59, 0x54, 0x7E, 0xBF, 0x94, 0x2F, 0xF4, 0x86, 0x3E, 0x1F, 0x6C, 0x79, 0x74, 0x31, 0x3E, 0xD1, 0x4A, 0x9E, 0x00, 0x40, 0xA0, 0x2D, 0xE7, 0x70, 0x43, 0x74, 0x78, 0x6C, 0x31, 0xD8, 0x3F, 0xDF, 0x3F, 0xBF, 0x04, 0x2F, 0xFF, 0x2D, 0x55, 0x74, 0x65, 0x6E, 0x00, 0x64, 0x6F, 0x5F, 0x31, 0x32, 0x38, 0x78, 0x36, 0x01, 0x34, 0x2E, 0x62, 0x63, 0x6C, 0x69, 0x6D, 0x2F, 0xFF, 0x0C, 0x66, 0x6E, 0x6C, 0x31, 0x3E, 0x63, 0x70, 0x27, 0x63, 0x62, 0x04, 0x66, 0x5F, 0x73, 0x74, 0x64, 0x20, 0x1F, 0x66, 0x6E, 0x5B, 0x74, 0x2F, 0xFB, 0x6D, 0x2F, 0x1B, 0x3B, 0xE4, 0x0D, 0x35, 0x11, 0x2F, 0xFC, 0x56, 0x90, 0x2F, 0xFF, 0xC4, 0x2F, 0xFB, 0xF8, 0x3E, 0x1F, 0x2F, 0xEC, 0x60, 0xAD, 0x2F, 0xF0, 0x94, 0x2F, 0xF4, 0xC8, 0x2F, 0xF8, 0x32, 0xA7, 0x30, 0x2F, 0x50, 0x56, 0x64, 0x2F, 0x54, 0x98, 0x2F, 0x58, 0xCC, 0x2F, 0x5C, 0x4D, 0xCF, 0x4C, 0x11, 0x6F, 0x67, 0x6F, 0xAF, 0x39, 0xFF, 0xFF, 0xFF, 0x30, 0x03, 0xBE, 0x00, 0x40, 0x02, 0x15, 0x5A, 0xF8, 0x30, 0xB2, 0xAF, 0xC2, 0x3E, 0x57, 0x5E, 0x5B, 0x54, 0x0E, 0x69, 0x74, 0x6C, 0x65, 0x00, 0x2F, 0xDC, 0x00, 0x70, 0x4F, 0x3F, 0xFF, 0x48, 0x08, 0x65, 0x61, 0x74, 0x68, 0x01, 0xE0, 0x33, 0x50, 0x75, 0x62, 0x02, 0x6C, 0x69, 0x73, 0x68, 0x65, 0x72, 0x01, 0xA0, 0x67, 0x49, 0x18, 0x53, 0x42, 0x4E, 0x00, 0x31, 0xBB, 0x00, 0xF0, 0x33, 0x5F, 0x4E, 0x75, 0xC0, 0x31, 0x8A, 0x01, 0x80, 0xCF, 0x43, 0x6F, 0x6E, 0x74, 0x72, 0x61, 0x78, 0x63, 0x31, 0x9E, 0x02, 0x00, 0x33, 0xF0, 0x6B, 0x00, 0xB1, 0x37, 0x4E, 0x65, 0x77, 0x66, 0x73, 0x21, 0x07, 0x01, 0xC1, 0x6B, 0x4C, 0x53, 0x9A, 0x3E, 0x01, 0xE0, 0x67, 0x5F, 0x6A, 0x4C, 0xE1, 0x08, 0x00, 0xB1, 0xD3, 0x52, 0x02, 0xA0, 0x67, 0x52, 0x01, 0xA0, 0x67, 0x70, 0x10, 0x61, 0x6E, 0x31, 0x3E, 0x0F, 0x01, 0x04, 0xFF, 0x00, 0x01, 0x52, 0x6F, 0x6F, 0x74, 0x50, 0x61, 0x6E, 0x00, 0x32, 0x7E, 0xE1, 0x00, 0x63, 0xB2, 0x72, 0xB7, 0x53, 0x93, 0x70, 0x61, 0x73, 0x31, 0x3E, 0x63, 0xA7, 0x70, 0x53, 0x03, 0x20, 0x53, 0x4E, 0x5F, 0x30, 0x55, 0x00, 0x05, 0xF6, 0x01, 0x20, 0x53, 0xA1, 0x4F, 0x93, 0x42, 0x80, 0x53, 0x69, 0x63, 0x31, 0x80, 0x3E, 0x56, 0x3F, 0x07, 0xFF, 0x00, 0x43, 0x73, 0x73, 0x48, 0x2F, 0xD7, 0x84, 0xDF, 0x00, 0x23, 0x5F, 0x2F, 0xB3, 0x3C, 0x80, 0x42, 0x00, 0x13, 0x43, 0x54, 0x59, 0x93, 0x8B, 0xF3, 0x97, 0x80, 0x3F, 0xBE, 0x71, 0x27, 0x07, 0x40, 0xD3, 0x00, 0x73, 0x09, 0x30, 0x7F, 0x40, 0x03, 0x00, 0x61, 0x27, 0x96, 0xA0, 0x2F, 0xA7, 0xC8, 0x80, 0xD3, 0x74, 0x78, 0x74, 0x31, 0x84, 0xEC, 0x61, 0x7B, 0x00, 0x73, 0xF7, 0x5F, 0xEE, 0xC4, 0x00, 0x22, 0x74, 0x54, 0x33, 0xCE, 0xCC, 0x41, 0xF4, 0x2F, 0xFF, 0xCC, 0x41, 0x0E, 0x00, 0x0E, 0x85, 0x0B, 0xD4, 0x34, 0xD7, 0x94, 0x1F, 0xAA, 0x2F, 0xB7, 0xCC, 0x8F, 0xBB, 0x65, 0x50, 0x00, 0xB7, 0x5E, 0x38, 0x6E, 0x0F, 0x62, 0xE0, 0x5F, 0x3F, 0x4A, 0x54, 0x3F, 0xF6, 0x30, 0x83, 0x37, 0x63, 0x31, 0xFF, 0x00, 0x74, 0x47, 0x5F, 0xF7, 0x44, 0x38, 0x00, 0x80, 0x83, 0x67, 0x66, 0x68, 0x27, 0xDE, 0x9C, 0x42, 0x1A, 0x88, 0x00, 0x88, 0x4F, 0xF3, 0x00, 0x10, 0x83, 0x8C, 0x2F, 0xAB, 0xA8, 0x80, 0x7F, 0xAF, 0xC0, 0xB5, 0x62, 0x36, 0x52, 0x0D, 0x4E, 0x2C, 0x6F, 0x82, 0x30, 0x87, 0x20, 0x25, 0xE1, 0x30, 0x03, 0xD2, 0x62, 0x02, 0xDD, 0x7E, 0xD7, 0x76, 0x48, 0x72, 0x30, 0x9B, 0x0A, 0x00, 0x00, 0xE8, 0x6C, 0x0F, 0x61, 0xEA, 0x81, 0x11, 0x08, 0x62, 0xDD, 0x4F, 0xA4, 0x80, 0x21, 0x28, 0x8C, 0x32, 0x00, 0x96, 0xD7, 0x53, 0x97, 0x9A, 0x0A, 0x4E, 0x53, 0x02, 0x5F, 0x0A, 0x00, 0x02, 0x90, 0xA6, 0x40, 0xC7, 0xCA, 0x10, 0x76, 0x11, 0x81, 0x70, 0x43, 0x89, 0x6C, 0xF7, 0x8F, 0x80, 0x30, 0xDB, 0x24, 0x4F, 0xAB, 0x8E, 0x0A, 0x00, 0x08, 0x00, 0x54, 0x06, 0x74, 0x89, 0x5B, 0x92, 0x63, 0xF6, 0x10, 0x65, 0xF4, 0x95, 0x70, 0x65, 0xAB, 0x4E, 0xD7, 0x53, 0x8F, 0x31, 0x01, 0x1F, 0x75, 0x3B, 0x26, 0x1C, 0x31, 0x7F, 0x3F, 0x9F, 0x32, 0xFB, 0xD8, 0x00, 0x75, 0x0F, 0x52, 0x53, 0xA0, 0x00, 0x09, 0x07, 0x75, 0xB3, 0x02, 0x00, 0x7C, 0x9C, 0x28, 0xDA, 0xA8, 0x41, 0x30, 0xC7, 0x26, 0x46, 0x00, 0xF0, 0xFB, 0x00, 0x5F, 0x00, 0x6C, 0xCF, 0x82, 0xE4, 0x51, 0xF0, 0x51, 0x35, 0x00, 0x75, 0x50, 0x5B, 0xF3, 0x97, 0xCF, 0x50, 0xFA, 0x00, 0x51, 0x48, 0x72, 0x3E, 0x79, 0x09, 0x67, 0x50, 0x06, 0x96, 0x6C, 0x51, 0xF8, 0x53, 0x52, 0x13, 0x32, 0xE7, 0x01, 0x22, 0x00, 0xFF, 0x00, 0x85, 0x6F, 0x00, 0x00, 0xBE, 0x2F, 0xEB, 0x70, 0xD0, 0x00, 0x27, 0x47, 0x76, 0x47, 0x14, 0x2E, 0xE3, 0x9C, 0x41, 0x0A, 0x00, 0x75, 0x0A, 0x47, 0x1B, 0x41, 0xE7, 0xC2, 0x13, 0x82, 0x2F, 0xD7, 0x9C, 0x8F, 0xDB, 0x03, 0x49, 0x00, 0x53, 0x00, 0x42, 0x00, 0x55, 0xDA, 0x32, 0x93, 0x62, 0x98, 0xA0, 0x7F, 0x00, 0x35, 0xBB, 0x00, 0x00, 0x58, 0x00, 0xE0, 0x7F, 0x34, 0x81, 0x32, 0x0F, 0x41, 0x24, 0x00, 0x24, 0x00, 0x05, 0x01, 0x20, 0x7F, 0x5F, 0x30, 0x40, 0x01, 0x2D, 0x60, 0x03, 0x70, 0x01, 0x70, 0x0B, 0x30, 0x17, 0xA3, 0x2B, 0xC5, 0x21, 0x17, 0x00, 0x76, 0x1F, 0x00, 0x00, 0xC2, 0x29, 0x9B, 0x04, 0x00, 0xA3, 0xFF, 0x68, 0xBE, 0x41, 0x17, 0x33, 0x2B, 0x06, 0x01, 0x21, 0x17, 0x08, 0x54, 0x0C, 0x00, 0x54, 0x7B, 0x76, 0xB0, 0x8B, 0xF7, 0x53, 0x1A, 0xFB, 0x47, 0x67, 0x33, 0xAF, 0x38, 0x1F, 0xB0, 0x83, 0x00, 0x16, 0xDB, 0xE0, 0x2F, 0x83, 0x00, 0xB0, 0x83, 0x47, 0x0C, 0x41, 0x1B, 0x1A, 0x00, 0x1A, 0x2A, 0xED, 0x01, 0xB1, 0x1B, 0xD1, 0x15, 0xF5, 0x73, 0xBB, 0x72, 0x2B, 0x00, 0x76, 0xCB, 0x51, 0x13, 0x4C, 0x00, 0xA5, 0x13, 0x80, 0x82, 0x2B, 0xC0, 0x3F, 0xF3, 0x00, 0xF2, 0x2B, 0xB0, 0x65, 0xFA, 0x51, 0xA1, 0x5B, 0x2F, 0x57, 0x5B, 0x74, 0x3B, 0x78, 0x62, 0xAB, 0x00, 0x77, 0x17, 0x21, 0x0F, 0x2F, 0xCF, 0x6B, 0x4A, 0x00, 0xB5, 0x93, 0x42, 0x8B, 0x04, 0x29, 0xC5, 0x09, 0x01, 0x22, 0xAB, 0x30, 0x78, 0xFE, 0x00, 0x20, 0xF7, 0x00, 0x07, 0x5B, 0x20, 0xA9, 0x2F, 0xB7, 0x00, 0xB0, 0xF7, 0x36, 0x5F, 0x53, 0x23, 0x0A, 0xFE, 0x01, 0x82, 0xA3, 0x91, 0x77, 0x70, 0xF7, 0x00, 0x77, 0xA7, 0x2A, 0xB5, 0x2C, 0x67, 0x01, 0x50, 0xF7, 0x0B, 0xBE, 0x01, 0x23, 0xA3, 0x5D, 0x00, 0x60, 0xF7, 0xF7, 0xEB, 0x21, 0xA1, 0x2C, 0xDF, 0x00, 0xB1, 0xEF, 0xA0, 0xBA, 0x44, 0x1B, 0x0C, 0x2F, 0xE5, 0x7F, 0xE7, 0x01, 0x30, 0xF7, 0xF7, 0x24, 0x9B, 0x70, 0x30, 0x61, 0x65, 0x67, 0xDF, 0xD0, 0x07, 0x67, 0x72, 0x70, 0x31, 0xC3, 0x3F, 0x6F, 0x38, 0x3F, 0x47, 0x72, 0x6F, 0x75, 0x3F, 0x67, 0x7F, 0xFA, 0x38, 0x67, 0x72, 0x58, 0x13, 0x30, 0x23, 0x3F, 0x83, 0x47, 0x5F, 0x41, 0xFE, 0xCE, 0x03, 0x35, 0x33, 0xF8, 0x23, 0xFB, 0x53, 0xF7, 0x6F, 0x30, 0x6F, 0x3E, 0x6F, 0x47, 0x3B, 0x5F, 0x42, 0xCE, 0x4F, 0x3F, 0xC3, 0x01, 0x30, 0x3B, 0x2C, 0x00, 0x2E, 0x8B, 0x3E, 0xAB, 0x98, 0xF8, 0xAB, 0x67, 0x72, 0x50, 0xEF, 0x00, 0x7C, 0x9F, 0x3C, 0x10, 0x00, 0x2F, 0x00, 0x22, 0x00, 0x0C, 0x9F, 0xC8, 0x8C, 0x9F, 0x36, 0x5B, 0x33, 0xE3, 0x3F, 0x13, 0x57, 0x2D, 0x2F, 0xFC, 0x3E, 0x2F, 0xFF, 0x4F, 0x3E, 0x81, 0x3C, 0xD3, 0x2F, 0xFF, 0x8E, 0x33, 0x3B, 0x33, 0x64, 0x73, 0x6C, 0x3D, 0x6C, 0xB2, 0x80, 0x10, 0x31, 0xA9, 0xF0, 0x10, 0x32, 0xF0, 0x21, 0x33, 0x6C, 0xE5, 0x4C, 0x54, 0x90, 0x3E, 0xC0, 0x30, 0x0B, 0x70, 0x39, 0x4C, 0x54, 0x4D, 0x61, 0x73, 0x6B, 0xDA, 0x90, 0x5A, 0x3C, 0xEB, 0xA8, 0x24, 0xF8, 0x32, 0x6F, 0x38, 0x2F, 0xFC, 0x88, 0xD5, 0x34, 0xE3, 0x2F, 0xA4, 0x88, 0x2F, 0xA8, 0x08, 0x2F, 0xCB, 0x88, 0x2F, 0xCF, 0x55, 0x4C, 0x2D, 0x0B, 0xE8, 0x2D, 0x0F, 0xAC, 0x2D, 0x54, 0x48, 0x25, 0xBC, 0x6D, 0x0C, 0x25, 0x28, 0x00, 0x3F, 0x27, 0xAA, 0x00, 0xAC, 0x93, 0x3C, 0xE3, 0x02, 0x00, 0xAC, 0xE3, 0xDB, 0x00, 0x3F, 0x37, 0x00, 0xBD, 0x33, 0xD5, 0x45, 0xAC, 0x00, 0x9D, 0x33, 0x40, 0x2E, 0x00, 0x30, 0x03, 0x46, 0x11, 0x39, 0x53, 0x06, 0x00, 0x04, 0x30, 0x03, 0x30, 0x0B, 0x65, 0x1C, 0x06, 0x00, 0x01, 0x30, 0x03, 0x30, 0x17, 0x75, 0x6B, 0x01, 0x04, 0x4D, 0x05, 0x2F, 0xF7, 0x4F, 0x5F, 0x31, 0x32, 0x01, 0xB0, 0x7F, 0x01, 0x03, 0xE0, 0x7F, 0xC9, 0xD2, 0xB9, 0x29, 0x21, 0x8C, 0x8C, 0x05, 0xA0, 0x7F, 0x44, 0x73, 0xFB, 0x91, 0xA3, 0x00, 0xF1, 0x7F, 0x03, 0x03, 0xC1, 0x7F, 0x52, 0x65, 0x64, 0x00, 0x2C, 0x12, 0x2E, 0xCC, 0x4E, 0x40, 0x00, 0x2F, 0x37, 0x80, 0x3F, 0x27, 0x28, 0x26, 0x1F, 0x2F, 0x34, 0x04, 0x00, 0x04, 0x06, 0x00, 0x06, 0x06, 0x73, 0x09, 0xED, 0x61, 0xBE, 0x30, 0x03, 0x3F, 0x6F, 0x3A, 0x57, 0xDE, 0x40, 0x30, 0x03, 0xB8, 0xE0, 0x13, 0xC0, 0x30, 0x03, 0x00, 0x7F, 0x63, 0x73, 0xF0, 0x10, 0x04, 0x00, 0x05, 0x01, 0x10, 0x04, 0x10, 0x02, 0xA2, 0x37, 0x46, 0xF2, 0x37, 0x06, 0x26, 0x06, 0x02, 0x05, 0x66, 0x28, 0x2C, 0x00, 0x12, 0x43, 0x42, 0x65, 0x6C, 0x33, 0x5A, 0x01, 0x6F, 0xAA, 0x80, 0xEA, 0x28, 0x70, 0x05, 0x2F, 0xF7, 0x87, 0x30, 0x03, 0x30, 0x8E, 0xE3, 0xBE, 0x30, 0x03, 0xB0, 0xBF, 0xE0, 0x13, 0xDA, 0xC0, 0xBF, 0x50, 0xA7, 0x00, 0x00, 0xC0, 0xA7, 0x00, 0x21, 0x5F, 0x31, 0x02, 0x71, 0x5F, 0x2F, 0x18, 0xA1, 0xBD, 0xBF, 0x30, 0x03, 0x3F, 0xF3, 0xCE, 0x95, 0x17, 0x6F, 0x41, 0x30, 0x03, 0xE0, 0x13, 0xC1, 0x30, 0x03, 0x05, 0x21, 0x5F, 0x00, 0x00, 0xC3, 0x01, 0x31, 0x5F, 0x0F, 0x61, 0x0B, 0xB6, 0xBF, 0x30, 0x03, 0xB0, 0xBF, 0xE0, 0x13, 0xC0, 0xBF, 0xBF, 0x02, 0x61, 0x5F, 0x32, 0x02, 0x72, 0xBF, 0x2E, 0xDB, 0x2C, 0x4F, 0x30, 0x03, 0x44, 0xBD, 0x2D, 0x9F, 0xFE, 0x30, 0x03, 0xC0, 0x13, 0x2B, 0xDB, 0x30, 0x03, 0x05, 0x02, 0xBF, 0x00, 0x00, 0xC3, 0x01, 0x32, 0xBF, 0x9A, 0x1F, 0x99, 0x19, 0xC0, 0x30, 0x03, 0xB0, 0xBF, 0xE0, 0x13, 0xC0, 0xBF, 0x01, 0xF2, 0xBF, 0xE3, 0x7F, 0x6B, 0x3F, 0x17, 0x38, 0x53, 0x50, 0x61, 0x6E, 0x00, 0x9F, 0x1A, 0x00, 0x8F, 0xEB, 0xEB, 0x57, 0x87, 0x7F, 0x6B, 0x7F, 0xBF, 0x03, 0x4F, 0xBF, 0x57, 0x00, 0x53, 0xB9, 0x01, 0x0F, 0xBF, 0xE1, 0x2D, 0x26, 0x20, 0x03, 0x80, 0x53, 0x69, 0x63, 0x31, 0xA0, 0x4F, 0xBF, 0x63, 0xF5, 0x00, 0x84, 0xD3, 0x70, 0x53, 0x46, 0x31, 0x32, 0x00, 0x63, 0x2F, 0x58, 0x2F, 0xA0, 0xF7, 0x4B, 0x05, 0x4F, 0x49, 0x00, 0x00, 0xCD, 0xCC, 0x4C, 0x9F, 0x28, 0x36, 0x80, 0x3F, 0x50, 0x07, 0x40, 0x0F, 0x4F, 0xF7, 0x50, 0x07, 0x8F, 0xAC, 0x7F, 0x40, 0xE0, 0x0B, 0x40, 0x03, 0xB0, 0xA7, 0x4E, 0x53, 0x3E, 0xE7, 0x00, 0x94, 0xB7, 0x60, 0xFB, 0x7D, 0x20, 0x01, 0xC0, 0xA7, 0x27, 0x62, 0x01, 0x00, 0xA7, 0x8A, 0x37, 0x81, 0x2F, 0x91, 0x00, 0x84, 0xA3, 0x8B, 0x71, 0x83, 0x10, 0xF4, 0xBF, 0x01, 0xC1, 0x2F, 0x07, 0x04, 0xD1, 0x2F, 0x00, 0x80, 0xA7, 0xBF, 0x01, 0xF1, 0x2F, 0x08, 0x02, 0x41, 0x2F, 0x3B, 0x13, 0x00, 0x54, 0x73, 0xA1, 0xB7, 0xEE, 0xF7, 0x00, 0xD2, 0x5F, 0x77, 0x09, 0x04, 0xD2, 0x5F, 0x00, 0xB0, 0xA7, 0x01, 0xC3, 0x07, 0x0A, 0x01, 0xE2, 0x5F, 0x92, 0xE7, 0x00, 0x1A, 0xB3, 0xAE, 0xD3, 0xE7, 0xA0, 0x00, 0x68, 0x1F, 0x10, 0x43, 0xE3, 0xFA, 0xDB, 0x5C, 0x21, 0x50, 0x8F, 0x43, 0x83, 0x00, 0x00, 0x44, 0x68, 0x47, 0x30, 0x0F, 0x3F, 0xD7, 0x30, 0x0F, 0x27, 0x80, 0x3F, 0x73, 0x67, 0x03, 0x05, 0x33, 0x67, 0x00, 0x1A, 0xE3, 0x5F, 0xEE, 0x7B, 0xF8, 0x37, 0x37, 0x00, 0xA0, 0x7F, 0x3F, 0x8F, 0x00, 0x10, 0x7F, 0x01, 0x6C, 0x5D, 0x9F, 0xBB, 0xEE, 0x00, 0x0F, 0xC7, 0x23, 0x67, 0xE3, 0xEF, 0x07, 0x33, 0xEF, 0x00, 0x1A, 0xEB, 0x01, 0x94, 0xEB, 0x80, 0x5B, 0x41, 0xFB, 0xE3, 0x02, 0x01, 0x30, 0x87, 0x74, 0x6F, 0x01, 0x50, 0x7F, 0xFA, 0xEB, 0xBD, 0x02, 0xB0, 0x7F, 0x03, 0x81, 0x07, 0x90, 0xF7, 0xF1, 0x17, 0x00, 0x02, 0x0F, 0x03, 0x34, 0xF7, 0xDF, 0x00, 0x1A, 0xF3, 0x01, 0x51, 0x8F, 0x00, 0x2D, 0xCF, 0x00, 0x12, 0x0F, 0x2A, 0x3A, 0x01, 0x21, 0x8F, 0x02, 0x5F, 0x27, 0x7F, 0xDC, 0x00, 0x2F, 0x27, 0x3F, 0xAB, 0xF6, 0xB7, 0xFD, 0x97, 0xFD, 0x57, 0xFC, 0xE7, 0xFC, 0x77, 0xFF, 0xFC, 0x07, 0xFB, 0x97, 0xFA, 0xE3, 0xFA, 0x57, 0xF9, 0xA3, 0xF9, 0x17, 0xF8, 0x63, 0x3F, 0xB7, 0x75, 0xCC, 0x00, 0x2F, 0xB7, 0x3E, 0x8F, 0x0A, 0x30, 0xCB, 0x2C, 0x41, 0xA7, 0x43, 0xCF, 0x1B, 0xCC, 0x37, 0x0D, 0xF8, 0x5F, 0x67, 0x72, 0x56, 0xFF, 0x08, 0x40, 0x02, 0x60, 0x00, 0x1E, 0x5A, 0xF8, 0xFA, 0x34, 0xDF, 0x2C, 0x9F, 0x4F, 0x67, 0x00, 0x0C, 0xD1, 0x82, 0x00, 0xA0, 0xFC, 0xFF, 0x5F, 0x00, 0xFE, 0x00, 0xFF, 0x60, 0x5A, 0x48, 0xFE, 0xED, 0xB5, 0xDF, 0x00, 0x28, 0xF9, 0x20, 0x26, 0xFF, 0xFE, 0x3F, 0xEB, 0x1A, 0xEF, 0x68, 0xB4, 0x08, 0x40, 0xEB, 0x20, 0x42, 0x50, 0x3F, 0xFF, 0xF6, 0x40, 0xFF, 0x26, 0x2F, 0xF7, 0x63, 0x00, 0x03, 0x00, 0xC0, 0xF4, 0x00, 0x10, 0xFD, 0xFF, 0x40, 0xE8, 0x2F, 0xF8, 0xF5, 0xF0, 0xFF, 0xFF, 0x20, 0x50, 0x09, 0xFF, 0xFF, 0x30, 0x20, 0x58, 0x49, 0x9F, 0x6F, 0x9F, 0xE9, 0x02, 0x4F, 0x4F, 0x00, 0x00, 0x6F, 0xAF, 0xBF, 0xF9, 0xF2, 0x43, 0x60, 0x5F, 0x2F, 0x0E, 0x8F, 0xFF, 0xF9, 0x51, 0x37, 0x3F, 0xDA, 0x06, 0xF5, 0xF2, 0xFF, 0xFF, 0xF2, 0x20, 0x03, 0x4F, 0xE6, 0x26, 0x32, 0x00, 0x22, 0x4F, 0xEE, 0x29, 0xC2, 0xFF, 0x58, 0x29, 0x23, 0x06, 0x03, 0xFF, 0xFF, 0x2F, 0x2F, 0x00, 0x00, 0x30, 0x03, 0x4F, 0xF3, 0x50, 0x22, 0xA0, 0x1F, 0xC1, 0x50, 0x77, 0x0A, 0x0A, 0x00, 0x30, 0x0A, 0x0A, 0x0A, 0xD0, 0xF3, 0x6F, 0xE3, 0x64, 0x4F, 0xEB, 0x46, 0x10, 0x00, 0x00, 0xE3, 0x24, 0x6A, 0x8F, 0x9F, 0x00, 0x66, 0x03, 0xFF, 0xF4, 0x2D, 0xDF, 0xC0, 0xC6, 0x90, 0x6F, 0xBF, 0xBC, 0x63, 0x04, 0x01, 0x52, 0x5C, 0x20, 0xB7, 0x20, 0x00, 0xF0, 0x20, 0xEB, 0x30, 0x03, 0xB0, 0x2F, 0xF1, 0xF8, 0x30, 0xCB, 0x20, 0xB6, 0xFF, 0x66, 0x00, 0x66, 0x38, 0x00, 0x02, 0x20, 0xE3, 0x20, 0x6E, 0x2E, 0xBC, 0x00, 0x04, 0xFF, 0x10, 0xFF, 0x0D, 0x8F, 0x7F, 0xEB, 0xF7, 0x30, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x30, 0x00, 0x19, 0xFF, 0x00, 0xAA, 0x60, 0xE6, 0x61, 0xE7, 0x2F, 0x39, 0xC0, 0xF5, 0xF9, 0xFF, 0xDF, 0x80, 0x20, 0xD5, 0x07, 0x10, 0xFC, 0xFC, 0xAF, 0xDF, 0xFF, 0x10, 0x02, 0x9F, 0x6F, 0x3A, 0xAE, 0x35, 0x00, 0xD7, 0x02, 0x8C, 0x30, 0x41, 0x00, 0xFF, 0xFD, 0x40, 0xEF, 0x21, 0x3B, 0x00, 0x00, 0x00, 0xF9, 0xF2, 0x01, 0x0B, 0x20, 0x00, 0xCF, 0xFF, 0x01, 0x21, 0xFF, 0xA8, 0x00, 0x5A, 0x00, 0x20, 0x21, 0x63, 0x40, 0x20, 0x2F, 0xE5, 0x0B, 0x0A, 0xF6, 0xF6, 0x0A, 0x0C, 0x00, 0xF6, 0xF2, 0xF7, 0x8E, 0xFF, 0xFF, 0x21, 0x00, 0x01, 0x69, 0x00, 0x8F, 0xFF, 0xA2, 0x06, 0x12, 0x3F, 0x3C, 0x00, 0x4F, 0xFF, 0x00, 0xDF, 0xFF, 0x00, 0x1C, 0xFF, 0x80, 0x3E, 0xAD, 0x00, 0x00, 0xC3, 0xFF, 0xFC, 0xFF, 0xFF, 0x00, 0x40, 0x00, 0xA9, 0x00, 0xFB, 0xFF, 0xFF, 0x4F, 0x55, 0x6A, 0x2F, 0xB4, 0x0A, 0x3F, 0xBA, 0x09, 0x9F, 0xD9, 0x03, 0x04, 0x83, 0x57, 0xC0, 0xE8, 0x1E, 0x7F, 0xDC, 0xF6, 0xFF, 0xFF, 0x10, 0x00, 0xC6, 0x8E, 0x3F, 0xE4, 0x6F, 0xFF, 0x00, 0xA0, 0x88, 0x05, 0x00, 0x8F, 0x01, 0x5D, 0x01, 0x43, 0x02, 0x4C, 0x49, 0x4D, 0xFF, 0xFE, 0x14, 0x32, 0x7C, 0x02, 0x60, 0x28, 0x2A, 0x37, 0x3B, 0x9D, 0x69, 0x6D, 0x61, 0x67, 0x10, 0x8C, 0x4C, 0x24, 0x20, 0x00, 0x0D, 0x42, 0x30, 0x07, 0x03, 0x8B, 0xA0, 0x00, 0x02, 0x71, 0x00, 0x88, 0xFE, 0xFF, 0xFF, 0x26, 0x0E, 0xC0, 0x80, 0x2F, 0x0B, 0xC0, 0xC0, 0xAF, 0x9F, 0x00, 0x00, 0x9F, 0x81, 0x20, 0x03, 0x00, 0x88, 0x00, 0x88, 0xFF, 0xCC, 0x20, 0x17, 0xC0, 0x70, 0x07, 0xFF, 0xFF, 0x78, 0x00, 0x02, 0xFF, 0xFC, 0x3E, 0xC3, 0x4F, 0xDB, 0x3F, 0xDF, 0x90, 0x90, 0xDF, 0xDF, 0x30, 0x03, 0x01, 0xA1, 0xD7, 0xE4, 0x40, 0x6F, 0x30, 0x6B, 0x40, 0x6F, 0x00, 0xB0, 0x43, 0xCF, 0xDF, 0xFF, 0x05, 0x55, 0xFF, 0xD7, 0x00, 0xEE, 0x00, 0x0F, 0x0E, 0x55, 0x20, 0x17, 0x74, 0xEE, 0x20, 0x17, 0x70, 0x07, 0x40, 0x6F, 0x80, 0x90, 0x6F, 0xC5, 0xFF, 0x0F, 0xCF, 0x7F, 0xDE, 0x00, 0x95, 0xDD, 0xC1, 0x7F, 0x2F, 0xA3, 0xB1, 0x7F, 0x1D, 0x20, 0x00, 0x10, 0x51, 0x7F, 0xB9, 0xCA, 0x06, 0xC6, 0x17, 0x50, 0xA8, 0x82, 0x61, 0x70, 0x28, 0x8E, 0x2E, 0x46, 0x10, 0x00, 0x43, 0xFD, 0x3A, 0xEF, 0x12, 0x76, 0x00, 0x98, 0x6F, 0xFF, 0xCE, 0x47, 0x2D, 0xE3, 0xFF, 0x11, 0x7A, 0xFF, 0x45, 0x4F, 0xEF, 0xAA, 0x00, 0xBB, 0x4B, 0x0F, 0x45, 0xBB, 0x50, 0x07, 0xFF, 0x23, 0xEF, 0x3F, 0xD6, 0x00, 0x23, 0xDE, 0x45, 0x53, 0x4F, 0xFB, 0x9A, 0x00, 0x68, 0x4B, 0x2F, 0x24, 0x35, 0x23, 0x0A, 0xAD, 0xFF, 0xFF, 0xC8, 0x3B, 0x3B, 0xB3, 0x33, 0x2F, 0xFF, 0x43, 0xFF, 0x66, 0x67, 0x27, 0xFF, 0x00, 0x4B, 0x83, 0x4F, 0x7B, 0xE7, 0xF0, 0x21, 0xD1, 0x2E, 0x4D, 0x38, 0x0A, 0x08, 0x47, 0x29, 0x21, 0xF6, 0x22, 0xFF, 0x22, 0xF7, 0xF7, 0x00, 0x15, 0x7F, 0x22, 0xFF, 0x32, 0x4F, 0xBA, 0x43, 0x30, 0xFF, 0x97, 0x6C, 0x27, 0x36, 0x6A, 0x10, 0xE7, 0xF2, 0xF4, 0x7C, 0xFF, 0x34, 0xBA, 0x40, 0x03, 0x9F, 0xDB, 0x25, 0x32, 0x8F, 0xE8, 0x0C, 0x09, 0x20, 0xFF, 0x4F, 0x25, 0x2D, 0xAD, 0xBF, 0x04, 0x28, 0xFF, 0x31, 0x00, 0x6C, 0x06, 0xF4, 0x37, 0xFF, 0x87, 0xD6, 0x00, 0xDD, 0x00, 0x4D, 0x3C, 0x1A, 0xDD, 0x00, 0xEE, 0x34, 0x4A, 0x31, 0xEF, 0x54, 0x00, 0x45, 0x1F, 0xB8, 0xA4, 0x38, 0x0B, 0x51, 0x41, 0xEF, 0xFD, 0xA0, 0x97, 0x1F, 0x10, 0x00, 0x0C, 0xFE, 0xFC, 0x10, 0xA0, 0x23, 0xF1, 0x6F, 0xB8, 0x2C, 0xEF, 0x02, 0x00, 0x03, 0xFF, 0xFF, 0x1E, 0x8F, 0xA1, 0x1B, 0xEF, 0xE7, 0x21, 0x1F, 0xC7, 0x69, 0x04, 0xD9, 0x32, 0xA1, 0xF2, 0x27, 0xCB, 0x20, 0x03, 0x7F, 0xD9, 0x42, 0xE1, 0x40, 0xD7, 0x37, 0xFF, 0x01, 0xBE, 0x4D, 0xEF, 0x58, 0x22, 0x00, 0x23, 0x4F, 0xBB, 0x64, 0xFF, 0xA7, 0x47, 0xEF, 0xDC, 0x2C, 0xFF, 0xED, 0x79, 0xE0, 0xDE, 0x24, 0xA0, 0x37, 0x04, 0xCC, 0xFF, 0x88, 0x50, 0xCF, 0x21, 0x00, 0x32, 0x42, 0xDF, 0x33, 0x00, 0x33, 0x09, 0x00, 0x00, 0x73, 0x30, 0x26, 0xAA, 0xFF, 0xFF, 0x40, 0x04, 0xCE, 0x63, 0x3F, 0x46, 0xD7, 0x7A, 0xEF, 0x35, 0x94, 0x72, 0xEF, 0x26, 0xF5, 0x2F, 0x2E, 0x05, 0x4D, 0x2E, 0xDA, 0x6B, 0x03, 0xE4, 0x0C, 0x09, 0x55, 0xFF, 0x08, 0xC0, 0x7F, 0x91, 0x00, 0x00, 0x00, 0xF3, 0xF3, 0x00, 0x99, 0x00, 0x99, 0xFE, 0x5F, 0xF7, 0x20, 0x0B, 0x20, 0x0F, 0x7F, 0x8F, 0x80, 0x17, 0x60, 0x1F, 0x8F, 0xA7, 0x56, 0x1A, 0xFF, 0x55, 0x01, 0x3A, 0xFD, 0x90, 0x1F, 0x78, 0x4F, 0xC3, 0x55, 0x23, 0xFF, 0x65, 0x4A, 0x2F, 0x97, 0xFF, 0xFC, 0x35, 0x5C, 0x29, 0x23, 0x63, 0x02, 0x34, 0x07, 0x3F, 0xFB, 0x8B, 0xFF, 0x03, 0x44, 0x10, 0x28, 0x4D, 0x68, 0xD4, 0x80, 0x5F, 0x3F, 0xE5, 0x17, 0x9F, 0xEA, 0xEF, 0xFF, 0x07, 0x68, 0xCF, 0x45, 0x6F, 0x2B, 0x59, 0x3E, 0xFB, 0x5F, 0x30, 0x20, 0xFB, 0x89, 0x5F, 0xC7, 0xF3, 0xF9, 0xF8, 0x90, 0x3F, 0x31, 0xB7, 0x22, 0x97, 0x30, 0x00, 0x75, 0x85, 0xBF, 0x2F, 0xC2, 0xAF, 0x0D, 0xFF, 0x9E, 0x22, 0xFF, 0x45, 0x4F, 0xB9, 0xA9, 0x00, 0x9A, 0x45, 0xBF, 0x89, 0x88, 0x55, 0xA7, 0xFF, 0x22, 0xFF, 0x3E, 0xDF, 0x00, 0xFF, 0x75, 0x29, 0xFF, 0xDA, 0x4F, 0xFF, 0x23, 0x3A, 0xDB, 0x5E, 0x7F, 0x95, 0x9F, 0x1F, 0x7F, 0x8F, 0x52, 0x23, 0x0C, 0x0D, 0x92, 0x31, 0xE1, 0xEF, 0xE1, 0xFF, 0x7F, 0xFF, 0x7C, 0x02, 0x2C, 0xE9, 0x30, 0x03, 0xF0, 0x0F, 0x01, 0x1D, 0xE6, 0x45, 0x3E, 0x00, 0xFB, 0x5B, 0xB0, 0x3A, 0x47, 0xFE, 0x2B, 0x83, 0x8C, 0x57, 0xD0, 0x28, 0x8B, 0x25, 0x31, 0xB0, 0x77, 0x11, 0x0D, 0xA5, 0x1B, 0x96, 0x44, 0x00, 0x00, 0xFC, 0xFB, 0x18, 0x01, 0x07, 0xF8, 0x3B, 0xB6, 0x56, 0x45, 0x0E, 0x50, 0x00, 0x28, 0x2F, 0x3F, 0x2C, 0x8F, 0xE5, 0x2C, 0xC3, 0x00, 0xFA, 0x30, 0xA1, 0x2B, 0xBB, 0x6F, 0x76, 0x87, 0x18, 0xEF, 0x00, 0x38, 0x77, 0x77, 0xC2, 0xC2, 0x5F, 0xAE, 0x8B, 0x6B, 0xFF, 0x01, 0xAF, 0x47, 0xCF, 0x15, 0xEE, 0x32, 0x6B, 0x26, 0x89, 0x00, 0x3E, 0xA7, 0x3A, 0x0D, 0xB4, 0x2F, 0x04, 0xF1, 0xFF, 0x7F, 0xFF, 0xA0, 0x50, 0xB0, 0x26, 0x73, 0xF4, 0x79, 0x7C, 0x00, 0x60, 0xFB, 0xFF, 0xE0, 0x28, 0x32, 0x00, 0xB0, 0x01, 0x24, 0x07, 0x4F, 0x08, 0x2F, 0x1F, 0x00, 0x39, 0x00, 0x0D, 0x3D, 0x04, 0x7D, 0xFB, 0xFE, 0xE5, 0x00, 0xD8, 0x5C, 0xA7, 0x5B, 0xA5, 0x3F, 0x93, 0x61, 0x00, 0x1C, 0xBF, 0x38, 0x93, 0x40, 0x96, 0x9E, 0x2A, 0x03, 0xA5, 0x4F, 0xF4, 0xFE, 0x28, 0xAF, 0xD0, 0xE1, 0x3E, 0xFF, 0x1A, 0x27, 0x87, 0x8C, 0x3E, 0x05, 0x00, 0x00, 0x3F, 0x2B, 0x55, 0x98, 0xBE, 0x04, 0x07, 0x0B, 0xFF, 0xFF, 0x08, 0x06, 0x0E, 0x53, 0xFF, 0x20, 0x4A, 0xBF, 0x3F, 0xB6, 0x8E, 0xB3, 0xFF, 0xDE, 0xFF, 0xDD, 0x55, 0x42, 0x60, 0x17, 0x7F, 0xD6, 0xDD, 0x01, 0xFF, 0xED, 0xFF, 0x00, 0x31, 0x00, 0x95, 0x7A, 0xDB, 0x92, 0x60, 0x37, 0xEE, 0x12, 0x2E, 0xBF, 0x50, 0xFD, 0xDA, 0x11, 0xFF, 0x12, 0xBD, 0xFF, 0x69, 0x45, 0xE7, 0x14, 0x6B, 0x9B, 0x0F, 0x8E, 0x1A, 0x5E, 0x01, 0x9F, 0x6F, 0xD3, 0x00, 0x1C, 0x2A, 0x35, 0x2F, 0x8F, 0xFC, 0x04, 0xFC, 0x00, 0xAD, 0x00, 0x47, 0x5A, 0x6F, 0xFD, 0x74, 0x8F, 0x4E, 0x97, 0xB9, 0xFF, 0xDC, 0x4F, 0xFF, 0x2F, 0x44, 0x2B, 0xB2, 0x4F, 0x3C, 0x35, 0xBB, 0xFF, 0x2B, 0xAA, 0x2D, 0x64, 0x10, 0x60, 0xB7, 0x32, 0x35, 0xDC, 0x0A, 0x10, 0x00, 0xB4, 0xEC, 0x2F, 0xF3, 0xF9, 0x7B, 0x78, 0xEF, 0x88, 0x68, 0x9F, 0x8B, 0xFF, 0x25, 0xAB, 0x8F, 0x6D, 0xFF, 0x8F, 0x5E, 0x02, 0x4E, 0xDD, 0x6C, 0x01, 0xEC, 0xAC, 0xCE, 0x7F, 0x2D, 0x16, 0xBE, 0x7F, 0x80, 0xE0, 0x7E, 0x7F, 0x9D, 0x2E, 0x04, 0x0F, 0xBD, 0xFF, 0xEF, 0xEF, 0x8A, 0xAF, 0x00, 0x8E, 0x47, 0x24, 0xDD, 0x78, 0xDD, 0x77, 0x33, 0x00, 0x11, 0x33, 0x11, 0x8D, 0x7D, 0x13, 0x13, 0x7D, 0xDF, 0x20, 0x03, 0x8A, 0xBF, 0x77, 0x50, 0x17, 0x70, 0x07, 0xFF, 0xFF, 0x30, 0x2B, 0xB0, 0x2F, 0xDB, 0xF0, 0x0F, 0x01, 0xBF, 0x7F, 0xA8, 0x6D, 0xEA, 0x7F, 0x7F, 0x10, 0x6D, 0xFF, 0x27, 0xB0, 0xD0, 0x04, 0xA1, 0x00, 0x0D, 0xB0, 0x01, 0x02, 0x60, 0xED, 0x61, 0xFF, 0x2C, 0xFF, 0x1A, 0xBE, 0xFF, 0xF0, 0x3E, 0xB7, 0x00, 0xC0, 0xFF, 0x19, 0x00, 0x21, 0x1D, 0x01, 0x8C, 0x28, 0xFA, 0xCC, 0xFF, 0x3A, 0x3B, 0x92, 0x40, 0x3F, 0x17, 0xFF, 0x46, 0x6B, 0x27, 0x4C, 0x84, 0xFF, 0xE9, 0xBD, 0xB9, 0x3C, 0xB8, 0xFD, 0xF1, 0x23, 0x34, 0x30, 0x62, 0x4C, 0xDA, 0x40, 0x13, 0xF7, 0xFF, 0xF1, 0x20, 0x03, 0x04, 0xEF, 0xFF, 0xE8, 0xFF, 0xE0, 0x20, 0x03, 0xE1, 0xFF, 0x1C, 0xD9, 0xFF, 0xD3, 0x50, 0x95, 0x2E, 0xE1, 0x21, 0x87, 0x57, 0xFF, 0x1A, 0x86, 0xFF, 0xD1, 0x93, 0x69, 0x30, 0x41, 0xFA, 0x31, 0x9F, 0xAC, 0x22, 0xFF, 0xC7, 0x41, 0xA5, 0xD9, 0xFF, 0xE4, 0x50, 0x5B, 0xF6, 0x20, 0xFF, 0xF2, 0x20, 0x5D, 0xFB, 0xFF, 0xEE, 0xFF, 0xEA, 0xAA, 0x2F, 0x23, 0xF5, 0x20, 0x05, 0xE4, 0x23, 0x97, 0xEA, 0x2E, 0x2E, 0xDA, 0x08, 0xFF, 0xDB, 0xFF, 0xD5, 0x2C, 0x6E, 0xC6, 0xFF, 0xD0, 0x02, 0xFF, 0xCB, 0xFF, 0xC1, 0xFF, 0xBC, 0x27, 0xE7, 0xE1, 0xA0, 0x20, 0x11, 0xD2, 0x24, 0x7A, 0xDA, 0xFF, 0xCD, 0xFF, 0xCA, 0x82, 0x20, 0x19, 0xC1, 0xFF, 0xB7, 0xFF, 0xB3, 0x20, 0xFE, 0xBA, 0x0A, 0xFF, 0xAF, 0xFF, 0xAB, 0x05, 0xD1, 0xFF, 0x5F, 0x62, 0x6D, 0x03, 0x28, 0xFF, 0x29, 0x20, 0xC2, 0xC2, 0xE1, 0x7F, 0x05, 0xFF, 0x9F, 0xAD, 0x22, 0x8D, 0x07, 0x21, 0x61, 0xA7, 0x20, 0x9A, 0x5F, 0xE9, 0x8A, 0xD9, 0x48, 0xA8, 0x38, 0x99, 0xFE, 0x41, 0x01, 0xF7, 0x25, 0x34, 0xEA, 0xFF, 0xE0, 0x51, 0x8D, 0xD1, 0x73, 0xF6, 0x80, 0x27, 0xF7, 0xFF, 0xEB, 0x25, 0x56, 0x54, 0xE0, 0x21, 0x1D, 0xE9, 0x21, 0x25, 0xDE, 0x2F, 0x4A, 0xD4, 0xFF, 0x14, 0xD3, 0xFF, 0xC9, 0x2F, 0x52, 0xD3, 0x2B, 0x3D, 0xC9, 0xFF, 0x54, 0xC8, 0x25, 0x49, 0xBD, 0x21, 0x07, 0xFC, 0x27, 0x46, 0xF0, 0xFF, 0x51, 0xE6, 0x20, 0x2D, 0xE2, 0x25, 0x9E, 0xD5, 0xFF, 0xE3, 0x21, 0x95, 0x55, 0xD6, 0x2D, 0xB0, 0xD0, 0x20, 0x21, 0xC3, 0x25, 0x10, 0xDA, 0x21, 0x3B, 0x14, 0xCD, 0xFF, 0xC5, 0x21, 0x4D, 0xC4, 0x25, 0x7B, 0xB6, 0xFF, 0x40, 0xBF, 0x21, 0x3D, 0xB2, 0xFF, 0xAB, 0xFF, 0xB0, 0xFF, 0x05, 0xA9, 0xFF, 0xA3, 0xFF, 0x9C, 0x21, 0x51, 0xC0, 0x22, 0x4A, 0x54, 0xB5, 0x21, 0x53, 0xAE, 0x21, 0xA8, 0xA2, 0x21, 0x59, 0xAA, 0xFF, 0x50, 0xA8, 0x20, 0xC8, 0xA0, 0x2F, 0xE0, 0x95, 0xFF, 0x8C, 0xFF, 0x40, 0xA6, 0x2B, 0x49, 0x9A, 0xFF, 0x92, 0xFF, 0x96, 0xFF, 0x54, 0x8F, 0x25, 0x33, 0x84, 0x20, 0x05, 0x87, 0x22, 0x2C, 0x7C, 0xFF, 0x15, 0x7F, 0xFF, 0x79, 0x2B, 0x43, 0x6E, 0x22, 0x86, 0xB8, 0x20, 0x4B, 0x46, 0xAA, 0x20, 0x53, 0xAD, 0xFF, 0xA4, 0x21, 0x00, 0x30, 0x53, 0x96, 0x2A, 0xFF, 0x90, 0x2B, 0xFF, 0x92, 0x20, 0xFC, 0x85, 0x20, 0x4B, 0xA4, 0x20, 0xFF, 0x9B, 0x20, 0x3D, 0xA0, 0xFF, 0x9D, 0xFF, 0x93, 0x82, 0x20, 0x17, 0x8D, 0xFF, 0x89, 0xFF, 0x80, 0x20, 0x3F, 0x86, 0x28, 0xFF, 0x83, 0x20, 0x41, 0x76, 0x20, 0x0D, 0x83, 0xFF, 0x7D, 0x0A, 0xFF, 0x77, 0xFF, 0x7E, 0x20, 0x4F, 0x72, 0x25, 0x87, 0x72, 0x02, 0xFF, 0x6C, 0xFF, 0x67, 0xFF, 0x62, 0x40, 0x03, 0x5C, 0x00, 0xFF, 0x58, 0xFF, 0x74, 0xFF, 0x70, 0xFF, 0x69, 0x28, 0xFF, 0x65, 0x25, 0xA1, 0x6A, 0x20, 0x15, 0x5F, 0xFF, 0x5E, 0x02, 0xFF, 0x5A, 0xFF, 0x53, 0xFF, 0x50, 0x22, 0x6C, 0x54, 0x0A, 0xFF, 0x4D, 0xFF, 0x4A, 0x00, 0xD3, 0xFF, 0x16, 0x24, 0x1D, 0x6B, 0x35, 0xFF, 0x15, 0x22, 0x66, 0x72, 0xD7, 0x85, 0x2F, 0xA8, 0xED, 0x5F, 0x95, 0x55, 0xF9, 0x2E, 0xCE, 0xF0, 0x94, 0x3F, 0x75, 0x21, 0xBF, 0xD5, 0x84, 0x4D, 0x6A, 0x3D, 0x2F, 0xD0, 0xAF, 0xAC, 0xFD, 0x22, 0xFB, 0xE8, 0x26, 0x3B, 0xE0, 0xAA, 0x2F, 0xE7, 0xF8, 0x2F, 0x06, 0xF1, 0x23, 0x03, 0xD9, 0x23, 0x01, 0xD3, 0xAA, 0x21, 0x7F, 0xF0, 0x28, 0xC8, 0xE6, 0x21, 0x77, 0xD6, 0x23, 0x0F, 0xCC, 0xAA, 0x22, 0xD1, 0xDD, 0x21, 0x89, 0xD5, 0x22, 0xBF, 0xC3, 0x22, 0xF6, 0xBB, 0xAA, 0x22, 0xB1, 0xBF, 0x21, 0x61, 0xB5, 0x22, 0xB1, 0xA8, 0x21, 0x59, 0x9F, 0xAA, 0x22, 0xBB, 0xAB, 0x21, 0x69, 0xA2, 0x21, 0x5F, 0x95, 0x2D, 0x23, 0x8C, 0xAD, 0x42, 0xD5, 0xD2, 0x21, 0x9F, 0xBF, 0x21, 0x95, 0x30, 0x1B, 0xCB, 0x27, 0x21, 0x55, 0xC4, 0x21, 0xA7, 0xB0, 0x21, 0x9D, 0xA9, 0x21, 0x9F, 0xA6, 0x21, 0x7D, 0x55, 0x9E, 0x21, 0x7F, 0x8F, 0x23, 0xA2, 0x87, 0x21, 0x77, 0x96, 0x26, 0xB9, 0xA8, 0x30, 0x0B, 0x7F, 0x21, 0x19, 0x78, 0x21, 0x7F, 0x9E, 0xFF, 0x94, 0xA2, 0x20, 0x01, 0x8A, 0x26, 0xCF, 0x82, 0xFF, 0x81, 0x20, 0x11, 0x8B, 0xB1, 0x20, 0x05, 0x82, 0x20, 0x19, 0x30, 0x1B, 0x6E, 0xFF, 0x66, 0x21, 0xA5, 0x51, 0x71, 0x21, 0x41, 0x68, 0x21, 0x3D, 0x63, 0xFF, 0x60, 0x21, 0x3B, 0x50, 0x66, 0x21, 0x41, 0x5E, 0x2D, 0xBD, 0x57, 0xFF, 0x51, 0xFF, 0x15, 0x4F, 0xFF, 0x48, 0x21, 0xC5, 0x70, 0x20, 0x21, 0x68, 0x80, 0x17, 0x55, 0x6A, 0x20, 0x25, 0x63, 0x21, 0x63, 0x57, 0x20, 0x1D, 0x50, 0x20, 0x1F, 0x10, 0x55, 0xFF, 0x4E, 0x20, 0x01, 0x46, 0xFF, 0x47, 0xFF, 0x05, 0x40, 0xFF, 0x3F, 0xFF, 0x39, 0x20, 0x07, 0x3F, 0x20, 0x09, 0x51, 0x39, 0x20, 0x09, 0x32, 0x20, 0x01, 0x2C, 0xFF, 0x5D, 0x23, 0xF6, 0x60, 0x53, 0x20, 0x23, 0x30, 0x03, 0x49, 0xFF, 0x44, 0xFF, 0x4B, 0x08, 0xFF, 0x45, 0xFF, 0x42, 0x21, 0x3E, 0x40, 0xFF, 0x3C, 0x02, 0xFF, 0x38, 0xFF, 0x34, 0xFF, 0x4A, 0x20, 0x39, 0x41, 0xA8, 0x21, 0x4E, 0x43, 0x20, 0x05, 0x3B, 0x20, 0x11, 0x38, 0xFF, 0x35, 0x00, 0xFF, 0x31, 0xFF, 0x2E, 0xFF, 0x33, 0xFF, 0x30, 0x2A, 0xFF, 0x2B, 0x23, 0x46, 0x3B, 0x20, 0x0F, 0x33, 0x20, 0x0F, 0x30, 0x82, 0x24, 0xD2, 0x2A, 0xFF, 0x26, 0xFF, 0x2D, 0x2B, 0x94, 0x27, 0x80, 0x2D, 0xA5, 0x23, 0xFF, 0x20, 0xFF, 0x1E, 0xFF, 0x1B, 0xA8, 0x23, 0x68, 0x26, 0x40, 0x0B, 0x24, 0x2D, 0xB9, 0x1E, 0xFF, 0x1C, 0x02, 0xFF, 0x1D, 0xFF, 0x1A, 0xFF, 0x18, 0x21, 0xD2, 0x18, 0x8A, 0x24, 0xB8, 0x13, 0xFF, 0x12, 0x33, 0x8B, 0x00, 0x20, 0x36, 0xD2, 0xDA, 0x6B, 0xF6, 0x34, 0x85, 0x00, 0x24, 0x87, 0x64, 0xB3, 0xFA, 0x2C, 0x0B, 0xEA, 0xAA, 0x24, 0x61, 0xE4, 0x24, 0x57, 0xCC, 0x24, 0x59, 0xC6, 0x27, 0xFF, 0xDF, 0xA9, 0x24, 0x75, 0xDA, 0x24, 0x5F, 0xC1, 0x24, 0x4D, 0xBC, 0x00, 0x22, 0xB6, 0x62, 0x00, 0x23, 0x56, 0x43, 0x7B, 0xFE, 0xFF, 0xF2, 0x34, 0xA5, 0x00, 0xD5, 0x23, 0x4E, 0x24, 0xFD, 0xED, 0x2A, 0x35, 0xEA, 0x2C, 0x67, 0xD5, 0x24, 0xE9, 0x55, 0xD2, 0x24, 0x91, 0xB7, 0x24, 0x8F, 0xB2, 0x29, 0x02, 0xCD, 0x24, 0xA5, 0x55, 0xCA, 0x25, 0x7E, 0xAF, 0x24, 0x81, 0xAB, 0x25, 0x86, 0xB0, 0x23, 0x01, 0x55, 0xAA, 0x23, 0x4B, 0x96, 0x23, 0x4D, 0x90, 0x23, 0x5B, 0xA4, 0x23, 0x09, 0x55, 0x9F, 0x2E, 0xFF, 0x8A, 0x23, 0x35, 0x85, 0x22, 0xED, 0x7D, 0x22, 0xE9, 0x55, 0x77, 0x22, 0xDB, 0x67, 0x22, 0xD9, 0x62, 0x22, 0xE7, 0x72, 0x23, 0x39, 0x55, 0x6D, 0x22, 0xE3, 0x5C, 0x22, 0xE5, 0x57, 0x23, 0x6B, 0x9A, 0x23, 0x37, 0x55, 0x96, 0x23, 0x17, 0x80, 0x23, 0x19, 0x7C, 0x23, 0x77, 0x93, 0x23, 0x29, 0x55, 0x90, 0x25, 0x4A, 0x79, 0x23, 0x21, 0x76, 0x22, 0xFF, 0x6A, 0x23, 0x01, 0x55, 0x65, 0x24, 0x7A, 0x53, 0x22, 0xF9, 0x50, 0x28, 0xA9, 0x62, 0x23, 0x09, 0x55, 0x5F, 0x25, 0x6C, 0x4D, 0x23, 0x01, 0x4A, 0x21, 0x7F, 0x53, 0x25, 0x78, 0x51, 0x4E, 0x21, 0x77, 0x42, 0x21, 0x79, 0x3D, 0xFF, 0x52, 0x21, 0x85, 0x55, 0x4E, 0x21, 0x87, 0x40, 0x21, 0x7D, 0x3C, 0x21, 0x7F, 0x3A, 0x21, 0x69, 0x55, 0x35, 0x21, 0x6F, 0x2D, 0x25, 0xA4, 0x28, 0x2E, 0xFD, 0x30, 0x21, 0x65, 0x55, 0x2C, 0x41, 0x53, 0x1E, 0x21, 0x61, 0x1B, 0x21, 0x9F, 0x41, 0x21, 0xDD, 0x55, 0x3D, 0x21, 0xAB, 0x31, 0x21, 0x99, 0x2D, 0x21, 0xA7, 0x3B, 0x21, 0xAF, 0x55, 0x38, 0x21, 0x9F, 0x2B, 0x21, 0xA1, 0x29, 0x24, 0xE8, 0x23, 0x21, 0x95, 0x55, 0x20, 0x21, 0x77, 0x18, 0x21, 0x79, 0x15, 0x21, 0x87, 0x1E, 0x2F, 0x43, 0x55, 0x1C, 0x21, 0x83, 0x13, 0x23, 0x5E, 0x12, 0x2F, 0x4F, 0x1D, 0x40, 0x1B, 0x45, 0x19, 0x23, 0x6C, 0x14, 0xFF, 0x11, 0x26, 0x72, 0x14, 0x23, 0x76, 0x54, 0x11, 0x20, 0x09, 0x0E, 0x20, 0x01, 0x0B, 0x21, 0xA3, 0x10, 0xFF, 0x10, 0x0F, 0xFF, 0x0D, 0x40, 0x03, 0x0B, 0xFF, 0x0A, 0xFF, 0x55, 0x0C, 0x20, 0x03, 0x09, 0x25, 0x24, 0x08, 0x25, 0x28, 0x06, 0x25, 0x32, 0x55, 0x13, 0x20, 0x1D, 0x10, 0x20, 0x1F, 0x0C, 0x20, 0x15, 0x0A, 0x25, 0x3C, 0x55, 0x0F, 0x20, 0x33, 0x0D, 0x20, 0x27, 0x08, 0x20, 0x1D, 0x07, 0x25, 0x52, 0xAB, 0x50, 0x25, 0x04, 0x20, 0x01, 0x03, 0x25, 0x76, 0x02, 0x80, 0x07, 0x50, 0x01, 0x56, 0x01, 0x00, 0xB9, 0x7F, 0x20, 0x2C, 0x1D, 0x03, 0x04, 0xE9, 0x7F, 0x10, 0x04, 0x80, 0x59, 0x30, 0x18, 0xC2, 0xFE, 0xE2, 0x2C, 0x3A, 0x3A, 0x46, 0x20, 0xF8, 0xE9, 0x06, 0xFF, 0x00, 0x95, 0x00, 0xDC, 0x00, 0x3E, 0x2E, 0x03, 0x1F, 0xA9, 0x80, 0x0C, 0xF2, 0x00, 0x10, 0xF9, 0x38, 0xEF, 0x4F, 0x02, 0x50, 0x90, 0x0F, 0xFF, 0xFF, 0xC0, 0xD0, 0x00, 0xDE, 0x98, 0xBF, 0x1B, 0xCB, 0xFF, 0x2F, 0x23, 0xF1, 0xF2, 0x7F, 0x4B, 0xFF, 0x01, 0xCF, 0x27, 0x10, 0x5B, 0x20, 0x2B, 0x10, 0x00, 0x11, 0x49, 0x71, 0x7E, 0x11, 0x60, 0x07, 0xF9, 0x7E, 0x70, 0x17, 0x0B, 0x10, 0x1F, 0x3A, 0x6E, 0x0C, 0xBA, 0x5C, 0x40, 0x80, 0x41, 0xCD, 0x30, 0xE3, 0xFF, 0x20, 0xF9, 0xB7, 0xFF, 0x00, 0xFF, 0xAF, 0xCF, 0x03, 0xD1, 0xF8, 0xFF, 0x7F, 0x00, 0xFE, 0xFF, 0x0C, 0x05, 0x06, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x90, 0x80, 0xED, 0xFF, 0xEE, 0xFF, 0x05, 0x79, 0x00, 0x77, 0x00, 0xEE, 0x20, 0x07, 0x77, 0x20, 0x07, 0x00, 0x00, 0xAA, 0x00, 0x07, 0xFF, 0xFF, 0x3F, 0xCF, 0x83, 0x2B, 0x90, 0xA5, 0x00, 0x00, 0xF9, 0xF8, 0x70, 0x17, 0x80, 0x1F, 0x00, 0x4A, 0x00, 0xA0, 0x6F, 0x6F, 0xF0, 0x30, 0x00, 0x03, 0x9B, 0x00, 0x00, 0xEF, 0x23, 0x00, 0x80, 0x37, 0x80, 0x3F, 0xC5, 0xEA, 0x05, 0x00, 0x30, 0x1F, 0x80, 0xE8, 0xAB, 0x59, 0xF7, 0x59, 0x00, 0x60, 0x3F, 0xF0, 0x3B, 0xFC, 0x6B, 0xF2, 0x00, 0xE0, 0x5F, 0x00, 0x90, 0x7F, 0xA2, 0x00, 0x6A, 0xF4, 0x15, 0xF3, 0x9F, 0x8F, 0x90, 0xBF, 0xDE, 0x20, 0xDF, 0x97, 0xDC, 0x48, 0x00, 0x01, 0x20, 0x10, 0x7B, 0xFF, 0x02, 0xAF, 0xFC, 0x10, 0x30, 0xFF, 0xFA, 0x39, 0xE3, 0x4E, 0xFF, 0x00, 0x04, 0x00, 0x00, 0x65, 0x50, 0x01, 0xA9, 0x88, 0x05, 0x04, 0x01, 0xFF, 0xF6, 0x1E, 0x8F, 0xB0, 0x50, 0xEF, 0x00, 0x4A, 0x9F, 0x25, 0x01, 0x05, 0x08, 0x3C, 0x8F, 0x70, 0x90, 0x21, 0xCF, 0x70, 0xA1, 0xFA, 0x86, 0x41, 0x45, 0xFF, 0xEF, 0x02, 0x00, 0x20, 0xC5, 0x2A, 0xD9, 0x80, 0x40, 0x80, 0x30, 0x03, 0xFF, 0xFE, 0x05, 0x0B, 0xF8, 0xE1, 0x40, 0x6F, 0x2B, 0x97, 0x80, 0x90, 0x00, 0x05, 0x60, 0x00, 0x80, 0x2F, 0x66, 0xB6, 0xFF, 0xFF, 0x25, 0x06, 0x06, 0x1F, 0x04, 0xF8, 0xF8, 0x9F, 0xF8, 0xF7, 0x2F, 0x73, 0x06, 0x07, 0x48, 0xBB, 0x21, 0x06, 0xD0, 0x40, 0x3B, 0xBB, 0xB8, 0x00, 0x6F, 0x00, 0x6F, 0x70, 0xF0, 0x6F, 0x6F, 0xE0, 0xE0, 0x68, 0x01, 0xDF, 0x50, 0xA0, 0xDF, 0xDF, 0x90, 0x90, 0x20, 0x0B, 0x04, 0xF0, 0x4B, 0x00, 0xB0, 0x00, 0x20, 0x0B, 0xA0, 0x9B, 0x00, 0x00, 0x70, 0x00, 0x89, 0xFF, 0xB6, 0x8D, 0xFF, 0x00, 0xFF, 0x04, 0x03, 0xAD, 0xFD, 0x23, 0x2F, 0xF3, 0x12, 0xF3, 0x9F, 0xAF, 0x20, 0x0B, 0x04, 0xBB, 0x2D, 0xB5, 0xF3, 0x00, 0xF3, 0xAF, 0xBF, 0xB2, 0x00, 0x8B, 0x00, 0xE8, 0x00, 0xB0, 0xFF, 0xEF, 0xC0, 0xC0, 0xFF, 0xFF, 0x49, 0x06, 0x10, 0x81, 0xFD, 0x90, 0xC1, 0x2B, 0x9B, 0x20, 0x0B, 0x90, 0x00, 0x00, 0xBB, 0x00, 0xA0, 0x21, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0xB3, 0x00, 0xCC, 0x07, 0x7C, 0xFA, 0x68, 0x00, 0xAC, 0xFB, 0x89, 0x00, 0x0A, 0x95, 0xFA, 0x5F, 0x00, 0x48, 0xF8, 0xF9, 0x03, 0x06, 0x72, 0xFA, 0xBD, 0x00, 0x21, 0x9D, 0x01, 0x17, 0x0D, 0xF9, 0xF9, 0x01, 0x00, 0x00, 0xB7, 0x00, 0x58, 0xDF, 0xDB, 0xD8, 0x4F, 0x00, 0x3F, 0x30, 0x20, 0x3A, 0xFF, 0x00, 0x03, 0xFF, 0x00, 0xFF, 0x38, 0x6A, 0x4F, 0x4F, 0x20, 0x30, 0x3B, 0x82, 0x2E, 0x19, 0xFF, 0xFF, 0x4A, 0x0B, 0xBB, 0x2E, 0x18, 0x70, 0x00, 0xFA, 0xCC, 0x5E, 0xFF, 0xFF, 0x09, 0x08, 0xFA, 0x00, 0xFA, 0x8F, 0x8F, 0xF3, 0xF3, 0x8F, 0x7F, 0xFF, 0x00, 0xFC, 0x08, 0x3D, 0x91, 0x00, 0xDD, 0x00, 0xF3, 0x00, 0xF9, 0x8F, 0x9F, 0xBA, 0x00, 0x6B, 0x00, 0x00, 0x00, 0xB0, 0xC7, 0xAF, 0xF4, 0xF7, 0x6F, 0x7F, 0xDC, 0x00, 0x70, 0x19, 0xDF, 0x30, 0x30, 0xFF, 0xFF, 0xF5, 0x00, 0xC0, 0x6F, 0x9F, 0x10, 0x00, 0xD8, 0x00, 0x30, 0x00, 0x60, 0xFF, 0xEF, 0xDB, 0x12, 0x2A, 0x00, 0x31, 0x90, 0x2E, 0x70, 0x09, 0x0C, 0x34, 0xF2, 0xFF, 0xFE, 0x00, 0x10, 0x11, 0xFD, 0xFF, 0x09, 0x5B, 0xEB, 0x40, 0x40, 0xB0, 0x20, 0x2B, 0x06, 0xFF, 0x9F, 0x1E, 0x08, 0x09, 0x20, 0x1F, 0xAE, 0x7F, 0x05, 0x84, 0x09, 0xE4, 0x31, 0x40, 0x00, 0xFF, 0xE4, 0x3F, 0x49, 0x9F, 0xFF, 0x03, 0x02, 0xBF, 0xFA, 0x30, 0xFF, 0xC8, 0x00, 0x0F, 0x49, 0x23, 0xFC, 0xBF, 0x24, 0x02, 0xEE, 0x24, 0x02, 0x40, 0x07, 0x00, 0x05, 0xFA, 0x60, 0x17, 0x70, 0x1F, 0x00, 0x05, 0xFA, 0xB0, 0x09, 0x90, 0x1F, 0x87, 0xD0, 0xBF, 0x55, 0xFA, 0x20, 0xFB, 0xF9, 0xFF, 0x01, 0xFF, 0x8C, 0xAF, 0x03, 0xFF, 0x5E, 0x04, 0x10, 0x16, 0x4D, 0xE6, 0x01, 0x43, 0x4C, 0x49, 0x4D, 0xFF, 0xFE, 0x14, 0x2F, 0xFF, 0x18, 0x02, 0x02, 0x28, 0x26, 0xF7, 0x38, 0x90, 0x69, 0x6D, 0x61, 0x54, 0x67, 0x37, 0x02, 0x80, 0x27, 0xBE, 0x0D, 0x67, 0x0F, 0x9C, 0x6D, 0x00, 0xF7, 0xA2, 0xC3, 0x19, 0x7A, 0x1E, 0xE4, 0xC4, 0x00, 0x31, 0xB6, 0x92, 0x11, 0x0E, 0x96, 0xE4, 0xD2, 0x00, 0xE7, 0xF3, 0x4C, 0xB3, 0xFF, 0x51, 0x7C, 0x7E, 0x00, 0x52, 0x2C, 0x8D, 0x15, 0xC5, 0xAB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -static const unsigned char iQue_without_ISBN_LZ[0x2000] = -{ - 0x11, 0x48, 0x65, 0x00, 0x00, 0x64, 0x61, 0x72, 0x63, 0xFF, 0xFE, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x28, 0x65, 0x00, 0x00, 0x83, 0x30, 0x09, 0x1C, 0x04, 0x00, 0x00, 0x40, 0x20, 0x03, 0x30, 0x13, 0xAB, 0x30, 0x18, 0x15, 0x20, 0x1D, 0x02, 0xA0, 0x0B, 0x06, 0x20, 0x2B, 0x30, 0x18, 0x5A, 0x09, 0x20, 0x35, 0x10, 0x20, 0x39, 0x30, 0x2B, 0xF8, 0x20, 0x41, 0x54, 0x85, 0x30, 0x0B, 0x05, 0x00, 0x00, 0xEC, 0x20, 0x4D, 0x98, 0x30, 0x17, 0xD0, 0x20, 0x28, 0x30, 0x17, 0xDC, 0x30, 0x23, 0x07, 0x00, 0x00, 0xCC, 0x09, 0x0C, 0x00, 0x00, 0x20, 0x20, 0x51, 0x20, 0x14, 0x20, 0x2B, 0xA0, 0x20, 0x0B, 0x64, 0x20, 0x5D, 0x80, 0x20, 0x00, 0x00, 0x4C, 0x99, 0x20, 0x5C, 0xA8, 0x01, 0x50, 0x53, 0x20, 0x22, 0x00, 0xB2, 0x20, 0x75, 0x34, 0xE0, 0x22, 0x20, 0x13, 0x20, 0x74, 0xE2, 0x20, 0x81, 0xA0, 0x25, 0x13, 0x00, 0x00, 0x3C, 0x20, 0x68, 0x12, 0x02, 0x50, 0x77, 0x30, 0x8F, 0x41, 0x1C, 0x20, 0x90, 0x00, 0x36, 0x00, 0x00, 0x28, 0x20, 0xAB, 0x4D, 0x3E, 0x20, 0x9C, 0x80, 0x3A, 0x20, 0x0B, 0x20, 0xAD, 0x60, 0x30, 0x17, 0x54, 0x3C, 0x50, 0x17, 0x82, 0x30, 0x17, 0x40, 0x20, 0x23, 0x08, 0x00, 0x2D, 0x00, 0xA4, 0x30, 0x2F, 0x49, 0x20, 0x67, 0x20, 0xE9, 0xC4, 0x30, 0x3B, 0x56, 0x4A, 0x50, 0x17, 0xDC, 0x30, 0x3B, 0x52, 0x20, 0x47, 0x20, 0xE0, 0xF4, 0xB2, 0x30, 0x53, 0x55, 0x20, 0x53, 0x30, 0xD4, 0x00, 0x2E, 0x21, 0x13, 0x61, 0x02, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x6D, 0x21, 0x1D, 0x4E, 0x82, 0x20, 0x07, 0x6E, 0x00, 0x74, 0x00, 0x65, 0x20, 0x11, 0x64, 0x0A, 0x00, 0x6F, 0x00, 0x4C, 0x20, 0x03, 0x67, 0x20, 0x07, 0x5F, 0x28, 0x00, 0x44, 0x20, 0x03, 0x30, 0x20, 0x01, 0x5F, 0x00, 0x53, 0x20, 0x00, 0x63, 0x40, 0x1F, 0x65, 0x00, 0x4F, 0x00, 0x75, 0xAB, 0x20, 0x2B, 0x41, 0x20, 0x43, 0x62, 0x20, 0x13, 0x6C, 0x40, 0x47, 0x02, 0x50, 0x43, 0x57, 0x42, 0x03, 0x20, 0x43, 0x43, 0x01, 0x80, 0x87, 0x55, 0x03, 0x20, 0xCB, 0x00, 0x90, 0x43, 0x01, 0x90, 0xCB, 0xD7, 0x00, 0x90, 0x87, 0xF0, 0xCB, 0x62, 0x21, 0x5D, 0x79, 0x21, 0x97, 0x01, 0x31, 0xA1, 0x71, 0x8D, 0xEA, 0x00, 0xF0, 0x2F, 0x71, 0x05, 0xD0, 0x2F, 0x74, 0x42, 0x09, 0x67, 0x23, 0x29, 0x33, 0xBD, 0x22, 0x01, 0x73, 0xA2, 0x01, 0xB0, 0x5B, 0x52, 0x2D, 0x00, 0x10, 0x21, 0x31, 0x01, 0x00, 0x21, 0x55, 0x32, 0x01, 0x00, 0x43, 0x33, 0xE0, 0x65, 0x4C, 0x23, 0x71, 0x4D, 0x22, 0xA3, 0x1F, 0x73, 0x00, 0x6B, 0x00, 0x40, 0x85, 0x30, 0x1F, 0x00, 0xB0, 0x17, 0xF0, 0x93, 0xF2, 0xE3, 0x41, 0x5F, 0x20, 0xB5, 0x32, 0x00, 0x38, 0x00, 0x78, 0x23, 0x68, 0x60, 0x34, 0xE0, 0xE1, 0x70, 0x02, 0x43, 0x4C, 0x41, 0x4E, 0xFF, 0x46, 0xFE, 0x23, 0xD0, 0x00, 0x02, 0x02, 0x34, 0x03, 0x33, 0x96, 0x70, 0x1D, 0x61, 0x74, 0x31, 0x23, 0x82, 0x44, 0x3E, 0x34, 0x59, 0x28, 0x33, 0x73, 0x10, 0xFF, 0xFF, 0xFF, 0x34, 0x4C, 0x53, 0x63, 0x65, 0x6E, 0x04, 0x65, 0x4F, 0x75, 0x74, 0x41, 0x24, 0x71, 0x47, 0x5F, 0x0C, 0x41, 0x5F, 0x30, 0x30, 0xA0, 0x4C, 0x40, 0x3B, 0x69, 0x31, 0xCD, 0x33, 0xA3, 0x50, 0x3F, 0x02, 0x00, 0x30, 0x59, 0x34, 0x9D, 0x68, 0x24, 0xA1, 0x00, 0x50, 0x5F, 0x4E, 0x69, 0x6E, 0x4C, 0x6F, 0x67, 0x70, 0x6F, 0xA0, 0x35, 0x34, 0xA0, 0x34, 0xBD, 0x43, 0x4C, 0x56, 0x43, 0x8F, 0x74, 0x3F, 0x00, 0x10, 0x02, 0x40, 0x87, 0x40, 0x0B, 0xD0, 0x5D, 0x20, 0x76, 0x20, 0x7F, 0x43, 0x34, 0xEC, 0x4E, 0x5F, 0x52, 0x6F, 0x6F, 0x73, 0x74, 0xD0, 0x7E, 0x00, 0x70, 0x4B, 0x80, 0x57, 0x00, 0x20, 0x20, 0x3B, 0x50, 0x3F, 0xF8, 0x00, 0x30, 0xFF, 0x34, 0xF7, 0xB0, 0xFF, 0x24, 0xD2, 0x80, 0xFF, 0x00, 0x00, 0x1E, 0xD5, 0x45, 0x4C, 0x70, 0xFF, 0x42, 0x40, 0xFF, 0x42, 0x00, 0x40, 0xFF, 0x9C, 0x80, 0x2D, 0xB2, 0x90, 0xFF, 0x5C, 0x01, 0xE0, 0xFF, 0x90, 0xB3, 0x34, 0xC2, 0x02, 0xD0, 0xF3, 0xC8, 0xFD, 0x20, 0xAA, 0xD0, 0xF3, 0x00, 0x70, 0xFF, 0xF1, 0xFF, 0x31, 0x39, 0x71, 0xFF, 0x65, 0x23, 0x31, 0xC5, 0xB1, 0xFF, 0x31, 0x84, 0x47, 0x5F, 0x43, 0x00, 0x81, 0xFF, 0x0F, 0xE1, 0xFF, 0x99, 0x02, 0x90, 0xFF, 0x12, 0xC3, 0x02, 0x31, 0xF3, 0x92, 0x3F, 0x80, 0xBF, 0x91, 0xF3, 0x7B, 0x60, 0x32, 0xB6, 0x00, 0x80, 0xFF, 0x36, 0xDF, 0x03, 0x32, 0xFF, 0x7C, 0x27, 0x27, 0x53, 0x3F, 0x55, 0x0D, 0x42, 0xFF, 0x48, 0x27, 0x9D, 0xB0, 0x27, 0xA1, 0xA4, 0x27, 0x8D, 0x60, 0x24, 0x27, 0x88, 0x36, 0xCB, 0x30, 0x03, 0x00, 0x00, 0xBC, 0xAD, 0x20, 0x03, 0x24, 0x27, 0xAB, 0x88, 0x37, 0x73, 0x27, 0x94, 0xB0, 0x26, 0xE7, 0x02, 0x74, 0x0A, 0x00, 0x00, 0x78, 0x0B, 0x32, 0xDF, 0x57, 0xF9, 0x00, 0x03, 0x5B, 0x37, 0x32, 0x27, 0x6E, 0x26, 0xB1, 0x33, 0xB7, 0x50, 0x41, 0x83, 0x2F, 0x71, 0x02, 0xF2, 0xE3, 0x73, 0xDB, 0x01, 0x13, 0x07, 0x50, 0x5F, 0x33, 0x00, 0x80, 0x67, 0x77, 0xB8, 0x60, 0x67, 0x20, 0xAA, 0x43, 0xC7, 0x38, 0x63, 0xC7, 0x30, 0x6F, 0x93, 0x9F, 0x53, 0xA0, 0x24, 0x0A, 0xA0, 0x27, 0xA5, 0x80, 0xBE, 0x24, 0x39, 0x23, 0x16, 0x23, 0xA0, 0xC0, 0x48, 0x79, 0x06, 0x02, 0x00, 0x30, 0x37, 0x70, 0x23, 0x00, 0x33, 0x33, 0xB3, 0x3F, 0xFC, 0x2D, 0xEC, 0xBC, 0x8C, 0x70, 0x0B, 0x0A, 0xD7, 0x23, 0x20, 0x0B, 0x30, 0x2F, 0x80, 0x3F, 0xBC, 0x48, 0xA9, 0x07, 0x01, 0xD0, 0x2F, 0xF4, 0x2F, 0xB0, 0x6B, 0x39, 0x0C, 0x40, 0x9D, 0x6F, 0x1C, 0x30, 0x97, 0x61, 0xEF, 0xCC, 0x28, 0x45, 0x30, 0x9B, 0x70, 0xF3, 0x24, 0x87, 0xDC, 0xE4, 0xB9, 0x71, 0x5B, 0x50, 0xF1, 0x5B, 0x29, 0x39, 0xD4, 0x8B, 0x70, 0xC1, 0x14, 0xCD, 0xCC, 0xCC, 0x20, 0xEB, 0x20, 0x24, 0x02, 0xF8, 0xC1, 0xF9, 0x00, 0x31, 0x67, 0x00, 0x14, 0xBB, 0x30, 0x7F, 0x30, 0x2F, 0x71, 0x73, 0x44, 0x73, 0xF5, 0x38, 0x94, 0x01, 0x90, 0x7F, 0x3C, 0xC2, 0x20, 0x7F, 0x3E, 0x02, 0xD0, 0x7F, 0x52, 0x65, 0x70, 0x64, 0x01, 0x70, 0xFF, 0xC1, 0xEB, 0x45, 0x43, 0xC2, 0xB7, 0x6D, 0xDB, 0xAE, 0x20, 0x7F, 0x8C, 0x25, 0x02, 0x20, 0x00, 0x40, 0xFF, 0x91, 0xF7, 0xB6, 0x1B, 0x5C, 0xA0, 0xA4, 0x87, 0xB4, 0x35, 0x3E, 0x00, 0x92, 0x24, 0xE9, 0xC0, 0xBD, 0x60, 0x8B, 0x31, 0x00, 0x32, 0xE7, 0x35, 0x33, 0xF2, 0xE7, 0x92, 0x53, 0xF0, 0x26, 0x82, 0x7F, 0x20, 0x25, 0x1B, 0x90, 0x0B, 0x50, 0x97, 0x34, 0xEF, 0x00, 0x50, 0x97, 0x96, 0x53, 0x30, 0x3B, 0xAF, 0x77, 0x04, 0xAA, 0xF1, 0x17, 0x32, 0x02, 0x13, 0x73, 0x32, 0xF7, 0x50, 0x8B, 0x00, 0x96, 0x7B, 0xF9, 0x33, 0x1B, 0x57, 0x78, 0x00, 0x31, 0x7F, 0x3B, 0x90, 0x57, 0x07, 0x54, 0x53, 0x2A, 0xEE, 0xB7, 0x47, 0x73, 0x4C, 0x37, 0x8B, 0x2B, 0xD9, 0x94, 0x63, 0x8B, 0x3B, 0x87, 0x3B, 0xD1, 0x61, 0x24, 0x4B, 0xD5, 0x00, 0x01, 0x97, 0xC0, 0x39, 0x8E, 0xE3, 0x2B, 0x39, 0xE8, 0x51, 0x5B, 0x5B, 0xFD, 0x01, 0x20, 0x23, 0x03, 0xF7, 0x6B, 0x40, 0x41, 0x9E, 0x11, 0x15, 0x8D, 0xBD, 0x31, 0xA3, 0x9A, 0x99, 0xB9, 0x2B, 0x7D, 0xAA, 0x2C, 0x5A, 0x04, 0x01, 0x10, 0x23, 0x01, 0x01, 0x20, 0x8F, 0x01, 0x01, 0x20, 0x8F, 0x01, 0xAD, 0x00, 0x10, 0x8F, 0xC1, 0x20, 0x8F, 0x3D, 0x60, 0x8F, 0x44, 0x5B, 0x01, 0x00, 0x10, 0x8F, 0x82, 0x00, 0x00, 0x23, 0x50, 0x5F, 0x42, 0x6C, 0x6B, 0x03, 0xE1, 0x63, 0x9A, 0x03, 0x99, 0x19, 0xC0, 0x0E, 0x74, 0xDA, 0x00, 0xC1, 0x63, 0x00, 0x40, 0x23, 0xFE, 0x04, 0x61, 0x63, 0x00, 0x30, 0x8F, 0xF1, 0x63, 0x00, 0x40, 0x23, 0x03, 0x81, 0x63, 0x00, 0x13, 0xBB, 0x00, 0x32, 0xC7, 0x58, 0xAA, 0x2E, 0x9D, 0x88, 0x66, 0x4F, 0xE8, 0x2E, 0xA9, 0x18, 0x2E, 0x95, 0x48, 0xBE, 0x2E, 0x99, 0x78, 0x62, 0xC7, 0xE3, 0xD3, 0x56, 0x3F, 0x60, 0x0B, 0x52, 0xD3, 0xF0, 0xF7, 0xC2, 0xD3, 0x01, 0xC0, 0x2F, 0x22, 0xDF, 0xD4, 0x33, 0x40, 0x68, 0x03, 0x50, 0x0B, 0x52, 0xEB, 0x7F, 0xF0, 0xC2, 0xEB, 0x01, 0xB0, 0x2F, 0x32, 0xF7, 0x01, 0xB0, 0xBF, 0x33, 0x03, 0x01, 0xC0, 0x2F, 0x00, 0x10, 0xBF, 0xFF, 0x46, 0x73, 0x70, 0x0B, 0x53, 0x1B, 0x40, 0xBF, 0x83, 0x1B, 0x01, 0xB0, 0x2F, 0x63, 0x27, 0x03, 0xC1, 0xC3, 0xFF, 0x33, 0x27, 0x75, 0x97, 0x93, 0x33, 0x00, 0x91, 0xC3, 0x01, 0x00, 0x2F, 0x05, 0xE1, 0xC3, 0x00, 0xF0, 0xBF, 0xF1, 0xC3, 0xFF, 0x01, 0x00, 0x2F, 0x05, 0x01, 0xC3, 0x00, 0x16, 0xB7, 0x00, 0x36, 0x4F, 0x35, 0xCC, 0x33, 0x8B, 0x36, 0x53, 0x33, 0x8F, 0x5F, 0xA0, 0x69, 0xE3, 0xD0, 0x6D, 0xAB, 0xE6, 0xCF, 0x59, 0xC7, 0x26, 0x43, 0x00, 0x40, 0x17, 0xFF, 0x26, 0x37, 0xD6, 0xFF, 0x63, 0x57, 0x26, 0x2B, 0x00, 0x30, 0x17, 0x36, 0x1F, 0x00, 0x30, 0x5F, 0x36, 0x13, 0xFF, 0x00, 0x40, 0x17, 0x00, 0x10, 0x5F, 0x49, 0x6B, 0x35, 0xFB, 0x00, 0x30, 0x17, 0x65, 0xEF, 0x03, 0xC1, 0x03, 0x82, 0xC7, 0xFF, 0xE1, 0x03, 0x82, 0xDF, 0x02, 0xE1, 0x03, 0x73, 0x27, 0xF1, 0x03, 0x80, 0x17, 0x01, 0xE1, 0x03, 0x00, 0xFD, 0xDF, 0x6E, 0x54, 0xEC, 0xDF, 0x02, 0x7E, 0xDF, 0x04, 0x2F, 0xA4, 0x5F, 0x0D, 0xDC, 0xDF, 0x50, 0xAA, 0x2F, 0xCC, 0xB8, 0x2F, 0xD0, 0x20, 0x2F, 0xBC, 0xA0, 0x2F, 0xC0, 0x2C, 0xAA, 0x2C, 0xE3, 0xAC, 0x2C, 0xE7, 0x10, 0x2C, 0xDF, 0x74, 0x2C, 0xDF, 0xD8, 0x5F, 0x07, 0x2D, 0x17, 0x09, 0x2C, 0x31, 0x2C, 0xE3, 0x02, 0x9C, 0xDF, 0x3E, 0xCF, 0x00, 0xFC, 0xDF, 0xD7, 0x9E, 0xF3, 0x00, 0xBC, 0xDF, 0x7C, 0xEC, 0xDF, 0x2C, 0x6D, 0x5B, 0xDD, 0x4F, 0x4C, 0xE3, 0xFF, 0x8C, 0xD3, 0xD0, 0x17, 0x9C, 0xBB, 0x00, 0x30, 0x17, 0x00, 0x9F, 0xD3, 0x3F, 0xFD, 0x01, 0x1C, 0x8B, 0x00, 0x0D, 0xE7, 0xBF, 0xC3, 0xA3, 0xA0, 0x2C, 0x7B, 0x00, 0x5C, 0x7F, 0xD0, 0x23, 0x01, 0x1C, 0x73, 0x03, 0xD0, 0x67, 0x02, 0x7C, 0x5B, 0x6F, 0x70, 0x2B, 0xCB, 0x7C, 0x5B, 0x20, 0x3B, 0xDB, 0x00, 0xED, 0x5B, 0x3E, 0x67, 0x7F, 0xD7, 0xEF, 0x5B, 0xCF, 0x00, 0xFC, 0x4F, 0x00, 0xDC, 0xDB, 0xF0, 0x2D, 0xCB, 0x80, 0x7F, 0x01, 0x2C, 0xDB, 0x30, 0x2F, 0xBF, 0x7F, 0xFB, 0xC8, 0x2F, 0x03, 0x7C, 0xDB, 0x5B, 0xE7, 0xAC, 0xDB, 0x00, 0x4C, 0x4F, 0x03, 0x3D, 0x67, 0xFF, 0x00, 0x1E, 0x67, 0xDD, 0x67, 0x04, 0x1C, 0x67, 0x41, 0xA3, 0x79, 0x93, 0x9D, 0x43, 0xCC, 0x67, 0x00, 0x60, 0x23, 0xFF, 0xCC, 0x67, 0x31, 0xEB, 0x89, 0x7B, 0x28, 0x2F, 0x00, 0x3C, 0x67, 0x00, 0x50, 0x23, 0xDC, 0x67, 0x00, 0x50, 0x8F, 0xFF, 0xDC, 0x67, 0x00, 0x60, 0x23, 0x00, 0x10, 0x8F, 0x79, 0x4B, 0x30, 0x8F, 0x00, 0x2C, 0x67, 0x00, 0x50, 0x23, 0x04, 0x1C, 0x67, 0x3F, 0x70, 0xC2, 0xA9, 0x33, 0x00, 0x81, 0x63, 0x00, 0x40, 0x23, 0x04, 0x61, 0x63, 0x00, 0x30, 0x8F, 0xF1, 0x63, 0xFF, 0x00, 0x40, 0x23, 0x03, 0x81, 0x63, 0x01, 0x5C, 0x67, 0x01, 0x9F, 0x2F, 0x43, 0xEB, 0x6F, 0x2F, 0x9F, 0x97, 0xDF, 0x2F, 0xFF, 0x00, 0x60, 0x23, 0xCF, 0x2F, 0x34, 0x33, 0x7F, 0x2F, 0x38, 0x2F, 0x00, 0x3F, 0x2F, 0x00, 0x50, 0x23, 0xDF, 0x2F, 0xFF, 0x00, 0x50, 0x8F, 0xDF, 0x2F, 0x00, 0x60, 0x23, 0x00, 0x10, 0x8F, 0x6F, 0x2F, 0x40, 0x8F, 0x00, 0x2F, 0x2F, 0x00, 0x50, 0x23, 0xFF, 0x01, 0x7C, 0x07, 0x01, 0xB1, 0x63, 0x9F, 0x2F, 0x00, 0x91, 0x63, 0x00, 0x40, 0x23, 0x04, 0x61, 0x63, 0x00, 0x30, 0x8F, 0xF1, 0x63, 0xFF, 0x00, 0x40, 0x23, 0x03, 0x81, 0x63, 0x01, 0x5B, 0xA7, 0x01, 0x95, 0x8F, 0x46, 0x27, 0x6F, 0x23, 0x9F, 0xDF, 0xD5, 0x8F, 0xFF, 0x00, 0x60, 0x23, 0xC5, 0x8F, 0x4F, 0xDF, 0x6F, 0x0B, 0x4F, 0xDF, 0x00, 0x25, 0x8F, 0x00, 0x50, 0x23, 0xD5, 0x8F, 0xFF, 0x00, 0x50, 0x8F, 0xD5, 0x8F, 0x00, 0x60, 0x23, 0x00, 0x10, 0x8F, 0x6E, 0xDB, 0x40, 0x8F, 0x00, 0x25, 0x8F, 0x00, 0x50, 0x23, 0xFF, 0x01, 0x7C, 0x07, 0x01, 0xB1, 0x63, 0x9E, 0xC3, 0x00, 0x91, 0x63, 0x00, 0x40, 0x23, 0x04, 0x61, 0x63, 0x00, 0x30, 0x8F, 0xF1, 0x63, 0xEF, 0x00, 0x40, 0x23, 0x03, 0x61, 0x63, 0x00, 0x7C, 0x5F, 0x4C, 0x2C, 0x5C, 0xBC, 0x5F, 0x3E, 0x51, 0x7C, 0x5F, 0x18, 0x65, 0x00, 0x73, 0xCC, 0x5F, 0x3B, 0x9C, 0x47, 0x5F, 0x43, 0xAF, 0x00, 0x4C, 0x5F, 0xFC, 0x2E, 0xBB, 0x0F, 0x5B, 0x58, 0x4C, 0x5F, 0x3C, 0x82, 0x3B, 0xAB, 0x55, 0xBC, 0x2F, 0xFF, 0xFC, 0x2F, 0xF8, 0x3C, 0x2E, 0xDB, 0x7C, 0x2E, 0xDF, 0x7C, 0xBC, 0x2E, 0xE3, 0x00, 0x3C, 0x47, 0x3E, 0xC7, 0x5E, 0xFB, 0x00, 0x7A, 0x3B, 0x80, 0xBF, 0xBD, 0x9A, 0x3B, 0x60, 0x88, 0xC7, 0x00, 0x3C, 0x2B, 0x00, 0x70, 0x4B, 0x9F, 0x2B, 0xCA, 0x2A, 0xB7, 0xDF, 0x00, 0x9B, 0xCB, 0x01, 0x10, 0x3F, 0xF2, 0xA0, 0x3F, 0x00, 0x1B, 0xA3, 0x01, 0xD0, 0x3F, 0x00, 0x29, 0xEF, 0x01, 0x00, 0xBF, 0x7B, 0x8E, 0x2B, 0x77, 0x70, 0xFF, 0x00, 0x27, 0x67, 0x01, 0x00, 0xFF, 0x24, 0xF0, 0x3F, 0xDF, 0x83, 0xB2, 0x01, 0x01, 0x3F, 0x30, 0x00, 0x8E, 0xBB, 0x5E, 0xBF, 0x59, 0x54, 0x7E, 0xBF, 0xA8, 0xA1, 0x2E, 0xBC, 0x10, 0x2F, 0xFB, 0x6C, 0x79, 0x74, 0x31, 0x3E, 0xD1, 0x90, 0x4A, 0x9E, 0x00, 0xA0, 0x2D, 0xE7, 0x70, 0x43, 0x74, 0x78, 0x36, 0x6C, 0x31, 0x3F, 0xDF, 0x3F, 0xBF, 0x04, 0x2F, 0xFF, 0x2D, 0x55, 0x74, 0x00, 0x65, 0x6E, 0x64, 0x6F, 0x5F, 0x31, 0x32, 0x38, 0x00, 0x78, 0x36, 0x34, 0x2E, 0x62, 0x63, 0x6C, 0x69, 0x57, 0x6D, 0x2F, 0xFF, 0x6D, 0x2E, 0xFB, 0x60, 0x62, 0x23, 0x30, 0x4B, 0x4D, 0x7F, 0x08, 0x4C, 0x6F, 0x67, 0x6F, 0xAE, 0xE9, 0xFF, 0xFF, 0xFF, 0xDF, 0x30, 0x03, 0x00, 0x40, 0x02, 0x15, 0x5F, 0xE0, 0x30, 0x62, 0xAF, 0x72, 0x3E, 0x07, 0x5E, 0x0B, 0x08, 0x70, 0x61, 0x6E, 0x31, 0x3B, 0x4F, 0x01, 0x04, 0xFF, 0x00, 0x00, 0x52, 0x6F, 0x6F, 0x74, 0x50, 0x61, 0x6E, 0x70, 0x65, 0x00, 0xB0, 0xDF, 0x00, 0x50, 0x47, 0x50, 0xD3, 0x70, 0x61, 0x73, 0x31, 0xD3, 0x3B, 0xA3, 0x70, 0x53, 0x03, 0x20, 0x53, 0x4E, 0x5F, 0x30, 0x55, 0x00, 0x0F, 0x96, 0xD0, 0x01, 0x20, 0x53, 0x4C, 0xD3, 0x42, 0x80, 0x53, 0x69, 0x63, 0x31, 0x80, 0x9F, 0x3C, 0x0F, 0x07, 0xFF, 0x00, 0x41, 0x03, 0x7E, 0xE0, 0x2D, 0x5B, 0x82, 0x1F, 0x00, 0x20, 0xEF, 0x9E, 0x2F, 0x63, 0x80, 0x42, 0xF1, 0x2B, 0x71, 0x99, 0xCF, 0x23, 0xC1, 0x27, 0x80, 0x0C, 0x3F, 0x70, 0x61, 0x65, 0x60, 0xDB, 0x50, 0x07, 0x67, 0x72, 0x30, 0x70, 0x31, 0x3C, 0x97, 0x31, 0x33, 0x47, 0x72, 0x6F, 0x75, 0xCE, 0x3C, 0x8F, 0x7F, 0xE7, 0x67, 0x72, 0x51, 0x07, 0x30, 0x23, 0x34, 0x57, 0x47, 0x3F, 0x5F, 0x41, 0xCF, 0xD3, 0x3F, 0xCF, 0xF1, 0x17, 0xF1, 0xD7, 0x30, 0x5F, 0x3F, 0xDF, 0x1F, 0x47, 0x5F, 0x42, 0xCF, 0x6D, 0x3F, 0xE7, 0x00, 0x90, 0x2B, 0xD4, 0x9F, 0x3F, 0xFB, 0x9A, 0xF1, 0x7F, 0x67, 0x72, 0x50, 0xC7, 0x01, 0x32, 0xBF, 0x3C, 0x22, 0xBC, 0x22, 0xB5, 0x00, 0x02, 0xBF, 0xC8, 0x82, 0xBF, 0x3D, 0x7F, 0x07, 0x64, 0xBB, 0x2D, 0x2F, 0xFF, 0x9D, 0x2F, 0x08, 0x00, 0x4F, 0x34, 0xA1, 0x32, 0xF3, 0x2F, 0xFF, 0x78, 0x2F, 0xFB, 0x1D, 0x33, 0x64, 0x73, 0x62, 0xAD, 0x62, 0xD2, 0x80, 0x10, 0x31, 0xF0, 0x10, 0x53, 0x32, 0xF0, 0x21, 0x33, 0x63, 0x05, 0x4C, 0x54, 0x90, 0x3E, 0x30, 0x0B, 0x83, 0x70, 0x39, 0x4C, 0x54, 0x4D, 0x61, 0x73, 0x3C, 0xCC, 0x63, 0x2D, 0x82, 0x33, 0x2B, 0xA8, 0x06, 0x00, 0x00, 0x0B, 0x2F, 0xFC, 0x38, 0xAA, 0x2F, 0xFF, 0x88, 0x2F, 0xFB, 0x08, 0x2F, 0xF4, 0x88, 0x2F, 0xF8, 0x08, 0xAA, 0x2F, 0xD4, 0x88, 0x2F, 0xD8, 0x4C, 0x2F, 0x10, 0xE8, 0x2F, 0x14, 0xAC, 0x9D, 0x23, 0x74, 0x48, 0x05, 0x2F, 0xD7, 0x20, 0x2F, 0x00, 0x35, 0x47, 0xAA, 0x53, 0x57, 0xBB, 0x00, 0x83, 0x53, 0x02, 0x00, 0xA3, 0x53, 0x00, 0x35, 0x57, 0x00, 0xB3, 0xA3, 0xD5, 0x20, 0xB3, 0x00, 0xB3, 0xA3, 0x68, 0x40, 0x24, 0x20, 0x30, 0x03, 0x11, 0x2F, 0xFB, 0x74, 0x06, 0x00, 0x61, 0x04, 0x30, 0x03, 0x30, 0x0B, 0x65, 0x06, 0x00, 0x01, 0x30, 0x03, 0xE9, 0x30, 0x17, 0x31, 0x87, 0x5E, 0x03, 0x05, 0x2F, 0x47, 0x4F, 0x5F, 0x31, 0x32, 0xB0, 0x01, 0xB0, 0x7F, 0x01, 0x03, 0xE0, 0x7F, 0xD2, 0xB5, 0x00, 0x00, 0x8C, 0x8C, 0x77, 0x8C, 0x05, 0xA0, 0x7F, 0x00, 0x16, 0x97, 0x00, 0xF1, 0x7F, 0x03, 0x03, 0xC1, 0x7F, 0x00, 0x16, 0xD7, 0x45, 0xA7, 0xCB, 0x2F, 0xB4, 0x00, 0x25, 0xA7, 0x80, 0x3F, 0x23, 0x44, 0x04, 0x25, 0xA3, 0x30, 0x03, 0x00, 0x06, 0x00, 0x06, 0x06, 0x73, 0x09, 0xED, 0xBE, 0xC3, 0x30, 0x03, 0x3F, 0xFB, 0x3A, 0x57, 0xDE, 0x40, 0x30, 0x03, 0xE0, 0x13, 0x70, 0xC0, 0x30, 0x03, 0x00, 0x75, 0xD3, 0x78, 0x54, 0x10, 0x04, 0x00, 0x01, 0x0A, 0x10, 0x04, 0x10, 0x02, 0xA2, 0x37, 0x46, 0xF2, 0x37, 0x26, 0x0F, 0x06, 0x02, 0x05, 0x66, 0x23, 0x33, 0x00, 0x12, 0x43, 0x4D, 0x5F, 0x00, 0x35, 0xB6, 0x96, 0x00, 0x36, 0x6A, 0x80, 0xEA, 0x23, 0x77, 0x05, 0x26, 0x67, 0x30, 0x03, 0x30, 0x1F, 0x8E, 0xE3, 0xBE, 0x30, 0x03, 0xB0, 0xBF, 0xE0, 0x13, 0xC0, 0xBF, 0x50, 0xA7, 0x78, 0x00, 0x00, 0xC0, 0xA7, 0x00, 0x21, 0x5F, 0xCF, 0x5F, 0x01, 0xB1, 0x5F, 0x2F, 0xA1, 0xBD, 0x61, 0xBF, 0x30, 0x03, 0x3F, 0xF7, 0xCE, 0x95, 0x17, 0x41, 0x30, 0x03, 0xBC, 0xE0, 0x13, 0xC1, 0x30, 0x03, 0x05, 0x21, 0x5F, 0x00, 0x00, 0xC3, 0x01, 0x31, 0x5F, 0x61, 0x0B, 0x3F, 0xB6, 0xBF, 0x30, 0x03, 0xB0, 0xBF, 0xE0, 0x13, 0xC0, 0xBF, 0x02, 0x61, 0x5F, 0xCD, 0xF7, 0xFF, 0x01, 0xB2, 0xBF, 0x3F, 0xF7, 0x50, 0x03, 0x5D, 0xA7, 0x50, 0x03, 0xC0, 0x13, 0x4F, 0xF7, 0x05, 0x22, 0xBF, 0xFF, 0x00, 0x00, 0xC3, 0x01, 0x32, 0xBF, 0x3F, 0xE3, 0x3F, 0xE7, 0xB0, 0xBF, 0xE0, 0x13, 0xC0, 0xBF, 0x01, 0xF2, 0xBF, 0xFF, 0x03, 0x59, 0x73, 0x57, 0x87, 0x00, 0x59, 0x73, 0x00, 0x1C, 0x63, 0x99, 0x1F, 0x40, 0x03, 0x00, 0x79, 0x1F, 0x3F, 0x93, 0xAC, 0xC9, 0x73, 0xA0, 0x4E, 0xC7, 0xF5, 0x00, 0x84, 0xD3, 0x70, 0x53, 0x46, 0x31, 0x74, 0x32, 0x00, 0x63, 0x2F, 0x58, 0x2F, 0xFA, 0x9F, 0x05, 0x4F, 0xF1, 0x00, 0x00, 0x13, 0xCD, 0xCC, 0x4C, 0x28, 0x36, 0x80, 0x3F, 0x50, 0x07, 0x40, 0x0F, 0xFF, 0x4A, 0x9B, 0x50, 0x07, 0x9F, 0xEC, 0xE0, 0x0B, 0x40, 0x03, 0x00, 0x0A, 0x1B, 0x2A, 0xC3, 0x00, 0xA4, 0xB7, 0xBE, 0x60, 0xFB, 0x20, 0x01, 0xC0, 0xA7, 0x27, 0x62, 0x01, 0x00, 0xA7, 0x8A, 0x1B, 0x81, 0x2F, 0x91, 0xC5, 0x00, 0x84, 0xA3, 0x71, 0x83, 0x10, 0xF4, 0xBF, 0x01, 0xC1, 0x2F, 0x07, 0x04, 0xD1, 0x2F, 0xDF, 0x00, 0x80, 0xA7, 0x01, 0xF1, 0x2F, 0x08, 0x02, 0x41, 0x2F, 0x00, 0x5D, 0x8B, 0xE1, 0xB7, 0xEB, 0xD7, 0x00, 0xD2, 0x5F, 0x77, 0x09, 0x04, 0xD2, 0x5F, 0x00, 0xB0, 0xA7, 0x01, 0xC3, 0x07, 0x0A, 0x01, 0xE2, 0x5F, 0x92, 0xE7, 0x00, 0x1F, 0xFB, 0xAD, 0xDD, 0x07, 0xA0, 0x00, 0x68, 0x1F, 0x10, 0x43, 0xE3, 0x00, 0x5D, 0x03, 0x50, 0x43, 0x83, 0x1F, 0x00, 0x00, 0x44, 0x6D, 0x03, 0x30, 0x0F, 0x3E, 0x2B, 0x30, 0x0F, 0x2D, 0x03, 0x9B, 0x6D, 0x83, 0x03, 0x05, 0x6D, 0x83, 0x00, 0x4D, 0xD6, 0xF8, 0x3F, 0x1F, 0x00, 0xA0, 0x7F, 0x5E, 0x80, 0x00, 0x40, 0x7F, 0x01, 0x01, 0x4D, 0x83, 0x00, 0x3E, 0x0B, 0x00, 0x1A, 0xEB, 0x01, 0x94, 0xEB, 0x80, 0x7B, 0x41, 0xFF, 0x37, 0x5F, 0xE9, 0x00, 0xEE, 0x0B, 0x7E, 0x8B, 0x01, 0x50, 0x7F, 0xFA, 0xEB, 0xBD, 0x02, 0xB0, 0x7F, 0x03, 0x8E, 0x8B, 0x9E, 0x7B, 0xFE, 0x9B, 0x00, 0x02, 0x0F, 0x03, 0x3F, 0x13, 0xFD, 0x00, 0x1A, 0xF3, 0x01, 0x51, 0x8F, 0x3F, 0x13, 0x00, 0x12, 0x0F, 0x2A, 0x3A, 0x04, 0x8F, 0x13, 0xDC, 0x00, 0x2F, 0x13, 0x7F, 0x0C, 0x4F, 0x13, 0xD6, 0xB7, 0xFD, 0x97, 0xFD, 0x57, 0xFC, 0xE7, 0xFC, 0x77, 0xFC, 0x07, 0xFE, 0xFB, 0x97, 0xFA, 0xE3, 0xFA, 0x57, 0xF9, 0xA3, 0xF9, 0x17, 0xF8, 0x63, 0x3F, 0xEF, 0xCC, 0xEB, 0x00, 0x2F, 0xB3, 0x3E, 0x8F, 0x0A, 0x30, 0xCB, 0x2C, 0x41, 0xA7, 0x43, 0xCF, 0x1B, 0x37, 0x0D, 0x98, 0xF8, 0x5F, 0x67, 0x72, 0x56, 0xFF, 0x04, 0x40, 0x02, 0x60, 0x00, 0x5A, 0x3C, 0xF8, 0xFA, 0x34, 0x9F, 0x2C, 0x5F, 0x4F, 0x27, 0x00, 0x0C, 0x91, 0x82, 0xA0, 0x00, 0xFC, 0xFF, 0x5F, 0x00, 0xFE, 0x00, 0xFF, 0x5A, 0xC0, 0x48, 0xBE, 0xED, 0x75, 0xDF, 0x00, 0x28, 0xF9, 0x20, 0xFF, 0x4C, 0xFE, 0x3F, 0xDD, 0x1A, 0xEF, 0x68, 0x74, 0x08, 0x40, 0x04, 0x20, 0x50, 0x84, 0x3F, 0xFF, 0xF6, 0x40, 0xFF, 0x26, 0x2F, 0xFF, 0x63, 0x03, 0x00, 0x00, 0xC0, 0xF4, 0x00, 0x10, 0xFD, 0xFF, 0xE8, 0x80, 0x2F, 0xB8, 0xF5, 0xF0, 0xFF, 0xFF, 0x20, 0x50, 0xFF, 0x12, 0xFF, 0x30, 0x20, 0x58, 0x09, 0x9F, 0x6F, 0x9F, 0xD9, 0x4F, 0x04, 0x4F, 0x00, 0x00, 0x6F, 0xAF, 0xBF, 0xE9, 0xF2, 0x60, 0x86, 0x5F, 0xEF, 0x0E, 0x8F, 0xFF, 0xF9, 0x51, 0x37, 0x3F, 0xFF, 0xF5, 0x0C, 0xF2, 0xFF, 0xFF, 0xF2, 0x20, 0x03, 0x4F, 0xE3, 0x26, 0x00, 0x64, 0x22, 0x4F, 0xEB, 0x29, 0x82, 0xFF, 0x58, 0x28, 0xE3, 0x06, 0xFF, 0x06, 0xFF, 0x2F, 0x2F, 0x00, 0x00, 0x30, 0x03, 0x4F, 0xFF, 0x22, 0xA0, 0xA0, 0x1F, 0xC1, 0x50, 0x77, 0x0A, 0x0A, 0x00, 0x30, 0x0A, 0x14, 0x0A, 0xD0, 0xF3, 0x6F, 0xE6, 0x64, 0x4F, 0xEE, 0x46, 0x00, 0x20, 0x00, 0xE3, 0x24, 0x2A, 0x8F, 0x9F, 0x00, 0x66, 0xFF, 0x06, 0xF4, 0x2D, 0xDF, 0xC0, 0xC6, 0x90, 0x6F, 0xBF, 0xFB, 0x04, 0xC7, 0x01, 0x52, 0x1C, 0x20, 0xB7, 0x20, 0x00, 0xF0, 0x20, 0xEB, 0x30, 0x03, 0x2F, 0xB1, 0x60, 0xF8, 0x30, 0xCB, 0x20, 0xB6, 0xFF, 0x66, 0x00, 0x66, 0x00, 0x70, 0x02, 0x20, 0xE3, 0x20, 0x6E, 0x2F, 0xC7, 0x00, 0x04, 0xFF, 0xFF, 0x20, 0x0D, 0x8F, 0x7F, 0xDC, 0xF7, 0x30, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x30, 0x00, 0x19, 0xFF, 0x00, 0xAA, 0xE6, 0xC1, 0x61, 0xE7, 0x2E, 0xF9, 0xC0, 0xF5, 0xF9, 0xFF, 0xDF, 0x20, 0xD5, 0x00, 0x07, 0x10, 0xFC, 0xFC, 0xAF, 0xDF, 0xFF, 0x02, 0x21, 0x9F, 0x6F, 0x3A, 0x6E, 0x35, 0x00, 0xD7, 0x02, 0x30, 0x41, 0x18, 0x00, 0xFF, 0xFD, 0x40, 0xEF, 0x21, 0x3B, 0x00, 0x00, 0xF9, 0x00, 0xF2, 0x01, 0x0B, 0x20, 0x00, 0xCF, 0xFF, 0x21, 0x02, 0xFF, 0xA8, 0x00, 0x5A, 0x00, 0x20, 0x21, 0x63, 0x20, 0x80, 0x2F, 0xA5, 0x0B, 0x0A, 0xF6, 0xF6, 0x0A, 0x0C, 0xF6, 0x00, 0xF2, 0xF7, 0x8E, 0xFF, 0xFF, 0x21, 0x00, 0x69, 0x02, 0x00, 0x8F, 0xFF, 0xA2, 0x06, 0x12, 0x3F, 0xC3, 0x4F, 0x01, 0xFF, 0x00, 0xDF, 0xFF, 0x00, 0x1C, 0xFF, 0x3F, 0xCD, 0x00, 0x00, 0x00, 0xC3, 0xFF, 0xFC, 0xFF, 0xFF, 0x40, 0x00, 0x00, 0xA9, 0x00, 0xFB, 0xFF, 0xFF, 0x4F, 0x6A, 0xAB, 0x2F, 0x74, 0x0A, 0x3F, 0x7A, 0x09, 0x9F, 0xF9, 0x03, 0x04, 0x82, 0x70, 0xEF, 0xFE, 0x81, 0x7F, 0x9C, 0xF6, 0xFF, 0xFF, 0x10, 0x00, 0xC6, 0x3F, 0xA4, 0x1C, 0x6F, 0xFF, 0x00, 0xA0, 0x88, 0x05, 0x00, 0x8F, 0x01, 0x5C, 0xC1, 0x43, 0x4C, 0x04, 0x49, 0x4D, 0xFF, 0xFE, 0x14, 0x32, 0x7C, 0x02, 0x28, 0xC1, 0x29, 0xF7, 0x3B, 0x5D, 0x69, 0x6D, 0x61, 0x67, 0x10, 0x4B, 0xE4, 0x18, 0x20, 0x00, 0x0D, 0x42, 0x30, 0x07, 0x03, 0x8B, 0xA0, 0x00, 0x71, 0x05, 0x00, 0x88, 0xFE, 0xFF, 0xFF, 0x25, 0xCE, 0xC0, 0x2E, 0xCB, 0x01, 0xC0, 0xC0, 0xAF, 0x9F, 0x00, 0x00, 0x9F, 0x20, 0x03, 0x03, 0x00, 0x88, 0x00, 0x88, 0xFF, 0xCC, 0x20, 0x17, 0x70, 0x07, 0x81, 0xFF, 0xC0, 0x78, 0x00, 0x02, 0xFF, 0xFC, 0x3E, 0x4F, 0x9B, 0x87, 0x3F, 0xEE, 0x90, 0x90, 0xDF, 0xDF, 0x30, 0x03, 0x01, 0xA1, 0xD7, 0x40, 0x6F, 0xC8, 0x30, 0x6B, 0x40, 0x6F, 0x00, 0xB0, 0x43, 0xCF, 0xDF, 0xFF, 0x55, 0x0A, 0xFF, 0xD7, 0x00, 0xEE, 0x00, 0x0E, 0xCE, 0x55, 0x20, 0x17, 0xEE, 0xE8, 0x20, 0x17, 0x70, 0x07, 0x40, 0x6F, 0x80, 0x90, 0x6F, 0xC5, 0xFF, 0xCF, 0x1E, 0x7F, 0xDE, 0x00, 0x95, 0x9D, 0xC1, 0x7F, 0x2F, 0x63, 0xB1, 0x7F, 0x20, 0x3A, 0x00, 0x10, 0x51, 0x7F, 0xB9, 0x8A, 0x06, 0xC5, 0x30, 0x50, 0xA8, 0x42, 0x70, 0xC2, 0x28, 0x4E, 0x2E, 0x06, 0x10, 0x00, 0x43, 0xFD, 0x3A, 0xAF, 0x76, 0x24, 0x00, 0x98, 0x6F, 0xC8, 0xCE, 0x47, 0x2D, 0xA3, 0xFF, 0x7A, 0x22, 0xFF, 0x45, 0x4F, 0xFE, 0xAA, 0x00, 0xBB, 0x4A, 0xCF, 0xBB, 0x8A, 0x50, 0x07, 0xFF, 0x23, 0xEF, 0x3F, 0x96, 0x00, 0x23, 0xDE, 0x53, 0x8A, 0x4F, 0xFF, 0x9A, 0x00, 0x68, 0x4A, 0xEF, 0x24, 0x35, 0x23, 0xAD, 0x14, 0xFF, 0xFF, 0xC8, 0x3A, 0xFB, 0xB3, 0x33, 0x2F, 0xFF, 0xFF, 0x87, 0x66, 0x67, 0x27, 0xFF, 0x00, 0x4B, 0x83, 0x4F, 0x7B, 0xA7, 0x21, 0xD1, 0xE0, 0x2E, 0x0D, 0x37, 0xCA, 0x08, 0x46, 0x42, 0x21, 0xF6, 0x22, 0xFF, 0xF7, 0x44, 0xF7, 0x00, 0x15, 0x7F, 0x22, 0xFF, 0x32, 0x4F, 0x7A, 0x43, 0xFF, 0x60, 0x97, 0x6B, 0xE7, 0x36, 0x6A, 0x10, 0xE7, 0xF2, 0xF4, 0xFF, 0xF8, 0x34, 0xBA, 0x40, 0x03, 0x9F, 0x9B, 0x25, 0x32, 0x8F, 0xA8, 0x0C, 0x09, 0xFF, 0x40, 0x4F, 0x25, 0x2D, 0xAD, 0xBF, 0x04, 0x28, 0xFF, 0x00, 0x62, 0x6C, 0x06, 0xF4, 0x37, 0xFF, 0xCF, 0xD6, 0x00, 0xDD, 0x00, 0x4C, 0xFC, 0xDD, 0x35, 0x00, 0xEE, 0x34, 0x4A, 0x31, 0xEF, 0x54, 0x00, 0x45, 0x1F, 0xB8, 0x38, 0x0B, 0x48, 0x51, 0x41, 0xEF, 0xFD, 0xA0, 0x97, 0x1F, 0x10, 0x00, 0xFE, 0x18, 0xFC, 0x10, 0xA0, 0x23, 0xF1, 0x6F, 0xFF, 0x2C, 0xEF, 0x00, 0x05, 0x03, 0xFF, 0xFF, 0x1E, 0x8F, 0xA1, 0x1B, 0xEF, 0x21, 0x1F, 0xCE, 0xC7, 0x69, 0x04, 0xD8, 0x4B, 0xA1, 0xF2, 0x27, 0xCB, 0x20, 0x03, 0x7F, 0xD5, 0xE1, 0x84, 0x40, 0xD7, 0x37, 0xFF, 0x01, 0xBE, 0x4D, 0xAF, 0x58, 0x00, 0x44, 0x23, 0x4F, 0x7B, 0x64, 0xFF, 0xA7, 0x47, 0xEF, 0xDC, 0xFF, 0x59, 0xED, 0x79, 0xA0, 0xDE, 0x24, 0xA0, 0x37, 0x04, 0xCC, 0xFF, 0x50, 0xCF, 0x10, 0x21, 0x00, 0x32, 0x42, 0xDF, 0x33, 0x00, 0x33, 0x00, 0x13, 0x00, 0x73, 0x30, 0x26, 0xAA, 0xFF, 0xFF, 0x40, 0x04, 0x63, 0x3F, 0x9C, 0x46, 0xD7, 0x7A, 0xEF, 0x35, 0x94, 0x72, 0xEF, 0x26, 0xF5, 0x2F, 0x05, 0x5C, 0x4D, 0x2F, 0xCA, 0x6B, 0x03, 0xE4, 0x0C, 0x09, 0x55, 0xFF, 0x08, 0xC0, 0x7F, 0x91, 0x00, 0x01, 0x00, 0xF3, 0xF3, 0x00, 0x99, 0x00, 0x99, 0x5F, 0xB7, 0xFC, 0x20, 0x0B, 0x20, 0x0F, 0x8F, 0xC7, 0x70, 0x17, 0x60, 0x1F, 0x8F, 0xE7, 0x56, 0xFF, 0x34, 0x55, 0x01, 0x3A, 0xFD, 0x90, 0x1F, 0x78, 0x4F, 0xFF, 0x55, 0xFF, 0x46, 0x65, 0x4A, 0x2F, 0x97, 0xFF, 0xFC, 0x35, 0x5C, 0x29, 0x23, 0x02, 0xC6, 0x34, 0x07, 0x3F, 0xFF, 0x8B, 0xFF, 0x03, 0x44, 0x10, 0x28, 0x4D, 0xD4, 0xD0, 0x80, 0x5F, 0x3F, 0xF0, 0x17, 0x9F, 0xF5, 0xEF, 0xFF, 0x07, 0xCF, 0xD1, 0x45, 0x6F, 0x2B, 0x59, 0x3E, 0xFB, 0x5F, 0x30, 0x20, 0xFB, 0x5F, 0x87, 0x12, 0xF3, 0xF9, 0xF8, 0x90, 0x3F, 0x31, 0xB7, 0x22, 0x97, 0x00, 0x60, 0x75, 0x85, 0xBF, 0x2F, 0xFF, 0xAF, 0x0D, 0xFF, 0x9E, 0xFF, 0x45, 0x45, 0x4F, 0x79, 0xA9, 0x00, 0x9A, 0x45, 0xBF, 0x89, 0x55, 0xA7, 0x10, 0xFF, 0x22, 0xFF, 0x3E, 0x9F, 0x00, 0xFF, 0x75, 0xFF, 0x52, 0xDA, 0x4F, 0xE3, 0x23, 0x3A, 0xDB, 0x5E, 0x7F, 0x95, 0x9F, 0x7F, 0x3E, 0x8F, 0x52, 0x23, 0x0C, 0x0D, 0x92, 0x31, 0xE1, 0xEF, 0xE1, 0xFF, 0x7F, 0xC7, 0x02, 0xF8, 0x2C, 0xE9, 0x30, 0x03, 0xF0, 0x0F, 0x01, 0x1D, 0xA6, 0x45, 0x3E, 0x00, 0xFB, 0xB0, 0xB7, 0x3A, 0x47, 0xFE, 0x2B, 0x83, 0x8C, 0x57, 0xD0, 0x28, 0x8B, 0x25, 0x31, 0x77, 0x11, 0x60, 0x0D, 0xA5, 0x1B, 0x96, 0x44, 0x00, 0x00, 0xFC, 0xFB, 0x01, 0x30, 0x07, 0xF8, 0x3B, 0xB6, 0x56, 0x45, 0x0E, 0x50, 0x00, 0x2F, 0x51, 0x3F, 0x2C, 0x8F, 0xE5, 0x2C, 0xC3, 0x00, 0xFA, 0x30, 0x2B, 0xBB, 0x43, 0x6F, 0x76, 0x87, 0x18, 0xEF, 0x00, 0x38, 0x77, 0x77, 0xC2, 0x5F, 0x85, 0xAE, 0x4B, 0x6B, 0xFF, 0x01, 0xAF, 0x47, 0xCF, 0x15, 0x32, 0x6B, 0xDC, 0x26, 0x89, 0x00, 0x3E, 0x67, 0x3A, 0x0D, 0xB4, 0x2F, 0x04, 0xF1, 0xFF, 0x7F, 0xEB, 0xA0, 0xB0, 0xA1, 0x26, 0x73, 0xF4, 0x79, 0x7C, 0x00, 0x60, 0xFB, 0xFF, 0x28, 0x32, 0xC0, 0x00, 0xB0, 0x01, 0x24, 0x07, 0x4F, 0x08, 0x2F, 0x1F, 0x00, 0x00, 0x72, 0x0D, 0x3D, 0x04, 0x7D, 0xFB, 0xFE, 0xE5, 0x00, 0xD8, 0x5C, 0xA7, 0xA5, 0xB7, 0x3F, 0x93, 0x61, 0x00, 0x1C, 0xBF, 0x38, 0x93, 0x40, 0x96, 0x9E, 0x2A, 0x03, 0x4F, 0xF4, 0x4B, 0xFE, 0x28, 0xAF, 0xD0, 0xE1, 0x3E, 0xFF, 0x1A, 0x27, 0x87, 0x3E, 0x05, 0x18, 0x00, 0x00, 0x3F, 0x2B, 0x55, 0x98, 0xBE, 0x04, 0x07, 0xFF, 0x17, 0xFF, 0x08, 0x06, 0x0E, 0x53, 0xFF, 0x20, 0x4A, 0xBF, 0x3F, 0xB6, 0xB3, 0xFF, 0x1C, 0xDE, 0xFF, 0xDD, 0x55, 0x42, 0x60, 0x17, 0x7F, 0xD6, 0xDD, 0xFF, 0x03, 0xED, 0xFF, 0x00, 0x31, 0x00, 0x95, 0x7A, 0xDB, 0x60, 0x37, 0x24, 0xEE, 0x12, 0x2E, 0xBF, 0x50, 0xFD, 0xDA, 0x11, 0xFF, 0xBD, 0x24, 0xFF, 0x69, 0x45, 0xE7, 0x14, 0x6B, 0x9B, 0x0F, 0x8E, 0x5E, 0x34, 0x01, 0x9F, 0x6F, 0xD3, 0x00, 0x1C, 0x2A, 0x35, 0x2F, 0x8F, 0xFC, 0xFC, 0x09, 0x00, 0xAD, 0x00, 0x47, 0x5A, 0x6F, 0xFD, 0x74, 0x4E, 0x97, 0x1E, 0xB9, 0xFF, 0xDC, 0x4F, 0xFF, 0x2F, 0x44, 0x2B, 0xB2, 0x4F, 0x3C, 0xBB, 0x6A, 0xFF, 0x2B, 0xAA, 0x2D, 0x64, 0x10, 0x60, 0xB7, 0x32, 0x35, 0xDC, 0x10, 0x15, 0x00, 0xB4, 0xEC, 0x2F, 0xF3, 0xF9, 0x7B, 0x78, 0xEF, 0x68, 0x9F, 0x10, 0x8B, 0xFF, 0x25, 0xAB, 0x8F, 0x6D, 0xFF, 0x8F, 0x02, 0xBD, 0x4E, 0xDD, 0x6C, 0x01, 0xEC, 0xAC, 0xCE, 0x7F, 0x2D, 0x16, 0xBE, 0x7F, 0x80, 0x7E, 0x7F, 0xC0, 0x9D, 0x2E, 0x04, 0x0F, 0xBD, 0xFF, 0xEF, 0xEF, 0x8A, 0xAF, 0x8E, 0x00, 0x47, 0x24, 0xDD, 0x78, 0xDD, 0x77, 0x33, 0x11, 0x01, 0x33, 0x11, 0x8D, 0x7D, 0x13, 0x13, 0x7D, 0x20, 0x03, 0xBF, 0x8A, 0xBF, 0x77, 0x50, 0x17, 0x70, 0x07, 0xFF, 0xFF, 0x30, 0x2B, 0xB0, 0x2F, 0xF0, 0x0F, 0xB7, 0x01, 0xBF, 0x7F, 0xA8, 0x6D, 0xEA, 0x7F, 0x7F, 0x10, 0x6D, 0xFF, 0x27, 0xB0, 0x04, 0xA1, 0x00, 0xA0, 0x0D, 0xB0, 0x01, 0x02, 0x60, 0xED, 0x61, 0xFF, 0x2C, 0xFF, 0xBE, 0x35, 0xFF, 0xF0, 0x3E, 0xB7, 0x00, 0xC0, 0xFF, 0x19, 0x00, 0x21, 0x1D, 0x01, 0x28, 0xFA, 0x18, 0xCC, 0xFF, 0x3A, 0x3B, 0x92, 0x40, 0x3F, 0x17, 0xFF, 0x6B, 0x8D, 0x27, 0x4C, 0x84, 0xFF, 0xE9, 0xBD, 0xB9, 0x3C, 0xB8, 0xFD, 0x23, 0x34, 0xE2, 0x30, 0x62, 0x4C, 0xDA, 0x40, 0x13, 0xF7, 0xFF, 0xF1, 0x20, 0x03, 0xEF, 0x08, 0xFF, 0xE8, 0xFF, 0xE0, 0x20, 0x03, 0xE1, 0xFF, 0xD9, 0x38, 0xFF, 0xD3, 0x50, 0x95, 0x2E, 0xE1, 0x21, 0x87, 0x57, 0xFF, 0x86, 0x34, 0xFF, 0xD1, 0x93, 0x69, 0x30, 0x41, 0xFA, 0x31, 0x9F, 0xAC, 0xFF, 0x44, 0xC7, 0x41, 0xA5, 0xD9, 0xFF, 0xE4, 0x50, 0x5B, 0xF6, 0xFF, 0x41, 0xF2, 0x20, 0x5D, 0xFB, 0xFF, 0xEE, 0xFF, 0xEA, 0x2F, 0x23, 0x54, 0xF5, 0x20, 0x05, 0xE4, 0x23, 0x97, 0xEA, 0x2E, 0x2E, 0xDA, 0xFF, 0x10, 0xDB, 0xFF, 0xD5, 0x2C, 0x6E, 0xC6, 0xFF, 0xD0, 0xFF, 0x05, 0xCB, 0xFF, 0xC1, 0xFF, 0xBC, 0x27, 0xE7, 0xE1, 0x20, 0x11, 0x41, 0xD2, 0x24, 0x7A, 0xDA, 0xFF, 0xCD, 0xFF, 0xCA, 0x20, 0x19, 0x04, 0xC1, 0xFF, 0xB7, 0xFF, 0xB3, 0x20, 0xFE, 0xBA, 0xFF, 0x14, 0xAF, 0xFF, 0xAB, 0x05, 0xD1, 0xFF, 0x5F, 0x62, 0x6D, 0x03, 0xFF, 0x51, 0x29, 0x20, 0xC2, 0xC2, 0xE1, 0x7F, 0x05, 0xFF, 0x9F, 0x22, 0x8D, 0x5B, 0x07, 0x21, 0x61, 0xA7, 0x20, 0x9A, 0x5F, 0xE9, 0x8A, 0xD9, 0x48, 0x38, 0x99, 0x50, 0xFE, 0x41, 0x01, 0xF7, 0x25, 0x34, 0xEA, 0xFF, 0xE0, 0x8D, 0xA2, 0xD1, 0x73, 0xF6, 0x80, 0x27, 0xF7, 0xFF, 0xEB, 0x25, 0x56, 0xE0, 0xA8, 0x21, 0x1D, 0xE9, 0x21, 0x25, 0xDE, 0x2F, 0x4A, 0xD4, 0xFF, 0xD3, 0x28, 0xFF, 0xC9, 0x2F, 0x52, 0xD3, 0x2B, 0x3D, 0xC9, 0xFF, 0xC8, 0xA8, 0x25, 0x49, 0xBD, 0x21, 0x07, 0xFC, 0x27, 0x46, 0xF0, 0xFF, 0xE6, 0xA2, 0x20, 0x2D, 0xE2, 0x25, 0x9E, 0xD5, 0xFF, 0xE3, 0x21, 0x95, 0xD6, 0xAA, 0x2D, 0xB0, 0xD0, 0x20, 0x21, 0xC3, 0x25, 0x10, 0xDA, 0x21, 0x3B, 0xCD, 0x28, 0xFF, 0xC5, 0x21, 0x4D, 0xC4, 0x25, 0x7B, 0xB6, 0xFF, 0xBF, 0x80, 0x21, 0x3D, 0xB2, 0xFF, 0xAB, 0xFF, 0xB0, 0xFF, 0xA9, 0x0A, 0xFF, 0xA3, 0xFF, 0x9C, 0x21, 0x51, 0xC0, 0x22, 0x4A, 0xB5, 0xA8, 0x21, 0x53, 0xAE, 0x21, 0xA8, 0xA2, 0x21, 0x59, 0xAA, 0xFF, 0xA8, 0xA0, 0x20, 0xC8, 0xA0, 0x2F, 0xE0, 0x95, 0xFF, 0x8C, 0xFF, 0xA6, 0x80, 0x2B, 0x49, 0x9A, 0xFF, 0x92, 0xFF, 0x96, 0xFF, 0x8F, 0xA8, 0x25, 0x33, 0x84, 0x20, 0x05, 0x87, 0x22, 0x2C, 0x7C, 0xFF, 0x7F, 0x2A, 0xFF, 0x79, 0x2B, 0x43, 0x6E, 0x22, 0x86, 0xB8, 0x20, 0x4B, 0xAA, 0x8C, 0x20, 0x53, 0xAD, 0xFF, 0xA4, 0x21, 0x00, 0x30, 0x53, 0x96, 0xFF, 0x54, 0x90, 0x2B, 0xFF, 0x92, 0x20, 0xFC, 0x85, 0x20, 0x4B, 0xA4, 0xFF, 0x41, 0x9B, 0x20, 0x3D, 0xA0, 0xFF, 0x9D, 0xFF, 0x93, 0x20, 0x17, 0x04, 0x8D, 0xFF, 0x89, 0xFF, 0x80, 0x20, 0x3F, 0x86, 0xFF, 0x50, 0x83, 0x20, 0x41, 0x76, 0x20, 0x0D, 0x83, 0xFF, 0x7D, 0xFF, 0x14, 0x77, 0xFF, 0x7E, 0x20, 0x4F, 0x72, 0x25, 0x87, 0x72, 0xFF, 0x04, 0x6C, 0xFF, 0x67, 0xFF, 0x62, 0x40, 0x03, 0x5C, 0xFF, 0x00, 0x58, 0xFF, 0x74, 0xFF, 0x70, 0xFF, 0x69, 0xFF, 0x50, 0x65, 0x25, 0xA1, 0x6A, 0x20, 0x15, 0x5F, 0xFF, 0x5E, 0xFF, 0x04, 0x5A, 0xFF, 0x53, 0xFF, 0x50, 0x22, 0x6C, 0x54, 0xFF, 0x14, 0x4D, 0xFF, 0x4A, 0x00, 0xD3, 0xFF, 0x16, 0x24, 0x1D, 0x6B, 0xFF, 0x6A, 0x15, 0x22, 0x66, 0x72, 0xD7, 0x85, 0x2F, 0xA8, 0xED, 0x5F, 0x95, 0xF9, 0xAA, 0x2E, 0xCE, 0xF0, 0x94, 0x3F, 0x75, 0x21, 0xBF, 0xD5, 0x84, 0x4D, 0x3D, 0xD5, 0x2F, 0xD0, 0xAF, 0xAC, 0xFD, 0x22, 0xFB, 0xE8, 0x26, 0x3B, 0xE0, 0x2F, 0xE7, 0x55, 0xF8, 0x2F, 0x06, 0xF1, 0x23, 0x03, 0xD9, 0x23, 0x01, 0xD3, 0x21, 0x7F, 0x55, 0xF0, 0x28, 0xC8, 0xE6, 0x21, 0x77, 0xD6, 0x23, 0x0F, 0xCC, 0x22, 0xD1, 0x55, 0xDD, 0x21, 0x89, 0xD5, 0x22, 0xBF, 0xC3, 0x22, 0xF6, 0xBB, 0x22, 0xB1, 0x55, 0xBF, 0x21, 0x61, 0xB5, 0x22, 0xB1, 0xA8, 0x21, 0x59, 0x9F, 0x22, 0xBB, 0x55, 0xAB, 0x21, 0x69, 0xA2, 0x21, 0x5F, 0x95, 0x2D, 0x23, 0x8C, 0x42, 0xD5, 0x5A, 0xD2, 0x21, 0x9F, 0xBF, 0x21, 0x95, 0x30, 0x1B, 0xCB, 0x27, 0x21, 0xC4, 0xAA, 0x21, 0xA7, 0xB0, 0x21, 0x9D, 0xA9, 0x21, 0x9F, 0xA6, 0x21, 0x7D, 0x9E, 0xAB, 0x21, 0x7F, 0x8F, 0x23, 0xA2, 0x87, 0x21, 0x77, 0x96, 0x26, 0xB9, 0x30, 0x0B, 0x51, 0x7F, 0x21, 0x19, 0x78, 0x21, 0x7F, 0x9E, 0xFF, 0x94, 0x20, 0x01, 0x45, 0x8A, 0x26, 0xCF, 0x82, 0xFF, 0x81, 0x20, 0x11, 0x8B, 0x20, 0x05, 0x62, 0x82, 0x20, 0x19, 0x30, 0x1B, 0x6E, 0xFF, 0x66, 0x21, 0xA5, 0x71, 0xA2, 0x21, 0x41, 0x68, 0x21, 0x3D, 0x63, 0xFF, 0x60, 0x21, 0x3B, 0x66, 0xA0, 0x21, 0x41, 0x5E, 0x2D, 0xBD, 0x57, 0xFF, 0x51, 0xFF, 0x4F, 0x2A, 0xFF, 0x48, 0x21, 0xC5, 0x70, 0x20, 0x21, 0x68, 0x80, 0x17, 0x6A, 0xAA, 0x20, 0x25, 0x63, 0x21, 0x63, 0x57, 0x20, 0x1D, 0x50, 0x20, 0x1F, 0x55, 0x20, 0xFF, 0x4E, 0x20, 0x01, 0x46, 0xFF, 0x47, 0xFF, 0x40, 0x0A, 0xFF, 0x3F, 0xFF, 0x39, 0x20, 0x07, 0x3F, 0x20, 0x09, 0x39, 0xA2, 0x20, 0x09, 0x32, 0x20, 0x01, 0x2C, 0xFF, 0x5D, 0x23, 0xF6, 0x53, 0xC0, 0x20, 0x23, 0x30, 0x03, 0x49, 0xFF, 0x44, 0xFF, 0x4B, 0xFF, 0x10, 0x45, 0xFF, 0x42, 0x21, 0x3E, 0x40, 0xFF, 0x3C, 0xFF, 0x05, 0x38, 0xFF, 0x34, 0xFF, 0x4A, 0x20, 0x39, 0x41, 0x21, 0x4E, 0x50, 0x43, 0x20, 0x05, 0x3B, 0x20, 0x11, 0x38, 0xFF, 0x35, 0xFF, 0x00, 0x31, 0xFF, 0x2E, 0xFF, 0x33, 0xFF, 0x30, 0xFF, 0x55, 0x2B, 0x23, 0x46, 0x3B, 0x20, 0x0F, 0x33, 0x20, 0x0F, 0x30, 0x24, 0xD2, 0x05, 0x2A, 0xFF, 0x26, 0xFF, 0x2D, 0x2B, 0x94, 0x27, 0x2D, 0xA5, 0x01, 0x23, 0xFF, 0x20, 0xFF, 0x1E, 0xFF, 0x1B, 0x23, 0x68, 0x50, 0x26, 0x40, 0x0B, 0x24, 0x2D, 0xB9, 0x1E, 0xFF, 0x1C, 0xFF, 0x05, 0x1D, 0xFF, 0x1A, 0xFF, 0x18, 0x21, 0xD2, 0x18, 0x24, 0xB8, 0x15, 0x13, 0xFF, 0x12, 0x33, 0x8B, 0x00, 0x20, 0x36, 0xD2, 0x6B, 0xF6, 0xB5, 0x34, 0x85, 0x00, 0x24, 0x87, 0x64, 0xB3, 0xFA, 0x2C, 0x0B, 0xEA, 0x24, 0x61, 0x55, 0xE4, 0x24, 0x57, 0xCC, 0x24, 0x59, 0xC6, 0x27, 0xFF, 0xDF, 0x24, 0x75, 0x52, 0xDA, 0x24, 0x5F, 0xC1, 0x24, 0x4D, 0xBC, 0x00, 0x22, 0xB6, 0x00, 0xC5, 0x23, 0x56, 0x43, 0x7B, 0xFE, 0xFF, 0xF2, 0x34, 0xA5, 0x00, 0x23, 0x4E, 0xAA, 0x24, 0xFD, 0xED, 0x2A, 0x35, 0xEA, 0x2C, 0x67, 0xD5, 0x24, 0xE9, 0xD2, 0xAA, 0x24, 0x91, 0xB7, 0x24, 0x8F, 0xB2, 0x29, 0x02, 0xCD, 0x24, 0xA5, 0xCA, 0xAA, 0x25, 0x7E, 0xAF, 0x24, 0x81, 0xAB, 0x25, 0x86, 0xB0, 0x23, 0x01, 0xAA, 0xAA, 0x23, 0x4B, 0x96, 0x23, 0x4D, 0x90, 0x23, 0x5B, 0xA4, 0x23, 0x09, 0x9F, 0xAA, 0x2E, 0xFF, 0x8A, 0x23, 0x35, 0x85, 0x22, 0xED, 0x7D, 0x22, 0xE9, 0x77, 0xAA, 0x22, 0xDB, 0x67, 0x22, 0xD9, 0x62, 0x22, 0xE7, 0x72, 0x23, 0x39, 0x6D, 0xAA, 0x22, 0xE3, 0x5C, 0x22, 0xE5, 0x57, 0x23, 0x6B, 0x9A, 0x23, 0x37, 0x96, 0xAA, 0x23, 0x17, 0x80, 0x23, 0x19, 0x7C, 0x23, 0x77, 0x93, 0x23, 0x29, 0x90, 0xAA, 0x25, 0x4A, 0x79, 0x23, 0x21, 0x76, 0x22, 0xFF, 0x6A, 0x23, 0x01, 0x65, 0xAA, 0x24, 0x7A, 0x53, 0x22, 0xF9, 0x50, 0x28, 0xA9, 0x62, 0x23, 0x09, 0x5F, 0xAA, 0x25, 0x6C, 0x4D, 0x23, 0x01, 0x4A, 0x21, 0x7F, 0x53, 0x25, 0x78, 0x4E, 0xA2, 0x21, 0x77, 0x42, 0x21, 0x79, 0x3D, 0xFF, 0x52, 0x21, 0x85, 0x4E, 0xAA, 0x21, 0x87, 0x40, 0x21, 0x7D, 0x3C, 0x21, 0x7F, 0x3A, 0x21, 0x69, 0x35, 0xAA, 0x21, 0x6F, 0x2D, 0x25, 0xA4, 0x28, 0x2E, 0xFD, 0x30, 0x21, 0x65, 0x2C, 0xAA, 0x41, 0x53, 0x1E, 0x21, 0x61, 0x1B, 0x21, 0x9F, 0x41, 0x21, 0xDD, 0x3D, 0xAA, 0x21, 0xAB, 0x31, 0x21, 0x99, 0x2D, 0x21, 0xA7, 0x3B, 0x21, 0xAF, 0x38, 0xAA, 0x21, 0x9F, 0x2B, 0x21, 0xA1, 0x29, 0x24, 0xE8, 0x23, 0x21, 0x95, 0x20, 0xAA, 0x21, 0x77, 0x18, 0x21, 0x79, 0x15, 0x21, 0x87, 0x1E, 0x2F, 0x43, 0x1C, 0xAA, 0x21, 0x83, 0x13, 0x23, 0x5E, 0x12, 0x2F, 0x4F, 0x1D, 0x40, 0x1B, 0x19, 0x8A, 0x23, 0x6C, 0x14, 0xFF, 0x11, 0x26, 0x72, 0x14, 0x23, 0x76, 0x11, 0xA8, 0x20, 0x09, 0x0E, 0x20, 0x01, 0x0B, 0x21, 0xA3, 0x10, 0xFF, 0x0F, 0x20, 0xFF, 0x0D, 0x40, 0x03, 0x0B, 0xFF, 0x0A, 0xFF, 0x0C, 0xAA, 0x20, 0x03, 0x09, 0x25, 0x24, 0x08, 0x25, 0x28, 0x06, 0x25, 0x32, 0x13, 0xAA, 0x20, 0x1D, 0x10, 0x20, 0x1F, 0x0C, 0x20, 0x15, 0x0A, 0x25, 0x3C, 0x0F, 0xAB, 0x20, 0x33, 0x0D, 0x20, 0x27, 0x08, 0x20, 0x1D, 0x07, 0x25, 0x52, 0x50, 0x25, 0x56, 0x04, 0x20, 0x01, 0x03, 0x25, 0x76, 0x02, 0x80, 0x07, 0x50, 0x01, 0x01, 0xAC, 0x00, 0xB9, 0x7F, 0x20, 0x2C, 0x1D, 0x03, 0x04, 0xE9, 0x7F, 0x10, 0x04, 0x80, 0x59, 0x30, 0xC2, 0x30, 0xFE, 0xE2, 0x2C, 0x3A, 0x3A, 0x46, 0x20, 0xF8, 0xE9, 0xFF, 0x0C, 0x00, 0x95, 0x00, 0xDC, 0x00, 0x3E, 0x2E, 0x03, 0x1F, 0xA9, 0x80, 0xF2, 0x18, 0x00, 0x10, 0xF9, 0x38, 0xEF, 0x4F, 0x02, 0x50, 0x90, 0xFF, 0x1F, 0xFF, 0xC0, 0xD0, 0x00, 0xDE, 0x98, 0xBF, 0x1B, 0xCB, 0xFF, 0x2F, 0x23, 0xF2, 0x7F, 0xE2, 0x4B, 0xFF, 0x01, 0xCF, 0x27, 0x10, 0x5B, 0x20, 0x2B, 0x10, 0x00, 0x11, 0x49, 0x71, 0x11, 0xFD, 0x60, 0x07, 0xF9, 0x7E, 0x70, 0x17, 0x0B, 0x10, 0x1F, 0x3A, 0x6E, 0x0C, 0xBA, 0x5C, 0x40, 0x41, 0xCD, 0x00, 0x30, 0xE3, 0xFF, 0x20, 0xF9, 0xB7, 0xFF, 0xFF, 0x00, 0xAF, 0xCF, 0x03, 0xD1, 0xF8, 0xFF, 0x7F, 0xFE, 0x00, 0xFF, 0x0C, 0x05, 0x06, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x90, 0x80, 0xED, 0xFF, 0xEE, 0xFF, 0x79, 0x0A, 0x00, 0x77, 0x00, 0xEE, 0x20, 0x07, 0x77, 0x20, 0x07, 0x00, 0x01, 0xAA, 0x00, 0x07, 0xFF, 0xFF, 0x3F, 0xCF, 0x2B, 0x90, 0x06, 0xA5, 0x00, 0x00, 0xF9, 0xF8, 0x70, 0x17, 0x80, 0x1F, 0x4A, 0x00, 0x00, 0xA0, 0x6F, 0x6F, 0xF0, 0x30, 0x00, 0x9B, 0x07, 0x00, 0x00, 0xEF, 0x23, 0x00, 0x80, 0x37, 0x80, 0x3F, 0xEA, 0x05, 0x8B, 0x00, 0x30, 0x1F, 0x80, 0xE8, 0xAB, 0x59, 0xF7, 0x59, 0x00, 0x60, 0x3F, 0x3B, 0xFC, 0xE0, 0x6B, 0xF2, 0x00, 0xE0, 0x5F, 0x00, 0x90, 0x7F, 0xA2, 0x00, 0x6A, 0xF4, 0xF3, 0x2A, 0x9F, 0x8F, 0x90, 0xBF, 0xDE, 0x20, 0xDF, 0x97, 0xDC, 0x48, 0x01, 0x00, 0x20, 0x10, 0x7B, 0xFF, 0x02, 0xAF, 0xFC, 0x30, 0x20, 0xFF, 0xFA, 0x39, 0xE3, 0x4E, 0xFF, 0x00, 0x04, 0x00, 0x00, 0x65, 0x50, 0x01, 0xA9, 0x88, 0x05, 0x04, 0xFF, 0x02, 0xF6, 0x1E, 0x8F, 0xB0, 0x50, 0xEF, 0x00, 0x4A, 0x9F, 0x01, 0x4B, 0x05, 0x08, 0x3C, 0x8F, 0x70, 0x90, 0x21, 0xCF, 0x70, 0xA1, 0xFA, 0x41, 0x45, 0x0C, 0xFF, 0xEF, 0x02, 0x00, 0x20, 0xC5, 0x2A, 0xD9, 0x80, 0x80, 0x80, 0x30, 0x03, 0xFF, 0xFE, 0x05, 0x0B, 0xF8, 0xE1, 0x6F, 0x81, 0x2B, 0x97, 0x80, 0x90, 0x00, 0x05, 0x60, 0x00, 0x2F, 0x66, 0x00, 0xB6, 0xFF, 0xFF, 0x25, 0x06, 0x06, 0x1F, 0xF8, 0x08, 0xF8, 0x9F, 0xF8, 0xF7, 0x2F, 0x73, 0x06, 0x07, 0xBB, 0x90, 0x21, 0x06, 0xD0, 0x40, 0x3B, 0xBB, 0xB8, 0x00, 0x6F, 0x6F, 0x00, 0x70, 0xF0, 0x6F, 0x6F, 0xE0, 0xE0, 0x68, 0xDF, 0x02, 0x50, 0xA0, 0xDF, 0xDF, 0x90, 0x90, 0x20, 0x0B, 0xF0, 0x08, 0x4B, 0x00, 0xB0, 0x00, 0x20, 0x0B, 0xA0, 0x9B, 0x00, 0x00, 0x70, 0x00, 0x89, 0xFF, 0xB6, 0x8D, 0xFF, 0xFF, 0x00, 0x04, 0x03, 0xAD, 0xFD, 0x23, 0x2F, 0xF3, 0xF3, 0x24, 0x9F, 0xAF, 0x20, 0x0B, 0x04, 0xBB, 0x2D, 0xB5, 0xF3, 0xF3, 0x00, 0xAF, 0xBF, 0xB2, 0x00, 0x8B, 0x00, 0xE8, 0xB0, 0x00, 0xFF, 0xEF, 0xC0, 0xC0, 0xFF, 0xFF, 0x49, 0x10, 0x0C, 0x81, 0xFD, 0x90, 0xC1, 0x2B, 0x9B, 0x20, 0x0B, 0x90, 0x00, 0x00, 0xBB, 0x00, 0xA0, 0x21, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0xB3, 0x00, 0xCC, 0x07, 0x7C, 0xFA, 0x68, 0xAC, 0x00, 0xFB, 0x89, 0x00, 0x0A, 0x95, 0xFA, 0x5F, 0x48, 0x00, 0xF8, 0xF9, 0x03, 0x06, 0x72, 0xFA, 0xBD, 0x21, 0x00, 0x9D, 0x01, 0x17, 0x0D, 0xF9, 0xF9, 0x01, 0x00, 0x00, 0xB7, 0x00, 0x58, 0xDF, 0xDB, 0xD8, 0x4F, 0x3F, 0x00, 0x30, 0x20, 0x3A, 0xFF, 0x00, 0x03, 0xFF, 0xFF, 0x01, 0x38, 0x6A, 0x4F, 0x4F, 0x20, 0x30, 0x3B, 0x2E, 0x19, 0x04, 0xFF, 0xFF, 0x4A, 0x0B, 0xBB, 0x2E, 0x18, 0x70, 0xFA, 0x00, 0xCC, 0x5E, 0xFF, 0xFF, 0x09, 0x08, 0xFA, 0xFA, 0x00, 0x8F, 0x8F, 0xF3, 0xF3, 0x8F, 0x7F, 0xFF, 0xFC, 0x00, 0x08, 0x3D, 0x91, 0x00, 0xDD, 0x00, 0xF3, 0xF9, 0x00, 0x8F, 0x9F, 0xBA, 0x00, 0x6B, 0x00, 0x00, 0xB0, 0x00, 0xC7, 0xAF, 0xF4, 0xF7, 0x6F, 0x7F, 0xDC, 0x70, 0x00, 0x19, 0xDF, 0x30, 0x30, 0xFF, 0xFF, 0xF5, 0xC0, 0x00, 0x6F, 0x9F, 0x10, 0x00, 0xD8, 0x00, 0x30, 0x60, 0x01, 0xFF, 0xEF, 0xDB, 0x12, 0x2A, 0x00, 0x31, 0x2E, 0x70, 0x20, 0x09, 0x0C, 0x34, 0xF2, 0xFF, 0xFE, 0x00, 0x10, 0xFD, 0x22, 0xFF, 0x09, 0x5B, 0xEB, 0x40, 0x40, 0xB0, 0x20, 0x2B, 0xFF, 0x0D, 0x9F, 0x1E, 0x08, 0x09, 0x20, 0x1F, 0xAE, 0x7F, 0x05, 0x09, 0xE4, 0x31, 0x08, 0x40, 0x00, 0xFF, 0xE4, 0x3F, 0x49, 0x9F, 0xFF, 0x02, 0x07, 0xBF, 0xFA, 0x30, 0xFF, 0xC8, 0x00, 0x0F, 0x49, 0x23, 0xFC, 0x24, 0x02, 0x7F, 0xEE, 0x24, 0x02, 0x40, 0x07, 0x00, 0x05, 0xFA, 0x60, 0x17, 0x70, 0x1F, 0x00, 0x05, 0xFA, 0x09, 0x90, 0x1F, 0x60, 0x87, 0xD0, 0xBF, 0x55, 0xFA, 0x20, 0xFB, 0xF9, 0xFF, 0xFF, 0x02, 0x8C, 0xAF, 0x03, 0xFF, 0x5E, 0x04, 0x10, 0x16, 0x4D, 0xE6, 0x43, 0x02, 0x4C, 0x49, 0x4D, 0xFF, 0xFE, 0x14, 0x2F, 0xFF, 0x02, 0x30, 0x02, 0x28, 0x26, 0xF7, 0x38, 0x90, 0x69, 0x6D, 0x61, 0x67, 0xA8, 0x37, 0x02, 0x80, 0x27, 0xBE, 0x0D, 0x67, 0x0F, 0x47, 0x06, 0x16, 0x00, 0x8A, 0x12, 0x3A, 0x5B, 0x41, 0xDB, 0x11, 0xF4, 0x00, 0xAC, 0xCF, 0xDD, 0x96, 0xDB, 0x5F, 0xAA, 0xAE, 0x00, 0x6D, 0x3C, 0x2E, 0x7F, 0x8B, 0x72, 0xA3, 0x56, 0x00, 0x47, 0x7A, 0xF8, 0x43, 0x6B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -#endif \ No newline at end of file diff --git a/makerom.c b/makerom.c deleted file mode 100644 index e1b1cdb..0000000 --- a/makerom.c +++ /dev/null @@ -1,126 +0,0 @@ -#include "lib.h" -#include "ncch.h" -#include "ncsd.h" -#include "cia.h" - -int main(int argc, char *argv[]) -{ - // Setting up user settings - user_settings *usrset = malloc(sizeof(user_settings)); - if(usrset == NULL) {fprintf(stderr,"[!] MEM ERROR\n"); return -1;} - init_UserSettings(usrset); - - int result; - -#ifdef DEBUG - printf("[DEBUG] Parseing Args\n"); -#endif - - // Parsing command args - result = ParseArgs(argc,argv,usrset); - if(result < 0) goto finish; - -#ifdef DEBUG - printf("[DEBUG] Importing Yaml Settings\n"); -#endif - - // Import RSF Settings if present - result = GetYamlSettings(usrset); - if(result < 0) goto finish; - - // Setup Content 0 - if(!usrset->IsBuildingNCCH0){ // Import Content 0 - if(usrset->Content0IsNcch){ -#ifdef DEBUG - printf("[DEBUG] Import NCCH0\n"); -#endif - FILE *ncch0 = fopen(usrset->ContentPath[0],"rb"); - if(!ncch0) {fprintf(stderr,"[MAKEROM ERROR] Failed to open Content 0: %s\n",usrset->ContentPath[0]); goto finish;} - fclose(ncch0); - usrset->Content0.size = GetFileSize_u64(usrset->ContentPath[0]); - usrset->Content0.buffer = malloc(usrset->Content0.size); - ncch0 = fopen(usrset->ContentPath[0],"rb"); - ReadFile_64(usrset->Content0.buffer, usrset->Content0.size,0,ncch0); - fclose(ncch0); - } - else if(usrset->Content0IsSrl){ -#ifdef DEBUG - printf("[DEBUG] Import SRL\n"); -#endif - FILE *srl = fopen(usrset->SrlPath,"rb"); - if(!srl) {fprintf(stderr,"[MAKEROM ERROR] Failed to open SRL: %s\n",usrset->SrlPath); goto finish;} - fclose(srl); - u64 size = GetFileSize_u64(usrset->SrlPath); - usrset->Content0.size = align_value(size,0x10); - usrset->Content0.buffer = malloc(usrset->Content0.size); - srl = fopen(usrset->SrlPath,"rb"); - ReadFile_64(usrset->Content0.buffer,size,0,srl); - fclose(srl); - } - else if(usrset->ConvertCci){ -#ifdef DEBUG - printf("[DEBUG] Import CCI\n"); -#endif - FILE *cci = fopen(usrset->CciPath,"rb"); - if(!cci) {fprintf(stderr,"[MAKEROM ERROR] Failed to open CCI: %s\n",usrset->CciPath); goto finish;} - fclose(cci); - usrset->Content0.size = GetFileSize_u64(usrset->CciPath); - usrset->Content0.buffer = malloc(usrset->Content0.size); - cci = fopen(usrset->CciPath,"rb"); - ReadFile_64(usrset->Content0.buffer, usrset->Content0.size,0,cci); - fclose(cci); - } - } - else{// Build Content 0 -#ifdef DEBUG - printf("[DEBUG] Build NCCH0\n"); -#endif - result = build_NCCH(usrset); - if(result < 0) { - //fprintf(stderr,"[ERROR] %s generation failed\n",usrset->build_ncch_type == CXI? "CXI" : "CFA"); - fprintf(stderr,"[RESULT] Failed to build outfile\n"); - goto finish; - } - } - // Make CCI - if(usrset->out_format == CCI){ -#ifdef DEBUG - printf("[DEBUG] Building CCI\n"); -#endif - result = build_CCI(usrset); - if(result < 0) { fprintf(stderr,"[RESULT] Failed to build CCI\n"); goto finish; } - } - // Make CIA - else if(usrset->out_format == CIA){ -#ifdef DEBUG - printf("[DEBUG] Building CIA\n"); -#endif - result = build_CIA(usrset); - if(result < 0) { fprintf(stderr,"[RESULT] Failed to build CIA\n"); goto finish; } - } - // No Container Raw CXI/CFA - else if(usrset->out_format == CXI || usrset->out_format == CFA){ -#ifdef DEBUG - printf("[DEBUG] Outputting NCCH, because No Container\n"); -#endif - FILE *ncch_out = fopen(usrset->outfile,"wb"); - if(!ncch_out) { - fprintf(stderr,"[ERROR] Failed to create '%s'\n",usrset->outfile); - fprintf(stderr,"[RESULT] Failed to build '%s'\n",usrset->out_format == CXI? "CXI" : "CFA"); - result = FAILED_TO_CREATE_OUTFILE; - goto finish; - } - WriteBuffer(usrset->Content0.buffer,usrset->Content0.size,0,ncch_out); - fclose(ncch_out); - } - -finish: -#ifdef DEBUG - printf("[DEBUG] Free Context\n"); -#endif - free_UserSettings(usrset); -#ifdef DEBUG - printf("[DEBUG] Finished returning (result=%d)\n",result); -#endif - return result; -} \ No newline at end of file diff --git a/makerom.exe b/makerom.exe new file mode 100644 index 0000000000000000000000000000000000000000..6aa3dc2f1b86db1a14b675728ab7847e8ea7401e GIT binary patch literal 586171 zcmc$H4S1Br)%I@Kz=DxoFey=D4H_{hDkv%l=!&dHiyCTTse+=V6csJS1gH{RT%uXm z*l4x2)*mQXX-g}u6wqQ#5J|LDqhdv+8Zr9rvZ;-jVpKHWeV>_mes(v}_x1bUkLw~k z&&)aZIdkUB|2*?taA||5pU30z;eSt$$Fmu~{1=kHegBCddGHZW4)$yq`1cW;z0>|a zqGI0FHxw^e_`@G8yz;u@?_GKQ^*^jCzUuqM3#+d$zWVy&sTW;beBBS{eE)=l4<1ya zq07S_&ou8~&nvH<7x8@@E+vN8Roe=*W1pzDv{G<%0U&~LobZvm+z8t>QXc)=-5{(tfBqi5-d{y)j}tS-V+bld1>>NmRZipDn1 zT|ODc_grvkbM87|)5OiWYpu{4E3`p}s^+cEr<~1ru5GM3AF}8#iC^EDOSwJxm&o~H zt|wlw1r)2x-^8B^{8_bP4>SrU_Wvl?6P?@*ExlFOjctr>D>B&xH^nDr0x7j&ZbQ6a z5;R->B=uukRDU}|)seua>4kHbe|nI&>P-IR1ZuB=(C8B@z&to`>nuFP@9M_G*v8tI z1NSy2zlE6kMbvJ=En!c>2Mv_q=#Q(wFq#apgkpG(42L0RZbRkR#@KsL3_<*NE~&3v zb8+moXvflzez$&1;^mrL&!}znQ%i^^>Q5g6bz<{S>O7BK}0% zJGBi1wRgjUb5^nWh@VmfGsS24;*-ZCkjkI1E3l#;lA(M8ok0(D@WBD#jUG>IW{D5+ zGhp4Ge?&X-Y8$ItSIxxJ*f*oy-oT2tU`~0iZ49h9lOVYs6djE$(L(eJ9&6tWtYGb0 zb;s>es6|EsetqDhbPDWgg_K0sLMiF>k+7$yU>vlBN~;@D*rW=EJc+X(&-EmhRp)wE z%}46k=bCe;K`9nq94=EmEOkahebq?MikGX#)IL`=;t47gZS)2<1|y#qFH6M!7X8Q@ z`Si%Z)W4+?AUeoS`*3v`T}k_1L10tm&duy0_J>=&f$-MVp7mik9({l8oAthX*=WZq z?}@>77u^AuoXlzx3pd2W_tZ8nJ3a1um`Rh6RKLI*8&{GTMXJh%nD730{=?B{ys@eh zKS*K~CBDSp3$BtMl+!8^2{W#e z8VPZ=$Zq@;)}h+{tAqFntk@2q_~9&@+Bd5QB_4;QRZOY>e%ED}UolHpTPd@@h_O(* zwMTx@(*uhi0p3K694vVjY3=b$fk=O+Dii!9eh7-%H=A=w#1akE1~e5OSaRY;1;tXF z{^Y*TdwOE|B|Qass(h2P5TUrK0MQE-dLGe-06n>uJjh@k9$3EcmF8R)6*&^$tU|rt zmY4kX0aQk5hOBgIkoe*Tm3}MI8|2@ryzOB&F=toC-ivk=(z{yeaz3bpMu82Y56R!4 zGJ}x<**yh*m4VpS+Lx;af`u48FF*IuGpNt8_hvn#pye-~FGeklc7zgFLO6);%kg^> zN8g^ymUDb`X~}p`^+~H5h}alnV+u+B!4OP|Vg_HyN(fFI36{-hGkTIgMxPP~GwslS zsSblH9?k=RFCL~lCEl0`znoe!2_hzWew>>;*}-)^S~_RiFr60I7zug&o@l3c1#0t& zXbUJOurXB3XEt|yj)%s_MZL$AK@vZSNp8kL)HqM|aTZOyK=QSf`SLSA8_1Afl9&sI zY%S zWgF%*R){H~V_=0bp6XGWBEtsl+6Gq<`XOcFF)?K8yNJ+Ce4GR|pjIi=8Vxai4s?v# zAS;a{9(2-d{D$S%i?yD-EyG$awO?lX)DmULGX9LgV}^w+kq%3pHc$*9+W!(T$+NU& zV5uN2HP*5e@hnSSp+uIzQYDt9@-r-z_flBAWjvv)R3Vfg%ZU>a0e#?z`FtEoHG0YY zmRmD&?^0za)2Eh{2%LDB?I|T+<|(J4hXkYO^h*GxrV@rK-G|l|u)6XcpI*O5sIoNm zdmJ*Fm;!+0otDA!qTT(f%M9KlzjojSVm|;`I_BYS%u9&*K`k&(cVhZ%%qLcOZ5;!# zL%tldikSBk^L+@TZt)QG^i~C}Fa}D`TWM0~?`A2&B-elsCMiat7kjF|r#So>g?=B& z(L|gLatqa4Jz(=DB&2dT{{=r8OpTgpFqq(IlhC~Pq{70UR;I;YR;J$mlCxr}+`K~R z!0^b3#7~OPI`AACc(m)^x#VJumSb(PXX4>teR)r;vaLSfvzhfYn(%sCpJqt4-=Wr6)Rn(L|SAB8N?O$-N@)rOn|kk#JM8Jm*yZ$a$KoS5b5eR-_yGM4{<7WUbx@RsJ5ob4C}6z<-e}E%0n7fRZ8r`| z%#DS2%xwMx^T!}! zfg?B)K}OhTD0 zVLUs9v+Tlr4~q)OO|+)VQ=KQJDjig6F`6=J|0>eS!t!Pz_)1o-!PKOu6^3B8A=*l3 z-V~h_`x^qCh*fqdKUlRy7?qI%>sq}p?G3Ei>P1f!Zi}%?VH;%(p<81@Iz=cI61M?b z2Un;J7}@xB=$g1(2)i_DnG|4~6rh%eGK7NQl6f_L^O*zu2Du21Uo$I^oZ*@1A#I8F zcW8-dN0G8%Pc>`VRMxWXOLe_ZEhCo3%<3dG^QtjonrH|6wtQv!RikwrrkmAA0eB{X zuLH17Z`0C!(!it&GNLKf*wdNwXidJSDi4SYh&Wsj?JlMsl@{65<~<&%8lzC>`T^0) zj&#g1SJgSwkdZueFoBKX4%1~HnK~0Fvb2KEwH0C2%Qm(72ezUy`yzFOiDRN6Y_!rF z&}e<3WxMeQaY%4Zayc?Boc$Csh6mBDIf0Es0~=p%+T$O{cE|x6lnA3l;XwHHffUQv z!HqQ{H#guoG-zs5+|foYtEo)^G@ui4>xiC6d_eU=+9HFwZnEMNBqZC>CWvAKFdhqR zY?4YiFx)+`63rd-?eB<2rSa1qc51FWHAuzmRG&MwkXqWQP~8$3+bS)9BNaJKPo)uU zcGxD9z?PmZRZCBHs*-Y$^n#n2VW(P1P0O$|OGr)2u+tow8Frddr@AxjED4Li&TzER zS%MaU&NCc?U6b|=_IPNE=Ef=y)P=j@6y2tp9Fdv;KR+aj*^po{ixH26}wzT2#xXM4^jcqJnifA_jj!04#ax$6B0|It4$O zEQUz27yz{hc318XgkucBcXwb)G;sxW6iF84*nz`mvEvOKj@GrhVvIe0!K8_nhsAjT2_wypqoI9S%jsGBiR|QmXU)sh+QL( zGKgIRF=h&N0=goM>^Ln`qg6GJk_qWro8?Dfv8Gdrh0klD=$N>=p4ckM9k6d=6g(%K z@P<3tbp>kA#%x~Cxw%A(F~S^X$KCZG1$H9B1l8CJ1S*$=6I(Fpmg0+*mz%h?c3g$7 zIfb&CQeTd)fc=|uC|o@F99fX~6S#!>;^iGH#E$-W2%UAH_D%H^*c2+9JGsZR=n$&L zQJ>al6!bx`IaIV$Sz~*s)XQvmc7|0pUa>~o4^a2)Nn3hP+TDB70hQ$QylTlPIYe9U zbt~#yCTh18wGdIsOSue-5qroN?e+y~59Ugn4B%nrt8bvEwP`Qd9)5eKB*iP+qINxDG9+=!v1i)~4>55}-PyenF>%TqNKuESAX z;yOx%pZjCw#RLywO0&y3&?g8fsa_+9^%_SFg1Sm3UsbaF-_$bk)9CqQ(Fx6NXVadX`l6swdn0xuV`z_{uuk;0#yx$go-2y@ zEtke_YLMXwI%U?`GJggq))oq^xD`6325rVR zQctoyYa%)LQQ92CtjD>7}0c0hNdk>({2_Pw(|gmj(AM-&(X?@SO{3A&EHe@)anmQprtPTS@o*zG_1T)DXGgsq zpP^}^(R2oAwM`4sG~H!u%7al^ZF;>(6`TIBlQ!M5yk?8hbc?nrff6ru8%<9ao-Ne$ z((5dnjuTDCWoWv^X!-}xYE7?2&}q}Xwx;i6r7^3f+mN8ypZzyA-MqYJv(a?3)|5br zV=PS@gl97~T|eK_G$fjaGBn+6H1*kF2hllX}ziFk92%qUna^H5-hk8?>eb zO4NL8Z2CTT9>N=_X@6T&^mQoxNg0}MFq&QpT5XhJX_^KDR=;^Sz_Z$Pfk>6o|Ir7u z>H6h0>y4)CwWb70yt3bDI!SoeQ`4E(S~i^~noi5mbiL7ZJ!rM2*CFV%=@GW33G8KB zn%?bbrM7dEQ&q_3e^JwQ%WKvdP1k8n36vORX?nNttfQuXy2jEJ3q!DJS%#+TjHdl< zO`idq9(%MRm@LEklxhJ_6>I=uY?KqIJp%2e9&V>b#kmgBh}FTSJ-+2z+q%MB0rV3d zqNxp!szt*cSjX+~E_(@)R#z*dM`RmPg)$|sVsaB@`q)ZZXp#=-q|dCRyG_y;I_YyO=}#)jSL~x#iEeM0D8CiuMY~5Oix0A* zN)eR|!aU#-YxN7%dc|4^<};-_4Gc^YYSeR#J^gdQT_4 zZzVmbl6))oT2arMs1K~D4iojE6?F(rrza`H=D{_?YpFB+nHi&D;^DP)mGh7)mMb#^ z^mU#101~lah|K~2_Rv&s3UfpT4DaEJ7yI#k?#C~K^FrtetRzE`gz#w$_h(pd7tR)0 zD2;ZM28W55v7^Fp63C*skn}J7K&#{+Gn=x-&@xYkz{n1>G7B8sAgn|;$nC-9HSHWG zF8evqE+<-@K`ZJN<3}1}2rxvyVrX@o3iZmgOf&69uLfCh$|^Fl#=F>PcGghp`%BIC z2-rlzxL!%uYSJ5(gg;ZllXJCg#`MZ&B%Ey|jP8}xNGMbio~48tM#8jS*^GpD(D_In z%6cU=5;lSqR(gXH_J3dJA=E3Ik#Mt-FsWBkBcTGMvRt)%8z<0eGYMOv7&c(psvUaL z-G@Rpx71}RA{P(dU7SC13r6N}d*`sSbn;0Tn5rwX330e6o<4>D0C`fI5{VKJu#i8p zqh1og4p|8~I#Sc_sXD@54Y1~7-C&>>{|?j|t5Jd-?tL+|a9q_t!7PpxiTP1ax^#77 z9&ZIFmqM1;bV*fsQxP%gS^))0F`s6cCplwsk$D=&w6o09cs`wMo<{TOX!A6NPs7a9 zBt8u^Pa!^i_B~zHWqkUVd78$jx6M;IpI$Og6?}TeJk8+KpUu-uK0RulX7lM6c!J5Z zE!td7CdwX17B22r{$f@%|nzQOU^y?wg1Y zRG)^s9zdg+ev&$jIPD$be0iLFNb zrgN_DlXG?-GOrd+`%F?^yxJeDPQO}PYo>*tRx?}nKJvXD9+ZSt&zUYa4 z5^Fu!6Y-&~jkUyZP$W-I0gDUMDs^0t$%{v(qGv>VcBVYcR}UHIRYR&)$Z!l!KQ4$q zWZ@Oq6J0`7())-=wUMA_Da>Zq1;c_qQnS-jC1jB~N?%ku0PumZ5e193*MlaedXQ2w#~_v|9-K7-4L3I=f4 z`A1t5*o0xdb#ft$cHhAOv`TC9vJI zw=Vo&dZCghW$+JsC;z3l33m;w+>Hr_JXxD%j09ssVy%rX9lOsN+q4J!SAubYAM+_3 zFN%3%(|xW+#mYR2zQlTQn{y*DzV2w z*2$n#LCiLN^<^kbRv=xNrvEmp+^dm0jFal~Yk|ZP=2U{xDhPnm-U|RZ>VRIAaZFRB zGR)JJIeBhxI4l$5{K|pDIO4EuI6y@5Xw@hrdr%x%^J5h_Oq`((9L5ocC9QED&^SNr4TmL3oaZmK?ZY_Y&_EieLgO6M8xG5yIJY=(7)Kn` zVS~dXJvfY#u110S?6o1#<{3B zoP`?aw+a(7=Id#R%Hq!tXq>|oPBHlXj3Z7& zn8Xj)APAfkHa)U{Y|tRD&Jg1W2;&HXI%bS>g$BXyd>V+Ee1*)UXa^BdPe1#PuBWM^ zOpiA}>TT)}?%4ncXIlfeOvjOFlz?fOISQ}F(Av+vwmclF8PN)|>XCMXz+sb2mpiqf zyDdRjjK~{^L2%e_;Aj)5uCjw)-Qb^CmaF;_O~*kbI>2`HW9@X^-@`Y#Z1JeDpgW!o zQ=mthCp{7$2#k#g3z%FZpa@X*qfg%7<5@glZnS1U-bw-J{tPRPAF8bM>Ls)i0F$Rd zCP|YgARyUwyqCjwHCZGef4o}Z-dtNXiMmAN@!Pd83L;3ta9k_KEf*+wH_6Cu=L;#}uW<55)xKN{`E|hirOWs`TiD9@th~R0^cd z3_W&gJqnB-sT)a`suB%S*NKE_PH}w5CN5PW+5Q0HKG5Pm$Pm}9#r+z@lI_$%5cdII zOF&jlPl(AIz4!q9?m$l9o<{B5CK?O}qHRGO9Jn_XY9PR_wO5G27~dCXuY$!Azm zY>*79bsQYq#UL4i5~v<*)e{ph=5h_rqp0KdH=&WC=wkf2xj&q7aOy-XpI04PlL1VYsaXfva3GtUL-)h4)62vL5wKU5ee@b@u6d% zj|I8ff>W>k0(aho!7G+C9ji9Q=CnADN*%BVEP;(aOuBLGuQ1kxgr>F}c~=7G-*kL% zpcS8kGPmOWc0Bjob^O2mZZbKz9*p&QddMXZ)|sk&G{}+(9%0f+L0Ofkvy+ey zoup5q*-6NXBpDVf6L*+a9(mP^4-uAzTC!muw7kyCCZE+#dU~7((~ z$ocEfFRsV?502v>%spSs+xru*N0x_9Gu|{3WsSM2cWeCx?Qkr<@8OrXA@aPtaQqLP|Y&4XXi`yU@>5W7V<&Eb3gAIt893`uU>a zydd8Us6r?hj9!r@!z@L0cxMVnnfTVnH>D)7 z@`iUm`bTQoyj6KD+3Fy|IheoFVUz6fpb9fiL8hPy9{s?}1rhX=_=|RtizDbNH-_8M zAd1n8Iqt$a$%`=i`gu|?n53eulvKVZ(PvPXUib_k}Z%AgOF6tGh+7O)#61XTt6)PN$ z8KvmIZAgNt0qQvWFx6qRv}vIQaCb>CeM?0=Tq37Q(ca@U>CU?F4qXwXL{JtuyUAYm-=9T;8!uqKfKjr=q!Zmf>)zRRz*+2Bbb65_yV5Rx$Dt2ecHEy(pQg3*~1q z#xQ&unwmek9|OgcS!b%wP0fU*b0N!Jtf`9-jk8$k(c^9EVo6QluO~Iarglc_;u-~g zw%1OlirZ_yjUPN+%%{Lc$(^aqp%mr;35+Gs2;{T8Vg6vfFd`%`2~nDE8|!N;fI-{V zd?x!Gsncz48kF2X(t`nAN2PArtWy+g1K;#fdn7lfDRpXU9$ZbWWulaMI6*r|Cj`jU zj!M~(@c@Q{7^w8kLj`Rf?ELekT}J8#7DDmauc0GkbjXK6 zB)nko;_tyC7T#0Z|s zV6glPO`Rllq>r}nd(6CCFNe1?79r^3+0P*L{ZTtH~9(N zfC}>^OZ@s4+c|nw5!ROnNWf-TTZFyNW+W!JXl9&B7UtV*=KBmYkIwju+{`x_6})H! z@kTRV?ul+K;u{v7(Z<2sJ+yhWai}EXwI7w3ys&p^$GW5yyQLkRO(mIttB% zs+>-JZg%M7ZO|fr`H+>Z1_?^GY7um<43t8CF5YjJ!p0Ct92qLgI_*_crN`tW$mG}! zR!a~-arsK~)ne|^AVTZOw|{ZN2valGC`OYMwI&Con=y>)VIwHbO843HCGu4Imv5yW z%sOc~LPcwcc1yR?rI@}?g@TEt;87_orx2pp>>>E#G5svfIEX}4ozSA)!=R7j4H+Li zI<_BKwnxT;SA`}Z#MZMpGKq02x;a8{{!7i(B8DJ>V3BbM$jB6nry~3sv}#z@LIJS} zHglxnDe3g*Gw;HIf=$EXTPwKlhWk8n-%WK)liq_Z18uSGQ@GAUoz6{P3OoX_EE%wK zDR3IBp12w08ss7yWVwn}*)Y=#)9sXBnPW-%Gcz9)4M9*GQ#IgrU3?H&}k?f1m+)y{|d>|gz=oKQLl>2iW1 zEE=`=5o=(WtJs>9nrD*o(2*v+C@TRaXaXLy=o8^!Az(pyQ{D!BodHb{kEnd~uO5#l z6efL43bX1M6~Qd12+S9al+++AOzq>AAsgtAh{+`^jdtgG{W6T!AFFD1p(q6gW{De= zC2l~LIKPQg#Y(Y-sJ2jp!7V65m4Tr;<_k`Zpr0p&K1^sjT$3dm<|V9KXp##uU^ZpI zJdzHR?()SD>Tvn{=<;`*X-(o$BGL?;L9sHPlm;Lt#4QbE(zw1R8|ETgwO(E&b`r9+ zlxA?Oz3U)tHg$MHw{k_0k0F(EcwYOGER-?~(s-@1sSz{{NcCV)>MD=cBRBakWC&5l zuMHN0S^(D}wc8 z;4uf)z|uZ>wte(I{Kt|TDcO&Z8)c+Z?IMw71S(~W6cd4Ysz_)g@z&&HHqNn-3rn5c z2guZ{AhMv(yrIS2NB8?J@KKa{5dlpN9fYYLi*uS(i1wr$1#9X2xh~jOC(%ghI*YmV z!nSy#BioiI1`1Svd$&M13QcAERSv+_;y31!R74j%rt9K)IhIki!B-0h-wOgM231~6 zfmpmBV#Y5sBfPOW%;g?R(zW2T8C;&yL4L1NkikuOJSk_6U+UnF!k-Gu2ulL|xW8eMfx}#<`;A z%iT~@y=%DbbQlYRQi*>O@zQ-^r$DcbcX(UWH6*4w(JXI+NweGr7P;7o@$>P(T?OYh z!%$o#CDn}Mr*D9f%g3mtxKAW-3(su4^nK0%?czI$8gT)!Eqn2;bCtKN_}Zw%6!7y# z9Q;e+;9SBoKpU5U6KOfaYIXwZUPx`DTN5XZK z3u^D#*h@8eeth56glFLGf^pedtn>!>b-o+$9*G#GFMmA2t|qT=8I5-*R%Nq*sU}w| z0qN}{cWSlVL6B=#lfRosc; zoF6k^DtK*|b`qLbYR+uC=1dp5-fE8Q%E}OKl%iuT9WHnh`*Xx9e?oR-LHdld#eOmg+ #i<6zB(B&oWK7}^X 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�OOK++XZ&KMBki&2GPgi(cIq(&7aGDa05F{%)0 zk18o*bp_VD*>V}L8HrrJ{UwXuHzVjIa(`0u%N}HX6H04-sTqMJl2%d65EOwlS_MQ4 zsdrf-VgNn=fCq{nQz&xnX7&76AqpHlAHlth**$;biv@fBJPU&K@<|4QqvwMHp}(FF z1CY>Yn4u9m`Q7OGySG|BpG0sVJ^z#kS^M5B)brQ>OSg)rgm$mz9TwH+J?dYk>L+Y0 zafd|v_6gi9veF;xgtT`qbHDWhTaJY(ty_Fdvlr$z4DOpG9_BYu0hi$mODGX$LA*8G zTmQT+gshh!F>{@KOXhR={aO2as(_LzkoyGlB{T3y=Ebtktc(LDRaV_4Oa)FR^^NB( zWC7{V_{u-Nsvy*~%Cn~njkZuTdJ3vitNLl@k1bMbp!Ya5rk$Km-|EpK6>tA~tUiu( z7m?M+uT&AN9en80)VH4F80$=gI-vk#w(8^^^P$c%CgS=?VbM(P>R~Aqe;Ll!0%o27 zg3B`eJIm4+4QK&#n3RR;IgkYm*XsEeFcaJjmj%qG*M(N@1`O$3}|CsxJx(W&zWp^VtiS`%FglRs~jAc*MHVmz5PmTW zm^VPcfi7Sk6JFb_culQzi(9}PCG7;ulw)bC4sc*yI!_|BB7$`a6cKc&C?a~Dq7)IV zQ^00QHK~z6vk2Q(nULDeG>b?~vxvkri^xebA*H_oY{{db;_PR+GU+1vyl9kMn-WHr zId(i!J=Z=P;`5$JgfS3v3xZBr4nZJ#vy9!N zsBT>DW-}SPr@iE2^cse}}Du-+1=!Wnpxm|w@Z`TiwlOsN@Y~rdjt z>vQz#@13VXum$>~2OoNEiMVuSALjSgRLvnozJ*BDp>_vAbWMn z#-+mYuGDC1LP@(eQRdcmuSadeRBb{XVGwwGMQ{iQv#%Qtj!t!wj@cT!x2pbQkE*`4 z!;X7GJo|a1x`Rcvp?mwwRg!iQ^0ufLLiHCh)Fw3KquaC*A6&u9f^Mr_1 zh(^RiG{T>%ozisPW~}LGucFerMdavK%F%h-AVj@q@KSjZiRzf`A>Y#H|7`R3al2K< ztW;9JM2Gs#dIm$HVEFw+q>Gkq4q z!?9AB^*7B-%cY}*ndSpKdyV*MBtX9jqSDkaH!}s@v{l(gVZ-XgN3=NzW0pl5jCiMQ z^k@PA|G3#>9ob_PkZB98gLi!d~?$#Z@!^TeRue#J1u+zt@^#?n-|c+4<_Fvep85V zu0pEKHy83{7h8Z#^I(L`pDjjMc_asxYqoXF#Y@CG`4KmW+0;_jDG)h@Wva#!7mAaV z4Z6$T!Lo}@^_4!W`bsZVKvh4(4PpyHj4fDwo#;*&$F_n&ytd+zfGI8Ymw6+doG(Tw z7b&DQNd;~~Hn<)>&9wk?(`-lNLW+E`4N zE_8#qn;{auiN&)?Qg7LKJ>NjZ z7hEhoJ=2}{6y|+I<>iz=StsKM8euahxQSg9-Oc3bMCdWmA2#r14J;kG>O>6s1u^Is z#Pn+W4GW9zDJG_}{fL1%Kzks1uuZVC28vz+^w-i$GUB{GubQtaqT7MN8DgPegK zNhRjeu!On*3#&D{5t0s=X%HfKD&IKW%0m{G@*S7M(|j+eRH|r!3Xb)_jXMEMP-j38 zxmxNh29D_X4J^om8XPGI%EEgdq)VQTKaEMDW~H(8-|<4Q3Q>ZA5`-1>U<9hf(uF`Z z7EW&Fcmw8kX~;uBhDf13hO*bAAF`s}1}4bvv4Nw<9-f^#vhn{5D&8tj6X2@!1x2R4~##ZV*Ke6<4-CPhViFcj6V=c<%u=I zJT~-FKo7zRv>u95JJHt#(Q5N#ycfV$gyW0a@S%)VuVLnVBYk56zvl zFx&Z0L4L+zbH$FV6(BuWbt)h|OWT_=vaHOHYiT_!f8MP%eMd_2LLZEfH4F>!7>LjC z8-ij@UWq2Bj{AkZ>eAZb5g3g?Qe@L*5Zrq8_{uig4SNlM!ad?-^=yKJ1fg!r38mW? z8IATksB#IYVitnhBd}9?$Gg>f{6yfb*Xw}t2#TcF6)XqmW3ria6&Dnv+3iy~@Xk}P z&@nv@kUV^vneUmzljY*8NW!^Gy#etlciEL6g-jHrT4A_?lVbDpB|bT9X;|G`>&P=N z9R0G0S*WULMN#uYj*R^mM7i!$RJ|UMAQB%{KceV~Z1xlHD}gY@(J0hv&ikRGax)BZ zW$4L8UTprCzeMCWC~u4PVy1XhyqZ))5CgpqF)5?hVIqT>rh;RLMm+>DHd`ft$*!Fp zBU?FQ7DOuYZ%INMv_1truoc{*a-RzY5QCG?NH8@-=^ zsqGro%Cblj-=Rso1@-q&;twkGb&>e2Y!bhNizDpJ zbUkDamt22IWpVTZWP<61NAmQ-h42Ce3n>qQ{@ds7g^8*KuJt``GL$tNBz2olai&b3 z@DoOEpWJ2yTMqT^ggW{cyb|W|3HVOVzmos!uHk<74f=?#H`9V*2S}`;&oMtS=I5n>cp&?cwJ3m zR&BhlHZf~dylzxt)|faB*UuUkuN#+`H6acI{P~l(qnp*hLSIH7y=mbz6=2N0Wn`jfD@KRz|ow^C=Dt>9B@fgu3mA=)>5>A^VeupYy0S0`^a&kW_`^RipE zlSczki7!(HVKG@%!Tq^bX`h+x-5#XO)zE-KtOQz5udLC`l}TmKaX8n*VWrB4rzqH{ zbP4`*3fT%AP?~i76xMm^G!o6epqyr7)j!aky8n-<2w*`k8%{p?f@0Clg)-(?)PWr; z@V3;@2uQ@soJmZ`SvF999AcAebaK)p(;?fj?=$Uj;pJlqVa*zVf~5pubJQ`*USd}( zt&=yY_0k>NHQj98l*dHhV{klzLSju!=#pTK<@_I91_a^zhoQEN|0Oos9C4y{KiZ8J zA0_#hbK{CzQp@o_ar>>n)Y$rRkV-Bwk3iy^;V^sbhk;|kV%66vS0g#2$3kfSKhZsDY~->3wZ7#{ z=9HZNgHA>b=tO6727uGt0dz;NhCEB(lM@}l9G1Q@Z(S9bJkp=eTi0tWJu`3V&+Uuk z(RoXs%jA9XmTuc0$$vxpNQT^Yu48h$P6m*y_HKjJNk5#o^e>ovOWx9_9)P~R+PmTr zOykwe9(^jwEr0V2}6 z`NMKN5W+nIhSV7Y)I(E~uII=ar>=9VUzd_q?k6b9;q4(BrK3!ZtIQCT0rC~9M$ZDg z@`?l&v6p@ZjZi`!NQo=q*OJ_Y?aiD*IEs9pa8|kC++xAOtOoF6v7?p`cLO-xv5OPI zAZG{d^keA3n^nMVAOR78r^aQ>DmQu|H<_PnVXIO2mcf8u|7~^;O;H`H8}$w)p6clv zPj!;COA=H^1R8HATz&4MKsC49)jTuV3GFUGD}>+OcENjG1uwPn+x}rEM2;ReIRcG4 zY%GOF8YFP>Cr1kj>OGE6YV=nC)3n?L>GY?jVWV@ zE^|JYox&enR#U&wgyD`>tu}Ol^+8R_%>S_pd$M+qx&F}3F{L3452a51q>ZB>yoiw(DV3%ERl42h{ zZ09NIB>D^rh}BjT_ke#or+{%v8tLoP_#7S-$|k{8I;K1j`6kCU{RNREq=eAD-ky?^)nu2vC0zL*_ogM6hnk z#+63syfVRA>YKV$@#A&`7!1NPcihr^w>#q&%@!WR4;tVcw||G0ZiGw!yt%`s|J|;R zn@iOROw0<{^{i0$aQ&N3-aH-|NjP=2UoLMBfA4wo_paW$MGYSE=AkD#yYY)^_*LpA zibm#aa<@&JFNmH*vAzzdA!@S_Myv(ab+YW~27X2U~yT1QjjK!#@jO}hZ2-8D1|3auWyjqjWwU3{IOlcq|?9;C8fh%v^F zb23JMBz07Go2pKC;lN3H!h?B8N@+5)V zZD1^{#jFAHEo^YxT5(W_tY+7G+%jIoBwBc;dfl$6={T>B$>tyZ?SIqegMS|HEI9Cv zx#Qb;I)(#mARR-paa?K~WtMOc}lfBO-`|v>_`*#JP zXeNh^byDv(JK;o(%iR-=XWpNOps*hL> z17VkJTvhiwwU)`q;$oL#MdS7{(y8k9_q1b>9e=E|w~h46#zcSn9n!B!LELTWcjA3{ zs0JJ5AX5$eV5lbMWVo(cmu=&ovZlL{PSG{5I^IN)DB&7&RkjGXeIny<+I1;>Hp(LV zXBKc*7&lZj=z^CQMQ`Q9h+>-RX**&00kRM^4%wlyZQr2&~8} z>75bK<-U*RU}l5?nJZ^B+m}(s-G$H(mAxXX{(W3EnfjNzVvDbTsjGhIdRG1Wx#}13 zBAcwz8rQyEwC@Y6bSKcKF%euW+ky4)Vc|!#c{0Dt-824xU=7QHHQWQ1-un$M#%)>p ziDO)(#hUktoXjyboMWmw{R-N}VRbo%RiN=Me5HSjf5f%n2?TIQR=UMRY(oIuqdD|R z9c@3O(9QxIrEG^C+{$1F0A*+q;Yey#KAxIN*Rw!=AX4%SUGjNX$zTyBbtMO{Ua_+Q zh%C|HE@uXgP+ktp`@qodR^$VxD*bG;`f%%Kyy~par%mxy$a}Ovs79!oira+iE!+P^ zxcMjj35?U|3hu|EFZ7sIb`3^AASi;bmAbTIsEKVdpg3IF8cfzEm32QsxKn+|-kup} z3i~cek!mT9B{%y6h{~p;$*th5l@wY{cQUuM5%=7IHf*CEy|YvkC#66+aP;$h{LZra z@lsW{0_Z|4rz$pIsyfahVl7)6VX-#p4Q`Iehj1A36FOckZ0bQ+Y%OMbmTEaXiLj(( zu93KAiGvsRrRW>%V_k+HbQP6_oJE|&&{%tv2E}|Cc(XZKmGy8d#gYHs4_TAm7^zn? zlZ^fb%}jdZ{B&@FBTt|)3V2cjn`xzF)o{*e!AK9nw@pq3I?(uM1A`+_U@!$Ot-wz< zwpWW95{Uf(No<1zWRQmQY&T><|I)SLLwncVrUmNKx zl|6hhYRL+aX@Q&NG`~M~CCaL+F&fq)Njo963w=2Rgf?3cfC;-Ii^kirlu7^IWLk^B zfQpZYIR$C58@sll%Sl_!)h{0P;j61L!K7y)m|Hu<*SEjaOZ<-5MS36pFTu%i<8z?99V)o z2cx%1M5o+jkb?DE1m!pFTF0Z-^dcD&UAPc(+EEe7@r0eDf;nbLj#M-X2{r}jr|3vH1)asEZhszF02IfKSTx(1Dj9N3^Cy0wAE2eG`vY5DiMW~_3K zdw*))FVOfXB>MZ%=HY?H55GS(Z>+z5P}_^16EC{v0s_+!mnKO7m{T8pA`qqT_E8&jc<^hp(@I_9`mQF_?>YU24&pz&Mm z5%o1L(AZ>uT@q-#(f+zLvP|c?A#$}2t%xkrp<^N!>(FtLunrv+!C4KN-j?%bO9_1> za*_@m8{w44k$-dqhbSd9nr0LU1?fE~p@p0P`zSp0JgDQRTRBdvuhKc9D>{5)31N1f z?}R|?9(*w=(8%?j8(LZ_tFw)i66 z&4IZ8k&X1oCGZ}X=C2Igq%L-ouZ{IE?HE1bzQD~5c9D%-{Ya+nC5v_FHLY#Pvg^Jj z^K|szBT#cB>+AK5)4Iveow~`B5m@0(%9C1!5v}EybbUvPd^~CB0yPAv!B{$5S)Jsv z99_$P5nM$n^$n+|r*4T-gaox%q)ta~cPdK_PK4H3%F=e4!3=5*v}ze_9%hfo1sfV% ztum7s)@O3J@Wx=uf__IOv}o#Oj_@8{d<=Uid){hMcUqF15J1wq3`x`c<-{|J*4#BWy8D8 z&$*LThc$J?nsL5B>}9>`HE=P1bz+tk{eZTxF6T#%VNA{B-M;z*@vxJxz9PD!%g2|W zI(>S>kg)hCfC-C#%oX9*V_O6JpMTL6+k6q83iYtdF5qMA0!HV(>H{VgxlG zVi=VV?Td4X=lI$3Y}`9jrA65_C)p-7uli! zAY{udmolszt6!o)l4sHE5LLN$dYEO^OdeJQvumzZsg4d?yhP}RCN2H`mYIHQtb zJUNI!?Uaqznlq9&;?{Pq-!>2>`e8{%TwTK>&ZD04y`B^E^PHF`oeYmwVrS!4K>Ha% zVn?=aqik9s_ECvYuR+U+PMkGgrLKrtha`LjV$UETAl9qWu@)WS#-9f*xS_J~8sZ;l z)aQE=!7%qs!CzVJ*e`=UEW{yMyF~z=-OSd`2f7+WBV`O&hRtOJ7&$r>bX&ew@FC5> z`6QryFgB}qWGnGQcNE%6lnumB34GNHG#cbXKR7`2HB}CU%`*K^zC0EtfX%x z7x(_~G~&@Zzv&9>>?LQF#OEOSz%`ZWk6L+M+F(64bX`5@E>&(a}D$M$2HDkIW%=9 zYOXOb3vrFJSV5Qt6E)YE3JY<~;8a);8z$!EniF^&In+bTwC0+&2C@wQP*903eiXwF zQd9q8>YmRHOv-98MXP2%3^!dMV+s<{L;8D)DJRjjm@<9UiKdF*iHDeS7Ar{cy$mC%@48dLVy34z9!?60YT#?AKEiGjvn+F#SLD{gl!a}pe;8a);8z$z=5^3CBsQq03>*$?# z-%*dch0-6pp>X5QSk=?w=9SGyMtPqBUq~qL*zI(wmrwb`2|1^2I-6q^Fv2VocnlrM zT-3aV8^ls zReFxj?a;5|Pe)%3pwj5}K=GBDWy(k3h=#ia;`4f;%E#`fl1S%E_?8A@BmW~RV-b@- z-rMX&6R~;5Ap$x<5zLj$()#{Yf!jW{TQYfPIb`yq_@|`}wi@rjB8JmJpm8Ix;%jdK zb6(ng3qatu`vq+}yMn9eS=A&F(%--8aT*`)U={DVgKD}(@n4pmz{tysKdI!UQgS#l z_R34wh)0h(=8Bv_GvB5jTHh4UQ7KTMeDI$ydE|2ZNf<~o{>?QqUHwW?em9=-Gu zH86PwSMl{;;r{^<{$MKGT;f)ej0SeLt#HlwS0RN<)F&?GpnIxKuE+2}_Ho)_>fE*D zQN^&!QHg@qkv6l@gkS$*%dPVepKX-UnU*`w|RedLnf!qKyLf*j&|sfhb@Ny3Ae$tiY7E*G^TW z0`_b^1&nXNyA-hBnCc9dlFcfDG0R`u+@$!|Na>yKmH^E_vmNRl_78V^Xo%_T$s;Z~U(fTNo zu~R)Ylv?$S99*CsB28Afvw{M{FNKP;a+6LWXzFvBrfxB&19=M(~Zl~*2`X6Y$!go?Zxa0D{m5C*X3(~x_Ou^lTD?>H)9Qv)H!ug$2lonZxMVy9cZ&#|e4}i0T^>4MkJ*dQrdn{97la$h z2Nx5D7u-K%1Sxz+6@*)p53YE#;I`tLxBPT?;;cM$nC%Vscnj|0f^Zk*gB$jS`z)lc zqC*wnu3pi-3le0hG|uh5Y6kQWRl&)+Y4&un%(DVmbAh?K{7u!f9+HmrprWPH>E88x zBP0Y8G3@eV#fd`?#zs9DF}}%TR0MEzj+_Q1b#VF8W+kUBJNAU&h?7UVXKPUCXZf~@|!t$ z91`m2)`?)69EQQ9Op_;Zj+V_|PRm3i%QSfaqp56cp=ol6WZH%s zfYg0Jjc-bWWh;2YGtO1v?^T7yW?5)q_|r3m2)SOw-lD)XbTMlnX4LJ}p*4nFJ2#Q( zDw&a%!WDtvw#nHC{0DLy(zbp!n_t8AQMTi+!pvjWX`5`gBH4D%F&K3cqh|c`@ThYZ z%V8O3qBeRMm{!w09Dkj~3c@UysGW06g*I7p*Q0||VL@z|m@|3}-%NrW!mt1*`_jMG zOz##w#wJ&LhU(0_71s-!?d?p55XSIxFmk_Lvil`-I#bIvvrz;?0tCTUdgfdMj}))f zJi1#9369nLgMZi!LxS<=NrbAv5YuXTQd>fDbAW{8<^T!FLbpl_LAg0VqGb_lqGh3r z4_SZ9%>gt)8EqMMK zCt&O^!uO1?5a+;WcEtNf+NQ3XRR!AARVR8>N+HmVpK{n1@B?0v$^TXLcCgNUxTn@- z#OiORDzVB-L4}b&I0v7Aj(z$_K4@4JE;`v-kWN#2A4k7%JdgJ%4*!6NAP91CJ@_XA|x;Fz4)m_WNVa$xQkCy#8vx93bpuDx7PpQ~6qM?iml>Gl&CP{|x!40Yu=@)*VJ zAp4ZvZ}6~rwl@wXtM>Df$*I$xt>7b#*(z0NwsPFw{Nk^jtaPE6_Bz#U)um=D&Ru4< zIvJZy_6Ft{PeY(#yb-7TZ=9{pfKg9bKxT<~FJ;YE5)yw}3CV1ga?Vx~Ewh!0me~p) z_H3o{;E7q83axyB*k4S9nXR@ULKzsiQJ_3)hav?HHRI>i$7&a4d!y#Q|^{Zms!vR@BCN z97?CvC%UmjmBS5@ld>{x=e?<}ObvFiQdJDs9lj&y44}4Y42miCaG>$2tYUD}UrSMG z6LT7FCQW8Vp?TM5MWK10$%^u9p4^k|fL;uqXx_eAu!|{%=55Jlj6h=xqjK!aX4o#8 zsD|wa_;mfFGFI{_au49v2wIYqB4-9mYr#f;L6`YpDsmJPG?K0(3&`;IROC`(Qb2=k z+ZbE#8vGu%F=w%y+0U7%ZDR(eB{n>4W6oj)VHQl(wlPzoEsb)g@WH9DAT~%WQjx0^ zG3{6o8AYxO5?d6xX#mCpSig9}IiGG71(3~!bp+RcNNAXOEyL_(dVpxOQvQ%-68D@1Dd0KbwqupLY<=23)Ox8ztbzxWGlbs|92Aa!oP}^B;)RqY;wlY}7Lgn@*56SQJ(TU;*C9 zs^sMWHuV9O&A#7^sX}xYU{ga}I!xasHlN%I*PS7Xp&kYj4u-mh4D}CeuwyJpl_VyO zy65}jVXoN{(h(AaSG>iFuM9TM#bw!CC&$x#<=^x7mu&m z%fTj8?oMw&4AQlz_>w#EC#tYcyb#yt;;DGm%%7v2qnT^j%!-_5w#LKK(Yi(5@$fh- zn&aUKxN0OGp5$CIqgDE5rx+l(Z+p z)p1PN;ToJ;#|2;d$hzXXP;UlP1zrQeD?fNa$xrnEEDlQb;HXM|?sq(ymy3H4ryD<@ zB@NTHK)k9Qn6iAh9HsH-GjCqQMP`*quVlw;lXRiVau~4FluvjyM6nY`irnjUJr{E1 zb!+TU(qMeRykDMN!w&{bav24c^OcjDanz0?QwT$bU9t{izdU}6z{6HQhfB_0 z)*MiX;Nk)KoPs(qDbyfC>MVqHG0aRiqm|^y31}=~ujaMF>_$pnX@tH1;cSxBa!#EkM}-Guloba*p40Ac_f&@LRXSva6W zMEe#I?OQ3*=53>>0KwJ z->nnATQ7X~sKMjbgj637HJO+@gc9JyyDcVz5VOO(!GL#xMEMx7kqo#-81PnMz$Rh9 zJA?u676!am7;vpH;Df?|>x2Q<3j;oiNh?3~c$cRG_ub>cyWV!LF*gEaGV~avj^R=D zjJ3H2^V>*IQ!{jDdc2Q(f_so~y{q1IMo}cO*`Ub|JJ9#Sv$CQ@(FWSw^ zg^--@&|y51ofTlxcUOR&!1DM4JOMddO@DtFE!}uh{tA;-C5ai8kV)}b=+*9c-dRKs z=j+`h`Wu9*t?WQ|cnpup;^qW>N1oDBa$6x{2?7aXX^e;^2#B5xjtPjA_{@i#QsU$I z5^h=DN`Y|6Cq(_Fd{~Rm9I1fOh3I~S!)DkcfwmD2Zyhbdp^m~~2&%J%!=IFJXaL02 zXOT+{eKi6xK5EQZY*c}0ssVx`KW{gAN`^I*3@vaUY74DF1|=D8HIiYiNQMVRGORO_ zVZBI(M@2F`W{`k7jOy<&pO6NSv=9sT+TFj0Vqq1ClTR$Hp;&-Gz`O*3fIf#nfMx=L zfOrT5XfY577!wc(n3o_BFfTzMfDIrJzy^;M6btjjPGrrgyC)V_{nIHHco{%4w80@3 zsu5%B_C9>2za?V9nd!b>@ReLI;av+m1tD4{DVQAvK^se38Oq!IUgJ&i}YGEn}ur zRVHc(lXWtFD6uF9eu{T^g@_G^Lo4N}UIu8ONywYM(Y`~CeH6OAa}{#NKAiHCnGg0 znIbhk1IccnpTS0E`uLpaAa-xlRSH-IfqB=t38!AtTn;0-f+%@sdw|)V(%B3&{NPb=?=VH2+$?D*rvwvHTL-bl?ch~jFafpuRM2{Jd1!}!_{f{&4<4nt~{Oe3R z-8=1zlaO|lH_UlVQ`-#of*1qsUQ~fmXAUqta1K8s`wCZ653!Ef$s*P0hdv=GY!Ebu zPJlj>2-6k;YeJP;`c|8z?>3AC0OOFKO>2VM+JF^tGk^n%bb*I_xChb$gjA+l1bD^l ztV*$1Rf)w4X2LO!_;HC@h@X%+AMuj}A?UyroTj<8!&dT7nsqk<<`@{mR$JMe(!d?f zfycSTjW;zo6O*hCktB-Ku7ESNJ&1x*LlXyny7?n8vuJyET~V~X9p+KmjRLXn08sj? z3fiEz!3)EOV6-oy_j#CvBnG+m2{c}Y*-h|mTxoN~5bV*~U;aSjr|hq?KqKyGFc3=d zY$U$GwG||s;cWa;Op}o0okp-P*it%%lOo)Vv{DhtQiqbyTg5l z$t-@f(10*#tf29UVKt#_K*(#iKx6P4#4$=MHl{tBczdw%GauG$jQl7tP&Te;3u-DL zR8Eutqb(?ul29c`r`R!lv7jWq0-8>jIYGuH%sd#DcquqojawFzA?zgjF+3{}!cTcp zOoL{{IO1d{q4!bE%n=jILxmZoEPaEnA3Rc4SVH($S`y+otVGjiNXgyr+>M9scIWQX zl>U`)rtVnPX&@r(upMH**a9E1cxY>$-tL-|-PaUP0qM*>EdG(CKqe07zhlNBkK!@=45D8&dM2E`w5~C8TbP!MjSsf8; z5E&KTNnvP&T0$cA3*nnJXs=nAjAW~sS5bdB8og;rTS^djo*yAfx0knrsSLTg!qPMH zH5+aWJ(ex$(y->71Xgem8z~VR-A2)Ys2C^aZio#?6lgif*$WlN zR!3HMQ=xGWYfCX6q6rJ&)1PIrSE>QjONP&1F^puV8!reo`yemqHZ{6P}Q9L zN?xw?fM9;NmAv$NxfnprqmK&rJ|^6|ArX319;kmT9%{zYT=rIE%pMeoeN$MTn?|yK zph`a>rJJR6E9pr721xKXK!U#ka`5?E_&2M+e|dW0{w_<$#QRs8Qx%9^D>Jfc4(25U zupNORtJ?LTv}>KTYyJD$uD?zz*sehAVf0J-VJw-6CNvYY?Jh@G_1m@wrN`GvkFVD~ z{=W5M-_(Mw#m3;1&=_?~!IbM|j5(R|{o=om^ow~JFz0?mpmCY>4=>Wf`*w6klPRN{ zLigATn6uTYOX9oJa4$lGF;h_tW5P&pl{R;Bue=)zQLAEyeuvxy(s^*_tj!k_Dg z79QP)J%H!?po(-U>bu_i!G5qhEKk#)X0rVQvHSFw_o(1J2+5Lf9(-u5o(@1zz{KqK zgv^7@G7q+zd64^R37XL{4{k8?V2>>IQ3O*bnuow<+T}%k23P1c(kqx~G_nT=VvR^> z3z1jwLspSA57aSeD)lVn(}KnFztss zVB7AWefCHD^Jo)S9Q*FD4>dQ1?0xnUyP_Cm56X}1Pmj^aVm8{t4t4RmjqIBUD!Yth zhz>0VZ3y3dG%hu0ziUHusu$YWYwe#kpsD3U``pp*4z+E`LRq3#JskIe#%?0xAH@u* zLvb4l9BKG$ylihMqh`7miHT6V$b5+MJ&+EIQ4a=cn{Ush1DL7Z5}ZI@@g`&`1w&h~ zT1T}7dA*(<7Hbe9r$vVT>{19sykD|RO@@?erl*8>Z#}sN%xqFI7vfR zat8b;UeRpQ>-cGYS+z5Iq6B4@K1PBfeMcb33Eiw);fM?iYU4pd;@qX{6DQ@>ohYfB zI2nk@-hzN-SL6p`lP0;W0})QU;@RkE*iR=&QNl>pfu67{3Or@OE*C?!Ukugdg0hEC zvbGqsDD&H(i(bJmYfr4G^)KDSpneqmom%jzP<7MAqDM?l<)m?^Gl#2<}@s?l>p<&;=F5HZH~hI z9ch|ngsxPh)U+W6TxyJ>%+bY@6SUFl;W( zRl4*B3NXFpw7hxSZMDbXna<>UItxdpz+uC*8zb+9*`}&{!1yGZ+C|akbVZ_c4R3$Ae*>G zqANRkRc!(htXkSZqs~7dU#rG|yipY_ZV2WXQ_C;`b4vCVGp4X{>e?U`{?{hnex}N= z9G|zd$z@Bocyr!8aT071<1}>e2Vvs;YPBBZO1k_Xm^j}l zFmWEb%GwD&@1?>M=YNhVikbgmPeBI+Vn2AlhhV5Utl=657By4lMqya_!c_T~{RQ3i zJMy*ry6ati1&1It(td^@uM*%?$)U%Yiofn5c==zj2YZz@PZDMkW$G9T&(Jl7OhMUS; zFk=X%WBb~S8wkYSOV6du(S;F@2pgwIC@n#)UXq?mngUAyWXh*JO8>`g*>&f0m~;N0 za~d_9rAkwzJ4YU+?g6|SD@vVO-VIdV!$1ROkpbv(7t(_go+Q8u6%0NzDf{RXcK?Gf z9#(bjwwKo1|0pP&@We!a!UUxbU`5=Mr=x!c$1UmTVzl@7Y(-qi$t6Cr@Cef;D~Hz~W-G@sFW_3{4FY?-^hQDU zz%P?XMB z1L8fg;7u$JLG|dpXhGnl|0l$eFL2TW^0oU~P}A!LIq5)v&!+|H!x@(pW}{DSg9>CT zGXy9GoPL!V?%?a*9pg1$_l_vsyBa+{&!D)9LNkv@Iu<&dh@@iH8ifoBb%oWgV1At0 z#N9P0{PwlMRlAOst>VF-DZRS!gu@GWqn52-7EMsN9(R;2hc5Get6h=93L~!7uIKki z?OIkq?YhTSyN=upS-n_l5)#4Y!UM0u`ZT-pPl$gv0(<8F@70H&tu9Oo-G{%m^}<5) zBl>qw)u*5BC@9rn-^eS~G_E6oYhl3_e*rY_GgRij1i=<3+xXZ@+MzKHLX+Fl1)F?G z|4r^+W4!D6_eWz~v(Es;^9Mp>ya>Ed#A5PAun*-JUo+FQR8`ST#AB=J_fL6=0MjCx zm{)lL&p#k--F@Zd*}oR#d6II^l$VE|btx~!_YK#YMtL!=5EWhjwT_+hR!V&p7johV zGX6nyJe5~Ni4D<1U?0he)p4cxhgFGxShevFL*zKQ8w&nmh@3>F#$#P9zSG)6jP*;l zD)5sEL7eLlHd;VK{?o0wvMscQo?r0oQa{@s$28Oy>intvbg`u6b={-B+SLz5B+}?O zK=+Ua{G|G}lP2wO1pzDJ&eV3fVx>LGL-w2V^<7z-@4k6WM4ebUc=M#X;-O5eAnC(o zBI>3a>=4}L21MjJQ*6j|ds^8r5%@RTv+b%@h{0zxjG&+1aX2){MXx>*m>){F4P^?U z+{$UjFNYmd-LH}s>imGi#qzVdB6_a%-~c{x#5Nn9{?Z$PIwQ~!Kek!)7hSKL6++^u ztI?^Xv+~?gRmvBo+RSe7hva25bj#!^M&*EVDJq3WUs*bXzQ?JZL})WyK|Yj(Cr`5< zd2wNfrsUr8K!z#UX|(g|F_c+ixCMYI5(nQ&8;?gv8EJCO%BDuLQi*AVjv zuLX?Y6XP0vEK|bA;Ee>gS&;o?JQUG}5`v zM`7k;-&MscdGm&pc^w~Bflg1w>ZO}|!(IsBW|G~4RAl2z~y){=0 zRtxvgwFL7L_x)lA$b!D6WJz05v)5AuzaQXf!L%;E|WIRhI6!T$_Vrt0P~K?#2UiD zoe2oXb%Aa&L7{O|irdu5W|4At-|LH^1V&lmOc%=Wke->y`l4C{sm+ zWS1*fctxPOjDN9WR;>>&5K7~2;vh&N7ZwB;sjH)c3wdi4P7kkqiV(A-OIChNq8D=M z4XHw{+CKqZL%c^~zyTgOt-LLGB~w-2WVjT8czB_FE;gTw)0{jcF01mAm9tezXDuh| zT7J4yYQb4J)`F>{pIT(cCZ{2#&MF9m4f(LH;zCyy>>GtnGCTwUM?=)-;tX8Ni41ev z)9Zy7M7wLvU8A67c)o%H&N`f-@FMwMfNy=V-jR-OF@s{bj z3OPG4-r~qJ-|5-6<3Fl3y7q-CXK?=5mU#QWw$isB4HV3zM$=g6A?1nl7sQ{I-$i4e zj&F)T%kZp45;GxL-y4sNs<19Isv5Pc1I!?!BDfgT#Tf@UkAiJT>C^1dJQ|WXBiUGO zuZ=-3iYvkfEy6}yYptt2oG1E%tn zxN*E6^+Q3sSzha127UD$4n$Qb)+V}nV0Py6u+cwbhbNOO4N(@EYPzl=B(}uG)2xYD$itJPzy|F1ex*2Ke5w8AXcDv>yS@ZvA?@9n;y1MWr5`r)(Q9;xo2o(}b zQ9+Opd+bYWL4sPF%p`V+nZa~~P!y%a)*!8Yt1XGxRa2CtvBXw0CWxh$TJnGAzV~M4 zC6f`Vi~b_=-aB_c_uO;OJ@?#myP-QNhw~CiILqp?@RIE$39rtMms3}mccHj;yNMMo=5;F+7#sCB-e^PBCUfI+3QAXJ#f{OSKy({!|556Qq zehNcA=X68s55P&Aqv#D3m6+i`*LFh&$*Lm3?9xPnaip-^po*r_3R7v#P?{-SDhNwW zw{2rxM#PU66nJ$Dd`x+6e~dg07$QOo<|7w|tAP+Nl}X%P6?`Ln25LK;R3_TyXvYOy zv1w|Dye2-`EHDzu%_%F$RBTf!R?dcfR+VftDKVo6vBL}O!zKlTht92K8F0`@M*|on zmMMWx>py^CP#A1PA_2u)5%~oCEhd-aZ-sE8zA53uKs9Ov%Lm|v4p?yHLv+-E2uh%% z7a+#)#sr}kMq+tWR-~!+k?;_%-(l9(I-U=slQHl{Vt=myOF2;9 zd?vXI7D5c8bB86~DxtjPWI0PmA)%#Y`6!Pi>&9!a1G>?tX=0M9XM!cLD8z)_bChwI zCt6c-PKd_o4q%>UaOpHhWWdW~f?szte_%vqB#W#@H$zg`frqaBZ7@@FzwUZ*qixpx1z0XDG=ieA17QICK zyJL81zFPJI$rU|g8MFj(rS@6SUjgXKc`aho&R7ln z-?f!%;2gQjI2_7jGZ?>2aW|8anOh>tGLrZbWMiB|WR4pQfq>F7V}c{YE59Q+k;Nrt z2{DiAV3Z8ms8yEWQ*}{}j7li|vT!I6MeIdLW4|oLF=p*rDh5CfKgKrGqKuVFTb<}l zzEpdC8%VQ)PLT5Q>4wmXL<^LbPt;B1zVHCfb+M@Aou9-oYK_zx)72U-guX*WZfj=k)bKBn-I4>cS2UE-E?Ta z^@W7MaY(?#OdpEoUB%c49X2HN8Q5-R%|kS)8W;3%Uo5JJR4p?C`0JjOIHML76pRvv$!G{q1ad; zdU2c&kZ6~zy$G-jQ<~uBvk-Lz5!1#VdT^QZ;VW+2#n0ajAg<|4Q`mxR16?- z&M{RHiMK1pz@br7m5W3t*7-Nhe_{W)k_ChIGJ@A(tIU)0iEE zKK%o>C?l>;Wj3{t0tti^E|h{l0?VhUmMhzjsw2`;QMQ%1NM<=brJN!}kuW{}W}HT; zGGGzEhydUZ$sz!l1AhdQuT7GI6Pq!;vXPDZ4d;ncTvd?lh}e9DNK*pt+DNI2^LQ#? zRhBf3^`w5M%C?8<@m?ZCF`e-WmGksK( zvm=xo=~R+`YznDDKGcNVeB>XPJ_btFJ|b**q9I4NyeX_%QJ^o*jL{4R5?hutZSMJJvMBFY&p#brEB-n;FRXIy z!3|los3Ep-5gfr#7gCsWGPlOp28<nayG!6NW1$Q7XHYw=2Y`4ONNx)8tT=F6DpQgs*>C8iAsWhSFDfsZk*cTBv{E90=X z%Has-A=Nx`6JkKncVpUOrc>{Y>XXRIuaw)PM!HIu*h<+fg;cc=DS59k(B$(9?igBr zv1qiQ@Owg-tO@T=Nrf1m{_1C}391N;Cpzz;Bkl{qj2`~Wk6KP3E61uVF4;L*)U zhtZK>Zb);Zc{^pSWP$>dxF(CAKBEIjgQJO|08`xpbPQ;0D|<0JZ-5J(;7Ak$0!LWL z+2Ru#4t~!~<y`IL1G4KIe1S$IJU8&ks;(FeWEG~tOE1vrkih&UG1TnsT3lU=UFN3l6b;7yjIV7!>JvdLn&?#r1#3^ZOe}X@G zQ1Yq^#Me@w(_n2RuAafT`gNLI$>$=+>S4_UR-eUyZ2HO7{cl3XjtBl$G8S;>!w^NB zA)0q_%eVxZ%2)^Q;+7Z&i%2iTq~`3xMHq~^DU*EznNAc~@Ag_V#}UTzXp5b)7Ul_U zB=xqD+tCMt^PWZm_Wd=}2+sxUaHH`E6EW~kl{w-wiQaOP5i?8b`zw(V!wt2I$ml4e zn3IfRz$Q81Sq8*)O`t7oPC*bI#yniUCAPSCuT^^5MQjls{xH2JFt!K}e_)G88CyI_ z9;Yydi7kS4f-Qn|f-Qn|=EW8TdJ@KBHzQH7q38n*p`5l2j`)lN>KHNk$c1ebIZ0|f zA&}VGP-Lsnkm~{pxQjh4lLnYyd~tn4x#sQ><}3JkDjV3C&se#C^T4jV$7)Bs?fEHZ zN0>&ZZw@S|vaFXAfWZ;jyswn;wf>U5VOjP)dW3Ke~ z6*kk9{1q6^#jtYoIX3fLg_|eZ(Iscrnarp?3-%&xS&LaGgL&A!&g`6Y{FL)nhG~}_ zR)^`|H`8gk{(g%2>W(>Km{H6b5h;l%21H{NC;opZX39_h2*upl{4b-JVECXj&HH5S z0p|1n%u0fPWXm2p0q0DJpEsv$YQ`p^&p3KMzhfnA2!6(>xfb zHxGDEyt+7Sxna#t{>}eZ;w}B%KT5nqjEnSq5N~|`iFalyh<9i{iPyn0@g9ToKof&4 zYa(6)TvM9@Z1_@yfoHlvkfb^qG$afC|IE*qu+IiccKW+1xx@N@10~ZY3tKju_R654 zWk(#Ps&*ii+$*PT#BJja6V|qISi=SmwsDf#HqKGDjYDfF225eVvkaI@#Fc9S^(LDC z57rUxq^e4s6v3I1=1cSc5J!HkDgUY34ph&`MIea0^#8eIS=j>U2UJmx+!jFYq~^N- z+epc{izykQYQ)|PRE#~5`?35}EEP(o)B*55hx6R~%= zLC1~^ZWBT)m>YC=^bct}@qoIL4e>)sY>0ordJg)JWbs6gd+>7TNGuHQH`&*zx5g@C zeB&Xqi`tg=_P3yiA1mGyBPw42ziOrll=r`9B5u+LV5?WG<@K%nmuY!RuC|Jxx2_)- zw7heF$XmN43?#h1#N28#D=Lk)pC$sGY9!G&99Er$@ zQ>s}Yr>)KZGE^nU{xhg*fgRCTp{g7fbtVcCp^8Sc#gTWm-(QBR#Vh_9RF&TOYE)&V znWO3zBQJXDUxp*a@_z{O+IU=QM4>K5R-a4t8^Kyk!aGKAC zJI#k!R80~?4SUT|f1h9b@~Bq?awYO+-9;4b*f&^^EhP`2MZRTI5*81;NaP0gobM#+-^Ul08wC zO{;e)fDg}w&X+0fU(de#kE8_IyJ$tzZTSJ2 zQ(L}A-qCOt#@a%*L{{6<5n4Hho!h)TLo|_}ww&3*w}sRIuhW(kp)Jt+p-~P7cId$w zt>AhQ-ABEM?xS90XD&QhAnQ#ngfM+`LG~gU#FaXfTMMxm_jWSQ2Va1QrH8`@$Gjre6M6P%dhKa=DEibzuxC8yHnZOHrRg}uI%z|kyCam6?DBzhNuguW6Z@rTg? z_Lw@orq1C&@ynC~b!QU{2ergmINH+tRia&R3CJzxL66Y_uI5 zG`&IkCE#VKr+IXd`KzLt)s$8P^<)=lM2n5#g+pY8Q`1Podtlbhf3WO7u9#W-2*a5GIrBkA-6`1vzp#M{R_w2yT9N>S)Q z^Uw*>=_*m^0I4cW1n`im1`z-z0)7v1>V!=wb7o+vZj zS>cvcb;siwaq!!_gTO=nW6CG}2J;3+<)kA)Rc92KZJEIALWD>Q6SkZr>co14s8d)@ zeu|7tD$W|BY-@26(@AUn`PobT2Gg}gCa#S{7D0G>pL2u*&WA0iZ! zC{Mo_AC^e8+IsUIq#IB4gnc;cvVl*%!r_dY$W*j&%!8YlA-fC2I(>iYE}U=X&T`r$ zaAqKk1Tg(5b)IzU97E|fSTaTCovw0Y{GU1~LKvjO`Q~fk8*vPSd?zp;v>d(XoCD&p zECEg>3dW#(^NG`!kV6b`p#U3`hdhINMHlB>(E4%}wAYhd^dDQD4*QlN-(K%8QhevN zSdV7<4(B{+8Kg^s3o-w6=II_PtvkZ%#?th!Tg#V!REWi9NSWCh&$}?ku|`_!@E8`z z3NE$@gJ?X>75^;s+JLh5aw&z(XpskiDnuqQr2-315FcPhBQq$lc>*_n|LIS zhDSFHP8ZESV_&l2^%*0`=WD{9+SwPHw$$B|l6`(9UjE##U0&DLt*E7qNVNtsqF z#JF63WzJmd&JTns%@P+Ivw|lR11JPna==G8zXI~kDR=A@Ef;gHJ--o!=3IM5ibApW z93ui??b)9PP+K38H_JuZP`u~!@}B9yh3=D7qmF3 z>M0nC31P2FuuiHvYMy}HrtLHbc*9HDS`h$V(&&O3QyK7*rV;`A$st#+N%5YVxYMQ3v028O(8!4C}X)&ZliLwe%j z+aW43vtO1)Z(_dgs1cq_T}BfvVhvnGwZ`@t=gJTHV0R1?L?*L!hHn{e`wV^*uzdy> zG}u1FCK|TSQYeD}J44SrGA<-!Op6x8ecg`U1S+Q$i6df1@T&MZ`^r>fd}0rXj7t-N3eURFk3SD zV+xC&b(klB{Bi(RyY{R)|Lij7U8*qDuOM%QHJohE}hqJLs<)Zn$K?kjY3t?7Z zeH5sVVLg`>%@`Y&!5JKXyH5O#V|uhGV3%r`RXRw>;~twmSk>yu!8PpMkf}tM7$zFB zC%9OLB^9}5v9X)U6p9KMfNA+1BSi-OlZy8EU7^ci^h}T@xgY_M!Z$5wh9VZzY!iuqQu)$uxiZ^DlDETj4$dk@w zAr=#WD$=BntL+Nyngr&9NuLl6G&+Axya;yyut}e;B?N+8Xi#7@2$O!oaxf_mmS6rh zuiB!`?>DcEb1-d~JpoC+vzu35g5+Xp5m944PjN+Qt@%28oR!DCClg+}qe1%4lSvUl zj#4^{;yF1YTW<*EFb&7WVgaDn?)U* zXmxRJCbp1;yW$=iFLKT#*;H7K@(R)>!%4uLI*@ z8bwV~B3=^#phP?^0{BQ(i6TH%scMr5&_t@DYf?>_ehhEVB7mDzHCY6xDOHUW0cuHA zfg(Ufsj96AFh#0rBm&fss@z3@YEo5c5x`xlDkuU}m#Th$W?oZV8*yC(z_k%)M1U$% zRT2Q~+OSabv0uds!y7+@F+5vCCw>)mmRm(V;8#(Frqe2lmQPTf(((zbDAydTs0k2& zXp#V@mI=FLm?RiO%@|CR1mo_s(j*2BWr2>-teKGzT+*`*v%`K5NDT!}i90g66Gafc z2t-_U@k~ayyunZhL3U^Bz$#L8G8a?p)1FsD)(&^#x|;uP#9yE)g!|+OZxt>R#UB_h z7k!6B3=zJWA#d$)@MV(s_`{U2WK){efyFT^gMGIO=WQVPGy_d_VBsO*!g@AGPq?$5 zu)dzniotreK4bk{wb;QlpK#t0D369#5x4}x6t2`YNX)R)B+;ewCaCwoa5vF+NQAMm zl&ezL6R8Yz`p1ZHSg)|01Q?G1=#02H90DSE+dmEgDBa*AiZC!-oFF7;f}S8YvmBYt z%uK%rY)3`C4jq7dWgqZ2_dckS0f6b|-UnvxQR(L12WIQn{M_6N2lv>wQPZswmIsV~ zKDw#R9CXuc@LpDd1gc;p{unhGIeLCt@*{r4N+FKZz8)SYxd&s~NBrpU zB7h0pBc6L~;vU<$2jk^}H18M30of!V2>iT=-=`mm_{mzoWKP6SX8vrGnTUTBP)j2I zg-O;#{86xS5p3e0_odu-Y5jI_x$n~WCE$bQz85c+a-U)~cd1$K->}@{wSMtj?(rJG zZTMihZ^DbE++|jC-;7HG+33sZ@`kaycWyXX5FOZ$|0p?|J=B7*}!}R9HNz6kH=2-EVKq=wub@h6;~yq%-Fk0N-Yx`Er7&4}v#(OrfN zk(BW+9o^*&mGM<93k9Zmz(SC7w2xbYz1>>9*!u{)(=5DQmC$$NPr9U9Dijc8uMWL9X zVN%#MU!$H9sNZNuMylr6+%Aez1kRrjq@0`ycocinNfZ;Yia{tY$!?CL%4{#;DE1QE zqy4Z#<2O+7#&4h`lZvi-0MjSh>u)#^{UZ?+{U;AgWLR#o)z@CyN!dl7YS{}Z7D-ZN z6+`;$(P&FFzM^TJMr8m+c%w3$@P>z@mEuRT;;HdeTHYH$ty%5zRija;5qim38NBh8 zp`No=naiCB7gQNq8s=S@A6VCM%g0TGm3RR?@j20xG0L2)SnuUb-ekelaX6NpXUC20 znCB)C--&Oq31lUukv1%5Ykd>wO|!LL<}6U1kz?mFS@=uJv|6Fu4D)q1fr16?xFyyR z@Hx*q#7ufEv+Fzxv|%N*7YgJ) z$Ko?z)2Lp2(jX~EBh~q8q@t5y!K2_dM;+lyF;J{b`wY(92J;6B#=MAici?i zUbcJ?BjeYe7`wI+<|6A8V=dGJYGE4%%6XGH&)_eVV|~tp0Wn!=S~_F#JcRf#&R9Sj zN-ykMN*KH1I0cMdVe$$|3cy@0<>Aqvov{E@rAahdm_*6$m6@RM`#bi#z#6fs>8NP| zVT^HtPg~P2B~xr`{q{0BC4ni9*=)CP%4gSbAxc#}yIC8&F zn_|T7E0RQoj-=^~>J~JDaYugNv>%%PA9J)2`I&hGC$TxekzJt9jUqOv0BDpn*)*(3 z@$ppfg*C3R-@_?|83xBO{c;}3Td*j+Sj|rVXD}VB1?!v~3fOL8Sm9p5Zni0hzj=lG zp|Nli_q8>H3Eb9nq}!5PPv_z0xOQUcooLIEod4j(j%HmliUL`ZX%xuP$=o!mkS{mu z_7y2-iz!BNcrnhpIOWB%^|v7_?zRqZZ|=?ERZBegS}FEV&cH(i7SE_BDMy3V3M(aZ z(#0Fk{bJY9n1|Ci-eBCg_r^SY$PAX(JRHm7h`Pn{g!^`)yp@@m_dJ0Ugcg~m{xG&b zX+oiS*oVz5a3n!bwwh;4d(fo7IoLO|#B$_fA=y;$4NOM(y&uax9_!uwZ=hc8 zZ>{c^Wv04kH>J9-(E6?5a$lkGi^B)oo?VR>l0Km0H=gjMi89J+?or5{m{hK_yo_^+ zR9jY7YAgqCC=(<2=dSg|LaIOnJD`R6k{U)B_+&7@keXkCpQ)I0`H3KI)=I{^JQOnS zgJ;$r3N}`Zc2FL2Gk?;xr0OQd)O-TKs+++Wy8+DPazdFk1g0cFbD%#{`kH*@K2Px0gAKCcyjo!p2RswWg_ zoWr0QR`zUtSs?3-ijdp%ML!Z6W|qT{eCBW&f|34Mc|He=OK0C8zQ*$ zH0<@q%r{u1J5u;%Q8kPc*j7}+0}D@k{eohA@2f+N;vw~ZU#U9C2;h4kLvMxIFk=RX z7=!63t*N9kd7E z2{2|<$~YccLEM5ko^OAF{>$>iF*=(RV%D|8nc+Nf9Ujssd~%LB zKDpww3h$jG&cIx8LO7q4$@!$B{R2Toam*|*lWg}Ba}?kc?w$j}pB^w(ow1SzhK@Pn z4a}7?ggbYTBV|tmJ6Dhc>S+TVYNis{0fvBR=``HtmmM`ZGaGLI!VA;OW#J{;Ny0Tc zGoOt|*3qYzmf)oQ*1L2gG~ zskh!Ku3=6K&0qzre=bY{{G!9!?)JReoYL_JmWEb*7=@hEabsV;_7O)bDa|^?LbmUB zw_o!}O0LbeM}oKgTjrAIvOi_z~qTGq>X}45cz89qyEgge}72n2KOE zw=oZ0oE=PPurZG}-iT-gEy=Eboabmo2H1#?v!r!?#T5ZoQfmFI1ir#mqm`6av$Y!d z3RjJPNtsqF^jcIU9ZROg~$-hdfVIExqX$@RPF*fG`;c8X+Er`a+hg~ zPSMbMCZ~j*ub$GUibRq>Z8gQ$&(e&k^?UQcH)>mMD)cb&R_qDn^cJ|zpJ%Owgjj+c z_r+r~VTi6^87~4rjvFQdKqK8#1hC*H_Y+ZsS9!gSgTso~O0Z6(!w`x|VJYQ|H9L|c&m&vk6 zbDH7E>WoaQFd61;{B4V<`hnN7v)|0dZ45&QRh~-Yq!5!QAGS5m{G;p!^54w5t(dU{ z>(*_YUzL2dxwsFZCtsMn)(q%rewEO}i_Wl(=S64O#;Iht$s0XO*cv%s z(o1Km(Z(xgW0CBpGr+(&j|+Z`2hyM=coxAaP|o|K;NedQPJuY5z!aioxyqH?McXt6 z$6e?z+MhzbBsL%*fw|H?yy!$m9tMRQni7it5`#j%W>im+L81O5YX*fUSm-7sLcL4| zg^&|z_46GIrTuJ#u4YyXaWG`y%nhL=Wafr5S)`*}q+I5PpII%wz18AtQ zU!y%D90i;t@DaZh?s1lTByf*p?!hW~#BUq-#k$t$L?Dg>#&Zvb5u=SGf361m6*!|T z9Ot=Wt?VrN9i{e&y!o&bTI%RNEkcN8Bi zcUYGuSjxSF)!e@~a~Lp+!Qn1ZZ?spqot9yW1?oyUJOkCo) z+(9#&@WFDA$BU)h=UUDEzL`6MRCe;|0u=QczYHyT6TeR9naDd^hSA}#C4-V1KKvZM zTG*;!1|>ZhlM&PguWL}^Voc5N9>aKq3|={Q!|w(IModM3vE5*(fa*dsFM>gOsE`u| z0itM57-WdY#`E*Mfr^!yJ)F(OAAa=YKt z2m@>Nt_<104-oxzi2BszNE*H5zE*rAz^Ay$-3)nbdmV_f&j|yf?wKK!#RH-)=7a%J z$8y5V5XEi(OI2%f#(A{~fI{dv&IG_@hGfxXV4dJTg(DKo{ml9%RYTS{*Gcn4PO8|E zyi7cp2lLx3kQoN7YE2t#<_-Y7fhlv65-=6OPZCFo(dR91X<3onWUz|_U#ap~em#1J$tNvH$$*rU`4h)OgTHn=r(`>DmImK%kEwOOCn7uL54*#QW-vA- z!|w2y0JF4<_G5j%<7Q#oK)=gD$dcNVa~I78>r0yJh8A zs{Z+_2!~C=3f;j>51=pkYz37&k2Pu`!1XF-(sBeOn^A z3;gT1L~@sD%Lwb=vL(XT&l0aSxxI`EcX3q6%i5qq zeklSf+(uOReUW@qAu>c8_x^oUn7hEgo(gl9`R}4azJ8Vo?ac$<5*7X~Xn!mTFHRmj zYyC-xC2Y(!5Q%P()T)XAkkm?v0Fcz|L;y4O2Pdh)?K`&3Owx{-I*mn$R2X$1Oz^_S z+?Ll$0L4cXpMY0#D6nP+8kwABYp~aUWXR4Y^{G3CB%Td@PB(8gMW_UG#=9x)x?OA9%GDB|I zd4if4n-Fov4F;wWsm3CuaFJ4&mi;VKytCp9TP@yTPnFB7_#atl?&7H^&f7suOn1!< zYPAHKAk-1A=LuIV!+r-5#@#C7AYr%7JGdbdb&EFyU}*9?;Grum!gIo?KIAA*>pE_C9`rw zWpZUKKpE8hDX1mY1=O(*w$l2^W@Xz-7eGM%r{6SNaKC!<4qFFY-s1|>Q<*W<5Wq4q7NXz-Di|8D zfGjGVLWKaSA!o6CibB{RL_7(cH{du0jTA$5hBx#Ke6evY)A~J3%qXZy;!1Bu7qdK6 zA{bE``(=dwBqYe-w;A1{CO^#1hDCQh7SfQc^)Xr>Ch8n!(qy6y04S4zxNo0^f@h$H zh7nPt9@3Z<;=#}#_rWl0ZgS47AFyhE8}%g1$4-g4t@WgEf*odT$QA#OA= z5Ktd#fx0jnB~V)wE1(4OmtjQHzL;!E55LP#pJOk7FAp zb5LMo+-AX@gO5>Wx@vvh+(5{sut6l}u2EMeyCykGVxr|$CE9Lo?$EQ@A(D)=VMM@B zpv_IY2hEOjDe9JVb(-73j@NGzpSHi&< z^Pkv(SLx)G5rp`52dQCvec87$G$sc1caQCs-daML{sc>Q<&$ib<04f}Ly2HuSdd9{ zmt+!&G1fZ7qA0Ned@@|iL;%-l{HHqNNf!eV4m~N`IHcAb#Fq~2GR|3F= z2i^2Z1+Ahib&-g#Om^3#1|FpLQy$r+R-j!3JV@Z^aG^b1e=?MKAs?W-Oai*eh?E{^ zptH8Gn@n3kD`|oY9}^;4Hi3>cAvAbD;goQThq0xORQ3}aspP^0+$Hv%%^Q|e(ui%+77Bf4e33dw-nD6ySj{{ZNXr@^T*sMx)Bl#2!kYWx}5HLGMKLD{A{R*_g zXQuN;e0_7uYa7iYEI-z6E~(Cy!Yf(~XFdNM2fo#hq^g$~!@6de0rd~@W+EVErgv;I zntjpN%^&{*@V^(TRz2-FMv~9PzHTn~FT;O#j3y_*eDQRSrkgKmLNOG)m`eYY$=(OK z@rV9cMH%Y9K*=E(uiihz&|Ko{=A(5`>TQ%y?IQ|loulKmDAb3`-N%U)L&THdL)2CdJ>dlsL3#9(bNtYFX3>F2hjKtzbYC|&Go&V?Sjq{x>JnTb z572m|DH8QIFXk+Y(VfR1LopMw@YcO&56xi|(jIfFtF~AQT8i4bsEJp;@Sxg1zI~aIxL-b7FAImv{5EGHaelWqN(SmvxU-3ouD}+Rgv5q?HH&n zPidpQX$L`K^Gwsy;Ru<6NOWfHfRNYHE|y}UOgnA)_CO1@6YW4l8WP@|X|SD9 zW;&`9&{@t>RTrw2uUkXq6FaH;5+W+?snRw=I?4&v;nRrXE9xMjD*}NWVqAWOx4>$Z#J}D%fy_AwXDJq>! zgb+($y4Gzrpt0`!M-)D^O={w6k0*h$xjp?o6j|HSf!L|qfYi!^j#1Aj_pr9wlF}Vv z4%&%!+Aky$ABpm%Q}hga(RA1(RTZMRFQI9dvlj=ciY~$CQ4#|*@oNoTC(P^7!4DZJ zvC{bL4ce}DyNQ=ZV-oX`Xy?)20wt9P9iU5z?tWAkj)Yv?(6g~b&R*$WkD@2TjAyEo z;XCDF8&tJ%eF~VooOP8=s@6$;T7JVw^^-t{U^GMkG>X`Ok*cmznOOS}&mmlD?TF^l z!KsYo;0w--Vhmq_-Z&)H1&dWTBdTj>2Uegu3=+}T#Lxqt)0D0enrHKpJc1sJ2zwzOkyYe|BgIsNX2 z4=XteSrX_iMWI*+>6OWj511H3 z{8?LmY^LM5FrO+2P91A^*iQl;?+ps{(M)plZPM{K zpFQ9w{-6dKViFH^qo=&${ZvQPN6wWP3}B;kmCGTx}| zs}><()k%Euyoq450ON4smlaE`#Cj#WR6VXv!1`Wvc6KRW?mN3w7O_B(0p-kU@6AFS zbcr8IBu09`e26Y}MRGTYe%YlmkxE}@05LCO zKe{H{Ff)YYZx>b}l2K8WLLgbMgusKwR>y8d9%f4M;Kk$`1^Fy}-%WZX~4ohL)fu zQ$JxT#Kt45J4znTUJy-@am1bwOh3lj=(s*KB**aa<<+=YgkMYf$(QJ^VtO-tY0Scf z>q^5B-7yLf2na%oomWCg)TbT#$O}9;7*n8&chsi=epsX5C-4N9qBhVi9MnAG+tZ^f zQaA$HPKYVp8Cp=fvxT$zQM9kEi@coI=@_lQW23Z)LIwOC8l4DrR3_Od6Wkl!57nVh z`qQ$5r&kPHPmQ;mZULR!e&P@@4D}?2sT+xY#dO>&)*D~aoiWaMUj0s1KM=ttK>nY6F=4w^H(N22%HEr3o6ejl~sK+(tDjo8a0@kJfu6@79_laxyrmw^X+})Q%xo>L~L7W zfHcd{dpuN661iO<C@+yQ9-XGPFTewheF zIORgbV-`)GrtRg1n2*mS8Y-~p;E#+Q2`EJiU35#h$RP|VUfJ4Bk*E%sPAgs@VYnmt z4rr*OxzDv-QOr=4$$PAo&f2z^))j@cEg)9QUDfGRb=nDzQAa2#RrLwFm+uvPdS!C} zM&g|Vnn+-h6%A=Kv{aOy-j#(V9`s}Z5r*oC0QBmOX*C4@IQk@3Ru44lj;W=lw!NFD z`VpvAqthH$)M})U=&L@aIiV=Z2A+P*5Ua;a|lz&1I;bAb|r!fmo&N)QAxV* zlJY?X#V3s&-F_gNkxrkEzm4ulr%l1rE5Yy+5_p{s^hzKq#XIV+xz+#iy#ZdQ`yD(W zLnKXF^~;)H&itl%dgit!?abA}zq1vHvzz9r=J1(20A(QPmgcg zxY;#27g|$W(+v@BG&&T9PkDLG6R*?y-k@a~53CLPcJ#&6GF(lfTW3>MfI$u)-oQgQ z^kx7?UqO&WH;s#Ol3Onuc?o>Fj4LlvPoxzC$4+ zY^c(j$I|`%B#GG-kdZs`k!X^l+odG_Q9=2%Fh)Dwj_N9%5k~y(5Y=Iu-s2*FRKS)I*{?WJC2w zl~G^m^j=grm|lI@reTP5RvH@UTLBiMIi( zSf}?!Sd1nx)Yy~CmlmHc5Z1k-O`??jdZgEOMyxzEkRx|?bt;Z zgYCt%v}0*EzP_9hQbpny(nMk}FLLS1L7qR8GA8Ygh~JO9sB()$k$B9+BQ237zL=^> zOiK`6lcKIlFzH790gfh-mq^p49Z$b?@z)8Z6{RRggB{CPhr*%i85ejk>Ixqnw4fMa z%<@sPEvIBivp)%GGVM4NI-dAX3M3z041_YY*M}RJ0J-3cf}HTAXl#jmlop7*x>Bn&TeVPG^r?x z)k-%7U7U6&?bu~K+DCOjeI^u?s-PB>@Tg%;Dg#AKS_bhe{R>KBpTb(FFAtL7OI1~& zI09~win=Q;1OIhE^NDoB#dN9md&B`YfkndbDL006KL}H;?3y8Uis#wBE0aRfUPp6xQL-n5n zmGTeGQz#tNr=_Y>Igr%|X$Zbo3|Em~tTg)zz?^;;YRQd9uJ52K$WajMGj%XpV!6fL z(9>Lte}FE)dW&hSTuh~oR4qe>XywPObE(Z$Ox-Lmhxt<92l!;zFLp5%-=yGVePEwT z70*Ut#tKm#(G@aHs;)lZ7BH^ri1Nf3Jx&n&45FW7>H3Rl6AJ0c;Uy>{G3`paH|SI7 zT^%{}B8t3p3~*gpv=~9X0HOb$rixP>scH~a&D9N2e2jEa3psFDnva#gSp|KF%Ii?2 zGxQ$|Z894e!Q$w~fiZ@t-wdC9(2;2wsZGuja;{P$fu#_-)rkluQrL|rAyxmJUee5S zSjC2*el5}xeN*frl&M)E&pG5~=%Ww`jU9H;UWf87>!s5UvC){tut|ehI&C{aCb{(> zR@!45I4PtBaM5n*U@v&~pg~d%Xwlb0W+5@6%BW#Q4lL=*P-V6;eY;d0KU-ygdOoS>LGNDiO+HTEseP11Rb&gkJGQB z{7lVOYX}W@^s~&>FELS>?J-hFBKASoE_L(9mv*UJH#{`k+V#k={_W3QVp z9=g?_9(6itoBzNt3{f_g?0SNVNqtjkcOad?no4##MiVS6dXgJk&(O9Nt!Jn_{A8Ds zuvHwSV5tg9If+)~){6?k!W&C*CqyM3Ez`C-At!2nHZ~|Q!|FDGMaAwST@BJMLs|qn zmXO)d(_u9tLm^`-XV^7bFFVnCwXgDty`l@+$ePNxk!zKfYhzS0;e^|NpdzVZw7By@ zkxbCsPtDR-!^n==LxFnYn!2Yz2^t1%hD28$QSnatc3l~&DeX9*Mr=k}gw*`*gFV7@ z2}l^j(+4M?)`WcO13|B~^&VvA=Xj`%)6k8Pzex9h=i3N9<5Z=?yZ4=Qy4gkhn5BM_bkIWDjmsHn3Eza4PrVAJa^*t#MF_Z@5qaHDZjUNF zJ%~Yg@8E$a4Ep(clgPEi+pJ>_e@K8g-~@tkJeiNuG#FX9_A z8og44v;=i}+Ldv=l+SD+(N%qf<%nt+!H@m?jQAe_sYm6u7x0N?<~`Kr7=$lD;$yRz zyd-8YXH+wX-RSpP*kdfiG9f(^|1iP@b$Z+55$l|eTDkS zi$P{DtV!k8ZWoQkC~PEyP9oI2kZW0W?;#OUaNDv`Rw<`8crj*;V}cr<~7s zEdQLvKNI-p6aJaPKhN^dWd7;G=hKaUUgzPi{I?tbY{)+|`0z#iQ^!BE_-7{nyud$G z`KK?R-jRR$@Xx(`xHtdZi+=|2&-VP&j(^tVpECY=l23n>e|qxpc>dd&|DMl(cjKSi z_-8#nd>H@Tm;c_ye^26{5+44X|BmCI19`YR|BU3}580FH<6U%X!u}u|h=5W)5?%Gn z+1ba0T@p}Tb^tal=!f3f%Rl&sR2J5LY7GeCNXwab0;BY=74+{wm8Wk+0AIaRxxNaatvbuwFZwFH7av%N|bai^y|x-28fI~vRA1q;xB3UYmK4#Q%5vyf!cT@$aY=%6NOc?JZY0e+(`^tnzJFY}oKH8GeIga+((u zjGG6^MsoaIPW*fj$2finpVO5jtks?T2>o|AvjH&W{`Fa&I!u)*YE89OG>Fx2}KVKJ74*6ri@8$DX$mgVFCOMscBB6W69uNB-yWCF_ ziT`A6z8PlaBHX|K_`krw$l-&A4*tx;t8T3!BS%UGv<)B7C3xuYFnMrj%aK80VZ1gz zZ&cJ8JZ`w8*5HsJ{25Gd!>upSzMC1}eC6i;b3&GWb>m9^Rfe27k3KSB%hhc&T77i! z#ICPCnD;|q#eT95ejQ|fUAlDYQbZCu2nhl^G;inEr4tYACu)O42H}irADTa?6A{(QShoCA& zB!PLwKpxgY+cYmCiJ&G*0$GF2ix?al93&5xRjU$Kt%#&$uQrmFt(qfVUL|qy&>^|| zr;2BtaT12u;89~j$IJXeL&taN1p_Z||g#Q}7@~ zNJwy~q)J$oFzOL5U3k#Q;X}BT&`%5*8O-2vPMaMp3t^qaU?E|_!6OEIQm>{gVp#C# z!AuJQ-2=LAOn7kU@F84ZcJ=dXH=wIuH;JT5jW7x7+>7v%^T$&Aa>lXteeG~~&srze z{N`x0uWucXn2hWtk-Cs*)rH530nHXo`pQREai?2CkcV>9+}YQXQfkK5T-?e3amSKp zY(B5@wYOqY@(sA>!<8njB9@RQT9 zq+|E|fBm9%`@M}_cg?Yz`eNDDBBu*CI+7OEyL8x=Ov5Kb*Tntud0NBIesU7p`s(rBj3`;gEx$Rp$Id>N-R7sM_p>X>n(5~)z7%z?+T&fHmhZGO;Mtm+ ziyXFpymJ1!(q-f7J?ih~;ZysB_ogRPRNH1uE3$3k~^GDt}gXi@Zt;4q2r&O4IlIKrCFhM z?7!+$wOE7WC2C%9Zg!@(B;@q$-$z$+7~Fe%vpt`7IQw&A#cw;wRh=lAw+KXc{ua&uRe=r!SH@kf=X94hWq=R%{4x+M$abiL1iwrK6mYo9s3tY0(k zOZ#c{vX#wFG%gVJ(eh#mX=`dn`fc0tw0XIqYg~P|-<@@H;<;Z&eA}~Lta{XMXZN2w zv$DmJqvOlftJI)>--sm#3e^r@aCgPyz!S=G%MTWBcKxJso@|`YU`?ANk7o85Fyw3b zxhB!QvcLPa=SK^=wHQ&-<#{WO^6b$ygR}*AJnt7UspQSrFA_U{wBuZ@HNJC{0nV-0 zZQPof6yv?@m)i4c9E(rC+v~8ci+|c^*^D}8eojlfh)WgZSbvZjZ6{hnbnce@Qy{;XXZ zIi__Rm%62=)oa^M?Nzs3RnIzu(@q;YwcEYWc59bM-}|&Wyrln>*==3!ex0!L(z%jO z&BvB_F|B>#hd=F1PJEpCc|@$d)rm_BAKXrz^P_$3qBFnnd$IB3!6myrEcW4zKbF?) z`0JvZi+=7uu+@dGgC7(gQFGvgWzoL`ma<(NKiT_e>LJDA*^|c)cRFg9yr6PGPyI(f zR&8)BQPsI~{D>uXG2b^m{4m02MS9UyqYCxzaq4FMj;r*m?}rwx+TC$-qn2)a9e3)z zCVw$K=wZdV*-o3L^*Gh+bfCO{=lL-sIs~0)Z$YbRjbn(zx{Mj~XH|SQEt`9CKXt`< z=l5%(?(WDf4IA#J;e+shXW+*E&B)b`@tH-vsrDmG%Q_XN+E zpX%?r4%}P*t5)G#J{@+_Zu6opfyaj3D}OaT;CkB4tj})@`t@qzN_F*T20to)K5_Yj z)$2Z*6WsOe=NBiccHi4|Dy)9i@7?SN$KKl2XmG~YdK;Sxi@OaDavv+xpDeb)f2wn_ zkgBoDQPn=EARBh6b*S^)&OZ%5TyAagr)h0gJg(4f@%=MPPR|-^UvJu%$zIv}>OR`L zw%Cy}{a5ZiG)h)<yOAvwO_6LczD9B;XgJm^r>XP7~wxixZb z-(LpRAAis=21Vbzmcw$zZ8x$aaaYyQ^dStY$%T{`+GaosO{Pe*^_+Is8H6*_gRnsg+x zWS?q^GslO1eMDC;E8|(O-)0W{wxs9t1>;M9dGy)3`rodNnNw-mof?j7cW-H2;_QO8 zFUzEyuj*fM*tmgxLb^sDXfSMXOuu@5&-;c>C|)w->d~)Um;Nzw;Lw?huo@i|U7FPH zQM<(YeWk(<6g=kB?fXBXzI86WaY@^PqomLKoNKqieRKA}kP5yH&VKVzvH2wo?T-J{ z{>5kY98}|{iSY57A4LBie~y4{dUfUL{|!wwN=|T?|6M@fj>A)G1z!BDac0Xjrz4^I zlhuo@QP12t`Q!(~if+BSyyJ#FRrRx~+AQj8S8j95aldI?%6=DNKTPkwa(C3wJ58NZ zLigXTu(I~b^-W9O`^e>!bv0T<-5tCB;q^g_r&T=sZ1=vD(!a&`wwtd%wNAa%;8CM} z>5%&e8bLlV-Fs%7(Hn+r^PczcP_dzFZ7*$| zyD22-$2v2Mo@-NLqwC(CAJ!~cSFO&dx32GQqhJO0+V!q~a%Up6efGk&Cd_}cOVJCAI+wn6m|J=}|4EvLKs z(th&n9art#D*1(#-SP5T@vik7G&QUn`-|6}l_x5BEL1g|JfKFo$6X|+3ih}bbE-_q zz}{CnN!KL0mkpbK^5>(O&AuD^?3Db{oeC)fTGcJu`RUGY%BMfP*35b4GJE&xZijxq zP%Y$c!D{F4TnHOIH0j3fhV?=sLo1GQ9k;9UiqJEi9%Me<_rb~~_eR#;S9s%=^BuZ& zw4GGOtyu3q!wg&PHLxZdMn`36TGH_mEz=6XljhCX9%{l2Ju;-iAKmMp(9 zvX1(~m?{^4Njb3m>Rny^%T?>${&MODTj!tcB9}gHH@)}>JLSV4JvP)>XuG#Z*13K2 zKf67;==H2QRfmm8`Q~wYodMG}&-v{B?Jj{YrfGwl-5Gt#r&u5V?5iGKwcG0kHt$-` zqhdV@oe<^8K87n@eBsyS2`P ztw}3ujqUsL@R(7nB0hd&`hR_Ni&CUatUGn->W01Rti0N@a^+gP9m7LCvlh>BZ8dG0 z?H}>`+b1hde7ft%%soB(mxwJ~XxHlN)9+kMNmv?FJ7oIVgfT;w-}d@psokcb0V93C zS`|3X?s@-^#b0dGefeQQwe)=KsPo;QxQ*=f!_9yKHqUk@88U3_KmT=J<#Ab^J0=t; zpK|)6GbvM^t7XHtU;27?=eWHwD}CpUYA|oX_wzqlzjl>vXUB=g zylX?XI|G6n7Sej`{-{Q&rs}B3(3OoxrPYbD?=)u9qu;-CZ+g7wga_TaXEgbChqCH} zOl8{#&URlMzAQVfb{OitVbIDWdrOw>+O%j$QhkGEXc^Scj^b#zTt9Cw<0YKo0Z*5wf|Zj*7vSC4X4T}-< z)#v||+_A#k6K5BQi0%LIoEN=)B$TJ|q0rPnn;v zb!Ym-klwPL4p$#2S53VptGL3j(_Q-D<5H`SrEJhNT0A9uz&9N}vZ)j;Uu#&hYMI{+ zCzuz#sH{jhWMAM=d)rRk+VynU*6Lu*dr!NJ{L#64T=#jSuC{I7%HVM5!M5mP{VU$u z*r8g7OA%jwb@j-IkP7J@qt^`xaxOjbmkI(>;Idr0}fQ|G5N^N9O( zd!IuCddoK5cAcBOs@ksEKTRujqs`sxy{-(H({*><8a>?B$DSG8y6j-zGFxY_F{g$9 z$M?fZ|LPwY8!gxg1xGxskF4*n!~@w%68L)DA#)cF3+ z=BToju8mTRuDJK^2YrJ!I(kZWtgL+d<=9fccDeGK$EkX{_3iJS8``7ine>F1He>w4 zzU=7fIrjHsbG)kDPr6xmYR4VF*SIW`+!((lt51ps9 zJ753YjBaykZ2xvlK+5Bv@0B?gUulZ{2fyDRb!T3+o&#=_DpqaSfiA)Fu(iELjdzLn zx_B{Ct8lwg`pSYTA6DNmeE3oKJN^D2``oD&G4WjPRRQ@wX0}D@RS+5jAM1=fi>R zjy%pP?YLbrGvdoGgU4nSJsj4u`JL-opJyITtdo3U-Qx0IyH-!RSjJ9j8&`JYR{tf{ ztM_lC%9#Jb&r>#RN${N#Tdx1IVr8G&E~(YEfQSFWNj2A=kH2^OW0yTPCra*)Uwfy! zq`{=&L4!0l-6ED3>Q}Yir|a6R*?7Ny!OlBfGcNtwx9IXkNu^%=kh*TMWW(y&Z9iNV zQbX5c$d(-mUvBKsaK(pxukRa_)M~`BKE2z9_Ik19#c)w)=_z>Lygr(}K&x&FO= z_Pu`Ad`P_3`+NQDd;RQt{p_FGV0f>eeXpN=ub(9q?R)*~zg|DvWzuh+>yCR4_+;UO zANAeJwCld=N$9?#j@|nNw~Q+JO{vDd^=>;)bBr}?n3gzt;$6oo-)l4L9R2Y5`q+VO zKl{A$_UiPX-U&uwDHX0r&erd-rCpC-^`CEFb4In>v%vmx2i#YB1{N&n*J^U0ZRgWH z%2w<2&GMz0LxKV}G^ugzlVKt8tAEgyy>@=d+D&b>C%*md*$|DN;c~kAhr$)k|LnYd z)whw?R@NH*uxI!-S#VgYTW!rClCJMzS65kxfx~dO2c-RT;OQiyR3ZB+CmQ|75O%H z&bpSXMk#6xXg)8iWRPV2(rxATJMZ88^!f1GmsiYhb*ay?OEuR#n&s+PvBkU@Cp^}# zIz3oXJ1k@QM&I$LqvX{eEs|`!G@`dh;-YE$evdl2;r@xaw%^6yil&gKM z{LM83Gq+9I`?5}pzy)KXb}TOKKc(@wxt-H%jobX9*8VAjMl_8L-u6s#a%bm_0b$jX zSAF@-+KWpAR@`hj!p3j>h~^uE9;>_0@6vxq?cP6uxj{?gN$`}22o zUzGYbT3Y&-)xY6LarEB?~(9YcC3YJGj{QjI<5 zBAYbr*@Zcx;iGgHg8?_Za$ zFUc|n*LH*BwZ)7+xqgSIFs2=drfj+<-l`AkJCTy>Ns>)1lIXzyUm<%j~kR$ z;BD1DrT_KlxXCvf^`5xAPZC{jcUkSU@$`D0=3Jer8y*<0xu@q|_hfa_uf=_AY1_Jj zHh$e2kv;a!-Cw6k_B|e%DGXfyc3^H%!2PU)b03;orrzp(AuE`%aBa0ob$WkT^w}We z9`mtl)z0Ysj_kdA?zI`;k#yQz9kQ>HKjII;q}WAC51gv6KKBT=>oB~%I;UuE@bHm$ z=RcM_(_44$+&taLF)R1}w#acNZP!p*Y2OZZ)@iek)tuw|ns-gHEY&#Cpcf%EKG)Q> zmp^D--!G#U8XFsp`eW3_7kc+I)34SJu5-Ngr9tcWZPP|Qn>uZ3=bo%y7K25YO&OCd6sQbXKXU#8vaw;4%I@6v0+w4OR&Zi9Oc>d(ASlDhN+;eJ1 zy-U(+yKL*+w2GYQ`Df>^^_%-T_MF$~7NdTTRxK-ZtNM9cRNB6~IoYkR`lR+fL~Dna zcMTm`Y~?l2>C%IRx3^oFES&wZY`19X?{BRJd>rPq@wb%z8eK&U?+yFA7GB;gy?!;v zVh#J@o|}&!Z0#Ltb$zd>?^lPkpB$E5n!D_YeJHJBQOKKlrL|2zpUg~LyzcqtA2x(e zH23)Z&ivAInR+kUw$vZi8olsyRcHO2g$=!I=12GrdA%TcS<}9BpCw~mVqE6#pKZpS zHtB&kFUfX2J*>!b`|XJF4{h~l>>Abo$g~0d=N4BREj3@WbLcUzE3T*{*l95jNUeUoIQ81?dadqiVbz=Om*k3>0^In(D&_M zu1z*K3m-r8${$0sj!4H`n{@BYpt)i})_{WT!~3nid(AK?Dm`)O$fVVw0~S9%Kf+&Y z*@WJkCT-E%bJ>ygsrHye{BYvnUqUlQd*)58KdJRn<}>+JR_-S0GzWppFy9MDzn^DT zyz9h@Fs=RjuD#fo9vJl3xaTv|`_5X^y7oxu=gpGAwZ{kLlw5ipMf-EIN#N^|5liSp zXKAH{e|O<$$MZ8=&6Ajq9Zsz>>+|OW&uZ7%XZ{>&Klg{;wjLAe--+o)@8YXJM;z)J zl)2~m**B;6UFsTHGI9QMPT^nc%p8B3d-RXrF5hupBiVlCH^0WZ5#=781J|Uj;~rdY z=0eVu=FL(A8!ipD?Ztm<=Xn2q39 zmx}(mlQV6G-}`ym9RoWX-yG|QDU)BW&pVi@^Gn6zYrHd~mrC4j6U&XC?bzIO`Q?3w zp^U`mm8W}M{57jBm91r0dG$u^e%a)xvEOYg*>{arw$Sx3y-Yjqp82O|^$!d^ml*Am z1+MoK-QP4XYev<&b&VQdEem9sE5&OE`W_h`GOHoVvv?V7{Ikrvc+H4Y_oo@e+pSsq zs_tn0_25d$an6K7u1Qy4dy8GOpE#G=aI2y^-LE#a!w%8IYi@(aIXceo2Ycy`yL~Kp z!gm@4p)=~WQ?I5ie&yu5OE;^R$F~0G=A@@jzvx)$zC-AFZ?opW73)^dTbon%IOgq( zE~D*X!vg+lp1fZCK0z?dUhKE(ir(po2{#H3TbMYy#8otSXW-};yd>I z$Lq64hDJEwmHfOpsFtcrStN-iD}928mA-&JK|3YbN@_uoG?72)A)}~ zXR{B~d};6Z%ha*0;Yr(!zAw)IYy6VS1J^plh99Io@LgBuDQ?jXj53Zc}KHV{q758P{;rNojnyWIXP=iig;zZU+IRw zew{XD-uaoA*0@Rb-wHAOdXN#ce(lZ~W7)g!6eP!Rd%b_tw%PKj=&RR8W|65I2>t39 z!}EXkW0v-j<|>`jHv{XMSK7E*Bn3QfdA2Bie{;C$)9}#E4-bWJoP2&tqprb_#tpsq z$c6>p&U;&T6@(0VG$pq-cUtiJCrzI>^f&uBqS+JaLJhd*9DeKhMx&HN^$GB`=?ec4F-0-z?X^&sc9Nx?6)72>253`RG0SK%7=-^S)q)+tBxC1}-y@ zodVU|tJ4zwY-xvdt2SL4{(MCd@5uYn4g2qimVe^r-*TLP>)rM%^e*?K(@GYsvK^9C zz5m^{^^U`)EIDBF!gojf<)SSU89J>;J8D;Xhc{_h&yn?WGF&t_x#2;D`M$koe|47s z^fhqBFkU)zLUHDs)bGQ^_%e3oLP^A6@Bk*{XFDp(5px1t<0gG z!<~yMeAh>X+qc&|PMuTlV>wn<{pRYC7?$RHO{0)mL6K|sR+`1=%leKQ_-jCvQ%>oq zT`ud~WXB7(6Hx@1C{7%4$=4MYz?c z#Txy$Uov${+HKR-8hMMUFX0Rie|_O(|SXr~i6eh;3xiHr>y>a9H^zb7COE0>7 zx4^R`_LnCfx!%KrcW+p_y1{mf#oSZOs<@Za$K78Ua$(Yvpw@sLUUv(YF^@^yS^b!^ zb{B9BX5}xwyzGJSMQWqdr-aJEi=IEY`|k4I`&SKKd2T=3H?eiY=e(0^toonN>nf`p zq}TK;YgexdgVop07$t_pjyY%c`VZ!FgQ*r<;|4gpo$M`%PYR9U>5qz7(jN5IG4t@C zv!h>h=roS5I$w3?Y4oUTQ<4I7XN)xZ**eH?FV}E=c)vY)QL8^*J9ablMc=Ka8y16$ zYuBGT-*xpQzwrF>Po0;If)Db{rjEY$eaq#fy@mD7+edXizn)_O3^%7G?bebm@i;$r zO7Xh-miIdgEcpkd&PDe0nOpl@WH0p*-FBEmkN52JHo&#UVMD>>ISVf(JkHtac;~IT z0kitZmb5cjS4T{reBxN_)1PVwC4RYES~z9f8$AEgKgehM;EDU3=B=1;{p5^i8l5XP z1zBX~`nQHJz4+MR&7fw>j*UKj`)ryuCcHMQZ$JO%4hK4)FX;g{}j1n}$CoU$owX~XmtOILrmp~X4*V$G|?oqZck?ryuX^iEmd zm(OR8`RTo0`JClV;Y|B@{$IB{;RXGa!TWZ3^nOb7x4xaiT_E;c@>AlZ{a)91`o`b5 z@Zj~v(haT20nZ^XGGL0haqvx(@cUxZ29ug~FV=9)rb~Ap(Ab z$F)Si^L`$cGcBg0Ic2?B!?rcEgKjyb?9MoA+r%_HowrO*U~&V$t1m!v{rO_%3F{8ly4yUcKu#xHWcNZ1^(A%>R{U z&HvW<7q|cHNapt*8t_|<&l^beb;p@y|?ApQ-^AbQ;D26Iah|rb_|jEX-_?Q%VTKY2fn&d z{s)Wx+)^0*(B<>=#9fblHh3iGzJ2VjyQ?;)ZZPvL>#v_aitm8FLA#m~CYcQm4-so? z&21di?*K=?dRvza{;=l5`CEkx#j*YM=|l1vLax`A{Jax=B?Vs3Je$wF{_X+-CN^>o z{dQyQHvPMz3gVZGr$S8j^LEwD-Fj%`p_<*}w;pnyv1R{{Lv5<>-dK8d&$LTj0{=08 zWv7qH-x-zm(9nZ1pUH@}F67lhIvLD>P_nouLw}08l%sI1LrlbY;)z==8 zEO_hTe`M(_n^jXD{Ke{XMx*`CS5N!%xjJ#HBg?gZ`1PeW-rs< z?pfx|Ki9giqP4Be@c4|fU#s|+mzHgB+IpQGACvglEnz=+^XSXU($;lG^Sge!pXR?} z{k%zkoDW^&m~mymYNwAWk|Rm(#}f?W9LITt+w~u`{pVG`#@00MDgL9SG-S>nGmn39 zXpg+MbVXXt`GofR#-wmB|9e;Kf0@M#xN|{d``sm-mXChZcK5xJ`C-|E&fEOjJzHO2 z`EAah0Y>k(c4!`a(0}6np~Uh-l^<8X>T_@TUEb~Jt?`!kN`6K^>+zre>&^%NM;TZ( z|MD&M%75d~`t1(f^Z$B3{y*k}QU2#^-JO#1J=GP{ET5q$vQfyxc4Bli|Utr(JgZfi}CYM+9Gw8M7nLWoV7~(=&sWxs)=b~{!@LEPiV9A|2K+vW@oQ6Mh6Q7d)N13^UgEy9PnL}= zh?+2Avd3Dd&dbf>(?9S0dDy2Z?ly7yXMWK#ZtC@@?7xx4{xQh^j{L9WOk1M+f^)LJ#3m&tLzD9;n7zGGq-S5>u%Men|tF9Xrc9YluF6A~+66 zveDz?Dbo_Ogz-+XLJ6`>0xWYCr3!@U@d9hr%2+|1I4RL7PMDSsvLtFB;>6$hkS2-c zXG|qylYfoZ%u2^=6kDspsIQ^Iq{d0&1?WL_Csm+stEf=1al$OM5Xz6#x6$@LVr8ZT z5Z;6^A~7yWn2sJd$LA(r9gPwKJzf1Hf&T#Vr2C5fn^}59cXD@*{nym~cq`1oXr?`42}MG1gBlq&LAs$L%MS#C2O4icZ;gTC8fF z;)!katatb8+WirF#e?(cj{4T~)rx1+eGw;$46K9%rviF59Y0HsZAkb%GR9>GB*!Ko zhg~{pl9S-4$FeoJ@NV%&#_;2QW$jgMAtw+;?sxguYO*Q+lLX#E?sd`8P{w8+r+f*-hG2m1RQ zEkh@Affy}#UC(8}BraHnmXByTjKX~D+_88gdJ=DJh@vJ?Wgt?zflV9HjwpSwOM>91 ziQ?jr1`+Ed$Amx8aDX6G&ro?6yE0YzlR6YKQ>RgP8&+weTPg#&IgpV;2&Tm*qauQgLw*ZWz6`tu z)p3813*CI^I0zv=J)F6}l}7qwQC3D}AQ=dYG4x4~2AMw8I%)-3WvZ{hH zVe&NKm?l9liRgX-j#E+Tg&ZG_$)W@ia76zLv!&@j?_xMbdZk4m+2rbLy|5^0dato$fMU;!eo({)VjxmG+{bYf&f(3#b?Bk1*8}s zbB{BMOidHUi4sy1v6PgGoxI}ch?9ib@rn3w(3>DEFY39i;%Sc{&hv`PgoC5pXzM`4iPBIqD54pO zGN7KLDiXqr$LA9fllcDLBfTPc;{#E9Eg)$8*eKq3e{Ztx1mS+DRssIL_?4^=Rkb6^ zM&C#~p7Ib0v`s{|SV)M|gvz=Cmw#mY&w)S%AgXSOl-Sga*yQAFbgZe<5)(3zP8Qwy zIAdiAr%9+>l!jUdz%f-6mzFI~$7$u55<3H_XB<-!Q>j03X(*>jVrL0)y5jo;=QdL3 zgN{*8@t*MV4GWF%4~-!Byok~0q=Q2J{3oJQMJ+BOXd00qL|GTr2&mAAC47T;4!8x9 zip92MQ-r!0I2HfvI8oewIO3jp%U52fSfk2Gt-L_xQ{uElA!@Ope?7P9mY3BpGP?hI zhE>E*)>%RcYVi$6`9i2{cB6A3NSV+#_A^P8LBx@b4?;p75P4BZCsHP=PKDT0gfbq>MOSgbEe(D+2$;@u4D25gjg~Y!!*{jcESyJeAdnyyC!D@}JT~88(rs zL-0lK8MbF7Bv!O{zY#APHeQ6THom>mW0Qm^`>Ji=8!?_xsIO2r$~qnp{P95(coF`D zPh?PtAJDh+9YVPJg$HJ26E19LHxP+M#JK54M2p0@jFmV!IT1gieTR`Bss03hRkqPo zs|f!rRJf;-Eh`Wh66V7TA;S0(L1CfcBLP)$s0IGUTfamJiU5nG(JhiL%t}Y;L*P0_ zEvy%A8hER%KyPu20oR-;I0~;GnjpMT-j$c8%B|#9DtQ%cC(oogs8r5Dh0G8Xhp5{Q zzO_$99C){=Yot0+@)+b5k31Hy^qlw{aZa4_0MPmfbU&l^Aigch(oN(*Afsw*Mshl- z+O|!%#bwif{SO5su=dc7Y@rMxdxC@wDtkq!Uxixx_}5YX>sScFHr|%-Q`NVMcob3m z_u>%S;+CAedhQ;@f9n|HYzf?JsBn zrG-23=x|WOC>iaH{Phh&*+x*r`1ikxJRTxKZKHVd1OeIESKcW&52KPvZPRb%KmQQ* zJdc}TstvvsJ_v`9-z0>*v8LGKTj71k<{Y&JK{o0Xq0v3{je9TzHT%fWgq@ zepIo0ksrme>C;siQL!)T9LNCV)kJwk-p;1B_d*}z(H*3|v47TRvL%iR3e^2XJ$89U zAi6ci(KQe!rxH}lTp0l$H`lS^QI&mA+K_E|tP!UoaX{NQ=jrhZu`$a}lb&9MziFJ+@JN3_}fYYV>S0N(OxUqb|274fVIl zwQTu)FK>;JIhj1}kzQoWNtxh^^j5SzaF&+<)HYO|3eF>OiHaSgzh3xbw^SgoToMnu z;IXykZh7bgDEH)+#X}2ZBd^?ZQF0X^+o+dbdmi+ zd3XLQ5L)a-H3oJG=SQz43xuZXmF6a$xX|>P9866y2Z&?pux>3 z^kXB!aB^T4$A`x|QT+V0#98R3MKks29sWI%Z21?VqEue8czWzqVLC50J~Sg`sxS@k zg=whd7>f$K0Q7TOxIS0(K=4*%C0Y{(P9U5p8eu|%ASaM6#y@y|+EenbTh zwMK}>EaMfcyIn&tJ|mS(I+P^ILZKLtH&kpgwJTm4%3bKJg5rg-$tVqRU5Glr%9El( z;U2dh#B=<^!sJK~R`NN32+bYf0*asWb;cqV9D&eE8i@ zh}6UJ=-$spXAqwl8-Toc{MdNhhM;avd_Rg~Q?tq2Mg7(xgOgFqD+O|gxQzowizMkJ zK%+P$GMFFLuNW_!f$me3xa1#s+X#@2hzQ)*8jsotVX4X4gT(QAVbCLr(VqyeFJ9(M$?iQsDB4JR`Ck5m9f^I_mDD z5{q2vgHkv{Ode=dY+`x@nkoXQKmp@`A0POQ186i4)kMN^0NoE6$r%!qC&i*vRJww2 zRBFYhqY)=EFQz4mQC|VK3-G^hmAlk8-+uj{_EY1AfZWxrHu_3RoTJsgQw^7Q^EiWV zhmoK&qK0?WzxNeopt%q{HbAw36x9oX2BC0U1iPilaeB4=$}jA=V9o@6|Yf0Ud8yUGKb42 zp}rLcXA?Bw|FrB47{PX^Bo>ET7p{yyHPK8B- zqM>NS{71qTM?>Ypk?4%m$S}5eG*3R9gL@G;jEg>+iAzPZiV-Nw{L`^3BEs_^?5ytL zdfXDINlwlH;yH=Y!YtHpj7vll!ixEc?%QJjHujQ~1khpXYuSj!z z;Ho6}hcLKiC+|oqp~!PnrVoxmK9)g{8DkX6M0jS8uq88uEqX)d3H*l47WfUy8RQq# zACy1vCzM6V?@%tme{n`Z!y(<$Qkh54SQQ>ELZ=;$5+xa>y)SB4DE@KfZ)CdicmLJ> zZ8{naBgMz2#lfzDX#8-( z68u7BxHVW3W<>fQ#QZ{QGXT7Z>Af}hne05?Kq4Ou1Hg_b9_vkPlZ_+{h{G{#^9V1# z`2w~%mtg7wN3e&@3L+ASR~Oly6UOk-Zav2nfkeZ{U)bT1L^%5vaAKInYJgOb2vQh> zLKhG^sc5=INSLDGN)ZSl=m~_5zz+DK^CM^i5Ke$Nu7wbUfsA6po=5mjCCrk!ff{_@ zC?7g1H)yilNIG#9Zq~?$ zy{j~wTh?-9ipSGXt@Pj7Jgh?x+5qUJc z0F%5*B5%~am^{B|`~d(aU*JO|C()nAZQ0zv!ibap093{SE>kl$4zTl@@!Qw*`EkIk z47gNJblSdjTG-2Cr-S{RHjH-KoHe!j+0DiYoEU@gH=8cpq*bsi>uQai~U$v8}ZF~XO+-CS47#C$@4*}bJm<2$O zy_=!6z(g=Q$-M)w6gJW;=?ki#(ihZgJf%x)KR455=Cr4D&{-exwq9diz26swLXVx28yRX8|2JLK@fWUoVgxlp)^IJec$7eQ^Hc&#ZOVG%P7TaIV zi6*){AA&bk-U-sX(I~bs@aSPvhr?Bwl;-e|&60LpX3=vV!sr)=9)gfC`ltjj7(GU% zIWU2@8)mQD?pu=pVwg1v&Tp2@v138tl>qq6N9ZLFy~Hrl70nKAVdnt{ydG^OzHrbL z%#VZJFDSa6w8;sy0v7arBVrY7s%N2XYgultQWo@J0S*gojMnk<$S+W&P{iWq0Ty0Q z%h917i7Q}%HQ$OgdOvML9t^M*F$?N%=b>0H<%QLY3}9G2u+BqUqjmf|@(Ubm>O&MO zxt@x3M-_^-tH-gTe3&B$X?B==R^UA@M<4`}8o_eUZMgIa5qxzjGyW7kF+||Cz_a)) z3w~v_MR_?r%yFte>+}qG1$tLsozekjd&E;%uU1yh_l#4%Hu z?BKCd+__ox^D9);qhgS&(O1yW#GYD`=B+cu0Cka^Wu9R)O^8N1L^`Msg<4*v^?)D9 zziB9rl{kCu7KhV`@KK=xb|f&~NF%~SZu-c=^%CQpWnRWQ5b)?<<~2A*FR%baBP&kk z(`?@`b8{`T(pJV1#|o=r9`bb((!|bQo19&H1*VBIyz-h?RKN#5ua! zAJ7IvfdS5Ta4D-pw}|y|DXUGFb!#c>UdTa~$xBwBL(KHiTCBSd2^MeEa!b-zgpL#sbkgGD#R;Q`JrAdWSW)n35U3Tp=7T1|-E zFpiAF*WntE*~-@`c-vsmfwt2hFtiHnIT_PI&?@%ZPJK%Q`N`waX@=ld=M9N?EiXB&IlvyC0;DGNu@byF6CsstdGj$O#>Dv{D?V;2H% z1MvMD+WI%ZBvwT5*B4(izv^^sYJb)q^=0=L^T%y*oW>f!I_jOL&%Wxw+b{90 z9WdOmO^}c_0n)h|np}`2lewYVGDhEiCt=VilQlL1*k({Jroqn(^7ay7DVNQ+9cWyO zavf@D&^;!EZKmY{tI0wIe)z@d!S${6n1E95)!!C!;TPjfF*BBPmLJJo0 zIi}?1d;nTnf@qd?wUDjV(!!-{+5sRCa0N@d23~4b$gfHj7w`vsPI$Heeoa60h@Y|gdI#BhFKjfP{j8+1L+Gj?U`a5+Zo z>P6OXa@xXLSmk_l6s)BsFb1$+2wGQ{L!-fVtzwr&<=kqp0N8?$-0H9}PBZ^5+d#%O zmVu?sPhsN{vGnOvsT5_``bRX-7l1~n#pNyIwBO{`J3Z-a2S%)ItlK(zw4%q1H_nYT zT1i0Vlb9LH#EPx!}Fnq`8p?QCZ%pZ@_+I z!d^PA5!F243Y$I-{$;{8c4EO#Tt2({6IWwU%ZKUpM1-{JBkME(x8CzQjx@R$gq}Fl z+(=}D!QhRFGj!7dw8kS4(BGRvcj(G)Wqjbea$ppUgzrtidv6*UqobW`Gp;dG8)_Q9 zH+743F?gYAGI%fmZ2IRIZY|5`Gk>rJ0K7pZ7ij}qT51^%n`SnC;t%h5?qk5Nj&09p1Aocv<_HckaN%VsKZL_=m#L=hHpra?pWB>ht;m3 zVOKe%)$>Qx_f0Sf+1Ael7*2K7uA>o!AYvx79=euSI9;u%&?zYZpn#xDHpz76!-_1R z0l#{OZO!Gp&(E)~XVYoh>-nN9>?E!Tl=`i!x74}o4c-Hz-+jypbFmIrB%7Zvx&&*b zPr!!l?<=Ko;WMSgOzDMM?ISDrr3ZY(cA-w%Ccw9I*~pSv;3v`L-vb?Y>%!U4Kdh?= zlBVqQ6Z(q}A0eu$*R$z`1zYP&_Vv<( zVH)U1`3{$B+CgBMOxI~>y8|AB(K8>{+0bJfBfzLZ@D%Lo4Zt{FV`t$esfjk|`f5_h zY!*QWS|gxCI5=1kA8G@o@i&z!#6; zyX?Xzb~5%2%Noe9WdIkSde=Z;GhV{(;2h;@#&JS=d)UrybYGv=xEdNjmeyF-l_dJ} zUf?)P=MK506A5)Iq-(~k*bL@v7M%QHQ(m>$JjNpL#e@Mck~Vx(zC~6Tw5`}W#N zy5DxOyG^;3&QcCs0qK4wzXCY@mQ28DGB5bl2z92_`itx{y&FB}mV9Dc5*>ovmM?Aj z9OsaemYYDv;&K)&G1P@S(B;TJ2)69K(J3M96-r>2iz`Vd? z9e3l7y>sik>`LmMj%fbgHuoN@mGz8cANkXHO&#b4b;Ik0X6z z%-I&QASQeVfiu|f+w6xi!{7I2#qv8JnCiiEFwy@-pQNqEhO4L03X;czfkWM$8ke!? zhe6;EqR#ZNg2AWZqcCWfZ2wDGRM`w@U*s5X5_8hU{gFvuaO^GX?w2`PjnfNERzU0G zycC$HApo3f$+WkJewR8GKaozCR&00DG+GK98<&@?27y+OvmR%!I+<>Nu&0JR;F`6HJs?}pXv2k;uaLiE?HgeT!qqU#LoQv!>%u0z4p6gnI? zgt&0wsZ1T2>^M*RYdVJSSQ4|l_DjByo~V~!tSg#XMqu!}LN2p%XTE*G*I zHo%o|pUggJ3tS5~!n_04u8Rn*TuX->C>;v3?R`@%mz*Mki&hfhhv6Ou;?g(5h60Ot2-Be$CPKc@dglzHuK-Sgnm@pB$hS<6fPKcoG2kZr&T3E+oYB{ETH4*ktOM@^ z8@?1d{ob^mlffvzy=d&H+pM~hL!Fi#FKs*mSlZ1@`h6ztCPNz8WOw;5M&=!+ zagF8m$j6Ljw=K)7EI*f79*Hbx#2&Xia)2?Zz_Ki|n31@PA=u!^TfSs zfUCBQi$#q6rHt(d83p?ob9WRoqHmBJJ8WYdG79}I>j{?Lcv z&4pf2%LCo%V~7zvMkwEx(DEcqJy5j_oS_qRg=`pU&kXP+j9m$1w$%--q0k08+OM~D z+)HCZ0uF`)nA7<-TmvigD;sbi)EWf8hy55g`dOXoYX*C}t^mZa8%dv!yDbJ*x$#Ha z9SmMu#YR52imI`i^s6nbx5^m*z)DbQHTEp9JOM5-C-~0kf*;)W0%mBDRp+~*?ynsZ zZd<*&QDn8|q*dN8Lo}{g?Y&ZDJ+H)SezEnEQZ$ZI#0=iZ9GlOK-ow-@C~|_!neK}% z-_5mrm04u@Fv0TvRLd7>%n>O?md_?z{u#wg+QJ;Zv509dWA@KsX0Brn$uF`Vlg(tz zvV=33G+~j|>~PC3e7l2FnR*TRa+8Bm3+&U|C7bDY$kv$5IXDkjaV&rlebG;bS zk&Hz5B8JG(dXJq`Cz~O3DB^_=X2cF)6z~|2M-?%Oof(@Q8T&mMB_2hL0(-{JAyzM$ zj15E)BeNePyDuYmFw1vf5o4hlb4qVk*dXqJ{>z!keW0mLS|8>t(*uN_5kWIx>^6bM z1T^H*4WK^kRYcJBtgUpd?X<03%!-IXCWJ*VqOZQSmvJ%SYDn1X5`%QC$MdZxXc9EK z^(+mU4xdIl1Wro{he34BS5gyA*(CM_cGn*cBS!`hZLeT2umL;*-cEFjgR&3(fXNq+ z#xMPWQ`j1a&`i_L7@aTk#O4Mj79&%8otez# zT?6cAkoa;ELQqmmzupF=T>$pd(gtYG41j#uJ5&&6qn{H6?+Kku0<{5)fDVM5TKjzM zy#Rb^6PwE{#sE+#5;d{GR@5VGWCGc68Rxau3V^Ddm&KD>CxIA_=hud$51>H+@};}L zjE^lt3-a>IpAhw%9*w2}!ekEADEZ1JVEc$?p%9=kbs?X2aH*Ci)c8C&uaw^i#uU(k zwRFAm#QBU`@y>Rhe=pdm0f5= zZRar~ER0}#I`!9taEw8jQ$KM#sF?zxo^E?P$jfVK$&y&4%z(1rQaOfO~))LxYVEdk+Q9PGUl@m)i%}1x!#YQZM=qms?8M zL&Ji>x_X4g&r&VD=gw#{1U}~k6+jK0@^&`742*-AU#&Ex@2xbrIzX#E#$0TH{^;df z#N^hMN466kUm(<2Swe?XG)=x6`#v^ubT6-AiTCptX6*;%^@5{d_@NWwIn*#r)z`rT* ze@P1b z=BoMs?|^FlznJZ*Hvd2AquTsGEmkrA&kI$~|7*o7=l}Z%l=J^4;fneH$PBgl|6&9H z^qBvDg8+c;^Z%b_uIe`bKgG4%{C^Pw0MzFH^DK9FoBuER@JwL&XX4bG63Z{~2P{`* zTQ)lr#fSzdWzKVJXhjqC7zbd&E@l(P0hq2Qj1V~O%-rQS#Vy-zsp~q710*9HKqHmH z0oDX+3NQ{(H$fchn&|9WCC35Iai?2VQaHdsG`oawfC{(Az9FcGlP-|s0GBZjAoX?c zg>Zm@2+vdE09}{|KsbQAIl=)xARNFQ4E9e};sD8r2Te3AcSb$)FYo4VT2Cz3GVSqCG zFBk^c@7Zh>{0YGT#uXR_m^3bW@*o5QaOnydV3qT33I{npRv_-Loo2nJ|zlTK@(EKyG_U zj}Z;f0|wYIr5wWm$4D5USF#cYkU74fU;ww$*bXHNpequDBsyJ3Pw)euYzhmYxjB(o z0O$SW6qZiRR2DmG?1~T(GePt-ngfF*7Le0d@RprgGSAy=in%zJNOks%Cb0k-iB@AQ z;7t|g0_sUDphO%VhPVI<3)qFRfO;Rq1&~<40G)Z53z+xTF=2r{#sWmLEW`!O+*`}4 zv_)6|J65Q`0;;@rJG+utz*cFCM?xBj1;imN;A?F?=b;=6coQg?=Tn=_X~9@PF{cq> z0W%O60Me9Lz#Ys5D6xQa#04m^fDFmhol~n7SU{-j)OIBnU=)FfdV~d7x>_92M*}%> zET9N+0ZJ^O2yp>QEMOMm0_0dgFjyF<@eb?`L|gzkx{1UBHX$rvC*lGWSU@h~0+d+5 zKEws6uz*U;1sqgh0reCYpuhsQVk}^*gN%c*fK3<+plfR@umHo6QA#YJ0%TNYMNn9P zor#753-H#Oro;k@z_2N@iHHl(vWX_KfVqeZP{#tEl3aii3s{1<00kD%L~;QtECA&b zYD*OsfRKP6_w&1B0T6QmYFI!*RBjiTlz_N^&1PtNKidpp0SSdi5Er0^1=JxfV4WNb z2t!vUl*0Bxslj2Idc3+N!Z0E`6~E3g1_laJl8fVr3pps;|eaxCBp#RaHi z0e7rLUL6W7U~(%z4{-s=WYmhV01LKptwU={Cc*+T+e`T?MCKcB<`Kw~3?1rYFa-eM99Sctd)1r|`@F)S>b!UAIT zIg2^VC@f$Bs~w#u!U9an#n5@S0t?W!U?D8v&-noKZfT)emXcTi4{-rkEVh$PgDm zVF7iR3vlJsV=O@Hy{Q}v(4LRD016A>%|~2-91Ae{98>G`9%BI}01PVGgRuZ1;sQu4 z;32{S>M$1|lHSEwfEaNB2n%S$SO6b!0dg#0m_ZK00+O|(&w!9$lp~Pscm#6DUC&W? z1Tw%RBu9w_^eqGmETEWHQ6a|y8ZZ|C3rQ>>);nwt=XVMV_(0oU&KD`MfIP$nU@YKg z3JWMiT!0)4m;*MDxIn4`Trbe)kD0E`86Z2|o0V`{B9FEJHxVC2K2f{$uUK(5US$9FxLfX5^g@B?N7s@0f)bj$?I zsV`abk4(Tg1ry-a`AU6Ji4PlT1Lh8WZsB z?@YjpZcG3)FSy;E31}vnfW{t7z-t8)@U$BfAeA!#@E@3f{YoZaNp~jT<$uNm*mq+B z0+mca^S?~Mzf8ctOu)ZPz`snuzf8dYP9~s%Vgg3S*b}sY1YtRNkj#h}WJnnQzRUW2 zsdY^u(6rr32gDVGS66@rJ`DXb4x}Z6d=3P?%YZfk_WlNlIVTF)MT7h4 zf-{axr%ddj=X64Uh#mb9mlKlDF$MPfemj-CuaK)zC1Z;FskPrxj(4a^N1VU)aNr)2= zP$WcKfu)>;uzp*|m6H(SCWJ#^5`tf-D<>g>0U;+L#6V6$Xwm^iLKKuBR)QiSO3DF6 zLcm6pPcR8Fzmu&XA<7UELXr?i(Swd834uTeiiBuG&!v$h#C95>NQjd_PC~E=K#>q0 zGc@HS1cWAX5~5}bph$?kJj8cn5<+(rph$?k0zi=v)g^!;A^O(?ii8jq0E&cwjhb>2 zLa&!hPC`Jvr3wWO5Q> zWr?nmgizqg5aG!e6eI)!Aqq(nV$7Il@ejct8-^Xb^s>?%yz405+OJB>3LMYLJb69b z&kEc)>-T@j#Mi%v@ox(Jn*#r)!2jbZ@Q?HV9{~;=3;}3RN&o}_xG0nW2m)wU zC;=R}7y>BAN&u1qpdbJ-RsvuO06_o(btM3X0Jf-<00;tDt)Wr^APAt3LJ2@r-oi?N zWJ(FJ){3Q40$>P0pi%;m5WpK!380IW03-y^rBDLoAPRtl08$hb00{xyQ&9j20+_9$ z05AlgDOUn)**rr@0gwOrMx_KuPLe5<0O=3l-;@9p1W-gO0WbxC zA%GGE1wcUn=hT$|2m+{AR|1d_0PL;=ARz$QT?s%z0Pt^001N@#RVe{51OU4!0Z0e{ zOj6J(9ul^fFXcJbtM3X0ANog0EPfyHzfcC0l*$g01^T~^D1ge015&? zDMUFQlu7^$0l;ob01^U#J(U0$0)T&00(>J@QVD<|0N70lKtcdG)^17w3;{sUQwc!D ziWm<0u~JF^3<3PAR01Ffz+R~Yz!1P~l@b6!00K2700{xGR7wC60?1TX0#FdZlkQ3Y z3<13DrUaN2aX>)rzK9!K&qN}iUa`I5P(Sl z^Aw;00d%n-fCK^11D>QHKnViqVnF}}0$@P^_5&bMUg;Yp2yoLAkpLvL0Ay5bLvGB1PI51fT^t%2(XY81Yi(gw}lqc1IRIeNUR4?U;yZY z3Ip)OdH^*HU>4E?bjJYdNId|B0aTHC067M5lhgw!F@P9S4?tl6jY>U$8V0ZtaR4d| zfQIw{6b7&a>jC5#Km*nTC@_FNNDm;#04$Impc@9@fb{@!48R-f0hAa(lR^(5#{keV zt1y5pN)MpK0Ho!LEfp95r1Svl7yy*(0n{-7i1h$HFo20z51_yRUQ&7hIR;>h^#BSC z08)AYbqruG(Gvq$f%O1t7{GbC9zYEPXjJL})G&Y~qz6#P00OZdK!E|gU>kSG07}MY z_QU`XSc&xj>KMQrdJhcXlR^)m!T=zp2T)-E9h4qGg#r9b=>ZfNKn&6YC@_GPZXzWH z0FWMl!~jf?9)Q9CcvufWVE`zDC@}yw(gVmb0CZWE7=Q=T11K;6O{52)FaSL?d?d#J z2&@MnF@S|w4#15jW9I!F(ozyR)(dH@9m@Ey_vC@_E$tOrnG z04rH9l^B2)(gVmb08OL^pfG?Y4pdjC5#fGgGms4#$)q#l66 z0Qw<4fE)t=NDn|_0Cq?ZAjbfVkRCvR0cayVfE)wpkMsZv3}CdA5(6+qdH@9mFbL@Z zlo&u2sRxi_02P!TfW!c%lX?IO1JFQv015-B$kkS002OXL1qQGb>j5YXKo{u&C=9>_ z>jC5#z)MOGKw$tLSPvk_0PL_HfWiOfWiRmkRCve0YqF@VE`O})c`6Cz=)wx13b25LYFWF z20$~Bs{zvM*mNZZ05s%k08^k+1B{#gm{J3f7=T`vQVl>iQK$hLfP-8OaA4;El^VbU zsMG*{=f^5A0RR1z8USMeYuGoGY5-JbQ)&Q&0ql$8sMG*jkW>SZ7{D3i2I!^+;DF5n zH4MOTf>I6e?3!(bni}Aul@3RN0k}b|2B0tiR~?lapxKm-)BqF)VB@S%1H3NLG$hpk z2m=_mMX3gmY5`IWfH45x6r~!V6}bUOHGl#GsH6>AqErL?9wHE^Fo1@=1C(lj1xx%D zY5??bpIi-)J1bYI2Cz3yQd0v2rj3-V0VoV0H#O2gHNacj zTs1Yo_fSm@zyvBaKn2@Ep$3TGpi%=YdSI$h11#BUtWpD9bZS(p0rJ8M)YJg(Wol{w zeG{b`VCnP%g&KgR(M=7|FkPxr1Ax_XH2^S`s{!f>dN(z|L!@F*R|C{(?gT0|!1w3X z)c`B)+Lda6fFzX~pqc5WrUuY#RHy+4-dCvszF(qJ16V?(8i0TbH9!%IsZs;zLWLSY z11i)2g@ma>4S=2vSEvE>p-K&42bF4o!l zWtAFW++Qj+K;#`YH9((hN;LqtT%iWgI;d0wL>yPC0r&@$Y5?v&g&H6tPo)OvD^;lh z0*X{>fT2*O1|Xn94X}VPSEvE(pi&K>50z>F4X98904P@j*g>TlKm#h&0Qyj+25^UJ zYJkWuYHENPqtw&@MXVPpH9!$Vs!{_KSzcGE0g5b-sMG*OmSrk6z+s=;YHEPUi)w0s z$Q^2GfCFp;r5a!tK~t&$ju2WZHNd!;Dm4Iqno60~}z4D%Ai0%GCfvp-K&~!0LuV4Ip#eD^~*?U`|)60W_dO z4Y1tmlu`}wAnCK38lcE3R;30wXqBN-155=fHNb6VsG1re@`jokAo7Zu8X!_#4G>wN zrUr=2RKoxwQ`FP|ksH<20Fn7>YJf77GASTOhq*rpF?(Eym41c55|YK=48T_8BRS~fY@>=Ixc;yG7b8E&QlP#4os z%C?{ZPnwt6$X>mkgNuf%E*_%+FZ3Vq@&rrJgZ-QSKla`OEQ+Pw8m%EG1q8(iO$G@= z6a-|*L2?o#2*WT02{SSvAPNX71{BNz6%+%42$&bR6Gyy{uz#-TIrk&IJDTA|FE(}DG1U7 z+v|}sg1}UG`zWtrSpfKi3kuXPOhY8)mm@L-1!6+TwZo>CB7_idEZSP@!Ci2d-V`qd z3|EUwh&+ERY5YjqIe2DD8cdMHw5X0uonSk>0`6iZB}TG^Tm%^~1p<`5{K^vqH=VrnS>S&o)M z86R6qVLy}t9aeM@yl|m#d|K0G5^lYQ@%4paPbbLXQAP zOF?i8uBD(V0JRisPotAKS_<%1m!+kkwUv*prEn4g@3@vipEO%bK~V@{YbnqHOH091 zfUTwABE{BH;ARj2mX<=16Guy-60o!sP{7hsSUQoTrErdqnL(hsC6m*MXU^hIbU%tg}=-o(40Rr7t3Uxnas){h?8$njRMW)p4KjYKIg!Rz3=%+WWD>q zKHogR`DV{PprW(+e>r6LXZQacfj>v!&k^{K906%3cp)3A{|`U-2m1d`h^B8gVqYu> zpR6Iq+sY8HmxzW1V*LyWL4-wMZkz-ntmlPzdivrH0AY$y0l<~(0FaF&*C_+A2_e2d zrl+h2)%$r30IYEX0C!9Pz#gildg#eHR^a;oE{HOczE6)>h7_0L^8bEN{r`lXc?hiF zC1n4HAwC5x`G3g%mu1TTW9)w^ru;u-|9i3I|1tKzHB{6A#>|Kyeb$JPHa`G077U{uG^{~rvH zHBw~C|C5u9^erNo>i;;ktq`&W`%34nnKh*z6RCdJ` ztL!_%V$STIr1E9-2bS#D!-OXlt0Fa>x z0G;IQW8;3ec94(02GIGdLyi5bLsboyLh)jV{U2TsYGWO01FS5~ZG ziZ=K_g8+k#8(OnMYd1KC83sC@=kszYSkvA5#H5zruywJ9u&=@x+g7J?jU`nYOZRES zt7t@@T*`*i)lANqI}LYn}64AwHGo1*0bgIIqH! z0)B`?pMcNIq=0a(+ei^64WLSSyL~|rmJ~33Qgal&{?2V5EGa-GyRRPTM}hHMIZgpR z6A1;G7G4*JsRKADu&e^ks%FDGbaZ|1$zQ?CVdgS8Zd?N}g@6jCUqCQW!t4UHrez|k zTQR=?<5*}Hu$8E1UYYWSlNj}&+04fA%Y-xuQ0nedC0Dqq&vUjSPnU{C;pvTS@7Qp}ll0p-LcSaJYy)kI=4$zus_7r+q+=wR6e zSVfcY)Bu!a7r-MB;J`qcb^*Ks0VvBZV5mR<%CQSz3k1xPtex3*cYX+uLIBG23&4{D z*tr3admicx{Q~gh09J0mAj>a+qYx14`yBcOWQGb5zlW~Hasz7pP7^O7#LLCR>(DO1 z7xN2XDFoC)zW`z`o*Y1Ofp!5!v`T>c1#lDsP?lc+C~Aax=`6c|jAHF{5S)3J$1b21 z_X~i@0bhb(Zosvm##WYJfDYF#AQSfs7@`n>vit&g6arADU%(KBfI+rj0IxzoCetr~ z3AnTS6CIKqz{(9knSKF76arATU%(KB0F=P;3mBzVPI3S%Hvnb&1q@LLK-qo)LlgqA zT5-RCp|!r?=Ozc>xdG54h^r7V5AzG)C)zh3St-B)^%c^!9hKu z=bQ+l?>1tzay0Rj z&qhqaz>;#1o46p@1M?R4cx+@T7+B6B!Ndhy2E&QivaA&-hZ2ujWZ3{2Ti>}G*K}{q zBGoKV7q)5w3{kyI2uYLGw-gf(Ue9VuN=?#V_L-ax7`>q#mw{4}uVKS&>+eMLw)I#r zcDeWiqn1qyWyDjr^Up!X!l`+t36kM2LrJrJNj-WwCKP=XBsqrm+L?l^oT$iX^%pyB zCPRGHqZ>%&i#TBeCcc?xZb^Xl{QmN9rwP=XH}mP5?C zhWLqo7pOZfbd=R?+i5KZlEoaSSiiq0lTB>dng5jE8TbGj;P=E}WB4}cm|zSU5&__4 zrqNOZNoy6L0t5+2W~iPOK_`r#PN0kH$(3kbQIrD9r?_=pU41o*G^bQsfjRiH)(d!HJDFYXmf}h!T{_^->1` z(hG!xkVC{%psII9sE@MPAR)VCeG0u7q#T@nLOY7!*(+W{P%a4pVZFVd6!&Pig6huV zvvyM?h;K9B6ZCp}RSGd-jHuSTxL?L463vu^31g6=GJis0i~t!uWl|2jJsWJ`H#Y23 z{^iq4)1z6^9L+;*8azms2zut)KzEI0`L@1tXqwRp78hAa0U}TW5=GbZie>~EwvlA~ zb%?($iKvI=Qi~=cy3WuXCdI_fiaQFEVh%A~GveN2Nik3`pOq97`=lVy;!~+gp8?I3 z_@u{{g@Cz(^h_VNU&d5cMoe-nLBLIr*vsRWapV3OO-0-;!;bN5eF-$oz%pW> z?-9@*r+eGo3J{@es=9`n0?|kS2w1=VLmP~xsx(uEz zQ{3w!=;4f;X%w;3WjuO4h4T+*T4AyoRR`UDEZ>7o&`yIVVa9~1n=w3Lrk0g3V=e=H z8GBB3^g`u~6t1HND`jT#u_I0IS)v&~p9U+kR5PL-^(09xdXiA#g%QOsXcz@1w}p13 z_nDZ0;!ILLkjf;)g%q9Z0Fu{~quM%!4Lg|{8d*WszuNc+dbvq7Ttnjm=B=?*xS;o| z9HyaR)Z2=QXn5rVokmj<>^@ibik@p(HySP|BWDyfJT&{h?astfGAR|5aL^Lv7R0=3DEPccO8l< z0zwSPNB0ViBUu0s6ttpXDw<_k0Y^Fd8;Sy3fkWUIihB6XCmt6gofR#5%rB7RU)L_5 z`K$-B)xgztq&GAa6t5Hn`GgPxTa&_IF<+R*bQAMkxKl-*s|o_f*ysuKuPFw63&6@j z6jd8rmqiq3C8I1w_yL}TgvixFVSJS7SaHeYDGACIvUmnz{Hf!ahN~_ z3KLV>P-)D!q7x>jxJcSF1u94nf$|G`ACF(qx59;}VyrBN2~?PyA2WpBS7>Aubggj7 z@koE)rFc)*%~VXpQ4`BdQR?jl<1>|DV#--tJ#=fF`i%KlV#;FF=&Tig(Nk4}{B{XZ z1ocqW!5u5~L7dQc6EqjItZ=iK{2X)`&DMve74{0J_nC?_9V?(xhy=^A;WOy2jwXoJD+Jo%ZisTREkXmZlf#N zmKDHI6aa>vS{Zz7AkaV|IkYf6E7X1vbp_pYpJ4J7qD-#}IDnu6^med)Ftis_m&we} z!W=6O&Y29;Qp^T0$BIjS$|!XsH=K0;cgWdD`7^866}OCP?-W|q^xARRkXs46iw(>fhwClotL?} zNP%rufhVM(i}|!aFwH97VF@WgRc4NZS~+?CxKl+HZdI`b@(O?dnh3or%umk25>hmv zSw;R^?MvXN-X5)U(5r%#j{?0a)-dx?#&;ORVrCTw*$F9Vv1gSU1DaJ}2`MkxW)&ht z1uzqgnI*8~*Wg?5DEMH|e$qxVm|Bb5RZQpK@9`Zstgu9(VMU%Ld>+O!tPqD;DMDj? zFuw}Y$#ut2mR&{W!{-E+Tg9TM8!)#D-CE480v*S3t5`P~x>eAcFt-X~{%?WbfMr*a z@4gk!Ng>)ny9$d@a#Ff6y9%D1lzDva&zWu&IumL#vtDLkIVqACaJ!1X%}GHqy9z8P zrIuw^5s#`@{mDtWf&R%!`ID1^y8OvWVcAvu$w~P~IVoS+IVo(riVW#tb`_90#w%Cf5%*Uho30NpIR3Q)zes}O=J4Q!Ey5q1^eFw3q2 zII-+1fZ}kw3P57nRREM_SCOqdiEUQ_e!?UREXM-;WZ6{!sM3IoG=P4VT?MFO*;N2K z%dP_8Nfywq0)(;bDhhPzY`Y3+Jjnvju@FKzb`{H@Uj^H)f}f9TS5d3NH_Wc0ikV}< z6lox!T)PTRmN<%KiL*o+e52TQ6+7cW@7_z37RkT44D?TKkRH3`&3*8`+w~agwKxNK zYp)%Dr5xT5{(1d50)LLc|MVm9m;C>!kpFM>U(^3bIQsut$WZ-%B-!Yt5+Z}^{}-#u zaPHsI{K9<`LC>hg-7!L6}p{Q@_&7I zIwtv_h0bWjCI8iZNPf8F|E?MRAB7^o+xRb!I>Im87#lK)WgKZRHFe`ApkF8RM7ll)hnpbRDd({Raux-wu%{-4j| zO8%41J00Rk{!3WxqOm0Z?J-8Br^}H{xfm?DZ#~1_utqONA)i-QGJf?KScGXV5mMv_rEelfEU%@k`7UQ z|5S+Tn-^fZ|I<58;llq~k1^fcAKd>!XJ1BVm1LNJbn1>xUM{ zwB6;={YTYIhNJrMS*P3xR3ClCKMd6$Xie~isD4H(Tlc?=c>6T*E=%{nOuLPX>W2zL zRG(M(zh!s#5L6${YvQ2#O{4)Ps$YAlWCW^DqYpv#TRMXphokznnZJgi`Y4c(8jk8i z-v0n*qWZ0% z@YYCFKYiUWRR1V}K;okMrF(GUe;4K0 zSJrcJ%Vd)LKfw8(P4a)K7haiYDLhY{N%Hr=z;a%ae=A1vZ^E$hCi4<5RxY{aE=KZi zVqxV)7LrVo|4W^qYz3(Hzne(GN&ed#mFv~BhLQZYGS&VYEb=qovq=8_ju^?miPXqa z`)|cb{_&*unA(34=@*OS4}miarSnSvn&e**exFP7rw9%w`BQYV4Yimw|KFxCBZEux zFC#wS()@QRC-Kny{m+3MA4v1}!PWjtaJB!EXejs3R{JLlKmd`Y_Wwaoj)&%7MX1We zY5pfLwf~g75j6jUw=lW?gG`!#3A|9T5X~Blh0me+(;;FAlAD-n|6)=cn!ltFFU|kt z7BFKzlja`<8>GO2G%-Xo70Of|1d5@Jp-h@T84~%~H2?EMF-@{K>EuwFKT0@SJB;QJ zM+*jL4pI9@`R6h)nm+?m`&Y1nYX1tPjfZbAcxe7f227fN5w7+xbB9awM`ssuY5r5D zUxI4?HDSNFH2*0OwY&nBmGIL1TS3;rAvFJ%Q87z}Ulq@V*+Tyz{E*I&^CXnRcA)c{@i&L&!vpapT z5ZC&b8DQd+BpH_4zYK&ZWill^WO!-*gTJ=^Y~#@UJ8ypi#A7@lrOB9WeW6j1<}ZMO zlz|oyq%6`7^-u>A>$8gi3#1IJbE^50jDwV@>mcbl1Syk5tOO9xWh{^qrNA^sCP>+y zMLf*}DbaBlNGS?I%Eul8Opx-!x3CqVoh*P4gi55<#Y_BM1|NOLCPM$0x4to zSRmyk4+0CMB;A3(!*Gz&3a~)R`Q^kUG14N@qJDmXY@^R;K}wf56S*Me0zn+4RBfo!y~P#I=YW)S;iYID6QuMg%q4YjKuRmx zb*6qk22%Qo;UMMM1_)AiwDW+Jjq;h0JHHEpl$7dBNaDdj%GE+w^gK&#=odBIb%k({ zvT~sc1SzjWkg^0_gyCa@7<<0)+-gr@RJoJ11%i}5t36N%QqJy#AZ3Lt1S!paVIU=% z%K<45D&BjkJI3Uuh=UCVQuf-hLCQt8XxP@+_e_uy?ZZLJLI_fpLJfT@Hb@D=ageeR z11Vj9KR4z9DNV(lI3VTV#NSfI%3o1oJXXs*~EEdk^q}HkIHh1^Qaex zIIpxeh=(|Dy4{mQoL{?_OPqgM$|cS>X>f@1*Gsv?`FDG{#QBG1JjD4s8XV$$Z5Eq2 ze@Ki&oIg>@CC--?bBOZ?ve?A={8BD)K65&kIA4~>CC;P1T;e=x%_hzxasq7PJnG3I z&ZDv%;yfzACeEXPMVv=HImCHXfK8l7Wx2$8bUqJpzQ2rzI6teIhd57s@5d$1D`xs} ziStVL{J6wST;e>q!X?ftyO;40=kJ&C5a(}}@et?Bc!~2xWjw_BlrkRTe0&)Xaehk~4{^Sr zjE6W+E#o21hnDdW=iT>miSzDdJj8k9G9Kc*b{P+GepVR|ao)6yhd7Uv@et>ymhlkh zC#~iZ=cP-z#Cb`CO`Mk~;~~z=l<^SfCChn;^PZ}6c!=|a!{AINqCJgY;6tXAK-OHn zi+UX5JSxFMoc}hFL!3tyc!~4hGG8-^^K6h(dSDnxX?+K<)|30NRyp9mYIJXgR0DQSQOQnvE3LCP+X z5g;WBSRiG$3J0X@1}u=W3a~&*DT%)UDGvh{Na+MvAf+N04pNdJ+m5LuPhf$Rx|85- zIZH_%ut3V6fCW9M>3{`N)&YzO4nfK=0t=+nr6X*RazF`Vf-{NW zV>los#3)7BASItL7o=3-%Nzz$LX0vDO35=pN|cWaQnIrLi74i1#a5CpWrLKCLKDF1 zab`i*Po=+u!;R0kJPj>70^%)nGuI@R%mI#z`fOwWr(-jJ_V3RT_;UpQ9DzSa;Lj2G zzjXwH+-+^05PNTL5AP7f&EAdqRtyaJ94}*&91|CTcqY;)R0acaAjiZ}A(}pIQ3l8|sJ!k|LrHZgo?S!M-D5)GlzsR;;N(}96R!b%Z!Rff74w!cH_ z9#)Nl(ANK5dpzUFF$vz(sF&2-by)wizlVb)BAJqe@2VKE_4U^A)Uoxo_8eZH zEiE3(Ri_~o?2yD!6QYu$IfKRk5^MATB`I;(@!@PEj+_LW8*hfFGQ==ZEx2doB)Hqa z2j2rfdIUL%3f#yE$>ca-8x039@J)1#o4MC#u&Vr+NNFTxV5ucbSN;H)cJNlV}m55=$1Cf}ROvmyZhOE!s zP8^LKfh15U(FmE!Kw_zBy2HydPb4QYBl_<)7vMZ}b3?bs8Fc@m8fywR7uZo5l##nP z{8+)`hp>k7h(j^FEb~Mex$)uUFi{I+WU(Q~4sKVSfjHYC6gUge@cAg777-H}LybUE zVv?e1$w^33G!-F-$Hc`XrC}3NA{FmW>{IR@4jbxz39$*ZlmvD+{M~#tqR+6x%r^R4 zd%HWkJBA>B3FL4%^}&tfrI|z6Atn_z(uE3tQU8nbehGh5);2MX4l9nQ!kvvkG<>L( z-0Kz6%gZVI$VN}BS0AtfcYtSuc4gBCT8OC@R#xSs# zE+sVv{)r^RKNRd;3>p8N{fAEllGz9XfDd}j;Y%adasq1!Rq^o8A6{xQIlvMB0D7Gya|VcN!l|(D^UEMzk0v^61-^$|fB*FV(BD79`#&Kj-i%D60Qj?wOsD@{PmliHztjK7e?$Lc zmv=s%-#>r)|L^;M^j`hvpZ+`j|KD-`WBt$j`}a@(|L^L5&i$7u>%L_?Yx&>(9P)qb zeHc9dcz^%?SI@t{dhW=6uJ~8a4cX5L+0O&9`#9_gHv4%cnUaJ*4`g5W{_6SVzj|)T zem=>*pJHEMInOKE&na2g+2PMC|LQsAKb?X9o%vV&zv22@n7wlnfuZcVs!jZQ{;&OS z2JDVF8(ixY%h|Q6gbrZ9VA_t!=vY)-A+2U&O%LTvhX5T*Am@>BF&i%vFBB#`U zJUnxYw)YG4TT;)Jo7?p_%bX*9(K{m6v|^0-k2y;W&+eJI_s2=cRD}V766ZrwP1d>_ zmb}_m$~TdqeUV&!_|~yS5!IL8nR`||_bbWH%kSb-o0CJ;_#CXR}~5qx9Orscg`rvSfWa$RfScb2yIN#T)(S)+1APGAu-Mq z`cm}OENNSk;jLzqiObu}bINzM&MZ`jEIM)Jz-jwO zP07Fb&pG{Ayu^j?!laB3+xP;(qlCFPccxlOoNiqlm!MvmcT%Qem&9VNxjpg|LIUTm z@L$sTpf-D-gxkyH%?GZMoG)Guq_l@@|NPYLXQveZ*YWqn7gVSyiv+K4k((GJP_Dc_ zd`bI>g0I1%8hKu)O!?GO^Y#h~`z+b+FfcB~U~H*xo59$Pf>J-{E(+0oVbK1eOWj>0 zN94hV0JnIfqQ{ko2;nCtPs><)Zgs#}^mtQpx7~Xg!K+vH-H)B9UsPjbpRMaysK(G} z*%5JImg!FE8HAv0Vn*rZ?D28pXQu}ISlVxY=&Im+?E{TJT0fnu+t7Akm$Inn*ljZf z3o5A-iY98yr53fGG-*^ToRaKy+P@^fW#c6B(lN8n&+znlvgA-^nWdL@@}4u*b3RRX zQ2gw1P-0K%Ku5{!0pBV!=ivOcN6#C0W@vlfpBziRHT_0L!u;zG3l-m+pPo6jf7|hG<(-GR>D@oZ2kEZ{IBI!yd&{BQiu9H{Mf{QLGcH)>Tt;t{WvCwsHd(UKKkSV70^8L@ThC2>W2|mR zOc15t;lH_A4|%Jb00&C9b2RYt{u;gRFRXLx9hrR z7DeM&U)$rZ8^-c}k21FS7#f{heT095@oT|=#kWO{w%S^sT699Q!@c{Ov3bUoj-;-# zjIgg7#&QpD?D)29@cPCTy$5F;sM2`WZYu6;v)0|kPjdE{#A4+e(Ml%zE42lkS7hz@ zJ&mso884BcVddX>@O;^ohb^>zwH*dWcT0tCe0TKf(Qu>rRgV{#OB%&h51P$C%U zgUvrDdVK#BioEHJxFV!}$!_{g<42$sR9xOBN(|={xW7N9XrZ=hV_oX+>bZW=TF9U5^Evx2q zgo!FN)z*6Emq;X%q$ZgemN@dsbRIvqdsF_iHK%!2!$EA?6fcV9k}`|SLSx1LB; zZgG2H>Xb!C1ix&Qm^`3VCM5gpp>&(Q)BMBy4Ly@CY<3Wvb}O!}Cv@_$rPp4U4|e|g zJh*a(T9~74>WqWeZ&+>9{g&}&Oq~77=>~;+7tch>Vk3;N9zqt(PEGK$DEuhJICt>T zV2sV__j}&9u72UFWwzn8gsPbPozwNOfU;A3`0DaOvY5#Fkm%8{0)I|LN zN>g&oo)O&SP604{Eew`qBt?I`z$^BZbW{tM(Z-h0kT8~ZdFz)~T zetdVH+3}PME9p72`F9fv&)t8szos{9Ltv3?p>xQrX9h+Ybq@|d$?M(o>Zaz8fO((z zPDa_Ra&SFRdg0Tj=lQycYR+`Rk|2H|?G5sNN1wEep(oiihuc`x)7M2+Kkm*rdNy9t zhN_a*o`2lM!1(4&`rx{y&WyDdcfu-5yzM(a*mqss(oD;MBVYI9t$~mG78Q+q;wmLp zBeE;^rR?F%nfC{GtvtH4XY%gx{tsU3iwJ-AkOD6{*U%c5y*IZOi7=lE7BkMxb$j&i zeR|Dv&ux1qH-fejN9F8w4l0lseC=CIPr z@($uIJBbF$+k}Fx=~}&)1@5QXw=r6|3LVx&>RrCS1ze%5z%s2P~ z&C@U(l#+gMM@CR>`K8j;i&m#hb5@l$s;af0(_o`JCHV651;qqUh9Vl`8~>an>+ELd zFm7e@h9j@<_Gn8rN0D;S z`rHS-$I89t9!XI1xVX8&=4z$GRb2zo^vWoA|LYq=^O_^mZ-1y+apv6J>-V39ZqCv0 zQ9_q zJt1hu*{R1)IGNnvC-7GG>U$+wE82$ng{?1sHdvf6TG zbN{d`2c0aMA{f{hyv8GX#`PyblLMXm_k6p~HxQ#R?O1!?tJv{7=2bk zrN?4j6r(0(dk-dW+0)ARKv-eQ%5i}UeJ=~?RF_#>6xr@gMrNKA>fiYrTsgl?ChLvV zHx$)3OfTI}fLqy`SR!ux7zlr86&P)%l&d zP4at5o0m}V@*-aqjy10hutfeb9{^)rVV;<(3xi+yx z$!0~a&?C)NtBXS8ge0~s11cfnAIE>LDA*^Feq`)&%e{y|`{TKi`ePr2)KB~}_W1pI z)V-+^3;E3!OnhT%C;M{avO%Nlo8qUxS(j6~UmW>9W9h!s^#0OcHx4H3Ykqy`(c|`Q zQ&f|IwAa?~F&b%O3Ue z1Iag1vR+a{)E>3VHpw}d2HbuW7+9p<@MzJb7UQD^m5#baE)kyF z-_f7*#u+vkX{7xW455#IQLVImB4xa>zkpl>a^2f5VxFUWXqMuHO)e9qXGEFD#Y}3v zA-KHI?8P{Fv8zg@*LE1mZX0+k*&gw36(vD#VapWS2Jq-yPcd~@*`l#7bM_lPA%zS! zRV0i(_P~1UvaKB+#3N_yJ!bRE59drJ!e6#EWWPM~vWM(hTRL&P>EO@2v-{8N6g;p#_@E3;hV->3y3*>i z`b)#uMm3?n`7&|mpH|XRi?gKiPp%KN)efC@_V~P-BR-;XL2>o-Boh-JN{L@mdscZ< zqZ~vDwE4DgzN&mOjlM58ew@>7=@p-|zw6zoju$!jF>n6XvQ^Djgby`0ii(_{Ls?5F zMpSz3R@%3+>)D({jmFPMo%rKVi?#*Fg=-&je)avkMBJsf#9f}nT7lqdA`mYT2-)QD z9!zmseuAuhBk87=txSFD)?h=T@U`V#Po9Qt@swQbvZzIF*PFMO%4s3{Qw=Hvo^MHb zmW*B`{@mN)u&Ra!!CFVBunFBG1zIyQorJbVUrCY6TPG7QYkHBo* zr!99QYE+Lw%0r%X%!(Vk6zz!$wCg`CJWF{~GIb*& zab@8&NvhB+#l2lyvQCLP`vhDu*(59hL7ZPFyON!l<5; zSs}RhzFy#urbL&8Ri=clO7(B|Q5}CbLTAa}MuUh)Ei!sihe3?Ma*J1kog`g7PVEgfvpVT%E8&O#L}O!EJ|H!u6u2 z9WHb4NfmxN6p(mf&)}{VUo<~xI)}SFS~7i6qhp#*K&(xjY_fxEW zb;PpRFHiEPi>%0>6BBW1o1e)JC#xsT{EDqp*KB)3+iM(mX`2NU!_YSW(!xbj+s(GRK;Z<<0f1&@3fcI>*<-* zzK+4$$6bt{_eE82{`MALb$T@f&I_djr;sxh-nbXqK49XqupI`Sd zGv91^#r`#i#vFPg*+~{SYdmuX|D)*8BI3gy(=7w zTm{E{E{&&C{o@|BJ^Wce;M;B#W#LE_Z-Z41`-9!I$ z_}ho9J*N@l5D@G)3V~Ry{D&@%m_@4&nZxE^K>Rs-;%#jYd#tsnBVDq z{N?$J`%iy5L_Dju@Mxf!`9Q_5H)*ez`v#ROh`n8tVkWgsE$Mnyc6EP#^xUQ;HfQI{ zKN7Z>efdsa^sGB~F6?SJF}yWRQuIsBXm%BGUb?Q^;XT}Pd&$4k%SgZYDf#$+f z&-0$VZ`*RPtna2^`$4hi1m_E1_qR__>Tp!()Nsl@r1RUodH=TR!6}~(30W+BTsC%R z*zXT1yE3B=|G4HnZeZcz`@T;Z)=~-rq`S12St_?XYE^fQ37kIl%7eBLv-%ZH54@+k z*6M%qz3D3C>7Dyv*K8N1SF=C336}bQ?kngExU|Mha^;NgZ|$VAqE}2iQh@L)>Dbkl zYweM(h_&*6dhUs+tCw0~+vEOM=f8fvqj&tr%)94%w+U938oJa^ko0ZS56&rUBv`)Gnr*iT2`mG9|Tpl>Y32m(WF)u$w^|D4?_UzOTvLcr* z1*q8RXdUd(=$sN?w)0D-al?w>*wxBSy9D#^TW_2;Eu+donIil#RIP2P`mxQ`8|OZl ze424rbhB3bn%9g_qchvGyQHt?k8>0Cm)fc{_WBa5`d#A`77WTy&Lhn^YFcJ&o5qoJ_lRu2ow@Oy=?#-*Ez-OA+#-+D ziymEl-YnzYbs#lw-T2}?-Ip&p+3&Bpv1m=x=KZc;k4eNWJm|kCrImPH=)joCqHjzi zglp#CFRuG68c{T6qr|Gc3m#s*=$kfupT365&J@WwF&2fByYF>mq+38XX7i zEZ2F|-DrAaCa(WE|Mptf1G3JtHG=iWl`0yh-O)_9pYZm~!~2WwQW|28-aH*IRk%I8 z-@Z=w#GX5`l_`atkLEZf8}TKat=03bHFT?<@of5?=%slcw=V9TmQYp4_oHuW-0>R^ z3)DStlHbT5khk4LSb8bu?rZIq6;sy4xOIK?RYBH2&mAYGyiJrca2&)4-T!*&{jS@& z+X={%hx=3lc7%I(>1~S>DL8)MO`2o(w15?Eg(dC3CsQsFTbr($uY2o9_fVIy!dRI)2tYBa#}I%k$EM$sYhLXQD^s-{hG5Kt3`E;e!TkDx8ZZhqQsQB6T}aFZErUd{Albk?Lq&Q$$NMAUNA3sl69!$%kQ?@MPF^BLXB1Kxil)w z{qcR?$``XHJ)b9VbmlQlgR>=5CnghK-cVBBvsvJPYZJSGVTk6eEoKG_P2@OEB6@*y%$X( zj6d$G5@CdOle6cy5R57PpxWs#$Xw}>u^ys^U7i@c<-aG=W4?#h^pv2l?U%lFp>ZV6pCz7qe`bjB55gRU@X zyQ0TG=i9zYn^W8PywrHSvRA*$lgW>FY4qHl<^$?1WDL${CTHJC>!hB)xlLazy>sHD z?zLu8O2yyS?k}w=4*&f6T3n-0?7peC`+rRzOdp8Df$ajm;3ol_<9D-oVDYtp?p++?CeEp zzH4kxT&z5uEd9dGX#T@Mb0-DsUEc!=qDmJ$5RK~f>ug%Qgt%}SJ)tal$)U|Qof?`> zchX8HoID})JX)^I$}IVQb7CuiG*VqN5*(jT(lxUy%6h3K_R&ms(t49m2k_T)*e^k#nQ2pgl)R#Hy3;GS* zFKGrYb1mPVY_)FE<8k+dbna?DjI4w>n2nNsNJC{oc^))-jZ2#qR44wvdWQ7`Xv|SC$?m7crKl`MBy{PNcL^-@Ehtn zBF(YxD|AVo!6o&rKZ5K7ob0Xb?7c_hSPuV=%k!cnLa#+C!X{!t^3m|J_Nh#+8RAQg zr$a6r6(e*d(P#)Go*Wm)K`O8V*gT;AkQ(J^^OL4T#5g5pO}0v-gep25~*{ji44dr z9QD}vB~Vl8R0>9+vW|?5Nq`(OH!>p@(h?(dVgIqdN+c&lQOyv&R6Rro{?#A7e|YM0 zj-Zm`SY%sT;=itKM4$20#XQ(#&S&bt)OJDNY- zUsz;F^L(gDNihjg4EQnJ3Jv}Nu%jW3&N&|cyO4Jq%nE!U)sPZx8%Kq7R66h>FQj7a zaicAy0-tCa{3Mzh2U)7D%{bBGsczH+NM{;3ZrOdo-E-#gMcm=34bMszd3wZn;La_O zjtvK961x%3aGd%vs63x=IJilP$y7)%9Z?r^i!qR~$gPBd%|FQrMpp?Hjcw ztWgYj+Ts*ZykR5upXXR%Z5pxP|EKkOU{e)rbRzp`IY;PoIz#Utw|GQ*N2%A~|5Ck% z|A~4zbG;8WaUmqE<71nl4aY)iOnh=YcEk-KKYYY~@)kEklvEi?SkWXnisIn4ZuBuW z>a~qE#(1v-th$GcU!_snz!|eH)Wig89AZnRGpWTfRK{pyl)HV5j~mIlwhq}0^ZJNS zl(z8N&ioF}og?;t=$uc1W$_7L&wzKz_vT!RnAaj3Q|!QusEe~7&X5<6kM?^p#HUqz4VZDeQ9j5v~JiM^O=@(%nkrR^;GP4|ZqW&M$ z0p}*38q7wyPZ-h;4ONEbKWoh2x8<+v8QP$5G6SkGjHru!4Tz`4!)qpz1T_oTGyjOP zSU<**6Qig|G`z@R9CLhjX23hGQTv@c9(nKeMvg}(yf$B~GWK2Dh;6gmnMj2fJ_Z%) z72v1DLgwuhaA3H>;huzDe0kq{vo5-gz*~0dT_ffrNfTV2j^0 z`%s~x1^kTt_1_#nXWEec8g>aCdEEc$vB4A({_dX9HaRg7YE5AJ4cNt)rA&Z}4lo;p zRiKT)8(HkA!Qq}rqeJP6q_{LpOC_0(c>6eLBeX=;bt(-ZBXoGOz^X7s14M_6>oP>Z zO0X^-xgT(K1j+zlY8i++6yb=cB`~EKpw@soex~8`(5T~MczL4TkTph(fzirGli}S0 zTT6r~`=Oy4q503Y2k&E(K$sS`v?{_%EltN30jEREB1{!0L?USTm4K#;crs6x zk*#2!6S%|&=R|^XA=Y4Nur=5W1ABi6F0sJgUw}*LFl+D>z8^D> z`JM!qSYV%ThRYzW5O`WK?^u|72o-SfU${V3*A)I#bpb9mzzw+B07u|x1J6sQ>=JvL zWWb*VcynOu7D0_5sBS|}!tWWF<*>U#p6}W6N>GvqJ6_nqn_=WK+C9d<+Q4Yz=bvs2 zn_&LtHJUyM9AowlKBGJk(Zz&-08_3BU@A-iQyRkNFP`$Yv}CA5gx`5k*=N$6W#6A#bR^A(lT!D$fyd=QiWQnwR zRzrB3$XyR!kZ=_+to^uV7km01vK^?0#GppSV^=zO*~a9NIRC;~0&61dV)#osnU)Ms z4s8D8?lbqch1DwjoX{16Cm6Fv{1lmm-yUKgGB0NM5nz2dv_AMKB?>|BSP6^&i4;29nXAJ1aX%b1UAhxHSC-+cXD5g%_?_Qc530(J>o zTW8i?1#kO?e~W0uux>0dl{7tk)__Np`D6~eV{pgB)AZnDCrrPPIc@RQ$DKZ7@P~Q$ z6ot)TaL3>U7Pbo?YS?hYU!$F$eV46)#1(6Rz%YX01S1&6Xs^-MA5!k$JipoZ6g*On zL#iA8&uH8Kcj~aSo`3P)4~qap{`DELA3nWwYLnls8a46T22K5)lfDM+6U=KIICslb zM}amcAY}FI7sI!I$yHFh?#Wt){p7(={u<59?w;i7?JYUdrd`%^g!HRr*Q9ma-dNlb zg6bXrs7Q(5H+=n{H%(qvUH4(M(i0fHH!4?z^rSwQJL{f&QZD*xMd#vlCxKT>^WSME zPbz88^Vb)ER+B?ts|A106Ak>nY_&*}MpN{o6R28pId&v;%9q$wZNc-57m-r ze}Z;r<($i(j*^AFwwmK6Z$7r|nKf z(bTtV)RGmVN^VtKRcGaW&E5CCwa!J*cyY+ou^%sAr4{vldw1vh7~1o%dF4hI=ZfCg zVVxA!keRtuZieEP$y#)|X|opT%CDZ*T)49O`a8)l@;@)%s0%IHc__!D*yc$7*#H+& z^jXHT+9zofTr%z~Td^&~G;AjNMb=!S`nrL%1x5d@ReGzGjLP`8E*th(-Yr#I^twN} zWO>r$GYx%+e)ufE>Ng9HM0@v*lZv|S(z}15UrP7x3>BeNxt}jvY#%l#82GHGEL>m1 zKhF~>J)A&ZuGwGwjD6gAmU=wz2_Wv|(>h=Cxlf!Pi^Iw4=N?7m{itG>~xw1_zHxY5D;L+8`P7JI9GS})>LXEg5!{&=KY%18C6FjUIpzNFw= z1cnNX2r31d;8EZ;7G8sO>}_pyR1Kj(A$-PWh5+US4WOGHrdG-@F7X}#yCbEhRnpha| zFc!ebgpmVd6^u17HpAEoV;77P7zbfgz&Hlu1dLi3^)Rl$xCWyMMk|aq7;j;GfYAx# zD~w+-2yhe&!x#fY62^EKlVD7Np$fwgh6#+BFlNDUf#C%s2u27DGK?q~G#JS+(qUx6 zSPo+?jP)?K!zh8VA4VmNY8ayma-7tD#48RbD!iC~6 zpjH!5hM@z)5XMXx<}j>bxWMp&;SXajj8GU<7|=)z#KK5{u@puQj9eINVQhr48O9zM z`(c#BI0oYaj4Lo2VYI+_4xA!q9?Y48sJ5IgD8_ z9AWsum+u!78tEC-on@p zxz#6NTgWiR!+w1OeK;cE=TH(8h*#gy5o+>8;2{L|4)%Hm`nCo$jEo)Z^zCeoO=sB8 zn5l1SWbI&NZK!W=XYBC*u=f@KQFYz^@EI6d5y8S7R0IQ<4nSlQP)bV7p-W0az{KwE z7Q4HaM&CkN5bc;lp=|MtKFOdpVJSA78;wz+LnL;3u^F<1wLMoL>`EoIsL6ZsO zT!Bc)<8rwwrAjVW$$4U#7!rj-Iai`2I^D&VT%3oWH$ z6>0L6kj<6KL`pfhMN*zZC=&=tO1Vga68Z=vO0htslu86rHc!Aoj>?dIJVYrLD^NgE zsX!>?$&ei!g-n7}D7bRIT%h7}IVvTR$``ZQ9GQr#6!XPWo>(qba^ymRN+ebagi;yo zmy*L(@Z@ZsL?)K9xrkpWknmJ&nM|gDXcb2(R|!QT4$4v`X7f=Ta*mY87RaS46u(Tx z;jzUcWQb5M3iw}FZ;IJH1vXj**>50GFYlju9B}Ll}E&bsYanolu7|x!4?Wca*;^I6Y-T2HczfV1(pl>+)BD~ zS&lJ@eRaB`oOnVd2U;kl0s)sJ5V9o-u9$6^AWlOH@*}SSk~XD#guXIpPr!HNHAb@(Bl<%|qIx zN`(ToT+CO=*&>BlB~i+SN}f!m5XgB7nN)<x0+d>s&QEvl0(u0H z2>1hR7Q2SAX`7MWBR|zNKrhU+qS$t9Gh?H+mWBomab1UE*Jjr=Hj5bP&4@K*(maU1 zNjDkQ2XLtXS1pauDC@f6U%@n&J>z0?W{x_zDhNB2%(eJRxeWQiPTc z1EW-kq-Ze$KJ2APAP`999KKR1lgcDKsTh`$r$Q8RK5T_hsNg~rTP1>Fm5Mo1CFvNr z5{`&Zj5%Mz7s}XDF;9U%C0l@|DUu6S=vjnpp-LuD@MY*A6zCb0Y%!YyYY1y96NzN# z57;6u4=nBoI6PQ;HXDtDCsHYS=-$wDxoGWTfk4a?!GOy6Fmqxl zY&;C9QYn_Ru9}$ca=^;6=#>gAk7#?3PMJl++J`t=tI!Bl% zv6!uri%Cz!XN#mN7;XjhhNV}^gdzmskj@Ml2qVmaT#kT)MviU)nFRa6nSrr1KNNsH1$jayCaURd6IqDV-GbFR<+B3t?Ua0u-5C z#%06C3*;iyBBh)!m9rs4A%!%Bh}b!W1e{6^@{`Yn8J5ZTDvknb$$4z40AKur4k!-P z6ONSFTB%a3z?tqnR4Rc0ou-n@K{pPQEKtZWqF|F!Q?M22<6*nls2&`)l8h^OVv&+Z z#3IRTwwwnWjFAOfjG7MXCJ~|-1Te}9i2{{ZtdPP4vUyx7#^um~BbB2*i3G@b5nqL> zgGwWlDqx9)N-lbDxdfGfi=suHM)Fk((k-&tN_5mBbcQN1ALWLz1RFyFlqSXoQYBx) zMlYjci&O|N7hr5bx)zvPWGS*j%t4_d7J-OM_wRfOIFLA%7^4i-FR2nkDUnFdLE}M9 zfgy)sM^7u_qcpe}!0@=}t@$dE0v#dJ0Zw$X9G)C~8(+l1s71g0 z6iCGwrzwQ!qLt|3(7yx)OUd19%@Y~)whL9KZ00OhU?+JnMhV(QT5_`)Ol$U@Gc>>l zu*p%oIS;EE=kAe1JJZt#!|af(?P`N*=7AM_ao3K%iN_*BtNP;Zo-4`+jUe|A6SS>?^*LP2L+s1)kV9yv~<{fv1w4G6c7M8ydp&ll8EwiuY3(tFR!nLTn%_x@@)g~bZ? zmO62?!$*5OL;Tw;-`h_rclwP>7g06m{Ay_b5z^n4UkkH=&G|+*n~#(&%h|sqbZeXS z`yTIKy!BIY@&Ymqr?SQ4>UDPLd#>l6o&`U~FakH7Q1;mNVVrGHki9+eXXU9vXV;i= zbMLmpFJ?uK?ew;TEZo+6%WMCq>&djA+LK%F;3USy7gDL`{hk||x7cJDxpZdze)G3k z{fc}?)m`6mLQ>>qWAUyhhgwam;SnKO>i)QE%rCq6k1twW6 z7fVb|e0lZC)g-t}#J$di1_Ki_WC2BD9LfjOUB*%w)}2zu~|%ZaDMMDa?rJv9x1vMqT(}ndb7<&T@mz(w<+5`_X3u$N z>N?`>*QHN#Kb!P(?(jaobzJwQJL+X+T3HsQ*2qh49U4lOk18Dzk2zhN7VQ{Zb8M?M zXFu#5JkjEWoyhTc9U~R9mSyqaka=c!duqDNS%+x#zH6JFD-Pa`jtMZanKpKC=inZ$ zf=8M*M{ZuwbGCoo=qj_(dJvOFY>*LvU-AkoY4cUKCk3>~Tv*r2&(H7w=`%8k~;-PXOcFkPFB^ z%P1bsUI4AzzY-2VlD2)2PufX0gh>G=0;k5vs8u*00g3_U9U0XWu$v&GI5;Z-ZIb_G z3?$zgyL!>KIvim#f$6{o;0EvoXnq%Z13iIsU?s2@Ao7uy|MDPZG63>fIA1`R=YaV= z8PyW-1JZ!mz;56QPy#f$k2C<+=!g|m>T%aC;3eLL$^y= zYiD21x%FXrWaD;=qze{xdG&rt+v3xq>wIoI+nMa>N9sALljKbLd~zmw5d6trSMBq` zT7FEOp3zSz-rLyb{lw38$9-RrT_e{cY14MY7pqb^<~?_c!w&F+n$+^Xnw}k^@VG8JulU-HF;sGrtkR9cd0LXcF!O}dpF$qv(t@(lPsc2E=2AwJf9X_ zYkmCr#jl%f{t$J?b-4!?7!-oPH8xdv%C-I7(R_pBjoB_^W#?nxw3wn0^>K0YdwKEO zq3!$bj2W{0&i3cx?cRTNKN2RfEi~FuR=ce0ya3yc%Z7HC+F(e^?Q6Xnuay}XE}gx` zjkzQFpV{YvAz z^QN~-yqHxs@9^c0WeX1{&U;*JA0Qs-b>PkRYvaeASa7&j?EG~(=L%}H%rHfQ`H}%*aTzlB<(O>$meGvCLsI$jxEABR@loOm)9qhi%KILGz z>9OUT11AS}J$Pi&s`h_b6rHeNX+F(s%F1hLLk){MN1riHPqj3UZ{51icbChm5#~D` zTAgmyLu}W``Bj@^-M*)^^Lwy$#sZs~;^6zy8^?uYn#Zo%lH72#4} zo)*14H)HMFf;zdUhQE}=G&D6hIo`2pbc?UQ4orT&f9U=2d#RU(CGbTq4*`3@q@>0{%qVv}W-hPpLDfRW>fPo+Oq}9(@6aUtD#q3i{ zjt`7B-%#_*0p{!uwHtXgwh>tLX*7Hwv&Dy;JC4&@p7iX$_6&F5fzx%(4=i-|t!Xv? zSbP)t4w=W<16Pmxwiy)reSYh~U0;5^?z%SZth#=^xN9x%Uy5!xE~1BTd>CJU!PUe9y}Q{waHU z%vv!4X1p4_Pqn?CwYPOSIrMxZui)B^>btoaU3OWVKeBk!C+qJgPc{r4yo?LS(|y}?H`%rIuK4A#(halj z-5lJ0%!sPt?`;$mOpENd=bSXtX9G*hu`c=QKW6oyCFToXmvjofGS_bEoHh;thgS*r zxVKpPvvj}GPthXA{h4K(xu*k``z~8FamKvt+r>7w$G`vNSm%444wG{7PLwVhT#zwm z!}=YgCpQRe;<(U<`t+FBXwLm(+vTn&ue5%><6f(fUNfI`AJyr(+0zEz?Q1+ujPZAt zo!nP&G9O_g@`fZ!DB3ZhFs%>TPQOeywWq;JROK-+64+^u*9LhQ0$zkI(=5V&Q6&)cb=w zmIXcA@^$`>s`yC$vr2!6AAJ=-ae-545aza`3d!L}H!sF`KpE$jlK}|tZ7kmFn zSK39iWc}Q<>)YJB7xoTSHJx*OMeaGy(>e81#1SR6Yp8x+28aH0p8->gYKbU=}+nkOmh5@mk z-pWi}yVhea+ltx*%-H@Hd;@W+#uac)of2oqH3XH57(^_TX)C zSRgs*F??v=%I2qxw~bgfDE^emZq-uJfoIcOWjT!Q`j9*I+onCLFp+Y6;^Zf*j(=>@ z@zayOw+4UdG|K5|T7ICgY4M%ajh7#8xTM#%>v;}6j_2k_FE5)VwXPB1^k{u)snwF% z_oV9eQGLSAgPTb6_Kj&WYDJ~Y`8O`|x5%PT9$s3yv(B``_xeBEHcxfweWQ-A4_h~4 zh=zUsE2wu^p{Pi0KYM?z%XU4Jng-1%3CR4|!Tja8DcxrG%#EF0+&?L&=c$2vmOWVg zCAC+FANTk7`8+aX%*dV}mO8P{pH}QJXt&PYXXxgdy-GumKE7YqM%DLQN|7QW_H>r# z*YQc=|JC`C=BWWMZ=a5xeEs|b0y_r9THy*;ixfvOJ(=^rT3NY*@7LLL)oY2V7hv2~la z?VOxlhzhiSOYhXMQBmFYAFO|C$+7wk8Pi`)YFc~i4YL|Mo?E3ge{FMStBFzH(_cBs zru<(MjwFjI`SXxj8v{FClJ1$o>1HvjqcR~o4Et$z$>6%EBq@oxvgk-@w~(x)Tz*id zB)X%*H!5A}B~BD21a`{IiB`pArV9PKB?tf$3o#WBZ0G`v!H6>J#P{ zmgbwB)4n~{7-f-}u|hssK7@QcK1gP;`XwXOt@2erEhknCD{*T5|79&SfbXB?xMuJp z_qQy78UT6rgUkH`e`GJYq=>o#&4e4IT1Zy*Th0mK36 zKn^en7y*n2rU7$-0$>%e5!eCj2aW+}fy=-xpa^&h$fbTtUtb?AvEg|bJS$UyAmLUf zU|w07KnJ0pq^T0B3XKj}g+_-B391sXB7qJC0(s6yryT9p>P6f-mCAWEv6QpvFDvL! z&a4wo1Zv&7NEHxHa)X?e3S~t%kG_!k26R#R1bbJxP|1XRO791$)f}Y$%on08fLbCs zl>+zz6M-c_xq?uD@Dk($o*gx78l)bv;4V)l_(**ue20L9YWQ?HMdpcwk4#=CSHoAK zOzHI-A~zq{RUI$MI87GQ>pX<_5b(Gf-U|6ouLlucqJveZYSKiiBC?LmUCCNVKHy#* zpSIvgn7okzZec#6IcD zZ}Fe_D-k1aU#GdNPHlhkY zyeb_;?+YkLR|y(8kO24tF92)o^r~z8#6FWe_XG|>CaI4Ei{buP2a(T&ES>!Ma1RB3 zR*Acs{)NPG2*|GxN5miEFb1DJ@}WC0 z8~6xZ1M0iUskVULzRBcZrTZ>j8j32&KLod)mo|-bA4l}h2WkZ9(_5KWV>d}(sH-#L zD!lOe`Gc=t0xX$?KdK5!AKLEaR)<4R9*^iEcu`}6w8fj=)0DQ$?Os_1_&152x_{)ZjgtnHHoM@# zzN_wa+@j%%hmtebyn433#prgub6B$9xSDh0zMb3Tlx5wP^>*{{IS+i#9^nt_Ym~Bc zHRn=&=8Zbxu95c})o#qKHNRePgLln;DlTq0y1n0&mZr~EMSM>TTvNDsV8NKESs~q< z&M5j7bJ^+`<-PP%_MNeYCAZBw+?zhC$1sEQ9VhcL<3IkjVDQ05LGy05Iwd;cHe_a6 zCz}J&&d>8!j$f3zZ({2YUv{|s*w!_7wsF!^Ri8aq?bpgiFPZQ)!(?~p=hy4Zg+6T( z+{IvhNNo^dJa`Rxb85P+evn(@xuA8 zXYBje?4xe>`G&`W0TH_o>>F2)?{_p~#@dN{`fWAXwtmUFn{(?o6rB4sC$ihKmSLU` zqs@2+XU`gu@cpIv?X=*irOu`s9XDki*)MD^j%g}sw}Smd@niI&*ipUTxA3;Q)cMet z%Zoz`q+jJW$6QwJaBq9~*Qw>KG1O$QH!pV9H9o)HdeGk1wRV{>=S{bZE4lFMsoT%N z$CrsV`%X!n(AUuE{>)YbPxQF*F2J_K-Ml72rGKUL`j)umEvLrSi{l?Y~wDA zr+nIeddc|9lRuiQbeOos=f1qhjguZ9CdD^vkh;<3(TJMCZ|BFpSh`{1%Y3KatJ(@z z93Sb&`wya*T}0q zxcSqr4{x_WWzEbAVGr8o7@81xpzs*yY@7A9&ZPh1CYnZ3EiZlB^GZ1+GiCUq*By^K zA7+%;d(YXuwf~n32OsoleLmSHW?uAyL!EXmAEVw}|NXuzs*9ptUemvR?>_5iw{`Bm zhJwFZ?CO~`^_rcc^NE3yVRzRI$O$uQw5%?_Y2(j9tUAy4-+Nq8G`8$|zrDqt0qO0w z9(vs6#fBEWmCIiRG?_Ybf;R`p7CnWxE|(LGwz&|HEZ)6-y?&Jc5>?92#;*kxK_Oe%@td=PcdEfJ+N@#m|5Lt z{JMP1`_mo6+a0F&FzCpO|7-B0d96flGdmq{&KsXP@xzWEU1uk$_Snmod^HJuZSIpG zUgp^U^x@+7Cl@ks5Svhb*0|_P_~6gLki1*b%AuuweLRTY=-01?^s@<7e#ko*(72p`SID2jkDh}ELGHc&qux6CzlDbf>7R5*d^|@SGBYvLw2N_= z_lpB^v3qixwQmOBw?FS?@hNL5XWJY;W9##opZ%X)czR==+3rhyI~=mTG2k@&;Jf8% z1E$5yJ=bF3uX;CfB&_YT<|~b{T^Mu=+5;_F8Xv5 z?tNQx18(}9;;dcr?qYns)^Bn>k1v0)-NbuTE#rEDrWePJ>lPgz9Tnmc(#D&;w%f6S zC7xYFf7s2qIIU;5k@GJ3K9R+Ip1R_m^U-UfD_xKBXA5r*FSc6$AmNx#$;GAWLv3w3 z`n9u&7p?QSEj(MAxj(RzXZq%y_uJZ)1{ODr2yH!Z<{2LQeA(ua=EHP)>CXSWzw@u( z-zi*hWbV*9k#kw22K2qt%%X!X-~M#I^Vi7TR@ti^eIcV)Y* z`o+N!Mc!4zZC=pq{Mqc%(JsU1Kk^%KF>`)Nr?x#7WR?Xu^;~da_L%bz0!PlQ7>1s& zg3uDszrRyHEBc$4c*^;Hdy_}+Q{}ZCrpA7gi5?SfChRxP6q8m8rkywlo$$fU1Owp# z6=(XI@DM+M@Y7!SAz^4<5{&SYaI{p=NnFHD__XoTmqZ5f(17sKap6*<6N!iXYxE#A zjm{*9Ha^6olTYhSm`NnGOwCCXH*qsq`BwRq=8u9K%vKZ&zbwisp9MPHI1?TKZu+kR z59ov!Vd0}WXqQ$N!qf6JeuS5}Xj!y;It1Y*@loY+wDA#MLdPEqF7Oduz>6cF{1Dy9 zuQn{X*2-XM-S7hgj(jbzhEC*wVnvw}V{c$UrfQh4;cP%p+dzj0+*$(8gbo6D2@P&j zIxOgPU?M{!OXElT6MiC=_MqK_m&l-b=_u*AHSrKO;-T@U#ga?HtPP{lgXW{@L?njC5!l4dEyK=Z3Q%LTv9C1DdHf!R)i5W5J1N- z4nl*QMZ73ajhmK1%OWzt13LUPVYF_LNf=Fh;MIgB{Im=@KH?@kgqOre>p*n##08O0 z&g2>g^q^&tAbLNVj`(RAI$rS6aj+nkGN4#Yv<4;#MT&#C4NT!>O6V-m;l^PAOA3$! zXW|E!mKWC=H?g+xqr=kSh?|xPxip=~AqU~9aE2bVEUj!JAHK9)niu?Z9GZCb`f2sj z=&6%Q$Dz@k#7*MS>YrjD`XofEQt5C!W%HiE<*DpB;qE~;>{S^&kAnvz>PCS zc@hrdN3KX1IyB@ES)glpX(sxI(Db~tToNbzG;(z^HDMuN6A!Hm9gYsK(UF8fe6;4^ zqxIDBfJ&zUf;DN<=uP-FpwmRSXjv44Fycou5}+q-^hNp9j`-pa{xlbHk}GnMpg0Jf zoM;ZhOPn;1){`b_3EI%~6~lmOVro&-(#oc8J==zjo3UEhw`$#{oePJ{7m3~4dw9x~ zDxZ$N0iAXs*zuF5Or1V!_PhlP3zjTf zxoYkD4V$)Z-?4kozJrI496NdH?D-3YSFT;Zb^GpvqT(kd&tJTJQ}*utr_bMh{M4j^ z!T6~?n&Gg-QG}xm2csGOEE$&C6N6ENzcNOd_Jn|%KkbRptf*O$Wtn9ePR($#Z1%I+ zPfPsaL_3Op7X2*4A5OGGH~-R3BN>|6B%_5jKP-1L=9T_wIrQg|&R-93neK47XX4CL zU%i&BEgfbr>8mhnXr9!@_I=YcBRUzDEb9I>yi|6t{9lF$I{|u+XQ`Uhp7uD`kl3HHsaE&;S&8=6Dzv*(SP^0xQ409 zD06FuoVoy%06&3xnR3b*aLUF#IUoYa1ttTl0CJ2@>d^9v>CzF-V{L5|ndyej#b(P2 zIg47){_1QxCfWaGiJhY|$EHwxF)rjla*gNwovqg$x)(U$^!97RJJdJx+J5U=y{V19 z<&B|*Rr9mLf^%uz_6M`?Wc+a1`JiFptBntL%^cJ!NjZ7Io;ictm3hr6X!$95%GO8k z7^d~UPaJWRl^C7q-=)vepW({}wV(EWQr3)`;X5W~gr6VR=XJ-rLz^rM>A$^ewr`Gv}F3)&^1xBy}NkUc@~`{ITO0WYHb^Sk8|5DJd@VmI5MPQ+VhM7wd=gz z+Gbx`bkF0f+kWIU$g1bj<3iJEqvrAUT;JH^V$0+q!Q6g1BWF0y_MYUnad)TQjh-Dm zHqFj4?wr}p$SJGszD2AX;LXi{*|TTQ;cqr)k9cm-qSf8ejbclOc#LUreBI0|f2F0= zlE~f<8>+ByX0nDa>-hFmVy}747RnM%*v(CT{xNcXjrg~tudKbixN}m1OUO;fm9=Ir z<#k@0Z1E=bv0Fczz_)IDX1Dn^s7Y*DL0`s3iAUEnaicBeLv2UC9=~l-n)2xK;R6r! z8s~O1JFO^_b$G-gMMKXONr%It)?D#7&gme`c<{4PdxLqhmNyDT-qz-YS6=Iz*Dlss#X@ge4pfYpbOMJ)0>vam<5=$1*g z8`HieY!6QMDBU8lNqZUO)~qw0-kZUmr%(<#XSToBMrL90fgc@t_e~sY#cl26Y};kk z*+aFmPAMg7i_3SuUD>_=P+q7xH=^MQs^EHFMmx`+_KV`rEp7Jg^Yi5sKR4&zc~CFg zy>9QwAE%lIx~vT{TK{!>dv3(27C*fEbApFHpgi_=>9KI}__Q<5VWS$}Nv!|i<0{#; zqrV0@p5Vr>%M1+|zsaF{;;Ha6dwVYZ^>A_Rx4UMy|7x{snB9-$?cY0gzjDbb?{VSYr`zxDJ>(5KyG&~HE$Z2c#}{s&VZCAa<_Lc-98|ciSy@}Z+jnNn zo-%nupNZ>VEWS3acj2Xpg+=x!H@b9ppSW{+_QY?GK2C~hYyHl8*XYrW-`1SGxYzoC z#z!Y5Oewo~Y5n0-ysp z^Y-;!7SWc+{@S@xY4t!$5NT9LYb;DePuyCPoCkK6KUQlIf_UjC{- zH!(RVChXzD%}16S2yI*Ynq_<1bY1M>+Tiir*&!Wb7s$F_e>|!8^$wrrn9RRi@PYm8 zO^Mja?{H81wK4?ppIXmqc0O$|EqPB1(DW{*dm2D97?(vx}*7Yt4q`Dk&F zQSkhoB9p*1jfb0f^w@BJ@Jq$OiM!s_>ms`Cx~XQ3z_-k1jo<#-N*Of#P-DZEtnKdM z{f61^w==u@#b(N-k1neRWO{L@GrT@DAM)gh>)qQ&MEt(nPp!Q7*IZSkVzs4VVJ(l7 zr(Q~%W-ps_Ui`?#@`YQ$-h3`+t49OzxDbES-6;WvHDzfBndToSTkmR@H(*xFj7@oA z8^>(i*DPo5eJj&xx2!je+v?om;@xH$)}bx?^mZ<}*D!F@`QeKic!l??f7>)`-`qv} z#t-cD-1TL@mtUKVxDzKgi@tm`=9pK5#&1k-)#ZxZd&#dp0jSqJloppvM>R&_sOL<+#1w&H(TDa>#LGU@4kL3o7L{%o`tFI zb(^Lui$`uwd;Y?_m*vQ9kI@{~sORKtzBH63X+05J@S=#g`-|%9z;hM=kGPg^Xr2ASdTzIX{{WWLz zjXd{yWxJ?|wLR9(PaXc(mW@rv#hiJ&-*$Imi^YL^yTx+5C3tS#*2ewX^M#yGyX+3x zT7=A-vsgW9(40>*Rt;<)HFvb=bB_={gB_>r$1e`dN5czvr* z$DYMIW1iLNX(cPN@nG$E^ji61?V6=^1Cs9)2AusWdoMe=eQ(m6CT;<-Mt0|=3-g-Z zJn1)LWRh2>$AM8p+P^D^x~OV3q5I-tqrWfRaq{rdmURbD%{rTCF?P7uh%HmYsDs_j z7I@pP&)OVShq4^nqRj+Z_=^vrH9X$0ZxWf_p~cj<89eErX%os`s;}R1Yo6RybbmlZ z*6Xt?-;MB0<>p)%o^P^ZVc=)m(3@|b31;1jT(dH9^%3J5$G@*-cDsAVBHy{6V&QPU z@~Bb#wI8P!HnqHRC-ctv(Vde7qR zyt-4qF_H>&{wQgxQns9x6<}A#bM&}_O}@|Y+c;(W%q#carz>3+$GtS$cW}h4{f31p z>jpDNoaJnFD4i*l{0J@avcEmo{LEVW+(5_ot(n2MN47Knma^k{RGqsCRHFBdWrr*i zUQZ}+Sn{(&!1(o}o*5U7-@fDe`+ftOURd)|ExIyiY3>DCo8F#+g+E!lNBnhb?G4H6 zasJkBpT3@M64oH46DMwIt1YvNUu1nvb>+&t-~04bn(&R4d&d8R`L|hHf8Jad=Bad; z;l0PzH8^zCgkh|mt9$?KG-GDrzW7z4;dAR2M7Lgjj(6wboUo29Ra8&-$sO zdzN-qb1xm5cWu()eeYrfwWa*r{`L{`+e9pV_W41hRabJnJ&xr%;#ejjnyde!H9r3JnZ8_lWNJN1rL zX#W$UcJV20S7RNR&kFCJtl7G3=`ZTs)LN457O!e0ep}Q(ZvMbK7c4GLS-iAY-CLtw zZ1%QX-@Ws}yy^W*ueMRlEb*+7F)}vPWP8{d=E7!{s+}b9cIOm&f-MGv-S0uAe zdfIvF&XT&X-&ZLG~xU)H$Q=Ed4;{_z`Q z)T>6`9{v2_fuBbo$8^cxw_xO&yDblFpN+Q`*CSgGx0~}24&8<@4_3r-m+nR z);4`RN}9h(-HUQR&}DH>%MH)=&ylG@Bb~z!PI@2izvRcgcj7l$?~m*sGwSG0P$5ri5M_?|a|i^uu))y9dj7tiTv^)t0ellHqCK3KNg zqSm{S1&L(|j>B&6y!+Ew(q-O-M+HHH&j&Di)eihR%y{Lo?FNe-3QKA_jQ>1WI>CS9YDd2ix0rtKNHD+Nkt1QR&+fgyW8dV0 zf!|B}HtBl7?6FbWXvTm}?aebJEeA{;pw1{BxqE?M#CKy$Njkxg>J)tvVx?xZ8A2etPm++A;r!VHXaz5sFToxX0(tySoqDIHIBjV0U11>XvP(!X%fq-d*xir|-Mmcj<{!M|@&mf36ig@csl<6Z6b# zC;SS1@9dSd4pi+~{jAlDbQ_`dHZ=##O9yxc{kuirpI=7UsF>Jbg zS>e0+dm;}F^GkX@FR<>DN!Po_?D?{!mE%KK*Oen@tnTzY3i~|0aXESWQ_!cxG-ijc z=3jH_u6~@)7`bWG`VzBw)1G*^b^9^-`K%lKg|~LTZP$5RTLag1*Jch}F_3ZHc7NH>VOARx z*VXeGjrA4t@jQoV=mrL4&QK!)%f101Km9*gf|+@xO{GJ@wVQB zl9t?4{_5(gFc)}SJHKt;stYeN_70Evy1_bbf>)aR!RW{HE-&oq64EH=$cFT2|Bn-D zT4r^z>Hf4&y^PO22L^96J?rUt?$I{?B-Lg9@QrmDj?7IDo4C%Nv2D>VWADYO7lyiZ zNE^DACFs*?{hQsEFx{-G~Oncfk&voy9dnNy&Wc1=rc^5kGJk51Ey{FmYL8lrQ zeY|vX-_hEPiznASEASaLx#8UX0awr7zg;N4ZGNrIQHf!^aLS1RoG%js+HNk|*>&M3 z*S#O)zih9)o3Fg((60HcgKfT-)a~V^$rxv}%uaFO$PN zY9tvI#|B=uk}WelYnl48$nDPTdIuKI_KkU-%jM2!w&=msD@ASji?1|&*Jq40%e>Ke z{?bmYJ_nB9-6Iq7d}+Z?f>rRkKi?@samU|9v!sb`|MIyDRO9J3bMkl0YP}oW&I~IC!XZ)Yv}NP_bhPqM|Zmv58S?bS%pQAD~6jb@H7& zQt?5hOlM7=w8dAlwS4aFf8)u*W>M9K>#hss#Odiwb_8J|v${(CeAU6q&Y?JNBM?!`1*DNdGjJNj(p%cI3!3Z^>b4C zE5H+R9`7swGlA{EIiMIYxFDzO08c;-3<4Ga`+z&ZC&1>SoN@s=0p)RNr3Z&dgF+}f z%FeEuc0@TlJ5%8uElhx#e~L!4+yWRsK%dY8vm&P7twooYw* zr210>sScDYMjw76t7(b6FpL6u>%V-3kCxpDbHY$ z53FIu7CSp7N5*HeBJtt-^3BDlHdHIh&YgbOyum9uW%W`{1ppI)Ge8-D-7eBn((#2I zvf%}t^a^D~BGDK-&8}P8ucc!{$gDi*Qq@~yU+67j9PAu^^Cnvl{m~QO@g^TLXGJEb zBSx6Tj701&#fnbAmXg@~Fe8(dmYSSL%hVX!YBa(|75MDFrcu$GS5(ngW19cW@LTwQ zQ>owO{+j_w2L4H12dX(f_Bw!+xy}yIU#TZ{K-+#A(!0M*DXXGGoB%4MVPL7HP&*vJ4ow4e_ndegf@u=JKdlTU8= z$~ttYz^dWHrl06Q$wnh|IiQUqd;ZIvqAu?=S*FiB-MFECv;uoBC@4Q585jo41r7tx zfLbx|2mF8-U>L9j*bUqSJ^_}o3d$ak0HHu1U;+@6sM%lusfuBhn+A9E?6Hw4PIPOb z-}n3jpRRZ{8b_S0CmshU2kf5{gQklug#HkHbXszq3I>*&x9I~8QG z9C|wZCV@_%ZVdBx;RpU9yiS4YdylI1y{b9Y_*b&Hq^~I-gH_jNs`j40eo{YwQE&Dh z)C|;F^oKLcEd&|K(<6mH4DDfTP`22~h<@QQG(_bjMmx;HezqE|u(NF}s{*-vs0e>e z*sKg}Y(Oem1umku&OceR-Bwy0D^kl+p65CiY_>^%;IrJeSB;z_)Z2Y3TfhG;siK+K zuPH5_Y|4YKE|SDc`mb`m5me8S9+{Y-?`*3JO;N;BV~b#Ygql8-^c>jUFfAuGMsI&J z$>tUnvX|0MW;Eqmo*e8eg-@L7HeJ(fB8WXkHO!iJM@u5PNH)hHTSp<0Sy~SL#w3;P zhJ&lFQkI7%U#O!$uu7T?d0&;x>zq6^L^X(NZ5qgo$1VfIeoT;JD2*A=l?z^gC7bm8 zmTne$V+_wSHEli@lPukU8-o80ZaqKU#r=H?~CO>dODZu^(Yxm+$z6P->MeI-myOLd|LDN(Umm4_&Q zut_nA@fe;FtK{sUuV$ppRH+M*zm31Zqsa@@j*QrpSnSV7HX7A!(Za$wDGIaj>TRKR z9~T`HWL3`xE%4@ZdZeb${#~ca!}q_FK@wUao2!b$08cYNuEv9m-u|GYKEsK8?eMTd zW>(UQw5Rgk*1@BiR)e0i+WaRyYIz0tgDPZXt5IIx-Bu3wn|Bo(UQOsf#6{$W2Kf+O zE2R)L7Ix~3OvhkJW4^WZBr+APHX1wrpo6W}%vZ-(tx4C^J6az0Il>-xz+`l81eCg-6n@wFUb2S3W8# zSLSyO`edh({nC*`M1|jFkeLX2D9u1j@2@d9nvB&e`&)5VkzS>2bjq_5Vsr6OQDO@6 zN!v~}Y58L}s4Y_1TMXV7cT`fPo&N8@SSz=FHS!&+p;gr*<^Q5?RpTPp!?ikf)SlN= zqvNA$XgXPv3V!ig_aLNUQiXJUfcr{?YhBoi=gn38A8W5kS>1x%BiidixPPm+)ppN=X)E+-qHkhaG8yz#XfOJ43BC4Oaeb(KIjHigY&jVdH2Omp6z#7aL*gOM z!Ag9SUE2!C2iej7)Yu{tjWxp&-Eh2FhAF3ho4Mn*in zo{0f%3P~3|Hf1>~0{o;t{;l=iWRjANmPs~9bPV?Kf*%!t?us6wXOQiqbwLBdltC(d zJ)t!f0;7%{%(9cSbh{;HqGi!0D2n*d`_sahV1JiTe}yg-MTMkgp#dhRVW(%(;<1w@ z_Fc!=46CG$A-(~@!H7E$`#dN9ktQ@ZV)?bET6LhlI(ix3~{q}_FpVzI&!GqPYzJ7>pYt7Yvc^2xB! zK86*Qhn|^yFJHR}HOrn}=PeI|O$W1xrPqd{7gy+^H9OZnmx63vX{Kk!X2+x|^N7-TqaWD2!w1Z4tG+hi-dOMK?6>o~NggSN0AK2Jp^ZKHekB zhdUo`EPBz$A-qNSKnmwYa_LTGQ>oaMCY4H~a_~zg!h}&uW#TWE!s0iT2)|T{Ma5w! zn?x!Z)EG=^&G8oq|1|7tlL4O;tf{fEKTZz9nNun)r=HdhzP_NQB0S;CrX?t;Tq+&m zW9j%bG3molx(v{Ms6gMkR&fip6K(VWP}mrC6~LB zrqfr@jwQ=ZM3s)pW1$jxb#dx~N`#_GLaDZ9@twt3g~T2&|M35lKmXK+f7;7G_Te9U z_)mZFPyhJ;v+)2KNs)s=eoh!syR9*{CGP(PM_`djc`9B$Gogweno!3o&}zIep+X*+ zP&Yx>9gRUtDAr%==;WLZ`XFFDungD-6apo{cc8{&6RJ5N1iXQ6Ko&3@SPUEht^zLs z<0mFmJ)jNX4Fm!)Kn5@oSPYP36V3;K3&3sQ1@IlPDlwrN0*(L|a0gU?KM)Q?0jWS= zU=T1Cm<}uiRsh?81Hc*JDsUGl0bT>20fVO|lsRAxGzMA%?EpUD4k!SBAPk5Cl7YTJ zJ}?%T4lD##0b785zzLubxCs;i&wzKpcfc6sV+Aw>S_0017?1(JKo}4OkRw@p{--?t zzf~T=lpKozvEJB398b87qvW_7kQJ-K?Ncdrl~Tl#J4te^OpvAhVC`+nHxvY?d51q;LlXQ}O87%uMR|?=+tn>_)2R3`rn&=|H3m4M6q9?(Ry>VoM!z?Uxpl zolGm_kNX{6@YPQ}Rim{OJ8lvhiBh|~fHg=$2_`q2veSK1oW z-dFT3C$}>6jm6&Vzvb67Lwb=T5Gy@t87X89hE@P~FzPddW3!a0F#&NzNs4Miu8A`+ zjjVWOD6yImPiUd3h#4gpgUDj(&6~gl1}cjgoE#gQP7P&-#Ac)5nm!rG*GAX#@!F>9c!T0rY{37JYhy1 zGf-!y=A>t!Fyas!uCg-lTnF_R?MjSJ!Mc>nP@SDhOKr-Gj7rPMqS`Xih(N*4QA~~Q z5@wuMcQm7bPKg);FZS#mNJ#*8c1HXLs9a4PbfnV3m#>1I%=aA|INrNNb*j>qe$QB1O+ zNVJ{EOo>gQ(=>^8rQ_!6Wa3Im>l;f=B`(B={dAeS9GS}`isD%%Y94WA;=7Mb+$cvO z72uqTw!VZ3)oJl-nPe3*GMS<_Ff+9Rb}*5l(Fw@=owSSO=Wg0X;yy@RxUo)AM~Ewx zsCHE2g7-P%%1VR0^BPxnGF8m%tII^{BQqyDGn&ZR%kYDV!s??eEfxGrZ(X|3hS-c|BgiclZt;k2gn|q1~fO5{!O2x z#ADm~L*u^%1dab<_}8QtLNq*ea5A8hjdcF{kpH;;C*;5ey8MWyOuAG_`OgKMon0#a zXJ$mZ#79Rv(YFL$@K7@@TrjzaON@6(#17Oh(RuMXiK)(*-n#Y(!2|j|QZn;0h5Q~_ zaOU#3PJA)P2@G&$CM73fr_~-&SV@lQQ7*JcqEIX(H?f^Cdy3EDaeHWDp}hPgZ$ATlRSOf09k)HL!~baZd0bj|z=x51s_Vs%r!OqwIriOedT^i+ybF{j|JHnTKw zaPb8A|M48swMlXZ+<;+B&javTr|eWR(8m)Am^D!bOe6YaV3LW~!?IXaJ?ZEAXbw{& z+N~!rO~_4mdddi?G`(_YhH3e=CT>$^OjJYJX8^h=xZ?PfI7N?kwy(VMuxFg zQ986?u#YCLAwtwh!%*Gj&{pJ9q4gZ0rag6+BOAhq8JKFct42jrL(OBlxp+^7*2k)x zpi`+qIi-@OR!p^;4ucH>CeVl-sMnm7m>zf zl#m#opu1vH#-;`@7&pOWl1Ul7WQ-#&OhgP`F@6wkQ$?5TR6H6%8N8-NnIWc_#J-qL z$0YJ8#z;d81TZ{hh&@|Ub(iKb<*tl$;w0V{sqi0dc!4-$z%WMR%*db^V+~3C7BOs! zG0yNcVzr3jlsi-P)YJ-8v^gzrA25v91nUC^tuu;ZOwbUcQp%k{{zjDVPdXWs3v_0)~)a=No*#H%a}3F48;}>pO8?0r5aOX zwXaedhRUZW28ITEtNoOI0YP2y5!`a#ZpxqlwK6<}ysp&6C&XJV#XEThdjC-Wpa5UI z#u^gjtMsP~^&YYyslVJ?9T=ok_{c+i0{qq9KK>!W_~vf8Y(+q*%vY%ut58rzdM~14 zu+&>c8S80&0b${kiT*keFC+R$ebqrqFY?-zuPQ#ZmOwZvf57Y)T*Aq#+ z-adYK7gw$F2?(StDtiT2@TyVS3)-<^7RnPxB*}e4@PboiTDaWXOGeew6N3YNeL~c} z0eE{BGL*siuwuCoywj-wRpF!Rs_qix6QZPQSL;bx>&byZ0e%4?N_A&iSIS23qml-P zkOEQpgj03& zm#yAQ8+{;RZm6ef>jt4V(o=Q3sH;?CJz2+0$W8QQ)HkJ-KKi~iWNwq z3`7-I`pdh*QkLg`FbeSxT&&7mq5gQw)XQI~KuMy^0s=#P{G`5=-JiIELjr=7 zvjs}!oghh@S|9&l|8mY2l{qz)htBPmm3>0G1}c4(!NDk3#1u@~SN0}avemM#>cH@T zAgYz#Q)2?uem=n{UNm4$%W}{&pp<T%{cK-pW9q-@IGvy@S1dR3RMP zqbSc~(oj^YAf+-8Yu@ElQg%V=P=7QHO}VwJ)=wVbkEdLNVP1kMCq0KMAT&tbG1M-)YvdB$h1o?VzX;^@dLLH`*qnOl)k9-C|p!e3bDQ%PU z@eB3E4T17(3dZxjYC^=1ACF56I3@anx0n*^eMqLN{W$6{AE_D@K%)2Y4+ufN2TFZ{ zq_EDEYh@peqNF`hZh9Y*f!ZXf0!cbiC`hJzwH)Q%?e*R&+FYW%(7mWNT?gf%_eOJ4 zOT9vIyQ4hin&^DGDbveR6ae)Zq%e(y(xh zj>{X^kqTZgzrn!)ay2TWIwXKt0`xLUU+QQzJVzazKT;Ag5c_i3&`4OxvN;#BeEkVog6zU(15KNCUOKHcgOXKIr?@l)(wpmGCq&OfOIpKLu%ZI=_=z zzX9<3=lCCx1B}{~m2qu`HN()fk*U3@4VkMjYBS)nAQbo*Th+%nz9nU0;QMgg!UC5@3|t!3)c6_s*od*qpmBYM-p@quhsmy12pCb%oFRmWaIp2U zVObDC=0@d$FiGWCxTs-)N?EfO)FDAFTT$dx%bC%^Rxg8S?b%?K%ogvI=mi;I&(hjW z7#y1*Mri$Ti>^qjwGqX!X$(z~ZjOxs5?Y6LfU~XzxG<^X!vhmJaw7f}GpB0CFe~K+ z(-B%X#$Jd<6*J6Or@2X8$^rVBG8jHKB*kWSNQnznG1sTIgDuhd|LTzm=>}8)ei@8! zmNm6s2q%xa{adSA6_x<;F0*b85TTK51G1KAxP-xI-n?rkc6|G;UD+-k&6^vLZ=?hn@IB+Y;j=;O3~f5LH#847{7RWl#3=$&D{fwSTK!Oq>S>r7{XECBQ66F$;2#DB| z$;>1fnPkS92?VMZ6|GuoQEA22Dz;Q?y;rKJ)JE&AXq77UR$60=)_SRYt+m=x{e9NH zud^pHrujYJ=a1*S7&7O5*4}Hcwb#C!eJ(Sw-^1ed`(8SFS;!Q8^x_TDT|();(YI{i zpiBFe4IFauZsh|<_9@$I;E=Lk4IEVV_`m^WPYmo|_SnFF6?>;Z%R$Q>TDEt&L(3ss z4%xE3`=>PZUb9sQeG#aXRkDPu@zj@d6qwllv=^weO|26%t8gNZN+DizD zY9T@2mxz6tg1&#vIZog4$dSpBzF&mT9;AUXq@62-fXtA-e^czs4C(vT_?QH=bE6QD z3F!Lpj`+`-XoQu+E1Y5BJu(#{ULin>CaE_>4UnW zzqiZpi*%774I;J@{4a|zkBUHb5{=BGKcod24A6E0>k1&OeGg1lD|G|t?~C|EBWKW` zm+={bQtWsVwplTM7O@ z86Ol-1go+^xad*E=`ZEI2V_v15jX1G4cHy3C?<{}iMc5A;E}sW_U~VE+>pqa0|u9# zHe%SwJtJdB9B@SRfaBi#bpP)TpZnzzC`SfS2 z_*zYWs9bO;m1r*%0AKM{-E%*S@AM)N_k*oSCzZ!4uL(F*7m=?m?z_C)gdnStd zF=pC=SJ{Hkr}9(b`$WbH-MhhvzLBM0H_6B&W%xuRRrE(j-WgO)tMTa*8Dk_VzNks< zjvu2zaNJ1W+wqA;=F=b2qz~x|)ce}Jqmi_mwi&hak?%r$cEjVBbH98eeWgZ-7D@%8 zobgpF_;RFs*_+(SReurLRpWoL5qcdTctnE#Oa9*j<=7ja1M#71qSBEkmf=Hv5sm2= z;BzHDtMMWCz=%j+e5l&VM|{3BE+G!>0}(tLw+u6L$sRZ(n>Ok-PC(f!MS%)FsoVa;E#Hku{ZB z5;{hYhqq&wQuQGa`4c`JhKz=L3WAdiMf$&R>?}p(pV4?>NlX#Sqi>Y*=iBId+^(-S zI@&i{qW1Wo_pwXI>6gxBKBSdzyRb`EbS9%~`B=!PT3*&j_gNf^+OAJF;?50nx@gS< z4xkq8X z<}%Hprb3sLOCck)<1g;}2C2heOD+IeZ3y0Rk!rzSo#!!0$ch(mYzAcP_IW%u0?DMu zYy0b1N6ST`#TC^Z ziL3*^3LS@Sm3M;toso8s(fhbEzXi!N@<))@8F>ffoPlntPe4ZP>yrHul4H@pr1k(U zCup5CVYNeIZA6|og#33fQXR0LPDKPi%Mxj0WHQJrjLZbNaIl-|Opq5DSq$=9EE?(Z zAQ187#23*0S^u;`=4eK~4l;w0D?n~$Ob;x%734`q?gcpm9lb73 zvYFl){OA`o(LI2yWs2t<{ChmP#B9AC&mE{m8PC5lI@~W5&$Zo%=R1)|#xuQlE?Ec% zG`073*l*+cVeD;V+lU)# zMP!^ymJk{5l9fazxa1llSlF}Le@Ns+m)s3<8)`@N0B8}#wg(~82NO-zOVlI_r=dlS zF@(}Q4VeqzF)2gj4@(+-H@R%iiF%_E4$bleNF)|8dGb1O1e8|Wg zkTLMQ&G~GQ#f+puZf0Z!$ZL#z7i2i<%jR)Jt3KOF_06qU&9HgX;YN^!QDb)NH+7@1`!IAJQn~ZB*|Y zyHW3NAf>GLcy3v?kO@`0xZQGSxvuvhUdRRcrq~W`dnfh&4ftoqRM+!sK|W>VCnSTH zc-h){5abd@wt9I4VXG|{yzZKqmZxi3a(5;R+H*Rt_^l+G7N7(Mz6)$)#R)G}Rxm9h`BC#9ApY3zXzGc$lpNf80m-kT7i+FAeS*R3glTvP6j!k%GF*CGJ}yi zkY+}5Am3%=QjndeyZNjIIkd(lKLIJ7=aR=jmY=DKj!ao!6q(ig%5_0oYrP$rCR(D0 zBRclBiqtoX%pt%0>~qgUAtxiVKE0d=rO1gQbINobnZa!I>A7W*%~<{w{RWN}+qS_! zpJ&vU+GCWa12U5rx#S&?#~Aq#gr0tveU$dI)J}fhg}w(cHP1^QO{JaljmM67;DAh2K zWP?k-406r+E-3@qa-mCVLEdGg0i@=euFNu!PZ;?Y$dRjDnID17Vq_yoo{`5vzGsN8 zQ)wyH>BLcy$P3Kg-mX*Q=jgA{PW_GQw9t(@t%jWK)r;3@6Bh1lul_u2-+86-7_-rq zq60D`u6DgjPeGix#wC5x;7_>0CBr}x>of^YnO+-IXPTow(uDFq3Nq*X*d-G{cHiKV z=^&FCsRc>>)Rn0RdFD1vbPYXSk+z1W0XT^3u^G( zS$TQoQ+I2xlE6hsb@0zz@*R-HjBEh;DI=Rep1a3QwFPA6Mwk2^WZ=Cn*$HyZeJsOz zu)Twkz4igQz?C_i$PF$ziO54PsUq@6O=N`6DBG;P3cba)2Bg~SS?zh5YC+{ZLnzHM z$gF2%70BNiSqn1#w>lq6bt^~{BM*W6?0HvaD@bgcOI`!{^mi`#5M<0NE*U&95_#kI zE;$6`r9Zi33dj%s;*wgBbKiAI6UgO%bII30s&=|$HAwaQF1Z!ttq)vsAINucWzwG6 zJqGeDE-*`ib}^^Cd?xOccSw0d3{i;-)Hc;iNL9+ndmy(k(q~_K!JnIIFvxgZ%v6wfahhbw9FXC-+e8xG24(yps-idIymTFlqR-O?>(KIK8>HCa zn{I=qT|^h%+}RwvU;Agzu@CQ~+hDS-39myEKS<-Kq&8RrAKEdc4z`o$Ey;ki!>g98 zAkyC@R}sPOF;<3FtV;*DJ>ikkkuDiRH#QR)=aOfMjCaYOiA-?GM?@yNWZ+;BT)wtBA4X)dOD2LWLez=2 z%-XDN2Gb$au4M!cKn~wm_W*=iK*l0gZ7*>NNG&7RgETVo3y_hxEN@f&9^_0!uO%OV z{ObUh4B8((8{*l@j0D*a@odSdAX|sIqzR-R@oZ%ZATKg<1;}_rxRtq)QXw)ec@*SR zM&1Cq5wU7z1`NSt)QD9}P5?OsacD^bxdbt0$@3sF z#F!ZA800BN4jdYZ{FRY$AbXzf>Y4>IhLIG=az<8y zT#F~?ZESoGr2jlk^vpr_KQwdr&nc0}cGe5^_RPVI=Fw<{ywAw?bM$Qvv`=VPJ!G+a zY1Ew|Q=OSZvcXv{QrVq}d`c_bp7tKtzDV27Y_ui#C1kcQ(EcI*97s7bvp#$iWcXPw zp@p`S85s=H%*c@-zhmS?kh>ST`Ba1Kezr^EAeS=I2J$u|-vT-7t2&jbQ(-C9X#wlX zBdv+}*4uSz{2YCr>Crn>r-^RVX~EWMy1_po6Kf7bPIc>aJ!~Jz$ekctwKqDeWymb7 z*B+x%z5+5Q?vjr|4oSLX_hIleBZEQiVB||62R68=N?l+ebX*k3^Fg{l8ZoI z$hzd)AREqg$qgVEXH{g_E_$cw?Sqz@+sxR$bko8Z2Fp;>Nt>* z=ecAi$cv1`K`uStmAMdP;sq|b4rB)-_kvvWbuEK4vT1a0;|`Zp&>fM7t#D+j=b{$B z>XKTzv-10fP%S@)oL^$(FCd3psPiG2e}mLBvj1@OnHRY-qd@LsWF|<%#jZ>P$QM?+ zWF^R>jI0C6U*gJa208pvm%I$}TSndidH-!c%*E zFzztdGUk3!nTl*rAsv>DolX0v9ZdSiIjFvV9{-p!N6+*#0wMoA+716~F#d_BVx9Dd zE0}*q!1i^FEQYQQM$p(IgD{h^UOgG9HeK1ZS5JjZ^=ch;WY!{(Rz_MtPQJ>O`8voh zM!pNOd5tS`8_3buxuhLr<@a6kEXaSZcgdeYUS8*te}e4uBbV%b2<{la*(F~DsbS<; zkiTzmWxfLP$*nF~2r}k&mt;VG^)r`z9pvzPG|{b6dX=K?f+Mlo%A%pSqs~M^bPZLl zw^7u6(2b~j$VOc>G|(X}JXOttePEO=o7&)Isrc8tfOqo8GX zN0anpE$*aGsAIK5eZmS(;EnB@x~{LWkU8gm*Q*sEyBL`dvgkoq zCI#|mM%qB$-K=G_=cRV?{7QJfgn6U4J#V}bjWa!Zhdf`~4bRgX;^g&$LUWM|V)BX@ z^Ygc0d)+U(_VW)QbD@?IMcM$8eMozZ(0w59Gx7vT8`^RdzC*FFy#VqlBX5D+0K24& z_Pi_)dA=Ff2Qkrew%+!9hxSJF%Z?WNl{~+)8=gN9U5)g7Ea~@0Sj{iN`dCDb-H~8M zO+9uZW+nqtJ4O(!1&EbxB4Y)C0}L4_2znDk#tU+|A=N79FIl2;hJh+owaWPzhsd0d zbBN3t|LatE3lEglP1b}o4=%yoK8zd&vh@*Jr+wkQV%u2Ay!E)QcakUrIqGSboDTB6 zXIxST^0(i+Bm;8IA6#-F$j|@ilGPw3SaYyr!4E;|7}*H2j*-VfIv9D0@~L+7c^6~_ zBhkZ<40sn2lEI3HEzgN0!^nJ)l3G`$38bBoWgt~&xH8`ax!_f8yKYUgE~quV zjhHBjMx4!WO;p!>^JkT#5N&+Z*IbOBqd)O8LK13C8@th(=9$)1k4x*V;YW@l--D%_ z|Eery7TI#Ghs+yVM&LU@s^8N7A+!l((%UY11mt5zo(7rwjw|y5$gdgsGstf5YMG!p zo5JsW)NkRWIbT2SZ(4@5??kHG8Tl8;90hXq`>xE1 zAj>{*$*CaM{lg^-L7x85C5u6R{!f>j4>IQ?ms|nz{Kqc27NqvyE?Ey!z-gE4)yayx zDb;^m@({?upSa{HklQ|$MB4Qd$O4QVHlNo)W<_1{KFHucF8LJXB}N7ufxe}$EAvH= z<%&pMUjli3H&#*wB7m4YE(GKLhc)&~Q(!GsrmDJmOX-34pk3po+z0IT8>w{0R z(Lwh%>-3ls6-n8Dy0_`jyUiUZZZFW4Y%G|{|?Q$3-$8OxjTx7nw&j`9!A}uXe zX3{(iGP{%v*@l@i$mB8FKSaiY+&JDPY5R4MIc&a`(Qzp2i(;%6vz(8~ z{buX!I4nI|$Jnaf>6f;{8^z%e%!sJGMW4M@*9)#UafpWm#`=MH3oM;-ma?=+yCA(k zhs;GWz{n_&|6$}Lki*V*Q_TeFfKJg%kn+fUkP!*D%qfskM%qBu!7nz|Dv)GK=;f>;BmuHJmV|8Yw*+JpBi{h| z2P0R5tmx-P!c8DMSefqui8Q!YJOWa>o15wdkai~XE~VPtm5Jiw)^;W{lrDEQx;c*m z$^BAWp<_(e1;to?T4yn4tcc!;lJV{H#F(kC=vlJLcvfQeUg$=Q(QEMKc$$qR=ojij zVKx<(?tDa9+DVMfflMiuz->ES2y*bRD3xBDY56u0E&)&_;4LD}i6EWI7ao1IYmeQC zRL^J`Do$i0$On(1*xC*6DogVZr{ILLZN#(}(M2zjHaITkL(~=4omtS_ds?>Y@fZnR4Du+GxenxYM(zaJeT($7><}IUDPiOlknxQC7335~{t2>B5o*sk ztHog1%*a6?S2A)e$SsVV1o8+YwIF|HWHCs;r*v$Pu8TkpVPq}HSVnFEna;?4APX3I z3M9|Ss~~F_`8&uRjNol+krx>mO!HAjjsZFRX}8Q3Amxml4RSUktsq%Oz5%j!YkAbXUbOSXeF{>3Hlf?USPCm{R3>B6kZGM0fx1&QrAQ(Z`C`Jhh88-H5U8m>9#!XsBTXr%3}=G`n8CAGQyDTh&)l z-B`beOzIseBWF$9KwjrIhv7^K(;e72jn2UY{}|66NH{ovFBe+AS+p!mxHWh~8CtCKh! z2bm0hBF@%n8Au1qry8VWsjDjv^8KMYmGQICMSi{mEf=>RI-73Y9k}ye)M=6Od>%g= z+oS7?0lna2V~$d z?J*K+2N}x9iy;4CWGBdnhq$StSPnZ2uQ#*xH5g zL4L@{p18x}=PcFXAa67B6_Al5UG4Khl8l@Saw#L<1lgd7)P5t#gN*zP4K=&=`SHRdn1rrK__rh}1Mj#lwlb26O{-{c#Er7LjX zyU=CsYief%As=a9;mROiA%*TVQW26Qoa;YnG4oDp%D<~gEt^;XjEAgD6YM) zxXev;AjqK0T{0Tv82qBF^pB2k>3NE}*Km(ooGQd@y&d5u>hOzQMv3!MPyI=GmuZ`>e!%s9sxP5$|cW%{8bT|ssp4@?aI6l@-QR);E#bdQbwj44ANZd zrWyhA03(w?_P|SFZCjoW@>~4+u_d)2AD`)x1jw)ITv7muT;qCmCCE@lt_CS#(x`dcDQzRuDZ8Ee;dH&_*q8 zV>en{(zLjG{Cs#rD(}46B&brEuF-xDY9y(%WQHUqP0|~k&E9vxV|Qv9kz}vqvAU8{ zsRS7c@`56AR&W%^t&6pvN$4byj~tshwChRb=JuYp`@sR$1CfPqGFw!?cVj#LXZlFmeyb zLPj12xrvddK^|b_Wsp}Gc^BmRbG7G5*{2{iIhPE^(!h(190@X@;L4l?a_cgeoDOpS zd6LMwTMV+_`7XH_{AI4pBOq5Z@<)(o8Tlv3(97La z`{L%Og^U~paxEieAirUx7G&)et`$j;X{+3vF9+#h>yDnJ{axWt{f*iEgm3ai@E=GO_^2h63nfE~c@&lLb_7&V6 zd!tJZ203({OHKf3WTY14sUNyBS&+UzcF8wEPTb&=)RCyqfviRM zb{|!@UiIqH2N14bbh{_)lxo=>Wvg-vPM>w@g_pHiL}X>XO$$ z&U(%z{ik8Q?s=D#fXvzElH)5RMza@4D?%r20hcevz$ z3XBe~xnw-Z>mRygF333_yQC511x79cDg4`&SqD<`iAx>?IWB@9M~#$-z6^5~kac}r z@-L84{atd$7o-KeigyX*SO#_*ct(0kHRSEt~a zqtm6Ooz>TYkXcf#y+LJ}2(p2Zvp_y%WC_S!XSk`p3-Zr-F4+X~`XZNX2l?IEF4+Zg zY2cC}Gb532rCl-=qHbF^qV5zEb-5z%XT+I0EWQ3}Wogm)#;O2hwrCk)bsVH}jrI?ri$FHu zrUCMNAM@4@nKOCpq`mQ0dy!WE*V`T&bC>p5zNj7Kv3`$h8QfeF+VpR_oo_srkH=bC zyoUM%Si1cO%F?2mu(AS~LvM8b^9;zjil9QVy$dpCoh!39I+)Q>;n1Ty)GFx3nSJhmrMp}y5A*d zgY^4_OD+YO^h=lAPN^Pt$x|Q~{mLb8ft>ufOQN&Ux_|AGVIW65h+a*nh#m-0`o z#BXtYaE`K+S!7jifHwv$mNK?ylc~rXPhl3fw-v{?-uA}S2eda(!9_Oe*%ICG#v0>| zpe4DqIg@aH*;Utadka}gcKM2WW>-HiBi++pZ_2YYl}^NCIp?(;Ju6QUUFw%r*W-E# z9W82?ddBb}Q=URPpKlF6a1ePAks$q3QZyej^cjkljEZj zJov@ypefdpNV8e~vGA%aPjRpMWyUKb#P62dLTMlF>_%kTG8busDl+#%GgtQ-rCKnR zaetLvmuFD!v&Zi4l;_c|>QwXz;6}89B4w5`W#o;nWhxg^-}@Od^usHi%P9ZQ z?>I{TG$(W3+6t~eqfVuNiq|QX^{bFEwi6J)u~sL%id2GJ0+}o$-v+tuK{Z1&y_T(u z2a%4)>*t9LQ=VdeR%7mJGv-b}9FjNfrrY2MQ>!nlF%*?Q)W}kQagEL{%$y16}jpEdgcv^b-wB6Y9G}x7X6S5 zU{BX_sqq+^V9<~qJH~p85)C*V-e^;H6{%$;$tCe~Uq;4QD#?Fe@7uJWi)hzY%rRCp z#^cSgR0}sEasaHT>dK1j=!uh$pFGa=b;4gqA=L_zb7ZR_Bs3K=ri8|Jsf%pC z9x{80-1L8bEmMEUjniY3$+=itRxw|1ZO;cd2gzpK(Gsg}DB(_BX0ApTDH4NBKPzgObW1VXqtx$ei=|2(W9Jw@<0PON^8hEtbYEAsoNT8u z%e3zQewmAmgKCaVzm6^ZQ!F1<@5|lt6q?*qVWIXNcvY6Cq-c3aXrF4_$EbCQRKr20 zGI9(^yRb`-Xq6zQgd)}1AXQ&;>-_?dord`S!7G?TSF*H!KI%rD8tu^%q2K*a*VjeH zKXmjOl*ewmJgd+9?E30Xc}lg%@HVyZrpvR&lqZW0Gwz0uNU{MXl;we+i_|*_JqVe0 zQD$8iPmx{cyPkiI@?qptkgbdirMmzxa8r!}sbl0MkkyQw1=3-N@5A52_=BjJX8SyK zT48)>lAABuhc_D^HpCVu&0+K90pFgp_A==$+bQGqsyx&?^^KO`e?QLdQ8F|i=o_8l$!H(88y}`q^%yS0 z&t118pLN2n;&G^LmolVlAMPAz?oHdNPN^nkoj!mHMF$bus7|RSWt|@Em50QiQvTTo z-}^?HC?R1QpQxLRFkq! z*WeqkcU`B?by26fzV2F~W0i8|TW{A_8s3%lwG&lRybX?p{j$FDyfA8y>Y^0iWnIu& zpYKERa}BWc^9?E`|3iL$v4KZTI$Az4mM)Fuac@R=IPYJJ zk@|8q!uo-Wvk953>YGZ&%zI@jvUDNpYnahYUwYfpkBp_%NAXQt+8-gK?i#`~WBd|F zkS2sab5-Y->Nu1#WLF~;ahLR(U21MT#FjbJI4(UJVP`h1ii+>6MVV>!Bb~x+lwfNO z3DT4d<6t-J()sj_o`O6={j*wE@2&QAh_MT957`w6gm;;Cqs&r<>cYQ1*xPkcYs!qq z9eM-;=hOrvW4`s-@grrZ%m@7c*N>?lVB0VB^;5bU#5Wz!Ro|vEqdb1AjClQgWORx` zVZ`K77#3;jfmD)ATnTF!neYLQGcsuo`aDI{)tsJbAL40Gd)lcd;MxcElJWYP^7;}lW->YK<%js+-cWD&+Vz6}P+iV~Kfo$_O}r!SqDxr7jzj8rRhDl-ns ze5k!22PwXEpksH_DFk^r@h_NKE|u}H$3fId!&7er+u}jorXnT z?=8KgeVwQMBTsvir=3>FdCb4mBiq|N?RZh2&RLG;6G}bpbRCv!@92^C^E~a_Jna>p z_Q9U^H+!T#?P-}$Dz3=Ri_I6MEP_M7UD;7f9f9Bc#QIE9m^0e1_ z+VLoGNc%Ler;V%*<Ni%B=FV}%1jz@Ds+IM-{OM0aJGEaMlSMODx_EDbp zkv-C0>SwzX|M3w`$kXuFt4Al>yh@2p7sHr_VYaLbXAdizNtsr>CBFe-4jba?RZ>< z%S;;N*`Do@_JpT>vsdqE{jwfu|H!kw%G2KNX`kY0U)>|^A9&hldD^i=&HXcJw5NS-kF?+BY47K0FL>Hl zcr9*SkF;;|w2$(%U+-z}@U-93BkfOm+Dkm`t3Bo{Yg*z6i@p{UT@RhBkeDF+UdR|)&opf=V^b_v;D~)X|MIP-{#pq+|$0%vwdri zv~Tvb5AkeY>1n^kv;CzWX`kt7U+39A$kR^GK=Bc_XWFNF+Shp6`+3@zc-lL9Wcx1L zXR7NCwVw7zy)~=5U^ut^%^qoA}tpot}K*+IRLy`*u(J1TX5=d)nXkqVA&} zX&>ZiZ}Mz^$@Ba!&-0P1da`=Z&zoH=@@#+Fvwfb87PU&;zen2ZJli*UwvY6*Z}aMX zP>-~a@U)-jX@AG_{8Uf-&>m^O#nVm~F;qOO^SG>M`w}neN_wPyy{CPbXM5Vyp7ykl z?2+~=Px~#N_Mx8kn?28u>5=ySUd-2dp5N+eulHhpN{_T}^=u#MXSy`rmpo*uw~X) z|D7@`+o{Ly%yx6{!T&kCCT!F7RqXnynoA^fgm*48d4O(}QMy}?Z~9)N!Cly{>-{BN zo`|mZCav9EJN`de?;~N#XVtqcv#xii%&Oi;cVYYgM!j#>e(t3^G=zS?WcBO`~ODFw;Q`qO`%O&QKf6Sit>)El>K~sStH$Yd@Pw3lXrsHhKj`W%Zq=4`GJ98EcY2ap z-n?bKu4UbCOc-KYoa|dB-QdlddZxX^)86K3e-l}=bB9UedP#eQr~P_Q`vA}OD|$)$ z7*G3Up7xJC+ZXhb_645yyFBeBp6&G37gZPkRn+zOwAXpsw|cg}0@b~teW)Inb%alJ z<|JzL^yV#-(z<6e<4(_Few)oljoni`+i&q~pV>>cZ}qfK@U*Y@wBsdMz2f;>JnaKK z?dN&gXWE&=e-(A>Jnj8F?FCQ!;k~4Ny{Emur@hV7KBsl+t9~9Y zo7d#O^8C}D_A#FA>pblT^itG4>1iM3X}{jnPQNXQe;Bp(>;gMt`+Otpd7gG>HmG_V zZ^k$&+e@B*)6+i7vwbtHQkJTEU)M{v@9?zG^t5mCv|rgv+Shv8cX=_7M_od;@9HJb z-{xr_e+sq zr@g9|Y`@IY{*Gt+B2WAJUb20=r@hp({Vq>?qL*xM_q31jw6F2BZ|kL)U+HOo)ARfS zPy4D~^87|m`%usJ%RKFP@piAYxa&Rb5l?&8(>}mzSI_^XU@_vaJPrlcT(EN9VKm8PIj@DNa5| zgXl9d7=x`8WF-C~T**9aXM%k2HIs8HpU=kPNqN1Jat`v@T&kteFjQQ**1EDtHN=#M z^7#e`ZPJPWkCM^@vGNL(PW3~`=sBCzexFK3dy+g3a-Lerk>qzEdIcEe!P`w!K}@{Q z04LE@!iHQjNvc^1-$N=rN0RyUpNF4h$5(6nfgtjVJe4rOL-O(FY@~_ha};Fsbx)bk z6cE~Mebs`DRINbD#5|d+LDn(tH-YGRluUJ>m+A!&JdDUm)$K2B~Cw z&Zqz7`$eV9P>==c=`%@=1JP$Ll1v9F#aHW}g&kx5V-UX*qy$qSPO#9m)n~Zjfgme&(lpv*y1bm5n+zc`Re{HHwAX!$zEg(GSS3qW}-*uHaze~h;O!{ZJXzw=XPa&i45|pX- zK9kDeT6z#8)Z657e2{4uLD1TQm*Op!ck<}^ItHoq3{B=di{(Q)&ITF9Y|nsnq+D+- z2f2-T>>7~O%o{gSsxL$$q(|zy4TLsZJMAE|SgU*%q_AA;3W7{F*%D6m8f5g{vohzM zAh#Lqcv~GhU#y}VZ%_`OK!!Go2AOKWLj3mPd0H18`x3}YCLbc>L8hwFL8h7q@_{KK z$t(up(R(on{i>YRwHidv4`n{LQYvQq10d%a?ZOIF>P%+ElavaZ_2F|MXgW@0c6c)X z1nF;bru6%sMgQx3f(G;nnOtNO({&hRMnT3#=6DeOrYvd2=^!P{iaL-dnSWY|FzpwE zT+d{_1HyIv7)0N}MeQB$rwjtO%(+-9k3mJ=zo8@i9;6z<%JWMQ+N8&V2Jy!Chw63;HXjM=^osS0fLd>iB)X2ri)&ZJ{6n)F6Wo!a>#NIOe)B*+Jb1Sxu%Uoy9r zX`e{>u>SBg5PcUVc_V0xV}zy6*3Lr6ylHc8PBz1=hM-jORq>iQfImlW@9tW{=n*iGJ!pMkx5>RX30huS6SKkL|XT44IY>ZaWiQ7d` zJGAWsQpf7_Adp2Ty6tN`NUdqh!P0o1Y#+nMxKklB=m43k%y~XYm3Uf^N+^5dnA3+# zl8B5zDXgCxkSfdOKLygx%5yP@e20L{ncllOyH>x+P-?#hGWuCFNqz{T-_9+`Z6Nx- z6iJ={q2H&pearJ8`kjqZ=6^u!Xhm=Dr1_zIB9+QRTlA}Vvk>dU_W{wX2eMrhGU1^E5KBGnwTeQ&}xv2J()Y z^GjXpLE2cVpMmhYco;;l|G)~&JYxyOGt>S@$k1kc(Z7L=VmbFiXQST@F0~HWNQ|u!WTovB5D4V@ zc9!Zw$n<9={5D7xBR7ByVB|IsDvyo%2SKPsS}V4K=)0k0dENq{P09p#{ZJhDv%SR1 z^Kl)1{fFu5k8Zvrs%@7&|MCc$g`@od$P5ROeI{o3EeRScF@o4$v;;EOGp~*YS!9Sf zw`$5o+E{r`hKzo%k+dQS($A(!VRzYTs z&8Jzmi*=?qhB=YzAY;!ogNArIlTSwEv+X*c4UpMp@}X4sg3xB`VhhM{GY=P*Vsuzw zN=VYLda3>iGL+TDZuPh$(dY^q^2sD>aE!@^Mm;(|tuusj-XEz}nN&nZfY4@3c!D5< z98v?aleLrv5I#q06RAp_RF{CD$PT#%WG1uXCXnrYbVN}(?f|J}GMhmv7})}{nw94d zAo?BkeJGpAKS4I*t8Ax1tR8PEM*Cu;@NRK<%*arx5)l1M4KknOLF9&7jt<7xs0QZm z9LNk}`Jh{k$UB*JYtP2oTzAK3@T$o<#O7)ZSCUa?$hK-e!)MDh{H5&qZqg8p!?l zN}iLWc?&{wwTaB2p^!|cF#|D#%5jsI^FtszkdN(qw~&k>STPf=l2ThM{sNf^Muv{r znS=JvfTS#)O*I09HcKXgRIq&JgADKMmPalvxnu=ocCu980$F#Cd#?9A5dCIX=^wm) zF};F$V*_OFV)@($!p{eP4N@>NK?Bw$aMpGg%jZSNaJ&BQk-ZyG7bYK)9tN_=SW3NC z8Yjc@Jwhca#*T)}IyR%80Fq$&oC-3_%owSUYR)W4Ze=A*LS{Hibp^;RY<~Dd5PfY6 z9+S(55&3=_U7m*^Lz}I^-+<^fYAC?=4v4;AOOj8$R0lSq*E0PE^|Xa-CSPjG9LOnc zq`x7Q^I=F;%4&Hu2(PaykQL0*vqALl6Tz;UbTXMOok00nE0#b;|0a$s^W`8-ET5Y| zXxjrHDRUbL@3A+7>|p)R3zW)OO6fa5^z{^(&nF-sFUXiF0HRR}Sd$mK;Q}tElg-%GmEj87$B$iGks-UDf ziQi3|DSsmctKGR|5YJ`<`VA5~qsDK!2+i_El7<@@4CEMLAn5@cEnSWH5!9NXHuaUeG#r5`?jWfEgd%Zfna~p2;qg#hXvRaW}2C0gF75pcGq%`5>0e3kMdmi&H@^A0rPfnT~gl29~te&(0*^IE%A6$usFGFL6C(OWQ1e!47$XYAX!LsedJ7) zCYQ++#8+9!)_PXJE<<5em+!(E>TpXup9ta&aF7wP z$ci;^m&D^a!~o(*`pP9z10APOboO+z)70uB!3`@L#zI zT!4t^k<4yQI)hn=kZ8^2&~=$30@f@;H`qLb+Ji`ooX&tUXScTUv_Ps732J9oxVu4l zd1X*Oqs(Px@pv+yuSn+OE-jChi}nc(wW-DSdvij5FVD0rfk5rjbY-G8Q(nkbqHUvF zs>)>=(MeZUh`lpfQs=fNX$SdKRaTUvM{3OEmd(gzn&*hF+~+gUSxOg#63_vik;)i4 zMFG))&x_?!G1=2s=B1zD+k8bjTi%3UqonUBGmQqwyfR;wNX%_fAQF^`{;MXAlGo$6 z!(`_YOQ5M{T9HNp8YDT1=ayv+3hKqefb5vu12Q|28XaX2ua7GQ?hf^u;%ci%PkWR= z3ep}vdFogf$Ma)@C1WRwlXKzZGh@wZcmV@9`3+-yK3S7Z#$^mrypn)0wGH{9jzoe2 z!WZsjyE2Y}rZ0h?B0+gmGQL=SpMm1!o79f@12$O4pj~`KQd-U2EV*08~}ecX9>-dBXB&1AM;=Yo~lVTXVb|u z%Vy6~Qee|EnKUP~r%NEh%moy{swg#PpWjPh{70HHJYg%;ypsmfeBJ?i0g!&YIc~8u0L{y!DSDf1jpeRC9ZU_-BBzmto z$z&q0vsFEs-bMLn%BZN26w^lyGK3VVNaeHX*s_`UjYz6wxE}4ix@HE#YkDm@L|Ih& zE;}0v##|;{NpoBwBHOEnr^WKAxRsjTmYjhIr+li?m}XXE`bRT60%8(pMa%Kyv(BFA zZD)!fOc(uTeJi>I>I_wk<68}_bro83s5IeILZ(qQqF-k~_?VGtl;xcAnhL1~RZl>d zLqjp8L%LvQMRib{k!{pK)gSo>Dq5SHmrYw%!1)2SSS2^3N*7;tY-7YhnmbZ>Dj^AH zCozvT&HId&)_gKycB#~=*G1-{G%<98=pr$JRT`B)r=>9c&o5Sbd9DbC0w&j@M$p^q zy}1o^5-5shm{dIn11RRdnPAq!NMLtT@nj2%H*Fc`2r~3p^{oYSD0O;kGFX}_GzFD4 z)8+_igE0TMRP-ho_MAGFXn|YpGAQPhm(NroKwoVPh$`oZ!h#csi=dS;58stz^}3L( zY{AJ0Rd!V&2UyumKLa)=g8?X!6j5D+pB#ec%&}RSMl=oNCdYpnJ|bsz=E9Gt=o656$y};o86BgO5uE(Ndbx+7 zp)Y|dYeluFY=K0CV6aA?OH(8*$peQZ(JX71Wvz&4rb=8{Cz6+=$_hEyMXtr*OKHt< zaf*Oq*+Dv=SUeVU%`8qT^GJdLDi|y0=m~KKm`H~J5{wHa7#B{!01{yO$TUoF6C~rL zl%YhjITIo%1`|Q9lS8>qc5{`6(1f=skrU??Sbz^qcuKHpNoL)|hLDSpx z=pzO;y&LM;d`t}~OvS_M*oe=cN5!p>vk)#z6Oa_#avoe^0N(p3N?0_BD%CcG6!)VFsWPTR?wg{d2h`v^)$3hlXyF!^-C>7Vl zmL#dSrL!KL9~PK&%IR%|&ybi)KVKxKWGW|BjTp5Pse~9t^O)AoNiLNYo5Fx>v&1-2 zMC)fsCUZ+Lwn{0Q9bgK^t4TQEv}CR&8FH#*jNfh4Xh7rE^5wVrsgJ-xe6f{&2airNX0F$%;VI< zOnPv3LkpZ{AE_#JCNg3`SQdt=EO}hnGK#7%k7Z-^sWd8@=5)S0s{BLdR#LugqbE0)~=!RW6AIq}gKn#}M*? z4UJBBfsBr4aVDEn9wHJ;-^9eyLjrjR)M?GfR8EZh4kst$5cNAarNIbplQ@S^G~^vV zDyf_l@pSSCGL{FEZRl?0f)1*pSSx|9GP6#CbU0OS#^N%P$w>{m#F>d)Rck%UA3A2! zg$`6FF_lKptEvkf)s3AdPN75PnOw4XBH5kBRCgLm=H^KL#5_tb0l0^PWup6r#o+?V z18PhWr(*D9A{8&t6t)IcD5rQW$sA%yGClHCVhV_5cii|VxHvbV)rc85SLH;`jj3J= z8F55Umuuy&Nm`Lf=1Cy0rhn7h#0Y|NyHr$<3ueahO&-)mXG!&m%k)_@g4t!KRFuuJyzAlF~>zJFe!R;q*dlC8(YwIDZi=KRE-9MFq9!KcEU{sX>gMfU7W;l9pJMV z!$?A$zR6Se@=9Dol#4c%Wf=d|N~m0;aY-W*LfDF+BJ~c{;2C+WouXF?;W_Bt%B%STTU3$@LwUB+glhtNUz|dV=1$AKC>3clQ6YC4RnCNEe?c5W-D2l} zNnDxFx6*pK%1gJ27HI}n#6kj;kBNJoaU_5ru-HKR%IsQE?aE7XM=wkW$4R6eLsJG$ zgr)XMFVZNpMe~)@05zJyKhg!F4zQ=S&aU7pXPdP?q0iZ+szgGX^;BaeI492%1XF4? zrV9euSc0w`&}llRFaRQ!6ZBJvVz)8b5)^1A2=~)r#OPv7GjP_#_7h39FV=N}WE_{- z#PtSwErPB(IJ*t?W5-Qlq=0H80jx6O!g;(NC)_HDAx5PjxR4Q&Arg`idg$7ilX+Z1 zx-MrFDwaishZ!yQScYqyq1-@PGPs^#mwlKt&yubhhx4P`bA*O`GTk8Tj|9!xl)3^# z->5H?2pqvX)n)YAnVN)GDmhM(W5?jamvzg$cS_ zNX*LU_)@w7AZVghb-U{dh!hRzYFq)kFAmeS0vc;=4lclFA*pHZ7j0%QQ=X8*Ajz zJlzLN*P7}66qFOshq!yxgw?^ucmgdxMeD#M=Z0KDL_}W1hrI$w-zdF^dfJK8WjVU! z9VWQaZ4eHpQ)s`G0GgLzN)CmM4S`(0CyWo8dnSg(OEg;QC8W6I_DUl=C^17$KIk$! z&xak9`7nfh#3jx=x;S*;rZB~>dqP%S3-v{jeu)@AI?2I3sH}9vWmBj8ovO(<#m36p zqfl*PC!5RAb#t}Xn#F_!4wi=y(xMHEy#_=XopPuhYOCUFQ*$iNvlN8oBnZnu5Oua| zvQasTPPx7nCk*0<-W9!@CHYpwu1P9;dl5B0vnhpIouQW;I*W-~P27{?T(id^I;|(i z1&;kV6pmMPcg4v}BuToMK|Y zk+>znB%m<~79+!E>M|QL82&QNc4Ts4L0q&Ea&&V>5T;8IR&Yg3$;G~3bc_A`{K8vlxAcNK#W(x1cf{_vaTB=X6$|Sm zxv&+)r1MoGYRsGzHH*@T1I3gSHO-_58D}^v1~-^wSe1>NILS8|%qtC;XEK=8B?Oqs zAjM7A2Z|{vZn91hHd%94jF8EYVJ45C;@2{a)#H;bJ+W|Uh=oliW^_pb*JL6^O*RLLDJg2QNf9#Ha8?X%GRatz zZ4WAYDKi|?0a+e(Ko7=rKw2&js1puQ$2fUN05=oI7)L@FVfW=XJ?ip3F+5TU#9=Wo z(w@lIj=&x=$*iClf4QI@<2f}-oWU0zmu?wi&LFP(nhBw9Ao`H@oJgfzr*_mdhBXG2 zj(JarGxu4d{AYklZ#^iE=v_U-z)jpVvC)$YRRZfolbx9)+LR$ThD5a=L)dC^JXw!x zSh$}YXB0R!!I`ew$C&}!$8m8di#_b_ib5laNiG1=7~p7(r?R;CD$cdUEt@#opeq*+ z#z~}Pc1|RZVos#QIp#$&Xp3RVYogF;w|lOQ`! zrWFM`rLjaSP;+OKy;b3nObM5{Nl+i;j%s_`(EQ7lsnQdDIgq4=05Gb4)Q zZs2q}g_B#oTBTBj54hzCA2WqA2fUJnkJ#dwBTg9^lT#mDt@O$WHoh3t%q_E%-V~RZ zS5gPsLJCa~9f$J_T6e0Am0E7=2`^^E*3E?BQwC0FYM8;%w)l{A`8;j^O%c^VeFbbZF%Hwe~T1Yij+mOU{ z!z7k|3{j|7CeEnBOvHhcr;2r2cr~K3C7|K2jbrU z!ZNu=PLF!zsYqhcRUWZSE}hX)ePn4ewpfUZ7517xkp%oyZjVn{HJd*P}dIf;cYr<%2Tl z%fz0TAK8QEiU3EVl~_cPqRXiAA*7|?88h&h)+!E~J(1e%X}25T7#3o}_%NgH2XlZ> zZ$&MR?q(2k04xX6tutnQBYZ%Ksuvx|bXZxJ=k-EZb~WNF26}pFijHRHZz2H#a;el$(nAYpb3jet#|@A1JMGct3xdRH|a+` z#Sw9$U4*M#;B9E22PgG}#noYt${ByrW4u_D1l607>!Bh+61UvZvz)Z}&MeUfikYIW zg!r};JD@WnY4;EWESK40P~yd=voU6xW*@B;DKa}7V)r58YJn78ovgV4DQJ6 zOd^qqi$_wr&c{e~krQGV&kc805V#MI;&ygaJwMcSA@W+Pi$dUpgPvIGIwLLAMLx2i ztOAS=yf`;Uip$d!zQxwLktQx4$t-q|&IIzpX{x$SGI2z?qS!HIop(q+nrxhi3z4{N zAR@_TEoHQS=%SVq(M?6XX^BU*eCY&diB`OOC4@wO7Fb<~N!-`gl%eZptT9OHx=d@w zMKf_Lno1Z-M@oyO5?n-Qu>{P?T9HViT~#a zwJ$=>^M$ODLaY&M_&K_7Yl$8cw9*u=^wDjjX#K_dBHUz?#CdnTiQY2c7Y8lHb|b}( zn+g*hO_vgJd2>paGH7$fjyGUD$5cW-Mi@A;sjZ~HxEum09i3uw#RA8dp(odhT8;Sw zhUm{!D8)WQBNysarPIopQNLshU&x>(N5|@ zqE)WT)))~*ktX>^jTsQ>Whi}W(wfUD<- zowX`0*Hz2YGP1)8l|mo%%cqZYSw7JlgtC-Vqk6hkf%!@DqRrnN!u&)9HG_u$yAn)faQ8!Z1XaV9(+%`_bkVbj z&A3k=BMI(7bca}8wuVeP5iXRPRi`s}lcCJknPtx^lsPR>2c{ex@B4vPszy{ z1if?wJ-RNsqcz-M-9t_Xqp*3M3aer_jobOSocVrji8^t8CvyeAEPALc zrd;0063DT#SewwJkQqioZ5F2^be2(U6j3Fi)_@rp-hEW8-$>BQo$$&hOb_`2?V2xg{a7scHbL?V8X~1jVo8(kgoSud(m4{of#DO;n;p~-% zGukV{)xa zrPD*w+#-`_m6RR#LR20#LBs7;2la_L3dRO+ra+h!NBQL=9mRSxnO#`0lOhSRBF$Z9 zB0G;x4|`pXOjV>|$pghkC3(b7nwYh!+jPflc3hOcSTmKm7MYHy#*V8Tdo+#^9I?b?{o29{K>df2_p7Vtdw&rl# zuvZq)0MGr!vf*iqP}OmcUh|GkA8tsu(*2xx zv;8teK{_8KFjX!cJI+P4=%Y{}jd>M`;68?BK^hZax}jDK3q3&=Yr#+kAbM>F zpet`&8sI?y`o$N#3$LXWi^B1wc%h1#Y3K09LzG2IidXAnsH2CAkzc+*PZ-a}?sVGK zQm_y2|DadqNHLqByk>rF`OMLiAPXV9;sKY40*p6wf1&Q=16<96Z|I$Pcsg`6s=F|H z3~YkyG_ zKG~Yc94qSSSh~q!G%hIx^Dy(LJDe+<@sJ|kLxOYfUa+HjzYs z7+_U_LKv@>%;8}O(d&NBS8ayg&uQL7*@`C)5~=a}&6{+y=V#RYnL05@z?V?dLH<+35uVy}8>C!PFYkf7ekT+5L{)K7IT)aemXq2i63 z)8|ys3pdSqpD+p+`O!K@Q;d%m>p{4jHCi;e(UT@l96vE4U$bdiv#xA?^mFTMuP* zo0`zIPa~;_H|bG&!5K~C>3UTw-rqy-+z+Ii>o>`6K?PubV*4cQa zR$BD~Wwx!MTc>xl%UTyfXF432o9g#<=GYZC2?X`DQloupT7<|!-ZQ5BFDhUDI#!qc zr0UR3?6XXCXrar@x{;;Yx;Vv?#f9tDSc-m}Zfd1AFAu37G1R*>Da3EmA#U;5qHuxq zYc?*YAjnDjj9M$r2+(bh(}{7A@>jC~YK1<*Tk0vSver$(?8-T(%nvH()YO*EniW(` zpLWJ6ct1n!%<0wDI%oPFF*Gh!Arx}V6Vjb1I!!~#S)!%dI@3B;D62ZeBWZL|U+zHz zP3d4Qnit-HtWVew`KBI=wSVykHiddgye_7A>9gK}cWY#KT8R-?#&2a=t!}Z#5x%eRn~KhN`KY z4bLjz>oFkeu~xhpPTsq#YTG!Q0!d8X^n`M0s)e!+@MhWO#4K^0R5WCx8`UGvMC8dv z=%hl#Gu;s-x=C>YNsCFC9ZJoprEp+i;zQ?S=((^sk`nj3g=d7Sov0@YDIQF3Yh5Jc z2(BTYh#fTBIDR_@^{b~)i^c1oXc7f=&ZI^CS_DeMohhOEbfk?d-!FHp>$r{OIOfJs(e?0 zJatex%F>eq-Tqe$+U8tbWFUX$P?ZZ!kAAyM?FIQ3+hC2aX^>FE(s-SD13mnNdX;Y% zu}xY15+pL@licR~5{e;Aas#Ic3Kg@GSQ#xcLosaz&-@qb3-!HiCMf8K^|U2q7nNJb zKkk?j1HPPE@V?K+kuD{y6j2nOL5uRj|ME7vfchab5{gEF2BJ%#evM0e7Fl8eqJ`Eb zWGx_6z&dXmLJCpf58pHo3stF_Y4RDp$U*%a8(ywoBmzyphM@+h=`wJp(`2(qeaLdd zv1rxW3iTsN+9n(ID7b1|wM`VTGCIvnQ4HtKl+PB#Hhejt(OrFX_ZQ9I@WK^)CU2*Q zbV%5WjzQdVEB9#X;r1Ey`*K!L#EOY(+turUp(~?p@od4Kzsg)`&4HeclzZqFXp*4T zOQyG#j-yG39t4)e<7rIEahe&+(;H@soYClvsJV;DZY>s^%JP&ceG}6)w^6b&&9)Fa zDYc$+XSgy5FeRdr#Go@>!f zY}6!er0A{@E|fwffQfFt6%X^Od2U1N82A?v*j3x9M7mDTh*WThcVo!!C_(4*J-DaK zvqssWq$n`m`4rCm#Pu%mbhGUqyUa>dl^Mc$|7k}!9WnA3mBgdtIAv3PK2FaT=L?I2 zW)t{!lFNo0x1+*~R%PEP=7qLhInzTmXY|b!W!67pqZ-8$)8|n8;-eAOoHJ^wiq>J) zRM~>ojTZTaAr^$ASR;|JY zosCxwX6VEj8$E}sEbn}UNS*npW~om}^$I;jKPHZ9iPN#wPVR)6qB-z&7n+}fh~_G$ kZgfMln7WxRL(KEtNwcjrS)Q(k0rkta6n^wDsxbBc17s-X!2kdN literal 0 HcmV?d00001 diff --git a/ncch.c b/ncch.c deleted file mode 100644 index 409577a..0000000 --- a/ncch.c +++ /dev/null @@ -1,1087 +0,0 @@ -#include "lib.h" -#include "ncch.h" -#include "exheader.h" -#include "elf.h" -#include "exefs.h" -#include "romfs.h" -#include "titleid.h" - -#include "logo_data.h" // Contains Logos - -// Private Prototypes -int SignCFA(u8 *Signature, u8 *CFA_HDR, keys_struct *keys); -int CheckCFASignature(u8 *Signature, u8 *CFA_HDR, keys_struct *keys); -int SignCXI(u8 *Signature, u8 *CXI_HDR, u8 *PubK, u8 *PrivK); -int CheckCXISignature(u8 *Signature, u8 *CXI_HDR, u8 *PubK); - -void init_NCCHSettings(ncch_settings *set); -void free_NCCHSettings(ncch_settings *set); -int get_NCCHSettings(ncch_settings *ncchset, user_settings *usrset); -int SetBasicOptions(ncch_settings *ncchset, user_settings *usrset); -int CreateInputFilePtrs(ncch_settings *ncchset, user_settings *usrset); -int ImportNonCodeExeFsSections(ncch_settings *ncchset); -int ImportLogo(ncch_settings *ncchset); - -int SetCommonHeaderBasicData(ncch_settings *ncchset, NCCH_Header *hdr); -int SetCommonHeaderSectionData(ncch_settings *ncchset, NCCH_Header *hdr); -bool IsValidProductCode(char *ProductCode, bool FreeProductCode); - -int BuildCommonHeader(ncch_settings *ncchset); -int EncryptNCCHSections(ncch_settings *ncchset); -int WriteNCCHSectionsToBuffer(ncch_settings *ncchset); - -// Code - -int SignCFA(u8 *Signature, u8 *CFA_HDR, keys_struct *keys) -{ - return ctr_sig(CFA_HDR,sizeof(NCCH_Header),Signature,keys->rsa.CFA_Pub,keys->rsa.CFA_Priv,RSA_2048_SHA256,CTR_RSA_SIGN); -} - -int CheckCFASignature(u8 *Signature, u8 *CFA_HDR, keys_struct *keys) -{ - return ctr_sig(CFA_HDR,sizeof(NCCH_Header),Signature,keys->rsa.CFA_Pub,NULL,RSA_2048_SHA256,CTR_RSA_VERIFY); -} - -int SignCXI(u8 *Signature, u8 *CXI_HDR, u8 *PubK, u8 *PrivK) -{ - return ctr_sig(CXI_HDR,sizeof(NCCH_Header),Signature,PubK,PrivK,RSA_2048_SHA256,CTR_RSA_SIGN); -} - -int CheckCXISignature(u8 *Signature, u8 *CXI_HDR, u8 *PubK) -{ - int result = ctr_sig(CXI_HDR,sizeof(NCCH_Header),Signature,PubK,NULL,RSA_2048_SHA256,CTR_RSA_VERIFY); - return result; -} - -// NCCH Build Functions - -int build_NCCH(user_settings *usrset) -{ - int result; -#ifdef DEBUG - printf("[DEBUG] Init Settings\n"); -#endif - // Init Settings - ncch_settings *ncchset = malloc(sizeof(ncch_settings)); - if(!ncchset) {fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); return MEM_ERROR;} - init_NCCHSettings(ncchset); - -#ifdef DEBUG - printf("[DEBUG] Get Settings\n"); -#endif - // Get Settings - result = get_NCCHSettings(ncchset,usrset); - if(result) goto finish; -#ifdef DEBUG - printf("[DEBUG] Build ExeFS Code/PlainRegion\n"); -#endif - // Build ExeFs Code Section - result = BuildExeFsCode(ncchset); - if(result) goto finish; - -#ifdef ELF_DEBUG - FILE *code = fopen("code.bin","wb"); - fwrite(ncchset->ExeFs_Sections.Code.buffer,ncchset->ExeFs_Sections.Code.size,1,code); - fclose(code); - u8 hash[0x20]; - ctr_sha(ncchset->ExeFs_Sections.Code.buffer,ncchset->ExeFs_Sections.Code.size,hash,CTR_SHA_256); - printf("BSS Size: 0x%x\n",ncchset->CodeDetails.BSS_Size); - printf("Code Size: 0x%x\n",ncchset->ExeFs_Sections.Code.size); - memdump(stdout,"Code Hash: ",hash,0x20); -#endif - -#ifdef DEBUG - printf("[DEBUG] Build Exheader\n"); -#endif - // Build ExHeader - result = BuildExHeader(ncchset); - if(result) goto finish; - - -#ifdef DEBUG - printf("[DEBUG] Exefs\n"); -#endif - // Build ExeFs/RomFs - result = BuildExeFs(ncchset); - if(result) goto finish; -#ifdef DEBUG - printf("[DEBUG] Build Romfs\n"); -#endif - result = BuildRomFs(ncchset); - if(result) goto finish; - - // Final Steps -#ifdef DEBUG - printf("[DEBUG] Build common header\n"); -#endif - result = BuildCommonHeader(ncchset); - if(result) goto finish; -#ifdef DEBUG - printf("[DEBUG] Encrypt Sections\n"); -#endif - result = EncryptNCCHSections(ncchset); - if(result) goto finish; -#ifdef DEBUG - printf("[DEBUG] Write Sections\n"); -#endif - result = WriteNCCHSectionsToBuffer(ncchset); - if(result) goto finish; -finish: -#ifdef DEBUG - printf("[DEBUG] Finish Building\n"); -#endif - if(result) fprintf(stderr,"[NCCH ERROR] NCCH Build Process Failed\n"); - free_NCCHSettings(ncchset); - return result; -} - -void init_NCCHSettings(ncch_settings *set) -{ - memset(set,0,sizeof(ncch_settings)); -} - -void free_NCCHSettings(ncch_settings *set) -{ - if(set->CxiRsaKey.PrivK) free(set->CxiRsaKey.PrivK); - if(set->CxiRsaKey.PubK) free(set->CxiRsaKey.PubK); - - if(set->ComponentFilePtrs.elf) fclose(set->ComponentFilePtrs.elf); - if(set->ComponentFilePtrs.banner) fclose(set->ComponentFilePtrs.banner); - if(set->ComponentFilePtrs.icon) fclose(set->ComponentFilePtrs.icon); - if(set->ComponentFilePtrs.logo) fclose(set->ComponentFilePtrs.logo); - if(set->ComponentFilePtrs.code) fclose(set->ComponentFilePtrs.code); - if(set->ComponentFilePtrs.exheader) fclose(set->ComponentFilePtrs.exheader); - if(set->ComponentFilePtrs.romfs) fclose(set->ComponentFilePtrs.romfs); - if(set->ComponentFilePtrs.plainregion) fclose(set->ComponentFilePtrs.plainregion); - - if(set->ExeFs_Sections.Code.size) free(set->ExeFs_Sections.Code.buffer); - if(set->ExeFs_Sections.Banner.size) free(set->ExeFs_Sections.Banner.buffer); - if(set->ExeFs_Sections.Icon.size) free(set->ExeFs_Sections.Icon.buffer); - - if(set->Sections.CommonHeader.size) free(set->Sections.CommonHeader.buffer); - if(set->Sections.ExHeader.size) free(set->Sections.ExHeader.buffer); - if(set->Sections.Logo.size) free(set->Sections.Logo.buffer); - if(set->Sections.PlainRegion.size) free(set->Sections.PlainRegion.buffer); - if(set->Sections.ExeFs.size) free(set->Sections.ExeFs.buffer); - if(set->Sections.RomFs.size) free(set->Sections.RomFs.buffer); - - memset(set,0,sizeof(ncch_settings)); - - free(set); -} - -int get_NCCHSettings(ncch_settings *ncchset, user_settings *usrset) -{ - int result = 0; - ncchset->out = &usrset->Content0; - ncchset->yaml_set = &usrset->yaml_set; - ncchset->keys = &usrset->keys; - - result = SetBasicOptions(ncchset,usrset); - if(result) return result; - result = CreateInputFilePtrs(ncchset,usrset); - if(result) return result; - result = ImportNonCodeExeFsSections(ncchset); - if(result) return result; - result = ImportLogo(ncchset); - if(result) return result; - - - return 0; -} - -int SetBasicOptions(ncch_settings *ncchset, user_settings *usrset) -{ - int result = 0; - - /* Options */ - ncchset->Options.MediaSize = 0x200; - - ncchset->Options.IncludeExeFsLogo = usrset->include_exefs_logo; - - if(usrset->yaml_set.Option.EnableCompress != -1) ncchset->Options.CompressCode = usrset->yaml_set.Option.EnableCompress; - else ncchset->Options.CompressCode = true; - - if(usrset->yaml_set.Option.UseOnSD != -1) ncchset->Options.UseOnSD = usrset->yaml_set.Option.UseOnSD; - else ncchset->Options.UseOnSD = false; - usrset->yaml_set.Option.UseOnSD = ncchset->Options.UseOnSD; - - if(usrset->yaml_set.Option.EnableCrypt != -1) ncchset->Options.Encrypt = usrset->yaml_set.Option.EnableCrypt; - else ncchset->Options.Encrypt = true; - - if(usrset->yaml_set.Option.FreeProductCode != -1) ncchset->Options.FreeProductCode = usrset->yaml_set.Option.FreeProductCode; - else ncchset->Options.FreeProductCode = false; - - ncchset->Options.IsCfa = (usrset->build_ncch_type == CFA); - - ncchset->Options.IsBuildingCodeSection = (usrset->elf_path != NULL); - - ncchset->Options.UseRomFS = ((ncchset->yaml_set->Rom.HostRoot && strlen(ncchset->yaml_set->Rom.HostRoot) > 0) || usrset->romfs_path); - - if(ncchset->Options.IsCfa && !ncchset->Options.UseRomFS){ - fprintf(stderr,"[NCCH ERROR] 'Rom/HostRoot' must be set\n"); - return NCCH_BAD_YAML_SET; - } - - ncchset->CxiRsaKey.PrivK = malloc(0x100); - ncchset->CxiRsaKey.PubK = malloc(0x100); - - return result; -} - -int CreateInputFilePtrs(ncch_settings *ncchset, user_settings *usrset) -{ - if(usrset->romfs_path){ - ncchset->ComponentFilePtrs.romfs_size = GetFileSize_u64(usrset->romfs_path); - ncchset->ComponentFilePtrs.romfs = fopen(usrset->romfs_path,"rb"); - if(!ncchset->ComponentFilePtrs.romfs){ - fprintf(stderr,"[NCCH ERROR] Failed to open RomFs file '%s'\n",usrset->romfs_path); - return FAILED_TO_IMPORT_FILE; - } - } - if(ncchset->Options.IsCfa) return 0; - if(usrset->elf_path){ - ncchset->ComponentFilePtrs.elf_size = GetFileSize_u64(usrset->elf_path); - ncchset->ComponentFilePtrs.elf = fopen(usrset->elf_path,"rb"); - if(!ncchset->ComponentFilePtrs.elf){ - fprintf(stderr,"[NCCH ERROR] Failed to open elf file '%s'\n",usrset->elf_path); - return FAILED_TO_IMPORT_FILE; - } - } - if(usrset->banner_path){ - ncchset->ComponentFilePtrs.banner_size = GetFileSize_u64(usrset->banner_path); - ncchset->ComponentFilePtrs.banner = fopen(usrset->banner_path,"rb"); - if(!ncchset->ComponentFilePtrs.banner){ - fprintf(stderr,"[NCCH ERROR] Failed to open banner file '%s'\n",usrset->banner_path); - return FAILED_TO_IMPORT_FILE; - } - } - if(usrset->icon_path){ - ncchset->ComponentFilePtrs.icon_size = GetFileSize_u64(usrset->icon_path); - ncchset->ComponentFilePtrs.icon = fopen(usrset->icon_path,"rb"); - if(!ncchset->ComponentFilePtrs.icon){ - fprintf(stderr,"[NCCH ERROR] Failed to open icon file '%s'\n",usrset->icon_path); - return FAILED_TO_IMPORT_FILE; - } - } - if(usrset->logo_path){ - ncchset->ComponentFilePtrs.logo_size = GetFileSize_u64(usrset->logo_path); - ncchset->ComponentFilePtrs.logo = fopen(usrset->logo_path,"rb"); - if(!ncchset->ComponentFilePtrs.logo){ - fprintf(stderr,"[NCCH ERROR] Failed to open logo file '%s'\n",usrset->logo_path); - return FAILED_TO_IMPORT_FILE; - } - } - - if(usrset->exefs_code_path){ - ncchset->ComponentFilePtrs.code_size = GetFileSize_u64(usrset->exefs_code_path); - ncchset->ComponentFilePtrs.code = fopen(usrset->exefs_code_path,"rb"); - if(!ncchset->ComponentFilePtrs.code){ - fprintf(stderr,"[NCCH ERROR] Failed to open ExeFs Code file '%s'\n",usrset->exefs_code_path); - return FAILED_TO_IMPORT_FILE; - } - } - if(usrset->exheader_path){ - ncchset->ComponentFilePtrs.exheader_size = GetFileSize_u64(usrset->exheader_path); - ncchset->ComponentFilePtrs.exheader = fopen(usrset->exheader_path,"rb"); - if(!ncchset->ComponentFilePtrs.exheader){ - fprintf(stderr,"[NCCH ERROR] Failed to open ExHeader file '%s'\n",usrset->exheader_path); - return FAILED_TO_IMPORT_FILE; - } - } - if(usrset->plain_region_path){ - ncchset->ComponentFilePtrs.plainregion_size = GetFileSize_u64(usrset->plain_region_path); - ncchset->ComponentFilePtrs.plainregion = fopen(usrset->plain_region_path,"rb"); - if(!ncchset->ComponentFilePtrs.plainregion){ - fprintf(stderr,"[NCCH ERROR] Failed to open PlainRegion file '%s'\n",usrset->plain_region_path); - return FAILED_TO_IMPORT_FILE; - } - } - return 0; -} - -int ImportNonCodeExeFsSections(ncch_settings *ncchset) -{ - if(ncchset->Options.IsCfa) return 0; - if(ncchset->ComponentFilePtrs.banner){ - ncchset->ExeFs_Sections.Banner.size = ncchset->ComponentFilePtrs.banner_size; - ncchset->ExeFs_Sections.Banner.buffer = malloc(ncchset->ExeFs_Sections.Banner.size); - if(!ncchset->ExeFs_Sections.Banner.buffer) {fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); return MEM_ERROR;} - ReadFile_64(ncchset->ExeFs_Sections.Banner.buffer,ncchset->ExeFs_Sections.Banner.size,0,ncchset->ComponentFilePtrs.banner); - } - if(ncchset->ComponentFilePtrs.icon){ - ncchset->ExeFs_Sections.Icon.size = ncchset->ComponentFilePtrs.icon_size; - ncchset->ExeFs_Sections.Icon.buffer = malloc(ncchset->ExeFs_Sections.Icon.size); - if(!ncchset->ExeFs_Sections.Icon.buffer) {fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); return MEM_ERROR;} - ReadFile_64(ncchset->ExeFs_Sections.Icon.buffer,ncchset->ExeFs_Sections.Icon.size,0,ncchset->ComponentFilePtrs.icon); - } - return 0; -} - -int ImportLogo(ncch_settings *ncchset) -{ - if(ncchset->Options.IsCfa) return 0; - if(ncchset->ComponentFilePtrs.logo){ - ncchset->Sections.Logo.size = ncchset->ComponentFilePtrs.logo_size; - ncchset->Sections.Logo.buffer = malloc(ncchset->Sections.Logo.size); - if(!ncchset->Sections.Logo.buffer) {fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); return MEM_ERROR;} - ReadFile_64(ncchset->Sections.Logo.buffer,ncchset->Sections.Logo.size,0,ncchset->ComponentFilePtrs.logo); - } - else if(ncchset->yaml_set->BasicInfo.Logo){ - if(strcasecmp(ncchset->yaml_set->BasicInfo.Logo,"nintendo") == 0){ - ncchset->Sections.Logo.size = 0x2000; - ncchset->Sections.Logo.buffer = malloc(ncchset->Sections.Logo.size); - if(!ncchset->Sections.Logo.buffer) {fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); return MEM_ERROR;} - memcpy(ncchset->Sections.Logo.buffer,Nintendo_LZ,0x2000); - } - else if(strcasecmp(ncchset->yaml_set->BasicInfo.Logo,"licensed") == 0){ - ncchset->Sections.Logo.size = 0x2000; - ncchset->Sections.Logo.buffer = malloc(ncchset->Sections.Logo.size); - if(!ncchset->Sections.Logo.buffer) {fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); return MEM_ERROR;} - memcpy(ncchset->Sections.Logo.buffer,Nintendo_LicensedBy_LZ,0x2000); - } - else if(strcasecmp(ncchset->yaml_set->BasicInfo.Logo,"distributed") == 0){ - ncchset->Sections.Logo.size = 0x2000; - ncchset->Sections.Logo.buffer = malloc(ncchset->Sections.Logo.size); - if(!ncchset->Sections.Logo.buffer) {fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); return MEM_ERROR;} - memcpy(ncchset->Sections.Logo.buffer,Nintendo_DistributedBy_LZ,0x2000); - } - else if(strcasecmp(ncchset->yaml_set->BasicInfo.Logo,"ique") == 0){ - ncchset->Sections.Logo.size = 0x2000; - ncchset->Sections.Logo.buffer = malloc(ncchset->Sections.Logo.size); - if(!ncchset->Sections.Logo.buffer) {fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); return MEM_ERROR;} - memcpy(ncchset->Sections.Logo.buffer,iQue_with_ISBN_LZ,0x2000); - } - else if(strcasecmp(ncchset->yaml_set->BasicInfo.Logo,"iqueforsystem") == 0){ - ncchset->Sections.Logo.size = 0x2000; - ncchset->Sections.Logo.buffer = malloc(ncchset->Sections.Logo.size); - if(!ncchset->Sections.Logo.buffer) {fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); return MEM_ERROR;} - memcpy(ncchset->Sections.Logo.buffer,iQue_without_ISBN_LZ,0x2000); - } - else if(strcasecmp(ncchset->yaml_set->BasicInfo.Logo,"none") != 0){ - fprintf(stderr,"[NCCH ERROR] Invalid logo name\n"); - return NCCH_BAD_YAML_SET; - } - } - return 0; -} - -int SetCommonHeaderBasicData(ncch_settings *ncchset, NCCH_Header *hdr) -{ - /* NCCH Format Version */ - u16_to_u8(hdr->version,0x2,LE); - - /* Setting ProgramId/TitleId */ - u64 ProgramId = 0; - int result = GetProgramID(&ProgramId,ncchset->yaml_set,false); - if(result) return result; - - u64_to_u8(hdr->program_id,ProgramId,LE); - u64_to_u8(hdr->title_id,ProgramId,LE); - - /* Get Product Code and Maker Code */ - if(ncchset->yaml_set->BasicInfo.ProductCode){ - if(!IsValidProductCode((char*)ncchset->yaml_set->BasicInfo.ProductCode,ncchset->Options.FreeProductCode)){ - fprintf(stderr,"[NCCH ERROR] Invalid Product Code\n"); - return NCCH_BAD_YAML_SET; - } - memcpy(hdr->product_code,ncchset->yaml_set->BasicInfo.ProductCode,strlen((char*)ncchset->yaml_set->BasicInfo.ProductCode)); - } - else memcpy(hdr->product_code,"CTR-P-CTAP",10); - - if(ncchset->yaml_set->BasicInfo.CompanyCode){ - if(strlen((char*)ncchset->yaml_set->BasicInfo.CompanyCode) != 2){ - fprintf(stderr,"[NCCH ERROR] Company code length must be 2\n"); - return NCCH_BAD_YAML_SET; - } - memcpy(hdr->maker_code,ncchset->yaml_set->BasicInfo.CompanyCode,2); - } - else memcpy(hdr->maker_code,"00",2); - - /* Set ContentUnitSize */ - hdr->flags[ContentUnitSize] = 0; - - /* Setting ContentPlatform */ - if(ncchset->yaml_set->TitleInfo.Platform){ - if(strcasecmp(ncchset->yaml_set->TitleInfo.Platform,"ctr") == 0) hdr->flags[ContentPlatform] = 1; - else{ - fprintf(stderr,"[NCCH ERROR] Invalid Platform: %s\n",ncchset->yaml_set->TitleInfo.Platform); - return NCCH_BAD_YAML_SET; - } - } - else - hdr->flags[ContentPlatform] = 1; // CTR - - /* Setting OtherFlag */ - hdr->flags[OtherFlag] = FixedCryptoKey; - if(!ncchset->Options.Encrypt) hdr->flags[OtherFlag] |= NoCrypto; - if(!ncchset->Sections.RomFs.size) hdr->flags[OtherFlag] |= NoMountRomFs; - - - /* Setting ContentType */ - hdr->flags[ContentType] = 0; - if(ncchset->Sections.RomFs.size) hdr->flags[ContentType] |= RomFS; - if(ncchset->Sections.ExeFs.size) hdr->flags[ContentType] |= ExeFS; - if(ncchset->yaml_set->BasicInfo.ContentType){ - if(strcmp(ncchset->yaml_set->BasicInfo.ContentType,"Application") == 0) hdr->flags[ContentType] |= 0; - else if(strcmp(ncchset->yaml_set->BasicInfo.ContentType,"SystemUpdate") == 0) hdr->flags[ContentType] |= SystemUpdate; - else if(strcmp(ncchset->yaml_set->BasicInfo.ContentType,"Manual") == 0) hdr->flags[ContentType] |= Manual; - else if(strcmp(ncchset->yaml_set->BasicInfo.ContentType,"Child") == 0) hdr->flags[ContentType] |= Child; - else if(strcmp(ncchset->yaml_set->BasicInfo.ContentType,"Trial") == 0) hdr->flags[ContentType] |= Trial; - else{ - fprintf(stderr,"[NCCH ERROR] Invalid ContentType '%s'\n",ncchset->yaml_set->BasicInfo.ContentType); - return NCCH_BAD_YAML_SET; - } - } - - return 0; -} - -int SetCommonHeaderSectionData(ncch_settings *ncchset, NCCH_Header *hdr) -{ - /* Set Sizes/Hashes to Hdr */ - u32 ExHeaderSize = (u32) ncchset->Sections.ExHeader.size - 0x400; - u32 LogoSize = (u32) (ncchset->Sections.Logo.size/ncchset->Options.MediaSize); - u32 PlainRegionSize = (u32) (ncchset->Sections.PlainRegion.size/ncchset->Options.MediaSize); - u32 ExeFsSize = (u32) (ncchset->Sections.ExeFs.size/ncchset->Options.MediaSize); - u32 ExeFsHashSize = (u32) ExeFsSize? ncchset->Options.MediaSize/ncchset->Options.MediaSize : 0; - u32 RomFsSize = (u32) (ncchset->Sections.RomFs.size/ncchset->Options.MediaSize); - u32 RomFsHashSize = (u32) RomFsSize? ncchset->Options.MediaSize/ncchset->Options.MediaSize : 0; - - u32_to_u8(hdr->extended_header_size,ExHeaderSize,LE); - if(ExHeaderSize) ctr_sha(ncchset->Sections.ExHeader.buffer,ExHeaderSize,hdr->extended_header_sha_256_hash,CTR_SHA_256); - - u32_to_u8(hdr->logo_region_size,LogoSize,LE); - if(LogoSize) ctr_sha(ncchset->Sections.Logo.buffer,ncchset->Sections.Logo.size,hdr->logo_sha_256_hash,CTR_SHA_256); - - u32_to_u8(hdr->plain_region_size,PlainRegionSize,LE); - - u32_to_u8(hdr->exefs_size,ExeFsSize,LE); - u32_to_u8(hdr->exefs_hash_size,ExeFsHashSize,LE); - if(ExeFsSize) ctr_sha(ncchset->Sections.ExeFs.buffer,ncchset->Options.MediaSize,hdr->exefs_sha_256_hash,CTR_SHA_256); - - u32_to_u8(hdr->romfs_size,RomFsSize,LE); - u32_to_u8(hdr->romfs_hash_size,RomFsHashSize,LE); - if(RomFsSize) ctr_sha(ncchset->Sections.RomFs.buffer,ncchset->Options.MediaSize,hdr->romfs_sha_256_hash,CTR_SHA_256); - - - /* Get Section Offsets */ - u32 size = 1; - if (ExHeaderSize) - size += 4; - - if (LogoSize){ - u32_to_u8(hdr->logo_region_offset,size,LE); - ncchset->Sections.LogoOffset = size*ncchset->Options.MediaSize; - size += LogoSize; - } - - if(PlainRegionSize){ - u32_to_u8(hdr->plain_region_offset,size,LE); - ncchset->Sections.PlainRegionOffset = size*ncchset->Options.MediaSize; - size += PlainRegionSize; - } - - if (ExeFsSize){ - u32_to_u8(hdr->exefs_offset,size,LE); - ncchset->Sections.ExeFsOffset = size*ncchset->Options.MediaSize; - size += ExeFsSize; - } - - if (RomFsSize){ - u32_to_u8(hdr->romfs_offset,size,LE); - ncchset->Sections.RomFsOffset = size*ncchset->Options.MediaSize; - size += RomFsSize; - } - - u32_to_u8(hdr->content_size,size,LE); - - ncchset->Sections.TotalContentSize = size * ncchset->Options.MediaSize; - - return 0; -} - -bool IsValidProductCode(char *ProductCode, bool FreeProductCode) -{ - if(strlen(ProductCode) > 16) return false; - - if(FreeProductCode) - return true; - - if(strlen(ProductCode) < 10) return false; - if(strncmp(ProductCode,"CTR-",4) != 0) return false; - if(ProductCode[5] != '-') return false; - if(!isdigit(ProductCode[4]) && !isupper(ProductCode[4])) return false; - for(int i = 6; i < 10; i++){ - if(!isdigit(ProductCode[i]) && !isupper(ProductCode[i])) return false; - } - - return true; -} - -int BuildCommonHeader(ncch_settings *ncchset) -{ - int result = 0; - - // Initialising Header - ncchset->Sections.CommonHeader.size = 0x100 + sizeof(NCCH_Header); - ncchset->Sections.CommonHeader.buffer = malloc(ncchset->Sections.CommonHeader.size); - if(!ncchset->Sections.CommonHeader.buffer) { fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); return MEM_ERROR; } - memset(ncchset->Sections.CommonHeader.buffer,0,ncchset->Sections.CommonHeader.size); - - // Creating Ptrs - u8 *sig = ncchset->Sections.CommonHeader.buffer; - NCCH_Header *hdr = (NCCH_Header*)(ncchset->Sections.CommonHeader.buffer+0x100); - - // Setting Data in Hdr - memcpy(hdr->magic,"NCCH",4); - - result = SetCommonHeaderBasicData(ncchset,hdr); - if(result) return result; - - result = SetCommonHeaderSectionData(ncchset,hdr); - if(result) return result; - - - // Signing Hdr - int sig_result = Good; - if(ncchset->Options.IsCfa) sig_result = SignCFA(sig,(u8*)hdr,ncchset->keys); - else sig_result = SignCXI(sig,(u8*)hdr,ncchset->CxiRsaKey.PubK,ncchset->CxiRsaKey.PrivK); - if(sig_result != Good){ - fprintf(stderr,"[NCCH ERROR] Failed to sign %s header\n",ncchset->Options.IsCfa ? "CFA" : "CXI"); - return sig_result; - } - - return 0; -} - -int EncryptNCCHSections(ncch_settings *ncchset) -{ - if(!ncchset->Options.Encrypt) return 0; - - /* Getting NCCH_STRUCT */ - NCCH_Header *hdr = GetNCCH_CommonHDR(NULL,NULL,ncchset->Sections.CommonHeader.buffer); - NCCH_STRUCT *ncch = malloc(sizeof(NCCH_STRUCT)); - if(!ncch) { fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); return MEM_ERROR;} - memset(ncch,0,sizeof(NCCH_STRUCT)); - GetCXIStruct(ncch,hdr); - - u8 *ncch_key = GetNCCHKey(hdr,ncchset->keys); - - if(ncchset->Sections.ExHeader.size) - CryptNCCHSection(ncchset->Sections.ExHeader.buffer,ncchset->Sections.ExHeader.size,0,ncch,ncch_key,ncch_ExHeader); - - if(ncchset->Sections.ExeFs.size) - CryptNCCHSection(ncchset->Sections.ExeFs.buffer,ncchset->Sections.ExeFs.size,0,ncch,ncch_key,ncch_exefs); - - if(ncchset->Sections.RomFs.size) - CryptNCCHSection(ncchset->Sections.RomFs.buffer,ncchset->Sections.RomFs.size,0,ncch,ncch_key,ncch_romfs); - - return 0; -} - -int WriteNCCHSectionsToBuffer(ncch_settings *ncchset) -{ - /* Allocating Memory for NCCH, and clearing */ - ncchset->out->size = ncchset->Sections.TotalContentSize; - ncchset->out->buffer = malloc(ncchset->out->size); - if(!ncchset->out->buffer) { fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); return MEM_ERROR;} - memset(ncchset->out->buffer,0,ncchset->out->size); - - /* Copy Header+Sig */ - memcpy(ncchset->out->buffer,ncchset->Sections.CommonHeader.buffer,ncchset->Sections.CommonHeader.size); - - /* Copy Exheader+AccessDesc */ - if(ncchset->Sections.ExHeader.size) - memcpy(ncchset->out->buffer+0x200,ncchset->Sections.ExHeader.buffer,ncchset->Sections.ExHeader.size); - - /* Copy Logo */ - if(ncchset->Sections.Logo.size) - memcpy(ncchset->out->buffer+ncchset->Sections.LogoOffset,ncchset->Sections.Logo.buffer,ncchset->Sections.Logo.size); - - /* Copy PlainRegion */ - if(ncchset->Sections.PlainRegion.size) - memcpy(ncchset->out->buffer+ncchset->Sections.PlainRegionOffset,ncchset->Sections.PlainRegion.buffer,ncchset->Sections.PlainRegion.size); - - /* Copy ExeFs */ - if(ncchset->Sections.ExeFs.size) - memcpy(ncchset->out->buffer+ncchset->Sections.ExeFsOffset,ncchset->Sections.ExeFs.buffer,ncchset->Sections.ExeFs.size); - - /* Copy RomFs */ - if(ncchset->Sections.RomFs.size) - memcpy(ncchset->out->buffer+ncchset->Sections.RomFsOffset,ncchset->Sections.RomFs.buffer,ncchset->Sections.RomFs.size); - - return 0; -} - -// NCCH Read Functions - -int VerifyNCCH(u8 *ncch, keys_struct *keys, bool SuppressOutput) -{ - // Setup - u8 Hash[0x20]; - u8 *hdr_sig = ncch; - NCCH_Header* hdr = GetNCCH_CommonHDR(NULL,NULL,ncch); - - NCCH_STRUCT *ncch_ctx = malloc(sizeof(NCCH_STRUCT)); - if(!ncch_ctx){ fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); return MEM_ERROR; } - memset(ncch_ctx,0x0,sizeof(NCCH_STRUCT)); - GetCXIStruct(ncch_ctx,hdr); - - if(IsCfa(hdr)){ - if(CheckCFASignature(hdr_sig,(u8*)hdr,keys) != Good && !keys->rsa.FalseSign){ - if(!SuppressOutput) fprintf(stderr,"[NCCH ERROR] CFA Sigcheck Failed\n"); - free(ncch_ctx); - return NCCH_HDR_SIG_BAD; - } - if(!ncch_ctx->romfs_size){ - if(!SuppressOutput) fprintf(stderr,"[NCCH ERROR] CFA is corrupt\n"); - free(ncch_ctx); - return NO_ROMFS_IN_CFA; - } - u8 *RomFs = malloc(ncch_ctx->romfs_hash_src_size); - if(!RomFs){ - fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); - free(ncch_ctx); - return MEM_ERROR; - } - int ret = GetNCCHSection(RomFs,ncch_ctx->romfs_hash_src_size,0,ncch,ncch_ctx,keys,ncch_romfs); - if(ret != 0 && ret != UNABLE_TO_LOAD_NCCH_KEY){ - if(!SuppressOutput) fprintf(stderr,"[NCCH ERROR] CFA is corrupt\n"); - free(ncch_ctx); - free(RomFs); - return CXI_CORRUPT; - } - else if(ret == UNABLE_TO_LOAD_NCCH_KEY){ - if(!SuppressOutput) fprintf(stderr,"[NCCH ERROR] Failed to load ncch aes key.\n"); - free(ncch_ctx); - free(RomFs); - return UNABLE_TO_LOAD_NCCH_KEY; - } - - ctr_sha(RomFs,ncch_ctx->romfs_hash_src_size,Hash,CTR_SHA_256); - free(RomFs); - if(memcmp(Hash,hdr->romfs_sha_256_hash,0x20) != 0){ - if(!SuppressOutput) fprintf(stderr,"[NCCH ERROR] RomFs Hashcheck Failed\n"); - free(ncch_ctx); - return ExeFs_Hashfail; - } - } - else{ // IsCxi - // Checking for necessary sections - if(!ncch_ctx->exheader_size){ - if(!SuppressOutput) fprintf(stderr,"[NCCH ERROR] CXI is corrupt\n"); - free(ncch_ctx); - return NO_EXHEADER_IN_CXI; - } - if(!ncch_ctx->exefs_size){ - if(!SuppressOutput) fprintf(stderr,"[NCCH ERROR] CXI is corrupt\n"); - free(ncch_ctx); - return NO_EXEFS_IN_CXI; - } - // Get ExHeader - ExtendedHeader_Struct *ExHeader = malloc(ncch_ctx->exheader_size); - if(!ExHeader){ - fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); - free(ncch_ctx); - return MEM_ERROR; - } - int ret = GetNCCHSection((u8*)ExHeader,ncch_ctx->exheader_size,0,ncch,ncch_ctx,keys,ncch_ExHeader); - if(ret != 0 && ret != UNABLE_TO_LOAD_NCCH_KEY){ - if(!SuppressOutput) fprintf(stderr,"[NCCH ERROR] CXI is corrupt\n"); - free(ncch_ctx); - free(ExHeader); - return CXI_CORRUPT; - } - else if(ret == UNABLE_TO_LOAD_NCCH_KEY){ - if(!SuppressOutput) fprintf(stderr,"[NCCH ERROR] Failed to load ncch aes key.\n"); - free(ncch_ctx); - free(ExHeader); - return UNABLE_TO_LOAD_NCCH_KEY; - } - - // Checking Exheader Hash to see if decryption was sucessful - ctr_sha(ExHeader,0x400,Hash,CTR_SHA_256); - if(memcmp(Hash,hdr->extended_header_sha_256_hash,0x20) != 0){ - //memdump(stdout,"Expected Hash: ",hdr->extended_header_sha_256_hash,0x20); - //memdump(stdout,"Actual Hash: ",Hash,0x20); - //memdump(stdout,"Exheader: ",(u8*)ExHeader,0x400); - if(!SuppressOutput) { - fprintf(stderr,"[NCCH ERROR] ExHeader Hashcheck Failed\n"); - fprintf(stderr,"[NCCH ERROR] CXI is corrupt\n"); - } - free(ncch_ctx); - free(ExHeader); - return ExHeader_Hashfail; - } - - // Checking RSA Sigs - u8 *hdr_pubk = GetNcchHdrPubKey_frm_exhdr(ExHeader); - - if(CheckAccessDescSignature(ExHeader,keys) != 0 && !keys->rsa.FalseSign){ - if(!SuppressOutput) fprintf(stderr,"[NCCH ERROR] AccessDesc Sigcheck Failed\n"); - free(ncch_ctx); - free(ExHeader); - return ACCESSDESC_SIG_BAD; - } - if(CheckCXISignature(hdr_sig,(u8*)hdr,hdr_pubk) != 0 /* && !keys->rsa.FalseSign*/){ - if(!SuppressOutput) fprintf(stderr,"[NCCH ERROR] CXI Header Sigcheck Failed\n"); - free(ncch_ctx); - free(ExHeader); - return NCCH_HDR_SIG_BAD; - } - free(ExHeader); - - // It is assumed by this point, everything is fine - - /* Checking ExeFs Hash */ - u8 *ExeFs = malloc(ncch_ctx->exefs_hash_src_size); - if(!ExeFs){ - fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); - free(ncch_ctx); - return MEM_ERROR; - } - GetNCCHSection(ExeFs,ncch_ctx->exefs_hash_src_size,0,ncch,ncch_ctx,keys,ncch_exefs); - ctr_sha(ExeFs,ncch_ctx->exefs_hash_src_size,Hash,CTR_SHA_256); - free(ExeFs); - if(memcmp(Hash,hdr->exefs_sha_256_hash,0x20) != 0){ - if(!SuppressOutput) fprintf(stderr,"[NCCH ERROR] ExeFs Hashcheck Failed\n"); - free(ncch_ctx); - return ExeFs_Hashfail; - } - - /* Checking RomFs hash, if present */ - if(ncch_ctx->romfs_size){ - u8 *RomFs = malloc(ncch_ctx->romfs_hash_src_size); - if(!RomFs){ - fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); - free(ncch_ctx); - return MEM_ERROR; - } - GetNCCHSection(RomFs,ncch_ctx->romfs_hash_src_size,0,ncch,ncch_ctx,keys,ncch_romfs); - ctr_sha(RomFs,ncch_ctx->romfs_hash_src_size,Hash,CTR_SHA_256); - free(RomFs); - if(memcmp(Hash,hdr->romfs_sha_256_hash,0x20) != 0){ - if(!SuppressOutput) fprintf(stderr,"[NCCH ERROR] RomFs Hashcheck Failed\n"); - free(ncch_ctx); - return ExeFs_Hashfail; - } - } - - /* Checking the Logo Hash, if present */ - if(ncch_ctx->logo_size){ - u8 *logo = (ncch+ncch_ctx->logo_offset); - ctr_sha(logo,ncch_ctx->logo_size,Hash,CTR_SHA_256); - if(memcmp(Hash,hdr->logo_sha_256_hash,0x20) != 0){ - if(!SuppressOutput) fprintf(stderr,"[NCCH ERROR] Logo Hashcheck Failed\n"); - free(ncch_ctx); - return Logo_Hashfail; - } - } - } - - free(ncch_ctx); - return 0; -} - - -u8* RetargetNCCH(FILE *fp, u64 size, u8 *TitleId, u8 *ProgramId, keys_struct *keys) -{ - u8 *ncch = malloc(size); - if(!ncch){ - fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); - return NULL; - } - ReadFile_64(ncch,size,0,fp); // Importing - - if(!IsNCCH(NULL,ncch)){ - free(ncch); - return NULL; - } - - NCCH_Header *hdr = NULL; - hdr = GetNCCH_CommonHDR(NULL,NULL,ncch); - - if(/*keys->rsa.RequiresPresignedDesc && */!IsCfa(hdr)){ - fprintf(stderr,"[NCCH ERROR] CXI's ID cannot be modified without the ability to resign the AccessDesc\n"); // Not yet yet, requires AccessDesc Privk, may implement anyway later - free(ncch); - return NULL; - } - - if((memcmp(TitleId,hdr->title_id,8) == 0) && (memcmp(ProgramId,hdr->program_id,8) == 0)) - return ncch;// if no modification is required don't do anything - - if(memcmp(TitleId,hdr->title_id,8) == 0){ // If TitleID Same, no crypto required, just resign. - memcpy(hdr->program_id,ProgramId,8); - SignCFA(ncch,(u8*)hdr,keys); - return ncch; - } - - ncch_key_type keytype = GetNCCHKeyType(hdr); - u8 *key = NULL; - - if(keytype == KeyIsUnFixed || keytype == KeyIsUnFixed2){ - fprintf(stderr,"[NCCH ERROR] Unknown aes key\n"); - free(ncch); - return NULL; - } - - - NCCH_STRUCT ncch_struct; - if(keytype != NoKey){ //Decrypting if necessary - GetCXIStruct(&ncch_struct,hdr); - u8 *romfs = (ncch+ncch_struct.romfs_offset); - key = GetNCCHKey(hdr,keys); - if(key == NULL){ - fprintf(stderr,"[NCCH ERROR] Failed to load ncch aes key\n"); - free(ncch); - return NULL; - } - CryptNCCHSection(romfs,ncch_struct.romfs_size,0,&ncch_struct,key,ncch_romfs); - } - - - memcpy(hdr->title_id,TitleId,8); - memcpy(hdr->program_id,ProgramId,8); - - //Checking New Fixed Key Type - keytype = GetNCCHKeyType(hdr); - - if(keytype != NoKey){ // Re-encrypting if necessary - GetCXIStruct(&ncch_struct,hdr); - u8 *romfs = (ncch+ncch_struct.romfs_offset); - key = GetNCCHKey(hdr,keys); - if(key == NULL){ - fprintf(stderr,"[NCCH ERROR] Failed to load ncch aes key\n"); - free(ncch); - return NULL; - } - CryptNCCHSection(romfs,ncch_struct.romfs_size,0,&ncch_struct,key,ncch_romfs); - } - - SignCFA(ncch,(u8*)hdr,keys); - - return ncch; -} - - -NCCH_Header* GetNCCH_CommonHDR(void *out, FILE *fp, u8 *buf) -{ - if(!fp && !buf) return NULL; - if(fp){ - if(!out) return NULL; - ReadFile_64(out,0x100,0x100,fp); - return (NCCH_Header*)out; - } - else{ - return (NCCH_Header*)(buf+0x100); - } -} - - -bool IsNCCH(FILE *fp, u8 *buf) -{ - if(!fp && !buf) return false; - NCCH_Header *ncchHDR = NULL; - bool result; - if(fp) { - ncchHDR = malloc(sizeof(NCCH_Header)); - GetNCCH_CommonHDR(ncchHDR,fp,NULL); - result = (memcmp(ncchHDR->magic,"NCCH",4) == 0); - free(ncchHDR); - } - else { - ncchHDR = GetNCCH_CommonHDR(ncchHDR,NULL,buf); - result = (memcmp(ncchHDR->magic,"NCCH",4) == 0); - } - return result; -} - -bool IsCfa(NCCH_Header* hdr) -{ - return (((hdr->flags[ContentType] & RomFS) == RomFS) && ((hdr->flags[ContentType] & ExeFS) != ExeFS)); -} - -u32 GetNCCH_MediaUnitSize(NCCH_Header* hdr) -{ - u16 version = u8_to_u16(hdr->version,LE); - u32 ret = 0; - if (version == 1) - ret = 1; - else if (version == 2 || version == 0) - ret = 1 << (hdr->flags[ContentUnitSize] + 9); - return ret; - //return 0x200*pow(2,hdr->flags[ContentUnitSize]); -} - -u32 GetNCCH_MediaSize(NCCH_Header* hdr) -{ - return u8_to_u32(hdr->content_size,LE); -} - -ncch_key_type GetNCCHKeyType(NCCH_Header* hdr) -{ - // Non-Secure Key Options - if((hdr->flags[OtherFlag] & NoCrypto) == NoCrypto) return NoKey; - if((hdr->flags[OtherFlag] & FixedCryptoKey) == FixedCryptoKey){ - if((hdr->program_id[4] & 0x10) == 0x10) return KeyIsSystemFixed; - else return KeyIsNormalFixed; - } - - // Secure Key Options - if(hdr->flags[SecureCrypto2] == 1) return KeyIsUnFixed2; - return KeyIsUnFixed; -} - -u8* GetNCCHKey(NCCH_Header* hdr, keys_struct *keys) -{ - ncch_key_type keytype = GetNCCHKeyType(hdr); - switch(keytype){ - case NoKey: return NULL; - case KeyIsNormalFixed: return keys->aes.NormalKey; - case KeyIsSystemFixed: - if(!keys->aes.SystemFixedKey) fprintf(stderr,"[NCCH WARNING] Unable to load SystemFixed Key\n"); - return keys->aes.SystemFixedKey; - case KeyIsUnFixed: - if(!keys->aes.UnFixedKey) fprintf(stderr,"[NCCH WARNING] Unable to load UnFixed Key\n"); - return keys->aes.UnFixedKey; - case KeyIsUnFixed2: - fprintf(stderr,"[NCCH WARNING] Crypto method (Secure2) not supported yet\n"); - return NULL; - } - return NULL; -} - -int GetNCCHSection(u8 *dest, u64 dest_max_size, u64 src_pos, u8 *ncch, NCCH_STRUCT *ncch_ctx, keys_struct *keys, ncch_section section) -{ - if(!ncch) return MEM_ERROR; - u8 *key = NULL; - NCCH_Header* hdr = GetNCCH_CommonHDR(NULL,NULL,ncch); - ncch_key_type keytype = GetNCCHKeyType(hdr); - - if(keytype != NoKey && (section == ncch_ExHeader || section == ncch_exefs || section == ncch_romfs)){ - key = GetNCCHKey(hdr,keys); - if(key == NULL){ - //fprintf(stderr,"[NCCH ERROR] Failed to load ncch aes key.\n"); - return UNABLE_TO_LOAD_NCCH_KEY; - } - } - //printf("detecting section type\n"); - u64 offset = 0; - u64 size = 0; - switch(section){ - case ncch_ExHeader: - offset = ncch_ctx->exheader_offset; - size = ncch_ctx->exheader_size; - break; - case ncch_Logo: - offset = ncch_ctx->logo_offset; - size = ncch_ctx->logo_size; - break; - case ncch_PlainRegion: - offset = ncch_ctx->plain_region_offset; - size = ncch_ctx->plain_region_size; - break; - case ncch_exefs: - offset = ncch_ctx->exefs_offset; - size = ncch_ctx->exefs_size; - break; - case ncch_romfs: - offset = ncch_ctx->romfs_offset; - size = ncch_ctx->romfs_size; - break; - } - if(!offset || !size) return NCCH_SECTION_NOT_EXIST; - - if(src_pos > size) return DATA_POS_DNE; - - size = min_u64(size-src_pos,dest_max_size); - - //printf("Copying data\n"); - u8 *section_pos = (ncch + offset + src_pos); - memcpy(dest,section_pos,size); - - //printf("decrypting if needed\n"); - if(keytype != NoKey && (section == ncch_ExHeader || section == ncch_exefs || section == ncch_romfs)){ // Decrypt - //memdump(stdout,"Key: ",key,16); - CryptNCCHSection(dest,size,src_pos,ncch_ctx,key,section); - //printf("no cigar\n"); - } - - return 0; -} - -int GetCXIStruct(NCCH_STRUCT *ctx, NCCH_Header *header) -{ - memcpy(ctx->titleID,header->title_id,8); - memcpy(ctx->programID,header->program_id,8); - - - u32 media_unit = GetNCCH_MediaUnitSize(header); - - ctx->version = u8_to_u16(header->version,LE); - if(!IsCfa(header)){ - ctx->exheader_offset = 0x200; - ctx->exheader_size = u8_to_u32(header->extended_header_size,LE) + 0x400; - ctx->logo_offset = (u64)(u8_to_u32(header->logo_region_offset,LE)*media_unit); - ctx->logo_size = (u64)(u8_to_u32(header->logo_region_size,LE)*media_unit); - ctx->plain_region_offset = (u64)(u8_to_u32(header->plain_region_offset,LE)*media_unit); - ctx->plain_region_size = (u64)(u8_to_u32(header->plain_region_size,LE)*media_unit); - ctx->exefs_offset = (u64)(u8_to_u32(header->exefs_offset,LE)*media_unit); - ctx->exefs_size = (u64)(u8_to_u32(header->exefs_size,LE)*media_unit); - ctx->exefs_hash_src_size = (u64)(u8_to_u32(header->exefs_hash_size,LE)*media_unit); - } - ctx->romfs_offset = (u64) (u8_to_u32(header->romfs_offset,LE)*media_unit); - ctx->romfs_size = (u64) (u8_to_u32(header->romfs_size,LE)*media_unit); - ctx->romfs_hash_src_size = (u64)(u8_to_u32(header->romfs_hash_size,LE)*media_unit); - return 0; -} - -void CryptNCCHSection(u8 *buffer, u64 size, u64 src_pos, NCCH_STRUCT *ctx, u8 key[16], u8 type) -{ - if(type < 1 || type > 3) - return; - u8 counter[0x10]; - ncch_get_counter(ctx,counter,type); - ctr_aes_context aes_ctx; - memset(&aes_ctx,0x0,sizeof(ctr_aes_context)); - ctr_init_counter(&aes_ctx, key, counter); - if(src_pos > 0){ - u32 carry = 0; - carry = align_value(src_pos,0x10); - carry = carry/0x10; - ctr_add_counter(&aes_ctx,carry); - } - ctr_crypt_counter(&aes_ctx, buffer, buffer, size); - return; -} - -void ncch_get_counter(NCCH_STRUCT *ctx, u8 counter[16], u8 type) -{ - u8 *titleID = ctx->titleID; - u32 i; - u32 x = 0; - - memset(counter, 0, 16); - - if (ctx->version == 2 || ctx->version == 0) - { - for(i=0; i<8; i++) - counter[i] = titleID[7-i]; - counter[8] = type; - } - else if (ctx->version == 1) - { - switch(type){ - case ncch_ExHeader : x = ctx->exheader_offset; break; - case ncch_exefs : x = ctx->exefs_offset; break; - case ncch_romfs : x = ctx->romfs_offset; break; - } - for(i=0; i<8; i++) - counter[i] = titleID[i]; - for(i=0; i<4; i++) - counter[12+i] = x>>((3-i)*8); - } - - //memdump(stdout,"CTR: ",counter,16); -} \ No newline at end of file diff --git a/ncch.h b/ncch.h deleted file mode 100644 index 69f4728..0000000 --- a/ncch.h +++ /dev/null @@ -1,236 +0,0 @@ -#ifndef _NCCH_H_ -#define _NCCH_H_ - -typedef enum -{ - NCCH_MEMERROR = -1, - SAVE_DATA_TOO_LARGE = -2, - NCCH_SECTION_NOT_EXIST = -3, - UNABLE_TO_LOAD_NCCH_KEY = -4, - NCCH_EXPORT_BUFFER_TOO_SMALL = -5, - NO_ROMFS_IN_CFA = -6, - NO_EXHEADER_IN_CXI = -7, - NO_EXEFS_IN_CXI = -8, - // SigCheck Errors - CXI_CORRUPT = -9, - ACCESSDESC_SIG_BAD = -10, - NCCH_HDR_SIG_BAD = -11, - // HashCheck Errors - ExHeader_Hashfail = -12, - Logo_Hashfail = -13, - ExeFs_Hashfail = -14, - RomFs_Hashfail = -15, - // Others - NCCH_BAD_YAML_SET = -16, - DATA_POS_DNE = -17, -} ncch_errors; - -typedef enum -{ - ncch_ExHeader = 1, - ncch_exefs, - ncch_romfs, - ncch_Logo, - ncch_PlainRegion, -} ncch_section; - -typedef enum -{ - NoKey, - KeyIsNormalFixed, - KeyIsSystemFixed, - KeyIsUnFixed, - KeyIsUnFixed2, -} ncch_key_type; - -typedef enum -{ - SecureCrypto2 = 3, - ContentPlatform = 4, - ContentType = 5, - ContentUnitSize = 6, - OtherFlag = 7 -} ncch_flags; - -typedef enum -{ - FixedCryptoKey = 0x1, - NoMountRomFs = 0x2, - NoCrypto = 0x4, -} ncch_otherflag_bitmask; - -typedef enum -{ - RomFS = 0x1, - ExeFS = 0x2, - SystemUpdate = 0x4, - Manual = 0x8, - Child = (0x4|0x8), - Trial = 0x10 -} ncch_content_bitmask; - -typedef struct -{ - u16 version; - u32 exheader_offset; - u32 exheader_size; - u64 logo_offset; - u64 logo_size; - u64 plain_region_offset; - u64 plain_region_size; - u64 exefs_offset; - u64 exefs_size; - u64 exefs_hash_src_size; - u64 romfs_offset; - u64 romfs_size; - u64 romfs_hash_src_size; - u8 titleID[8]; - u8 programID[8]; -}NCCH_STRUCT; - -typedef struct -{ - u8 magic[4]; - u8 content_size[4]; - u8 title_id[8]; - u8 maker_code[2]; - u8 version[2]; - u8 reserved_0[4]; - u8 program_id[8]; - u8 reserved_1[0x10]; - u8 logo_sha_256_hash[0x20]; - u8 product_code[0x10]; - u8 extended_header_sha_256_hash[0x20]; - u8 extended_header_size[4]; - u8 reserved_2[4]; - u8 flags[8]; - u8 plain_region_offset[4]; - u8 plain_region_size[4]; - u8 logo_region_offset[4]; - u8 logo_region_size[4]; - u8 exefs_offset[4]; - u8 exefs_size[4]; - u8 exefs_hash_size[4]; - u8 reserved_4[4]; - u8 romfs_offset[4]; - u8 romfs_size[4]; - u8 romfs_hash_size[4]; - u8 reserved_5[4]; - u8 exefs_sha_256_hash[0x20]; - u8 romfs_sha_256_hash[0x20]; -} NCCH_Header; - - -typedef struct -{ - keys_struct *keys; - rsf_settings *yaml_set; - COMPONENT_STRUCT *out; - - struct{ - u8 *PubK; - u8 *PrivK; - } CxiRsaKey; - - struct - { - u32 MediaSize; - bool IncludeExeFsLogo; - bool CompressCode; - bool UseOnSD; - bool Encrypt; - bool FreeProductCode; - bool IsCfa; - bool IsBuildingCodeSection; - bool UseRomFS; - } Options; - - struct - { - FILE *elf; - u64 elf_size; - - FILE *banner; - u64 banner_size; - - FILE *icon; - u64 icon_size; - - FILE *logo; - u64 logo_size; - - FILE *code; - u64 code_size; - - FILE *exheader; - u64 exheader_size; - - FILE *romfs; - u64 romfs_size; - - FILE *plainregion; - u64 plainregion_size; - } ComponentFilePtrs; - - struct - { - COMPONENT_STRUCT Code; - COMPONENT_STRUCT Banner; - COMPONENT_STRUCT Icon; - } ExeFs_Sections; - - struct - { - u32 TextAddress; - u32 TextSize; - u32 TextMaxPages; - u32 ROAddress; - u32 ROSize; - u32 ROMaxPages; - u32 DataAddress; - u32 DataSize; - u32 DataMaxPages; - u32 BSS_Size; - } CodeDetails; - - struct - { - u64 TotalContentSize; - COMPONENT_STRUCT CommonHeader; - COMPONENT_STRUCT ExHeader; - u64 LogoOffset; - COMPONENT_STRUCT Logo; - u64 PlainRegionOffset; - COMPONENT_STRUCT PlainRegion; - u64 ExeFsOffset; - COMPONENT_STRUCT ExeFs; - u64 RomFsOffset; - COMPONENT_STRUCT RomFs; - } Sections; - -} ncch_settings; - -#endif - -// NCCH Build Functions -int build_NCCH(user_settings *usrset); - - -// NCCH Read Functions -int VerifyNCCH(u8 *ncch, keys_struct *keys, bool SuppressOutput); - -u8* RetargetNCCH(FILE *fp, u64 size, u8 *TitleId, u8 *ProgramId, keys_struct *keys); - -NCCH_Header* GetNCCH_CommonHDR(void *out, FILE *fp, u8 *buf); -bool IsNCCH(FILE *fp, u8 *buf); -bool IsCfa(NCCH_Header* hdr); -u32 GetNCCH_MediaUnitSize(NCCH_Header* hdr); -u32 GetNCCH_MediaSize(NCCH_Header* hdr); -ncch_key_type GetNCCHKeyType(NCCH_Header* hdr); - -int GetNCCHSection(u8 *dest, u64 dest_max_size, u64 src_pos, u8 *ncch, NCCH_STRUCT *ncch_ctx, keys_struct *keys, ncch_section section); -u8* GetNCCHKey(NCCH_Header* hdr, keys_struct *keys); - -int GetCXIStruct(NCCH_STRUCT *ctx, NCCH_Header *header); -void ncch_get_counter(NCCH_STRUCT *ctx, u8 counter[16], u8 type); -void CryptNCCHSection(u8 *buffer, u64 size, u64 src_pos, NCCH_STRUCT *ctx, u8 key[16], u8 type); \ No newline at end of file diff --git a/ncsd.c b/ncsd.c deleted file mode 100644 index aa23987..0000000 --- a/ncsd.c +++ /dev/null @@ -1,564 +0,0 @@ -#include "lib.h" -#include "ncch.h" -#include "exheader.h" -#include "ncsd.h" - -// Private Prototypes - -/* RSA Crypto */ -int SignCCI(u8 *Signature, u8 *NCSD_HDR); -int CheckCCISignature(u8 *Signature, u8 *NCSD_HDR); - -/* cci_settings tools */ -void init_CCISettings(cci_settings *set); -int get_CCISettings(cci_settings *cciset, user_settings *usrset); -void free_CCISettings(cci_settings *set); - -/* CCI Data Gen/Write */ -int BuildNCSDHeader(cci_settings *cciset, user_settings *usrset); -int BuildCardInfoHeader(cci_settings *cciset, user_settings *usrset); -int WriteCCI_HDR_ToFile(cci_settings *cciset); -int WriteCCI_Content_ToFile(cci_settings *cciset,user_settings *usrset); -int WriteCCI_DummyBytes(cci_settings *cciset); - -/* Get Data from Content Files */ -int CheckContent0(cci_settings *cciset, user_settings *usrset); -int GetDataFromContent0(cci_settings *cciset, user_settings *usrset); -int GetContentFP(cci_settings *cciset, user_settings *usrset); - -/* Get Data from YAML Settings */ -int GetNCSDFlags(cci_settings *cciset, rsf_settings *yaml); -int GetMediaSize(cci_settings *cciset, user_settings *usrset); -u64 GetUnusedSize(u64 MediaSize, u8 CardType); -int GetWriteableAddress(cci_settings *cciset, user_settings *usrset); -int GetCardInfoBitmask(cci_settings *cciset, user_settings *usrset); - -int CheckMediaSize(cci_settings *cciset); - -static InternalCCI_Context ctx; - -// Code -int build_CCI(user_settings *usrset) -{ - int result = 0; - - // Init Settings - cci_settings *cciset = malloc(sizeof(cci_settings)); - if(!cciset) {fprintf(stderr,"[CCI ERROR] MEM ERROR\n"); return MEM_ERROR;} - init_CCISettings(cciset); - - // Get Settings - result = get_CCISettings(cciset,usrset); - if(result) goto finish; - - // Create Output File - cciset->out = fopen(usrset->outfile,"wb"); - if(!cciset->out){ - fprintf(stderr,"[CCI ERROR] Failed to create '%s'\n",usrset->outfile); - result = FAILED_TO_CREATE_OUTFILE; - goto finish; - } - - // Generate NCSD Header and Additional Header - result = BuildNCSDHeader(cciset,usrset); - if(result) goto finish; - BuildCardInfoHeader(cciset,usrset); - - // Write to File - WriteCCI_HDR_ToFile(cciset); - result = WriteCCI_Content_ToFile(cciset,usrset); - if(result) goto finish; - - // Fill out file if necessary - if(cciset->MediaFootPadding) WriteCCI_DummyBytes(cciset); - - // Close output file -finish: - if(result != FAILED_TO_CREATE_OUTFILE && cciset->out) fclose(cciset->out); - free_CCISettings(cciset); - return result; -} - - -int SignCCI(u8 *Signature, u8 *NCSD_HDR) -{ - return ctr_sig(NCSD_HDR,sizeof(NCSD_Header),Signature,ctx.keys->rsa.CCI_Pub,ctx.keys->rsa.CCI_Priv,RSA_2048_SHA256,CTR_RSA_SIGN); -} - -int CheckCCISignature(u8 *Signature, u8 *NCSD_HDR) -{ - return ctr_sig(NCSD_HDR,sizeof(NCSD_Header),Signature,ctx.keys->rsa.CCI_Pub,NULL,RSA_2048_SHA256,CTR_RSA_VERIFY); -} - -void init_CCISettings(cci_settings *set) -{ - memset(set,0,sizeof(cci_settings)); - memset(&ctx,0,sizeof(InternalCCI_Context)); -} - -int get_CCISettings(cci_settings *cciset, user_settings *usrset) -{ - ctx.keys = &usrset->keys; - int result = 0; - - /* Importing Data from Content */ - result = CheckContent0(cciset,usrset); - if(result) return result; - - result = GetDataFromContent0(cciset,usrset); - if(result) return result; - - result = GetContentFP(cciset,usrset); - if(result) return result; - - - - /* Getting Data from YAML */ - result = GetNCSDFlags(cciset,&usrset->yaml_set); - if(result) return result; - - result = GetMediaSize(cciset,usrset); - if(result) return result; - - result = CheckMediaSize(cciset); - if(result) return result; - - /** Card Info Header Data **/ - result = GetWriteableAddress(cciset,usrset); - if(result) return result; - - result = GetCardInfoBitmask(cciset,usrset); - if(result) return result; - - /* All Done */ - return 0; -} - -void free_CCISettings(cci_settings *set) -{ - if(set->content){ - for(int i = 1; i < 8; i++) { - if(set->content[i]) fclose(set->content[i]); - } - free(set->content); - } - free(set); -} - -int BuildNCSDHeader(cci_settings *cciset, user_settings *usrset) -{ - memcpy((u8*)ctx.commonHDR.magic,"NCSD",4); - u32_to_u8((u8*)ctx.commonHDR.media_size,(cciset->MediaSize/cciset->MediaUnitSize),LE); - memcpy((u8*)ctx.commonHDR.title_id,cciset->MediaID,8); - for(int i = 0; i < 8; i++){ - u32_to_u8((u8*)ctx.commonHDR.offsetsize_table[i].offset,(cciset->ContentOffset[i]/cciset->MediaUnitSize),LE); - u32_to_u8((u8*)ctx.commonHDR.offsetsize_table[i].size,(cciset->ContentSize[i]/cciset->MediaUnitSize),LE); - memcpy((u8*)ctx.commonHDR.partition_id_table[i],cciset->ContentTitleID[i],8); - } - memcpy((u8*)ctx.commonHDR.partition_flags,cciset->NCSD_Flags,8); - if(SignCCI(ctx.Signature,(u8*)&ctx.commonHDR) != Good){ - fprintf(stderr,"[CCI ERROR] Failed to sign CCI\n"); - return CCI_SIG_FAIL; - } - return 0; -} - -int BuildCardInfoHeader(cci_settings *cciset, user_settings *usrset) -{ - u32_to_u8((u8*)ctx.CardInfoHDR.writable_address,(cciset->WritableAddress/cciset->MediaUnitSize),LE); - u32_to_u8((u8*)ctx.CardInfoHDR.card_info_bitmask,cciset->CardInfoBitmask,BE); - u32_to_u8((u8*)ctx.CardInfoHDR.media_size_used,cciset->TotalContentSize,LE); - memcpy((u8*)ctx.CardInfoHDR.ncch_0_title_id,cciset->ContentTitleID[0],8); - memcpy((u8*)ctx.CardInfoHDR.initial_data,cciset->InitialData,0x30); - if(!(usrset->OmitImportedNcchHdr && !usrset->IsBuildingNCCH0)) - memcpy((u8*)ctx.CardInfoHDR.ncch_0_header,cciset->NCCH_HDR,0x100); - memcpy((u8*)ctx.DevCardInfoHDR.TitleKey,cciset->TitleKey,0x10); - return 0; -} - -int WriteCCI_HDR_ToFile(cci_settings *cciset) -{ - WriteBuffer(ctx.Signature,0x100,0,cciset->out); - WriteBuffer((u8*)&ctx.commonHDR,sizeof(NCSD_Header),0x100,cciset->out); - WriteBuffer((u8*)&ctx.CardInfoHDR,sizeof(CardInfo_Header),0x200,cciset->out); - WriteBuffer((u8*)&ctx.DevCardInfoHDR,sizeof(Dev_CardInfo_Header),0x1200,cciset->out); - return 0; -} - -int WriteCCI_Content_ToFile(cci_settings *cciset,user_settings *usrset) -{ - // Write Content 0 - WriteBuffer(cciset->ncch0,cciset->ContentSize[0],cciset->ContentOffset[0],cciset->out); - free(usrset->Content0.buffer); - usrset->Content0.buffer = NULL; - usrset->Content0.size = 0; - - // Add additional contents, recreating them with their new TitleID - for(int i = 1; i < 8; i++){ - if(cciset->content[i]){ - u8 *ContentBuff = RetargetNCCH(cciset->content[i],cciset->ContentSize[i],cciset->ContentTitleID[i],cciset->MediaID,ctx.keys); - if(!ContentBuff){ - fprintf(stderr,"[CCI ERROR] Could not import content %d to CCI\n",i); - return FAILED_TO_IMPORT_FILE; - } - WriteBuffer(ContentBuff,cciset->ContentSize[i],cciset->ContentOffset[i],cciset->out); - free(ContentBuff); - } - } - return 0; -} - -int WriteCCI_DummyBytes(cci_settings *cciset) -{ - // Seeking end of CCI Data - fseek_64(cciset->out,cciset->TotalContentSize,SEEK_SET); - - // Determining Size of Dummy Bytes - u64 len = cciset->MediaSize - cciset->TotalContentSize; - - // Creating Buffer of Dummy Bytes - u8 dummy_bytes[cciset->MediaUnitSize]; - memset(&dummy_bytes,0xff,cciset->MediaUnitSize); - - // Writing Dummy Bytes to file - for(u64 i = 0; i < len; i += cciset->MediaUnitSize){ - fwrite(&dummy_bytes,cciset->MediaUnitSize,1,cciset->out); - } - - return 0; -} - -int GetContentFP(cci_settings *cciset, user_settings *usrset) -{ - cciset->content = malloc(sizeof(FILE*)*8); - if(!cciset->content){ - fprintf(stderr,"[CCI ERROR] MEM ERROR\n"); - return MEM_ERROR; - } - memset(cciset->content,0,sizeof(FILE*)*8); - - for(int i = 1; i < 8; i++){ - if(usrset->ContentPath[i]){ - cciset->content[i] = fopen(usrset->ContentPath[i],"rb"); - if(!cciset->content[i]){ // Checking if file could be opened - fprintf(stderr,"[CCI ERROR] Failed to create '%s'\n",usrset->outfile); - return FAILED_TO_OPEN_FILE; - } - if(!IsNCCH(cciset->content[i],NULL)){ // Checking if NCCH - fprintf(stderr,"[CCI ERROR] Content '%s' is invalid\n",usrset->ContentPath[i]); - return NCSD_INVALID_NCCH0; - } - - // Getting NCCH Header - NCCH_Header *hdr = malloc(sizeof(NCCH_Header));; - GetNCCH_CommonHDR(hdr,cciset->content[i],NULL); - - if(GetNCCH_MediaUnitSize(hdr) != cciset->MediaUnitSize){ // Checking if Media Unit Size matches CCI - fprintf(stderr,"[CCI ERROR] Content '%s' is invalid\n",usrset->ContentPath[i]); - return NCSD_INVALID_NCCH0; - } - - memcpy(&cciset->ContentTitleID[i],cciset->MediaID,8); // Set TitleID - - // Modify TitleID Accordingly - u16 tmp = u8_to_u16(&hdr->title_id[6],LE); - tmp |= (i+4); - u16_to_u8(&cciset->ContentTitleID[i][6],tmp,LE); - - cciset->ContentSize[i] = GetNCCH_MediaSize(hdr)*cciset->MediaUnitSize; - cciset->ContentOffset[i] = cciset->TotalContentSize; - - cciset->TotalContentSize += cciset->ContentSize[i]; - - free(hdr); - } - } - return 0; -} - -int CheckContent0(cci_settings *cciset, user_settings *usrset) -{ - if(!usrset->Content0.size) - return NCSD_NO_NCCH0; - cciset->ncch0 = usrset->Content0.buffer; - cciset->ncch0_FileLen = usrset->Content0.size; - - if(!IsNCCH(NULL,cciset->ncch0)) - return NCSD_INVALID_NCCH0; - - return 0; -} - -int GetDataFromContent0(cci_settings *cciset, user_settings *usrset) -{ - cciset->TotalContentSize = 0x4000; - - NCCH_Header *hdr; - - hdr = GetNCCH_CommonHDR(NULL,NULL,cciset->ncch0); - - cciset->NCCH_HDR = hdr; - - u16 ncch_format_ver = u8_to_u16(hdr->version,LE); - if(ncch_format_ver != 0 && ncch_format_ver != 2){ - fprintf(stderr,"[CCI ERROR] NCCH type %d Not Supported\n",ncch_format_ver); - return FAILED_TO_IMPORT_FILE; - } - - //memdump(stdout,"ncch0 head: ",(cciset->ncch0+0x100),0x100); - //memdump(stdout,"ncch0 head: ",(u8*)(hdr),0x100); - - memcpy(cciset->MediaID,hdr->title_id,8); - memcpy(&cciset->ContentTitleID[0],hdr->title_id,8); - if(usrset->GenSDKCardInfoHeader){ - memcpy(cciset->InitialData,Stock_InitialData,0x30); - memcpy(cciset->TitleKey,Stock_TitleKey,0x10); - } - else{ - u8 Hash[0x40]; - ctr_sha(cciset->ncch0,0x80,Hash,CTR_SHA_256); - ctr_sha((cciset->ncch0+0x80),0x80,(Hash+0x20),CTR_SHA_256); - memcpy(cciset->InitialData,Hash,0x2C); - //memcpy(cciset->TitleKey,(Hash+0x30),0x10); // Might Remove - } - - - cciset->NCSD_Flags[MediaUnitSize] = hdr->flags[ContentUnitSize]; - cciset->MediaUnitSize = GetNCCH_MediaUnitSize(hdr); - - cciset->ContentSize[0] = (u64)(GetNCCH_MediaSize(hdr) * cciset->MediaUnitSize); - cciset->ContentOffset[0] = cciset->TotalContentSize; - - cciset->TotalContentSize += cciset->ContentSize[0]; - return 0; -} - -int GetMediaSize(cci_settings *cciset, user_settings *usrset) -{ - char *MediaSizeStr = usrset->yaml_set.BasicInfo.MediaSize; - if(!MediaSizeStr) cciset->MediaSize = (u64)GB*2; - else{ - if(strcasecmp(MediaSizeStr,"128MB") == 0) cciset->MediaSize = (u64)MB*128; - else if(strcasecmp(MediaSizeStr,"256MB") == 0) cciset->MediaSize = (u64)MB*256; - else if(strcasecmp(MediaSizeStr,"512MB") == 0) cciset->MediaSize = (u64)MB*512; - else if(strcasecmp(MediaSizeStr,"1GB") == 0) cciset->MediaSize = (u64)GB*1; - else if(strcasecmp(MediaSizeStr,"2GB") == 0) cciset->MediaSize = (u64)GB*2; - else if(strcasecmp(MediaSizeStr,"4GB") == 0) cciset->MediaSize = (u64)GB*4; - else if(strcasecmp(MediaSizeStr,"8GB") == 0) cciset->MediaSize = (u64)GB*8; - else if(strcasecmp(MediaSizeStr,"16GB") == 0) cciset->MediaSize = (u64)GB*16; - else if(strcasecmp(MediaSizeStr,"32GB") == 0) cciset->MediaSize = (u64)GB*32; - else { - fprintf(stderr,"[CCI ERROR] Invalid MediaSize: %s\n",MediaSizeStr); - return INVALID_YAML_OPT; - } - } - - if(usrset->yaml_set.BasicInfo.MediaFootPadding != -1) cciset->MediaFootPadding = usrset->yaml_set.BasicInfo.MediaFootPadding; - - return 0; -} - -u64 GetUnusedSize(u64 MediaSize, u8 CardType) -{ - if(CardType == CARD1){ - switch(MediaSize){ - case (u64)MB*128: return (u64)2621440; - case (u64)MB*256: return (u64)5242880; - case (u64)MB*512: return (u64)10485760; - case (u64)GB*1: return (u64)73924608; - case (u64)GB*2: return (u64)147324928; - case (u64)GB*4: return (u64)294649856; - case (u64)GB*8: return (u64)587202560; - default: return (u64)((MediaSize/MB)*0x11800); // Aprox - } - } - else if(CardType == CARD2){ - switch(MediaSize){ - case (u64)MB*512: return (u64)37224448; - case (u64)GB*1: return (u64)73924608; - case (u64)GB*2: return (u64)147324928; - case (u64)GB*4: return (u64)294649856; - case (u64)GB*8: return (u64)587202560; - default: return (u64)((MediaSize/MB)*0x11800); // Aprox - } - } - return 0; -} - -int GetNCSDFlags(cci_settings *cciset, rsf_settings *yaml) -{ - /* BackupWriteWaitTime */ - cciset->NCSD_Flags[FW6x_BackupWriteWaitTime] = 0; - if(yaml->CardInfo.BackupWriteWaitTime){ - u32 WaitTime = strtoul(yaml->CardInfo.BackupWriteWaitTime,NULL,0); - if(WaitTime > 255){ - fprintf(stderr,"[CCI ERROR] Invalid Card BackupWriteWaitTime (%d) : must 0-255\n",WaitTime); - return EXHDR_BAD_YAML_OPT; - } - cciset->NCSD_Flags[FW6x_BackupWriteWaitTime] = (u8)WaitTime; - } - - /* FW6x SaveCrypto */ - cciset->NCSD_Flags[FW6x_SaveCryptoFlag] = 1; - - /* MediaType */ - if(!yaml->CardInfo.MediaType) cciset->NCSD_Flags[MediaTypeIndex] = CARD1; - else{ - if(strcasecmp(yaml->CardInfo.MediaType,"Card1") == 0) cciset->NCSD_Flags[MediaTypeIndex] = CARD1; - else if(strcasecmp(yaml->CardInfo.MediaType,"Card2") == 0) cciset->NCSD_Flags[MediaTypeIndex] = CARD2; - else { - fprintf(stderr,"[CCI ERROR] Invalid MediaType: %s\n",yaml->CardInfo.MediaType); - return INVALID_YAML_OPT; - } - } - - /* Platform */ - cciset->NCSD_Flags[MediaPlatformIndex] = CTR; - /* - if(!yaml->TitleInfo.Platform) cciset->NCSD_Flags[MediaPlatformIndex] = CTR; - else{ - if(strcasecmp(yaml->TitleInfo.Platform,"ctr") == 0) cciset->NCSD_Flags[MediaPlatformIndex] = CTR; - else { - fprintf(stderr,"[CCI ERROR] Invalid Platform: %s\n",yaml->TitleInfo.Platform); - return INVALID_YAML_OPT; - } - } - */ - - /* CardDevice */ - if(!yaml->CardInfo.CardDevice) cciset->NCSD_Flags[CardDeviceFlag] = CARD_DEVICE_NONE; - else{ - if(strcmp(yaml->CardInfo.CardDevice,"NorFlash") == 0) { - cciset->NCSD_Flags[CardDeviceFlag] = CARD_DEVICE_NOR_FLASH; - if(cciset->NCSD_Flags[MediaTypeIndex] == CARD2){ - fprintf(stderr,"[CCI WARNING] 'CardDevice: NorFlash' is invalid on Card2\n"); - cciset->NCSD_Flags[CardDeviceFlag] = CARD_DEVICE_NONE; - } - } - else if(strcmp(yaml->CardInfo.CardDevice,"None") == 0) cciset->NCSD_Flags[CardDeviceFlag] = CARD_DEVICE_NONE; - else if(strcmp(yaml->CardInfo.CardDevice,"BT") == 0) cciset->NCSD_Flags[CardDeviceFlag] = CARD_DEVICE_BT; - else { - fprintf(stderr,"[CCI ERROR] Invalid CardDevice: %s\n",yaml->CardInfo.CardDevice); - return INVALID_YAML_OPT; - } - } - return 0; -} - -int GetWriteableAddress(cci_settings *cciset, user_settings *usrset) -{ - int result = GetSaveDataSize_yaml(&cciset->SaveDataSize,usrset); - if(result) return result; - - char *WriteableAddressStr = usrset->yaml_set.CardInfo.WritableAddress;; - - cciset->WritableAddress = -1; - if(cciset->NCSD_Flags[MediaTypeIndex] != CARD2) return 0; // Can only be set for Card2 Media - - if(WriteableAddressStr){ - if(strncmp(WriteableAddressStr,"0x",2) != 0){ - fprintf(stderr,"[CCI ERROR] WritableAddress requires a Hexadecimal value\n"); - return INVALID_YAML_OPT; - } - cciset->WritableAddress = strtoul((WriteableAddressStr+2),NULL,16); - } - if(cciset->WritableAddress == -1){ // If not set manually or is max size - if ((cciset->MediaSize / 2) < cciset->SaveDataSize){ // If SaveData size is greater than half the MediaSize - u64 saveDataSize = cciset->SaveDataSize / KB; - fprintf(stderr,"[CCI ERROR] Too large SaveDataSize %luK\n",saveDataSize); - return SAVE_DATA_TOO_LARGE; - } - if (cciset->SaveDataSize > (u64)(2047*MB)){ // Limit set by Nintendo - u64 saveDataSize = cciset->SaveDataSize / KB; - fprintf(stderr,"[CCI ERROR] Too large SaveDataSize %luK\n",saveDataSize); - return SAVE_DATA_TOO_LARGE; - } - u64 UnusedSize = GetUnusedSize(cciset->MediaSize,cciset->NCSD_Flags[MediaTypeIndex]); // Need to look into this - cciset->WritableAddress = cciset->MediaSize - UnusedSize - cciset->SaveDataSize; - } - return 0; -} - -int GetCardInfoBitmask(cci_settings *cciset, user_settings *usrset) -{ - char *str = usrset->yaml_set.CardInfo.CardType; - if(!str) cciset->CardInfoBitmask |= 0; - else{ - if(strcasecmp(str,"s1") == 0) cciset->CardInfoBitmask |= 0; - else if(strcasecmp(str,"s2") == 0) cciset->CardInfoBitmask |= 0x20; - else { - fprintf(stderr,"[CCI ERROR] Invalid CardType: %s\n",str); - return INVALID_YAML_OPT; - } - } - - str = usrset->yaml_set.CardInfo.CryptoType; - if(!str) cciset->CardInfoBitmask |= (3*0x40); - else{ - int Value = strtol(str,NULL,10); - if(Value < 0 || Value > 3) { - fprintf(stderr,"[CCI ERROR] Invalid CryptoType: %s\n",str); - return INVALID_YAML_OPT; - } - if(Value != 3){ - fprintf(stderr,"[CCI WARNING] Card crypto type = '%d'\n",Value); - } - cciset->CardInfoBitmask |= (Value*0x40); - } - - return 0; -} - -int CheckMediaSize(cci_settings *cciset) -{ - if(cciset->TotalContentSize > cciset->MediaSize){ - char *MediaSizeStr = NULL; - switch(cciset->MediaSize){ - case (u64)128*MB: MediaSizeStr = " '128MB'"; break; - case (u64)256*MB: MediaSizeStr = " '256MB'"; break; - case (u64)512*MB: MediaSizeStr = " '512MB'"; break; - case (u64)1*GB: MediaSizeStr = " '1GB'"; break; - case (u64)2*GB: MediaSizeStr = " '2GB'"; break; - case (u64)4*GB: MediaSizeStr = " '4GB'"; break; - case (u64)8*GB: MediaSizeStr = " '8GB'"; break; - case (u64)16*GB: MediaSizeStr = " '16GB'"; break; - case (u64)32*GB: MediaSizeStr = " '32GB'"; break; - default: MediaSizeStr = ""; break; - } - fprintf(stderr,"[CCI ERROR] MediaSize%s is too Small\n",MediaSizeStr); - return INVALID_YAML_OPT; - } - return 0; -} - -bool IsCci(u8 *ncsd) -{ - NCSD_Header *hdr = (NCSD_Header*)(ncsd+0x100); - if(!hdr) return false; - if(memcmp(hdr->magic,"NCSD",4)!=0) return false; - if(hdr->partition_flags[MediaPlatformIndex] != CTR) return false; - if(hdr->partition_flags[MediaTypeIndex] != CARD1 && hdr->partition_flags[MediaTypeIndex] != CARD2) return false; - return true; -} - -u8* GetPartition(u8 *ncsd, u8 index) -{ - return (u8*)(ncsd+GetPartitionOffset(ncsd,index)); -} - - -u64 GetPartitionOffset(u8 *ncsd, u8 index) -{ - NCSD_Header *hdr = (NCSD_Header*)(ncsd+0x100); - u32 media_size = 0x200*pow(2,hdr->partition_flags[MediaUnitSize]); - u32 offset = u8_to_u64(hdr->offsetsize_table[index].offset,LE); - return offset*media_size; -} - -u64 GetPartitionSize(u8 *ncsd, u8 index) -{ - NCSD_Header *hdr = (NCSD_Header*)(ncsd+0x100); - u32 media_size = 0x200*pow(2,hdr->partition_flags[MediaUnitSize]); - u32 size = u8_to_u64(hdr->offsetsize_table[index].size,LE); - return size*media_size; -} diff --git a/ncsd.h b/ncsd.h deleted file mode 100644 index cb96145..0000000 --- a/ncsd.h +++ /dev/null @@ -1,163 +0,0 @@ -#ifndef _NCSD_H_ -#define _NCSD_H_ - - -// Enums -typedef enum -{ - NCSD_NO_NCCH0 = -1, - NCSD_INVALID_NCCH0 = -2, - INVALID_YAML_OPT = -3, - CCI_SIG_FAIL = -4, - -} ncsd_errors; - -typedef enum -{ - FW6x_BackupWriteWaitTime = 0, - FW6x_SaveCryptoFlag = 1, - CardDeviceFlag = 3, - MediaPlatformIndex = 4, - MediaTypeIndex = 5, - MediaUnitSize = 6, - OldCardDeviceFlag = 7 -} FlagIndex; - -typedef enum -{ - CARD_DEVICE_NOR_FLASH = 1, - CARD_DEVICE_NONE = 2, - CARD_DEVICE_BT = 3 -} _CardDevice; - -typedef enum -{ - CTR = 1, -} _PlatformIndex; - -typedef enum -{ - INNER_DEVICE, - CARD1, - CARD2, - EXTENDED_DEVICE -} _TypeIndex; - -// Structs -typedef struct -{ - u8 offset[4]; - u8 size[4]; -} partition_offsetsize; - -typedef struct -{ - u8 magic[4]; - u8 media_size[4]; - u8 title_id[8]; - u8 partitions_fs_type[8]; - u8 partitions_crypto_type[8]; - partition_offsetsize offsetsize_table[8]; - u8 exheader_hash[0x20]; - u8 additional_header_size[0x4]; - u8 sector_zero_offset[0x4]; - u8 partition_flags[8]; - u8 partition_id_table[8][8]; - u8 reserved[0x30]; -} NCSD_Header; - -typedef struct -{ - u8 writable_address[4]; - u8 card_info_bitmask[4]; - // Notes - u8 reserved_0[0xf8]; - u8 media_size_used[8]; - u8 reserved_1[0x18]; - u8 cver_title_id[8]; - u8 cver_title_version[2]; - u8 reserved_2[0xcd6]; - // - u8 ncch_0_title_id[8]; - u8 reserved_3[8]; - u8 initial_data[0x30]; - u8 reserved_4[0xc0]; - u8 ncch_0_header[0x100]; -} CardInfo_Header; - -typedef struct -{ - u8 CardDeviceReserved1[0x200]; - u8 TitleKey[0x10]; - u8 CardDeviceReserved2[0xf0]; -} Dev_CardInfo_Header; - -typedef struct -{ - u8 Signature[0x100]; - NCSD_Header commonHDR; - CardInfo_Header CardInfoHDR; - Dev_CardInfo_Header DevCardInfoHDR; - u8 *ContentImportBuffer; - keys_struct *keys; -} InternalCCI_Context; - -typedef struct -{ - u64 MediaSize; - u8 MediaID[8]; - u8 NCSD_Flags[8]; - u64 SaveDataSize; - u64 WritableAddress; - u32 CardInfoBitmask; - - u8 InitialData[0x30]; - NCCH_Header *NCCH_HDR; - u8 TitleKey[0x10]; - - u8 *ncch0; - u64 ncch0_FileLen; - FILE **content; - u64 ContentSize[CCI_MAX_CONTENT]; - u64 ContentOffset[CCI_MAX_CONTENT]; - u8 ContentTitleID[CCI_MAX_CONTENT][8]; - u64 TotalContentSize; - - bool MediaFootPadding; - u32 MediaUnitSize; - - FILE *out; -} cci_settings; - -static const u8 Stock_InitialData[0x30] = -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xAD, 0x88, - 0xAC, 0x41, 0xA2, 0xB1, 0x5E, 0x8F, - 0x66, 0x9C, 0x97, 0xE5, 0xE1, 0x5E, - 0xA3, 0xEB, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -static const u8 Stock_TitleKey[0x10] = -{ - 0x6E, 0xC7, 0x5F, 0xB2, 0xE2, 0xB4, - 0x87, 0x46, 0x1E, 0xDD, 0xCB, 0xB8, - 0x97, 0x11, 0x92, 0xBA -}; - -#endif - -// Public Prototypes - - -// Build Functions -int build_CCI(user_settings *usrset); - -// Read Functions -bool IsCci(u8 *ncsd); -u8* GetPartition(u8 *ncsd, u8 index); -u64 GetPartitionOffset(u8 *ncsd, u8 index); -u64 GetPartitionSize(u8 *ncsd, u8 index); \ No newline at end of file diff --git a/romfs.c b/romfs.c deleted file mode 100644 index 7a0adcd..0000000 --- a/romfs.c +++ /dev/null @@ -1,39 +0,0 @@ -#include "lib.h" -#include "ncch.h" -#include "romfs.h" - -// RomFs Build Functions - -int ImportRomFsBinaryFromFile(ncch_settings *ncchset); - -int BuildRomFs(ncch_settings *ncchset) -{ - int result = 0; - - // If Not Using RomFS Return - if(!ncchset->Options.UseRomFS) return result; - - if(ncchset->ComponentFilePtrs.romfs){ // The user has specified a pre-built RomFs Binary - result = ImportRomFsBinaryFromFile(ncchset); - return result; - } - - // Need to implement RomFs generation - - return result; -} - -int ImportRomFsBinaryFromFile(ncch_settings *ncchset) -{ - ncchset->Sections.RomFs.size = ncchset->ComponentFilePtrs.romfs_size; - ncchset->Sections.RomFs.buffer = malloc(ncchset->Sections.RomFs.size); - if(!ncchset->Sections.RomFs.buffer) {fprintf(stderr,"[ROMFS ERROR] MEM ERROR\n"); return MEM_ERROR;} - ReadFile_64(ncchset->Sections.RomFs.buffer,ncchset->Sections.RomFs.size,0,ncchset->ComponentFilePtrs.romfs); - if(memcmp(ncchset->Sections.RomFs.buffer,"IVFC",4) != 0){ - fprintf(stderr,"[ROMFS ERROR] Invalid RomFS Binary.\n"); - return INVALID_ROMFS_FILE; - } - return 0; -} - -// RomFs Read Functions \ No newline at end of file diff --git a/romfs.h b/romfs.h deleted file mode 100644 index 34dcc1a..0000000 --- a/romfs.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef _ROMFS_H_ -#define _ROMFS_H_ - -typedef enum -{ - INVALID_ROMFS_FILE = -10, -} romfs_errors; - -#endif - -// RomFs Build Functions - -int BuildRomFs(ncch_settings *ncchset); - -// RomFs Read Functions \ No newline at end of file diff --git a/srl.h b/srl.h deleted file mode 100644 index e4d1661..0000000 --- a/srl.h +++ /dev/null @@ -1,96 +0,0 @@ -#ifndef _SRL_H_ -#define _SRL_H_ - -typedef struct -{ - u8 game_title[0xC]; - u8 game_code[4]; - u8 maker_code[2]; - u8 unit_code; - u8 encryption_seed_select; - u8 device_capacity; - u8 reserved_0[9]; - u8 rom_version; - u8 internal_flag; - u8 arm9_rom_offset[4]; - u8 arm9_entry_address[4]; - u8 arm9_ram_address[4]; - u8 arm9_size[4]; - u8 arm7_rom_offset[4]; - u8 arm7_entry_address[4]; - u8 arm7_ram_address[4]; - u8 arm7_size[4]; - u8 fnt_offset[4]; - u8 fnt_size[4]; - u8 fat_offset[4]; - u8 fat_size[4]; - u8 arm9_overlay_offset[4]; - u8 arm9_overlay_size[4]; - u8 arm7_overlay_offset[4]; - u8 arm7_overlay_size[4]; - u8 normal_card_control_reg_settings[4]; - u8 secure_card_control_reg_settings[4]; - u8 icon_banner_offset[4]; - u8 secure_area_crc[2]; - u8 secure_transfer_timeout[2]; - u8 arm9_autoload[4]; - u8 arm7_autoload[4]; - u8 secure_disable[8]; - u8 ntr_rom_size[4]; - u8 header_size[4]; - u8 reserved_1[0x38]; - u8 nintendo_logo[0x9C]; - u8 nintendo_logo_crc[2]; - u8 header_crc[2]; - u8 debug_reserved[0x20]; - - //TWL Only Data - u8 config_settings[0x34]; - u8 access_control[4]; - u8 arm7_scfg_ext_mask[4]; - u8 reserved_flags[4]; - u8 arm9i_rom_offset[4]; - u8 reserved_2[4]; - u8 arm9i_load_address[4]; - u8 arm9i_size[4]; - u8 arm7i_rom_offset[4]; - u8 struct_param_base_address[4]; - u8 arm7i_load_address[4]; - u8 arm7i_size[4]; - u8 digest_ntr_region_offset[4]; - u8 digest_ntr_region_size[4]; - u8 digest_twl_region_offset[4]; - u8 digest_twl_region_size[4]; - u8 digest_sector_hashtable_offset[4]; - u8 digest_sector_hashtable_size[4]; - u8 digest_block_hashtable_offset[4]; - u8 digest_block_hashtable_size[4]; - u8 digest_sector_size[4]; - u8 digest_block_sectorcount[4]; - u8 reserved_3[8]; - u8 twl_rom_size[8]; - u8 unknown[8]; - u8 modcrypt_area_1_offset[4]; - u8 modcrypt_area_1_size[4]; - u8 modcrypt_area_2_offset[4]; - u8 modcrypt_area_2_size[4]; - u8 title_id[8]; - u8 pub_save_data_size[4]; - u8 priv_save_data_size[4]; - u8 reserved_4[0xC0]; - - // TWL and Signed NTR - u8 arm9_with_sec_area_sha1_hmac[0x14]; - u8 arm7_sha1_hmac[0x14]; - u8 digest_master_sha1_hmac[0x14]; - u8 banner_sha1_hmac[0x14]; - u8 arm9i_sha1_hmac[0x14]; - u8 arm7i_sha1_hmac[0x14]; - u8 reserved_5[0x28]; - u8 arm9_sha1_hmac[0x14]; - u8 reserved_6[0xA4C]; - u8 reserved_7[0x180]; - u8 signature[0x80]; -} SRL_Header; - -#endif \ No newline at end of file diff --git a/tik.c b/tik.c deleted file mode 100644 index da05d53..0000000 --- a/tik.c +++ /dev/null @@ -1,86 +0,0 @@ -#include "lib.h" -#include "cia.h" -#include "tik.h" - -// Private Prototypes -int SetupTicketBuffer(COMPONENT_STRUCT *tik); -int SetupTicketHeader(TicketStruct *hdr, cia_settings *ciaset); -int SignTicketHeader(TicketStruct *hdr, TicketSignatureStruct *sig, keys_struct *keys); -void SetContentIndexData(u8 *dest); - - -int BuildTicket(cia_settings *ciaset) -{ - int result = 0; - result = SetupTicketBuffer(&ciaset->CIA_Sections.Ticket); - if(result) return result; - - // Setting Ticket Struct Ptrs - TicketSignatureStruct *sig = (TicketSignatureStruct*)ciaset->CIA_Sections.Ticket.buffer; - TicketStruct *hdr = (TicketStruct*)(ciaset->CIA_Sections.Ticket.buffer+sizeof(TicketSignatureStruct)); - - result = SetupTicketHeader(hdr,ciaset); - if(result) return result; - result = SignTicketHeader(hdr,sig,ciaset->keys); - return 0; -} - -int SetupTicketBuffer(COMPONENT_STRUCT *tik) -{ - tik->size = sizeof(TicketSignatureStruct) + sizeof(TicketStruct); - tik->buffer = malloc(tik->size); - if(!tik->buffer) { fprintf(stderr,"[ERROR] MEM ERROR\n"); return MEM_ERROR; } - memset(tik->buffer,0,tik->size); - return 0; -} - -int SetupTicketHeader(TicketStruct *hdr, cia_settings *ciaset) -{ - memset(hdr,0,sizeof(TicketStruct)); - - memcpy(hdr->Issuer,ciaset->tik.TicketIssuer,0x40); - hdr->TicketFormatVersion = ciaset->tik.ticket_format_ver; - hdr->ca_crl_version = ciaset->cert.ca_crl_version; - hdr->signer_crl_version = ciaset->cert.signer_crl_version; - if(ciaset->content.EncryptContents) - CryptTitleKey(hdr->EncryptedTitleKey, ciaset->tik.TitleKey,ciaset->TitleID,ciaset->keys,ENC); - memcpy(hdr->TicketID,ciaset->tik.TicketID,8); - memcpy(hdr->DeviceID,ciaset->tik.DeviceID,8); - memcpy(hdr->TitleID,ciaset->TitleID,8); - memcpy(hdr->TicketVersion,ciaset->tik.TicketVersion,2); - hdr->CommonKeyID = ciaset->keys->aes.CurrentCommonKey; - SetContentIndexData(hdr->StaticData); - return 0; -} - -int SignTicketHeader(TicketStruct *hdr, TicketSignatureStruct *sig, keys_struct *keys) -{ - memset(sig,0,sizeof(TicketSignatureStruct)); - u32_to_u8(sig->sig_type,RSA_2048_SHA256,BE); - return ctr_sig((u8*)hdr,sizeof(TicketStruct),sig->data,keys->rsa.TIK_Pub,keys->rsa.TIK_Priv,RSA_2048_SHA256,CTR_RSA_SIGN); -} - -int CryptTitleKey(u8 *EncTitleKey, u8 *DecTitleKey, u8 *TitleID, keys_struct *keys, u8 mode) -{ - //Generating IV - u8 iv[16]; - memset(&iv,0x0,16); - memcpy(iv,TitleID,0x8); - - //Setting up Aes Context - ctr_aes_context ctx; - memset(&ctx,0x0,sizeof(ctr_aes_context)); - - //Crypting TitleKey - ctr_init_aes_cbc(&ctx,keys->aes.CommonKey[keys->aes.CurrentCommonKey],iv,mode); - if(mode == ENC) ctr_aes_cbc(&ctx,DecTitleKey,EncTitleKey,0x10,ENC); - else ctr_aes_cbc(&ctx,EncTitleKey,DecTitleKey,0x10,DEC); - - // Return - return 0; -} - -void SetContentIndexData(u8 *dest) -{ - memcpy(dest,normal_static_ticket_data,0x30); -} diff --git a/tik.h b/tik.h deleted file mode 100644 index 694faac..0000000 --- a/tik.h +++ /dev/null @@ -1,80 +0,0 @@ -#ifndef _TIK_H_ -#define _TIK_H_ - -static const unsigned char normal_static_ticket_data[0x30] = -{ - 0x00, 0x01, 0x00, 0x14, 0x00, 0x00, 0x00, 0xAC, - 0x00, 0x00, 0x00, 0x14, 0x00, 0x01, 0x00, 0x14, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, - 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x84, - 0x00, 0x00, 0x00, 0x84, 0x00, 0x03, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 -}; - -/* -static const unsigned char system_static_ticket_data[0x30] = -{ - 0x00, 0x01, 0x00, 0x14, 0x00, 0x00, 0x00, 0xAC, - 0x00, 0x00, 0x00, 0x14, 0x00, 0x01, 0x00, 0x14, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, - 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x84, - 0x00, 0x00, 0x00, 0x84, 0x00, 0x03, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00 -}; -*/ -typedef enum -{ - lic_Permanent = 0, - lic_Demo = 1, - lic_Trial = 2, - lic_Rental = 3, - lic_Subscription = 4, - lic_Service = 5, - lic_Mask = 15 -} ticket_license_type; - -typedef enum -{ - right_Permanent = 1, - right_Subscription = 2, - right_Content = 3, - right_ContentConsumption = 4, - right_AccessTitle = 5 -} ticket_item_rights; - -typedef struct -{ - u8 sig_type[4]; - u8 data[0x100]; - u8 padding[0x3C]; -} TicketSignatureStruct; - -typedef struct -{ - u8 Issuer[0x40]; - u8 ECDH[0x3c]; - u8 TicketFormatVersion; - u8 ca_crl_version; - u8 signer_crl_version; - u8 EncryptedTitleKey[0x10]; - u8 unknown_0; - u8 TicketID[8]; - u8 DeviceID[4]; - u8 TitleID[8]; - u8 unknown_1[2]; - u8 TicketVersion[2]; - u8 unused_0[8]; - u8 unused_1; - u8 CommonKeyID; - u8 unused_2[0x2F]; - u8 unknown_2; - u8 unused_3[0x82]; - u8 StaticData[0x30]; - u8 unused_4[0x7C]; -} TicketStruct; - -#endif - -// Prototypes -int BuildTicket(cia_settings *ciaset); -int CryptTitleKey(u8 *EncTitleKey, u8 *DecTitleKey, u8 *TitleID, keys_struct *keys, u8 mode); \ No newline at end of file diff --git a/titleid.c b/titleid.c deleted file mode 100644 index dba5c67..0000000 --- a/titleid.c +++ /dev/null @@ -1,243 +0,0 @@ -#include "lib.h" -#include "ncch.h" -#include "titleid.h" - -u32 SetPIDCategoryFromName(char *Category); -u32 SetPIDCategoryFromFlags(char **CategoryFlags, u32 FlagNum); -u32 SetPIDCategoryFromFlag(u32 Category, u32 Flag, char *FlagName); -u32 SetPIDUniqueId(char *UniqueIdStr); -u16 SetTitleVariation(u16 Category, rsf_settings *yaml_set); - -u64 ConvertTwlIdToCtrId(u64 pgid) -{ - return 0x0004800000000000 | (pgid & 0x00007FFFFFFFFFFF); -} - -int GetProgramID(u64 *dest, rsf_settings *yaml, bool IsForExheader) -{ - if(yaml->TitleInfo.Category && yaml->TitleInfo.CategoryFlags){ - fprintf(stderr,"[ERROR] Can not set Cateory and CategoryFlags at the same time.\n"); - return PID_BAD_YAML_SET; - } - u16 Type = 0x0004; - u32 m_Category = 0; - u32 UniqueId = 0; - u16 m_Variation = 0; - - // Getting Category - if(yaml->TitleInfo.Category) - m_Category = SetPIDCategoryFromName(yaml->TitleInfo.Category); - else if(yaml->TitleInfo.CategoryFlags) - m_Category = SetPIDCategoryFromFlags(yaml->TitleInfo.CategoryFlags,yaml->TitleInfo.CategoryFlagsNum); - if(IsForExheader && yaml->TitleInfo.TargetCategory) - m_Category = SetPIDCategoryFromName(yaml->TitleInfo.TargetCategory); - if(m_Category == PID_INVALID_CATEGORY) // Error occured - return PID_BAD_YAML_SET; - - // Getting UniqueId - if(yaml->TitleInfo.UniqueId) UniqueId = SetPIDUniqueId(yaml->TitleInfo.UniqueId); - else{ - fprintf(stderr,"[ERROR] ParameterNotFound: TitleInfo/UniqueId\n"); - return PID_BAD_YAML_SET; - } - - m_Variation = SetTitleVariation(m_Category,yaml); - if(m_Variation == PID_INVALID_VARIATION) // Error occured - return PID_BAD_YAML_SET; - - u16 Category = (u16)m_Category; - u8 Variation = (u8)m_Variation; - - u64 ProgramID = 0; - ProgramID |= (u64)Variation<<0; - ProgramID |= (u64)UniqueId<<8; - ProgramID |= (u64)Category<<32; - ProgramID |= (u64)Type<<48; - - *dest = ProgramID; - - return 0; -} - -int GetUniqueID(u32 *dest, rsf_settings *yaml) -{ - if(yaml->TitleInfo.UniqueId) *dest = 0xffffff & SetPIDUniqueId(yaml->TitleInfo.UniqueId); - else{ - fprintf(stderr,"[ERROR] ParameterNotFound: TitleInfo/UniqueId\n"); - return PID_BAD_YAML_SET; - } - return 0; -} - -u32 SetPIDCategoryFromName(char *Category) -{ - if(strcmp(Category,"Application") == 0) return PROGRAM_ID_CATEGORY_APPLICATION; - else if(strcmp(Category,"SystemApplication") == 0) return PROGRAM_ID_CATEGORY_SYSTEM_APPLICATION; - else if(strcmp(Category,"Applet") == 0) return PROGRAM_ID_CATEGORY_APPLET; - else if(strcmp(Category,"Firmware") == 0) return PROGRAM_ID_CATEGORY_FIRMWARE; - else if(strcmp(Category,"Base") == 0) return PROGRAM_ID_CATEGORY_BASE; - else if(strcmp(Category,"DlpChild") == 0) return PROGRAM_ID_CATEGORY_DLP_CHILD; - else if(strcmp(Category,"Demo") == 0) return PROGRAM_ID_CATEGORY_DEMO; - else if(strcmp(Category,"Contents") == 0) return PROGRAM_ID_CATEGORY_CONTENTS; - else if(strcmp(Category,"SystemContents") == 0) return PROGRAM_ID_CATEGORY_SYSTEM_CONTENT; - else if(strcmp(Category,"SharedContents") == 0) return PROGRAM_ID_CATEGORY_SHARED_CONTENT; - else if(strcmp(Category,"AddOnContents") == 0) return PROGRAM_ID_CATEGORY_ADD_ON_CONTENTS; - else if(strcmp(Category,"Patch") == 0) return PROGRAM_ID_CATEGORY_PATCH; - else if(strcmp(Category,"AutoUpdateContents") == 0) return PROGRAM_ID_CATEGORY_AUTO_UPDATE_CONTENT; - else { - fprintf(stderr,"[ERROR] Invalid Category: %s\n",Category); - return PID_INVALID_CATEGORY; - } -} - -u32 SetPIDCategoryFromFlags(char **CategoryFlags, u32 FlagNum) -{ - u32 Category = 0; - for(u32 i = 0; i < FlagNum; i++){ - if(strcmp(CategoryFlags[i],"Normal") == 0) - Category = SetPIDCategoryFromFlag(Category,PROGRAM_ID_CATEGORY_FLAG_NORMAL,"Normal"); - else if(strcmp(CategoryFlags[i],"DlpChild") == 0) - Category = SetPIDCategoryFromFlag(Category,PROGRAM_ID_CATEGORY_FLAG_DLP_CHILD,"DlpChild"); - else if(strcmp(CategoryFlags[i],"Demo") == 0) - Category = SetPIDCategoryFromFlag(Category,PROGRAM_ID_CATEGORY_FLAG_DEMO,"Demo"); - else if(strcmp(CategoryFlags[i],"Contents") == 0) - Category = SetPIDCategoryFromFlag(Category,PROGRAM_ID_CATEGORY_FLAG_CONTENTS,"Contents"); - else if(strcmp(CategoryFlags[i],"AddOnContents") == 0) - Category = SetPIDCategoryFromFlag(Category,PROGRAM_ID_CATEGORY_FLAG_ADD_ON_CONTENTS,"AddOnContents"); - else if(strcmp(CategoryFlags[i],"Patch") == 0) - Category = SetPIDCategoryFromFlag(Category,PROGRAM_ID_CATEGORY_FLAG_PATCH,"Patch"); - else if(strcmp(CategoryFlags[i],"CannotExecution") == 0) - Category = SetPIDCategoryFromFlag(Category,PROGRAM_ID_CATEGORY_FLAG_CANNOT_EXECUTION,"CannotExecution"); - else if(strcmp(CategoryFlags[i],"System") == 0) - Category = SetPIDCategoryFromFlag(Category,PROGRAM_ID_CATEGORY_FLAG_SYSTEM,"System"); - else if(strcmp(CategoryFlags[i],"RequireBatchUpdate") == 0) - Category = SetPIDCategoryFromFlag(Category,PROGRAM_ID_CATEGORY_FLAG_REQUIRE_BATCH_UPDATE,"RequireBatchUpdate"); - else if(strcmp(CategoryFlags[i],"NotRequireUserApproval") == 0) - Category = SetPIDCategoryFromFlag(Category,PROGRAM_ID_CATEGORY_FLAG_NOT_REQUIRE_USER_APPROVAL,"NotRequireUserApproval"); - else if(strcmp(CategoryFlags[i],"NotRequireRightForMount") == 0) - Category = SetPIDCategoryFromFlag(Category,PROGRAM_ID_CATEGORY_FLAG_NOT_REQUIRE_RIGHT_FOR_MOUNT,"NotRequireRightForMount"); - else if(strcmp(CategoryFlags[i],"CanSkipConvertJumpId") == 0) - Category = SetPIDCategoryFromFlag(Category,PROGRAM_ID_CATEGORY_FLAG_CAN_SKIP_CONVERT_JUMP_ID,"CanSkipConvertJumpId"); - - else { - fprintf(stderr,"[ERROR] Invalid CategoryFlag: %s\n",CategoryFlags[i]); - return PID_INVALID_CATEGORY; - } - - if(Category == PID_INVALID_CATEGORY) return PID_INVALID_CATEGORY; - } - return Category; -} - -u32 SetPIDCategoryFromFlag(u32 Category, u32 Flag, char *FlagName) -{ - if(!Flag) return Category; - if((Category & Flag) == Flag){ - fprintf(stderr,"[ERROR] Failed to set '%s' for category. CategoryFlag was already set.\n",FlagName); - return PID_INVALID_CATEGORY; - } - return Category |= Flag; -} - -u32 SetPIDUniqueId(char *UniqueIdStr) -{ - return 0xffffff & strtoull(UniqueIdStr,NULL,0); -} - -u16 SetTitleVariation(u16 Category, rsf_settings *yaml_set) -{ - if(IsDemo(Category)){ - if(yaml_set->TitleInfo.DemoIndex){ - u16 DemoIndex = strtol(yaml_set->TitleInfo.DemoIndex,NULL,10); - if(DemoIndex > 255 || DemoIndex == 0){ - fprintf(stderr,"[ERROR] Invalid demo index '%d'\n",DemoIndex); - return PID_INVALID_VARIATION; - } - return DemoIndex; - } - else{ - fprintf(stderr,"[ERROR] ParameterNotFound: 'TitleInfo/DemoIndex'\n"); - return PID_INVALID_VARIATION; - } - } - - else if(IsDlpChild(Category)){ - if(yaml_set->TitleInfo.ChildIndex){ - u16 ChildIndex = strtol(yaml_set->TitleInfo.ChildIndex,NULL,10); - if(ChildIndex > 255){ - fprintf(stderr,"[ERROR] Invalid child index '%d'\n",ChildIndex); - return PID_INVALID_VARIATION; - } - return ChildIndex; - } - else - return 0; - } - else if(IsAddOnContent(Category)){ - if(yaml_set->TitleInfo.Variation){ // Might Rename to DataTitleIndex - u16 DataTitleIndex = strtol(yaml_set->TitleInfo.Variation,NULL,10); - if(DataTitleIndex > 255){ - fprintf(stderr,"[ERROR] Invalid variation '%d'\n",DataTitleIndex); - return PID_INVALID_VARIATION; - } - return DataTitleIndex; - } - else - return 0; - } - else if(IsContents(Category)){ - if(yaml_set->TitleInfo.ContentsIndex){ - u16 ContentsIndex = strtol(yaml_set->TitleInfo.ContentsIndex,NULL,10); - if(ContentsIndex > 255){ - fprintf(stderr,"[ERROR] Invalid content index '%d'\n",ContentsIndex); - return PID_INVALID_VARIATION; - } - return ContentsIndex; - } - else - return 0; - } - else{ - if(yaml_set->TitleInfo.Version){ - u16 Version = strtol(yaml_set->TitleInfo.Version,NULL,10); - if(Version > 255){ - fprintf(stderr,"[ERROR] Invalid version '%d'\n",Version); - return PID_INVALID_VARIATION; - } - return Version; - } - else - return 0; - } - return PID_INVALID_VARIATION; -} - -bool IsDemo(u16 Category) -{ - return Category == PROGRAM_ID_CATEGORY_DEMO; -} - -bool IsSystem(u16 Category) -{ - return (Category & PROGRAM_ID_CATEGORY_FLAG_SYSTEM) == PROGRAM_ID_CATEGORY_FLAG_SYSTEM; -} - -bool IsDlpChild(u16 Category) -{ - return Category == PROGRAM_ID_CATEGORY_DLP_CHILD; -} - -bool IsPatch(u16 Category) -{ - return Category == PROGRAM_ID_CATEGORY_PATCH; -} - -bool IsContents(u16 Category) -{ - return (Category & PROGRAM_ID_CATEGORY_FLAG_CONTENTS) == PROGRAM_ID_CATEGORY_FLAG_CONTENTS; -} - -bool IsAddOnContent(u16 Category) -{ - return Category == PROGRAM_ID_CATEGORY_ADD_ON_CONTENTS; -} \ No newline at end of file diff --git a/titleid.h b/titleid.h deleted file mode 100644 index c0a1228..0000000 --- a/titleid.h +++ /dev/null @@ -1,99 +0,0 @@ -#ifndef _TITLEID_H_ -#define _TITLEID_H_ - -typedef enum -{ - PID_BAD_YAML_SET = -1, - PID_INVALID_CATEGORY = 0x10000, - PID_INVALID_UNIQUE_ID = 0x1000000, - PID_INVALID_VARIATION = 0x100, -} Pid_Errors; - -typedef enum -{ - PROGRAM_ID_CATEGORY_FLAG_NORMAL = 0x0000, - PROGRAM_ID_CATEGORY_FLAG_DLP_CHILD = 0x0001, - PROGRAM_ID_CATEGORY_FLAG_DEMO = 0x0002, - PROGRAM_ID_CATEGORY_FLAG_CONTENTS = 0x0003, - PROGRAM_ID_CATEGORY_FLAG_ADD_ON_CONTENTS = 0x0004, - PROGRAM_ID_CATEGORY_FLAG_PATCH = 0x0006, - PROGRAM_ID_CATEGORY_FLAG_CANNOT_EXECUTION = 0x0008, - PROGRAM_ID_CATEGORY_FLAG_SYSTEM = 0x0010, - PROGRAM_ID_CATEGORY_FLAG_REQUIRE_BATCH_UPDATE = 0x0020, - PROGRAM_ID_CATEGORY_FLAG_NOT_REQUIRE_USER_APPROVAL = 0x0040, - PROGRAM_ID_CATEGORY_FLAG_NOT_REQUIRE_RIGHT_FOR_MOUNT = 0x0080, - PROGRAM_ID_CATEGORY_FLAG_CAN_SKIP_CONVERT_JUMP_ID = 0x0100, - PROGRAM_ID_CATEGORY_FLAG_TWL = 0x8000, -} ProgramIdCategoryFlag; - -typedef enum -{ - PROGRAM_ID_CATEGORY_APPLICATION = ( PROGRAM_ID_CATEGORY_FLAG_NORMAL ), - - PROGRAM_ID_CATEGORY_DLP_CHILD = ( PROGRAM_ID_CATEGORY_FLAG_DLP_CHILD ), - - PROGRAM_ID_CATEGORY_DEMO = ( PROGRAM_ID_CATEGORY_FLAG_DEMO ), - - PROGRAM_ID_CATEGORY_CONTENTS = ( PROGRAM_ID_CATEGORY_FLAG_CONTENTS ), - - PROGRAM_ID_CATEGORY_PATCH = ( PROGRAM_ID_CATEGORY_FLAG_CANNOT_EXECUTION - | PROGRAM_ID_CATEGORY_FLAG_PATCH), - - PROGRAM_ID_CATEGORY_ADD_ON_CONTENTS = ( PROGRAM_ID_CATEGORY_FLAG_ADD_ON_CONTENTS - | PROGRAM_ID_CATEGORY_FLAG_CANNOT_EXECUTION - | PROGRAM_ID_CATEGORY_FLAG_NOT_REQUIRE_RIGHT_FOR_MOUNT ), - - PROGRAM_ID_CATEGORY_FIRMWARE = ( PROGRAM_ID_CATEGORY_FLAG_NORMAL - | PROGRAM_ID_CATEGORY_FLAG_CANNOT_EXECUTION - | PROGRAM_ID_CATEGORY_FLAG_SYSTEM - | PROGRAM_ID_CATEGORY_FLAG_REQUIRE_BATCH_UPDATE - | PROGRAM_ID_CATEGORY_FLAG_CAN_SKIP_CONVERT_JUMP_ID ), - - - PROGRAM_ID_CATEGORY_BASE = ( PROGRAM_ID_CATEGORY_FLAG_NORMAL - | PROGRAM_ID_CATEGORY_FLAG_SYSTEM - | PROGRAM_ID_CATEGORY_FLAG_REQUIRE_BATCH_UPDATE - | PROGRAM_ID_CATEGORY_FLAG_CAN_SKIP_CONVERT_JUMP_ID ), - - - PROGRAM_ID_CATEGORY_APPLET = ( PROGRAM_ID_CATEGORY_FLAG_NORMAL - | PROGRAM_ID_CATEGORY_FLAG_SYSTEM - | PROGRAM_ID_CATEGORY_FLAG_REQUIRE_BATCH_UPDATE ), - - - PROGRAM_ID_CATEGORY_SYSTEM_APPLICATION = ( PROGRAM_ID_CATEGORY_FLAG_NORMAL - | PROGRAM_ID_CATEGORY_FLAG_SYSTEM ), - - - PROGRAM_ID_CATEGORY_SYSTEM_CONTENT = ( PROGRAM_ID_CATEGORY_FLAG_CONTENTS - | PROGRAM_ID_CATEGORY_FLAG_CANNOT_EXECUTION - | PROGRAM_ID_CATEGORY_FLAG_SYSTEM ), - - - PROGRAM_ID_CATEGORY_SHARED_CONTENT = ( PROGRAM_ID_CATEGORY_FLAG_CONTENTS - | PROGRAM_ID_CATEGORY_FLAG_CANNOT_EXECUTION - | PROGRAM_ID_CATEGORY_FLAG_SYSTEM - | PROGRAM_ID_CATEGORY_FLAG_NOT_REQUIRE_RIGHT_FOR_MOUNT ), - - - PROGRAM_ID_CATEGORY_AUTO_UPDATE_CONTENT = ( PROGRAM_ID_CATEGORY_FLAG_CONTENTS - | PROGRAM_ID_CATEGORY_FLAG_CANNOT_EXECUTION - | PROGRAM_ID_CATEGORY_FLAG_SYSTEM - | PROGRAM_ID_CATEGORY_FLAG_NOT_REQUIRE_USER_APPROVAL - | PROGRAM_ID_CATEGORY_FLAG_NOT_REQUIRE_RIGHT_FOR_MOUNT ), - -} ProgramIdCategory; - -#endif - -u64 ConvertTwlIdToCtrId(u64 pgid); - -int GetProgramID(u64 *dest, rsf_settings *yaml, bool IsForExheader); -int GetUniqueID(u32 *dest, rsf_settings *yaml); - -bool IsDemo(u16 Category); -bool IsSystem(u16 Category); -bool IsDlpChild(u16 Category); -bool IsPatch(u16 Category); -bool IsContents(u16 Category); -bool IsAddOnContent(u16 Category); diff --git a/tmd.c b/tmd.c deleted file mode 100644 index 2dadf12..0000000 --- a/tmd.c +++ /dev/null @@ -1,92 +0,0 @@ -#include "lib.h" -#include "cia.h" -#include "tmd.h" - -// Private Prototypes -int SetupTMDBuffer(COMPONENT_STRUCT *tik); -int SetupTMDHeader(TMD_Struct *hdr, TMD_CONTENT_INFO_RECORD *info_record, cia_settings *ciaset); -int SignTMDHeader(TMD_Struct *hdr, TMD_SignatureStruct *sig, keys_struct *keys); -int SetupTMDInfoRecord(TMD_CONTENT_INFO_RECORD *info_record, u8 *content_record, u16 ContentCount); -int SetupTMDContentRecord(u8 *content_record, cia_settings *ciaset); - -u32 PredictTMDSize(u16 ContentCount) -{ - return sizeof(TMD_SignatureStruct) + sizeof(TMD_Struct) + sizeof(TMD_CONTENT_INFO_RECORD)*64 + sizeof(TMD_CONTENT_CHUNK_STRUCT)*ContentCount; -} - -int BuildTMD(cia_settings *ciaset) -{ - int result = 0; - result = SetupTMDBuffer(&ciaset->CIA_Sections.TitleMetaData); - if(result) return result; - - // Setting TMD Struct Ptrs - TMD_SignatureStruct *sig = (TMD_SignatureStruct*)ciaset->CIA_Sections.TitleMetaData.buffer; - TMD_Struct *hdr = (TMD_Struct*)(ciaset->CIA_Sections.TitleMetaData.buffer+sizeof(TMD_SignatureStruct)); - TMD_CONTENT_INFO_RECORD *info_record = (TMD_CONTENT_INFO_RECORD*)(ciaset->CIA_Sections.TitleMetaData.buffer+sizeof(TMD_SignatureStruct)+sizeof(TMD_Struct)); - u8 *content_record = (u8*)(ciaset->CIA_Sections.TitleMetaData.buffer+sizeof(TMD_SignatureStruct)+sizeof(TMD_Struct)+sizeof(TMD_CONTENT_INFO_RECORD)*64); - - - SetupTMDContentRecord(content_record,ciaset); - SetupTMDInfoRecord(info_record,content_record,ciaset->content.ContentCount); - result = SetupTMDHeader(hdr,info_record,ciaset); - if(result) return result; - result = SignTMDHeader(hdr,sig,ciaset->keys); - return 0; -} - -int SetupTMDBuffer(COMPONENT_STRUCT *tmd) -{ - tmd->buffer = malloc(tmd->size); // already set before - if(!tmd->buffer) { fprintf(stderr,"[ERROR] MEM ERROR\n"); return MEM_ERROR; } - memset(tmd->buffer,0,tmd->size); - return 0; -} - -int SetupTMDHeader(TMD_Struct *hdr, TMD_CONTENT_INFO_RECORD *info_record, cia_settings *ciaset) -{ - memset(hdr,0,sizeof(TMD_Struct)); - - memcpy(hdr->Issuer,ciaset->tmd.TMDIssuer,0x40); - hdr->TMDFormatVersion = ciaset->tmd.tmd_format_ver; - hdr->ca_crl_version = ciaset->cert.ca_crl_version; - hdr->signer_crl_version = ciaset->cert.signer_crl_version; - memcpy(hdr->TitleID,ciaset->TitleID,8); - memcpy(hdr->TitleType,ciaset->Title_type,4); - memcpy(hdr->SaveDataSize,ciaset->tmd.SaveDataSize,4); - memcpy(hdr->PrivSaveDataSize,ciaset->tmd.PrivSaveDataSize,4); - hdr->TWL_Flag = ciaset->tmd.twl_flag; - memcpy(hdr->TitleVersion,ciaset->tmd.TitleVersion,2); - u16_to_u8(hdr->ContentCount,ciaset->content.ContentCount,BE); - ctr_sha(info_record,sizeof(TMD_CONTENT_INFO_RECORD)*64,hdr->sha_256_hash,CTR_SHA_256); - return 0; -} - -int SignTMDHeader(TMD_Struct *hdr, TMD_SignatureStruct *sig, keys_struct *keys) -{ - memset(sig,0,sizeof(TMD_SignatureStruct)); - u32_to_u8(sig->sig_type,RSA_2048_SHA256,BE); - return ctr_sig((u8*)hdr,sizeof(TMD_Struct),sig->data,keys->rsa.TMD_Pub,keys->rsa.TMD_Priv,RSA_2048_SHA256,CTR_RSA_SIGN); -} - -int SetupTMDInfoRecord(TMD_CONTENT_INFO_RECORD *info_record, u8 *content_record, u16 ContentCount) -{ - memset(info_record,0x0,sizeof(TMD_CONTENT_INFO_RECORD)*0x40); - u16_to_u8(info_record->content_index_offset,0x0,BE); - u16_to_u8(info_record->content_command_count,ContentCount,BE); - ctr_sha(content_record,sizeof(TMD_CONTENT_CHUNK_STRUCT)*ContentCount,info_record->sha_256_hash,CTR_SHA_256); - return 0; -} - -int SetupTMDContentRecord(u8 *content_record, cia_settings *ciaset) -{ - for(int i = 0; i < ciaset->content.ContentCount; i++){ - TMD_CONTENT_CHUNK_STRUCT *ptr = (TMD_CONTENT_CHUNK_STRUCT*)(content_record+sizeof(TMD_CONTENT_CHUNK_STRUCT)*i); - u32_to_u8(ptr->content_id,ciaset->content.ContentId[i],BE); - u16_to_u8(ptr->content_index,ciaset->content.ContentIndex[i],BE); - u16_to_u8(ptr->content_type,ciaset->content.ContentType[i],BE); - u64_to_u8(ptr->content_size,ciaset->content.ContentSize[i],BE); - memcpy(ptr->sha_256_hash,ciaset->content.ContentHash[i],0x20); - } - return 0; -} \ No newline at end of file diff --git a/tmd.h b/tmd.h deleted file mode 100644 index 4394c68..0000000 --- a/tmd.h +++ /dev/null @@ -1,68 +0,0 @@ -#ifndef _TMD_H_ -#define _TMD_H_ - -typedef enum -{ - TYPE_CTR = 0x40, - TYPE_DATA = 0x8 -} title_type; - -typedef enum -{ - Encrypted = 0x0001, - Optional = 0x4000, - Shared = 0x8000 -} content_types; - -typedef struct -{ - u8 content_id[4]; - u8 content_index[2]; - u8 content_type[2]; - u8 content_size[8]; - u8 sha_256_hash[0x20]; -} TMD_CONTENT_CHUNK_STRUCT; - -typedef struct -{ - u8 content_index_offset[2]; - u8 content_command_count[2]; - u8 sha_256_hash[0x20]; -} TMD_CONTENT_INFO_RECORD; - -typedef struct -{ - u8 sig_type[4]; - u8 data[0x100]; - u8 padding[0x3C]; -} TMD_SignatureStruct; - -typedef struct -{ - u8 Issuer[0x40]; - u8 TMDFormatVersion; - u8 ca_crl_version; - u8 signer_crl_version; - u8 padding_1; - u8 SystemVersion[8]; - u8 TitleID[8]; - u8 TitleType[4]; - u8 GroupID[2]; - u8 SaveDataSize[4]; - u8 PrivSaveDataSize[4]; // Zero for CXI Content0 - u8 Reserved_0[4]; - u8 TWL_Flag; // Zero for CXI Content0 - u8 Reserved_1[0x31]; - u8 AccessRights[4]; - u8 TitleVersion[2]; - u8 ContentCount[2]; - u8 BootContent[2]; - u8 Padding[2]; - u8 sha_256_hash[0x20]; -} TMD_Struct; - -#endif - -// Prototypes -u32 PredictTMDSize(u16 ContentCount); -int BuildTMD(cia_settings *ciaset); \ No newline at end of file diff --git a/types.h b/types.h deleted file mode 100644 index 8c4123d..0000000 --- a/types.h +++ /dev/null @@ -1,39 +0,0 @@ -#include -#include -//Bools -typedef enum -{ - Good, - Fail -} return_basic; - -typedef enum -{ - MEM_ERROR = -1, - FAILED_TO_OPEN_FILE = -2, - FAILED_TO_IMPORT_FILE = -3, - FAILED_TO_CREATE_OUTFILE = -4, -} global_errors; - -typedef enum -{ - BE = 0, - LE = 1 -} endianness_flag; - -typedef enum -{ - KB = 1024, - MB = 1048576, - GB = 1073741824 -} file_unit_size; - -typedef unsigned char u8; -typedef unsigned short u16; -typedef unsigned int u32; -typedef unsigned long long u64; - -typedef signed char s8; -typedef signed short s16; -typedef signed int s32; -typedef signed long long s64; diff --git a/usersettings.c b/usersettings.c deleted file mode 100644 index 1123ade..0000000 --- a/usersettings.c +++ /dev/null @@ -1,847 +0,0 @@ -#include "lib.h" - -// Private Prototypes -void DisplayHelp(char *app_name); -void SetDefaults(user_settings *set); -int SetArgument(int argc, int i, char *argv[], user_settings *set); -int CheckArgumentCombination(user_settings *set); -void PrintNeedsArgument(char *arg); -void PrintArgumentInvalid(char *arg); -void PrintNeedsParam(char *arg); -void PrintNoNeedParam(char *arg); - -int ParseArgs(int argc, char *argv[], user_settings *usr_settings) -{ - if(argv == NULL || usr_settings == NULL) - return USR_PTR_PASS_FAIL; - - if(argc < 2){ - DisplayHelp(argv[0]); - return USR_HELP; - } - - // Detecting Help Requried - for(int i = 1; i < argc; i++){ - if(strcmp(argv[i],"-help") == 0){ - DisplayHelp(argv[0]); - return USR_HELP; - } - } - - // Allocating Memory for Content Path Ptrs - usr_settings->ContentPath = malloc(CIA_MAX_CONTENT*sizeof(char*)); - if(usr_settings->ContentPath == NULL){ - fprintf(stderr,"[SETTING ERROR] MEM ERROR\n"); - return USR_MEM_ERROR; - } - memset(usr_settings->ContentPath,0,CIA_MAX_CONTENT*sizeof(char*)); - - // Initialise Keys - InitKeys(&usr_settings->keys); - - // Setting Defaults - SetDefaults(usr_settings); - - // Parsing Arguments - int set_result; - int i = 1; - while(i < argc){ - set_result = SetArgument(argc,i,argv,usr_settings); - if(set_result < 1){ - fprintf(stderr,"[RESULT] Invalid arguments, see '%s -help'\n",argv[0]); - return set_result; - } - i += set_result; - } - - // Checking arguments - set_result = CheckArgumentCombination(usr_settings); - if(set_result) return set_result; - - // Setting Keys - SetKeys(&usr_settings->keys); - - if(!usr_settings->outfile){ - char *source_path = NULL; - if(usr_settings->IsBuildingNCCH0) source_path = usr_settings->rsf_path; - else if(usr_settings->ConvertCci) source_path = usr_settings->CciPath; - else if(usr_settings->Content0IsSrl) source_path = usr_settings->SrlPath; - else source_path = usr_settings->ContentPath[0]; - u16 outfile_len = strlen(source_path) + 3; - usr_settings->outfile = malloc(outfile_len); - if(!usr_settings->outfile){ - fprintf(stderr,"[SETTING ERROR] MEM ERROR\n"); - return USR_MEM_ERROR; - } - usr_settings->outfile_mallocd = true; - append_filextention(usr_settings->outfile,outfile_len,source_path,(char*)&output_extention[usr_settings->out_format-1]); - } - return 0; -} - -void SetDefaults(user_settings *set) -{ - // Target Info - set->keys.keyset = keyset_RETAIL; - - // Build NCCH Info - set->IsBuildingNCCH0 = true; - set->include_exefs_logo = false; - set->out_format = CXI; - set->build_ncch_type = format_not_set; - - // Yaml Settings - set->yaml_set.Option.EnableCompress = true; - set->yaml_set.Option.EnableCrypt = true; - set->yaml_set.Option.UseOnSD = false; - set->yaml_set.Option.FreeProductCode = false; - - // Content0 Info - set->Content0IsNcch = true; - set->ConvertCci = false; - set->Content0IsSrl = false; - - set->Version[0] = 0xffff; - - // CCI Info - set->GenSDKCardInfoHeader = false; - set->OmitImportedNcchHdr = false; - - // CIA Info - set->EncryptContents = true; - set->RandomTitleKey = false; - for(int i = 0; i < CIA_MAX_CONTENT; i++){ - set->ContentID[i] = 0x100000000; - } -} - -int SetArgument(int argc, int i, char *argv[], user_settings *set) -{ - bool IsLastArg = (i >= (argc -1)); - bool HasParam = false; - if(!IsLastArg){ - if(argv[i+1][0] != '-') HasParam = true; - } - if(strcmp(argv[i],"-elf") == 0){ - if(!HasParam){ - PrintNeedsParam("-elf"); - return USR_ARG_REQ_PARAM; - } - set->elf_path = argv[i+1]; - return 2; - } - else if(strcmp(argv[i],"-rsf") == 0){ - if(!HasParam){ - PrintNeedsParam("-rsf"); - return USR_ARG_REQ_PARAM; - } - set->rsf_path = argv[i+1]; - return 2; - } - else if(strcmp(argv[i],"-icon") == 0){ - if(!HasParam){ - PrintNeedsParam("-icon"); - return USR_ARG_REQ_PARAM; - } - set->icon_path = argv[i+1]; - return 2; - } - else if(strcmp(argv[i],"-banner") == 0){ - if(!HasParam){ - PrintNeedsParam("-banner"); - return USR_ARG_REQ_PARAM; - } - set->banner_path = argv[i+1]; - return 2; - } - else if(strcmp(argv[i],"-logo") == 0){ - if(!HasParam){ - PrintNeedsParam("-logo"); - return USR_ARG_REQ_PARAM; - } - set->logo_path = argv[i+1]; - return 2; - } - else if(strcmp(argv[i],"-o") == 0){ - if(!HasParam){ - PrintNeedsParam("-o"); - return USR_ARG_REQ_PARAM; - } - set->outfile = argv[i+1]; - set->outfile_mallocd = false; - return 2; - } - else if(strcmp(argv[i],"-exheader") == 0){ - if(!HasParam){ - PrintNeedsParam("-exheader"); - return USR_ARG_REQ_PARAM; - } - set->exheader_path = argv[i+1]; - return 2; - } - else if(strcmp(argv[i],"-code") == 0){ - if(!HasParam){ - PrintNeedsParam("-code"); - return USR_ARG_REQ_PARAM; - } - set->exefs_code_path = argv[i+1]; - return 2; - } - else if(strcmp(argv[i],"-romfs") == 0){ - if(!HasParam){ - PrintNeedsParam("-romfs"); - return USR_ARG_REQ_PARAM; - } - set->romfs_path = argv[i+1]; - return 2; - } - else if(strcmp(argv[i],"-plain-region") == 0){ - if(!HasParam){ - PrintNeedsParam("-plain-region"); - return USR_ARG_REQ_PARAM; - } - set->plain_region_path = argv[i+1]; - return 2; - } - else if(strcmp(argv[i],"-target") == 0){ - if(!HasParam){ - PrintNeedsParam("-target"); - return USR_ARG_REQ_PARAM; - } - if(strcasecmp(argv[i+1],"debug") == 0 || strcasecmp(argv[i+1],"dev") == 0) - set->keys.keyset = keyset_DEBUG; - else if(strcasecmp(argv[i+1],"retail") == 0 || strcasecmp(argv[i+1],"prod") == 0) - set->keys.keyset = keyset_RETAIL; - else{ - fprintf(stderr,"[SETTING ERROR] Unrecognised target '%s'\n",argv[i+1]); - return USR_BAD_ARG; - } - return 2; - } - else if(strcmp(argv[i],"-cci") == 0){ - if(!HasParam){ - PrintNeedsParam("-cci"); - return USR_ARG_REQ_PARAM; - } - set->ConvertCci = true; - set->Content0IsSrl = false; - set->Content0IsNcch = false; - set->IsBuildingNCCH0 = false; - set->out_format = CIA; - set->CciPath = argv[i+1]; - return 2; - } - else if(strcmp(argv[i],"-srl") == 0){ - if(!HasParam){ - PrintNeedsParam("-srl"); - return USR_ARG_REQ_PARAM; - } - set->ConvertCci = false; - set->Content0IsSrl = true; - set->Content0IsNcch = false; - set->IsBuildingNCCH0 = false; - set->out_format = CIA; - set->SrlPath = argv[i+1]; - return 2; - - } - else if(strcmp(argv[i],"-devcardcci") == 0){ - if(HasParam){ - PrintNoNeedParam("-devcardcci"); - return USR_BAD_ARG; - } - set->GenSDKCardInfoHeader = true; - return 1; - } - else if(strcmp(argv[i],"-omitncchhdr") == 0){ - if(HasParam){ - PrintNoNeedParam("-omitncchhdr"); - return USR_BAD_ARG; - } - set->OmitImportedNcchHdr = true; - return 1; - } - else if(strcmp(argv[i],"-cfa") == 0){ - if(HasParam){ - PrintNoNeedParam("-cfa"); - return USR_ARG_REQ_PARAM; - } - set->build_ncch_type = CFA; - - return 1; - } - else if(strcmp(argv[i],"-f") == 0){ - if(!HasParam){ - PrintNeedsParam("-f"); - return USR_ARG_REQ_PARAM; - } - if(strcasecmp(argv[i+1],"cxi") == 0 || strcasecmp(argv[i+1],"exec") == 0 ) set->out_format = CXI; - else if(strcasecmp(argv[i+1],"cfa") == 0 || strcasecmp(argv[i+1],"data") == 0 ) set->out_format = CFA; - else if(strcasecmp(argv[i+1],"cci") == 0 || strcasecmp(argv[i+1],"card") == 0 ) set->out_format = CCI; - else if(strcasecmp(argv[i+1],"cia") == 0) set->out_format = CIA; - else { - fprintf(stderr,"[-] Invalid output format '%s'\n",argv[i+1]); - return USR_BAD_ARG; - } - return 2; - } - else if(strcmp(argv[i],"-sysfixedkey") == 0){ - if(!HasParam){ - PrintNeedsParam("-sysfixedkey"); - return USR_ARG_REQ_PARAM; - } - if(strlen(argv[i+1]) != 32) { - fprintf(stderr,"[ERROR] Invalid SystemFixedKey '%s'\n",argv[i+1]); - return USR_BAD_ARG; - } - u8 *key = malloc(16); - if(!key){ - fprintf(stderr,"[ERROR] MEM ERROR\n"); - return USR_MEM_ERROR; - } - char_to_u8_array(key,argv[i+1],16,BE,16); - SetSystemFixedKey(&set->keys,key); - free(key); - return 2; - } - else if(strcmp(argv[i],"-commonkey") == 0){ - if(!HasParam){ - PrintNeedsParam("-commonkey"); - return USR_ARG_REQ_PARAM; - } - if(strlen(argv[i+1]) != 32) { - fprintf(stderr,"[ERROR] Invalid CommonKey '%s'\n",argv[i+1]); - return USR_BAD_ARG; - } - u8 *key = malloc(16); - if(!key){ - fprintf(stderr,"[ERROR] MEM ERROR\n"); - return USR_MEM_ERROR; - } - char_to_u8_array(key,argv[i+1],16,BE,16); - - if(i+2 < argc){ - u8 id = strtol(argv[i+2],NULL,10); - SetCommonKey(&set->keys,key,id); - SetCurrentCommonKey(&set->keys,id); - } - else SetCommonKey(&set->keys,key,0); - SetCurrentCommonKey(&set->keys,0); - free(key); - return 2; - } - else if(strcmp(argv[i],"-accessdesc") == 0){ - if(!HasParam){ - PrintNeedsParam("-accessdesc"); - return USR_ARG_REQ_PARAM; - } - char *tmp = argv[i+1]; - char *tmp2 = strstr(tmp,":"); - if(!tmp2){ - fprintf(stderr,"[SETTING ERROR] Bad argument '%s %s', correct format:\n",argv[i],argv[i+1]); - fprintf(stderr," -accessdesc :\n"); - } - if(strlen(tmp2) < 2){ - fprintf(stderr,"[SETTING ERROR] Bad argument '%s %s', correct format:\n",argv[i],argv[i+1]); - fprintf(stderr," -accessdesc :\n"); - } - - u32 app_type_len = (u32)(tmp2-tmp); - char *app_type = malloc(app_type_len+1); - memset(app_type,0,app_type_len+1); - memcpy(app_type,tmp,app_type_len); - - if(strcasecmp(app_type,"App") == 0 || strcasecmp(app_type,"SDApp") == 0) set->keys.AccessDescSign.PresetType = app; - else if(strcasecmp(app_type,"Demo") == 0) set->keys.AccessDescSign.PresetType = demo; - else if(strcasecmp(app_type,"DlpChild") == 0 || strcasecmp(app_type,"Dlp") == 0) set->keys.AccessDescSign.PresetType = dlp; - else{ - fprintf(stderr,"[SETTING ERROR] Accessdesc AppType preset '%s' not valid, please manually configure RSF\n",app_type); - return USR_BAD_ARG; - } - - - char *target_firmware = (tmp2+1); - set->keys.AccessDescSign.TargetFirmware = strtoul(target_firmware,NULL,10); - return 2; - } - - else if(strcmp(argv[i],"-exefslogo") == 0){ - if(HasParam){ - PrintNoNeedParam("-exefslogo"); - return USR_BAD_ARG; - } - set->include_exefs_logo = true; - return 1; - } - else if(strcmp(argv[i],"-rand") == 0){ - if(HasParam){ - PrintNoNeedParam("-rand"); - return USR_BAD_ARG; - } - set->RandomTitleKey = true; - return 1; - } - else if(strcmp(argv[i],"-nocryptcia") == 0){ - if(HasParam){ - PrintNoNeedParam("-nocryptcia"); - return USR_BAD_ARG; - } - set->EncryptContents = false; - return 1; - } - else if(strcmp(argv[i],"-major") == 0){ - if(!HasParam){ - PrintNeedsParam("-major"); - return USR_ARG_REQ_PARAM; - } - u32 tmp = strtoul(argv[i+1],NULL,10); - set->Version[0] = tmp > 63 ? 63 : tmp; - return 2; - } - else if(strcmp(argv[i],"-minor") == 0){ - if(!HasParam){ - PrintNeedsParam("-minor"); - return USR_ARG_REQ_PARAM; - } - u32 tmp = strtoul(argv[i+1],NULL,10); - set->Version[1] = tmp > 63 ? 63 : tmp; - return 2; - } - else if(strcmp(argv[i],"-micro") == 0){ - if(!HasParam){ - PrintNeedsParam("-micro"); - return USR_ARG_REQ_PARAM; - } - u32 tmp = strtoul(argv[i+1],NULL,10); - set->Version[2] = tmp > 15 ? 15 : tmp; - return 2; - } - - else if(strcmp(argv[i],"-content") == 0){ - if(!HasParam){ - PrintNeedsParam("-content"); - return USR_ARG_REQ_PARAM; - } - char *pos = strstr(argv[i+1],":"); - if(!pos){ - fprintf(stderr,"[SETTING ERROR] Bad argument '%s %s', correct format:\n",argv[i],argv[i+1]); - fprintf(stderr," -content :\n"); - fprintf(stderr," If generating a CIA, then use the format:\n"); - fprintf(stderr," -content ::\n"); - return USR_BAD_ARG; - } - if(strlen(pos) < 2){ - fprintf(stderr,"[SETTING ERROR] Bad argument '%s %s', correct format:\n",argv[i],argv[i+1]); - fprintf(stderr," -content :\n"); - fprintf(stderr," If generating a CIA, then use the format:\n"); - fprintf(stderr," -content ::\n"); - return USR_BAD_ARG; - } - - /* Getting Content Index */ - u16 content_index = strtol((char*)(pos+1),NULL,10); - - /* Storing Content Filepath */ - u32 path_len = (u32)(pos-argv[i+1])+1; - - if(content_index == 0) set->IsBuildingNCCH0 = false; - if(set->ContentPath[content_index] != NULL){ - fprintf(stderr,"[SETTING ERROR] Content %d is already specified\n",content_index); - return USR_BAD_ARG; - } - set->ContentPath[content_index] = malloc(path_len); - if(set->ContentPath[content_index] == NULL){ - fprintf(stderr,"[SETTING ERROR] MEM ERROR\n"); - return USR_MEM_ERROR; - } - memset(set->ContentPath[content_index],0,path_len); - strncpy(set->ContentPath[content_index],argv[i+1],path_len-1); - - /* Get ContentID for CIA gen */ - char *pos2 = strstr(pos+1,":"); - if(pos2) { - set->ContentID[content_index] = strtoul((pos2+1),NULL,16); - } - - /* Return Next Arg Pos*/ - return 2; - } - /* - else if(strncmp(argv[i],"-D",2) == 0){ - fprintf(stderr,"[WARNING] -DNAME=VALUE not implemented yet\n"); - } - */ - - // If not a valid argument - fprintf(stderr,"[SETTING ERROR] Unrecognised argument '%s'\n",argv[i]); - return USR_UNK_ARG; -} - -int CheckArgumentCombination(user_settings *set) -{ - for(int i = 0; i < CIA_MAX_CONTENT; i++){ - if( i > CCI_MAX_CONTENT-1 && set->ContentPath[i] && set->out_format == CCI){ - fprintf(stderr,"[SETTING ERROR] Content indexes > 7 are invalid for CCI\n"); - return USR_BAD_ARG; - } - if(set->ContentPath[i] && (set->out_format == CXI || set->out_format == CFA)){ - fprintf(stderr,"[SETTING ERROR] You cannot specify content while outputting CXI/CFA files\n"); - return USR_BAD_ARG; - } - } - if((set->out_format == CXI || set->out_format == CFA) && set->build_ncch_type > 0){ - fprintf(stderr,"[SETTING ERROR] Arguments '-f cxi|cfa' and '-ncch cxi|cfa' are invalid\n"); - return USR_BAD_ARG; - } - if(set->build_ncch_type > 0 && !set->IsBuildingNCCH0){ - fprintf(stderr,"[SETTING ERROR] Arguments '-content %s:0' and '-ncch cxi|cfa' cannot be used together\n",set->ContentPath[0]); - return USR_BAD_ARG; - } - - if(set->elf_path && set->exefs_code_path){ - fprintf(stderr,"[SETTING ERROR] Arguments '-elf' and '-code' cannot be used together\n"); - return USR_BAD_ARG; - } - - // Setting set->build_ncch_type if it isn't already set - if(set->IsBuildingNCCH0 && set->build_ncch_type == 0){ - if(set->out_format == CCI || set->out_format == CIA) set->build_ncch_type = CXI; - else set->build_ncch_type = set->out_format; - } - - bool buildCXI = (set->out_format == CXI || set->build_ncch_type == CXI) && set->IsBuildingNCCH0; - bool buildCFA = (set->out_format == CFA || set->build_ncch_type == CFA) && set->IsBuildingNCCH0; - // Detecting Required Arguments - if(buildCXI && !set->elf_path && !set->exefs_code_path){ - PrintNeedsArgument("-elf"); - return USR_BAD_ARG; - } - if((buildCXI || buildCFA) && !set->rsf_path){ - PrintNeedsArgument("-rsf"); - return USR_BAD_ARG; - } - if(buildCXI && !set->exheader_path && set->exefs_code_path){ - PrintNeedsArgument("-exheader"); - return USR_BAD_ARG; - } - - // Reporting bad arguments - if(!buildCXI && set->elf_path){ - PrintArgumentInvalid("-elf"); - return USR_BAD_ARG; - } - if(!buildCXI && set->exefs_code_path){ - PrintArgumentInvalid("-code"); - return USR_BAD_ARG; - } - if(!buildCXI && set->exheader_path){ - PrintArgumentInvalid("-exheader"); - return USR_BAD_ARG; - } - if(!buildCXI && set->plain_region_path){ - PrintArgumentInvalid("-plain-region"); - return USR_BAD_ARG; - } - if(!buildCXI && set->include_exefs_logo){ - PrintArgumentInvalid("-exefslogo"); - return USR_BAD_ARG; - } - if(!set->IsBuildingNCCH0 && set->romfs_path){ - PrintArgumentInvalid("-romfs"); - return USR_BAD_ARG; - } - - return 0; -} - -void init_UserSettings(user_settings *usr_settings) -{ - memset(usr_settings,0,sizeof(user_settings)); -} - - -void free_RsfSettings(rsf_settings *set) -{ - //Option - free(set->Option.PageSize); - for(u32 i = 0; i < set->Option.AppendSystemCallNum; i++){ - free(set->Option.AppendSystemCall[i]); - } - free(set->Option.AppendSystemCall); - - //AccessControlInfo - free(set->AccessControlInfo.ProgramId); - free(set->AccessControlInfo.IdealProcessor); - free(set->AccessControlInfo.Priority); - free(set->AccessControlInfo.MemoryType); - free(set->AccessControlInfo.SystemMode); - free(set->AccessControlInfo.CoreVersion); - free(set->AccessControlInfo.HandleTableSize); - free(set->AccessControlInfo.SystemSaveDataId1); - free(set->AccessControlInfo.SystemSaveDataId2); - free(set->AccessControlInfo.OtherUserSaveDataId1); - free(set->AccessControlInfo.OtherUserSaveDataId2); - free(set->AccessControlInfo.OtherUserSaveDataId3); - free(set->AccessControlInfo.ExtSaveDataId); - free(set->AccessControlInfo.SystemMode); - free(set->AccessControlInfo.AffinityMask); - free(set->AccessControlInfo.DescVersion); - free(set->AccessControlInfo.CryptoKey); - free(set->AccessControlInfo.ResourceLimitCategory); - free(set->AccessControlInfo.ReleaseKernelMajor); - free(set->AccessControlInfo.ReleaseKernelMinor); - free(set->AccessControlInfo.MaxCpu); - - for(u32 i = 0; i < set->AccessControlInfo.MemoryMappingNum; i++){ - free(set->AccessControlInfo.MemoryMapping[i]); - } - free(set->AccessControlInfo.MemoryMapping); - - for(u32 i = 0; i < set->AccessControlInfo.IORegisterMappingNum; i++){ - free(set->AccessControlInfo.IORegisterMapping[i]); - } - free(set->AccessControlInfo.IORegisterMapping); - - for(u32 i = 0; i < set->AccessControlInfo.FileSystemAccessNum; i++){ - free(set->AccessControlInfo.FileSystemAccess[i]); - } - free(set->AccessControlInfo.FileSystemAccess); - - for(u32 i = 0; i < set->AccessControlInfo.IoAccessControlNum; i++){ - free(set->AccessControlInfo.IoAccessControl[i]); - } - free(set->AccessControlInfo.IoAccessControl); - - for(u32 i = 0; i < set->AccessControlInfo.InterruptNumbersNum; i++){ - free(set->AccessControlInfo.InterruptNumbers[i]); - } - free(set->AccessControlInfo.InterruptNumbers); - - for(u32 i = 0; i < set->AccessControlInfo.SystemCallAccessNum; i++){ - free(set->AccessControlInfo.SystemCallAccess[i]); - } - free(set->AccessControlInfo.SystemCallAccess); - - for(u32 i = 0; i < set->AccessControlInfo.ServiceAccessControlNum; i++){ - free(set->AccessControlInfo.ServiceAccessControl[i]); - } - free(set->AccessControlInfo.ServiceAccessControl); - - for(u32 i = 0; i < set->AccessControlInfo.StorageIdNum; i++){ - free(set->AccessControlInfo.StorageId[i]); - } - free(set->AccessControlInfo.StorageId); - - for(u32 i = 0; i < set->AccessControlInfo.AccessibleSaveDataIdsNum; i++){ - free(set->AccessControlInfo.AccessibleSaveDataIds[i]); - } - free(set->AccessControlInfo.AccessibleSaveDataIds); - - //SystemControlInfo - free(set->SystemControlInfo.AppType); - free(set->SystemControlInfo.StackSize); - free(set->SystemControlInfo.RemasterVersion); - free(set->SystemControlInfo.JumpId); - - for(u32 i = 0; i < set->SystemControlInfo.DependencyNum; i++){ - free(set->SystemControlInfo.Dependency[i]); - } - free(set->SystemControlInfo.Dependency); - - //BasicInfo - free(set->BasicInfo.Title); - free(set->BasicInfo.CompanyCode); - free(set->BasicInfo.ProductCode); - free(set->BasicInfo.MediaSize); - free(set->BasicInfo.ContentType); - free(set->BasicInfo.Logo); - free(set->BasicInfo.BackupMemoryType); - free(set->BasicInfo.InitialCode); - - //Rom - free(set->Rom.HostRoot); - free(set->Rom.Padding); - free(set->Rom.SaveDataSize); - - for(u32 i = 0; i < set->Rom.DefaultRejectNum; i++){ - free(set->Rom.DefaultReject[i]); - } - free(set->Rom.DefaultReject); - - for(u32 i = 0; i < set->Rom.RejectNum; i++){ - free(set->Rom.Reject[i]); - } - free(set->Rom.Reject); - - for(u32 i = 0; i < set->Rom.IncludeNum; i++){ - free(set->Rom.Include[i]); - } - free(set->Rom.Include); - - for(u32 i = 0; i < set->Rom.FileNum; i++){ - free(set->Rom.File[i]); - } - free(set->Rom.File); - - //ExeFs - for(u32 i = 0; i < set->ExeFs.TextNum; i++){ - free(set->ExeFs.Text[i]); - } - free(set->ExeFs.Text); - - for(u32 i = 0; i < set->ExeFs.ReadOnlyNum; i++){ - free(set->ExeFs.ReadOnly[i]); - } - free(set->ExeFs.ReadOnly); - - for(u32 i = 0; i < set->ExeFs.ReadWriteNum; i++){ - free(set->ExeFs.ReadWrite[i]); - } - free(set->ExeFs.ReadWrite); - - //PlainRegion - for(u32 i = 0; i < set->PlainRegionNum; i++){ - free(set->PlainRegion[i]); - } - free(set->PlainRegion); - - //TitleInfo - free(set->TitleInfo.Platform); - free(set->TitleInfo.Category); - free(set->TitleInfo.UniqueId); - free(set->TitleInfo.Version); - free(set->TitleInfo.ContentsIndex); - free(set->TitleInfo.Variation); - free(set->TitleInfo.Use); - free(set->TitleInfo.ChildIndex); - free(set->TitleInfo.DemoIndex); - free(set->TitleInfo.TargetCategory); - - for(u32 i = 0; i < set->TitleInfo.CategoryFlagsNum; i++){ - free(set->TitleInfo.CategoryFlags[i]); - } - free(set->TitleInfo.CategoryFlags); - - //CardInfo - free(set->CardInfo.WritableAddress); - free(set->CardInfo.CardType); - free(set->CardInfo.CryptoType); - free(set->CardInfo.CardDevice); - free(set->CardInfo.MediaType); - free(set->CardInfo.BackupWriteWaitTime); - - //CommonHeaderKey - free(set->CommonHeaderKey.D); - free(set->CommonHeaderKey.P); - free(set->CommonHeaderKey.Q); - free(set->CommonHeaderKey.DP); - free(set->CommonHeaderKey.DQ); - free(set->CommonHeaderKey.InverseQ); - free(set->CommonHeaderKey.Modulus); - free(set->CommonHeaderKey.Exponent); - free(set->CommonHeaderKey.AccCtlDescSign); - free(set->CommonHeaderKey.AccCtlDescBin); -} - -void free_UserSettings(user_settings *usr_settings) -{ - // Free Content Paths - if(usr_settings->ContentPath){ - for(int i = 0; i < CIA_MAX_CONTENT; i++){ - free(usr_settings->ContentPath[i]); - } - free(usr_settings->ContentPath); - } - - // Free Spec File Setting - free_RsfSettings(&usr_settings->yaml_set); - - // Free Key Data - FreeKeys(&usr_settings->keys); - - // Free Content0 - free(usr_settings->Content0.buffer); - - // Free outfile path, if malloc'd - if(usr_settings->outfile_mallocd) free(usr_settings->outfile); - - // Clear settings - init_UserSettings(usr_settings); - - // Free - free(usr_settings); -} - -void PrintNeedsArgument(char *arg) -{ - fprintf(stderr,"[SETTING ERROR] Argument '%s' is required\n",arg); -} - -void PrintArgumentInvalid(char *arg) -{ - fprintf(stderr,"[SETTING ERROR] Argument '%s' is invalid\n",arg); -} - -void PrintNeedsParam(char *arg) -{ - fprintf(stderr,"[SETTING ERROR] '%s' requires a parameter\n",arg); -} - -void PrintNoNeedParam(char *arg) -{ - fprintf(stderr,"[SETTING ERROR] '%s' does not take a parameter\n",arg); -} - -void DisplayHelp(char *app_name) -{ - printf("CTR MAKEROM %d.%d",MAKEROM_VER_MAJOR,MAKEROM_VER_MINOR); -#ifndef PUBLIC_BUILD - printf(" PRIVATE BUILD"); -#endif - printf("\n(C) 3DSGuy 2014\n"); - printf("Usage: %s [options... ]\n",app_name); - printf("Option Parameter Explanation\n"); - printf("GLOBAL OPTIONS:\n"); - printf(" -help Display this text\n"); - printf(" -rsf RSF File\n"); - printf(" -f Output Format (cxi|cfa|cci|cia)\n"); - printf(" -o Output File\n"); - //printf(" -v Verbose\n"); - //printf(" -DNAME=VALUE Substitute values in Spec files\n"); - printf("KEY OPTIONS:\n"); - printf(" -sysfixedkey <32 hex chars> Specify SystemFixed Key\n"); - printf(" -commonkey <32 hex chars> Specify commonkey and index\n"); -#ifndef PUBLIC_BUILD - printf(" -target Debug or Retail(Default)\n"); -#endif - printf("NCCH OPTIONS:\n"); - printf(" -elf ELF File\n"); - printf(" -icon Icon File\n"); - printf(" -banner Banner File\n"); - printf(" -logo Logo File (Overrides \"BasicInfo/Logo\" in RSF)\n"); - printf(" -accessdesc : Specify AccessDesc Preset\n"); - printf(" -exefslogo Include Logo in ExeFs (Required for usage on <5.X Systems)\n"); - printf(" -cfa Specify if building a Data Archive when \"-f cia\"\n"); - printf("NCCH REBUILD OPTIONS:\n"); - printf(" -code Specify ExeFs code File\n"); - printf(" -exheader ExHeader Template File\n"); - printf(" -plain-region PlainRegion File\n"); - printf(" -romfs RomFS File\n"); - printf("CCI OPTIONS:\n"); -#ifndef PUBLIC_BUILD - printf(" -devcardcci Use SDK CardInfo Method\n"); - printf(" -omitncchhdr Omit NCCH Hdr for imported NCCH0\n"); -#endif - printf(" -content : Specify content files\n"); - printf("CIA OPTIONS:\n"); -#ifndef PUBLIC_BUILD - printf(" -cci Convert CCI to CIA\n"); - printf(" -srl Use TWL SRL as Content0\n"); -#endif - printf(" -content :: Specify content files\n"); - printf(" -major Specify Title Version Major\n"); - printf(" -minor Specify Title Version Minor\n"); - printf(" -micro Specify Title Version Micro\n"); - printf(" -rand Use a random title key\n"); - printf(" -nocryptcia Don't encrypt CIA contents\n"); -} diff --git a/usersettings.h b/usersettings.h deleted file mode 100644 index 609a1dd..0000000 --- a/usersettings.h +++ /dev/null @@ -1,265 +0,0 @@ -#ifndef _USERSETTINGS_H_ -#define _USERSETTINGS_H_ - -#define CCI_MAX_CONTENT 8 -#define CIA_MAX_CONTENT 65536 - - -typedef enum -{ - USR_PTR_PASS_FAIL = -1, - USR_HELP = -2, - USR_ARG_REQ_PARAM = -3, - USR_UNK_ARG = -4, - USR_BAD_ARG = -5, - USR_MEM_ERROR = -6, -} user_settings_errors; - -typedef enum -{ - format_not_set, - CXI, - CFA, - CCI, - CIA -} output_format; - -static const char output_extention[4][5] = {".cxi",".cfa",".cci",".cia"}; - -typedef struct -{ - struct{ - // Booleans - bool NoPadding; // DELETE - bool AllowUnalignedSection; - bool EnableCrypt; - bool EnableCompress; - bool FreeProductCode; - bool UseOnSD; - - // Strings - char *PageSize; - - // String Collections - u32 AppendSystemCallNum; // DELETE - char **AppendSystemCall; // DELETE - } Option; - - struct{ - // Booleans - bool DisableDebug; - bool EnableForceDebug; - bool CanWriteSharedPage; - bool CanUsePrivilegedPriority; - bool CanUseNonAlphabetAndNumber; - bool PermitMainFunctionArgument; - bool CanShareDeviceMemory; - bool UseOtherVariationSaveData; - bool UseExtSaveData; - bool UseExtendedSaveDataAccessControl; - bool RunnableOnSleep; - bool SpecialMemoryArrange; - - // Strings - char *ProgramId; // DELETE - char *IdealProcessor; - char *Priority; - char *MemoryType; - char *SystemMode; - char *CoreVersion; - char *HandleTableSize; - char *SystemSaveDataId1; - char *SystemSaveDataId2; - char *OtherUserSaveDataId1; - char *OtherUserSaveDataId2; - char *OtherUserSaveDataId3; - char *ExtSaveDataId; - char *AffinityMask; - // Strings From DESC - char *DescVersion; - char *CryptoKey; // DELETE - char *ResourceLimitCategory; - char *ReleaseKernelMajor; - char *ReleaseKernelMinor; - char *MaxCpu; - - // String Collections - u32 MemoryMappingNum; - char **MemoryMapping; - u32 IORegisterMappingNum; - char **IORegisterMapping; - u32 FileSystemAccessNum; - char **FileSystemAccess; - u32 IoAccessControlNum; - char **IoAccessControl; //Equiv to Arm9AccessControl - u32 InterruptNumbersNum; - char **InterruptNumbers; - u32 SystemCallAccessNum; - char **SystemCallAccess; - u32 ServiceAccessControlNum; - char **ServiceAccessControl; - u32 StorageIdNum; // DELETE - char **StorageId; // DELETE - u32 AccessibleSaveDataIdsNum; - char **AccessibleSaveDataIds; - } AccessControlInfo; - - struct{ - // Strings - char *AppType; - char *StackSize; - char *RemasterVersion; - char *JumpId; - - // String Collections - u32 DependencyNum; - char **Dependency; - } SystemControlInfo; - - struct{ - // Booleans - bool MediaFootPadding; - - // Strings - char *Title; - char *CompanyCode; - char *ProductCode; - char *MediaSize; - char *ContentType; - char *Logo; - char *BackupMemoryType;// Delete - char *InitialCode;// Delete - } BasicInfo; - - struct{ - // Strings - char *HostRoot; - char *Padding; // DELETE - char *SaveDataSize; - - // String Collections - u32 DefaultRejectNum; - char **DefaultReject; - u32 RejectNum; - char **Reject; - u32 IncludeNum; - char **Include; - u32 FileNum; - char **File; - } Rom; - - struct{ - u32 TextNum; - char **Text; - u32 ReadOnlyNum; - char **ReadOnly; - u32 ReadWriteNum; - char **ReadWrite; - } ExeFs; - - u32 PlainRegionNum; - char **PlainRegion; - - struct{ - // Strings - char *Platform; // DELETE - char *Category; - char *UniqueId; - char *Version; - char *ContentsIndex; - char *Variation; - char *Use; // DELETE - char *ChildIndex; - char *DemoIndex; - char *TargetCategory; - - // String Collections - u32 CategoryFlagsNum; - char **CategoryFlags; - } TitleInfo; - - struct{ - char *WritableAddress; - char *CardType; - char *CryptoType; - char *CardDevice; - char *MediaType; - char *BackupWriteWaitTime; - } CardInfo; - - struct{ - bool Found; - - char *D; - char *P; - char *Q; - char *DP; - char *DQ; - char *InverseQ; - char *Modulus; - char *Exponent; - - char *AccCtlDescSign; - char *AccCtlDescBin; - } CommonHeaderKey; -} rsf_settings; - -typedef struct -{ - // General Settings - char *rsf_path; - bool outfile_mallocd; - char *outfile; - output_format out_format; - - // Content0 - bool ConvertCci; - char *CciPath; - bool Content0IsSrl; - char *SrlPath; - - bool Content0IsNcch; - COMPONENT_STRUCT Content0; - char **ContentPath; - u64 ContentID[CIA_MAX_CONTENT]; // For CIA - - // Ncch0 Build - bool IsBuildingNCCH0; - output_format build_ncch_type; - char *elf_path; - char *icon_path; - char *banner_path; - char *logo_path; - - bool include_exefs_logo; - - char *exefs_code_path; - char *exheader_path; - char *plain_region_path; - char *romfs_path; - - // CCI Settings - bool GenSDKCardInfoHeader; - bool OmitImportedNcchHdr; - - // CIA Settings - bool RandomTitleKey; - bool EncryptContents; - u16 Version[3]; - - // Keys - keys_struct keys; - - // RSF/DESC Imported Settings - rsf_settings yaml_set; -} user_settings; -#endif - -// Prototypes - -void init_UserSettings(user_settings *usr_settings); -void free_UserSettings(user_settings *usr_settings); -int ParseArgs(int argc, char *argv[], user_settings *usr_settings); -void ReadYAMLtest(char *filepath); - -void free_RsfSettings(rsf_settings *set); diff --git a/utils.c b/utils.c deleted file mode 100644 index 6c78ea2..0000000 --- a/utils.c +++ /dev/null @@ -1,373 +0,0 @@ -#include "lib.h" - -//MISC -void char_to_u8_array(unsigned char destination[], char source[], int size, int endianness, int base) -{ - char tmp[size][2]; - unsigned char *byte_array = malloc(size*sizeof(unsigned char)); - memset(byte_array, 0, size); - memset(destination, 0, size); - memset(tmp, 0, size*2); - - for (int i = 0; i < size; i ++){ - tmp[i][0] = source[(i*2)]; - tmp[i][1] = source[((i*2)+1)]; - tmp[i][2] = '\0'; - byte_array[i] = (unsigned char)strtol(tmp[i], NULL, base); - } - endian_memcpy(destination,byte_array,size,endianness); - free(byte_array); -} - -void endian_memcpy(u8 *destination, u8 *source, u32 size, int endianness) -{ - for (u32 i = 0; i < size; i++){ - switch (endianness){ - case(BE): - destination[i] = source[i]; - break; - case(LE): - destination[i] = source[((size-1)-i)]; - break; - } - } -} - -void u8_hex_print_be(u8 *array, int len) -{ - for(int i = 0; i < len; i++) - printf("%02x",array[i]); -} - -void u8_hex_print_le(u8 *array, int len) -{ - for(int i = 0; i < len; i++) - printf("%02x",array[len - i - 1]); -} - -u64 align_value(u64 value, u64 alignment) -{ - u64 tmp = value; - while(tmp > alignment) - tmp -= alignment; - return (value + (alignment - tmp)); -} - -void resolve_flag(unsigned char flag, unsigned char *flag_bool) -{ - unsigned char bit_mask[8] = {0x80,0x40,0x20,0x10,0x8,0x4,0x2,0x1}; - for(int i = 0; i < 8; i++){ - if (flag >= bit_mask[i]){ - flag_bool[7-i] = true; - flag -= bit_mask[i]; - } - else - flag_bool[7-i] = false; - } -} - -void resolve_flag_u16(u16 flag, unsigned char *flag_bool) -{ - u16 bit_mask[16] = {0x8000,0x4000,0x2000,0x1000,0x800,0x400,0x200,0x100,0x80,0x40,0x20,0x10,0x8,0x4,0x2,0x1}; - for(int i = 0; i < 16; i++){ - if (flag >= bit_mask[i]){ - flag_bool[15-i] = true; - flag -= bit_mask[i]; - } - else - flag_bool[15-i] = false; - } -} - -int append_filextention(char *output, u16 max_outlen, char *input, char extention[]) -{ - if(output == NULL || input == NULL){ - printf("[!] Memory Error\n"); - return Fail; - } - memset(output,0,max_outlen); - u16 extention_point = strlen(input)+1; - for(int i = strlen(input)-1; i > 0; i--){ - if(input[i] == '.'){ - extention_point = i; - break; - } - } - if(extention_point+strlen(extention) >= max_outlen){ - printf("[!] Input File Name Too Large for Output buffer\n"); - return Fail; - } - memcpy(output,input,extention_point); - sprintf(output,"%s%s",output,extention); - return 0; -} - -int CopyData(u8 **dest, u8 *source, u64 size) -{ - if(!*dest){ - *dest = malloc(size); - if(!*dest) return -1; - } - memcpy(*dest,source,size); - return 0; -} - -u64 min_u64(u64 a, u64 b) -{ - if(a < b) return a; - return b; -} - -u64 max_u64(u64 a, u64 b) -{ - if(a > b) return a; - return b; -} - -//IO Related -void WriteBuffer(void *buffer, u64 size, u64 offset, FILE *output) -{ - fseek_64(output,offset,SEEK_SET); - fwrite(buffer,size,1,output); -} - -void ReadFile_64(void *outbuff, u64 size, u64 offset, FILE *file) -{ - fseek_64(file,offset,SEEK_SET); - fread(outbuff,size,1,file); -} - -u64 GetFileSize_u64(char *filename) -{ - u64 size; -#ifdef _WIN32 - /* Making sure file exists */ - FILE *tmp = fopen(filename,"rb"); - if(!tmp) return 0; - fclose(tmp); - - int fh; - u64 n; - fh = _open( filename, 0 ); - n = _lseeki64(fh, 0, SEEK_END); - _close(fh); - size = (n / sizeof(short))*2; -#else - FILE *file = fopen(filename,"rb"); - fseeko(file, 0L, SEEK_END); - size = ftello(file); - fclose(file); -#endif - return size; -} - -u32 GetFileSize_u32(FILE *file) -{ - u32 size = 0; - fseek(file, 0L, SEEK_END); - size = ftell(file); - fseek(file, 0L, SEEK_SET); - return size; -} - -int TruncateFile_u64(char *filename, u64 filelen) -{ -#ifdef _WIN32 - HANDLE fh; - - LARGE_INTEGER fp; - fp.QuadPart = filelen; - - fh = CreateFile(filename, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); - if (fh == INVALID_HANDLE_VALUE) { - printf("[!] Invalid File handle\n"); - return 1; - } - - if (SetFilePointerEx(fh, fp, NULL, FILE_BEGIN) == 0 || - SetEndOfFile(fh) == 0) { - printf("[!] truncate failed\n"); - CloseHandle(fh); - return 1; - } - - CloseHandle(fh); - return 0; -#else - return truncate(filename,filelen); -#endif -} - -int fseek_64(FILE *fp, u64 file_pos, int whence) -{ -#ifdef _WIN32 - if(whence != SEEK_SET) - printf("[!] fseek_64, whence has been overided to SEEK_SET\n"); - fpos_t pos = file_pos; - return fsetpos(fp,&pos); //I can't believe the 2gb problem with Windows & MINGW, maybe I have a bad installation :/ -#else - return fseeko(fp,file_pos,whence); -#endif -} - -int makedir(const char* dir) -{ -#ifdef _WIN32 - return _mkdir(dir); -#else - return mkdir(dir, 0777); -#endif -} - -char *getcwdir(char *buffer,int maxlen) -{ -#ifdef _WIN32 - return _getcwd(buffer,maxlen); -#else - return getcwd(buffer,maxlen); -#endif -} - -//Data Size conversion -u16 u8_to_u16(u8 *value, u8 endianness) -{ - u16 new_value; - switch(endianness){ - case(BE): new_value = (value[1]<<0) | (value[0]<<8); break; - case(LE): new_value = (value[0]<<0) | (value[1]<<8); break; - } - return new_value; -} - -u32 u8_to_u32(u8 *value, u8 endianness) -{ - u32 new_value; - switch(endianness){ - case(BE): new_value = (value[3]<<0) | (value[2]<<8) | (value[1]<<16) | (value[0]<<24); break; - case(LE): new_value = (value[0]<<0) | (value[1]<<8) | (value[2]<<16) | (value[3]<<24); break; - } - return new_value; -} - - -u64 u8_to_u64(u8 *value, u8 endianness) -{ - u64 u64_return = 0; - switch(endianness){ - case(BE): - u64_return |= (u64)value[7]<<0; - u64_return |= (u64)value[6]<<8; - u64_return |= (u64)value[5]<<16; - u64_return |= (u64)value[4]<<24; - u64_return |= (u64)value[3]<<32; - u64_return |= (u64)value[2]<<40; - u64_return |= (u64)value[1]<<48; - u64_return |= (u64)value[0]<<56; - break; - //return (value[7]<<0) | (value[6]<<8) | (value[5]<<16) | (value[4]<<24) | (value[3]<<32) | (value[2]<<40) | (value[1]<<48) | (value[0]<<56); - case(LE): - u64_return |= (u64)value[0]<<0; - u64_return |= (u64)value[1]<<8; - u64_return |= (u64)value[2]<<16; - u64_return |= (u64)value[3]<<24; - u64_return |= (u64)value[4]<<32; - u64_return |= (u64)value[5]<<40; - u64_return |= (u64)value[6]<<48; - u64_return |= (u64)value[7]<<56; - break; - //return (value[0]<<0) | (value[1]<<8) | (value[2]<<16) | (value[3]<<24) | (value[4]<<32) | (value[5]<<40) | (value[6]<<48) | (value[7]<<56); - } - return u64_return; -} - -int u16_to_u8(u8 *out_value, u16 in_value, u8 endianness) -{ - switch(endianness){ - case(BE): - out_value[0]=(in_value >> 8); - out_value[1]=(in_value >> 0); - break; - case(LE): - out_value[0]=(in_value >> 0); - out_value[1]=(in_value >> 8); - break; - } - return 0; -} - -int u32_to_u8(u8 *out_value, u32 in_value, u8 endianness) -{ - switch(endianness){ - case(BE): - out_value[0]=(in_value >> 24); - out_value[1]=(in_value >> 16); - out_value[2]=(in_value >> 8); - out_value[3]=(in_value >> 0); - break; - case(LE): - out_value[0]=(in_value >> 0); - out_value[1]=(in_value >> 8); - out_value[2]=(in_value >> 16); - out_value[3]=(in_value >> 24); - break; - } - return 0; -} - -int u64_to_u8(u8 *out_value, u64 in_value, u8 endianness) -{ - switch(endianness){ - case(BE): - out_value[0]=(in_value >> 56); - out_value[1]=(in_value >> 48); - out_value[2]=(in_value >> 40); - out_value[3]=(in_value >> 32); - out_value[4]=(in_value >> 24); - out_value[5]=(in_value >> 16); - out_value[6]=(in_value >> 8); - out_value[7]=(in_value >> 0); - break; - case(LE): - out_value[0]=(in_value >> 0); - out_value[1]=(in_value >> 8); - out_value[2]=(in_value >> 16); - out_value[3]=(in_value >> 24); - out_value[4]=(in_value >> 32); - out_value[5]=(in_value >> 40); - out_value[6]=(in_value >> 48); - out_value[7]=(in_value >> 56); - break; - } - return 0; -} - -//Copied from ctrtool -void memdump(FILE* fout, const char* prefix, const u8* data, u32 size) -{ - u32 i; - u32 prefixlen = strlen(prefix); - u32 offs = 0; - u32 line = 0; - while(size) - { - u32 max = 32; - - if (max > size) - max = size; - - if (line==0) - fprintf(fout, "%s", prefix); - else - fprintf(fout, "%*s", prefixlen, ""); - - - for(i=0; iyaml_set,0,sizeof(rsf_settings)); - int ret = 0; - if(set->rsf_path) { - FILE *tmp = fopen(set->rsf_path,"rb"); - if(!tmp) { - fprintf(stderr,"[YAML ERROR] Failed to open %s\n",set->rsf_path); - return FAILED_TO_OPEN_FILE; - } - fclose(tmp); - ret = ParseSpecFile(&set->yaml_set,set->rsf_path); - } - return ret; -} - -int ParseSpecFile(rsf_settings *set, char *path) -{ - ctr_yaml_context *ctx = malloc(sizeof(ctr_yaml_context)); - InitYamlContext(ctx); - - /* Set Specfile Type */ - - /* Create the Parser object. */ - yaml_parser_initialize(&ctx->parser); - - /* Set a file input. */ - FILE *input = fopen(path,"rb"); - yaml_parser_set_input_file(&ctx->parser, input); - - - ctx->IsSequence = false; - ctx->IsKey = true; - ctx->prev_event = 0; - ctx->Level = 0; - - - /* Read the event sequence. */ - while (!ctx->done) { - /* Get the next event. */ - GetEvent(ctx); - if(ctx->error) goto error; - - /* Proccess Event */ - - - if(EventIsScalar(ctx)){ - EvaluateRSF(set,ctx); - if(ctx->error) goto error; - break; - } - /* - if((ctx->event.type == YAML_SEQUENCE_START_EVENT|| ctx->event.type == YAML_MAPPING_START_EVENT) && ctx->prev_event == YAML_SCALAR_EVENT) printf(":\n"); - if(ctx->event.type == YAML_SCALAR_EVENT){ - if(ctx->IsSequence){ - printf(" - %s\n",ctx->event.data.scalar.value); - } - else{ - if(!ctx->IsKey) printf(": %s\n",ctx->event.data.scalar.value); - else printf("%s",ctx->event.data.scalar.value); - } - } - */ - - /* Finish Event */ - FinishEvent(ctx); - if(ctx->error) goto error; - } - - /* Destroy the Parser object. */ - yaml_parser_delete(&ctx->parser); - fclose(input); - return 0; - - /* On error. */ - error: - fprintf(stderr,"[-] Error Proccessing RSF file\n"); - - /* Destroy the Parser object. */ - yaml_parser_delete(&ctx->parser); - fclose(input); - return ctx->error; -} - -void InitYamlContext(ctr_yaml_context *ctx) -{ - memset(ctx,0,sizeof(ctr_yaml_context)); -} - -char *GetYamlString(ctr_yaml_context *ctx) -{ - /* - if(EventIsScalar(ctx)){ - if(!GetYamlStringSize(ctx) && !ctx->event.data.scalar.value) - return ctx->event.data.scalar.value; - } - - return NULL; - */ - return (char*)ctx->event.data.scalar.value; -} - - -u32 GetYamlStringSize(ctr_yaml_context *ctx) -{ - return ctx->event.data.scalar.length; -} - -void GetEvent(ctr_yaml_context *ctx) -{ - if (!yaml_parser_parse(&ctx->parser, &ctx->event)){ - ctx->error = YAML_API_ERROR; - return; - } - CheckEvent(ctx); -} - -void CheckEvent(ctr_yaml_context *ctx) -{ - switch(ctx->event.type){ - case YAML_SEQUENCE_START_EVENT: - ctx->IsSequence = true; - ctx->IsKey = true; - ctx->Level++; - //printf("[LEVEL] %d\n",ctx->Level); - break; - case YAML_SEQUENCE_END_EVENT: - ctx->IsSequence = false; - ctx->IsKey = true; - ctx->Level--; - //printf("[LEVEL] %d\n",ctx->Level); - break; - case YAML_MAPPING_START_EVENT: - ctx->IsKey = true; - ctx->Level++; - //printf("[LEVEL] %d\n",ctx->Level); - break; - case YAML_MAPPING_END_EVENT: - ctx->IsKey = true; - ctx->Level--; - //printf("[LEVEL] %d\n",ctx->Level); - break; - case YAML_DOCUMENT_END_EVENT: - case YAML_STREAM_END_EVENT: - ctx->done = true; - break; - default: break; - } -} - -void FinishEvent(ctr_yaml_context *ctx) -{ - if(ctx->event.type == YAML_SCALAR_EVENT) { - if(!ctx->IsSequence){ - if(!ctx->IsKey)ctx->IsKey = true; - else ctx->IsKey = false; - } - } - ctx->prev_event = ctx->event.type; - yaml_event_delete(&ctx->event); -} - -bool EventIsScalar(ctr_yaml_context *ctx) -{ - return (ctx->event.type == YAML_SCALAR_EVENT); -} - -bool EventIsMappingStart(ctr_yaml_context *ctx) -{ - return (ctx->event.type == YAML_MAPPING_START_EVENT); -} - -bool EventIsMappingEnd(ctr_yaml_context *ctx) -{ - return (ctx->event.type == YAML_MAPPING_END_EVENT); -} - -bool EventIsSequenceStart(ctr_yaml_context *ctx) -{ - return (ctx->event.type == YAML_SEQUENCE_START_EVENT); -} - -bool EventIsSequenceEnd(ctr_yaml_context *ctx) -{ - return (ctx->event.type == YAML_SEQUENCE_END_EVENT); -} - -bool CheckSequenceEvent(ctr_yaml_context *ctx) -{ - GetEvent(ctx); - if(!EventIsSequenceStart(ctx)){ - FinishEvent(ctx); - //fprintf(stderr,"[-] Bad formatting in Spec file (Expected Sequence)\n"); - //ctx->error = YAML_BAD_FORMATTING; - return false; - } - FinishEvent(ctx); - return true; -} - -bool CheckMappingEvent(ctr_yaml_context *ctx) -{ - GetEvent(ctx); - if(!EventIsMappingStart(ctx)){ - FinishEvent(ctx); - //fprintf(stderr,"[-] Bad formatting in Spec file (Expected Mapping)\n"); - //ctx->error = YAML_BAD_FORMATTING; - return false; - } - FinishEvent(ctx); - return true; -} - -void BadYamlFormatting(void) -{ - fprintf(stderr,"[-] Bad formatting in Spec file\n"); -} - - -bool cmpYamlValue(char *string,ctr_yaml_context *ctx) -{ - return (strcmp(GetYamlString(ctx),string) == 0); -} - -bool casecmpYamlValue(char *string,ctr_yaml_context *ctx) -{ - return (strcasecmp(GetYamlString(ctx),string) == 0); -} - -void SetSimpleYAMLValue(char **dest, char *key, ctr_yaml_context *ctx, u32 size_limit) -{ - if(*dest){ - fprintf(stderr,"[-] Item '%s' is already set\n",key); - ctx->error = YAML_MEM_ERROR; - return; - } - - GetEvent(ctx); - if(ctx->error || ctx->done) return; - if(!EventIsScalar(ctx)){ - fprintf(stderr,"[-] '%s' requires a value\n",key); - ctx->error = YAML_BAD_FORMATTING; - return; - } - if(!GetYamlStringSize(ctx)) return; - - u32 size = GetYamlStringSize(ctx); - if(size > size_limit && size_limit) size = size_limit; - - - char *tmp = *dest; - tmp = malloc(size+2); - if(!tmp) { - ctx->error = YAML_MEM_ERROR; - return; - } - memset(tmp,0,size+2); - memcpy(tmp,GetYamlString(ctx),size); - - //printf("Setting %s to %s (size of %d)\n",key,GetYamlString(ctx),size); - //printf("Check: %s & %x\n",tmp,tmp); - *dest = tmp; - -} - -bool SetBoolYAMLValue(char *key, ctr_yaml_context *ctx) -{ - GetEvent(ctx); - if(ctx->error || ctx->done) return false; - if(!EventIsScalar(ctx)){ - fprintf(stderr,"[-] '%s' requires a value\n",key); - ctx->error = YAML_BAD_FORMATTING; - return false; - } - if(!GetYamlStringSize(ctx)){ - fprintf(stderr,"[-] '%s' requires a value\n",key); - ctx->error = YAML_BAD_FORMATTING; - return false; - } - - if(casecmpYamlValue("true",ctx)) return true; - if(casecmpYamlValue("false",ctx)) return false; - - fprintf(stderr,"[-] Invalid '%s'\n",key); - ctx->error = YAML_BAD_FORMATTING; - return false; - -} - -u32 SetYAMLSequence(char ***dest, char *key, ctr_yaml_context *ctx) -{ - if(*dest){ - fprintf(stderr,"[-] %s already set\n",key); - ctx->error = YAML_MEM_ERROR; - return 0; - } - - u32 ActualCount = 0; - u32 SlotCount = 0; - char **tmp = *dest; - if(!CheckSequenceEvent(ctx)) return 0; - SlotCount = 10; - tmp = malloc((SlotCount+1)*sizeof(char*)); - if(!tmp){ - ctx->error = YAML_MEM_ERROR; - return 0; - } - memset(tmp,0,(SlotCount+1)*sizeof(char*)); - GetEvent(ctx); - if(ctx->error || ctx->done) return 0; - if(!EventIsScalar(ctx)){ - fprintf(stderr,"[-] '%s' requires a value\n",key); - ctx->error = YAML_BAD_FORMATTING; - return 0; - } - - - if(!GetYamlStringSize(ctx)) return 0; - u32 InitLevel = ctx->Level; - while(ctx->Level == InitLevel){ - if(ctx->error || ctx->done) return 0; - tmp[ActualCount] = malloc(GetYamlStringSize(ctx)+1); - memset(tmp[ActualCount],0,GetYamlStringSize(ctx)+1); - memcpy(tmp[ActualCount],GetYamlString(ctx),GetYamlStringSize(ctx)); - ActualCount++; - if(ActualCount >= SlotCount){ // if Exceeding Ptr capacity, expand buffer - SlotCount = SlotCount*2; - char **tmp1 = malloc((SlotCount+1)*sizeof(char*)); // allocate new buffer - if(!tmp1){ - ctx->error = YAML_MEM_ERROR; - return 0; - } - memset(tmp1,0,(SlotCount+1)*sizeof(char*)); - for(u32 i = 0; i < ActualCount; i++) tmp1[i] = tmp[i]; // Transfer ptrs - free(tmp); // free original buffer - tmp = tmp1; // transfer main ptr - } - FinishEvent(ctx); - GetEvent(ctx); - } - FinishEvent(ctx); - *dest = tmp; // Give main ptr to location - return ActualCount++; // return number of strings -} - -u32 SetYAMLSequenceFromMapping(char ***dest, char *key, ctr_yaml_context *ctx, bool StoreKey) -{ - if(*dest){ - fprintf(stderr,"[-] %s already set\n",key); - ctx->error = YAML_MEM_ERROR; - return 0; - } - - u32 ActualCount = 0; - u32 SlotCount = 0; - char **tmp = *dest; - if(!CheckMappingEvent(ctx)) return 0; - SlotCount = 10; - tmp = malloc((SlotCount+1)*sizeof(char*)); - if(!tmp){ - ctx->error = YAML_MEM_ERROR; - return 0; - } - memset(tmp,0,(SlotCount+1)*sizeof(char*)); - GetEvent(ctx); - if(ctx->error || ctx->done) return 0; - if(!EventIsScalar(ctx)){ - fprintf(stderr,"[-] '%s' requires a value\n",key); - ctx->error = YAML_BAD_FORMATTING; - return 0; - } - - - if(!GetYamlStringSize(ctx)) return 0; - u32 InitLevel = ctx->Level; - while(ctx->Level == InitLevel){ - if(ctx->error || ctx->done) return 0; - if(ctx->IsKey == StoreKey){ - tmp[ActualCount] = malloc(GetYamlStringSize(ctx)+1); - memset(tmp[ActualCount],0,GetYamlStringSize(ctx)+1); - memcpy(tmp[ActualCount],GetYamlString(ctx),GetYamlStringSize(ctx)); - ActualCount++; - if(ActualCount >= SlotCount){ // if Exceeding Ptr capacity, expand buffer - SlotCount = SlotCount*2; - char **tmp1 = malloc((SlotCount+1)*sizeof(char*)); // allocate new buffer - if(!tmp1){ - ctx->error = YAML_MEM_ERROR; - return 0; - } - memset(tmp1,0,(SlotCount+1)*sizeof(char*)); - for(u32 i = 0; i < ActualCount; i++) tmp1[i] = tmp[i]; // Transfer ptrs - free(tmp); // free original buffer - tmp = tmp1; // transfer main ptr - } - } - FinishEvent(ctx); - GetEvent(ctx); - } - FinishEvent(ctx); - *dest = tmp; // Give main ptr to location - return ActualCount++; // return number of strings -} - -void SkipYAMLGroup(ctr_yaml_context *ctx) // Why Nintendo? Why is this necessary? Why can't you just create valid .desc files? -{ - FinishEvent(ctx); - GetEvent(ctx); - if(!EventIsMappingStart(ctx) && !EventIsSequenceStart(ctx) && EventIsScalar(ctx)) return; - FinishEvent(ctx); - GetEvent(ctx); - - if(ctx->error || ctx->done) return; - if(!EventIsScalar(ctx)){ - fprintf(stderr,"[-] 'Format error\n"); - ctx->error = YAML_BAD_FORMATTING; - return; - } - if(!GetYamlStringSize(ctx)) return; - u32 InitLevel = ctx->Level; - while(ctx->Level == InitLevel){ - if(ctx->error || ctx->done) return; - FinishEvent(ctx); - GetEvent(ctx); - } - FinishEvent(ctx); -} \ No newline at end of file diff --git a/yaml_ctr.h b/yaml_ctr.h deleted file mode 100644 index 7f1cfaa..0000000 --- a/yaml_ctr.h +++ /dev/null @@ -1,60 +0,0 @@ -#ifndef _YAML_H_ -#define _YAML_H_ - -typedef enum -{ - YAML_API_ERROR = -1, - YAML_BAD_GROUP_HEADER = -2, - YAML_BAD_FORMATTING = -3, - YAML_MEM_ERROR = -4, - YAML_UNKNOWN_KEY = -5, -} ctr_yaml_error; - -typedef struct -{ - // For Continued Parsing of file - yaml_parser_t parser; - yaml_event_t event; - bool done; - int error; - - // Important Details - bool IsSequence; - bool IsKey; - yaml_event_type_t prev_event; - u32 Level; - -} ctr_yaml_context; - -#endif - -// Public Prototypes -int GetYamlSettings(user_settings *set); - -// For scalar events -char *GetYamlString(ctr_yaml_context *ctx); -u32 GetYamlStringSize(ctr_yaml_context *ctx); -bool cmpYamlValue(char *string,ctr_yaml_context *ctx); // Compares a string to the current scalar event -bool casecmpYamlValue(char *string,ctr_yaml_context *ctx); // same as above but ignores case - -// Event Handlers -void GetEvent(ctr_yaml_context *ctx); -void FinishEvent(ctr_yaml_context *ctx); - - -// Event Type Checks -bool EventIsScalar(ctr_yaml_context *ctx); -bool EventIsMappingStart(ctr_yaml_context *ctx); -bool EventIsMappingEnd(ctr_yaml_context *ctx); -bool EventIsSequenceStart(ctr_yaml_context *ctx); -bool EventIsSequenceEnd(ctr_yaml_context *ctx); -bool CheckMappingEvent(ctr_yaml_context *ctx); // With extra implement, use if lazy -bool CheckSequenceEvent(ctr_yaml_context *ctx); // With extra implement, use if lazy - - -// Functions which store values -void SetSimpleYAMLValue(char **dest, char *key, ctr_yaml_context *ctx, u32 size_limit); -bool SetBoolYAMLValue(char *key, ctr_yaml_context *ctx); -u32 SetYAMLSequence(char ***dest, char *key, ctr_yaml_context *ctx); -u32 SetYAMLSequenceFromMapping(char ***dest, char *key, ctr_yaml_context *ctx, bool StoreKey); -void SkipYAMLGroup(ctr_yaml_context *ctx); \ No newline at end of file diff --git a/yamlsettings.c b/yamlsettings.c deleted file mode 100644 index 9b4ec15..0000000 --- a/yamlsettings.c +++ /dev/null @@ -1,374 +0,0 @@ -#include "lib.h" -#include "yamlsettings.h" - -void EvaluateRSF(rsf_settings *rsf, ctr_yaml_context *ctx) -{ - u32 start_level = ctx->Level-1; - - /* Check Group Key for Validity */ - CHECK_Group: - //printf("RSF Found: %s\n",GetYamlString(ctx)); - if(cmpYamlValue("Option",ctx)) {FinishEvent(ctx); GET_Option(ctx,rsf); goto GET_NextGroup;} - else if(cmpYamlValue("AccessControlInfo",ctx)) {FinishEvent(ctx); GET_AccessControlInfo(ctx,rsf); goto GET_NextGroup;} - else if(cmpYamlValue("SystemControlInfo",ctx)) {FinishEvent(ctx); GET_SystemControlInfo(ctx,rsf); goto GET_NextGroup;} - else if(cmpYamlValue("BasicInfo",ctx)) {FinishEvent(ctx); GET_BasicInfo(ctx,rsf); goto GET_NextGroup;} - else if(cmpYamlValue("Rom",ctx)) {FinishEvent(ctx); GET_Rom(ctx,rsf); goto GET_NextGroup;} - else if(cmpYamlValue("ExeFs",ctx)) {FinishEvent(ctx); GET_ExeFs(ctx,rsf); goto GET_NextGroup;} - else if(cmpYamlValue("PlainRegion",ctx)) {FinishEvent(ctx); GET_PlainRegion(ctx,rsf); goto GET_NextGroup;} - else if(cmpYamlValue("TitleInfo",ctx)) {FinishEvent(ctx); GET_TitleInfo(ctx,rsf); goto GET_NextGroup;} - else if(cmpYamlValue("CardInfo",ctx)) {FinishEvent(ctx); GET_CardInfo(ctx,rsf); goto GET_NextGroup;} - else if(cmpYamlValue("CommonHeaderKey",ctx)) {FinishEvent(ctx); GET_CommonHeaderKey(ctx,rsf); goto GET_NextGroup;} - - // If not recognised escape: - fprintf(stderr,"[-] Unrecognised Key: '%s'\n",GetYamlString(ctx)); - FinishEvent(ctx); - ctx->error = YAML_BAD_GROUP_HEADER; - return; - - /* Get Next Group and call check */ - GET_NextGroup: - // If done return - if(ctx->done || ctx->error) return; - - // Recursively getting events until done or has value - if(!ctx->event.type) GetEvent(ctx); - if(ctx->Level <= start_level) return; // No longer in RSF Domain - while(!EventIsScalar(ctx)){ - if(ctx->done || ctx->error) return; - if(ctx->Level <= start_level) return; // No longer in RSF Domain - FinishEvent(ctx); - GetEvent(ctx); - } - goto CHECK_Group; -} - -void GET_Option(ctr_yaml_context *ctx, rsf_settings *rsf) -{ - /* Checking That Group is in a map */ - if(!CheckMappingEvent(ctx)) return; - u32 InitLevel = ctx->Level; - /* Checking each child */ - GetEvent(ctx); - while(ctx->Level == InitLevel){ - if(ctx->error || ctx->done) return; - // Handle childs - if(cmpYamlValue("AllowUnalignedSection",ctx)) rsf->Option.AllowUnalignedSection = SetBoolYAMLValue("AllowUnalignedSection",ctx); - //else if(cmpYamlValue("NoPadding",ctx)) rsf->Option.NoPadding = SetBoolYAMLValue("NoPadding",ctx); - else if(cmpYamlValue("EnableCrypt",ctx)) rsf->Option.EnableCrypt = SetBoolYAMLValue("EnableCrypt",ctx); - else if(cmpYamlValue("EnableCompress",ctx)) rsf->Option.EnableCompress = SetBoolYAMLValue("EnableCompress",ctx); - else if(cmpYamlValue("FreeProductCode",ctx)) rsf->Option.FreeProductCode = SetBoolYAMLValue("FreeProductCode",ctx); - else if(cmpYamlValue("UseOnSD",ctx)) rsf->Option.UseOnSD = SetBoolYAMLValue("UseOnSD",ctx); - else if(cmpYamlValue("PageSize",ctx)) SetSimpleYAMLValue(&rsf->Option.PageSize,"PageSize",ctx,0); - //else if(cmpYamlValue("AppendSystemCall",ctx)) rsf->Option.AppendSystemCallNum = SetYAMLSequence(&rsf->Option.AppendSystemCall,"AppendSystemCall",ctx); - else{ - fprintf(stderr,"[-] Unrecognised key '%s'\n",GetYamlString(ctx)); - ctx->error = YAML_UNKNOWN_KEY; - FinishEvent(ctx); - return; - } - // Finish event start next - FinishEvent(ctx); - GetEvent(ctx); - } - FinishEvent(ctx); -} - -void GET_AccessControlInfo(ctr_yaml_context *ctx, rsf_settings *rsf) -{ - /* Checking That Group is in a map */ - if(!CheckMappingEvent(ctx)) return; - u32 InitLevel = ctx->Level; - /* Checking each child */ - GetEvent(ctx); - while(ctx->Level == InitLevel){ - if(ctx->error || ctx->done) return; - // Handle childs - if(cmpYamlValue("DisableDebug",ctx)) rsf->AccessControlInfo.DisableDebug = SetBoolYAMLValue("DisableDebug",ctx); - else if(cmpYamlValue("EnableForceDebug",ctx)) rsf->AccessControlInfo.EnableForceDebug = SetBoolYAMLValue("EnableForceDebug",ctx); - else if(cmpYamlValue("CanWriteSharedPage",ctx)) rsf->AccessControlInfo.CanWriteSharedPage = SetBoolYAMLValue("CanWriteSharedPage",ctx); - else if(cmpYamlValue("CanUsePrivilegedPriority",ctx)) rsf->AccessControlInfo.CanUsePrivilegedPriority = SetBoolYAMLValue("CanUsePrivilegedPriority",ctx); - else if(cmpYamlValue("CanUseNonAlphabetAndNumber",ctx)) rsf->AccessControlInfo.CanUseNonAlphabetAndNumber = SetBoolYAMLValue("CanUseNonAlphabetAndNumber",ctx); - else if(cmpYamlValue("PermitMainFunctionArgument",ctx)) rsf->AccessControlInfo.PermitMainFunctionArgument = SetBoolYAMLValue("PermitMainFunctionArgument",ctx); - else if(cmpYamlValue("CanShareDeviceMemory",ctx)) rsf->AccessControlInfo.CanShareDeviceMemory = SetBoolYAMLValue("CanShareDeviceMemory",ctx); - else if(cmpYamlValue("UseOtherVariationSaveData",ctx)) rsf->AccessControlInfo.UseOtherVariationSaveData = SetBoolYAMLValue("UseOtherVariationSaveData",ctx); - else if(cmpYamlValue("UseExtSaveData",ctx)) rsf->AccessControlInfo.UseExtSaveData = SetBoolYAMLValue("UseExtSaveData",ctx); - else if(cmpYamlValue("UseExtendedSaveDataAccessControl",ctx)) rsf->AccessControlInfo.UseExtendedSaveDataAccessControl = SetBoolYAMLValue("UseExtendedSaveDataAccessControl",ctx); - else if(cmpYamlValue("RunnableOnSleep",ctx)) rsf->AccessControlInfo.RunnableOnSleep = SetBoolYAMLValue("RunnableOnSleep",ctx); - else if(cmpYamlValue("SpecialMemoryArrange",ctx)) rsf->AccessControlInfo.SpecialMemoryArrange = SetBoolYAMLValue("SpecialMemoryArrange",ctx); - - - //else if(cmpYamlValue("ProgramId",ctx)) SetSimpleYAMLValue(&rsf->AccessControlInfo.ProgramId,"ProgramId",ctx,0); - else if(cmpYamlValue("IdealProcessor",ctx)) SetSimpleYAMLValue(&rsf->AccessControlInfo.IdealProcessor,"IdealProcessor",ctx,0); - else if(cmpYamlValue("Priority",ctx)) SetSimpleYAMLValue(&rsf->AccessControlInfo.Priority,"Priority",ctx,0); - else if(cmpYamlValue("MemoryType",ctx)) SetSimpleYAMLValue(&rsf->AccessControlInfo.MemoryType,"MemoryType",ctx,0); - else if(cmpYamlValue("SystemMode",ctx)) SetSimpleYAMLValue(&rsf->AccessControlInfo.SystemMode,"SystemMode",ctx,0); - else if(cmpYamlValue("CoreVersion",ctx)) SetSimpleYAMLValue(&rsf->AccessControlInfo.CoreVersion,"CoreVersion",ctx,0); - else if(cmpYamlValue("HandleTableSize",ctx)) SetSimpleYAMLValue(&rsf->AccessControlInfo.HandleTableSize,"HandleTableSize",ctx,0); - else if(cmpYamlValue("SystemSaveDataId1",ctx)) SetSimpleYAMLValue(&rsf->AccessControlInfo.SystemSaveDataId1,"SystemSaveDataId1",ctx,0); - else if(cmpYamlValue("SystemSaveDataId2",ctx)) SetSimpleYAMLValue(&rsf->AccessControlInfo.SystemSaveDataId2,"SystemSaveDataId2",ctx,0); - else if(cmpYamlValue("OtherUserSaveDataId1",ctx)) SetSimpleYAMLValue(&rsf->AccessControlInfo.OtherUserSaveDataId1,"OtherUserSaveDataId1",ctx,0); - else if(cmpYamlValue("OtherUserSaveDataId2",ctx)) SetSimpleYAMLValue(&rsf->AccessControlInfo.OtherUserSaveDataId2,"OtherUserSaveDataId2",ctx,0); - else if(cmpYamlValue("OtherUserSaveDataId3",ctx)) SetSimpleYAMLValue(&rsf->AccessControlInfo.OtherUserSaveDataId3,"OtherUserSaveDataId3",ctx,0); - else if(cmpYamlValue("ExtSaveDataId",ctx)) SetSimpleYAMLValue(&rsf->AccessControlInfo.ExtSaveDataId,"ExtSaveDataId",ctx,0); - else if(cmpYamlValue("AffinityMask",ctx)) SetSimpleYAMLValue(&rsf->AccessControlInfo.AffinityMask,"AffinityMask",ctx,0); - else if(cmpYamlValue("DescVersion",ctx)) SetSimpleYAMLValue(&rsf->AccessControlInfo.DescVersion,"DescVersion",ctx,0); - //else if(cmpYamlValue("CryptoKey",ctx)) SetSimpleYAMLValue(&rsf->AccessControlInfo.CryptoKey,"CryptoKey",ctx,0); - else if(cmpYamlValue("ResourceLimitCategory",ctx)) SetSimpleYAMLValue(&rsf->AccessControlInfo.ResourceLimitCategory,"ResourceLimitCategory",ctx,0); - else if(cmpYamlValue("ReleaseKernelMajor",ctx)) SetSimpleYAMLValue(&rsf->AccessControlInfo.ReleaseKernelMajor,"ReleaseKernelMajor",ctx,0); - else if(cmpYamlValue("ReleaseKernelMinor",ctx)) SetSimpleYAMLValue(&rsf->AccessControlInfo.ReleaseKernelMinor,"ReleaseKernelMinor",ctx,0); - else if(cmpYamlValue("MaxCpu",ctx)) SetSimpleYAMLValue(&rsf->AccessControlInfo.MaxCpu,"MaxCpu",ctx,0); - - - else if(cmpYamlValue("MemoryMapping",ctx)) rsf->AccessControlInfo.MemoryMappingNum = SetYAMLSequence(&rsf->AccessControlInfo.MemoryMapping,"MemoryMapping",ctx); - else if(cmpYamlValue("IORegisterMapping",ctx)) rsf->AccessControlInfo.IORegisterMappingNum = SetYAMLSequence(&rsf->AccessControlInfo.IORegisterMapping,"IORegisterMapping",ctx); - else if(cmpYamlValue("FileSystemAccess",ctx)) rsf->AccessControlInfo.FileSystemAccessNum = SetYAMLSequence(&rsf->AccessControlInfo.FileSystemAccess,"FileSystemAccess",ctx); - else if(cmpYamlValue("IoAccessControl",ctx)) rsf->AccessControlInfo.IoAccessControlNum = SetYAMLSequence(&rsf->AccessControlInfo.IoAccessControl,"IoAccessControl",ctx); - else if(cmpYamlValue("InterruptNumbers",ctx)) rsf->AccessControlInfo.InterruptNumbersNum = SetYAMLSequence(&rsf->AccessControlInfo.InterruptNumbers,"InterruptNumbers",ctx); - else if(cmpYamlValue("SystemCallAccess",ctx)) rsf->AccessControlInfo.SystemCallAccessNum = SetYAMLSequenceFromMapping(&rsf->AccessControlInfo.SystemCallAccess,"SystemCallAccess",ctx,false); - else if(cmpYamlValue("ServiceAccessControl",ctx)) rsf->AccessControlInfo.ServiceAccessControlNum = SetYAMLSequence(&rsf->AccessControlInfo.ServiceAccessControl,"ServiceAccessControl",ctx); - //else if(cmpYamlValue("StorageId",ctx)) rsf->AccessControlInfo.StorageIdNum = SetYAMLSequence(&rsf->AccessControlInfo.StorageId,"StorageId",ctx); - else if(cmpYamlValue("AccessibleSaveDataIds",ctx)) rsf->AccessControlInfo.AccessibleSaveDataIdsNum = SetYAMLSequence(&rsf->AccessControlInfo.AccessibleSaveDataIds,"AccessibleSaveDataIds",ctx); - - else{ - fprintf(stderr,"[-] Unrecognised key '%s'\n",GetYamlString(ctx)); - ctx->error = YAML_UNKNOWN_KEY; - FinishEvent(ctx); - return; - } - // Finish event start next - FinishEvent(ctx); - GetEvent(ctx); - } - FinishEvent(ctx); -} - -void GET_SystemControlInfo(ctr_yaml_context *ctx, rsf_settings *rsf) -{ - /* Checking That Group is in a map */ - if(!CheckMappingEvent(ctx)) return; - u32 InitLevel = ctx->Level; - /* Checking each child */ - GetEvent(ctx); - while(ctx->Level == InitLevel){ - if(ctx->error || ctx->done) return; - // Handle childs - - if(cmpYamlValue("AppType",ctx)) SetSimpleYAMLValue(&rsf->SystemControlInfo.AppType,"AppType",ctx,0); - else if(cmpYamlValue("StackSize",ctx)) SetSimpleYAMLValue(&rsf->SystemControlInfo.StackSize,"StackSize",ctx,0); - else if(cmpYamlValue("RemasterVersion",ctx)) SetSimpleYAMLValue(&rsf->SystemControlInfo.RemasterVersion,"RemasterVersion",ctx,0); - else if(cmpYamlValue("JumpId",ctx)) SetSimpleYAMLValue(&rsf->SystemControlInfo.JumpId,"JumpId",ctx,0); - else if(cmpYamlValue("Dependency",ctx)) rsf->SystemControlInfo.DependencyNum = SetYAMLSequenceFromMapping(&rsf->SystemControlInfo.Dependency,"Dependency",ctx,false); - else{ - fprintf(stderr,"[-] Unrecognised key '%s'\n",GetYamlString(ctx)); - ctx->error = YAML_UNKNOWN_KEY; - FinishEvent(ctx); - return; - } - // Finish event start next - FinishEvent(ctx); - GetEvent(ctx); - } - FinishEvent(ctx); -} - -void GET_BasicInfo(ctr_yaml_context *ctx, rsf_settings *rsf) -{ - /* Checking That Group is in a map */ - if(!CheckMappingEvent(ctx)) return; - u32 InitLevel = ctx->Level; - /* Checking each child */ - GetEvent(ctx); - while(ctx->Level == InitLevel){ - if(ctx->error || ctx->done) return; - // Handle childs - if(cmpYamlValue("MediaFootPadding",ctx)) rsf->BasicInfo.MediaFootPadding = SetBoolYAMLValue("MediaFootPadding",ctx); - else if(cmpYamlValue("Title",ctx)) SetSimpleYAMLValue(&rsf->BasicInfo.Title,"Title",ctx,0); - else if(cmpYamlValue("CompanyCode",ctx)) SetSimpleYAMLValue(&rsf->BasicInfo.CompanyCode,"CompanyCode",ctx,0); - else if(cmpYamlValue("ProductCode",ctx)) SetSimpleYAMLValue(&rsf->BasicInfo.ProductCode,"ProductCode",ctx,0); - else if(cmpYamlValue("MediaSize",ctx)) SetSimpleYAMLValue(&rsf->BasicInfo.MediaSize,"MediaSize",ctx,0); - else if(cmpYamlValue("ContentType",ctx)) SetSimpleYAMLValue(&rsf->BasicInfo.ContentType,"ContentType",ctx,0); - else if(cmpYamlValue("Logo",ctx)) SetSimpleYAMLValue(&rsf->BasicInfo.Logo,"Logo",ctx,0); - //else if(cmpYamlValue("BackupMemoryType",ctx)) SetSimpleYAMLValue(&rsf->BasicInfo.BackupMemoryType,"BackupMemoryType",ctx,0); - //else if(cmpYamlValue("InitialCode",ctx)) SetSimpleYAMLValue(&rsf->BasicInfo.InitialCode,"InitialCode",ctx,0); - else{ - fprintf(stderr,"[-] Unrecognised key '%s'\n",GetYamlString(ctx)); - ctx->error = YAML_UNKNOWN_KEY; - FinishEvent(ctx); - return; - } - // Finish event start next - FinishEvent(ctx); - GetEvent(ctx); - } - FinishEvent(ctx); -} - -void GET_Rom(ctr_yaml_context *ctx, rsf_settings *rsf) -{ - /* Checking That Group is in a map */ - if(!CheckMappingEvent(ctx)) return; - u32 InitLevel = ctx->Level; - /* Checking each child */ - GetEvent(ctx); - while(ctx->Level == InitLevel){ - if(ctx->error || ctx->done) return; - // Handle childs - - if(cmpYamlValue("HostRoot",ctx)) SetSimpleYAMLValue(&rsf->Rom.HostRoot,"HostRoot",ctx,0); - //else if(cmpYamlValue("Padding",ctx)) SetSimpleYAMLValue(&rsf->Rom.Padding,"Padding",ctx,0); - else if(cmpYamlValue("SaveDataSize",ctx)) SetSimpleYAMLValue(&rsf->Rom.SaveDataSize,"SaveDataSize",ctx,0); - - else if(cmpYamlValue("DefaultReject",ctx)) rsf->Rom.DefaultRejectNum = SetYAMLSequence(&rsf->Rom.DefaultReject,"DefaultReject",ctx); - else if(cmpYamlValue("Reject",ctx)) rsf->Rom.RejectNum = SetYAMLSequence(&rsf->Rom.Reject,"Reject",ctx); - else if(cmpYamlValue("Include",ctx)) rsf->Rom.IncludeNum = SetYAMLSequence(&rsf->Rom.Include,"Include",ctx); - else if(cmpYamlValue("File",ctx)) rsf->Rom.FileNum = SetYAMLSequence(&rsf->Rom.File,"File",ctx); - - else{ - fprintf(stderr,"[-] Unrecognised key '%s'\n",GetYamlString(ctx)); - ctx->error = YAML_UNKNOWN_KEY; - FinishEvent(ctx); - return; - } - // Finish event start next - FinishEvent(ctx); - GetEvent(ctx); - } - FinishEvent(ctx); -} - -void GET_ExeFs(ctr_yaml_context *ctx, rsf_settings *rsf) -{ - /* Checking That Group is in a map */ - if(!CheckMappingEvent(ctx)) return; - u32 InitLevel = ctx->Level; - /* Checking each child */ - GetEvent(ctx); - while(ctx->Level == InitLevel){ - if(ctx->error || ctx->done) return; - // Handle childs - - if(cmpYamlValue("Text",ctx)) rsf->ExeFs.TextNum = SetYAMLSequence(&rsf->ExeFs.Text,"Text",ctx); - else if(cmpYamlValue("ReadOnly",ctx)) rsf->ExeFs.ReadOnlyNum = SetYAMLSequence(&rsf->ExeFs.ReadOnly,"ReadOnly",ctx); - else if(cmpYamlValue("ReadWrite",ctx)) rsf->ExeFs.ReadWriteNum = SetYAMLSequence(&rsf->ExeFs.ReadWrite,"ReadWrite",ctx); - - else{ - fprintf(stderr,"[-] Unrecognised key '%s'\n",GetYamlString(ctx)); - ctx->error = YAML_UNKNOWN_KEY; - FinishEvent(ctx); - return; - } - // Finish event start next - FinishEvent(ctx); - GetEvent(ctx); - } - FinishEvent(ctx); -} - -void GET_PlainRegion(ctr_yaml_context *ctx, rsf_settings *rsf) -{ - rsf->PlainRegionNum = SetYAMLSequence(&rsf->PlainRegion,"PlainRegion",ctx); -} - -void GET_TitleInfo(ctr_yaml_context *ctx, rsf_settings *rsf) -{ - /* Checking That Group is in a map */ - if(!CheckMappingEvent(ctx)) return; - u32 InitLevel = ctx->Level; - /* Checking each child */ - GetEvent(ctx); - while(ctx->Level == InitLevel){ - if(ctx->error || ctx->done) return; - // Handle childs - - if(cmpYamlValue("Category",ctx)) SetSimpleYAMLValue(&rsf->TitleInfo.Category,"Category",ctx,0); - //else if(cmpYamlValue("Platform",ctx)) SetSimpleYAMLValue(&rsf->TitleInfo.Platform,"Platform",ctx,0); - else if(cmpYamlValue("UniqueId",ctx)) SetSimpleYAMLValue(&rsf->TitleInfo.UniqueId,"UniqueId",ctx,0); - else if(cmpYamlValue("Version",ctx)) SetSimpleYAMLValue(&rsf->TitleInfo.Version,"Version",ctx,0); - else if(cmpYamlValue("ContentsIndex",ctx)) SetSimpleYAMLValue(&rsf->TitleInfo.ContentsIndex,"ContentsIndex",ctx,0); - else if(cmpYamlValue("Variation",ctx)) SetSimpleYAMLValue(&rsf->TitleInfo.Variation,"Variation",ctx,0); - //else if(cmpYamlValue("Use",ctx)) SetSimpleYAMLValue(&rsf->TitleInfo.Use,"Use",ctx,0); - else if(cmpYamlValue("ChildIndex",ctx)) SetSimpleYAMLValue(&rsf->TitleInfo.ChildIndex,"ChildIndex",ctx,0); - else if(cmpYamlValue("DemoIndex",ctx)) SetSimpleYAMLValue(&rsf->TitleInfo.DemoIndex,"DemoIndex",ctx,0); - else if(cmpYamlValue("TargetCategory",ctx)) SetSimpleYAMLValue(&rsf->TitleInfo.TargetCategory,"TargetCategory",ctx,0); - - else if(cmpYamlValue("CategoryFlags",ctx)) rsf->TitleInfo.CategoryFlagsNum = SetYAMLSequence(&rsf->TitleInfo.CategoryFlags,"CategoryFlags",ctx); - - else{ - fprintf(stderr,"[-] Unrecognised key '%s'\n",GetYamlString(ctx)); - ctx->error = YAML_UNKNOWN_KEY; - FinishEvent(ctx); - return; - } - // Finish event start next - FinishEvent(ctx); - GetEvent(ctx); - } - FinishEvent(ctx); -} - -void GET_CardInfo(ctr_yaml_context *ctx, rsf_settings *rsf) -{ - /* Checking That Group is in a map */ - if(!CheckMappingEvent(ctx)) return; - u32 InitLevel = ctx->Level; - /* Checking each child */ - GetEvent(ctx); - while(ctx->Level == InitLevel){ - if(ctx->error || ctx->done) return; - // Handle childs - - if(cmpYamlValue("WritableAddress",ctx)) SetSimpleYAMLValue(&rsf->CardInfo.WritableAddress,"WritableAddress",ctx,0); - else if(cmpYamlValue("CardType",ctx)) SetSimpleYAMLValue(&rsf->CardInfo.CardType,"CardType",ctx,0); - else if(cmpYamlValue("CryptoType",ctx)) SetSimpleYAMLValue(&rsf->CardInfo.CryptoType,"CryptoType",ctx,0); - else if(cmpYamlValue("CardDevice",ctx)) SetSimpleYAMLValue(&rsf->CardInfo.CardDevice,"CardDevice",ctx,0); - else if(cmpYamlValue("MediaType",ctx)) SetSimpleYAMLValue(&rsf->CardInfo.MediaType,"MediaType",ctx,0); - else if(cmpYamlValue("BackupWriteWaitTime",ctx)) SetSimpleYAMLValue(&rsf->CardInfo.BackupWriteWaitTime,"BackupWriteWaitTime",ctx,0); - - else{ - fprintf(stderr,"[-] Unrecognised key '%s'\n",GetYamlString(ctx)); - ctx->error = YAML_UNKNOWN_KEY; - FinishEvent(ctx); - return; - } - // Finish event start next - FinishEvent(ctx); - GetEvent(ctx); - } - FinishEvent(ctx); -} - -void GET_CommonHeaderKey(ctr_yaml_context *ctx, rsf_settings *rsf) -{ - /* Checking That Group is in a map */ - if(!CheckMappingEvent(ctx)) return; - u32 InitLevel = ctx->Level; - /* Checking each child */ - GetEvent(ctx); - rsf->CommonHeaderKey.Found = true; - while(ctx->Level == InitLevel){ - if(ctx->error || ctx->done) return; - // Handle childs - - if(cmpYamlValue("D",ctx)) SetSimpleYAMLValue(&rsf->CommonHeaderKey.D,"D",ctx,0); - else if(cmpYamlValue("P",ctx)) SetSimpleYAMLValue(&rsf->CommonHeaderKey.P,"P",ctx,0); - else if(cmpYamlValue("Q",ctx)) SetSimpleYAMLValue(&rsf->CommonHeaderKey.Q,"Q",ctx,0); - else if(cmpYamlValue("DP",ctx)) SetSimpleYAMLValue(&rsf->CommonHeaderKey.DP,"DP",ctx,0); - else if(cmpYamlValue("DQ",ctx)) SetSimpleYAMLValue(&rsf->CommonHeaderKey.DQ,"DQ",ctx,0); - else if(cmpYamlValue("InverseQ",ctx)) SetSimpleYAMLValue(&rsf->CommonHeaderKey.InverseQ,"InverseQ",ctx,0); - else if(cmpYamlValue("Modulus",ctx)) SetSimpleYAMLValue(&rsf->CommonHeaderKey.Modulus,"Modulus",ctx,0); - else if(cmpYamlValue("Exponent",ctx)) SetSimpleYAMLValue(&rsf->CommonHeaderKey.Exponent,"Exponent",ctx,0); - else if(cmpYamlValue("Signature",ctx)) SetSimpleYAMLValue(&rsf->CommonHeaderKey.AccCtlDescSign,"Signature",ctx,0); - else if(cmpYamlValue("Descriptor",ctx)) SetSimpleYAMLValue(&rsf->CommonHeaderKey.AccCtlDescBin,"Descriptor",ctx,0); - - else{ - fprintf(stderr,"[-] Unrecognised key '%s'\n",GetYamlString(ctx)); - ctx->error = YAML_UNKNOWN_KEY; - FinishEvent(ctx); - return; - } - // Finish event start next - FinishEvent(ctx); - GetEvent(ctx); - } - FinishEvent(ctx); -} \ No newline at end of file diff --git a/yamlsettings.h b/yamlsettings.h deleted file mode 100644 index 2958c95..0000000 --- a/yamlsettings.h +++ /dev/null @@ -1,14 +0,0 @@ - -int MergeSpecData(rsf_settings *out, rsf_settings *desc, rsf_settings *rsf); -void EvaluateRSF(rsf_settings *rsf, ctr_yaml_context *ctx); - -void GET_Option(ctr_yaml_context *ctx, rsf_settings *rsf); -void GET_AccessControlInfo(ctr_yaml_context *ctx, rsf_settings *rsf); -void GET_SystemControlInfo(ctr_yaml_context *ctx, rsf_settings *rsf); -void GET_BasicInfo(ctr_yaml_context *ctx, rsf_settings *rsf); -void GET_Rom(ctr_yaml_context *ctx, rsf_settings *rsf); -void GET_ExeFs(ctr_yaml_context *ctx, rsf_settings *rsf); -void GET_PlainRegion(ctr_yaml_context *ctx, rsf_settings *rsf); -void GET_TitleInfo(ctr_yaml_context *ctx, rsf_settings *rsf); -void GET_CardInfo(ctr_yaml_context *ctx, rsf_settings *rsf); -void GET_CommonHeaderKey(ctr_yaml_context *ctx, rsf_settings *rsf); \ No newline at end of file