Compare commits

...

9 Commits

Author SHA1 Message Date
Markus F.X.J. Oberhumer 71ffbbc420 Prepared 1.96 release.
committer: mfx <mfx> 1144943500 +0000
2006-04-13 15:51:40 +00:00
Markus F.X.J. Oberhumer 4fd09b889d Updated .cvsignore.
committer: mfx <mfx> 1144943334 +0000
2006-04-13 15:48:54 +00:00
László Molnár 4cb2a3eebe show image size change in info mode
committer: ml1050 <ml1050> 1144941392 +0000
2006-04-13 15:16:32 +00:00
László Molnár c25186b1f6 minor documentation updates
committer: ml1050 <ml1050> 1144941274 +0000
2006-04-13 15:14:34 +00:00
László Molnár 779033d0bc added filter (id: 0x50) support to the stub
the data cache is written back before the stub jumps to the uncompressed code

committer: ml1050 <ml1050> 1144931349 +0000
2006-04-13 12:29:09 +00:00
László Molnár 3e31560e7d added a new filter for ARM 24-bit naive calltrick
committer: ml1050 <ml1050> 1144931022 +0000
2006-04-13 12:23:42 +00:00
László Molnár d23d7e8775 removed unneeded entry point address check
committer: ml1050 <ml1050> 1144745835 +0000
2006-04-11 08:57:15 +00:00
László Molnár f6fdf5cb7f show image size change in info mode
committer: ml1050 <ml1050> 1144671675 +0000
2006-04-10 12:21:15 +00:00
Markus F.X.J. Oberhumer 1879ccd27d Next version will be 2.00.
committer: mfx <mfx> 1144586292 +0000
2006-04-09 12:38:12 +00:00
14 changed files with 491 additions and 275 deletions
+7
View File
@@ -2,6 +2,13 @@
User visible changes for UPX User visible changes for UPX
================================================================== ==================================================================
Changes in 2.00 (XX XXX 2006):
Changes in 1.96 beta (13 Apr 2006):
* arm/pe: added filter support
* win32/pe: removed an unnecessary check so that Delphi 2006 and
Digital Mars C++ programs finally work
Changes in 1.95 beta (09 Apr 2006): Changes in 1.95 beta (09 Apr 2006):
* arm/pe: added DLL support * arm/pe: added DLL support
* arm/pe: added thumb mode stub support * arm/pe: added thumb mode stub support
+1 -1
View File
@@ -62,7 +62,7 @@ and run exactly as before, with no runtime or memory penalty for most
of the supported formats. of the supported formats.
UPX supports a number of different executable formats, including UPX supports a number of different executable formats, including
Windows 95/98/ME/NT/2000/XP programs and DLLs, DOS programs, Windows 95/98/ME/NT/2000/XP/CE programs and DLLs, DOS programs,
and Linux executables and kernels. and Linux executables and kernels.
UPX is free software distributed under the term of the GNU General UPX is free software distributed under the term of the GNU General
+2 -3
View File
@@ -113,7 +113,7 @@ If you want to modify the stub sources you'll also need
- Other cross compilers targeted at the following architectures: - Other cross compilers targeted at the following architectures:
- powerpc-750-linux-gnu - powerpc-750-linux-gnu
- x86_64-unknown-linux-gnu - x86_64-unknown-linux-gnu
- arm-wince-pe - arm-9tdmi-linux-gnu
- ASM5900 - a MIPS R3000 assembler - ASM5900 - a MIPS R3000 assembler
@@ -130,8 +130,7 @@ Misc. notes
- Use gcc extensions and other compiler specific stuff only through - Use gcc extensions and other compiler specific stuff only through
macros. macros.
- Keep in mind that it should be possible to build UPX on braindead - Keep in mind that it should be possible to build UPX on braindead
file systems (FAT). Don't use long file names or other things case insensitive file systems (FAT).
that break building under plain DOS.
*** ***
+11 -3
View File
@@ -75,9 +75,10 @@ B<UPX> is a versatile executable packer with the following features:
* rtm32/pe * rtm32/pe
* tmt/adam * tmt/adam
* vmlinuz/386 [bootable Linux kernel] * vmlinuz/386 [bootable Linux kernel]
* vmlinux/386
* watcom/le (supporting DOS4G, PMODE/W, DOS32a and CauseWay) * watcom/le (supporting DOS4G, PMODE/W, DOS32a and CauseWay)
* win32/pe * win32/pe (exe and dll)
* arm/pe * arm/pe (exe and dll)
* linux/elfamd64 * linux/elfamd64
* linux/elfppc32 * linux/elfppc32
* mach/elfppc32 * mach/elfppc32
@@ -840,12 +841,19 @@ smaller, but it's still there.
If you're running executables from network, then compressed programs If you're running executables from network, then compressed programs
will load faster, and require less bandwidth during execution. will load faster, and require less bandwidth during execution.
DLLs are supported. DLLs are supported. But UPX compressed DLLs can not share common data and
code when they got used by multiple applications. So compressing msvcrt.dll
is a waste of memory, but compressing the dll plugins of a particular
application may be a better idea.
Screensavers are supported, with the restriction that the filename Screensavers are supported, with the restriction that the filename
must end with ".scr" (as screensavers are handled slightly different must end with ".scr" (as screensavers are handled slightly different
than normal exe files). than normal exe files).
UPX compressed PE files has some minor memory overhead (usually in the
10 - 30 kbytes range) which can be seen by specifying the "-i" command
line switch during compression.
Extra options available for this executable format: Extra options available for this executable format:
--compress-exports=0 Don't compress the export section. --compress-exports=0 Don't compress the export section.
+1
View File
@@ -17,3 +17,4 @@ MMakefile
compress_nrv.* compress_nrv.*
upx upx
version1*.h version1*.h
version2*.h
+1
View File
@@ -17,3 +17,4 @@ MMakefile
compress_nrv.* compress_nrv.*
upx upx
version1*.h version1*.h
version2*.h
+40
View File
@@ -383,6 +383,46 @@ static int s_ct32_e8e9_bswap_be(Filter *f)
#undef CT32 #undef CT32
/*************************************************************************
// 24-bit ARM calltrick ("naive")
**************************************************************************/
#define CT24ARM(f, cond, addvalue, get, set) \
upx_byte *b = f->buf; \
upx_byte *b_end = b + f->buf_len - 4; \
do { \
if (cond) \
{ \
unsigned a = (unsigned) (b - f->buf); \
f->lastcall = a; \
set(b, get(b) + (addvalue)); \
f->calls++; \
} \
b += 4; \
} while (b < b_end); \
if (f->lastcall) f->lastcall += 4; \
return 0;
#define ARMCT_COND (((b[3] & 0x0f) == 0x0b))
static int f_ct24arm_le(Filter *f)
{
CT24ARM(f, ARMCT_COND, a / 4 + f->addvalue, get_le24, set_le24)
}
static int u_ct24arm_le(Filter *f)
{
CT24ARM(f, ARMCT_COND, 0 - a / 4 - f->addvalue, get_le24, set_le24)
}
static int s_ct24arm_le(Filter *f)
{
CT24ARM(f, ARMCT_COND, a + f->addvalue, get_le24, set_dummy)
}
#undef CT24ARM
#undef ARMCT_COND
/* /*
vi:ts=4:et:nowrap vi:ts=4:et:nowrap
+3
View File
@@ -224,6 +224,9 @@ const FilterImp::FilterEntry FilterImp::filters[] = {
{ 0x46, 6, 0x00ffffff, f_ctok32_e8e9_bswap_le, u_ctok32_e8e9_bswap_le, s_ctok32_e8e9_bswap_le }, { 0x46, 6, 0x00ffffff, f_ctok32_e8e9_bswap_le, u_ctok32_e8e9_bswap_le, s_ctok32_e8e9_bswap_le },
{ 0x49, 6, 0x00ffffff, f_ctok32_e8e9_bswap_le, u_ctok32_e8e9_bswap_le, s_ctok32_e8e9_bswap_le }, { 0x49, 6, 0x00ffffff, f_ctok32_e8e9_bswap_le, u_ctok32_e8e9_bswap_le, s_ctok32_e8e9_bswap_le },
// 24-bit calltrick for arm
{ 0x50, 8, 0x01ffffff, f_ct24arm_le, u_ct24arm_le, s_ct24arm_le },
// 32-bit cto calltrick with jmp and jcc(swap 0x0f/0x8Y) and relative renumbering // 32-bit cto calltrick with jmp and jcc(swap 0x0f/0x8Y) and relative renumbering
{ 0x80, 8, 0x00ffffff, f_ctojr32_e8e9_bswap_le, u_ctojr32_e8e9_bswap_le, s_ctojr32_e8e9_bswap_le }, { 0x80, 8, 0x00ffffff, f_ctojr32_e8e9_bswap_le, u_ctojr32_e8e9_bswap_le, s_ctojr32_e8e9_bswap_le },
{ 0x81, 8, 0x00ffffff, f_ctojr32_e8e9_bswap_le, u_ctojr32_e8e9_bswap_le, s_ctojr32_e8e9_bswap_le }, { 0x81, 8, 0x00ffffff, f_ctojr32_e8e9_bswap_le, u_ctojr32_e8e9_bswap_le, s_ctojr32_e8e9_bswap_le },
+18 -5
View File
@@ -199,7 +199,8 @@ const int *PackArmPe::getCompressionMethods(int method, int level) const
const int *PackArmPe::getFilters() const const int *PackArmPe::getFilters() const
{ {
return 0; static const int filters[] = { 0x50, -1 };
return filters;
} }
@@ -556,7 +557,9 @@ void PackArmPe::processImports(unsigned myimport) // pass 2
unsigned PackArmPe::processImports() // pass 1 unsigned PackArmPe::processImports() // pass 1
{ {
static const unsigned char kernel32dll[] = "COREDLL.dll"; static const unsigned char kernel32dll[] = "COREDLL.dll";
static const char llgpa[] = "\x0\x0""LoadLibraryW\x0\x0""GetProcAddressA"; static const char llgpa[] = "\x0\x0""LoadLibraryW\x0\x0"
"GetProcAddressA\x0\x0\x0"
"CacheSync";
//static const char exitp[] = "ExitProcess\x0\x0\x0"; //static const char exitp[] = "ExitProcess\x0\x0\x0";
unsigned dllnum = 0; unsigned dllnum = 0;
@@ -658,7 +661,7 @@ unsigned PackArmPe::processImports() // pass 1
im = (import_desc*) oimpdlls; im = (import_desc*) oimpdlls;
LE32 *ordinals = (LE32*) (oimpdlls + (dllnum2 + 1) * sizeof(import_desc)); LE32 *ordinals = (LE32*) (oimpdlls + (dllnum2 + 1) * sizeof(import_desc));
LE32 *lookuptable = ordinals + 3;// + k32o + (isdll ? 0 : 1); LE32 *lookuptable = ordinals + 4;// + k32o + (isdll ? 0 : 1);
upx_byte *dllnames = ((upx_byte*) lookuptable) + (dllnum2 - 1) * 8; upx_byte *dllnames = ((upx_byte*) lookuptable) + (dllnum2 - 1) * 8;
upx_byte *importednames = dllnames + (dllnamelen &~ 1); upx_byte *importednames = dllnames + (dllnamelen &~ 1);
@@ -670,6 +673,7 @@ unsigned PackArmPe::processImports() // pass 1
im->iat = ptr_diff(ordinals,oimpdlls); im->iat = ptr_diff(ordinals,oimpdlls);
*ordinals++ = ptr_diff(importednames,oimpdlls); // LoadLibraryW *ordinals++ = ptr_diff(importednames,oimpdlls); // LoadLibraryW
*ordinals++ = ptr_diff(importednames,oimpdlls) + 14; // GetProcAddressA *ordinals++ = ptr_diff(importednames,oimpdlls) + 14; // GetProcAddressA
*ordinals++ = ptr_diff(importednames,oimpdlls) + 14 + 18; // CacheSync
dllnames += sizeof(kernel32dll); dllnames += sizeof(kernel32dll);
importednames += sizeof(llgpa); importednames += sizeof(llgpa);
@@ -1611,7 +1615,7 @@ void PackArmPe::pack(OutputFile *fo)
if (memcmp(isection[0].name,"UPX",3) == 0) if (memcmp(isection[0].name,"UPX",3) == 0)
throwAlreadyPackedByUPX(); throwAlreadyPackedByUPX();
if (!opt->force && (IDSIZE(15) || ih.entry > isection[1].vaddr)) if (!opt->force && IDSIZE(15))
throwCantPack("file is possibly packed/protected (try --force)"); throwCantPack("file is possibly packed/protected (try --force)");
if (ih.entry && ih.entry < rvamin) if (ih.entry && ih.entry < rvamin)
throwCantPack("run a virus scanner on this file!"); throwCantPack("run a virus scanner on this file!");
@@ -1806,12 +1810,15 @@ void PackArmPe::pack(OutputFile *fo)
const unsigned upxsection = s1addr + ic + clen; const unsigned upxsection = s1addr + ic + clen;
// FIXME // FIXME
const unsigned assumed_soxrelocs = isdll ? 0x18 : 0; const unsigned assumed_soxrelocs = isdll ? 0x20 : 0;
const unsigned myimport = ncsection + assumed_soxrelocs + soresources - rvamin; const unsigned myimport = ncsection + assumed_soxrelocs + soresources - rvamin;
const int src0_offset = find(loader, lsize, "SRC0", 4); const int src0_offset = find(loader, lsize, "SRC0", 4);
// patch loader // patch loader
patch_le32(loader, codesize, "CSYN", ih.imagebase + rvamin + myimport + get_le32(oimpdlls + 16) + 8);
patch_le32(loader, codesize, "FIBE", ih.imagebase + ih.codebase + (ft.id ? ih.codesize : 0));
patch_le32(loader, codesize, "FIBS", ih.imagebase + ih.codebase);
patch_le32(loader, codesize, "BREL", crelocs + rvamin + ih.imagebase); patch_le32(loader, codesize, "BREL", crelocs + rvamin + ih.imagebase);
patch_le32(loader, codesize, "ENTR", ih.entry + ih.imagebase); patch_le32(loader, codesize, "ENTR", ih.entry + ih.imagebase);
patch_le32(loader, codesize, "LOAD", ih.imagebase + rvamin + myimport + get_le32(oimpdlls + 16)); patch_le32(loader, codesize, "LOAD", ih.imagebase + rvamin + myimport + get_le32(oimpdlls + 16));
@@ -1882,6 +1889,9 @@ void PackArmPe::pack(OutputFile *fo)
rel.add(upxsection + src0_offset + 28, 3); rel.add(upxsection + src0_offset + 28, 3);
rel.add(upxsection + src0_offset + 32, 3); rel.add(upxsection + src0_offset + 32, 3);
rel.add(upxsection + src0_offset + 36, 3); rel.add(upxsection + src0_offset + 36, 3);
rel.add(upxsection + src0_offset + 40, 3);
rel.add(upxsection + src0_offset + 44, 3);
rel.add(upxsection + src0_offset + 48, 3);
// new PE header // new PE header
memcpy(&oh,&ih,sizeof(oh)); memcpy(&oh,&ih,sizeof(oh));
@@ -2002,6 +2012,9 @@ void PackArmPe::pack(OutputFile *fo)
// set_le32(ibuf + ic,get_le32("UPX ")); // set_le32(ibuf + ic,get_le32("UPX "));
ibuf.clear(0, oh.filealign); ibuf.clear(0, oh.filealign);
info("Image size change: %u -> %u kBytes",
ih.imagesize / 1024, oh.imagesize / 1024);
infoHeader("[Writing compressed file]"); infoHeader("[Writing compressed file]");
// write loader + compressed file // write loader + compressed file
+4 -1
View File
@@ -1702,7 +1702,7 @@ void PackW32Pe::pack(OutputFile *fo)
if (memcmp(isection[0].name,"UPX",3) == 0) if (memcmp(isection[0].name,"UPX",3) == 0)
throwAlreadyPackedByUPX(); throwAlreadyPackedByUPX();
if (!opt->force && (IDSIZE(15) || ih.entry > isection[1].vaddr)) if (!opt->force && IDSIZE(15))
throwCantPack("file is possibly packed/protected (try --force)"); throwCantPack("file is possibly packed/protected (try --force)");
if (ih.entry && ih.entry < rvamin) if (ih.entry && ih.entry < rvamin)
throwCantPack("run a virus scanner on this file!"); throwCantPack("run a virus scanner on this file!");
@@ -2110,6 +2110,9 @@ void PackW32Pe::pack(OutputFile *fo)
// set_le32(ibuf + ic,get_le32("UPX ")); // set_le32(ibuf + ic,get_le32("UPX "));
ibuf.clear(0, oh.filealign); ibuf.clear(0, oh.filealign);
info("Image size change: %u -> %u kBytes",
ih.imagesize / 1024, oh.imagesize / 1024);
infoHeader("[Writing compressed file]"); infoHeader("[Writing compressed file]");
// write loader + compressed file // write loader + compressed file
+262 -230
View File
@@ -1,4 +1,4 @@
/* l_armpe.h -- created from l_armpe.bin, 3592 (0xe08) bytes /* l_armpe.h -- created from l_armpe.bin, 4112 (0x1010) bytes
This file is part of the UPX executable compressor. This file is part of the UPX executable compressor.
@@ -27,234 +27,266 @@
*/ */
#define NRV_LOADER_SIZE 3592 #define NRV_LOADER_SIZE 4112
#define NRV_LOADER_ADLER32 0x7cf0b17d #define NRV_LOADER_ADLER32 0x78258e9b
#define NRV_LOADER_CRC32 0x03faeff7 #define NRV_LOADER_CRC32 0xa3de7215
unsigned char nrv_loader[3592] = { unsigned char nrv_loader[4112] = {
15, 64, 45,233, 52, 0,143,226, 22, 0, 0,235, 15, 64,189,232, /* 0x 0 */ 15, 64, 45,233,132, 0,143,226, 45, 0, 0,235, 15, 64,189,232, /* 0x 0 */
72,240,159,229, 64, 48,159,229, 0,240,147,229, 52, 48,159,229, /* 0x 10 */ 152,240,159,229,144, 48,159,229, 0,240,147,229,132, 48,159,229, /* 0x 10 */
0,240,147,229, 3, 32,160,227, 2, 48,208,231, 1, 32, 82,226, /* 0x 20 */ 0,240,147,229,148, 48,159,229, 0,240,147,229,132, 0,159,229, /* 0x 20 */
1, 20,131,224,251,255,255, 90, 1, 0,160,225, 14,240,160,225, /* 0x 30 */ 0, 32,160,227,128,192,159,229, 12, 0, 80,225, 14,240,160, 1, /* 0x 30 */
83, 82, 67, 48, 83, 82, 67, 76, 68, 83, 84, 48, 68, 83, 84, 76, /* 0x 40 */ 3, 48,208,229, 15, 48, 3,226, 11, 0, 83,227, 5, 0, 0, 26, /* 0x 40 */
66, 73, 77, 80, 79, 78, 65, 77, 71, 69, 84, 80, 76, 79, 65, 68, /* 0x 50 */ 0, 48,144,229,255, 20, 3,226, 2, 48, 67,224,255, 52,195,227, /* 0x 50 */
69, 78, 84, 82, 66, 82, 69, 76,240, 65, 45,233, 0,224,160,227, /* 0x 60 */ 1, 48,131,225, 0, 48,128,229, 4, 0,128,226, 1, 32,130,226, /* 0x 60 */
8,112,144,229,132,208, 77,226, 0,192,160,225, 3, 0,144,232, /* 0x 70 */ 240,255,255,234, 3, 32,160,227, 2, 48,208,231, 1, 32, 82,226, /* 0x 70 */
0,224,141,229, 7, 32,160,225, 13, 48,160,225, 16, 64,140,226, /* 0x 80 */ 1, 20,131,224,251,255,255, 90, 1, 0,160,225, 14,240,160,225, /* 0x 80 */
16, 1,148,232, 52, 0, 0,235, 4, 0,160,225,224,255,255,235, /* 0x 90 */ 83, 82, 67, 48, 83, 82, 67, 76, 68, 83, 84, 48, 68, 83, 84, 76, /* 0x 90 */
0, 80, 80,226, 46, 0, 0, 10, 4, 0,132,226,220,255,255,235, /* 0x a0 */ 66, 73, 77, 80, 79, 78, 65, 77, 71, 69, 84, 80, 76, 79, 65, 68, /* 0x a0 */
8, 80,133,224, 0, 48,213,229, 4, 16,141,226, 0, 0, 83,227, /* 0x b0 */ 69, 78, 84, 82, 66, 82, 69, 76, 70, 73, 66, 83, 70, 73, 66, 69, /* 0x b0 */
7, 96,128,224, 1, 32,160,225, 3, 0, 0, 10,178, 48,194,224, /* 0x c0 */ 67, 83, 89, 78,240, 65, 45,233, 0,224,160,227,132,208, 77,226, /* 0x c0 */
1, 48,245,229, 0, 0, 83,227,250,255,255,234, 0, 48,160,227, /* 0x d0 */ 8,112,144,229, 0,192,160,225, 3, 0,144,232, 0,224,141,229, /* 0x d0 */
176, 48,194,225, 1, 0,160,225,201,255,255,235, 8, 48,244,229, /* 0x e0 */ 7, 32,160,225, 13, 48,160,225, 16, 64,140,226, 16, 1,148,232, /* 0x e0 */
0, 80,160,225, 0, 0, 83,227, 23, 0, 0, 10,255, 48, 3,226, /* 0x f0 */ 55, 0, 0,235,204,255,255,235, 4, 0,160,225,220,255,255,235, /* 0x f0 */
1, 0, 83,227, 1, 64,132,226, 2, 0, 0, 10,255, 0, 83,227, /* 0x 100 */ 0, 80, 80,226, 46, 0, 0, 10, 4, 0,132,226,216,255,255,235, /* 0x 100 */
8, 0, 0, 10, 14, 0, 0,234, 5, 0,160,225, 4, 16,160,225, /* 0x 110 */ 8, 80,133,224, 0, 48,213,229, 4, 16,141,226, 0, 0, 83,227, /* 0x 110 */
189,255,255,235, 4, 0,134,228, 1, 48,212,228, 0, 0, 83,227, /* 0x 120 */ 7, 96,128,224, 1, 32,160,225, 3, 0, 0, 10,178, 48,194,224, /* 0x 120 */
252,255,255, 26, 6, 0, 0,234, 0, 48,212,229, 1, 16,212,229, /* 0x 130 */ 1, 48,245,229, 0, 0, 83,227,250,255,255,234, 0, 48,160,227, /* 0x 130 */
5, 0,160,225, 1, 20,131,224,179,255,255,235, 2, 64,132,226, /* 0x 140 */ 176, 48,194,225, 1, 0,160,225,177,255,255,235, 8, 48,244,229, /* 0x 140 */
4, 0,134,228, 0, 48,212,229,229,255,255,234, 1, 64,132,226, /* 0x 150 */ 0, 80,160,225, 0, 0, 83,227, 23, 0, 0, 10,255, 48, 3,226, /* 0x 150 */
204,255,255,234,132,208,141,226,240,129,189,232,252, 64, 45,233, /* 0x 160 */ 1, 0, 83,227, 1, 64,132,226, 2, 0, 0, 10,255, 0, 83,227, /* 0x 160 */
0,112,129,224, 0, 80,224,227, 2, 65,160,227, 10, 0, 0,234, /* 0x 170 */ 8, 0, 0, 10, 14, 0, 0,234, 5, 0,160,225, 4, 16,160,225, /* 0x 170 */
24, 0,189,232, 7, 0, 64,224, 3, 32, 66,224, 0, 32,132,229, /* 0x 180 */ 165,255,255,235, 4, 0,134,228, 1, 48,212,228, 0, 0, 83,227, /* 0x 180 */
240,128,189,232, 1, 64,208,228, 4, 64,164,224, 4, 76,176,225, /* 0x 190 */ 252,255,255, 26, 6, 0, 0,234, 0, 48,212,229, 1, 16,212,229, /* 0x 190 */
14,240,160,225, 1, 48,208,228, 1, 48,194,228, 4, 64,148,224, /* 0x 1a0 */ 5, 0,160,225, 1, 20,131,224,155,255,255,235, 2, 64,132,226, /* 0x 1a0 */
247,255,255, 11,250,255,255, 42, 1, 16,160,227, 3, 0, 0,234, /* 0x 1b0 */ 4, 0,134,228, 0, 48,212,229,229,255,255,234, 1, 64,132,226, /* 0x 1b0 */
1, 16, 65,226, 4, 64,148,224,241,255,255, 11, 1, 16,161,224, /* 0x 1c0 */ 204,255,255,234, 4, 0,160,227,149,255,255,235,132,208,141,226, /* 0x 1c0 */
4, 64,148,224,238,255,255, 11, 1, 16,161,224, 4, 64,148,224, /* 0x 1d0 */ 240,129,189,232,252, 64, 45,233, 0,112,129,224, 0, 80,224,227, /* 0x 1d0 */
235,255,255, 11,245,255,255, 58, 3, 48, 81,226, 0, 16,160,227, /* 0x 1e0 */ 2, 65,160,227, 10, 0, 0,234, 24, 0,189,232, 7, 0, 64,224, /* 0x 1e0 */
6, 0, 0, 58, 1, 80,208,228, 3, 84,133,225, 5, 80,240,225, /* 0x 1f0 */ 3, 32, 66,224, 0, 32,132,229,240,128,189,232, 1, 64,208,228, /* 0x 1f0 */
222,255,255, 10,197, 80,176,225, 15, 0, 0, 42, 2, 0, 0,234, /* 0x 200 */ 4, 64,164,224, 4, 76,176,225, 14,240,160,225, 1, 48,208,228, /* 0x 200 */
4, 64,148,224,222,255,255, 11, 11, 0, 0, 42, 1, 16,160,227, /* 0x 210 */ 1, 48,194,228, 4, 64,148,224,247,255,255, 11,250,255,255, 42, /* 0x 210 */
4, 64,148,224,218,255,255, 11, 7, 0, 0, 42, 4, 64,148,224, /* 0x 220 */ 1, 16,160,227, 3, 0, 0,234, 1, 16, 65,226, 4, 64,148,224, /* 0x 220 */
215,255,255, 11, 1, 16,161,224, 4, 64,148,224,212,255,255, 11, /* 0x 230 */ 241,255,255, 11, 1, 16,161,224, 4, 64,148,224,238,255,255, 11, /* 0x 230 */
249,255,255, 58, 4, 16,129,226, 3, 0, 0,234, 4, 64,148,224, /* 0x 240 */ 1, 16,161,224, 4, 64,148,224,235,255,255, 11,245,255,255, 58, /* 0x 240 */
207,255,255, 11, 1, 16,161,224, 2, 16,129,226, 5, 12,117,227, /* 0x 250 */ 3, 48, 81,226, 0, 16,160,227, 6, 0, 0, 58, 1, 80,208,228, /* 0x 250 */
0, 0, 0, 42, 1, 16,129,226, 0, 48,210,229, 5, 48,210,231, /* 0x 260 */ 3, 84,133,225, 5, 80,240,225,222,255,255, 10,197, 80,176,225, /* 0x 260 */
1, 48,194,228, 1, 16, 81,226,251,255,255, 26,202,255,255,234, /* 0x 270 */ 15, 0, 0, 42, 2, 0, 0,234, 4, 64,148,224,222,255,255, 11, /* 0x 270 */
1, 0, 81,227, 3, 0, 0, 26, 15, 64, 45,233,148, 0,143,226, /* 0x 280 */ 11, 0, 0, 42, 1, 16,160,227, 4, 64,148,224,218,255,255, 11, /* 0x 280 */
46, 0, 0,235, 15, 64,189,232,168,240,159,229,160, 48,159,229, /* 0x 290 */ 7, 0, 0, 42, 4, 64,148,224,215,255,255, 11, 1, 16,161,224, /* 0x 290 */
0,240,147,229,148, 48,159,229, 0,240,147,229, 3, 32,160,227, /* 0x 2a0 */ 4, 64,148,224,212,255,255, 11,249,255,255, 58, 4, 16,129,226, /* 0x 2a0 */
2, 48,208,231, 1, 32, 82,226, 1, 20,131,224,251,255,255, 90, /* 0x 2b0 */ 3, 0, 0,234, 4, 64,148,224,207,255,255, 11, 1, 16,161,224, /* 0x 2b0 */
1, 0,160,225, 14,240,160,225,124, 0,159,229, 92, 32,159,229, /* 0x 2c0 */ 2, 16,129,226, 5, 12,117,227, 0, 0, 0, 42, 1, 16,129,226, /* 0x 2c0 */
4, 16, 66,226, 1, 48,208,228, 0, 0, 83,227,248,255,255, 10, /* 0x 2d0 */ 0, 48,210,229, 5, 48,210,231, 1, 48,194,228, 1, 16, 81,226, /* 0x 2d0 */
240, 0, 83,227,240,192,195, 35, 1, 48,208, 37, 12,196,131, 32, /* 0x 2e0 */ 251,255,255, 26,202,255,255,234, 1, 0, 81,227, 3, 0, 0, 26, /* 0x 2e0 */
2, 48,208, 36, 12, 52,131, 32, 3, 16,129,224, 0, 48,209,229, /* 0x 2f0 */ 15, 64, 45,233,228, 0,143,226, 69, 0, 0,235, 15, 64,189,232, /* 0x 2f0 */
12,196,131,224, 1, 48,209,229, 12,196,131,224, 2, 48,209,229, /* 0x 300 */ 248,240,159,229,240, 48,159,229, 0,240,147,229,228, 48,159,229, /* 0x 300 */
12,196,131,224, 3, 48,209,229, 12,196,131,224, 2,192,140,224, /* 0x 310 */ 0,240,147,229,244, 48,159,229, 0,240,147,229,228, 0,159,229, /* 0x 310 */
0,192,129,229,234,255,255,234, 83, 82, 67, 48, 83, 82, 67, 76, /* 0x 320 */ 0, 32,160,227,224,192,159,229, 12, 0, 80,225, 14,240,160, 1, /* 0x 320 */
68, 83, 84, 48, 68, 83, 84, 76, 66, 73, 77, 80, 79, 78, 65, 77, /* 0x 330 */ 3, 48,208,229, 15, 48, 3,226, 11, 0, 83,227, 5, 0, 0, 26, /* 0x 330 */
71, 69, 84, 80, 76, 79, 65, 68, 69, 78, 84, 82, 66, 82, 69, 76, /* 0x 340 */ 0, 48,144,229,255, 20, 3,226, 2, 48, 67,224,255, 52,195,227, /* 0x 340 */
240, 65, 45,233, 0,224,160,227, 8,112,144,229,132,208, 77,226, /* 0x 350 */ 1, 48,131,225, 0, 48,128,229, 4, 0,128,226, 1, 32,130,226, /* 0x 350 */
0,192,160,225, 3, 0,144,232, 0,224,141,229, 7, 32,160,225, /* 0x 360 */ 240,255,255,234, 3, 32,160,227, 2, 48,208,231, 1, 32, 82,226, /* 0x 360 */
13, 48,160,225, 16, 64,140,226, 16, 1,148,232, 53, 0, 0,235, /* 0x 370 */ 1, 20,131,224,251,255,255, 90, 1, 0,160,225, 14,240,160,225, /* 0x 370 */
4, 0,160,225,200,255,255,235, 0, 80, 80,226, 46, 0, 0, 10, /* 0x 380 */ 124, 0,159,229, 92, 32,159,229, 4, 16, 66,226, 1, 48,208,228, /* 0x 380 */
4, 0,132,226,196,255,255,235, 8, 80,133,224, 0, 48,213,229, /* 0x 390 */ 0, 0, 83,227, 14,240,160, 1,240, 0, 83,227,240,192,195, 35, /* 0x 390 */
4, 16,141,226, 0, 0, 83,227, 7, 96,128,224, 1, 32,160,225, /* 0x 3a0 */ 1, 48,208, 37, 12,196,131, 32, 2, 48,208, 36, 12, 52,131, 32, /* 0x 3a0 */
3, 0, 0, 10,178, 48,194,224, 1, 48,245,229, 0, 0, 83,227, /* 0x 3b0 */ 3, 16,129,224, 0, 48,209,229, 12,196,131,224, 1, 48,209,229, /* 0x 3b0 */
250,255,255,234, 0, 48,160,227,176, 48,194,225, 1, 0,160,225, /* 0x 3c0 */ 12,196,131,224, 2, 48,209,229, 12,196,131,224, 3, 48,209,229, /* 0x 3c0 */
177,255,255,235, 8, 48,244,229, 0, 80,160,225, 0, 0, 83,227, /* 0x 3d0 */ 12,196,131,224, 2,192,140,224, 0,192,129,229,234,255,255,234, /* 0x 3d0 */
23, 0, 0, 10,255, 48, 3,226, 1, 0, 83,227, 1, 64,132,226, /* 0x 3e0 */ 83, 82, 67, 48, 83, 82, 67, 76, 68, 83, 84, 48, 68, 83, 84, 76, /* 0x 3e0 */
2, 0, 0, 10,255, 0, 83,227, 8, 0, 0, 10, 14, 0, 0,234, /* 0x 3f0 */ 66, 73, 77, 80, 79, 78, 65, 77, 71, 69, 84, 80, 76, 79, 65, 68, /* 0x 3f0 */
5, 0,160,225, 4, 16,160,225,165,255,255,235, 4, 0,134,228, /* 0x 400 */ 69, 78, 84, 82, 66, 82, 69, 76, 70, 73, 66, 83, 70, 73, 66, 69, /* 0x 400 */
1, 48,212,228, 0, 0, 83,227,252,255,255, 26, 6, 0, 0,234, /* 0x 410 */ 67, 83, 89, 78,240, 65, 45,233, 0,224,160,227,132,208, 77,226, /* 0x 410 */
0, 48,212,229, 1, 16,212,229, 5, 0,160,225, 1, 20,131,224, /* 0x 420 */ 8,112,144,229, 0,192,160,225, 3, 0,144,232, 0,224,141,229, /* 0x 420 */
155,255,255,235, 2, 64,132,226, 4, 0,134,228, 0, 48,212,229, /* 0x 430 */ 7, 32,160,225, 13, 48,160,225, 16, 64,140,226, 16, 1,148,232, /* 0x 430 */
229,255,255,234, 1, 64,132,226,204,255,255,234,157,255,255,235, /* 0x 440 */ 56, 0, 0,235,180,255,255,235, 4, 0,160,225,196,255,255,235, /* 0x 440 */
132,208,141,226,240,129,189,232,252, 64, 45,233, 0,112,129,224, /* 0x 450 */ 0, 80, 80,226, 46, 0, 0, 10, 4, 0,132,226,192,255,255,235, /* 0x 450 */
0, 80,224,227, 2, 65,160,227, 10, 0, 0,234, 24, 0,189,232, /* 0x 460 */ 8, 80,133,224, 0, 48,213,229, 4, 16,141,226, 0, 0, 83,227, /* 0x 460 */
7, 0, 64,224, 3, 32, 66,224, 0, 32,132,229,240,128,189,232, /* 0x 470 */ 7, 96,128,224, 1, 32,160,225, 3, 0, 0, 10,178, 48,194,224, /* 0x 470 */
1, 64,208,228, 4, 64,164,224, 4, 76,176,225, 14,240,160,225, /* 0x 480 */ 1, 48,245,229, 0, 0, 83,227,250,255,255,234, 0, 48,160,227, /* 0x 480 */
1, 48,208,228, 1, 48,194,228, 4, 64,148,224,247,255,255, 11, /* 0x 490 */ 176, 48,194,225, 1, 0,160,225,153,255,255,235, 8, 48,244,229, /* 0x 490 */
250,255,255, 42, 1, 16,160,227, 3, 0, 0,234, 1, 16, 65,226, /* 0x 4a0 */ 0, 80,160,225, 0, 0, 83,227, 23, 0, 0, 10,255, 48, 3,226, /* 0x 4a0 */
4, 64,148,224,241,255,255, 11, 1, 16,161,224, 4, 64,148,224, /* 0x 4b0 */ 1, 0, 83,227, 1, 64,132,226, 2, 0, 0, 10,255, 0, 83,227, /* 0x 4b0 */
238,255,255, 11, 1, 16,161,224, 4, 64,148,224,235,255,255, 11, /* 0x 4c0 */ 8, 0, 0, 10, 14, 0, 0,234, 5, 0,160,225, 4, 16,160,225, /* 0x 4c0 */
245,255,255, 58, 3, 48, 81,226, 0, 16,160,227, 6, 0, 0, 58, /* 0x 4d0 */ 141,255,255,235, 4, 0,134,228, 1, 48,212,228, 0, 0, 83,227, /* 0x 4d0 */
1, 80,208,228, 3, 84,133,225, 5, 80,240,225,222,255,255, 10, /* 0x 4e0 */ 252,255,255, 26, 6, 0, 0,234, 0, 48,212,229, 1, 16,212,229, /* 0x 4e0 */
197, 80,176,225, 15, 0, 0, 42, 2, 0, 0,234, 4, 64,148,224, /* 0x 4f0 */ 5, 0,160,225, 1, 20,131,224,131,255,255,235, 2, 64,132,226, /* 0x 4f0 */
222,255,255, 11, 11, 0, 0, 42, 1, 16,160,227, 4, 64,148,224, /* 0x 500 */ 4, 0,134,228, 0, 48,212,229,229,255,255,234, 1, 64,132,226, /* 0x 500 */
218,255,255, 11, 7, 0, 0, 42, 4, 64,148,224,215,255,255, 11, /* 0x 510 */ 204,255,255,234,153,255,255,235, 4, 0,160,227,124,255,255,235, /* 0x 510 */
1, 16,161,224, 4, 64,148,224,212,255,255, 11,249,255,255, 58, /* 0x 520 */ 132,208,141,226,240,129,189,232,252, 64, 45,233, 0,112,129,224, /* 0x 520 */
4, 16,129,226, 3, 0, 0,234, 4, 64,148,224,207,255,255, 11, /* 0x 530 */ 0, 80,224,227, 2, 65,160,227, 10, 0, 0,234, 24, 0,189,232, /* 0x 530 */
1, 16,161,224, 2, 16,129,226, 5, 12,117,227, 0, 0, 0, 42, /* 0x 540 */ 7, 0, 64,224, 3, 32, 66,224, 0, 32,132,229,240,128,189,232, /* 0x 540 */
1, 16,129,226, 0, 48,210,229, 5, 48,210,231, 1, 48,194,228, /* 0x 550 */ 1, 64,208,228, 4, 64,164,224, 4, 76,176,225, 14,240,160,225, /* 0x 550 */
1, 16, 81,226,251,255,255, 26,202,255,255,234, 15, 64, 45,233, /* 0x 560 */ 1, 48,208,228, 1, 48,194,228, 4, 64,148,224,247,255,255, 11, /* 0x 560 */
72, 0,143,226, 14, 0,144,232, 2, 16,129,224, 0, 32,147,229, /* 0x 570 */ 250,255,255, 42, 1, 16,160,227, 3, 0, 0,234, 1, 16, 65,226, /* 0x 570 */
1, 58,131,226, 1, 0, 83,225,251,255,255,154, 4,224,143,226, /* 0x 580 */ 4, 64,148,224,241,255,255, 11, 1, 16,161,224, 4, 64,148,224, /* 0x 580 */
23,192,143,226, 28,255, 47,225, 15, 64,189,232, 60,192,159,229, /* 0x 590 */ 238,255,255, 11, 1, 16,161,224, 4, 64,148,224,235,255,255, 11, /* 0x 590 */
28,255, 47,225, 12, 75, 27,104, 24, 71, 12, 75,251,231, 27,224, /* 0x 5a0 */ 245,255,255, 58, 3, 48, 81,226, 0, 16,160,227, 6, 0, 0, 58, /* 0x 5a0 */
3, 33, 67, 92, 18, 2,210, 24, 1, 57,250,213, 16, 28,112, 71, /* 0x 5b0 */ 1, 80,208,228, 3, 84,133,225, 5, 80,240,225,222,255,255, 10, /* 0x 5b0 */
83, 82, 67, 48, 83, 82, 67, 76, 68, 83, 84, 48, 68, 83, 84, 76, /* 0x 5c0 */ 197, 80,176,225, 15, 0, 0, 42, 2, 0, 0,234, 4, 64,148,224, /* 0x 5c0 */
66, 73, 77, 80, 79, 78, 65, 77, 71, 69, 84, 80, 76, 79, 65, 68, /* 0x 5d0 */ 222,255,255, 11, 11, 0, 0, 42, 1, 16,160,227, 4, 64,148,224, /* 0x 5d0 */
69, 78, 84, 82, 66, 82, 69, 76,240,181,163,176, 0, 34, 2,146, /* 0x 5e0 */ 218,255,255, 11, 7, 0, 0, 42, 4, 64,148,224,215,255,255, 11, /* 0x 5e0 */
130,104, 1,146, 66,105, 3, 28, 4,105, 0,146, 89,104, 0,104, /* 0x 5f0 */ 1, 16,161,224, 4, 64,148,224,212,255,255, 11,249,255,255, 58, /* 0x 5f0 */
1,154, 2,171, 0,240, 76,248, 37, 28, 40, 28,255,247,208,255, /* 0x 600 */ 4, 16,129,226, 3, 0, 0,234, 4, 64,148,224,207,255,255, 11, /* 0x 600 */
4, 30, 61,208, 0,155, 40, 29,228, 24,255,247,201,255, 1,154, /* 0x 610 */ 1, 16,161,224, 2, 16,129,226, 5, 12,117,227, 0, 0, 0, 42, /* 0x 610 */
134, 24, 3,168, 2, 28, 35,120, 27, 6, 0, 43, 4,208, 27, 14, /* 0x 620 */ 1, 16,129,226, 0, 48,210,229, 5, 48,210,231, 1, 48,194,228, /* 0x 620 */
19,128, 1, 52, 2, 50,246,231, 0, 35, 19,128,255,247,181,255, /* 0x 630 */ 1, 16, 81,226,251,255,255, 26,202,255,255,234, 15, 64, 45,233, /* 0x 630 */
8, 53, 7, 28, 43,120, 27, 6, 0, 43, 31,208, 27, 14, 1, 53, /* 0x 640 */ 128, 0,143,226, 14, 0,144,232, 2, 16,129,224, 0, 32,147,229, /* 0x 640 */
1, 43, 2,208,255, 43, 13,208,244,231, 56, 28, 41, 28,255,247, /* 0x 650 */ 1, 58,131,226, 1, 0, 83,225,251,255,255,154, 31,192,143,226, /* 0x 650 */
161,255, 52, 28, 32, 96, 4, 54, 43,120, 27, 6, 1, 53, 0, 43, /* 0x 660 */ 15,224,160,225, 28,255, 47,225, 15, 64,189,232,116,192,159,229, /* 0x 660 */
250,209,231,231,105,120, 43,120, 9, 2, 56, 28, 89, 24,255,247, /* 0x 670 */ 28,255, 47,225, 26, 75, 27,104, 24, 71, 26, 75,251,231, 30, 75, /* 0x 670 */
145,255, 52, 28, 2, 53, 4, 54, 32, 96,219,231, 1, 53,188,231, /* 0x 680 */ 249,231, 59,224,240,181, 26, 72, 0, 34, 26, 76, 15, 37,255, 38, /* 0x 680 */
35,176,240,188, 1,188, 0, 71, 1,192,143,226, 28,255, 47,225, /* 0x 690 */ 54, 6,247, 67,160, 66, 13,208,195,120, 43, 64, 11, 43, 6,209, /* 0x 690 */
252,181, 15, 24, 1, 36,101, 66,228, 7, 5, 38, 54, 2, 15,224, /* 0x 6a0 */ 3,104, 25, 28, 49, 64,155, 26, 59, 64, 11, 67, 3, 96, 4, 48, /* 0x 6a0 */
24,188,192, 27,210, 26, 34, 96,240,188, 2,188, 8, 71, 4,120, /* 0x 6b0 */ 1, 50,239,231,240,189, 3, 33, 67, 92, 18, 2,210, 24, 1, 57, /* 0x 6b0 */
100, 65, 1, 48, 36, 6,247, 70, 3,120, 1, 48, 19,112, 1, 50, /* 0x 6c0 */ 250,213, 16, 28,112, 71, 0, 0, 83, 82, 67, 48, 83, 82, 67, 76, /* 0x 6c0 */
36, 25,254, 70,243,208,247,210, 1, 33, 4,224, 1, 57, 36, 25, /* 0x 6d0 */ 68, 83, 84, 48, 68, 83, 84, 76, 66, 73, 77, 80, 79, 78, 65, 77, /* 0x 6d0 */
254, 70,236,208, 73, 65, 36, 25,254, 70,232,208, 73, 65, 36, 25, /* 0x 6e0 */ 71, 69, 84, 80, 76, 79, 65, 68, 69, 78, 84, 82, 66, 82, 69, 76, /* 0x 6e0 */
254, 70,228,208,242,211,203, 30, 0, 33, 8,211, 27, 2, 5,120, /* 0x 6f0 */ 70, 73, 66, 83, 70, 73, 66, 69, 67, 83, 89, 78,240,181,163,176, /* 0x 6f0 */
1, 48, 29, 67,237, 67,211,208,109, 16, 19,210, 3,224, 36, 25, /* 0x 700 */ 0, 34, 2,146,130,104, 1,146, 66,105, 3, 28, 4,105, 89,104, /* 0x 700 */
254, 70,212,208, 14,210, 1, 33, 36, 25,254, 70,207,208, 9,210, /* 0x 710 */ 0,146, 2,171, 1,154, 0,104, 0,240, 82,248,255,247,178,255, /* 0x 710 */
36, 25,254, 70,203,208, 73, 65, 36, 25,254, 70,199,208,247,211, /* 0x 720 */ 37, 28, 40, 28,255,247,199,255, 4, 30, 61,208, 0,155, 40, 29, /* 0x 720 */
4, 49, 4,224, 36, 25,254, 70,193,208, 73, 65, 2, 49,238, 66, /* 0x 730 */ 228, 24,255,247,192,255, 1,154,134, 24, 3,168, 2, 28, 35,120, /* 0x 730 */
0,210, 1, 49, 19,120, 83, 93, 19,112, 1, 50, 1, 57,250,209, /* 0x 740 */ 27, 6, 0, 43, 4,208, 27, 14, 19,128, 1, 52, 2, 50,246,231, /* 0x 740 */
190,231, 0, 0, 1, 0, 81,227, 11, 0, 0, 26, 15, 64, 45,233, /* 0x 750 */ 0, 35, 19,128,255,247,145,255, 8, 53, 7, 28, 43,120, 27, 6, /* 0x 750 */
136, 0,143,226, 14, 0,144,232, 2, 16,129,224, 0, 32,147,229, /* 0x 760 */ 0, 43, 31,208, 27, 14, 1, 53, 1, 43, 2,208,255, 43, 13,208, /* 0x 760 */
1, 58,131,226, 1, 0, 83,225,251,255,255,154, 4,224,143,226, /* 0x 770 */ 244,231, 56, 28, 41, 28,255,247,125,255, 52, 28, 32, 96, 4, 54, /* 0x 770 */
23,192,143,226, 28,255, 47,225, 15, 64,189,232,124,192,159,229, /* 0x 780 */ 43,120, 27, 6, 1, 53, 0, 43,250,209,231,231,105,120, 43,120, /* 0x 780 */
28,255, 47,225, 28, 75, 27,104, 24, 71, 28, 75,251,231, 59,224, /* 0x 790 */ 9, 2, 56, 28, 89, 24,255,247,109,255, 52, 28, 2, 53, 4, 54, /* 0x 790 */
3, 33, 67, 92, 18, 2,210, 24, 1, 57,250,213, 16, 28,112, 71, /* 0x 7a0 */ 32, 96,219,231, 1, 53,188,231, 4, 32,255,247,104,255, 35,176, /* 0x 7a0 */
48,180, 24, 72, 16, 74, 17, 31, 3,120, 1, 48, 0, 43, 21,208, /* 0x 7b0 */ 240,188, 1,188, 0, 71,192, 70, 1,192,143,226, 28,255, 47,225, /* 0x 7b0 */
240, 43, 8,211, 15, 36, 28, 64, 67,120, 36, 2,228, 24, 3,120, /* 0x 7c0 */ 252,181, 15, 24, 1, 36,101, 66,228, 7, 5, 38, 54, 2, 15,224, /* 0x 7c0 */
2, 48, 36, 2, 27, 25,201, 24, 0, 37, 75, 93, 36, 2,228, 24, /* 0x 7d0 */ 24,188,192, 27,210, 26, 34, 96,240,188, 2,188, 8, 71, 4,120, /* 0x 7d0 */
1, 53, 4, 45,249,209,164, 24, 12, 96,229,231, 48,188,112, 71, /* 0x 7e0 */ 100, 65, 1, 48, 36, 6,247, 70, 3,120, 1, 48, 19,112, 1, 50, /* 0x 7e0 */
83, 82, 67, 48, 83, 82, 67, 76, 68, 83, 84, 48, 68, 83, 84, 76, /* 0x 7f0 */ 36, 25,254, 70,243,208,247,210, 1, 33, 4,224, 1, 57, 36, 25, /* 0x 7f0 */
66, 73, 77, 80, 79, 78, 65, 77, 71, 69, 84, 80, 76, 79, 65, 68, /* 0x 800 */ 254, 70,236,208, 73, 65, 36, 25,254, 70,232,208, 73, 65, 36, 25, /* 0x 800 */
69, 78, 84, 82, 66, 82, 69, 76,240,181,163,176, 0, 34, 2,146, /* 0x 810 */ 254, 70,228,208,242,211,203, 30, 0, 33, 8,211, 27, 2, 5,120, /* 0x 810 */
130,104, 1,146, 66,105, 3, 28, 4,105, 0,146, 89,104, 0,104, /* 0x 820 */ 1, 48, 29, 67,237, 67,211,208,109, 16, 19,210, 3,224, 36, 25, /* 0x 820 */
1,154, 2,171, 0,240, 78,248, 37, 28, 40, 28,255,247,176,255, /* 0x 830 */ 254, 70,212,208, 14,210, 1, 33, 36, 25,254, 70,207,208, 9,210, /* 0x 830 */
4, 30, 61,208, 0,155, 40, 29,228, 24,255,247,169,255, 1,154, /* 0x 840 */ 36, 25,254, 70,203,208, 73, 65, 36, 25,254, 70,199,208,247,211, /* 0x 840 */
134, 24, 3,168, 2, 28, 35,120, 27, 6, 0, 43, 4,208, 27, 14, /* 0x 850 */ 4, 49, 4,224, 36, 25,254, 70,193,208, 73, 65, 2, 49,238, 66, /* 0x 850 */
19,128, 1, 52, 2, 50,246,231, 0, 35, 19,128,255,247,149,255, /* 0x 860 */ 0,210, 1, 49, 19,120, 83, 93, 19,112, 1, 50, 1, 57,250,209, /* 0x 860 */
8, 53, 7, 28, 43,120, 27, 6, 0, 43, 31,208, 27, 14, 1, 53, /* 0x 870 */ 190,231, 0, 0, 1, 0, 81,227, 11, 0, 0, 26, 15, 64, 45,233, /* 0x 870 */
1, 43, 2,208,255, 43, 13,208,244,231, 56, 28, 41, 28,255,247, /* 0x 880 */ 188, 0,143,226, 14, 0,144,232, 2, 16,129,224, 0, 32,147,229, /* 0x 880 */
129,255, 52, 28, 32, 96, 4, 54, 43,120, 27, 6, 1, 53, 0, 43, /* 0x 890 */ 1, 58,131,226, 1, 0, 83,225,251,255,255,154, 31,192,143,226, /* 0x 890 */
250,209,231,231,105,120, 43,120, 9, 2, 56, 28, 89, 24,255,247, /* 0x 8a0 */ 15,224,160,225, 28,255, 47,225, 15, 64,189,232,176,192,159,229, /* 0x 8a0 */
113,255, 52, 28, 2, 53, 4, 54, 32, 96,219,231, 1, 53,188,231, /* 0x 8b0 */ 28,255, 47,225, 41, 75, 27,104, 24, 71, 41, 75,251,231, 45, 75, /* 0x 8b0 */
255,247,118,255, 35,176,240,188, 1,188, 0, 71, 1,192,143,226, /* 0x 8c0 */ 249,231, 89,224,240,181, 41, 72, 0, 34, 41, 76, 15, 37,255, 38, /* 0x 8c0 */
28,255, 47,225,252,181, 15, 24, 1, 36,101, 66,228, 7, 5, 38, /* 0x 8d0 */ 54, 6,247, 67,160, 66, 13,208,195,120, 43, 64, 11, 43, 6,209, /* 0x 8d0 */
54, 2, 15,224, 24,188,192, 27,210, 26, 34, 96,240,188, 2,188, /* 0x 8e0 */ 3,104, 25, 28, 49, 64,155, 26, 59, 64, 11, 67, 3, 96, 4, 48, /* 0x 8e0 */
8, 71, 4,120,100, 65, 1, 48, 36, 6,247, 70, 3,120, 1, 48, /* 0x 8f0 */ 1, 50,239,231,240,189, 3, 33, 67, 92, 18, 2,210, 24, 1, 57, /* 0x 8f0 */
19,112, 1, 50, 36, 25,254, 70,243,208,247,210, 1, 33, 4,224, /* 0x 900 */ 250,213, 16, 28,112, 71, 48,181, 23, 72, 16, 74, 17, 31, 3,120, /* 0x 900 */
1, 57, 36, 25,254, 70,236,208, 73, 65, 36, 25,254, 70,232,208, /* 0x 910 */ 1, 48, 0, 43, 21,208,240, 43, 8,211, 15, 36, 28, 64, 67,120, /* 0x 910 */
73, 65, 36, 25,254, 70,228,208,242,211,203, 30, 0, 33, 8,211, /* 0x 920 */ 36, 2,228, 24, 3,120, 2, 48, 36, 2, 27, 25,201, 24, 0, 37, /* 0x 920 */
27, 2, 5,120, 1, 48, 29, 67,237, 67,211,208,109, 16, 19,210, /* 0x 930 */ 75, 93, 36, 2,228, 24, 1, 53, 4, 45,249,209,164, 24, 12, 96, /* 0x 930 */
3,224, 36, 25,254, 70,212,208, 14,210, 1, 33, 36, 25,254, 70, /* 0x 940 */ 229,231, 48,189, 83, 82, 67, 48, 83, 82, 67, 76, 68, 83, 84, 48, /* 0x 940 */
207,208, 9,210, 36, 25,254, 70,203,208, 73, 65, 36, 25,254, 70, /* 0x 950 */ 68, 83, 84, 76, 66, 73, 77, 80, 79, 78, 65, 77, 71, 69, 84, 80, /* 0x 950 */
199,208,247,211, 4, 49, 4,224, 36, 25,254, 70,193,208, 73, 65, /* 0x 960 */ 76, 79, 65, 68, 69, 78, 84, 82, 66, 82, 69, 76, 70, 73, 66, 83, /* 0x 960 */
2, 49,238, 66, 0,210, 1, 49, 19,120, 83, 93, 19,112, 1, 50, /* 0x 970 */ 70, 73, 66, 69, 67, 83, 89, 78,240,181,163,176, 0, 34, 2,146, /* 0x 970 */
1, 57,250,209,190,231, 0, 0, 15, 64, 45,233, 72, 0,143,226, /* 0x 980 */ 130,104, 1,146, 66,105, 3, 28, 4,105, 89,104, 0,146, 2,171, /* 0x 980 */
14, 0,144,232, 2, 16,129,224, 0, 32,147,229, 1, 58,131,226, /* 0x 990 */ 1,154, 0,104, 0,240, 84,248,255,247,148,255, 37, 28, 40, 28, /* 0x 990 */
1, 0, 83,225,251,255,255,154, 4,224,143,226, 23,192,143,226, /* 0x 9a0 */ 255,247,169,255, 4, 30, 61,208, 0,155, 40, 29,228, 24,255,247, /* 0x 9a0 */
28,255, 47,225, 15, 64,189,232, 60,192,159,229, 28,255, 47,225, /* 0x 9b0 */ 162,255, 1,154,134, 24, 3,168, 2, 28, 35,120, 27, 6, 0, 43, /* 0x 9b0 */
12, 75, 27,104, 24, 71, 12, 75,251,231, 27,224, 3, 33, 67, 92, /* 0x 9c0 */ 4,208, 27, 14, 19,128, 1, 52, 2, 50,246,231, 0, 35, 19,128, /* 0x 9c0 */
18, 2,210, 24, 1, 57,250,213, 16, 28,112, 71, 83, 82, 67, 48, /* 0x 9d0 */ 255,247,115,255, 8, 53, 7, 28, 43,120, 27, 6, 0, 43, 31,208, /* 0x 9d0 */
83, 82, 67, 76, 68, 83, 84, 48, 68, 83, 84, 76, 66, 73, 77, 80, /* 0x 9e0 */ 27, 14, 1, 53, 1, 43, 2,208,255, 43, 13,208,244,231, 56, 28, /* 0x 9e0 */
79, 78, 65, 77, 71, 69, 84, 80, 76, 79, 65, 68, 69, 78, 84, 82, /* 0x 9f0 */ 41, 28,255,247, 95,255, 52, 28, 32, 96, 4, 54, 43,120, 27, 6, /* 0x 9f0 */
66, 82, 69, 76,240,181,163,176, 0, 34, 2,146,130,104, 1,146, /* 0x a00 */ 1, 53, 0, 43,250,209,231,231,105,120, 43,120, 9, 2, 56, 28, /* 0x a00 */
66,105, 3, 28, 4,105, 0,146, 89,104, 0,104, 1,154, 2,171, /* 0x a10 */ 89, 24,255,247, 79,255, 52, 28, 2, 53, 4, 54, 32, 96,219,231, /* 0x a10 */
0,240, 76,248, 37, 28, 40, 28,255,247,208,255, 4, 30, 61,208, /* 0x a20 */ 1, 53,188,231,255,247,111,255, 4, 32,255,247, 72,255, 35,176, /* 0x a20 */
0,155, 40, 29,228, 24,255,247,201,255, 1,154,134, 24, 3,168, /* 0x a30 */ 240,188, 1,188, 0, 71,192, 70, 1,192,143,226, 28,255, 47,225, /* 0x a30 */
2, 28, 35,120, 27, 6, 0, 43, 4,208, 27, 14, 19,128, 1, 52, /* 0x a40 */ 252,181, 15, 24, 1, 36,101, 66,228, 7, 5, 38, 54, 2, 15,224, /* 0x a40 */
2, 50,246,231, 0, 35, 19,128,255,247,181,255, 8, 53, 7, 28, /* 0x a50 */ 24,188,192, 27,210, 26, 34, 96,240,188, 2,188, 8, 71, 4,120, /* 0x a50 */
43,120, 27, 6, 0, 43, 31,208, 27, 14, 1, 53, 1, 43, 2,208, /* 0x a60 */ 100, 65, 1, 48, 36, 6,247, 70, 3,120, 1, 48, 19,112, 1, 50, /* 0x a60 */
255, 43, 13,208,244,231, 56, 28, 41, 28,255,247,161,255, 52, 28, /* 0x a70 */ 36, 25,254, 70,243,208,247,210, 1, 33, 4,224, 1, 57, 36, 25, /* 0x a70 */
32, 96, 4, 54, 43,120, 27, 6, 1, 53, 0, 43,250,209,231,231, /* 0x a80 */ 254, 70,236,208, 73, 65, 36, 25,254, 70,232,208, 73, 65, 36, 25, /* 0x a80 */
105,120, 43,120, 9, 2, 56, 28, 89, 24,255,247,145,255, 52, 28, /* 0x a90 */ 254, 70,228,208,242,211,203, 30, 0, 33, 8,211, 27, 2, 5,120, /* 0x a90 */
2, 53, 4, 54, 32, 96,219,231, 1, 53,188,231, 35,176,240,188, /* 0x aa0 */ 1, 48, 29, 67,237, 67,211,208,109, 16, 19,210, 3,224, 36, 25, /* 0x aa0 */
1,188, 0, 71, 1,192,143,226, 28,255, 47,225, 9, 24,254,181, /* 0x ab0 */ 254, 70,212,208, 14,210, 1, 33, 36, 25,254, 70,207,208, 9,210, /* 0x ab0 */
1, 36,101, 66,228, 7, 13, 39, 63, 2, 15,224, 26,188, 64, 26, /* 0x ac0 */ 36, 25,254, 70,203,208, 73, 65, 36, 25,254, 70,199,208,247,211, /* 0x ac0 */
210, 26, 34, 96,240,188, 2,188, 8, 71, 4,120,100, 65, 1, 48, /* 0x ad0 */ 4, 49, 4,224, 36, 25,254, 70,193,208, 73, 65, 2, 49,238, 66, /* 0x ad0 */
36, 6,247, 70, 3,120, 1, 48, 19,112, 1, 50, 36, 25,254, 70, /* 0x ae0 */ 0,210, 1, 49, 19,120, 83, 93, 19,112, 1, 50, 1, 57,250,209, /* 0x ae0 */
243,208,247,210, 1, 33, 36, 25,254, 70,238,208, 73, 65, 36, 25, /* 0x af0 */ 190,231, 0, 0, 15, 64, 45,233,128, 0,143,226, 14, 0,144,232, /* 0x af0 */
254, 70,234,208,247,211,203, 30, 0, 33, 5,211, 27, 2, 5,120, /* 0x b00 */ 2, 16,129,224, 0, 32,147,229, 1, 58,131,226, 1, 0, 83,225, /* 0x b00 */
1, 48, 29, 67,237, 67,217,208, 36, 25,254, 70,221,208, 73, 65, /* 0x b10 */ 251,255,255,154, 31,192,143,226, 15,224,160,225, 28,255, 47,225, /* 0x b10 */
36, 25,254, 70,217,208, 73, 65, 9,209, 1, 33, 36, 25,254, 70, /* 0x b20 */ 15, 64,189,232,116,192,159,229, 28,255, 47,225, 26, 75, 27,104, /* 0x b20 */
211,208, 73, 65, 36, 25,254, 70,207,208,247,211, 2, 49, 1, 49, /* 0x b30 */ 24, 71, 26, 75,251,231, 30, 75,249,231, 59,224,240,181, 26, 72, /* 0x b30 */
253, 66, 0,210, 1, 49, 19,120, 83, 93, 19,112, 1, 50, 1, 57, /* 0x b40 */ 0, 34, 26, 76, 15, 37,255, 38, 54, 6,247, 67,160, 66, 13,208, /* 0x b40 */
250,209,203,231, 1, 0, 81,227, 11, 0, 0, 26, 15, 64, 45,233, /* 0x b50 */ 195,120, 43, 64, 11, 43, 6,209, 3,104, 25, 28, 49, 64,155, 26, /* 0x b50 */
136, 0,143,226, 14, 0,144,232, 2, 16,129,224, 0, 32,147,229, /* 0x b60 */ 59, 64, 11, 67, 3, 96, 4, 48, 1, 50,239,231,240,189, 3, 33, /* 0x b60 */
1, 58,131,226, 1, 0, 83,225,251,255,255,154, 4,224,143,226, /* 0x b70 */ 67, 92, 18, 2,210, 24, 1, 57,250,213, 16, 28,112, 71, 0, 0, /* 0x b70 */
23,192,143,226, 28,255, 47,225, 15, 64,189,232,124,192,159,229, /* 0x b80 */ 83, 82, 67, 48, 83, 82, 67, 76, 68, 83, 84, 48, 68, 83, 84, 76, /* 0x b80 */
28,255, 47,225, 28, 75, 27,104, 24, 71, 28, 75,251,231, 59,224, /* 0x b90 */ 66, 73, 77, 80, 79, 78, 65, 77, 71, 69, 84, 80, 76, 79, 65, 68, /* 0x b90 */
3, 33, 67, 92, 18, 2,210, 24, 1, 57,250,213, 16, 28,112, 71, /* 0x ba0 */ 69, 78, 84, 82, 66, 82, 69, 76, 70, 73, 66, 83, 70, 73, 66, 69, /* 0x ba0 */
48,180, 24, 72, 16, 74, 17, 31, 3,120, 1, 48, 0, 43, 21,208, /* 0x bb0 */ 67, 83, 89, 78,240,181,163,176, 0, 34, 2,146,130,104, 1,146, /* 0x bb0 */
240, 43, 8,211, 15, 36, 28, 64, 67,120, 36, 2,228, 24, 3,120, /* 0x bc0 */ 66,105, 3, 28, 4,105, 89,104, 0,146, 2,171, 1,154, 0,104, /* 0x bc0 */
2, 48, 36, 2, 27, 25,201, 24, 0, 37, 75, 93, 36, 2,228, 24, /* 0x bd0 */ 0,240, 82,248,255,247,178,255, 37, 28, 40, 28,255,247,199,255, /* 0x bd0 */
1, 53, 4, 45,249,209,164, 24, 12, 96,229,231, 48,188,112, 71, /* 0x be0 */ 4, 30, 61,208, 0,155, 40, 29,228, 24,255,247,192,255, 1,154, /* 0x be0 */
83, 82, 67, 48, 83, 82, 67, 76, 68, 83, 84, 48, 68, 83, 84, 76, /* 0x bf0 */ 134, 24, 3,168, 2, 28, 35,120, 27, 6, 0, 43, 4,208, 27, 14, /* 0x bf0 */
66, 73, 77, 80, 79, 78, 65, 77, 71, 69, 84, 80, 76, 79, 65, 68, /* 0x c00 */ 19,128, 1, 52, 2, 50,246,231, 0, 35, 19,128,255,247,145,255, /* 0x c00 */
69, 78, 84, 82, 66, 82, 69, 76,240,181,163,176, 0, 34, 2,146, /* 0x c10 */ 8, 53, 7, 28, 43,120, 27, 6, 0, 43, 31,208, 27, 14, 1, 53, /* 0x c10 */
130,104, 1,146, 66,105, 3, 28, 4,105, 0,146, 89,104, 0,104, /* 0x c20 */ 1, 43, 2,208,255, 43, 13,208,244,231, 56, 28, 41, 28,255,247, /* 0x c20 */
1,154, 2,171, 0,240, 78,248, 37, 28, 40, 28,255,247,176,255, /* 0x c30 */ 125,255, 52, 28, 32, 96, 4, 54, 43,120, 27, 6, 1, 53, 0, 43, /* 0x c30 */
4, 30, 61,208, 0,155, 40, 29,228, 24,255,247,169,255, 1,154, /* 0x c40 */ 250,209,231,231,105,120, 43,120, 9, 2, 56, 28, 89, 24,255,247, /* 0x c40 */
134, 24, 3,168, 2, 28, 35,120, 27, 6, 0, 43, 4,208, 27, 14, /* 0x c50 */ 109,255, 52, 28, 2, 53, 4, 54, 32, 96,219,231, 1, 53,188,231, /* 0x c50 */
19,128, 1, 52, 2, 50,246,231, 0, 35, 19,128,255,247,149,255, /* 0x c60 */ 4, 32,255,247,104,255, 35,176,240,188, 1,188, 0, 71,192, 70, /* 0x c60 */
8, 53, 7, 28, 43,120, 27, 6, 0, 43, 31,208, 27, 14, 1, 53, /* 0x c70 */ 1,192,143,226, 28,255, 47,225, 9, 24,254,181, 1, 36,101, 66, /* 0x c70 */
1, 43, 2,208,255, 43, 13,208,244,231, 56, 28, 41, 28,255,247, /* 0x c80 */ 228, 7, 13, 39, 63, 2, 15,224, 26,188, 64, 26,210, 26, 34, 96, /* 0x c80 */
129,255, 52, 28, 32, 96, 4, 54, 43,120, 27, 6, 1, 53, 0, 43, /* 0x c90 */ 240,188, 2,188, 8, 71, 4,120,100, 65, 1, 48, 36, 6,247, 70, /* 0x c90 */
250,209,231,231,105,120, 43,120, 9, 2, 56, 28, 89, 24,255,247, /* 0x ca0 */ 3,120, 1, 48, 19,112, 1, 50, 36, 25,254, 70,243,208,247,210, /* 0x ca0 */
113,255, 52, 28, 2, 53, 4, 54, 32, 96,219,231, 1, 53,188,231, /* 0x cb0 */ 1, 33, 36, 25,254, 70,238,208, 73, 65, 36, 25,254, 70,234,208, /* 0x cb0 */
255,247,118,255, 35,176,240,188, 1,188, 0, 71, 1,192,143,226, /* 0x cc0 */ 247,211,203, 30, 0, 33, 5,211, 27, 2, 5,120, 1, 48, 29, 67, /* 0x cc0 */
28,255, 47,225, 9, 24,254,181, 1, 36,101, 66,228, 7, 13, 39, /* 0x cd0 */ 237, 67,217,208, 36, 25,254, 70,221,208, 73, 65, 36, 25,254, 70, /* 0x cd0 */
63, 2, 15,224, 26,188, 64, 26,210, 26, 34, 96,240,188, 2,188, /* 0x ce0 */ 217,208, 73, 65, 9,209, 1, 33, 36, 25,254, 70,211,208, 73, 65, /* 0x ce0 */
8, 71, 4,120,100, 65, 1, 48, 36, 6,247, 70, 3,120, 1, 48, /* 0x cf0 */ 36, 25,254, 70,207,208,247,211, 2, 49, 1, 49,253, 66, 0,210, /* 0x cf0 */
19,112, 1, 50, 36, 25,254, 70,243,208,247,210, 1, 33, 36, 25, /* 0x d00 */ 1, 49, 19,120, 83, 93, 19,112, 1, 50, 1, 57,250,209,203,231, /* 0x d00 */
254, 70,238,208, 73, 65, 36, 25,254, 70,234,208,247,211,203, 30, /* 0x d10 */ 1, 0, 81,227, 11, 0, 0, 26, 15, 64, 45,233,188, 0,143,226, /* 0x d10 */
0, 33, 5,211, 27, 2, 5,120, 1, 48, 29, 67,237, 67,217,208, /* 0x d20 */ 14, 0,144,232, 2, 16,129,224, 0, 32,147,229, 1, 58,131,226, /* 0x d20 */
36, 25,254, 70,221,208, 73, 65, 36, 25,254, 70,217,208, 73, 65, /* 0x d30 */ 1, 0, 83,225,251,255,255,154, 31,192,143,226, 15,224,160,225, /* 0x d30 */
9,209, 1, 33, 36, 25,254, 70,211,208, 73, 65, 36, 25,254, 70, /* 0x d40 */ 28,255, 47,225, 15, 64,189,232,176,192,159,229, 28,255, 47,225, /* 0x d40 */
207,208,247,211, 2, 49, 1, 49,253, 66, 0,210, 1, 49, 19,120, /* 0x d50 */ 41, 75, 27,104, 24, 71, 41, 75,251,231, 45, 75,249,231, 89,224, /* 0x d50 */
83, 93, 19,112, 1, 50, 1, 57,250,209,203,231, 85, 80, 88, 33, /* 0x d60 */ 240,181, 41, 72, 0, 34, 41, 76, 15, 37,255, 38, 54, 6,247, 67, /* 0x d60 */
161,216,208,213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x d70 */ 160, 66, 13,208,195,120, 43, 64, 11, 43, 6,209, 3,104, 25, 28, /* 0x d70 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 65, 82, 77, 80, /* 0x d80 */ 49, 64,155, 26, 59, 64, 11, 67, 3, 96, 4, 48, 1, 50,239,231, /* 0x d80 */
69, 65, 88, 69, 0, 0, 0, 0, 0, 65, 82, 77, 80, 69, 65, 68, /* 0x d90 */ 240,189, 3, 33, 67, 92, 18, 2,210, 24, 1, 57,250,213, 16, 28, /* 0x d90 */
69, 0,128, 2, 0, 0, 65, 82, 77, 80, 69, 84, 88, 69, 0,108, /* 0x da0 */ 112, 71, 48,181, 23, 72, 16, 74, 17, 31, 3,120, 1, 48, 0, 43, /* 0x da0 */
5, 0, 0, 65, 82, 77, 80, 69, 84, 68, 69, 0, 84, 7, 0, 0, /* 0x db0 */ 21,208,240, 43, 8,211, 15, 36, 28, 64, 67,120, 36, 2,228, 24, /* 0x db0 */
65, 82, 77, 80, 69, 84, 88, 66, 0,136, 9, 0, 0, 65, 82, 77, /* 0x dc0 */ 3,120, 2, 48, 36, 2, 27, 25,201, 24, 0, 37, 75, 93, 36, 2, /* 0x dc0 */
80, 69, 84, 68, 66, 0, 84, 11, 0, 0, 65, 82, 77, 80, 69, 72, /* 0x dd0 */ 228, 24, 1, 53, 4, 45,249,209,164, 24, 12, 96,229,231, 48,189, /* 0x dd0 */
69, 65, 68, 0,108, 13, 0, 0, 85, 80, 88, 49, 72, 69, 65, 68, /* 0x de0 */ 83, 82, 67, 48, 83, 82, 67, 76, 68, 83, 84, 48, 68, 83, 84, 76, /* 0x de0 */
0,108, 13, 0, 0, 65, 82, 77, 80, 69, 69, 79, 70, 0,140, 13, /* 0x df0 */ 66, 73, 77, 80, 79, 78, 65, 77, 71, 69, 84, 80, 76, 79, 65, 68, /* 0x df0 */
0, 0,255,255,255,255,140, 13 /* 0x e00 */ 69, 78, 84, 82, 66, 82, 69, 76, 70, 73, 66, 83, 70, 73, 66, 69, /* 0x e00 */
67, 83, 89, 78,240,181,163,176, 0, 34, 2,146,130,104, 1,146, /* 0x e10 */
66,105, 3, 28, 4,105, 89,104, 0,146, 2,171, 1,154, 0,104, /* 0x e20 */
0,240, 84,248,255,247,148,255, 37, 28, 40, 28,255,247,169,255, /* 0x e30 */
4, 30, 61,208, 0,155, 40, 29,228, 24,255,247,162,255, 1,154, /* 0x e40 */
134, 24, 3,168, 2, 28, 35,120, 27, 6, 0, 43, 4,208, 27, 14, /* 0x e50 */
19,128, 1, 52, 2, 50,246,231, 0, 35, 19,128,255,247,115,255, /* 0x e60 */
8, 53, 7, 28, 43,120, 27, 6, 0, 43, 31,208, 27, 14, 1, 53, /* 0x e70 */
1, 43, 2,208,255, 43, 13,208,244,231, 56, 28, 41, 28,255,247, /* 0x e80 */
95,255, 52, 28, 32, 96, 4, 54, 43,120, 27, 6, 1, 53, 0, 43, /* 0x e90 */
250,209,231,231,105,120, 43,120, 9, 2, 56, 28, 89, 24,255,247, /* 0x ea0 */
79,255, 52, 28, 2, 53, 4, 54, 32, 96,219,231, 1, 53,188,231, /* 0x eb0 */
255,247,111,255, 4, 32,255,247, 72,255, 35,176,240,188, 1,188, /* 0x ec0 */
0, 71,192, 70, 1,192,143,226, 28,255, 47,225, 9, 24,254,181, /* 0x ed0 */
1, 36,101, 66,228, 7, 13, 39, 63, 2, 15,224, 26,188, 64, 26, /* 0x ee0 */
210, 26, 34, 96,240,188, 2,188, 8, 71, 4,120,100, 65, 1, 48, /* 0x ef0 */
36, 6,247, 70, 3,120, 1, 48, 19,112, 1, 50, 36, 25,254, 70, /* 0x f00 */
243,208,247,210, 1, 33, 36, 25,254, 70,238,208, 73, 65, 36, 25, /* 0x f10 */
254, 70,234,208,247,211,203, 30, 0, 33, 5,211, 27, 2, 5,120, /* 0x f20 */
1, 48, 29, 67,237, 67,217,208, 36, 25,254, 70,221,208, 73, 65, /* 0x f30 */
36, 25,254, 70,217,208, 73, 65, 9,209, 1, 33, 36, 25,254, 70, /* 0x f40 */
211,208, 73, 65, 36, 25,254, 70,207,208,247,211, 2, 49, 1, 49, /* 0x f50 */
253, 66, 0,210, 1, 49, 19,120, 83, 93, 19,112, 1, 50, 1, 57, /* 0x f60 */
250,209,203,231, 85, 80, 88, 33,161,216,208,213, 0, 0, 0, 0, /* 0x f70 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x f80 */
0, 0, 0, 45, 65, 82, 77, 80, 69, 65, 88, 69, 0, 0, 0, 0, /* 0x f90 */
0, 65, 82, 77, 80, 69, 65, 68, 69, 0,232, 2, 0, 0, 65, 82, /* 0x fa0 */
77, 80, 69, 84, 88, 69, 0, 60, 6, 0, 0, 65, 82, 77, 80, 69, /* 0x fb0 */
84, 68, 69, 0,116, 8, 0, 0, 65, 82, 77, 80, 69, 84, 88, 66, /* 0x fc0 */
0,244, 10, 0, 0, 65, 82, 77, 80, 69, 84, 68, 66, 0, 16, 13, /* 0x fd0 */
0, 0, 65, 82, 77, 80, 69, 72, 69, 65, 68, 0,116, 15, 0, 0, /* 0x fe0 */
85, 80, 88, 49, 72, 69, 65, 68, 0,116, 15, 0, 0, 65, 82, 77, /* 0x ff0 */
80, 69, 69, 79, 70, 0,148, 15, 0, 0,255,255,255,255,148, 15 /* 0x1000 */
}; };
+9 -4
View File
@@ -40,6 +40,8 @@ void *LoadLibraryW(const unsigned short *);
void *GetProcAddressA(const void *, const void *); void *GetProcAddressA(const void *, const void *);
void *get_le32(const void *); void *get_le32(const void *);
void reloc_main(); void reloc_main();
void Unfilter_0x50();
void CacheSync(unsigned);
static void handle_imports(const unsigned char *imp, unsigned name_offset, static void handle_imports(const unsigned char *imp, unsigned name_offset,
unsigned iat_offset) unsigned iat_offset)
@@ -127,13 +129,16 @@ void upx_main(const unsigned *info)
#ifdef SAFE #ifdef SAFE
dlen = info[3]; dlen = info[3];
#endif #endif
//WRITEFILE2('0', (void*) dst0, info[7] + 256 - dst0); //WRITEFILE2('l', (void*) dst0, info[7] + 256 - dst0);
UCL_DECOMPRESS((void *) src0, srcl, (void *) dst0, &dlen); UCL_DECOMPRESS((void *) src0, srcl, (void *) dst0, &dlen);
//WRITEFILE2('1', (void*) dst0, info[7] + 256 - dst0); // WRITEFILE2('c', (void*) dst0, info[7] + 256 - dst0);
Unfilter_0x50();
//WRITEFILE2('f', (void*) dst0, info[7] + 256 - dst0);
handle_imports((void *) bimp, onam, dst0); handle_imports((void *) bimp, onam, dst0);
//WRITEFILE2('2', (void*) dst0, info[7] + 256 - dst0); //WRITEFILE2('i', (void*) dst0, info[7] + 256 - dst0);
#ifdef STUB_FOR_DLL #ifdef STUB_FOR_DLL
reloc_main(); reloc_main();
//WRITEFILE2('3', (void*) dst0, info[7] + 256 - dst0); //WRITEFILE2('r', (void*) dst0, info[7] + 256 - dst0);
#endif #endif
CacheSync(4); // CACHE_SYNC_WRITEBACK
} }
+126 -22
View File
@@ -29,6 +29,7 @@
<jreiser@users.sourceforge.net> <jreiser@users.sourceforge.net>
*/ */
#define DEBUG 0
#undef STUB_IN_THUMB_MODE #undef STUB_IN_THUMB_MODE
#if defined(__ARM_ARCH_4T__) || defined(__ARM_ARCH_5T__) #if defined(__ARM_ARCH_4T__) || defined(__ARM_ARCH_5T__)
@@ -66,10 +67,9 @@
bls .L01 bls .L01
# ifdef __ARM_ARCH_4T__ # ifdef __ARM_ARCH_4T__
adr lr, .Larmret
adr ip, call_upxmain + 1 adr ip, call_upxmain + 1
mov lr, pc
bx ip bx ip
.Larmret:
ldmfd sp!, {r0 - r3, lr} ldmfd sp!, {r0 - r3, lr}
.Lstart_orig: .Lstart_orig:
ldr ip, ENTR ldr ip, ENTR
@@ -81,7 +81,7 @@
ldr pc, ENTR @ original entry ldr pc, ENTR @ original entry
# endif # endif
@@@@@@@@@@@@@@@@
.code 16 .code 16
.global GetProcAddressA .global GetProcAddressA
@@ -93,8 +93,6 @@ GetProcAddressA:
ldr r3, [r3] ldr r3, [r3]
bx r3 bx r3
@@@@@@@@@@@@@@@@
.global LoadLibraryW .global LoadLibraryW
.thumb_func .thumb_func
@@ -102,12 +100,63 @@ LoadLibraryW:
ldr r3, LLIB ldr r3, LLIB
b .Lcallr3 b .Lcallr3
.global CacheSync
.thumb_func
CacheSync:
ldr r3, CSYN
b .Lcallr3
# ifdef __ARM_ARCH_4T__ # ifdef __ARM_ARCH_4T__
call_upxmain: call_upxmain:
b upx_main b upx_main
# endif # endif
@@@@@@@@@@@@@@@@
.global Unfilter_0x50
.thumb_func
buffer .req r0
addval .req r2
bufend .req r4
Unfilter_0x50:
push {r4 - r7, lr}
ldr buffer, FIBS
mov addval, #0
ldr bufend, FIBE
mov r5, #0x0f
mov r6, #0xff
lsl r6, #24
mvn r7, r6
.Luf50_0:
cmp buffer, bufend
beq .Luf50_ret
ldrb r3, [buffer, #3]
and r3, r5
cmp r3, #0x0b
bne .Luf50_1
ldr r3, [buffer]
mov r1, r3
and r1, r6
sub r3, addval
and r3, r7
orr r3, r1
str r3, [buffer]
.Luf50_1:
add buffer, #4
add addval, #1
b .Luf50_0
.Luf50_ret:
pop {r4 - r7, pc}
.unreq buffer
.unreq addval
.unreq bufend
.global get_le32 .global get_le32
.thumb_func .thumb_func
@@ -122,6 +171,8 @@ get_le32: @ optimized for size
mov r0, r2 mov r0, r2
bx lr bx lr
# ifdef STUB_FOR_DLL # ifdef STUB_FOR_DLL
.global reloc_main .global reloc_main
.thumb_func .thumb_func
@@ -130,7 +181,7 @@ get_le32: @ optimized for size
addval .req r2 addval .req r2
reloc_main: reloc_main:
push {r4, r5} push {r4, r5, lr}
ldr buffer, BREL ldr buffer, BREL
ldr addval, DST0 ldr addval, DST0
sub dest, addval, #4 sub dest, addval, #4
@@ -170,12 +221,11 @@ reloc_main:
b .Lreloc_loop b .Lreloc_loop
.Lreloc_end: .Lreloc_end:
pop {r4, r5} pop {r4, r5, pc}
bx lr
# endif # endif
# if 0 # if DEBUG
// debugging stuff - helpers for dumping memory to a file or deleting a file // debugging stuff - helpers for dumping memory to a file or deleting a file
@@ -243,6 +293,8 @@ filename:
.Lstart_orig: .Lstart_orig:
ldr pc, ENTR ldr pc, ENTR
.global LoadLibraryW .global LoadLibraryW
LoadLibraryW: LoadLibraryW:
ldr r3, LLIB ldr r3, LLIB
@@ -253,6 +305,49 @@ GetProcAddressA:
ldr r3, GETP ldr r3, GETP
ldr pc, [r3] ldr pc, [r3]
.global CacheSync
CacheSync:
ldr r3, CSYN
ldr pc, [r3]
.global Unfilter_0x50
buffer .req r0
addval .req r2
bufend .req ip
Unfilter_0x50:
ldr buffer, FIBS
mov addval, #0
ldr bufend, FIBE
.Luf50_0:
cmp buffer, bufend
moveq pc, lr
ldrb r3, [buffer, #3]
and r3, r3, #0x0f
cmp r3, #0x0b
bne .Luf50_1
ldr r3, [buffer]
and r1, r3, #0xff000000
sub r3, r3, addval
and r3, r3, #0x00ffffff
orr r3, r3, r1
str r3, [buffer]
.Luf50_1:
add buffer, buffer, #4
add addval, addval, #1
b .Luf50_0
.unreq buffer
.unreq addval
.unreq bufend
.global get_le32 .global get_le32
get_le32: @ optimized for size get_le32: @ optimized for size
mov r2, #3 mov r2, #3
@@ -262,9 +357,10 @@ get_le32: @ optimized for size
add r1, r3, r1, asl #8 add r1, r3, r1, asl #8
bpl .Lg0 bpl .Lg0
mov r0, r1 mov r0, r1
gret:
mov pc, lr mov pc, lr
# ifdef STUB_FOR_DLL # ifdef STUB_FOR_DLL
.global reloc_main .global reloc_main
buffer .req r0 buffer .req r0
@@ -279,7 +375,7 @@ reloc_main:
.Lreloc_loop: .Lreloc_loop:
ldrb r3, [buffer], #1 ldrb r3, [buffer], #1
cmp r3, #0 cmp r3, #0
beq gret moveq pc, lr
cmp r3, #0xf0 cmp r3, #0xf0
bichs ip, r3, #0xf0 bichs ip, r3, #0xf0
@@ -300,9 +396,13 @@ reloc_main:
add ip, ip, addval add ip, ip, addval
str ip, [dest] str ip, [dest]
b .Lreloc_loop b .Lreloc_loop
.unreq buffer
.unreq addval
.unreq dest
# endif # endif
# if 0 # if DEBUG
// debugging stuff - helpers for dumping memory to a file or deleting a file // debugging stuff - helpers for dumping memory to a file or deleting a file
@@ -348,12 +448,16 @@ filename:
.code 32 .code 32
.align 2 .align 2
SRC0: .ascii "SRC0" SRC0: .ascii "SRC0" @ start of compressed data
SRCL: .ascii "SRCL" SRCL: .ascii "SRCL" @ compressed length
DST0: .ascii "DST0" DST0: .ascii "DST0" @ start of uncompressed data
.ascii "DSTL" .ascii "DSTL" @ uncompressed length
.ascii "BIMPONAM" .ascii "BIMPONAM" @ start of import data & dll names
GETP: .ascii "GETP" GETP: .ascii "GETP" @ pointer to GetProcAddressA
LLIB: .ascii "LOAD" LLIB: .ascii "LOAD" @ pointer to LoadLibraryW
ENTR: .ascii "ENTR" ENTR: .ascii "ENTR" @ original entry point
BREL: .ascii "BREL" BREL: .ascii "BREL" @ start of reloc info
FIBS: .ascii "FIBS" @ buffer start for filter
FIBE: .ascii "FIBE" @ buffer end for filter
CSYN: .ascii "CSYN" @ pointer to CacheSync
+5 -5
View File
@@ -1,6 +1,6 @@
#define UPX_VERSION_HEX 0x019500 /* 01.95.00 */ #define UPX_VERSION_HEX 0x019600 /* 01.96.00 */
#define UPX_VERSION_STRING "1.95 beta" #define UPX_VERSION_STRING "1.96"
#define UPX_VERSION_STRING4 "1.95" #define UPX_VERSION_STRING4 "1.96"
#define UPX_VERSION_DATE "Apr 9th 2006" #define UPX_VERSION_DATE "Apr 13th 2006"
#define UPX_VERSION_DATE_ISO "2006-04-09" #define UPX_VERSION_DATE_ISO "2006-04-13"
#define UPX_VERSION_YEAR "2006" #define UPX_VERSION_YEAR "2006"