diff --git a/src/conf.h b/src/conf.h index dffe4e4f..e28a5ee4 100644 --- a/src/conf.h +++ b/src/conf.h @@ -403,6 +403,8 @@ private: #define UPX_F_VMLINUX_PPC64LE 40 #define UPX_F_DYLIB_PPC64LE 41 +#define UPX_F_LINUX_ELF64_ARM 42 + #define UPX_F_ATARI_TOS 129 #define UPX_F_SOLARIS_SPARC 130 // NOT IMPLEMENTED #define UPX_F_MACH_PPC32 131 diff --git a/src/linker.cpp b/src/linker.cpp index 4831746a..594d2110 100644 --- a/src/linker.cpp +++ b/src/linker.cpp @@ -591,6 +591,27 @@ void ElfLinkerAMD64::relocate1(const Relocation *rel, upx_byte *location, upx_ui super::relocate1(rel, location, value, type); } +void ElfLinkerARM64::relocate1(const Relocation *rel, upx_byte *location, upx_uint64_t value, + const char *type) { + if (strncmp(type, "R_AARCH64_", 10)) + return super::relocate1(rel, location, value, type); + type += 10; + + if (!strncmp(type, "PREL", 4)) { + value -= rel->section->offset + rel->offset; + type += 4; + } + + if (!strcmp(type, "16")) + set_le16(location, get_le16(location) + value); + else if (!strncmp(type, "32", 2)) // for "32" and "32S" + set_le32(location, get_le32(location) + value); + else if (!strcmp(type, "64")) + set_le64(location, get_le64(location) + value); + else + super::relocate1(rel, location, value, type); +} + void ElfLinkerArmBE::relocate1(const Relocation *rel, upx_byte *location, upx_uint64_t value, const char *type) { if (strcmp(type, "R_ARM_PC24") == 0) { diff --git a/src/linker.h b/src/linker.h index 14ba0966..20e1b3fa 100644 --- a/src/linker.h +++ b/src/linker.h @@ -160,6 +160,15 @@ protected: const char *type); }; +class ElfLinkerARM64 : public ElfLinker { + typedef ElfLinker super; + +protected: + virtual void alignCode(unsigned len) { alignWithByte(len, 0x90); } + virtual void relocate1(const Relocation *, upx_byte *location, upx_uint64_t value, + const char *type); +}; + class ElfLinkerArmBE : public ElfLinker { typedef ElfLinker super; diff --git a/src/p_elf_enum.h b/src/p_elf_enum.h index 136fec0f..ad4c3aad 100644 --- a/src/p_elf_enum.h +++ b/src/p_elf_enum.h @@ -73,7 +73,8 @@ EM_PPC = 20, EM_PPC64 = 21, EM_ARM = 40, - EM_X86_64 = 62 + EM_X86_64 = 62, + EM_AARCH64 = 183 }; enum { // e_version diff --git a/src/p_lx_elf.cpp b/src/p_lx_elf.cpp index 55a1ebe3..1b517f8c 100644 --- a/src/p_lx_elf.cpp +++ b/src/p_lx_elf.cpp @@ -650,6 +650,11 @@ Linker* PackLinuxElf64amd::newLinker() const return new ElfLinkerAMD64; } +Linker* PackLinuxElf64arm::newLinker() const +{ + return new ElfLinkerARM64; +} + int const * PackLinuxElf::getCompressionMethods(int method, int level) const { @@ -696,6 +701,15 @@ PackLinuxElf64amd::getFilters() const return filters; } +int const * +PackLinuxElf64arm::getFilters() const +{ + static const int filters[] = { + 0x4A, + FT_END }; + return filters; +} + void PackLinuxElf32::patchLoader() { } @@ -788,10 +802,23 @@ PackLinuxElf64amd::PackLinuxElf64amd(InputFile *f) ei_osabi = Elf32_Ehdr::ELFOSABI_LINUX; } +PackLinuxElf64arm::PackLinuxElf64arm(InputFile *f) + : super(f) +{ + e_machine = Elf64_Ehdr::EM_AARCH64; + ei_class = Elf64_Ehdr::ELFCLASS64; + ei_data = Elf64_Ehdr::ELFDATA2LSB; + ei_osabi = Elf32_Ehdr::ELFOSABI_LINUX; +} + PackLinuxElf64amd::~PackLinuxElf64amd() { } +PackLinuxElf64arm::~PackLinuxElf64arm() +{ +} + static unsigned umax(unsigned a, unsigned b) { @@ -1091,6 +1118,85 @@ PackLinuxElf64amd::defineSymbols(Filter const *) //linker->dumpSymbols(); // debug } +void +PackLinuxElf64arm::defineSymbols(Filter const *) +{ + unsigned const hlen = sz_elf_hdrs + sizeof(l_info) + sizeof(p_info); + + // We want to know if compressed data, plus stub, plus a couple pages, + // will fit below the uncompressed program in memory. But we don't + // know the final total compressed size yet, so use the uncompressed + // size (total over all PT_LOAD64) as an upper bound. + unsigned len = 0; + upx_uint64_t lo_va_user = ~0ull; // infinity + for (int j= e_phnum; --j>=0; ) { + if (PT_LOAD64 == get_te32(&phdri[j].p_type)) { + len += (unsigned)get_te64(&phdri[j].p_filesz); + upx_uint64_t const va = get_te64(&phdri[j].p_vaddr); + if (va < lo_va_user) { + lo_va_user = va; + } + } + } + lsize = /*getLoaderSize()*/ 64 * 1024; // XXX: upper bound; avoid circularity + upx_uint64_t lo_va_stub = get_te64(&elfout.phdr[0].p_vaddr); + upx_uint64_t adrc; + upx_uint64_t adrm; + upx_uint64_t adru; + upx_uint64_t adrx; + unsigned cntc; + unsigned lenm; + unsigned lenu; + len += (7&-lsize) + lsize; + is_big = (lo_va_user < (lo_va_stub + len + 2*page_size)); + if (is_big && ehdri.ET_EXEC==get_te16(&ehdri.e_type)) { + set_te64( &elfout.ehdr.e_entry, + get_te64(&elfout.ehdr.e_entry) + lo_va_user - lo_va_stub); + set_te64(&elfout.phdr[0].p_vaddr, lo_va_user); + set_te64(&elfout.phdr[0].p_paddr, lo_va_user); + lo_va_stub = lo_va_user; + adrc = lo_va_stub; + adrm = getbrk(phdri, e_phnum); + adru = page_mask & (~page_mask + adrm); // round up to page boundary + adrx = adru + hlen; + lenm = page_size + len; + lenu = page_size + len; + cntc = len >> 3; // over-estimate; corrected at runtime + } + else { + adrm = lo_va_stub + len; + adrc = adrm; + adru = lo_va_stub; + adrx = lo_va_stub + hlen; + lenm = page_size; + lenu = page_size + len; + cntc = 0; + } + adrm = page_mask & (~page_mask + adrm); // round up to page boundary + adrc = page_mask & (~page_mask + adrc); // round up to page boundary + + //linker->defineSymbol("ADRX", adrx); // compressed input for eXpansion + ACC_UNUSED(adrx); + + // For actual moving, we need the true count, which depends on sz_pack2 + // and is not yet known. So the runtime stub detects "no move" + // if adrm==adrc, and otherwise uses actual sz_pack2 to compute cntc. + //linker->defineSymbol("CNTC", cntc); // count for copy + ACC_UNUSED(cntc); + + linker->defineSymbol("LENU", lenu); // len for unmap + linker->defineSymbol("ADRC", adrc); // addr for copy + //linker->defineSymbol("ADRU", adru); // addr for unmap + ACC_UNUSED(adru); +#define EI_NIDENT 16 /* */ + linker->defineSymbol("JMPU", EI_NIDENT -4 + lo_va_user); // unmap trampoline +#undef EI_NIDENT + linker->defineSymbol("LENM", lenm); // len for map + linker->defineSymbol("ADRM", adrm); // addr for map + + //linker->dumpSymbols(); // debug +} + static const #include "stub/i386-linux.elf-entry.h" static const @@ -1339,6 +1445,28 @@ PackLinuxElf64amd::buildLoader(const Filter *ft) stub_amd64_linux_elf_fold, sizeof(stub_amd64_linux_elf_fold), ft); } +static const +#include "stub/arm64-linux.elf-entry.h" +static const +#include "stub/arm64-linux.elf-fold.h" +//static const +//#include "stub/arm64-linux.shlib-init.h" + +void +PackLinuxElf64arm::buildLoader(const Filter *ft) +{ + if (0!=xct_off) { // shared library + abort(); // FIXME + //buildLinuxLoader( + // stub_arm64_linux_shlib_init, sizeof(stub_arm64_linux_shlib_init), + // NULL, 0, ft ); + //return; + } + buildLinuxLoader( + stub_arm64_linux_elf_entry, sizeof(stub_arm64_linux_elf_entry), + stub_arm64_linux_elf_fold, sizeof(stub_arm64_linux_elf_fold), ft); +} + Elf32_Shdr const *PackLinuxElf32::elf_find_section_name( char const *const name ) const @@ -1993,6 +2121,198 @@ proceed: ; return true; } +bool +PackLinuxElf64arm::canPack() +{ + union { + unsigned char buf[sizeof(Elf64_Ehdr) + 14*sizeof(Elf64_Phdr)]; + //struct { Elf64_Ehdr ehdr; Elf64_Phdr phdr; } e; + } u; + COMPILE_TIME_ASSERT(sizeof(u) <= 1024) + + fi->readx(u.buf, sizeof(u.buf)); + fi->seek(0, SEEK_SET); + Elf64_Ehdr const *const ehdr = (Elf64_Ehdr *) u.buf; + + // now check the ELF header + if (checkEhdr(ehdr) != 0) + return false; + + // additional requirements for linux/elf386 + if (get_te16(&ehdr->e_ehsize) != sizeof(*ehdr)) { + throwCantPack("invalid Ehdr e_ehsize; try '--force-execve'"); + return false; + } + if (e_phoff != sizeof(*ehdr)) {// Phdrs not contiguous with Ehdr + throwCantPack("non-contiguous Ehdr/Phdr; try '--force-execve'"); + return false; + } + + // The first PT_LOAD64 must cover the beginning of the file (0==p_offset). + Elf64_Phdr const *phdr = phdri; + for (unsigned j=0; j < e_phnum; ++phdr, ++j) { + if (j >= 14) + return false; + if (phdr->PT_LOAD64 == get_te32(&phdr->p_type)) { + load_va = get_te64(&phdr->p_vaddr); + upx_uint64_t file_offset = get_te64(&phdr->p_offset); + if (~page_mask & file_offset) { + if ((~page_mask & load_va) == file_offset) { + throwCantPack("Go-language PT_LOAD: try hemfix.c, or try '--force-execve'"); + // Fixing it inside upx fails because packExtent() reads original file. + } + else { + throwCantPack("invalid Phdr p_offset; try '--force-execve'"); + } + return false; + } + exetype = 1; + break; + } + } + // We want to compress position-independent executable (gcc -pie) + // main programs, but compressing a shared library must be avoided + // because the result is no longer usable. In theory, there is no way + // to tell them apart: both are just ET_DYN. Also in theory, + // neither the presence nor the absence of any particular symbol name + // can be used to tell them apart; there are counterexamples. + // However, we will use the following heuristic suggested by + // Peter S. Mazinger September 2005: + // If a ET_DYN has __libc_start_main as a global undefined symbol, + // then the file is a position-independent executable main program + // (that depends on libc.so.6) and is eligible to be compressed. + // Otherwise (no __libc_start_main as global undefined): skip it. + // Also allow __uClibc_main and __uClibc_start_main . + + if (Elf32_Ehdr::ET_DYN==get_te16(&ehdr->e_type)) { + // The DT_STRTAB has no designated length. Read the whole file. + alloc_file_image(file_image, file_size); + fi->seek(0, SEEK_SET); + fi->readx(file_image, file_size); + memcpy(&ehdri, ehdr, sizeof(Elf64_Ehdr)); + phdri= (Elf64_Phdr *)((size_t)e_phoff + file_image); // do not free() !! + shdri= (Elf64_Shdr const *)((size_t)e_shoff + file_image); // do not free() !! + + //sec_strndx = &shdri[ehdr->e_shstrndx]; + //shstrtab = (char const *)(sec_strndx->sh_offset + file_image); + sec_dynsym = elf_find_section_type(Elf64_Shdr::SHT_DYNSYM); + if (sec_dynsym) + sec_dynstr = get_te64(&sec_dynsym->sh_link) + shdri; + + int j= e_phnum; + phdr= phdri; + for (; --j>=0; ++phdr) + if (Elf64_Phdr::PT_DYNAMIC==get_te32(&phdr->p_type)) { + dynseg= (Elf64_Dyn const *)(get_te64(&phdr->p_offset) + file_image); + break; + } + // elf_find_dynamic() returns 0 if 0==dynseg. + dynstr= (char const *)elf_find_dynamic(Elf64_Dyn::DT_STRTAB); + dynsym= (Elf64_Sym const *)elf_find_dynamic(Elf64_Dyn::DT_SYMTAB); + + // Modified 2009-10-10 to detect a ProgramLinkageTable relocation + // which references the symbol, because DT_GNU_HASH contains only + // defined symbols, and there might be no DT_HASH. + + Elf64_Rela const * + rela= (Elf64_Rela const *)elf_find_dynamic(Elf64_Dyn::DT_RELA); + Elf64_Rela const * + jmprela= (Elf64_Rela const *)elf_find_dynamic(Elf64_Dyn::DT_JMPREL); + for ( int sz = elf_unsigned_dynamic(Elf64_Dyn::DT_PLTRELSZ); + 0 < sz; + (sz -= sizeof(Elf64_Rela)), ++jmprela + ) { + unsigned const symnum = get_te64(&jmprela->r_info) >> 32; + char const *const symnam = get_te32(&dynsym[symnum].st_name) + dynstr; + if (0==strcmp(symnam, "__libc_start_main") + || 0==strcmp(symnam, "__uClibc_main") + || 0==strcmp(symnam, "__uClibc_start_main")) + goto proceed; + } + + // 2016-10-09 DT_JMPREL is no more (binutils-2.26.1)? + // Check the general case, too. + for ( int sz = elf_unsigned_dynamic(Elf64_Dyn::DT_RELASZ); + 0 < sz; + (sz -= sizeof(Elf64_Rela)), ++rela + ) { + unsigned const symnum = get_te64(&rela->r_info) >> 32; + char const *const symnam = get_te32(&dynsym[symnum].st_name) + dynstr; + if (0==strcmp(symnam, "__libc_start_main") + || 0==strcmp(symnam, "__uClibc_main") + || 0==strcmp(symnam, "__uClibc_start_main")) + goto proceed; + } + + // Heuristic HACK for shared libraries (compare Darwin (MacOS) Dylib.) + // If there is an existing DT_INIT, and if everything that the dynamic + // linker ld-linux needs to perform relocations before calling DT_INIT + // resides below the first SHT_EXECINSTR Section in one PT_LOAD, then + // compress from the first executable Section to the end of that PT_LOAD. + // We must not alter anything that ld-linux might touch before it calls + // the DT_INIT function. + // + // Obviously this hack requires that the linker script put pieces + // into good positions when building the original shared library, + // and also requires ld-linux to behave. + + if (elf_find_dynamic(Elf64_Dyn::DT_INIT)) { + if (elf_has_dynamic(Elf64_Dyn::DT_TEXTREL)) { + throwCantPack("DT_TEXTREL found; re-compile with -fPIC"); + goto abandon; + } + Elf64_Shdr const *shdr = shdri; + xct_va = ~0ull; + for (j= e_shnum; --j>=0; ++shdr) { + if (Elf64_Shdr::SHF_EXECINSTR & get_te32(&shdr->sh_flags)) { + xct_va = umin64(xct_va, get_te64(&shdr->sh_addr)); + } + } + // Rely on 0==elf_unsigned_dynamic(tag) if no such tag. + upx_uint64_t const va_gash = elf_unsigned_dynamic(Elf64_Dyn::DT_GNU_HASH); + upx_uint64_t const va_hash = elf_unsigned_dynamic(Elf64_Dyn::DT_HASH); + if (xct_va < va_gash || (0==va_gash && xct_va < va_hash) + || xct_va < elf_unsigned_dynamic(Elf64_Dyn::DT_STRTAB) + || xct_va < elf_unsigned_dynamic(Elf64_Dyn::DT_SYMTAB) + || xct_va < elf_unsigned_dynamic(Elf64_Dyn::DT_REL) + || xct_va < elf_unsigned_dynamic(Elf64_Dyn::DT_RELA) + || xct_va < elf_unsigned_dynamic(Elf64_Dyn::DT_JMPREL) + || xct_va < elf_unsigned_dynamic(Elf64_Dyn::DT_VERDEF) + || xct_va < elf_unsigned_dynamic(Elf64_Dyn::DT_VERSYM) + || xct_va < elf_unsigned_dynamic(Elf64_Dyn::DT_VERNEEDED) ) { + throwCantPack("DT_ tag above stub"); + goto abandon; + } + for ((shdr= shdri), (j= e_shnum); --j>=0; ++shdr) { + upx_uint64_t const sh_addr = get_te64(&shdr->sh_addr); + if ( sh_addr==va_gash + || (sh_addr==va_hash && 0==va_gash) ) { + shdr= &shdri[get_te32(&shdr->sh_link)]; // the associated SHT_SYMTAB + hatch_off = (char *)&ehdri.e_ident[11] - (char *)&ehdri; + break; + } + } + ACC_UNUSED(shdr); + xct_off = elf_get_offset_from_address(xct_va); + goto proceed; // But proper packing depends on checking xct_va. + } +abandon: + return false; +proceed: ; + } + // XXX Theoretically the following test should be first, + // but PackUnix::canPack() wants 0!=exetype ? + if (!super::canPack()) + return false; + assert(exetype == 1); + + exetype = 0; + + // set options + opt->o_unix.blocksize = blocksize = file_size; + return true; +} + off_t PackLinuxElf32::getbrk(const Elf32_Phdr *phdr, int nph) const { @@ -2663,6 +2983,14 @@ void PackLinuxElf64amd::pack1(OutputFile *fo, Filter &ft) generateElfHdr(fo, stub_amd64_linux_elf_fold, getbrk(phdri, e_phnum) ); } +void PackLinuxElf64arm::pack1(OutputFile *fo, Filter &ft) +{ + super::pack1(fo, ft); + if (0!=xct_off) // shared library + return; + generateElfHdr(fo, stub_arm64_linux_elf_fold, getbrk(phdri, e_phnum) ); +} + // Determine length of gap between PT_LOAD phdr[k] and closest PT_LOAD // which follows in the file (or end-of-file). Optimize for common case // where the PT_LOAD are adjacent ascending by .p_offset. Assume no overlap. diff --git a/src/p_lx_elf.h b/src/p_lx_elf.h index 579162c6..e86ee2a3 100644 --- a/src/p_lx_elf.h +++ b/src/p_lx_elf.h @@ -387,6 +387,25 @@ protected: virtual void defineSymbols(Filter const *); }; +class PackLinuxElf64arm : public PackLinuxElf64Le +{ + typedef PackLinuxElf64Le super; +public: + PackLinuxElf64arm(InputFile *f); + virtual ~PackLinuxElf64arm(); + virtual int getFormat() const { return UPX_F_LINUX_ELF64_ARM; } + virtual const char *getName() const { return "linux/arm64"; } + virtual const char *getFullName(const options_t *) const { return "arm64-linux.elf"; } + virtual const int *getFilters() const; + virtual bool canPack(); +protected: + virtual void pack1(OutputFile *, Filter &); // generate executable header + //virtual void pack3(OutputFile *, Filter &); // append loader + virtual void buildLoader(const Filter *); + virtual Linker* newLinker() const; + virtual void defineSymbols(Filter const *); +}; + /************************************************************************* // linux/elf32ppc diff --git a/src/packmast.cpp b/src/packmast.cpp index 74d37a68..6906f242 100644 --- a/src/packmast.cpp +++ b/src/packmast.cpp @@ -250,6 +250,9 @@ Packer* PackMaster::visitAllPackers(visit_func_t func, InputFile *f, const optio if ((p = func(new PackLinuxElf32armBe(f), user)) != NULL) return p; delete p; p = NULL; + if ((p = func(new PackLinuxElf64arm(f), user)) != NULL) + return p; + delete p; p = NULL; if ((p = func(new PackLinuxElf32ppc(f), user)) != NULL) return p; delete p; p = NULL; diff --git a/src/stub/Makefile b/src/stub/Makefile index d636e4e6..4ca61953 100644 --- a/src/stub/Makefile +++ b/src/stub/Makefile @@ -71,7 +71,6 @@ STUBS += arm.v5a-linux.kernel.vmlinux.h STUBS += arm.v5a-linux.kernel.vmlinuz-head.h STUBS += arm.v5a-linux.kernel.vmlinuz.h STUBS += arm.v5a-linux.shlib-init.h -STUBS += arm.v5a-linux.shlib-init.h STUBS += arm.v5t-linux.shlib-init.h STUBS += armeb.v4a-linux.elf-entry.h STUBS += armeb.v4a-linux.elf-fold.h @@ -79,6 +78,7 @@ STUBS += armeb.v5a-linux.kernel.vmlinux-head.h STUBS += armeb.v5a-linux.kernel.vmlinux.h STUBS += arm64-linux.elf-entry.h STUBS += arm64-linux.elf-fold.h +STUBS += arm64-linux.shlib-init.h STUBS += arm64-darwin.macho-entry.h STUBS += arm64-darwin.macho-fold.h STUBS += i086-dos16.com.h @@ -574,6 +574,20 @@ tmp/arm64-linux.elf-main.o : $(srcdir)/src/$$T.c $(srcdir)/src/arm64-linux.elf-m $(call tc,gcc) -c -Os $< -o $@ $(call tc,f-objstrip,$@) +# /*********************************************************************** +# // arm64-linux.shlib arm64 +# ************************************************************************/ + +arm64-linux.shlib%.h : tc_list = arm64-linux.elf default +arm64-linux.shlib%.h : tc_bfdname = elf64-littleaarch64 +tc.arm64-linux.shlib-init.objcopy = /usr/bin/aarch64-linux-gnu-objcopy -F elf64-littleaarch64 +tc.arm64-linux.shlib-init.objdump = /usr/bin/aarch64-linux-gnu-objdump + +arm64-linux.shlib%.h : $(srcdir)/src/$$T.S + $(call tc,gcc) -c -x assembler-with-cpp $< -o tmp/$T.bin + $(call tc,f-embed_objinfo,tmp/$T.bin) + $(call tc,bin2h-c) tmp/$T.bin $@ + # /*********************************************************************** # // arm.v5a-linux.shlib (arm.v5a) diff --git a/src/stub/arm64-linux.shlib-init.h b/src/stub/arm64-linux.shlib-init.h new file mode 100644 index 00000000..331080aa --- /dev/null +++ b/src/stub/arm64-linux.shlib-init.h @@ -0,0 +1,508 @@ +/* arm64-linux.shlib-init.h + created from arm64-linux.shlib-init.bin, 7492 (0x1d44) bytes + + This file is part of the UPX executable compressor. + + Copyright (C) 1996-2017 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 1996-2017 Laszlo Molnar + Copyright (C) 2000-2017 John F. Reiser + All Rights Reserved. + + UPX and the UCL library are free software; you can redistribute them + and/or modify them under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; see the file COPYING. + If not, write to the Free Software Foundation, Inc., + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + Markus F.X.J. Oberhumer Laszlo Molnar + + + John F. Reiser + + */ + + +#define STUB_ARM64_LINUX_SHLIB_INIT_SIZE 7492 +#define STUB_ARM64_LINUX_SHLIB_INIT_ADLER32 0x8af6b0e7 +#define STUB_ARM64_LINUX_SHLIB_INIT_CRC32 0xf085e16d + +unsigned char stub_arm64_linux_shlib_init[7492] = { +/* 0x0000 */ 127, 69, 76, 70, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0010 */ 1, 0,183, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0020 */ 0, 0, 0, 0, 0, 0, 0, 0,160, 21, 0, 0, 0, 0, 0, 0, +/* 0x0030 */ 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 64, 0, 18, 0, 15, 0, +/* 0x0040 */ 0, 0, 32,212,253,251,190,169,224, 11, 0,249,227, 19,190,169, +/* 0x0050 */ 230, 31, 1,169,224,135,190,169,226, 11, 0,249,253, 3, 0,145, +/* 0x0060 */ 0, 0, 0,148,226,143,190,169,254, 11, 0,249, 7, 64, 33,139, +/* 0x0070 */ 5, 0,128, 18, 4, 0,176, 82, 25, 0, 0, 20,227, 19,193,168, +/* 0x0080 */ 0, 0, 7,203, 66, 0, 3,203,130, 0, 0,185,228, 3, 0,170, +/* 0x0090 */ 224, 3, 3,170, 97, 0, 2,139, 2, 0,128,210, 8, 0,176, 82, +/* 0x00a0 */ 1, 0, 0,212,192, 3, 95,214,224, 3, 4,170,254,135, 64,248, +/* 0x00b0 */ 192, 3, 95,214,132, 0, 4, 43, 68, 0, 0, 52,192, 3, 95,214, +/* 0x00c0 */ 4, 20, 64, 56,132, 0, 4, 58,132, 32, 9, 83,132, 0, 4, 43, +/* 0x00d0 */ 192, 3, 95,214, 3, 20, 64, 56, 67, 20, 0, 56,246,255,255,151, +/* 0x00e0 */ 162,255,255, 84, 33, 0,128, 82, 4, 0, 0, 20, 33, 4, 0, 81, +/* 0x00f0 */ 241,255,255,151, 33, 0, 1, 26,239,255,255,151, 33, 0, 1, 26, +/* 0x0100 */ 237,255,255,151, 67,255,255, 84, 35, 12, 0,113, 1, 0,128, 82, +/* 0x0110 */ 35, 1, 0, 84, 5, 20, 64, 56,165, 32, 3, 42,229, 3, 37, 42, +/* 0x0120 */ 229,250,255, 52,191, 0, 0,114,165,124, 1, 19,161, 1, 0, 84, +/* 0x0130 */ 3, 0, 0, 20,224,255,255,151, 66, 1, 0, 84, 33, 0,128, 82, +/* 0x0140 */ 221,255,255,151,226, 0, 0, 84,219,255,255,151, 33, 0, 1, 26, +/* 0x0150 */ 217,255,255,151,163,255,255, 84, 33, 16, 0, 17, 4, 0, 0, 20, +/* 0x0160 */ 213,255,255,151, 33, 0, 1, 26, 33, 8, 0, 17,191, 0, 20, 49, +/* 0x0170 */ 33, 52,129, 26, 67,192, 33,139, 99,240, 95, 56, 67,200,101, 56, +/* 0x0180 */ 67, 20, 0, 56, 33, 4, 0,113,161,255,255, 84,212,255,255, 23, +/* 0x0190 */ 226,143,190,169,254, 11, 0,249, 7, 64, 33,139, 5, 0,128, 18, +/* 0x01a0 */ 4, 0,176, 82, 25, 0, 0, 20,227, 19,193,168, 0, 0, 7,203, +/* 0x01b0 */ 66, 0, 3,203,130, 0, 0,185,228, 3, 0,170,224, 3, 3,170, +/* 0x01c0 */ 97, 0, 2,139, 2, 0,128, 82, 8, 0,176, 82, 1, 0, 0,212, +/* 0x01d0 */ 192, 3, 95,214,224, 3, 4,170,254,135, 64,248,192, 3, 95,214, +/* 0x01e0 */ 132, 0, 4, 43, 68, 0, 0, 52,192, 3, 95,214, 4, 20, 64, 56, +/* 0x01f0 */ 132, 0, 4, 58,132, 32, 9, 83,132, 0, 4, 43,192, 3, 95,214, +/* 0x0200 */ 3, 20, 64, 56, 67, 20, 0, 56,246,255,255,151,162,255,255, 84, +/* 0x0210 */ 33, 0,128, 82, 4, 0, 0, 20, 33, 4, 0, 81,241,255,255,151, +/* 0x0220 */ 33, 0, 1, 58,239,255,255,151, 33, 0, 1, 58,237,255,255,151, +/* 0x0230 */ 67,255,255, 84, 35, 12, 0,113, 1, 0,128, 82, 35, 1, 0, 84, +/* 0x0240 */ 5, 20, 64, 56,165, 32, 3, 42,229, 3, 37, 42,229,250,255, 52, +/* 0x0250 */ 163, 0, 1, 83,165,124, 1, 83, 99, 0, 3, 43, 2, 0, 0, 20, +/* 0x0260 */ 224,255,255,151, 33, 0, 1, 58,222,255,255,151, 33, 0, 1, 58, +/* 0x0270 */ 225, 0, 0, 84, 33, 0,128, 82,218,255,255,151, 33, 0, 1, 58, +/* 0x0280 */ 216,255,255,151,163,255,255, 84, 33, 8, 0, 17, 33, 4, 0, 17, +/* 0x0290 */ 191, 0, 20, 49, 33, 52,129, 26, 67, 0, 64, 57, 67,200,101, 56, +/* 0x02a0 */ 67, 20, 0, 56, 33, 4, 0,113,161,255,255, 84,215,255,255, 23, +/* 0x02b0 */ 1, 64, 33,139,225, 11,190,169,227,123, 1,169, 5, 0,128, 18, +/* 0x02c0 */ 4, 0,176, 82, 33, 0, 0, 20,228, 11, 64,249,225,143,193,168, +/* 0x02d0 */ 0, 0, 1,203, 66, 0, 3,203,130, 0, 0,185,228, 3, 0,170, +/* 0x02e0 */ 224, 3, 3,170, 97, 0, 2,139, 2, 0,128, 82, 8, 0,176, 82, +/* 0x02f0 */ 1, 0, 0,212,192, 3, 95,214,224, 3, 4,170,254,135, 64,248, +/* 0x0300 */ 192, 3, 95,214,132, 0, 4, 43, 68, 0, 0, 52,192, 3, 95,214, +/* 0x0310 */ 4, 20, 64, 56,132, 0, 4, 26,132, 32, 9, 83,132, 0, 4, 43, +/* 0x0320 */ 192, 3, 95,214, 33, 0,128, 82,240, 3, 30,170,246,255,255,151, +/* 0x0330 */ 33, 0, 1, 58,244,255,255,151,163,255,255, 84, 0, 2, 31,214, +/* 0x0340 */ 3, 20, 64, 56, 67, 20, 0, 56,239,255,255,151,162,255,255, 84, +/* 0x0350 */ 245,255,255,151, 35, 12, 0,113, 1, 0,128, 82,163, 0, 0, 84, +/* 0x0360 */ 5, 20, 64, 56,165, 32, 3, 42,229, 3, 37, 42,229,250,255, 52, +/* 0x0370 */ 229,255,255,151, 33, 0, 1, 58,227,255,255,151, 33, 0, 1, 58, +/* 0x0380 */ 97, 0, 0, 84,232,255,255,151, 33, 8, 0, 17,191, 0, 52, 49, +/* 0x0390 */ 33, 36,129, 26, 67,200,101, 56, 33, 4, 0,113, 67, 20, 0, 56, +/* 0x03a0 */ 162,255,255, 84,233,255,255, 23,159, 56, 0,113, 1, 0, 0, 84, +/* 0x03b0 */ 226, 15,190,169,253,123, 1,169, 7, 0, 64, 57, 8,192,128, 82, +/* 0x03c0 */ 231,124, 3, 83, 8, 33,199, 26,231, 3, 0,145, 8, 1, 58, 17, +/* 0x03d0 */ 255, 67, 40,203,104, 0, 64,185,230, 3, 3,170,229, 3, 8, 42, +/* 0x03e0 */ 228, 3, 2,170,227, 51, 0,145, 8, 0,128,210,104,132, 0,248, +/* 0x03f0 */ 127, 0, 7,235,195,255,255, 84,227, 51, 0,145, 34, 8, 0, 81, +/* 0x0400 */ 225, 3, 0,170, 40, 20, 64, 56, 8, 9, 0, 18,232, 75, 0, 57, +/* 0x0410 */ 40, 20, 64, 56, 0,125, 4, 83,224, 71, 0, 57, 8, 13, 0, 18, +/* 0x0420 */ 232, 67, 0, 57,224, 67, 0,145, 13, 0, 0,148,255, 0, 0,145, +/* 0x0430 */ 227, 3, 0, 42,224, 7,193,168, 33, 0, 64,249, 33, 0, 0,139, +/* 0x0440 */ 2, 0,128, 82, 8, 0,176, 82, 1, 0, 0,212,192, 3, 95,214, +/* 0x0450 */ 224, 3, 3,170,253,123,193,168,192, 3, 95,214,253,123,185,169, +/* 0x0460 */ 8,128,128, 82,253, 3, 0,145,243, 83, 1,169,245, 91, 2,169, +/* 0x0470 */ 247, 99, 3,169,249,107, 4,169, 19, 60, 64, 41, 14, 8, 64,185, +/* 0x0480 */ 11, 8, 64,249,127, 0, 0,185,223, 0, 0,185, 7, 4, 64,185, +/* 0x0490 */ 0, 96,128, 82,103, 2, 7, 11, 7, 32,199, 26, 32, 0,128, 82, +/* 0x04a0 */ 231,216, 28, 49, 14, 32,206, 26, 0, 32,207, 26,206, 5, 0, 81, +/* 0x04b0 */ 15, 4, 0, 81, 0, 0,128,210,160, 0, 0, 84,104,121, 32,120, +/* 0x04c0 */ 0, 4, 0,145,255, 0, 0,107,168,255,255, 84, 34, 64, 34,139, +/* 0x04d0 */ 27, 0,128, 82,162, 51, 0,249, 28, 0,128, 18, 32, 4, 0,145, +/* 0x04e0 */ 42, 24, 0,145, 66, 4, 0,145, 31, 0, 2,235,232, 3, 0,170, +/* 0x04f0 */ 32, 32, 0, 84,160, 55, 0,249, 0, 4, 0,145, 31, 0, 10,235, +/* 0x0500 */ 7,224, 95, 56,251, 32, 27, 42, 1,255,255, 84,161, 27, 5,169, +/* 0x0510 */ 233, 3, 4,170,249, 3, 3,170,165, 37, 0, 52, 55, 0,128, 82, +/* 0x0520 */ 26, 1,128, 82,246, 3, 23, 42,245, 3, 23, 42,231, 3, 23, 42, +/* 0x0530 */ 10, 0,128, 82, 13, 0,128, 82, 6, 0,128, 82, 84, 3, 19, 75, +/* 0x0540 */ 204, 1, 6, 10, 72,109, 28, 83,178,131, 1,145, 0, 0,128, 82, +/* 0x0550 */ 129,125, 64,147, 40,192, 40,139, 8,249,127,211, 97, 1, 8,139, +/* 0x0560 */ 29, 1, 0,148, 0, 10, 0, 53,224, 1, 6, 10,168, 41,212, 26, +/* 0x0570 */ 0, 32,211, 26, 95, 25, 0,113, 8, 0, 8, 11, 0,117, 30, 83, +/* 0x0580 */ 8, 0, 8, 75, 8, 93,120,211, 8,217, 28,145,104, 5, 8,139, +/* 0x0590 */ 141, 7, 0, 84,192, 0, 7, 75, 34, 0,128, 82, 44,105, 96, 56, +/* 0x05a0 */ 4, 0, 0, 20,237, 1, 0, 53, 95,252, 3,113,236, 6, 0, 84, +/* 0x05b0 */ 140,121, 31, 83,224, 3, 2, 42,141, 1, 24, 18,178,131, 1,145, +/* 0x05c0 */ 161,125, 64,147, 33, 0, 4,145, 33,192, 34,139, 1, 5, 1,139, +/* 0x05d0 */ 1, 1, 0,148,226, 3, 0, 42, 98,254, 7, 54,109,254,255, 53, +/* 0x05e0 */ 95,252, 3,113, 44, 5, 0, 84, 1,197, 34,139,224, 3, 2, 42, +/* 0x05f0 */ 178,131, 1,145,248, 0, 0,148, 31,252, 3,113,226, 3, 0, 42, +/* 0x0600 */ 77,255,255, 84, 13, 28, 0, 83, 95, 13, 0,113, 45, 73, 38, 56, +/* 0x0610 */ 198, 4, 0, 17, 12, 4, 0, 84, 10, 0,128, 82,191, 0, 6,107, +/* 0x0620 */ 8,249,255, 84, 1,224,191, 18,159, 3, 1,107,200, 28, 0, 84, +/* 0x0630 */ 162, 7, 70,169, 63, 0, 2,235,224, 21, 0, 84, 40, 4, 0,145, +/* 0x0640 */ 168, 55, 0,249,156, 95, 24, 83, 32, 0, 64, 57, 27, 32, 27, 42, +/* 0x0650 */ 160, 43, 64,249,243, 83, 65,169, 8, 1, 0,203,160, 47, 64,249, +/* 0x0660 */ 40, 3, 0,185,245, 91, 66,169, 6, 0, 0,185, 0, 0,128, 82, +/* 0x0670 */ 247, 99, 67,169,249,107, 68,169,253,123,199,168,192, 3, 95,214, +/* 0x0680 */ 34, 0,128, 82,217,255,255, 23, 77, 28, 0, 83, 45, 73, 38, 56, +/* 0x0690 */ 198, 4, 0, 17, 95, 37, 0,113, 76, 12, 0, 84, 74, 13, 0, 81, +/* 0x06a0 */ 223,255,255, 23, 77,125, 64,147,178,131, 1,145,173, 1, 3,145, +/* 0x06b0 */ 0, 0,128, 82,173,249,127,211, 97, 1, 13,139,198, 0, 0,148, +/* 0x06c0 */ 64, 11, 0, 53, 96, 0,128, 82, 95, 25, 0,113,247, 3, 22, 42, +/* 0x06d0 */ 10,192,159, 26,246, 3, 21, 42,120,145, 25,145,245, 3, 7, 42, +/* 0x06e0 */ 178,131, 1,145,225, 3, 24,170, 0, 0,128, 82,186, 0, 0,148, +/* 0x06f0 */ 96, 12, 0, 53,140,113, 29, 83,232, 0,128, 18,109, 0,128, 82, +/* 0x0700 */ 140,125, 64,147,140, 9, 0,145, 12, 7, 12,139, 32, 0,128, 82, +/* 0x0710 */ 178,131, 1,145,129, 69, 32,139,175, 0, 0,148,173, 5, 0,113, +/* 0x0720 */ 129,255,255, 84, 95, 13, 0,113, 8, 0, 8, 11,236, 5, 0, 84, +/* 0x0730 */ 103, 0,128, 82,204, 0,128, 82, 31, 1, 7,107, 32, 0,128, 82, +/* 0x0740 */ 7,209,135, 26,231,100, 26, 83,231,124, 64,147,231,192, 6,145, +/* 0x0750 */ 231,248,127,211,225, 68, 32,139,178,131, 1,145, 97, 1, 1,139, +/* 0x0760 */ 157, 0, 0,148,140, 5, 0,113, 97,255,255, 84, 7, 0, 1, 81, +/* 0x0770 */ 74, 29, 0, 17,255, 12, 0,113,236, 3, 7, 42, 45, 3, 0, 84, +/* 0x0780 */ 255, 52, 0,113,224, 0, 0, 18,225,124, 1, 19, 7, 0, 31, 50, +/* 0x0790 */ 12, 12, 0, 84, 45, 4, 0, 81, 0, 86,128,210,231, 32,205, 26, +/* 0x07a0 */ 12,192, 44,203,140, 65, 39,139,108, 5, 12,139,140, 9, 0,209, +/* 0x07b0 */ 32, 0,128, 82,248, 3, 0, 42,129,197, 32,139,178,131, 1,145, +/* 0x07c0 */ 133, 0, 0,148, 3, 0, 0, 18,225, 0, 24, 42,127, 0, 31,107, +/* 0x07d0 */ 39, 16,135, 26,173, 5, 0,113, 24,123, 31, 83,225,254,255, 84, +/* 0x07e0 */ 231, 4, 0, 49, 0,242,255, 84,255, 0, 6,107, 0, 9, 0, 17, +/* 0x07f0 */ 40, 8, 0, 84,225, 3, 6, 42,194, 0, 7, 75, 0, 4, 0, 81, +/* 0x0800 */ 198, 4, 0, 17, 31, 0, 31,107,160, 16, 70,122, 45,105, 98, 56, +/* 0x0810 */ 45, 73, 33, 56,225, 3, 6, 42, 8,255,255, 84,128,255,255, 23, +/* 0x0820 */ 74, 25, 0, 81,126,255,255, 23,161, 97, 0,145,178,131, 1,145, +/* 0x0830 */ 97, 1, 1,139, 0, 0,128, 82,103, 0, 0,148,128, 3, 0, 53, +/* 0x0840 */ 1,129, 7,145,178,131, 1,145, 97, 1, 1,139, 98, 0, 0,148, +/* 0x0850 */ 64, 9, 0, 53, 6, 5, 0, 52,192, 0, 7, 75, 95, 25, 0,113, +/* 0x0860 */ 106, 1,128, 82, 45,105, 96, 56, 32, 1,128, 82, 45, 73, 38, 56, +/* 0x0870 */ 74,193,128, 26,198, 4, 0, 17,105,255,255, 23,178,131, 1,145, +/* 0x0880 */ 1, 11, 0,145, 0, 0,128, 82, 83, 0, 0,148,232, 3, 0, 42, +/* 0x0890 */ 160, 2, 0, 53,128,113, 29, 83,109, 0,128, 82, 0,124, 64,147, +/* 0x08a0 */ 0, 8, 2,145, 12, 7, 0,139,153,255,255, 23,161,193, 0,145, +/* 0x08b0 */ 178,131, 1,145, 97, 1, 1,139, 0, 0,128, 82, 70, 0, 0,148, +/* 0x08c0 */ 64, 6, 0, 53, 95, 25, 0,113,224, 3, 7, 42,106, 1,128, 82, +/* 0x08d0 */ 231, 3, 21, 42, 74,193,154, 26,245, 3, 0, 42,120,161, 41,145, +/* 0x08e0 */ 128,255,255, 23, 12, 19, 8,145,232, 29,128, 18, 13, 1,128, 82, +/* 0x08f0 */ 135,255,255, 23,243, 83, 65,169,245, 91, 66,169,247, 99, 67,169, +/* 0x0900 */ 249,107, 68,169, 32, 0,128, 82,253,123,199,168,192, 3, 95,214, +/* 0x0910 */ 172, 51, 64,249, 33, 20, 0, 81, 3,224,191, 18,159, 3, 3,107, +/* 0x0920 */ 231,120, 31, 83, 40, 1, 0, 84,162, 55, 64,249, 95, 0, 12,235, +/* 0x0930 */ 68, 4, 0,145, 0,254,255, 84,164, 55, 0,249,156, 95, 24, 83, +/* 0x0940 */ 64, 0, 64, 57, 27, 32, 27, 42,128,127, 1, 83, 31, 0, 27,107, +/* 0x0950 */ 252, 3, 0, 42,104, 0, 0, 84,123, 3, 0, 75,231, 0, 0, 50, +/* 0x0960 */ 33, 4, 0,113,193,253,255, 84,231,108, 28, 83,108, 17, 25,145, +/* 0x0970 */ 141, 0,128, 82,143,255,255, 23,224, 3, 21, 42,245, 3, 7, 42, +/* 0x0980 */ 231, 3, 0, 42,208,255,255, 23,161, 33, 1,145,178,131, 1,145, +/* 0x0990 */ 97, 1, 1,139, 0, 0,128, 82, 15, 0, 0,148,160, 0, 0, 53, +/* 0x09a0 */ 224, 3, 21, 42,245, 3, 22, 42,246, 3, 0, 42,198,255,255, 23, +/* 0x09b0 */ 224, 3, 21, 42,245, 3, 23, 42,247, 3, 22, 42,246, 3, 0, 42, +/* 0x09c0 */ 193,255,255, 23,168, 55, 64,249, 34,255,255, 23, 6, 0,128, 82, +/* 0x09d0 */ 32,255,255, 23, 3,224,191, 18,159, 3, 3,107, 40, 1, 0, 84, +/* 0x09e0 */ 68, 14, 64,169,127, 0, 4,235, 32, 3, 0, 84,100, 4, 0,145, +/* 0x09f0 */ 68, 6, 0,249,156, 95, 24, 83, 98, 0, 64, 57, 91, 32, 27, 42, +/* 0x0a00 */ 35, 0, 64,121,130,127, 11, 83, 66,124, 3, 27, 95, 0, 27,107, +/* 0x0a10 */ 8, 1, 0, 84, 0,120, 31, 83, 99, 20, 67, 75,123, 3, 2, 75, +/* 0x0a20 */ 156, 3, 2, 75, 35, 0, 0,121, 0, 4, 0, 17,192, 3, 95,214, +/* 0x0a30 */ 4, 0,129, 82,252, 3, 2, 42,130, 0, 3, 75, 0,120, 31, 83, +/* 0x0a40 */ 99, 20,130, 11, 35, 0, 0,121,192, 3, 95,214, 32, 0,128, 82, +/* 0x0a50 */ 192, 3, 95,214,235,123,191,169,232,167,190,169,234, 11, 0,249, +/* 0x0a60 */ 230, 31,191,169,227,147,190,169,229, 11, 0,249, 76, 0, 1,139, +/* 0x0a70 */ 233, 43, 64,249,231, 47, 64,249,232, 3, 1,170,234, 0, 9,139, +/* 0x0a80 */ 11, 16, 0,145, 6, 0, 64, 57, 5, 4, 64, 57, 4, 8, 64, 57, +/* 0x0a90 */ 174, 0, 6, 11, 7, 0,128, 18,229, 32,197, 26,229, 3, 37, 42, +/* 0x0aa0 */ 228, 32,196, 26,228, 3, 36, 42, 32, 0,128, 82,224, 15, 27,248, +/* 0x0ab0 */ 224, 7, 0,185,224, 11, 0,185,224, 15, 0,185,228, 19, 0,185, +/* 0x0ac0 */ 229, 23, 0,185,230, 27, 0,185,231, 31, 0,185,232, 19, 0,249, +/* 0x0ad0 */ 233, 23, 0,249,234, 27, 0,249,235, 31, 0,249,236, 35, 0,249, +/* 0x0ae0 */ 238, 39, 0,249, 6, 0,128, 82,230, 31, 0,185, 2, 96,128, 82, +/* 0x0af0 */ 66, 32,206, 26, 66,216, 28, 17,225, 3, 11,170,224,131, 6, 50, +/* 0x0b00 */ 0,128, 0,170, 32, 0,129,168, 66, 32, 0,113,204,255,255, 84, +/* 0x0b10 */ 0, 21, 0,145,247, 0, 0,148, 31, 0, 8,235,193,255,255, 84, +/* 0x0b20 */ 227, 23, 64,249,226, 19, 64,185, 36, 1, 3,203,128, 0, 2, 10, +/* 0x0b30 */ 224, 59, 0,185, 0, 16, 6, 11, 97, 1, 0,145,241, 0, 0,148, +/* 0x0b40 */ 65, 5, 0, 84,227, 23, 64,185,226, 27, 64,185, 99, 0, 4, 10, +/* 0x0b50 */ 224,115, 64, 57, 99, 32,194, 26, 66, 32, 0, 81,226, 3, 2, 75, +/* 0x0b60 */ 2, 36,194, 26, 99, 0, 2, 11,106,177, 57,145, 99, 4, 3, 11, +/* 0x0b70 */ 32, 0,128, 82, 74, 37, 3,139,223, 28, 0,113,227, 1, 0, 84, +/* 0x0b80 */ 225, 3, 64,185, 33, 1, 1,203, 37, 0, 64, 57,165,120, 31, 83, +/* 0x0b90 */ 65, 1, 8,145,164, 0, 24, 18, 33, 4, 4,139,219, 0, 0,148, +/* 0x0ba0 */ 3, 0, 0, 18,127, 32, 68,107,193, 0, 0, 84, 31, 0, 4,113, +/* 0x0bb0 */ 227,254,255, 84, 5, 0, 0, 20,225, 3, 10,170,211, 0, 0,148, +/* 0x0bc0 */ 31, 0, 4,113,163,255,255, 84,195, 0,128, 82, 98, 0,128, 82, +/* 0x0bd0 */ 223, 40, 0,113, 67, 48,131, 26,223, 16, 0,113,195, 48,131, 26, +/* 0x0be0 */ 198, 0, 3, 75, 36, 0, 0, 20, 97, 1, 6,145,196, 0, 0,148, +/* 0x0bf0 */ 193, 1, 0, 84,227, 11, 64,185,226, 7, 64,185,225, 3, 64,185, +/* 0x0c00 */ 227, 15, 0,185,226, 11, 0,185,225, 7, 0,185,223, 28, 0,113, +/* 0x0c10 */ 102, 0,128, 82, 3, 0,128, 82,102, 48,134, 26,106,145, 1,145, +/* 0x0c20 */ 74, 1, 24,145, 44, 0, 0, 20, 97, 97, 6,145,180, 0, 0,148, +/* 0x0c30 */ 97, 2, 0, 84,227, 59, 64,185, 97,129, 7,145, 96, 16, 6, 11, +/* 0x0c40 */ 176, 0, 0,148,193, 3, 0, 84,223, 28, 0,113,102, 1,128, 82, +/* 0x0c50 */ 35, 1,128, 82,102, 48,134, 26,227, 43, 64,185,225, 3, 64,185, +/* 0x0c60 */ 36, 1, 3, 75,159, 0, 1,107, 3, 19, 0, 84, 32, 1, 1,203, +/* 0x0c70 */ 0, 0, 64, 57, 32, 21, 0, 56,127, 0, 0, 20, 97,193, 6,145, +/* 0x0c80 */ 159, 0, 0,148,228, 7, 64,185, 64, 1, 0, 84, 97, 33, 7,145, +/* 0x0c90 */ 155, 0, 0,148,228, 11, 64,185,128, 0, 0, 84,227, 11, 64,185, +/* 0x0ca0 */ 228, 15, 64,185,227, 15, 0,185,227, 7, 64,185,227, 11, 0,185, +/* 0x0cb0 */ 225, 3, 64,185,228, 3, 0,185,225, 7, 0,185,223, 28, 0,113, +/* 0x0cc0 */ 102, 1,128, 82, 3, 1,128, 82,102, 48,134, 26,106,161, 1,145, +/* 0x0cd0 */ 74, 1, 40,145, 65, 1, 0,145,139, 0, 0,148,225, 0, 0, 84, +/* 0x0ce0 */ 227, 59, 64,185, 69, 17, 0,145, 2, 0,128, 82,165, 16, 3,139, +/* 0x0cf0 */ 4, 1,128, 82, 13, 0, 0, 20, 65, 9, 0,145,130, 0, 0,148, +/* 0x0d00 */ 225, 0, 0, 84,227, 59, 64,185, 69, 17, 4,145, 2, 1,128, 82, +/* 0x0d10 */ 165, 16, 3,139, 4, 1,128, 82, 4, 0, 0, 20, 69, 17, 8,145, +/* 0x0d20 */ 2, 2,128, 82, 4, 32,128, 82,226, 75, 0,185, 32, 0,128, 82, +/* 0x0d30 */ 225, 3, 5,170,117, 0, 0,148, 3, 0, 4,107,163,255,255, 84, +/* 0x0d40 */ 229, 75, 64,185,165, 0, 3, 11,229, 75, 0,185,225, 3, 64,185, +/* 0x0d50 */ 223, 16, 0,113, 98, 7, 0, 84, 99, 0,128, 82,191, 0, 3,107, +/* 0x0d60 */ 198, 28, 0, 17,101,128,133, 26,101, 29, 5,139,165,128, 13,145, +/* 0x0d70 */ 32, 0,128, 82, 4, 8,128, 82,225, 3, 5,170, 99, 0, 0,148, +/* 0x0d80 */ 3, 0, 4,107,163,255,255, 84,227, 59, 0,185,127, 16, 0,113, +/* 0x0d90 */ 3, 5, 0, 84,100,124, 1, 83,132, 4, 0, 81, 97, 0, 0, 18, +/* 0x0da0 */ 33, 0, 31, 50,127, 56, 0,113,226, 0, 0, 84, 33, 32,196, 26, +/* 0x0db0 */ 106,121, 1,145, 35, 0, 3, 75, 74, 1, 20,145, 74, 5, 3,139, +/* 0x0dc0 */ 13, 0, 0, 20,132, 16, 0, 81, 66, 0, 0,148,231,124, 1, 83, +/* 0x0dd0 */ 131, 1, 7,107,108, 32,140, 26, 33, 0, 1, 26,132, 4, 0,113, +/* 0x0de0 */ 65,255,255, 84,106, 17, 1,145, 74, 1, 24,145, 33,108, 28, 83, +/* 0x0df0 */ 132, 0,128, 82,225, 3, 0,185, 37, 0,128, 82, 32, 0,128, 82, +/* 0x0e00 */ 225, 3, 10,170, 65, 0, 0,148, 31, 0, 0,114,128, 0, 0, 84, +/* 0x0e10 */ 225, 3, 64,185, 33, 0, 5, 42,225, 3, 0,185,165,120, 31, 83, +/* 0x0e20 */ 132, 4, 0,113,225,254,255, 84,225, 3, 64,185, 2, 0, 0, 20, +/* 0x0e30 */ 225, 59, 64,185, 33, 4, 0, 49,225, 3, 0,185,229, 75, 64,185, +/* 0x0e40 */ 227, 23, 64,249,165, 8, 0, 17, 35, 1, 3,203, 63, 0, 3,235, +/* 0x0e50 */ 200, 3, 0, 84,226, 27, 64,249, 32, 1, 1,203, 0, 0, 64, 57, +/* 0x0e60 */ 32, 21, 0, 56, 63, 1, 2,235,226, 0, 0, 84,165, 4, 0,113, +/* 0x0e70 */ 65,255,255, 84,224,115, 0, 57,226, 27, 64,249, 63, 1, 2,235, +/* 0x0e80 */ 3,229,255, 84, 19, 0, 0,148, 0, 0,128, 82,226, 19, 64,249, +/* 0x0e90 */ 3, 1, 2,203,226, 43, 64,249, 67, 0, 0,185,226, 23, 64,249, +/* 0x0ea0 */ 35, 1, 2,203,226, 91, 64,249, 67, 0, 0,185,255,227, 1,145, +/* 0x0eb0 */ 230, 31, 65,169,228, 23,194,168,234, 47, 65,169,232, 39,194,168, +/* 0x0ec0 */ 254,135, 64,248,192, 3, 95,214, 32, 0,128, 82,240,255,255, 23, +/* 0x0ed0 */ 3, 32,160, 82,255, 0, 3,107, 67, 0, 0, 84,192, 3, 95,214, +/* 0x0ee0 */ 227, 35, 64,249,231, 92, 24, 83,127, 0, 8,235,233,254,255, 84, +/* 0x0ef0 */ 3, 21, 64, 56,108, 32, 12, 42,192, 3, 95,214,224, 3, 6, 42, +/* 0x0f00 */ 33, 4, 0,139, 0, 0,128, 82, 33, 4, 0,139, 3, 32,160, 82, +/* 0x0f10 */ 255, 0, 3,107,226, 3, 30,170, 66, 0, 0, 84,241,255,255,151, +/* 0x0f20 */ 35, 0, 64,121,254,124, 11, 83,126,124, 30, 27, 30, 0,129, 82, +/* 0x0f30 */ 159, 1, 30,107,162, 0, 0, 84,222, 3, 3, 75,231, 3, 30, 42, +/* 0x0f40 */ 99, 20, 94, 11, 4, 0, 0, 20,140, 1, 30, 75,231, 0, 30, 75, +/* 0x0f50 */ 99, 20, 67, 75, 0, 0, 0, 58, 35, 0, 0,121, 64, 0, 31,214, +/* 0x0f60 */ 194, 3,128, 82, 33, 1, 0, 16, 64, 0,128, 82, 8, 8,128, 82, +/* 0x0f70 */ 1, 0, 0,212,192, 3, 95,214,224, 15,128, 82,168, 11,128, 82, +/* 0x0f80 */ 1, 0, 0,212,192, 3, 95,214, 80, 82, 79, 84, 95, 69, 88, 69, +/* 0x0f90 */ 67,124, 80, 82, 79, 84, 95, 87, 82, 73, 84, 69, 32,102, 97,105, +/* 0x0fa0 */ 108,101,100, 46, 10, 0, 0, 0,226, 3, 30,170, 65,208, 0,209, +/* 0x0fb0 */ 229, 3, 1,170, 36, 68, 64,184,165, 0, 4,203, 36, 68, 64,184, +/* 0x0fc0 */ 164, 0, 4,139,164, 75, 0,185, 36, 68, 64,184,164, 0, 4,139, +/* 0x0fd0 */ 228,207, 31,248, 36, 68, 64,184,160, 0, 4, 11, 1, 96, 0, 17, +/* 0x0fe0 */ 255, 35, 0,209, 36, 4, 64,185, 33, 48, 0,145, 33, 0, 4,139, +/* 0x0ff0 */ 36, 68, 64,184, 5, 44, 12, 83,165,124, 22, 83,132, 8, 5, 11, +/* 0x1000 */ 228,207, 31,184, 0, 8, 5, 75,224,207, 31,184,132, 8, 5, 75, +/* 0x1010 */ 0, 8, 5, 11,229,207, 31,184, 16, 0, 0,148, 99, 28, 0, 18, +/* 0x1020 */ 127, 64, 1,113,129, 1, 0, 84, 33,252, 66,211, 65, 1, 0,180, +/* 0x1030 */ 33, 4, 0,209, 2,120, 97,184, 67,120, 26, 83,127, 20, 0,113, +/* 0x1040 */ 129, 0, 0, 84, 66, 0, 1, 75, 98, 20, 26, 83, 2,120, 33,184, +/* 0x1050 */ 1,255,255,181,192, 3, 95,214,254,207, 31,248, 35, 20, 64, 57, +/* 0x1060 */ 227,207, 31,248, 35, 24, 64, 57,227,207, 31,248,228,207, 31,248, +/* 0x1070 */ 224,207, 31,248, 36, 68, 64,184,229, 3, 4, 42, 36, 68, 64,184, +/* 0x1080 */ 228,207, 31,248,226,207, 31,248,163, 83, 1,209,227,207, 31,248, +/* 0x1090 */ 224,207, 31,248,229,207, 31,248,225,207, 31,248, 35, 4, 64,146, +/* 0x10a0 */ 165, 12, 0,145,165, 0, 3,139,163, 3, 93,184, 98, 8, 69,139, +/* 0x10b0 */ 163,131, 89,184,121, 0, 0,148,163,131, 92,184,119, 0, 0,148, +/* 0x10c0 */ 71, 0, 0,148, 4, 0,128,146, 67, 6,128,210, 98, 0,128,210, +/* 0x10d0 */ 161,195, 93,248,160,131, 93,248,230, 3, 0,170,200, 27,128, 82, +/* 0x10e0 */ 1, 0, 0,212,192, 3, 95,214, 31, 0, 6,235, 64, 0, 0, 84, +/* 0x10f0 */ 0, 0, 32,212,165, 3, 93,184,161, 67, 95,248, 47, 0, 0,148, +/* 0x1100 */ 226, 15, 65,169,224, 7,194,168,228,135, 64,248,128, 0, 63,214, +/* 0x1110 */ 255, 35, 0,145, 11, 0, 0,148,232, 26,128, 82, 1, 0, 0,212, +/* 0x1120 */ 192, 3, 95,214,226, 11, 64,249,224,135,193,168,230, 31, 65,169, +/* 0x1130 */ 228, 23,194,168,225, 11, 64,249,253,251,193,168, 32, 0, 31,214, +/* 0x1140 */ 164,195, 95,184,192, 7, 64,169,128, 4, 0,169,226, 15, 65,169, +/* 0x1150 */ 224, 7,194,168,228, 51,193,168, 67, 0, 0,180,128, 0, 63,214, +/* 0x1160 */ 224, 3, 64,249,225, 67, 64,248, 2, 0,128,210, 33, 0, 0,139, +/* 0x1170 */ 33, 32, 0,145, 8, 0,176, 82, 1, 0, 0,212,192, 3, 95,214, +/* 0x1180 */ 224, 7,193,168,162, 0,128,210, 72, 28,128, 82, 1, 0, 0,212, +/* 0x1190 */ 192, 3, 95,214,254, 11, 64,249,224,135,193,168,192, 3, 31,214, +/* 0x11a0 */ 37,192, 95,184,165, 92, 0, 18,165, 4, 0, 17, 35, 68, 64,184, +/* 0x11b0 */ 165, 4, 0, 81, 3, 68, 0,184,191, 8, 0,114,129,255,255, 84, +/* 0x11c0 */ 165,124, 3, 83,165, 0, 0, 52, 34, 12,193,168,165, 4, 0,113, +/* 0x11d0 */ 2, 12,129,168,165,255,255, 53,192, 3, 95,214,254,207, 31,248, +/* 0x11e0 */ 227, 3, 30,170, 45, 0, 0,148, 65,244,126,211, 4, 0,128,146, +/* 0x11f0 */ 67, 4,128,210,226, 0,128,210,161,195, 31,248, 0, 0,128,210, +/* 0x1200 */ 200, 27,128, 82, 1, 0, 0,212,192, 3, 95,214, 31, 4, 64,177, +/* 0x1210 */ 67, 0, 0, 84, 0, 0, 32,212,160, 67, 31,248,161,131, 93,184, +/* 0x1220 */ 165, 3, 93,184,229,255,255,151,161,131, 87,184,165,195, 87,184, +/* 0x1230 */ 35, 4, 0, 18, 33, 0, 3, 75,165, 0, 3, 11, 99, 0, 0, 11, +/* 0x1240 */ 163,131, 23,184,165, 28, 0, 17,165,124, 3, 83,219,255,255,151, +/* 0x1250 */ 226, 3, 0,170,161,131, 89,248,160,131, 25,248,209,255,255,151, +/* 0x1260 */ 161,131, 92,248,160,131, 28,248,206,255,255,151,225, 71, 64,248, +/* 0x1270 */ 224,207, 31,248,203,255,255,151,225, 3, 0,170,224, 3, 2,170, +/* 0x1280 */ 2, 0,128,210, 8, 0,176, 82, 1, 0, 0,212,192, 3, 95,214, +/* 0x1290 */ 254, 71, 64,248,192, 3, 31,214, 99,192, 95,184, 99, 92, 0, 18, +/* 0x12a0 */ 99, 4, 0, 17, 66, 0, 3,139,192, 3, 95,214,102,105,108,101, +/* 0x12b0 */ 32,102,111,114,109, 97,116, 32,101,108,102, 54, 52, 45,108,105, +/* 0x12c0 */ 116,116,108,101, 97, 97,114, 99,104, 54, 52, 10, 10, 83,101, 99, +/* 0x12d0 */ 116,105,111,110,115, 58, 10, 73,100,120, 32, 78, 97,109,101, 32, +/* 0x12e0 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 83,105,122,101, 32, 32, 32, +/* 0x12f0 */ 32, 32, 32, 86, 77, 65, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, +/* 0x1300 */ 32, 32, 32, 32, 32, 76, 77, 65, 32, 32, 32, 32, 32, 32, 32, 32, +/* 0x1310 */ 32, 32, 32, 32, 32, 32, 32, 70,105,108,101, 32,111,102,102, 32, +/* 0x1320 */ 32, 65,108,103,110, 32, 32, 70,108, 97,103,115, 10, 32, 32, 48, +/* 0x1330 */ 32, 69, 76, 70, 77, 65, 73, 78, 88, 32, 32, 32, 32, 32, 32, 48, +/* 0x1340 */ 48, 48, 48, 48, 48, 50, 52, 32, 32, 48, 48, 48, 48, 48, 48, 48, +/* 0x1350 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, +/* 0x1360 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, +/* 0x1370 */ 48, 48, 48, 52, 48, 32, 32, 50, 42, 42, 50, 32, 32, 67, 79, 78, +/* 0x1380 */ 84, 69, 78, 84, 83, 44, 32, 82, 69, 76, 79, 67, 44, 32, 82, 69, +/* 0x1390 */ 65, 68, 79, 78, 76, 89, 10, 32, 32, 49, 32, 78, 82, 86, 95, 72, +/* 0x13a0 */ 69, 65, 68, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 48, +/* 0x13b0 */ 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x13c0 */ 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x13d0 */ 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 54, 52, 32, +/* 0x13e0 */ 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, +/* 0x13f0 */ 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 50, 32, 78, 82, +/* 0x1400 */ 86, 95, 84, 65, 73, 76, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, +/* 0x1410 */ 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x1420 */ 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x1430 */ 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, +/* 0x1440 */ 54, 52, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, +/* 0x1450 */ 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 51, +/* 0x1460 */ 32, 78, 82, 86, 50, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 48, +/* 0x1470 */ 48, 48, 48, 48, 49, 50, 99, 32, 32, 48, 48, 48, 48, 48, 48, 48, +/* 0x1480 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, +/* 0x1490 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, +/* 0x14a0 */ 48, 48, 48, 54, 52, 32, 32, 50, 42, 42, 50, 32, 32, 67, 79, 78, +/* 0x14b0 */ 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, +/* 0x14c0 */ 32, 32, 52, 32, 78, 82, 86, 50, 68, 32, 32, 32, 32, 32, 32, 32, +/* 0x14d0 */ 32, 32, 48, 48, 48, 48, 48, 49, 50, 48, 32, 32, 48, 48, 48, 48, +/* 0x14e0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, +/* 0x14f0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, +/* 0x1500 */ 48, 48, 48, 48, 48, 49, 57, 48, 32, 32, 50, 42, 42, 50, 32, 32, +/* 0x1510 */ 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, +/* 0x1520 */ 76, 89, 10, 32, 32, 53, 32, 78, 82, 86, 50, 66, 32, 32, 32, 32, +/* 0x1530 */ 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48,102, 56, 32, 32, 48, +/* 0x1540 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, +/* 0x1550 */ 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x1560 */ 48, 32, 32, 48, 48, 48, 48, 48, 50, 98, 48, 32, 32, 50, 42, 42, +/* 0x1570 */ 50, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, +/* 0x1580 */ 68, 79, 78, 76, 89, 10, 32, 32, 54, 32, 76, 90, 77, 65, 95, 69, +/* 0x1590 */ 76, 70, 48, 48, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 98, 52, +/* 0x15a0 */ 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x15b0 */ 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x15c0 */ 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 51, 97, 56, 32, 32, +/* 0x15d0 */ 50, 42, 42, 50, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, +/* 0x15e0 */ 82, 69, 76, 79, 67, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, +/* 0x15f0 */ 32, 32, 55, 32, 76, 90, 77, 65, 95, 68, 69, 67, 50, 48, 32, 32, +/* 0x1600 */ 32, 32, 48, 48, 48, 48, 48, 53,102, 56, 32, 32, 48, 48, 48, 48, +/* 0x1610 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, +/* 0x1620 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, +/* 0x1630 */ 48, 48, 48, 48, 48, 52, 53, 99, 32, 32, 50, 42, 42, 50, 32, 32, +/* 0x1640 */ 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, +/* 0x1650 */ 76, 89, 10, 32, 32, 56, 32, 76, 90, 77, 65, 95, 68, 69, 67, 49, +/* 0x1660 */ 48, 32, 32, 32, 32, 48, 48, 48, 48, 48, 53, 48, 99, 32, 32, 48, +/* 0x1670 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, +/* 0x1680 */ 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x1690 */ 48, 32, 32, 48, 48, 48, 48, 48, 97, 53, 52, 32, 32, 50, 42, 42, +/* 0x16a0 */ 50, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, +/* 0x16b0 */ 68, 79, 78, 76, 89, 10, 32, 32, 57, 32, 76, 90, 77, 65, 95, 68, +/* 0x16c0 */ 69, 67, 51, 48, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x16d0 */ 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x16e0 */ 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x16f0 */ 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48,102, 54, 48, 32, 32, +/* 0x1700 */ 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, +/* 0x1710 */ 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 49, 48, 32, 69, 76, 70, +/* 0x1720 */ 77, 65, 73, 78, 89, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, +/* 0x1730 */ 48, 52, 54, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x1740 */ 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x1750 */ 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48,102, 54, +/* 0x1760 */ 48, 32, 32, 50, 42, 42, 50, 32, 32, 67, 79, 78, 84, 69, 78, 84, +/* 0x1770 */ 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 49, 49, 32, +/* 0x1780 */ 69, 76, 70, 77, 65, 73, 78, 90, 32, 32, 32, 32, 32, 32, 48, 48, +/* 0x1790 */ 48, 48, 48, 51, 48, 52, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x17a0 */ 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, +/* 0x17b0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, +/* 0x17c0 */ 48,102, 97, 56, 32, 32, 50, 42, 42, 50, 32, 32, 67, 79, 78, 84, +/* 0x17d0 */ 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 83, +/* 0x17e0 */ 89, 77, 66, 79, 76, 32, 84, 65, 66, 76, 69, 58, 10, 48, 48, 48, +/* 0x17f0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, +/* 0x1800 */ 32, 32, 32,100, 32, 32, 76, 90, 77, 65, 95, 68, 69, 67, 51, 48, +/* 0x1810 */ 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x1820 */ 48, 32, 76, 90, 77, 65, 95, 68, 69, 67, 51, 48, 10, 48, 48, 48, +/* 0x1830 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, +/* 0x1840 */ 32, 32, 32,100, 32, 32, 69, 76, 70, 77, 65, 73, 78, 90, 9, 48, +/* 0x1850 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, +/* 0x1860 */ 69, 76, 70, 77, 65, 73, 78, 90, 10, 48, 48, 48, 48, 48, 48, 48, +/* 0x1870 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, +/* 0x1880 */ 32, 32, 69, 76, 70, 77, 65, 73, 78, 88, 9, 48, 48, 48, 48, 48, +/* 0x1890 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 69, 76, 70, 77, +/* 0x18a0 */ 65, 73, 78, 88, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x18b0 */ 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 78, 82, +/* 0x18c0 */ 86, 95, 72, 69, 65, 68, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x18d0 */ 48, 48, 48, 48, 48, 48, 48, 32, 78, 82, 86, 95, 72, 69, 65, 68, +/* 0x18e0 */ 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x18f0 */ 48, 32,108, 32, 32, 32, 32,100, 32, 32, 78, 82, 86, 95, 84, 65, +/* 0x1900 */ 73, 76, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x1910 */ 48, 48, 48, 32, 78, 82, 86, 95, 84, 65, 73, 76, 10, 48, 48, 48, +/* 0x1920 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, +/* 0x1930 */ 32, 32, 32,100, 32, 32, 78, 82, 86, 50, 69, 9, 48, 48, 48, 48, +/* 0x1940 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 78, 82, 86, +/* 0x1950 */ 50, 69, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x1960 */ 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 78, 82, 86, 50, +/* 0x1970 */ 68, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x1980 */ 48, 48, 32, 78, 82, 86, 50, 68, 10, 48, 48, 48, 48, 48, 48, 48, +/* 0x1990 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, +/* 0x19a0 */ 32, 32, 78, 82, 86, 50, 66, 9, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x19b0 */ 48, 48, 48, 48, 48, 48, 48, 48, 32, 78, 82, 86, 50, 66, 10, 48, +/* 0x19c0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, +/* 0x19d0 */ 108, 32, 32, 32, 32,100, 32, 32, 76, 90, 77, 65, 95, 69, 76, 70, +/* 0x19e0 */ 48, 48, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x19f0 */ 48, 48, 48, 32, 76, 90, 77, 65, 95, 69, 76, 70, 48, 48, 10, 48, +/* 0x1a00 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, +/* 0x1a10 */ 108, 32, 32, 32, 32,100, 32, 32, 76, 90, 77, 65, 95, 68, 69, 67, +/* 0x1a20 */ 50, 48, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x1a30 */ 48, 48, 48, 32, 76, 90, 77, 65, 95, 68, 69, 67, 50, 48, 10, 48, +/* 0x1a40 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, +/* 0x1a50 */ 108, 32, 32, 32, 32,100, 32, 32, 76, 90, 77, 65, 95, 68, 69, 67, +/* 0x1a60 */ 49, 48, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x1a70 */ 48, 48, 48, 32, 76, 90, 77, 65, 95, 68, 69, 67, 49, 48, 10, 48, +/* 0x1a80 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, +/* 0x1a90 */ 108, 32, 32, 32, 32,100, 32, 32, 69, 76, 70, 77, 65, 73, 78, 89, +/* 0x1aa0 */ 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x1ab0 */ 48, 32, 69, 76, 70, 77, 65, 73, 78, 89, 10, 48, 48, 48, 48, 48, +/* 0x1ac0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,103, 32, 32, 32, +/* 0x1ad0 */ 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 88, 9, 48, 48, 48, +/* 0x1ae0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 95,115, +/* 0x1af0 */ 116, 97,114,116, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x1b00 */ 48, 48, 48, 48, 48, 32,103, 32, 32, 32, 32, 32, 70, 32, 78, 82, +/* 0x1b10 */ 86, 50, 69, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x1b20 */ 48, 49, 50, 99, 32,117, 99,108, 95,110,114,118, 50,101, 95,100, +/* 0x1b30 */ 101, 99,111,109,112,114,101,115,115, 95, 56, 10, 48, 48, 48, 48, +/* 0x1b40 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,103, 32, 32, +/* 0x1b50 */ 32, 32, 32, 70, 32, 78, 82, 86, 50, 68, 9, 48, 48, 48, 48, 48, +/* 0x1b60 */ 48, 48, 48, 48, 48, 48, 48, 48, 49, 50, 48, 32,117, 99,108, 95, +/* 0x1b70 */ 110,114,118, 50,100, 95,100,101, 99,111,109,112,114,101,115,115, +/* 0x1b80 */ 95, 56, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x1b90 */ 48, 48, 48, 32,103, 32, 32, 32, 32, 32, 70, 32, 78, 82, 86, 50, +/* 0x1ba0 */ 66, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x1bb0 */ 102, 56, 32,117, 99,108, 95,110,114,118, 50, 98, 95,100,101, 99, +/* 0x1bc0 */ 111,109,112,114,101,115,115, 95, 56, 10, 48, 48, 48, 48, 48, 48, +/* 0x1bd0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,103, 32, 32, 32, 32, +/* 0x1be0 */ 32, 32, 32, 76, 90, 77, 65, 95, 68, 69, 67, 49, 48, 9, 48, 48, +/* 0x1bf0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 76, +/* 0x1c00 */ 122,109, 97, 68,101, 99,111,100,101, 10, 48, 48, 48, 48, 48, 48, +/* 0x1c10 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,103, 32, 32, 32, 32, +/* 0x1c20 */ 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 89, 9, 48, 48, 48, 48, +/* 0x1c30 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,101,110,100, +/* 0x1c40 */ 95,100,101, 99,111,109,112,114,101,115,115, 10, 10, 82, 69, 76, +/* 0x1c50 */ 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, 68, 83, 32, +/* 0x1c60 */ 70, 79, 82, 32, 91, 69, 76, 70, 77, 65, 73, 78, 88, 93, 58, 10, +/* 0x1c70 */ 79, 70, 70, 83, 69, 84, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, +/* 0x1c80 */ 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, +/* 0x1c90 */ 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, 48, 48, 48, 48, 48, 48, +/* 0x1ca0 */ 48, 48, 48, 48, 48, 48, 48, 50, 48, 32, 82, 95, 65, 65, 82, 67, +/* 0x1cb0 */ 72, 54, 52, 95, 67, 65, 76, 76, 50, 54, 32, 32, 69, 76, 70, 77, +/* 0x1cc0 */ 65, 73, 78, 90, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, +/* 0x1cd0 */ 32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 76, 90, +/* 0x1ce0 */ 77, 65, 95, 69, 76, 70, 48, 48, 93, 58, 10, 79, 70, 70, 83, 69, +/* 0x1cf0 */ 84, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 84, 89, 80, 69, +/* 0x1d00 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, +/* 0x1d10 */ 76, 85, 69, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x1d20 */ 48, 48, 48, 52, 32, 82, 95, 65, 65, 82, 67, 72, 54, 52, 95, 67, +/* 0x1d30 */ 79, 78, 68, 66, 82, 49, 57, 32, 32, 76, 90, 77, 65, 95, 68, 69, +/* 0x1d40 */ 67, 51, 48, 10 +}; diff --git a/src/stub/src/arm64-linux.shlib-init.S b/src/stub/src/arm64-linux.shlib-init.S new file mode 100644 index 00000000..ef9cc392 --- /dev/null +++ b/src/stub/src/arm64-linux.shlib-init.S @@ -0,0 +1,400 @@ +/* arm-linux.shlib-init.S -- Linux Elf shared library init & decompressor +* +* This file is part of the UPX executable compressor. +* +* Copyright (C) 1996-2017 Markus Franz Xaver Johannes Oberhumer +* Copyright (C) 1996-2017 Laszlo Molnar +* Copyright (C) 2000-2017 John F. Reiser +* All Rights Reserved. +* +* UPX and the UCL library are free software; you can redistribute them +* and/or modify them under the terms of the GNU General Public License as +* published by the Free Software Foundation; either version 2 of +* the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; see the file COPYING. +* If not, write to the Free Software Foundation, Inc., +* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +* +* Markus F.X.J. Oberhumer Laszlo Molnar +* +* +* John F. Reiser +* +*/ + +#include "arch/arm/v8a/macros.S" + +sz_Elf64_Ehdr = 16 + 2*2 + 4 + 3*8 + 4 + 6*2 +sz_Elf64_Phdr = 2*4 + 6*8 + +sz_b_info= 12 + sz_unc= 0 + sz_cpr= 4 + b_method= 8 +sz_l_info= 12 +sz_p_info= 12 + +PROT_READ= 1 +PROT_WRITE= 2 +PROT_EXEC= 4 + +MAP_PRIVATE= 2 +MAP_FIXED= 0x10 +MAP_ANONYMOUS= 0x20 + +PAGE_SHIFT= 12 +PAGE_MASK= (~0< no filter + blr rax // unfilter +0: +//p_mprot + ldr arg1,[sp,#0*4] // lo(dst) + ldr arg2,[sp,#1*4] // len + mov arg3,#0 + add arg2,arg2,arg1 // hi(dst) + add arg2,arg2,#2*4 // len(hatch) + do_sys __ARM_NR_cacheflush + + POP2(arg1,arg2) + mov arg3,#PROT_READ|PROT_EXEC + do_sys __NR_mprotect + +//p_unmap +#if defined(ARMEL_EABI4) //{ +// first part of do_sys7t __NR_munmap +.if __NR_munmap <= 0xff + mov r7,#__NR_munmap +.else + mov r7,#__NR_munmap>>16 + lsl r7,r7,#16 + add r7,r7,#__NR_munmap - ((__NR_munmap>>16)<<16) +.endif +#endif //} + POP3(arg1,arg2,lr) + br lr // togo hatch + +movsl_subr: + ldr ecx,[rsi,#-4] // 'bl ' instruction word + bic ecx,ecx,#0xff<<24 // displacment field + add ecx,ecx,#1 // displ omits one word +// FALL THROUGH to the part of 'movsl' that trims to a multiple of 8 words. +// 7/8 of the time this is faster; 1/8 of the time it's slower. +9: + ldr tmp,[rsi],#4; sub ecx,ecx,#1 + str tmp,[rdi],#4 +movsl: // rdi= 4-byte aligned dst; esi= 4-byte aligned src; ecx= word count + tst ecx,#7; bne 9b // work ecx down to multiple of 8 + lsr ecx,ecx,#3; cbz ecx,9f +7: + ldp x2,x3,[rsi],#2*8; subs ecx,ecx,#1 + stp x2,x3,[rdi],#2*8; cbnz ecx,7b +9: + ret + +L220: + push lr // &supervise +o_super= -18*8 + mov tmpx,lr; bl wlen_subr // wlen_supervise + lsl arg2,rdx,#2 // convert to bytes + + // Allocate pages to hold temporary copy. + mov arg5,#-1 // cater to *BSD for fd of MAP_ANON + mov arg4,#MAP_PRIVATE|MAP_ANONYMOUS + mov arg3,#PROT_READ|PROT_WRITE|PROT_EXEC + str arg2,[fp,#p_unmap+1*8] // length to unmap + mov arg1,#0 // any addr + do_sys __NR_mmap64; cmn x0,#4096; bcc 0f; brk #0; 0: + str x0,[fp,#p_unmap+0*8] // address to unmap + + ldr esi,[fp,#p_mprot] + //mov edi,r0 // edi= dst NOP: edi==r0 + ldr ecx,[fp,#o_wfrag] // w_fragment + bl movsl // copy the fragment + + ldr esi,[fp,#p_uncpr+0*4] // src + ldr ecx,[fp,#p_uncpr+1*4] // len + and tmp,esi,#3 // length of prefix alignment + sub esi,esi,tmp // down to word aligned + add ecx,ecx,tmp // prefix increases byte length + add tmp,tmp,edi // skip prefix at destination + str tmp,[fp,#p_uncpr+0*4] // dst + add ecx,ecx,#7 // round up to full words + lsr ecx,ecx,#3 + bl movsl // copy all aligned words that contain compressed data + + mov rdx,rdi // lo(dst) of copied code + + ldr rsi,[fp,#o_uncpr] + str rdi,[fp,#o_uncpr] + bl movsl_subr // copy decompressor + + ldr rsi,[fp,#o_unflt] + str rdi,[fp,#o_unflt] + bl movsl_subr // copy unfilter + + pop rsi // &supervise + push rdi // &copied + bl movsl_subr // copy supervisor + + mov arg2,rdi // hi(dst) of copied code + mov arg1,rdx // lo(dst) of copied code + mov arg3,#0 + do_sys __ARM_NR_cacheflush + + pop lr; br lr // goto copied supervisor + +wlen_subr: // edx+= nwords of inline subr at *tmp + ldr tmp,[tmpx,#-4] // 'bl ' instruction word + bic tmp,tmp,#0xff<<24 // displacment field + add tmp,tmp,#1 // displ omits one word + add rdx,rdx,tmpx + ret + +/*__XTHEENDX__*/ + +/* vim:set ts=8 sw=8 et: */ diff --git a/src/stub/tmp/arm64-linux.elf-entry.bin.dump b/src/stub/tmp/arm64-linux.elf-entry.bin.dump new file mode 100644 index 00000000..1e5c67e9 --- /dev/null +++ b/src/stub/tmp/arm64-linux.elf-entry.bin.dump @@ -0,0 +1,49 @@ +file format elf64-littleaarch64 + +Sections: +Idx Name Size VMA LMA File off Algn Flags + 0 ELFMAINX 00000040 0000000000000000 0000000000000000 00000040 2**2 CONTENTS, RELOC, READONLY + 1 LUNMP000 00000004 0000000000000000 0000000000000000 00000080 2**2 CONTENTS, READONLY + 2 LUNMP001 00000004 0000000000000000 0000000000000000 00000084 2**2 CONTENTS, READONLY + 3 ELFMAINXu 000000ac 0000000000000000 0000000000000000 00000088 2**2 CONTENTS, RELOC, READONLY + 4 NRV_HEAD 00000000 0000000000000000 0000000000000000 00000134 2**0 CONTENTS, READONLY + 5 NRV_TAIL 00000000 0000000000000000 0000000000000000 00000134 2**0 CONTENTS, READONLY + 6 NRV2E 00000128 0000000000000000 0000000000000000 00000134 2**2 CONTENTS, READONLY + 7 NRV2D 0000011c 0000000000000000 0000000000000000 0000025c 2**2 CONTENTS, READONLY + 8 NRV2B 000005a4 0000000000000000 0000000000000000 00000378 2**2 CONTENTS, READONLY + 9 ELFMAINY 00000046 0000000000000000 0000000000000000 0000091c 2**2 CONTENTS, READONLY + 10 ELFMAINZ 00000000 0000000000000000 0000000000000000 00000962 2**0 CONTENTS, READONLY +SYMBOL TABLE: +0000000000000000 l d ELFMAINY 0000000000000000 ELFMAINY +0000000000000000 l d ELFMAINX 0000000000000000 ELFMAINX +0000000000000000 l d LUNMP000 0000000000000000 LUNMP000 +0000000000000000 l d LUNMP001 0000000000000000 LUNMP001 +0000000000000000 l d ELFMAINXu 0000000000000000 ELFMAINXu +0000000000000000 l d NRV_HEAD 0000000000000000 NRV_HEAD +0000000000000000 l d NRV_TAIL 0000000000000000 NRV_TAIL +0000000000000000 l d NRV2E 0000000000000000 NRV2E +0000000000000000 l d NRV2D 0000000000000000 NRV2D +0000000000000000 l d NRV2B 0000000000000000 NRV2B +0000000000000000 l d ELFMAINZ 0000000000000000 ELFMAINZ +0000000000000000 *UND* 0000000000000000 LENF +0000000000000000 *UND* 0000000000000000 CPR0 +0000000000000000 *UND* 0000000000000000 MFLG +0000000000000000 *UND* 0000000000000000 ADRM +0000000000000014 g ELFMAINX 0000000000000000 _start +0000000000000000 g F NRV2E 0000000000000128 ucl_nrv2e_decompress_8 +0000000000000000 g F NRV2D 000000000000011c ucl_nrv2d_decompress_8 +0000000000000000 g F NRV2B 00000000000000f0 ucl_nrv2b_decompress_8 +00000000000000f0 g NRV2B 0000000000000000 LzmaDecode +0000000000000000 g ELFMAINY 0000000000000000 end_decompress +0000000000000000 g ELFMAINZ 0000000000000000 cpr0 + +RELOCATION RECORDS FOR [ELFMAINX]: +OFFSET TYPE VALUE +0000000000000000 R_AARCH64_ABS32 LENF +0000000000000004 R_AARCH64_ABS32 CPR0 +0000000000000008 R_AARCH64_ABS32 MFLG +000000000000000c R_AARCH64_ABS64 ADRM + +RELOCATION RECORDS FOR [ELFMAINXu]: +OFFSET TYPE VALUE +000000000000002c R_AARCH64_CONDBR19 ELFMAINY diff --git a/src/stub/tmp/arm64-linux.elf-fold.map b/src/stub/tmp/arm64-linux.elf-fold.map new file mode 100644 index 00000000..853f6f63 --- /dev/null +++ b/src/stub/tmp/arm64-linux.elf-fold.map @@ -0,0 +1,51 @@ + +Memory Configuration + +Name Origin Length Attributes +*default* 0x0000000000000000 0xffffffffffffffff + +Linker script and memory map + + 0x00000000001000bc . = ((0x100000 + SIZEOF_HEADERS) + 0xc) + +.text 0x00000000001000bc 0x8a4 + *(.text) + .text 0x00000000001000bc 0x2fc tmp/arm64-linux.elf-fold.o + 0x00000000001002b4 my_bkpt + 0x00000000001002bc exit + 0x00000000001002c8 read + 0x00000000001002d8 write + 0x00000000001002e8 open + 0x00000000001002f8 close + 0x0000000000100308 unlink + 0x0000000000100318 getpid + 0x0000000000100328 brk + 0x0000000000100338 readlink + 0x0000000000100348 munmap + 0x0000000000100358 mprotect + 0x0000000000100368 __clear_cache + 0x0000000000100380 mmap + 0x00000000001003a0 mmap_privanon + .text 0x00000000001003b8 0x5a8 tmp/arm64-linux.elf-main.o + 0x000000000010080c upx_main + *(.data) + .data 0x0000000000100960 0x0 tmp/arm64-linux.elf-fold.o + .data 0x0000000000100960 0x0 tmp/arm64-linux.elf-main.o + +.iplt 0x0000000000100960 0x0 + .iplt 0x0000000000100960 0x0 tmp/arm64-linux.elf-fold.o + +.rela.dyn 0x0000000000100960 0x0 + .rela.iplt 0x0000000000100960 0x0 tmp/arm64-linux.elf-fold.o + +.data +LOAD tmp/arm64-linux.elf-fold.o +LOAD tmp/arm64-linux.elf-main.o +OUTPUT(tmp/arm64-linux.elf-fold.bin elf64-littleaarch64) + +.igot.plt 0x0000000000100960 0x0 + .igot.plt 0x0000000000100960 0x0 tmp/arm64-linux.elf-fold.o + +.bss 0x0000000000100960 0x0 + .bss 0x0000000000100960 0x0 tmp/arm64-linux.elf-fold.o + .bss 0x0000000000100960 0x0 tmp/arm64-linux.elf-main.o diff --git a/src/stub/tmp/arm64-linux.shlib-init.bin.dump b/src/stub/tmp/arm64-linux.shlib-init.bin.dump new file mode 100644 index 00000000..369719d0 --- /dev/null +++ b/src/stub/tmp/arm64-linux.shlib-init.bin.dump @@ -0,0 +1,43 @@ +file format elf64-littleaarch64 + +Sections: +Idx Name Size VMA LMA File off Algn Flags + 0 ELFMAINX 00000024 0000000000000000 0000000000000000 00000040 2**2 CONTENTS, RELOC, READONLY + 1 NRV_HEAD 00000000 0000000000000000 0000000000000000 00000064 2**0 CONTENTS, READONLY + 2 NRV_TAIL 00000000 0000000000000000 0000000000000000 00000064 2**0 CONTENTS, READONLY + 3 NRV2E 0000012c 0000000000000000 0000000000000000 00000064 2**2 CONTENTS, READONLY + 4 NRV2D 00000120 0000000000000000 0000000000000000 00000190 2**2 CONTENTS, READONLY + 5 NRV2B 000000f8 0000000000000000 0000000000000000 000002b0 2**2 CONTENTS, READONLY + 6 LZMA_ELF00 000000b4 0000000000000000 0000000000000000 000003a8 2**2 CONTENTS, RELOC, READONLY + 7 LZMA_DEC20 000005f8 0000000000000000 0000000000000000 0000045c 2**2 CONTENTS, READONLY + 8 LZMA_DEC10 0000050c 0000000000000000 0000000000000000 00000a54 2**2 CONTENTS, READONLY + 9 LZMA_DEC30 00000000 0000000000000000 0000000000000000 00000f60 2**0 CONTENTS, READONLY + 10 ELFMAINY 00000046 0000000000000000 0000000000000000 00000f60 2**2 CONTENTS, READONLY + 11 ELFMAINZ 00000304 0000000000000000 0000000000000000 00000fa8 2**2 CONTENTS, READONLY +SYMBOL TABLE: +0000000000000000 l d LZMA_DEC30 0000000000000000 LZMA_DEC30 +0000000000000000 l d ELFMAINZ 0000000000000000 ELFMAINZ +0000000000000000 l d ELFMAINX 0000000000000000 ELFMAINX +0000000000000000 l d NRV_HEAD 0000000000000000 NRV_HEAD +0000000000000000 l d NRV_TAIL 0000000000000000 NRV_TAIL +0000000000000000 l d NRV2E 0000000000000000 NRV2E +0000000000000000 l d NRV2D 0000000000000000 NRV2D +0000000000000000 l d NRV2B 0000000000000000 NRV2B +0000000000000000 l d LZMA_ELF00 0000000000000000 LZMA_ELF00 +0000000000000000 l d LZMA_DEC20 0000000000000000 LZMA_DEC20 +0000000000000000 l d LZMA_DEC10 0000000000000000 LZMA_DEC10 +0000000000000000 l d ELFMAINY 0000000000000000 ELFMAINY +0000000000000000 g ELFMAINX 0000000000000000 _start +0000000000000000 g F NRV2E 000000000000012c ucl_nrv2e_decompress_8 +0000000000000000 g F NRV2D 0000000000000120 ucl_nrv2d_decompress_8 +0000000000000000 g F NRV2B 00000000000000f8 ucl_nrv2b_decompress_8 +0000000000000000 g LZMA_DEC10 0000000000000000 LzmaDecode +0000000000000000 g ELFMAINY 0000000000000000 end_decompress + +RELOCATION RECORDS FOR [ELFMAINX]: +OFFSET TYPE VALUE +0000000000000020 R_AARCH64_CALL26 ELFMAINZ + +RELOCATION RECORDS FOR [LZMA_ELF00]: +OFFSET TYPE VALUE +0000000000000004 R_AARCH64_CONDBR19 LZMA_DEC30