diff --git a/tools/bsnes/cartridge/cartridge.cpp b/tools/bsnes/cartridge/cartridge.cpp new file mode 100755 index 0000000..e4b5f57 --- /dev/null +++ b/tools/bsnes/cartridge/cartridge.cpp @@ -0,0 +1,157 @@ +#include <../base.hpp> + +#define CARTRIDGE_CPP +namespace SNES { + +#include "header.cpp" + +namespace memory { + MappedRAM cartrom, cartram, cartrtc; + MappedRAM bsxflash, bsxram, bsxpram; + MappedRAM stArom, stAram; + MappedRAM stBrom, stBram; + MappedRAM gbrom, gbram; +}; + +Cartridge cartridge; + +void Cartridge::load(Mode cartridge_mode) { + cartinfo_t cartinfo; + read_header(cartinfo, memory::cartrom.data(), memory::cartrom.size()); + set_cartinfo(cartinfo); + + set(mode, cartridge_mode); + + if(cartinfo.ram_size > 0) { + memory::cartram.map(new(zeromemory) uint8_t[cartinfo.ram_size], cartinfo.ram_size); + } + + if(cartinfo.srtc || cartinfo.spc7110rtc) { + memory::cartrtc.map(new(zeromemory) uint8_t[20], 20); + } + + if(mode() == ModeBsx) { + memory::bsxram.map (new(zeromemory) uint8_t[ 32 * 1024], 32 * 1024); + memory::bsxpram.map(new(zeromemory) uint8_t[512 * 1024], 512 * 1024); + } + + if(mode() == ModeSufamiTurbo) { + if(memory::stArom.data()) memory::stAram.map(new(zeromemory) uint8_t[128 * 1024], 128 * 1024); + if(memory::stBrom.data()) memory::stBram.map(new(zeromemory) uint8_t[128 * 1024], 128 * 1024); + } + + if(mode() == ModeSuperGameBoy) { + if(memory::gbrom.data()) memory::gbram.map(new(zeromemory) uint8_t[64 * 1024], 64 * 1024); + } + + memory::cartrom.write_protect(true); + memory::cartram.write_protect(false); + memory::cartrtc.write_protect(false); + memory::bsxflash.write_protect(true); + memory::bsxram.write_protect(false); + memory::bsxpram.write_protect(false); + memory::stArom.write_protect(true); + memory::stAram.write_protect(false); + memory::stBrom.write_protect(true); + memory::stBram.write_protect(false); + memory::gbrom.write_protect(true); + memory::gbram.write_protect(false); + + bus.load_cart(); + set(loaded, true); +} + +void Cartridge::unload() { + memory::cartrom.reset(); + memory::cartram.reset(); + memory::cartrtc.reset(); + memory::bsxflash.reset(); + memory::bsxram.reset(); + memory::bsxpram.reset(); + memory::stArom.reset(); + memory::stAram.reset(); + memory::stBrom.reset(); + memory::stBram.reset(); + memory::gbrom.reset(); + memory::gbram.reset(); + + if(loaded() == false) return; + bus.unload_cart(); + set(loaded, false); +} + +Cartridge::Type Cartridge::detect_image_type(uint8_t *data, unsigned size) const { + cartinfo_t info; + read_header(info, data, size); + return info.type; +} + +Cartridge::Cartridge() { + set(loaded, false); + unload(); +} + +Cartridge::~Cartridge() { + unload(); +} + +void Cartridge::set_cartinfo(const Cartridge::cartinfo_t &source) { + set(region, source.region); + set(mapper, source.mapper); + set(dsp1_mapper, source.dsp1_mapper); + + set(has_bsx_slot, source.bsx_slot); + set(has_superfx, source.superfx); + set(has_sa1, source.sa1); + set(has_srtc, source.srtc); + set(has_sdd1, source.sdd1); + set(has_spc7110, source.spc7110); + set(has_spc7110rtc, source.spc7110rtc); + set(has_cx4, source.cx4); + set(has_dsp1, source.dsp1); + set(has_dsp2, source.dsp2); + set(has_dsp3, source.dsp3); + set(has_dsp4, source.dsp4); + set(has_obc1, source.obc1); + set(has_st010, source.st010); + set(has_st011, source.st011); + set(has_st018, source.st018); +} + +//========== +//cartinfo_t +//========== + +void Cartridge::cartinfo_t::reset() { + type = TypeUnknown; + mapper = LoROM; + dsp1_mapper = DSP1Unmapped; + region = NTSC; + + rom_size = 0; + ram_size = 0; + + bsx_slot = false; + superfx = false; + sa1 = false; + srtc = false; + sdd1 = false; + spc7110 = false; + spc7110rtc = false; + cx4 = false; + dsp1 = false; + dsp2 = false; + dsp3 = false; + dsp4 = false; + obc1 = false; + st010 = false; + st011 = false; + st018 = false; +} + +Cartridge::cartinfo_t::cartinfo_t() { + reset(); +} + +}; + diff --git a/tools/bsnes/cartridge/cartridge.hpp b/tools/bsnes/cartridge/cartridge.hpp new file mode 100755 index 0000000..80ea40c --- /dev/null +++ b/tools/bsnes/cartridge/cartridge.hpp @@ -0,0 +1,130 @@ +class Cartridge : public property { +public: + enum Mode { + ModeNormal, + ModeBsxSlotted, + ModeBsx, + ModeSufamiTurbo, + ModeSuperGameBoy, + }; + + enum Type { + TypeNormal, + TypeBsxSlotted, + TypeBsxBios, + TypeBsx, + TypeSufamiTurboBios, + TypeSufamiTurbo, + TypeSuperGameBoyBios, + TypeGameBoy, + TypeUnknown, + }; + + enum Region { + NTSC, + PAL, + }; + + enum MemoryMapper { + LoROM, + HiROM, + ExLoROM, + ExHiROM, + SA1ROM, + SPC7110ROM, + BSCLoROM, + BSCHiROM, + BSXROM, + STROM, + }; + + enum DSP1MemoryMapper { + DSP1Unmapped, + DSP1LoROM1MB, + DSP1LoROM2MB, + DSP1HiROM, + }; + + //properties can be read via operator(), eg "if(cartridge.loaded() == true)"; + //warning: if loaded() == false, no other property is considered valid! + + property_t loaded; //is a base cartridge inserted? + + property_t mode; + property_t region; + property_t mapper; + property_t dsp1_mapper; + + property_t has_bsx_slot; + property_t has_superfx; + property_t has_sa1; + property_t has_srtc; + property_t has_sdd1; + property_t has_spc7110, has_spc7110rtc; + property_t has_cx4; + property_t has_dsp1, has_dsp2, has_dsp3, has_dsp4; + property_t has_obc1; + property_t has_st010, has_st011, has_st018; + + //main interface + void load(Mode); +//void read(); +//void load(); + void unload(); + Type detect_image_type(uint8_t *data, unsigned size) const; + + Cartridge(); + ~Cartridge(); + +private: + struct cartinfo_t { + Type type; + Region region; + MemoryMapper mapper; + DSP1MemoryMapper dsp1_mapper; + unsigned rom_size, ram_size; + + bool bsx_slot; + bool superfx; + bool sa1; + bool srtc; + bool sdd1; + bool spc7110, spc7110rtc; + bool cx4; + bool dsp1, dsp2, dsp3, dsp4; + bool obc1; + bool st010, st011, st018; + + void reset(); + cartinfo_t(); + }; + + enum HeaderField { + CartName = 0x00, + Mapper = 0x15, + RomType = 0x16, + RomSize = 0x17, + RamSize = 0x18, + CartRegion = 0x19, + Company = 0x1a, + Version = 0x1b, + Complement = 0x1c, //inverse checksum + Checksum = 0x1e, + ResetVector = 0x3c, + }; + + void read_header(cartinfo_t &info, const uint8_t *data, unsigned size) const; + unsigned find_header(const uint8_t *data, unsigned size) const; + unsigned score_header(const uint8_t *data, unsigned size, unsigned addr) const; + void set_cartinfo(const cartinfo_t&); +}; + +namespace memory { + extern MappedRAM cartrom, cartram, cartrtc; + extern MappedRAM bsxflash, bsxram, bsxpram; + extern MappedRAM stArom, stAram; + extern MappedRAM stBrom, stBram; + extern MappedRAM gbrom, gbram; +}; + +extern Cartridge cartridge; diff --git a/tools/bsnes/cartridge/header.cpp b/tools/bsnes/cartridge/header.cpp new file mode 100755 index 0000000..e48cea1 --- /dev/null +++ b/tools/bsnes/cartridge/header.cpp @@ -0,0 +1,294 @@ +#ifdef CARTRIDGE_CPP + +void Cartridge::read_header(cartinfo_t &info, const uint8_t *data, unsigned size) const { + info.reset(); + + //===================== + //detect Game Boy carts + //===================== + + if(size >= 0x0140) { + if(data[0x0104] == 0xce && data[0x0105] == 0xed && data[0x0106] == 0x66 && data[0x0107] == 0x66 + && data[0x0108] == 0xcc && data[0x0109] == 0x0d && data[0x010a] == 0x00 && data[0x010b] == 0x0b) { + info.type = TypeGameBoy; + return; + } + } + + const unsigned index = find_header(data, size); + const uint8 mapper = data[index + Mapper]; + const uint8 rom_type = data[index + RomType]; + const uint8 rom_size = data[index + RomSize]; + const uint8 company = data[index + Company]; + const uint8 region = data[index + CartRegion] & 0x7f; + + if(data[index + RamSize] & 7) { + info.ram_size = 1024 << (data[index + RamSize] & 7); + } else { + info.ram_size = 0; + } + + //0, 1, 13 = NTSC; 2 - 12 = PAL + info.region = (region <= 1 || region >= 13) ? NTSC : PAL; + + //======================= + //detect BS-X flash carts + //======================= + + if(data[index + 0x13] == 0x00 || data[index + 0x13] == 0xff) { + if(data[index + 0x14] == 0x00) { + const uint8_t n15 = data[index + 0x15]; + if(n15 == 0x00 || n15 == 0x80 || n15 == 0x84 || n15 == 0x9c || n15 == 0xbc || n15 == 0xfc) { + if(data[index + 0x1a] == 0x33 || data[index + 0x1a] == 0xff) { + info.type = TypeBsx; + info.mapper = BSXROM; + info.region = NTSC; //BS-X only released in Japan + return; + } + } + } + } + + //========================= + //detect Sufami Turbo carts + //========================= + + if(!memcmp(data, "BANDAI SFC-ADX", 14)) { + if(!memcmp(data + 16, "SFC-ADX BACKUP", 14)) { + info.type = TypeSufamiTurboBios; + } else { + info.type = TypeSufamiTurbo; + } + info.mapper = STROM; + info.region = NTSC; //Sufami Turbo only released in Japan + return; //RAM size handled internally by load_cart_st(); + } + + //========================== + //detect Super Game Boy BIOS + //========================== + + if(!memcmp(data + index, "Super GAMEBOY", 13)) { + info.type = TypeSuperGameBoyBios; + return; + } + + //===================== + //detect standard carts + //===================== + + //detect presence of BS-X flash cartridge connector (reads extended header information) + if(data[index - 14] == 'Z') { + if(data[index - 11] == 'J') { + uint8 n13 = data[index - 13]; + if((n13 >= 'A' && n13 <= 'Z') || (n13 >= '0' && n13 <= '9')) { + if(company == 0x33 || (data[index - 10] == 0x00 && data[index - 4] == 0x00)) { + info.bsx_slot = true; + } + } + } + } + + if(info.bsx_slot == true) { + if(!memcmp(data + index, "Satellaview BS-X ", 21)) { + //BS-X base cart + info.type = TypeBsxBios; + info.mapper = BSXROM; + info.region = NTSC; //BS-X only released in Japan + return; //RAM size handled internally by load_cart_bsx() -> BSXCart class + } else { + info.type = TypeBsxSlotted; + info.mapper = (index == 0x7fc0 ? BSCLoROM : BSCHiROM); + } + } else { + //standard cart + info.type = TypeNormal; + + if(index == 0x7fc0 && size >= 0x401000) { + info.mapper = ExLoROM; + } else if(index == 0x7fc0 && mapper == 0x32) { + info.mapper = ExLoROM; + } else if(index == 0x7fc0) { + info.mapper = LoROM; + } else if(index == 0xffc0) { + info.mapper = HiROM; + } else { //index == 0x40ffc0 + info.mapper = ExHiROM; + } + } + + if(mapper == 0x20 && (rom_type == 0x13 || rom_type == 0x14 || rom_type == 0x15 || rom_type == 0x1a)) { + info.superfx = true; + } + + if(mapper == 0x23 && (rom_type == 0x32 || rom_type == 0x34 || rom_type == 0x35)) { + info.sa1 = true; + info.mapper = SA1ROM; + } + + if(mapper == 0x35 && rom_type == 0x55) { + info.srtc = true; + } + + if(mapper == 0x32 && (rom_type == 0x43 || rom_type == 0x45)) { + info.sdd1 = true; + } + + if(mapper == 0x3a && (rom_type == 0xf5 || rom_type == 0xf9)) { + info.spc7110 = true; + info.spc7110rtc = (rom_type == 0xf9); + info.mapper = SPC7110ROM; + } + + if(mapper == 0x20 && rom_type == 0xf3) { + info.cx4 = true; + } + + if((mapper == 0x20 || mapper == 0x21) && rom_type == 0x03) { + info.dsp1 = true; + } + + if(mapper == 0x30 && rom_type == 0x05 && company != 0xb2) { + info.dsp1 = true; + } + + if(mapper == 0x31 && (rom_type == 0x03 || rom_type == 0x05)) { + info.dsp1 = true; + } + + if(info.dsp1 == true) { + if((mapper & 0x2f) == 0x20 && size <= 0x100000) { + info.dsp1_mapper = DSP1LoROM1MB; + } else if((mapper & 0x2f) == 0x20) { + info.dsp1_mapper = DSP1LoROM2MB; + } else if((mapper & 0x2f) == 0x21) { + info.dsp1_mapper = DSP1HiROM; + } + } + + if(mapper == 0x20 && rom_type == 0x05) { + info.dsp2 = true; + } + + if(mapper == 0x30 && rom_type == 0x05 && company == 0xb2) { + info.dsp3 = true; + } + + if(mapper == 0x30 && rom_type == 0x03) { + info.dsp4 = true; + } + + if(mapper == 0x30 && rom_type == 0x25) { + info.obc1 = true; + } + + if(mapper == 0x30 && rom_type == 0xf6 && rom_size >= 10) { + info.st010 = true; + } + + if(mapper == 0x30 && rom_type == 0xf6 && rom_size < 10) { + info.st011 = true; + } + + if(mapper == 0x30 && rom_type == 0xf5) { + info.st018 = true; + } +} + +unsigned Cartridge::find_header(const uint8_t *data, unsigned size) const { + unsigned score_lo = score_header(data, size, 0x007fc0); + unsigned score_hi = score_header(data, size, 0x00ffc0); + unsigned score_ex = score_header(data, size, 0x40ffc0); + if(score_ex) score_ex += 4; //favor ExHiROM on images > 32mbits + + if(score_lo >= score_hi && score_lo >= score_ex) { + return 0x007fc0; + } else if(score_hi >= score_ex) { + return 0x00ffc0; + } else { + return 0x40ffc0; + } +} + +unsigned Cartridge::score_header(const uint8_t *data, unsigned size, unsigned addr) const { + if(size < addr + 64) return 0; //image too small to contain header at this location? + int score = 0; + + uint16 resetvector = data[addr + ResetVector] | (data[addr + ResetVector + 1] << 8); + uint16 checksum = data[addr + Checksum ] | (data[addr + Checksum + 1] << 8); + uint16 complement = data[addr + Complement ] | (data[addr + Complement + 1] << 8); + + uint8 resetop = data[(addr & ~0x7fff) | (resetvector & 0x7fff)]; //first opcode executed upon reset + uint8 mapper = data[addr + Mapper] & ~0x10; //mask off irrelevent FastROM-capable bit + + //$00:[000-7fff] contains uninitialized RAM and MMIO. + //reset vector must point to ROM at $00:[8000-ffff] to be considered valid. + if(resetvector < 0x8000) return 0; + + //some images duplicate the header in multiple locations, and others have completely + //invalid header information that cannot be relied upon. + //below code will analyze the first opcode executed at the specified reset vector to + //determine the probability that this is the correct header. + + //most likely opcodes + if(resetop == 0x78 //sei + || resetop == 0x18 //clc (clc; xce) + || resetop == 0x38 //sec (sec; xce) + || resetop == 0x9c //stz $nnnn (stz $4200) + || resetop == 0x4c //jmp $nnnn + || resetop == 0x5c //jml $nnnnnn + ) score += 8; + + //plausible opcodes + if(resetop == 0xc2 //rep #$nn + || resetop == 0xe2 //sep #$nn + || resetop == 0xad //lda $nnnn + || resetop == 0xae //ldx $nnnn + || resetop == 0xac //ldy $nnnn + || resetop == 0xaf //lda $nnnnnn + || resetop == 0xa9 //lda #$nn + || resetop == 0xa2 //ldx #$nn + || resetop == 0xa0 //ldy #$nn + || resetop == 0x20 //jsr $nnnn + || resetop == 0x22 //jsl $nnnnnn + ) score += 4; + + //implausible opcodes + if(resetop == 0x40 //rti + || resetop == 0x60 //rts + || resetop == 0x6b //rtl + || resetop == 0xcd //cmp $nnnn + || resetop == 0xec //cpx $nnnn + || resetop == 0xcc //cpy $nnnn + ) score -= 4; + + //least likely opcodes + if(resetop == 0x00 //brk #$nn + || resetop == 0x02 //cop #$nn + || resetop == 0xdb //stp + || resetop == 0x42 //wdm + || resetop == 0xff //sbc $nnnnnn,x + ) score -= 8; + + //at times, both the header and reset vector's first opcode will match ... + //fallback and rely on info validity in these cases to determine more likely header. + + //a valid checksum is the biggest indicator of a valid header. + if((checksum + complement) == 0xffff && (checksum != 0) && (complement != 0)) score += 4; + + if(addr == 0x007fc0 && mapper == 0x20) score += 2; //0x20 is usually LoROM + if(addr == 0x00ffc0 && mapper == 0x21) score += 2; //0x21 is usually HiROM + if(addr == 0x007fc0 && mapper == 0x22) score += 2; //0x22 is usually ExLoROM + if(addr == 0x40ffc0 && mapper == 0x25) score += 2; //0x25 is usually ExHiROM + + if(data[addr + Company] == 0x33) score += 2; //0x33 indicates extended header + if(data[addr + RomType] < 0x08) score++; + if(data[addr + RomSize] < 0x10) score++; + if(data[addr + RamSize] < 0x08) score++; + if(data[addr + CartRegion] < 14) score++; + + if(score < 0) score = 0; + return score; +} + +#endif diff --git a/tools/bsnes/chip/sa1/bus/bus.cpp b/tools/bsnes/chip/sa1/bus/bus.cpp new file mode 100755 index 0000000..a38ff35 --- /dev/null +++ b/tools/bsnes/chip/sa1/bus/bus.cpp @@ -0,0 +1,164 @@ +#ifdef SA1_CPP + +SA1Bus sa1bus; + +namespace memory { + VectorSelectionPage vectorsp; + StaticRAM iram(2048); + MappedRAM &bwram = memory::cartram; + CC1BWRAM cc1bwram; + BitmapRAM bitmapram; +} + +void SA1Bus::init() { + for(uint32_t i = 0x0000; i <= 0xffff; i++) { + map(i << 8, memory::memory_unmapped, 0); + } + + for(uint16_t i = 0x2200; i <= 0x23ff; i++) { + memory::mmio.map(i, sa1); + } + + map(MapLinear, 0x00, 0x3f, 0x0000, 0x07ff, memory::iram); + map(MapDirect, 0x00, 0x3f, 0x2200, 0x23ff, memory::mmio); + map(MapLinear, 0x00, 0x3f, 0x3000, 0x37ff, memory::iram); + map(MapLinear, 0x00, 0x3f, 0x6000, 0x7fff, memory::bwram); + map(MapLinear, 0x00, 0x3f, 0x8000, 0xffff, memory::cartrom); + map(MapLinear, 0x40, 0x4f, 0x0000, 0xffff, memory::bwram); + map(MapLinear, 0x60, 0x6f, 0x0000, 0xffff, memory::bitmapram); + map(MapLinear, 0x80, 0xbf, 0x0000, 0x07ff, memory::iram); + map(MapDirect, 0x80, 0xbf, 0x2200, 0x23ff, memory::mmio); + map(MapLinear, 0x80, 0xbf, 0x3000, 0x37ff, memory::iram); + map(MapLinear, 0x80, 0xbf, 0x6000, 0x7fff, memory::bwram); + map(MapLinear, 0x80, 0xbf, 0x8000, 0xffff, memory::cartrom); + map(MapLinear, 0xc0, 0xff, 0x0000, 0xffff, memory::cartrom); + + bus.map(MapLinear, 0x00, 0x3f, 0x3000, 0x37ff, memory::iram); + bus.map(MapLinear, 0x00, 0x3f, 0x6000, 0x7fff, memory::cc1bwram); + bus.map(MapLinear, 0x00, 0x3f, 0x8000, 0xffff, memory::cartrom); + bus.map(MapLinear, 0x40, 0x4f, 0x0000, 0xffff, memory::cc1bwram); + bus.map(MapLinear, 0x80, 0xbf, 0x3000, 0x37ff, memory::iram); + bus.map(MapLinear, 0x80, 0xbf, 0x6000, 0x7fff, memory::cc1bwram); + bus.map(MapLinear, 0x80, 0xbf, 0x8000, 0xffff, memory::cartrom); + bus.map(MapLinear, 0xc0, 0xff, 0x0000, 0xffff, memory::cartrom); + + memory::vectorsp.sync(); +} + +//=================== +//VectorSelectionPage +//=================== + +//this class maps $00:[ff00-ffff] for the purpose of supporting: +//$2209.d6 IVSW (S-CPU IRQ vector selection) (0 = cart, 1 = SA-1) +//$2209.d4 NVSW (S-CPU NMI vector selection) (0 = cart, 1 = SA-1) +//when set, vector addresses are over-ridden with SA-1 register settings: +//SIV = S-CPU IRQ vector address override +//SNV = S-CPU NMI vector address override +// +//$00:[ffea-ffeb|ffee-ffef] are special cased on read; +//all other addresses return original mapped data. + +uint8_t VectorSelectionPage::read(unsigned addr) { + switch(0xff00 | (addr & 0xff)) { + case 0xffea: case 0xffeb: { + if(sa1.mmio.cpu_nvsw == true) return (sa1.mmio.snv >> ((addr & 1) << 3)); + } break; + + case 0xffee: case 0xffef: { + if(sa1.mmio.cpu_ivsw == true) return (sa1.mmio.siv >> ((addr & 1) << 3)); + } break; + } + + return access->read(addr); +} + +void VectorSelectionPage::write(unsigned addr, uint8_t data) { + return access->write(addr, data); +} + +//call this whenever bus is remapped. +//note: S-CPU and SA-1 bus always share $00:[ff00-ffff] as cartridge ROM data; +//the SA-1 MMC does not allow mapping these independently between processors. +//this allows this class to be shared for both, caching only ones' access class. +void VectorSelectionPage::sync() { + if(bus.page[0x00ff00 >> 8].access != this) { + //bus was re-mapped, hook access routine + access = bus.page[0x00ff00 >> 8].access; + bus.page[0x00ff00 >> 8].access = this; + sa1bus.page[0x00ff00 >> 8].access = this; + } +} + +//======== +//CC1BWRAM +//======== + +unsigned CC1BWRAM::size() const { + return memory::cartram.size(); +} + +uint8_t CC1BWRAM::read(unsigned addr) { + if(dma) return sa1.dma_cc1_read(addr); + return memory::cartram.read(addr); +} + +void CC1BWRAM::write(unsigned addr, uint8_t data) { + memory::cartram.write(addr, data); +} + +//========= +//BitmapRAM +//========= + +unsigned BitmapRAM::size() const { + return 0x100000; +} + +uint8_t BitmapRAM::read(unsigned addr) { + if(sa1.mmio.bbf == 0) { + //4bpp + unsigned shift = addr & 1; + addr = (addr >> 1) & (memory::cartram.size() - 1); + switch(shift) { + case 0: return (memory::cartram.read(addr) >> 0) & 15; + case 1: return (memory::cartram.read(addr) >> 4) & 15; + } + } else { + //2bpp + unsigned shift = addr & 3; + addr = (addr >> 2) & (memory::cartram.size() - 1); + switch(shift) { + case 0: return (memory::cartram.read(addr) >> 0) & 3; + case 1: return (memory::cartram.read(addr) >> 2) & 3; + case 2: return (memory::cartram.read(addr) >> 4) & 3; + case 3: return (memory::cartram.read(addr) >> 6) & 3; + } + } +} + +void BitmapRAM::write(unsigned addr, uint8_t data) { + if(sa1.mmio.bbf == 0) { + //4bpp + uint8_t shift = addr & 1; + addr = (addr >> 1) & (memory::cartram.size() - 1); + switch(shift) { + case 0: data = (memory::cartram.read(addr) & 0xf0) | ((data & 15) << 0); break; + case 1: data = (memory::cartram.read(addr) & 0x0f) | ((data & 15) << 4); break; + } + } else { + //2bpp + uint8_t shift = addr & 3; + addr = (addr >> 2) & (memory::cartram.size() - 1); + switch(shift) { + case 0: data = (memory::cartram.read(addr) & 0xfc) | ((data & 3) << 0); break; + case 1: data = (memory::cartram.read(addr) & 0xf3) | ((data & 3) << 2); break; + case 2: data = (memory::cartram.read(addr) & 0xcf) | ((data & 3) << 4); break; + case 3: data = (memory::cartram.read(addr) & 0x3f) | ((data & 3) << 6); break; + } + } + + memory::cartram.write(addr, data); +} + +#endif diff --git a/tools/bsnes/chip/sa1/bus/bus.hpp b/tools/bsnes/chip/sa1/bus/bus.hpp new file mode 100755 index 0000000..2951191 --- /dev/null +++ b/tools/bsnes/chip/sa1/bus/bus.hpp @@ -0,0 +1,31 @@ +struct SA1Bus : Bus { + void init(); +}; + +struct VectorSelectionPage : Memory { + alwaysinline uint8_t read(unsigned); + alwaysinline void write(unsigned, uint8_t); + void sync(); + Memory *access; +}; + +struct CC1BWRAM : Memory { + unsigned size() const; + alwaysinline uint8_t read(unsigned); + alwaysinline void write(unsigned, uint8_t); + bool dma; +}; + +struct BitmapRAM : Memory { + unsigned size() const; + alwaysinline uint8_t read(unsigned); + alwaysinline void write(unsigned, uint8_t); +}; + +namespace memory { + extern VectorSelectionPage vectorsp; + extern StaticRAM iram; + extern MappedRAM &bwram; + extern CC1BWRAM cc1bwram; + extern BitmapRAM bitmapram; +} diff --git a/tools/bsnes/chip/sa1/dma/dma.cpp b/tools/bsnes/chip/sa1/dma/dma.cpp new file mode 100755 index 0000000..1c7d019 --- /dev/null +++ b/tools/bsnes/chip/sa1/dma/dma.cpp @@ -0,0 +1,139 @@ +#ifdef SA1_CPP + +//==================== +//direct data transfer +//==================== + +void SA1::dma_normal() { + while(mmio.dtc--) { + uint8_t data = regs.mdr; + uint32_t dsa = mmio.dsa++; + uint32_t dda = mmio.dda++; + + //source and destination cannot be the same + if(mmio.sd == DMA::SourceBWRAM && mmio.dd == DMA::DestBWRAM) continue; + if(mmio.sd == DMA::SourceIRAM && mmio.dd == DMA::DestIRAM ) continue; + + switch(mmio.sd) { + case DMA::SourceROM: { + if((dsa & 0x408000) == 0x008000 || (dsa & 0xc00000) == 0xc00000) { + data = sa1bus.read(dsa); + } + } break; + + case DMA::SourceBWRAM: { + if((dsa & 0x40e000) == 0x006000 || (dsa & 0xf00000) == 0x400000) { + data = sa1bus.read(dsa); + } + } break; + + case DMA::SourceIRAM: { + data = memory::iram.read(dsa & 0x07ff); + } break; + } + + switch(mmio.dd) { + case DMA::DestBWRAM: { + if((dda & 0x40e000) == 0x006000 || (dda & 0xf00000) == 0x400000) { + sa1bus.write(dda, data); + } + } break; + + case DMA::DestIRAM: { + memory::iram.write(dda & 0x07ff, data); + } break; + } + } + + mmio.dma_irqfl = true; + if(mmio.dma_irqen) mmio.dma_irqcl = 0; +} + +//((byte & 6) << 3) + (byte & 1) explanation: +//transforms a byte index (0-7) into a planar index: +//result[] = { 0, 1, 16, 17, 32, 33, 48, 49 }; +//works for 2bpp, 4bpp and 8bpp modes + +//=========================== +//type-1 character conversion +//=========================== + +void SA1::dma_cc1() { + memory::cc1bwram.dma = true; + mmio.chdma_irqfl = true; + if(mmio.chdma_irqen) { + mmio.chdma_irqcl = 0; + cpu.regs.irq = 1; + } +} + +uint8_t SA1::dma_cc1_read(unsigned addr) { + //16 bytes/char (2bpp); 32 bytes/char (4bpp); 64 bytes/char (8bpp) + unsigned charmask = (1 << (6 - mmio.dmacb)) - 1; + + if((addr & charmask) == 0) { + //buffer next character to I-RAM + unsigned bpp = 2 << (2 - mmio.dmacb); + unsigned bpl = (8 << mmio.dmasize) >> mmio.dmacb; + unsigned bwmask = memory::bwram.size() - 1; + unsigned tile = ((addr - mmio.dsa) & bwmask) >> (6 - mmio.dmacb); + unsigned ty = (tile >> mmio.dmasize); + unsigned tx = tile & ((1 << mmio.dmasize) - 1); + unsigned bwaddr = mmio.dsa + ty * 8 * bpl + tx * bpp; + + for(unsigned y = 0; y < 8; y++) { + uint64_t data = 0; + for(unsigned byte = 0; byte < bpp; byte++) { + data |= (uint64_t)memory::bwram.read((bwaddr + byte) & bwmask) << (byte << 3); + } + bwaddr += bpl; + + uint8_t out[] = { 0, 0, 0, 0, 0, 0, 0, 0 }; + for(unsigned x = 0; x < 8; x++) { + out[0] |= (data & 1) << (7 - x); data >>= 1; + out[1] |= (data & 1) << (7 - x); data >>= 1; + if(mmio.dmacb == 2) continue; + out[2] |= (data & 1) << (7 - x); data >>= 1; + out[3] |= (data & 1) << (7 - x); data >>= 1; + if(mmio.dmacb == 1) continue; + out[4] |= (data & 1) << (7 - x); data >>= 1; + out[5] |= (data & 1) << (7 - x); data >>= 1; + out[6] |= (data & 1) << (7 - x); data >>= 1; + out[7] |= (data & 1) << (7 - x); data >>= 1; + } + + for(unsigned byte = 0; byte < bpp; byte++) { + unsigned p = mmio.dda + (y << 1) + ((byte & 6) << 3) + (byte & 1); + memory::iram.write(p & 0x07ff, out[byte]); + } + } + } + + return memory::iram.read((mmio.dda + (addr & charmask)) & 0x07ff); +} + +//=========================== +//type-2 character conversion +//=========================== + +void SA1::dma_cc2() { + //select register file index (0-7 or 8-15) + const uint8_t *brf = &mmio.brf[(dma.line & 1) << 3]; + unsigned bpp = 2 << (2 - mmio.dmacb); + unsigned addr = mmio.dda & 0x07ff; + addr &= ~((1 << (7 - mmio.dmacb)) - 1); + addr += (dma.line & 8) * bpp; + addr += (dma.line & 7) * 2; + + for(unsigned byte = 0; byte < bpp; byte++) { + uint8_t output = 0; + for(unsigned bit = 0; bit < 8; bit++) { + output |= ((brf[bit] >> byte) & 1) << (7 - bit); + } + memory::iram.write(addr + ((byte & 6) << 3) + (byte & 1), output); + } + + dma.line = (dma.line + 1) & 15; +} + +#endif diff --git a/tools/bsnes/chip/sa1/dma/dma.hpp b/tools/bsnes/chip/sa1/dma/dma.hpp new file mode 100755 index 0000000..6518bbe --- /dev/null +++ b/tools/bsnes/chip/sa1/dma/dma.hpp @@ -0,0 +1,11 @@ +struct DMA { + enum CDEN { DmaNormal = 0, DmaCharConversion = 1 }; + enum SD { SourceROM = 0, SourceBWRAM = 1, SourceIRAM = 2 }; + enum DD { DestIRAM = 0, DestBWRAM = 1 }; + unsigned line; +} dma; + +void dma_normal(); +void dma_cc1(); +uint8_t dma_cc1_read(unsigned addr); +void dma_cc2(); diff --git a/tools/bsnes/chip/sa1/memory/memory.cpp b/tools/bsnes/chip/sa1/memory/memory.cpp new file mode 100755 index 0000000..eec645f --- /dev/null +++ b/tools/bsnes/chip/sa1/memory/memory.cpp @@ -0,0 +1,39 @@ +#ifdef SA1_CPP + +//========================== +//SA-1 opcode core functions +//========================== + +void SA1::op_io() { + tick(); + if(regs.wai) scheduler.sync_copcpu(); +} + +//ROM, I-RAM and MMIO registers are accessed at ~10.74MHz (2 clock ticks) +//BW-RAM is accessed at ~5.37MHz (4 clock ticks) +//tick() == 2 clock ticks +//note: bus conflict delays are not emulated at this time + +#define is_bwram(addr) (\ + ((addr & 0x40e000) == 0x006000) \ +|| ((addr & 0xf00000) == 0x400000) \ +|| ((addr & 0xf00000) == 0x600000) \ +) + +uint8_t SA1::op_read(unsigned addr) { + tick(); + if(is_bwram(addr)) tick(); + scheduler.sync_copcpu(); + return sa1bus.read(addr); +} + +void SA1::op_write(unsigned addr, uint8_t data) { + tick(); + if(is_bwram(addr)) tick(); + scheduler.sync_copcpu(); + sa1bus.write(addr, data); +} + +#undef is_bwram + +#endif diff --git a/tools/bsnes/chip/sa1/memory/memory.hpp b/tools/bsnes/chip/sa1/memory/memory.hpp new file mode 100755 index 0000000..b18c9df --- /dev/null +++ b/tools/bsnes/chip/sa1/memory/memory.hpp @@ -0,0 +1,4 @@ +alwaysinline void op_io(); +alwaysinline uint8_t op_read(unsigned addr); +alwaysinline void op_write(unsigned addr, uint8_t data); +alwaysinline unsigned bus_speed(unsigned addr); diff --git a/tools/bsnes/chip/sa1/mmio/mmio.cpp b/tools/bsnes/chip/sa1/mmio/mmio.cpp new file mode 100755 index 0000000..204c11e --- /dev/null +++ b/tools/bsnes/chip/sa1/mmio/mmio.cpp @@ -0,0 +1,631 @@ +#ifdef SA1_CPP + +//BS-X flash carts, when present, are mapped to 0x400000+ +Memory& SA1::mmio_access(unsigned &addr) { + if(!memory::bsxflash.data()) return memory::cartrom; + if(addr < 0x400000) return memory::cartrom; + addr &= 0x3fffff; + return bsxflash; +} + +//(CCNT) SA-1 control +void SA1::mmio_w2200(uint8_t data) { + if(mmio.sa1_resb && !(data & 0x80)) { + //reset SA-1 CPU + regs.pc.w = mmio.crv; + regs.pc.b = 0x00; + } + + mmio.sa1_irq = (data & 0x80); + mmio.sa1_rdyb = (data & 0x40); + mmio.sa1_resb = (data & 0x20); + mmio.sa1_nmi = (data & 0x10); + mmio.smeg = (data & 0x0f); + + if(mmio.sa1_irq) { + mmio.sa1_irqfl = true; + if(mmio.sa1_irqen) mmio.sa1_irqcl = 0; + } + + if(mmio.sa1_nmi) { + mmio.sa1_nmifl = true; + if(mmio.sa1_nmien) mmio.sa1_nmicl = 0; + } +} + +//(SIE) S-CPU interrupt enable +void SA1::mmio_w2201(uint8_t data) { + if(!mmio.cpu_irqen && (data & 0x80)) { + if(mmio.cpu_irqfl) { + mmio.cpu_irqcl = 0; + cpu.regs.irq = 1; + } + } + + if(!mmio.chdma_irqen && (data & 0x20)) { + if(mmio.chdma_irqfl) { + mmio.chdma_irqcl = 0; + cpu.regs.irq = 1; + } + } + + mmio.cpu_irqen = (data & 0x80); + mmio.chdma_irqen = (data & 0x20); +} + +//(SIC) S-CPU interrupt clear +void SA1::mmio_w2202(uint8_t data) { + mmio.cpu_irqcl = (data & 0x80); + mmio.chdma_irqcl = (data & 0x20); + + if(mmio.cpu_irqcl ) mmio.cpu_irqfl = false; + if(mmio.chdma_irqcl) mmio.chdma_irqfl = false; + + if(!mmio.cpu_irqfl && !mmio.chdma_irqfl) cpu.regs.irq = 0; +} + +//(CRV) SA-1 reset vector +void SA1::mmio_w2203(uint8_t data) { mmio.crv = (mmio.crv & 0xff00) | data; } +void SA1::mmio_w2204(uint8_t data) { mmio.crv = (data << 8) | (mmio.crv & 0xff); } + +//(CNV) SA-1 NMI vector +void SA1::mmio_w2205(uint8_t data) { mmio.cnv = (mmio.cnv & 0xff00) | data; } +void SA1::mmio_w2206(uint8_t data) { mmio.cnv = (data << 8) | (mmio.cnv & 0xff); } + +//(CIV) SA-1 IRQ vector +void SA1::mmio_w2207(uint8_t data) { mmio.civ = (mmio.civ & 0xff00) | data; } +void SA1::mmio_w2208(uint8_t data) { mmio.civ = (data << 8) | (mmio.civ & 0xff); } + +//(SCNT) S-CPU control +void SA1::mmio_w2209(uint8_t data) { + mmio.cpu_irq = (data & 0x80); + mmio.cpu_ivsw = (data & 0x40); + mmio.cpu_nvsw = (data & 0x10); + mmio.cmeg = (data & 0x0f); + + if(mmio.cpu_irq) { + mmio.cpu_irqfl = true; + if(mmio.cpu_irqen) { + mmio.cpu_irqcl = 0; + cpu.regs.irq = 1; + } + } +} + +//(CIE) SA-1 interrupt enable +void SA1::mmio_w220a(uint8_t data) { + if(!mmio.sa1_irqen && (data & 0x80) && mmio.sa1_irqfl ) mmio.sa1_irqcl = 0; + if(!mmio.timer_irqen && (data & 0x40) && mmio.timer_irqfl) mmio.timer_irqcl = 0; + if(!mmio.dma_irqen && (data & 0x20) && mmio.dma_irqfl ) mmio.dma_irqcl = 0; + if(!mmio.sa1_nmien && (data & 0x10) && mmio.sa1_nmifl ) mmio.sa1_nmicl = 0; + + mmio.sa1_irqen = (data & 0x80); + mmio.timer_irqen = (data & 0x40); + mmio.dma_irqen = (data & 0x20); + mmio.sa1_nmien = (data & 0x10); +} + +//(CIC) SA-1 interrupt clear +void SA1::mmio_w220b(uint8_t data) { + mmio.sa1_irqcl = (data & 0x80); + mmio.timer_irqcl = (data & 0x40); + mmio.dma_irqcl = (data & 0x20); + mmio.sa1_nmicl = (data & 0x10); + + if(mmio.sa1_irqcl) mmio.sa1_irqfl = false; + if(mmio.timer_irqcl) mmio.timer_irqfl = false; + if(mmio.dma_irqcl) mmio.dma_irqfl = false; + if(mmio.sa1_nmicl) mmio.sa1_nmifl = false; +} + +//(SNV) S-CPU NMI vector +void SA1::mmio_w220c(uint8_t data) { mmio.snv = (mmio.snv & 0xff00) | data; } +void SA1::mmio_w220d(uint8_t data) { mmio.snv = (data << 8) | (mmio.snv & 0xff); } + +//(SIV) S-CPU IRQ vector +void SA1::mmio_w220e(uint8_t data) { mmio.siv = (mmio.siv & 0xff00) | data; } +void SA1::mmio_w220f(uint8_t data) { mmio.siv = (data << 8) | (mmio.siv & 0xff); } + +//(TMC) H/V timer control +void SA1::mmio_w2210(uint8_t data) { + mmio.hvselb = (data & 0x80); + mmio.ven = (data & 0x02); + mmio.hen = (data & 0x01); +} + +//(CTR) SA-1 timer restart +void SA1::mmio_w2211(uint8_t data) { + status.vcounter = 0; + status.hcounter = 0; +} + +//(HCNT) H-count +void SA1::mmio_w2212(uint8_t data) { mmio.hcnt = (mmio.hcnt & 0xff00) | (data << 0); } +void SA1::mmio_w2213(uint8_t data) { mmio.hcnt = (mmio.hcnt & 0x00ff) | (data << 8); } + +//(VCNT) V-count +void SA1::mmio_w2214(uint8_t data) { mmio.vcnt = (mmio.vcnt & 0xff00) | (data << 0); } +void SA1::mmio_w2215(uint8_t data) { mmio.vcnt = (mmio.vcnt & 0x00ff) | (data << 8); } + +//(CXB) Super MMC bank C +void SA1::mmio_w2220(uint8_t data) { + mmio.cbmode = (data & 0x80); + mmio.cb = (data & 0x07); + + unsigned addr = mmio.cb << 20; + Memory &access = mmio_access(addr); + + if(mmio.cbmode == 0) { + bus.map(Bus::MapLinear, 0x00, 0x1f, 0x8000, 0xffff, memory::cartrom, 0x000000); + sa1bus.map(Bus::MapLinear, 0x00, 0x1f, 0x8000, 0xffff, memory::cartrom, 0x000000); + } else { + bus.map(Bus::MapLinear, 0x00, 0x1f, 0x8000, 0xffff, access, addr); + sa1bus.map(Bus::MapLinear, 0x00, 0x1f, 0x8000, 0xffff, access, addr); + } + + bus.map(Bus::MapLinear, 0xc0, 0xcf, 0x0000, 0xffff, access, addr); + sa1bus.map(Bus::MapLinear, 0xc0, 0xcf, 0x0000, 0xffff, access, addr); + + memory::vectorsp.sync(); +} + +//(DXB) Super MMC bank D +void SA1::mmio_w2221(uint8_t data) { + mmio.dbmode = (data & 0x80); + mmio.db = (data & 0x07); + + unsigned addr = mmio.db << 20; + Memory &access = mmio_access(addr); + + if(mmio.dbmode == 0) { + bus.map(Bus::MapLinear, 0x20, 0x3f, 0x8000, 0xffff, memory::cartrom, 0x100000); + sa1bus.map(Bus::MapLinear, 0x20, 0x3f, 0x8000, 0xffff, memory::cartrom, 0x100000); + } else { + bus.map(Bus::MapLinear, 0x20, 0x3f, 0x8000, 0xffff, access, addr); + sa1bus.map(Bus::MapLinear, 0x20, 0x3f, 0x8000, 0xffff, access, addr); + } + + bus.map(Bus::MapLinear, 0xd0, 0xdf, 0x0000, 0xffff, access, addr); + sa1bus.map(Bus::MapLinear, 0xd0, 0xdf, 0x0000, 0xffff, access, addr); +} + +//(EXB) Super MMC bank E +void SA1::mmio_w2222(uint8_t data) { + mmio.ebmode = (data & 0x80); + mmio.eb = (data & 0x07); + + unsigned addr = mmio.eb << 20; + Memory &access = mmio_access(addr); + + if(mmio.ebmode == 0) { + bus.map(Bus::MapLinear, 0x80, 0x9f, 0x8000, 0xffff, memory::cartrom, 0x200000); + sa1bus.map(Bus::MapLinear, 0x80, 0x9f, 0x8000, 0xffff, memory::cartrom, 0x200000); + } else { + bus.map(Bus::MapLinear, 0x80, 0x9f, 0x8000, 0xffff, access, addr); + sa1bus.map(Bus::MapLinear, 0x80, 0x9f, 0x8000, 0xffff, access, addr); + } + + bus.map(Bus::MapLinear, 0xe0, 0xef, 0x0000, 0xffff, access, addr); + sa1bus.map(Bus::MapLinear, 0xe0, 0xef, 0x0000, 0xffff, access, addr); +} + +//(FXB) Super MMC bank F +void SA1::mmio_w2223(uint8_t data) { + mmio.fbmode = (data & 0x80); + mmio.fb = (data & 0x07); + + unsigned addr = mmio.fb << 20; + Memory &access = mmio_access(addr); + + if(mmio.fbmode == 0) { + bus.map(Bus::MapLinear, 0xa0, 0xbf, 0x8000, 0xffff, memory::cartrom, 0x300000); + sa1bus.map(Bus::MapLinear, 0xa0, 0xbf, 0x8000, 0xffff, memory::cartrom, 0x300000); + } else { + bus.map(Bus::MapLinear, 0xa0, 0xbf, 0x8000, 0xffff, access, addr); + sa1bus.map(Bus::MapLinear, 0xa0, 0xbf, 0x8000, 0xffff, access, addr); + } + + bus.map(Bus::MapLinear, 0xf0, 0xff, 0x0000, 0xffff, access, addr); + sa1bus.map(Bus::MapLinear, 0xf0, 0xff, 0x0000, 0xffff, access, addr); +} + +//(BMAPS) S-CPU BW-RAM address mapping +void SA1::mmio_w2224(uint8_t data) { + mmio.sbm = (data & 0x1f); + + bus.map(Bus::MapLinear, 0x00, 0x3f, 0x6000, 0x7fff, memory::cc1bwram, mmio.sbm * 0x2000, 0x2000); + bus.map(Bus::MapLinear, 0x80, 0xbf, 0x6000, 0x7fff, memory::cc1bwram, mmio.sbm * 0x2000, 0x2000); +} + +//(BMAP) SA-1 BW-RAM address mapping +void SA1::mmio_w2225(uint8_t data) { + mmio.sw46 = (data & 0x80); + mmio.cbm = (data & 0x7f); + + if(mmio.sw46 == 0) { + //$[40-43]:[0000-ffff] x 32 projection + sa1bus.map(Bus::MapLinear, 0x00, 0x3f, 0x6000, 0x7fff, memory::bwram, (mmio.cbm & 0x1f) * 0x2000, 0x2000); + sa1bus.map(Bus::MapLinear, 0x80, 0xbf, 0x6000, 0x7fff, memory::bwram, (mmio.cbm & 0x1f) * 0x2000, 0x2000); + } else { + //$[60-6f]:[0000-ffff] x 128 projection + sa1bus.map(Bus::MapLinear, 0x00, 0x3f, 0x6000, 0x7fff, memory::bitmapram, mmio.cbm * 0x2000, 0x2000); + sa1bus.map(Bus::MapLinear, 0x80, 0xbf, 0x6000, 0x7fff, memory::bitmapram, mmio.cbm * 0x2000, 0x2000); + } +} + +//(SWBE) S-CPU BW-RAM write enable +void SA1::mmio_w2226(uint8_t data) { + mmio.swen = (data & 0x80); +} + +//(CWBE) SA-1 BW-RAM write enable +void SA1::mmio_w2227(uint8_t data) { + mmio.cwen = (data & 0x80); +} + +//(BWPA) BW-RAM write-protected area +void SA1::mmio_w2228(uint8_t data) { + mmio.bwp = (data & 0x0f); +} + +//(SIWP) S-CPU I-RAM write protection +void SA1::mmio_w2229(uint8_t data) { + mmio.siwp = data; +} + +//(CIWP) SA-1 I-RAM write protection +void SA1::mmio_w222a(uint8_t data) { + mmio.ciwp = data; +} + +//(DCNT) DMA control +void SA1::mmio_w2230(uint8_t data) { + mmio.dmaen = (data & 0x80); + mmio.dprio = (data & 0x40); + mmio.cden = (data & 0x20); + mmio.cdsel = (data & 0x10); + mmio.dd = (data & 0x04); + mmio.sd = (data & 0x03); + + if(mmio.dmaen == 0) dma.line = 0; +} + +//(CDMA) character conversion DMA parameters +void SA1::mmio_w2231(uint8_t data) { + mmio.chdend = (data & 0x80); + mmio.dmasize = (data >> 2) & 7; + mmio.dmacb = (data & 0x03); + + if(mmio.chdend) memory::cc1bwram.dma = false; + if(mmio.dmasize > 5) mmio.dmasize = 5; + if(mmio.dmacb > 2) mmio.dmacb = 2; +} + +//(SDA) DMA source device start address +void SA1::mmio_w2232(uint8_t data) { mmio.dsa = (mmio.dsa & 0xffff00) | (data << 0); } +void SA1::mmio_w2233(uint8_t data) { mmio.dsa = (mmio.dsa & 0xff00ff) | (data << 8); } +void SA1::mmio_w2234(uint8_t data) { mmio.dsa = (mmio.dsa & 0x00ffff) | (data << 16); } + +//(DDA) DMA destination start address +void SA1::mmio_w2235(uint8_t data) { + mmio.dda = (mmio.dda & 0xffff00) | (data << 0); +} + +void SA1::mmio_w2236(uint8_t data) { + mmio.dda = (mmio.dda & 0xff00ff) | (data << 8); + + if(mmio.dmaen == true) { + if(mmio.cden == 0 && mmio.dd == DMA::DestIRAM) { + dma_normal(); + } else if(mmio.cden == 1 && mmio.cdsel == 1) { + dma_cc1(); + } + } +} + +void SA1::mmio_w2237(uint8_t data) { + mmio.dda = (mmio.dda & 0x00ffff) | (data << 16); + + if(mmio.dmaen == true) { + if(mmio.cden == 0 && mmio.dd == DMA::DestBWRAM) { + dma_normal(); + } + } +} + +//(DTC) DMA terminal counter +void SA1::mmio_w2238(uint8_t data) { mmio.dtc = (mmio.dtc & 0xff00) | (data << 0); } +void SA1::mmio_w2239(uint8_t data) { mmio.dtc = (mmio.dtc & 0x00ff) | (data << 8); } + +//(BBF) BW-RAM bitmap format +void SA1::mmio_w223f(uint8_t data) { + mmio.bbf = (data & 0x80); +} + +//(BRF) bitmap register files +void SA1::mmio_w2240(uint8_t data) { mmio.brf[ 0] = data; } +void SA1::mmio_w2241(uint8_t data) { mmio.brf[ 1] = data; } +void SA1::mmio_w2242(uint8_t data) { mmio.brf[ 2] = data; } +void SA1::mmio_w2243(uint8_t data) { mmio.brf[ 3] = data; } +void SA1::mmio_w2244(uint8_t data) { mmio.brf[ 4] = data; } +void SA1::mmio_w2245(uint8_t data) { mmio.brf[ 5] = data; } +void SA1::mmio_w2246(uint8_t data) { mmio.brf[ 6] = data; } +void SA1::mmio_w2247(uint8_t data) { mmio.brf[ 7] = data; + if(mmio.dmaen == true) { + if(mmio.cden == 1 && mmio.cdsel == 0) { + dma_cc2(); + } + } +} + +void SA1::mmio_w2248(uint8_t data) { mmio.brf[ 8] = data; } +void SA1::mmio_w2249(uint8_t data) { mmio.brf[ 9] = data; } +void SA1::mmio_w224a(uint8_t data) { mmio.brf[10] = data; } +void SA1::mmio_w224b(uint8_t data) { mmio.brf[11] = data; } +void SA1::mmio_w224c(uint8_t data) { mmio.brf[12] = data; } +void SA1::mmio_w224d(uint8_t data) { mmio.brf[13] = data; } +void SA1::mmio_w224e(uint8_t data) { mmio.brf[14] = data; } +void SA1::mmio_w224f(uint8_t data) { mmio.brf[15] = data; + if(mmio.dmaen == true) { + if(mmio.cden == 1 && mmio.cdsel == 0) { + dma_cc2(); + } + } +} + +//(MCNT) arithmetic control +void SA1::mmio_w2250(uint8_t data) { + mmio.acm = (data & 0x02); + mmio.md = (data & 0x01); + + if(mmio.acm) mmio.mr = 0; +} + +//(MAL) multiplicand / dividend low +void SA1::mmio_w2251(uint8_t data) { + mmio.ma = (mmio.ma & 0xff00) | data; +} + +//(MAH) multiplicand / dividend high +void SA1::mmio_w2252(uint8_t data) { + mmio.ma = (data << 8) | (mmio.ma & 0x00ff); +} + +//(MBL) multiplier / divisor low +void SA1::mmio_w2253(uint8_t data) { + mmio.mb = (mmio.mb & 0xff00) | data; +} + +//(MBH) multiplier / divisor high +//multiplication / cumulative sum only resets MB +//division resets both MA and MB +void SA1::mmio_w2254(uint8_t data) { + mmio.mb = (data << 8) | (mmio.mb & 0x00ff); + + if(mmio.acm == 0) { + if(mmio.md == 0) { + //signed multiplication + mmio.mr = (int16_t)mmio.ma * (int16_t)mmio.mb; + mmio.mb = 0; + } else { + //unsigned division + if(mmio.mb == 0) { + mmio.mr = 0; + } else { + int16_t quotient = (int16_t)mmio.ma / (uint16_t)mmio.mb; + uint16_t remainder = (int16_t)mmio.ma % (uint16_t)mmio.mb; + mmio.mr = (remainder << 16) | quotient; + } + mmio.ma = 0; + mmio.mb = 0; + } + } else { + //sigma (accumulative multiplication) + mmio.mr += (int16_t)mmio.ma * (int16_t)mmio.mb; + mmio.overflow = (mmio.mr >= (1ULL << 40)); + mmio.mr &= (1ULL << 40) - 1; + mmio.mb = 0; + } +} + +//(VBD) variable-length bit processing +void SA1::mmio_w2258(uint8_t data) { + mmio.hl = (data & 0x80); + mmio.vb = (data & 0x0f); + if(mmio.vb == 0) mmio.vb = 16; + + if(mmio.hl == 0) { + //fixed mode + mmio.vbit += mmio.vb; + mmio.va += (mmio.vbit >> 3); + mmio.vbit &= 7; + } +} + +//(VDA) variable-length bit game pak ROM start address +void SA1::mmio_w2259(uint8_t data) { mmio.va = (mmio.va & 0xffff00) | (data << 0); } +void SA1::mmio_w225a(uint8_t data) { mmio.va = (mmio.va & 0xff00ff) | (data << 8); } +void SA1::mmio_w225b(uint8_t data) { mmio.va = (mmio.va & 0x00ffff) | (data << 16); mmio.vbit = 0; } + +//(SFR) S-CPU flag read +uint8_t SA1::mmio_r2300() { + uint8_t data; + data = mmio.cpu_irqfl << 7; + data |= mmio.cpu_ivsw << 6; + data |= mmio.chdma_irqfl << 5; + data |= mmio.cpu_nvsw << 4; + data |= mmio.cmeg; + return data; +} + +//(CFR) SA-1 flag read +uint8_t SA1::mmio_r2301() { + uint8_t data; + data = mmio.sa1_irqfl << 7; + data |= mmio.timer_irqfl << 6; + data |= mmio.dma_irqfl << 5; + data |= mmio.sa1_nmifl << 4; + data |= mmio.smeg; + return data; +} + +//(HCR) hcounter read +uint8_t SA1::mmio_r2302() { + //latch counters + mmio.hcr = status.hcounter >> 2; + mmio.vcr = status.vcounter; + return mmio.hcr >> 0; } +uint8_t SA1::mmio_r2303() { return mmio.hcr >> 8; } + +//(VCR) vcounter read +uint8_t SA1::mmio_r2304() { return mmio.vcr >> 0; } +uint8_t SA1::mmio_r2305() { return mmio.vcr >> 8; } + +//(MR) arithmetic result +uint8_t SA1::mmio_r2306() { return mmio.mr >> 0; } +uint8_t SA1::mmio_r2307() { return mmio.mr >> 8; } +uint8_t SA1::mmio_r2308() { return mmio.mr >> 16; } +uint8_t SA1::mmio_r2309() { return mmio.mr >> 24; } +uint8_t SA1::mmio_r230a() { return mmio.mr >> 32; } + +//(OF) arithmetic overflow flag +uint8_t SA1::mmio_r230b() { return mmio.overflow << 7; } + +//(VDPL) variable-length data read port low +uint8_t SA1::mmio_r230c() { + uint32_t data = (sa1bus.read(mmio.va + 0) << 0) + | (sa1bus.read(mmio.va + 1) << 8) + | (sa1bus.read(mmio.va + 2) << 16); + data >>= mmio.vbit; + return data >> 0; +} + +//(VDPH) variable-length data read port high +uint8_t SA1::mmio_r230d() { + uint32_t data = (sa1bus.read(mmio.va + 0) << 0) + | (sa1bus.read(mmio.va + 1) << 8) + | (sa1bus.read(mmio.va + 2) << 16); + data >>= mmio.vbit; + + if(mmio.hl == 1) { + //auto-increment mode + mmio.vbit += mmio.vb; + mmio.va += (mmio.vbit >> 3); + mmio.vbit &= 7; + } + + return data >> 8; +} + +//(VC) version code register +uint8_t SA1::mmio_r230e() { + return 0x01; //true value unknown +} + +uint8_t SA1::mmio_read(unsigned addr) { + addr &= 0xffff; + + switch(addr) { + case 0x2300: return mmio_r2300(); + case 0x2301: return mmio_r2301(); + case 0x2302: return mmio_r2302(); + case 0x2303: return mmio_r2303(); + case 0x2304: return mmio_r2304(); + case 0x2305: return mmio_r2305(); + case 0x2306: return mmio_r2306(); + case 0x2307: return mmio_r2307(); + case 0x2308: return mmio_r2308(); + case 0x2309: return mmio_r2309(); + case 0x230a: return mmio_r230a(); + case 0x230b: return mmio_r230b(); + case 0x230c: return mmio_r230c(); + case 0x230d: return mmio_r230d(); + case 0x230e: return mmio_r230e(); + } + + return 0x00; +} + +void SA1::mmio_write(unsigned addr, uint8_t data) { + addr &= 0xffff; + + switch(addr) { + case 0x2200: return mmio_w2200(data); + case 0x2201: return mmio_w2201(data); + case 0x2202: return mmio_w2202(data); + case 0x2203: return mmio_w2203(data); + case 0x2204: return mmio_w2204(data); + case 0x2205: return mmio_w2205(data); + case 0x2206: return mmio_w2206(data); + case 0x2207: return mmio_w2207(data); + case 0x2208: return mmio_w2208(data); + case 0x2209: return mmio_w2209(data); + case 0x220a: return mmio_w220a(data); + case 0x220b: return mmio_w220b(data); + case 0x220c: return mmio_w220c(data); + case 0x220d: return mmio_w220d(data); + case 0x220e: return mmio_w220e(data); + case 0x220f: return mmio_w220f(data); + + case 0x2210: return mmio_w2210(data); + case 0x2211: return mmio_w2211(data); + case 0x2212: return mmio_w2212(data); + case 0x2213: return mmio_w2213(data); + case 0x2214: return mmio_w2214(data); + case 0x2215: return mmio_w2215(data); + + case 0x2220: return mmio_w2220(data); + case 0x2221: return mmio_w2221(data); + case 0x2222: return mmio_w2222(data); + case 0x2223: return mmio_w2223(data); + case 0x2224: return mmio_w2224(data); + case 0x2225: return mmio_w2225(data); + case 0x2226: return mmio_w2226(data); + case 0x2227: return mmio_w2227(data); + case 0x2228: return mmio_w2228(data); + case 0x2229: return mmio_w2229(data); + case 0x222a: return mmio_w222a(data); + + case 0x2230: return mmio_w2230(data); + case 0x2231: return mmio_w2231(data); + case 0x2232: return mmio_w2232(data); + case 0x2233: return mmio_w2233(data); + case 0x2234: return mmio_w2234(data); + case 0x2235: return mmio_w2235(data); + case 0x2236: return mmio_w2236(data); + case 0x2237: return mmio_w2237(data); + case 0x2238: return mmio_w2238(data); + case 0x2239: return mmio_w2239(data); + + case 0x223f: return mmio_w223f(data); + case 0x2240: return mmio_w2240(data); + case 0x2241: return mmio_w2241(data); + case 0x2242: return mmio_w2242(data); + case 0x2243: return mmio_w2243(data); + case 0x2244: return mmio_w2244(data); + case 0x2245: return mmio_w2245(data); + case 0x2246: return mmio_w2246(data); + case 0x2247: return mmio_w2247(data); + case 0x2248: return mmio_w2248(data); + case 0x2249: return mmio_w2249(data); + case 0x224a: return mmio_w224a(data); + case 0x224b: return mmio_w224b(data); + case 0x224c: return mmio_w224c(data); + case 0x224d: return mmio_w224d(data); + case 0x224e: return mmio_w224e(data); + case 0x224f: return mmio_w224f(data); + + case 0x2250: return mmio_w2250(data); + case 0x2251: return mmio_w2251(data); + case 0x2252: return mmio_w2252(data); + case 0x2253: return mmio_w2253(data); + case 0x2254: return mmio_w2254(data); + + case 0x2258: return mmio_w2258(data); + case 0x2259: return mmio_w2259(data); + case 0x225a: return mmio_w225a(data); + case 0x225b: return mmio_w225b(data); + } +} + +#endif diff --git a/tools/bsnes/chip/sa1/mmio/mmio.hpp b/tools/bsnes/chip/sa1/mmio/mmio.hpp new file mode 100755 index 0000000..01dced2 --- /dev/null +++ b/tools/bsnes/chip/sa1/mmio/mmio.hpp @@ -0,0 +1,256 @@ +uint8_t mmio_read(unsigned addr); +void mmio_write(unsigned addr, uint8_t data); +Memory& mmio_access(unsigned &addr); + +struct MMIO { + //$2200 CCNT + bool sa1_irq; + bool sa1_rdyb; + bool sa1_resb; + bool sa1_nmi; + uint8_t smeg; + + //$2201 SIE + bool cpu_irqen; + bool chdma_irqen; + + //$2202 SIC + bool cpu_irqcl; + bool chdma_irqcl; + + //$2203,$2204 CRV + uint16_t crv; + + //$2205,$2206 CNV + uint16_t cnv; + + //$2207,$2208 CIV + uint16_t civ; + + //$2209 SCNT + bool cpu_irq; + bool cpu_ivsw; + bool cpu_nvsw; + uint8_t cmeg; + + //$220a CIE + bool sa1_irqen; + bool timer_irqen; + bool dma_irqen; + bool sa1_nmien; + + //$220b CIC + bool sa1_irqcl; + bool timer_irqcl; + bool dma_irqcl; + bool sa1_nmicl; + + //$220c,$220d SNV + uint16_t snv; + + //$220e,$220f SIV + uint16_t siv; + + //$2210 TMC + bool hvselb; + bool ven; + bool hen; + + //$2212,$2213 + uint16_t hcnt; + + //$2214,$2215 + uint16_t vcnt; + + //$2220 CXB + bool cbmode; + uint8_t cb; + + //$2221 DXB + bool dbmode; + uint8_t db; + + //$2222 EXB + bool ebmode; + uint8_t eb; + + //$2223 FXB + bool fbmode; + uint8_t fb; + + //$2224 BMAPS + uint8_t sbm; + + //$2225 BMAP + bool sw46; + uint8_t cbm; + + //$2226 SBWE + bool swen; + + //$2227 CBWE + bool cwen; + + //$2228 BWPA + uint8_t bwp; + + //$2229 SIWP + uint8_t siwp; + + //$222a CIWP + uint8_t ciwp; + + //$2230 DCNT + bool dmaen; + bool dprio; + bool cden; + bool cdsel; + bool dd; + uint8_t sd; + + //$2231 CDMA + bool chdend; + uint8_t dmasize; + uint8_t dmacb; + + //$2232-$2234 SDA + uint32_t dsa; + + //$2235-$2237 DDA + uint32_t dda; + + //$2238,$2239 DTC + uint16_t dtc; + + //$223f BBF + bool bbf; + + //$2240-224f BRF + uint8_t brf[16]; + + //$2250 MCNT + bool acm; + bool md; + + //$2251,$2252 MA + uint16_t ma; + + //$2253,$2254 MB + uint16_t mb; + + //$2258 VBD + bool hl; + uint8_t vb; + + //$2259-$225b VDA + uint32_t va; + uint8_t vbit; + + //$2300 SFR + bool cpu_irqfl; + bool chdma_irqfl; + + //$2301 CFR + bool sa1_irqfl; + bool timer_irqfl; + bool dma_irqfl; + bool sa1_nmifl; + + //$2302,$2303 HCR + uint16_t hcr; + + //$2304,$2305 VCR + uint16_t vcr; + + //$2306-230a MR + uint64_t mr; + + //$230b OF + bool overflow; +} mmio; + +void mmio_w2200(uint8_t); //CCNT +void mmio_w2201(uint8_t); //SIE +void mmio_w2202(uint8_t); //SIC +void mmio_w2203(uint8_t); //CRVL +void mmio_w2204(uint8_t); //CRVH +void mmio_w2205(uint8_t); //CNVL +void mmio_w2206(uint8_t); //CNVH +void mmio_w2207(uint8_t); //CIVL +void mmio_w2208(uint8_t); //CIVH +void mmio_w2209(uint8_t); //SCNT +void mmio_w220a(uint8_t); //CIE +void mmio_w220b(uint8_t); //CIC +void mmio_w220c(uint8_t); //SNVL +void mmio_w220d(uint8_t); //SNVH +void mmio_w220e(uint8_t); //SIVL +void mmio_w220f(uint8_t); //SIVH +void mmio_w2210(uint8_t); //TMC +void mmio_w2211(uint8_t); //CTR +void mmio_w2212(uint8_t); //HCNTL +void mmio_w2213(uint8_t); //HCNTH +void mmio_w2214(uint8_t); //VCNTL +void mmio_w2215(uint8_t); //VCNTH +void mmio_w2220(uint8_t); //CXB +void mmio_w2221(uint8_t); //DXB +void mmio_w2222(uint8_t); //EXB +void mmio_w2223(uint8_t); //FXB +void mmio_w2224(uint8_t); //BMAPS +void mmio_w2225(uint8_t); //BMAP +void mmio_w2226(uint8_t); //SBWE +void mmio_w2227(uint8_t); //CBWE +void mmio_w2228(uint8_t); //BWPA +void mmio_w2229(uint8_t); //SIWP +void mmio_w222a(uint8_t); //CIWP +void mmio_w2230(uint8_t); //DCNT +void mmio_w2231(uint8_t); //CDMA +void mmio_w2232(uint8_t); //SDAL +void mmio_w2233(uint8_t); //SDAH +void mmio_w2234(uint8_t); //SDAB +void mmio_w2235(uint8_t); //DDAL +void mmio_w2236(uint8_t); //DDAH +void mmio_w2237(uint8_t); //DDAB +void mmio_w2238(uint8_t); //DTCL +void mmio_w2239(uint8_t); //DTCH +void mmio_w223f(uint8_t); //BBF +void mmio_w2240(uint8_t); //BRF0 +void mmio_w2241(uint8_t); //BRF1 +void mmio_w2242(uint8_t); //BRF2 +void mmio_w2243(uint8_t); //BRF3 +void mmio_w2244(uint8_t); //BRF4 +void mmio_w2245(uint8_t); //BRF5 +void mmio_w2246(uint8_t); //BRF6 +void mmio_w2247(uint8_t); //BRF7 +void mmio_w2248(uint8_t); //BRF8 +void mmio_w2249(uint8_t); //BRF9 +void mmio_w224a(uint8_t); //BRFA +void mmio_w224b(uint8_t); //BRFB +void mmio_w224c(uint8_t); //BRFC +void mmio_w224d(uint8_t); //BRFD +void mmio_w224e(uint8_t); //BRFE +void mmio_w224f(uint8_t); //BRFF +void mmio_w2250(uint8_t); //MCNT +void mmio_w2251(uint8_t); //MAL +void mmio_w2252(uint8_t); //MAH +void mmio_w2253(uint8_t); //MBL +void mmio_w2254(uint8_t); //MBH +void mmio_w2258(uint8_t); //VBD +void mmio_w2259(uint8_t); //VDAL +void mmio_w225a(uint8_t); //VDAH +void mmio_w225b(uint8_t); //VDAB + +uint8_t mmio_r2300(); //SFR +uint8_t mmio_r2301(); //CFR +uint8_t mmio_r2302(); //HCRL +uint8_t mmio_r2303(); //HCRH +uint8_t mmio_r2304(); //VCRL +uint8_t mmio_r2305(); //VCRH +uint8_t mmio_r2306(); //MR [00-07] +uint8_t mmio_r2307(); //MR [08-15] +uint8_t mmio_r2308(); //MR [16-23] +uint8_t mmio_r2309(); //MR [24-31] +uint8_t mmio_r230a(); //MR [32-40] +uint8_t mmio_r230b(); //OF +uint8_t mmio_r230c(); //VDPL +uint8_t mmio_r230d(); //VDPH +uint8_t mmio_r230e(); //VC diff --git a/tools/bsnes/chip/sa1/sa1.cpp b/tools/bsnes/chip/sa1/sa1.cpp new file mode 100755 index 0000000..cd822dd --- /dev/null +++ b/tools/bsnes/chip/sa1/sa1.cpp @@ -0,0 +1,318 @@ +#include <../base.hpp> + +#define SA1_CPP +namespace SNES { + +SA1 sa1; + +#include "bus/bus.cpp" +#include "dma/dma.cpp" +#include "memory/memory.cpp" +#include "mmio/mmio.cpp" + +void SA1::enter() { + while(true) { + while(mmio.sa1_rdyb || mmio.sa1_resb) { + //SA-1 co-processor is asleep + tick(); + scheduler.sync_copcpu(); + } + + if(status.interrupt_pending) { + status.interrupt_pending = false; + interrupt(status.interrupt_vector); + } + + (this->*opcode_table[op_readpc()])(); + } +} + +void SA1::last_cycle() { + if(mmio.sa1_nmi && !mmio.sa1_nmicl) { + status.interrupt_pending = true; + status.interrupt_vector = mmio.cnv; + mmio.sa1_nmifl = true; + mmio.sa1_nmicl = 1; + regs.wai = false; + } else if(!regs.p.i) { + if(mmio.timer_irqen && !mmio.timer_irqcl) { + status.interrupt_pending = true; + status.interrupt_vector = mmio.civ; + mmio.timer_irqfl = true; + regs.wai = false; + } else if(mmio.dma_irqen && !mmio.dma_irqcl) { + status.interrupt_pending = true; + status.interrupt_vector = mmio.civ; + mmio.dma_irqfl = true; + regs.wai = false; + } else if(mmio.sa1_irq && !mmio.sa1_irqcl) { + status.interrupt_pending = true; + status.interrupt_vector = mmio.civ; + mmio.sa1_irqfl = true; + regs.wai = false; + } + } +} + +void SA1::interrupt(uint16_t vector) { + op_read(regs.pc.d); + op_io(); + if(!regs.e) op_writestack(regs.pc.b); + op_writestack(regs.pc.h); + op_writestack(regs.pc.l); + op_writestack(regs.e ? (regs.p & ~0x10) : regs.p); + regs.pc.w = vector; + regs.pc.b = 0x00; + regs.p.i = 1; + regs.p.d = 0; +} + +bool SA1::interrupt_pending() { + return status.interrupt_pending; +} + +void SA1::tick() { + scheduler.addclocks_cop(2); + + //adjust counters: + //note that internally, status counters are in clocks; + //whereas MMIO register counters are in dots (4 clocks = 1 dot) + if(mmio.hvselb == 0) { + //HV timer + status.hcounter += 2; + if(status.hcounter >= 1364) { + status.hcounter = 0; + if(++status.vcounter >= status.scanlines) status.vcounter = 0; + } + } else { + //linear timer + status.hcounter += 2; + status.vcounter += (status.hcounter >> 11); + status.hcounter &= 0x07ff; + status.vcounter &= 0x01ff; + } + + //test counters for timer IRQ + switch((mmio.ven << 1) + (mmio.hen << 0)) { + case 0: break; + case 1: if(status.hcounter == (mmio.hcnt << 2)) trigger_irq(); break; + case 2: if(status.vcounter == mmio.vcnt && status.hcounter == 0) trigger_irq(); break; + case 3: if(status.vcounter == mmio.hcnt && status.hcounter == (mmio.hcnt << 2)) trigger_irq(); break; + } +} + +void SA1::trigger_irq() { + mmio.timer_irqfl = true; + if(mmio.timer_irqen) mmio.timer_irqcl = 0; +} + +void SA1::init() { +} + +void SA1::enable() { +} + +void SA1::power() { + regs.a = regs.x = regs.y = 0x0000; + regs.s = 0x01ff; + + reset(); +} + +void SA1::reset() { + memory::vectorsp.access = 0; + memory::cc1bwram.dma = false; + for(unsigned addr = 0; addr < memory::iram.size(); addr++) { + memory::iram.write(addr, 0x00); + } + sa1bus.init(); + + regs.pc.d = 0x000000; + regs.x.h = 0x00; + regs.y.h = 0x00; + regs.s.h = 0x01; + regs.d = 0x0000; + regs.db = 0x00; + regs.p = 0x34; + regs.e = 1; + regs.mdr = 0x00; + regs.wai = false; + update_table(); + + status.interrupt_pending = false; + status.interrupt_vector = 0x0000; + + status.scanlines = (system.region() == System::NTSC ? 262 : 312); + status.vcounter = 0; + status.hcounter = 0; + + dma.line = 0; + + //$2200 CCNT + mmio.sa1_irq = false; + mmio.sa1_rdyb = false; + mmio.sa1_resb = true; + mmio.sa1_nmi = false; + mmio.smeg = 0; + + //$2201 SIE + mmio.cpu_irqen = false; + mmio.chdma_irqen = false; + + //$2202 SIC + mmio.cpu_irqcl = false; + mmio.chdma_irqcl = false; + + //$2203,$2204 CRV + mmio.crv = 0x0000; + + //$2205,$2206 CNV + mmio.cnv = 0x0000; + + //$2207,$2208 CIV + mmio.civ = 0x0000; + + //$2209 SCNT + mmio.cpu_irq = false; + mmio.cpu_ivsw = false; + mmio.cpu_nvsw = false; + mmio.cmeg = 0; + + //$220a CIE + mmio.sa1_irqen = false; + mmio.timer_irqen = false; + mmio.dma_irqen = false; + mmio.sa1_nmien = false; + + //$220b CIC + mmio.sa1_irqcl = false; + mmio.timer_irqcl = false; + mmio.dma_irqcl = false; + mmio.sa1_nmicl = false; + + //$220c,$220d SNV + mmio.snv = 0x0000; + + //$220e,$220f SIV + mmio.siv = 0x0000; + + //$2210 + mmio.hvselb = false; + mmio.ven = false; + mmio.hen = false; + + //$2212,$2213 HCNT + mmio.hcnt = 0x0000; + + //$2214,$2215 VCNT + mmio.vcnt = 0x0000; + + //$2220-2223 CXB, DXB, EXB, FXB + mmio.cbmode = 0; + mmio.dbmode = 0; + mmio.ebmode = 0; + mmio.fbmode = 0; + + mmio.cb = 0x00; + mmio.db = 0x01; + mmio.eb = 0x02; + mmio.fb = 0x03; + + //$2224 BMAPS + mmio.sbm = 0x00; + + //$2225 BMAP + mmio.sw46 = false; + mmio.cbm = 0x00; + + //$2226 SWBE + mmio.swen = false; + + //$2227 CWBE + mmio.cwen = false; + + //$2228 BWPA + mmio.bwp = 0x0f; + + //$2229 SIWP + mmio.siwp = 0x00; + + //$222a CIWP + mmio.ciwp = 0x00; + + //$2230 DCNT + mmio.dmaen = false; + mmio.dprio = false; + mmio.cden = false; + mmio.cdsel = false; + mmio.dd = 0; + mmio.sd = 0; + + //$2231 CDMA + mmio.chdend = false; + mmio.dmasize = 0; + mmio.dmacb = 0; + + //$2232-$2234 SDA + mmio.dsa = 0x000000; + + //$2235-$2237 DDA + mmio.dda = 0x000000; + + //$2238,$2239 DTC + mmio.dtc = 0x0000; + + //$223f BBF + mmio.bbf = 0; + + //$2240-$224f BRF + for(unsigned i = 0; i < 16; i++) { + mmio.brf[i] = 0x00; + } + + //$2250 MCNT + mmio.acm = 0; + mmio.md = 0; + + //$2251,$2252 MA + mmio.ma = 0x0000; + + //$2253,$2254 MB + mmio.mb = 0x0000; + + //$2258 VBD + mmio.hl = false; + mmio.vb = 16; + + //$2259-$225b + mmio.va = 0x000000; + mmio.vbit = 0; + + //$2300 SFR + mmio.cpu_irqfl = false; + mmio.chdma_irqfl = false; + + //$2301 CFR + mmio.sa1_irqfl = false; + mmio.timer_irqfl = false; + mmio.dma_irqfl = false; + mmio.sa1_nmifl = false; + + //$2302,$2303 HCR + mmio.hcr = 0x0000; + + //$2304,$2305 VCR + mmio.vcr = 0x0000; + + //$2306-$230a MR + mmio.mr = 0; + + //$230b + mmio.overflow = false; +} + +SA1::SA1() { +} + +}; + diff --git a/tools/bsnes/chip/sa1/sa1.hpp b/tools/bsnes/chip/sa1/sa1.hpp new file mode 100755 index 0000000..6c87611 --- /dev/null +++ b/tools/bsnes/chip/sa1/sa1.hpp @@ -0,0 +1,35 @@ +#include "bus/bus.hpp" + +class SA1 : public CPUcore, public MMIO { +public: + #include "dma/dma.hpp" + #include "memory/memory.hpp" + #include "mmio/mmio.hpp" + + struct Status { + bool interrupt_pending; + uint16_t interrupt_vector; + + uint16_t scanlines; + uint16_t vcounter; + uint16_t hcounter; + } status; + + void enter(); + void interrupt(uint16_t vector); + void tick(); + + alwaysinline void trigger_irq(); + alwaysinline void last_cycle(); + alwaysinline bool interrupt_pending(); + + void init(); + void enable(); + void power(); + void reset(); + + SA1(); +}; + +extern SA1 sa1; +extern SA1Bus sa1bus; diff --git a/tools/bsnes/chip/sgb/sgb.cpp b/tools/bsnes/chip/sgb/sgb.cpp new file mode 100755 index 0000000..e1af795 --- /dev/null +++ b/tools/bsnes/chip/sgb/sgb.cpp @@ -0,0 +1,66 @@ +#include <../base.hpp> + +#define SGB_CPP +namespace SNES { + +SuperGameBoy sgb; + +void SuperGameBoy::enter() { + while(true) { + if(sgb_run) { + unsigned samples = sgb_run(samplebuffer, 16); + scheduler.addclocks_cop(samples * 10); + scheduler.sync_copcpu(); + } else { + scheduler.addclocks_cop(64 * 1024 * 1024); + scheduler.sync_copcpu(); + } + } +} + +uint8_t SuperGameBoy::read(unsigned addr) { + addr &= 0xffff; + if(sgb_read) return sgb_read(addr); + return 0x00; +} + +void SuperGameBoy::write(unsigned addr, uint8_t data) { + addr &= 0xffff; + if(sgb_write) return sgb_write(addr, data); +} + +void SuperGameBoy::init() { + if(libsgb.open("SuperGameBoy")) { + sgb_init = libsgb.sym("sgb_init"); + sgb_term = libsgb.sym("sgb_term"); + sgb_power = libsgb.sym("sgb_power"); + sgb_reset = libsgb.sym("sgb_reset"); + sgb_read = libsgb.sym("sgb_read"); + sgb_write = libsgb.sym("sgb_write"); + sgb_run = libsgb.sym("sgb_run"); + } +} + +void SuperGameBoy::enable() { +} + +void SuperGameBoy::power() { + bus.map(Bus::MapDirect, 0x00, 0x3f, 0x6000, 0x7fff, *this); + bus.map(Bus::MapDirect, 0x80, 0xbf, 0x6000, 0x7fff, *this); + + if(sgb_init) { + sgb_init(SGB2, + memory::gbrom.data(), memory::gbrom.size(), + memory::gbram.data(), memory::gbram.size() + ); + } + + if(sgb_power) sgb_power(); +} + +void SuperGameBoy::reset() { + if(sgb_reset) sgb_reset(); +} + +}; + diff --git a/tools/bsnes/chip/sgb/sgb.hpp b/tools/bsnes/chip/sgb/sgb.hpp new file mode 100755 index 0000000..53e5f3f --- /dev/null +++ b/tools/bsnes/chip/sgb/sgb.hpp @@ -0,0 +1,28 @@ +class SuperGameBoy : public Memory { +public: + void enter(); + + uint8_t read(unsigned addr); + void write(unsigned addr, uint8_t data); + + void init(); + void enable(); + void power(); + void reset(); + +private: + library libsgb; + uint32_t samplebuffer[4096]; + + enum { SGB1 = 0, SGB2 = 1 }; + function sgb_init; + function sgb_term; + function sgb_power; + function sgb_reset; + function sgb_read; + function sgb_write; + function sgb_run; +}; + +extern SuperGameBoy sgb; + diff --git a/tools/bsnes/cpu/core/bpp.sh b/tools/bsnes/cpu/core/bpp.sh new file mode 100755 index 0000000..684413a --- /dev/null +++ b/tools/bsnes/cpu/core/bpp.sh @@ -0,0 +1,3 @@ +clear +bpp opcode_functions.cpp opcode_functions.bpp +bpp opcode_headers.hpp opcode_headers.bpp diff --git a/tools/bsnes/cpu/core/core.cpp b/tools/bsnes/cpu/core/core.cpp new file mode 100755 index 0000000..6506cf6 --- /dev/null +++ b/tools/bsnes/cpu/core/core.cpp @@ -0,0 +1,51 @@ +#include <../base.hpp> + +#define CPUCORE_CPP +namespace SNES { + +#include "opcode_algorithms.cpp" +#include "opcode_functions.cpp" +#include "opcode_tables.cpp" +#include "disasm/disasm.cpp" + +//immediate, 2-cycle opcodes with I/O cycle will become bus read +//when an IRQ is to be triggered immediately after opcode completion. +//this affects the following opcodes: +// clc, cld, cli, clv, sec, sed, sei, +// tax, tay, txa, txy, tya, tyx, +// tcd, tcs, tdc, tsc, tsx, txs, +// inc, inx, iny, dec, dex, dey, +// asl, lsr, rol, ror, nop, xce. +alwaysinline void CPUcore::op_io_irq() { + if(interrupt_pending()) { + //modify I/O cycle to bus read cycle, do not increment PC + op_read(regs.pc.d); + } else { + op_io(); + } +} + +alwaysinline void CPUcore::op_io_cond2() { + if(regs.d.l != 0x00) { + op_io(); + } +} + +alwaysinline void CPUcore::op_io_cond4(uint16 x, uint16 y) { + if(!regs.p.x || (x & 0xff00) != (y & 0xff00)) { + op_io(); + } +} + +alwaysinline void CPUcore::op_io_cond6(uint16 addr) { + if(regs.e && (regs.pc.w & 0xff00) != (addr & 0xff00)) { + op_io(); + } +} + +CPUcore::CPUcore() { + initialize_opcode_table(); +} + +}; + diff --git a/tools/bsnes/cpu/core/core.hpp b/tools/bsnes/cpu/core/core.hpp new file mode 100755 index 0000000..fd75bd4 --- /dev/null +++ b/tools/bsnes/cpu/core/core.hpp @@ -0,0 +1,79 @@ +class CPUcore { +public: + #include "registers.hpp" + #include "memory.hpp" + #include "opcode_headers.hpp" + #include "disasm/disasm.hpp" + + regs_t regs; + reg24_t aa, rd; + uint8_t sp, dp; + + virtual void op_io() = 0; + virtual uint8_t op_read(uint32_t addr) = 0; + virtual void op_write(uint32_t addr, uint8_t data) = 0; + virtual void last_cycle() = 0; + virtual bool interrupt_pending() = 0; + + void op_io_irq(); + void op_io_cond2(); + void op_io_cond4(uint16 x, uint16 y); + void op_io_cond6(uint16 addr); + + void op_adc_b(); + void op_adc_w(); + void op_and_b(); + void op_and_w(); + void op_bit_b(); + void op_bit_w(); + void op_cmp_b(); + void op_cmp_w(); + void op_cpx_b(); + void op_cpx_w(); + void op_cpy_b(); + void op_cpy_w(); + void op_eor_b(); + void op_eor_w(); + void op_lda_b(); + void op_lda_w(); + void op_ldx_b(); + void op_ldx_w(); + void op_ldy_b(); + void op_ldy_w(); + void op_ora_b(); + void op_ora_w(); + void op_sbc_b(); + void op_sbc_w(); + + void op_inc_b(); + void op_inc_w(); + void op_dec_b(); + void op_dec_w(); + void op_asl_b(); + void op_asl_w(); + void op_lsr_b(); + void op_lsr_w(); + void op_rol_b(); + void op_rol_w(); + void op_ror_b(); + void op_ror_w(); + void op_trb_b(); + void op_trb_w(); + void op_tsb_b(); + void op_tsb_w(); + + void (CPUcore::**opcode_table)(); + void (CPUcore::*op_table[256 * 5])(); + void initialize_opcode_table(); + void update_table(); + + enum { + table_EM = 0, // 8-bit accumulator, 8-bit index (emulation mode) + table_MX = 256, // 8-bit accumulator, 8-bit index + table_Mx = 512, // 8-bit accumulator, 16-bit index + table_mX = 768, //16-bit accumulator, 8-bit index + table_mx = 1024, //16-bit accumulator, 16-bit index + }; + + CPUcore(); +}; diff --git a/tools/bsnes/cpu/core/disasm/disasm.cpp b/tools/bsnes/cpu/core/disasm/disasm.cpp new file mode 100755 index 0000000..ecfd1db --- /dev/null +++ b/tools/bsnes/cpu/core/disasm/disasm.cpp @@ -0,0 +1,479 @@ +uint8 CPUcore::dreadb(uint32 addr) { + if((addr & 0x40ffff) >= 0x2000 && (addr & 0x40ffff) <= 0x5fff) { + //$[00-3f|80-bf]:[2000-5fff] + //do not read MMIO registers within debugger + return 0x00; + } + return bus.read(addr); +} + +uint16 CPUcore::dreadw(uint32 addr) { + uint16 r; + r = dreadb((addr + 0) & 0xffffff) << 0; + r |= dreadb((addr + 1) & 0xffffff) << 8; + return r; +} + +uint32 CPUcore::dreadl(uint32 addr) { + uint32 r; + r = dreadb((addr + 0) & 0xffffff) << 0; + r |= dreadb((addr + 1) & 0xffffff) << 8; + r |= dreadb((addr + 2) & 0xffffff) << 16; + return r; +} + +uint32 CPUcore::decode(uint8 offset_type, uint32 addr) { + uint32 r = 0; + + switch(offset_type) { + case OPTYPE_DP: + r = (regs.d + (addr & 0xffff)) & 0xffff; + break; + case OPTYPE_DPX: + r = (regs.d + regs.x + (addr & 0xffff)) & 0xffff; + break; + case OPTYPE_DPY: + r = (regs.d + regs.y + (addr & 0xffff)) & 0xffff; + break; + case OPTYPE_IDP: + addr = (regs.d + (addr & 0xffff)) & 0xffff; + r = (regs.db << 16) + dreadw(addr); + break; + case OPTYPE_IDPX: + addr = (regs.d + regs.x + (addr & 0xffff)) & 0xffff; + r = (regs.db << 16) + dreadw(addr); + break; + case OPTYPE_IDPY: + addr = (regs.d + (addr & 0xffff)) & 0xffff; + r = (regs.db << 16) + dreadw(addr) + regs.y; + break; + case OPTYPE_ILDP: + addr = (regs.d + (addr & 0xffff)) & 0xffff; + r = dreadl(addr); + break; + case OPTYPE_ILDPY: + addr = (regs.d + (addr & 0xffff)) & 0xffff; + r = dreadl(addr) + regs.y; + break; + case OPTYPE_ADDR: + r = (regs.db << 16) + (addr & 0xffff); + break; + case OPTYPE_ADDR_PC: + r = (regs.pc.b << 16) + (addr & 0xffff); + break; + case OPTYPE_ADDRX: + r = (regs.db << 16) + (addr & 0xffff) + regs.x; + break; + case OPTYPE_ADDRY: + r = (regs.db << 16) + (addr & 0xffff) + regs.y; + break; + case OPTYPE_IADDR_PC: + r = (regs.pc.b << 16) + (addr & 0xffff); + break; + case OPTYPE_IADDRX: + r = (regs.pc.b << 16) + ((addr + regs.x) & 0xffff); + break; + case OPTYPE_ILADDR: + r = addr; + break; + case OPTYPE_LONG: + r = addr; + break; + case OPTYPE_LONGX: + r = (addr + regs.x); + break; + case OPTYPE_SR: + r = (regs.s + (addr & 0xff)) & 0xffff; + break; + case OPTYPE_ISRY: + addr = (regs.s + (addr & 0xff)) & 0xffff; + r = (regs.db << 16) + dreadw(addr) + regs.y; + break; + case OPTYPE_RELB: + r = (regs.pc.b << 16) + ((regs.pc.w + 2) & 0xffff); + r += int8(addr); + break; + case OPTYPE_RELW: + r = (regs.pc.b << 16) + ((regs.pc.w + 3) & 0xffff); + r += int16(addr); + break; + } + + return(r & 0xffffff); +} + +void CPUcore::disassemble_opcode(char *output) { + static reg24_t pc; + char t[256]; + char *s = output; + + if(false /* in_opcode() == true */) { + strcpy(s, "?????? "); + return; + } + + pc.d = regs.pc.d; + sprintf(s, "%.6x ", (uint32)pc.d); + + uint8 op = dreadb(pc.d); pc.w++; + uint8 op0 = dreadb(pc.d); pc.w++; + uint8 op1 = dreadb(pc.d); pc.w++; + uint8 op2 = dreadb(pc.d); + + #define op8 ((op0)) + #define op16 ((op0) | (op1 << 8)) + #define op24 ((op0) | (op1 << 8) | (op2 << 16)) + #define a8 (regs.e || regs.p.m) + #define x8 (regs.e || regs.p.x) + + switch(op) { + case 0x00: sprintf(t, "brk #$%.2x ", op8); break; + case 0x01: sprintf(t, "ora ($%.2x,x) [$%.6x]", op8, decode(OPTYPE_IDPX, op8)); break; + case 0x02: sprintf(t, "cop #$%.2x ", op8); break; + case 0x03: sprintf(t, "ora $%.2x,s [$%.6x]", op8, decode(OPTYPE_SR, op8)); break; + case 0x04: sprintf(t, "tsb $%.2x [$%.6x]", op8, decode(OPTYPE_DP, op8)); break; + case 0x05: sprintf(t, "ora $%.2x [$%.6x]", op8, decode(OPTYPE_DP, op8)); break; + case 0x06: sprintf(t, "asl $%.2x [$%.6x]", op8, decode(OPTYPE_DP, op8)); break; + case 0x07: sprintf(t, "ora [$%.2x] [$%.6x]", op8, decode(OPTYPE_ILDP, op8)); break; + case 0x08: sprintf(t, "php "); break; + case 0x09: if(a8)sprintf(t, "ora #$%.2x ", op8); + else sprintf(t, "ora #$%.4x ", op16); break; + case 0x0a: sprintf(t, "asl a "); break; + case 0x0b: sprintf(t, "phd "); break; + case 0x0c: sprintf(t, "tsb $%.4x [$%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; + case 0x0d: sprintf(t, "ora $%.4x [$%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; + case 0x0e: sprintf(t, "asl $%.4x [$%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; + case 0x0f: sprintf(t, "ora $%.6x [$%.6x]", op24, decode(OPTYPE_LONG, op24)); break; + case 0x10: sprintf(t, "bpl $%.4x [$%.6x]", uint16(decode(OPTYPE_RELB, op8)), decode(OPTYPE_RELB, op8)); break; + case 0x11: sprintf(t, "ora ($%.2x),y [$%.6x]", op8, decode(OPTYPE_IDPY, op8)); break; + case 0x12: sprintf(t, "ora ($%.2x) [$%.6x]", op8, decode(OPTYPE_IDP, op8)); break; + case 0x13: sprintf(t, "ora ($%.2x,s),y [$%.6x]", op8, decode(OPTYPE_ISRY, op8)); break; + case 0x14: sprintf(t, "trb $%.2x [$%.6x]", op8, decode(OPTYPE_DP, op8)); break; + case 0x15: sprintf(t, "ora $%.2x,x [$%.6x]", op8, decode(OPTYPE_DPX, op8)); break; + case 0x16: sprintf(t, "asl $%.2x,x [$%.6x]", op8, decode(OPTYPE_DPX, op8)); break; + case 0x17: sprintf(t, "ora [$%.2x],y [$%.6x]", op8, decode(OPTYPE_ILDPY, op8)); break; + case 0x18: sprintf(t, "clc "); break; + case 0x19: sprintf(t, "ora $%.4x,y [$%.6x]", op16, decode(OPTYPE_ADDRY, op16)); break; + case 0x1a: sprintf(t, "inc "); break; + case 0x1b: sprintf(t, "tcs "); break; + case 0x1c: sprintf(t, "trb $%.4x [$%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; + case 0x1d: sprintf(t, "ora $%.4x,x [$%.6x]", op16, decode(OPTYPE_ADDRX, op16)); break; + case 0x1e: sprintf(t, "asl $%.4x,x [$%.6x]", op16, decode(OPTYPE_ADDRX, op16)); break; + case 0x1f: sprintf(t, "ora $%.6x,x [$%.6x]", op24, decode(OPTYPE_LONGX, op24)); break; + case 0x20: sprintf(t, "jsr $%.4x [$%.6x]", op16, decode(OPTYPE_ADDR_PC, op16)); break; + case 0x21: sprintf(t, "and ($%.2x,x) [$%.6x]", op8, decode(OPTYPE_IDPX, op8)); break; + case 0x22: sprintf(t, "jsl $%.6x [$%.6x]", op24, decode(OPTYPE_LONG, op24)); break; + case 0x23: sprintf(t, "and $%.2x,s [$%.6x]", op8, decode(OPTYPE_SR, op8)); break; + case 0x24: sprintf(t, "bit $%.2x [$%.6x]", op8, decode(OPTYPE_DP, op8)); break; + case 0x25: sprintf(t, "and $%.2x [$%.6x]", op8, decode(OPTYPE_DP, op8)); break; + case 0x26: sprintf(t, "rol $%.2x [$%.6x]", op8, decode(OPTYPE_DP, op8)); break; + case 0x27: sprintf(t, "and [$%.2x] [$%.6x]", op8, decode(OPTYPE_ILDP, op8)); break; + case 0x28: sprintf(t, "plp "); break; + case 0x29: if(a8)sprintf(t, "and #$%.2x ", op8); + else sprintf(t, "and #$%.4x ", op16); break; + case 0x2a: sprintf(t, "rol a "); break; + case 0x2b: sprintf(t, "pld "); break; + case 0x2c: sprintf(t, "bit $%.4x [$%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; + case 0x2d: sprintf(t, "and $%.4x [$%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; + case 0x2e: sprintf(t, "rol $%.4x [$%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; + case 0x2f: sprintf(t, "and $%.6x [$%.6x]", op24, decode(OPTYPE_LONG, op24)); break; + case 0x30: sprintf(t, "bmi $%.4x [$%.6x]", uint16(decode(OPTYPE_RELB, op8)), decode(OPTYPE_RELB, op8)); break; + case 0x31: sprintf(t, "and ($%.2x),y [$%.6x]", op8, decode(OPTYPE_IDPY, op8)); break; + case 0x32: sprintf(t, "and ($%.2x) [$%.6x]", op8, decode(OPTYPE_IDP, op8)); break; + case 0x33: sprintf(t, "and ($%.2x,s),y [$%.6x]", op8, decode(OPTYPE_ISRY, op8)); break; + case 0x34: sprintf(t, "bit $%.2x,x [$%.6x]", op8, decode(OPTYPE_DPX, op8)); break; + case 0x35: sprintf(t, "and $%.2x,x [$%.6x]", op8, decode(OPTYPE_DPX, op8)); break; + case 0x36: sprintf(t, "rol $%.2x,x [$%.6x]", op8, decode(OPTYPE_DPX, op8)); break; + case 0x37: sprintf(t, "and [$%.2x],y [$%.6x]", op8, decode(OPTYPE_ILDPY, op8)); break; + case 0x38: sprintf(t, "sec "); break; + case 0x39: sprintf(t, "and $%.4x,y [$%.6x]", op16, decode(OPTYPE_ADDRY, op16)); break; + case 0x3a: sprintf(t, "dec "); break; + case 0x3b: sprintf(t, "tsc "); break; + case 0x3c: sprintf(t, "bit $%.4x,x [$%.6x]", op16, decode(OPTYPE_ADDRX, op16)); break; + case 0x3d: sprintf(t, "and $%.4x,x [$%.6x]", op16, decode(OPTYPE_ADDRX, op16)); break; + case 0x3e: sprintf(t, "rol $%.4x,x [$%.6x]", op16, decode(OPTYPE_ADDRX, op16)); break; + case 0x3f: sprintf(t, "and $%.6x,x [$%.6x]", op24, decode(OPTYPE_LONGX, op24)); break; + case 0x40: sprintf(t, "rti "); break; + case 0x41: sprintf(t, "eor ($%.2x,x) [$%.6x]", op8, decode(OPTYPE_IDPX, op8)); break; + case 0x42: sprintf(t, "wdm "); break; + case 0x43: sprintf(t, "eor $%.2x,s [$%.6x]", op8, decode(OPTYPE_SR, op8)); break; + case 0x44: sprintf(t, "mvp $%.2x,$%.2x ", op1, op8); break; + case 0x45: sprintf(t, "eor $%.2x [$%.6x]", op8, decode(OPTYPE_DP, op8)); break; + case 0x46: sprintf(t, "lsr $%.2x [$%.6x]", op8, decode(OPTYPE_DP, op8)); break; + case 0x47: sprintf(t, "eor [$%.2x] [$%.6x]", op8, decode(OPTYPE_ILDP, op8)); break; + case 0x48: sprintf(t, "pha "); break; + case 0x49: if(a8)sprintf(t, "eor #$%.2x ", op8); + else sprintf(t, "eor #$%.4x ", op16); break; + case 0x4a: sprintf(t, "lsr a "); break; + case 0x4b: sprintf(t, "phk "); break; + case 0x4c: sprintf(t, "jmp $%.4x [$%.6x]", op16, decode(OPTYPE_ADDR_PC, op16)); break; + case 0x4d: sprintf(t, "eor $%.4x [$%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; + case 0x4e: sprintf(t, "lsr $%.4x [$%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; + case 0x4f: sprintf(t, "eor $%.6x [$%.6x]", op24, decode(OPTYPE_LONG, op24)); break; + case 0x50: sprintf(t, "bvc $%.4x [$%.6x]", uint16(decode(OPTYPE_RELB, op8)), decode(OPTYPE_RELB, op8)); break; + case 0x51: sprintf(t, "eor ($%.2x),y [$%.6x]", op8, decode(OPTYPE_IDPY, op8)); break; + case 0x52: sprintf(t, "eor ($%.2x) [$%.6x]", op8, decode(OPTYPE_IDP, op8)); break; + case 0x53: sprintf(t, "eor ($%.2x,s),y [$%.6x]", op8, decode(OPTYPE_ISRY, op8)); break; + case 0x54: sprintf(t, "mvn $%.2x,$%.2x ", op1, op8); break; + case 0x55: sprintf(t, "eor $%.2x,x [$%.6x]", op8, decode(OPTYPE_DPX, op8)); break; + case 0x56: sprintf(t, "lsr $%.2x,x [$%.6x]", op8, decode(OPTYPE_DPX, op8)); break; + case 0x57: sprintf(t, "eor [$%.2x],y [$%.6x]", op8, decode(OPTYPE_ILDPY, op8)); break; + case 0x58: sprintf(t, "cli "); break; + case 0x59: sprintf(t, "eor $%.4x,y [$%.6x]", op16, decode(OPTYPE_ADDRY, op16)); break; + case 0x5a: sprintf(t, "phy "); break; + case 0x5b: sprintf(t, "tcd "); break; + case 0x5c: sprintf(t, "jml $%.6x [$%.6x]", op24, decode(OPTYPE_LONG, op24)); break; + case 0x5d: sprintf(t, "eor $%.4x,x [$%.6x]", op16, decode(OPTYPE_ADDRX, op16)); break; + case 0x5e: sprintf(t, "lsr $%.4x,x [$%.6x]", op16, decode(OPTYPE_ADDRX, op16)); break; + case 0x5f: sprintf(t, "eor $%.6x,x [$%.6x]", op24, decode(OPTYPE_LONGX, op24)); break; + case 0x60: sprintf(t, "rts "); break; + case 0x61: sprintf(t, "adc ($%.2x,x) [$%.6x]", op8, decode(OPTYPE_IDPX, op8)); break; + case 0x62: sprintf(t, "per $%.4x [$%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; + case 0x63: sprintf(t, "adc $%.2x,s [$%.6x]", op8, decode(OPTYPE_SR, op8)); break; + case 0x64: sprintf(t, "stz $%.2x [$%.6x]", op8, decode(OPTYPE_DP, op8)); break; + case 0x65: sprintf(t, "adc $%.2x [$%.6x]", op8, decode(OPTYPE_DP, op8)); break; + case 0x66: sprintf(t, "ror $%.2x [$%.6x]", op8, decode(OPTYPE_DP, op8)); break; + case 0x67: sprintf(t, "adc [$%.2x] [$%.6x]", op8, decode(OPTYPE_ILDP, op8)); break; + case 0x68: sprintf(t, "pla "); break; + case 0x69: if(a8)sprintf(t, "adc #$%.2x ", op8); + else sprintf(t, "adc #$%.4x ", op16); break; + case 0x6a: sprintf(t, "ror a "); break; + case 0x6b: sprintf(t, "rtl "); break; + case 0x6c: sprintf(t, "jmp ($%.4x) [$%.6x]", op16, decode(OPTYPE_IADDR_PC, op16)); break; + case 0x6d: sprintf(t, "adc $%.4x [$%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; + case 0x6e: sprintf(t, "ror $%.4x [$%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; + case 0x6f: sprintf(t, "adc $%.6x [$%.6x]", op24, decode(OPTYPE_LONG, op24)); break; + case 0x70: sprintf(t, "bvs $%.4x [$%.6x]", uint16(decode(OPTYPE_RELB, op8)), decode(OPTYPE_RELB, op8)); break; + case 0x71: sprintf(t, "adc ($%.2x),y [$%.6x]", op8, decode(OPTYPE_IDPY, op8)); break; + case 0x72: sprintf(t, "adc ($%.2x) [$%.6x]", op8, decode(OPTYPE_IDP, op8)); break; + case 0x73: sprintf(t, "adc ($%.2x,s),y [$%.6x]", op8, decode(OPTYPE_ISRY, op8)); break; + case 0x74: sprintf(t, "stz $%.2x,x [$%.6x]", op8, decode(OPTYPE_DPX, op8)); break; + case 0x75: sprintf(t, "adc $%.2x,x [$%.6x]", op8, decode(OPTYPE_DPX, op8)); break; + case 0x76: sprintf(t, "ror $%.2x,x [$%.6x]", op8, decode(OPTYPE_DPX, op8)); break; + case 0x77: sprintf(t, "adc [$%.2x],y [$%.6x]", op8, decode(OPTYPE_ILDPY, op8)); break; + case 0x78: sprintf(t, "sei "); break; + case 0x79: sprintf(t, "adc $%.4x,y [$%.6x]", op16, decode(OPTYPE_ADDRY, op16)); break; + case 0x7a: sprintf(t, "ply "); break; + case 0x7b: sprintf(t, "tdc "); break; + case 0x7c: sprintf(t, "jmp ($%.4x,x) [$%.6x]", op16, decode(OPTYPE_IADDRX, op16)); break; + case 0x7d: sprintf(t, "adc $%.4x,x [$%.6x]", op16, decode(OPTYPE_ADDRX, op16)); break; + case 0x7e: sprintf(t, "ror $%.4x,x [$%.6x]", op16, decode(OPTYPE_ADDRX, op16)); break; + case 0x7f: sprintf(t, "adc $%.6x,x [$%.6x]", op24, decode(OPTYPE_LONGX, op24)); break; + case 0x80: sprintf(t, "bra $%.4x [$%.6x]", uint16(decode(OPTYPE_RELB, op8)), decode(OPTYPE_RELB, op8)); break; + case 0x81: sprintf(t, "sta ($%.2x,x) [$%.6x]", op8, decode(OPTYPE_IDPX, op8)); break; + case 0x82: sprintf(t, "brl $%.4x [$%.6x]", uint16(decode(OPTYPE_RELW, op16)), decode(OPTYPE_RELW, op16)); break; + case 0x83: sprintf(t, "sta $%.2x,s [$%.6x]", op8, decode(OPTYPE_SR, op8)); break; + case 0x84: sprintf(t, "sty $%.2x [$%.6x]", op8, decode(OPTYPE_DP, op8)); break; + case 0x85: sprintf(t, "sta $%.2x [$%.6x]", op8, decode(OPTYPE_DP, op8)); break; + case 0x86: sprintf(t, "stx $%.2x [$%.6x]", op8, decode(OPTYPE_DP, op8)); break; + case 0x87: sprintf(t, "sta [$%.2x] [$%.6x]", op8, decode(OPTYPE_ILDP, op8)); break; + case 0x88: sprintf(t, "dey "); break; + case 0x89: if(a8)sprintf(t, "bit #$%.2x ", op8); + else sprintf(t, "bit #$%.4x ", op16); break; + case 0x8a: sprintf(t, "txa "); break; + case 0x8b: sprintf(t, "phb "); break; + case 0x8c: sprintf(t, "sty $%.4x [$%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; + case 0x8d: sprintf(t, "sta $%.4x [$%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; + case 0x8e: sprintf(t, "stx $%.4x [$%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; + case 0x8f: sprintf(t, "sta $%.6x [$%.6x]", op24, decode(OPTYPE_LONG, op24)); break; + case 0x90: sprintf(t, "bcc $%.4x [$%.6x]", uint16(decode(OPTYPE_RELB, op8)), decode(OPTYPE_RELB, op8)); break; + case 0x91: sprintf(t, "sta ($%.2x),y [$%.6x]", op8, decode(OPTYPE_IDPY, op8)); break; + case 0x92: sprintf(t, "sta ($%.2x) [$%.6x]", op8, decode(OPTYPE_IDP, op8)); break; + case 0x93: sprintf(t, "sta ($%.2x,s),y [$%.6x]", op8, decode(OPTYPE_ISRY, op8)); break; + case 0x94: sprintf(t, "sty $%.2x,x [$%.6x]", op8, decode(OPTYPE_DPX, op8)); break; + case 0x95: sprintf(t, "sta $%.2x,x [$%.6x]", op8, decode(OPTYPE_DPX, op8)); break; + case 0x96: sprintf(t, "stx $%.2x,y [$%.6x]", op8, decode(OPTYPE_DPY, op8)); break; + case 0x97: sprintf(t, "sta [$%.2x],y [$%.6x]", op8, decode(OPTYPE_ILDPY, op8)); break; + case 0x98: sprintf(t, "tya "); break; + case 0x99: sprintf(t, "sta $%.4x,y [$%.6x]", op16, decode(OPTYPE_ADDRY, op16)); break; + case 0x9a: sprintf(t, "txs "); break; + case 0x9b: sprintf(t, "txy "); break; + case 0x9c: sprintf(t, "stz $%.4x [$%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; + case 0x9d: sprintf(t, "sta $%.4x,x [$%.6x]", op16, decode(OPTYPE_ADDRX, op16)); break; + case 0x9e: sprintf(t, "stz $%.4x,x [$%.6x]", op16, decode(OPTYPE_ADDRX, op16)); break; + case 0x9f: sprintf(t, "sta $%.6x,x [$%.6x]", op24, decode(OPTYPE_LONGX, op24)); break; + case 0xa0: if(x8)sprintf(t, "ldy #$%.2x ", op8); + else sprintf(t, "ldy #$%.4x ", op16); break; + case 0xa1: sprintf(t, "lda ($%.2x,x) [$%.6x]", op8, decode(OPTYPE_IDPX, op8)); break; + case 0xa2: if(x8)sprintf(t, "ldx #$%.2x ", op8); + else sprintf(t, "ldx #$%.4x ", op16); break; + case 0xa3: sprintf(t, "lda $%.2x,s [$%.6x]", op8, decode(OPTYPE_SR, op8)); break; + case 0xa4: sprintf(t, "ldy $%.2x [$%.6x]", op8, decode(OPTYPE_DP, op8)); break; + case 0xa5: sprintf(t, "lda $%.2x [$%.6x]", op8, decode(OPTYPE_DP, op8)); break; + case 0xa6: sprintf(t, "ldx $%.2x [$%.6x]", op8, decode(OPTYPE_DP, op8)); break; + case 0xa7: sprintf(t, "lda [$%.2x] [$%.6x]", op8, decode(OPTYPE_ILDP, op8)); break; + case 0xa8: sprintf(t, "tay "); break; + case 0xa9: if(a8)sprintf(t, "lda #$%.2x ", op8); + else sprintf(t, "lda #$%.4x ", op16); break; + case 0xaa: sprintf(t, "tax "); break; + case 0xab: sprintf(t, "plb "); break; + case 0xac: sprintf(t, "ldy $%.4x [$%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; + case 0xad: sprintf(t, "lda $%.4x [$%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; + case 0xae: sprintf(t, "ldx $%.4x [$%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; + case 0xaf: sprintf(t, "lda $%.6x [$%.6x]", op24, decode(OPTYPE_LONG, op24)); break; + case 0xb0: sprintf(t, "bcs $%.4x [$%.6x]", uint16(decode(OPTYPE_RELB, op8)), decode(OPTYPE_RELB, op8)); break; + case 0xb1: sprintf(t, "lda ($%.2x),y [$%.6x]", op8, decode(OPTYPE_IDPY, op8)); break; + case 0xb2: sprintf(t, "lda ($%.2x) [$%.6x]", op8, decode(OPTYPE_IDP, op8)); break; + case 0xb3: sprintf(t, "lda ($%.2x,s),y [$%.6x]", op8, decode(OPTYPE_ISRY, op8)); break; + case 0xb4: sprintf(t, "ldy $%.2x,x [$%.6x]", op8, decode(OPTYPE_DPX, op8)); break; + case 0xb5: sprintf(t, "lda $%.2x,x [$%.6x]", op8, decode(OPTYPE_DPX, op8)); break; + case 0xb6: sprintf(t, "ldx $%.2x,y [$%.6x]", op8, decode(OPTYPE_DPY, op8)); break; + case 0xb7: sprintf(t, "lda [$%.2x],y [$%.6x]", op8, decode(OPTYPE_ILDPY, op8)); break; + case 0xb8: sprintf(t, "clv "); break; + case 0xb9: sprintf(t, "lda $%.4x,y [$%.6x]", op16, decode(OPTYPE_ADDRY, op16)); break; + case 0xba: sprintf(t, "tsx "); break; + case 0xbb: sprintf(t, "tyx "); break; + case 0xbc: sprintf(t, "ldy $%.4x,x [$%.6x]", op16, decode(OPTYPE_ADDRX, op16)); break; + case 0xbd: sprintf(t, "lda $%.4x,x [$%.6x]", op16, decode(OPTYPE_ADDRX, op16)); break; + case 0xbe: sprintf(t, "ldx $%.4x,y [$%.6x]", op16, decode(OPTYPE_ADDRY, op16)); break; + case 0xbf: sprintf(t, "lda $%.6x,x [$%.6x]", op24, decode(OPTYPE_LONGX, op24)); break; + case 0xc0: if(x8)sprintf(t, "cpy #$%.2x ", op8); + else sprintf(t, "cpy #$%.4x ", op16); break; + case 0xc1: sprintf(t, "cmp ($%.2x,x) [$%.6x]", op8, decode(OPTYPE_IDPX, op8)); break; + case 0xc2: sprintf(t, "rep #$%.2x ", op8); break; + case 0xc3: sprintf(t, "cmp $%.2x,s [$%.6x]", op8, decode(OPTYPE_SR, op8)); break; + case 0xc4: sprintf(t, "cpy $%.2x [$%.6x]", op8, decode(OPTYPE_DP, op8)); break; + case 0xc5: sprintf(t, "cmp $%.2x [$%.6x]", op8, decode(OPTYPE_DP, op8)); break; + case 0xc6: sprintf(t, "dec $%.2x [$%.6x]", op8, decode(OPTYPE_DP, op8)); break; + case 0xc7: sprintf(t, "cmp [$%.2x] [$%.6x]", op8, decode(OPTYPE_ILDP, op8)); break; + case 0xc8: sprintf(t, "iny "); break; + case 0xc9: if(a8)sprintf(t, "cmp #$%.2x ", op8); + else sprintf(t, "cmp #$%.4x ", op16); break; + case 0xca: sprintf(t, "dex "); break; + case 0xcb: sprintf(t, "wai "); break; + case 0xcc: sprintf(t, "cpy $%.4x [$%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; + case 0xcd: sprintf(t, "cmp $%.4x [$%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; + case 0xce: sprintf(t, "dec $%.4x [$%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; + case 0xcf: sprintf(t, "cmp $%.6x [$%.6x]", op24, decode(OPTYPE_LONG, op24)); break; + case 0xd0: sprintf(t, "bne $%.4x [$%.6x]", uint16(decode(OPTYPE_RELB, op8)), decode(OPTYPE_RELB, op8)); break; + case 0xd1: sprintf(t, "cmp ($%.2x),y [$%.6x]", op8, decode(OPTYPE_IDPY, op8)); break; + case 0xd2: sprintf(t, "cmp ($%.2x) [$%.6x]", op8, decode(OPTYPE_IDP, op8)); break; + case 0xd3: sprintf(t, "cmp ($%.2x,s),y [$%.6x]", op8, decode(OPTYPE_ISRY, op8)); break; + case 0xd4: sprintf(t, "pei ($%.2x) [$%.6x]", op8, decode(OPTYPE_IDP, op8)); break; + case 0xd5: sprintf(t, "cmp $%.2x,x [$%.6x]", op8, decode(OPTYPE_DPX, op8)); break; + case 0xd6: sprintf(t, "dec $%.2x,x [$%.6x]", op8, decode(OPTYPE_DPX, op8)); break; + case 0xd7: sprintf(t, "cmp [$%.2x],y [$%.6x]", op8, decode(OPTYPE_ILDPY, op8)); break; + case 0xd8: sprintf(t, "cld "); break; + case 0xd9: sprintf(t, "cmp $%.4x,y [$%.6x]", op16, decode(OPTYPE_ADDRY, op16)); break; + case 0xda: sprintf(t, "phx "); break; + case 0xdb: sprintf(t, "stp "); break; + case 0xdc: sprintf(t, "jmp [$%.4x] [$%.6x]", op16, decode(OPTYPE_ILADDR, op16)); break; + case 0xdd: sprintf(t, "cmp $%.4x,x [$%.6x]", op16, decode(OPTYPE_ADDRX, op16)); break; + case 0xde: sprintf(t, "dec $%.4x,x [$%.6x]", op16, decode(OPTYPE_ADDRX, op16)); break; + case 0xdf: sprintf(t, "cmp $%.6x,x [$%.6x]", op24, decode(OPTYPE_LONGX, op24)); break; + case 0xe0: if(x8)sprintf(t, "cpx #$%.2x ", op8); + else sprintf(t, "cpx #$%.4x ", op16); break; + case 0xe1: sprintf(t, "sbc ($%.2x,x) [$%.6x]", op8, decode(OPTYPE_IDPX, op8)); break; + case 0xe2: sprintf(t, "sep #$%.2x ", op8); break; + case 0xe3: sprintf(t, "sbc $%.2x,s [$%.6x]", op8, decode(OPTYPE_SR, op8)); break; + case 0xe4: sprintf(t, "cpx $%.2x [$%.6x]", op8, decode(OPTYPE_DP, op8)); break; + case 0xe5: sprintf(t, "sbc $%.2x [$%.6x]", op8, decode(OPTYPE_DP, op8)); break; + case 0xe6: sprintf(t, "inc $%.2x [$%.6x]", op8, decode(OPTYPE_DP, op8)); break; + case 0xe7: sprintf(t, "sbc [$%.2x] [$%.6x]", op8, decode(OPTYPE_ILDP, op8)); break; + case 0xe8: sprintf(t, "inx "); break; + case 0xe9: if(a8)sprintf(t, "sbc #$%.2x ", op8); + else sprintf(t, "sbc #$%.4x ", op16); break; + case 0xea: sprintf(t, "nop "); break; + case 0xeb: sprintf(t, "xba "); break; + case 0xec: sprintf(t, "cpx $%.4x [$%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; + case 0xed: sprintf(t, "sbc $%.4x [$%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; + case 0xee: sprintf(t, "inc $%.4x [$%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; + case 0xef: sprintf(t, "sbc $%.6x [$%.6x]", op24, decode(OPTYPE_LONG, op24)); break; + case 0xf0: sprintf(t, "beq $%.4x [$%.6x]", uint16(decode(OPTYPE_RELB, op8)), decode(OPTYPE_RELB, op8)); break; + case 0xf1: sprintf(t, "sbc ($%.2x),y [$%.6x]", op8, decode(OPTYPE_IDPY, op8)); break; + case 0xf2: sprintf(t, "sbc ($%.2x) [$%.6x]", op8, decode(OPTYPE_IDP, op8)); break; + case 0xf3: sprintf(t, "sbc ($%.2x,s),y [$%.6x]", op8, decode(OPTYPE_ISRY, op8)); break; + case 0xf4: sprintf(t, "pea $%.4x [$%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; + case 0xf5: sprintf(t, "sbc $%.2x,x [$%.6x]", op8, decode(OPTYPE_DPX, op8)); break; + case 0xf6: sprintf(t, "inc $%.2x,x [$%.6x]", op8, decode(OPTYPE_DPX, op8)); break; + case 0xf7: sprintf(t, "sbc [$%.2x],y [$%.6x]", op8, decode(OPTYPE_ILDPY, op8)); break; + case 0xf8: sprintf(t, "sed "); break; + case 0xf9: sprintf(t, "sbc $%.4x,y [$%.6x]", op16, decode(OPTYPE_ADDRY, op16)); break; + case 0xfa: sprintf(t, "plx "); break; + case 0xfb: sprintf(t, "xce "); break; + case 0xfc: sprintf(t, "jsr ($%.4x,x) [$%.6x]", op16, decode(OPTYPE_IADDRX, op16)); break; + case 0xfd: sprintf(t, "sbc $%.4x,x [$%.6x]", op16, decode(OPTYPE_ADDRX, op16)); break; + case 0xfe: sprintf(t, "inc $%.4x,x [$%.6x]", op16, decode(OPTYPE_ADDRX, op16)); break; + case 0xff: sprintf(t, "sbc $%.6x,x [$%.6x]", op24, decode(OPTYPE_LONGX, op24)); break; + } + + #undef op8 + #undef op16 + #undef op24 + #undef a8 + #undef x8 + + strcat(s, t); + strcat(s, " "); + + sprintf(t, "A:%.4x X:%.4x Y:%.4x S:%.4x D:%.4x DB:%.2x ", + regs.a.w, regs.x.w, regs.y.w, regs.s.w, regs.d.w, regs.db); + strcat(s, t); + + if(regs.e) { + sprintf(t, "%c%c%c%c%c%c%c%c", + regs.p.n ? 'N' : 'n', regs.p.v ? 'V' : 'v', + regs.p.m ? '1' : '0', regs.p.x ? 'B' : 'b', + regs.p.d ? 'D' : 'd', regs.p.i ? 'I' : 'i', + regs.p.z ? 'Z' : 'z', regs.p.c ? 'C' : 'c'); + } else { + sprintf(t, "%c%c%c%c%c%c%c%c", + regs.p.n ? 'N' : 'n', regs.p.v ? 'V' : 'v', + regs.p.m ? 'M' : 'm', regs.p.x ? 'X' : 'x', + regs.p.d ? 'D' : 'd', regs.p.i ? 'I' : 'i', + regs.p.z ? 'Z' : 'z', regs.p.c ? 'C' : 'c'); + } + + strcat(s, t); + strcat(s, " "); + + sprintf(t, "V:%3d H:%4d", ppu.vcounter(), ppu.hcounter()); + strcat(s, t); +} + +//opcode_length() retrieves the length of the next opcode +//to be executed. It is used by the debugger to step over, +//disable and proceed cpu opcodes. +// +//5 and 6 are special cases, 5 is used for #consts based on +//the A register size, 6 for the X/Y register size. the +//rest are literal sizes. There's no need to test for +//emulation mode, as regs.p.m/regs.p.x should *always* be +//set in emulation mode. + +uint8 CPUcore::opcode_length() { + uint8 op, len; + static uint8 op_len_tbl[256] = { + //0,1,2,3, 4,5,6,7, 8,9,a,b, c,d,e,f + + 2,2,2,2, 2,2,2,2, 1,5,1,1, 3,3,3,4, //0x0n + 2,2,2,2, 2,2,2,2, 1,3,1,1, 3,3,3,4, //0x1n + 3,2,4,2, 2,2,2,2, 1,5,1,1, 3,3,3,4, //0x2n + 2,2,2,2, 2,2,2,2, 1,3,1,1, 3,3,3,4, //0x3n + + 1,2,2,2, 3,2,2,2, 1,5,1,1, 3,3,3,4, //0x4n + 2,2,2,2, 3,2,2,2, 1,3,1,1, 4,3,3,4, //0x5n + 1,2,3,2, 2,2,2,2, 1,5,1,1, 3,3,3,4, //0x6n + 2,2,2,2, 2,2,2,2, 1,3,1,1, 3,3,3,4, //0x7n + + 2,2,3,2, 2,2,2,2, 1,5,1,1, 3,3,3,4, //0x8n + 2,2,2,2, 2,2,2,2, 1,3,1,1, 3,3,3,4, //0x9n + 6,2,6,2, 2,2,2,2, 1,5,1,1, 3,3,3,4, //0xan + 2,2,2,2, 2,2,2,2, 1,3,1,1, 3,3,3,4, //0xbn + + 6,2,2,2, 2,2,2,2, 1,5,1,1, 3,3,3,4, //0xcn + 2,2,2,2, 2,2,2,2, 1,3,1,1, 3,3,3,4, //0xdn + 6,2,2,2, 2,2,2,2, 1,5,1,1, 3,3,3,4, //0xen + 2,2,2,2, 3,2,2,2, 1,3,1,1, 3,3,3,4 //0xfn + }; + + if(false /* in_opcode() == true */) { + return 0; + } + + op = dreadb(regs.pc.d); + len = op_len_tbl[op]; + if(len == 5) return (regs.e || regs.p.m) ? 2 : 3; + if(len == 6) return (regs.e || regs.p.x) ? 2 : 3; + return len; +} diff --git a/tools/bsnes/cpu/core/disasm/disasm.hpp b/tools/bsnes/cpu/core/disasm/disasm.hpp new file mode 100755 index 0000000..8ae78c3 --- /dev/null +++ b/tools/bsnes/cpu/core/disasm/disasm.hpp @@ -0,0 +1,30 @@ + enum { + OPTYPE_DP = 0, //dp + OPTYPE_DPX, //dp,x + OPTYPE_DPY, //dp,y + OPTYPE_IDP, //(dp) + OPTYPE_IDPX, //(dp,x) + OPTYPE_IDPY, //(dp),y + OPTYPE_ILDP, //[dp] + OPTYPE_ILDPY, //[dp],y + OPTYPE_ADDR, //addr + OPTYPE_ADDRX, //addr,x + OPTYPE_ADDRY, //addr,y + OPTYPE_IADDRX, //(addr,x) + OPTYPE_ILADDR, //[addr] + OPTYPE_LONG, //long + OPTYPE_LONGX, //long, x + OPTYPE_SR, //sr,s + OPTYPE_ISRY, //(sr,s),y + OPTYPE_ADDR_PC, //pbr:addr + OPTYPE_IADDR_PC, //pbr:(addr) + OPTYPE_RELB, //relb + OPTYPE_RELW, //relw + }; + + void disassemble_opcode(char *output); + uint8 dreadb(uint32 addr); + uint16 dreadw(uint32 addr); + uint32 dreadl(uint32 addr); + uint32 decode(uint8 offset_type, uint32 addr); + uint8 opcode_length(); diff --git a/tools/bsnes/cpu/core/memory.hpp b/tools/bsnes/cpu/core/memory.hpp new file mode 100755 index 0000000..4992657 --- /dev/null +++ b/tools/bsnes/cpu/core/memory.hpp @@ -0,0 +1,77 @@ +alwaysinline uint8_t op_readpc() { + return op_read((regs.pc.b << 16) + regs.pc.w++); +} + +alwaysinline uint8_t op_readstack() { + regs.e ? regs.s.l++ : regs.s.w++; + return op_read(regs.s.w); +} + +alwaysinline uint8_t op_readstackn() { + return op_read(++regs.s.w); +} + +alwaysinline uint8_t op_readaddr(uint32_t addr) { + return op_read(addr & 0xffff); +} + +alwaysinline uint8_t op_readlong(uint32_t addr) { + return op_read(addr & 0xffffff); +} + +alwaysinline uint8_t op_readdbr(uint32_t addr) { + return op_read(((regs.db << 16) + addr) & 0xffffff); +} + +alwaysinline uint8_t op_readpbr(uint32_t addr) { + return op_read((regs.pc.b << 16) + (addr & 0xffff)); +} + +alwaysinline uint8_t op_readdp(uint32_t addr) { + if(regs.e && regs.d.l == 0x00) { + return op_read((regs.d & 0xff00) + ((regs.d + (addr & 0xffff)) & 0xff)); + } else { + return op_read((regs.d + (addr & 0xffff)) & 0xffff); + } +} + +alwaysinline uint8_t op_readsp(uint32_t addr) { + return op_read((regs.s + (addr & 0xffff)) & 0xffff); +} + +alwaysinline void op_writestack(uint8_t data) { + op_write(regs.s.w, data); + regs.e ? regs.s.l-- : regs.s.w--; +} + +alwaysinline void op_writestackn(uint8_t data) { + op_write(regs.s.w--, data); +} + +alwaysinline void op_writeaddr(uint32_t addr, uint8_t data) { + op_write(addr & 0xffff, data); +} + +alwaysinline void op_writelong(uint32_t addr, uint8_t data) { + op_write(addr & 0xffffff, data); +} + +alwaysinline void op_writedbr(uint32_t addr, uint8_t data) { + op_write(((regs.db << 16) + addr) & 0xffffff, data); +} + +alwaysinline void op_writepbr(uint32_t addr, uint8_t data) { + op_write((regs.pc.b << 16) + (addr & 0xffff), data); +} + +alwaysinline void op_writedp(uint32_t addr, uint8_t data) { + if(regs.e && regs.d.l == 0x00) { + op_write((regs.d & 0xff00) + ((regs.d + (addr & 0xffff)) & 0xff), data); + } else { + op_write((regs.d + (addr & 0xffff)) & 0xffff, data); + } +} + +alwaysinline void op_writesp(uint32_t addr, uint8_t data) { + op_write((regs.s + (addr & 0xffff)) & 0xffff, data); +} diff --git a/tools/bsnes/cpu/core/opcode_algorithms.cpp b/tools/bsnes/cpu/core/opcode_algorithms.cpp new file mode 100755 index 0000000..4df8b36 --- /dev/null +++ b/tools/bsnes/cpu/core/opcode_algorithms.cpp @@ -0,0 +1,369 @@ +#ifdef CPUCORE_CPP + +inline void CPUcore::op_adc_b() { + int r; + if(regs.p.d) { + uint8 n0 = (regs.a.l ) & 15; + uint8 n1 = (regs.a.l >> 4) & 15; + n0 += (rd.l & 15) + regs.p.c; + if(n0 > 9) { + n0 = (n0 - 10) & 15; + n1++; + } + n1 += ((rd.l >> 4) & 15); + if(n1 > 9) { + n1 = (n1 - 10) & 15; + regs.p.c = 1; + } else { + regs.p.c = 0; + } + r = (n1 << 4) | n0; + } else { + r = regs.a.l + rd.l + regs.p.c; + regs.p.c = r > 0xff; + } + regs.p.n = r & 0x80; + regs.p.v = ~(regs.a.l ^ rd.l) & (regs.a.l ^ r) & 0x80; + regs.p.z = (uint8)r == 0; + regs.a.l = r; +} + +inline void CPUcore::op_adc_w() { + int r; + if(regs.p.d) { + uint8 n0 = (regs.a.w ) & 15; + uint8 n1 = (regs.a.w >> 4) & 15; + uint8 n2 = (regs.a.w >> 8) & 15; + uint8 n3 = (regs.a.w >> 12) & 15; + n0 += (rd.w & 15) + regs.p.c; + if(n0 > 9) { + n0 = (n0 - 10) & 15; + n1++; + } + n1 += ((rd.w >> 4) & 15); + if(n1 > 9) { + n1 = (n1 - 10) & 15; + n2++; + } + n2 += ((rd.w >> 8) & 15); + if(n2 > 9) { + n2 = (n2 - 10) & 15; + n3++; + } + n3 += ((rd.w >> 12) & 15); + if(n3 > 9) { + n3 = (n3 - 10) & 15; + regs.p.c = 1; + } else { + regs.p.c = 0; + } + r = (n3 << 12) | (n2 << 8) | (n1 << 4) | n0; + } else { + r = regs.a.w + rd.w + regs.p.c; + regs.p.c = r > 0xffff; + } + regs.p.n = r & 0x8000; + regs.p.v = ~(regs.a.w ^ rd.w) & (regs.a.w ^ r) & 0x8000; + regs.p.z = (uint16)r == 0; + regs.a.w = r; +} + +inline void CPUcore::op_and_b() { + regs.a.l &= rd.l; + regs.p.n = regs.a.l & 0x80; + regs.p.z = regs.a.l == 0; +} + +inline void CPUcore::op_and_w() { + regs.a.w &= rd.w; + regs.p.n = regs.a.w & 0x8000; + regs.p.z = regs.a.w == 0; +} + +inline void CPUcore::op_bit_b() { + regs.p.n = rd.l & 0x80; + regs.p.v = rd.l & 0x40; + regs.p.z = (rd.l & regs.a.l) == 0; +} + +inline void CPUcore::op_bit_w() { + regs.p.n = rd.w & 0x8000; + regs.p.v = rd.w & 0x4000; + regs.p.z = (rd.w & regs.a.w) == 0; +} + +inline void CPUcore::op_cmp_b() { + int r = regs.a.l - rd.l; + regs.p.n = r & 0x80; + regs.p.z = (uint8)r == 0; + regs.p.c = r >= 0; +} + +inline void CPUcore::op_cmp_w() { + int r = regs.a.w - rd.w; + regs.p.n = r & 0x8000; + regs.p.z = (uint16)r == 0; + regs.p.c = r >= 0; +} + +inline void CPUcore::op_cpx_b() { + int r = regs.x.l - rd.l; + regs.p.n = r & 0x80; + regs.p.z = (uint8)r == 0; + regs.p.c = r >= 0; +} + +inline void CPUcore::op_cpx_w() { + int r = regs.x.w - rd.w; + regs.p.n = r & 0x8000; + regs.p.z = (uint16)r == 0; + regs.p.c = r >= 0; +} + +inline void CPUcore::op_cpy_b() { + int r = regs.y.l - rd.l; + regs.p.n = r & 0x80; + regs.p.z = (uint8)r == 0; + regs.p.c = r >= 0; +} + +inline void CPUcore::op_cpy_w() { + int r = regs.y.w - rd.w; + regs.p.n = r & 0x8000; + regs.p.z = (uint16)r == 0; + regs.p.c = r >= 0; +} + +inline void CPUcore::op_eor_b() { + regs.a.l ^= rd.l; + regs.p.n = regs.a.l & 0x80; + regs.p.z = regs.a.l == 0; +} + +inline void CPUcore::op_eor_w() { + regs.a.w ^= rd.w; + regs.p.n = regs.a.w & 0x8000; + regs.p.z = regs.a.w == 0; +} + +inline void CPUcore::op_lda_b() { + regs.a.l = rd.l; + regs.p.n = regs.a.l & 0x80; + regs.p.z = regs.a.l == 0; +} + +inline void CPUcore::op_lda_w() { + regs.a.w = rd.w; + regs.p.n = regs.a.w & 0x8000; + regs.p.z = regs.a.w == 0; +} + +inline void CPUcore::op_ldx_b() { + regs.x.l = rd.l; + regs.p.n = regs.x.l & 0x80; + regs.p.z = regs.x.l == 0; +} + +inline void CPUcore::op_ldx_w() { + regs.x.w = rd.w; + regs.p.n = regs.x.w & 0x8000; + regs.p.z = regs.x.w == 0; +} + +inline void CPUcore::op_ldy_b() { + regs.y.l = rd.l; + regs.p.n = regs.y.l & 0x80; + regs.p.z = regs.y.l == 0; +} + +inline void CPUcore::op_ldy_w() { + regs.y.w = rd.w; + regs.p.n = regs.y.w & 0x8000; + regs.p.z = regs.y.w == 0; +} + +inline void CPUcore::op_ora_b() { + regs.a.l |= rd.l; + regs.p.n = regs.a.l & 0x80; + regs.p.z = regs.a.l == 0; +} + +inline void CPUcore::op_ora_w() { + regs.a.w |= rd.w; + regs.p.n = regs.a.w & 0x8000; + regs.p.z = regs.a.w == 0; +} + +inline void CPUcore::op_sbc_b() { + int r; + if(regs.p.d) { + uint8 n0 = (regs.a.l ) & 15; + uint8 n1 = (regs.a.l >> 4) & 15; + n0 -= ((rd.l ) & 15) + !regs.p.c; + n1 -= ((rd.l >> 4) & 15); + if(n0 > 9) { + n0 += 10; + n1--; + } + if(n1 > 9) { + n1 += 10; + regs.p.c = 0; + } else { + regs.p.c = 1; + } + r = (n1 << 4) | (n0); + } else { + r = regs.a.l - rd.l - !regs.p.c; + regs.p.c = r >= 0; + } + regs.p.n = r & 0x80; + regs.p.v = (regs.a.l ^ rd.l) & (regs.a.l ^ r) & 0x80; + regs.p.z = (uint8)r == 0; + regs.a.l = r; +} + +inline void CPUcore::op_sbc_w() { + int r; + if(regs.p.d) { + uint8 n0 = (regs.a.w ) & 15; + uint8 n1 = (regs.a.w >> 4) & 15; + uint8 n2 = (regs.a.w >> 8) & 15; + uint8 n3 = (regs.a.w >> 12) & 15; + n0 -= ((rd.w ) & 15) + !regs.p.c; + n1 -= ((rd.w >> 4) & 15); + n2 -= ((rd.w >> 8) & 15); + n3 -= ((rd.w >> 12) & 15); + if(n0 > 9) { + n0 += 10; + n1--; + } + if(n1 > 9) { + n1 += 10; + n2--; + } + if(n2 > 9) { + n2 += 10; + n3--; + } + if(n3 > 9) { + n3 += 10; + regs.p.c = 0; + } else { + regs.p.c = 1; + } + r = (n3 << 12) | (n2 << 8) | (n1 << 4) | (n0); + } else { + r = regs.a.w - rd.w - !regs.p.c; + regs.p.c = r >= 0; + } + regs.p.n = r & 0x8000; + regs.p.v = (regs.a.w ^ rd.w) & (regs.a.w ^ r) & 0x8000; + regs.p.z = (uint16)r == 0; + regs.a.w = r; +} + +inline void CPUcore::op_inc_b() { + rd.l++; + regs.p.n = rd.l & 0x80; + regs.p.z = rd.l == 0; +} + +inline void CPUcore::op_inc_w() { + rd.w++; + regs.p.n = rd.w & 0x8000; + regs.p.z = rd.w == 0; +} + +inline void CPUcore::op_dec_b() { + rd.l--; + regs.p.n = rd.l & 0x80; + regs.p.z = rd.l == 0; +} + +inline void CPUcore::op_dec_w() { + rd.w--; + regs.p.n = rd.w & 0x8000; + regs.p.z = rd.w == 0; +} + +inline void CPUcore::op_asl_b() { + regs.p.c = rd.l & 0x80; + rd.l <<= 1; + regs.p.n = rd.l & 0x80; + regs.p.z = rd.l == 0; +} + +inline void CPUcore::op_asl_w() { + regs.p.c = rd.w & 0x8000; + rd.w <<= 1; + regs.p.n = rd.w & 0x8000; + regs.p.z = rd.w == 0; +} + +inline void CPUcore::op_lsr_b() { + regs.p.c = rd.l & 1; + rd.l >>= 1; + regs.p.n = rd.l & 0x80; + regs.p.z = rd.l == 0; +} + +inline void CPUcore::op_lsr_w() { + regs.p.c = rd.w & 1; + rd.w >>= 1; + regs.p.n = rd.w & 0x8000; + regs.p.z = rd.w == 0; +} + +inline void CPUcore::op_rol_b() { + unsigned carry = (unsigned)regs.p.c; + regs.p.c = rd.l & 0x80; + rd.l = (rd.l << 1) | carry; + regs.p.n = rd.l & 0x80; + regs.p.z = rd.l == 0; +} + +inline void CPUcore::op_rol_w() { + unsigned carry = (unsigned)regs.p.c; + regs.p.c = rd.w & 0x8000; + rd.w = (rd.w << 1) | carry; + regs.p.n = rd.w & 0x8000; + regs.p.z = rd.w == 0; +} + +inline void CPUcore::op_ror_b() { + unsigned carry = (unsigned)regs.p.c << 7; + regs.p.c = rd.l & 1; + rd.l = carry | (rd.l >> 1); + regs.p.n = rd.l & 0x80; + regs.p.z = rd.l == 0; +} + +inline void CPUcore::op_ror_w() { + unsigned carry = (unsigned)regs.p.c << 15; + regs.p.c = rd.w & 1; + rd.w = carry | (rd.w >> 1); + regs.p.n = rd.w & 0x8000; + regs.p.z = rd.w == 0; +} + +inline void CPUcore::op_trb_b() { + regs.p.z = (rd.l & regs.a.l) == 0; + rd.l &= ~regs.a.l; +} + +inline void CPUcore::op_trb_w() { + regs.p.z = (rd.w & regs.a.w) == 0; + rd.w &= ~regs.a.w; +} + +inline void CPUcore::op_tsb_b() { + regs.p.z = (rd.l & regs.a.l) == 0; + rd.l |= regs.a.l; +} + +inline void CPUcore::op_tsb_w() { + regs.p.z = (rd.w & regs.a.w) == 0; + rd.w |= regs.a.w; +} +#endif + diff --git a/tools/bsnes/cpu/core/opcode_functions.bpp b/tools/bsnes/cpu/core/opcode_functions.bpp new file mode 100755 index 0000000..b9a1e6a --- /dev/null +++ b/tools/bsnes/cpu/core/opcode_functions.bpp @@ -0,0 +1,13 @@ +//opcode_functions.cpp was generated via bpp -> opcode_functions.bpp + +@global class CPUcore +@global lc last_cycle(); +@global wai regs.wai + +@include "opcode_read.bpp" +@include "opcode_write.bpp" +@include "opcode_rmw.bpp" +@include "opcode_pc.bpp" +@include "opcode_misc.bpp" + +@include "opcode_list.bpp" diff --git a/tools/bsnes/cpu/core/opcode_functions.cpp b/tools/bsnes/cpu/core/opcode_functions.cpp new file mode 100755 index 0000000..80341bf --- /dev/null +++ b/tools/bsnes/cpu/core/opcode_functions.cpp @@ -0,0 +1,4263 @@ +//opcode_functions.cpp was generated via bpp -> opcode_functions.bpp + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +//=============== +//opcode_read.bpp +//=============== + + void CPUcore::op_adc_const_b() { +last_cycle();rd.l = op_readpc(); + op_adc_b(); + } + + void CPUcore::op_adc_const_w() { + rd.l = op_readpc(); +last_cycle();rd.h = op_readpc(); + op_adc_w(); + } + + void CPUcore::op_and_const_b() { +last_cycle();rd.l = op_readpc(); + op_and_b(); + } + + void CPUcore::op_and_const_w() { + rd.l = op_readpc(); +last_cycle();rd.h = op_readpc(); + op_and_w(); + } + + void CPUcore::op_cmp_const_b() { +last_cycle();rd.l = op_readpc(); + op_cmp_b(); + } + + void CPUcore::op_cmp_const_w() { + rd.l = op_readpc(); +last_cycle();rd.h = op_readpc(); + op_cmp_w(); + } + + void CPUcore::op_cpx_const_b() { +last_cycle();rd.l = op_readpc(); + op_cpx_b(); + } + + void CPUcore::op_cpx_const_w() { + rd.l = op_readpc(); +last_cycle();rd.h = op_readpc(); + op_cpx_w(); + } + + void CPUcore::op_cpy_const_b() { +last_cycle();rd.l = op_readpc(); + op_cpy_b(); + } + + void CPUcore::op_cpy_const_w() { + rd.l = op_readpc(); +last_cycle();rd.h = op_readpc(); + op_cpy_w(); + } + + void CPUcore::op_eor_const_b() { +last_cycle();rd.l = op_readpc(); + op_eor_b(); + } + + void CPUcore::op_eor_const_w() { + rd.l = op_readpc(); +last_cycle();rd.h = op_readpc(); + op_eor_w(); + } + + void CPUcore::op_lda_const_b() { +last_cycle();rd.l = op_readpc(); + op_lda_b(); + } + + void CPUcore::op_lda_const_w() { + rd.l = op_readpc(); +last_cycle();rd.h = op_readpc(); + op_lda_w(); + } + + void CPUcore::op_ldx_const_b() { +last_cycle();rd.l = op_readpc(); + op_ldx_b(); + } + + void CPUcore::op_ldx_const_w() { + rd.l = op_readpc(); +last_cycle();rd.h = op_readpc(); + op_ldx_w(); + } + + void CPUcore::op_ldy_const_b() { +last_cycle();rd.l = op_readpc(); + op_ldy_b(); + } + + void CPUcore::op_ldy_const_w() { + rd.l = op_readpc(); +last_cycle();rd.h = op_readpc(); + op_ldy_w(); + } + + void CPUcore::op_ora_const_b() { +last_cycle();rd.l = op_readpc(); + op_ora_b(); + } + + void CPUcore::op_ora_const_w() { + rd.l = op_readpc(); +last_cycle();rd.h = op_readpc(); + op_ora_w(); + } + + void CPUcore::op_sbc_const_b() { +last_cycle();rd.l = op_readpc(); + op_sbc_b(); + } + + void CPUcore::op_sbc_const_w() { + rd.l = op_readpc(); +last_cycle();rd.h = op_readpc(); + op_sbc_w(); + } + + + void CPUcore::op_bit_const_b() { +last_cycle();rd.l = op_readpc(); + regs.p.z = ((rd.l & regs.a.l) == 0); + } + + void CPUcore::op_bit_const_w() { + rd.l = op_readpc(); +last_cycle();rd.h = op_readpc(); + regs.p.z = ((rd.w & regs.a.w) == 0); + } + + + void CPUcore::op_adc_addr_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); +last_cycle();rd.l = op_readdbr(aa.w); + op_adc_b(); + } + + void CPUcore::op_adc_addr_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + rd.l = op_readdbr(aa.w + 0); +last_cycle();rd.h = op_readdbr(aa.w + 1); + op_adc_w(); + } + + void CPUcore::op_and_addr_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); +last_cycle();rd.l = op_readdbr(aa.w); + op_and_b(); + } + + void CPUcore::op_and_addr_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + rd.l = op_readdbr(aa.w + 0); +last_cycle();rd.h = op_readdbr(aa.w + 1); + op_and_w(); + } + + void CPUcore::op_bit_addr_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); +last_cycle();rd.l = op_readdbr(aa.w); + op_bit_b(); + } + + void CPUcore::op_bit_addr_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + rd.l = op_readdbr(aa.w + 0); +last_cycle();rd.h = op_readdbr(aa.w + 1); + op_bit_w(); + } + + void CPUcore::op_cmp_addr_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); +last_cycle();rd.l = op_readdbr(aa.w); + op_cmp_b(); + } + + void CPUcore::op_cmp_addr_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + rd.l = op_readdbr(aa.w + 0); +last_cycle();rd.h = op_readdbr(aa.w + 1); + op_cmp_w(); + } + + void CPUcore::op_cpx_addr_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); +last_cycle();rd.l = op_readdbr(aa.w); + op_cpx_b(); + } + + void CPUcore::op_cpx_addr_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + rd.l = op_readdbr(aa.w + 0); +last_cycle();rd.h = op_readdbr(aa.w + 1); + op_cpx_w(); + } + + void CPUcore::op_cpy_addr_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); +last_cycle();rd.l = op_readdbr(aa.w); + op_cpy_b(); + } + + void CPUcore::op_cpy_addr_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + rd.l = op_readdbr(aa.w + 0); +last_cycle();rd.h = op_readdbr(aa.w + 1); + op_cpy_w(); + } + + void CPUcore::op_eor_addr_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); +last_cycle();rd.l = op_readdbr(aa.w); + op_eor_b(); + } + + void CPUcore::op_eor_addr_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + rd.l = op_readdbr(aa.w + 0); +last_cycle();rd.h = op_readdbr(aa.w + 1); + op_eor_w(); + } + + void CPUcore::op_lda_addr_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); +last_cycle();rd.l = op_readdbr(aa.w); + op_lda_b(); + } + + void CPUcore::op_lda_addr_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + rd.l = op_readdbr(aa.w + 0); +last_cycle();rd.h = op_readdbr(aa.w + 1); + op_lda_w(); + } + + void CPUcore::op_ldx_addr_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); +last_cycle();rd.l = op_readdbr(aa.w); + op_ldx_b(); + } + + void CPUcore::op_ldx_addr_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + rd.l = op_readdbr(aa.w + 0); +last_cycle();rd.h = op_readdbr(aa.w + 1); + op_ldx_w(); + } + + void CPUcore::op_ldy_addr_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); +last_cycle();rd.l = op_readdbr(aa.w); + op_ldy_b(); + } + + void CPUcore::op_ldy_addr_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + rd.l = op_readdbr(aa.w + 0); +last_cycle();rd.h = op_readdbr(aa.w + 1); + op_ldy_w(); + } + + void CPUcore::op_ora_addr_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); +last_cycle();rd.l = op_readdbr(aa.w); + op_ora_b(); + } + + void CPUcore::op_ora_addr_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + rd.l = op_readdbr(aa.w + 0); +last_cycle();rd.h = op_readdbr(aa.w + 1); + op_ora_w(); + } + + void CPUcore::op_sbc_addr_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); +last_cycle();rd.l = op_readdbr(aa.w); + op_sbc_b(); + } + + void CPUcore::op_sbc_addr_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + rd.l = op_readdbr(aa.w + 0); +last_cycle();rd.h = op_readdbr(aa.w + 1); + op_sbc_w(); + } + + + void CPUcore::op_adc_addrx_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io_cond4(aa.w, aa.w + regs.x.w); +last_cycle();rd.l = op_readdbr(aa.w + regs.x.w); + op_adc_b(); + } + + void CPUcore::op_adc_addrx_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io_cond4(aa.w, aa.w + regs.x.w); + rd.l = op_readdbr(aa.w + regs.x.w + 0); +last_cycle();rd.h = op_readdbr(aa.w + regs.x.w + 1); + op_adc_w(); + } + + void CPUcore::op_and_addrx_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io_cond4(aa.w, aa.w + regs.x.w); +last_cycle();rd.l = op_readdbr(aa.w + regs.x.w); + op_and_b(); + } + + void CPUcore::op_and_addrx_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io_cond4(aa.w, aa.w + regs.x.w); + rd.l = op_readdbr(aa.w + regs.x.w + 0); +last_cycle();rd.h = op_readdbr(aa.w + regs.x.w + 1); + op_and_w(); + } + + void CPUcore::op_bit_addrx_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io_cond4(aa.w, aa.w + regs.x.w); +last_cycle();rd.l = op_readdbr(aa.w + regs.x.w); + op_bit_b(); + } + + void CPUcore::op_bit_addrx_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io_cond4(aa.w, aa.w + regs.x.w); + rd.l = op_readdbr(aa.w + regs.x.w + 0); +last_cycle();rd.h = op_readdbr(aa.w + regs.x.w + 1); + op_bit_w(); + } + + void CPUcore::op_cmp_addrx_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io_cond4(aa.w, aa.w + regs.x.w); +last_cycle();rd.l = op_readdbr(aa.w + regs.x.w); + op_cmp_b(); + } + + void CPUcore::op_cmp_addrx_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io_cond4(aa.w, aa.w + regs.x.w); + rd.l = op_readdbr(aa.w + regs.x.w + 0); +last_cycle();rd.h = op_readdbr(aa.w + regs.x.w + 1); + op_cmp_w(); + } + + void CPUcore::op_eor_addrx_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io_cond4(aa.w, aa.w + regs.x.w); +last_cycle();rd.l = op_readdbr(aa.w + regs.x.w); + op_eor_b(); + } + + void CPUcore::op_eor_addrx_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io_cond4(aa.w, aa.w + regs.x.w); + rd.l = op_readdbr(aa.w + regs.x.w + 0); +last_cycle();rd.h = op_readdbr(aa.w + regs.x.w + 1); + op_eor_w(); + } + + void CPUcore::op_lda_addrx_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io_cond4(aa.w, aa.w + regs.x.w); +last_cycle();rd.l = op_readdbr(aa.w + regs.x.w); + op_lda_b(); + } + + void CPUcore::op_lda_addrx_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io_cond4(aa.w, aa.w + regs.x.w); + rd.l = op_readdbr(aa.w + regs.x.w + 0); +last_cycle();rd.h = op_readdbr(aa.w + regs.x.w + 1); + op_lda_w(); + } + + void CPUcore::op_ldy_addrx_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io_cond4(aa.w, aa.w + regs.x.w); +last_cycle();rd.l = op_readdbr(aa.w + regs.x.w); + op_ldy_b(); + } + + void CPUcore::op_ldy_addrx_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io_cond4(aa.w, aa.w + regs.x.w); + rd.l = op_readdbr(aa.w + regs.x.w + 0); +last_cycle();rd.h = op_readdbr(aa.w + regs.x.w + 1); + op_ldy_w(); + } + + void CPUcore::op_ora_addrx_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io_cond4(aa.w, aa.w + regs.x.w); +last_cycle();rd.l = op_readdbr(aa.w + regs.x.w); + op_ora_b(); + } + + void CPUcore::op_ora_addrx_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io_cond4(aa.w, aa.w + regs.x.w); + rd.l = op_readdbr(aa.w + regs.x.w + 0); +last_cycle();rd.h = op_readdbr(aa.w + regs.x.w + 1); + op_ora_w(); + } + + void CPUcore::op_sbc_addrx_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io_cond4(aa.w, aa.w + regs.x.w); +last_cycle();rd.l = op_readdbr(aa.w + regs.x.w); + op_sbc_b(); + } + + void CPUcore::op_sbc_addrx_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io_cond4(aa.w, aa.w + regs.x.w); + rd.l = op_readdbr(aa.w + regs.x.w + 0); +last_cycle();rd.h = op_readdbr(aa.w + regs.x.w + 1); + op_sbc_w(); + } + + + void CPUcore::op_adc_addry_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io_cond4(aa.w, aa.w + regs.y.w); +last_cycle();rd.l = op_readdbr(aa.w + regs.y.w); + op_adc_b(); + } + + void CPUcore::op_adc_addry_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io_cond4(aa.w, aa.w + regs.y.w); + rd.l = op_readdbr(aa.w + regs.y.w + 0); +last_cycle();rd.h = op_readdbr(aa.w + regs.y.w + 1); + op_adc_w(); + } + + void CPUcore::op_and_addry_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io_cond4(aa.w, aa.w + regs.y.w); +last_cycle();rd.l = op_readdbr(aa.w + regs.y.w); + op_and_b(); + } + + void CPUcore::op_and_addry_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io_cond4(aa.w, aa.w + regs.y.w); + rd.l = op_readdbr(aa.w + regs.y.w + 0); +last_cycle();rd.h = op_readdbr(aa.w + regs.y.w + 1); + op_and_w(); + } + + void CPUcore::op_cmp_addry_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io_cond4(aa.w, aa.w + regs.y.w); +last_cycle();rd.l = op_readdbr(aa.w + regs.y.w); + op_cmp_b(); + } + + void CPUcore::op_cmp_addry_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io_cond4(aa.w, aa.w + regs.y.w); + rd.l = op_readdbr(aa.w + regs.y.w + 0); +last_cycle();rd.h = op_readdbr(aa.w + regs.y.w + 1); + op_cmp_w(); + } + + void CPUcore::op_eor_addry_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io_cond4(aa.w, aa.w + regs.y.w); +last_cycle();rd.l = op_readdbr(aa.w + regs.y.w); + op_eor_b(); + } + + void CPUcore::op_eor_addry_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io_cond4(aa.w, aa.w + regs.y.w); + rd.l = op_readdbr(aa.w + regs.y.w + 0); +last_cycle();rd.h = op_readdbr(aa.w + regs.y.w + 1); + op_eor_w(); + } + + void CPUcore::op_lda_addry_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io_cond4(aa.w, aa.w + regs.y.w); +last_cycle();rd.l = op_readdbr(aa.w + regs.y.w); + op_lda_b(); + } + + void CPUcore::op_lda_addry_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io_cond4(aa.w, aa.w + regs.y.w); + rd.l = op_readdbr(aa.w + regs.y.w + 0); +last_cycle();rd.h = op_readdbr(aa.w + regs.y.w + 1); + op_lda_w(); + } + + void CPUcore::op_ldx_addry_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io_cond4(aa.w, aa.w + regs.y.w); +last_cycle();rd.l = op_readdbr(aa.w + regs.y.w); + op_ldx_b(); + } + + void CPUcore::op_ldx_addry_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io_cond4(aa.w, aa.w + regs.y.w); + rd.l = op_readdbr(aa.w + regs.y.w + 0); +last_cycle();rd.h = op_readdbr(aa.w + regs.y.w + 1); + op_ldx_w(); + } + + void CPUcore::op_ora_addry_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io_cond4(aa.w, aa.w + regs.y.w); +last_cycle();rd.l = op_readdbr(aa.w + regs.y.w); + op_ora_b(); + } + + void CPUcore::op_ora_addry_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io_cond4(aa.w, aa.w + regs.y.w); + rd.l = op_readdbr(aa.w + regs.y.w + 0); +last_cycle();rd.h = op_readdbr(aa.w + regs.y.w + 1); + op_ora_w(); + } + + void CPUcore::op_sbc_addry_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io_cond4(aa.w, aa.w + regs.y.w); +last_cycle();rd.l = op_readdbr(aa.w + regs.y.w); + op_sbc_b(); + } + + void CPUcore::op_sbc_addry_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io_cond4(aa.w, aa.w + regs.y.w); + rd.l = op_readdbr(aa.w + regs.y.w + 0); +last_cycle();rd.h = op_readdbr(aa.w + regs.y.w + 1); + op_sbc_w(); + } + + + void CPUcore::op_adc_long_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + aa.b = op_readpc(); +last_cycle();rd.l = op_readlong(aa.d); + op_adc_b(); + } + + void CPUcore::op_adc_long_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + aa.b = op_readpc(); + rd.l = op_readlong(aa.d + 0); +last_cycle();rd.h = op_readlong(aa.d + 1); + op_adc_w(); + } + + void CPUcore::op_and_long_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + aa.b = op_readpc(); +last_cycle();rd.l = op_readlong(aa.d); + op_and_b(); + } + + void CPUcore::op_and_long_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + aa.b = op_readpc(); + rd.l = op_readlong(aa.d + 0); +last_cycle();rd.h = op_readlong(aa.d + 1); + op_and_w(); + } + + void CPUcore::op_cmp_long_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + aa.b = op_readpc(); +last_cycle();rd.l = op_readlong(aa.d); + op_cmp_b(); + } + + void CPUcore::op_cmp_long_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + aa.b = op_readpc(); + rd.l = op_readlong(aa.d + 0); +last_cycle();rd.h = op_readlong(aa.d + 1); + op_cmp_w(); + } + + void CPUcore::op_eor_long_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + aa.b = op_readpc(); +last_cycle();rd.l = op_readlong(aa.d); + op_eor_b(); + } + + void CPUcore::op_eor_long_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + aa.b = op_readpc(); + rd.l = op_readlong(aa.d + 0); +last_cycle();rd.h = op_readlong(aa.d + 1); + op_eor_w(); + } + + void CPUcore::op_lda_long_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + aa.b = op_readpc(); +last_cycle();rd.l = op_readlong(aa.d); + op_lda_b(); + } + + void CPUcore::op_lda_long_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + aa.b = op_readpc(); + rd.l = op_readlong(aa.d + 0); +last_cycle();rd.h = op_readlong(aa.d + 1); + op_lda_w(); + } + + void CPUcore::op_ora_long_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + aa.b = op_readpc(); +last_cycle();rd.l = op_readlong(aa.d); + op_ora_b(); + } + + void CPUcore::op_ora_long_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + aa.b = op_readpc(); + rd.l = op_readlong(aa.d + 0); +last_cycle();rd.h = op_readlong(aa.d + 1); + op_ora_w(); + } + + void CPUcore::op_sbc_long_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + aa.b = op_readpc(); +last_cycle();rd.l = op_readlong(aa.d); + op_sbc_b(); + } + + void CPUcore::op_sbc_long_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + aa.b = op_readpc(); + rd.l = op_readlong(aa.d + 0); +last_cycle();rd.h = op_readlong(aa.d + 1); + op_sbc_w(); + } + + + void CPUcore::op_adc_longx_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + aa.b = op_readpc(); +last_cycle();rd.l = op_readlong(aa.d + regs.x.w); + op_adc_b(); + } + + void CPUcore::op_adc_longx_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + aa.b = op_readpc(); + rd.l = op_readlong(aa.d + regs.x.w + 0); +last_cycle();rd.h = op_readlong(aa.d + regs.x.w + 1); + op_adc_w(); + } + + void CPUcore::op_and_longx_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + aa.b = op_readpc(); +last_cycle();rd.l = op_readlong(aa.d + regs.x.w); + op_and_b(); + } + + void CPUcore::op_and_longx_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + aa.b = op_readpc(); + rd.l = op_readlong(aa.d + regs.x.w + 0); +last_cycle();rd.h = op_readlong(aa.d + regs.x.w + 1); + op_and_w(); + } + + void CPUcore::op_cmp_longx_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + aa.b = op_readpc(); +last_cycle();rd.l = op_readlong(aa.d + regs.x.w); + op_cmp_b(); + } + + void CPUcore::op_cmp_longx_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + aa.b = op_readpc(); + rd.l = op_readlong(aa.d + regs.x.w + 0); +last_cycle();rd.h = op_readlong(aa.d + regs.x.w + 1); + op_cmp_w(); + } + + void CPUcore::op_eor_longx_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + aa.b = op_readpc(); +last_cycle();rd.l = op_readlong(aa.d + regs.x.w); + op_eor_b(); + } + + void CPUcore::op_eor_longx_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + aa.b = op_readpc(); + rd.l = op_readlong(aa.d + regs.x.w + 0); +last_cycle();rd.h = op_readlong(aa.d + regs.x.w + 1); + op_eor_w(); + } + + void CPUcore::op_lda_longx_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + aa.b = op_readpc(); +last_cycle();rd.l = op_readlong(aa.d + regs.x.w); + op_lda_b(); + } + + void CPUcore::op_lda_longx_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + aa.b = op_readpc(); + rd.l = op_readlong(aa.d + regs.x.w + 0); +last_cycle();rd.h = op_readlong(aa.d + regs.x.w + 1); + op_lda_w(); + } + + void CPUcore::op_ora_longx_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + aa.b = op_readpc(); +last_cycle();rd.l = op_readlong(aa.d + regs.x.w); + op_ora_b(); + } + + void CPUcore::op_ora_longx_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + aa.b = op_readpc(); + rd.l = op_readlong(aa.d + regs.x.w + 0); +last_cycle();rd.h = op_readlong(aa.d + regs.x.w + 1); + op_ora_w(); + } + + void CPUcore::op_sbc_longx_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + aa.b = op_readpc(); +last_cycle();rd.l = op_readlong(aa.d + regs.x.w); + op_sbc_b(); + } + + void CPUcore::op_sbc_longx_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + aa.b = op_readpc(); + rd.l = op_readlong(aa.d + regs.x.w + 0); +last_cycle();rd.h = op_readlong(aa.d + regs.x.w + 1); + op_sbc_w(); + } + + + void CPUcore::op_adc_dp_b() { + dp = op_readpc(); + op_io_cond2(); +last_cycle();rd.l = op_readdp(dp); + op_adc_b(); + } + + void CPUcore::op_adc_dp_w() { + dp = op_readpc(); + op_io_cond2(); + rd.l = op_readdp(dp + 0); +last_cycle();rd.h = op_readdp(dp + 1); + op_adc_w(); + } + + void CPUcore::op_and_dp_b() { + dp = op_readpc(); + op_io_cond2(); +last_cycle();rd.l = op_readdp(dp); + op_and_b(); + } + + void CPUcore::op_and_dp_w() { + dp = op_readpc(); + op_io_cond2(); + rd.l = op_readdp(dp + 0); +last_cycle();rd.h = op_readdp(dp + 1); + op_and_w(); + } + + void CPUcore::op_bit_dp_b() { + dp = op_readpc(); + op_io_cond2(); +last_cycle();rd.l = op_readdp(dp); + op_bit_b(); + } + + void CPUcore::op_bit_dp_w() { + dp = op_readpc(); + op_io_cond2(); + rd.l = op_readdp(dp + 0); +last_cycle();rd.h = op_readdp(dp + 1); + op_bit_w(); + } + + void CPUcore::op_cmp_dp_b() { + dp = op_readpc(); + op_io_cond2(); +last_cycle();rd.l = op_readdp(dp); + op_cmp_b(); + } + + void CPUcore::op_cmp_dp_w() { + dp = op_readpc(); + op_io_cond2(); + rd.l = op_readdp(dp + 0); +last_cycle();rd.h = op_readdp(dp + 1); + op_cmp_w(); + } + + void CPUcore::op_cpx_dp_b() { + dp = op_readpc(); + op_io_cond2(); +last_cycle();rd.l = op_readdp(dp); + op_cpx_b(); + } + + void CPUcore::op_cpx_dp_w() { + dp = op_readpc(); + op_io_cond2(); + rd.l = op_readdp(dp + 0); +last_cycle();rd.h = op_readdp(dp + 1); + op_cpx_w(); + } + + void CPUcore::op_cpy_dp_b() { + dp = op_readpc(); + op_io_cond2(); +last_cycle();rd.l = op_readdp(dp); + op_cpy_b(); + } + + void CPUcore::op_cpy_dp_w() { + dp = op_readpc(); + op_io_cond2(); + rd.l = op_readdp(dp + 0); +last_cycle();rd.h = op_readdp(dp + 1); + op_cpy_w(); + } + + void CPUcore::op_eor_dp_b() { + dp = op_readpc(); + op_io_cond2(); +last_cycle();rd.l = op_readdp(dp); + op_eor_b(); + } + + void CPUcore::op_eor_dp_w() { + dp = op_readpc(); + op_io_cond2(); + rd.l = op_readdp(dp + 0); +last_cycle();rd.h = op_readdp(dp + 1); + op_eor_w(); + } + + void CPUcore::op_lda_dp_b() { + dp = op_readpc(); + op_io_cond2(); +last_cycle();rd.l = op_readdp(dp); + op_lda_b(); + } + + void CPUcore::op_lda_dp_w() { + dp = op_readpc(); + op_io_cond2(); + rd.l = op_readdp(dp + 0); +last_cycle();rd.h = op_readdp(dp + 1); + op_lda_w(); + } + + void CPUcore::op_ldx_dp_b() { + dp = op_readpc(); + op_io_cond2(); +last_cycle();rd.l = op_readdp(dp); + op_ldx_b(); + } + + void CPUcore::op_ldx_dp_w() { + dp = op_readpc(); + op_io_cond2(); + rd.l = op_readdp(dp + 0); +last_cycle();rd.h = op_readdp(dp + 1); + op_ldx_w(); + } + + void CPUcore::op_ldy_dp_b() { + dp = op_readpc(); + op_io_cond2(); +last_cycle();rd.l = op_readdp(dp); + op_ldy_b(); + } + + void CPUcore::op_ldy_dp_w() { + dp = op_readpc(); + op_io_cond2(); + rd.l = op_readdp(dp + 0); +last_cycle();rd.h = op_readdp(dp + 1); + op_ldy_w(); + } + + void CPUcore::op_ora_dp_b() { + dp = op_readpc(); + op_io_cond2(); +last_cycle();rd.l = op_readdp(dp); + op_ora_b(); + } + + void CPUcore::op_ora_dp_w() { + dp = op_readpc(); + op_io_cond2(); + rd.l = op_readdp(dp + 0); +last_cycle();rd.h = op_readdp(dp + 1); + op_ora_w(); + } + + void CPUcore::op_sbc_dp_b() { + dp = op_readpc(); + op_io_cond2(); +last_cycle();rd.l = op_readdp(dp); + op_sbc_b(); + } + + void CPUcore::op_sbc_dp_w() { + dp = op_readpc(); + op_io_cond2(); + rd.l = op_readdp(dp + 0); +last_cycle();rd.h = op_readdp(dp + 1); + op_sbc_w(); + } + + + void CPUcore::op_adc_dpr_b() { + dp = op_readpc(); + op_io_cond2(); + op_io(); +last_cycle();rd.l = op_readdp(dp + regs.x.w); + op_adc_b(); + } + + void CPUcore::op_adc_dpr_w() { + dp = op_readpc(); + op_io_cond2(); + op_io(); +last_cycle();rd.l = op_readdp(dp + regs.x.w + 0); + rd.h = op_readdp(dp + regs.x.w + 1); + op_adc_w(); + } + + void CPUcore::op_and_dpr_b() { + dp = op_readpc(); + op_io_cond2(); + op_io(); +last_cycle();rd.l = op_readdp(dp + regs.x.w); + op_and_b(); + } + + void CPUcore::op_and_dpr_w() { + dp = op_readpc(); + op_io_cond2(); + op_io(); +last_cycle();rd.l = op_readdp(dp + regs.x.w + 0); + rd.h = op_readdp(dp + regs.x.w + 1); + op_and_w(); + } + + void CPUcore::op_bit_dpr_b() { + dp = op_readpc(); + op_io_cond2(); + op_io(); +last_cycle();rd.l = op_readdp(dp + regs.x.w); + op_bit_b(); + } + + void CPUcore::op_bit_dpr_w() { + dp = op_readpc(); + op_io_cond2(); + op_io(); +last_cycle();rd.l = op_readdp(dp + regs.x.w + 0); + rd.h = op_readdp(dp + regs.x.w + 1); + op_bit_w(); + } + + void CPUcore::op_cmp_dpr_b() { + dp = op_readpc(); + op_io_cond2(); + op_io(); +last_cycle();rd.l = op_readdp(dp + regs.x.w); + op_cmp_b(); + } + + void CPUcore::op_cmp_dpr_w() { + dp = op_readpc(); + op_io_cond2(); + op_io(); +last_cycle();rd.l = op_readdp(dp + regs.x.w + 0); + rd.h = op_readdp(dp + regs.x.w + 1); + op_cmp_w(); + } + + void CPUcore::op_eor_dpr_b() { + dp = op_readpc(); + op_io_cond2(); + op_io(); +last_cycle();rd.l = op_readdp(dp + regs.x.w); + op_eor_b(); + } + + void CPUcore::op_eor_dpr_w() { + dp = op_readpc(); + op_io_cond2(); + op_io(); +last_cycle();rd.l = op_readdp(dp + regs.x.w + 0); + rd.h = op_readdp(dp + regs.x.w + 1); + op_eor_w(); + } + + void CPUcore::op_lda_dpr_b() { + dp = op_readpc(); + op_io_cond2(); + op_io(); +last_cycle();rd.l = op_readdp(dp + regs.x.w); + op_lda_b(); + } + + void CPUcore::op_lda_dpr_w() { + dp = op_readpc(); + op_io_cond2(); + op_io(); +last_cycle();rd.l = op_readdp(dp + regs.x.w + 0); + rd.h = op_readdp(dp + regs.x.w + 1); + op_lda_w(); + } + + void CPUcore::op_ldx_dpr_b() { + dp = op_readpc(); + op_io_cond2(); + op_io(); +last_cycle();rd.l = op_readdp(dp + regs.y.w); + op_ldx_b(); + } + + void CPUcore::op_ldx_dpr_w() { + dp = op_readpc(); + op_io_cond2(); + op_io(); +last_cycle();rd.l = op_readdp(dp + regs.y.w + 0); + rd.h = op_readdp(dp + regs.y.w + 1); + op_ldx_w(); + } + + void CPUcore::op_ldy_dpr_b() { + dp = op_readpc(); + op_io_cond2(); + op_io(); +last_cycle();rd.l = op_readdp(dp + regs.x.w); + op_ldy_b(); + } + + void CPUcore::op_ldy_dpr_w() { + dp = op_readpc(); + op_io_cond2(); + op_io(); +last_cycle();rd.l = op_readdp(dp + regs.x.w + 0); + rd.h = op_readdp(dp + regs.x.w + 1); + op_ldy_w(); + } + + void CPUcore::op_ora_dpr_b() { + dp = op_readpc(); + op_io_cond2(); + op_io(); +last_cycle();rd.l = op_readdp(dp + regs.x.w); + op_ora_b(); + } + + void CPUcore::op_ora_dpr_w() { + dp = op_readpc(); + op_io_cond2(); + op_io(); +last_cycle();rd.l = op_readdp(dp + regs.x.w + 0); + rd.h = op_readdp(dp + regs.x.w + 1); + op_ora_w(); + } + + void CPUcore::op_sbc_dpr_b() { + dp = op_readpc(); + op_io_cond2(); + op_io(); +last_cycle();rd.l = op_readdp(dp + regs.x.w); + op_sbc_b(); + } + + void CPUcore::op_sbc_dpr_w() { + dp = op_readpc(); + op_io_cond2(); + op_io(); +last_cycle();rd.l = op_readdp(dp + regs.x.w + 0); + rd.h = op_readdp(dp + regs.x.w + 1); + op_sbc_w(); + } + + + void CPUcore::op_adc_idp_b() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); +last_cycle();rd.l = op_readdbr(aa.w); + op_adc_b(); + } + + void CPUcore::op_adc_idp_w() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + rd.l = op_readdbr(aa.w + 0); +last_cycle();rd.h = op_readdbr(aa.w + 1); + op_adc_w(); + } + + void CPUcore::op_and_idp_b() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); +last_cycle();rd.l = op_readdbr(aa.w); + op_and_b(); + } + + void CPUcore::op_and_idp_w() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + rd.l = op_readdbr(aa.w + 0); +last_cycle();rd.h = op_readdbr(aa.w + 1); + op_and_w(); + } + + void CPUcore::op_cmp_idp_b() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); +last_cycle();rd.l = op_readdbr(aa.w); + op_cmp_b(); + } + + void CPUcore::op_cmp_idp_w() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + rd.l = op_readdbr(aa.w + 0); +last_cycle();rd.h = op_readdbr(aa.w + 1); + op_cmp_w(); + } + + void CPUcore::op_eor_idp_b() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); +last_cycle();rd.l = op_readdbr(aa.w); + op_eor_b(); + } + + void CPUcore::op_eor_idp_w() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + rd.l = op_readdbr(aa.w + 0); +last_cycle();rd.h = op_readdbr(aa.w + 1); + op_eor_w(); + } + + void CPUcore::op_lda_idp_b() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); +last_cycle();rd.l = op_readdbr(aa.w); + op_lda_b(); + } + + void CPUcore::op_lda_idp_w() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + rd.l = op_readdbr(aa.w + 0); +last_cycle();rd.h = op_readdbr(aa.w + 1); + op_lda_w(); + } + + void CPUcore::op_ora_idp_b() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); +last_cycle();rd.l = op_readdbr(aa.w); + op_ora_b(); + } + + void CPUcore::op_ora_idp_w() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + rd.l = op_readdbr(aa.w + 0); +last_cycle();rd.h = op_readdbr(aa.w + 1); + op_ora_w(); + } + + void CPUcore::op_sbc_idp_b() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); +last_cycle();rd.l = op_readdbr(aa.w); + op_sbc_b(); + } + + void CPUcore::op_sbc_idp_w() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + rd.l = op_readdbr(aa.w + 0); +last_cycle();rd.h = op_readdbr(aa.w + 1); + op_sbc_w(); + } + + + void CPUcore::op_adc_idpx_b() { + dp = op_readpc(); + op_io_cond2(); + op_io(); + aa.l = op_readdp(dp + regs.x.w + 0); + aa.h = op_readdp(dp + regs.x.w + 1); +last_cycle();rd.l = op_readdbr(aa.w); + op_adc_b(); + } + + void CPUcore::op_adc_idpx_w() { + dp = op_readpc(); + op_io_cond2(); + op_io(); + aa.l = op_readdp(dp + regs.x.w + 0); + aa.h = op_readdp(dp + regs.x.w + 1); + rd.l = op_readdbr(aa.w + 0); +last_cycle();rd.h = op_readdbr(aa.w + 1); + op_adc_w(); + } + + void CPUcore::op_and_idpx_b() { + dp = op_readpc(); + op_io_cond2(); + op_io(); + aa.l = op_readdp(dp + regs.x.w + 0); + aa.h = op_readdp(dp + regs.x.w + 1); +last_cycle();rd.l = op_readdbr(aa.w); + op_and_b(); + } + + void CPUcore::op_and_idpx_w() { + dp = op_readpc(); + op_io_cond2(); + op_io(); + aa.l = op_readdp(dp + regs.x.w + 0); + aa.h = op_readdp(dp + regs.x.w + 1); + rd.l = op_readdbr(aa.w + 0); +last_cycle();rd.h = op_readdbr(aa.w + 1); + op_and_w(); + } + + void CPUcore::op_cmp_idpx_b() { + dp = op_readpc(); + op_io_cond2(); + op_io(); + aa.l = op_readdp(dp + regs.x.w + 0); + aa.h = op_readdp(dp + regs.x.w + 1); +last_cycle();rd.l = op_readdbr(aa.w); + op_cmp_b(); + } + + void CPUcore::op_cmp_idpx_w() { + dp = op_readpc(); + op_io_cond2(); + op_io(); + aa.l = op_readdp(dp + regs.x.w + 0); + aa.h = op_readdp(dp + regs.x.w + 1); + rd.l = op_readdbr(aa.w + 0); +last_cycle();rd.h = op_readdbr(aa.w + 1); + op_cmp_w(); + } + + void CPUcore::op_eor_idpx_b() { + dp = op_readpc(); + op_io_cond2(); + op_io(); + aa.l = op_readdp(dp + regs.x.w + 0); + aa.h = op_readdp(dp + regs.x.w + 1); +last_cycle();rd.l = op_readdbr(aa.w); + op_eor_b(); + } + + void CPUcore::op_eor_idpx_w() { + dp = op_readpc(); + op_io_cond2(); + op_io(); + aa.l = op_readdp(dp + regs.x.w + 0); + aa.h = op_readdp(dp + regs.x.w + 1); + rd.l = op_readdbr(aa.w + 0); +last_cycle();rd.h = op_readdbr(aa.w + 1); + op_eor_w(); + } + + void CPUcore::op_lda_idpx_b() { + dp = op_readpc(); + op_io_cond2(); + op_io(); + aa.l = op_readdp(dp + regs.x.w + 0); + aa.h = op_readdp(dp + regs.x.w + 1); +last_cycle();rd.l = op_readdbr(aa.w); + op_lda_b(); + } + + void CPUcore::op_lda_idpx_w() { + dp = op_readpc(); + op_io_cond2(); + op_io(); + aa.l = op_readdp(dp + regs.x.w + 0); + aa.h = op_readdp(dp + regs.x.w + 1); + rd.l = op_readdbr(aa.w + 0); +last_cycle();rd.h = op_readdbr(aa.w + 1); + op_lda_w(); + } + + void CPUcore::op_ora_idpx_b() { + dp = op_readpc(); + op_io_cond2(); + op_io(); + aa.l = op_readdp(dp + regs.x.w + 0); + aa.h = op_readdp(dp + regs.x.w + 1); +last_cycle();rd.l = op_readdbr(aa.w); + op_ora_b(); + } + + void CPUcore::op_ora_idpx_w() { + dp = op_readpc(); + op_io_cond2(); + op_io(); + aa.l = op_readdp(dp + regs.x.w + 0); + aa.h = op_readdp(dp + regs.x.w + 1); + rd.l = op_readdbr(aa.w + 0); +last_cycle();rd.h = op_readdbr(aa.w + 1); + op_ora_w(); + } + + void CPUcore::op_sbc_idpx_b() { + dp = op_readpc(); + op_io_cond2(); + op_io(); + aa.l = op_readdp(dp + regs.x.w + 0); + aa.h = op_readdp(dp + regs.x.w + 1); +last_cycle();rd.l = op_readdbr(aa.w); + op_sbc_b(); + } + + void CPUcore::op_sbc_idpx_w() { + dp = op_readpc(); + op_io_cond2(); + op_io(); + aa.l = op_readdp(dp + regs.x.w + 0); + aa.h = op_readdp(dp + regs.x.w + 1); + rd.l = op_readdbr(aa.w + 0); +last_cycle();rd.h = op_readdbr(aa.w + 1); + op_sbc_w(); + } + + + void CPUcore::op_adc_idpy_b() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + op_io_cond4(aa.w, aa.w + regs.y.w); +last_cycle();rd.l = op_readdbr(aa.w + regs.y.w); + op_adc_b(); + } + + void CPUcore::op_adc_idpy_w() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + op_io_cond4(aa.w, aa.w + regs.y.w); + rd.l = op_readdbr(aa.w + regs.y.w + 0); +last_cycle();rd.h = op_readdbr(aa.w + regs.y.w + 1); + op_adc_w(); + } + + void CPUcore::op_and_idpy_b() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + op_io_cond4(aa.w, aa.w + regs.y.w); +last_cycle();rd.l = op_readdbr(aa.w + regs.y.w); + op_and_b(); + } + + void CPUcore::op_and_idpy_w() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + op_io_cond4(aa.w, aa.w + regs.y.w); + rd.l = op_readdbr(aa.w + regs.y.w + 0); +last_cycle();rd.h = op_readdbr(aa.w + regs.y.w + 1); + op_and_w(); + } + + void CPUcore::op_cmp_idpy_b() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + op_io_cond4(aa.w, aa.w + regs.y.w); +last_cycle();rd.l = op_readdbr(aa.w + regs.y.w); + op_cmp_b(); + } + + void CPUcore::op_cmp_idpy_w() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + op_io_cond4(aa.w, aa.w + regs.y.w); + rd.l = op_readdbr(aa.w + regs.y.w + 0); +last_cycle();rd.h = op_readdbr(aa.w + regs.y.w + 1); + op_cmp_w(); + } + + void CPUcore::op_eor_idpy_b() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + op_io_cond4(aa.w, aa.w + regs.y.w); +last_cycle();rd.l = op_readdbr(aa.w + regs.y.w); + op_eor_b(); + } + + void CPUcore::op_eor_idpy_w() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + op_io_cond4(aa.w, aa.w + regs.y.w); + rd.l = op_readdbr(aa.w + regs.y.w + 0); +last_cycle();rd.h = op_readdbr(aa.w + regs.y.w + 1); + op_eor_w(); + } + + void CPUcore::op_lda_idpy_b() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + op_io_cond4(aa.w, aa.w + regs.y.w); +last_cycle();rd.l = op_readdbr(aa.w + regs.y.w); + op_lda_b(); + } + + void CPUcore::op_lda_idpy_w() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + op_io_cond4(aa.w, aa.w + regs.y.w); + rd.l = op_readdbr(aa.w + regs.y.w + 0); +last_cycle();rd.h = op_readdbr(aa.w + regs.y.w + 1); + op_lda_w(); + } + + void CPUcore::op_ora_idpy_b() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + op_io_cond4(aa.w, aa.w + regs.y.w); +last_cycle();rd.l = op_readdbr(aa.w + regs.y.w); + op_ora_b(); + } + + void CPUcore::op_ora_idpy_w() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + op_io_cond4(aa.w, aa.w + regs.y.w); + rd.l = op_readdbr(aa.w + regs.y.w + 0); +last_cycle();rd.h = op_readdbr(aa.w + regs.y.w + 1); + op_ora_w(); + } + + void CPUcore::op_sbc_idpy_b() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + op_io_cond4(aa.w, aa.w + regs.y.w); +last_cycle();rd.l = op_readdbr(aa.w + regs.y.w); + op_sbc_b(); + } + + void CPUcore::op_sbc_idpy_w() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + op_io_cond4(aa.w, aa.w + regs.y.w); + rd.l = op_readdbr(aa.w + regs.y.w + 0); +last_cycle();rd.h = op_readdbr(aa.w + regs.y.w + 1); + op_sbc_w(); + } + + + void CPUcore::op_adc_ildp_b() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + aa.b = op_readdp(dp + 2); +last_cycle();rd.l = op_readlong(aa.d); + op_adc_b(); + } + + void CPUcore::op_adc_ildp_w() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + aa.b = op_readdp(dp + 2); + rd.l = op_readlong(aa.d + 0); +last_cycle();rd.h = op_readlong(aa.d + 1); + op_adc_w(); + } + + void CPUcore::op_and_ildp_b() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + aa.b = op_readdp(dp + 2); +last_cycle();rd.l = op_readlong(aa.d); + op_and_b(); + } + + void CPUcore::op_and_ildp_w() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + aa.b = op_readdp(dp + 2); + rd.l = op_readlong(aa.d + 0); +last_cycle();rd.h = op_readlong(aa.d + 1); + op_and_w(); + } + + void CPUcore::op_cmp_ildp_b() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + aa.b = op_readdp(dp + 2); +last_cycle();rd.l = op_readlong(aa.d); + op_cmp_b(); + } + + void CPUcore::op_cmp_ildp_w() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + aa.b = op_readdp(dp + 2); + rd.l = op_readlong(aa.d + 0); +last_cycle();rd.h = op_readlong(aa.d + 1); + op_cmp_w(); + } + + void CPUcore::op_eor_ildp_b() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + aa.b = op_readdp(dp + 2); +last_cycle();rd.l = op_readlong(aa.d); + op_eor_b(); + } + + void CPUcore::op_eor_ildp_w() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + aa.b = op_readdp(dp + 2); + rd.l = op_readlong(aa.d + 0); +last_cycle();rd.h = op_readlong(aa.d + 1); + op_eor_w(); + } + + void CPUcore::op_lda_ildp_b() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + aa.b = op_readdp(dp + 2); +last_cycle();rd.l = op_readlong(aa.d); + op_lda_b(); + } + + void CPUcore::op_lda_ildp_w() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + aa.b = op_readdp(dp + 2); + rd.l = op_readlong(aa.d + 0); +last_cycle();rd.h = op_readlong(aa.d + 1); + op_lda_w(); + } + + void CPUcore::op_ora_ildp_b() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + aa.b = op_readdp(dp + 2); +last_cycle();rd.l = op_readlong(aa.d); + op_ora_b(); + } + + void CPUcore::op_ora_ildp_w() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + aa.b = op_readdp(dp + 2); + rd.l = op_readlong(aa.d + 0); +last_cycle();rd.h = op_readlong(aa.d + 1); + op_ora_w(); + } + + void CPUcore::op_sbc_ildp_b() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + aa.b = op_readdp(dp + 2); +last_cycle();rd.l = op_readlong(aa.d); + op_sbc_b(); + } + + void CPUcore::op_sbc_ildp_w() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + aa.b = op_readdp(dp + 2); + rd.l = op_readlong(aa.d + 0); +last_cycle();rd.h = op_readlong(aa.d + 1); + op_sbc_w(); + } + + + void CPUcore::op_adc_ildpy_b() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + aa.b = op_readdp(dp + 2); +last_cycle();rd.l = op_readlong(aa.d + regs.y.w); + op_adc_b(); + } + + void CPUcore::op_adc_ildpy_w() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + aa.b = op_readdp(dp + 2); + rd.l = op_readlong(aa.d + regs.y.w + 0); +last_cycle();rd.h = op_readlong(aa.d + regs.y.w + 1); + op_adc_w(); + } + + void CPUcore::op_and_ildpy_b() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + aa.b = op_readdp(dp + 2); +last_cycle();rd.l = op_readlong(aa.d + regs.y.w); + op_and_b(); + } + + void CPUcore::op_and_ildpy_w() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + aa.b = op_readdp(dp + 2); + rd.l = op_readlong(aa.d + regs.y.w + 0); +last_cycle();rd.h = op_readlong(aa.d + regs.y.w + 1); + op_and_w(); + } + + void CPUcore::op_cmp_ildpy_b() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + aa.b = op_readdp(dp + 2); +last_cycle();rd.l = op_readlong(aa.d + regs.y.w); + op_cmp_b(); + } + + void CPUcore::op_cmp_ildpy_w() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + aa.b = op_readdp(dp + 2); + rd.l = op_readlong(aa.d + regs.y.w + 0); +last_cycle();rd.h = op_readlong(aa.d + regs.y.w + 1); + op_cmp_w(); + } + + void CPUcore::op_eor_ildpy_b() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + aa.b = op_readdp(dp + 2); +last_cycle();rd.l = op_readlong(aa.d + regs.y.w); + op_eor_b(); + } + + void CPUcore::op_eor_ildpy_w() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + aa.b = op_readdp(dp + 2); + rd.l = op_readlong(aa.d + regs.y.w + 0); +last_cycle();rd.h = op_readlong(aa.d + regs.y.w + 1); + op_eor_w(); + } + + void CPUcore::op_lda_ildpy_b() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + aa.b = op_readdp(dp + 2); +last_cycle();rd.l = op_readlong(aa.d + regs.y.w); + op_lda_b(); + } + + void CPUcore::op_lda_ildpy_w() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + aa.b = op_readdp(dp + 2); + rd.l = op_readlong(aa.d + regs.y.w + 0); +last_cycle();rd.h = op_readlong(aa.d + regs.y.w + 1); + op_lda_w(); + } + + void CPUcore::op_ora_ildpy_b() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + aa.b = op_readdp(dp + 2); +last_cycle();rd.l = op_readlong(aa.d + regs.y.w); + op_ora_b(); + } + + void CPUcore::op_ora_ildpy_w() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + aa.b = op_readdp(dp + 2); + rd.l = op_readlong(aa.d + regs.y.w + 0); +last_cycle();rd.h = op_readlong(aa.d + regs.y.w + 1); + op_ora_w(); + } + + void CPUcore::op_sbc_ildpy_b() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + aa.b = op_readdp(dp + 2); +last_cycle();rd.l = op_readlong(aa.d + regs.y.w); + op_sbc_b(); + } + + void CPUcore::op_sbc_ildpy_w() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + aa.b = op_readdp(dp + 2); + rd.l = op_readlong(aa.d + regs.y.w + 0); +last_cycle();rd.h = op_readlong(aa.d + regs.y.w + 1); + op_sbc_w(); + } + + + void CPUcore::op_adc_sr_b() { + sp = op_readpc(); + op_io(); +last_cycle();rd.l = op_readsp(sp); + op_adc_b(); + } + + void CPUcore::op_adc_sr_w() { + sp = op_readpc(); + op_io(); + rd.l = op_readsp(sp + 0); +last_cycle();rd.h = op_readsp(sp + 1); + op_adc_w(); + } + + void CPUcore::op_and_sr_b() { + sp = op_readpc(); + op_io(); +last_cycle();rd.l = op_readsp(sp); + op_and_b(); + } + + void CPUcore::op_and_sr_w() { + sp = op_readpc(); + op_io(); + rd.l = op_readsp(sp + 0); +last_cycle();rd.h = op_readsp(sp + 1); + op_and_w(); + } + + void CPUcore::op_cmp_sr_b() { + sp = op_readpc(); + op_io(); +last_cycle();rd.l = op_readsp(sp); + op_cmp_b(); + } + + void CPUcore::op_cmp_sr_w() { + sp = op_readpc(); + op_io(); + rd.l = op_readsp(sp + 0); +last_cycle();rd.h = op_readsp(sp + 1); + op_cmp_w(); + } + + void CPUcore::op_eor_sr_b() { + sp = op_readpc(); + op_io(); +last_cycle();rd.l = op_readsp(sp); + op_eor_b(); + } + + void CPUcore::op_eor_sr_w() { + sp = op_readpc(); + op_io(); + rd.l = op_readsp(sp + 0); +last_cycle();rd.h = op_readsp(sp + 1); + op_eor_w(); + } + + void CPUcore::op_lda_sr_b() { + sp = op_readpc(); + op_io(); +last_cycle();rd.l = op_readsp(sp); + op_lda_b(); + } + + void CPUcore::op_lda_sr_w() { + sp = op_readpc(); + op_io(); + rd.l = op_readsp(sp + 0); +last_cycle();rd.h = op_readsp(sp + 1); + op_lda_w(); + } + + void CPUcore::op_ora_sr_b() { + sp = op_readpc(); + op_io(); +last_cycle();rd.l = op_readsp(sp); + op_ora_b(); + } + + void CPUcore::op_ora_sr_w() { + sp = op_readpc(); + op_io(); + rd.l = op_readsp(sp + 0); +last_cycle();rd.h = op_readsp(sp + 1); + op_ora_w(); + } + + void CPUcore::op_sbc_sr_b() { + sp = op_readpc(); + op_io(); +last_cycle();rd.l = op_readsp(sp); + op_sbc_b(); + } + + void CPUcore::op_sbc_sr_w() { + sp = op_readpc(); + op_io(); + rd.l = op_readsp(sp + 0); +last_cycle();rd.h = op_readsp(sp + 1); + op_sbc_w(); + } + + + void CPUcore::op_adc_isry_b() { + sp = op_readpc(); + op_io(); + aa.l = op_readsp(sp + 0); + aa.h = op_readsp(sp + 1); + op_io(); +last_cycle();rd.l = op_readdbr(aa.w + regs.y.w); + op_adc_b(); + } + + void CPUcore::op_adc_isry_w() { + sp = op_readpc(); + op_io(); + aa.l = op_readsp(sp + 0); + aa.h = op_readsp(sp + 1); + op_io(); + rd.l = op_readdbr(aa.w + regs.y.w + 0); +last_cycle();rd.h = op_readdbr(aa.w + regs.y.w + 1); + op_adc_w(); + } + + void CPUcore::op_and_isry_b() { + sp = op_readpc(); + op_io(); + aa.l = op_readsp(sp + 0); + aa.h = op_readsp(sp + 1); + op_io(); +last_cycle();rd.l = op_readdbr(aa.w + regs.y.w); + op_and_b(); + } + + void CPUcore::op_and_isry_w() { + sp = op_readpc(); + op_io(); + aa.l = op_readsp(sp + 0); + aa.h = op_readsp(sp + 1); + op_io(); + rd.l = op_readdbr(aa.w + regs.y.w + 0); +last_cycle();rd.h = op_readdbr(aa.w + regs.y.w + 1); + op_and_w(); + } + + void CPUcore::op_cmp_isry_b() { + sp = op_readpc(); + op_io(); + aa.l = op_readsp(sp + 0); + aa.h = op_readsp(sp + 1); + op_io(); +last_cycle();rd.l = op_readdbr(aa.w + regs.y.w); + op_cmp_b(); + } + + void CPUcore::op_cmp_isry_w() { + sp = op_readpc(); + op_io(); + aa.l = op_readsp(sp + 0); + aa.h = op_readsp(sp + 1); + op_io(); + rd.l = op_readdbr(aa.w + regs.y.w + 0); +last_cycle();rd.h = op_readdbr(aa.w + regs.y.w + 1); + op_cmp_w(); + } + + void CPUcore::op_eor_isry_b() { + sp = op_readpc(); + op_io(); + aa.l = op_readsp(sp + 0); + aa.h = op_readsp(sp + 1); + op_io(); +last_cycle();rd.l = op_readdbr(aa.w + regs.y.w); + op_eor_b(); + } + + void CPUcore::op_eor_isry_w() { + sp = op_readpc(); + op_io(); + aa.l = op_readsp(sp + 0); + aa.h = op_readsp(sp + 1); + op_io(); + rd.l = op_readdbr(aa.w + regs.y.w + 0); +last_cycle();rd.h = op_readdbr(aa.w + regs.y.w + 1); + op_eor_w(); + } + + void CPUcore::op_lda_isry_b() { + sp = op_readpc(); + op_io(); + aa.l = op_readsp(sp + 0); + aa.h = op_readsp(sp + 1); + op_io(); +last_cycle();rd.l = op_readdbr(aa.w + regs.y.w); + op_lda_b(); + } + + void CPUcore::op_lda_isry_w() { + sp = op_readpc(); + op_io(); + aa.l = op_readsp(sp + 0); + aa.h = op_readsp(sp + 1); + op_io(); + rd.l = op_readdbr(aa.w + regs.y.w + 0); +last_cycle();rd.h = op_readdbr(aa.w + regs.y.w + 1); + op_lda_w(); + } + + void CPUcore::op_ora_isry_b() { + sp = op_readpc(); + op_io(); + aa.l = op_readsp(sp + 0); + aa.h = op_readsp(sp + 1); + op_io(); +last_cycle();rd.l = op_readdbr(aa.w + regs.y.w); + op_ora_b(); + } + + void CPUcore::op_ora_isry_w() { + sp = op_readpc(); + op_io(); + aa.l = op_readsp(sp + 0); + aa.h = op_readsp(sp + 1); + op_io(); + rd.l = op_readdbr(aa.w + regs.y.w + 0); +last_cycle();rd.h = op_readdbr(aa.w + regs.y.w + 1); + op_ora_w(); + } + + void CPUcore::op_sbc_isry_b() { + sp = op_readpc(); + op_io(); + aa.l = op_readsp(sp + 0); + aa.h = op_readsp(sp + 1); + op_io(); +last_cycle();rd.l = op_readdbr(aa.w + regs.y.w); + op_sbc_b(); + } + + void CPUcore::op_sbc_isry_w() { + sp = op_readpc(); + op_io(); + aa.l = op_readsp(sp + 0); + aa.h = op_readsp(sp + 1); + op_io(); + rd.l = op_readdbr(aa.w + regs.y.w + 0); +last_cycle();rd.h = op_readdbr(aa.w + regs.y.w + 1); + op_sbc_w(); + } + + +//================ +//opcode_write.bpp +//================ + + void CPUcore::op_sta_addr_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); +last_cycle();op_writedbr(aa.w, regs.a.w); + } + + void CPUcore::op_sta_addr_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_writedbr(aa.w + 0, regs.a.w >> 0); +last_cycle();op_writedbr(aa.w + 1, regs.a.w >> 8); + } + + void CPUcore::op_stx_addr_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); +last_cycle();op_writedbr(aa.w, regs.x.w); + } + + void CPUcore::op_stx_addr_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_writedbr(aa.w + 0, regs.x.w >> 0); +last_cycle();op_writedbr(aa.w + 1, regs.x.w >> 8); + } + + void CPUcore::op_sty_addr_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); +last_cycle();op_writedbr(aa.w, regs.y.w); + } + + void CPUcore::op_sty_addr_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_writedbr(aa.w + 0, regs.y.w >> 0); +last_cycle();op_writedbr(aa.w + 1, regs.y.w >> 8); + } + + void CPUcore::op_stz_addr_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); +last_cycle();op_writedbr(aa.w, 0x0000); + } + + void CPUcore::op_stz_addr_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_writedbr(aa.w + 0, 0x0000 >> 0); +last_cycle();op_writedbr(aa.w + 1, 0x0000 >> 8); + } + + + void CPUcore::op_sta_addrx_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io(); +last_cycle();op_writedbr(aa.w + regs.x.w, regs.a.w); + } + + void CPUcore::op_sta_addrx_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io(); + op_writedbr(aa.w + regs.x.w + 0, regs.a.w >> 0); +last_cycle();op_writedbr(aa.w + regs.x.w + 1, regs.a.w >> 8); + } + + void CPUcore::op_sta_addry_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io(); +last_cycle();op_writedbr(aa.w + regs.y.w, regs.a.w); + } + + void CPUcore::op_sta_addry_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io(); + op_writedbr(aa.w + regs.y.w + 0, regs.a.w >> 0); +last_cycle();op_writedbr(aa.w + regs.y.w + 1, regs.a.w >> 8); + } + + void CPUcore::op_stz_addrx_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io(); +last_cycle();op_writedbr(aa.w + regs.x.w, 0x0000); + } + + void CPUcore::op_stz_addrx_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io(); + op_writedbr(aa.w + regs.x.w + 0, 0x0000 >> 0); +last_cycle();op_writedbr(aa.w + regs.x.w + 1, 0x0000 >> 8); + } + + + void CPUcore::op_sta_long_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + aa.b = op_readpc(); +last_cycle();op_writelong(aa.d + 0x0000, regs.a.l); + } + + void CPUcore::op_sta_long_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + aa.b = op_readpc(); + op_writelong(aa.d + 0x0000 + 0, regs.a.l); +last_cycle();op_writelong(aa.d + 0x0000 + 1, regs.a.h); + } + + void CPUcore::op_sta_longx_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + aa.b = op_readpc(); +last_cycle();op_writelong(aa.d + regs.x.w, regs.a.l); + } + + void CPUcore::op_sta_longx_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + aa.b = op_readpc(); + op_writelong(aa.d + regs.x.w + 0, regs.a.l); +last_cycle();op_writelong(aa.d + regs.x.w + 1, regs.a.h); + } + + + void CPUcore::op_sta_dp_b() { + dp = op_readpc(); + op_io_cond2(); +last_cycle();op_writedp(dp, regs.a.w); + } + + void CPUcore::op_sta_dp_w() { + dp = op_readpc(); + op_io_cond2(); + op_writedp(dp + 0, regs.a.w >> 0); +last_cycle();op_writedp(dp + 1, regs.a.w >> 8); + } + + void CPUcore::op_stx_dp_b() { + dp = op_readpc(); + op_io_cond2(); +last_cycle();op_writedp(dp, regs.x.w); + } + + void CPUcore::op_stx_dp_w() { + dp = op_readpc(); + op_io_cond2(); + op_writedp(dp + 0, regs.x.w >> 0); +last_cycle();op_writedp(dp + 1, regs.x.w >> 8); + } + + void CPUcore::op_sty_dp_b() { + dp = op_readpc(); + op_io_cond2(); +last_cycle();op_writedp(dp, regs.y.w); + } + + void CPUcore::op_sty_dp_w() { + dp = op_readpc(); + op_io_cond2(); + op_writedp(dp + 0, regs.y.w >> 0); +last_cycle();op_writedp(dp + 1, regs.y.w >> 8); + } + + void CPUcore::op_stz_dp_b() { + dp = op_readpc(); + op_io_cond2(); +last_cycle();op_writedp(dp, 0x0000); + } + + void CPUcore::op_stz_dp_w() { + dp = op_readpc(); + op_io_cond2(); + op_writedp(dp + 0, 0x0000 >> 0); +last_cycle();op_writedp(dp + 1, 0x0000 >> 8); + } + + + void CPUcore::op_sta_dpr_b() { + dp = op_readpc(); + op_io_cond2(); + op_io(); +last_cycle();op_writedp(dp + regs.x.w, regs.a.w); + } + + void CPUcore::op_sta_dpr_w() { + dp = op_readpc(); + op_io_cond2(); + op_io(); + op_writedp(dp + regs.x.w + 0, regs.a.w >> 0); +last_cycle();op_writedp(dp + regs.x.w + 1, regs.a.w >> 8); + } + + void CPUcore::op_stx_dpr_b() { + dp = op_readpc(); + op_io_cond2(); + op_io(); +last_cycle();op_writedp(dp + regs.y.w, regs.x.w); + } + + void CPUcore::op_stx_dpr_w() { + dp = op_readpc(); + op_io_cond2(); + op_io(); + op_writedp(dp + regs.y.w + 0, regs.x.w >> 0); +last_cycle();op_writedp(dp + regs.y.w + 1, regs.x.w >> 8); + } + + void CPUcore::op_sty_dpr_b() { + dp = op_readpc(); + op_io_cond2(); + op_io(); +last_cycle();op_writedp(dp + regs.x.w, regs.y.w); + } + + void CPUcore::op_sty_dpr_w() { + dp = op_readpc(); + op_io_cond2(); + op_io(); + op_writedp(dp + regs.x.w + 0, regs.y.w >> 0); +last_cycle();op_writedp(dp + regs.x.w + 1, regs.y.w >> 8); + } + + void CPUcore::op_stz_dpr_b() { + dp = op_readpc(); + op_io_cond2(); + op_io(); +last_cycle();op_writedp(dp + regs.x.w, 0x0000); + } + + void CPUcore::op_stz_dpr_w() { + dp = op_readpc(); + op_io_cond2(); + op_io(); + op_writedp(dp + regs.x.w + 0, 0x0000 >> 0); +last_cycle();op_writedp(dp + regs.x.w + 1, 0x0000 >> 8); + } + + + void CPUcore::op_sta_idp_b() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); +last_cycle();op_writedbr(aa.w, regs.a.l); + } + + void CPUcore::op_sta_idp_w() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + op_writedbr(aa.w + 0, regs.a.l); +last_cycle();op_writedbr(aa.w + 1, regs.a.h); + } + + void CPUcore::op_sta_ildp_b() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + aa.b = op_readdp(dp + 2); +last_cycle();op_writelong(aa.d, regs.a.l); + } + + void CPUcore::op_sta_ildp_w() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + aa.b = op_readdp(dp + 2); + op_writelong(aa.d + 0, regs.a.l); +last_cycle();op_writelong(aa.d + 1, regs.a.h); + } + + void CPUcore::op_sta_idpx_b() { + dp = op_readpc(); + op_io_cond2(); + op_io(); + aa.l = op_readdp(dp + regs.x.w + 0); + aa.h = op_readdp(dp + regs.x.w + 1); +last_cycle();op_writedbr(aa.w, regs.a.l); + } + + void CPUcore::op_sta_idpx_w() { + dp = op_readpc(); + op_io_cond2(); + op_io(); + aa.l = op_readdp(dp + regs.x.w + 0); + aa.h = op_readdp(dp + regs.x.w + 1); + op_writedbr(aa.w + 0, regs.a.l); +last_cycle();op_writedbr(aa.w + 1, regs.a.h); + } + + void CPUcore::op_sta_idpy_b() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + op_io(); +last_cycle();op_writedbr(aa.w + regs.y.w, regs.a.l); + } + + void CPUcore::op_sta_idpy_w() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + op_io(); + op_writedbr(aa.w + regs.y.w + 0, regs.a.l); +last_cycle();op_writedbr(aa.w + regs.y.w + 1, regs.a.h); + } + + void CPUcore::op_sta_ildpy_b() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + aa.b = op_readdp(dp + 2); +last_cycle();op_writelong(aa.d + regs.y.w, regs.a.l); + } + + void CPUcore::op_sta_ildpy_w() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + aa.b = op_readdp(dp + 2); + op_writelong(aa.d + regs.y.w + 0, regs.a.l); +last_cycle();op_writelong(aa.d + regs.y.w + 1, regs.a.h); + } + + void CPUcore::op_sta_sr_b() { + sp = op_readpc(); + op_io(); +last_cycle();op_writesp(sp, regs.a.l); + } + + void CPUcore::op_sta_sr_w() { + sp = op_readpc(); + op_io(); + op_writesp(sp + 0, regs.a.l); +last_cycle();op_writesp(sp + 1, regs.a.h); + } + + void CPUcore::op_sta_isry_b() { + sp = op_readpc(); + op_io(); + aa.l = op_readsp(sp + 0); + aa.h = op_readsp(sp + 1); + op_io(); +last_cycle();op_writedbr(aa.w + regs.y.w, regs.a.l); + } + + void CPUcore::op_sta_isry_w() { + sp = op_readpc(); + op_io(); + aa.l = op_readsp(sp + 0); + aa.h = op_readsp(sp + 1); + op_io(); + op_writedbr(aa.w + regs.y.w + 0, regs.a.l); +last_cycle();op_writedbr(aa.w + regs.y.w + 1, regs.a.h); + } + + +//============== +//opcode_rmw.bpp +//============== + + void CPUcore::op_inc_imm_b() { +last_cycle();op_io_irq(); + regs.a.l ++; + regs.p.n = (regs.a.l & 0x80); + regs.p.z = (regs.a.l == 0); + } + + void CPUcore::op_inc_imm_w() { +last_cycle();op_io_irq(); + regs.a.w ++; + regs.p.n = (regs.a.w & 0x8000); + regs.p.z = (regs.a.w == 0); + } + + void CPUcore::op_inx_imm_b() { +last_cycle();op_io_irq(); + regs.x.l ++; + regs.p.n = (regs.x.l & 0x80); + regs.p.z = (regs.x.l == 0); + } + + void CPUcore::op_inx_imm_w() { +last_cycle();op_io_irq(); + regs.x.w ++; + regs.p.n = (regs.x.w & 0x8000); + regs.p.z = (regs.x.w == 0); + } + + void CPUcore::op_iny_imm_b() { +last_cycle();op_io_irq(); + regs.y.l ++; + regs.p.n = (regs.y.l & 0x80); + regs.p.z = (regs.y.l == 0); + } + + void CPUcore::op_iny_imm_w() { +last_cycle();op_io_irq(); + regs.y.w ++; + regs.p.n = (regs.y.w & 0x8000); + regs.p.z = (regs.y.w == 0); + } + + void CPUcore::op_dec_imm_b() { +last_cycle();op_io_irq(); + regs.a.l --; + regs.p.n = (regs.a.l & 0x80); + regs.p.z = (regs.a.l == 0); + } + + void CPUcore::op_dec_imm_w() { +last_cycle();op_io_irq(); + regs.a.w --; + regs.p.n = (regs.a.w & 0x8000); + regs.p.z = (regs.a.w == 0); + } + + void CPUcore::op_dex_imm_b() { +last_cycle();op_io_irq(); + regs.x.l --; + regs.p.n = (regs.x.l & 0x80); + regs.p.z = (regs.x.l == 0); + } + + void CPUcore::op_dex_imm_w() { +last_cycle();op_io_irq(); + regs.x.w --; + regs.p.n = (regs.x.w & 0x8000); + regs.p.z = (regs.x.w == 0); + } + + void CPUcore::op_dey_imm_b() { +last_cycle();op_io_irq(); + regs.y.l --; + regs.p.n = (regs.y.l & 0x80); + regs.p.z = (regs.y.l == 0); + } + + void CPUcore::op_dey_imm_w() { +last_cycle();op_io_irq(); + regs.y.w --; + regs.p.n = (regs.y.w & 0x8000); + regs.p.z = (regs.y.w == 0); + } + + + void CPUcore::op_asl_imm_b() { +last_cycle();op_io_irq(); + regs.p.c = (regs.a.l & 0x80); + regs.a.l <<= 1; + regs.p.n = (regs.a.l & 0x80); + regs.p.z = (regs.a.l == 0); + } + + void CPUcore::op_asl_imm_w() { +last_cycle();op_io_irq(); + regs.p.c = (regs.a.w & 0x8000); + regs.a.w <<= 1; + regs.p.n = (regs.a.w & 0x8000); + regs.p.z = (regs.a.w == 0); + } + + void CPUcore::op_lsr_imm_b() { +last_cycle();op_io_irq(); + regs.p.c = (regs.a.l & 0x01); + regs.a.l >>= 1; + regs.p.n = (regs.a.l & 0x80); + regs.p.z = (regs.a.l == 0); + } + + void CPUcore::op_lsr_imm_w() { +last_cycle();op_io_irq(); + regs.p.c = (regs.a.w & 0x0001); + regs.a.w >>= 1; + regs.p.n = (regs.a.w & 0x8000); + regs.p.z = (regs.a.w == 0); + } + + void CPUcore::op_rol_imm_b() { +last_cycle();op_io_irq(); + bool carry = regs.p.c; + regs.p.c = (regs.a.l & 0x80); + regs.a.l = (regs.a.l << 1) | carry; + regs.p.n = (regs.a.l & 0x80); + regs.p.z = (regs.a.l == 0); + } + + void CPUcore::op_rol_imm_w() { +last_cycle();op_io_irq(); + bool carry = regs.p.c; + regs.p.c = (regs.a.w & 0x8000); + regs.a.w = (regs.a.w << 1) | carry; + regs.p.n = (regs.a.w & 0x8000); + regs.p.z = (regs.a.w == 0); + } + + void CPUcore::op_ror_imm_b() { +last_cycle();op_io_irq(); + bool carry = regs.p.c; + regs.p.c = (regs.a.l & 0x01); + regs.a.l = (carry << 7) | (regs.a.l >> 1); + regs.p.n = (regs.a.l & 0x80); + regs.p.z = (regs.a.l == 0); + } + + void CPUcore::op_ror_imm_w() { +last_cycle();op_io_irq(); + bool carry = regs.p.c; + regs.p.c = (regs.a.w & 0x0001); + regs.a.w = (carry << 15) | (regs.a.w >> 1); + regs.p.n = (regs.a.w & 0x8000); + regs.p.z = (regs.a.w == 0); + } + + + void CPUcore::op_inc_addr_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + rd.l = op_readdbr(aa.w); + op_io(); + op_inc_b(); +last_cycle();op_writedbr(aa.w, rd.l); + } + + void CPUcore::op_inc_addr_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + rd.l = op_readdbr(aa.w + 0); + rd.h = op_readdbr(aa.w + 1); + op_io(); + op_inc_w(); + op_writedbr(aa.w + 1, rd.h); +last_cycle();op_writedbr(aa.w + 0, rd.l); + } + + void CPUcore::op_dec_addr_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + rd.l = op_readdbr(aa.w); + op_io(); + op_dec_b(); +last_cycle();op_writedbr(aa.w, rd.l); + } + + void CPUcore::op_dec_addr_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + rd.l = op_readdbr(aa.w + 0); + rd.h = op_readdbr(aa.w + 1); + op_io(); + op_dec_w(); + op_writedbr(aa.w + 1, rd.h); +last_cycle();op_writedbr(aa.w + 0, rd.l); + } + + void CPUcore::op_asl_addr_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + rd.l = op_readdbr(aa.w); + op_io(); + op_asl_b(); +last_cycle();op_writedbr(aa.w, rd.l); + } + + void CPUcore::op_asl_addr_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + rd.l = op_readdbr(aa.w + 0); + rd.h = op_readdbr(aa.w + 1); + op_io(); + op_asl_w(); + op_writedbr(aa.w + 1, rd.h); +last_cycle();op_writedbr(aa.w + 0, rd.l); + } + + void CPUcore::op_lsr_addr_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + rd.l = op_readdbr(aa.w); + op_io(); + op_lsr_b(); +last_cycle();op_writedbr(aa.w, rd.l); + } + + void CPUcore::op_lsr_addr_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + rd.l = op_readdbr(aa.w + 0); + rd.h = op_readdbr(aa.w + 1); + op_io(); + op_lsr_w(); + op_writedbr(aa.w + 1, rd.h); +last_cycle();op_writedbr(aa.w + 0, rd.l); + } + + void CPUcore::op_rol_addr_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + rd.l = op_readdbr(aa.w); + op_io(); + op_rol_b(); +last_cycle();op_writedbr(aa.w, rd.l); + } + + void CPUcore::op_rol_addr_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + rd.l = op_readdbr(aa.w + 0); + rd.h = op_readdbr(aa.w + 1); + op_io(); + op_rol_w(); + op_writedbr(aa.w + 1, rd.h); +last_cycle();op_writedbr(aa.w + 0, rd.l); + } + + void CPUcore::op_ror_addr_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + rd.l = op_readdbr(aa.w); + op_io(); + op_ror_b(); +last_cycle();op_writedbr(aa.w, rd.l); + } + + void CPUcore::op_ror_addr_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + rd.l = op_readdbr(aa.w + 0); + rd.h = op_readdbr(aa.w + 1); + op_io(); + op_ror_w(); + op_writedbr(aa.w + 1, rd.h); +last_cycle();op_writedbr(aa.w + 0, rd.l); + } + + void CPUcore::op_trb_addr_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + rd.l = op_readdbr(aa.w); + op_io(); + op_trb_b(); +last_cycle();op_writedbr(aa.w, rd.l); + } + + void CPUcore::op_trb_addr_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + rd.l = op_readdbr(aa.w + 0); + rd.h = op_readdbr(aa.w + 1); + op_io(); + op_trb_w(); + op_writedbr(aa.w + 1, rd.h); +last_cycle();op_writedbr(aa.w + 0, rd.l); + } + + void CPUcore::op_tsb_addr_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + rd.l = op_readdbr(aa.w); + op_io(); + op_tsb_b(); +last_cycle();op_writedbr(aa.w, rd.l); + } + + void CPUcore::op_tsb_addr_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + rd.l = op_readdbr(aa.w + 0); + rd.h = op_readdbr(aa.w + 1); + op_io(); + op_tsb_w(); + op_writedbr(aa.w + 1, rd.h); +last_cycle();op_writedbr(aa.w + 0, rd.l); + } + + + void CPUcore::op_inc_addrx_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io(); + rd.l = op_readdbr(aa.w + regs.x.w); + op_io(); + op_inc_b(); +last_cycle();op_writedbr(aa.w + regs.x.w, rd.l); + } + + void CPUcore::op_inc_addrx_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io(); + rd.l = op_readdbr(aa.w + regs.x.w + 0); + rd.h = op_readdbr(aa.w + regs.x.w + 1); + op_io(); + op_inc_w(); + op_writedbr(aa.w + regs.x.w + 1, rd.h); +last_cycle();op_writedbr(aa.w + regs.x.w + 0, rd.l); + } + + void CPUcore::op_dec_addrx_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io(); + rd.l = op_readdbr(aa.w + regs.x.w); + op_io(); + op_dec_b(); +last_cycle();op_writedbr(aa.w + regs.x.w, rd.l); + } + + void CPUcore::op_dec_addrx_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io(); + rd.l = op_readdbr(aa.w + regs.x.w + 0); + rd.h = op_readdbr(aa.w + regs.x.w + 1); + op_io(); + op_dec_w(); + op_writedbr(aa.w + regs.x.w + 1, rd.h); +last_cycle();op_writedbr(aa.w + regs.x.w + 0, rd.l); + } + + void CPUcore::op_asl_addrx_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io(); + rd.l = op_readdbr(aa.w + regs.x.w); + op_io(); + op_asl_b(); +last_cycle();op_writedbr(aa.w + regs.x.w, rd.l); + } + + void CPUcore::op_asl_addrx_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io(); + rd.l = op_readdbr(aa.w + regs.x.w + 0); + rd.h = op_readdbr(aa.w + regs.x.w + 1); + op_io(); + op_asl_w(); + op_writedbr(aa.w + regs.x.w + 1, rd.h); +last_cycle();op_writedbr(aa.w + regs.x.w + 0, rd.l); + } + + void CPUcore::op_lsr_addrx_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io(); + rd.l = op_readdbr(aa.w + regs.x.w); + op_io(); + op_lsr_b(); +last_cycle();op_writedbr(aa.w + regs.x.w, rd.l); + } + + void CPUcore::op_lsr_addrx_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io(); + rd.l = op_readdbr(aa.w + regs.x.w + 0); + rd.h = op_readdbr(aa.w + regs.x.w + 1); + op_io(); + op_lsr_w(); + op_writedbr(aa.w + regs.x.w + 1, rd.h); +last_cycle();op_writedbr(aa.w + regs.x.w + 0, rd.l); + } + + void CPUcore::op_rol_addrx_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io(); + rd.l = op_readdbr(aa.w + regs.x.w); + op_io(); + op_rol_b(); +last_cycle();op_writedbr(aa.w + regs.x.w, rd.l); + } + + void CPUcore::op_rol_addrx_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io(); + rd.l = op_readdbr(aa.w + regs.x.w + 0); + rd.h = op_readdbr(aa.w + regs.x.w + 1); + op_io(); + op_rol_w(); + op_writedbr(aa.w + regs.x.w + 1, rd.h); +last_cycle();op_writedbr(aa.w + regs.x.w + 0, rd.l); + } + + void CPUcore::op_ror_addrx_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io(); + rd.l = op_readdbr(aa.w + regs.x.w); + op_io(); + op_ror_b(); +last_cycle();op_writedbr(aa.w + regs.x.w, rd.l); + } + + void CPUcore::op_ror_addrx_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io(); + rd.l = op_readdbr(aa.w + regs.x.w + 0); + rd.h = op_readdbr(aa.w + regs.x.w + 1); + op_io(); + op_ror_w(); + op_writedbr(aa.w + regs.x.w + 1, rd.h); +last_cycle();op_writedbr(aa.w + regs.x.w + 0, rd.l); + } + + + void CPUcore::op_inc_dp_b() { + dp = op_readpc(); + op_io_cond2(); + rd.l = op_readdp(dp); + op_io(); + op_inc_b(); +last_cycle();op_writedp(dp, rd.l); + } + + void CPUcore::op_inc_dp_w() { + dp = op_readpc(); + op_io_cond2(); + rd.l = op_readdp(dp + 0); + rd.h = op_readdp(dp + 1); + op_io(); + op_inc_w(); + op_writedp(dp + 1, rd.h); +last_cycle();op_writedp(dp + 0, rd.l); + } + + void CPUcore::op_dec_dp_b() { + dp = op_readpc(); + op_io_cond2(); + rd.l = op_readdp(dp); + op_io(); + op_dec_b(); +last_cycle();op_writedp(dp, rd.l); + } + + void CPUcore::op_dec_dp_w() { + dp = op_readpc(); + op_io_cond2(); + rd.l = op_readdp(dp + 0); + rd.h = op_readdp(dp + 1); + op_io(); + op_dec_w(); + op_writedp(dp + 1, rd.h); +last_cycle();op_writedp(dp + 0, rd.l); + } + + void CPUcore::op_asl_dp_b() { + dp = op_readpc(); + op_io_cond2(); + rd.l = op_readdp(dp); + op_io(); + op_asl_b(); +last_cycle();op_writedp(dp, rd.l); + } + + void CPUcore::op_asl_dp_w() { + dp = op_readpc(); + op_io_cond2(); + rd.l = op_readdp(dp + 0); + rd.h = op_readdp(dp + 1); + op_io(); + op_asl_w(); + op_writedp(dp + 1, rd.h); +last_cycle();op_writedp(dp + 0, rd.l); + } + + void CPUcore::op_lsr_dp_b() { + dp = op_readpc(); + op_io_cond2(); + rd.l = op_readdp(dp); + op_io(); + op_lsr_b(); +last_cycle();op_writedp(dp, rd.l); + } + + void CPUcore::op_lsr_dp_w() { + dp = op_readpc(); + op_io_cond2(); + rd.l = op_readdp(dp + 0); + rd.h = op_readdp(dp + 1); + op_io(); + op_lsr_w(); + op_writedp(dp + 1, rd.h); +last_cycle();op_writedp(dp + 0, rd.l); + } + + void CPUcore::op_rol_dp_b() { + dp = op_readpc(); + op_io_cond2(); + rd.l = op_readdp(dp); + op_io(); + op_rol_b(); +last_cycle();op_writedp(dp, rd.l); + } + + void CPUcore::op_rol_dp_w() { + dp = op_readpc(); + op_io_cond2(); + rd.l = op_readdp(dp + 0); + rd.h = op_readdp(dp + 1); + op_io(); + op_rol_w(); + op_writedp(dp + 1, rd.h); +last_cycle();op_writedp(dp + 0, rd.l); + } + + void CPUcore::op_ror_dp_b() { + dp = op_readpc(); + op_io_cond2(); + rd.l = op_readdp(dp); + op_io(); + op_ror_b(); +last_cycle();op_writedp(dp, rd.l); + } + + void CPUcore::op_ror_dp_w() { + dp = op_readpc(); + op_io_cond2(); + rd.l = op_readdp(dp + 0); + rd.h = op_readdp(dp + 1); + op_io(); + op_ror_w(); + op_writedp(dp + 1, rd.h); +last_cycle();op_writedp(dp + 0, rd.l); + } + + void CPUcore::op_trb_dp_b() { + dp = op_readpc(); + op_io_cond2(); + rd.l = op_readdp(dp); + op_io(); + op_trb_b(); +last_cycle();op_writedp(dp, rd.l); + } + + void CPUcore::op_trb_dp_w() { + dp = op_readpc(); + op_io_cond2(); + rd.l = op_readdp(dp + 0); + rd.h = op_readdp(dp + 1); + op_io(); + op_trb_w(); + op_writedp(dp + 1, rd.h); +last_cycle();op_writedp(dp + 0, rd.l); + } + + void CPUcore::op_tsb_dp_b() { + dp = op_readpc(); + op_io_cond2(); + rd.l = op_readdp(dp); + op_io(); + op_tsb_b(); +last_cycle();op_writedp(dp, rd.l); + } + + void CPUcore::op_tsb_dp_w() { + dp = op_readpc(); + op_io_cond2(); + rd.l = op_readdp(dp + 0); + rd.h = op_readdp(dp + 1); + op_io(); + op_tsb_w(); + op_writedp(dp + 1, rd.h); +last_cycle();op_writedp(dp + 0, rd.l); + } + + + void CPUcore::op_inc_dpx_b() { + dp = op_readpc(); + op_io_cond2(); + op_io(); + rd.l = op_readdp(dp + regs.x.w); + op_io(); + op_inc_b(); +last_cycle();op_writedp(dp + regs.x.w, rd.l); + } + + void CPUcore::op_inc_dpx_w() { + dp = op_readpc(); + op_io_cond2(); + op_io(); + rd.l = op_readdp(dp + regs.x.w + 0); + rd.h = op_readdp(dp + regs.x.w + 1); + op_io(); + op_inc_w(); + op_writedp(dp + regs.x.w + 1, rd.h); +last_cycle();op_writedp(dp + regs.x.w + 0, rd.l); + } + + void CPUcore::op_dec_dpx_b() { + dp = op_readpc(); + op_io_cond2(); + op_io(); + rd.l = op_readdp(dp + regs.x.w); + op_io(); + op_dec_b(); +last_cycle();op_writedp(dp + regs.x.w, rd.l); + } + + void CPUcore::op_dec_dpx_w() { + dp = op_readpc(); + op_io_cond2(); + op_io(); + rd.l = op_readdp(dp + regs.x.w + 0); + rd.h = op_readdp(dp + regs.x.w + 1); + op_io(); + op_dec_w(); + op_writedp(dp + regs.x.w + 1, rd.h); +last_cycle();op_writedp(dp + regs.x.w + 0, rd.l); + } + + void CPUcore::op_asl_dpx_b() { + dp = op_readpc(); + op_io_cond2(); + op_io(); + rd.l = op_readdp(dp + regs.x.w); + op_io(); + op_asl_b(); +last_cycle();op_writedp(dp + regs.x.w, rd.l); + } + + void CPUcore::op_asl_dpx_w() { + dp = op_readpc(); + op_io_cond2(); + op_io(); + rd.l = op_readdp(dp + regs.x.w + 0); + rd.h = op_readdp(dp + regs.x.w + 1); + op_io(); + op_asl_w(); + op_writedp(dp + regs.x.w + 1, rd.h); +last_cycle();op_writedp(dp + regs.x.w + 0, rd.l); + } + + void CPUcore::op_lsr_dpx_b() { + dp = op_readpc(); + op_io_cond2(); + op_io(); + rd.l = op_readdp(dp + regs.x.w); + op_io(); + op_lsr_b(); +last_cycle();op_writedp(dp + regs.x.w, rd.l); + } + + void CPUcore::op_lsr_dpx_w() { + dp = op_readpc(); + op_io_cond2(); + op_io(); + rd.l = op_readdp(dp + regs.x.w + 0); + rd.h = op_readdp(dp + regs.x.w + 1); + op_io(); + op_lsr_w(); + op_writedp(dp + regs.x.w + 1, rd.h); +last_cycle();op_writedp(dp + regs.x.w + 0, rd.l); + } + + void CPUcore::op_rol_dpx_b() { + dp = op_readpc(); + op_io_cond2(); + op_io(); + rd.l = op_readdp(dp + regs.x.w); + op_io(); + op_rol_b(); +last_cycle();op_writedp(dp + regs.x.w, rd.l); + } + + void CPUcore::op_rol_dpx_w() { + dp = op_readpc(); + op_io_cond2(); + op_io(); + rd.l = op_readdp(dp + regs.x.w + 0); + rd.h = op_readdp(dp + regs.x.w + 1); + op_io(); + op_rol_w(); + op_writedp(dp + regs.x.w + 1, rd.h); +last_cycle();op_writedp(dp + regs.x.w + 0, rd.l); + } + + void CPUcore::op_ror_dpx_b() { + dp = op_readpc(); + op_io_cond2(); + op_io(); + rd.l = op_readdp(dp + regs.x.w); + op_io(); + op_ror_b(); +last_cycle();op_writedp(dp + regs.x.w, rd.l); + } + + void CPUcore::op_ror_dpx_w() { + dp = op_readpc(); + op_io_cond2(); + op_io(); + rd.l = op_readdp(dp + regs.x.w + 0); + rd.h = op_readdp(dp + regs.x.w + 1); + op_io(); + op_ror_w(); + op_writedp(dp + regs.x.w + 1, rd.h); +last_cycle();op_writedp(dp + regs.x.w + 0, rd.l); + } + + +//============= +//opcode_pc.bpp +//============= + + void CPUcore::op_bcc() { + if(!regs.p.c == false) { +last_cycle(); rd.l = op_readpc(); + } else { + rd.l = op_readpc(); + aa.w = regs.pc.d + (int8_t)rd.l; + op_io_cond6(aa.w); +last_cycle(); op_io(); + regs.pc.w = aa.w; + } + } + + void CPUcore::op_bcs() { + if(regs.p.c == false) { +last_cycle(); rd.l = op_readpc(); + } else { + rd.l = op_readpc(); + aa.w = regs.pc.d + (int8_t)rd.l; + op_io_cond6(aa.w); +last_cycle(); op_io(); + regs.pc.w = aa.w; + } + } + + void CPUcore::op_bne() { + if(!regs.p.z == false) { +last_cycle(); rd.l = op_readpc(); + } else { + rd.l = op_readpc(); + aa.w = regs.pc.d + (int8_t)rd.l; + op_io_cond6(aa.w); +last_cycle(); op_io(); + regs.pc.w = aa.w; + } + } + + void CPUcore::op_beq() { + if(regs.p.z == false) { +last_cycle(); rd.l = op_readpc(); + } else { + rd.l = op_readpc(); + aa.w = regs.pc.d + (int8_t)rd.l; + op_io_cond6(aa.w); +last_cycle(); op_io(); + regs.pc.w = aa.w; + } + } + + void CPUcore::op_bpl() { + if(!regs.p.n == false) { +last_cycle(); rd.l = op_readpc(); + } else { + rd.l = op_readpc(); + aa.w = regs.pc.d + (int8_t)rd.l; + op_io_cond6(aa.w); +last_cycle(); op_io(); + regs.pc.w = aa.w; + } + } + + void CPUcore::op_bmi() { + if(regs.p.n == false) { +last_cycle(); rd.l = op_readpc(); + } else { + rd.l = op_readpc(); + aa.w = regs.pc.d + (int8_t)rd.l; + op_io_cond6(aa.w); +last_cycle(); op_io(); + regs.pc.w = aa.w; + } + } + + void CPUcore::op_bvc() { + if(!regs.p.v == false) { +last_cycle(); rd.l = op_readpc(); + } else { + rd.l = op_readpc(); + aa.w = regs.pc.d + (int8_t)rd.l; + op_io_cond6(aa.w); +last_cycle(); op_io(); + regs.pc.w = aa.w; + } + } + + void CPUcore::op_bvs() { + if(regs.p.v == false) { +last_cycle(); rd.l = op_readpc(); + } else { + rd.l = op_readpc(); + aa.w = regs.pc.d + (int8_t)rd.l; + op_io_cond6(aa.w); +last_cycle(); op_io(); + regs.pc.w = aa.w; + } + } + + + void CPUcore::op_bra() { + rd.l = op_readpc(); + aa.w = regs.pc.d + (int8_t)rd.l; + op_io_cond6(aa.w); +last_cycle();op_io(); + regs.pc.w = aa.w; + } + + void CPUcore::op_brl() { + rd.l = op_readpc(); + rd.h = op_readpc(); +last_cycle();op_io(); + regs.pc.w = regs.pc.d + (int16_t)rd.w; + } + + void CPUcore::op_jmp_addr() { + rd.l = op_readpc(); +last_cycle();rd.h = op_readpc(); + regs.pc.w = rd.w; + } + + void CPUcore::op_jmp_long() { + rd.l = op_readpc(); + rd.h = op_readpc(); +last_cycle();rd.b = op_readpc(); + regs.pc.d = rd.d & 0xffffff; + } + + void CPUcore::op_jmp_iaddr() { + aa.l = op_readpc(); + aa.h = op_readpc(); + rd.l = op_readaddr(aa.w + 0); +last_cycle();rd.h = op_readaddr(aa.w + 1); + regs.pc.w = rd.w; + } + + void CPUcore::op_jmp_iaddrx() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io(); + rd.l = op_readpbr(aa.w + regs.x.w + 0); +last_cycle();rd.h = op_readpbr(aa.w + regs.x.w + 1); + regs.pc.w = rd.w; + } + + void CPUcore::op_jmp_iladdr() { + aa.l = op_readpc(); + aa.h = op_readpc(); + rd.l = op_readaddr(aa.w + 0); + rd.h = op_readaddr(aa.w + 1); +last_cycle();rd.b = op_readaddr(aa.w + 2); + regs.pc.d = rd.d & 0xffffff; + } + + void CPUcore::op_jsr_addr() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io(); + regs.pc.w--; + op_writestack(regs.pc.h); +last_cycle();op_writestack(regs.pc.l); + regs.pc.w = aa.w; + } + + void CPUcore::op_jsr_long_e() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_writestackn(regs.pc.b); + op_io(); + aa.b = op_readpc(); + regs.pc.w--; + op_writestackn(regs.pc.h); +last_cycle();op_writestackn(regs.pc.l); + regs.pc.d = aa.d & 0xffffff; + regs.s.h = 0x01; + } + + void CPUcore::op_jsr_long_n() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_writestackn(regs.pc.b); + op_io(); + aa.b = op_readpc(); + regs.pc.w--; + op_writestackn(regs.pc.h); +last_cycle();op_writestackn(regs.pc.l); + regs.pc.d = aa.d & 0xffffff; + } + + void CPUcore::op_jsr_iaddrx_e() { + aa.l = op_readpc(); + op_writestackn(regs.pc.h); + op_writestackn(regs.pc.l); + aa.h = op_readpc(); + op_io(); + rd.l = op_readpbr(aa.w + regs.x.w + 0); +last_cycle();rd.h = op_readpbr(aa.w + regs.x.w + 1); + regs.pc.w = rd.w; + regs.s.h = 0x01; + } + + void CPUcore::op_jsr_iaddrx_n() { + aa.l = op_readpc(); + op_writestackn(regs.pc.h); + op_writestackn(regs.pc.l); + aa.h = op_readpc(); + op_io(); + rd.l = op_readpbr(aa.w + regs.x.w + 0); +last_cycle();rd.h = op_readpbr(aa.w + regs.x.w + 1); + regs.pc.w = rd.w; + } + + void CPUcore::op_rti_e() { + op_io(); + op_io(); + regs.p = op_readstack() | 0x30; + rd.l = op_readstack(); +last_cycle();rd.h = op_readstack(); + regs.pc.w = rd.w; + } + + void CPUcore::op_rti_n() { + op_io(); + op_io(); + regs.p = op_readstack(); + if(regs.p.x) { + regs.x.h = 0x00; + regs.y.h = 0x00; + } + rd.l = op_readstack(); + rd.h = op_readstack(); +last_cycle();rd.b = op_readstack(); + regs.pc.d = rd.d & 0xffffff; + update_table(); + } + + void CPUcore::op_rts() { + op_io(); + op_io(); + rd.l = op_readstack(); + rd.h = op_readstack(); +last_cycle();op_io(); + regs.pc.w = ++rd.w; + } + + void CPUcore::op_rtl_e() { + op_io(); + op_io(); + rd.l = op_readstackn(); + rd.h = op_readstackn(); +last_cycle();rd.b = op_readstackn(); + regs.pc.b = rd.b; + regs.pc.w = ++rd.w; + regs.s.h = 0x01; + } + + void CPUcore::op_rtl_n() { + op_io(); + op_io(); + rd.l = op_readstackn(); + rd.h = op_readstackn(); +last_cycle();rd.b = op_readstackn(); + regs.pc.b = rd.b; + regs.pc.w = ++rd.w; + } + + +//=============== +//opcode_misc.bpp +//=============== + + void CPUcore::op_nop() { +last_cycle();op_io_irq(); + } + + void CPUcore::op_wdm() { +last_cycle();op_readpc(); + } + + void CPUcore::op_xba() { + op_io(); +last_cycle();op_io(); + regs.a.l ^= regs.a.h; + regs.a.h ^= regs.a.l; + regs.a.l ^= regs.a.h; + regs.p.n = (regs.a.l & 0x80); + regs.p.z = (regs.a.l == 0); + } + + + void CPUcore::op_mvn_b() { + dp = op_readpc(); + sp = op_readpc(); + regs.db = dp; + rd.l = op_readlong((sp << 16) | regs.x.w); + op_writelong((dp << 16) | regs.y.w, rd.l); + op_io(); + regs.x.l ++; + regs.y.l ++; +last_cycle();op_io(); + if(regs.a.w--) regs.pc.w -= 3; + } + + void CPUcore::op_mvn_w() { + dp = op_readpc(); + sp = op_readpc(); + regs.db = dp; + rd.l = op_readlong((sp << 16) | regs.x.w); + op_writelong((dp << 16) | regs.y.w, rd.l); + op_io(); + regs.x.w ++; + regs.y.w ++; +last_cycle();op_io(); + if(regs.a.w--) regs.pc.w -= 3; + } + + void CPUcore::op_mvp_b() { + dp = op_readpc(); + sp = op_readpc(); + regs.db = dp; + rd.l = op_readlong((sp << 16) | regs.x.w); + op_writelong((dp << 16) | regs.y.w, rd.l); + op_io(); + regs.x.l --; + regs.y.l --; +last_cycle();op_io(); + if(regs.a.w--) regs.pc.w -= 3; + } + + void CPUcore::op_mvp_w() { + dp = op_readpc(); + sp = op_readpc(); + regs.db = dp; + rd.l = op_readlong((sp << 16) | regs.x.w); + op_writelong((dp << 16) | regs.y.w, rd.l); + op_io(); + regs.x.w --; + regs.y.w --; +last_cycle();op_io(); + if(regs.a.w--) regs.pc.w -= 3; + } + + + void CPUcore::op_brk_e() { + op_readpc(); + op_writestack(regs.pc.h); + op_writestack(regs.pc.l); + op_writestack(regs.p); + rd.l = op_readlong(0xfffe + 0); + regs.pc.b = 0; + regs.p.i = 1; + regs.p.d = 0; +last_cycle();rd.h = op_readlong(0xfffe + 1); + regs.pc.w = rd.w; + } + + void CPUcore::op_brk_n() { + op_readpc(); + op_writestack(regs.pc.b); + op_writestack(regs.pc.h); + op_writestack(regs.pc.l); + op_writestack(regs.p); + rd.l = op_readlong(0xffe6 + 0); + regs.pc.b = 0x00; + regs.p.i = 1; + regs.p.d = 0; +last_cycle();rd.h = op_readlong(0xffe6 + 1); + regs.pc.w = rd.w; + } + + void CPUcore::op_cop_e() { + op_readpc(); + op_writestack(regs.pc.h); + op_writestack(regs.pc.l); + op_writestack(regs.p); + rd.l = op_readlong(0xfff4 + 0); + regs.pc.b = 0; + regs.p.i = 1; + regs.p.d = 0; +last_cycle();rd.h = op_readlong(0xfff4 + 1); + regs.pc.w = rd.w; + } + + void CPUcore::op_cop_n() { + op_readpc(); + op_writestack(regs.pc.b); + op_writestack(regs.pc.h); + op_writestack(regs.pc.l); + op_writestack(regs.p); + rd.l = op_readlong(0xffe4 + 0); + regs.pc.b = 0x00; + regs.p.i = 1; + regs.p.d = 0; +last_cycle();rd.h = op_readlong(0xffe4 + 1); + regs.pc.w = rd.w; + } + + + void CPUcore::op_stp() { + while(regs.wai = true) { +last_cycle(); op_io(); + } + } + + void CPUcore::op_wai() { + regs.wai = true; + while(regs.wai) { +last_cycle(); op_io(); + } + op_io(); + } + + void CPUcore::op_xce() { +last_cycle();op_io_irq(); + bool carry = regs.p.c; + regs.p.c = regs.e; + regs.e = carry; + if(regs.e) { + regs.p |= 0x30; + regs.s.h = 0x01; + } + if(regs.p.x) { + regs.x.h = 0x00; + regs.y.h = 0x00; + } + update_table(); + } + + + void CPUcore::op_clc() { +last_cycle();op_io_irq(); + regs.p.c=0; + } + + void CPUcore::op_cld() { +last_cycle();op_io_irq(); + regs.p.d=0; + } + + void CPUcore::op_cli() { +last_cycle();op_io_irq(); + regs.p.i=0; + } + + void CPUcore::op_clv() { +last_cycle();op_io_irq(); + regs.p.v=0; + } + + void CPUcore::op_sec() { +last_cycle();op_io_irq(); + regs.p.c=1; + } + + void CPUcore::op_sed() { +last_cycle();op_io_irq(); + regs.p.d=1; + } + + void CPUcore::op_sei() { +last_cycle();op_io_irq(); + regs.p.i=1; + } + + + void CPUcore::op_rep_e() { + rd.l = op_readpc(); +last_cycle();op_io(); + regs.p &=~ rd.l; + regs.p |= 0x30; + if(regs.p.x) { + regs.x.h = 0x00; + regs.y.h = 0x00; + } + update_table(); + } + + void CPUcore::op_rep_n() { + rd.l = op_readpc(); +last_cycle();op_io(); + regs.p &=~ rd.l; + if(regs.p.x) { + regs.x.h = 0x00; + regs.y.h = 0x00; + } + update_table(); + } + + void CPUcore::op_sep_e() { + rd.l = op_readpc(); +last_cycle();op_io(); + regs.p |= rd.l; + regs.p |= 0x30; + if(regs.p.x) { + regs.x.h = 0x00; + regs.y.h = 0x00; + } + update_table(); + } + + void CPUcore::op_sep_n() { + rd.l = op_readpc(); +last_cycle();op_io(); + regs.p |= rd.l; + if(regs.p.x) { + regs.x.h = 0x00; + regs.y.h = 0x00; + } + update_table(); + } + + + void CPUcore::op_tax_b() { +last_cycle();op_io_irq(); + regs.x.l = regs.a.l; + regs.p.n = (regs.x.l & 0x80); + regs.p.z = (regs.x.l == 0); + } + + void CPUcore::op_tax_w() { +last_cycle();op_io_irq(); + regs.x.w = regs.a.w; + regs.p.n = (regs.x.w & 0x8000); + regs.p.z = (regs.x.w == 0); + } + + void CPUcore::op_tay_b() { +last_cycle();op_io_irq(); + regs.y.l = regs.a.l; + regs.p.n = (regs.y.l & 0x80); + regs.p.z = (regs.y.l == 0); + } + + void CPUcore::op_tay_w() { +last_cycle();op_io_irq(); + regs.y.w = regs.a.w; + regs.p.n = (regs.y.w & 0x8000); + regs.p.z = (regs.y.w == 0); + } + + void CPUcore::op_txa_b() { +last_cycle();op_io_irq(); + regs.a.l = regs.x.l; + regs.p.n = (regs.a.l & 0x80); + regs.p.z = (regs.a.l == 0); + } + + void CPUcore::op_txa_w() { +last_cycle();op_io_irq(); + regs.a.w = regs.x.w; + regs.p.n = (regs.a.w & 0x8000); + regs.p.z = (regs.a.w == 0); + } + + void CPUcore::op_txy_b() { +last_cycle();op_io_irq(); + regs.y.l = regs.x.l; + regs.p.n = (regs.y.l & 0x80); + regs.p.z = (regs.y.l == 0); + } + + void CPUcore::op_txy_w() { +last_cycle();op_io_irq(); + regs.y.w = regs.x.w; + regs.p.n = (regs.y.w & 0x8000); + regs.p.z = (regs.y.w == 0); + } + + void CPUcore::op_tya_b() { +last_cycle();op_io_irq(); + regs.a.l = regs.y.l; + regs.p.n = (regs.a.l & 0x80); + regs.p.z = (regs.a.l == 0); + } + + void CPUcore::op_tya_w() { +last_cycle();op_io_irq(); + regs.a.w = regs.y.w; + regs.p.n = (regs.a.w & 0x8000); + regs.p.z = (regs.a.w == 0); + } + + void CPUcore::op_tyx_b() { +last_cycle();op_io_irq(); + regs.x.l = regs.y.l; + regs.p.n = (regs.x.l & 0x80); + regs.p.z = (regs.x.l == 0); + } + + void CPUcore::op_tyx_w() { +last_cycle();op_io_irq(); + regs.x.w = regs.y.w; + regs.p.n = (regs.x.w & 0x8000); + regs.p.z = (regs.x.w == 0); + } + + + void CPUcore::op_tcd() { +last_cycle();op_io_irq(); + regs.d.w = regs.a.w; + regs.p.n = (regs.d.w & 0x8000); + regs.p.z = (regs.d.w == 0); + } + + void CPUcore::op_tdc() { +last_cycle();op_io_irq(); + regs.a.w = regs.d.w; + regs.p.n = (regs.a.w & 0x8000); + regs.p.z = (regs.a.w == 0); + } + + + void CPUcore::op_tcs_e() { +last_cycle();op_io_irq(); + regs.s.l = regs.a.l; + } + + void CPUcore::op_tcs_n() { +last_cycle();op_io_irq(); + regs.s.w = regs.a.w; + } + + void CPUcore::op_tsc_e() { +last_cycle();op_io_irq(); + regs.a.w = regs.s.w; + regs.p.n = (regs.a.l & 0x80); + regs.p.z = (regs.a.l == 0); + } + + void CPUcore::op_tsc_n() { +last_cycle();op_io_irq(); + regs.a.w = regs.s.w; + regs.p.n = (regs.a.w & 0x8000); + regs.p.z = (regs.a.w == 0); + } + + void CPUcore::op_tsx_b() { +last_cycle();op_io_irq(); + regs.x.l = regs.s.l; + regs.p.n = (regs.x.l & 0x80); + regs.p.z = (regs.x.l == 0); + } + + void CPUcore::op_tsx_w() { +last_cycle();op_io_irq(); + regs.x.w = regs.s.w; + regs.p.n = (regs.x.w & 0x8000); + regs.p.z = (regs.x.w == 0); + } + + void CPUcore::op_txs_e() { +last_cycle();op_io_irq(); + regs.s.l = regs.x.l; + } + + void CPUcore::op_txs_n() { +last_cycle();op_io_irq(); + regs.s.w = regs.x.w; + } + + + void CPUcore::op_pha_b() { + op_io(); +last_cycle();op_writestack(regs.a.l); + } + + void CPUcore::op_pha_w() { + op_io(); + op_writestack(regs.a.h); +last_cycle();op_writestack(regs.a.l); + } + + void CPUcore::op_phx_b() { + op_io(); +last_cycle();op_writestack(regs.x.l); + } + + void CPUcore::op_phx_w() { + op_io(); + op_writestack(regs.x.h); +last_cycle();op_writestack(regs.x.l); + } + + void CPUcore::op_phy_b() { + op_io(); +last_cycle();op_writestack(regs.y.l); + } + + void CPUcore::op_phy_w() { + op_io(); + op_writestack(regs.y.h); +last_cycle();op_writestack(regs.y.l); + } + + void CPUcore::op_phd_e() { + op_io(); + op_writestackn(regs.d.h); +last_cycle();op_writestackn(regs.d.l); + regs.s.h = 0x01; + } + + void CPUcore::op_phd_n() { + op_io(); + op_writestackn(regs.d.h); +last_cycle();op_writestackn(regs.d.l); + } + + void CPUcore::op_phb() { + op_io(); +last_cycle();op_writestack(regs.db); + } + + void CPUcore::op_phk() { + op_io(); +last_cycle();op_writestack(regs.pc.b); + } + + void CPUcore::op_php() { + op_io(); +last_cycle();op_writestack(regs.p); + } + + + void CPUcore::op_pla_b() { + op_io(); + op_io(); +last_cycle();regs.a.l = op_readstack(); + regs.p.n = (regs.a.l & 0x80); + regs.p.z = (regs.a.l == 0); + } + + void CPUcore::op_pla_w() { + op_io(); + op_io(); + regs.a.l = op_readstack(); +last_cycle();regs.a.h = op_readstack(); + regs.p.n = (regs.a.w & 0x8000); + regs.p.z = (regs.a.w == 0); + } + + void CPUcore::op_plx_b() { + op_io(); + op_io(); +last_cycle();regs.x.l = op_readstack(); + regs.p.n = (regs.x.l & 0x80); + regs.p.z = (regs.x.l == 0); + } + + void CPUcore::op_plx_w() { + op_io(); + op_io(); + regs.x.l = op_readstack(); +last_cycle();regs.x.h = op_readstack(); + regs.p.n = (regs.x.w & 0x8000); + regs.p.z = (regs.x.w == 0); + } + + void CPUcore::op_ply_b() { + op_io(); + op_io(); +last_cycle();regs.y.l = op_readstack(); + regs.p.n = (regs.y.l & 0x80); + regs.p.z = (regs.y.l == 0); + } + + void CPUcore::op_ply_w() { + op_io(); + op_io(); + regs.y.l = op_readstack(); +last_cycle();regs.y.h = op_readstack(); + regs.p.n = (regs.y.w & 0x8000); + regs.p.z = (regs.y.w == 0); + } + + void CPUcore::op_pld_e() { + op_io(); + op_io(); + regs.d.l = op_readstackn(); +last_cycle();regs.d.h = op_readstackn(); + regs.p.n = (regs.d.w & 0x8000); + regs.p.z = (regs.d.w == 0); + regs.s.h = 0x01; + } + + void CPUcore::op_pld_n() { + op_io(); + op_io(); + regs.d.l = op_readstackn(); +last_cycle();regs.d.h = op_readstackn(); + regs.p.n = (regs.d.w & 0x8000); + regs.p.z = (regs.d.w == 0); + } + + void CPUcore::op_plb() { + op_io(); + op_io(); +last_cycle();regs.db = op_readstack(); + regs.p.n = (regs.db & 0x80); + regs.p.z = (regs.db == 0); + } + + void CPUcore::op_plp_e() { + op_io(); + op_io(); +last_cycle();regs.p = op_readstack() | 0x30; + if(regs.p.x) { + regs.x.h = 0x00; + regs.y.h = 0x00; + } + update_table(); + } + + void CPUcore::op_plp_n() { + op_io(); + op_io(); +last_cycle();regs.p = op_readstack(); + if(regs.p.x) { + regs.x.h = 0x00; + regs.y.h = 0x00; + } + update_table(); + } + + + void CPUcore::op_pea_e() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_writestackn(aa.h); +last_cycle();op_writestackn(aa.l); + regs.s.h = 0x01; + } + + void CPUcore::op_pea_n() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_writestackn(aa.h); +last_cycle();op_writestackn(aa.l); + } + + void CPUcore::op_pei_e() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + op_writestackn(aa.h); +last_cycle();op_writestackn(aa.l); + regs.s.h = 0x01; + } + + void CPUcore::op_pei_n() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + op_writestackn(aa.h); +last_cycle();op_writestackn(aa.l); + } + + void CPUcore::op_per_e() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io(); + rd.w = regs.pc.d + (int16_t)aa.w; + op_writestackn(rd.h); +last_cycle();op_writestackn(rd.l); + regs.s.h = 0x01; + } + + void CPUcore::op_per_n() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io(); + rd.w = regs.pc.d + (int16_t)aa.w; + op_writestackn(rd.h); +last_cycle();op_writestackn(rd.l); + } + + + diff --git a/tools/bsnes/cpu/core/opcode_headers.bpp b/tools/bsnes/cpu/core/opcode_headers.bpp new file mode 100755 index 0000000..82d5f87 --- /dev/null +++ b/tools/bsnes/cpu/core/opcode_headers.bpp @@ -0,0 +1,386 @@ +//=============== +//opcode_read.bpp +//=============== + +@macro op_read_const(name) +void op_{name}_const_b(); +void op_{name}_const_w(); +@endmacro + +@macro op_read_bit_const() +void op_bit_const_b(); +void op_bit_const_w(); +@endmacro + +@macro op_read_addr(name) +void op_{name}_addr_b(); +void op_{name}_addr_w(); +@endmacro + +@macro op_read_addrx(name) +void op_{name}_addrx_b(); +void op_{name}_addrx_w(); +@endmacro + +@macro op_read_addry(name) +void op_{name}_addry_b(); +void op_{name}_addry_w(); +@endmacro + +@macro op_read_long(name) +void op_{name}_long_b(); +void op_{name}_long_w(); +@endmacro + +@macro op_read_longx(name) +void op_{name}_longx_b(); +void op_{name}_longx_w(); +@endmacro + +@macro op_read_dp(name) +void op_{name}_dp_b(); +void op_{name}_dp_w(); +@endmacro + +@macro op_read_dpr(name, r) +void op_{name}_dpr_b(); +void op_{name}_dpr_w(); +@endmacro + +@macro op_read_idp(name) +void op_{name}_idp_b(); +void op_{name}_idp_w(); +@endmacro + +@macro op_read_idpx(name) +void op_{name}_idpx_b(); +void op_{name}_idpx_w(); +@endmacro + +@macro op_read_idpy(name) +void op_{name}_idpy_b(); +void op_{name}_idpy_w(); +@endmacro + +@macro op_read_ildp(name) +void op_{name}_ildp_b(); +void op_{name}_ildp_w(); +@endmacro + +@macro op_read_ildpy(name) +void op_{name}_ildpy_b(); +void op_{name}_ildpy_w(); +@endmacro + +@macro op_read_sr(name) +void op_{name}_sr_b(); +void op_{name}_sr_w(); +@endmacro + +@macro op_read_isry(name) +void op_{name}_isry_b(); +void op_{name}_isry_w(); +@endmacro + +//================ +//opcode_write.bpp +//================ + +@macro op_store_addr(name, r) +void op_{name}_addr_b(); +void op_{name}_addr_w(); +@endmacro + +@macro op_store_addrr(name, suffix, r, index) +void op_{name}_addr{suffix}_b(); +void op_{name}_addr{suffix}_w(); +@endmacro + +@macro op_store_longr(name, suffix, index) +void op_{name}_long{suffix}_b(); +void op_{name}_long{suffix}_w(); +@endmacro + +@macro op_store_dp(name, r) +void op_{name}_dp_b(); +void op_{name}_dp_w(); +@endmacro + +@macro op_store_dpr(name, r, index) +void op_{name}_dpr_b(); +void op_{name}_dpr_w(); +@endmacro + +@macro op_sta_idp() +void op_sta_idp_b(); +void op_sta_idp_w(); +@endmacro + +@macro op_sta_ildp() +void op_sta_ildp_b(); +void op_sta_ildp_w(); +@endmacro + +@macro op_sta_idpx() +void op_sta_idpx_b(); +void op_sta_idpx_w(); +@endmacro + +@macro op_sta_idpy() +void op_sta_idpy_b(); +void op_sta_idpy_w(); +@endmacro + +@macro op_sta_ildpy() +void op_sta_ildpy_b(); +void op_sta_ildpy_w(); +@endmacro + +@macro op_sta_sr() +void op_sta_sr_b(); +void op_sta_sr_w(); +@endmacro + +@macro op_sta_isry() +void op_sta_isry_b(); +void op_sta_isry_w(); +@endmacro + +//============== +//opcode_rmw.bpp +//============== + +@macro op_adjust(name, r, op) +void op_{name}_imm_b(); +void op_{name}_imm_w(); +@endmacro + +@macro op_asl() +void op_asl_imm_b(); +void op_asl_imm_w(); +@endmacro + +@macro op_lsr() +void op_lsr_imm_b(); +void op_lsr_imm_w(); +@endmacro + +@macro op_rol() +void op_rol_imm_b(); +void op_rol_imm_w(); +@endmacro + +@macro op_ror() +void op_ror_imm_b(); +void op_ror_imm_w(); +@endmacro + +@macro op_adjust_addr(name) +void op_{name}_addr_b(); +void op_{name}_addr_w(); +@endmacro + +@macro op_adjust_addrx(name) +void op_{name}_addrx_b(); +void op_{name}_addrx_w(); +@endmacro + +@macro op_adjust_dp(name) +void op_{name}_dp_b(); +void op_{name}_dp_w(); +@endmacro + +@macro op_adjust_dpx(name) +void op_{name}_dpx_b(); +void op_{name}_dpx_w(); +@endmacro + +//============= +//opcode_pc.bpp +//============= + +@macro op_branch(name, condition) +void op_{name}(); +@endmacro + +@macro op_bra() +void op_bra(); +@endmacro + +@macro op_brl() +void op_brl(); +@endmacro + +@macro op_jmp_addr() +void op_jmp_addr(); +@endmacro + +@macro op_jmp_long() +void op_jmp_long(); +@endmacro + +@macro op_jmp_iaddr() +void op_jmp_iaddr(); +@endmacro + +@macro op_jmp_iaddrx() +void op_jmp_iaddrx(); +@endmacro + +@macro op_jmp_iladdr() +void op_jmp_iladdr(); +@endmacro + +@macro op_jsr_addr() +void op_jsr_addr(); +@endmacro + +@macro op_jsr_long() +void op_jsr_long_e(); +void op_jsr_long_n(); +@endmacro + +@macro op_jsr_iaddrx() +void op_jsr_iaddrx_e(); +void op_jsr_iaddrx_n(); +@endmacro + +@macro op_rti() +void op_rti_e(); +void op_rti_n(); +@endmacro + +@macro op_rts() +void op_rts(); +@endmacro + +@macro op_rtl() +void op_rtl_e(); +void op_rtl_n(); +@endmacro + +//=============== +//opcode_misc.bpp +//=============== + +@macro op_nop() +void op_nop(); +@endmacro + +@macro op_wdm() +void op_wdm(); +@endmacro + +@macro op_xba() +void op_xba(); +@endmacro + +@macro op_move(name, op) +void op_{name}_b(); +void op_{name}_w(); +@endmacro + +@macro op_interrupt(name, vectorE, vectorN) +void op_{name}_e(); +void op_{name}_n(); +@endmacro + +@macro op_stp() +void op_stp(); +@endmacro + +@macro op_wai() +void op_wai(); +@endmacro + +@macro op_xce() +void op_xce(); +@endmacro + +@macro op_flag(name, rule) +void op_{name}(); +@endmacro + +@macro op_pflag(name, op) +void op_{name}_e(); +void op_{name}_n(); +@endmacro + +@macro op_transfer(name, from, to) +void op_{name}_b(); +void op_{name}_w(); +@endmacro + +@macro op_transfer_word(name, from, to) +void op_{name}(); +@endmacro + +@macro op_tcs() +void op_tcs_e(); +void op_tcs_n(); +@endmacro + +@macro op_tsc() +void op_tsc_e(); +void op_tsc_n(); +@endmacro + +@macro op_tsx() +void op_tsx_b(); +void op_tsx_w(); +@endmacro + +@macro op_txs() +void op_txs_e(); +void op_txs_n(); +@endmacro + +@macro op_push(name, r) +void op_{name}_b(); +void op_{name}_w(); +@endmacro + +@macro op_phd() +void op_phd_e(); +void op_phd_n(); +@endmacro + +@macro op_push_byte(name, r) +void op_{name}(); +@endmacro + +@macro op_pull(name, r) +void op_{name}_b(); +void op_{name}_w(); +@endmacro + +@macro op_pld() +void op_pld_e(); +void op_pld_n(); +@endmacro + +@macro op_plb() +void op_plb(); +@endmacro + +@macro op_plp() +void op_plp_e(); +void op_plp_n(); +@endmacro + +@macro op_pea() +void op_pea_e(); +void op_pea_n(); +@endmacro + +@macro op_pei() +void op_pei_e(); +void op_pei_n(); +@endmacro + +@macro op_per() +void op_per_e(); +void op_per_n(); +@endmacro + +@include "opcode_list.bpp" diff --git a/tools/bsnes/cpu/core/opcode_headers.hpp b/tools/bsnes/cpu/core/opcode_headers.hpp new file mode 100755 index 0000000..f4a6e16 --- /dev/null +++ b/tools/bsnes/cpu/core/opcode_headers.hpp @@ -0,0 +1,892 @@ +//=============== +//opcode_read.bpp +//=============== + + + + + + + + + + + + + + + + + +//================ +//opcode_write.bpp +//================ + + + + + + + + + + + + + +//============== +//opcode_rmw.bpp +//============== + + + + + + + + + + +//============= +//opcode_pc.bpp +//============= + + + + + + + + + + + + + + + +//=============== +//opcode_misc.bpp +//=============== + + + + + + + + + + + + + + + + + + + + + + + + + + + +//=============== +//opcode_read.bpp +//=============== + +void op_adc_const_b(); +void op_adc_const_w(); + +void op_and_const_b(); +void op_and_const_w(); + +void op_cmp_const_b(); +void op_cmp_const_w(); + +void op_cpx_const_b(); +void op_cpx_const_w(); + +void op_cpy_const_b(); +void op_cpy_const_w(); + +void op_eor_const_b(); +void op_eor_const_w(); + +void op_lda_const_b(); +void op_lda_const_w(); + +void op_ldx_const_b(); +void op_ldx_const_w(); + +void op_ldy_const_b(); +void op_ldy_const_w(); + +void op_ora_const_b(); +void op_ora_const_w(); + +void op_sbc_const_b(); +void op_sbc_const_w(); + + +void op_bit_const_b(); +void op_bit_const_w(); + + +void op_adc_addr_b(); +void op_adc_addr_w(); + +void op_and_addr_b(); +void op_and_addr_w(); + +void op_bit_addr_b(); +void op_bit_addr_w(); + +void op_cmp_addr_b(); +void op_cmp_addr_w(); + +void op_cpx_addr_b(); +void op_cpx_addr_w(); + +void op_cpy_addr_b(); +void op_cpy_addr_w(); + +void op_eor_addr_b(); +void op_eor_addr_w(); + +void op_lda_addr_b(); +void op_lda_addr_w(); + +void op_ldx_addr_b(); +void op_ldx_addr_w(); + +void op_ldy_addr_b(); +void op_ldy_addr_w(); + +void op_ora_addr_b(); +void op_ora_addr_w(); + +void op_sbc_addr_b(); +void op_sbc_addr_w(); + + +void op_adc_addrx_b(); +void op_adc_addrx_w(); + +void op_and_addrx_b(); +void op_and_addrx_w(); + +void op_bit_addrx_b(); +void op_bit_addrx_w(); + +void op_cmp_addrx_b(); +void op_cmp_addrx_w(); + +void op_eor_addrx_b(); +void op_eor_addrx_w(); + +void op_lda_addrx_b(); +void op_lda_addrx_w(); + +void op_ldy_addrx_b(); +void op_ldy_addrx_w(); + +void op_ora_addrx_b(); +void op_ora_addrx_w(); + +void op_sbc_addrx_b(); +void op_sbc_addrx_w(); + + +void op_adc_addry_b(); +void op_adc_addry_w(); + +void op_and_addry_b(); +void op_and_addry_w(); + +void op_cmp_addry_b(); +void op_cmp_addry_w(); + +void op_eor_addry_b(); +void op_eor_addry_w(); + +void op_lda_addry_b(); +void op_lda_addry_w(); + +void op_ldx_addry_b(); +void op_ldx_addry_w(); + +void op_ora_addry_b(); +void op_ora_addry_w(); + +void op_sbc_addry_b(); +void op_sbc_addry_w(); + + +void op_adc_long_b(); +void op_adc_long_w(); + +void op_and_long_b(); +void op_and_long_w(); + +void op_cmp_long_b(); +void op_cmp_long_w(); + +void op_eor_long_b(); +void op_eor_long_w(); + +void op_lda_long_b(); +void op_lda_long_w(); + +void op_ora_long_b(); +void op_ora_long_w(); + +void op_sbc_long_b(); +void op_sbc_long_w(); + + +void op_adc_longx_b(); +void op_adc_longx_w(); + +void op_and_longx_b(); +void op_and_longx_w(); + +void op_cmp_longx_b(); +void op_cmp_longx_w(); + +void op_eor_longx_b(); +void op_eor_longx_w(); + +void op_lda_longx_b(); +void op_lda_longx_w(); + +void op_ora_longx_b(); +void op_ora_longx_w(); + +void op_sbc_longx_b(); +void op_sbc_longx_w(); + + +void op_adc_dp_b(); +void op_adc_dp_w(); + +void op_and_dp_b(); +void op_and_dp_w(); + +void op_bit_dp_b(); +void op_bit_dp_w(); + +void op_cmp_dp_b(); +void op_cmp_dp_w(); + +void op_cpx_dp_b(); +void op_cpx_dp_w(); + +void op_cpy_dp_b(); +void op_cpy_dp_w(); + +void op_eor_dp_b(); +void op_eor_dp_w(); + +void op_lda_dp_b(); +void op_lda_dp_w(); + +void op_ldx_dp_b(); +void op_ldx_dp_w(); + +void op_ldy_dp_b(); +void op_ldy_dp_w(); + +void op_ora_dp_b(); +void op_ora_dp_w(); + +void op_sbc_dp_b(); +void op_sbc_dp_w(); + + +void op_adc_dpr_b(); +void op_adc_dpr_w(); + +void op_and_dpr_b(); +void op_and_dpr_w(); + +void op_bit_dpr_b(); +void op_bit_dpr_w(); + +void op_cmp_dpr_b(); +void op_cmp_dpr_w(); + +void op_eor_dpr_b(); +void op_eor_dpr_w(); + +void op_lda_dpr_b(); +void op_lda_dpr_w(); + +void op_ldx_dpr_b(); +void op_ldx_dpr_w(); + +void op_ldy_dpr_b(); +void op_ldy_dpr_w(); + +void op_ora_dpr_b(); +void op_ora_dpr_w(); + +void op_sbc_dpr_b(); +void op_sbc_dpr_w(); + + +void op_adc_idp_b(); +void op_adc_idp_w(); + +void op_and_idp_b(); +void op_and_idp_w(); + +void op_cmp_idp_b(); +void op_cmp_idp_w(); + +void op_eor_idp_b(); +void op_eor_idp_w(); + +void op_lda_idp_b(); +void op_lda_idp_w(); + +void op_ora_idp_b(); +void op_ora_idp_w(); + +void op_sbc_idp_b(); +void op_sbc_idp_w(); + + +void op_adc_idpx_b(); +void op_adc_idpx_w(); + +void op_and_idpx_b(); +void op_and_idpx_w(); + +void op_cmp_idpx_b(); +void op_cmp_idpx_w(); + +void op_eor_idpx_b(); +void op_eor_idpx_w(); + +void op_lda_idpx_b(); +void op_lda_idpx_w(); + +void op_ora_idpx_b(); +void op_ora_idpx_w(); + +void op_sbc_idpx_b(); +void op_sbc_idpx_w(); + + +void op_adc_idpy_b(); +void op_adc_idpy_w(); + +void op_and_idpy_b(); +void op_and_idpy_w(); + +void op_cmp_idpy_b(); +void op_cmp_idpy_w(); + +void op_eor_idpy_b(); +void op_eor_idpy_w(); + +void op_lda_idpy_b(); +void op_lda_idpy_w(); + +void op_ora_idpy_b(); +void op_ora_idpy_w(); + +void op_sbc_idpy_b(); +void op_sbc_idpy_w(); + + +void op_adc_ildp_b(); +void op_adc_ildp_w(); + +void op_and_ildp_b(); +void op_and_ildp_w(); + +void op_cmp_ildp_b(); +void op_cmp_ildp_w(); + +void op_eor_ildp_b(); +void op_eor_ildp_w(); + +void op_lda_ildp_b(); +void op_lda_ildp_w(); + +void op_ora_ildp_b(); +void op_ora_ildp_w(); + +void op_sbc_ildp_b(); +void op_sbc_ildp_w(); + + +void op_adc_ildpy_b(); +void op_adc_ildpy_w(); + +void op_and_ildpy_b(); +void op_and_ildpy_w(); + +void op_cmp_ildpy_b(); +void op_cmp_ildpy_w(); + +void op_eor_ildpy_b(); +void op_eor_ildpy_w(); + +void op_lda_ildpy_b(); +void op_lda_ildpy_w(); + +void op_ora_ildpy_b(); +void op_ora_ildpy_w(); + +void op_sbc_ildpy_b(); +void op_sbc_ildpy_w(); + + +void op_adc_sr_b(); +void op_adc_sr_w(); + +void op_and_sr_b(); +void op_and_sr_w(); + +void op_cmp_sr_b(); +void op_cmp_sr_w(); + +void op_eor_sr_b(); +void op_eor_sr_w(); + +void op_lda_sr_b(); +void op_lda_sr_w(); + +void op_ora_sr_b(); +void op_ora_sr_w(); + +void op_sbc_sr_b(); +void op_sbc_sr_w(); + + +void op_adc_isry_b(); +void op_adc_isry_w(); + +void op_and_isry_b(); +void op_and_isry_w(); + +void op_cmp_isry_b(); +void op_cmp_isry_w(); + +void op_eor_isry_b(); +void op_eor_isry_w(); + +void op_lda_isry_b(); +void op_lda_isry_w(); + +void op_ora_isry_b(); +void op_ora_isry_w(); + +void op_sbc_isry_b(); +void op_sbc_isry_w(); + + +//================ +//opcode_write.bpp +//================ + +void op_sta_addr_b(); +void op_sta_addr_w(); + +void op_stx_addr_b(); +void op_stx_addr_w(); + +void op_sty_addr_b(); +void op_sty_addr_w(); + +void op_stz_addr_b(); +void op_stz_addr_w(); + + +void op_sta_addrx_b(); +void op_sta_addrx_w(); + +void op_sta_addry_b(); +void op_sta_addry_w(); + +void op_stz_addrx_b(); +void op_stz_addrx_w(); + + +void op_sta_long_b(); +void op_sta_long_w(); + +void op_sta_longx_b(); +void op_sta_longx_w(); + + +void op_sta_dp_b(); +void op_sta_dp_w(); + +void op_stx_dp_b(); +void op_stx_dp_w(); + +void op_sty_dp_b(); +void op_sty_dp_w(); + +void op_stz_dp_b(); +void op_stz_dp_w(); + + +void op_sta_dpr_b(); +void op_sta_dpr_w(); + +void op_stx_dpr_b(); +void op_stx_dpr_w(); + +void op_sty_dpr_b(); +void op_sty_dpr_w(); + +void op_stz_dpr_b(); +void op_stz_dpr_w(); + + +void op_sta_idp_b(); +void op_sta_idp_w(); + +void op_sta_ildp_b(); +void op_sta_ildp_w(); + +void op_sta_idpx_b(); +void op_sta_idpx_w(); + +void op_sta_idpy_b(); +void op_sta_idpy_w(); + +void op_sta_ildpy_b(); +void op_sta_ildpy_w(); + +void op_sta_sr_b(); +void op_sta_sr_w(); + +void op_sta_isry_b(); +void op_sta_isry_w(); + + +//============== +//opcode_rmw.bpp +//============== + +void op_inc_imm_b(); +void op_inc_imm_w(); + +void op_inx_imm_b(); +void op_inx_imm_w(); + +void op_iny_imm_b(); +void op_iny_imm_w(); + +void op_dec_imm_b(); +void op_dec_imm_w(); + +void op_dex_imm_b(); +void op_dex_imm_w(); + +void op_dey_imm_b(); +void op_dey_imm_w(); + + +void op_asl_imm_b(); +void op_asl_imm_w(); + +void op_lsr_imm_b(); +void op_lsr_imm_w(); + +void op_rol_imm_b(); +void op_rol_imm_w(); + +void op_ror_imm_b(); +void op_ror_imm_w(); + + +void op_inc_addr_b(); +void op_inc_addr_w(); + +void op_dec_addr_b(); +void op_dec_addr_w(); + +void op_asl_addr_b(); +void op_asl_addr_w(); + +void op_lsr_addr_b(); +void op_lsr_addr_w(); + +void op_rol_addr_b(); +void op_rol_addr_w(); + +void op_ror_addr_b(); +void op_ror_addr_w(); + +void op_trb_addr_b(); +void op_trb_addr_w(); + +void op_tsb_addr_b(); +void op_tsb_addr_w(); + + +void op_inc_addrx_b(); +void op_inc_addrx_w(); + +void op_dec_addrx_b(); +void op_dec_addrx_w(); + +void op_asl_addrx_b(); +void op_asl_addrx_w(); + +void op_lsr_addrx_b(); +void op_lsr_addrx_w(); + +void op_rol_addrx_b(); +void op_rol_addrx_w(); + +void op_ror_addrx_b(); +void op_ror_addrx_w(); + + +void op_inc_dp_b(); +void op_inc_dp_w(); + +void op_dec_dp_b(); +void op_dec_dp_w(); + +void op_asl_dp_b(); +void op_asl_dp_w(); + +void op_lsr_dp_b(); +void op_lsr_dp_w(); + +void op_rol_dp_b(); +void op_rol_dp_w(); + +void op_ror_dp_b(); +void op_ror_dp_w(); + +void op_trb_dp_b(); +void op_trb_dp_w(); + +void op_tsb_dp_b(); +void op_tsb_dp_w(); + + +void op_inc_dpx_b(); +void op_inc_dpx_w(); + +void op_dec_dpx_b(); +void op_dec_dpx_w(); + +void op_asl_dpx_b(); +void op_asl_dpx_w(); + +void op_lsr_dpx_b(); +void op_lsr_dpx_w(); + +void op_rol_dpx_b(); +void op_rol_dpx_w(); + +void op_ror_dpx_b(); +void op_ror_dpx_w(); + + +//============= +//opcode_pc.bpp +//============= + +void op_bcc(); + +void op_bcs(); + +void op_bne(); + +void op_beq(); + +void op_bpl(); + +void op_bmi(); + +void op_bvc(); + +void op_bvs(); + + +void op_bra(); + +void op_brl(); + +void op_jmp_addr(); + +void op_jmp_long(); + +void op_jmp_iaddr(); + +void op_jmp_iaddrx(); + +void op_jmp_iladdr(); + +void op_jsr_addr(); + +void op_jsr_long_e(); +void op_jsr_long_n(); + +void op_jsr_iaddrx_e(); +void op_jsr_iaddrx_n(); + +void op_rti_e(); +void op_rti_n(); + +void op_rts(); + +void op_rtl_e(); +void op_rtl_n(); + + +//=============== +//opcode_misc.bpp +//=============== + +void op_nop(); + +void op_wdm(); + +void op_xba(); + + +void op_mvn_b(); +void op_mvn_w(); + +void op_mvp_b(); +void op_mvp_w(); + + +void op_brk_e(); +void op_brk_n(); + +void op_cop_e(); +void op_cop_n(); + + +void op_stp(); + +void op_wai(); + +void op_xce(); + + +void op_clc(); + +void op_cld(); + +void op_cli(); + +void op_clv(); + +void op_sec(); + +void op_sed(); + +void op_sei(); + + +void op_rep_e(); +void op_rep_n(); + +void op_sep_e(); +void op_sep_n(); + + +void op_tax_b(); +void op_tax_w(); + +void op_tay_b(); +void op_tay_w(); + +void op_txa_b(); +void op_txa_w(); + +void op_txy_b(); +void op_txy_w(); + +void op_tya_b(); +void op_tya_w(); + +void op_tyx_b(); +void op_tyx_w(); + + +void op_tcd(); + +void op_tdc(); + + +void op_tcs_e(); +void op_tcs_n(); + +void op_tsc_e(); +void op_tsc_n(); + +void op_tsx_b(); +void op_tsx_w(); + +void op_txs_e(); +void op_txs_n(); + + +void op_pha_b(); +void op_pha_w(); + +void op_phx_b(); +void op_phx_w(); + +void op_phy_b(); +void op_phy_w(); + +void op_phd_e(); +void op_phd_n(); + +void op_phb(); + +void op_phk(); + +void op_php(); + + +void op_pla_b(); +void op_pla_w(); + +void op_plx_b(); +void op_plx_w(); + +void op_ply_b(); +void op_ply_w(); + +void op_pld_e(); +void op_pld_n(); + +void op_plb(); + +void op_plp_e(); +void op_plp_n(); + + +void op_pea_e(); +void op_pea_n(); + +void op_pei_e(); +void op_pei_n(); + +void op_per_e(); +void op_per_n(); + + + diff --git a/tools/bsnes/cpu/core/opcode_list.bpp b/tools/bsnes/cpu/core/opcode_list.bpp new file mode 100755 index 0000000..5eeedad --- /dev/null +++ b/tools/bsnes/cpu/core/opcode_list.bpp @@ -0,0 +1,317 @@ +//=============== +//opcode_read.bpp +//=============== + +@op_read_const(adc) +@op_read_const(and) +@op_read_const(cmp) +@op_read_const(cpx) +@op_read_const(cpy) +@op_read_const(eor) +@op_read_const(lda) +@op_read_const(ldx) +@op_read_const(ldy) +@op_read_const(ora) +@op_read_const(sbc) + +@op_read_bit_const() + +@op_read_addr(adc) +@op_read_addr(and) +@op_read_addr(bit) +@op_read_addr(cmp) +@op_read_addr(cpx) +@op_read_addr(cpy) +@op_read_addr(eor) +@op_read_addr(lda) +@op_read_addr(ldx) +@op_read_addr(ldy) +@op_read_addr(ora) +@op_read_addr(sbc) + +@op_read_addrx(adc) +@op_read_addrx(and) +@op_read_addrx(bit) +@op_read_addrx(cmp) +@op_read_addrx(eor) +@op_read_addrx(lda) +@op_read_addrx(ldy) +@op_read_addrx(ora) +@op_read_addrx(sbc) + +@op_read_addry(adc) +@op_read_addry(and) +@op_read_addry(cmp) +@op_read_addry(eor) +@op_read_addry(lda) +@op_read_addry(ldx) +@op_read_addry(ora) +@op_read_addry(sbc) + +@op_read_long(adc) +@op_read_long(and) +@op_read_long(cmp) +@op_read_long(eor) +@op_read_long(lda) +@op_read_long(ora) +@op_read_long(sbc) + +@op_read_longx(adc) +@op_read_longx(and) +@op_read_longx(cmp) +@op_read_longx(eor) +@op_read_longx(lda) +@op_read_longx(ora) +@op_read_longx(sbc) + +@op_read_dp(adc) +@op_read_dp(and) +@op_read_dp(bit) +@op_read_dp(cmp) +@op_read_dp(cpx) +@op_read_dp(cpy) +@op_read_dp(eor) +@op_read_dp(lda) +@op_read_dp(ldx) +@op_read_dp(ldy) +@op_read_dp(ora) +@op_read_dp(sbc) + +@op_read_dpr(adc, x) +@op_read_dpr(and, x) +@op_read_dpr(bit, x) +@op_read_dpr(cmp, x) +@op_read_dpr(eor, x) +@op_read_dpr(lda, x) +@op_read_dpr(ldx, y) +@op_read_dpr(ldy, x) +@op_read_dpr(ora, x) +@op_read_dpr(sbc, x) + +@op_read_idp(adc) +@op_read_idp(and) +@op_read_idp(cmp) +@op_read_idp(eor) +@op_read_idp(lda) +@op_read_idp(ora) +@op_read_idp(sbc) + +@op_read_idpx(adc) +@op_read_idpx(and) +@op_read_idpx(cmp) +@op_read_idpx(eor) +@op_read_idpx(lda) +@op_read_idpx(ora) +@op_read_idpx(sbc) + +@op_read_idpy(adc) +@op_read_idpy(and) +@op_read_idpy(cmp) +@op_read_idpy(eor) +@op_read_idpy(lda) +@op_read_idpy(ora) +@op_read_idpy(sbc) + +@op_read_ildp(adc) +@op_read_ildp(and) +@op_read_ildp(cmp) +@op_read_ildp(eor) +@op_read_ildp(lda) +@op_read_ildp(ora) +@op_read_ildp(sbc) + +@op_read_ildpy(adc) +@op_read_ildpy(and) +@op_read_ildpy(cmp) +@op_read_ildpy(eor) +@op_read_ildpy(lda) +@op_read_ildpy(ora) +@op_read_ildpy(sbc) + +@op_read_sr(adc) +@op_read_sr(and) +@op_read_sr(cmp) +@op_read_sr(eor) +@op_read_sr(lda) +@op_read_sr(ora) +@op_read_sr(sbc) + +@op_read_isry(adc) +@op_read_isry(and) +@op_read_isry(cmp) +@op_read_isry(eor) +@op_read_isry(lda) +@op_read_isry(ora) +@op_read_isry(sbc) + +//================ +//opcode_write.bpp +//================ + +@op_store_addr(sta, regs.a.w) +@op_store_addr(stx, regs.x.w) +@op_store_addr(sty, regs.y.w) +@op_store_addr(stz, 0x0000) + +@op_store_addrr(sta, x, regs.a.w, regs.x.w) +@op_store_addrr(sta, y, regs.a.w, regs.y.w) +@op_store_addrr(stz, x, 0x0000, regs.x.w) + +@op_store_longr(sta, , 0x0000) +@op_store_longr(sta, x, regs.x.w) + +@op_store_dp(sta, regs.a.w) +@op_store_dp(stx, regs.x.w) +@op_store_dp(sty, regs.y.w) +@op_store_dp(stz, 0x0000) + +@op_store_dpr(sta, regs.a.w, x) +@op_store_dpr(stx, regs.x.w, y) +@op_store_dpr(sty, regs.y.w, x) +@op_store_dpr(stz, 0x0000, x) + +@op_sta_idp() +@op_sta_ildp() +@op_sta_idpx() +@op_sta_idpy() +@op_sta_ildpy() +@op_sta_sr() +@op_sta_isry() + +//============== +//opcode_rmw.bpp +//============== + +@op_adjust(inc, a, ++) +@op_adjust(inx, x, ++) +@op_adjust(iny, y, ++) +@op_adjust(dec, a, --) +@op_adjust(dex, x, --) +@op_adjust(dey, y, --) + +@op_asl() +@op_lsr() +@op_rol() +@op_ror() + +@op_adjust_addr(inc) +@op_adjust_addr(dec) +@op_adjust_addr(asl) +@op_adjust_addr(lsr) +@op_adjust_addr(rol) +@op_adjust_addr(ror) +@op_adjust_addr(trb) +@op_adjust_addr(tsb) + +@op_adjust_addrx(inc) +@op_adjust_addrx(dec) +@op_adjust_addrx(asl) +@op_adjust_addrx(lsr) +@op_adjust_addrx(rol) +@op_adjust_addrx(ror) + +@op_adjust_dp(inc) +@op_adjust_dp(dec) +@op_adjust_dp(asl) +@op_adjust_dp(lsr) +@op_adjust_dp(rol) +@op_adjust_dp(ror) +@op_adjust_dp(trb) +@op_adjust_dp(tsb) + +@op_adjust_dpx(inc) +@op_adjust_dpx(dec) +@op_adjust_dpx(asl) +@op_adjust_dpx(lsr) +@op_adjust_dpx(rol) +@op_adjust_dpx(ror) + +//============= +//opcode_pc.bpp +//============= + +@op_branch(bcc, !regs.p.c) +@op_branch(bcs, regs.p.c) +@op_branch(bne, !regs.p.z) +@op_branch(beq, regs.p.z) +@op_branch(bpl, !regs.p.n) +@op_branch(bmi, regs.p.n) +@op_branch(bvc, !regs.p.v) +@op_branch(bvs, regs.p.v) + +@op_bra() +@op_brl() +@op_jmp_addr() +@op_jmp_long() +@op_jmp_iaddr() +@op_jmp_iaddrx() +@op_jmp_iladdr() +@op_jsr_addr() +@op_jsr_long() +@op_jsr_iaddrx() +@op_rti() +@op_rts() +@op_rtl() + +//=============== +//opcode_misc.bpp +//=============== + +@op_nop() +@op_wdm() +@op_xba() + +@op_move(mvn, ++) +@op_move(mvp, --) + +@op_interrupt(brk, 0xfffe, 0xffe6) +@op_interrupt(cop, 0xfff4, 0xffe4) + +@op_stp() +@op_wai() +@op_xce() + +@op_flag(clc, regs.p.c = 0) +@op_flag(cld, regs.p.d = 0) +@op_flag(cli, regs.p.i = 0) +@op_flag(clv, regs.p.v = 0) +@op_flag(sec, regs.p.c = 1) +@op_flag(sed, regs.p.d = 1) +@op_flag(sei, regs.p.i = 1) + +@op_pflag(rep, &=~) +@op_pflag(sep, |=) + +@op_transfer(tax, a, x) +@op_transfer(tay, a, y) +@op_transfer(txa, x, a) +@op_transfer(txy, x, y) +@op_transfer(tya, y, a) +@op_transfer(tyx, y, x) + +@op_transfer_word(tcd, a, d) +@op_transfer_word(tdc, d, a) + +@op_tcs() +@op_tsc() +@op_tsx() +@op_txs() + +@op_push(pha, a) +@op_push(phx, x) +@op_push(phy, y) +@op_phd() +@op_push_byte(phb, regs.db) +@op_push_byte(phk, regs.pc.b) +@op_push_byte(php, regs.p) + +@op_pull(pla, a) +@op_pull(plx, x) +@op_pull(ply, y) +@op_pld() +@op_plb() +@op_plp() + +@op_pea() +@op_pei() +@op_per() diff --git a/tools/bsnes/cpu/core/opcode_misc.bpp b/tools/bsnes/cpu/core/opcode_misc.bpp new file mode 100755 index 0000000..140123b --- /dev/null +++ b/tools/bsnes/cpu/core/opcode_misc.bpp @@ -0,0 +1,397 @@ +@macro op_nop() + void {class}::op_nop() { +{lc}op_io_irq(); + } +@endmacro + +@macro op_wdm() + void {class}::op_wdm() { +{lc}op_readpc(); + } +@endmacro + +@macro op_xba() + void {class}::op_xba() { + op_io(); +{lc}op_io(); + regs.a.l ^= regs.a.h; + regs.a.h ^= regs.a.l; + regs.a.l ^= regs.a.h; + regs.p.n = (regs.a.l & 0x80); + regs.p.z = (regs.a.l == 0); + } +@endmacro + +@macro op_move(name, op) + void {class}::op_{name}_b() { + dp = op_readpc(); + sp = op_readpc(); + regs.db = dp; + rd.l = op_readlong((sp << 16) | regs.x.w); + op_writelong((dp << 16) | regs.y.w, rd.l); + op_io(); + regs.x.l {op}; + regs.y.l {op}; +{lc}op_io(); + if(regs.a.w--) regs.pc.w -= 3; + } + + void {class}::op_{name}_w() { + dp = op_readpc(); + sp = op_readpc(); + regs.db = dp; + rd.l = op_readlong((sp << 16) | regs.x.w); + op_writelong((dp << 16) | regs.y.w, rd.l); + op_io(); + regs.x.w {op}; + regs.y.w {op}; +{lc}op_io(); + if(regs.a.w--) regs.pc.w -= 3; + } +@endmacro + +@macro op_interrupt(name, vectorE, vectorN) + void {class}::op_{name}_e() { + op_readpc(); + op_writestack(regs.pc.h); + op_writestack(regs.pc.l); + op_writestack(regs.p); + rd.l = op_readlong({vectorE} + 0); + regs.pc.b = 0; + regs.p.i = 1; + regs.p.d = 0; +{lc}rd.h = op_readlong({vectorE} + 1); + regs.pc.w = rd.w; + } + + void {class}::op_{name}_n() { + op_readpc(); + op_writestack(regs.pc.b); + op_writestack(regs.pc.h); + op_writestack(regs.pc.l); + op_writestack(regs.p); + rd.l = op_readlong({vectorN} + 0); + regs.pc.b = 0x00; + regs.p.i = 1; + regs.p.d = 0; +{lc}rd.h = op_readlong({vectorN} + 1); + regs.pc.w = rd.w; + } +@endmacro + +@macro op_stp() + void {class}::op_stp() { + while({wai} = true) { +{lc} op_io(); + } + } +@endmacro + +@macro op_wai() + void {class}::op_wai() { + {wai} = true; + while({wai}) { +{lc} op_io(); + } + op_io(); + } +@endmacro + +@macro op_xce() + void {class}::op_xce() { +{lc}op_io_irq(); + bool carry = regs.p.c; + regs.p.c = regs.e; + regs.e = carry; + if(regs.e) { + regs.p |= 0x30; + regs.s.h = 0x01; + } + if(regs.p.x) { + regs.x.h = 0x00; + regs.y.h = 0x00; + } + update_table(); + } +@endmacro + +@macro op_flag(name, rule) + void {class}::op_{name}() { +{lc}op_io_irq(); + {rule}; + } +@endmacro + +@macro op_pflag(name, op) + void {class}::op_{name}_e() { + rd.l = op_readpc(); +{lc}op_io(); + regs.p {op} rd.l; + regs.p |= 0x30; + if(regs.p.x) { + regs.x.h = 0x00; + regs.y.h = 0x00; + } + update_table(); + } + + void {class}::op_{name}_n() { + rd.l = op_readpc(); +{lc}op_io(); + regs.p {op} rd.l; + if(regs.p.x) { + regs.x.h = 0x00; + regs.y.h = 0x00; + } + update_table(); + } +@endmacro + +@macro op_transfer(name, from, to) + void {class}::op_{name}_b() { +{lc}op_io_irq(); + regs.{to}.l = regs.{from}.l; + regs.p.n = (regs.{to}.l & 0x80); + regs.p.z = (regs.{to}.l == 0); + } + + void {class}::op_{name}_w() { +{lc}op_io_irq(); + regs.{to}.w = regs.{from}.w; + regs.p.n = (regs.{to}.w & 0x8000); + regs.p.z = (regs.{to}.w == 0); + } +@endmacro + +@macro op_transfer_word(name, from, to) + void {class}::op_{name}() { +{lc}op_io_irq(); + regs.{to}.w = regs.{from}.w; + regs.p.n = (regs.{to}.w & 0x8000); + regs.p.z = (regs.{to}.w == 0); + } +@endmacro + +@macro op_tcs() + void {class}::op_tcs_e() { +{lc}op_io_irq(); + regs.s.l = regs.a.l; + } + + void {class}::op_tcs_n() { +{lc}op_io_irq(); + regs.s.w = regs.a.w; + } +@endmacro + +@macro op_tsc() + void {class}::op_tsc_e() { +{lc}op_io_irq(); + regs.a.w = regs.s.w; + regs.p.n = (regs.a.l & 0x80); + regs.p.z = (regs.a.l == 0); + } + + void {class}::op_tsc_n() { +{lc}op_io_irq(); + regs.a.w = regs.s.w; + regs.p.n = (regs.a.w & 0x8000); + regs.p.z = (regs.a.w == 0); + } +@endmacro + +@macro op_tsx() + void {class}::op_tsx_b() { +{lc}op_io_irq(); + regs.x.l = regs.s.l; + regs.p.n = (regs.x.l & 0x80); + regs.p.z = (regs.x.l == 0); + } + + void {class}::op_tsx_w() { +{lc}op_io_irq(); + regs.x.w = regs.s.w; + regs.p.n = (regs.x.w & 0x8000); + regs.p.z = (regs.x.w == 0); + } +@endmacro + +@macro op_txs() + void {class}::op_txs_e() { +{lc}op_io_irq(); + regs.s.l = regs.x.l; + } + + void {class}::op_txs_n() { +{lc}op_io_irq(); + regs.s.w = regs.x.w; + } +@endmacro + +@macro op_push(name, r) + void {class}::op_{name}_b() { + op_io(); +{lc}op_writestack(regs.{r}.l); + } + + void {class}::op_{name}_w() { + op_io(); + op_writestack(regs.{r}.h); +{lc}op_writestack(regs.{r}.l); + } +@endmacro + +@macro op_phd() + void {class}::op_phd_e() { + op_io(); + op_writestackn(regs.d.h); +{lc}op_writestackn(regs.d.l); + regs.s.h = 0x01; + } + + void {class}::op_phd_n() { + op_io(); + op_writestackn(regs.d.h); +{lc}op_writestackn(regs.d.l); + } +@endmacro + +@macro op_push_byte(name, r) + void {class}::op_{name}() { + op_io(); +{lc}op_writestack({r}); + } +@endmacro + +@macro op_pull(name, r) + void {class}::op_{name}_b() { + op_io(); + op_io(); +{lc}regs.{r}.l = op_readstack(); + regs.p.n = (regs.{r}.l & 0x80); + regs.p.z = (regs.{r}.l == 0); + } + + void {class}::op_{name}_w() { + op_io(); + op_io(); + regs.{r}.l = op_readstack(); +{lc}regs.{r}.h = op_readstack(); + regs.p.n = (regs.{r}.w & 0x8000); + regs.p.z = (regs.{r}.w == 0); + } +@endmacro + +@macro op_pld() + void {class}::op_pld_e() { + op_io(); + op_io(); + regs.d.l = op_readstackn(); +{lc}regs.d.h = op_readstackn(); + regs.p.n = (regs.d.w & 0x8000); + regs.p.z = (regs.d.w == 0); + regs.s.h = 0x01; + } + + void {class}::op_pld_n() { + op_io(); + op_io(); + regs.d.l = op_readstackn(); +{lc}regs.d.h = op_readstackn(); + regs.p.n = (regs.d.w & 0x8000); + regs.p.z = (regs.d.w == 0); + } +@endmacro + +@macro op_plb() + void {class}::op_plb() { + op_io(); + op_io(); +{lc}regs.db = op_readstack(); + regs.p.n = (regs.db & 0x80); + regs.p.z = (regs.db == 0); + } +@endmacro + +@macro op_plp() + void {class}::op_plp_e() { + op_io(); + op_io(); +{lc}regs.p = op_readstack() | 0x30; + if(regs.p.x) { + regs.x.h = 0x00; + regs.y.h = 0x00; + } + update_table(); + } + + void {class}::op_plp_n() { + op_io(); + op_io(); +{lc}regs.p = op_readstack(); + if(regs.p.x) { + regs.x.h = 0x00; + regs.y.h = 0x00; + } + update_table(); + } +@endmacro + +@macro op_pea() + void {class}::op_pea_e() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_writestackn(aa.h); +{lc}op_writestackn(aa.l); + regs.s.h = 0x01; + } + + void {class}::op_pea_n() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_writestackn(aa.h); +{lc}op_writestackn(aa.l); + } +@endmacro + +@macro op_pei() + void {class}::op_pei_e() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + op_writestackn(aa.h); +{lc}op_writestackn(aa.l); + regs.s.h = 0x01; + } + + void {class}::op_pei_n() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + op_writestackn(aa.h); +{lc}op_writestackn(aa.l); + } +@endmacro + +@macro op_per() + void {class}::op_per_e() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io(); + rd.w = regs.pc.d + (int16_t)aa.w; + op_writestackn(rd.h); +{lc}op_writestackn(rd.l); + regs.s.h = 0x01; + } + + void {class}::op_per_n() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io(); + rd.w = regs.pc.d + (int16_t)aa.w; + op_writestackn(rd.h); +{lc}op_writestackn(rd.l); + } +@endmacro diff --git a/tools/bsnes/cpu/core/opcode_pc.bpp b/tools/bsnes/cpu/core/opcode_pc.bpp new file mode 100755 index 0000000..ea89779 --- /dev/null +++ b/tools/bsnes/cpu/core/opcode_pc.bpp @@ -0,0 +1,205 @@ +@macro op_branch(name, condition) + void {class}::op_{name}() { + if({condition} == false) { +{lc} rd.l = op_readpc(); + } else { + rd.l = op_readpc(); + aa.w = regs.pc.d + (int8_t)rd.l; + op_io_cond6(aa.w); +{lc} op_io(); + regs.pc.w = aa.w; + } + } +@endmacro + +@macro op_bra() + void {class}::op_bra() { + rd.l = op_readpc(); + aa.w = regs.pc.d + (int8_t)rd.l; + op_io_cond6(aa.w); +{lc}op_io(); + regs.pc.w = aa.w; + } +@endmacro + +@macro op_brl() + void {class}::op_brl() { + rd.l = op_readpc(); + rd.h = op_readpc(); +{lc}op_io(); + regs.pc.w = regs.pc.d + (int16_t)rd.w; + } +@endmacro + +@macro op_jmp_addr() + void {class}::op_jmp_addr() { + rd.l = op_readpc(); +{lc}rd.h = op_readpc(); + regs.pc.w = rd.w; + } +@endmacro + +@macro op_jmp_long() + void {class}::op_jmp_long() { + rd.l = op_readpc(); + rd.h = op_readpc(); +{lc}rd.b = op_readpc(); + regs.pc.d = rd.d & 0xffffff; + } +@endmacro + +@macro op_jmp_iaddr() + void {class}::op_jmp_iaddr() { + aa.l = op_readpc(); + aa.h = op_readpc(); + rd.l = op_readaddr(aa.w + 0); +{lc}rd.h = op_readaddr(aa.w + 1); + regs.pc.w = rd.w; + } +@endmacro + +@macro op_jmp_iaddrx() + void {class}::op_jmp_iaddrx() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io(); + rd.l = op_readpbr(aa.w + regs.x.w + 0); +{lc}rd.h = op_readpbr(aa.w + regs.x.w + 1); + regs.pc.w = rd.w; + } +@endmacro + +@macro op_jmp_iladdr() + void {class}::op_jmp_iladdr() { + aa.l = op_readpc(); + aa.h = op_readpc(); + rd.l = op_readaddr(aa.w + 0); + rd.h = op_readaddr(aa.w + 1); +{lc}rd.b = op_readaddr(aa.w + 2); + regs.pc.d = rd.d & 0xffffff; + } +@endmacro + +@macro op_jsr_addr() + void {class}::op_jsr_addr() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io(); + regs.pc.w--; + op_writestack(regs.pc.h); +{lc}op_writestack(regs.pc.l); + regs.pc.w = aa.w; + } +@endmacro + +@macro op_jsr_long() + void {class}::op_jsr_long_e() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_writestackn(regs.pc.b); + op_io(); + aa.b = op_readpc(); + regs.pc.w--; + op_writestackn(regs.pc.h); +{lc}op_writestackn(regs.pc.l); + regs.pc.d = aa.d & 0xffffff; + regs.s.h = 0x01; + } + + void {class}::op_jsr_long_n() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_writestackn(regs.pc.b); + op_io(); + aa.b = op_readpc(); + regs.pc.w--; + op_writestackn(regs.pc.h); +{lc}op_writestackn(regs.pc.l); + regs.pc.d = aa.d & 0xffffff; + } +@endmacro + +@macro op_jsr_iaddrx() + void {class}::op_jsr_iaddrx_e() { + aa.l = op_readpc(); + op_writestackn(regs.pc.h); + op_writestackn(regs.pc.l); + aa.h = op_readpc(); + op_io(); + rd.l = op_readpbr(aa.w + regs.x.w + 0); +{lc}rd.h = op_readpbr(aa.w + regs.x.w + 1); + regs.pc.w = rd.w; + regs.s.h = 0x01; + } + + void {class}::op_jsr_iaddrx_n() { + aa.l = op_readpc(); + op_writestackn(regs.pc.h); + op_writestackn(regs.pc.l); + aa.h = op_readpc(); + op_io(); + rd.l = op_readpbr(aa.w + regs.x.w + 0); +{lc}rd.h = op_readpbr(aa.w + regs.x.w + 1); + regs.pc.w = rd.w; + } +@endmacro + +@macro op_rti() + void {class}::op_rti_e() { + op_io(); + op_io(); + regs.p = op_readstack() | 0x30; + rd.l = op_readstack(); +{lc}rd.h = op_readstack(); + regs.pc.w = rd.w; + } + + void {class}::op_rti_n() { + op_io(); + op_io(); + regs.p = op_readstack(); + if(regs.p.x) { + regs.x.h = 0x00; + regs.y.h = 0x00; + } + rd.l = op_readstack(); + rd.h = op_readstack(); +{lc}rd.b = op_readstack(); + regs.pc.d = rd.d & 0xffffff; + update_table(); + } +@endmacro + +@macro op_rts() + void {class}::op_rts() { + op_io(); + op_io(); + rd.l = op_readstack(); + rd.h = op_readstack(); +{lc}op_io(); + regs.pc.w = ++rd.w; + } +@endmacro + +@macro op_rtl() + void {class}::op_rtl_e() { + op_io(); + op_io(); + rd.l = op_readstackn(); + rd.h = op_readstackn(); +{lc}rd.b = op_readstackn(); + regs.pc.b = rd.b; + regs.pc.w = ++rd.w; + regs.s.h = 0x01; + } + + void {class}::op_rtl_n() { + op_io(); + op_io(); + rd.l = op_readstackn(); + rd.h = op_readstackn(); +{lc}rd.b = op_readstackn(); + regs.pc.b = rd.b; + regs.pc.w = ++rd.w; + } +@endmacro diff --git a/tools/bsnes/cpu/core/opcode_read.bpp b/tools/bsnes/cpu/core/opcode_read.bpp new file mode 100755 index 0000000..eb2a672 --- /dev/null +++ b/tools/bsnes/cpu/core/opcode_read.bpp @@ -0,0 +1,307 @@ +@macro op_read_const(name) + void {class}::op_{name}_const_b() { +{lc}rd.l = op_readpc(); + op_{name}_b(); + } + + void {class}::op_{name}_const_w() { + rd.l = op_readpc(); +{lc}rd.h = op_readpc(); + op_{name}_w(); + } +@endmacro + +@macro op_read_bit_const() + void {class}::op_bit_const_b() { +{lc}rd.l = op_readpc(); + regs.p.z = ((rd.l & regs.a.l) == 0); + } + + void {class}::op_bit_const_w() { + rd.l = op_readpc(); +{lc}rd.h = op_readpc(); + regs.p.z = ((rd.w & regs.a.w) == 0); + } +@endmacro + +@macro op_read_addr(name) + void {class}::op_{name}_addr_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); +{lc}rd.l = op_readdbr(aa.w); + op_{name}_b(); + } + + void {class}::op_{name}_addr_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + rd.l = op_readdbr(aa.w + 0); +{lc}rd.h = op_readdbr(aa.w + 1); + op_{name}_w(); + } +@endmacro + +@macro op_read_addrx(name) + void {class}::op_{name}_addrx_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io_cond4(aa.w, aa.w + regs.x.w); +{lc}rd.l = op_readdbr(aa.w + regs.x.w); + op_{name}_b(); + } + + void {class}::op_{name}_addrx_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io_cond4(aa.w, aa.w + regs.x.w); + rd.l = op_readdbr(aa.w + regs.x.w + 0); +{lc}rd.h = op_readdbr(aa.w + regs.x.w + 1); + op_{name}_w(); + } +@endmacro + +@macro op_read_addry(name) + void {class}::op_{name}_addry_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io_cond4(aa.w, aa.w + regs.y.w); +{lc}rd.l = op_readdbr(aa.w + regs.y.w); + op_{name}_b(); + } + + void {class}::op_{name}_addry_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io_cond4(aa.w, aa.w + regs.y.w); + rd.l = op_readdbr(aa.w + regs.y.w + 0); +{lc}rd.h = op_readdbr(aa.w + regs.y.w + 1); + op_{name}_w(); + } +@endmacro + +@macro op_read_long(name) + void {class}::op_{name}_long_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + aa.b = op_readpc(); +{lc}rd.l = op_readlong(aa.d); + op_{name}_b(); + } + + void {class}::op_{name}_long_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + aa.b = op_readpc(); + rd.l = op_readlong(aa.d + 0); +{lc}rd.h = op_readlong(aa.d + 1); + op_{name}_w(); + } +@endmacro + +@macro op_read_longx(name) + void {class}::op_{name}_longx_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + aa.b = op_readpc(); +{lc}rd.l = op_readlong(aa.d + regs.x.w); + op_{name}_b(); + } + + void {class}::op_{name}_longx_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + aa.b = op_readpc(); + rd.l = op_readlong(aa.d + regs.x.w + 0); +{lc}rd.h = op_readlong(aa.d + regs.x.w + 1); + op_{name}_w(); + } +@endmacro + +@macro op_read_dp(name) + void {class}::op_{name}_dp_b() { + dp = op_readpc(); + op_io_cond2(); +{lc}rd.l = op_readdp(dp); + op_{name}_b(); + } + + void {class}::op_{name}_dp_w() { + dp = op_readpc(); + op_io_cond2(); + rd.l = op_readdp(dp + 0); +{lc}rd.h = op_readdp(dp + 1); + op_{name}_w(); + } +@endmacro + +@macro op_read_dpr(name, r) + void {class}::op_{name}_dpr_b() { + dp = op_readpc(); + op_io_cond2(); + op_io(); +{lc}rd.l = op_readdp(dp + regs.{r}.w); + op_{name}_b(); + } + + void {class}::op_{name}_dpr_w() { + dp = op_readpc(); + op_io_cond2(); + op_io(); +{lc}rd.l = op_readdp(dp + regs.{r}.w + 0); + rd.h = op_readdp(dp + regs.{r}.w + 1); + op_{name}_w(); + } +@endmacro + +@macro op_read_idp(name) + void {class}::op_{name}_idp_b() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); +{lc}rd.l = op_readdbr(aa.w); + op_{name}_b(); + } + + void {class}::op_{name}_idp_w() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + rd.l = op_readdbr(aa.w + 0); +{lc}rd.h = op_readdbr(aa.w + 1); + op_{name}_w(); + } +@endmacro + +@macro op_read_idpx(name) + void {class}::op_{name}_idpx_b() { + dp = op_readpc(); + op_io_cond2(); + op_io(); + aa.l = op_readdp(dp + regs.x.w + 0); + aa.h = op_readdp(dp + regs.x.w + 1); +{lc}rd.l = op_readdbr(aa.w); + op_{name}_b(); + } + + void {class}::op_{name}_idpx_w() { + dp = op_readpc(); + op_io_cond2(); + op_io(); + aa.l = op_readdp(dp + regs.x.w + 0); + aa.h = op_readdp(dp + regs.x.w + 1); + rd.l = op_readdbr(aa.w + 0); +{lc}rd.h = op_readdbr(aa.w + 1); + op_{name}_w(); + } +@endmacro + +@macro op_read_idpy(name) + void {class}::op_{name}_idpy_b() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + op_io_cond4(aa.w, aa.w + regs.y.w); +{lc}rd.l = op_readdbr(aa.w + regs.y.w); + op_{name}_b(); + } + + void {class}::op_{name}_idpy_w() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + op_io_cond4(aa.w, aa.w + regs.y.w); + rd.l = op_readdbr(aa.w + regs.y.w + 0); +{lc}rd.h = op_readdbr(aa.w + regs.y.w + 1); + op_{name}_w(); + } +@endmacro + +@macro op_read_ildp(name) + void {class}::op_{name}_ildp_b() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + aa.b = op_readdp(dp + 2); +{lc}rd.l = op_readlong(aa.d); + op_{name}_b(); + } + + void {class}::op_{name}_ildp_w() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + aa.b = op_readdp(dp + 2); + rd.l = op_readlong(aa.d + 0); +{lc}rd.h = op_readlong(aa.d + 1); + op_{name}_w(); + } +@endmacro + +@macro op_read_ildpy(name) + void {class}::op_{name}_ildpy_b() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + aa.b = op_readdp(dp + 2); +{lc}rd.l = op_readlong(aa.d + regs.y.w); + op_{name}_b(); + } + + void {class}::op_{name}_ildpy_w() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + aa.b = op_readdp(dp + 2); + rd.l = op_readlong(aa.d + regs.y.w + 0); +{lc}rd.h = op_readlong(aa.d + regs.y.w + 1); + op_{name}_w(); + } +@endmacro + +@macro op_read_sr(name) + void {class}::op_{name}_sr_b() { + sp = op_readpc(); + op_io(); +{lc}rd.l = op_readsp(sp); + op_{name}_b(); + } + + void {class}::op_{name}_sr_w() { + sp = op_readpc(); + op_io(); + rd.l = op_readsp(sp + 0); +{lc}rd.h = op_readsp(sp + 1); + op_{name}_w(); + } +@endmacro + +@macro op_read_isry(name) + void {class}::op_{name}_isry_b() { + sp = op_readpc(); + op_io(); + aa.l = op_readsp(sp + 0); + aa.h = op_readsp(sp + 1); + op_io(); +{lc}rd.l = op_readdbr(aa.w + regs.y.w); + op_{name}_b(); + } + + void {class}::op_{name}_isry_w() { + sp = op_readpc(); + op_io(); + aa.l = op_readsp(sp + 0); + aa.h = op_readsp(sp + 1); + op_io(); + rd.l = op_readdbr(aa.w + regs.y.w + 0); +{lc}rd.h = op_readdbr(aa.w + regs.y.w + 1); + op_{name}_w(); + } +@endmacro diff --git a/tools/bsnes/cpu/core/opcode_rmw.bpp b/tools/bsnes/cpu/core/opcode_rmw.bpp new file mode 100755 index 0000000..b843356 --- /dev/null +++ b/tools/bsnes/cpu/core/opcode_rmw.bpp @@ -0,0 +1,183 @@ +@macro op_adjust(name, r, op) + void {class}::op_{name}_imm_b() { +{lc}op_io_irq(); + regs.{r}.l {op}; + regs.p.n = (regs.{r}.l & 0x80); + regs.p.z = (regs.{r}.l == 0); + } + + void {class}::op_{name}_imm_w() { +{lc}op_io_irq(); + regs.{r}.w {op}; + regs.p.n = (regs.{r}.w & 0x8000); + regs.p.z = (regs.{r}.w == 0); + } +@endmacro + +@macro op_asl() + void {class}::op_asl_imm_b() { +{lc}op_io_irq(); + regs.p.c = (regs.a.l & 0x80); + regs.a.l <<= 1; + regs.p.n = (regs.a.l & 0x80); + regs.p.z = (regs.a.l == 0); + } + + void {class}::op_asl_imm_w() { +{lc}op_io_irq(); + regs.p.c = (regs.a.w & 0x8000); + regs.a.w <<= 1; + regs.p.n = (regs.a.w & 0x8000); + regs.p.z = (regs.a.w == 0); + } +@endmacro + +@macro op_lsr() + void {class}::op_lsr_imm_b() { +{lc}op_io_irq(); + regs.p.c = (regs.a.l & 0x01); + regs.a.l >>= 1; + regs.p.n = (regs.a.l & 0x80); + regs.p.z = (regs.a.l == 0); + } + + void {class}::op_lsr_imm_w() { +{lc}op_io_irq(); + regs.p.c = (regs.a.w & 0x0001); + regs.a.w >>= 1; + regs.p.n = (regs.a.w & 0x8000); + regs.p.z = (regs.a.w == 0); + } +@endmacro + +@macro op_rol() + void {class}::op_rol_imm_b() { +{lc}op_io_irq(); + bool carry = regs.p.c; + regs.p.c = (regs.a.l & 0x80); + regs.a.l = (regs.a.l << 1) | carry; + regs.p.n = (regs.a.l & 0x80); + regs.p.z = (regs.a.l == 0); + } + + void {class}::op_rol_imm_w() { +{lc}op_io_irq(); + bool carry = regs.p.c; + regs.p.c = (regs.a.w & 0x8000); + regs.a.w = (regs.a.w << 1) | carry; + regs.p.n = (regs.a.w & 0x8000); + regs.p.z = (regs.a.w == 0); + } +@endmacro + +@macro op_ror() + void {class}::op_ror_imm_b() { +{lc}op_io_irq(); + bool carry = regs.p.c; + regs.p.c = (regs.a.l & 0x01); + regs.a.l = (carry << 7) | (regs.a.l >> 1); + regs.p.n = (regs.a.l & 0x80); + regs.p.z = (regs.a.l == 0); + } + + void {class}::op_ror_imm_w() { +{lc}op_io_irq(); + bool carry = regs.p.c; + regs.p.c = (regs.a.w & 0x0001); + regs.a.w = (carry << 15) | (regs.a.w >> 1); + regs.p.n = (regs.a.w & 0x8000); + regs.p.z = (regs.a.w == 0); + } +@endmacro + +@macro op_adjust_addr(name) + void {class}::op_{name}_addr_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + rd.l = op_readdbr(aa.w); + op_io(); + op_{name}_b(); +{lc}op_writedbr(aa.w, rd.l); + } + + void {class}::op_{name}_addr_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + rd.l = op_readdbr(aa.w + 0); + rd.h = op_readdbr(aa.w + 1); + op_io(); + op_{name}_w(); + op_writedbr(aa.w + 1, rd.h); +{lc}op_writedbr(aa.w + 0, rd.l); + } +@endmacro + +@macro op_adjust_addrx(name) + void {class}::op_{name}_addrx_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io(); + rd.l = op_readdbr(aa.w + regs.x.w); + op_io(); + op_{name}_b(); +{lc}op_writedbr(aa.w + regs.x.w, rd.l); + } + + void {class}::op_{name}_addrx_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io(); + rd.l = op_readdbr(aa.w + regs.x.w + 0); + rd.h = op_readdbr(aa.w + regs.x.w + 1); + op_io(); + op_{name}_w(); + op_writedbr(aa.w + regs.x.w + 1, rd.h); +{lc}op_writedbr(aa.w + regs.x.w + 0, rd.l); + } +@endmacro + +@macro op_adjust_dp(name) + void {class}::op_{name}_dp_b() { + dp = op_readpc(); + op_io_cond2(); + rd.l = op_readdp(dp); + op_io(); + op_{name}_b(); +{lc}op_writedp(dp, rd.l); + } + + void {class}::op_{name}_dp_w() { + dp = op_readpc(); + op_io_cond2(); + rd.l = op_readdp(dp + 0); + rd.h = op_readdp(dp + 1); + op_io(); + op_{name}_w(); + op_writedp(dp + 1, rd.h); +{lc}op_writedp(dp + 0, rd.l); + } +@endmacro + +@macro op_adjust_dpx(name) + void {class}::op_{name}_dpx_b() { + dp = op_readpc(); + op_io_cond2(); + op_io(); + rd.l = op_readdp(dp + regs.x.w); + op_io(); + op_{name}_b(); +{lc}op_writedp(dp + regs.x.w, rd.l); + } + + void {class}::op_{name}_dpx_w() { + dp = op_readpc(); + op_io_cond2(); + op_io(); + rd.l = op_readdp(dp + regs.x.w + 0); + rd.h = op_readdp(dp + regs.x.w + 1); + op_io(); + op_{name}_w(); + op_writedp(dp + regs.x.w + 1, rd.h); +{lc}op_writedp(dp + regs.x.w + 0, rd.l); + } +@endmacro diff --git a/tools/bsnes/cpu/core/opcode_tables.cpp b/tools/bsnes/cpu/core/opcode_tables.cpp new file mode 100755 index 0000000..bafccb7 --- /dev/null +++ b/tools/bsnes/cpu/core/opcode_tables.cpp @@ -0,0 +1,141 @@ +#ifdef CPUCORE_CPP + +void CPUcore::initialize_opcode_table() { + //same implementation for all processor states + #define opA(id, name) \ + op_table[table_EM + id] = &CPUcore::op_ ## name; \ + op_table[table_MX + id] = &CPUcore::op_ ## name; \ + op_table[table_Mx + id] = &CPUcore::op_ ## name; \ + op_table[table_mX + id] = &CPUcore::op_ ## name; \ + op_table[table_mx + id] = &CPUcore::op_ ## name; + + //implementation changes based on E processor state + #define opE(id, name) \ + op_table[table_EM + id] = &CPUcore::op_ ## name ## _e; \ + op_table[table_MX + id] = &CPUcore::op_ ## name ## _n; \ + op_table[table_Mx + id] = &CPUcore::op_ ## name ## _n; \ + op_table[table_mX + id] = &CPUcore::op_ ## name ## _n; \ + op_table[table_mx + id] = &CPUcore::op_ ## name ## _n; \ + + //implementation changes based on M processor state + #define opM(id, name) \ + op_table[table_EM + id] = &CPUcore::op_ ## name ## _b; \ + op_table[table_MX + id] = &CPUcore::op_ ## name ## _b; \ + op_table[table_Mx + id] = &CPUcore::op_ ## name ## _b; \ + op_table[table_mX + id] = &CPUcore::op_ ## name ## _w; \ + op_table[table_mx + id] = &CPUcore::op_ ## name ## _w; + + //implementation changes based on X processor state + #define opX(id, name) \ + op_table[table_EM + id] = &CPUcore::op_ ## name ## _b; \ + op_table[table_MX + id] = &CPUcore::op_ ## name ## _b; \ + op_table[table_Mx + id] = &CPUcore::op_ ## name ## _w; \ + op_table[table_mX + id] = &CPUcore::op_ ## name ## _b; \ + op_table[table_mx + id] = &CPUcore::op_ ## name ## _w; + + opE(0x00, brk) opM(0x01, ora_idpx) opE(0x02, cop) opM(0x03, ora_sr) + opM(0x04, tsb_dp) opM(0x05, ora_dp) opM(0x06, asl_dp) opM(0x07, ora_ildp) + opA(0x08, php) opM(0x09, ora_const) opM(0x0a, asl_imm) opE(0x0b, phd) + opM(0x0c, tsb_addr) opM(0x0d, ora_addr) opM(0x0e, asl_addr) opM(0x0f, ora_long) + + opA(0x10, bpl) opM(0x11, ora_idpy) opM(0x12, ora_idp) opM(0x13, ora_isry) + opM(0x14, trb_dp) opM(0x15, ora_dpr) opM(0x16, asl_dpx) opM(0x17, ora_ildpy) + opA(0x18, clc) opM(0x19, ora_addry) opM(0x1a, inc_imm) opE(0x1b, tcs) + opM(0x1c, trb_addr) opM(0x1d, ora_addrx) opM(0x1e, asl_addrx) opM(0x1f, ora_longx) + + opA(0x20, jsr_addr) opM(0x21, and_idpx) opE(0x22, jsr_long) opM(0x23, and_sr) + opM(0x24, bit_dp) opM(0x25, and_dp) opM(0x26, rol_dp) opM(0x27, and_ildp) + opE(0x28, plp) opM(0x29, and_const) opM(0x2a, rol_imm) opE(0x2b, pld) + opM(0x2c, bit_addr) opM(0x2d, and_addr) opM(0x2e, rol_addr) opM(0x2f, and_long) + + opA(0x30, bmi) opM(0x31, and_idpy) opM(0x32, and_idp) opM(0x33, and_isry) + opM(0x34, bit_dpr) opM(0x35, and_dpr) opM(0x36, rol_dpx) opM(0x37, and_ildpy) + opA(0x38, sec) opM(0x39, and_addry) opM(0x3a, dec_imm) opE(0x3b, tsc) + opM(0x3c, bit_addrx) opM(0x3d, and_addrx) opM(0x3e, rol_addrx) opM(0x3f, and_longx) + + opE(0x40, rti) opM(0x41, eor_idpx) opA(0x42, wdm) opM(0x43, eor_sr) + opX(0x44, mvp) opM(0x45, eor_dp) opM(0x46, lsr_dp) opM(0x47, eor_ildp) + opM(0x48, pha) opM(0x49, eor_const) opM(0x4a, lsr_imm) opA(0x4b, phk) + opA(0x4c, jmp_addr) opM(0x4d, eor_addr) opM(0x4e, lsr_addr) opM(0x4f, eor_long) + + opA(0x50, bvc) opM(0x51, eor_idpy) opM(0x52, eor_idp) opM(0x53, eor_isry) + opX(0x54, mvn) opM(0x55, eor_dpr) opM(0x56, lsr_dpx) opM(0x57, eor_ildpy) + opA(0x58, cli) opM(0x59, eor_addry) opX(0x5a, phy) opA(0x5b, tcd) + opA(0x5c, jmp_long) opM(0x5d, eor_addrx) opM(0x5e, lsr_addrx) opM(0x5f, eor_longx) + + opA(0x60, rts) opM(0x61, adc_idpx) opE(0x62, per) opM(0x63, adc_sr) + opM(0x64, stz_dp) opM(0x65, adc_dp) opM(0x66, ror_dp) opM(0x67, adc_ildp) + opM(0x68, pla) opM(0x69, adc_const) opM(0x6a, ror_imm) opE(0x6b, rtl) + opA(0x6c, jmp_iaddr) opM(0x6d, adc_addr) opM(0x6e, ror_addr) opM(0x6f, adc_long) + + opA(0x70, bvs) opM(0x71, adc_idpy) opM(0x72, adc_idp) opM(0x73, adc_isry) + opM(0x74, stz_dpr) opM(0x75, adc_dpr) opM(0x76, ror_dpx) opM(0x77, adc_ildpy) + opA(0x78, sei) opM(0x79, adc_addry) opX(0x7a, ply) opA(0x7b, tdc) + opA(0x7c, jmp_iaddrx) opM(0x7d, adc_addrx) opM(0x7e, ror_addrx) opM(0x7f, adc_longx) + + opA(0x80, bra) opM(0x81, sta_idpx) opA(0x82, brl) opM(0x83, sta_sr) + opX(0x84, sty_dp) opM(0x85, sta_dp) opX(0x86, stx_dp) opM(0x87, sta_ildp) + opX(0x88, dey_imm) opM(0x89, bit_const) opM(0x8a, txa) opA(0x8b, phb) + opX(0x8c, sty_addr) opM(0x8d, sta_addr) opX(0x8e, stx_addr) opM(0x8f, sta_long) + + opA(0x90, bcc) opM(0x91, sta_idpy) opM(0x92, sta_idp) opM(0x93, sta_isry) + opX(0x94, sty_dpr) opM(0x95, sta_dpr) opX(0x96, stx_dpr) opM(0x97, sta_ildpy) + opM(0x98, tya) opM(0x99, sta_addry) opE(0x9a, txs) opX(0x9b, txy) + opM(0x9c, stz_addr) opM(0x9d, sta_addrx) opM(0x9e, stz_addrx) opM(0x9f, sta_longx) + + opX(0xa0, ldy_const) opM(0xa1, lda_idpx) opX(0xa2, ldx_const) opM(0xa3, lda_sr) + opX(0xa4, ldy_dp) opM(0xa5, lda_dp) opX(0xa6, ldx_dp) opM(0xa7, lda_ildp) + opX(0xa8, tay) opM(0xa9, lda_const) opX(0xaa, tax) opA(0xab, plb) + opX(0xac, ldy_addr) opM(0xad, lda_addr) opX(0xae, ldx_addr) opM(0xaf, lda_long) + + opA(0xb0, bcs) opM(0xb1, lda_idpy) opM(0xb2, lda_idp) opM(0xb3, lda_isry) + opX(0xb4, ldy_dpr) opM(0xb5, lda_dpr) opX(0xb6, ldx_dpr) opM(0xb7, lda_ildpy) + opA(0xb8, clv) opM(0xb9, lda_addry) opX(0xba, tsx) opX(0xbb, tyx) + opX(0xbc, ldy_addrx) opM(0xbd, lda_addrx) opX(0xbe, ldx_addry) opM(0xbf, lda_longx) + + opX(0xc0, cpy_const) opM(0xc1, cmp_idpx) opE(0xc2, rep) opM(0xc3, cmp_sr) + opX(0xc4, cpy_dp) opM(0xc5, cmp_dp) opM(0xc6, dec_dp) opM(0xc7, cmp_ildp) + opX(0xc8, iny_imm) opM(0xc9, cmp_const) opX(0xca, dex_imm) opA(0xcb, wai) + opX(0xcc, cpy_addr) opM(0xcd, cmp_addr) opM(0xce, dec_addr) opM(0xcf, cmp_long) + + opA(0xd0, bne) opM(0xd1, cmp_idpy) opM(0xd2, cmp_idp) opM(0xd3, cmp_isry) + opE(0xd4, pei) opM(0xd5, cmp_dpr) opM(0xd6, dec_dpx) opM(0xd7, cmp_ildpy) + opA(0xd8, cld) opM(0xd9, cmp_addry) opX(0xda, phx) opA(0xdb, stp) + opA(0xdc, jmp_iladdr) opM(0xdd, cmp_addrx) opM(0xde, dec_addrx) opM(0xdf, cmp_longx) + + opX(0xe0, cpx_const) opM(0xe1, sbc_idpx) opE(0xe2, sep) opM(0xe3, sbc_sr) + opX(0xe4, cpx_dp) opM(0xe5, sbc_dp) opM(0xe6, inc_dp) opM(0xe7, sbc_ildp) + opX(0xe8, inx_imm) opM(0xe9, sbc_const) opA(0xea, nop) opA(0xeb, xba) + opX(0xec, cpx_addr) opM(0xed, sbc_addr) opM(0xee, inc_addr) opM(0xef, sbc_long) + + opA(0xf0, beq) opM(0xf1, sbc_idpy) opM(0xf2, sbc_idp) opM(0xf3, sbc_isry) + opE(0xf4, pea) opM(0xf5, sbc_dpr) opM(0xf6, inc_dpx) opM(0xf7, sbc_ildpy) + opA(0xf8, sed) opM(0xf9, sbc_addry) opX(0xfa, plx) opA(0xfb, xce) + opE(0xfc, jsr_iaddrx) opM(0xfd, sbc_addrx) opM(0xfe, inc_addrx) opM(0xff, sbc_longx) + + #undef opA + #undef opE + #undef opM + #undef opX +} + +void CPUcore::update_table() { + if(regs.e) { + opcode_table = &op_table[table_EM]; + } else if(regs.p.m) { + if(regs.p.x) { + opcode_table = &op_table[table_MX]; + } else { + opcode_table = &op_table[table_Mx]; + } + } else { + if(regs.p.x) { + opcode_table = &op_table[table_mX]; + } else { + opcode_table = &op_table[table_mx]; + } + } +} + +#endif + diff --git a/tools/bsnes/cpu/core/opcode_write.bpp b/tools/bsnes/cpu/core/opcode_write.bpp new file mode 100755 index 0000000..0deecf8 --- /dev/null +++ b/tools/bsnes/cpu/core/opcode_write.bpp @@ -0,0 +1,219 @@ +@macro op_store_addr(name, r) + void {class}::op_{name}_addr_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); +{lc}op_writedbr(aa.w, {r}); + } + + void {class}::op_{name}_addr_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_writedbr(aa.w + 0, {r} >> 0); +{lc}op_writedbr(aa.w + 1, {r} >> 8); + } +@endmacro + +@macro op_store_addrr(name, suffix, r, index) + void {class}::op_{name}_addr{suffix}_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io(); +{lc}op_writedbr(aa.w + {index}, {r}); + } + + void {class}::op_{name}_addr{suffix}_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io(); + op_writedbr(aa.w + {index} + 0, {r} >> 0); +{lc}op_writedbr(aa.w + {index} + 1, {r} >> 8); + } +@endmacro + +@macro op_store_longr(name, suffix, index) + void {class}::op_{name}_long{suffix}_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + aa.b = op_readpc(); +{lc}op_writelong(aa.d + {index}, regs.a.l); + } + + void {class}::op_{name}_long{suffix}_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + aa.b = op_readpc(); + op_writelong(aa.d + {index} + 0, regs.a.l); +{lc}op_writelong(aa.d + {index} + 1, regs.a.h); + } +@endmacro + +@macro op_store_dp(name, r) + void {class}::op_{name}_dp_b() { + dp = op_readpc(); + op_io_cond2(); +{lc}op_writedp(dp, {r}); + } + + void {class}::op_{name}_dp_w() { + dp = op_readpc(); + op_io_cond2(); + op_writedp(dp + 0, {r} >> 0); +{lc}op_writedp(dp + 1, {r} >> 8); + } +@endmacro + +@macro op_store_dpr(name, r, index) + void {class}::op_{name}_dpr_b() { + dp = op_readpc(); + op_io_cond2(); + op_io(); +{lc}op_writedp(dp + regs.{index}.w, {r}); + } + + void {class}::op_{name}_dpr_w() { + dp = op_readpc(); + op_io_cond2(); + op_io(); + op_writedp(dp + regs.{index}.w + 0, {r} >> 0); +{lc}op_writedp(dp + regs.{index}.w + 1, {r} >> 8); + } +@endmacro + +@macro op_sta_idp() + void {class}::op_sta_idp_b() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); +{lc}op_writedbr(aa.w, regs.a.l); + } + + void {class}::op_sta_idp_w() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + op_writedbr(aa.w + 0, regs.a.l); +{lc}op_writedbr(aa.w + 1, regs.a.h); + } +@endmacro + +@macro op_sta_ildp() + void {class}::op_sta_ildp_b() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + aa.b = op_readdp(dp + 2); +{lc}op_writelong(aa.d, regs.a.l); + } + + void {class}::op_sta_ildp_w() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + aa.b = op_readdp(dp + 2); + op_writelong(aa.d + 0, regs.a.l); +{lc}op_writelong(aa.d + 1, regs.a.h); + } +@endmacro + +@macro op_sta_idpx() + void {class}::op_sta_idpx_b() { + dp = op_readpc(); + op_io_cond2(); + op_io(); + aa.l = op_readdp(dp + regs.x.w + 0); + aa.h = op_readdp(dp + regs.x.w + 1); +{lc}op_writedbr(aa.w, regs.a.l); + } + + void {class}::op_sta_idpx_w() { + dp = op_readpc(); + op_io_cond2(); + op_io(); + aa.l = op_readdp(dp + regs.x.w + 0); + aa.h = op_readdp(dp + regs.x.w + 1); + op_writedbr(aa.w + 0, regs.a.l); +{lc}op_writedbr(aa.w + 1, regs.a.h); + } +@endmacro + +@macro op_sta_idpy() + void {class}::op_sta_idpy_b() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + op_io(); +{lc}op_writedbr(aa.w + regs.y.w, regs.a.l); + } + + void {class}::op_sta_idpy_w() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + op_io(); + op_writedbr(aa.w + regs.y.w + 0, regs.a.l); +{lc}op_writedbr(aa.w + regs.y.w + 1, regs.a.h); + } +@endmacro + +@macro op_sta_ildpy() + void {class}::op_sta_ildpy_b() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + aa.b = op_readdp(dp + 2); +{lc}op_writelong(aa.d + regs.y.w, regs.a.l); + } + + void {class}::op_sta_ildpy_w() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + aa.b = op_readdp(dp + 2); + op_writelong(aa.d + regs.y.w + 0, regs.a.l); +{lc}op_writelong(aa.d + regs.y.w + 1, regs.a.h); + } +@endmacro + +@macro op_sta_sr() + void {class}::op_sta_sr_b() { + sp = op_readpc(); + op_io(); +{lc}op_writesp(sp, regs.a.l); + } + + void {class}::op_sta_sr_w() { + sp = op_readpc(); + op_io(); + op_writesp(sp + 0, regs.a.l); +{lc}op_writesp(sp + 1, regs.a.h); + } +@endmacro + +@macro op_sta_isry() + void {class}::op_sta_isry_b() { + sp = op_readpc(); + op_io(); + aa.l = op_readsp(sp + 0); + aa.h = op_readsp(sp + 1); + op_io(); +{lc}op_writedbr(aa.w + regs.y.w, regs.a.l); + } + + void {class}::op_sta_isry_w() { + sp = op_readpc(); + op_io(); + aa.l = op_readsp(sp + 0); + aa.h = op_readsp(sp + 1); + op_io(); + op_writedbr(aa.w + regs.y.w + 0, regs.a.l); +{lc}op_writedbr(aa.w + regs.y.w + 1, regs.a.h); + } +@endmacro diff --git a/tools/bsnes/cpu/core/registers.hpp b/tools/bsnes/cpu/core/registers.hpp new file mode 100755 index 0000000..a8e417e --- /dev/null +++ b/tools/bsnes/cpu/core/registers.hpp @@ -0,0 +1,79 @@ +struct flag_t { + bool n, v, m, x, d, i, z, c; + + inline operator unsigned() const { + return (n << 7) + (v << 6) + (m << 5) + (x << 4) + + (d << 3) + (i << 2) + (z << 1) + (c << 0); + } + + inline unsigned operator=(uint8_t data) { + n = data & 0x80; v = data & 0x40; m = data & 0x20; x = data & 0x10; + d = data & 0x08; i = data & 0x04; z = data & 0x02; c = data & 0x01; + return data; + } + + inline unsigned operator|=(unsigned data) { return operator=(operator unsigned() | data); } + inline unsigned operator^=(unsigned data) { return operator=(operator unsigned() ^ data); } + inline unsigned operator&=(unsigned data) { return operator=(operator unsigned() & data); } + + flag_t() : n(0), v(0), m(0), x(0), d(0), i(0), z(0), c(0) {} +}; + +struct reg16_t { + union { + uint16 w; + struct { uint8 order_lsb2(l, h); }; + }; + + inline operator unsigned() const { return w; } + inline unsigned operator = (unsigned i) { return w = i; } + inline unsigned operator |= (unsigned i) { return w |= i; } + inline unsigned operator ^= (unsigned i) { return w ^= i; } + inline unsigned operator &= (unsigned i) { return w &= i; } + inline unsigned operator <<= (unsigned i) { return w <<= i; } + inline unsigned operator >>= (unsigned i) { return w >>= i; } + inline unsigned operator += (unsigned i) { return w += i; } + inline unsigned operator -= (unsigned i) { return w -= i; } + inline unsigned operator *= (unsigned i) { return w *= i; } + inline unsigned operator /= (unsigned i) { return w /= i; } + inline unsigned operator %= (unsigned i) { return w %= i; } + + reg16_t() : w(0) {} +}; + +struct reg24_t { + union { + uint32 d; + struct { uint16 order_lsb2(w, wh); }; + struct { uint8 order_lsb4(l, h, b, bh); }; + }; + + inline operator unsigned() const { return d; } + inline unsigned operator = (unsigned i) { return d = uclip<24>(i); } + inline unsigned operator |= (unsigned i) { return d = uclip<24>(d | i); } + inline unsigned operator ^= (unsigned i) { return d = uclip<24>(d ^ i); } + inline unsigned operator &= (unsigned i) { return d = uclip<24>(d & i); } + inline unsigned operator <<= (unsigned i) { return d = uclip<24>(d << i); } + inline unsigned operator >>= (unsigned i) { return d = uclip<24>(d >> i); } + inline unsigned operator += (unsigned i) { return d = uclip<24>(d + i); } + inline unsigned operator -= (unsigned i) { return d = uclip<24>(d - i); } + inline unsigned operator *= (unsigned i) { return d = uclip<24>(d * i); } + inline unsigned operator /= (unsigned i) { return d = uclip<24>(d / i); } + inline unsigned operator %= (unsigned i) { return d = uclip<24>(d % i); } + + reg24_t() : d(0) {} +}; + +struct regs_t { + reg24_t pc; + reg16_t a, x, y, s, d; + flag_t p; + uint8_t db; + bool e; + + bool irq; //IRQ pin (0 = low, 1 = trigger) + bool wai; //raised during wai, cleared after interrupt triggered + uint8_t mdr; //memory data register + + regs_t() : db(0), e(false), irq(false), wai(false), mdr(0) {} +}; diff --git a/tools/bsnes/lib/bpp/bpp.cpp b/tools/bsnes/lib/bpp/bpp.cpp new file mode 100755 index 0000000..86a18fa --- /dev/null +++ b/tools/bsnes/lib/bpp/bpp.cpp @@ -0,0 +1,175 @@ +#include "bpp.hpp" + +bool BPP::process_macro(Macro ¯o, const lstring &arg) { + lstring linedata; + linedata.split("\n", macro.data); + + for(unsigned i = 0; i < linedata.size(); i++) { + string line = linedata[i]; + + for(unsigned j = 0; j < macro.args; j++) { + line.replace(macro.arg[j], arg[j]); + } + + for(unsigned j = 0; j < global.size(); j++) { + line.replace(global[j].name, global[j].data); + } + + output.print(string() << line << "\n"); + } + + return true; +} + +bool BPP::process(const char *inputfn) { + string filedata; + if(filedata.readfile(inputfn) == false) { + fprintf(stdout, "error: failed to open input file '%s'\n", inputfn); + return false; + } + + filedata.replace("\r", ""); + lstring linedata; + linedata.split("\n", filedata); + + for(unsigned i = 0; i < linedata.size();) { + string line = linedata[i]; + trim(line); + line.replace("\t", " "); + + if(strbegin(line, "@") == false) { + output.print(string() << linedata[i] << "\n"); + i++; + } else if(strbegin(line, "@include ")) { + ltrim(line, "@include "); + trim(line, "\""); + if(process(line) == false) return false; + i++; + } else if(strbegin(line, "@global ")) { + ltrim(line, "@global "); + while(qstrpos(line, " ") >= 0) line.replace(" ", " "); + + lstring part; + part.qsplit(" ", line); + if(part.size() != 2) { + fprintf(stdout, "error: malformed global\n"); + return false; + } + + unsigned n = global.size(); + global[n].name = string() << "{" << part[0] << "}"; + global[n].data = trim(part[1], "\""); + i++; + } else if(strbegin(line, "@macro ")) { + ltrim(line, "@macro "); + + int pos = strpos(line, "("); + if(pos < 0 || !strend(line, ")")) { + fprintf(stdout, "error: malformed macro\n"); + return false; + } + + string name = substr(line, 0, pos); + line = substr(line, pos); + ltrim(line, "("); + rtrim(line, ")"); + line.qreplace(" ", ""); + + unsigned n = macro.size(); + macro[n].name = name; + + if(line == "") { + macro[n].args = 0; + } else { + lstring arg; + arg.split(",", line); + if(arg.size() >= 8) { + fprintf(stdout, "error: too many macro arguments\n"); + return false; + } + + macro[n].args = arg.size(); + for(unsigned j = 0; j < arg.size(); j++) { + macro[n].arg[j] = string() << "{" << arg[j] << "}"; + } + } + + i++; + + while(i < linedata.size()) { + string line = linedata[i]; + trim(line); + if(line == "@endmacro") break; + macro[n].data << linedata[i++] << "\n"; + } + + i++; + } else { + ltrim(line, "@"); + int pos = strpos(line, "("); + if(pos < 0 || !strend(line, ")")) { + fprintf(stdout, "error: malformed macro invocation\n"); + return false; + } + + string name = substr(line, 0, pos); + line = substr(line, pos); + ltrim(line, "("); + rtrim(line, ")"); + line.qreplace(" ", ""); + + lstring arg; + if(line != "") arg.qsplit(",", line); + for(unsigned j = 0; j < arg.size(); j++) { + trim(arg[j], "\""); + } + + bool success = false; + for(unsigned j = 0; j < macro.size(); j++) { + if(name == macro[j].name && arg.size() == macro[j].args) { + success = process_macro(macro[j], arg); + break; + } + } + + if(success == false) { + fprintf(stdout, "error: unable to process macro '%s'\n", (const char*)name); + return false; + } + + i++; + } + } + + return true; +} + +bool BPP::process(const char *outputfn, const char *inputfn) { + if(file::exists(inputfn) == false) { + fprintf(stdout, "error: failed to open input file\n"); + return false; + } + + if(output.open(outputfn, file::mode_write) == false) { + fprintf(stdout, "error: failed to open output file\n"); + return false; + } + + bool result = process(inputfn); + output.close(); + return result; +} + +int main(int argc, const char **argv) { + if(argc != 3) { + fprintf(stdout, "bpp v0.01\n"); + fprintf(stdout, "author: byuu\n"); + fprintf(stdout, "usage: bpp output input\n"); + return 0; + } + + BPP bpp; + bool success = bpp.process(argv[1], argv[2]); + if(success == false) fprintf(stdout, "error: pre-processing failed\n"); + return 0; +} diff --git a/tools/bsnes/lib/bpp/bpp.hpp b/tools/bsnes/lib/bpp/bpp.hpp new file mode 100755 index 0000000..2271c1f --- /dev/null +++ b/tools/bsnes/lib/bpp/bpp.hpp @@ -0,0 +1,31 @@ +#include +#include +#include +#include +#include +using namespace nall; + +class BPP { +public: + bool process(const char *outputfn, const char *inputfn); + +private: + nall::file output; + + struct Global { + string name; + string data; + }; + vector global; + + struct Macro { + string name; + unsigned args; + string arg[8]; + string data; + }; + vector macro; + + bool process_macro(Macro ¯o, const lstring &arg); + bool process(const char *inputfn); +}; diff --git a/tools/bsnes/lib/libjma/7z.h b/tools/bsnes/lib/libjma/7z.h new file mode 100755 index 0000000..50e1f24 --- /dev/null +++ b/tools/bsnes/lib/libjma/7z.h @@ -0,0 +1,28 @@ +/* +Copyright (C) 2005-2007 NSRT Team ( http://nsrt.edgeemu.com ) +Copyright (C) 2002 Andrea Mazzoleni ( http://advancemame.sf.net ) + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License version 2.1 as published by the Free Software Foundation. + +This library 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 +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef __7Z_H +#define __7Z_H + +#include "iiostrm.h" + +bool decompress_lzma_7z(ISequentialInStream& in, unsigned in_size, ISequentialOutStream& out, unsigned out_size) throw (); +bool decompress_lzma_7z(const unsigned char* in_data, unsigned in_size, unsigned char* out_data, unsigned out_size) throw (); + +#endif + diff --git a/tools/bsnes/lib/libjma/7zlzma.cpp b/tools/bsnes/lib/libjma/7zlzma.cpp new file mode 100755 index 0000000..b849d8d --- /dev/null +++ b/tools/bsnes/lib/libjma/7zlzma.cpp @@ -0,0 +1,50 @@ +/* +Copyright (C) 2005-2007 NSRT Team ( http://nsrt.edgeemu.com ) +Copyright (C) 2002 Andrea Mazzoleni ( http://advancemame.sf.net ) + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License version 2.1 as published by the Free Software Foundation. + +This library 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 +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "7z.h" + +#include "lzmadec.h" + +bool decompress_lzma_7z(ISequentialInStream& in, unsigned in_size, ISequentialOutStream& out, unsigned out_size) throw () +{ + try + { + NCompress::NLZMA::CDecoder cc; + + UINT64 in_size_l = in_size; + UINT64 out_size_l = out_size; + + if (cc.ReadCoderProperties(&in) != S_OK) { return(false); } + if (cc.Code(&in, &out, &in_size_l, &out_size_l) != S_OK) { return(false); } + if (out.size_get() != out_size || out.overflow_get()) { return(false); } + + return(true); + } + catch (...) + { + return(false); + } +} + +bool decompress_lzma_7z(const unsigned char* in_data, unsigned int in_size, unsigned char* out_data, unsigned int out_size) throw () +{ + ISequentialInStream_Array in(reinterpret_cast(in_data), in_size); + ISequentialOutStream_Array out(reinterpret_cast(out_data), out_size); + + return(decompress_lzma_7z(in, in_size, out, out_size)); +} diff --git a/tools/bsnes/lib/libjma/aribitcd.h b/tools/bsnes/lib/libjma/aribitcd.h new file mode 100755 index 0000000..1fb421b --- /dev/null +++ b/tools/bsnes/lib/libjma/aribitcd.h @@ -0,0 +1,73 @@ +#ifndef __COMPRESSION_BITCODER_H +#define __COMPRESSION_BITCODER_H + +#include "rngcoder.h" + +namespace NCompression { +namespace NArithmetic { + +const int kNumBitModelTotalBits = 11; +const UINT32 kBitModelTotal = (1 << kNumBitModelTotalBits); + +const int kNumMoveReducingBits = 2; + +///////////////////////////// +// CBitModel + +template +class CBitModel +{ +public: + UINT32 m_Probability; + void UpdateModel(UINT32 aSymbol) + { + /* + m_Probability -= (m_Probability + ((aSymbol - 1) & ((1 << aNumMoveBits) - 1))) >> aNumMoveBits; + m_Probability += (1 - aSymbol) << (kNumBitModelTotalBits - aNumMoveBits); + */ + if (aSymbol == 0) + m_Probability += (kBitModelTotal - m_Probability) >> aNumMoveBits; + else + m_Probability -= (m_Probability) >> aNumMoveBits; + } +public: + void Init() { m_Probability = kBitModelTotal / 2; } +}; + +template +class CBitDecoder: public CBitModel +{ +public: + UINT32 Decode(CRangeDecoder *aRangeDecoder) + { + UINT32 aNewBound = (aRangeDecoder->m_Range >> kNumBitModelTotalBits) * CBitModel::m_Probability; + if (aRangeDecoder->m_Code < aNewBound) + { + aRangeDecoder->m_Range = aNewBound; + CBitModel::m_Probability += (kBitModelTotal - CBitModel::m_Probability) >> aNumMoveBits; + if (aRangeDecoder->m_Range < kTopValue) + { + aRangeDecoder->m_Code = (aRangeDecoder->m_Code << 8) | aRangeDecoder->m_Stream.ReadByte(); + aRangeDecoder->m_Range <<= 8; + } + return 0; + } + else + { + aRangeDecoder->m_Range -= aNewBound; + aRangeDecoder->m_Code -= aNewBound; + CBitModel::m_Probability -= (CBitModel::m_Probability) >> aNumMoveBits; + if (aRangeDecoder->m_Range < kTopValue) + { + aRangeDecoder->m_Code = (aRangeDecoder->m_Code << 8) | aRangeDecoder->m_Stream.ReadByte(); + aRangeDecoder->m_Range <<= 8; + } + return 1; + } + } +}; + +}} + + +#endif diff --git a/tools/bsnes/lib/libjma/ariconst.h b/tools/bsnes/lib/libjma/ariconst.h new file mode 100755 index 0000000..751b2b7 --- /dev/null +++ b/tools/bsnes/lib/libjma/ariconst.h @@ -0,0 +1,29 @@ +/* +Copyright (C) 2002 Andrea Mazzoleni ( http://advancemame.sf.net ) +Copyright (C) 2001-4 Igor Pavlov ( http://www.7-zip.org ) + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License version 2.1 as published by the Free Software Foundation. + +This library 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 +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef __ARICONST_H +#define __ARICONST_H + +#include "aribitcd.h" + + +typedef NCompression::NArithmetic::CRangeDecoder CMyRangeDecoder; +template class CMyBitDecoder: + public NCompression::NArithmetic::CBitDecoder {}; + +#endif diff --git a/tools/bsnes/lib/libjma/ariprice.h b/tools/bsnes/lib/libjma/ariprice.h new file mode 100755 index 0000000..ccc398e --- /dev/null +++ b/tools/bsnes/lib/libjma/ariprice.h @@ -0,0 +1,12 @@ +#ifndef __COMPRESSION_ARIPRICE_H +#define __COMPRESSION_ARIPRICE_H + +namespace NCompression { +namespace NArithmetic { + +const UINT32 kNumBitPriceShiftBits = 6; +const UINT32 kBitPrice = 1 << kNumBitPriceShiftBits; + +}} + +#endif diff --git a/tools/bsnes/lib/libjma/btreecd.h b/tools/bsnes/lib/libjma/btreecd.h new file mode 100755 index 0000000..acce366 --- /dev/null +++ b/tools/bsnes/lib/libjma/btreecd.h @@ -0,0 +1,126 @@ +/* +Copyright (C) 2002 Andrea Mazzoleni ( http://advancemame.sf.net ) +Copyright (C) 2001-4 Igor Pavlov ( http://www.7-zip.org ) + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License version 2.1 as published by the Free Software Foundation. + +This library 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 +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef __BITTREECODER_H +#define __BITTREECODER_H + +#include "aribitcd.h" +#include "rcdefs.h" + + +////////////////////////// +// CBitTreeDecoder + +template +class CBitTreeDecoder +{ + CMyBitDecoder m_Models[1 << m_NumBitLevels]; +public: + void Init() + { + for(UINT32 i = 1; i < (1 << m_NumBitLevels); i++) + m_Models[i].Init(); + } + UINT32 Decode(CMyRangeDecoder *aRangeDecoder) + { + UINT32 aModelIndex = 1; + RC_INIT_VAR + for(UINT32 aBitIndex = m_NumBitLevels; aBitIndex > 0; aBitIndex--) + { + // aModelIndex = (aModelIndex << 1) + m_Models[aModelIndex].Decode(aRangeDecoder); + RC_GETBIT(aNumMoveBits, m_Models[aModelIndex].m_Probability, aModelIndex) + } + RC_FLUSH_VAR + return aModelIndex - (1 << m_NumBitLevels); + }; +}; + +//////////////////////////////// +// CReverseBitTreeDecoder + +template +class CReverseBitTreeDecoder2 +{ + CMyBitDecoder *m_Models; + UINT32 m_NumBitLevels; +public: + CReverseBitTreeDecoder2(): m_Models(0) { } + ~CReverseBitTreeDecoder2() { delete []m_Models; } + bool Create(UINT32 aNumBitLevels) + { + m_NumBitLevels = aNumBitLevels; + m_Models = new CMyBitDecoder[1 << aNumBitLevels]; + return (m_Models != 0); + } + void Init() + { + UINT32 aNumModels = 1 << m_NumBitLevels; + for(UINT32 i = 1; i < aNumModels; i++) + m_Models[i].Init(); + } + UINT32 Decode(CMyRangeDecoder *aRangeDecoder) + { + UINT32 aModelIndex = 1; + UINT32 aSymbol = 0; + RC_INIT_VAR + for(UINT32 aBitIndex = 0; aBitIndex < m_NumBitLevels; aBitIndex++) + { + // UINT32 aBit = m_Models[aModelIndex].Decode(aRangeDecoder); + // aModelIndex <<= 1; + // aModelIndex += aBit; + // aSymbol |= (aBit << aBitIndex); + RC_GETBIT2(aNumMoveBits, m_Models[aModelIndex].m_Probability, aModelIndex, ; , aSymbol |= (1 << aBitIndex)) + } + RC_FLUSH_VAR + return aSymbol; + }; +}; +//////////////////////////// +// CReverseBitTreeDecoder2 + +template +class CReverseBitTreeDecoder +{ + CMyBitDecoder m_Models[1 << m_NumBitLevels]; +public: + void Init() + { + for(UINT32 i = 1; i < (1 << m_NumBitLevels); i++) + m_Models[i].Init(); + } + UINT32 Decode(CMyRangeDecoder *aRangeDecoder) + { + UINT32 aModelIndex = 1; + UINT32 aSymbol = 0; + RC_INIT_VAR + for(UINT32 aBitIndex = 0; aBitIndex < m_NumBitLevels; aBitIndex++) + { + // UINT32 aBit = m_Models[aModelIndex].Decode(aRangeDecoder); + // aModelIndex <<= 1; + // aModelIndex += aBit; + // aSymbol |= (aBit << aBitIndex); + RC_GETBIT2(aNumMoveBits, m_Models[aModelIndex].m_Probability, aModelIndex, ; , aSymbol |= (1 << aBitIndex)) + } + RC_FLUSH_VAR + return aSymbol; + } +}; + + + +#endif diff --git a/tools/bsnes/lib/libjma/crc32.h b/tools/bsnes/lib/libjma/crc32.h new file mode 100755 index 0000000..876a7d3 --- /dev/null +++ b/tools/bsnes/lib/libjma/crc32.h @@ -0,0 +1,26 @@ +/* +Copyright (C) 2004-2007 NSRT Team ( http://nsrt.edgeemu.com ) + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +version 2 as published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#ifndef CRC32_H +#define CRC32_H + +namespace CRC32lib +{ + unsigned int CRC32(const unsigned char *, size_t, register unsigned int crc32 = 0xFFFFFFFF); +} + +#endif diff --git a/tools/bsnes/lib/libjma/iiostrm.cpp b/tools/bsnes/lib/libjma/iiostrm.cpp new file mode 100755 index 0000000..f271996 --- /dev/null +++ b/tools/bsnes/lib/libjma/iiostrm.cpp @@ -0,0 +1,132 @@ +/* +Copyright (C) 2005-2007 NSRT Team ( http://nsrt.edgeemu.com ) +Copyright (C) 2002 Andrea Mazzoleni ( http://advancemame.sf.net ) +Copyright (C) 2001-4 Igor Pavlov ( http://www.7-zip.org ) + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License version 2.1 as published by the Free Software Foundation. + +This library 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 +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "portable.h" +#include "iiostrm.h" +#include "crc32.h" + +HRESULT ISequentialInStream_Array::Read(void *aData, UINT32 aSize, UINT32 *aProcessedSize) +{ + if (aSize > size) + { + aSize = size; + } + + *aProcessedSize = aSize; + memcpy(aData, data, aSize); + size -= aSize; + data += aSize; + return(S_OK); +} + +HRESULT ISequentialOutStream_Array::Write(const void *aData, UINT32 aSize, UINT32 *aProcessedSize) +{ + if (aSize > size) + { + overflow = true; + aSize = size; + } + + *aProcessedSize = aSize; + memcpy(data, aData, aSize); + size -= aSize; + data += aSize; + total += aSize; + return(S_OK); +} + +HRESULT ISequentialInStream_String::Read(void *aData, UINT32 aSize, UINT32 *aProcessedSize) +{ + if (aSize > data.size()) + { + aSize = data.size(); + } + + *aProcessedSize = aSize; + memcpy(aData, data.c_str(), aSize); + data.erase(0, aSize); + return(S_OK); +} + +HRESULT ISequentialOutStream_String::Write(const void *aData, UINT32 aSize, UINT32 *aProcessedSize) +{ + *aProcessedSize = aSize; + data.append((const char *)aData, aSize); + total += aSize; + return(S_OK); +} + +HRESULT ISequentialInStream_Istream::Read(void *aData, UINT32 aSize, UINT32 *aProcessedSize) +{ + data.read((char *)aData, aSize); + *aProcessedSize = data.gcount(); + return(S_OK); +} + +HRESULT ISequentialOutStream_Ostream::Write(const void *aData, UINT32 aSize, UINT32 *aProcessedSize) +{ + *aProcessedSize = aSize; + data.write((char *)aData, aSize); + total += aSize; + return(S_OK); +} + + + +HRESULT ISequentialInStreamCRC32_Array::Read(void *aData, UINT32 aSize, UINT32 *aProcessedSize) +{ + ISequentialInStream_Array::Read(aData, aSize, aProcessedSize); + crc32 = CRC32lib::CRC32((const unsigned char *)aData, *aProcessedSize, ~crc32); + return(S_OK); +} + +HRESULT ISequentialOutStreamCRC32_Array::Write(const void *aData, UINT32 aSize, UINT32 *aProcessedSize) +{ + ISequentialOutStream_Array::Write(aData, aSize, aProcessedSize); + crc32 = CRC32lib::CRC32((const unsigned char *)aData, *aProcessedSize, ~crc32); + return(S_OK); +} + +HRESULT ISequentialInStreamCRC32_String::Read(void *aData, UINT32 aSize, UINT32 *aProcessedSize) +{ + ISequentialInStream_String::Read(aData, aSize, aProcessedSize); + crc32 = CRC32lib::CRC32((const unsigned char *)aData, *aProcessedSize, ~crc32); + return(S_OK); +} + +HRESULT ISequentialOutStreamCRC32_String::Write(const void *aData, UINT32 aSize, UINT32 *aProcessedSize) +{ + ISequentialOutStream_String::Write(aData, aSize, aProcessedSize); + crc32 = CRC32lib::CRC32((const unsigned char *)aData, *aProcessedSize, ~crc32); + return(S_OK); +} + +HRESULT ISequentialInStreamCRC32_Istream::Read(void *aData, UINT32 aSize, UINT32 *aProcessedSize) +{ + ISequentialInStream_Istream::Read(aData, aSize, aProcessedSize); + crc32 = CRC32lib::CRC32((const unsigned char *)aData, *aProcessedSize, ~crc32); + return(S_OK); +} + +HRESULT ISequentialOutStreamCRC32_Ostream::Write(const void *aData, UINT32 aSize, UINT32 *aProcessedSize) +{ + ISequentialOutStream_Ostream::Write(aData, aSize, aProcessedSize); + crc32 = CRC32lib::CRC32((const unsigned char *)aData, *aProcessedSize, ~crc32); + return(S_OK); +} diff --git a/tools/bsnes/lib/libjma/iiostrm.h b/tools/bsnes/lib/libjma/iiostrm.h new file mode 100755 index 0000000..a5b2ab2 --- /dev/null +++ b/tools/bsnes/lib/libjma/iiostrm.h @@ -0,0 +1,210 @@ +/* +Copyright (C) 2005-2007 NSRT Team ( http://nsrt.edgeemu.com ) +Copyright (C) 2002 Andrea Mazzoleni ( http://advancemame.sf.net ) +Copyright (C) 2001-4 Igor Pavlov ( http://www.7-zip.org ) + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License version 2.1 as published by the Free Software Foundation. + +This library 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 +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef __IINOUTSTREAMS_H +#define __IINOUTSTREAMS_H + +#include +#include + +#include "portable.h" + + +class ISequentialInStream +{ +public: + virtual HRESULT Read(void *, UINT32, UINT32 *) = 0; + + virtual ~ISequentialInStream() {} +}; + + +class ISequentialInStream_Array : public ISequentialInStream +{ + const char *data; + unsigned int size; +public: + ISequentialInStream_Array(const char *Adata, unsigned Asize) : data(Adata), size(Asize) { } + + HRESULT Read(void *aData, UINT32 aSize, UINT32 *aProcessedSize); + + virtual ~ISequentialInStream_Array() {} +}; + +class ISequentialInStream_String : public ISequentialInStream +{ + std::string& data; +public: + ISequentialInStream_String(std::string& Adata) : data(Adata) { } + + HRESULT Read(void *aData, UINT32 aSize, UINT32 *aProcessedSize); + + virtual ~ISequentialInStream_String() {} +}; + +class ISequentialInStream_Istream : public ISequentialInStream +{ + std::istream& data; +public: + ISequentialInStream_Istream(std::istream& Adata) : data(Adata) { } + + HRESULT Read(void *aData, UINT32 aSize, UINT32 *aProcessedSize); + + virtual ~ISequentialInStream_Istream() {} +}; + + + +class ISequentialOutStream +{ +public: + virtual bool overflow_get() const = 0; + virtual unsigned int size_get() const = 0; + + virtual HRESULT Write(const void *, UINT32, UINT32 *) = 0; + + virtual ~ISequentialOutStream() {} +}; + + +class ISequentialOutStream_Array : public ISequentialOutStream +{ + char *data; + unsigned int size; + bool overflow; + unsigned int total; +public: + ISequentialOutStream_Array(char *Adata, unsigned Asize) : data(Adata), size(Asize), overflow(false), total(0) { } + + bool overflow_get() const { return(overflow); } + unsigned int size_get() const { return(total); } + + HRESULT Write(const void *aData, UINT32 aSize, UINT32 *aProcessedSize); + + virtual ~ISequentialOutStream_Array() {} +}; + +class ISequentialOutStream_String : public ISequentialOutStream +{ + std::string& data; + unsigned int total; +public: + ISequentialOutStream_String(std::string& Adata) : data(Adata), total(0) { } + + bool overflow_get() const { return(false); } + unsigned int size_get() const { return(total); } + + HRESULT Write(const void *aData, UINT32 aSize, UINT32 *aProcessedSize); + + virtual ~ISequentialOutStream_String() {} +}; + + +class ISequentialOutStream_Ostream : public ISequentialOutStream +{ + std::ostream& data; + unsigned int total; +public: + ISequentialOutStream_Ostream(std::ostream& Adata) : data(Adata), total(0) { } + + bool overflow_get() const { return(false); } + unsigned int size_get() const { return(total); } + + HRESULT Write(const void *aData, UINT32 aSize, UINT32 *aProcessedSize); + + virtual ~ISequentialOutStream_Ostream() {} +}; + + + +class ISequentialStreamCRC32 +{ +protected: + unsigned int crc32; +public: + ISequentialStreamCRC32() : crc32(0) {} + unsigned int crc32_get() const { return(crc32); } + + virtual ~ISequentialStreamCRC32() {} +}; + + +class ISequentialInStreamCRC32_Array : public ISequentialInStream_Array, public ISequentialStreamCRC32 +{ +public: + ISequentialInStreamCRC32_Array(const char *Adata, unsigned Asize) : ISequentialInStream_Array(Adata, Asize) { } + + HRESULT Read(void *aData, UINT32 aSize, UINT32 *aProcessedSize); + + virtual ~ISequentialInStreamCRC32_Array() {} +}; + +class ISequentialInStreamCRC32_String : public ISequentialInStream_String, public ISequentialStreamCRC32 +{ +public: + ISequentialInStreamCRC32_String(std::string& Adata) : ISequentialInStream_String(Adata) { } + + HRESULT Read(void *aData, UINT32 aSize, UINT32 *aProcessedSize); + + virtual ~ISequentialInStreamCRC32_String() {} +}; + +class ISequentialInStreamCRC32_Istream : public ISequentialInStream_Istream, public ISequentialStreamCRC32 +{ +public: + ISequentialInStreamCRC32_Istream(std::istream& Adata) : ISequentialInStream_Istream(Adata) { } + + HRESULT Read(void *aData, UINT32 aSize, UINT32 *aProcessedSize); + + virtual ~ISequentialInStreamCRC32_Istream() {} +}; + + +class ISequentialOutStreamCRC32_Array : public ISequentialOutStream_Array, public ISequentialStreamCRC32 +{ +public: + ISequentialOutStreamCRC32_Array(char *Adata, unsigned Asize) : ISequentialOutStream_Array(Adata, Asize) { } + + HRESULT Write(const void *aData, UINT32 aSize, UINT32 *aProcessedSize); + + virtual ~ISequentialOutStreamCRC32_Array() {} +}; + +class ISequentialOutStreamCRC32_String : public ISequentialOutStream_String, public ISequentialStreamCRC32 +{ +public: + ISequentialOutStreamCRC32_String(std::string& Adata) : ISequentialOutStream_String(Adata) { } + + HRESULT Write(const void *aData, UINT32 aSize, UINT32 *aProcessedSize); + + virtual ~ISequentialOutStreamCRC32_String() {} +}; + + +class ISequentialOutStreamCRC32_Ostream : public ISequentialOutStream_Ostream, public ISequentialStreamCRC32 +{ +public: + ISequentialOutStreamCRC32_Ostream(std::ostream& Adata) : ISequentialOutStream_Ostream(Adata) { } + + HRESULT Write(const void *aData, UINT32 aSize, UINT32 *aProcessedSize); + + virtual ~ISequentialOutStreamCRC32_Ostream() {} +}; + +#endif diff --git a/tools/bsnes/lib/libjma/inbyte.cpp b/tools/bsnes/lib/libjma/inbyte.cpp new file mode 100755 index 0000000..c727a4b --- /dev/null +++ b/tools/bsnes/lib/libjma/inbyte.cpp @@ -0,0 +1,60 @@ +/* +Copyright (C) 2005-2007 NSRT Team ( http://nsrt.edgeemu.com ) +Copyright (C) 2002 Andrea Mazzoleni ( http://advancemame.sf.net ) +Copyright (C) 2001-4 Igor Pavlov ( http://www.7-zip.org ) + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License version 2.1 as published by the Free Software Foundation. + +This library 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 +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "inbyte.h" + +namespace NStream{ + +CInByte::CInByte(UINT32 aBufferSize): + m_BufferBase(0), + m_BufferSize(aBufferSize) +{ + m_BufferBase = new BYTE[m_BufferSize]; +} + +CInByte::~CInByte() +{ + delete []m_BufferBase; +} + +void CInByte::Init(ISequentialInStream *aStream) +{ + m_Stream = aStream; + m_ProcessedSize = 0; + m_Buffer = m_BufferBase; + m_BufferLimit = m_Buffer; + m_StreamWasExhausted = false; +} + +bool CInByte::ReadBlock() +{ + if (m_StreamWasExhausted) + return false; + m_ProcessedSize += (m_Buffer - m_BufferBase); + UINT32 aNumProcessedBytes; + HRESULT aResult = m_Stream->Read(m_BufferBase, m_BufferSize, &aNumProcessedBytes); + if (aResult != S_OK) + throw aResult; + m_Buffer = m_BufferBase; + m_BufferLimit = m_Buffer + aNumProcessedBytes; + m_StreamWasExhausted = (aNumProcessedBytes == 0); + return (!m_StreamWasExhausted); +} + +} diff --git a/tools/bsnes/lib/libjma/inbyte.h b/tools/bsnes/lib/libjma/inbyte.h new file mode 100755 index 0000000..53afa17 --- /dev/null +++ b/tools/bsnes/lib/libjma/inbyte.h @@ -0,0 +1,76 @@ +/* +Copyright (C) 2002 Andrea Mazzoleni ( http://advancemame.sf.net ) +Copyright (C) 2001-4 Igor Pavlov ( http://www.7-zip.org ) + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License version 2.1 as published by the Free Software Foundation. + +This library 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 +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef __STREAM_INBYTE_H +#define __STREAM_INBYTE_H + +#include "iiostrm.h" + +namespace NStream { + +class CInByte +{ + UINT64 m_ProcessedSize; + BYTE *m_BufferBase; + UINT32 m_BufferSize; + BYTE *m_Buffer; + BYTE *m_BufferLimit; + ISequentialInStream* m_Stream; + bool m_StreamWasExhausted; + + bool ReadBlock(); + +public: + CInByte(UINT32 aBufferSize = 0x100000); + ~CInByte(); + + void Init(ISequentialInStream *aStream); + + bool ReadByte(BYTE &aByte) + { + if(m_Buffer >= m_BufferLimit) + if(!ReadBlock()) + return false; + aByte = *m_Buffer++; + return true; + } + BYTE ReadByte() + { + if(m_Buffer >= m_BufferLimit) + if(!ReadBlock()) + return 0x0; + return *m_Buffer++; + } + void ReadBytes(void *aData, UINT32 aSize, UINT32 &aProcessedSize) + { + for(aProcessedSize = 0; aProcessedSize < aSize; aProcessedSize++) + if (!ReadByte(((BYTE *)aData)[aProcessedSize])) + return; + } + bool ReadBytes(void *aData, UINT32 aSize) + { + UINT32 aProcessedSize; + ReadBytes(aData, aSize, aProcessedSize); + return (aProcessedSize == aSize); + } + UINT64 GetProcessedSize() const { return m_ProcessedSize + (m_Buffer - m_BufferBase); } +}; + +} + +#endif diff --git a/tools/bsnes/lib/libjma/jcrc32.cpp b/tools/bsnes/lib/libjma/jcrc32.cpp new file mode 100755 index 0000000..e3377d5 --- /dev/null +++ b/tools/bsnes/lib/libjma/jcrc32.cpp @@ -0,0 +1,80 @@ +/* +Copyright (C) 2004-2007 NSRT Team ( http://nsrt.edgeemu.com ) + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +version 2 as published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include + +namespace CRC32lib +{ + //Don't ask questions, this is the PKZip CRC32 table + const unsigned int crc32Table[256] = { + 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, + 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, + 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, + 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, + 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, + 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, + 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, + 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, + 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, + 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, + 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106, + 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, + 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, + 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, + 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, + 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, + 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, + 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, + 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, + 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, + 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, + 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, + 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, + 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, + 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, + 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, + 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, + 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, + 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, + 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, + 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, + 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, + 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, + 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, + 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, + 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, + 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, + 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, + 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, + 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, + 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, + 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, + 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d }; + + + //CRC32 for char arrays + unsigned int CRC32(const unsigned char *array, size_t size, register unsigned int crc32) + { + const unsigned char *end_p = array+size; + for (register const unsigned char *p = array; p < end_p; p++) + { + crc32 = ((crc32 >> 8) & 0x00FFFFFF) ^ crc32Table[(crc32 ^ *p) & 0xFF]; + } + + return(~crc32); + } +} diff --git a/tools/bsnes/lib/libjma/jma.cpp b/tools/bsnes/lib/libjma/jma.cpp new file mode 100755 index 0000000..87e0322 --- /dev/null +++ b/tools/bsnes/lib/libjma/jma.cpp @@ -0,0 +1,550 @@ +/* +Copyright (C) 2005-2007 NSRT Team ( http://nsrt.edgeemu.com ) + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +version 2 as published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include +#include "jma.h" +using namespace std; + +#include "portable.h" +#include "7z.h" +#include "crc32.h" + +namespace JMA +{ + const char jma_magic[] = { 'J', 'M', 'A', 0, 'N' }; + const unsigned int jma_header_length = 5; + const unsigned char jma_version = 1; + const unsigned int jma_version_length = 1; + const unsigned int jma_total_header_length = jma_header_length + jma_version_length + UINT_SIZE; + + //Convert DOS/zip/JMA integer time to to time_t + time_t uint_to_time(unsigned short date, unsigned short time) + { + tm formatted_time; + + formatted_time.tm_mday = date & 0x1F; + formatted_time.tm_mon = ((date >> 5) & 0xF) - 1; + formatted_time.tm_year = ((date >> 9) & 0x7f) + 80; + formatted_time.tm_sec = (time & 0x1F) * 2; + formatted_time.tm_min = (time >> 5) & 0x3F; + formatted_time.tm_hour = (time >> 11) & 0x1F; + + return(mktime(&formatted_time)); + } + + + //Retreive the file block, what else? + void jma_open::retrieve_file_block() throw(jma_errors) + { + unsigned char uint_buffer[UINT_SIZE]; + unsigned char ushort_buffer[USHORT_SIZE]; + + //File block size is the last UINT in the file + stream.seekg(-UINT_SIZE,ios::end); + stream.read((char *)uint_buffer, UINT_SIZE); + size_t file_block_size = charp_to_uint(uint_buffer); + + //Currently at the end of the file, so that's the file size + size_t jma_file_size = stream.tellg(); + + //The file block can't be larger than the JMA file without it's header. + //This if can probably be improved + if (file_block_size >= jma_file_size-jma_total_header_length) + { + throw(JMA_BAD_FILE); + } + + //Seek to before file block so we can read the file block + stream.seekg(-((int)file_block_size+UINT_SIZE),ios::end); + + //This is needed if the file block is compressed + stringstream decompressed_file_block; + //Pointer to where to read file block from (file or decompressed buffer) + istream *file_block_stream; + + //Setup file info buffer and byte to read with + jma_file_info file_info; + char byte; + + stream.get(byte); + if (!byte) //If file block is compressed + { + //Compressed size isn't counting the byte we just read or the UINT for compressed size + size_t compressed_size = file_block_size - (1+UINT_SIZE); + + //Read decompressed size / true file block size + stream.read((char *)uint_buffer, UINT_SIZE); + file_block_size = charp_to_uint(uint_buffer); + + //Setup access methods for decompression + ISequentialInStream_Istream compressed_data(stream); + ISequentialOutStream_Ostream decompressed_data(decompressed_file_block); + + //Decompress the data + if (!decompress_lzma_7z(compressed_data, compressed_size, decompressed_data, file_block_size)) + { + throw(JMA_DECOMPRESS_FAILED); + } + + //Go to beginning, setup pointer to buffer + decompressed_file_block.seekg(0, ios::beg); + file_block_stream = &decompressed_file_block; + } + else + { + stream.putback(byte); //Putback byte, byte is part of filename, not compressed indicator + file_block_stream = &stream; + } + + + //Minimum file name length is 2 bytes, a char and a null + //Minimum comment length is 1 byte, a null + //There are currently 2 UINTs and 2 USHORTs per file + while (file_block_size >= 2+1+UINT_SIZE*2+USHORT_SIZE*2) //This does allow for a gap, but that's okay + { + //First stored in the file block is the file name null terminated + file_info.name = ""; + + file_block_stream->get(byte); + while (byte) + { + file_info.name += byte; + file_block_stream->get(byte); + } + + //There must be a file name or the file is bad + if (!file_info.name.length()) + { + throw(JMA_BAD_FILE); + } + + //Same trick as above for the comment + file_info.comment = ""; + + file_block_stream->get(byte); + while (byte) + { + file_info.comment += byte; + file_block_stream->get(byte); + } + + //Next is a UINT representing the file's size + file_block_stream->read((char *)uint_buffer, UINT_SIZE); + file_info.size = charp_to_uint(uint_buffer); + + //Followed by CRC32 + file_block_stream->read((char *)uint_buffer, UINT_SIZE); + file_info.crc32 = charp_to_uint(uint_buffer); + + //Special USHORT representation of file's date + file_block_stream->read((char *)ushort_buffer, USHORT_SIZE); + file_info.date = charp_to_ushort(ushort_buffer); + + //Special USHORT representation of file's time + file_block_stream->read((char *)ushort_buffer, USHORT_SIZE); + file_info.time = charp_to_ushort(ushort_buffer); + + file_info.buffer = 0; //Pointing to null till we decompress files + + files.push_back(file_info); //Put file info into our structure + + //Subtract size of the file info we just read + file_block_size -= file_info.name.length()+file_info.comment.length()+2+UINT_SIZE*2+USHORT_SIZE*2; + } + } + + //Constructor for opening JMA files for reading + jma_open::jma_open(const char *compressed_file_name) throw (jma_errors) + { + decompressed_buffer = 0; + compressed_buffer = 0; + + stream.open(compressed_file_name, ios::in | ios::binary); + if (!stream.is_open()) + { + throw(JMA_NO_OPEN); + } + + //Header is "JMA\0N" + unsigned char header[jma_header_length]; + stream.read((char *)header, jma_header_length); + if (memcmp(jma_magic, header, jma_header_length)) + { + throw(JMA_BAD_FILE); + } + + //Not the cleanest code but logical + stream.read((char *)header, 5); + if (*header <= jma_version) + { + chunk_size = charp_to_uint(header+1); //Chunk size is a UINT that follows version # + retrieve_file_block(); + } + else + { + throw(JMA_UNSUPPORTED_VERSION); + } + } + + //Destructor only has to close the stream if neccesary + jma_open::~jma_open() + { + if (stream.is_open()) + { + stream.close(); + } + } + + //Return a vector containing useful info about the files in the JMA + vector jma_open::get_files_info() + { + vector file_info_vector; + jma_public_file_info file_info; + + for (vector::iterator i = files.begin(); i != files.end(); i++) + { + file_info.name = i->name; + file_info.comment = i->comment; + file_info.size = i->size; + file_info.datetime = uint_to_time(i->date, i->time); + file_info.crc32 = i->crc32; + file_info_vector.push_back(file_info); + } + + return(file_info_vector); + } + + //Skip forward a given number of chunks + void jma_open::chunk_seek(unsigned int chunk_num) throw(jma_errors) + { + //Check the stream is open + if (!stream.is_open()) + { + throw(JMA_NO_OPEN); + } + + //Clear possible errors so the seek will work + stream.clear(); + + //Move forward over header + stream.seekg(jma_total_header_length, ios::beg); + + unsigned char int4_buffer[UINT_SIZE]; + + while (chunk_num--) + { + //Read in size of chunk + stream.read((char *)int4_buffer, UINT_SIZE); + + //Skip chunk plus it's CRC32 + stream.seekg(charp_to_uint(int4_buffer)+UINT_SIZE, ios::cur); + } + } + + //Return a vector of pointers to each file in the JMA, the buffer to hold all the files + //must be initilized outside. + vector jma_open::get_all_files(unsigned char *buffer) throw(jma_errors) + { + //If there's no stream we can't read from it, so exit + if (!stream.is_open()) + { + throw(JMA_NO_OPEN); + } + + //Seek to the first chunk + chunk_seek(0); + + //Set the buffer that decompressed data goes to + decompressed_buffer = buffer; + + //If the JMA is not solid + if (chunk_size) + { + unsigned char int4_buffer[UINT_SIZE]; + size_t size = get_total_size(files); + + //For each chunk in the file... + for (size_t remaining_size = size; remaining_size; remaining_size -= chunk_size) + { + //Read the compressed size + stream.read((char *)int4_buffer, UINT_SIZE); + size_t compressed_size = charp_to_uint(int4_buffer); + + //Allocate memory of the correct size to hold the compressed data in the JMA + //Throw error on failure as that is unrecoverable from + try + { + compressed_buffer = new unsigned char[compressed_size]; + } + catch (bad_alloc xa) + { + throw(JMA_NO_MEM_ALLOC); + } + + //Read all the compressed data in + stream.read((char *)compressed_buffer, compressed_size); + + //Read the expected CRC of compressed data from the file + stream.read((char *)int4_buffer, UINT_SIZE); + + //If it doesn't match, throw error and cleanup memory + if (CRC32lib::CRC32(compressed_buffer, compressed_size) != charp_to_uint(int4_buffer)) + { + delete[] compressed_buffer; + throw(JMA_BAD_FILE); + } + + //Decompress the data, cleanup memory on failure + if (!decompress_lzma_7z(compressed_buffer, compressed_size, + decompressed_buffer+size-remaining_size, + (remaining_size > chunk_size) ? chunk_size : remaining_size)) + { + delete[] compressed_buffer; + throw(JMA_DECOMPRESS_FAILED); + } + delete[] compressed_buffer; + + if (remaining_size <= chunk_size) //If we just decompressed the remainder + { + break; + } + } + } + else //Solidly compressed JMA + { + unsigned char int4_buffer[UINT_SIZE]; + + //Read the size of the compressed data + stream.read((char *)int4_buffer, UINT_SIZE); + size_t compressed_size = charp_to_uint(int4_buffer); + + //Get decompressed size + size_t size = get_total_size(files); + + //Setup access methods for decompression + ISequentialInStream_Istream compressed_data(stream); + ISequentialOutStream_Array decompressed_data(reinterpret_cast(decompressed_buffer), size); + + //Decompress the data + if (!decompress_lzma_7z(compressed_data, compressed_size, decompressed_data, size)) + { + throw(JMA_DECOMPRESS_FAILED); + } + + /* + //Allocate memory of the right size to hold the compressed data in the JMA + try + { + compressed_buffer = new unsigned char[compressed_size]; + } + catch (bad_alloc xa) + { + throw(JMA_NO_MEM_ALLOC); + } + + //Copy the compressed data into memory + stream.read((char *)compressed_buffer, compressed_size); + size_t size = get_total_size(files); + + //Read the CRC of the compressed data + stream.read((char *)int4_buffer, UINT_SIZE); + + //If it doesn't match, complain + if (CRC32lib::CRC32(compressed_buffer, compressed_size) != charp_to_uint(int4_buffer)) + { + delete[] compressed_buffer; + throw(JMA_BAD_FILE); + } + + //Decompress the data + if (!decompress_lzma_7z(compressed_buffer, compressed_size, decompressed_buffer, size)) + { + delete[] compressed_buffer; + throw(JMA_DECOMPRESS_FAILED); + } + delete[] compressed_buffer; + */ + } + + vector file_pointers; + size_t size = 0; + + //For each file, add it's pointer to the vector, size is pointer offset in the buffer + for (vector::iterator i = files.begin(); i != files.end(); i++) + { + i->buffer = decompressed_buffer+size; + file_pointers.push_back(decompressed_buffer+size); + size += i->size; + } + + //Return the vector of pointers + return(file_pointers); + } + + //Extracts the file with a given name found in the archive to the given buffer + void jma_open::extract_file(string& name, unsigned char *buffer) throw(jma_errors) + { + if (!stream.is_open()) + { + throw(JMA_NO_OPEN); + } + + size_t size_to_skip = 0; + size_t our_file_size = 0; + + //Search through the vector of file information + for (vector::iterator i = files.begin(); i != files.end(); i++) + { + if (i->name == name) + { + //Set the variable so we can tell we found it + our_file_size = i->size; + break; + } + + //Keep a running total of size + size_to_skip += i->size; + } + + if (!our_file_size) //File with the specified name was not found in the archive + { + throw(JMA_FILE_NOT_FOUND); + } + + //If the JMA only contains one file, we can skip a lot of overhead + if (files.size() == 1) + { + get_all_files(buffer); + return; + } + + if (chunk_size) //we are using non-solid archive.. + { + unsigned int chunks_to_skip = size_to_skip / chunk_size; + + //skip over requisite number of chunks + chunk_seek(chunks_to_skip); + + //Allocate memory for compressed and decompressed data + unsigned char *comp_buffer = 0, *decomp_buffer = 0; + try + { + //Compressed data size is <= non compressed size + unsigned char *combined_buffer = new unsigned char[chunk_size*2]; + comp_buffer = combined_buffer; + decomp_buffer = combined_buffer+chunk_size; + } + catch (bad_alloc xa) + { + throw(JMA_NO_MEM_ALLOC); + } + + size_t first_chunk_offset = size_to_skip % chunk_size; + unsigned char int4_buffer[UINT_SIZE]; + for (size_t i = 0; i < our_file_size;) + { + //Get size + stream.read((char *)int4_buffer, UINT_SIZE); + size_t compressed_size = charp_to_uint(int4_buffer); + + //Read all the compressed data in + stream.read((char *)comp_buffer, compressed_size); + + //Read the CRC of the compressed data + stream.read((char *)int4_buffer, UINT_SIZE); + + //If it doesn't match, complain + if (CRC32lib::CRC32(comp_buffer, compressed_size) != charp_to_uint(int4_buffer)) + { + delete[] comp_buffer; + throw(JMA_BAD_FILE); + } + + //Decompress chunk + if (!decompress_lzma_7z(comp_buffer, compressed_size, decomp_buffer, chunk_size)) + { + delete[] comp_buffer; + throw(JMA_DECOMPRESS_FAILED); + } + + size_t copy_amount = our_file_size-i > chunk_size-first_chunk_offset ? chunk_size-first_chunk_offset : our_file_size-i; + + memcpy(buffer+i, decomp_buffer+first_chunk_offset, copy_amount); + first_chunk_offset = 0; //Set to zero since this is only for the first iteration + i += copy_amount; + } + delete[] comp_buffer; + } + else //Solid JMA + { + unsigned char *decomp_buffer = 0; + try + { + decomp_buffer = new unsigned char[get_total_size(files)]; + } + catch (bad_alloc xa) + { + throw(JMA_NO_MEM_ALLOC); + } + + get_all_files(decomp_buffer); + + memcpy(buffer, decomp_buffer+size_to_skip, our_file_size); + + delete[] decomp_buffer; + } + } + + bool jma_open::is_solid() + { + return(chunk_size ? false : true); + } + + const char *jma_error_text(jma_errors error) + { + switch (error) + { + case JMA_NO_CREATE: + return("JMA could not be created"); + + case JMA_NO_MEM_ALLOC: + return("Memory for JMA could be allocated"); + + case JMA_NO_OPEN: + return("JMA could not be opened"); + + case JMA_BAD_FILE: + return("Invalid/Corrupt JMA"); + + case JMA_UNSUPPORTED_VERSION: + return("JMA version not supported"); + + case JMA_COMPRESS_FAILED: + return("JMA compression failed"); + + case JMA_DECOMPRESS_FAILED: + return("JMA decompression failed"); + + case JMA_FILE_NOT_FOUND: + return("File not found in JMA"); + } + return("Unknown error"); + } + +} + + diff --git a/tools/bsnes/lib/libjma/jma.h b/tools/bsnes/lib/libjma/jma.h new file mode 100755 index 0000000..2aaa5ca --- /dev/null +++ b/tools/bsnes/lib/libjma/jma.h @@ -0,0 +1,88 @@ +/* +Copyright (C) 2005-2007 NSRT Team ( http://nsrt.edgeemu.com ) + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +version 2 as published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#ifndef JMA_H +#define JMA_H + +#include +#include +#include +#include + +namespace JMA +{ + enum jma_errors { JMA_NO_CREATE, JMA_NO_MEM_ALLOC, JMA_NO_OPEN, JMA_BAD_FILE, + JMA_UNSUPPORTED_VERSION, JMA_COMPRESS_FAILED, JMA_DECOMPRESS_FAILED, + JMA_FILE_NOT_FOUND }; + + struct jma_file_info_base + { + std::string name; + std::string comment; + size_t size; + unsigned int crc32; + }; + + struct jma_public_file_info : jma_file_info_base + { + time_t datetime; + }; + + struct jma_file_info : jma_file_info_base + { + unsigned short date; + unsigned short time; + const unsigned char *buffer; + }; + + template + inline size_t get_total_size(std::vector& files) + { + size_t size = 0; + for (typename std::vector::iterator i = files.begin(); i != files.end(); i++) + { + size += i->size; //We do have a problem if this wraps around + } + + return(size); + } + + class jma_open + { + public: + jma_open(const char *) throw(jma_errors); + ~jma_open(); + + std::vector get_files_info(); + std::vector get_all_files(unsigned char *) throw(jma_errors); + void extract_file(std::string& name, unsigned char *) throw(jma_errors); + bool is_solid(); + + private: + std::ifstream stream; + std::vector files; + size_t chunk_size; + unsigned char *decompressed_buffer; + unsigned char *compressed_buffer; + + void chunk_seek(unsigned int) throw(jma_errors); + void retrieve_file_block() throw(jma_errors); + }; + + const char *jma_error_text(jma_errors); +} +#endif diff --git a/tools/bsnes/lib/libjma/lencoder.h b/tools/bsnes/lib/libjma/lencoder.h new file mode 100755 index 0000000..6f30e47 --- /dev/null +++ b/tools/bsnes/lib/libjma/lencoder.h @@ -0,0 +1,93 @@ +/* +Copyright (C) 2005-2007 NSRT Team ( http://nsrt.edgeemu.com ) +Copyright (C) 2002 Andrea Mazzoleni ( http://advancemame.sf.net ) +Copyright (C) 2001-4 Igor Pavlov ( http://www.7-zip.org ) + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License version 2.1 as published by the Free Software Foundation. + +This library 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 +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef __LENCODER_H +#define __LENCODER_H + +#include "btreecd.h" + +namespace NLength { + +const UINT32 kNumPosStatesBitsMax = 4; +const int kNumPosStatesMax = (1 << kNumPosStatesBitsMax); + + +const int kNumPosStatesBitsEncodingMax = 4; +const int kNumPosStatesEncodingMax = (1 << kNumPosStatesBitsEncodingMax); + + +const int kNumMoveBits = 5; + +const int kNumLenBits = 3; +const int kNumLowSymbols = 1 << kNumLenBits; +const int kNumMidBits = 3; +const int kNumMidSymbols = 1 << kNumMidBits; + +const int kNumHighBits = 8; + +const int kNumSymbolsTotal = kNumLowSymbols + kNumMidSymbols + (1 << kNumHighBits); + +const int kNumSpecSymbols = kNumLowSymbols + kNumMidSymbols; + +class CDecoder +{ + CMyBitDecoder m_Choice; + CBitTreeDecoder m_LowCoder[kNumPosStatesMax]; + CMyBitDecoder m_Choice2; + CBitTreeDecoder m_MidCoder[kNumPosStatesMax]; + CBitTreeDecoder m_HighCoder; + UINT32 m_NumPosStates; +public: + void Create(UINT32 aNumPosStates) + { m_NumPosStates = aNumPosStates; } + void Init() + { + m_Choice.Init(); + for (UINT32 aPosState = 0; aPosState < m_NumPosStates; aPosState++) + { + m_LowCoder[aPosState].Init(); + m_MidCoder[aPosState].Init(); + } + m_Choice2.Init(); + m_HighCoder.Init(); + } + UINT32 Decode(CMyRangeDecoder *aRangeDecoder, UINT32 aPosState) + { + if(m_Choice.Decode(aRangeDecoder) == 0) + return m_LowCoder[aPosState].Decode(aRangeDecoder); + else + { + UINT32 aSymbol = kNumLowSymbols; + if(m_Choice2.Decode(aRangeDecoder) == 0) + aSymbol += m_MidCoder[aPosState].Decode(aRangeDecoder); + else + { + aSymbol += kNumMidSymbols; + aSymbol += m_HighCoder.Decode(aRangeDecoder); + } + return aSymbol; + } + } + +}; + +} + + +#endif diff --git a/tools/bsnes/lib/libjma/litcoder.h b/tools/bsnes/lib/libjma/litcoder.h new file mode 100755 index 0000000..639d6c5 --- /dev/null +++ b/tools/bsnes/lib/libjma/litcoder.h @@ -0,0 +1,122 @@ +/* +Copyright (C) 2002 Andrea Mazzoleni ( http://advancemame.sf.net ) +Copyright (C) 2001-4 Igor Pavlov ( http://www.7-zip.org ) + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License version 2.1 as published by the Free Software Foundation. + +This library 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 +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef __LITERALCODER_H +#define __LITERALCODER_H + +#include "aribitcd.h" +#include "rcdefs.h" + +namespace NLiteral { + +const int kNumMoveBits = 5; + +class CDecoder2 +{ + CMyBitDecoder m_Decoders[3][1 << 8]; +public: + void Init() + { + for (int i = 0; i < 3; i++) + for (int j = 1; j < (1 << 8); j++) + m_Decoders[i][j].Init(); + } + + BYTE DecodeNormal(CMyRangeDecoder *aRangeDecoder) + { + UINT32 aSymbol = 1; + RC_INIT_VAR + do + { + // aSymbol = (aSymbol << 1) | m_Decoders[0][aSymbol].Decode(aRangeDecoder); + RC_GETBIT(kNumMoveBits, m_Decoders[0][aSymbol].m_Probability, aSymbol) + } + while (aSymbol < 0x100); + RC_FLUSH_VAR + return aSymbol; + } + + BYTE DecodeWithMatchByte(CMyRangeDecoder *aRangeDecoder, BYTE aMatchByte) + { + UINT32 aSymbol = 1; + RC_INIT_VAR + do + { + UINT32 aMatchBit = (aMatchByte >> 7) & 1; + aMatchByte <<= 1; + // UINT32 aBit = m_Decoders[1 + aMatchBit][aSymbol].Decode(aRangeDecoder); + // aSymbol = (aSymbol << 1) | aBit; + UINT32 aBit; + RC_GETBIT2(kNumMoveBits, m_Decoders[1 + aMatchBit][aSymbol].m_Probability, aSymbol, + aBit = 0, aBit = 1) + if (aMatchBit != aBit) + { + while (aSymbol < 0x100) + { + // aSymbol = (aSymbol << 1) | m_Decoders[0][aSymbol].Decode(aRangeDecoder); + RC_GETBIT(kNumMoveBits, m_Decoders[0][aSymbol].m_Probability, aSymbol) + } + break; + } + } + while (aSymbol < 0x100); + RC_FLUSH_VAR + return aSymbol; + } +}; + +class CDecoder +{ + CDecoder2 *m_Coders; + UINT32 m_NumPrevBits; + UINT32 m_NumPosBits; + UINT32 m_PosMask; +public: + CDecoder(): m_Coders(0) {} + ~CDecoder() { Free(); } + void Free() + { + delete []m_Coders; + m_Coders = 0; + } + void Create(UINT32 aNumPosBits, UINT32 aNumPrevBits) + { + Free(); + m_NumPosBits = aNumPosBits; + m_PosMask = (1 << aNumPosBits) - 1; + m_NumPrevBits = aNumPrevBits; + UINT32 aNumStates = 1 << (m_NumPrevBits + m_NumPosBits); + m_Coders = new CDecoder2[aNumStates]; + } + void Init() + { + UINT32 aNumStates = 1 << (m_NumPrevBits + m_NumPosBits); + for (UINT32 i = 0; i < aNumStates; i++) + m_Coders[i].Init(); + } + UINT32 GetState(UINT32 aPos, BYTE aPrevByte) const + { return ((aPos & m_PosMask) << m_NumPrevBits) + (aPrevByte >> (8 - m_NumPrevBits)); } + BYTE DecodeNormal(CMyRangeDecoder *aRangeDecoder, UINT32 aPos, BYTE aPrevByte) + { return m_Coders[GetState(aPos, aPrevByte)].DecodeNormal(aRangeDecoder); } + BYTE DecodeWithMatchByte(CMyRangeDecoder *aRangeDecoder, UINT32 aPos, BYTE aPrevByte, BYTE aMatchByte) + { return m_Coders[GetState(aPos, aPrevByte)].DecodeWithMatchByte(aRangeDecoder, aMatchByte); } +}; + +} + +#endif diff --git a/tools/bsnes/lib/libjma/lzma.cpp b/tools/bsnes/lib/libjma/lzma.cpp new file mode 100755 index 0000000..d020ed2 --- /dev/null +++ b/tools/bsnes/lib/libjma/lzma.cpp @@ -0,0 +1,41 @@ +/* +Copyright (C) 2002 Andrea Mazzoleni ( http://advancemame.sf.net ) +Copyright (C) 2001-4 Igor Pavlov ( http://www.7-zip.org ) + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License version 2.1 as published by the Free Software Foundation. + +This library 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 +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "lzma.h" + +namespace NCompress { +namespace NLZMA { + +UINT32 kDistStart[kDistTableSizeMax]; + +static class CConstInit +{ +public: + CConstInit() + { + UINT32 aStartValue = 0; + int i; + for (i = 0; i < kDistTableSizeMax; i++) + { + kDistStart[i] = aStartValue; + aStartValue += (1 << kDistDirectBits[i]); + } + } +} g_ConstInit; + +}} diff --git a/tools/bsnes/lib/libjma/lzma.h b/tools/bsnes/lib/libjma/lzma.h new file mode 100755 index 0000000..949b70b --- /dev/null +++ b/tools/bsnes/lib/libjma/lzma.h @@ -0,0 +1,124 @@ +/* +Copyright (C) 2005-2007 NSRT Team ( http://nsrt.edgeemu.com ) +Copyright (C) 2002 Andrea Mazzoleni ( http://advancemame.sf.net ) +Copyright (C) 2001-4 Igor Pavlov ( http://www.7-zip.org ) + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License version 2.1 as published by the Free Software Foundation. + +This library 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 +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "lencoder.h" + +#ifndef __LZMA_H +#define __LZMA_H + +namespace NCompress { +namespace NLZMA { + +const UINT32 kNumRepDistances = 4; + +const BYTE kNumStates = 12; + +const BYTE kLiteralNextStates[kNumStates] = {0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 4, 5}; +const BYTE kMatchNextStates[kNumStates] = {7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10}; +const BYTE kRepNextStates[kNumStates] = {8, 8, 8, 8, 8, 8, 8, 11, 11, 11, 11, 11}; +const BYTE kShortRepNextStates[kNumStates]= {9, 9, 9, 9, 9, 9, 9, 11, 11, 11, 11, 11}; + +class CState +{ +public: + BYTE m_Index; + void Init() + { m_Index = 0; } + void UpdateChar() + { m_Index = kLiteralNextStates[m_Index]; } + void UpdateMatch() + { m_Index = kMatchNextStates[m_Index]; } + void UpdateRep() + { m_Index = kRepNextStates[m_Index]; } + void UpdateShortRep() + { m_Index = kShortRepNextStates[m_Index]; } +}; + +class CBaseCoder +{ +protected: + CState m_State; + BYTE m_PreviousByte; + bool m_PeviousIsMatch; + UINT32 m_RepDistances[kNumRepDistances]; + void Init() + { + m_State.Init(); + m_PreviousByte = 0; + m_PeviousIsMatch = false; + for(UINT32 i = 0 ; i < kNumRepDistances; i++) + m_RepDistances[i] = 0; + } +}; + +const int kNumPosSlotBits = 6; +const int kDicLogSizeMax = 28; +const int kDistTableSizeMax = kDicLogSizeMax * 2; + +extern UINT32 kDistStart[kDistTableSizeMax]; +const BYTE kDistDirectBits[kDistTableSizeMax] = +{ + 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, + 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, + 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26 +}; + +const UINT32 kNumLenToPosStates = 4; +inline UINT32 GetLenToPosState(UINT32 aLen) +{ + aLen -= 2; + if (aLen < kNumLenToPosStates) + return aLen; + return kNumLenToPosStates - 1; +} + +const int kMatchMinLen = 2; + +const int kMatchMaxLen = kMatchMinLen + NLength::kNumSymbolsTotal - 1; + +const int kNumAlignBits = 4; +const int kAlignTableSize = 1 << kNumAlignBits; +const UINT32 kAlignMask = (kAlignTableSize - 1); + +const int kStartPosModelIndex = 4; +const int kEndPosModelIndex = 14; +const int kNumPosModels = kEndPosModelIndex - kStartPosModelIndex; + +const int kNumFullDistances = 1 << (kEndPosModelIndex / 2); + + +const int kMainChoiceLiteralIndex = 0; +const int kMainChoiceMatchIndex = 1; + +const int kMatchChoiceDistanceIndex= 0; +const int kMatchChoiceRepetitionIndex = 1; + +const int kNumMoveBitsForMainChoice = 5; +const int kNumMoveBitsForPosCoders = 5; + +const int kNumMoveBitsForAlignCoders = 5; + +const int kNumMoveBitsForPosSlotCoder = 5; + +const int kNumLitPosStatesBitsEncodingMax = 4; +const int kNumLitContextBitsMax = 8; + +}} + +#endif diff --git a/tools/bsnes/lib/libjma/lzmadec.cpp b/tools/bsnes/lib/libjma/lzmadec.cpp new file mode 100755 index 0000000..ad6b570 --- /dev/null +++ b/tools/bsnes/lib/libjma/lzmadec.cpp @@ -0,0 +1,298 @@ +/* +Copyright (C) 2005-2007 NSRT Team ( http://nsrt.edgeemu.com ) +Copyright (C) 2002 Andrea Mazzoleni ( http://advancemame.sf.net ) +Copyright (C) 2001-4 Igor Pavlov ( http://www.7-zip.org ) + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License version 2.1 as published by the Free Software Foundation. + +This library 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 +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "portable.h" +#include "lzmadec.h" + +#define RETURN_E_OUTOFMEMORY_IF_FALSE(x) { if (!(x)) return E_OUTOFMEMORY; } + +namespace NCompress { +namespace NLZMA { + +HRESULT CDecoder::SetDictionarySize(UINT32 aDictionarySize) +{ + if (aDictionarySize > (1 << kDicLogSizeMax)) + return E_INVALIDARG; + + UINT32 aWindowReservSize = MyMax(aDictionarySize, UINT32(1 << 21)); + + if (m_DictionarySize != aDictionarySize) + { + m_OutWindowStream.Create(aDictionarySize, kMatchMaxLen, aWindowReservSize); + m_DictionarySize = aDictionarySize; + } + return S_OK; +} + +HRESULT CDecoder::SetLiteralProperties( + UINT32 aLiteralPosStateBits, UINT32 aLiteralContextBits) +{ + if (aLiteralPosStateBits > 8) + return E_INVALIDARG; + if (aLiteralContextBits > 8) + return E_INVALIDARG; + m_LiteralDecoder.Create(aLiteralPosStateBits, aLiteralContextBits); + return S_OK; +} + +HRESULT CDecoder::SetPosBitsProperties(UINT32 aNumPosStateBits) +{ + if (aNumPosStateBits > NLength::kNumPosStatesBitsMax) + return E_INVALIDARG; + UINT32 aNumPosStates = 1 << aNumPosStateBits; + m_LenDecoder.Create(aNumPosStates); + m_RepMatchLenDecoder.Create(aNumPosStates); + m_PosStateMask = aNumPosStates - 1; + return S_OK; +} + +CDecoder::CDecoder(): + m_DictionarySize((UINT32)-1) +{ + Create(); +} + +HRESULT CDecoder::Create() +{ + for(int i = 0; i < kNumPosModels; i++) + { + RETURN_E_OUTOFMEMORY_IF_FALSE( + m_PosDecoders[i].Create(kDistDirectBits[kStartPosModelIndex + i])); + } + return S_OK; +} + + +HRESULT CDecoder::Init(ISequentialInStream *anInStream, + ISequentialOutStream *anOutStream) +{ + m_RangeDecoder.Init(anInStream); + + m_OutWindowStream.Init(anOutStream); + + int i; + for(i = 0; i < kNumStates; i++) + { + for (UINT32 j = 0; j <= m_PosStateMask; j++) + { + m_MainChoiceDecoders[i][j].Init(); + m_MatchRepShortChoiceDecoders[i][j].Init(); + } + m_MatchChoiceDecoders[i].Init(); + m_MatchRepChoiceDecoders[i].Init(); + m_MatchRep1ChoiceDecoders[i].Init(); + m_MatchRep2ChoiceDecoders[i].Init(); + } + + m_LiteralDecoder.Init(); + + // m_RepMatchLenDecoder.Init(); + + for (i = 0; (UINT32) i < kNumLenToPosStates; i++) + m_PosSlotDecoder[i].Init(); + + for(i = 0; i < kNumPosModels; i++) + m_PosDecoders[i].Init(); + + m_LenDecoder.Init(); + m_RepMatchLenDecoder.Init(); + + m_PosAlignDecoder.Init(); + return S_OK; + +} + +HRESULT CDecoder::CodeReal(ISequentialInStream *anInStream, + ISequentialOutStream *anOutStream, + const UINT64 *anInSize, const UINT64 *anOutSize) +{ + if (anOutSize == NULL) + return E_INVALIDARG; + + Init(anInStream, anOutStream); + + CState aState; + aState.Init(); + bool aPeviousIsMatch = false; + BYTE aPreviousByte = 0; + UINT32 aRepDistances[kNumRepDistances]; + for(UINT32 i = 0 ; i < kNumRepDistances; i++) + aRepDistances[i] = 0; + + UINT64 aNowPos64 = 0; + UINT64 aSize = *anOutSize; + while(aNowPos64 < aSize) + { + UINT64 aNext = MyMin(aNowPos64 + (1 << 18), aSize); + while(aNowPos64 < aNext) + { + UINT32 aPosState = UINT32(aNowPos64) & m_PosStateMask; + if (m_MainChoiceDecoders[aState.m_Index][aPosState].Decode(&m_RangeDecoder) == (UINT32) kMainChoiceLiteralIndex) + { + // aCounts[0]++; + aState.UpdateChar(); + if(aPeviousIsMatch) + { + BYTE aMatchByte = m_OutWindowStream.GetOneByte(0 - aRepDistances[0] - 1); + aPreviousByte = m_LiteralDecoder.DecodeWithMatchByte(&m_RangeDecoder, + UINT32(aNowPos64), aPreviousByte, aMatchByte); + aPeviousIsMatch = false; + } + else + aPreviousByte = m_LiteralDecoder.DecodeNormal(&m_RangeDecoder, + UINT32(aNowPos64), aPreviousByte); + m_OutWindowStream.PutOneByte(aPreviousByte); + aNowPos64++; + } + else + { + aPeviousIsMatch = true; + UINT32 aDistance, aLen; + if(m_MatchChoiceDecoders[aState.m_Index].Decode(&m_RangeDecoder) == + (UINT32) kMatchChoiceRepetitionIndex) + { + if(m_MatchRepChoiceDecoders[aState.m_Index].Decode(&m_RangeDecoder) == 0) + { + if(m_MatchRepShortChoiceDecoders[aState.m_Index][aPosState].Decode(&m_RangeDecoder) == 0) + { + aState.UpdateShortRep(); + aPreviousByte = m_OutWindowStream.GetOneByte(0 - aRepDistances[0] - 1); + m_OutWindowStream.PutOneByte(aPreviousByte); + aNowPos64++; + // aCounts[3 + 4]++; + continue; + } + // aCounts[3 + 0]++; + aDistance = aRepDistances[0]; + } + else + { + if(m_MatchRep1ChoiceDecoders[aState.m_Index].Decode(&m_RangeDecoder) == 0) + { + aDistance = aRepDistances[1]; + aRepDistances[1] = aRepDistances[0]; + // aCounts[3 + 1]++; + } + else + { + if (m_MatchRep2ChoiceDecoders[aState.m_Index].Decode(&m_RangeDecoder) == 0) + { + // aCounts[3 + 2]++; + aDistance = aRepDistances[2]; + } + else + { + // aCounts[3 + 3]++; + aDistance = aRepDistances[3]; + aRepDistances[3] = aRepDistances[2]; + } + aRepDistances[2] = aRepDistances[1]; + aRepDistances[1] = aRepDistances[0]; + } + aRepDistances[0] = aDistance; + } + aLen = m_RepMatchLenDecoder.Decode(&m_RangeDecoder, aPosState) + kMatchMinLen; + // aCounts[aLen]++; + aState.UpdateRep(); + } + else + { + aLen = kMatchMinLen + m_LenDecoder.Decode(&m_RangeDecoder, aPosState); + aState.UpdateMatch(); + UINT32 aPosSlot = m_PosSlotDecoder[GetLenToPosState(aLen)].Decode(&m_RangeDecoder); + // aCounts[aPosSlot]++; + if (aPosSlot >= (UINT32) kStartPosModelIndex) + { + aDistance = kDistStart[aPosSlot]; + if (aPosSlot < (UINT32) kEndPosModelIndex) + aDistance += m_PosDecoders[aPosSlot - kStartPosModelIndex].Decode(&m_RangeDecoder); + else + { + aDistance += (m_RangeDecoder.DecodeDirectBits(kDistDirectBits[aPosSlot] - + kNumAlignBits) << kNumAlignBits); + aDistance += m_PosAlignDecoder.Decode(&m_RangeDecoder); + } + } + else + aDistance = aPosSlot; + + + aRepDistances[3] = aRepDistances[2]; + aRepDistances[2] = aRepDistances[1]; + aRepDistances[1] = aRepDistances[0]; + + aRepDistances[0] = aDistance; + // UpdateStat(aLen, aPosSlot); + } + if (aDistance >= aNowPos64) + throw E_INVALIDDATA; + m_OutWindowStream.CopyBackBlock(aDistance, aLen); + aNowPos64 += aLen; + aPreviousByte = m_OutWindowStream.GetOneByte(0 - 1); + } + } + } + return Flush(); +} + +HRESULT CDecoder::Code(ISequentialInStream *anInStream, ISequentialOutStream *anOutStream, const UINT64 *anInSize, const UINT64 *anOutSize) +{ + try { + return CodeReal(anInStream, anOutStream, anInSize, anOutSize); + } catch (HRESULT& e) { + return e; + } catch (...) { + return E_FAIL; + } +} + +HRESULT CDecoder::ReadCoderProperties(ISequentialInStream *anInStream) +{ + UINT32 aNumPosStateBits; + UINT32 aLiteralPosStateBits; + UINT32 aLiteralContextBits; + UINT32 aDictionarySize; + + UINT32 aProcessesedSize; + + BYTE aByte; + RETURN_IF_NOT_S_OK(anInStream->Read(&aByte, sizeof(aByte), &aProcessesedSize)); + if (aProcessesedSize != sizeof(aByte)) + return E_INVALIDARG; + + aLiteralContextBits = aByte % 9; + BYTE aRemainder = aByte / 9; + aLiteralPosStateBits = aRemainder % 5; + aNumPosStateBits = aRemainder / 5; + + UINT8 uint_buffer[UINT_SIZE]; + RETURN_IF_NOT_S_OK(anInStream->Read(uint_buffer, sizeof(aDictionarySize), &aProcessesedSize)); + aDictionarySize = charp_to_uint(uint_buffer); + + if (aProcessesedSize != sizeof(aDictionarySize)) + return E_INVALIDARG; + + RETURN_IF_NOT_S_OK(SetDictionarySize(aDictionarySize)); + RETURN_IF_NOT_S_OK(SetLiteralProperties(aLiteralPosStateBits, aLiteralContextBits)); + RETURN_IF_NOT_S_OK(SetPosBitsProperties(aNumPosStateBits)); + + return S_OK; +} + +}} diff --git a/tools/bsnes/lib/libjma/lzmadec.h b/tools/bsnes/lib/libjma/lzmadec.h new file mode 100755 index 0000000..bb91912 --- /dev/null +++ b/tools/bsnes/lib/libjma/lzmadec.h @@ -0,0 +1,82 @@ +/* +Copyright (C) 2002 Andrea Mazzoleni ( http://advancemame.sf.net ) +Copyright (C) 2001-4 Igor Pavlov ( http://www.7-zip.org ) + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License version 2.1 as published by the Free Software Foundation. + +This library 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 +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef __LZARITHMETIC_DECODER_H +#define __LZARITHMETIC_DECODER_H + +#include "winout.h" +#include "lzma.h" +#include "lencoder.h" +#include "litcoder.h" + +namespace NCompress { +namespace NLZMA { + +typedef CMyBitDecoder CMyBitDecoder2; + +class CDecoder +{ + NStream::NWindow::COut m_OutWindowStream; + CMyRangeDecoder m_RangeDecoder; + + CMyBitDecoder2 m_MainChoiceDecoders[kNumStates][NLength::kNumPosStatesMax]; + CMyBitDecoder2 m_MatchChoiceDecoders[kNumStates]; + CMyBitDecoder2 m_MatchRepChoiceDecoders[kNumStates]; + CMyBitDecoder2 m_MatchRep1ChoiceDecoders[kNumStates]; + CMyBitDecoder2 m_MatchRep2ChoiceDecoders[kNumStates]; + CMyBitDecoder2 m_MatchRepShortChoiceDecoders[kNumStates][NLength::kNumPosStatesMax]; + + CBitTreeDecoder m_PosSlotDecoder[kNumLenToPosStates]; + + CReverseBitTreeDecoder2 m_PosDecoders[kNumPosModels]; + CReverseBitTreeDecoder m_PosAlignDecoder; + // CBitTreeDecoder2 m_PosDecoders[kNumPosModels]; + // CBitTreeDecoder m_PosAlignDecoder; + + NLength::CDecoder m_LenDecoder; + NLength::CDecoder m_RepMatchLenDecoder; + + NLiteral::CDecoder m_LiteralDecoder; + + UINT32 m_DictionarySize; + + UINT32 m_PosStateMask; + + HRESULT Create(); + + HRESULT Init(ISequentialInStream *anInStream, ISequentialOutStream *anOutStream); + + HRESULT Flush() { return m_OutWindowStream.Flush(); } + + HRESULT CodeReal(ISequentialInStream *anInStream, ISequentialOutStream *anOutStream, const UINT64 *anInSize, const UINT64 *anOutSize); + +public: + + CDecoder(); + + HRESULT Code(ISequentialInStream *anInStream, ISequentialOutStream *anOutStream, const UINT64 *anInSize, const UINT64 *anOutSize); + HRESULT ReadCoderProperties(ISequentialInStream *anInStream); + + HRESULT SetDictionarySize(UINT32 aDictionarySize); + HRESULT SetLiteralProperties(UINT32 aLiteralPosStateBits, UINT32 aLiteralContextBits); + HRESULT SetPosBitsProperties(UINT32 aNumPosStateBits); +}; + +}} + +#endif diff --git a/tools/bsnes/lib/libjma/portable.h b/tools/bsnes/lib/libjma/portable.h new file mode 100755 index 0000000..12416c7 --- /dev/null +++ b/tools/bsnes/lib/libjma/portable.h @@ -0,0 +1,83 @@ +/* +Copyright (C) 2004-2007 NSRT Team ( http://nsrt.edgeemu.com ) +Copyright (C) 2002 Andrea Mazzoleni ( http://advancemame.sf.net ) + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +version 2 as published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#ifndef __PORTABLE_H +#define __PORTABLE_H + +#include + +typedef signed char INT8; +typedef unsigned char UINT8; +typedef short INT16; +typedef unsigned short UINT16; +typedef long INT32; +typedef unsigned long UINT32; +typedef long long INT64; +typedef unsigned long long UINT64; + +typedef UINT8 BYTE; +typedef UINT16 WORD; +typedef UINT32 DWORD; + +typedef unsigned UINT_PTR; + +typedef int BOOL; +#define FALSE 0 +#define TRUE 1 + +#define HRESULT int +#define S_OK 0 +#define E_INVALIDARG -1 +#define E_OUTOFMEMORY -2 +#define E_FAIL -3 +#define E_INTERNAL_ERROR -4 +#define E_INVALIDDATA -5 + +template inline T MyMin(T a, T b) { + return a < b ? a : b; +} + +template inline T MyMax(T a, T b) { + return a > b ? a : b; +} + +#define RETURN_IF_NOT_S_OK(x) { HRESULT __aResult_ = (x); if(__aResult_ != S_OK) return __aResult_; } + + +#define UINT_SIZE (4) +#define USHORT_SIZE (2) + +//Convert an array of 4 bytes back into an integer +inline unsigned int charp_to_uint(const unsigned char buffer[UINT_SIZE]) +{ + unsigned int num = (unsigned int)buffer[3]; + num |= ((unsigned int)buffer[2]) << 8; + num |= ((unsigned int)buffer[1]) << 16; + num |= ((unsigned int)buffer[0]) << 24; + return(num); +} + +//Convert an array of 2 bytes back into a short integer +inline unsigned short charp_to_ushort(const unsigned char buffer[USHORT_SIZE]) +{ + unsigned short num = (unsigned short)buffer[1]; + num |= ((unsigned short)buffer[0]) << 8; + return(num); +} + +#endif diff --git a/tools/bsnes/lib/libjma/rcdefs.h b/tools/bsnes/lib/libjma/rcdefs.h new file mode 100755 index 0000000..6106b57 --- /dev/null +++ b/tools/bsnes/lib/libjma/rcdefs.h @@ -0,0 +1,60 @@ +/* +Copyright (C) 2002 Andrea Mazzoleni ( http://advancemame.sf.net ) +Copyright (C) 2001-4 Igor Pavlov ( http://www.7-zip.org ) + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License version 2.1 as published by the Free Software Foundation. + +This library 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 +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef __RCDEFS_H +#define __RCDEFS_H + +#include "aribitcd.h" +#include "ariconst.h" + +#define RC_INIT_VAR \ + UINT32 aRange = aRangeDecoder->m_Range; \ + UINT32 aCode = aRangeDecoder->m_Code; + +#define RC_FLUSH_VAR \ + aRangeDecoder->m_Range = aRange; \ + aRangeDecoder->m_Code = aCode; + +#define RC_NORMALIZE \ + if (aRange < NCompression::NArithmetic::kTopValue) \ + { \ + aCode = (aCode << 8) | aRangeDecoder->m_Stream.ReadByte(); \ + aRange <<= 8; } + +#define RC_GETBIT2(aNumMoveBits, aProb, aModelIndex, Action0, Action1) \ + {UINT32 aNewBound = (aRange >> NCompression::NArithmetic::kNumBitModelTotalBits) * aProb; \ + if (aCode < aNewBound) \ + { \ + Action0; \ + aRange = aNewBound; \ + aProb += (NCompression::NArithmetic::kBitModelTotal - aProb) >> aNumMoveBits; \ + aModelIndex <<= 1; \ + } \ + else \ + { \ + Action1; \ + aRange -= aNewBound; \ + aCode -= aNewBound; \ + aProb -= (aProb) >> aNumMoveBits; \ + aModelIndex = (aModelIndex << 1) + 1; \ + }} \ + RC_NORMALIZE + +#define RC_GETBIT(aNumMoveBits, aProb, aModelIndex) RC_GETBIT2(aNumMoveBits, aProb, aModelIndex, ; , ;) + +#endif diff --git a/tools/bsnes/lib/libjma/rngcoder.h b/tools/bsnes/lib/libjma/rngcoder.h new file mode 100755 index 0000000..711c2de --- /dev/null +++ b/tools/bsnes/lib/libjma/rngcoder.h @@ -0,0 +1,143 @@ +/* +Copyright (C) 2002 Andrea Mazzoleni ( http://advancemame.sf.net ) +Copyright (C) 2001-4 Igor Pavlov ( http://www.7-zip.org ) + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License version 2.1 as published by the Free Software Foundation. + +This library 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 +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef __COMPRESSION_RANGECODER_H +#define __COMPRESSION_RANGECODER_H + +#include "inbyte.h" + +namespace NCompression { +namespace NArithmetic { + +const UINT32 kNumTopBits = 24; +const UINT32 kTopValue = (1 << kNumTopBits); + +class CRangeDecoder +{ +public: + NStream::CInByte m_Stream; + UINT32 m_Range; + UINT32 m_Code; + UINT32 m_Word; + void Normalize() + { + while (m_Range < kTopValue) + { + m_Code = (m_Code << 8) | m_Stream.ReadByte(); + m_Range <<= 8; + } + } + + void Init(ISequentialInStream *aStream) + { + m_Stream.Init(aStream); + m_Code = 0; + m_Range = UINT32(-1); + for(int i = 0; i < 5; i++) + m_Code = (m_Code << 8) | m_Stream.ReadByte(); + } + + UINT32 GetThreshold(UINT32 aTotal) + { + return (m_Code) / ( m_Range /= aTotal); + } + + void Decode(UINT32 aStart, UINT32 aSize, UINT32 aTotal) + { + m_Code -= aStart * m_Range; + m_Range *= aSize; + Normalize(); + } + + /* + UINT32 DecodeDirectBitsDiv(UINT32 aNumTotalBits) + { + m_Range >>= aNumTotalBits; + UINT32 aThreshold = m_Code / m_Range; + m_Code -= aThreshold * m_Range; + + Normalize(); + return aThreshold; + } + + UINT32 DecodeDirectBitsDiv2(UINT32 aNumTotalBits) + { + if (aNumTotalBits <= kNumBottomBits) + return DecodeDirectBitsDiv(aNumTotalBits); + UINT32 aResult = DecodeDirectBitsDiv(aNumTotalBits - kNumBottomBits) << kNumBottomBits; + return (aResult | DecodeDirectBitsDiv(kNumBottomBits)); + } + */ + + UINT32 DecodeDirectBits(UINT32 aNumTotalBits) + { + UINT32 aRange = m_Range; + UINT32 aCode = m_Code; + UINT32 aResult = 0; + for (UINT32 i = aNumTotalBits; i > 0; i--) + { + aRange >>= 1; + /* + aResult <<= 1; + if (aCode >= aRange) + { + aCode -= aRange; + aResult |= 1; + } + */ + UINT32 t = (aCode - aRange) >> 31; + aCode -= aRange & (t - 1); + // aRange = aRangeTmp + ((aRange & 1) & (1 - t)); + aResult = (aResult << 1) | (1 - t); + + if (aRange < kTopValue) + { + aCode = (aCode << 8) | m_Stream.ReadByte(); + aRange <<= 8; + } + } + m_Range = aRange; + m_Code = aCode; + return aResult; + } + + UINT32 DecodeBit(UINT32 aSize0, UINT32 aNumTotalBits) + { + UINT32 aNewBound = (m_Range >> aNumTotalBits) * aSize0; + UINT32 aSymbol; + if (m_Code < aNewBound) + { + aSymbol = 0; + m_Range = aNewBound; + } + else + { + aSymbol = 1; + m_Code -= aNewBound; + m_Range -= aNewBound; + } + Normalize(); + return aSymbol; + } + + UINT64 GetProcessedSize() {return m_Stream.GetProcessedSize(); } +}; + +}} + +#endif diff --git a/tools/bsnes/lib/libjma/winout.cpp b/tools/bsnes/lib/libjma/winout.cpp new file mode 100755 index 0000000..1f33885 --- /dev/null +++ b/tools/bsnes/lib/libjma/winout.cpp @@ -0,0 +1,89 @@ +/* +Copyright (C) 2002 Andrea Mazzoleni ( http://advancemame.sf.net ) +Copyright (C) 2001-4 Igor Pavlov ( http://www.7-zip.org ) + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License version 2.1 as published by the Free Software Foundation. + +This library 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 +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "winout.h" + +namespace NStream { +namespace NWindow { + +void COut::Create(UINT32 aKeepSizeBefore, UINT32 aKeepSizeAfter, UINT32 aKeepSizeReserv) +{ + m_Pos = 0; + m_PosLimit = aKeepSizeReserv + aKeepSizeBefore; + m_KeepSizeBefore = aKeepSizeBefore; + m_KeepSizeAfter = aKeepSizeAfter; + m_KeepSizeReserv = aKeepSizeReserv; + m_StreamPos = 0; + m_MoveFrom = m_KeepSizeReserv; + m_WindowSize = aKeepSizeBefore; + UINT32 aBlockSize = m_KeepSizeBefore + m_KeepSizeAfter + m_KeepSizeReserv; + delete []m_Buffer; + m_Buffer = new BYTE[aBlockSize]; +} + +COut::~COut() +{ + delete []m_Buffer; +} + +void COut::SetWindowSize(UINT32 aWindowSize) +{ + m_WindowSize = aWindowSize; + m_MoveFrom = m_KeepSizeReserv + m_KeepSizeBefore - aWindowSize; +} + +void COut::Init(ISequentialOutStream *aStream, bool aSolid) +{ + m_Stream = aStream; + + if(aSolid) + m_StreamPos = m_Pos; + else + { + m_Pos = 0; + m_PosLimit = m_KeepSizeReserv + m_KeepSizeBefore; + m_StreamPos = 0; + } +} + +HRESULT COut::Flush() +{ + UINT32 aSize = m_Pos - m_StreamPos; + if(aSize == 0) + return S_OK; + UINT32 aProcessedSize; + HRESULT aResult = m_Stream->Write(m_Buffer + m_StreamPos, aSize, &aProcessedSize); + if (aResult != S_OK) + return aResult; + if (aSize != aProcessedSize) + return E_FAIL; + m_StreamPos = m_Pos; + return S_OK; +} + +void COut::MoveBlockBackward() +{ + HRESULT aResult = Flush(); + if (aResult != S_OK) + throw aResult; + memmove(m_Buffer, m_Buffer + m_MoveFrom, m_WindowSize + m_KeepSizeAfter); + m_Pos -= m_MoveFrom; + m_StreamPos -= m_MoveFrom; +} + +}} diff --git a/tools/bsnes/lib/libjma/winout.h b/tools/bsnes/lib/libjma/winout.h new file mode 100755 index 0000000..38e06bd --- /dev/null +++ b/tools/bsnes/lib/libjma/winout.h @@ -0,0 +1,89 @@ +/* +Copyright (C) 2002 Andrea Mazzoleni ( http://advancemame.sf.net ) +Copyright (C) 2001-4 Igor Pavlov ( http://www.7-zip.org ) + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License version 2.1 as published by the Free Software Foundation. + +This library 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 +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef __STREAM_WINDOWOUT_H +#define __STREAM_WINDOWOUT_H + +#include "iiostrm.h" + +namespace NStream { +namespace NWindow { + +// m_KeepSizeBefore: how mach BYTEs must be in buffer before m_Pos; +// m_KeepSizeAfter: how mach BYTEs must be in buffer after m_Pos; +// m_KeepSizeReserv: how mach BYTEs must be in buffer for Moving Reserv; +// must be >= aKeepSizeAfter; // test it + +class COut +{ + BYTE *m_Buffer; + UINT32 m_Pos; + UINT32 m_PosLimit; + UINT32 m_KeepSizeBefore; + UINT32 m_KeepSizeAfter; + UINT32 m_KeepSizeReserv; + UINT32 m_StreamPos; + + UINT32 m_WindowSize; + UINT32 m_MoveFrom; + + ISequentialOutStream *m_Stream; + + virtual void MoveBlockBackward(); +public: + COut(): m_Buffer(0), m_Stream(0) {} + virtual ~COut(); + void Create(UINT32 aKeepSizeBefore, + UINT32 aKeepSizeAfter, UINT32 aKeepSizeReserv = (1<<17)); + void SetWindowSize(UINT32 aWindowSize); + + void Init(ISequentialOutStream *aStream, bool aSolid = false); + HRESULT Flush(); + + UINT32 GetCurPos() const { return m_Pos; } + const BYTE *GetPointerToCurrentPos() const { return m_Buffer + m_Pos;}; + + void CopyBackBlock(UINT32 aDistance, UINT32 aLen) + { + if (m_Pos >= m_PosLimit) + MoveBlockBackward(); + BYTE *p = m_Buffer + m_Pos; + aDistance++; + for(UINT32 i = 0; i < aLen; i++) + p[i] = p[i - aDistance]; + m_Pos += aLen; + } + + void PutOneByte(BYTE aByte) + { + if (m_Pos >= m_PosLimit) + MoveBlockBackward(); + m_Buffer[m_Pos++] = aByte; + } + + BYTE GetOneByte(UINT32 anIndex) const + { + return m_Buffer[m_Pos + anIndex]; + } + + BYTE *GetBuffer() const { return m_Buffer; } +}; + +}} + +#endif diff --git a/tools/bsnes/lib/libreader/filereader.cpp b/tools/bsnes/lib/libreader/filereader.cpp new file mode 100755 index 0000000..c5d1378 --- /dev/null +++ b/tools/bsnes/lib/libreader/filereader.cpp @@ -0,0 +1,49 @@ +#ifdef READER_CPP +#include "filereader.hpp" + +unsigned FileReader::size() { + return fp.size(); +} + +//This function will allocate memory even if open() fails. +//This is needed so that when SRAM files do not exist, the +//memory for the SRAM data will be allocated still. +//The memory is flushed to 0x00 when no file is opened. +uint8_t* FileReader::read(unsigned length) { + uint8_t *data = 0; + + if(length == 0) { + //read the entire file into RAM + data = new(zeromemory) uint8_t[fp.size()]; + if(fp.open()) fp.read(data, fp.size()); + } else if(length > fp.size()) { + //read the entire file into RAM, pad the rest with 0x00s + data = new(zeromemory) uint8_t[length]; + if(fp.open()) fp.read(data, fp.size()); + } else { //filesize >= length + //read only what was requested + data = new(zeromemory) uint8_t[length]; + if(fp.open()) fp.read(data, length); + } + + return data; +} + +bool FileReader::ready() { + return fp.open(); +} + +FileReader::FileReader(const char *fn) { + if(!fp.open(fn, file::mode_read)) return; + + if(fp.size() == 0) { + //empty file + fp.close(); + } +} + +FileReader::~FileReader() { + if(fp.open()) fp.close(); +} + +#endif //ifdef READER_CPP diff --git a/tools/bsnes/lib/libreader/filereader.hpp b/tools/bsnes/lib/libreader/filereader.hpp new file mode 100755 index 0000000..c48819c --- /dev/null +++ b/tools/bsnes/lib/libreader/filereader.hpp @@ -0,0 +1,12 @@ +class FileReader : public Reader { +public: + unsigned size(); + uint8_t* read(unsigned length = 0); + bool ready(); + + FileReader(const char *fn); + ~FileReader(); + +private: + file fp; +}; diff --git a/tools/bsnes/lib/libreader/gzreader.cpp b/tools/bsnes/lib/libreader/gzreader.cpp new file mode 100755 index 0000000..28e4e49 --- /dev/null +++ b/tools/bsnes/lib/libreader/gzreader.cpp @@ -0,0 +1,84 @@ +#ifdef READER_CPP +#include "gzreader.hpp" + +unsigned GZReader::size() { + return filesize; +} + +//This function will allocate memory even if open() fails. +//This is needed so that when SRAM files do not exist, the +//memory for the SRAM data will be allocated still. +//The memory is flushed to 0x00 when no file is opened. +uint8_t* GZReader::read(unsigned length) { + uint8_t *data = 0; + + if(length == 0) { + //read the entire file into RAM + data = new(zeromemory) uint8_t[filesize]; + if(gp) gzread(gp, data, filesize); + } else if(length > filesize) { + //read the entire file into RAM, pad the rest with 0x00s + data = new(zeromemory) uint8_t[length]; + if(gp) gzread(gp, data, filesize); + } else { //filesize >= length + //read only what was requested + data = new(zeromemory) uint8_t[length]; + if(gp) gzread(gp, data, length); + } + + return data; +} + +bool GZReader::ready() { + return (gp != 0); +} + +GZReader::GZReader(const char *fn) : gp(0) { + #if !defined(_WIN32) + fp = fopen(fn, "rb"); + #else + fp = _wfopen(utf16_t(fn), L"rb"); + #endif + if(!fp) return; + + fseek(fp, 0, SEEK_END); + filesize = ftell(fp); + + if(filesize < 4) { + //too small to be a valid GZ archive + fclose(fp); + fp = 0; + return; + } + + fseek(fp, -4, SEEK_END); + unsigned gzsize; + gzsize = fgetc(fp); + gzsize |= fgetc(fp) << 8; + gzsize |= fgetc(fp) << 16; + gzsize |= fgetc(fp) << 24; + fseek(fp, 0, SEEK_SET); + + //zlib does not support UTF-8 filenames on Windows, + //thus _wfopen() wrapper above + fileno() wrapper here. + gp = gzdopen(fileno(fp), "rb"); + if(!gp) return; + + if(gzdirect(gp) == false) filesize = gzsize; + + if(filesize == 0) { + //archive is empty + gzclose(gp); + gp = 0; + return; + } +} + +GZReader::~GZReader() { + if(gp) { + gzclose(gp); + gp = 0; + } +} + +#endif //ifdef READER_CPP diff --git a/tools/bsnes/lib/libreader/gzreader.hpp b/tools/bsnes/lib/libreader/gzreader.hpp new file mode 100755 index 0000000..9d13ab8 --- /dev/null +++ b/tools/bsnes/lib/libreader/gzreader.hpp @@ -0,0 +1,16 @@ +#include + +class GZReader : public Reader { +private: + FILE *fp; + gzFile gp; + unsigned filesize; + +public: + unsigned size(); + uint8_t* read(unsigned length = 0); + bool ready(); + + GZReader(const char *fn); + ~GZReader(); +}; diff --git a/tools/bsnes/lib/libreader/jmareader.cpp b/tools/bsnes/lib/libreader/jmareader.cpp new file mode 100755 index 0000000..be65068 --- /dev/null +++ b/tools/bsnes/lib/libreader/jmareader.cpp @@ -0,0 +1,36 @@ +#ifdef READER_CPP +#include "jmareader.hpp" + +unsigned JMAReader::size() { + return filesize; +} + +uint8_t* JMAReader::read(unsigned length) { + uint8_t *data = 0; + if(!filesize) return 0; + + if(length <= filesize) { + //read the entire file into RAM + data = new(zeromemory) uint8_t[filesize]; + JMAFile.extract_file(cname, data); + } else if(length > filesize) { + //read the entire file into RAM, pad the rest with 0x00s + data = new(zeromemory) uint8_t[length]; + JMAFile.extract_file(cname, data); + } + + return data; +} + +JMAReader::JMAReader(const char *fn) : JMAFile(fn), filesize(0) { + std::vector file_info = JMAFile.get_files_info(); + for(std::vector::iterator i = file_info.begin(); i != file_info.end(); i++) { + //Check for valid ROM based on size + if((i->size <= 0x1000000 + 512) && (i->size > filesize)) { + cname = i->name; + filesize = i->size; + } + } +} + +#endif //ifdef READER_CPP diff --git a/tools/bsnes/lib/libreader/jmareader.hpp b/tools/bsnes/lib/libreader/jmareader.hpp new file mode 100755 index 0000000..15ad686 --- /dev/null +++ b/tools/bsnes/lib/libreader/jmareader.hpp @@ -0,0 +1,14 @@ +#include + +class JMAReader : public Reader { +public: + unsigned size(); + uint8_t* read(unsigned length = 0); + + JMAReader(const char *fn); + +private: + JMA::jma_open JMAFile; + unsigned filesize; + std::string cname; +}; diff --git a/tools/bsnes/lib/libreader/libreader.cpp b/tools/bsnes/lib/libreader/libreader.cpp new file mode 100755 index 0000000..1d67422 --- /dev/null +++ b/tools/bsnes/lib/libreader/libreader.cpp @@ -0,0 +1,36 @@ +#include "libreader.hpp" +#define READER_CPP + +#include "filereader.cpp" + +#if defined(GZIP_SUPPORT) + #include "gzreader.cpp" + #include "zipreader.cpp" +#endif + +#if defined(JMA_SUPPORT) + #include "jmareader.cpp" +#endif + +Reader::Type Reader::detect(const char *fn, bool inspectheader) { + file fp; + if(!fp.open(fn, file::mode_read)) return Unknown; + + uint8_t p[8]; + memset(p, 0, sizeof p); + fp.read(p, 8); + fp.close(); + + if(inspectheader == true) { + //inspect file header to determine type + if(p[0] == 0x1f && p[1] == 0x8b && p[2] == 0x08 && p[3] <= 0x1f) return GZIP; + if(p[0] == 0x50 && p[1] == 0x4b && p[2] == 0x03 && p[3] == 0x04) return ZIP; + if(p[0] == 0x4a && p[1] == 0x4d && p[2] == 0x41 && p[3] == 0x00 && p[4] == 0x4e) return JMA; + } else { + //check file extension to determine type + if(striend(fn, ".gz")) return GZIP; + if(striend(fn, ".zip") || striend(fn, ".z")) return ZIP; + if(striend(fn, ".jma")) return JMA; + } + return Normal; +} diff --git a/tools/bsnes/lib/libreader/libreader.hpp b/tools/bsnes/lib/libreader/libreader.hpp new file mode 100755 index 0000000..77540ce --- /dev/null +++ b/tools/bsnes/lib/libreader/libreader.hpp @@ -0,0 +1,21 @@ +#include +#include +#include +#include +using namespace nall; + +class Reader { +public: + enum Type { + Unknown, + Normal, + GZIP, + ZIP, + JMA, + }; + + static Type detect(const char *fn, bool inspectheader); + virtual unsigned size() = 0; + virtual uint8_t* read(unsigned length = 0) = 0; + virtual bool ready() { return true; } //can only call read() when ready() returns true +}; diff --git a/tools/bsnes/lib/libreader/zipreader.cpp b/tools/bsnes/lib/libreader/zipreader.cpp new file mode 100755 index 0000000..9484398 --- /dev/null +++ b/tools/bsnes/lib/libreader/zipreader.cpp @@ -0,0 +1,60 @@ +#ifdef READER_CPP +#include "zipreader.hpp" + +unsigned ZipReader::size() { + return filesize; +} + +uint8_t* ZipReader::read(unsigned length) { + if(!filesize) return 0; + + uint8_t *data = 0; + if(length <= filesize) { + //read the entire file into RAM + data = new(zeromemory) uint8_t[filesize]; + unzReadCurrentFile(zipfile, data, filesize); + } else { /* length > filesize */ + //read the entire file into RAM, pad the rest with 0x00s + data = new(zeromemory) uint8_t[length]; + unzReadCurrentFile(zipfile, data, filesize); + } + + return data; +} + +bool ZipReader::ready() { + return zipready; +} + +ZipReader::ZipReader(const char *fn) : filesize(0), zipready(false) { + unz_file_info cFileInfo; //Create variable to hold info for a compressed file + char cFileName[sizeof(cname)]; + + if(zipfile = unzOpen(fn)) { //Open zip file + for(int cFile = unzGoToFirstFile(zipfile); cFile == UNZ_OK; cFile = unzGoToNextFile(zipfile)) { + //Gets info on current file, and places it in cFileInfo + unzGetCurrentFileInfo(zipfile, &cFileInfo, cFileName, sizeof(cname), 0, 0, 0, 0); + + //verify uncompressed file is not bigger than max ROM size + if((cFileInfo.uncompressed_size <= 0x1000000 + 512) && (cFileInfo.uncompressed_size > filesize)) { + strcpy(cname, cFileName); + filesize = cFileInfo.uncompressed_size; + } + } + + if(filesize) { + unzLocateFile(zipfile, cname, 1); + unzOpenCurrentFile(zipfile); + zipready = true; + } + } +} + +ZipReader::~ZipReader() { + if(zipfile) { + unzCloseCurrentFile(zipfile); + unzClose(zipfile); + } +} + +#endif //ifdef READER_CPP diff --git a/tools/bsnes/lib/libreader/zipreader.hpp b/tools/bsnes/lib/libreader/zipreader.hpp new file mode 100755 index 0000000..f9df729 --- /dev/null +++ b/tools/bsnes/lib/libreader/zipreader.hpp @@ -0,0 +1,19 @@ +#include + +#define ZIP_MAX_FILE_NAME PATH_MAX + +class ZipReader : public Reader { +public: + unsigned size(); + uint8_t* read(unsigned length = 0); + bool ready(); + + ZipReader(const char *fn); + ~ZipReader(); + +private: + unzFile zipfile; + unsigned filesize; + bool zipready; + char cname[PATH_MAX]; +}; diff --git a/tools/bsnes/lib/nall/Makefile b/tools/bsnes/lib/nall/Makefile new file mode 100755 index 0000000..82dc00a --- /dev/null +++ b/tools/bsnes/lib/nall/Makefile @@ -0,0 +1,109 @@ +# Makefile +# author: byuu +# license: public domain + +[A-Z] = A B C D E F G H I J K L M N O P Q R S T U V W X Y Z +[a-z] = a b c d e f g h i j k l m n o p q r s t u v w x y z +[0-9] = 0 1 2 3 4 5 6 7 8 9 +[markup] = ` ~ ! @ \# $$ % ^ & * ( ) - _ = + [ { ] } \ | ; : ' " , < . > / ? +[all] = $([A-Z]) $([a-z]) $([0-9]) $([markup]) +[space] := +[space] += + +##### +# platform detection +##### + +ifeq ($(platform),) + uname := $(shell uname -a) + ifeq ($(uname),) + platform := win + delete = del $(subst /,\,$1) + else ifneq ($(findstring Darwin,$(uname)),) + platform := osx + delete = rm -f $1 + else + platform := x + delete = rm -f $1 + endif +endif + +ifeq ($(compiler),) + compiler := gcc +endif + +ifeq ($(prefix),) + prefix := /usr/local +endif + +##### +# function rwildcard(directory, pattern) +##### +rwildcard = \ + $(strip \ + $(filter $(if $2,$2,%), \ + $(foreach f, \ + $(wildcard $1*), \ + $(eval t = $(call rwildcard,$f/)) \ + $(if $t,$t,$f) \ + ) \ + ) \ + ) + +##### +# function strtr(source, from, to) +##### +strtr = \ + $(eval __temp := $1) \ + $(strip \ + $(foreach c, \ + $(join $(addsuffix :,$2),$3), \ + $(eval __temp := \ + $(subst $(word 1,$(subst :, ,$c)),$(word 2,$(subst :, ,$c)),$(__temp)) \ + ) \ + ) \ + $(__temp) \ + ) + +##### +# function strupper(source) +##### +strupper = $(call strtr,$1,$([a-z]),$([A-Z])) + +##### +# function strlower(source) +##### +strlower = $(call strtr,$1,$([A-Z]),$([a-z])) + +##### +# function strlen(source) +##### +strlen = \ + $(eval __temp := $(subst $([space]),_,$1)) \ + $(words \ + $(strip \ + $(foreach c, \ + $([all]), \ + $(eval __temp := \ + $(subst $c,$c ,$(__temp)) \ + ) \ + ) \ + $(__temp) \ + ) \ + ) + +##### +# function streq(source) +##### +streq = $(if $(filter-out xx,x$(subst $1,,$2)$(subst $2,,$1)x),,1) + +##### +# function strne(source) +##### +strne = $(if $(filter-out xx,x$(subst $1,,$2)$(subst $2,,$1)x),1,) + +##### +# function ifhas(needle, haystack, true, false) +##### +ifhas = $(if $(findstring $1,$2),$3,$4) + diff --git a/tools/bsnes/lib/nall/dl.hpp b/tools/bsnes/lib/nall/dl.hpp new file mode 100755 index 0000000..13cd69e --- /dev/null +++ b/tools/bsnes/lib/nall/dl.hpp @@ -0,0 +1,81 @@ +#ifndef NALL_DL_HPP +#define NALL_DL_HPP + +//dynamic linking support + +#include +#include +#include +#include + +#if defined(PLATFORM_X) + #include +#elif defined(PLATFORM_WIN) + #include + #include +#endif + +namespace nall { + struct library : noncopyable { + bool open(const char*); + void* sym(const char*); + void close(); + + library() : handle(0) {} + ~library() { close(); } + + private: + uintptr_t handle; + }; + + #if defined(PLATFORM_X) + inline bool library::open(const char *name) { + if(handle) close(); + char *t = new char[strlen(name) + 8]; + strcpy(t, "lib"); + strcat(t, name); + strcat(t, ".so"); + handle = (uintptr_t)dlopen(t, RTLD_LAZY); + delete[] t; + return handle; + } + + inline void* library::sym(const char *name) { + if(!handle) return 0; + return dlsym((void*)handle, name); + } + + inline void library::close() { + if(!handle) return; + dlclose((void*)handle); + handle = 0; + } + #elif defined(PLATFORM_WIN) + inline bool library::open(const char *name) { + if(handle) close(); + char *t = new char[strlen(name) + 8]; + strcpy(t, name); + strcat(t, ".dll"); + handle = (uintptr_t)LoadLibraryW(utf16_t(t)); + delete[] t; + return handle; + } + + inline void* library::sym(const char *name) { + if(!handle) return 0; + return (void*)GetProcAddress((HMODULE)handle, name); + } + + inline void library::close() { + if(!handle) return; + FreeLibrary((HMODULE)handle); + handle = 0; + } + #else + inline bool library::open(const char*) { return false; } + inline void* library::sym(const char*) { return 0; } + inline void library::close() {} + #endif +}; + +#endif diff --git a/tools/bsnes/lib/zlib/adler32.c b/tools/bsnes/lib/zlib/adler32.c new file mode 100755 index 0000000..58cdf06 --- /dev/null +++ b/tools/bsnes/lib/zlib/adler32.c @@ -0,0 +1,149 @@ +/* adler32.c -- compute the Adler-32 checksum of a data stream + * Copyright (C) 1995-2004 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id: adler32.c,v 1.3 2005/07/27 18:15:11 nach Exp $ */ + +#define ZLIB_INTERNAL +#include "zlib.h" + +#define BASE 65521UL /* largest prime smaller than 65536 */ +#define NMAX 5552 +/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ + +#define DO1(buf,i) {adler += (buf)[i]; sum2 += adler;} +#define DO2(buf,i) DO1(buf,i); DO1(buf,i+1); +#define DO4(buf,i) DO2(buf,i); DO2(buf,i+2); +#define DO8(buf,i) DO4(buf,i); DO4(buf,i+4); +#define DO16(buf) DO8(buf,0); DO8(buf,8); + +/* use NO_DIVIDE if your processor does not do division in hardware */ +#ifdef NO_DIVIDE +# define MOD(a) \ + do { \ + if (a >= (BASE << 16)) a -= (BASE << 16); \ + if (a >= (BASE << 15)) a -= (BASE << 15); \ + if (a >= (BASE << 14)) a -= (BASE << 14); \ + if (a >= (BASE << 13)) a -= (BASE << 13); \ + if (a >= (BASE << 12)) a -= (BASE << 12); \ + if (a >= (BASE << 11)) a -= (BASE << 11); \ + if (a >= (BASE << 10)) a -= (BASE << 10); \ + if (a >= (BASE << 9)) a -= (BASE << 9); \ + if (a >= (BASE << 8)) a -= (BASE << 8); \ + if (a >= (BASE << 7)) a -= (BASE << 7); \ + if (a >= (BASE << 6)) a -= (BASE << 6); \ + if (a >= (BASE << 5)) a -= (BASE << 5); \ + if (a >= (BASE << 4)) a -= (BASE << 4); \ + if (a >= (BASE << 3)) a -= (BASE << 3); \ + if (a >= (BASE << 2)) a -= (BASE << 2); \ + if (a >= (BASE << 1)) a -= (BASE << 1); \ + if (a >= BASE) a -= BASE; \ + } while (0) +# define MOD4(a) \ + do { \ + if (a >= (BASE << 4)) a -= (BASE << 4); \ + if (a >= (BASE << 3)) a -= (BASE << 3); \ + if (a >= (BASE << 2)) a -= (BASE << 2); \ + if (a >= (BASE << 1)) a -= (BASE << 1); \ + if (a >= BASE) a -= BASE; \ + } while (0) +#else +# define MOD(a) a %= BASE +# define MOD4(a) a %= BASE +#endif + +/* ========================================================================= */ +uLong ZEXPORT adler32(adler, buf, len) + uLong adler; + const Bytef *buf; + uInt len; +{ + unsigned long sum2; + unsigned n; + + /* split Adler-32 into component sums */ + sum2 = (adler >> 16) & 0xffff; + adler &= 0xffff; + + /* in case user likes doing a byte at a time, keep it fast */ + if (len == 1) { + adler += buf[0]; + if (adler >= BASE) + adler -= BASE; + sum2 += adler; + if (sum2 >= BASE) + sum2 -= BASE; + return adler | (sum2 << 16); + } + + /* initial Adler-32 value (deferred check for len == 1 speed) */ + if (buf == Z_NULL) + return 1L; + + /* in case short lengths are provided, keep it somewhat fast */ + if (len < 16) { + while (len--) { + adler += *buf++; + sum2 += adler; + } + if (adler >= BASE) + adler -= BASE; + MOD4(sum2); /* only added so many BASE's */ + return adler | (sum2 << 16); + } + + /* do length NMAX blocks -- requires just one modulo operation */ + while (len >= NMAX) { + len -= NMAX; + n = NMAX / 16; /* NMAX is divisible by 16 */ + do { + DO16(buf); /* 16 sums unrolled */ + buf += 16; + } while (--n); + MOD(adler); + MOD(sum2); + } + + /* do remaining bytes (less than NMAX, still just one modulo) */ + if (len) { /* avoid modulos if none remaining */ + while (len >= 16) { + len -= 16; + DO16(buf); + buf += 16; + } + while (len--) { + adler += *buf++; + sum2 += adler; + } + MOD(adler); + MOD(sum2); + } + + /* return recombined sums */ + return adler | (sum2 << 16); +} + +/* ========================================================================= */ +uLong ZEXPORT adler32_combine(adler1, adler2, len2) + uLong adler1; + uLong adler2; + z_off_t len2; +{ + unsigned long sum1; + unsigned long sum2; + unsigned rem; + + /* the derivation of this formula is left as an exercise for the reader */ + rem = (unsigned)(len2 % BASE); + sum1 = adler1 & 0xffff; + sum2 = rem * sum1; + MOD(sum2); + sum1 += (adler2 & 0xffff) + BASE - 1; + sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem; + if (sum1 > BASE) sum1 -= BASE; + if (sum1 > BASE) sum1 -= BASE; + if (sum2 > (BASE << 1)) sum2 -= (BASE << 1); + if (sum2 > BASE) sum2 -= BASE; + return sum1 | (sum2 << 16); +} diff --git a/tools/bsnes/lib/zlib/compress.c b/tools/bsnes/lib/zlib/compress.c new file mode 100755 index 0000000..1b7f07a --- /dev/null +++ b/tools/bsnes/lib/zlib/compress.c @@ -0,0 +1,79 @@ +/* compress.c -- compress a memory buffer + * Copyright (C) 1995-2003 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id: compress.c,v 1.3 2005/07/27 18:15:11 nach Exp $ */ + +#define ZLIB_INTERNAL +#include "zlib.h" + +/* =========================================================================== + Compresses the source buffer into the destination buffer. The level + parameter has the same meaning as in deflateInit. sourceLen is the byte + length of the source buffer. Upon entry, destLen is the total size of the + destination buffer, which must be at least 0.1% larger than sourceLen plus + 12 bytes. Upon exit, destLen is the actual size of the compressed buffer. + + compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_BUF_ERROR if there was not enough room in the output buffer, + Z_STREAM_ERROR if the level parameter is invalid. +*/ +int ZEXPORT compress2 (dest, destLen, source, sourceLen, level) + Bytef *dest; + uLongf *destLen; + const Bytef *source; + uLong sourceLen; + int level; +{ + z_stream stream; + int err; + + stream.next_in = (Bytef*)source; + stream.avail_in = (uInt)sourceLen; +#ifdef MAXSEG_64K + /* Check for source > 64K on 16-bit machine: */ + if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; +#endif + stream.next_out = dest; + stream.avail_out = (uInt)*destLen; + if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; + + stream.zalloc = (alloc_func)0; + stream.zfree = (free_func)0; + stream.opaque = (voidpf)0; + + err = deflateInit(&stream, level); + if (err != Z_OK) return err; + + err = deflate(&stream, Z_FINISH); + if (err != Z_STREAM_END) { + deflateEnd(&stream); + return err == Z_OK ? Z_BUF_ERROR : err; + } + *destLen = stream.total_out; + + err = deflateEnd(&stream); + return err; +} + +/* =========================================================================== + */ +int ZEXPORT compress (dest, destLen, source, sourceLen) + Bytef *dest; + uLongf *destLen; + const Bytef *source; + uLong sourceLen; +{ + return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION); +} + +/* =========================================================================== + If the default memLevel or windowBits for deflateInit() is changed, then + this function needs to be updated. + */ +uLong ZEXPORT compressBound (sourceLen) + uLong sourceLen; +{ + return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + 11; +} diff --git a/tools/bsnes/lib/zlib/crc32.c b/tools/bsnes/lib/zlib/crc32.c new file mode 100755 index 0000000..fe16f0c --- /dev/null +++ b/tools/bsnes/lib/zlib/crc32.c @@ -0,0 +1,423 @@ +/* crc32.c -- compute the CRC-32 of a data stream + * Copyright (C) 1995-2005 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + * + * Thanks to Rodney Brown for his contribution of faster + * CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing + * tables for updating the shift register in one step with three exclusive-ors + * instead of four steps with four exclusive-ors. This results in about a + * factor of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3. + */ + +/* @(#) $Id: crc32.c,v 1.3 2005/07/27 18:15:11 nach Exp $ */ + +/* + Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore + protection on the static variables used to control the first-use generation + of the crc tables. Therefore, if you #define DYNAMIC_CRC_TABLE, you should + first call get_crc_table() to initialize the tables before allowing more than + one thread to use crc32(). + */ + +#ifdef MAKECRCH +# include +# ifndef DYNAMIC_CRC_TABLE +# define DYNAMIC_CRC_TABLE +# endif /* !DYNAMIC_CRC_TABLE */ +#endif /* MAKECRCH */ + +#include "zutil.h" /* for STDC and FAR definitions */ + +#define local static + +/* Find a four-byte integer type for crc32_little() and crc32_big(). */ +#ifndef NOBYFOUR +# ifdef STDC /* need ANSI C limits.h to determine sizes */ +# include +# define BYFOUR +# if (UINT_MAX == 0xffffffffUL) + typedef unsigned int u4; +# else +# if (ULONG_MAX == 0xffffffffUL) + typedef unsigned long u4; +# else +# if (USHRT_MAX == 0xffffffffUL) + typedef unsigned short u4; +# else +# undef BYFOUR /* can't find a four-byte integer type! */ +# endif +# endif +# endif +# endif /* STDC */ +#endif /* !NOBYFOUR */ + +/* Definitions for doing the crc four data bytes at a time. */ +#ifdef BYFOUR +# define REV(w) (((w)>>24)+(((w)>>8)&0xff00)+ \ + (((w)&0xff00)<<8)+(((w)&0xff)<<24)) + local unsigned long crc32_little OF((unsigned long, + const unsigned char FAR *, unsigned)); + local unsigned long crc32_big OF((unsigned long, + const unsigned char FAR *, unsigned)); +# define TBLS 8 +#else +# define TBLS 1 +#endif /* BYFOUR */ + +/* Local functions for crc concatenation */ +local unsigned long gf2_matrix_times OF((unsigned long *mat, + unsigned long vec)); +local void gf2_matrix_square OF((unsigned long *square, unsigned long *mat)); + +#ifdef DYNAMIC_CRC_TABLE + +local volatile int crc_table_empty = 1; +local unsigned long FAR crc_table[TBLS][256]; +local void make_crc_table OF((void)); +#ifdef MAKECRCH + local void write_table OF((FILE *, const unsigned long FAR *)); +#endif /* MAKECRCH */ +/* + Generate tables for a byte-wise 32-bit CRC calculation on the polynomial: + x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1. + + Polynomials over GF(2) are represented in binary, one bit per coefficient, + with the lowest powers in the most significant bit. Then adding polynomials + is just exclusive-or, and multiplying a polynomial by x is a right shift by + one. If we call the above polynomial p, and represent a byte as the + polynomial q, also with the lowest power in the most significant bit (so the + byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p, + where a mod b means the remainder after dividing a by b. + + This calculation is done using the shift-register method of multiplying and + taking the remainder. The register is initialized to zero, and for each + incoming bit, x^32 is added mod p to the register if the bit is a one (where + x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by + x (which is shifting right by one and adding x^32 mod p if the bit shifted + out is a one). We start with the highest power (least significant bit) of + q and repeat for all eight bits of q. + + The first table is simply the CRC of all possible eight bit values. This is + all the information needed to generate CRCs on data a byte at a time for all + combinations of CRC register values and incoming bytes. The remaining tables + allow for word-at-a-time CRC calculation for both big-endian and little- + endian machines, where a word is four bytes. +*/ +local void make_crc_table() +{ + unsigned long c; + int n, k; + unsigned long poly; /* polynomial exclusive-or pattern */ + /* terms of polynomial defining this crc (except x^32): */ + static volatile int first = 1; /* flag to limit concurrent making */ + static const unsigned char p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26}; + + /* See if another task is already doing this (not thread-safe, but better + than nothing -- significantly reduces duration of vulnerability in + case the advice about DYNAMIC_CRC_TABLE is ignored) */ + if (first) { + first = 0; + + /* make exclusive-or pattern from polynomial (0xedb88320UL) */ + poly = 0UL; + for (n = 0; n < sizeof(p)/sizeof(unsigned char); n++) + poly |= 1UL << (31 - p[n]); + + /* generate a crc for every 8-bit value */ + for (n = 0; n < 256; n++) { + c = (unsigned long)n; + for (k = 0; k < 8; k++) + c = c & 1 ? poly ^ (c >> 1) : c >> 1; + crc_table[0][n] = c; + } + +#ifdef BYFOUR + /* generate crc for each value followed by one, two, and three zeros, + and then the byte reversal of those as well as the first table */ + for (n = 0; n < 256; n++) { + c = crc_table[0][n]; + crc_table[4][n] = REV(c); + for (k = 1; k < 4; k++) { + c = crc_table[0][c & 0xff] ^ (c >> 8); + crc_table[k][n] = c; + crc_table[k + 4][n] = REV(c); + } + } +#endif /* BYFOUR */ + + crc_table_empty = 0; + } + else { /* not first */ + /* wait for the other guy to finish (not efficient, but rare) */ + while (crc_table_empty) + ; + } + +#ifdef MAKECRCH + /* write out CRC tables to crc32.h */ + { + FILE *out; + + out = fopen("crc32.h", "w"); + if (out == NULL) return; + fprintf(out, "/* crc32.h -- tables for rapid CRC calculation\n"); + fprintf(out, " * Generated automatically by crc32.c\n */\n\n"); + fprintf(out, "local const unsigned long FAR "); + fprintf(out, "crc_table[TBLS][256] =\n{\n {\n"); + write_table(out, crc_table[0]); +# ifdef BYFOUR + fprintf(out, "#ifdef BYFOUR\n"); + for (k = 1; k < 8; k++) { + fprintf(out, " },\n {\n"); + write_table(out, crc_table[k]); + } + fprintf(out, "#endif\n"); +# endif /* BYFOUR */ + fprintf(out, " }\n};\n"); + fclose(out); + } +#endif /* MAKECRCH */ +} + +#ifdef MAKECRCH +local void write_table(out, table) + FILE *out; + const unsigned long FAR *table; +{ + int n; + + for (n = 0; n < 256; n++) + fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : " ", table[n], + n == 255 ? "\n" : (n % 5 == 4 ? ",\n" : ", ")); +} +#endif /* MAKECRCH */ + +#else /* !DYNAMIC_CRC_TABLE */ +/* ======================================================================== + * Tables of CRC-32s of all single-byte values, made by make_crc_table(). + */ +#include "crc32.h" +#endif /* DYNAMIC_CRC_TABLE */ + +/* ========================================================================= + * This function can be used by asm versions of crc32() + */ +const unsigned long FAR * ZEXPORT get_crc_table() +{ +#ifdef DYNAMIC_CRC_TABLE + if (crc_table_empty) + make_crc_table(); +#endif /* DYNAMIC_CRC_TABLE */ + return (const unsigned long FAR *)crc_table; +} + +/* ========================================================================= */ +#define DO1 crc = crc_table[0][((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8) +#define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1 + +/* ========================================================================= */ +unsigned long ZEXPORT crc32(crc, buf, len) + unsigned long crc; + const unsigned char FAR *buf; + unsigned len; +{ + if (buf == Z_NULL) return 0UL; + +#ifdef DYNAMIC_CRC_TABLE + if (crc_table_empty) + make_crc_table(); +#endif /* DYNAMIC_CRC_TABLE */ + +#ifdef BYFOUR + if (sizeof(void *) == sizeof(ptrdiff_t)) { + u4 endian; + + endian = 1; + if (*((unsigned char *)(&endian))) + return crc32_little(crc, buf, len); + else + return crc32_big(crc, buf, len); + } +#endif /* BYFOUR */ + crc = crc ^ 0xffffffffUL; + while (len >= 8) { + DO8; + len -= 8; + } + if (len) do { + DO1; + } while (--len); + return crc ^ 0xffffffffUL; +} + +#ifdef BYFOUR + +/* ========================================================================= */ +#define DOLIT4 c ^= *buf4++; \ + c = crc_table[3][c & 0xff] ^ crc_table[2][(c >> 8) & 0xff] ^ \ + crc_table[1][(c >> 16) & 0xff] ^ crc_table[0][c >> 24] +#define DOLIT32 DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4 + +/* ========================================================================= */ +local unsigned long crc32_little(crc, buf, len) + unsigned long crc; + const unsigned char FAR *buf; + unsigned len; +{ + register u4 c; + register const u4 FAR *buf4; + + c = (u4)crc; + c = ~c; + while (len && ((ptrdiff_t)buf & 3)) { + c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); + len--; + } + + buf4 = (const u4 FAR *)(const void FAR *)buf; + while (len >= 32) { + DOLIT32; + len -= 32; + } + while (len >= 4) { + DOLIT4; + len -= 4; + } + buf = (const unsigned char FAR *)buf4; + + if (len) do { + c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); + } while (--len); + c = ~c; + return (unsigned long)c; +} + +/* ========================================================================= */ +#define DOBIG4 c ^= *++buf4; \ + c = crc_table[4][c & 0xff] ^ crc_table[5][(c >> 8) & 0xff] ^ \ + crc_table[6][(c >> 16) & 0xff] ^ crc_table[7][c >> 24] +#define DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4 + +/* ========================================================================= */ +local unsigned long crc32_big(crc, buf, len) + unsigned long crc; + const unsigned char FAR *buf; + unsigned len; +{ + register u4 c; + register const u4 FAR *buf4; + + c = REV((u4)crc); + c = ~c; + while (len && ((ptrdiff_t)buf & 3)) { + c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); + len--; + } + + buf4 = (const u4 FAR *)(const void FAR *)buf; + buf4--; + while (len >= 32) { + DOBIG32; + len -= 32; + } + while (len >= 4) { + DOBIG4; + len -= 4; + } + buf4++; + buf = (const unsigned char FAR *)buf4; + + if (len) do { + c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); + } while (--len); + c = ~c; + return (unsigned long)(REV(c)); +} + +#endif /* BYFOUR */ + +#define GF2_DIM 32 /* dimension of GF(2) vectors (length of CRC) */ + +/* ========================================================================= */ +local unsigned long gf2_matrix_times(mat, vec) + unsigned long *mat; + unsigned long vec; +{ + unsigned long sum; + + sum = 0; + while (vec) { + if (vec & 1) + sum ^= *mat; + vec >>= 1; + mat++; + } + return sum; +} + +/* ========================================================================= */ +local void gf2_matrix_square(square, mat) + unsigned long *square; + unsigned long *mat; +{ + int n; + + for (n = 0; n < GF2_DIM; n++) + square[n] = gf2_matrix_times(mat, mat[n]); +} + +/* ========================================================================= */ +uLong ZEXPORT crc32_combine(crc1, crc2, len2) + uLong crc1; + uLong crc2; + z_off_t len2; +{ + int n; + unsigned long row; + unsigned long even[GF2_DIM]; /* even-power-of-two zeros operator */ + unsigned long odd[GF2_DIM]; /* odd-power-of-two zeros operator */ + + /* degenerate case */ + if (len2 == 0) + return crc1; + + /* put operator for one zero bit in odd */ + odd[0] = 0xedb88320L; /* CRC-32 polynomial */ + row = 1; + for (n = 1; n < GF2_DIM; n++) { + odd[n] = row; + row <<= 1; + } + + /* put operator for two zero bits in even */ + gf2_matrix_square(even, odd); + + /* put operator for four zero bits in odd */ + gf2_matrix_square(odd, even); + + /* apply len2 zeros to crc1 (first square will put the operator for one + zero byte, eight zero bits, in even) */ + do { + /* apply zeros operator for this bit of len2 */ + gf2_matrix_square(even, odd); + if (len2 & 1) + crc1 = gf2_matrix_times(even, crc1); + len2 >>= 1; + + /* if no more bits set, then done */ + if (len2 == 0) + break; + + /* another iteration of the loop with odd and even swapped */ + gf2_matrix_square(odd, even); + if (len2 & 1) + crc1 = gf2_matrix_times(odd, crc1); + len2 >>= 1; + + /* if no more bits set, then done */ + } while (len2 != 0); + + /* return combined crc */ + crc1 ^= crc2; + return crc1; +} diff --git a/tools/bsnes/lib/zlib/crc32.h b/tools/bsnes/lib/zlib/crc32.h new file mode 100755 index 0000000..8053b61 --- /dev/null +++ b/tools/bsnes/lib/zlib/crc32.h @@ -0,0 +1,441 @@ +/* crc32.h -- tables for rapid CRC calculation + * Generated automatically by crc32.c + */ + +local const unsigned long FAR crc_table[TBLS][256] = +{ + { + 0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL, + 0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL, + 0xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL, + 0x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL, + 0x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL, + 0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL, + 0xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL, + 0xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL, + 0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL, + 0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL, + 0xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL, + 0xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL, + 0x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL, + 0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL, + 0x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL, + 0xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL, + 0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL, + 0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL, + 0x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL, + 0xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL, + 0x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL, + 0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL, + 0xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL, + 0xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL, + 0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL, + 0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL, + 0x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL, + 0x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL, + 0xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL, + 0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL, + 0x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL, + 0x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL, + 0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL, + 0xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL, + 0x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL, + 0x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL, + 0xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL, + 0xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL, + 0x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL, + 0x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL, + 0x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL, + 0xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL, + 0x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL, + 0x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL, + 0x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL, + 0xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL, + 0x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL, + 0x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL, + 0xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL, + 0xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL, + 0x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL, + 0x2d02ef8dUL +#ifdef BYFOUR + }, + { + 0x00000000UL, 0x191b3141UL, 0x32366282UL, 0x2b2d53c3UL, 0x646cc504UL, + 0x7d77f445UL, 0x565aa786UL, 0x4f4196c7UL, 0xc8d98a08UL, 0xd1c2bb49UL, + 0xfaefe88aUL, 0xe3f4d9cbUL, 0xacb54f0cUL, 0xb5ae7e4dUL, 0x9e832d8eUL, + 0x87981ccfUL, 0x4ac21251UL, 0x53d92310UL, 0x78f470d3UL, 0x61ef4192UL, + 0x2eaed755UL, 0x37b5e614UL, 0x1c98b5d7UL, 0x05838496UL, 0x821b9859UL, + 0x9b00a918UL, 0xb02dfadbUL, 0xa936cb9aUL, 0xe6775d5dUL, 0xff6c6c1cUL, + 0xd4413fdfUL, 0xcd5a0e9eUL, 0x958424a2UL, 0x8c9f15e3UL, 0xa7b24620UL, + 0xbea97761UL, 0xf1e8e1a6UL, 0xe8f3d0e7UL, 0xc3de8324UL, 0xdac5b265UL, + 0x5d5daeaaUL, 0x44469febUL, 0x6f6bcc28UL, 0x7670fd69UL, 0x39316baeUL, + 0x202a5aefUL, 0x0b07092cUL, 0x121c386dUL, 0xdf4636f3UL, 0xc65d07b2UL, + 0xed705471UL, 0xf46b6530UL, 0xbb2af3f7UL, 0xa231c2b6UL, 0x891c9175UL, + 0x9007a034UL, 0x179fbcfbUL, 0x0e848dbaUL, 0x25a9de79UL, 0x3cb2ef38UL, + 0x73f379ffUL, 0x6ae848beUL, 0x41c51b7dUL, 0x58de2a3cUL, 0xf0794f05UL, + 0xe9627e44UL, 0xc24f2d87UL, 0xdb541cc6UL, 0x94158a01UL, 0x8d0ebb40UL, + 0xa623e883UL, 0xbf38d9c2UL, 0x38a0c50dUL, 0x21bbf44cUL, 0x0a96a78fUL, + 0x138d96ceUL, 0x5ccc0009UL, 0x45d73148UL, 0x6efa628bUL, 0x77e153caUL, + 0xbabb5d54UL, 0xa3a06c15UL, 0x888d3fd6UL, 0x91960e97UL, 0xded79850UL, + 0xc7cca911UL, 0xece1fad2UL, 0xf5facb93UL, 0x7262d75cUL, 0x6b79e61dUL, + 0x4054b5deUL, 0x594f849fUL, 0x160e1258UL, 0x0f152319UL, 0x243870daUL, + 0x3d23419bUL, 0x65fd6ba7UL, 0x7ce65ae6UL, 0x57cb0925UL, 0x4ed03864UL, + 0x0191aea3UL, 0x188a9fe2UL, 0x33a7cc21UL, 0x2abcfd60UL, 0xad24e1afUL, + 0xb43fd0eeUL, 0x9f12832dUL, 0x8609b26cUL, 0xc94824abUL, 0xd05315eaUL, + 0xfb7e4629UL, 0xe2657768UL, 0x2f3f79f6UL, 0x362448b7UL, 0x1d091b74UL, + 0x04122a35UL, 0x4b53bcf2UL, 0x52488db3UL, 0x7965de70UL, 0x607eef31UL, + 0xe7e6f3feUL, 0xfefdc2bfUL, 0xd5d0917cUL, 0xcccba03dUL, 0x838a36faUL, + 0x9a9107bbUL, 0xb1bc5478UL, 0xa8a76539UL, 0x3b83984bUL, 0x2298a90aUL, + 0x09b5fac9UL, 0x10aecb88UL, 0x5fef5d4fUL, 0x46f46c0eUL, 0x6dd93fcdUL, + 0x74c20e8cUL, 0xf35a1243UL, 0xea412302UL, 0xc16c70c1UL, 0xd8774180UL, + 0x9736d747UL, 0x8e2de606UL, 0xa500b5c5UL, 0xbc1b8484UL, 0x71418a1aUL, + 0x685abb5bUL, 0x4377e898UL, 0x5a6cd9d9UL, 0x152d4f1eUL, 0x0c367e5fUL, + 0x271b2d9cUL, 0x3e001cddUL, 0xb9980012UL, 0xa0833153UL, 0x8bae6290UL, + 0x92b553d1UL, 0xddf4c516UL, 0xc4eff457UL, 0xefc2a794UL, 0xf6d996d5UL, + 0xae07bce9UL, 0xb71c8da8UL, 0x9c31de6bUL, 0x852aef2aUL, 0xca6b79edUL, + 0xd37048acUL, 0xf85d1b6fUL, 0xe1462a2eUL, 0x66de36e1UL, 0x7fc507a0UL, + 0x54e85463UL, 0x4df36522UL, 0x02b2f3e5UL, 0x1ba9c2a4UL, 0x30849167UL, + 0x299fa026UL, 0xe4c5aeb8UL, 0xfdde9ff9UL, 0xd6f3cc3aUL, 0xcfe8fd7bUL, + 0x80a96bbcUL, 0x99b25afdUL, 0xb29f093eUL, 0xab84387fUL, 0x2c1c24b0UL, + 0x350715f1UL, 0x1e2a4632UL, 0x07317773UL, 0x4870e1b4UL, 0x516bd0f5UL, + 0x7a468336UL, 0x635db277UL, 0xcbfad74eUL, 0xd2e1e60fUL, 0xf9ccb5ccUL, + 0xe0d7848dUL, 0xaf96124aUL, 0xb68d230bUL, 0x9da070c8UL, 0x84bb4189UL, + 0x03235d46UL, 0x1a386c07UL, 0x31153fc4UL, 0x280e0e85UL, 0x674f9842UL, + 0x7e54a903UL, 0x5579fac0UL, 0x4c62cb81UL, 0x8138c51fUL, 0x9823f45eUL, + 0xb30ea79dUL, 0xaa1596dcUL, 0xe554001bUL, 0xfc4f315aUL, 0xd7626299UL, + 0xce7953d8UL, 0x49e14f17UL, 0x50fa7e56UL, 0x7bd72d95UL, 0x62cc1cd4UL, + 0x2d8d8a13UL, 0x3496bb52UL, 0x1fbbe891UL, 0x06a0d9d0UL, 0x5e7ef3ecUL, + 0x4765c2adUL, 0x6c48916eUL, 0x7553a02fUL, 0x3a1236e8UL, 0x230907a9UL, + 0x0824546aUL, 0x113f652bUL, 0x96a779e4UL, 0x8fbc48a5UL, 0xa4911b66UL, + 0xbd8a2a27UL, 0xf2cbbce0UL, 0xebd08da1UL, 0xc0fdde62UL, 0xd9e6ef23UL, + 0x14bce1bdUL, 0x0da7d0fcUL, 0x268a833fUL, 0x3f91b27eUL, 0x70d024b9UL, + 0x69cb15f8UL, 0x42e6463bUL, 0x5bfd777aUL, 0xdc656bb5UL, 0xc57e5af4UL, + 0xee530937UL, 0xf7483876UL, 0xb809aeb1UL, 0xa1129ff0UL, 0x8a3fcc33UL, + 0x9324fd72UL + }, + { + 0x00000000UL, 0x01c26a37UL, 0x0384d46eUL, 0x0246be59UL, 0x0709a8dcUL, + 0x06cbc2ebUL, 0x048d7cb2UL, 0x054f1685UL, 0x0e1351b8UL, 0x0fd13b8fUL, + 0x0d9785d6UL, 0x0c55efe1UL, 0x091af964UL, 0x08d89353UL, 0x0a9e2d0aUL, + 0x0b5c473dUL, 0x1c26a370UL, 0x1de4c947UL, 0x1fa2771eUL, 0x1e601d29UL, + 0x1b2f0bacUL, 0x1aed619bUL, 0x18abdfc2UL, 0x1969b5f5UL, 0x1235f2c8UL, + 0x13f798ffUL, 0x11b126a6UL, 0x10734c91UL, 0x153c5a14UL, 0x14fe3023UL, + 0x16b88e7aUL, 0x177ae44dUL, 0x384d46e0UL, 0x398f2cd7UL, 0x3bc9928eUL, + 0x3a0bf8b9UL, 0x3f44ee3cUL, 0x3e86840bUL, 0x3cc03a52UL, 0x3d025065UL, + 0x365e1758UL, 0x379c7d6fUL, 0x35dac336UL, 0x3418a901UL, 0x3157bf84UL, + 0x3095d5b3UL, 0x32d36beaUL, 0x331101ddUL, 0x246be590UL, 0x25a98fa7UL, + 0x27ef31feUL, 0x262d5bc9UL, 0x23624d4cUL, 0x22a0277bUL, 0x20e69922UL, + 0x2124f315UL, 0x2a78b428UL, 0x2bbade1fUL, 0x29fc6046UL, 0x283e0a71UL, + 0x2d711cf4UL, 0x2cb376c3UL, 0x2ef5c89aUL, 0x2f37a2adUL, 0x709a8dc0UL, + 0x7158e7f7UL, 0x731e59aeUL, 0x72dc3399UL, 0x7793251cUL, 0x76514f2bUL, + 0x7417f172UL, 0x75d59b45UL, 0x7e89dc78UL, 0x7f4bb64fUL, 0x7d0d0816UL, + 0x7ccf6221UL, 0x798074a4UL, 0x78421e93UL, 0x7a04a0caUL, 0x7bc6cafdUL, + 0x6cbc2eb0UL, 0x6d7e4487UL, 0x6f38fadeUL, 0x6efa90e9UL, 0x6bb5866cUL, + 0x6a77ec5bUL, 0x68315202UL, 0x69f33835UL, 0x62af7f08UL, 0x636d153fUL, + 0x612bab66UL, 0x60e9c151UL, 0x65a6d7d4UL, 0x6464bde3UL, 0x662203baUL, + 0x67e0698dUL, 0x48d7cb20UL, 0x4915a117UL, 0x4b531f4eUL, 0x4a917579UL, + 0x4fde63fcUL, 0x4e1c09cbUL, 0x4c5ab792UL, 0x4d98dda5UL, 0x46c49a98UL, + 0x4706f0afUL, 0x45404ef6UL, 0x448224c1UL, 0x41cd3244UL, 0x400f5873UL, + 0x4249e62aUL, 0x438b8c1dUL, 0x54f16850UL, 0x55330267UL, 0x5775bc3eUL, + 0x56b7d609UL, 0x53f8c08cUL, 0x523aaabbUL, 0x507c14e2UL, 0x51be7ed5UL, + 0x5ae239e8UL, 0x5b2053dfUL, 0x5966ed86UL, 0x58a487b1UL, 0x5deb9134UL, + 0x5c29fb03UL, 0x5e6f455aUL, 0x5fad2f6dUL, 0xe1351b80UL, 0xe0f771b7UL, + 0xe2b1cfeeUL, 0xe373a5d9UL, 0xe63cb35cUL, 0xe7fed96bUL, 0xe5b86732UL, + 0xe47a0d05UL, 0xef264a38UL, 0xeee4200fUL, 0xeca29e56UL, 0xed60f461UL, + 0xe82fe2e4UL, 0xe9ed88d3UL, 0xebab368aUL, 0xea695cbdUL, 0xfd13b8f0UL, + 0xfcd1d2c7UL, 0xfe976c9eUL, 0xff5506a9UL, 0xfa1a102cUL, 0xfbd87a1bUL, + 0xf99ec442UL, 0xf85cae75UL, 0xf300e948UL, 0xf2c2837fUL, 0xf0843d26UL, + 0xf1465711UL, 0xf4094194UL, 0xf5cb2ba3UL, 0xf78d95faUL, 0xf64fffcdUL, + 0xd9785d60UL, 0xd8ba3757UL, 0xdafc890eUL, 0xdb3ee339UL, 0xde71f5bcUL, + 0xdfb39f8bUL, 0xddf521d2UL, 0xdc374be5UL, 0xd76b0cd8UL, 0xd6a966efUL, + 0xd4efd8b6UL, 0xd52db281UL, 0xd062a404UL, 0xd1a0ce33UL, 0xd3e6706aUL, + 0xd2241a5dUL, 0xc55efe10UL, 0xc49c9427UL, 0xc6da2a7eUL, 0xc7184049UL, + 0xc25756ccUL, 0xc3953cfbUL, 0xc1d382a2UL, 0xc011e895UL, 0xcb4dafa8UL, + 0xca8fc59fUL, 0xc8c97bc6UL, 0xc90b11f1UL, 0xcc440774UL, 0xcd866d43UL, + 0xcfc0d31aUL, 0xce02b92dUL, 0x91af9640UL, 0x906dfc77UL, 0x922b422eUL, + 0x93e92819UL, 0x96a63e9cUL, 0x976454abUL, 0x9522eaf2UL, 0x94e080c5UL, + 0x9fbcc7f8UL, 0x9e7eadcfUL, 0x9c381396UL, 0x9dfa79a1UL, 0x98b56f24UL, + 0x99770513UL, 0x9b31bb4aUL, 0x9af3d17dUL, 0x8d893530UL, 0x8c4b5f07UL, + 0x8e0de15eUL, 0x8fcf8b69UL, 0x8a809decUL, 0x8b42f7dbUL, 0x89044982UL, + 0x88c623b5UL, 0x839a6488UL, 0x82580ebfUL, 0x801eb0e6UL, 0x81dcdad1UL, + 0x8493cc54UL, 0x8551a663UL, 0x8717183aUL, 0x86d5720dUL, 0xa9e2d0a0UL, + 0xa820ba97UL, 0xaa6604ceUL, 0xaba46ef9UL, 0xaeeb787cUL, 0xaf29124bUL, + 0xad6fac12UL, 0xacadc625UL, 0xa7f18118UL, 0xa633eb2fUL, 0xa4755576UL, + 0xa5b73f41UL, 0xa0f829c4UL, 0xa13a43f3UL, 0xa37cfdaaUL, 0xa2be979dUL, + 0xb5c473d0UL, 0xb40619e7UL, 0xb640a7beUL, 0xb782cd89UL, 0xb2cddb0cUL, + 0xb30fb13bUL, 0xb1490f62UL, 0xb08b6555UL, 0xbbd72268UL, 0xba15485fUL, + 0xb853f606UL, 0xb9919c31UL, 0xbcde8ab4UL, 0xbd1ce083UL, 0xbf5a5edaUL, + 0xbe9834edUL + }, + { + 0x00000000UL, 0xb8bc6765UL, 0xaa09c88bUL, 0x12b5afeeUL, 0x8f629757UL, + 0x37def032UL, 0x256b5fdcUL, 0x9dd738b9UL, 0xc5b428efUL, 0x7d084f8aUL, + 0x6fbde064UL, 0xd7018701UL, 0x4ad6bfb8UL, 0xf26ad8ddUL, 0xe0df7733UL, + 0x58631056UL, 0x5019579fUL, 0xe8a530faUL, 0xfa109f14UL, 0x42acf871UL, + 0xdf7bc0c8UL, 0x67c7a7adUL, 0x75720843UL, 0xcdce6f26UL, 0x95ad7f70UL, + 0x2d111815UL, 0x3fa4b7fbUL, 0x8718d09eUL, 0x1acfe827UL, 0xa2738f42UL, + 0xb0c620acUL, 0x087a47c9UL, 0xa032af3eUL, 0x188ec85bUL, 0x0a3b67b5UL, + 0xb28700d0UL, 0x2f503869UL, 0x97ec5f0cUL, 0x8559f0e2UL, 0x3de59787UL, + 0x658687d1UL, 0xdd3ae0b4UL, 0xcf8f4f5aUL, 0x7733283fUL, 0xeae41086UL, + 0x525877e3UL, 0x40edd80dUL, 0xf851bf68UL, 0xf02bf8a1UL, 0x48979fc4UL, + 0x5a22302aUL, 0xe29e574fUL, 0x7f496ff6UL, 0xc7f50893UL, 0xd540a77dUL, + 0x6dfcc018UL, 0x359fd04eUL, 0x8d23b72bUL, 0x9f9618c5UL, 0x272a7fa0UL, + 0xbafd4719UL, 0x0241207cUL, 0x10f48f92UL, 0xa848e8f7UL, 0x9b14583dUL, + 0x23a83f58UL, 0x311d90b6UL, 0x89a1f7d3UL, 0x1476cf6aUL, 0xaccaa80fUL, + 0xbe7f07e1UL, 0x06c36084UL, 0x5ea070d2UL, 0xe61c17b7UL, 0xf4a9b859UL, + 0x4c15df3cUL, 0xd1c2e785UL, 0x697e80e0UL, 0x7bcb2f0eUL, 0xc377486bUL, + 0xcb0d0fa2UL, 0x73b168c7UL, 0x6104c729UL, 0xd9b8a04cUL, 0x446f98f5UL, + 0xfcd3ff90UL, 0xee66507eUL, 0x56da371bUL, 0x0eb9274dUL, 0xb6054028UL, + 0xa4b0efc6UL, 0x1c0c88a3UL, 0x81dbb01aUL, 0x3967d77fUL, 0x2bd27891UL, + 0x936e1ff4UL, 0x3b26f703UL, 0x839a9066UL, 0x912f3f88UL, 0x299358edUL, + 0xb4446054UL, 0x0cf80731UL, 0x1e4da8dfUL, 0xa6f1cfbaUL, 0xfe92dfecUL, + 0x462eb889UL, 0x549b1767UL, 0xec277002UL, 0x71f048bbUL, 0xc94c2fdeUL, + 0xdbf98030UL, 0x6345e755UL, 0x6b3fa09cUL, 0xd383c7f9UL, 0xc1366817UL, + 0x798a0f72UL, 0xe45d37cbUL, 0x5ce150aeUL, 0x4e54ff40UL, 0xf6e89825UL, + 0xae8b8873UL, 0x1637ef16UL, 0x048240f8UL, 0xbc3e279dUL, 0x21e91f24UL, + 0x99557841UL, 0x8be0d7afUL, 0x335cb0caUL, 0xed59b63bUL, 0x55e5d15eUL, + 0x47507eb0UL, 0xffec19d5UL, 0x623b216cUL, 0xda874609UL, 0xc832e9e7UL, + 0x708e8e82UL, 0x28ed9ed4UL, 0x9051f9b1UL, 0x82e4565fUL, 0x3a58313aUL, + 0xa78f0983UL, 0x1f336ee6UL, 0x0d86c108UL, 0xb53aa66dUL, 0xbd40e1a4UL, + 0x05fc86c1UL, 0x1749292fUL, 0xaff54e4aUL, 0x322276f3UL, 0x8a9e1196UL, + 0x982bbe78UL, 0x2097d91dUL, 0x78f4c94bUL, 0xc048ae2eUL, 0xd2fd01c0UL, + 0x6a4166a5UL, 0xf7965e1cUL, 0x4f2a3979UL, 0x5d9f9697UL, 0xe523f1f2UL, + 0x4d6b1905UL, 0xf5d77e60UL, 0xe762d18eUL, 0x5fdeb6ebUL, 0xc2098e52UL, + 0x7ab5e937UL, 0x680046d9UL, 0xd0bc21bcUL, 0x88df31eaUL, 0x3063568fUL, + 0x22d6f961UL, 0x9a6a9e04UL, 0x07bda6bdUL, 0xbf01c1d8UL, 0xadb46e36UL, + 0x15080953UL, 0x1d724e9aUL, 0xa5ce29ffUL, 0xb77b8611UL, 0x0fc7e174UL, + 0x9210d9cdUL, 0x2aacbea8UL, 0x38191146UL, 0x80a57623UL, 0xd8c66675UL, + 0x607a0110UL, 0x72cfaefeUL, 0xca73c99bUL, 0x57a4f122UL, 0xef189647UL, + 0xfdad39a9UL, 0x45115eccUL, 0x764dee06UL, 0xcef18963UL, 0xdc44268dUL, + 0x64f841e8UL, 0xf92f7951UL, 0x41931e34UL, 0x5326b1daUL, 0xeb9ad6bfUL, + 0xb3f9c6e9UL, 0x0b45a18cUL, 0x19f00e62UL, 0xa14c6907UL, 0x3c9b51beUL, + 0x842736dbUL, 0x96929935UL, 0x2e2efe50UL, 0x2654b999UL, 0x9ee8defcUL, + 0x8c5d7112UL, 0x34e11677UL, 0xa9362eceUL, 0x118a49abUL, 0x033fe645UL, + 0xbb838120UL, 0xe3e09176UL, 0x5b5cf613UL, 0x49e959fdUL, 0xf1553e98UL, + 0x6c820621UL, 0xd43e6144UL, 0xc68bceaaUL, 0x7e37a9cfUL, 0xd67f4138UL, + 0x6ec3265dUL, 0x7c7689b3UL, 0xc4caeed6UL, 0x591dd66fUL, 0xe1a1b10aUL, + 0xf3141ee4UL, 0x4ba87981UL, 0x13cb69d7UL, 0xab770eb2UL, 0xb9c2a15cUL, + 0x017ec639UL, 0x9ca9fe80UL, 0x241599e5UL, 0x36a0360bUL, 0x8e1c516eUL, + 0x866616a7UL, 0x3eda71c2UL, 0x2c6fde2cUL, 0x94d3b949UL, 0x090481f0UL, + 0xb1b8e695UL, 0xa30d497bUL, 0x1bb12e1eUL, 0x43d23e48UL, 0xfb6e592dUL, + 0xe9dbf6c3UL, 0x516791a6UL, 0xccb0a91fUL, 0x740cce7aUL, 0x66b96194UL, + 0xde0506f1UL + }, + { + 0x00000000UL, 0x96300777UL, 0x2c610eeeUL, 0xba510999UL, 0x19c46d07UL, + 0x8ff46a70UL, 0x35a563e9UL, 0xa395649eUL, 0x3288db0eUL, 0xa4b8dc79UL, + 0x1ee9d5e0UL, 0x88d9d297UL, 0x2b4cb609UL, 0xbd7cb17eUL, 0x072db8e7UL, + 0x911dbf90UL, 0x6410b71dUL, 0xf220b06aUL, 0x4871b9f3UL, 0xde41be84UL, + 0x7dd4da1aUL, 0xebe4dd6dUL, 0x51b5d4f4UL, 0xc785d383UL, 0x56986c13UL, + 0xc0a86b64UL, 0x7af962fdUL, 0xecc9658aUL, 0x4f5c0114UL, 0xd96c0663UL, + 0x633d0ffaUL, 0xf50d088dUL, 0xc8206e3bUL, 0x5e10694cUL, 0xe44160d5UL, + 0x727167a2UL, 0xd1e4033cUL, 0x47d4044bUL, 0xfd850dd2UL, 0x6bb50aa5UL, + 0xfaa8b535UL, 0x6c98b242UL, 0xd6c9bbdbUL, 0x40f9bcacUL, 0xe36cd832UL, + 0x755cdf45UL, 0xcf0dd6dcUL, 0x593dd1abUL, 0xac30d926UL, 0x3a00de51UL, + 0x8051d7c8UL, 0x1661d0bfUL, 0xb5f4b421UL, 0x23c4b356UL, 0x9995bacfUL, + 0x0fa5bdb8UL, 0x9eb80228UL, 0x0888055fUL, 0xb2d90cc6UL, 0x24e90bb1UL, + 0x877c6f2fUL, 0x114c6858UL, 0xab1d61c1UL, 0x3d2d66b6UL, 0x9041dc76UL, + 0x0671db01UL, 0xbc20d298UL, 0x2a10d5efUL, 0x8985b171UL, 0x1fb5b606UL, + 0xa5e4bf9fUL, 0x33d4b8e8UL, 0xa2c90778UL, 0x34f9000fUL, 0x8ea80996UL, + 0x18980ee1UL, 0xbb0d6a7fUL, 0x2d3d6d08UL, 0x976c6491UL, 0x015c63e6UL, + 0xf4516b6bUL, 0x62616c1cUL, 0xd8306585UL, 0x4e0062f2UL, 0xed95066cUL, + 0x7ba5011bUL, 0xc1f40882UL, 0x57c40ff5UL, 0xc6d9b065UL, 0x50e9b712UL, + 0xeab8be8bUL, 0x7c88b9fcUL, 0xdf1ddd62UL, 0x492dda15UL, 0xf37cd38cUL, + 0x654cd4fbUL, 0x5861b24dUL, 0xce51b53aUL, 0x7400bca3UL, 0xe230bbd4UL, + 0x41a5df4aUL, 0xd795d83dUL, 0x6dc4d1a4UL, 0xfbf4d6d3UL, 0x6ae96943UL, + 0xfcd96e34UL, 0x468867adUL, 0xd0b860daUL, 0x732d0444UL, 0xe51d0333UL, + 0x5f4c0aaaUL, 0xc97c0dddUL, 0x3c710550UL, 0xaa410227UL, 0x10100bbeUL, + 0x86200cc9UL, 0x25b56857UL, 0xb3856f20UL, 0x09d466b9UL, 0x9fe461ceUL, + 0x0ef9de5eUL, 0x98c9d929UL, 0x2298d0b0UL, 0xb4a8d7c7UL, 0x173db359UL, + 0x810db42eUL, 0x3b5cbdb7UL, 0xad6cbac0UL, 0x2083b8edUL, 0xb6b3bf9aUL, + 0x0ce2b603UL, 0x9ad2b174UL, 0x3947d5eaUL, 0xaf77d29dUL, 0x1526db04UL, + 0x8316dc73UL, 0x120b63e3UL, 0x843b6494UL, 0x3e6a6d0dUL, 0xa85a6a7aUL, + 0x0bcf0ee4UL, 0x9dff0993UL, 0x27ae000aUL, 0xb19e077dUL, 0x44930ff0UL, + 0xd2a30887UL, 0x68f2011eUL, 0xfec20669UL, 0x5d5762f7UL, 0xcb676580UL, + 0x71366c19UL, 0xe7066b6eUL, 0x761bd4feUL, 0xe02bd389UL, 0x5a7ada10UL, + 0xcc4add67UL, 0x6fdfb9f9UL, 0xf9efbe8eUL, 0x43beb717UL, 0xd58eb060UL, + 0xe8a3d6d6UL, 0x7e93d1a1UL, 0xc4c2d838UL, 0x52f2df4fUL, 0xf167bbd1UL, + 0x6757bca6UL, 0xdd06b53fUL, 0x4b36b248UL, 0xda2b0dd8UL, 0x4c1b0aafUL, + 0xf64a0336UL, 0x607a0441UL, 0xc3ef60dfUL, 0x55df67a8UL, 0xef8e6e31UL, + 0x79be6946UL, 0x8cb361cbUL, 0x1a8366bcUL, 0xa0d26f25UL, 0x36e26852UL, + 0x95770cccUL, 0x03470bbbUL, 0xb9160222UL, 0x2f260555UL, 0xbe3bbac5UL, + 0x280bbdb2UL, 0x925ab42bUL, 0x046ab35cUL, 0xa7ffd7c2UL, 0x31cfd0b5UL, + 0x8b9ed92cUL, 0x1daede5bUL, 0xb0c2649bUL, 0x26f263ecUL, 0x9ca36a75UL, + 0x0a936d02UL, 0xa906099cUL, 0x3f360eebUL, 0x85670772UL, 0x13570005UL, + 0x824abf95UL, 0x147ab8e2UL, 0xae2bb17bUL, 0x381bb60cUL, 0x9b8ed292UL, + 0x0dbed5e5UL, 0xb7efdc7cUL, 0x21dfdb0bUL, 0xd4d2d386UL, 0x42e2d4f1UL, + 0xf8b3dd68UL, 0x6e83da1fUL, 0xcd16be81UL, 0x5b26b9f6UL, 0xe177b06fUL, + 0x7747b718UL, 0xe65a0888UL, 0x706a0fffUL, 0xca3b0666UL, 0x5c0b0111UL, + 0xff9e658fUL, 0x69ae62f8UL, 0xd3ff6b61UL, 0x45cf6c16UL, 0x78e20aa0UL, + 0xeed20dd7UL, 0x5483044eUL, 0xc2b30339UL, 0x612667a7UL, 0xf71660d0UL, + 0x4d476949UL, 0xdb776e3eUL, 0x4a6ad1aeUL, 0xdc5ad6d9UL, 0x660bdf40UL, + 0xf03bd837UL, 0x53aebca9UL, 0xc59ebbdeUL, 0x7fcfb247UL, 0xe9ffb530UL, + 0x1cf2bdbdUL, 0x8ac2bacaUL, 0x3093b353UL, 0xa6a3b424UL, 0x0536d0baUL, + 0x9306d7cdUL, 0x2957de54UL, 0xbf67d923UL, 0x2e7a66b3UL, 0xb84a61c4UL, + 0x021b685dUL, 0x942b6f2aUL, 0x37be0bb4UL, 0xa18e0cc3UL, 0x1bdf055aUL, + 0x8def022dUL + }, + { + 0x00000000UL, 0x41311b19UL, 0x82623632UL, 0xc3532d2bUL, 0x04c56c64UL, + 0x45f4777dUL, 0x86a75a56UL, 0xc796414fUL, 0x088ad9c8UL, 0x49bbc2d1UL, + 0x8ae8effaUL, 0xcbd9f4e3UL, 0x0c4fb5acUL, 0x4d7eaeb5UL, 0x8e2d839eUL, + 0xcf1c9887UL, 0x5112c24aUL, 0x1023d953UL, 0xd370f478UL, 0x9241ef61UL, + 0x55d7ae2eUL, 0x14e6b537UL, 0xd7b5981cUL, 0x96848305UL, 0x59981b82UL, + 0x18a9009bUL, 0xdbfa2db0UL, 0x9acb36a9UL, 0x5d5d77e6UL, 0x1c6c6cffUL, + 0xdf3f41d4UL, 0x9e0e5acdUL, 0xa2248495UL, 0xe3159f8cUL, 0x2046b2a7UL, + 0x6177a9beUL, 0xa6e1e8f1UL, 0xe7d0f3e8UL, 0x2483dec3UL, 0x65b2c5daUL, + 0xaaae5d5dUL, 0xeb9f4644UL, 0x28cc6b6fUL, 0x69fd7076UL, 0xae6b3139UL, + 0xef5a2a20UL, 0x2c09070bUL, 0x6d381c12UL, 0xf33646dfUL, 0xb2075dc6UL, + 0x715470edUL, 0x30656bf4UL, 0xf7f32abbUL, 0xb6c231a2UL, 0x75911c89UL, + 0x34a00790UL, 0xfbbc9f17UL, 0xba8d840eUL, 0x79dea925UL, 0x38efb23cUL, + 0xff79f373UL, 0xbe48e86aUL, 0x7d1bc541UL, 0x3c2ade58UL, 0x054f79f0UL, + 0x447e62e9UL, 0x872d4fc2UL, 0xc61c54dbUL, 0x018a1594UL, 0x40bb0e8dUL, + 0x83e823a6UL, 0xc2d938bfUL, 0x0dc5a038UL, 0x4cf4bb21UL, 0x8fa7960aUL, + 0xce968d13UL, 0x0900cc5cUL, 0x4831d745UL, 0x8b62fa6eUL, 0xca53e177UL, + 0x545dbbbaUL, 0x156ca0a3UL, 0xd63f8d88UL, 0x970e9691UL, 0x5098d7deUL, + 0x11a9ccc7UL, 0xd2fae1ecUL, 0x93cbfaf5UL, 0x5cd76272UL, 0x1de6796bUL, + 0xdeb55440UL, 0x9f844f59UL, 0x58120e16UL, 0x1923150fUL, 0xda703824UL, + 0x9b41233dUL, 0xa76bfd65UL, 0xe65ae67cUL, 0x2509cb57UL, 0x6438d04eUL, + 0xa3ae9101UL, 0xe29f8a18UL, 0x21cca733UL, 0x60fdbc2aUL, 0xafe124adUL, + 0xeed03fb4UL, 0x2d83129fUL, 0x6cb20986UL, 0xab2448c9UL, 0xea1553d0UL, + 0x29467efbUL, 0x687765e2UL, 0xf6793f2fUL, 0xb7482436UL, 0x741b091dUL, + 0x352a1204UL, 0xf2bc534bUL, 0xb38d4852UL, 0x70de6579UL, 0x31ef7e60UL, + 0xfef3e6e7UL, 0xbfc2fdfeUL, 0x7c91d0d5UL, 0x3da0cbccUL, 0xfa368a83UL, + 0xbb07919aUL, 0x7854bcb1UL, 0x3965a7a8UL, 0x4b98833bUL, 0x0aa99822UL, + 0xc9fab509UL, 0x88cbae10UL, 0x4f5def5fUL, 0x0e6cf446UL, 0xcd3fd96dUL, + 0x8c0ec274UL, 0x43125af3UL, 0x022341eaUL, 0xc1706cc1UL, 0x804177d8UL, + 0x47d73697UL, 0x06e62d8eUL, 0xc5b500a5UL, 0x84841bbcUL, 0x1a8a4171UL, + 0x5bbb5a68UL, 0x98e87743UL, 0xd9d96c5aUL, 0x1e4f2d15UL, 0x5f7e360cUL, + 0x9c2d1b27UL, 0xdd1c003eUL, 0x120098b9UL, 0x533183a0UL, 0x9062ae8bUL, + 0xd153b592UL, 0x16c5f4ddUL, 0x57f4efc4UL, 0x94a7c2efUL, 0xd596d9f6UL, + 0xe9bc07aeUL, 0xa88d1cb7UL, 0x6bde319cUL, 0x2aef2a85UL, 0xed796bcaUL, + 0xac4870d3UL, 0x6f1b5df8UL, 0x2e2a46e1UL, 0xe136de66UL, 0xa007c57fUL, + 0x6354e854UL, 0x2265f34dUL, 0xe5f3b202UL, 0xa4c2a91bUL, 0x67918430UL, + 0x26a09f29UL, 0xb8aec5e4UL, 0xf99fdefdUL, 0x3accf3d6UL, 0x7bfde8cfUL, + 0xbc6ba980UL, 0xfd5ab299UL, 0x3e099fb2UL, 0x7f3884abUL, 0xb0241c2cUL, + 0xf1150735UL, 0x32462a1eUL, 0x73773107UL, 0xb4e17048UL, 0xf5d06b51UL, + 0x3683467aUL, 0x77b25d63UL, 0x4ed7facbUL, 0x0fe6e1d2UL, 0xccb5ccf9UL, + 0x8d84d7e0UL, 0x4a1296afUL, 0x0b238db6UL, 0xc870a09dUL, 0x8941bb84UL, + 0x465d2303UL, 0x076c381aUL, 0xc43f1531UL, 0x850e0e28UL, 0x42984f67UL, + 0x03a9547eUL, 0xc0fa7955UL, 0x81cb624cUL, 0x1fc53881UL, 0x5ef42398UL, + 0x9da70eb3UL, 0xdc9615aaUL, 0x1b0054e5UL, 0x5a314ffcUL, 0x996262d7UL, + 0xd85379ceUL, 0x174fe149UL, 0x567efa50UL, 0x952dd77bUL, 0xd41ccc62UL, + 0x138a8d2dUL, 0x52bb9634UL, 0x91e8bb1fUL, 0xd0d9a006UL, 0xecf37e5eUL, + 0xadc26547UL, 0x6e91486cUL, 0x2fa05375UL, 0xe836123aUL, 0xa9070923UL, + 0x6a542408UL, 0x2b653f11UL, 0xe479a796UL, 0xa548bc8fUL, 0x661b91a4UL, + 0x272a8abdUL, 0xe0bccbf2UL, 0xa18dd0ebUL, 0x62defdc0UL, 0x23efe6d9UL, + 0xbde1bc14UL, 0xfcd0a70dUL, 0x3f838a26UL, 0x7eb2913fUL, 0xb924d070UL, + 0xf815cb69UL, 0x3b46e642UL, 0x7a77fd5bUL, 0xb56b65dcUL, 0xf45a7ec5UL, + 0x370953eeUL, 0x763848f7UL, 0xb1ae09b8UL, 0xf09f12a1UL, 0x33cc3f8aUL, + 0x72fd2493UL + }, + { + 0x00000000UL, 0x376ac201UL, 0x6ed48403UL, 0x59be4602UL, 0xdca80907UL, + 0xebc2cb06UL, 0xb27c8d04UL, 0x85164f05UL, 0xb851130eUL, 0x8f3bd10fUL, + 0xd685970dUL, 0xe1ef550cUL, 0x64f91a09UL, 0x5393d808UL, 0x0a2d9e0aUL, + 0x3d475c0bUL, 0x70a3261cUL, 0x47c9e41dUL, 0x1e77a21fUL, 0x291d601eUL, + 0xac0b2f1bUL, 0x9b61ed1aUL, 0xc2dfab18UL, 0xf5b56919UL, 0xc8f23512UL, + 0xff98f713UL, 0xa626b111UL, 0x914c7310UL, 0x145a3c15UL, 0x2330fe14UL, + 0x7a8eb816UL, 0x4de47a17UL, 0xe0464d38UL, 0xd72c8f39UL, 0x8e92c93bUL, + 0xb9f80b3aUL, 0x3cee443fUL, 0x0b84863eUL, 0x523ac03cUL, 0x6550023dUL, + 0x58175e36UL, 0x6f7d9c37UL, 0x36c3da35UL, 0x01a91834UL, 0x84bf5731UL, + 0xb3d59530UL, 0xea6bd332UL, 0xdd011133UL, 0x90e56b24UL, 0xa78fa925UL, + 0xfe31ef27UL, 0xc95b2d26UL, 0x4c4d6223UL, 0x7b27a022UL, 0x2299e620UL, + 0x15f32421UL, 0x28b4782aUL, 0x1fdeba2bUL, 0x4660fc29UL, 0x710a3e28UL, + 0xf41c712dUL, 0xc376b32cUL, 0x9ac8f52eUL, 0xada2372fUL, 0xc08d9a70UL, + 0xf7e75871UL, 0xae591e73UL, 0x9933dc72UL, 0x1c259377UL, 0x2b4f5176UL, + 0x72f11774UL, 0x459bd575UL, 0x78dc897eUL, 0x4fb64b7fUL, 0x16080d7dUL, + 0x2162cf7cUL, 0xa4748079UL, 0x931e4278UL, 0xcaa0047aUL, 0xfdcac67bUL, + 0xb02ebc6cUL, 0x87447e6dUL, 0xdefa386fUL, 0xe990fa6eUL, 0x6c86b56bUL, + 0x5bec776aUL, 0x02523168UL, 0x3538f369UL, 0x087faf62UL, 0x3f156d63UL, + 0x66ab2b61UL, 0x51c1e960UL, 0xd4d7a665UL, 0xe3bd6464UL, 0xba032266UL, + 0x8d69e067UL, 0x20cbd748UL, 0x17a11549UL, 0x4e1f534bUL, 0x7975914aUL, + 0xfc63de4fUL, 0xcb091c4eUL, 0x92b75a4cUL, 0xa5dd984dUL, 0x989ac446UL, + 0xaff00647UL, 0xf64e4045UL, 0xc1248244UL, 0x4432cd41UL, 0x73580f40UL, + 0x2ae64942UL, 0x1d8c8b43UL, 0x5068f154UL, 0x67023355UL, 0x3ebc7557UL, + 0x09d6b756UL, 0x8cc0f853UL, 0xbbaa3a52UL, 0xe2147c50UL, 0xd57ebe51UL, + 0xe839e25aUL, 0xdf53205bUL, 0x86ed6659UL, 0xb187a458UL, 0x3491eb5dUL, + 0x03fb295cUL, 0x5a456f5eUL, 0x6d2fad5fUL, 0x801b35e1UL, 0xb771f7e0UL, + 0xeecfb1e2UL, 0xd9a573e3UL, 0x5cb33ce6UL, 0x6bd9fee7UL, 0x3267b8e5UL, + 0x050d7ae4UL, 0x384a26efUL, 0x0f20e4eeUL, 0x569ea2ecUL, 0x61f460edUL, + 0xe4e22fe8UL, 0xd388ede9UL, 0x8a36abebUL, 0xbd5c69eaUL, 0xf0b813fdUL, + 0xc7d2d1fcUL, 0x9e6c97feUL, 0xa90655ffUL, 0x2c101afaUL, 0x1b7ad8fbUL, + 0x42c49ef9UL, 0x75ae5cf8UL, 0x48e900f3UL, 0x7f83c2f2UL, 0x263d84f0UL, + 0x115746f1UL, 0x944109f4UL, 0xa32bcbf5UL, 0xfa958df7UL, 0xcdff4ff6UL, + 0x605d78d9UL, 0x5737bad8UL, 0x0e89fcdaUL, 0x39e33edbUL, 0xbcf571deUL, + 0x8b9fb3dfUL, 0xd221f5ddUL, 0xe54b37dcUL, 0xd80c6bd7UL, 0xef66a9d6UL, + 0xb6d8efd4UL, 0x81b22dd5UL, 0x04a462d0UL, 0x33cea0d1UL, 0x6a70e6d3UL, + 0x5d1a24d2UL, 0x10fe5ec5UL, 0x27949cc4UL, 0x7e2adac6UL, 0x494018c7UL, + 0xcc5657c2UL, 0xfb3c95c3UL, 0xa282d3c1UL, 0x95e811c0UL, 0xa8af4dcbUL, + 0x9fc58fcaUL, 0xc67bc9c8UL, 0xf1110bc9UL, 0x740744ccUL, 0x436d86cdUL, + 0x1ad3c0cfUL, 0x2db902ceUL, 0x4096af91UL, 0x77fc6d90UL, 0x2e422b92UL, + 0x1928e993UL, 0x9c3ea696UL, 0xab546497UL, 0xf2ea2295UL, 0xc580e094UL, + 0xf8c7bc9fUL, 0xcfad7e9eUL, 0x9613389cUL, 0xa179fa9dUL, 0x246fb598UL, + 0x13057799UL, 0x4abb319bUL, 0x7dd1f39aUL, 0x3035898dUL, 0x075f4b8cUL, + 0x5ee10d8eUL, 0x698bcf8fUL, 0xec9d808aUL, 0xdbf7428bUL, 0x82490489UL, + 0xb523c688UL, 0x88649a83UL, 0xbf0e5882UL, 0xe6b01e80UL, 0xd1dadc81UL, + 0x54cc9384UL, 0x63a65185UL, 0x3a181787UL, 0x0d72d586UL, 0xa0d0e2a9UL, + 0x97ba20a8UL, 0xce0466aaUL, 0xf96ea4abUL, 0x7c78ebaeUL, 0x4b1229afUL, + 0x12ac6fadUL, 0x25c6adacUL, 0x1881f1a7UL, 0x2feb33a6UL, 0x765575a4UL, + 0x413fb7a5UL, 0xc429f8a0UL, 0xf3433aa1UL, 0xaafd7ca3UL, 0x9d97bea2UL, + 0xd073c4b5UL, 0xe71906b4UL, 0xbea740b6UL, 0x89cd82b7UL, 0x0cdbcdb2UL, + 0x3bb10fb3UL, 0x620f49b1UL, 0x55658bb0UL, 0x6822d7bbUL, 0x5f4815baUL, + 0x06f653b8UL, 0x319c91b9UL, 0xb48adebcUL, 0x83e01cbdUL, 0xda5e5abfUL, + 0xed3498beUL + }, + { + 0x00000000UL, 0x6567bcb8UL, 0x8bc809aaUL, 0xeeafb512UL, 0x5797628fUL, + 0x32f0de37UL, 0xdc5f6b25UL, 0xb938d79dUL, 0xef28b4c5UL, 0x8a4f087dUL, + 0x64e0bd6fUL, 0x018701d7UL, 0xb8bfd64aUL, 0xddd86af2UL, 0x3377dfe0UL, + 0x56106358UL, 0x9f571950UL, 0xfa30a5e8UL, 0x149f10faUL, 0x71f8ac42UL, + 0xc8c07bdfUL, 0xada7c767UL, 0x43087275UL, 0x266fcecdUL, 0x707fad95UL, + 0x1518112dUL, 0xfbb7a43fUL, 0x9ed01887UL, 0x27e8cf1aUL, 0x428f73a2UL, + 0xac20c6b0UL, 0xc9477a08UL, 0x3eaf32a0UL, 0x5bc88e18UL, 0xb5673b0aUL, + 0xd00087b2UL, 0x6938502fUL, 0x0c5fec97UL, 0xe2f05985UL, 0x8797e53dUL, + 0xd1878665UL, 0xb4e03addUL, 0x5a4f8fcfUL, 0x3f283377UL, 0x8610e4eaUL, + 0xe3775852UL, 0x0dd8ed40UL, 0x68bf51f8UL, 0xa1f82bf0UL, 0xc49f9748UL, + 0x2a30225aUL, 0x4f579ee2UL, 0xf66f497fUL, 0x9308f5c7UL, 0x7da740d5UL, + 0x18c0fc6dUL, 0x4ed09f35UL, 0x2bb7238dUL, 0xc518969fUL, 0xa07f2a27UL, + 0x1947fdbaUL, 0x7c204102UL, 0x928ff410UL, 0xf7e848a8UL, 0x3d58149bUL, + 0x583fa823UL, 0xb6901d31UL, 0xd3f7a189UL, 0x6acf7614UL, 0x0fa8caacUL, + 0xe1077fbeUL, 0x8460c306UL, 0xd270a05eUL, 0xb7171ce6UL, 0x59b8a9f4UL, + 0x3cdf154cUL, 0x85e7c2d1UL, 0xe0807e69UL, 0x0e2fcb7bUL, 0x6b4877c3UL, + 0xa20f0dcbUL, 0xc768b173UL, 0x29c70461UL, 0x4ca0b8d9UL, 0xf5986f44UL, + 0x90ffd3fcUL, 0x7e5066eeUL, 0x1b37da56UL, 0x4d27b90eUL, 0x284005b6UL, + 0xc6efb0a4UL, 0xa3880c1cUL, 0x1ab0db81UL, 0x7fd76739UL, 0x9178d22bUL, + 0xf41f6e93UL, 0x03f7263bUL, 0x66909a83UL, 0x883f2f91UL, 0xed589329UL, + 0x546044b4UL, 0x3107f80cUL, 0xdfa84d1eUL, 0xbacff1a6UL, 0xecdf92feUL, + 0x89b82e46UL, 0x67179b54UL, 0x027027ecUL, 0xbb48f071UL, 0xde2f4cc9UL, + 0x3080f9dbUL, 0x55e74563UL, 0x9ca03f6bUL, 0xf9c783d3UL, 0x176836c1UL, + 0x720f8a79UL, 0xcb375de4UL, 0xae50e15cUL, 0x40ff544eUL, 0x2598e8f6UL, + 0x73888baeUL, 0x16ef3716UL, 0xf8408204UL, 0x9d273ebcUL, 0x241fe921UL, + 0x41785599UL, 0xafd7e08bUL, 0xcab05c33UL, 0x3bb659edUL, 0x5ed1e555UL, + 0xb07e5047UL, 0xd519ecffUL, 0x6c213b62UL, 0x094687daUL, 0xe7e932c8UL, + 0x828e8e70UL, 0xd49eed28UL, 0xb1f95190UL, 0x5f56e482UL, 0x3a31583aUL, + 0x83098fa7UL, 0xe66e331fUL, 0x08c1860dUL, 0x6da63ab5UL, 0xa4e140bdUL, + 0xc186fc05UL, 0x2f294917UL, 0x4a4ef5afUL, 0xf3762232UL, 0x96119e8aUL, + 0x78be2b98UL, 0x1dd99720UL, 0x4bc9f478UL, 0x2eae48c0UL, 0xc001fdd2UL, + 0xa566416aUL, 0x1c5e96f7UL, 0x79392a4fUL, 0x97969f5dUL, 0xf2f123e5UL, + 0x05196b4dUL, 0x607ed7f5UL, 0x8ed162e7UL, 0xebb6de5fUL, 0x528e09c2UL, + 0x37e9b57aUL, 0xd9460068UL, 0xbc21bcd0UL, 0xea31df88UL, 0x8f566330UL, + 0x61f9d622UL, 0x049e6a9aUL, 0xbda6bd07UL, 0xd8c101bfUL, 0x366eb4adUL, + 0x53090815UL, 0x9a4e721dUL, 0xff29cea5UL, 0x11867bb7UL, 0x74e1c70fUL, + 0xcdd91092UL, 0xa8beac2aUL, 0x46111938UL, 0x2376a580UL, 0x7566c6d8UL, + 0x10017a60UL, 0xfeaecf72UL, 0x9bc973caUL, 0x22f1a457UL, 0x479618efUL, + 0xa939adfdUL, 0xcc5e1145UL, 0x06ee4d76UL, 0x6389f1ceUL, 0x8d2644dcUL, + 0xe841f864UL, 0x51792ff9UL, 0x341e9341UL, 0xdab12653UL, 0xbfd69aebUL, + 0xe9c6f9b3UL, 0x8ca1450bUL, 0x620ef019UL, 0x07694ca1UL, 0xbe519b3cUL, + 0xdb362784UL, 0x35999296UL, 0x50fe2e2eUL, 0x99b95426UL, 0xfcdee89eUL, + 0x12715d8cUL, 0x7716e134UL, 0xce2e36a9UL, 0xab498a11UL, 0x45e63f03UL, + 0x208183bbUL, 0x7691e0e3UL, 0x13f65c5bUL, 0xfd59e949UL, 0x983e55f1UL, + 0x2106826cUL, 0x44613ed4UL, 0xaace8bc6UL, 0xcfa9377eUL, 0x38417fd6UL, + 0x5d26c36eUL, 0xb389767cUL, 0xd6eecac4UL, 0x6fd61d59UL, 0x0ab1a1e1UL, + 0xe41e14f3UL, 0x8179a84bUL, 0xd769cb13UL, 0xb20e77abUL, 0x5ca1c2b9UL, + 0x39c67e01UL, 0x80fea99cUL, 0xe5991524UL, 0x0b36a036UL, 0x6e511c8eUL, + 0xa7166686UL, 0xc271da3eUL, 0x2cde6f2cUL, 0x49b9d394UL, 0xf0810409UL, + 0x95e6b8b1UL, 0x7b490da3UL, 0x1e2eb11bUL, 0x483ed243UL, 0x2d596efbUL, + 0xc3f6dbe9UL, 0xa6916751UL, 0x1fa9b0ccUL, 0x7ace0c74UL, 0x9461b966UL, + 0xf10605deUL +#endif + } +}; diff --git a/tools/bsnes/lib/zlib/crypt.h b/tools/bsnes/lib/zlib/crypt.h new file mode 100755 index 0000000..622f4bc --- /dev/null +++ b/tools/bsnes/lib/zlib/crypt.h @@ -0,0 +1,132 @@ +/* crypt.h -- base code for crypt/uncrypt ZIPfile + + + Version 1.01e, February 12th, 2005 + + Copyright (C) 1998-2005 Gilles Vollant + + This code is a modified version of crypting code in Infozip distribution + + The encryption/decryption parts of this source code (as opposed to the + non-echoing password parts) were originally written in Europe. The + whole source package can be freely distributed, including from the USA. + (Prior to January 2000, re-export from the US was a violation of US law.) + + This encryption code is a direct transcription of the algorithm from + Roger Schlafly, described by Phil Katz in the file appnote.txt. This + file (appnote.txt) is distributed with the PKZIP program (even in the + version without encryption capabilities). + + If you don't need crypting in your application, just define symbols + NOCRYPT and NOUNCRYPT. + + This code support the "Traditional PKWARE Encryption". + + The new AES encryption added on Zip format by Winzip (see the page + http://www.winzip.com/aes_info.htm ) and PKWare PKZip 5.x Strong + Encryption is not supported. +*/ + +#define CRC32(c, b) ((*(pcrc_32_tab+(((int)(c) ^ (b)) & 0xff))) ^ ((c) >> 8)) + +/*********************************************************************** + * Return the next byte in the pseudo-random sequence + */ +static int decrypt_byte(unsigned long* pkeys, const unsigned long* pcrc_32_tab) +{ + unsigned temp; /* POTENTIAL BUG: temp*(temp^1) may overflow in an + * unpredictable manner on 16-bit systems; not a problem + * with any known compiler so far, though */ + + temp = ((unsigned)(*(pkeys+2)) & 0xffff) | 2; + return (int)(((temp * (temp ^ 1)) >> 8) & 0xff); +} + +/*********************************************************************** + * Update the encryption keys with the next byte of plain text + */ +static int update_keys(unsigned long* pkeys,const unsigned long* pcrc_32_tab,int c) +{ + (*(pkeys+0)) = CRC32((*(pkeys+0)), c); + (*(pkeys+1)) += (*(pkeys+0)) & 0xff; + (*(pkeys+1)) = (*(pkeys+1)) * 134775813L + 1; + { + register int keyshift = (int)((*(pkeys+1)) >> 24); + (*(pkeys+2)) = CRC32((*(pkeys+2)), keyshift); + } + return c; +} + + +/*********************************************************************** + * Initialize the encryption keys and the random header according to + * the given password. + */ +static void init_keys(const char* passwd,unsigned long* pkeys,const unsigned long* pcrc_32_tab) +{ + *(pkeys+0) = 305419896L; + *(pkeys+1) = 591751049L; + *(pkeys+2) = 878082192L; + while (*passwd != '\0') { + update_keys(pkeys,pcrc_32_tab,(int)*passwd); + passwd++; + } +} + +#define zdecode(pkeys,pcrc_32_tab,c) \ + (update_keys(pkeys,pcrc_32_tab,c ^= decrypt_byte(pkeys,pcrc_32_tab))) + +#define zencode(pkeys,pcrc_32_tab,c,t) \ + (t=decrypt_byte(pkeys,pcrc_32_tab), update_keys(pkeys,pcrc_32_tab,c), t^(c)) + +#ifdef INCLUDECRYPTINGCODE_IFCRYPTALLOWED + +#define RAND_HEAD_LEN 12 + /* "last resort" source for second part of crypt seed pattern */ +# ifndef ZCR_SEED2 +# define ZCR_SEED2 3141592654UL /* use PI as default pattern */ +# endif + +static int crypthead(passwd, buf, bufSize, pkeys, pcrc_32_tab, crcForCrypting) + const char *passwd; /* password string */ + unsigned char *buf; /* where to write header */ + int bufSize; + unsigned long* pkeys; + const unsigned long* pcrc_32_tab; + unsigned long crcForCrypting; +{ + int n; /* index in random header */ + int t; /* temporary */ + int c; /* random byte */ + unsigned char header[RAND_HEAD_LEN-2]; /* random header */ + static unsigned calls = 0; /* ensure different random header each time */ + + if (bufSize> 7) & 0xff; + header[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, c, t); + } + /* Encrypt random header (last two bytes is high word of crc) */ + init_keys(passwd, pkeys, pcrc_32_tab); + for (n = 0; n < RAND_HEAD_LEN-2; n++) + { + buf[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, header[n], t); + } + buf[n++] = zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 16) & 0xff, t); + buf[n++] = zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 24) & 0xff, t); + return n; +} + +#endif diff --git a/tools/bsnes/lib/zlib/deflate.c b/tools/bsnes/lib/zlib/deflate.c new file mode 100755 index 0000000..d08ce26 --- /dev/null +++ b/tools/bsnes/lib/zlib/deflate.c @@ -0,0 +1,1736 @@ +/* deflate.c -- compress data using the deflation algorithm + * Copyright (C) 1995-2005 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * ALGORITHM + * + * The "deflation" process depends on being able to identify portions + * of the input text which are identical to earlier input (within a + * sliding window trailing behind the input currently being processed). + * + * The most straightforward technique turns out to be the fastest for + * most input files: try all possible matches and select the longest. + * The key feature of this algorithm is that insertions into the string + * dictionary are very simple and thus fast, and deletions are avoided + * completely. Insertions are performed at each input character, whereas + * string matches are performed only when the previous match ends. So it + * is preferable to spend more time in matches to allow very fast string + * insertions and avoid deletions. The matching algorithm for small + * strings is inspired from that of Rabin & Karp. A brute force approach + * is used to find longer strings when a small match has been found. + * A similar algorithm is used in comic (by Jan-Mark Wams) and freeze + * (by Leonid Broukhis). + * A previous version of this file used a more sophisticated algorithm + * (by Fiala and Greene) which is guaranteed to run in linear amortized + * time, but has a larger average cost, uses more memory and is patented. + * However the F&G algorithm may be faster for some highly redundant + * files if the parameter max_chain_length (described below) is too large. + * + * ACKNOWLEDGEMENTS + * + * The idea of lazy evaluation of matches is due to Jan-Mark Wams, and + * I found it in 'freeze' written by Leonid Broukhis. + * Thanks to many people for bug reports and testing. + * + * REFERENCES + * + * Deutsch, L.P.,"DEFLATE Compressed Data Format Specification". + * Available in http://www.ietf.org/rfc/rfc1951.txt + * + * A description of the Rabin and Karp algorithm is given in the book + * "Algorithms" by R. Sedgewick, Addison-Wesley, p252. + * + * Fiala,E.R., and Greene,D.H. + * Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595 + * + */ + +/* @(#) $Id: deflate.c,v 1.3 2005/07/27 18:15:11 nach Exp $ */ + +#include "deflate.h" + +const char deflate_copyright[] = + " deflate 1.2.3 Copyright 1995-2005 Jean-loup Gailly "; +/* + If you use the zlib library in a product, an acknowledgment is welcome + in the documentation of your product. If for some reason you cannot + include such an acknowledgment, I would appreciate that you keep this + copyright string in the executable of your product. + */ + +/* =========================================================================== + * Function prototypes. + */ +typedef enum { + need_more, /* block not completed, need more input or more output */ + block_done, /* block flush performed */ + finish_started, /* finish started, need only more output at next deflate */ + finish_done /* finish done, accept no more input or output */ +} block_state; + +typedef block_state (*compress_func) OF((deflate_state *s, int flush)); +/* Compression function. Returns the block state after the call. */ + +local void fill_window OF((deflate_state *s)); +local block_state deflate_stored OF((deflate_state *s, int flush)); +local block_state deflate_fast OF((deflate_state *s, int flush)); +#ifndef FASTEST +local block_state deflate_slow OF((deflate_state *s, int flush)); +#endif +local void lm_init OF((deflate_state *s)); +local void putShortMSB OF((deflate_state *s, uInt b)); +local void flush_pending OF((z_streamp strm)); +local int read_buf OF((z_streamp strm, Bytef *buf, unsigned size)); +#ifndef FASTEST +#ifdef ASMV + void match_init OF((void)); /* asm code initialization */ + uInt longest_match OF((deflate_state *s, IPos cur_match)); +#else +local uInt longest_match OF((deflate_state *s, IPos cur_match)); +#endif +#endif +local uInt longest_match_fast OF((deflate_state *s, IPos cur_match)); + +#ifdef DEBUG +local void check_match OF((deflate_state *s, IPos start, IPos match, + int length)); +#endif + +/* =========================================================================== + * Local data + */ + +#define NIL 0 +/* Tail of hash chains */ + +#ifndef TOO_FAR +# define TOO_FAR 4096 +#endif +/* Matches of length 3 are discarded if their distance exceeds TOO_FAR */ + +#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) +/* Minimum amount of lookahead, except at the end of the input file. + * See deflate.c for comments about the MIN_MATCH+1. + */ + +/* Values for max_lazy_match, good_match and max_chain_length, depending on + * the desired pack level (0..9). The values given below have been tuned to + * exclude worst case performance for pathological files. Better values may be + * found for specific files. + */ +typedef struct config_s { + ush good_length; /* reduce lazy search above this match length */ + ush max_lazy; /* do not perform lazy search above this match length */ + ush nice_length; /* quit search above this match length */ + ush max_chain; + compress_func func; +} config; + +#ifdef FASTEST +local const config configuration_table[2] = { +/* good lazy nice chain */ +/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ +/* 1 */ {4, 4, 8, 4, deflate_fast}}; /* max speed, no lazy matches */ +#else +local const config configuration_table[10] = { +/* good lazy nice chain */ +/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ +/* 1 */ {4, 4, 8, 4, deflate_fast}, /* max speed, no lazy matches */ +/* 2 */ {4, 5, 16, 8, deflate_fast}, +/* 3 */ {4, 6, 32, 32, deflate_fast}, + +/* 4 */ {4, 4, 16, 16, deflate_slow}, /* lazy matches */ +/* 5 */ {8, 16, 32, 32, deflate_slow}, +/* 6 */ {8, 16, 128, 128, deflate_slow}, +/* 7 */ {8, 32, 128, 256, deflate_slow}, +/* 8 */ {32, 128, 258, 1024, deflate_slow}, +/* 9 */ {32, 258, 258, 4096, deflate_slow}}; /* max compression */ +#endif + +/* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4 + * For deflate_fast() (levels <= 3) good is ignored and lazy has a different + * meaning. + */ + +#define EQUAL 0 +/* result of memcmp for equal strings */ + +#ifndef NO_DUMMY_DECL +struct static_tree_desc_s {int dummy;}; /* for buggy compilers */ +#endif + +/* =========================================================================== + * Update a hash value with the given input byte + * IN assertion: all calls to to UPDATE_HASH are made with consecutive + * input characters, so that a running hash key can be computed from the + * previous key instead of complete recalculation each time. + */ +#define UPDATE_HASH(s,h,c) (h = (((h)<hash_shift) ^ (c)) & s->hash_mask) + + +/* =========================================================================== + * Insert string str in the dictionary and set match_head to the previous head + * of the hash chain (the most recent string with same hash key). Return + * the previous length of the hash chain. + * If this file is compiled with -DFASTEST, the compression level is forced + * to 1, and no hash chains are maintained. + * IN assertion: all calls to to INSERT_STRING are made with consecutive + * input characters and the first MIN_MATCH bytes of str are valid + * (except for the last MIN_MATCH-1 bytes of the input file). + */ +#ifdef FASTEST +#define INSERT_STRING(s, str, match_head) \ + (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ + match_head = s->head[s->ins_h], \ + s->head[s->ins_h] = (Pos)(str)) +#else +#define INSERT_STRING(s, str, match_head) \ + (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ + match_head = s->prev[(str) & s->w_mask] = s->head[s->ins_h], \ + s->head[s->ins_h] = (Pos)(str)) +#endif + +/* =========================================================================== + * Initialize the hash table (avoiding 64K overflow for 16 bit systems). + * prev[] will be initialized on the fly. + */ +#define CLEAR_HASH(s) \ + s->head[s->hash_size-1] = NIL; \ + zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head)); + +/* ========================================================================= */ +int ZEXPORT deflateInit_(strm, level, version, stream_size) + z_streamp strm; + int level; + const char *version; + int stream_size; +{ + return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, + Z_DEFAULT_STRATEGY, version, stream_size); + /* To do: ignore strm->next_in if we use it as window */ +} + +/* ========================================================================= */ +int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, + version, stream_size) + z_streamp strm; + int level; + int method; + int windowBits; + int memLevel; + int strategy; + const char *version; + int stream_size; +{ + deflate_state *s; + int wrap = 1; + static const char my_version[] = ZLIB_VERSION; + + ushf *overlay; + /* We overlay pending_buf and d_buf+l_buf. This works since the average + * output size for (length,distance) codes is <= 24 bits. + */ + + if (version == Z_NULL || version[0] != my_version[0] || + stream_size != sizeof(z_stream)) { + return Z_VERSION_ERROR; + } + if (strm == Z_NULL) return Z_STREAM_ERROR; + + strm->msg = Z_NULL; + if (strm->zalloc == (alloc_func)0) { + strm->zalloc = zcalloc; + strm->opaque = (voidpf)0; + } + if (strm->zfree == (free_func)0) strm->zfree = zcfree; + +#ifdef FASTEST + if (level != 0) level = 1; +#else + if (level == Z_DEFAULT_COMPRESSION) level = 6; +#endif + + if (windowBits < 0) { /* suppress zlib wrapper */ + wrap = 0; + windowBits = -windowBits; + } +#ifdef GZIP + else if (windowBits > 15) { + wrap = 2; /* write gzip wrapper instead */ + windowBits -= 16; + } +#endif + if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED || + windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || + strategy < 0 || strategy > Z_FIXED) { + return Z_STREAM_ERROR; + } + if (windowBits == 8) windowBits = 9; /* until 256-byte window bug fixed */ + s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state)); + if (s == Z_NULL) return Z_MEM_ERROR; + strm->state = (struct internal_state FAR *)s; + s->strm = strm; + + s->wrap = wrap; + s->gzhead = Z_NULL; + s->w_bits = windowBits; + s->w_size = 1 << s->w_bits; + s->w_mask = s->w_size - 1; + + s->hash_bits = memLevel + 7; + s->hash_size = 1 << s->hash_bits; + s->hash_mask = s->hash_size - 1; + s->hash_shift = ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH); + + s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte)); + s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos)); + s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos)); + + s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ + + overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2); + s->pending_buf = (uchf *) overlay; + s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L); + + if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL || + s->pending_buf == Z_NULL) { + s->status = FINISH_STATE; + strm->msg = (char*)ERR_MSG(Z_MEM_ERROR); + deflateEnd (strm); + return Z_MEM_ERROR; + } + s->d_buf = overlay + s->lit_bufsize/sizeof(ush); + s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize; + + s->level = level; + s->strategy = strategy; + s->method = (Byte)method; + + return deflateReset(strm); +} + +/* ========================================================================= */ +int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength) + z_streamp strm; + const Bytef *dictionary; + uInt dictLength; +{ + deflate_state *s; + uInt length = dictLength; + uInt n; + IPos hash_head = 0; + + if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL || + strm->state->wrap == 2 || + (strm->state->wrap == 1 && strm->state->status != INIT_STATE)) + return Z_STREAM_ERROR; + + s = strm->state; + if (s->wrap) + strm->adler = adler32(strm->adler, dictionary, dictLength); + + if (length < MIN_MATCH) return Z_OK; + if (length > MAX_DIST(s)) { + length = MAX_DIST(s); + dictionary += dictLength - length; /* use the tail of the dictionary */ + } + zmemcpy(s->window, dictionary, length); + s->strstart = length; + s->block_start = (long)length; + + /* Insert all strings in the hash table (except for the last two bytes). + * s->lookahead stays null, so s->ins_h will be recomputed at the next + * call of fill_window. + */ + s->ins_h = s->window[0]; + UPDATE_HASH(s, s->ins_h, s->window[1]); + for (n = 0; n <= length - MIN_MATCH; n++) { + INSERT_STRING(s, n, hash_head); + } + if (hash_head) hash_head = 0; /* to make compiler happy */ + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflateReset (strm) + z_streamp strm; +{ + deflate_state *s; + + if (strm == Z_NULL || strm->state == Z_NULL || + strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) { + return Z_STREAM_ERROR; + } + + strm->total_in = strm->total_out = 0; + strm->msg = Z_NULL; /* use zfree if we ever allocate msg dynamically */ + strm->data_type = Z_UNKNOWN; + + s = (deflate_state *)strm->state; + s->pending = 0; + s->pending_out = s->pending_buf; + + if (s->wrap < 0) { + s->wrap = -s->wrap; /* was made negative by deflate(..., Z_FINISH); */ + } + s->status = s->wrap ? INIT_STATE : BUSY_STATE; + strm->adler = +#ifdef GZIP + s->wrap == 2 ? crc32(0L, Z_NULL, 0) : +#endif + adler32(0L, Z_NULL, 0); + s->last_flush = Z_NO_FLUSH; + + _tr_init(s); + lm_init(s); + + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflateSetHeader (strm, head) + z_streamp strm; + gz_headerp head; +{ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + if (strm->state->wrap != 2) return Z_STREAM_ERROR; + strm->state->gzhead = head; + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflatePrime (strm, bits, value) + z_streamp strm; + int bits; + int value; +{ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + strm->state->bi_valid = bits; + strm->state->bi_buf = (ush)(value & ((1 << bits) - 1)); + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflateParams(strm, level, strategy) + z_streamp strm; + int level; + int strategy; +{ + deflate_state *s; + compress_func func; + int err = Z_OK; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + s = strm->state; + +#ifdef FASTEST + if (level != 0) level = 1; +#else + if (level == Z_DEFAULT_COMPRESSION) level = 6; +#endif + if (level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) { + return Z_STREAM_ERROR; + } + func = configuration_table[s->level].func; + + if (func != configuration_table[level].func && strm->total_in != 0) { + /* Flush the last buffer: */ + err = deflate(strm, Z_PARTIAL_FLUSH); + } + if (s->level != level) { + s->level = level; + s->max_lazy_match = configuration_table[level].max_lazy; + s->good_match = configuration_table[level].good_length; + s->nice_match = configuration_table[level].nice_length; + s->max_chain_length = configuration_table[level].max_chain; + } + s->strategy = strategy; + return err; +} + +/* ========================================================================= */ +int ZEXPORT deflateTune(strm, good_length, max_lazy, nice_length, max_chain) + z_streamp strm; + int good_length; + int max_lazy; + int nice_length; + int max_chain; +{ + deflate_state *s; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + s = strm->state; + s->good_match = good_length; + s->max_lazy_match = max_lazy; + s->nice_match = nice_length; + s->max_chain_length = max_chain; + return Z_OK; +} + +/* ========================================================================= + * For the default windowBits of 15 and memLevel of 8, this function returns + * a close to exact, as well as small, upper bound on the compressed size. + * They are coded as constants here for a reason--if the #define's are + * changed, then this function needs to be changed as well. The return + * value for 15 and 8 only works for those exact settings. + * + * For any setting other than those defaults for windowBits and memLevel, + * the value returned is a conservative worst case for the maximum expansion + * resulting from using fixed blocks instead of stored blocks, which deflate + * can emit on compressed data for some combinations of the parameters. + * + * This function could be more sophisticated to provide closer upper bounds + * for every combination of windowBits and memLevel, as well as wrap. + * But even the conservative upper bound of about 14% expansion does not + * seem onerous for output buffer allocation. + */ +uLong ZEXPORT deflateBound(strm, sourceLen) + z_streamp strm; + uLong sourceLen; +{ + deflate_state *s; + uLong destLen; + + /* conservative upper bound */ + destLen = sourceLen + + ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 11; + + /* if can't get parameters, return conservative bound */ + if (strm == Z_NULL || strm->state == Z_NULL) + return destLen; + + /* if not default parameters, return conservative bound */ + s = strm->state; + if (s->w_bits != 15 || s->hash_bits != 8 + 7) + return destLen; + + /* default settings: return tight bound for that case */ + return compressBound(sourceLen); +} + +/* ========================================================================= + * Put a short in the pending buffer. The 16-bit value is put in MSB order. + * IN assertion: the stream state is correct and there is enough room in + * pending_buf. + */ +local void putShortMSB (s, b) + deflate_state *s; + uInt b; +{ + put_byte(s, (Byte)(b >> 8)); + put_byte(s, (Byte)(b & 0xff)); +} + +/* ========================================================================= + * Flush as much pending output as possible. All deflate() output goes + * through this function so some applications may wish to modify it + * to avoid allocating a large strm->next_out buffer and copying into it. + * (See also read_buf()). + */ +local void flush_pending(strm) + z_streamp strm; +{ + unsigned len = strm->state->pending; + + if (len > strm->avail_out) len = strm->avail_out; + if (len == 0) return; + + zmemcpy(strm->next_out, strm->state->pending_out, len); + strm->next_out += len; + strm->state->pending_out += len; + strm->total_out += len; + strm->avail_out -= len; + strm->state->pending -= len; + if (strm->state->pending == 0) { + strm->state->pending_out = strm->state->pending_buf; + } +} + +/* ========================================================================= */ +int ZEXPORT deflate (strm, flush) + z_streamp strm; + int flush; +{ + int old_flush; /* value of flush param for previous deflate call */ + deflate_state *s; + + if (strm == Z_NULL || strm->state == Z_NULL || + flush > Z_FINISH || flush < 0) { + return Z_STREAM_ERROR; + } + s = strm->state; + + if (strm->next_out == Z_NULL || + (strm->next_in == Z_NULL && strm->avail_in != 0) || + (s->status == FINISH_STATE && flush != Z_FINISH)) { + ERR_RETURN(strm, Z_STREAM_ERROR); + } + if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR); + + s->strm = strm; /* just in case */ + old_flush = s->last_flush; + s->last_flush = flush; + + /* Write the header */ + if (s->status == INIT_STATE) { +#ifdef GZIP + if (s->wrap == 2) { + strm->adler = crc32(0L, Z_NULL, 0); + put_byte(s, 31); + put_byte(s, 139); + put_byte(s, 8); + if (s->gzhead == NULL) { + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, s->level == 9 ? 2 : + (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? + 4 : 0)); + put_byte(s, OS_CODE); + s->status = BUSY_STATE; + } + else { + put_byte(s, (s->gzhead->text ? 1 : 0) + + (s->gzhead->hcrc ? 2 : 0) + + (s->gzhead->extra == Z_NULL ? 0 : 4) + + (s->gzhead->name == Z_NULL ? 0 : 8) + + (s->gzhead->comment == Z_NULL ? 0 : 16) + ); + put_byte(s, (Byte)(s->gzhead->time & 0xff)); + put_byte(s, (Byte)((s->gzhead->time >> 8) & 0xff)); + put_byte(s, (Byte)((s->gzhead->time >> 16) & 0xff)); + put_byte(s, (Byte)((s->gzhead->time >> 24) & 0xff)); + put_byte(s, s->level == 9 ? 2 : + (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? + 4 : 0)); + put_byte(s, s->gzhead->os & 0xff); + if (s->gzhead->extra != NULL) { + put_byte(s, s->gzhead->extra_len & 0xff); + put_byte(s, (s->gzhead->extra_len >> 8) & 0xff); + } + if (s->gzhead->hcrc) + strm->adler = crc32(strm->adler, s->pending_buf, + s->pending); + s->gzindex = 0; + s->status = EXTRA_STATE; + } + } + else +#endif + { + uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8; + uInt level_flags; + + if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2) + level_flags = 0; + else if (s->level < 6) + level_flags = 1; + else if (s->level == 6) + level_flags = 2; + else + level_flags = 3; + header |= (level_flags << 6); + if (s->strstart != 0) header |= PRESET_DICT; + header += 31 - (header % 31); + + s->status = BUSY_STATE; + putShortMSB(s, header); + + /* Save the adler32 of the preset dictionary: */ + if (s->strstart != 0) { + putShortMSB(s, (uInt)(strm->adler >> 16)); + putShortMSB(s, (uInt)(strm->adler & 0xffff)); + } + strm->adler = adler32(0L, Z_NULL, 0); + } + } +#ifdef GZIP + if (s->status == EXTRA_STATE) { + if (s->gzhead->extra != NULL) { + uInt beg = s->pending; /* start of bytes to update crc */ + + while (s->gzindex < (s->gzhead->extra_len & 0xffff)) { + if (s->pending == s->pending_buf_size) { + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + flush_pending(strm); + beg = s->pending; + if (s->pending == s->pending_buf_size) + break; + } + put_byte(s, s->gzhead->extra[s->gzindex]); + s->gzindex++; + } + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + if (s->gzindex == s->gzhead->extra_len) { + s->gzindex = 0; + s->status = NAME_STATE; + } + } + else + s->status = NAME_STATE; + } + if (s->status == NAME_STATE) { + if (s->gzhead->name != NULL) { + uInt beg = s->pending; /* start of bytes to update crc */ + int val; + + do { + if (s->pending == s->pending_buf_size) { + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + flush_pending(strm); + beg = s->pending; + if (s->pending == s->pending_buf_size) { + val = 1; + break; + } + } + val = s->gzhead->name[s->gzindex++]; + put_byte(s, val); + } while (val != 0); + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + if (val == 0) { + s->gzindex = 0; + s->status = COMMENT_STATE; + } + } + else + s->status = COMMENT_STATE; + } + if (s->status == COMMENT_STATE) { + if (s->gzhead->comment != NULL) { + uInt beg = s->pending; /* start of bytes to update crc */ + int val; + + do { + if (s->pending == s->pending_buf_size) { + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + flush_pending(strm); + beg = s->pending; + if (s->pending == s->pending_buf_size) { + val = 1; + break; + } + } + val = s->gzhead->comment[s->gzindex++]; + put_byte(s, val); + } while (val != 0); + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + if (val == 0) + s->status = HCRC_STATE; + } + else + s->status = HCRC_STATE; + } + if (s->status == HCRC_STATE) { + if (s->gzhead->hcrc) { + if (s->pending + 2 > s->pending_buf_size) + flush_pending(strm); + if (s->pending + 2 <= s->pending_buf_size) { + put_byte(s, (Byte)(strm->adler & 0xff)); + put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); + strm->adler = crc32(0L, Z_NULL, 0); + s->status = BUSY_STATE; + } + } + else + s->status = BUSY_STATE; + } +#endif + + /* Flush as much pending output as possible */ + if (s->pending != 0) { + flush_pending(strm); + if (strm->avail_out == 0) { + /* Since avail_out is 0, deflate will be called again with + * more output space, but possibly with both pending and + * avail_in equal to zero. There won't be anything to do, + * but this is not an error situation so make sure we + * return OK instead of BUF_ERROR at next call of deflate: + */ + s->last_flush = -1; + return Z_OK; + } + + /* Make sure there is something to do and avoid duplicate consecutive + * flushes. For repeated and useless calls with Z_FINISH, we keep + * returning Z_STREAM_END instead of Z_BUF_ERROR. + */ + } else if (strm->avail_in == 0 && flush <= old_flush && + flush != Z_FINISH) { + ERR_RETURN(strm, Z_BUF_ERROR); + } + + /* User must not provide more input after the first FINISH: */ + if (s->status == FINISH_STATE && strm->avail_in != 0) { + ERR_RETURN(strm, Z_BUF_ERROR); + } + + /* Start a new block or continue the current one. + */ + if (strm->avail_in != 0 || s->lookahead != 0 || + (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) { + block_state bstate; + + bstate = (*(configuration_table[s->level].func))(s, flush); + + if (bstate == finish_started || bstate == finish_done) { + s->status = FINISH_STATE; + } + if (bstate == need_more || bstate == finish_started) { + if (strm->avail_out == 0) { + s->last_flush = -1; /* avoid BUF_ERROR next call, see above */ + } + return Z_OK; + /* If flush != Z_NO_FLUSH && avail_out == 0, the next call + * of deflate should use the same flush parameter to make sure + * that the flush is complete. So we don't have to output an + * empty block here, this will be done at next call. This also + * ensures that for a very small output buffer, we emit at most + * one empty block. + */ + } + if (bstate == block_done) { + if (flush == Z_PARTIAL_FLUSH) { + _tr_align(s); + } else { /* FULL_FLUSH or SYNC_FLUSH */ + _tr_stored_block(s, (char*)0, 0L, 0); + /* For a full flush, this empty block will be recognized + * as a special marker by inflate_sync(). + */ + if (flush == Z_FULL_FLUSH) { + CLEAR_HASH(s); /* forget history */ + } + } + flush_pending(strm); + if (strm->avail_out == 0) { + s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */ + return Z_OK; + } + } + } + Assert(strm->avail_out > 0, "bug2"); + + if (flush != Z_FINISH) return Z_OK; + if (s->wrap <= 0) return Z_STREAM_END; + + /* Write the trailer */ +#ifdef GZIP + if (s->wrap == 2) { + put_byte(s, (Byte)(strm->adler & 0xff)); + put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); + put_byte(s, (Byte)((strm->adler >> 16) & 0xff)); + put_byte(s, (Byte)((strm->adler >> 24) & 0xff)); + put_byte(s, (Byte)(strm->total_in & 0xff)); + put_byte(s, (Byte)((strm->total_in >> 8) & 0xff)); + put_byte(s, (Byte)((strm->total_in >> 16) & 0xff)); + put_byte(s, (Byte)((strm->total_in >> 24) & 0xff)); + } + else +#endif + { + putShortMSB(s, (uInt)(strm->adler >> 16)); + putShortMSB(s, (uInt)(strm->adler & 0xffff)); + } + flush_pending(strm); + /* If avail_out is zero, the application will call deflate again + * to flush the rest. + */ + if (s->wrap > 0) s->wrap = -s->wrap; /* write the trailer only once! */ + return s->pending != 0 ? Z_OK : Z_STREAM_END; +} + +/* ========================================================================= */ +int ZEXPORT deflateEnd (strm) + z_streamp strm; +{ + int status; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + + status = strm->state->status; + if (status != INIT_STATE && + status != EXTRA_STATE && + status != NAME_STATE && + status != COMMENT_STATE && + status != HCRC_STATE && + status != BUSY_STATE && + status != FINISH_STATE) { + return Z_STREAM_ERROR; + } + + /* Deallocate in reverse order of allocations: */ + TRY_FREE(strm, strm->state->pending_buf); + TRY_FREE(strm, strm->state->head); + TRY_FREE(strm, strm->state->prev); + TRY_FREE(strm, strm->state->window); + + ZFREE(strm, strm->state); + strm->state = Z_NULL; + + return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK; +} + +/* ========================================================================= + * Copy the source state to the destination state. + * To simplify the source, this is not supported for 16-bit MSDOS (which + * doesn't have enough memory anyway to duplicate compression states). + */ +int ZEXPORT deflateCopy (dest, source) + z_streamp dest; + z_streamp source; +{ +#ifdef MAXSEG_64K + return Z_STREAM_ERROR; +#else + deflate_state *ds; + deflate_state *ss; + ushf *overlay; + + + if (source == Z_NULL || dest == Z_NULL || source->state == Z_NULL) { + return Z_STREAM_ERROR; + } + + ss = source->state; + + zmemcpy(dest, source, sizeof(z_stream)); + + ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state)); + if (ds == Z_NULL) return Z_MEM_ERROR; + dest->state = (struct internal_state FAR *) ds; + zmemcpy(ds, ss, sizeof(deflate_state)); + ds->strm = dest; + + ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte)); + ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos)); + ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos)); + overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2); + ds->pending_buf = (uchf *) overlay; + + if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL || + ds->pending_buf == Z_NULL) { + deflateEnd (dest); + return Z_MEM_ERROR; + } + /* following zmemcpy do not work for 16-bit MSDOS */ + zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte)); + zmemcpy(ds->prev, ss->prev, ds->w_size * sizeof(Pos)); + zmemcpy(ds->head, ss->head, ds->hash_size * sizeof(Pos)); + zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size); + + ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf); + ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush); + ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize; + + ds->l_desc.dyn_tree = ds->dyn_ltree; + ds->d_desc.dyn_tree = ds->dyn_dtree; + ds->bl_desc.dyn_tree = ds->bl_tree; + + return Z_OK; +#endif /* MAXSEG_64K */ +} + +/* =========================================================================== + * Read a new buffer from the current input stream, update the adler32 + * and total number of bytes read. All deflate() input goes through + * this function so some applications may wish to modify it to avoid + * allocating a large strm->next_in buffer and copying from it. + * (See also flush_pending()). + */ +local int read_buf(strm, buf, size) + z_streamp strm; + Bytef *buf; + unsigned size; +{ + unsigned len = strm->avail_in; + + if (len > size) len = size; + if (len == 0) return 0; + + strm->avail_in -= len; + + if (strm->state->wrap == 1) { + strm->adler = adler32(strm->adler, strm->next_in, len); + } +#ifdef GZIP + else if (strm->state->wrap == 2) { + strm->adler = crc32(strm->adler, strm->next_in, len); + } +#endif + zmemcpy(buf, strm->next_in, len); + strm->next_in += len; + strm->total_in += len; + + return (int)len; +} + +/* =========================================================================== + * Initialize the "longest match" routines for a new zlib stream + */ +local void lm_init (s) + deflate_state *s; +{ + s->window_size = (ulg)2L*s->w_size; + + CLEAR_HASH(s); + + /* Set the default configuration parameters: + */ + s->max_lazy_match = configuration_table[s->level].max_lazy; + s->good_match = configuration_table[s->level].good_length; + s->nice_match = configuration_table[s->level].nice_length; + s->max_chain_length = configuration_table[s->level].max_chain; + + s->strstart = 0; + s->block_start = 0L; + s->lookahead = 0; + s->match_length = s->prev_length = MIN_MATCH-1; + s->match_available = 0; + s->ins_h = 0; +#ifndef FASTEST +#ifdef ASMV + match_init(); /* initialize the asm code */ +#endif +#endif +} + +#ifndef FASTEST +/* =========================================================================== + * Set match_start to the longest match starting at the given string and + * return its length. Matches shorter or equal to prev_length are discarded, + * in which case the result is equal to prev_length and match_start is + * garbage. + * IN assertions: cur_match is the head of the hash chain for the current + * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 + * OUT assertion: the match length is not greater than s->lookahead. + */ +#ifndef ASMV +/* For 80x86 and 680x0, an optimized version will be provided in match.asm or + * match.S. The code will be functionally equivalent. + */ +local uInt longest_match(s, cur_match) + deflate_state *s; + IPos cur_match; /* current match */ +{ + unsigned chain_length = s->max_chain_length;/* max hash chain length */ + register Bytef *scan = s->window + s->strstart; /* current string */ + register Bytef *match; /* matched string */ + register int len; /* length of current match */ + int best_len = s->prev_length; /* best match length so far */ + int nice_match = s->nice_match; /* stop if match long enough */ + IPos limit = s->strstart > (IPos)MAX_DIST(s) ? + s->strstart - (IPos)MAX_DIST(s) : NIL; + /* Stop when cur_match becomes <= limit. To simplify the code, + * we prevent matches with the string of window index 0. + */ + Posf *prev = s->prev; + uInt wmask = s->w_mask; + +#ifdef UNALIGNED_OK + /* Compare two bytes at a time. Note: this is not always beneficial. + * Try with and without -DUNALIGNED_OK to check. + */ + register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1; + register ush scan_start = *(ushf*)scan; + register ush scan_end = *(ushf*)(scan+best_len-1); +#else + register Bytef *strend = s->window + s->strstart + MAX_MATCH; + register Byte scan_end1 = scan[best_len-1]; + register Byte scan_end = scan[best_len]; +#endif + + /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. + * It is easy to get rid of this optimization if necessary. + */ + Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); + + /* Do not waste too much time if we already have a good match: */ + if (s->prev_length >= s->good_match) { + chain_length >>= 2; + } + /* Do not look for matches beyond the end of the input. This is necessary + * to make deflate deterministic. + */ + if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; + + Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); + + do { + Assert(cur_match < s->strstart, "no future"); + match = s->window + cur_match; + + /* Skip to next match if the match length cannot increase + * or if the match length is less than 2. Note that the checks below + * for insufficient lookahead only occur occasionally for performance + * reasons. Therefore uninitialized memory will be accessed, and + * conditional jumps will be made that depend on those values. + * However the length of the match is limited to the lookahead, so + * the output of deflate is not affected by the uninitialized values. + */ +#if (defined(UNALIGNED_OK) && MAX_MATCH == 258) + /* This code assumes sizeof(unsigned short) == 2. Do not use + * UNALIGNED_OK if your compiler uses a different size. + */ + if (*(ushf*)(match+best_len-1) != scan_end || + *(ushf*)match != scan_start) continue; + + /* It is not necessary to compare scan[2] and match[2] since they are + * always equal when the other bytes match, given that the hash keys + * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at + * strstart+3, +5, ... up to strstart+257. We check for insufficient + * lookahead only every 4th comparison; the 128th check will be made + * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is + * necessary to put more guard bytes at the end of the window, or + * to check more often for insufficient lookahead. + */ + Assert(scan[2] == match[2], "scan[2]?"); + scan++, match++; + do { + } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) && + *(ushf*)(scan+=2) == *(ushf*)(match+=2) && + *(ushf*)(scan+=2) == *(ushf*)(match+=2) && + *(ushf*)(scan+=2) == *(ushf*)(match+=2) && + scan < strend); + /* The funny "do {}" generates better code on most compilers */ + + /* Here, scan <= window+strstart+257 */ + Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + if (*scan == *match) scan++; + + len = (MAX_MATCH - 1) - (int)(strend-scan); + scan = strend - (MAX_MATCH-1); + +#else /* UNALIGNED_OK */ + + if (match[best_len] != scan_end || + match[best_len-1] != scan_end1 || + *match != *scan || + *++match != scan[1]) continue; + + /* The check at best_len-1 can be removed because it will be made + * again later. (This heuristic is not always a win.) + * It is not necessary to compare scan[2] and match[2] since they + * are always equal when the other bytes match, given that + * the hash keys are equal and that HASH_BITS >= 8. + */ + scan += 2, match++; + Assert(*scan == *match, "match[2]?"); + + /* We check for insufficient lookahead only every 8th comparison; + * the 256th check will be made at strstart+258. + */ + do { + } while (*++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + scan < strend); + + Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + + len = MAX_MATCH - (int)(strend - scan); + scan = strend - MAX_MATCH; + +#endif /* UNALIGNED_OK */ + + if (len > best_len) { + s->match_start = cur_match; + best_len = len; + if (len >= nice_match) break; +#ifdef UNALIGNED_OK + scan_end = *(ushf*)(scan+best_len-1); +#else + scan_end1 = scan[best_len-1]; + scan_end = scan[best_len]; +#endif + } + } while ((cur_match = prev[cur_match & wmask]) > limit + && --chain_length != 0); + + if ((uInt)best_len <= s->lookahead) return (uInt)best_len; + return s->lookahead; +} +#endif /* ASMV */ +#endif /* FASTEST */ + +/* --------------------------------------------------------------------------- + * Optimized version for level == 1 or strategy == Z_RLE only + */ +local uInt longest_match_fast(s, cur_match) + deflate_state *s; + IPos cur_match; /* current match */ +{ + register Bytef *scan = s->window + s->strstart; /* current string */ + register Bytef *match; /* matched string */ + register int len; /* length of current match */ + register Bytef *strend = s->window + s->strstart + MAX_MATCH; + + /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. + * It is easy to get rid of this optimization if necessary. + */ + Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); + + Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); + + Assert(cur_match < s->strstart, "no future"); + + match = s->window + cur_match; + + /* Return failure if the match length is less than 2: + */ + if (match[0] != scan[0] || match[1] != scan[1]) return MIN_MATCH-1; + + /* The check at best_len-1 can be removed because it will be made + * again later. (This heuristic is not always a win.) + * It is not necessary to compare scan[2] and match[2] since they + * are always equal when the other bytes match, given that + * the hash keys are equal and that HASH_BITS >= 8. + */ + scan += 2, match += 2; + Assert(*scan == *match, "match[2]?"); + + /* We check for insufficient lookahead only every 8th comparison; + * the 256th check will be made at strstart+258. + */ + do { + } while (*++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + scan < strend); + + Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + + len = MAX_MATCH - (int)(strend - scan); + + if (len < MIN_MATCH) return MIN_MATCH - 1; + + s->match_start = cur_match; + return (uInt)len <= s->lookahead ? (uInt)len : s->lookahead; +} + +#ifdef DEBUG +/* =========================================================================== + * Check that the match at match_start is indeed a match. + */ +local void check_match(s, start, match, length) + deflate_state *s; + IPos start, match; + int length; +{ + /* check that the match is indeed a match */ + if (zmemcmp(s->window + match, + s->window + start, length) != EQUAL) { + fprintf(stderr, " start %u, match %u, length %d\n", + start, match, length); + do { + fprintf(stderr, "%c%c", s->window[match++], s->window[start++]); + } while (--length != 0); + z_error("invalid match"); + } + if (z_verbose > 1) { + fprintf(stderr,"\\[%d,%d]", start-match, length); + do { putc(s->window[start++], stderr); } while (--length != 0); + } +} +#else +# define check_match(s, start, match, length) +#endif /* DEBUG */ + +/* =========================================================================== + * Fill the window when the lookahead becomes insufficient. + * Updates strstart and lookahead. + * + * IN assertion: lookahead < MIN_LOOKAHEAD + * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD + * At least one byte has been read, or avail_in == 0; reads are + * performed for at least two bytes (required for the zip translate_eol + * option -- not supported here). + */ +local void fill_window(s) + deflate_state *s; +{ + register unsigned n, m; + register Posf *p; + unsigned more; /* Amount of free space at the end of the window. */ + uInt wsize = s->w_size; + + do { + more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart); + + /* Deal with !@#$% 64K limit: */ + if (sizeof(int) <= 2) { + if (more == 0 && s->strstart == 0 && s->lookahead == 0) { + more = wsize; + + } else if (more == (unsigned)(-1)) { + /* Very unlikely, but possible on 16 bit machine if + * strstart == 0 && lookahead == 1 (input done a byte at time) + */ + more--; + } + } + + /* If the window is almost full and there is insufficient lookahead, + * move the upper half to the lower one to make room in the upper half. + */ + if (s->strstart >= wsize+MAX_DIST(s)) { + + zmemcpy(s->window, s->window+wsize, (unsigned)wsize); + s->match_start -= wsize; + s->strstart -= wsize; /* we now have strstart >= MAX_DIST */ + s->block_start -= (long) wsize; + + /* Slide the hash table (could be avoided with 32 bit values + at the expense of memory usage). We slide even when level == 0 + to keep the hash table consistent if we switch back to level > 0 + later. (Using level 0 permanently is not an optimal usage of + zlib, so we don't care about this pathological case.) + */ + /* %%% avoid this when Z_RLE */ + n = s->hash_size; + p = &s->head[n]; + do { + m = *--p; + *p = (Pos)(m >= wsize ? m-wsize : NIL); + } while (--n); + + n = wsize; +#ifndef FASTEST + p = &s->prev[n]; + do { + m = *--p; + *p = (Pos)(m >= wsize ? m-wsize : NIL); + /* If n is not on any hash chain, prev[n] is garbage but + * its value will never be used. + */ + } while (--n); +#endif + more += wsize; + } + if (s->strm->avail_in == 0) return; + + /* If there was no sliding: + * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && + * more == window_size - lookahead - strstart + * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) + * => more >= window_size - 2*WSIZE + 2 + * In the BIG_MEM or MMAP case (not yet supported), + * window_size == input_size + MIN_LOOKAHEAD && + * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. + * Otherwise, window_size == 2*WSIZE so more >= 2. + * If there was sliding, more >= WSIZE. So in all cases, more >= 2. + */ + Assert(more >= 2, "more < 2"); + + n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more); + s->lookahead += n; + + /* Initialize the hash value now that we have some input: */ + if (s->lookahead >= MIN_MATCH) { + s->ins_h = s->window[s->strstart]; + UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); +#if MIN_MATCH != 3 + Call UPDATE_HASH() MIN_MATCH-3 more times +#endif + } + /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, + * but this is not important since only literal bytes will be emitted. + */ + + } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0); +} + +/* =========================================================================== + * Flush the current block, with given end-of-file flag. + * IN assertion: strstart is set to the end of the current match. + */ +#define FLUSH_BLOCK_ONLY(s, eof) { \ + _tr_flush_block(s, (s->block_start >= 0L ? \ + (charf *)&s->window[(unsigned)s->block_start] : \ + (charf *)Z_NULL), \ + (ulg)((long)s->strstart - s->block_start), \ + (eof)); \ + s->block_start = s->strstart; \ + flush_pending(s->strm); \ + Tracev((stderr,"[FLUSH]")); \ +} + +/* Same but force premature exit if necessary. */ +#define FLUSH_BLOCK(s, eof) { \ + FLUSH_BLOCK_ONLY(s, eof); \ + if (s->strm->avail_out == 0) return (eof) ? finish_started : need_more; \ +} + +/* =========================================================================== + * Copy without compression as much as possible from the input stream, return + * the current block state. + * This function does not insert new strings in the dictionary since + * uncompressible data is probably not useful. This function is used + * only for the level=0 compression option. + * NOTE: this function should be optimized to avoid extra copying from + * window to pending_buf. + */ +local block_state deflate_stored(s, flush) + deflate_state *s; + int flush; +{ + /* Stored blocks are limited to 0xffff bytes, pending_buf is limited + * to pending_buf_size, and each stored block has a 5 byte header: + */ + ulg max_block_size = 0xffff; + ulg max_start; + + if (max_block_size > s->pending_buf_size - 5) { + max_block_size = s->pending_buf_size - 5; + } + + /* Copy as much as possible from input to output: */ + for (;;) { + /* Fill the window as much as possible: */ + if (s->lookahead <= 1) { + + Assert(s->strstart < s->w_size+MAX_DIST(s) || + s->block_start >= (long)s->w_size, "slide too late"); + + fill_window(s); + if (s->lookahead == 0 && flush == Z_NO_FLUSH) return need_more; + + if (s->lookahead == 0) break; /* flush the current block */ + } + Assert(s->block_start >= 0L, "block gone"); + + s->strstart += s->lookahead; + s->lookahead = 0; + + /* Emit a stored block if pending_buf will be full: */ + max_start = s->block_start + max_block_size; + if (s->strstart == 0 || (ulg)s->strstart >= max_start) { + /* strstart == 0 is possible when wraparound on 16-bit machine */ + s->lookahead = (uInt)(s->strstart - max_start); + s->strstart = (uInt)max_start; + FLUSH_BLOCK(s, 0); + } + /* Flush if we may have to slide, otherwise block_start may become + * negative and the data will be gone: + */ + if (s->strstart - (uInt)s->block_start >= MAX_DIST(s)) { + FLUSH_BLOCK(s, 0); + } + } + FLUSH_BLOCK(s, flush == Z_FINISH); + return flush == Z_FINISH ? finish_done : block_done; +} + +/* =========================================================================== + * Compress as much as possible from the input stream, return the current + * block state. + * This function does not perform lazy evaluation of matches and inserts + * new strings in the dictionary only for unmatched strings or for short + * matches. It is used only for the fast compression options. + */ +local block_state deflate_fast(s, flush) + deflate_state *s; + int flush; +{ + IPos hash_head = NIL; /* head of the hash chain */ + int bflush; /* set if current block must be flushed */ + + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the next match, plus MIN_MATCH bytes to insert the + * string following the next match. + */ + if (s->lookahead < MIN_LOOKAHEAD) { + fill_window(s); + if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { + return need_more; + } + if (s->lookahead == 0) break; /* flush the current block */ + } + + /* Insert the string window[strstart .. strstart+2] in the + * dictionary, and set hash_head to the head of the hash chain: + */ + if (s->lookahead >= MIN_MATCH) { + INSERT_STRING(s, s->strstart, hash_head); + } + + /* Find the longest match, discarding those <= prev_length. + * At this point we have always match_length < MIN_MATCH + */ + if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) { + /* To simplify the code, we prevent matches with the string + * of window index 0 (in particular we have to avoid a match + * of the string with itself at the start of the input file). + */ +#ifdef FASTEST + if ((s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) || + (s->strategy == Z_RLE && s->strstart - hash_head == 1)) { + s->match_length = longest_match_fast (s, hash_head); + } +#else + if (s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) { + s->match_length = longest_match (s, hash_head); + } else if (s->strategy == Z_RLE && s->strstart - hash_head == 1) { + s->match_length = longest_match_fast (s, hash_head); + } +#endif + /* longest_match() or longest_match_fast() sets match_start */ + } + if (s->match_length >= MIN_MATCH) { + check_match(s, s->strstart, s->match_start, s->match_length); + + _tr_tally_dist(s, s->strstart - s->match_start, + s->match_length - MIN_MATCH, bflush); + + s->lookahead -= s->match_length; + + /* Insert new strings in the hash table only if the match length + * is not too large. This saves time but degrades compression. + */ +#ifndef FASTEST + if (s->match_length <= s->max_insert_length && + s->lookahead >= MIN_MATCH) { + s->match_length--; /* string at strstart already in table */ + do { + s->strstart++; + INSERT_STRING(s, s->strstart, hash_head); + /* strstart never exceeds WSIZE-MAX_MATCH, so there are + * always MIN_MATCH bytes ahead. + */ + } while (--s->match_length != 0); + s->strstart++; + } else +#endif + { + s->strstart += s->match_length; + s->match_length = 0; + s->ins_h = s->window[s->strstart]; + UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); +#if MIN_MATCH != 3 + Call UPDATE_HASH() MIN_MATCH-3 more times +#endif + /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not + * matter since it will be recomputed at next deflate call. + */ + } + } else { + /* No match, output a literal byte */ + Tracevv((stderr,"%c", s->window[s->strstart])); + _tr_tally_lit (s, s->window[s->strstart], bflush); + s->lookahead--; + s->strstart++; + } + if (bflush) FLUSH_BLOCK(s, 0); + } + FLUSH_BLOCK(s, flush == Z_FINISH); + return flush == Z_FINISH ? finish_done : block_done; +} + +#ifndef FASTEST +/* =========================================================================== + * Same as above, but achieves better compression. We use a lazy + * evaluation for matches: a match is finally adopted only if there is + * no better match at the next window position. + */ +local block_state deflate_slow(s, flush) + deflate_state *s; + int flush; +{ + IPos hash_head = NIL; /* head of hash chain */ + int bflush; /* set if current block must be flushed */ + + /* Process the input block. */ + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the next match, plus MIN_MATCH bytes to insert the + * string following the next match. + */ + if (s->lookahead < MIN_LOOKAHEAD) { + fill_window(s); + if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { + return need_more; + } + if (s->lookahead == 0) break; /* flush the current block */ + } + + /* Insert the string window[strstart .. strstart+2] in the + * dictionary, and set hash_head to the head of the hash chain: + */ + if (s->lookahead >= MIN_MATCH) { + INSERT_STRING(s, s->strstart, hash_head); + } + + /* Find the longest match, discarding those <= prev_length. + */ + s->prev_length = s->match_length, s->prev_match = s->match_start; + s->match_length = MIN_MATCH-1; + + if (hash_head != NIL && s->prev_length < s->max_lazy_match && + s->strstart - hash_head <= MAX_DIST(s)) { + /* To simplify the code, we prevent matches with the string + * of window index 0 (in particular we have to avoid a match + * of the string with itself at the start of the input file). + */ + if (s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) { + s->match_length = longest_match (s, hash_head); + } else if (s->strategy == Z_RLE && s->strstart - hash_head == 1) { + s->match_length = longest_match_fast (s, hash_head); + } + /* longest_match() or longest_match_fast() sets match_start */ + + if (s->match_length <= 5 && (s->strategy == Z_FILTERED +#if TOO_FAR <= 32767 + || (s->match_length == MIN_MATCH && + s->strstart - s->match_start > TOO_FAR) +#endif + )) { + + /* If prev_match is also MIN_MATCH, match_start is garbage + * but we will ignore the current match anyway. + */ + s->match_length = MIN_MATCH-1; + } + } + /* If there was a match at the previous step and the current + * match is not better, output the previous match: + */ + if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) { + uInt max_insert = s->strstart + s->lookahead - MIN_MATCH; + /* Do not insert strings in hash table beyond this. */ + + check_match(s, s->strstart-1, s->prev_match, s->prev_length); + + _tr_tally_dist(s, s->strstart -1 - s->prev_match, + s->prev_length - MIN_MATCH, bflush); + + /* Insert in hash table all strings up to the end of the match. + * strstart-1 and strstart are already inserted. If there is not + * enough lookahead, the last two strings are not inserted in + * the hash table. + */ + s->lookahead -= s->prev_length-1; + s->prev_length -= 2; + do { + if (++s->strstart <= max_insert) { + INSERT_STRING(s, s->strstart, hash_head); + } + } while (--s->prev_length != 0); + s->match_available = 0; + s->match_length = MIN_MATCH-1; + s->strstart++; + + if (bflush) FLUSH_BLOCK(s, 0); + + } else if (s->match_available) { + /* If there was no match at the previous position, output a + * single literal. If there was a match but the current match + * is longer, truncate the previous match to a single literal. + */ + Tracevv((stderr,"%c", s->window[s->strstart-1])); + _tr_tally_lit(s, s->window[s->strstart-1], bflush); + if (bflush) { + FLUSH_BLOCK_ONLY(s, 0); + } + s->strstart++; + s->lookahead--; + if (s->strm->avail_out == 0) return need_more; + } else { + /* There is no previous match to compare with, wait for + * the next step to decide. + */ + s->match_available = 1; + s->strstart++; + s->lookahead--; + } + } + Assert (flush != Z_NO_FLUSH, "no flush?"); + if (s->match_available) { + Tracevv((stderr,"%c", s->window[s->strstart-1])); + _tr_tally_lit(s, s->window[s->strstart-1], bflush); + s->match_available = 0; + } + FLUSH_BLOCK(s, flush == Z_FINISH); + return flush == Z_FINISH ? finish_done : block_done; +} +#endif /* FASTEST */ + +#if 0 +/* =========================================================================== + * For Z_RLE, simply look for runs of bytes, generate matches only of distance + * one. Do not maintain a hash table. (It will be regenerated if this run of + * deflate switches away from Z_RLE.) + */ +local block_state deflate_rle(s, flush) + deflate_state *s; + int flush; +{ + int bflush; /* set if current block must be flushed */ + uInt run; /* length of run */ + uInt max; /* maximum length of run */ + uInt prev; /* byte at distance one to match */ + Bytef *scan; /* scan for end of run */ + + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the longest encodable run. + */ + if (s->lookahead < MAX_MATCH) { + fill_window(s); + if (s->lookahead < MAX_MATCH && flush == Z_NO_FLUSH) { + return need_more; + } + if (s->lookahead == 0) break; /* flush the current block */ + } + + /* See how many times the previous byte repeats */ + run = 0; + if (s->strstart > 0) { /* if there is a previous byte, that is */ + max = s->lookahead < MAX_MATCH ? s->lookahead : MAX_MATCH; + scan = s->window + s->strstart - 1; + prev = *scan++; + do { + if (*scan++ != prev) + break; + } while (++run < max); + } + + /* Emit match if have run of MIN_MATCH or longer, else emit literal */ + if (run >= MIN_MATCH) { + check_match(s, s->strstart, s->strstart - 1, run); + _tr_tally_dist(s, 1, run - MIN_MATCH, bflush); + s->lookahead -= run; + s->strstart += run; + } else { + /* No match, output a literal byte */ + Tracevv((stderr,"%c", s->window[s->strstart])); + _tr_tally_lit (s, s->window[s->strstart], bflush); + s->lookahead--; + s->strstart++; + } + if (bflush) FLUSH_BLOCK(s, 0); + } + FLUSH_BLOCK(s, flush == Z_FINISH); + return flush == Z_FINISH ? finish_done : block_done; +} +#endif diff --git a/tools/bsnes/lib/zlib/deflate.h b/tools/bsnes/lib/zlib/deflate.h new file mode 100755 index 0000000..be7b168 --- /dev/null +++ b/tools/bsnes/lib/zlib/deflate.h @@ -0,0 +1,331 @@ +/* deflate.h -- internal compression state + * Copyright (C) 1995-2004 Jean-loup Gailly + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* @(#) $Id: deflate.h,v 1.3 2005/07/27 18:15:11 nach Exp $ */ + +#ifndef DEFLATE_H +#define DEFLATE_H + +#include "zutil.h" + +/* define NO_GZIP when compiling if you want to disable gzip header and + trailer creation by deflate(). NO_GZIP would be used to avoid linking in + the crc code when it is not needed. For shared libraries, gzip encoding + should be left enabled. */ +#ifndef NO_GZIP +# define GZIP +#endif + +/* =========================================================================== + * Internal compression state. + */ + +#define LENGTH_CODES 29 +/* number of length codes, not counting the special END_BLOCK code */ + +#define LITERALS 256 +/* number of literal bytes 0..255 */ + +#define L_CODES (LITERALS+1+LENGTH_CODES) +/* number of Literal or Length codes, including the END_BLOCK code */ + +#define D_CODES 30 +/* number of distance codes */ + +#define BL_CODES 19 +/* number of codes used to transfer the bit lengths */ + +#define HEAP_SIZE (2*L_CODES+1) +/* maximum heap size */ + +#define MAX_BITS 15 +/* All codes must not exceed MAX_BITS bits */ + +#define INIT_STATE 42 +#define EXTRA_STATE 69 +#define NAME_STATE 73 +#define COMMENT_STATE 91 +#define HCRC_STATE 103 +#define BUSY_STATE 113 +#define FINISH_STATE 666 +/* Stream status */ + + +/* Data structure describing a single value and its code string. */ +typedef struct ct_data_s { + union { + ush freq; /* frequency count */ + ush code; /* bit string */ + } fc; + union { + ush dad; /* father node in Huffman tree */ + ush len; /* length of bit string */ + } dl; +} FAR ct_data; + +#define Freq fc.freq +#define Code fc.code +#define Dad dl.dad +#define Len dl.len + +typedef struct static_tree_desc_s static_tree_desc; + +typedef struct tree_desc_s { + ct_data *dyn_tree; /* the dynamic tree */ + int max_code; /* largest code with non zero frequency */ + static_tree_desc *stat_desc; /* the corresponding static tree */ +} FAR tree_desc; + +typedef ush Pos; +typedef Pos FAR Posf; +typedef unsigned IPos; + +/* A Pos is an index in the character window. We use short instead of int to + * save space in the various tables. IPos is used only for parameter passing. + */ + +typedef struct internal_state { + z_streamp strm; /* pointer back to this zlib stream */ + int status; /* as the name implies */ + Bytef *pending_buf; /* output still pending */ + ulg pending_buf_size; /* size of pending_buf */ + Bytef *pending_out; /* next pending byte to output to the stream */ + uInt pending; /* nb of bytes in the pending buffer */ + int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ + gz_headerp gzhead; /* gzip header information to write */ + uInt gzindex; /* where in extra, name, or comment */ + Byte method; /* STORED (for zip only) or DEFLATED */ + int last_flush; /* value of flush param for previous deflate call */ + + /* used by deflate.c: */ + + uInt w_size; /* LZ77 window size (32K by default) */ + uInt w_bits; /* log2(w_size) (8..16) */ + uInt w_mask; /* w_size - 1 */ + + Bytef *window; + /* Sliding window. Input bytes are read into the second half of the window, + * and move to the first half later to keep a dictionary of at least wSize + * bytes. With this organization, matches are limited to a distance of + * wSize-MAX_MATCH bytes, but this ensures that IO is always + * performed with a length multiple of the block size. Also, it limits + * the window size to 64K, which is quite useful on MSDOS. + * To do: use the user input buffer as sliding window. + */ + + ulg window_size; + /* Actual size of window: 2*wSize, except when the user input buffer + * is directly used as sliding window. + */ + + Posf *prev; + /* Link to older string with same hash index. To limit the size of this + * array to 64K, this link is maintained only for the last 32K strings. + * An index in this array is thus a window index modulo 32K. + */ + + Posf *head; /* Heads of the hash chains or NIL. */ + + uInt ins_h; /* hash index of string to be inserted */ + uInt hash_size; /* number of elements in hash table */ + uInt hash_bits; /* log2(hash_size) */ + uInt hash_mask; /* hash_size-1 */ + + uInt hash_shift; + /* Number of bits by which ins_h must be shifted at each input + * step. It must be such that after MIN_MATCH steps, the oldest + * byte no longer takes part in the hash key, that is: + * hash_shift * MIN_MATCH >= hash_bits + */ + + long block_start; + /* Window position at the beginning of the current output block. Gets + * negative when the window is moved backwards. + */ + + uInt match_length; /* length of best match */ + IPos prev_match; /* previous match */ + int match_available; /* set if previous match exists */ + uInt strstart; /* start of string to insert */ + uInt match_start; /* start of matching string */ + uInt lookahead; /* number of valid bytes ahead in window */ + + uInt prev_length; + /* Length of the best match at previous step. Matches not greater than this + * are discarded. This is used in the lazy match evaluation. + */ + + uInt max_chain_length; + /* To speed up deflation, hash chains are never searched beyond this + * length. A higher limit improves compression ratio but degrades the + * speed. + */ + + uInt max_lazy_match; + /* Attempt to find a better match only when the current match is strictly + * smaller than this value. This mechanism is used only for compression + * levels >= 4. + */ +# define max_insert_length max_lazy_match + /* Insert new strings in the hash table only if the match length is not + * greater than this length. This saves time but degrades compression. + * max_insert_length is used only for compression levels <= 3. + */ + + int level; /* compression level (1..9) */ + int strategy; /* favor or force Huffman coding*/ + + uInt good_match; + /* Use a faster search when the previous match is longer than this */ + + int nice_match; /* Stop searching when current match exceeds this */ + + /* used by trees.c: */ + /* Didn't use ct_data typedef below to supress compiler warning */ + struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ + struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ + struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ + + struct tree_desc_s l_desc; /* desc. for literal tree */ + struct tree_desc_s d_desc; /* desc. for distance tree */ + struct tree_desc_s bl_desc; /* desc. for bit length tree */ + + ush bl_count[MAX_BITS+1]; + /* number of codes at each bit length for an optimal tree */ + + int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */ + int heap_len; /* number of elements in the heap */ + int heap_max; /* element of largest frequency */ + /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. + * The same heap array is used to build all trees. + */ + + uch depth[2*L_CODES+1]; + /* Depth of each subtree used as tie breaker for trees of equal frequency + */ + + uchf *l_buf; /* buffer for literals or lengths */ + + uInt lit_bufsize; + /* Size of match buffer for literals/lengths. There are 4 reasons for + * limiting lit_bufsize to 64K: + * - frequencies can be kept in 16 bit counters + * - if compression is not successful for the first block, all input + * data is still in the window so we can still emit a stored block even + * when input comes from standard input. (This can also be done for + * all blocks if lit_bufsize is not greater than 32K.) + * - if compression is not successful for a file smaller than 64K, we can + * even emit a stored file instead of a stored block (saving 5 bytes). + * This is applicable only for zip (not gzip or zlib). + * - creating new Huffman trees less frequently may not provide fast + * adaptation to changes in the input data statistics. (Take for + * example a binary file with poorly compressible code followed by + * a highly compressible string table.) Smaller buffer sizes give + * fast adaptation but have of course the overhead of transmitting + * trees more frequently. + * - I can't count above 4 + */ + + uInt last_lit; /* running index in l_buf */ + + ushf *d_buf; + /* Buffer for distances. To simplify the code, d_buf and l_buf have + * the same number of elements. To use different lengths, an extra flag + * array would be necessary. + */ + + ulg opt_len; /* bit length of current block with optimal trees */ + ulg static_len; /* bit length of current block with static trees */ + uInt matches; /* number of string matches in current block */ + int last_eob_len; /* bit length of EOB code for last block */ + +#ifdef DEBUG + ulg compressed_len; /* total bit length of compressed file mod 2^32 */ + ulg bits_sent; /* bit length of compressed data sent mod 2^32 */ +#endif + + ush bi_buf; + /* Output buffer. bits are inserted starting at the bottom (least + * significant bits). + */ + int bi_valid; + /* Number of valid bits in bi_buf. All bits above the last valid bit + * are always zero. + */ + +} FAR deflate_state; + +/* Output a byte on the stream. + * IN assertion: there is enough room in pending_buf. + */ +#define put_byte(s, c) {s->pending_buf[s->pending++] = (c);} + + +#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) +/* Minimum amount of lookahead, except at the end of the input file. + * See deflate.c for comments about the MIN_MATCH+1. + */ + +#define MAX_DIST(s) ((s)->w_size-MIN_LOOKAHEAD) +/* In order to simplify the code, particularly on 16 bit machines, match + * distances are limited to MAX_DIST instead of WSIZE. + */ + + /* in trees.c */ +void _tr_init OF((deflate_state *s)); +int _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc)); +void _tr_flush_block OF((deflate_state *s, charf *buf, ulg stored_len, + int eof)); +void _tr_align OF((deflate_state *s)); +void _tr_stored_block OF((deflate_state *s, charf *buf, ulg stored_len, + int eof)); + +#define d_code(dist) \ + ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)]) +/* Mapping from a distance to a distance code. dist is the distance - 1 and + * must not have side effects. _dist_code[256] and _dist_code[257] are never + * used. + */ + +#ifndef DEBUG +/* Inline versions of _tr_tally for speed: */ + +#if defined(GEN_TREES_H) || !defined(STDC) + extern uch _length_code[]; + extern uch _dist_code[]; +#else + extern const uch _length_code[]; + extern const uch _dist_code[]; +#endif + +# define _tr_tally_lit(s, c, flush) \ + { uch cc = (c); \ + s->d_buf[s->last_lit] = 0; \ + s->l_buf[s->last_lit++] = cc; \ + s->dyn_ltree[cc].Freq++; \ + flush = (s->last_lit == s->lit_bufsize-1); \ + } +# define _tr_tally_dist(s, distance, length, flush) \ + { uch len = (length); \ + ush dist = (distance); \ + s->d_buf[s->last_lit] = dist; \ + s->l_buf[s->last_lit++] = len; \ + dist--; \ + s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \ + s->dyn_dtree[d_code(dist)].Freq++; \ + flush = (s->last_lit == s->lit_bufsize-1); \ + } +#else +# define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c) +# define _tr_tally_dist(s, distance, length, flush) \ + flush = _tr_tally(s, distance, length) +#endif + +#endif /* DEFLATE_H */ diff --git a/tools/bsnes/lib/zlib/gzio.c b/tools/bsnes/lib/zlib/gzio.c new file mode 100755 index 0000000..6538d6c --- /dev/null +++ b/tools/bsnes/lib/zlib/gzio.c @@ -0,0 +1,1026 @@ +/* gzio.c -- IO on .gz files + * Copyright (C) 1995-2005 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + * + * Compile this file with -DNO_GZCOMPRESS to avoid the compression code. + */ + +/* @(#) $Id: gzio.c,v 1.3 2005/07/27 18:15:11 nach Exp $ */ + +#include + +#include "zutil.h" + +#ifdef NO_DEFLATE /* for compatibility with old definition */ +# define NO_GZCOMPRESS +#endif + +#ifndef NO_DUMMY_DECL +struct internal_state {int dummy;}; /* for buggy compilers */ +#endif + +#ifndef Z_BUFSIZE +# ifdef MAXSEG_64K +# define Z_BUFSIZE 4096 /* minimize memory usage for 16-bit DOS */ +# else +# define Z_BUFSIZE 16384 +# endif +#endif +#ifndef Z_PRINTF_BUFSIZE +# define Z_PRINTF_BUFSIZE 4096 +#endif + +#ifdef __MVS__ +# pragma map (fdopen , "\174\174FDOPEN") + FILE *fdopen(int, const char *); +#endif + +#ifndef STDC +extern voidp malloc OF((uInt size)); +extern void free OF((voidpf ptr)); +#endif + +#define ALLOC(size) malloc(size) +#define TRYFREE(p) {if (p) free(p);} + +static int const gz_magic[2] = {0x1f, 0x8b}; /* gzip magic header */ + +/* gzip flag byte */ +#define ASCII_FLAG 0x01 /* bit 0 set: file probably ascii text */ +#define HEAD_CRC 0x02 /* bit 1 set: header CRC present */ +#define EXTRA_FIELD 0x04 /* bit 2 set: extra field present */ +#define ORIG_NAME 0x08 /* bit 3 set: original file name present */ +#define COMMENT 0x10 /* bit 4 set: file comment present */ +#define RESERVED 0xE0 /* bits 5..7: reserved */ + +typedef struct gz_stream { + z_stream stream; + int z_err; /* error code for last stream operation */ + int z_eof; /* set if end of input file */ + FILE *file; /* .gz file */ + Byte *inbuf; /* input buffer */ + Byte *outbuf; /* output buffer */ + uLong crc; /* crc32 of uncompressed data */ + char *msg; /* error message */ + char *path; /* path name for debugging only */ + int transparent; /* 1 if input file is not a .gz file */ + char mode; /* 'w' or 'r' */ + z_off_t start; /* start of compressed data in file (header skipped) */ + z_off_t in; /* bytes into deflate or inflate */ + z_off_t out; /* bytes out of deflate or inflate */ + int back; /* one character push-back */ + int last; /* true if push-back is last character */ +} gz_stream; + + +local gzFile gz_open OF((const char *path, const char *mode, int fd)); +local int do_flush OF((gzFile file, int flush)); +local int get_byte OF((gz_stream *s)); +local void check_header OF((gz_stream *s)); +local int destroy OF((gz_stream *s)); +local void putLong OF((FILE *file, uLong x)); +local uLong getLong OF((gz_stream *s)); + +/* =========================================================================== + Opens a gzip (.gz) file for reading or writing. The mode parameter + is as in fopen ("rb" or "wb"). The file is given either by file descriptor + or path name (if fd == -1). + gz_open returns NULL if the file could not be opened or if there was + insufficient memory to allocate the (de)compression state; errno + can be checked to distinguish the two cases (if errno is zero, the + zlib error is Z_MEM_ERROR). +*/ +local gzFile gz_open (path, mode, fd) + const char *path; + const char *mode; + int fd; +{ + int err; + int level = Z_DEFAULT_COMPRESSION; /* compression level */ + int strategy = Z_DEFAULT_STRATEGY; /* compression strategy */ + char *p = (char*)mode; + gz_stream *s; + char fmode[80]; /* copy of mode, without the compression level */ + char *m = fmode; + + if (!path || !mode) return Z_NULL; + + s = (gz_stream *)ALLOC(sizeof(gz_stream)); + if (!s) return Z_NULL; + + s->stream.zalloc = (alloc_func)0; + s->stream.zfree = (free_func)0; + s->stream.opaque = (voidpf)0; + s->stream.next_in = s->inbuf = Z_NULL; + s->stream.next_out = s->outbuf = Z_NULL; + s->stream.avail_in = s->stream.avail_out = 0; + s->file = NULL; + s->z_err = Z_OK; + s->z_eof = 0; + s->in = 0; + s->out = 0; + s->back = EOF; + s->crc = crc32(0L, Z_NULL, 0); + s->msg = NULL; + s->transparent = 0; + + s->path = (char*)ALLOC(strlen(path)+1); + if (s->path == NULL) { + return destroy(s), (gzFile)Z_NULL; + } + strcpy(s->path, path); /* do this early for debugging */ + + s->mode = '\0'; + do { + if (*p == 'r') s->mode = 'r'; + if (*p == 'w' || *p == 'a') s->mode = 'w'; + if (*p >= '0' && *p <= '9') { + level = *p - '0'; + } else if (*p == 'f') { + strategy = Z_FILTERED; + } else if (*p == 'h') { + strategy = Z_HUFFMAN_ONLY; + } else if (*p == 'R') { + strategy = Z_RLE; + } else { + *m++ = *p; /* copy the mode */ + } + } while (*p++ && m != fmode + sizeof(fmode)); + if (s->mode == '\0') return destroy(s), (gzFile)Z_NULL; + + if (s->mode == 'w') { +#ifdef NO_GZCOMPRESS + err = Z_STREAM_ERROR; +#else + err = deflateInit2(&(s->stream), level, + Z_DEFLATED, -MAX_WBITS, DEF_MEM_LEVEL, strategy); + /* windowBits is passed < 0 to suppress zlib header */ + + s->stream.next_out = s->outbuf = (Byte*)ALLOC(Z_BUFSIZE); +#endif + if (err != Z_OK || s->outbuf == Z_NULL) { + return destroy(s), (gzFile)Z_NULL; + } + } else { + s->stream.next_in = s->inbuf = (Byte*)ALLOC(Z_BUFSIZE); + + err = inflateInit2(&(s->stream), -MAX_WBITS); + /* windowBits is passed < 0 to tell that there is no zlib header. + * Note that in this case inflate *requires* an extra "dummy" byte + * after the compressed stream in order to complete decompression and + * return Z_STREAM_END. Here the gzip CRC32 ensures that 4 bytes are + * present after the compressed stream. + */ + if (err != Z_OK || s->inbuf == Z_NULL) { + return destroy(s), (gzFile)Z_NULL; + } + } + s->stream.avail_out = Z_BUFSIZE; + + errno = 0; + s->file = fd < 0 ? F_OPEN(path, fmode) : (FILE*)fdopen(fd, fmode); + + if (s->file == NULL) { + return destroy(s), (gzFile)Z_NULL; + } + if (s->mode == 'w') { + /* Write a very simple .gz header: + */ + fprintf(s->file, "%c%c%c%c%c%c%c%c%c%c", gz_magic[0], gz_magic[1], + Z_DEFLATED, 0 /*flags*/, 0,0,0,0 /*time*/, 0 /*xflags*/, OS_CODE); + s->start = 10L; + /* We use 10L instead of ftell(s->file) to because ftell causes an + * fflush on some systems. This version of the library doesn't use + * start anyway in write mode, so this initialization is not + * necessary. + */ + } else { + check_header(s); /* skip the .gz header */ + s->start = ftell(s->file) - s->stream.avail_in; + } + + return (gzFile)s; +} + +/* =========================================================================== + Opens a gzip (.gz) file for reading or writing. +*/ +gzFile ZEXPORT gzopen (path, mode) + const char *path; + const char *mode; +{ + return gz_open (path, mode, -1); +} + +/* =========================================================================== + Associate a gzFile with the file descriptor fd. fd is not dup'ed here + to mimic the behavio(u)r of fdopen. +*/ +gzFile ZEXPORT gzdopen (fd, mode) + int fd; + const char *mode; +{ + char name[46]; /* allow for up to 128-bit integers */ + + if (fd < 0) return (gzFile)Z_NULL; + sprintf(name, "", fd); /* for debugging */ + + return gz_open (name, mode, fd); +} + +/* =========================================================================== + * Update the compression level and strategy + */ +int ZEXPORT gzsetparams (file, level, strategy) + gzFile file; + int level; + int strategy; +{ + gz_stream *s = (gz_stream*)file; + + if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR; + + /* Make room to allow flushing */ + if (s->stream.avail_out == 0) { + + s->stream.next_out = s->outbuf; + if (fwrite(s->outbuf, 1, Z_BUFSIZE, s->file) != Z_BUFSIZE) { + s->z_err = Z_ERRNO; + } + s->stream.avail_out = Z_BUFSIZE; + } + + return deflateParams (&(s->stream), level, strategy); +} + +/* =========================================================================== + Read a byte from a gz_stream; update next_in and avail_in. Return EOF + for end of file. + IN assertion: the stream s has been sucessfully opened for reading. +*/ +local int get_byte(s) + gz_stream *s; +{ + if (s->z_eof) return EOF; + if (s->stream.avail_in == 0) { + errno = 0; + s->stream.avail_in = (uInt)fread(s->inbuf, 1, Z_BUFSIZE, s->file); + if (s->stream.avail_in == 0) { + s->z_eof = 1; + if (ferror(s->file)) s->z_err = Z_ERRNO; + return EOF; + } + s->stream.next_in = s->inbuf; + } + s->stream.avail_in--; + return *(s->stream.next_in)++; +} + +/* =========================================================================== + Check the gzip header of a gz_stream opened for reading. Set the stream + mode to transparent if the gzip magic header is not present; set s->err + to Z_DATA_ERROR if the magic header is present but the rest of the header + is incorrect. + IN assertion: the stream s has already been created sucessfully; + s->stream.avail_in is zero for the first time, but may be non-zero + for concatenated .gz files. +*/ +local void check_header(s) + gz_stream *s; +{ + int method; /* method byte */ + int flags; /* flags byte */ + uInt len; + int c; + + /* Assure two bytes in the buffer so we can peek ahead -- handle case + where first byte of header is at the end of the buffer after the last + gzip segment */ + len = s->stream.avail_in; + if (len < 2) { + if (len) s->inbuf[0] = s->stream.next_in[0]; + errno = 0; + len = (uInt)fread(s->inbuf + len, 1, Z_BUFSIZE >> len, s->file); + if (len == 0 && ferror(s->file)) s->z_err = Z_ERRNO; + s->stream.avail_in += len; + s->stream.next_in = s->inbuf; + if (s->stream.avail_in < 2) { + s->transparent = s->stream.avail_in; + return; + } + } + + /* Peek ahead to check the gzip magic header */ + if (s->stream.next_in[0] != gz_magic[0] || + s->stream.next_in[1] != gz_magic[1]) { + s->transparent = 1; + return; + } + s->stream.avail_in -= 2; + s->stream.next_in += 2; + + /* Check the rest of the gzip header */ + method = get_byte(s); + flags = get_byte(s); + if (method != Z_DEFLATED || (flags & RESERVED) != 0) { + s->z_err = Z_DATA_ERROR; + return; + } + + /* Discard time, xflags and OS code: */ + for (len = 0; len < 6; len++) (void)get_byte(s); + + if ((flags & EXTRA_FIELD) != 0) { /* skip the extra field */ + len = (uInt)get_byte(s); + len += ((uInt)get_byte(s))<<8; + /* len is garbage if EOF but the loop below will quit anyway */ + while (len-- != 0 && get_byte(s) != EOF) ; + } + if ((flags & ORIG_NAME) != 0) { /* skip the original file name */ + while ((c = get_byte(s)) != 0 && c != EOF) ; + } + if ((flags & COMMENT) != 0) { /* skip the .gz file comment */ + while ((c = get_byte(s)) != 0 && c != EOF) ; + } + if ((flags & HEAD_CRC) != 0) { /* skip the header crc */ + for (len = 0; len < 2; len++) (void)get_byte(s); + } + s->z_err = s->z_eof ? Z_DATA_ERROR : Z_OK; +} + + /* =========================================================================== + * Cleanup then free the given gz_stream. Return a zlib error code. + Try freeing in the reverse order of allocations. + */ +local int destroy (s) + gz_stream *s; +{ + int err = Z_OK; + + if (!s) return Z_STREAM_ERROR; + + TRYFREE(s->msg); + + if (s->stream.state != NULL) { + if (s->mode == 'w') { +#ifdef NO_GZCOMPRESS + err = Z_STREAM_ERROR; +#else + err = deflateEnd(&(s->stream)); +#endif + } else if (s->mode == 'r') { + err = inflateEnd(&(s->stream)); + } + } + if (s->file != NULL && fclose(s->file)) { +#ifdef ESPIPE + if (errno != ESPIPE) /* fclose is broken for pipes in HP/UX */ +#endif + err = Z_ERRNO; + } + if (s->z_err < 0) err = s->z_err; + + TRYFREE(s->inbuf); + TRYFREE(s->outbuf); + TRYFREE(s->path); + TRYFREE(s); + return err; +} + +/* =========================================================================== + Reads the given number of uncompressed bytes from the compressed file. + gzread returns the number of bytes actually read (0 for end of file). +*/ +int ZEXPORT gzread (file, buf, len) + gzFile file; + voidp buf; + unsigned len; +{ + gz_stream *s = (gz_stream*)file; + Bytef *start = (Bytef*)buf; /* starting point for crc computation */ + Byte *next_out; /* == stream.next_out but not forced far (for MSDOS) */ + + if (s == NULL || s->mode != 'r') return Z_STREAM_ERROR; + + if (s->z_err == Z_DATA_ERROR || s->z_err == Z_ERRNO) return -1; + if (s->z_err == Z_STREAM_END) return 0; /* EOF */ + + next_out = (Byte*)buf; + s->stream.next_out = (Bytef*)buf; + s->stream.avail_out = len; + + if (s->stream.avail_out && s->back != EOF) { + *next_out++ = s->back; + s->stream.next_out++; + s->stream.avail_out--; + s->back = EOF; + s->out++; + start++; + if (s->last) { + s->z_err = Z_STREAM_END; + return 1; + } + } + + while (s->stream.avail_out != 0) { + + if (s->transparent) { + /* Copy first the lookahead bytes: */ + uInt n = s->stream.avail_in; + if (n > s->stream.avail_out) n = s->stream.avail_out; + if (n > 0) { + zmemcpy(s->stream.next_out, s->stream.next_in, n); + next_out += n; + s->stream.next_out = next_out; + s->stream.next_in += n; + s->stream.avail_out -= n; + s->stream.avail_in -= n; + } + if (s->stream.avail_out > 0) { + s->stream.avail_out -= + (uInt)fread(next_out, 1, s->stream.avail_out, s->file); + } + len -= s->stream.avail_out; + s->in += len; + s->out += len; + if (len == 0) s->z_eof = 1; + return (int)len; + } + if (s->stream.avail_in == 0 && !s->z_eof) { + + errno = 0; + s->stream.avail_in = (uInt)fread(s->inbuf, 1, Z_BUFSIZE, s->file); + if (s->stream.avail_in == 0) { + s->z_eof = 1; + if (ferror(s->file)) { + s->z_err = Z_ERRNO; + break; + } + } + s->stream.next_in = s->inbuf; + } + s->in += s->stream.avail_in; + s->out += s->stream.avail_out; + s->z_err = inflate(&(s->stream), Z_NO_FLUSH); + s->in -= s->stream.avail_in; + s->out -= s->stream.avail_out; + + if (s->z_err == Z_STREAM_END) { + /* Check CRC and original size */ + s->crc = crc32(s->crc, start, (uInt)(s->stream.next_out - start)); + start = s->stream.next_out; + + if (getLong(s) != s->crc) { + s->z_err = Z_DATA_ERROR; + } else { + (void)getLong(s); + /* The uncompressed length returned by above getlong() may be + * different from s->out in case of concatenated .gz files. + * Check for such files: + */ + check_header(s); + if (s->z_err == Z_OK) { + inflateReset(&(s->stream)); + s->crc = crc32(0L, Z_NULL, 0); + } + } + } + if (s->z_err != Z_OK || s->z_eof) break; + } + s->crc = crc32(s->crc, start, (uInt)(s->stream.next_out - start)); + + if (len == s->stream.avail_out && + (s->z_err == Z_DATA_ERROR || s->z_err == Z_ERRNO)) + return -1; + return (int)(len - s->stream.avail_out); +} + + +/* =========================================================================== + Reads one byte from the compressed file. gzgetc returns this byte + or -1 in case of end of file or error. +*/ +int ZEXPORT gzgetc(file) + gzFile file; +{ + unsigned char c; + + return gzread(file, &c, 1) == 1 ? c : -1; +} + + +/* =========================================================================== + Push one byte back onto the stream. +*/ +int ZEXPORT gzungetc(c, file) + int c; + gzFile file; +{ + gz_stream *s = (gz_stream*)file; + + if (s == NULL || s->mode != 'r' || c == EOF || s->back != EOF) return EOF; + s->back = c; + s->out--; + s->last = (s->z_err == Z_STREAM_END); + if (s->last) s->z_err = Z_OK; + s->z_eof = 0; + return c; +} + + +/* =========================================================================== + Reads bytes from the compressed file until len-1 characters are + read, or a newline character is read and transferred to buf, or an + end-of-file condition is encountered. The string is then terminated + with a null character. + gzgets returns buf, or Z_NULL in case of error. + + The current implementation is not optimized at all. +*/ +char * ZEXPORT gzgets(file, buf, len) + gzFile file; + char *buf; + int len; +{ + char *b = buf; + if (buf == Z_NULL || len <= 0) return Z_NULL; + + while (--len > 0 && gzread(file, buf, 1) == 1 && *buf++ != '\n') ; + *buf = '\0'; + return b == buf && len > 0 ? Z_NULL : b; +} + + +#ifndef NO_GZCOMPRESS +/* =========================================================================== + Writes the given number of uncompressed bytes into the compressed file. + gzwrite returns the number of bytes actually written (0 in case of error). +*/ +int ZEXPORT gzwrite (file, buf, len) + gzFile file; + voidpc buf; + unsigned len; +{ + gz_stream *s = (gz_stream*)file; + + if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR; + + s->stream.next_in = (Bytef*)buf; + s->stream.avail_in = len; + + while (s->stream.avail_in != 0) { + + if (s->stream.avail_out == 0) { + + s->stream.next_out = s->outbuf; + if (fwrite(s->outbuf, 1, Z_BUFSIZE, s->file) != Z_BUFSIZE) { + s->z_err = Z_ERRNO; + break; + } + s->stream.avail_out = Z_BUFSIZE; + } + s->in += s->stream.avail_in; + s->out += s->stream.avail_out; + s->z_err = deflate(&(s->stream), Z_NO_FLUSH); + s->in -= s->stream.avail_in; + s->out -= s->stream.avail_out; + if (s->z_err != Z_OK) break; + } + s->crc = crc32(s->crc, (const Bytef *)buf, len); + + return (int)(len - s->stream.avail_in); +} + + +/* =========================================================================== + Converts, formats, and writes the args to the compressed file under + control of the format string, as in fprintf. gzprintf returns the number of + uncompressed bytes actually written (0 in case of error). +*/ +#ifdef STDC +#include + +int ZEXPORTVA gzprintf (gzFile file, const char *format, /* args */ ...) +{ + char buf[Z_PRINTF_BUFSIZE]; + va_list va; + int len; + + buf[sizeof(buf) - 1] = 0; + va_start(va, format); +#ifdef NO_vsnprintf +# ifdef HAS_vsprintf_void + (void)vsprintf(buf, format, va); + va_end(va); + for (len = 0; len < sizeof(buf); len++) + if (buf[len] == 0) break; +# else + len = vsprintf(buf, format, va); + va_end(va); +# endif +#else +# ifdef HAS_vsnprintf_void + (void)vsnprintf(buf, sizeof(buf), format, va); + va_end(va); + len = strlen(buf); +# else + len = vsnprintf(buf, sizeof(buf), format, va); + va_end(va); +# endif +#endif + if (len <= 0 || len >= (int)sizeof(buf) || buf[sizeof(buf) - 1] != 0) + return 0; + return gzwrite(file, buf, (unsigned)len); +} +#else /* not ANSI C */ + +int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, + a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) + gzFile file; + const char *format; + int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, + a11, a12, a13, a14, a15, a16, a17, a18, a19, a20; +{ + char buf[Z_PRINTF_BUFSIZE]; + int len; + + buf[sizeof(buf) - 1] = 0; +#ifdef NO_snprintf +# ifdef HAS_sprintf_void + sprintf(buf, format, a1, a2, a3, a4, a5, a6, a7, a8, + a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); + for (len = 0; len < sizeof(buf); len++) + if (buf[len] == 0) break; +# else + len = sprintf(buf, format, a1, a2, a3, a4, a5, a6, a7, a8, + a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); +# endif +#else +# ifdef HAS_snprintf_void + snprintf(buf, sizeof(buf), format, a1, a2, a3, a4, a5, a6, a7, a8, + a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); + len = strlen(buf); +# else + len = snprintf(buf, sizeof(buf), format, a1, a2, a3, a4, a5, a6, a7, a8, + a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); +# endif +#endif + if (len <= 0 || len >= sizeof(buf) || buf[sizeof(buf) - 1] != 0) + return 0; + return gzwrite(file, buf, len); +} +#endif + +/* =========================================================================== + Writes c, converted to an unsigned char, into the compressed file. + gzputc returns the value that was written, or -1 in case of error. +*/ +int ZEXPORT gzputc(file, c) + gzFile file; + int c; +{ + unsigned char cc = (unsigned char) c; /* required for big endian systems */ + + return gzwrite(file, &cc, 1) == 1 ? (int)cc : -1; +} + + +/* =========================================================================== + Writes the given null-terminated string to the compressed file, excluding + the terminating null character. + gzputs returns the number of characters written, or -1 in case of error. +*/ +int ZEXPORT gzputs(file, s) + gzFile file; + const char *s; +{ + return gzwrite(file, (char*)s, (unsigned)strlen(s)); +} + + +/* =========================================================================== + Flushes all pending output into the compressed file. The parameter + flush is as in the deflate() function. +*/ +local int do_flush (file, flush) + gzFile file; + int flush; +{ + uInt len; + int done = 0; + gz_stream *s = (gz_stream*)file; + + if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR; + + s->stream.avail_in = 0; /* should be zero already anyway */ + + for (;;) { + len = Z_BUFSIZE - s->stream.avail_out; + + if (len != 0) { + if ((uInt)fwrite(s->outbuf, 1, len, s->file) != len) { + s->z_err = Z_ERRNO; + return Z_ERRNO; + } + s->stream.next_out = s->outbuf; + s->stream.avail_out = Z_BUFSIZE; + } + if (done) break; + s->out += s->stream.avail_out; + s->z_err = deflate(&(s->stream), flush); + s->out -= s->stream.avail_out; + + /* Ignore the second of two consecutive flushes: */ + if (len == 0 && s->z_err == Z_BUF_ERROR) s->z_err = Z_OK; + + /* deflate has finished flushing only when it hasn't used up + * all the available space in the output buffer: + */ + done = (s->stream.avail_out != 0 || s->z_err == Z_STREAM_END); + + if (s->z_err != Z_OK && s->z_err != Z_STREAM_END) break; + } + return s->z_err == Z_STREAM_END ? Z_OK : s->z_err; +} + +int ZEXPORT gzflush (file, flush) + gzFile file; + int flush; +{ + gz_stream *s = (gz_stream*)file; + int err = do_flush (file, flush); + + if (err) return err; + fflush(s->file); + return s->z_err == Z_STREAM_END ? Z_OK : s->z_err; +} +#endif /* NO_GZCOMPRESS */ + +/* =========================================================================== + Sets the starting position for the next gzread or gzwrite on the given + compressed file. The offset represents a number of bytes in the + gzseek returns the resulting offset location as measured in bytes from + the beginning of the uncompressed stream, or -1 in case of error. + SEEK_END is not implemented, returns error. + In this version of the library, gzseek can be extremely slow. +*/ +z_off_t ZEXPORT gzseek (file, offset, whence) + gzFile file; + z_off_t offset; + int whence; +{ + gz_stream *s = (gz_stream*)file; + + if (s == NULL || whence == SEEK_END || + s->z_err == Z_ERRNO || s->z_err == Z_DATA_ERROR) { + return -1L; + } + + if (s->mode == 'w') { +#ifdef NO_GZCOMPRESS + return -1L; +#else + if (whence == SEEK_SET) { + offset -= s->in; + } + if (offset < 0) return -1L; + + /* At this point, offset is the number of zero bytes to write. */ + if (s->inbuf == Z_NULL) { + s->inbuf = (Byte*)ALLOC(Z_BUFSIZE); /* for seeking */ + if (s->inbuf == Z_NULL) return -1L; + zmemzero(s->inbuf, Z_BUFSIZE); + } + while (offset > 0) { + uInt size = Z_BUFSIZE; + if (offset < Z_BUFSIZE) size = (uInt)offset; + + size = gzwrite(file, s->inbuf, size); + if (size == 0) return -1L; + + offset -= size; + } + return s->in; +#endif + } + /* Rest of function is for reading only */ + + /* compute absolute position */ + if (whence == SEEK_CUR) { + offset += s->out; + } + if (offset < 0) return -1L; + + if (s->transparent) { + /* map to fseek */ + s->back = EOF; + s->stream.avail_in = 0; + s->stream.next_in = s->inbuf; + if (fseek(s->file, offset, SEEK_SET) < 0) return -1L; + + s->in = s->out = offset; + return offset; + } + + /* For a negative seek, rewind and use positive seek */ + if (offset >= s->out) { + offset -= s->out; + } else if (gzrewind(file) < 0) { + return -1L; + } + /* offset is now the number of bytes to skip. */ + + if (offset != 0 && s->outbuf == Z_NULL) { + s->outbuf = (Byte*)ALLOC(Z_BUFSIZE); + if (s->outbuf == Z_NULL) return -1L; + } + if (offset && s->back != EOF) { + s->back = EOF; + s->out++; + offset--; + if (s->last) s->z_err = Z_STREAM_END; + } + while (offset > 0) { + int size = Z_BUFSIZE; + if (offset < Z_BUFSIZE) size = (int)offset; + + size = gzread(file, s->outbuf, (uInt)size); + if (size <= 0) return -1L; + offset -= size; + } + return s->out; +} + +/* =========================================================================== + Rewinds input file. +*/ +int ZEXPORT gzrewind (file) + gzFile file; +{ + gz_stream *s = (gz_stream*)file; + + if (s == NULL || s->mode != 'r') return -1; + + s->z_err = Z_OK; + s->z_eof = 0; + s->back = EOF; + s->stream.avail_in = 0; + s->stream.next_in = s->inbuf; + s->crc = crc32(0L, Z_NULL, 0); + if (!s->transparent) (void)inflateReset(&s->stream); + s->in = 0; + s->out = 0; + return fseek(s->file, s->start, SEEK_SET); +} + +/* =========================================================================== + Returns the starting position for the next gzread or gzwrite on the + given compressed file. This position represents a number of bytes in the + uncompressed data stream. +*/ +z_off_t ZEXPORT gztell (file) + gzFile file; +{ + return gzseek(file, 0L, SEEK_CUR); +} + +/* =========================================================================== + Returns 1 when EOF has previously been detected reading the given + input stream, otherwise zero. +*/ +int ZEXPORT gzeof (file) + gzFile file; +{ + gz_stream *s = (gz_stream*)file; + + /* With concatenated compressed files that can have embedded + * crc trailers, z_eof is no longer the only/best indicator of EOF + * on a gz_stream. Handle end-of-stream error explicitly here. + */ + if (s == NULL || s->mode != 'r') return 0; + if (s->z_eof) return 1; + return s->z_err == Z_STREAM_END; +} + +/* =========================================================================== + Returns 1 if reading and doing so transparently, otherwise zero. +*/ +int ZEXPORT gzdirect (file) + gzFile file; +{ + gz_stream *s = (gz_stream*)file; + + if (s == NULL || s->mode != 'r') return 0; + return s->transparent; +} + +/* =========================================================================== + Outputs a long in LSB order to the given file +*/ +local void putLong (file, x) + FILE *file; + uLong x; +{ + int n; + for (n = 0; n < 4; n++) { + fputc((int)(x & 0xff), file); + x >>= 8; + } +} + +/* =========================================================================== + Reads a long in LSB order from the given gz_stream. Sets z_err in case + of error. +*/ +local uLong getLong (s) + gz_stream *s; +{ + uLong x = (uLong)get_byte(s); + int c; + + x += ((uLong)get_byte(s))<<8; + x += ((uLong)get_byte(s))<<16; + c = get_byte(s); + if (c == EOF) s->z_err = Z_DATA_ERROR; + x += ((uLong)c)<<24; + return x; +} + +/* =========================================================================== + Flushes all pending output if necessary, closes the compressed file + and deallocates all the (de)compression state. +*/ +int ZEXPORT gzclose (file) + gzFile file; +{ + gz_stream *s = (gz_stream*)file; + + if (s == NULL) return Z_STREAM_ERROR; + + if (s->mode == 'w') { +#ifdef NO_GZCOMPRESS + return Z_STREAM_ERROR; +#else + if (do_flush (file, Z_FINISH) != Z_OK) + return destroy((gz_stream*)file); + + putLong (s->file, s->crc); + putLong (s->file, (uLong)(s->in & 0xffffffff)); +#endif + } + return destroy((gz_stream*)file); +} + +#ifdef STDC +# define zstrerror(errnum) strerror(errnum) +#else +# define zstrerror(errnum) "" +#endif + +/* =========================================================================== + Returns the error message for the last error which occurred on the + given compressed file. errnum is set to zlib error number. If an + error occurred in the file system and not in the compression library, + errnum is set to Z_ERRNO and the application may consult errno + to get the exact error code. +*/ +const char * ZEXPORT gzerror (file, errnum) + gzFile file; + int *errnum; +{ + char *m; + gz_stream *s = (gz_stream*)file; + + if (s == NULL) { + *errnum = Z_STREAM_ERROR; + return (const char*)ERR_MSG(Z_STREAM_ERROR); + } + *errnum = s->z_err; + if (*errnum == Z_OK) return (const char*)""; + + m = (char*)(*errnum == Z_ERRNO ? zstrerror(errno) : s->stream.msg); + + if (m == NULL || *m == '\0') m = (char*)ERR_MSG(s->z_err); + + TRYFREE(s->msg); + s->msg = (char*)ALLOC(strlen(s->path) + strlen(m) + 3); + if (s->msg == Z_NULL) return (const char*)ERR_MSG(Z_MEM_ERROR); + strcpy(s->msg, s->path); + strcat(s->msg, ": "); + strcat(s->msg, m); + return (const char*)s->msg; +} + +/* =========================================================================== + Clear the error and end-of-file flags, and do the same for the real file. +*/ +void ZEXPORT gzclearerr (file) + gzFile file; +{ + gz_stream *s = (gz_stream*)file; + + if (s == NULL) return; + if (s->z_err != Z_STREAM_END) s->z_err = Z_OK; + s->z_eof = 0; + clearerr(s->file); +} diff --git a/tools/bsnes/lib/zlib/inffast.c b/tools/bsnes/lib/zlib/inffast.c new file mode 100755 index 0000000..de92735 --- /dev/null +++ b/tools/bsnes/lib/zlib/inffast.c @@ -0,0 +1,724 @@ +/* inffast.c -- fast decoding + * Copyright (C) 1995-2004 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +#ifdef __i386__ + +void inflate_fast(strm, start) +z_streamp strm; +unsigned start; /* inflate()'s starting value for strm->avail_out */ +{ + struct inflate_state FAR *state; + struct inffast_ar { + void *esp; /* esp save */ + unsigned char FAR *in; /* local strm->next_in */ + unsigned char FAR *last; /* while in < last, enough input available */ + unsigned char FAR *out; /* local strm->next_out */ + unsigned char FAR *beg; /* inflate()'s initial strm->next_out */ + unsigned char FAR *end; /* while out < end, enough space available */ + unsigned wsize; /* window size or zero if not using window */ + unsigned write; /* window write index */ + unsigned char FAR *window; /* allocated sliding window, if wsize != 0 */ + unsigned long hold; /* local strm->hold */ + unsigned bits; /* local strm->bits */ + code const FAR *lcode; /* local strm->lencode */ + code const FAR *dcode; /* local strm->distcode */ + unsigned lmask; /* mask for first level of length codes */ + unsigned dmask; /* mask for first level of distance codes */ + unsigned len; /* match length, unused bytes */ + unsigned dist; /* match distance */ + unsigned status; /* this is set when state changes */ + } ar; + + /* copy state to local variables */ + state = (struct inflate_state FAR *)strm->state; + ar.in = strm->next_in; + ar.last = ar.in + (strm->avail_in - 5); + ar.out = strm->next_out; + ar.beg = ar.out - (start - strm->avail_out); + ar.end = ar.out + (strm->avail_out - 257); + ar.wsize = state->wsize; + ar.write = state->write; + ar.window = state->window; + ar.hold = state->hold; + ar.bits = state->bits; + ar.lcode = state->lencode; + ar.dcode = state->distcode; + ar.lmask = (1U << state->lenbits) - 1; + ar.dmask = (1U << state->distbits) - 1; + + /* decode literals and length/distances until end-of-block or not enough + input data or output space */ + + /* align in on 2 byte boundary */ + if (((unsigned long)(void *)ar.in & 0x1) != 0) { + ar.hold += (unsigned long)*ar.in++ << ar.bits; + ar.bits += 8; + } + + __asm__ __volatile__ ( +" leal %0, %%eax\n" +" pushf\n" +" pushl %%ebp\n" +" movl %%esp, (%%eax)\n" +" movl %%eax, %%esp\n" +" movl 4(%%esp), %%esi\n" /* esi = in */ +" movl 12(%%esp), %%edi\n" /* edi = out */ +" movl 36(%%esp), %%edx\n" /* edx = hold */ +" movl 40(%%esp), %%ebx\n" /* ebx = bits */ +" movl 44(%%esp), %%ebp\n" /* ebp = lcode */ + +" cld\n" +" jmp .L_do_loop\n" + +".L_while_test:\n" +" cmpl %%edi, 20(%%esp)\n" +" jbe .L_break_loop\n" +" cmpl %%esi, 8(%%esp)\n" +" jbe .L_break_loop\n" + +".L_do_loop:\n" +" cmpb $15, %%bl\n" +" ja .L_get_length_code\n" /* if (15 < bits) */ + +" xorl %%eax, %%eax\n" +" lodsw\n" /* al = *(ushort *)in++ */ +" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */ +" addb $16, %%bl\n" /* bits += 16 */ +" shll %%cl, %%eax\n" +" orl %%eax, %%edx\n" /* hold |= *((ushort *)in)++ << bits */ + +".L_get_length_code:\n" +" movl 52(%%esp), %%eax\n" /* eax = lmask */ +" andl %%edx, %%eax\n" /* eax &= hold */ +" movl (%%ebp,%%eax,4), %%eax\n" /* eax = lcode[hold & lmask] */ + +".L_dolen:\n" +" movb %%ah, %%cl\n" /* cl = this.bits */ +" subb %%ah, %%bl\n" /* bits -= this.bits */ +" shrl %%cl, %%edx\n" /* hold >>= this.bits */ + +" testb %%al, %%al\n" +" jnz .L_test_for_length_base\n" /* if (op != 0) 45.7% */ + +" shrl $16, %%eax\n" /* output this.val char */ +" stosb\n" +" jmp .L_while_test\n" + +".L_test_for_length_base:\n" +" movl %%eax, %%ecx\n" /* len = this */ +" shrl $16, %%ecx\n" /* len = this.val */ +" movl %%ecx, 60(%%esp)\n" /* len = this */ +" movb %%al, %%cl\n" + +" testb $16, %%al\n" +" jz .L_test_for_second_level_length\n" /* if ((op & 16) == 0) 8% */ +" andb $15, %%cl\n" /* op &= 15 */ +" jz .L_decode_distance\n" /* if (!op) */ +" cmpb %%cl, %%bl\n" +" jae .L_add_bits_to_len\n" /* if (op <= bits) */ + +" movb %%cl, %%ch\n" /* stash op in ch, freeing cl */ +" xorl %%eax, %%eax\n" +" lodsw\n" /* al = *(ushort *)in++ */ +" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */ +" addb $16, %%bl\n" /* bits += 16 */ +" shll %%cl, %%eax\n" +" orl %%eax, %%edx\n" /* hold |= *((ushort *)in)++ << bits */ +" movb %%ch, %%cl\n" /* move op back to ecx */ + +".L_add_bits_to_len:\n" +" movl $1, %%eax\n" +" shll %%cl, %%eax\n" +" decl %%eax\n" +" subb %%cl, %%bl\n" +" andl %%edx, %%eax\n" /* eax &= hold */ +" shrl %%cl, %%edx\n" +" addl %%eax, 60(%%esp)\n" /* len += hold & mask[op] */ + +".L_decode_distance:\n" +" cmpb $15, %%bl\n" +" ja .L_get_distance_code\n" /* if (15 < bits) */ + +" xorl %%eax, %%eax\n" +" lodsw\n" /* al = *(ushort *)in++ */ +" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */ +" addb $16, %%bl\n" /* bits += 16 */ +" shll %%cl, %%eax\n" +" orl %%eax, %%edx\n" /* hold |= *((ushort *)in)++ << bits */ + +".L_get_distance_code:\n" +" movl 56(%%esp), %%eax\n" /* eax = dmask */ +" movl 48(%%esp), %%ecx\n" /* ecx = dcode */ +" andl %%edx, %%eax\n" /* eax &= hold */ +" movl (%%ecx,%%eax,4), %%eax\n"/* eax = dcode[hold & dmask] */ + +".L_dodist:\n" +" movl %%eax, %%ebp\n" /* dist = this */ +" shrl $16, %%ebp\n" /* dist = this.val */ +" movb %%ah, %%cl\n" +" subb %%ah, %%bl\n" /* bits -= this.bits */ +" shrl %%cl, %%edx\n" /* hold >>= this.bits */ +" movb %%al, %%cl\n" /* cl = this.op */ + +" testb $16, %%al\n" /* if ((op & 16) == 0) */ +" jz .L_test_for_second_level_dist\n" +" andb $15, %%cl\n" /* op &= 15 */ +" jz .L_check_dist_one\n" +" cmpb %%cl, %%bl\n" +" jae .L_add_bits_to_dist\n" /* if (op <= bits) 97.6% */ + +" movb %%cl, %%ch\n" /* stash op in ch, freeing cl */ +" xorl %%eax, %%eax\n" +" lodsw\n" /* al = *(ushort *)in++ */ +" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */ +" addb $16, %%bl\n" /* bits += 16 */ +" shll %%cl, %%eax\n" +" orl %%eax, %%edx\n" /* hold |= *((ushort *)in)++ << bits */ +" movb %%ch, %%cl\n" /* move op back to ecx */ + +".L_add_bits_to_dist:\n" +" movl $1, %%eax\n" +" shll %%cl, %%eax\n" +" decl %%eax\n" /* (1 << op) - 1 */ +" subb %%cl, %%bl\n" +" andl %%edx, %%eax\n" /* eax &= hold */ +" shrl %%cl, %%edx\n" +" addl %%eax, %%ebp\n" /* dist += hold & ((1 << op) - 1) */ + +".L_check_window:\n" +" movl %%esi, 4(%%esp)\n" /* save in so from can use it's reg */ +" movl %%edi, %%eax\n" +" subl 16(%%esp), %%eax\n" /* nbytes = out - beg */ + +" cmpl %%ebp, %%eax\n" +" jb .L_clip_window\n" /* if (dist > nbytes) 4.2% */ + +" movl 60(%%esp), %%ecx\n" +" movl %%edi, %%esi\n" +" subl %%ebp, %%esi\n" /* from = out - dist */ + +" subl $3, %%ecx\n" /* copy from to out */ +" movb (%%esi), %%al\n" +" movb %%al, (%%edi)\n" +" movb 1(%%esi), %%al\n" +" movb 2(%%esi), %%ah\n" +" addl $3, %%esi\n" +" movb %%al, 1(%%edi)\n" +" movb %%ah, 2(%%edi)\n" +" addl $3, %%edi\n" +" rep movsb\n" + +" movl 4(%%esp), %%esi\n" /* move in back to %esi, toss from */ +" movl 44(%%esp), %%ebp\n" /* ebp = lcode */ +" jmp .L_while_test\n" + +".L_check_dist_one:\n" +" cmpl $1, %%ebp\n" /* if dist 1, is a memset */ +" jne .L_check_window\n" +" cmpl %%edi, 16(%%esp)\n" +" je .L_check_window\n" + +" decl %%edi\n" +" movl 60(%%esp), %%ecx\n" +" movb (%%edi), %%al\n" +" subl $3, %%ecx\n" + +" movb %%al, 1(%%edi)\n" /* memset out with from[-1] */ +" movb %%al, 2(%%edi)\n" +" movb %%al, 3(%%edi)\n" +" addl $4, %%edi\n" +" rep stosb\n" +" movl 44(%%esp), %%ebp\n" /* ebp = lcode */ +" jmp .L_while_test\n" + +".L_test_for_second_level_length:\n" +" testb $64, %%al\n" +" jnz .L_test_for_end_of_block\n" /* if ((op & 64) != 0) */ + +" movl $1, %%eax\n" +" shll %%cl, %%eax\n" +" decl %%eax\n" +" andl %%edx, %%eax\n" /* eax &= hold */ +" addl 60(%%esp), %%eax\n" /* eax += this.val */ +" movl (%%ebp,%%eax,4), %%eax\n" /* eax = lcode[val+(hold&mask[op])]*/ +" jmp .L_dolen\n" + +".L_test_for_second_level_dist:\n" +" testb $64, %%al\n" +" jnz .L_invalid_distance_code\n" /* if ((op & 64) != 0) */ + +" movl $1, %%eax\n" +" shll %%cl, %%eax\n" +" decl %%eax\n" +" andl %%edx, %%eax\n" /* eax &= hold */ +" addl %%ebp, %%eax\n" /* eax += this.val */ +" movl 48(%%esp), %%ecx\n" /* ecx = dcode */ +" movl (%%ecx,%%eax,4), %%eax\n" /* eax = dcode[val+(hold&mask[op])]*/ +" jmp .L_dodist\n" + +".L_clip_window:\n" +" movl %%eax, %%ecx\n" +" movl 24(%%esp), %%eax\n" /* prepare for dist compare */ +" negl %%ecx\n" /* nbytes = -nbytes */ +" movl 32(%%esp), %%esi\n" /* from = window */ + +" cmpl %%ebp, %%eax\n" +" jb .L_invalid_distance_too_far\n" /* if (dist > wsize) */ + +" addl %%ebp, %%ecx\n" /* nbytes = dist - nbytes */ +" cmpl $0, 28(%%esp)\n" +" jne .L_wrap_around_window\n" /* if (write != 0) */ + +" subl %%ecx, %%eax\n" +" addl %%eax, %%esi\n" /* from += wsize - nbytes */ + +" movl 60(%%esp), %%eax\n" +" cmpl %%ecx, %%eax\n" +" jbe .L_do_copy1\n" /* if (nbytes >= len) */ + +" subl %%ecx, %%eax\n" /* len -= nbytes */ +" rep movsb\n" +" movl %%edi, %%esi\n" +" subl %%ebp, %%esi\n" /* from = out - dist */ +" jmp .L_do_copy1\n" + +" cmpl %%ecx, %%eax\n" +" jbe .L_do_copy1\n" /* if (nbytes >= len) */ + +" subl %%ecx, %%eax\n" /* len -= nbytes */ +" rep movsb\n" +" movl %%edi, %%esi\n" +" subl %%ebp, %%esi\n" /* from = out - dist */ +" jmp .L_do_copy1\n" + +".L_wrap_around_window:\n" +" movl 28(%%esp), %%eax\n" +" cmpl %%eax, %%ecx\n" +" jbe .L_contiguous_in_window\n" /* if (write >= nbytes) */ + +" addl 24(%%esp), %%esi\n" +" addl %%eax, %%esi\n" +" subl %%ecx, %%esi\n" /* from += wsize + write - nbytes */ +" subl %%eax, %%ecx\n" /* nbytes -= write */ + +" movl 60(%%esp), %%eax\n" +" cmpl %%ecx, %%eax\n" +" jbe .L_do_copy1\n" /* if (nbytes >= len) */ + +" subl %%ecx, %%eax\n" /* len -= nbytes */ +" rep movsb\n" +" movl 32(%%esp), %%esi\n" /* from = window */ +" movl 28(%%esp), %%ecx\n" /* nbytes = write */ +" cmpl %%ecx, %%eax\n" +" jbe .L_do_copy1\n" /* if (nbytes >= len) */ + +" subl %%ecx, %%eax\n" /* len -= nbytes */ +" rep movsb\n" +" movl %%edi, %%esi\n" +" subl %%ebp, %%esi\n" /* from = out - dist */ +" jmp .L_do_copy1\n" + +".L_contiguous_in_window:\n" +" addl %%eax, %%esi\n" +" subl %%ecx, %%esi\n" /* from += write - nbytes */ + +" movl 60(%%esp), %%eax\n" +" cmpl %%ecx, %%eax\n" +" jbe .L_do_copy1\n" /* if (nbytes >= len) */ + +" subl %%ecx, %%eax\n" /* len -= nbytes */ +" rep movsb\n" +" movl %%edi, %%esi\n" +" subl %%ebp, %%esi\n" /* from = out - dist */ + +".L_do_copy1:\n" +" movl %%eax, %%ecx\n" +" rep movsb\n" + +" movl 4(%%esp), %%esi\n" /* move in back to %esi, toss from */ +" movl 44(%%esp), %%ebp\n" /* ebp = lcode */ +" jmp .L_while_test\n" + +".L_test_for_end_of_block:\n" +" testb $32, %%al\n" +" jz .L_invalid_literal_length_code\n" +" movl $1, 68(%%esp)\n" +" jmp .L_break_loop_with_status\n" + +".L_invalid_literal_length_code:\n" +" movl $2, 68(%%esp)\n" +" jmp .L_break_loop_with_status\n" + +".L_invalid_distance_code:\n" +" movl $3, 68(%%esp)\n" +" jmp .L_break_loop_with_status\n" + +".L_invalid_distance_too_far:\n" +" movl 4(%%esp), %%esi\n" +" movl $4, 68(%%esp)\n" +" jmp .L_break_loop_with_status\n" + +".L_break_loop:\n" +" movl $0, 68(%%esp)\n" + +".L_break_loop_with_status:\n" +/* put in, out, bits, and hold back into ar and pop esp */ +" movl %%esi, 4(%%esp)\n" +" movl %%edi, 12(%%esp)\n" +" movl %%ebx, 40(%%esp)\n" +" movl %%edx, 36(%%esp)\n" +" movl (%%esp), %%esp\n" +" popl %%ebp\n" +" popf\n" + : + : "m" (ar) + : "memory", "%eax", "%ebx", "%ecx", "%edx", "%esi", "%edi" + ); + + + if (ar.status > 1) { + if (ar.status == 2) + strm->msg = "invalid literal/length code"; + else if (ar.status == 3) + strm->msg = "invalid distance code"; + else + strm->msg = "invalid distance too far back"; + state->mode = BAD; + } + else if ( ar.status == 1 ) { + state->mode = TYPE; + } + + /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ + ar.len = ar.bits >> 3; + ar.in -= ar.len; + ar.bits -= ar.len << 3; + ar.hold &= (1U << ar.bits) - 1; + + /* update state and return */ + strm->next_in = ar.in; + strm->next_out = ar.out; + strm->avail_in = (unsigned)(ar.in < ar.last ? 5 + (ar.last - ar.in) : + 5 - (ar.in - ar.last)); + strm->avail_out = (unsigned)(ar.out < ar.end ? 257 + (ar.end - ar.out) : + 257 - (ar.out - ar.end)); + state->hold = ar.hold; + state->bits = ar.bits; + return; +} + +#else + +/* Allow machine dependent optimization for post-increment or pre-increment. + Based on testing to date, + Pre-increment preferred for: + - PowerPC G3 (Adler) + - MIPS R5000 (Randers-Pehrson) + Post-increment preferred for: + - none + No measurable difference: + - Pentium III (Anderson) + - M68060 (Nikl) + */ +#ifdef POSTINC +# define OFF 0 +# define PUP(a) *(a)++ +#else +# define OFF 1 +# define PUP(a) *++(a) +#endif + +/* + Decode literal, length, and distance codes and write out the resulting + literal and match bytes until either not enough input or output is + available, an end-of-block is encountered, or a data error is encountered. + When large enough input and output buffers are supplied to inflate(), for + example, a 16K input buffer and a 64K output buffer, more than 95% of the + inflate execution time is spent in this routine. + + Entry assumptions: + + state->mode == LEN + strm->avail_in >= 6 + strm->avail_out >= 258 + start >= strm->avail_out + state->bits < 8 + + On return, state->mode is one of: + + LEN -- ran out of enough output space or enough available input + TYPE -- reached end of block code, inflate() to interpret next block + BAD -- error in block data + + Notes: + + - The maximum input bits used by a length/distance pair is 15 bits for the + length code, 5 bits for the length extra, 15 bits for the distance code, + and 13 bits for the distance extra. This totals 48 bits, or six bytes. + Therefore if strm->avail_in >= 6, then there is enough input to avoid + checking for available input while decoding. + + - The maximum bytes that a single length/distance pair can output is 258 + bytes, which is the maximum length that can be coded. inflate_fast() + requires strm->avail_out >= 258 for each loop to avoid checking for + output space. + */ +void inflate_fast(strm, start) +z_streamp strm; +unsigned start; /* inflate()'s starting value for strm->avail_out */ +{ + struct inflate_state FAR *state; + unsigned char FAR *in; /* local strm->next_in */ + unsigned char FAR *last; /* while in < last, enough input available */ + unsigned char FAR *out; /* local strm->next_out */ + unsigned char FAR *beg; /* inflate()'s initial strm->next_out */ + unsigned char FAR *end; /* while out < end, enough space available */ +#ifdef INFLATE_STRICT + unsigned dmax; /* maximum distance from zlib header */ +#endif + unsigned wsize; /* window size or zero if not using window */ + unsigned whave; /* valid bytes in the window */ + unsigned write; /* window write index */ + unsigned char FAR *window; /* allocated sliding window, if wsize != 0 */ + unsigned long hold; /* local strm->hold */ + unsigned bits; /* local strm->bits */ + code const FAR *lcode; /* local strm->lencode */ + code const FAR *dcode; /* local strm->distcode */ + unsigned lmask; /* mask for first level of length codes */ + unsigned dmask; /* mask for first level of distance codes */ + code this; /* retrieved table entry */ + unsigned op; /* code bits, operation, extra bits, or */ + /* window position, window bytes to copy */ + unsigned len; /* match length, unused bytes */ + unsigned dist; /* match distance */ + unsigned char FAR *from; /* where to copy match from */ + + /* copy state to local variables */ + state = (struct inflate_state FAR *)strm->state; + in = strm->next_in - OFF; + last = in + (strm->avail_in - 5); + out = strm->next_out - OFF; + beg = out - (start - strm->avail_out); + end = out + (strm->avail_out - 257); +#ifdef INFLATE_STRICT + dmax = state->dmax; +#endif + wsize = state->wsize; + whave = state->whave; + write = state->write; + window = state->window; + hold = state->hold; + bits = state->bits; + lcode = state->lencode; + dcode = state->distcode; + lmask = (1U << state->lenbits) - 1; + dmask = (1U << state->distbits) - 1; + + /* decode literals and length/distances until end-of-block or not enough + input data or output space */ + do { + if (bits < 15) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + } + this = lcode[hold & lmask]; + dolen: + op = (unsigned)(this.bits); + hold >>= op; + bits -= op; + op = (unsigned)(this.op); + if (op == 0) { /* literal */ + Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", this.val)); + PUP(out) = (unsigned char)(this.val); + } + else if (op & 16) { /* length base */ + len = (unsigned)(this.val); + op &= 15; /* number of extra bits */ + if (op) { + if (bits < op) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + } + len += (unsigned)hold & ((1U << op) - 1); + hold >>= op; + bits -= op; + } + Tracevv((stderr, "inflate: length %u\n", len)); + if (bits < 15) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + } + this = dcode[hold & dmask]; + dodist: + op = (unsigned)(this.bits); + hold >>= op; + bits -= op; + op = (unsigned)(this.op); + if (op & 16) { /* distance base */ + dist = (unsigned)(this.val); + op &= 15; /* number of extra bits */ + if (bits < op) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + if (bits < op) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + } + } + dist += (unsigned)hold & ((1U << op) - 1); +#ifdef INFLATE_STRICT + if (dist > dmax) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#endif + hold >>= op; + bits -= op; + Tracevv((stderr, "inflate: distance %u\n", dist)); + op = (unsigned)(out - beg); /* max distance in output */ + if (dist > op) { /* see if copy from window */ + op = dist - op; /* distance back in window */ + if (op > whave) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } + from = window - OFF; + if (write == 0) { /* very common case */ + from += wsize - op; + if (op < len) { /* some from window */ + len -= op; + do { + PUP(out) = PUP(from); + } while (--op); + from = out - dist; /* rest from output */ + } + } + else if (write < op) { /* wrap around window */ + from += wsize + write - op; + op -= write; + if (op < len) { /* some from end of window */ + len -= op; + do { + PUP(out) = PUP(from); + } while (--op); + from = window - OFF; + if (write < len) { /* some from start of window */ + op = write; + len -= op; + do { + PUP(out) = PUP(from); + } while (--op); + from = out - dist; /* rest from output */ + } + } + } + else { /* contiguous in window */ + from += write - op; + if (op < len) { /* some from window */ + len -= op; + do { + PUP(out) = PUP(from); + } while (--op); + from = out - dist; /* rest from output */ + } + } + while (len > 2) { + PUP(out) = PUP(from); + PUP(out) = PUP(from); + PUP(out) = PUP(from); + len -= 3; + } + if (len) { + PUP(out) = PUP(from); + if (len > 1) + PUP(out) = PUP(from); + } + } + else { + from = out - dist; /* copy direct from output */ + do { /* minimum length is three */ + PUP(out) = PUP(from); + PUP(out) = PUP(from); + PUP(out) = PUP(from); + len -= 3; + } while (len > 2); + if (len) { + PUP(out) = PUP(from); + if (len > 1) + PUP(out) = PUP(from); + } + } + } + else if ((op & 64) == 0) { /* 2nd level distance code */ + this = dcode[this.val + (hold & ((1U << op) - 1))]; + goto dodist; + } + else { + strm->msg = (char *)"invalid distance code"; + state->mode = BAD; + break; + } + } + else if ((op & 64) == 0) { /* 2nd level length code */ + this = lcode[this.val + (hold & ((1U << op) - 1))]; + goto dolen; + } + else if (op & 32) { /* end-of-block */ + Tracevv((stderr, "inflate: end of block\n")); + state->mode = TYPE; + break; + } + else { + strm->msg = (char *)"invalid literal/length code"; + state->mode = BAD; + break; + } + } while (in < last && out < end); + + /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ + len = bits >> 3; + in -= len; + bits -= len << 3; + hold &= (1U << bits) - 1; + + /* update state and return */ + strm->next_in = in + OFF; + strm->next_out = out + OFF; + strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last)); + strm->avail_out = (unsigned)(out < end ? + 257 + (end - out) : 257 - (out - end)); + state->hold = hold; + state->bits = bits; + return; +} + +/* + inflate_fast() speedups that turned out slower (on a PowerPC G3 750CXe): + - Using bit fields for code structure + - Different op definition to avoid & for extra bits (do & for table bits) + - Three separate decoding do-loops for direct, window, and write == 0 + - Special case for distance > 1 copies to do overlapped load and store copy + - Explicit branch predictions (based on measured branch probabilities) + - Deferring match copy and interspersed it with decoding subsequent codes + - Swapping literal/length else + - Swapping window/direct else + - Larger unrolled copy loops (three is about right) + - Moving len -= 3 statement into middle of loop + */ + +#endif /* !i386 */ diff --git a/tools/bsnes/lib/zlib/inffast.h b/tools/bsnes/lib/zlib/inffast.h new file mode 100755 index 0000000..1e88d2d --- /dev/null +++ b/tools/bsnes/lib/zlib/inffast.h @@ -0,0 +1,11 @@ +/* inffast.h -- header to use inffast.c + * Copyright (C) 1995-2003 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +void inflate_fast OF((z_streamp strm, unsigned start)); diff --git a/tools/bsnes/lib/zlib/inffixed.h b/tools/bsnes/lib/zlib/inffixed.h new file mode 100755 index 0000000..75ed4b5 --- /dev/null +++ b/tools/bsnes/lib/zlib/inffixed.h @@ -0,0 +1,94 @@ + /* inffixed.h -- table for decoding fixed codes + * Generated automatically by makefixed(). + */ + + /* WARNING: this file should *not* be used by applications. It + is part of the implementation of the compression library and + is subject to change. Applications should only use zlib.h. + */ + + static const code lenfix[512] = { + {96,7,0},{0,8,80},{0,8,16},{20,8,115},{18,7,31},{0,8,112},{0,8,48}, + {0,9,192},{16,7,10},{0,8,96},{0,8,32},{0,9,160},{0,8,0},{0,8,128}, + {0,8,64},{0,9,224},{16,7,6},{0,8,88},{0,8,24},{0,9,144},{19,7,59}, + {0,8,120},{0,8,56},{0,9,208},{17,7,17},{0,8,104},{0,8,40},{0,9,176}, + {0,8,8},{0,8,136},{0,8,72},{0,9,240},{16,7,4},{0,8,84},{0,8,20}, + {21,8,227},{19,7,43},{0,8,116},{0,8,52},{0,9,200},{17,7,13},{0,8,100}, + {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232},{16,7,8}, + {0,8,92},{0,8,28},{0,9,152},{20,7,83},{0,8,124},{0,8,60},{0,9,216}, + {18,7,23},{0,8,108},{0,8,44},{0,9,184},{0,8,12},{0,8,140},{0,8,76}, + {0,9,248},{16,7,3},{0,8,82},{0,8,18},{21,8,163},{19,7,35},{0,8,114}, + {0,8,50},{0,9,196},{17,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2}, + {0,8,130},{0,8,66},{0,9,228},{16,7,7},{0,8,90},{0,8,26},{0,9,148}, + {20,7,67},{0,8,122},{0,8,58},{0,9,212},{18,7,19},{0,8,106},{0,8,42}, + {0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244},{16,7,5},{0,8,86}, + {0,8,22},{64,8,0},{19,7,51},{0,8,118},{0,8,54},{0,9,204},{17,7,15}, + {0,8,102},{0,8,38},{0,9,172},{0,8,6},{0,8,134},{0,8,70},{0,9,236}, + {16,7,9},{0,8,94},{0,8,30},{0,9,156},{20,7,99},{0,8,126},{0,8,62}, + {0,9,220},{18,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142}, + {0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{21,8,131},{18,7,31}, + {0,8,113},{0,8,49},{0,9,194},{16,7,10},{0,8,97},{0,8,33},{0,9,162}, + {0,8,1},{0,8,129},{0,8,65},{0,9,226},{16,7,6},{0,8,89},{0,8,25}, + {0,9,146},{19,7,59},{0,8,121},{0,8,57},{0,9,210},{17,7,17},{0,8,105}, + {0,8,41},{0,9,178},{0,8,9},{0,8,137},{0,8,73},{0,9,242},{16,7,4}, + {0,8,85},{0,8,21},{16,8,258},{19,7,43},{0,8,117},{0,8,53},{0,9,202}, + {17,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133},{0,8,69}, + {0,9,234},{16,7,8},{0,8,93},{0,8,29},{0,9,154},{20,7,83},{0,8,125}, + {0,8,61},{0,9,218},{18,7,23},{0,8,109},{0,8,45},{0,9,186},{0,8,13}, + {0,8,141},{0,8,77},{0,9,250},{16,7,3},{0,8,83},{0,8,19},{21,8,195}, + {19,7,35},{0,8,115},{0,8,51},{0,9,198},{17,7,11},{0,8,99},{0,8,35}, + {0,9,166},{0,8,3},{0,8,131},{0,8,67},{0,9,230},{16,7,7},{0,8,91}, + {0,8,27},{0,9,150},{20,7,67},{0,8,123},{0,8,59},{0,9,214},{18,7,19}, + {0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139},{0,8,75},{0,9,246}, + {16,7,5},{0,8,87},{0,8,23},{64,8,0},{19,7,51},{0,8,119},{0,8,55}, + {0,9,206},{17,7,15},{0,8,103},{0,8,39},{0,9,174},{0,8,7},{0,8,135}, + {0,8,71},{0,9,238},{16,7,9},{0,8,95},{0,8,31},{0,9,158},{20,7,99}, + {0,8,127},{0,8,63},{0,9,222},{18,7,27},{0,8,111},{0,8,47},{0,9,190}, + {0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80},{0,8,16}, + {20,8,115},{18,7,31},{0,8,112},{0,8,48},{0,9,193},{16,7,10},{0,8,96}, + {0,8,32},{0,9,161},{0,8,0},{0,8,128},{0,8,64},{0,9,225},{16,7,6}, + {0,8,88},{0,8,24},{0,9,145},{19,7,59},{0,8,120},{0,8,56},{0,9,209}, + {17,7,17},{0,8,104},{0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72}, + {0,9,241},{16,7,4},{0,8,84},{0,8,20},{21,8,227},{19,7,43},{0,8,116}, + {0,8,52},{0,9,201},{17,7,13},{0,8,100},{0,8,36},{0,9,169},{0,8,4}, + {0,8,132},{0,8,68},{0,9,233},{16,7,8},{0,8,92},{0,8,28},{0,9,153}, + {20,7,83},{0,8,124},{0,8,60},{0,9,217},{18,7,23},{0,8,108},{0,8,44}, + {0,9,185},{0,8,12},{0,8,140},{0,8,76},{0,9,249},{16,7,3},{0,8,82}, + {0,8,18},{21,8,163},{19,7,35},{0,8,114},{0,8,50},{0,9,197},{17,7,11}, + {0,8,98},{0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229}, + {16,7,7},{0,8,90},{0,8,26},{0,9,149},{20,7,67},{0,8,122},{0,8,58}, + {0,9,213},{18,7,19},{0,8,106},{0,8,42},{0,9,181},{0,8,10},{0,8,138}, + {0,8,74},{0,9,245},{16,7,5},{0,8,86},{0,8,22},{64,8,0},{19,7,51}, + {0,8,118},{0,8,54},{0,9,205},{17,7,15},{0,8,102},{0,8,38},{0,9,173}, + {0,8,6},{0,8,134},{0,8,70},{0,9,237},{16,7,9},{0,8,94},{0,8,30}, + {0,9,157},{20,7,99},{0,8,126},{0,8,62},{0,9,221},{18,7,27},{0,8,110}, + {0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253},{96,7,0}, + {0,8,81},{0,8,17},{21,8,131},{18,7,31},{0,8,113},{0,8,49},{0,9,195}, + {16,7,10},{0,8,97},{0,8,33},{0,9,163},{0,8,1},{0,8,129},{0,8,65}, + {0,9,227},{16,7,6},{0,8,89},{0,8,25},{0,9,147},{19,7,59},{0,8,121}, + {0,8,57},{0,9,211},{17,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9}, + {0,8,137},{0,8,73},{0,9,243},{16,7,4},{0,8,85},{0,8,21},{16,8,258}, + {19,7,43},{0,8,117},{0,8,53},{0,9,203},{17,7,13},{0,8,101},{0,8,37}, + {0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235},{16,7,8},{0,8,93}, + {0,8,29},{0,9,155},{20,7,83},{0,8,125},{0,8,61},{0,9,219},{18,7,23}, + {0,8,109},{0,8,45},{0,9,187},{0,8,13},{0,8,141},{0,8,77},{0,9,251}, + {16,7,3},{0,8,83},{0,8,19},{21,8,195},{19,7,35},{0,8,115},{0,8,51}, + {0,9,199},{17,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131}, + {0,8,67},{0,9,231},{16,7,7},{0,8,91},{0,8,27},{0,9,151},{20,7,67}, + {0,8,123},{0,8,59},{0,9,215},{18,7,19},{0,8,107},{0,8,43},{0,9,183}, + {0,8,11},{0,8,139},{0,8,75},{0,9,247},{16,7,5},{0,8,87},{0,8,23}, + {64,8,0},{19,7,51},{0,8,119},{0,8,55},{0,9,207},{17,7,15},{0,8,103}, + {0,8,39},{0,9,175},{0,8,7},{0,8,135},{0,8,71},{0,9,239},{16,7,9}, + {0,8,95},{0,8,31},{0,9,159},{20,7,99},{0,8,127},{0,8,63},{0,9,223}, + {18,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143},{0,8,79}, + {0,9,255} + }; + + static const code distfix[32] = { + {16,5,1},{23,5,257},{19,5,17},{27,5,4097},{17,5,5},{25,5,1025}, + {21,5,65},{29,5,16385},{16,5,3},{24,5,513},{20,5,33},{28,5,8193}, + {18,5,9},{26,5,2049},{22,5,129},{64,5,0},{16,5,2},{23,5,385}, + {19,5,25},{27,5,6145},{17,5,7},{25,5,1537},{21,5,97},{29,5,24577}, + {16,5,4},{24,5,769},{20,5,49},{28,5,12289},{18,5,13},{26,5,3073}, + {22,5,193},{64,5,0} + }; diff --git a/tools/bsnes/lib/zlib/inflate.c b/tools/bsnes/lib/zlib/inflate.c new file mode 100755 index 0000000..792fdee --- /dev/null +++ b/tools/bsnes/lib/zlib/inflate.c @@ -0,0 +1,1368 @@ +/* inflate.c -- zlib decompression + * Copyright (C) 1995-2005 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * Change history: + * + * 1.2.beta0 24 Nov 2002 + * - First version -- complete rewrite of inflate to simplify code, avoid + * creation of window when not needed, minimize use of window when it is + * needed, make inffast.c even faster, implement gzip decoding, and to + * improve code readability and style over the previous zlib inflate code + * + * 1.2.beta1 25 Nov 2002 + * - Use pointers for available input and output checking in inffast.c + * - Remove input and output counters in inffast.c + * - Change inffast.c entry and loop from avail_in >= 7 to >= 6 + * - Remove unnecessary second byte pull from length extra in inffast.c + * - Unroll direct copy to three copies per loop in inffast.c + * + * 1.2.beta2 4 Dec 2002 + * - Change external routine names to reduce potential conflicts + * - Correct filename to inffixed.h for fixed tables in inflate.c + * - Make hbuf[] unsigned char to match parameter type in inflate.c + * - Change strm->next_out[-state->offset] to *(strm->next_out - state->offset) + * to avoid negation problem on Alphas (64 bit) in inflate.c + * + * 1.2.beta3 22 Dec 2002 + * - Add comments on state->bits assertion in inffast.c + * - Add comments on op field in inftrees.h + * - Fix bug in reuse of allocated window after inflateReset() + * - Remove bit fields--back to byte structure for speed + * - Remove distance extra == 0 check in inflate_fast()--only helps for lengths + * - Change post-increments to pre-increments in inflate_fast(), PPC biased? + * - Add compile time option, POSTINC, to use post-increments instead (Intel?) + * - Make MATCH copy in inflate() much faster for when inflate_fast() not used + * - Use local copies of stream next and avail values, as well as local bit + * buffer and bit count in inflate()--for speed when inflate_fast() not used + * + * 1.2.beta4 1 Jan 2003 + * - Split ptr - 257 statements in inflate_table() to avoid compiler warnings + * - Move a comment on output buffer sizes from inffast.c to inflate.c + * - Add comments in inffast.c to introduce the inflate_fast() routine + * - Rearrange window copies in inflate_fast() for speed and simplification + * - Unroll last copy for window match in inflate_fast() + * - Use local copies of window variables in inflate_fast() for speed + * - Pull out common write == 0 case for speed in inflate_fast() + * - Make op and len in inflate_fast() unsigned for consistency + * - Add FAR to lcode and dcode declarations in inflate_fast() + * - Simplified bad distance check in inflate_fast() + * - Added inflateBackInit(), inflateBack(), and inflateBackEnd() in new + * source file infback.c to provide a call-back interface to inflate for + * programs like gzip and unzip -- uses window as output buffer to avoid + * window copying + * + * 1.2.beta5 1 Jan 2003 + * - Improved inflateBack() interface to allow the caller to provide initial + * input in strm. + * - Fixed stored blocks bug in inflateBack() + * + * 1.2.beta6 4 Jan 2003 + * - Added comments in inffast.c on effectiveness of POSTINC + * - Typecasting all around to reduce compiler warnings + * - Changed loops from while (1) or do {} while (1) to for (;;), again to + * make compilers happy + * - Changed type of window in inflateBackInit() to unsigned char * + * + * 1.2.beta7 27 Jan 2003 + * - Changed many types to unsigned or unsigned short to avoid warnings + * - Added inflateCopy() function + * + * 1.2.0 9 Mar 2003 + * - Changed inflateBack() interface to provide separate opaque descriptors + * for the in() and out() functions + * - Changed inflateBack() argument and in_func typedef to swap the length + * and buffer address return values for the input function + * - Check next_in and next_out for Z_NULL on entry to inflate() + * + * The history for versions after 1.2.0 are in ChangeLog in zlib distribution. + */ + +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +#ifdef MAKEFIXED +# ifndef BUILDFIXED +# define BUILDFIXED +# endif +#endif + +/* function prototypes */ +local void fixedtables OF((struct inflate_state FAR *state)); +local int updatewindow OF((z_streamp strm, unsigned out)); +#ifdef BUILDFIXED + void makefixed OF((void)); +#endif +local unsigned syncsearch OF((unsigned FAR *have, unsigned char FAR *buf, + unsigned len)); + +int ZEXPORT inflateReset(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + strm->total_in = strm->total_out = state->total = 0; + strm->msg = Z_NULL; + strm->adler = 1; /* to support ill-conceived Java test suite */ + state->mode = HEAD; + state->last = 0; + state->havedict = 0; + state->dmax = 32768U; + state->head = Z_NULL; + state->wsize = 0; + state->whave = 0; + state->write = 0; + state->hold = 0; + state->bits = 0; + state->lencode = state->distcode = state->next = state->codes; + Tracev((stderr, "inflate: reset\n")); + return Z_OK; +} + +int ZEXPORT inflatePrime(strm, bits, value) +z_streamp strm; +int bits; +int value; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (bits > 16 || state->bits + bits > 32) return Z_STREAM_ERROR; + value &= (1L << bits) - 1; + state->hold += value << state->bits; + state->bits += bits; + return Z_OK; +} + +int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size) +z_streamp strm; +int windowBits; +const char *version; +int stream_size; +{ + struct inflate_state FAR *state; + + if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || + stream_size != (int)(sizeof(z_stream))) + return Z_VERSION_ERROR; + if (strm == Z_NULL) return Z_STREAM_ERROR; + strm->msg = Z_NULL; /* in case we return an error */ + if (strm->zalloc == (alloc_func)0) { + strm->zalloc = zcalloc; + strm->opaque = (voidpf)0; + } + if (strm->zfree == (free_func)0) strm->zfree = zcfree; + state = (struct inflate_state FAR *) + ZALLOC(strm, 1, sizeof(struct inflate_state)); + if (state == Z_NULL) return Z_MEM_ERROR; + Tracev((stderr, "inflate: allocated\n")); + strm->state = (struct internal_state FAR *)state; + if (windowBits < 0) { + state->wrap = 0; + windowBits = -windowBits; + } + else { + state->wrap = (windowBits >> 4) + 1; +#ifdef GUNZIP + if (windowBits < 48) windowBits &= 15; +#endif + } + if (windowBits < 8 || windowBits > 15) { + ZFREE(strm, state); + strm->state = Z_NULL; + return Z_STREAM_ERROR; + } + state->wbits = (unsigned)windowBits; + state->window = Z_NULL; + return inflateReset(strm); +} + +int ZEXPORT inflateInit_(strm, version, stream_size) +z_streamp strm; +const char *version; +int stream_size; +{ + return inflateInit2_(strm, DEF_WBITS, version, stream_size); +} + +/* + Return state with length and distance decoding tables and index sizes set to + fixed code decoding. Normally this returns fixed tables from inffixed.h. + If BUILDFIXED is defined, then instead this routine builds the tables the + first time it's called, and returns those tables the first time and + thereafter. This reduces the size of the code by about 2K bytes, in + exchange for a little execution time. However, BUILDFIXED should not be + used for threaded applications, since the rewriting of the tables and virgin + may not be thread-safe. + */ +local void fixedtables(state) +struct inflate_state FAR *state; +{ +#ifdef BUILDFIXED + static int virgin = 1; + static code *lenfix, *distfix; + static code fixed[544]; + + /* build fixed huffman tables if first call (may not be thread safe) */ + if (virgin) { + unsigned sym, bits; + static code *next; + + /* literal/length table */ + sym = 0; + while (sym < 144) state->lens[sym++] = 8; + while (sym < 256) state->lens[sym++] = 9; + while (sym < 280) state->lens[sym++] = 7; + while (sym < 288) state->lens[sym++] = 8; + next = fixed; + lenfix = next; + bits = 9; + inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); + + /* distance table */ + sym = 0; + while (sym < 32) state->lens[sym++] = 5; + distfix = next; + bits = 5; + inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); + + /* do this just once */ + virgin = 0; + } +#else /* !BUILDFIXED */ +# include "inffixed.h" +#endif /* BUILDFIXED */ + state->lencode = lenfix; + state->lenbits = 9; + state->distcode = distfix; + state->distbits = 5; +} + +#ifdef MAKEFIXED +#include + +/* + Write out the inffixed.h that is #include'd above. Defining MAKEFIXED also + defines BUILDFIXED, so the tables are built on the fly. makefixed() writes + those tables to stdout, which would be piped to inffixed.h. A small program + can simply call makefixed to do this: + + void makefixed(void); + + int main(void) + { + makefixed(); + return 0; + } + + Then that can be linked with zlib built with MAKEFIXED defined and run: + + a.out > inffixed.h + */ +void makefixed() +{ + unsigned low, size; + struct inflate_state state; + + fixedtables(&state); + puts(" /* inffixed.h -- table for decoding fixed codes"); + puts(" * Generated automatically by makefixed()."); + puts(" */"); + puts(""); + puts(" /* WARNING: this file should *not* be used by applications."); + puts(" It is part of the implementation of this library and is"); + puts(" subject to change. Applications should only use zlib.h."); + puts(" */"); + puts(""); + size = 1U << 9; + printf(" static const code lenfix[%u] = {", size); + low = 0; + for (;;) { + if ((low % 7) == 0) printf("\n "); + printf("{%u,%u,%d}", state.lencode[low].op, state.lencode[low].bits, + state.lencode[low].val); + if (++low == size) break; + putchar(','); + } + puts("\n };"); + size = 1U << 5; + printf("\n static const code distfix[%u] = {", size); + low = 0; + for (;;) { + if ((low % 6) == 0) printf("\n "); + printf("{%u,%u,%d}", state.distcode[low].op, state.distcode[low].bits, + state.distcode[low].val); + if (++low == size) break; + putchar(','); + } + puts("\n };"); +} +#endif /* MAKEFIXED */ + +/* + Update the window with the last wsize (normally 32K) bytes written before + returning. If window does not exist yet, create it. This is only called + when a window is already in use, or when output has been written during this + inflate call, but the end of the deflate stream has not been reached yet. + It is also called to create a window for dictionary data when a dictionary + is loaded. + + Providing output buffers larger than 32K to inflate() should provide a speed + advantage, since only the last 32K of output is copied to the sliding window + upon return from inflate(), and since all distances after the first 32K of + output will fall in the output data, making match copies simpler and faster. + The advantage may be dependent on the size of the processor's data caches. + */ +local int updatewindow(strm, out) +z_streamp strm; +unsigned out; +{ + struct inflate_state FAR *state; + unsigned copy, dist; + + state = (struct inflate_state FAR *)strm->state; + + /* if it hasn't been done already, allocate space for the window */ + if (state->window == Z_NULL) { + state->window = (unsigned char FAR *) + ZALLOC(strm, 1U << state->wbits, + sizeof(unsigned char)); + if (state->window == Z_NULL) return 1; + } + + /* if window not in use yet, initialize */ + if (state->wsize == 0) { + state->wsize = 1U << state->wbits; + state->write = 0; + state->whave = 0; + } + + /* copy state->wsize or less output bytes into the circular window */ + copy = out - strm->avail_out; + if (copy >= state->wsize) { + zmemcpy(state->window, strm->next_out - state->wsize, state->wsize); + state->write = 0; + state->whave = state->wsize; + } + else { + dist = state->wsize - state->write; + if (dist > copy) dist = copy; + zmemcpy(state->window + state->write, strm->next_out - copy, dist); + copy -= dist; + if (copy) { + zmemcpy(state->window, strm->next_out - copy, copy); + state->write = copy; + state->whave = state->wsize; + } + else { + state->write += dist; + if (state->write == state->wsize) state->write = 0; + if (state->whave < state->wsize) state->whave += dist; + } + } + return 0; +} + +/* Macros for inflate(): */ + +/* check function to use adler32() for zlib or crc32() for gzip */ +#ifdef GUNZIP +# define UPDATE(check, buf, len) \ + (state->flags ? crc32(check, buf, len) : adler32(check, buf, len)) +#else +# define UPDATE(check, buf, len) adler32(check, buf, len) +#endif + +/* check macros for header crc */ +#ifdef GUNZIP +# define CRC2(check, word) \ + do { \ + hbuf[0] = (unsigned char)(word); \ + hbuf[1] = (unsigned char)((word) >> 8); \ + check = crc32(check, hbuf, 2); \ + } while (0) + +# define CRC4(check, word) \ + do { \ + hbuf[0] = (unsigned char)(word); \ + hbuf[1] = (unsigned char)((word) >> 8); \ + hbuf[2] = (unsigned char)((word) >> 16); \ + hbuf[3] = (unsigned char)((word) >> 24); \ + check = crc32(check, hbuf, 4); \ + } while (0) +#endif + +/* Load registers with state in inflate() for speed */ +#define LOAD() \ + do { \ + put = strm->next_out; \ + left = strm->avail_out; \ + next = strm->next_in; \ + have = strm->avail_in; \ + hold = state->hold; \ + bits = state->bits; \ + } while (0) + +/* Restore state from registers in inflate() */ +#define RESTORE() \ + do { \ + strm->next_out = put; \ + strm->avail_out = left; \ + strm->next_in = next; \ + strm->avail_in = have; \ + state->hold = hold; \ + state->bits = bits; \ + } while (0) + +/* Clear the input bit accumulator */ +#define INITBITS() \ + do { \ + hold = 0; \ + bits = 0; \ + } while (0) + +/* Get a byte of input into the bit accumulator, or return from inflate() + if there is no input available. */ +#define PULLBYTE() \ + do { \ + if (have == 0) goto inf_leave; \ + have--; \ + hold += (unsigned long)(*next++) << bits; \ + bits += 8; \ + } while (0) + +/* Assure that there are at least n bits in the bit accumulator. If there is + not enough available input to do that, then return from inflate(). */ +#define NEEDBITS(n) \ + do { \ + while (bits < (unsigned)(n)) \ + PULLBYTE(); \ + } while (0) + +/* Return the low n bits of the bit accumulator (n < 16) */ +#define BITS(n) \ + ((unsigned)hold & ((1U << (n)) - 1)) + +/* Remove n bits from the bit accumulator */ +#define DROPBITS(n) \ + do { \ + hold >>= (n); \ + bits -= (unsigned)(n); \ + } while (0) + +/* Remove zero to seven bits as needed to go to a byte boundary */ +#define BYTEBITS() \ + do { \ + hold >>= bits & 7; \ + bits -= bits & 7; \ + } while (0) + +/* Reverse the bytes in a 32-bit value */ +#define REVERSE(q) \ + ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \ + (((q) & 0xff00) << 8) + (((q) & 0xff) << 24)) + +/* + inflate() uses a state machine to process as much input data and generate as + much output data as possible before returning. The state machine is + structured roughly as follows: + + for (;;) switch (state) { + ... + case STATEn: + if (not enough input data or output space to make progress) + return; + ... make progress ... + state = STATEm; + break; + ... + } + + so when inflate() is called again, the same case is attempted again, and + if the appropriate resources are provided, the machine proceeds to the + next state. The NEEDBITS() macro is usually the way the state evaluates + whether it can proceed or should return. NEEDBITS() does the return if + the requested bits are not available. The typical use of the BITS macros + is: + + NEEDBITS(n); + ... do something with BITS(n) ... + DROPBITS(n); + + where NEEDBITS(n) either returns from inflate() if there isn't enough + input left to load n bits into the accumulator, or it continues. BITS(n) + gives the low n bits in the accumulator. When done, DROPBITS(n) drops + the low n bits off the accumulator. INITBITS() clears the accumulator + and sets the number of available bits to zero. BYTEBITS() discards just + enough bits to put the accumulator on a byte boundary. After BYTEBITS() + and a NEEDBITS(8), then BITS(8) would return the next byte in the stream. + + NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return + if there is no input available. The decoding of variable length codes uses + PULLBYTE() directly in order to pull just enough bytes to decode the next + code, and no more. + + Some states loop until they get enough input, making sure that enough + state information is maintained to continue the loop where it left off + if NEEDBITS() returns in the loop. For example, want, need, and keep + would all have to actually be part of the saved state in case NEEDBITS() + returns: + + case STATEw: + while (want < need) { + NEEDBITS(n); + keep[want++] = BITS(n); + DROPBITS(n); + } + state = STATEx; + case STATEx: + + As shown above, if the next state is also the next case, then the break + is omitted. + + A state may also return if there is not enough output space available to + complete that state. Those states are copying stored data, writing a + literal byte, and copying a matching string. + + When returning, a "goto inf_leave" is used to update the total counters, + update the check value, and determine whether any progress has been made + during that inflate() call in order to return the proper return code. + Progress is defined as a change in either strm->avail_in or strm->avail_out. + When there is a window, goto inf_leave will update the window with the last + output written. If a goto inf_leave occurs in the middle of decompression + and there is no window currently, goto inf_leave will create one and copy + output to the window for the next call of inflate(). + + In this implementation, the flush parameter of inflate() only affects the + return code (per zlib.h). inflate() always writes as much as possible to + strm->next_out, given the space available and the provided input--the effect + documented in zlib.h of Z_SYNC_FLUSH. Furthermore, inflate() always defers + the allocation of and copying into a sliding window until necessary, which + provides the effect documented in zlib.h for Z_FINISH when the entire input + stream available. So the only thing the flush parameter actually does is: + when flush is set to Z_FINISH, inflate() cannot return Z_OK. Instead it + will return Z_BUF_ERROR if it has not reached the end of the stream. + */ + +int ZEXPORT inflate(strm, flush) +z_streamp strm; +int flush; +{ + struct inflate_state FAR *state; + unsigned char FAR *next; /* next input */ + unsigned char FAR *put; /* next output */ + unsigned have, left; /* available input and output */ + unsigned long hold; /* bit buffer */ + unsigned bits; /* bits in bit buffer */ + unsigned in, out; /* save starting available input and output */ + unsigned copy; /* number of stored or match bytes to copy */ + unsigned char FAR *from; /* where to copy match bytes from */ + code this; /* current decoding table entry */ + code last; /* parent table entry */ + unsigned len; /* length to copy for repeats, bits to drop */ + int ret; /* return code */ +#ifdef GUNZIP + unsigned char hbuf[4]; /* buffer for gzip header crc calculation */ +#endif + static const unsigned short order[19] = /* permutation of code lengths */ + {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; + + if (strm == Z_NULL || strm->state == Z_NULL || strm->next_out == Z_NULL || + (strm->next_in == Z_NULL && strm->avail_in != 0)) + return Z_STREAM_ERROR; + + state = (struct inflate_state FAR *)strm->state; + if (state->mode == TYPE) state->mode = TYPEDO; /* skip check */ + LOAD(); + in = have; + out = left; + ret = Z_OK; + for (;;) + switch (state->mode) { + case HEAD: + if (state->wrap == 0) { + state->mode = TYPEDO; + break; + } + NEEDBITS(16); +#ifdef GUNZIP + if ((state->wrap & 2) && hold == 0x8b1f) { /* gzip header */ + state->check = crc32(0L, Z_NULL, 0); + CRC2(state->check, hold); + INITBITS(); + state->mode = FLAGS; + break; + } + state->flags = 0; /* expect zlib header */ + if (state->head != Z_NULL) + state->head->done = -1; + if (!(state->wrap & 1) || /* check if zlib header allowed */ +#else + if ( +#endif + ((BITS(8) << 8) + (hold >> 8)) % 31) { + strm->msg = (char *)"incorrect header check"; + state->mode = BAD; + break; + } + if (BITS(4) != Z_DEFLATED) { + strm->msg = (char *)"unknown compression method"; + state->mode = BAD; + break; + } + DROPBITS(4); + len = BITS(4) + 8; + if (len > state->wbits) { + strm->msg = (char *)"invalid window size"; + state->mode = BAD; + break; + } + state->dmax = 1U << len; + Tracev((stderr, "inflate: zlib header ok\n")); + strm->adler = state->check = adler32(0L, Z_NULL, 0); + state->mode = hold & 0x200 ? DICTID : TYPE; + INITBITS(); + break; +#ifdef GUNZIP + case FLAGS: + NEEDBITS(16); + state->flags = (int)(hold); + if ((state->flags & 0xff) != Z_DEFLATED) { + strm->msg = (char *)"unknown compression method"; + state->mode = BAD; + break; + } + if (state->flags & 0xe000) { + strm->msg = (char *)"unknown header flags set"; + state->mode = BAD; + break; + } + if (state->head != Z_NULL) + state->head->text = (int)((hold >> 8) & 1); + if (state->flags & 0x0200) CRC2(state->check, hold); + INITBITS(); + state->mode = TIME; + case TIME: + NEEDBITS(32); + if (state->head != Z_NULL) + state->head->time = hold; + if (state->flags & 0x0200) CRC4(state->check, hold); + INITBITS(); + state->mode = OS; + case OS: + NEEDBITS(16); + if (state->head != Z_NULL) { + state->head->xflags = (int)(hold & 0xff); + state->head->os = (int)(hold >> 8); + } + if (state->flags & 0x0200) CRC2(state->check, hold); + INITBITS(); + state->mode = EXLEN; + case EXLEN: + if (state->flags & 0x0400) { + NEEDBITS(16); + state->length = (unsigned)(hold); + if (state->head != Z_NULL) + state->head->extra_len = (unsigned)hold; + if (state->flags & 0x0200) CRC2(state->check, hold); + INITBITS(); + } + else if (state->head != Z_NULL) + state->head->extra = Z_NULL; + state->mode = EXTRA; + case EXTRA: + if (state->flags & 0x0400) { + copy = state->length; + if (copy > have) copy = have; + if (copy) { + if (state->head != Z_NULL && + state->head->extra != Z_NULL) { + len = state->head->extra_len - state->length; + zmemcpy(state->head->extra + len, next, + len + copy > state->head->extra_max ? + state->head->extra_max - len : copy); + } + if (state->flags & 0x0200) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + state->length -= copy; + } + if (state->length) goto inf_leave; + } + state->length = 0; + state->mode = NAME; + case NAME: + if (state->flags & 0x0800) { + if (have == 0) goto inf_leave; + copy = 0; + do { + len = (unsigned)(next[copy++]); + if (state->head != Z_NULL && + state->head->name != Z_NULL && + state->length < state->head->name_max) + state->head->name[state->length++] = len; + } while (len && copy < have); + if (state->flags & 0x0200) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + if (len) goto inf_leave; + } + else if (state->head != Z_NULL) + state->head->name = Z_NULL; + state->length = 0; + state->mode = COMMENT; + case COMMENT: + if (state->flags & 0x1000) { + if (have == 0) goto inf_leave; + copy = 0; + do { + len = (unsigned)(next[copy++]); + if (state->head != Z_NULL && + state->head->comment != Z_NULL && + state->length < state->head->comm_max) + state->head->comment[state->length++] = len; + } while (len && copy < have); + if (state->flags & 0x0200) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + if (len) goto inf_leave; + } + else if (state->head != Z_NULL) + state->head->comment = Z_NULL; + state->mode = HCRC; + case HCRC: + if (state->flags & 0x0200) { + NEEDBITS(16); + if (hold != (state->check & 0xffff)) { + strm->msg = (char *)"header crc mismatch"; + state->mode = BAD; + break; + } + INITBITS(); + } + if (state->head != Z_NULL) { + state->head->hcrc = (int)((state->flags >> 9) & 1); + state->head->done = 1; + } + strm->adler = state->check = crc32(0L, Z_NULL, 0); + state->mode = TYPE; + break; +#endif + case DICTID: + NEEDBITS(32); + strm->adler = state->check = REVERSE(hold); + INITBITS(); + state->mode = DICT; + case DICT: + if (state->havedict == 0) { + RESTORE(); + return Z_NEED_DICT; + } + strm->adler = state->check = adler32(0L, Z_NULL, 0); + state->mode = TYPE; + case TYPE: + if (flush == Z_BLOCK) goto inf_leave; + case TYPEDO: + if (state->last) { + BYTEBITS(); + state->mode = CHECK; + break; + } + NEEDBITS(3); + state->last = BITS(1); + DROPBITS(1); + switch (BITS(2)) { + case 0: /* stored block */ + Tracev((stderr, "inflate: stored block%s\n", + state->last ? " (last)" : "")); + state->mode = STORED; + break; + case 1: /* fixed block */ + fixedtables(state); + Tracev((stderr, "inflate: fixed codes block%s\n", + state->last ? " (last)" : "")); + state->mode = LEN; /* decode codes */ + break; + case 2: /* dynamic block */ + Tracev((stderr, "inflate: dynamic codes block%s\n", + state->last ? " (last)" : "")); + state->mode = TABLE; + break; + case 3: + strm->msg = (char *)"invalid block type"; + state->mode = BAD; + } + DROPBITS(2); + break; + case STORED: + BYTEBITS(); /* go to byte boundary */ + NEEDBITS(32); + if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { + strm->msg = (char *)"invalid stored block lengths"; + state->mode = BAD; + break; + } + state->length = (unsigned)hold & 0xffff; + Tracev((stderr, "inflate: stored length %u\n", + state->length)); + INITBITS(); + state->mode = COPY; + case COPY: + copy = state->length; + if (copy) { + if (copy > have) copy = have; + if (copy > left) copy = left; + if (copy == 0) goto inf_leave; + zmemcpy(put, next, copy); + have -= copy; + next += copy; + left -= copy; + put += copy; + state->length -= copy; + break; + } + Tracev((stderr, "inflate: stored end\n")); + state->mode = TYPE; + break; + case TABLE: + NEEDBITS(14); + state->nlen = BITS(5) + 257; + DROPBITS(5); + state->ndist = BITS(5) + 1; + DROPBITS(5); + state->ncode = BITS(4) + 4; + DROPBITS(4); +#ifndef PKZIP_BUG_WORKAROUND + if (state->nlen > 286 || state->ndist > 30) { + strm->msg = (char *)"too many length or distance symbols"; + state->mode = BAD; + break; + } +#endif + Tracev((stderr, "inflate: table sizes ok\n")); + state->have = 0; + state->mode = LENLENS; + case LENLENS: + while (state->have < state->ncode) { + NEEDBITS(3); + state->lens[order[state->have++]] = (unsigned short)BITS(3); + DROPBITS(3); + } + while (state->have < 19) + state->lens[order[state->have++]] = 0; + state->next = state->codes; + state->lencode = (code const FAR *)(state->next); + state->lenbits = 7; + ret = inflate_table(CODES, state->lens, 19, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid code lengths set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: code lengths ok\n")); + state->have = 0; + state->mode = CODELENS; + case CODELENS: + while (state->have < state->nlen + state->ndist) { + for (;;) { + this = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(this.bits) <= bits) break; + PULLBYTE(); + } + if (this.val < 16) { + NEEDBITS(this.bits); + DROPBITS(this.bits); + state->lens[state->have++] = this.val; + } + else { + if (this.val == 16) { + NEEDBITS(this.bits + 2); + DROPBITS(this.bits); + if (state->have == 0) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + len = state->lens[state->have - 1]; + copy = 3 + BITS(2); + DROPBITS(2); + } + else if (this.val == 17) { + NEEDBITS(this.bits + 3); + DROPBITS(this.bits); + len = 0; + copy = 3 + BITS(3); + DROPBITS(3); + } + else { + NEEDBITS(this.bits + 7); + DROPBITS(this.bits); + len = 0; + copy = 11 + BITS(7); + DROPBITS(7); + } + if (state->have + copy > state->nlen + state->ndist) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + while (copy--) + state->lens[state->have++] = (unsigned short)len; + } + } + + /* handle error breaks in while */ + if (state->mode == BAD) break; + + /* build code tables */ + state->next = state->codes; + state->lencode = (code const FAR *)(state->next); + state->lenbits = 9; + ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid literal/lengths set"; + state->mode = BAD; + break; + } + state->distcode = (code const FAR *)(state->next); + state->distbits = 6; + ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, + &(state->next), &(state->distbits), state->work); + if (ret) { + strm->msg = (char *)"invalid distances set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: codes ok\n")); + state->mode = LEN; + case LEN: + if (have >= 6 && left >= 258) { + RESTORE(); + inflate_fast(strm, out); + LOAD(); + break; + } + for (;;) { + this = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(this.bits) <= bits) break; + PULLBYTE(); + } + if (this.op && (this.op & 0xf0) == 0) { + last = this; + for (;;) { + this = state->lencode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + this.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + } + DROPBITS(this.bits); + state->length = (unsigned)this.val; + if ((int)(this.op) == 0) { + Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", this.val)); + state->mode = LIT; + break; + } + if (this.op & 32) { + Tracevv((stderr, "inflate: end of block\n")); + state->mode = TYPE; + break; + } + if (this.op & 64) { + strm->msg = (char *)"invalid literal/length code"; + state->mode = BAD; + break; + } + state->extra = (unsigned)(this.op) & 15; + state->mode = LENEXT; + case LENEXT: + if (state->extra) { + NEEDBITS(state->extra); + state->length += BITS(state->extra); + DROPBITS(state->extra); + } + Tracevv((stderr, "inflate: length %u\n", state->length)); + state->mode = DIST; + case DIST: + for (;;) { + this = state->distcode[BITS(state->distbits)]; + if ((unsigned)(this.bits) <= bits) break; + PULLBYTE(); + } + if ((this.op & 0xf0) == 0) { + last = this; + for (;;) { + this = state->distcode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + this.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + } + DROPBITS(this.bits); + if (this.op & 64) { + strm->msg = (char *)"invalid distance code"; + state->mode = BAD; + break; + } + state->offset = (unsigned)this.val; + state->extra = (unsigned)(this.op) & 15; + state->mode = DISTEXT; + case DISTEXT: + if (state->extra) { + NEEDBITS(state->extra); + state->offset += BITS(state->extra); + DROPBITS(state->extra); + } +#ifdef INFLATE_STRICT + if (state->offset > state->dmax) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#endif + if (state->offset > state->whave + out - left) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } + Tracevv((stderr, "inflate: distance %u\n", state->offset)); + state->mode = MATCH; + case MATCH: + if (left == 0) goto inf_leave; + copy = out - left; + if (state->offset > copy) { /* copy from window */ + copy = state->offset - copy; + if (copy > state->write) { + copy -= state->write; + from = state->window + (state->wsize - copy); + } + else + from = state->window + (state->write - copy); + if (copy > state->length) copy = state->length; + } + else { /* copy from output */ + from = put - state->offset; + copy = state->length; + } + if (copy > left) copy = left; + left -= copy; + state->length -= copy; + do { + *put++ = *from++; + } while (--copy); + if (state->length == 0) state->mode = LEN; + break; + case LIT: + if (left == 0) goto inf_leave; + *put++ = (unsigned char)(state->length); + left--; + state->mode = LEN; + break; + case CHECK: + if (state->wrap) { + NEEDBITS(32); + out -= left; + strm->total_out += out; + state->total += out; + if (out) + strm->adler = state->check = + UPDATE(state->check, put - out, out); + out = left; + if (( +#ifdef GUNZIP + state->flags ? hold : +#endif + REVERSE(hold)) != state->check) { + strm->msg = (char *)"incorrect data check"; + state->mode = BAD; + break; + } + INITBITS(); + Tracev((stderr, "inflate: check matches trailer\n")); + } +#ifdef GUNZIP + state->mode = LENGTH; + case LENGTH: + if (state->wrap && state->flags) { + NEEDBITS(32); + if (hold != (state->total & 0xffffffffUL)) { + strm->msg = (char *)"incorrect length check"; + state->mode = BAD; + break; + } + INITBITS(); + Tracev((stderr, "inflate: length matches trailer\n")); + } +#endif + state->mode = DONE; + case DONE: + ret = Z_STREAM_END; + goto inf_leave; + case BAD: + ret = Z_DATA_ERROR; + goto inf_leave; + case MEM: + return Z_MEM_ERROR; + case SYNC: + default: + return Z_STREAM_ERROR; + } + + /* + Return from inflate(), updating the total counts and the check value. + If there was no progress during the inflate() call, return a buffer + error. Call updatewindow() to create and/or update the window state. + Note: a memory error from inflate() is non-recoverable. + */ + inf_leave: + RESTORE(); + if (state->wsize || (state->mode < CHECK && out != strm->avail_out)) + if (updatewindow(strm, out)) { + state->mode = MEM; + return Z_MEM_ERROR; + } + in -= strm->avail_in; + out -= strm->avail_out; + strm->total_in += in; + strm->total_out += out; + state->total += out; + if (state->wrap && out) + strm->adler = state->check = + UPDATE(state->check, strm->next_out - out, out); + strm->data_type = state->bits + (state->last ? 64 : 0) + + (state->mode == TYPE ? 128 : 0); + if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK) + ret = Z_BUF_ERROR; + return ret; +} + +int ZEXPORT inflateEnd(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) + return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (state->window != Z_NULL) ZFREE(strm, state->window); + ZFREE(strm, strm->state); + strm->state = Z_NULL; + Tracev((stderr, "inflate: end\n")); + return Z_OK; +} + +int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength) +z_streamp strm; +const Bytef *dictionary; +uInt dictLength; +{ + struct inflate_state FAR *state; + unsigned long id; + + /* check state */ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (state->wrap != 0 && state->mode != DICT) + return Z_STREAM_ERROR; + + /* check for correct dictionary id */ + if (state->mode == DICT) { + id = adler32(0L, Z_NULL, 0); + id = adler32(id, dictionary, dictLength); + if (id != state->check) + return Z_DATA_ERROR; + } + + /* copy dictionary to window */ + if (updatewindow(strm, strm->avail_out)) { + state->mode = MEM; + return Z_MEM_ERROR; + } + if (dictLength > state->wsize) { + zmemcpy(state->window, dictionary + dictLength - state->wsize, + state->wsize); + state->whave = state->wsize; + } + else { + zmemcpy(state->window + state->wsize - dictLength, dictionary, + dictLength); + state->whave = dictLength; + } + state->havedict = 1; + Tracev((stderr, "inflate: dictionary set\n")); + return Z_OK; +} + +int ZEXPORT inflateGetHeader(strm, head) +z_streamp strm; +gz_headerp head; +{ + struct inflate_state FAR *state; + + /* check state */ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if ((state->wrap & 2) == 0) return Z_STREAM_ERROR; + + /* save header structure */ + state->head = head; + head->done = 0; + return Z_OK; +} + +/* + Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff. Return when found + or when out of input. When called, *have is the number of pattern bytes + found in order so far, in 0..3. On return *have is updated to the new + state. If on return *have equals four, then the pattern was found and the + return value is how many bytes were read including the last byte of the + pattern. If *have is less than four, then the pattern has not been found + yet and the return value is len. In the latter case, syncsearch() can be + called again with more data and the *have state. *have is initialized to + zero for the first call. + */ +local unsigned syncsearch(have, buf, len) +unsigned FAR *have; +unsigned char FAR *buf; +unsigned len; +{ + unsigned got; + unsigned next; + + got = *have; + next = 0; + while (next < len && got < 4) { + if ((int)(buf[next]) == (got < 2 ? 0 : 0xff)) + got++; + else if (buf[next]) + got = 0; + else + got = 4 - got; + next++; + } + *have = got; + return next; +} + +int ZEXPORT inflateSync(strm) +z_streamp strm; +{ + unsigned len; /* number of bytes to look at or looked at */ + unsigned long in, out; /* temporary to save total_in and total_out */ + unsigned char buf[4]; /* to restore bit buffer to byte string */ + struct inflate_state FAR *state; + + /* check parameters */ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR; + + /* if first time, start search in bit buffer */ + if (state->mode != SYNC) { + state->mode = SYNC; + state->hold <<= state->bits & 7; + state->bits -= state->bits & 7; + len = 0; + while (state->bits >= 8) { + buf[len++] = (unsigned char)(state->hold); + state->hold >>= 8; + state->bits -= 8; + } + state->have = 0; + syncsearch(&(state->have), buf, len); + } + + /* search available input */ + len = syncsearch(&(state->have), strm->next_in, strm->avail_in); + strm->avail_in -= len; + strm->next_in += len; + strm->total_in += len; + + /* return no joy or set up to restart inflate() on a new block */ + if (state->have != 4) return Z_DATA_ERROR; + in = strm->total_in; out = strm->total_out; + inflateReset(strm); + strm->total_in = in; strm->total_out = out; + state->mode = TYPE; + return Z_OK; +} + +/* + Returns true if inflate is currently at the end of a block generated by + Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP + implementation to provide an additional safety check. PPP uses + Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored + block. When decompressing, PPP checks that at the end of input packet, + inflate is waiting for these length bytes. + */ +int ZEXPORT inflateSyncPoint(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + return state->mode == STORED && state->bits == 0; +} + +int ZEXPORT inflateCopy(dest, source) +z_streamp dest; +z_streamp source; +{ + struct inflate_state FAR *state; + struct inflate_state FAR *copy; + unsigned char FAR *window; + unsigned wsize; + + /* check input */ + if (dest == Z_NULL || source == Z_NULL || source->state == Z_NULL || + source->zalloc == (alloc_func)0 || source->zfree == (free_func)0) + return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)source->state; + + /* allocate space */ + copy = (struct inflate_state FAR *) + ZALLOC(source, 1, sizeof(struct inflate_state)); + if (copy == Z_NULL) return Z_MEM_ERROR; + window = Z_NULL; + if (state->window != Z_NULL) { + window = (unsigned char FAR *) + ZALLOC(source, 1U << state->wbits, sizeof(unsigned char)); + if (window == Z_NULL) { + ZFREE(source, copy); + return Z_MEM_ERROR; + } + } + + /* copy state */ + zmemcpy(dest, source, sizeof(z_stream)); + zmemcpy(copy, state, sizeof(struct inflate_state)); + if (state->lencode >= state->codes && + state->lencode <= state->codes + ENOUGH - 1) { + copy->lencode = copy->codes + (state->lencode - state->codes); + copy->distcode = copy->codes + (state->distcode - state->codes); + } + copy->next = copy->codes + (state->next - state->codes); + if (window != Z_NULL) { + wsize = 1U << state->wbits; + zmemcpy(window, state->window, wsize); + } + copy->window = window; + dest->state = (struct internal_state FAR *)copy; + return Z_OK; +} diff --git a/tools/bsnes/lib/zlib/inflate.h b/tools/bsnes/lib/zlib/inflate.h new file mode 100755 index 0000000..07bd3e7 --- /dev/null +++ b/tools/bsnes/lib/zlib/inflate.h @@ -0,0 +1,115 @@ +/* inflate.h -- internal inflate state definition + * Copyright (C) 1995-2004 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* define NO_GZIP when compiling if you want to disable gzip header and + trailer decoding by inflate(). NO_GZIP would be used to avoid linking in + the crc code when it is not needed. For shared libraries, gzip decoding + should be left enabled. */ +#ifndef NO_GZIP +# define GUNZIP +#endif + +/* Possible inflate modes between inflate() calls */ +typedef enum { + HEAD, /* i: waiting for magic header */ + FLAGS, /* i: waiting for method and flags (gzip) */ + TIME, /* i: waiting for modification time (gzip) */ + OS, /* i: waiting for extra flags and operating system (gzip) */ + EXLEN, /* i: waiting for extra length (gzip) */ + EXTRA, /* i: waiting for extra bytes (gzip) */ + NAME, /* i: waiting for end of file name (gzip) */ + COMMENT, /* i: waiting for end of comment (gzip) */ + HCRC, /* i: waiting for header crc (gzip) */ + DICTID, /* i: waiting for dictionary check value */ + DICT, /* waiting for inflateSetDictionary() call */ + TYPE, /* i: waiting for type bits, including last-flag bit */ + TYPEDO, /* i: same, but skip check to exit inflate on new block */ + STORED, /* i: waiting for stored size (length and complement) */ + COPY, /* i/o: waiting for input or output to copy stored block */ + TABLE, /* i: waiting for dynamic block table lengths */ + LENLENS, /* i: waiting for code length code lengths */ + CODELENS, /* i: waiting for length/lit and distance code lengths */ + LEN, /* i: waiting for length/lit code */ + LENEXT, /* i: waiting for length extra bits */ + DIST, /* i: waiting for distance code */ + DISTEXT, /* i: waiting for distance extra bits */ + MATCH, /* o: waiting for output space to copy string */ + LIT, /* o: waiting for output space to write literal */ + CHECK, /* i: waiting for 32-bit check value */ + LENGTH, /* i: waiting for 32-bit length (gzip) */ + DONE, /* finished check, done -- remain here until reset */ + BAD, /* got a data error -- remain here until reset */ + MEM, /* got an inflate() memory error -- remain here until reset */ + SYNC /* looking for synchronization bytes to restart inflate() */ +} inflate_mode; + +/* + State transitions between above modes - + + (most modes can go to the BAD or MEM mode -- not shown for clarity) + + Process header: + HEAD -> (gzip) or (zlib) + (gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME + NAME -> COMMENT -> HCRC -> TYPE + (zlib) -> DICTID or TYPE + DICTID -> DICT -> TYPE + Read deflate blocks: + TYPE -> STORED or TABLE or LEN or CHECK + STORED -> COPY -> TYPE + TABLE -> LENLENS -> CODELENS -> LEN + Read deflate codes: + LEN -> LENEXT or LIT or TYPE + LENEXT -> DIST -> DISTEXT -> MATCH -> LEN + LIT -> LEN + Process trailer: + CHECK -> LENGTH -> DONE + */ + +/* state maintained between inflate() calls. Approximately 7K bytes. */ +struct inflate_state { + inflate_mode mode; /* current inflate mode */ + int last; /* true if processing last block */ + int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ + int havedict; /* true if dictionary provided */ + int flags; /* gzip header method and flags (0 if zlib) */ + unsigned dmax; /* zlib header max distance (INFLATE_STRICT) */ + unsigned long check; /* protected copy of check value */ + unsigned long total; /* protected copy of output count */ + gz_headerp head; /* where to save gzip header information */ + /* sliding window */ + unsigned wbits; /* log base 2 of requested window size */ + unsigned wsize; /* window size or zero if not using window */ + unsigned whave; /* valid bytes in the window */ + unsigned write; /* window write index */ + unsigned char FAR *window; /* allocated sliding window, if needed */ + /* bit accumulator */ + unsigned long hold; /* input bit accumulator */ + unsigned bits; /* number of bits in "in" */ + /* for string and stored block copying */ + unsigned length; /* literal or length of data to copy */ + unsigned offset; /* distance back to copy string from */ + /* for table and code decoding */ + unsigned extra; /* extra bits needed */ + /* fixed and dynamic code tables */ + code const FAR *lencode; /* starting table for length/literal codes */ + code const FAR *distcode; /* starting table for distance codes */ + unsigned lenbits; /* index bits for lencode */ + unsigned distbits; /* index bits for distcode */ + /* dynamic table building */ + unsigned ncode; /* number of code length code lengths */ + unsigned nlen; /* number of length code lengths */ + unsigned ndist; /* number of distance code lengths */ + unsigned have; /* number of code lengths in lens[] */ + code FAR *next; /* next available space in codes[] */ + unsigned short lens[320]; /* temporary storage for code lengths */ + unsigned short work[288]; /* work area for code table building */ + code codes[ENOUGH]; /* space for code tables */ +}; diff --git a/tools/bsnes/lib/zlib/inftrees.c b/tools/bsnes/lib/zlib/inftrees.c new file mode 100755 index 0000000..8a9c13f --- /dev/null +++ b/tools/bsnes/lib/zlib/inftrees.c @@ -0,0 +1,329 @@ +/* inftrees.c -- generate Huffman trees for efficient decoding + * Copyright (C) 1995-2005 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "inftrees.h" + +#define MAXBITS 15 + +const char inflate_copyright[] = + " inflate 1.2.3 Copyright 1995-2005 Mark Adler "; +/* + If you use the zlib library in a product, an acknowledgment is welcome + in the documentation of your product. If for some reason you cannot + include such an acknowledgment, I would appreciate that you keep this + copyright string in the executable of your product. + */ + +/* + Build a set of tables to decode the provided canonical Huffman code. + The code lengths are lens[0..codes-1]. The result starts at *table, + whose indices are 0..2^bits-1. work is a writable array of at least + lens shorts, which is used as a work area. type is the type of code + to be generated, CODES, LENS, or DISTS. On return, zero is success, + -1 is an invalid code, and +1 means that ENOUGH isn't enough. table + on return points to the next available entry's address. bits is the + requested root table index bits, and on return it is the actual root + table index bits. It will differ if the request is greater than the + longest code or if it is less than the shortest code. + */ +int inflate_table(type, lens, codes, table, bits, work) +codetype type; +unsigned short FAR *lens; +unsigned codes; +code FAR * FAR *table; +unsigned FAR *bits; +unsigned short FAR *work; +{ + unsigned len; /* a code's length in bits */ + unsigned sym; /* index of code symbols */ + unsigned min, max; /* minimum and maximum code lengths */ + unsigned root; /* number of index bits for root table */ + unsigned curr; /* number of index bits for current table */ + unsigned drop; /* code bits to drop for sub-table */ + int left; /* number of prefix codes available */ + unsigned used; /* code entries in table used */ + unsigned huff; /* Huffman code */ + unsigned incr; /* for incrementing code, index */ + unsigned fill; /* index for replicating entries */ + unsigned low; /* low bits for current root entry */ + unsigned mask; /* mask for low root bits */ + code this; /* table entry for duplication */ + code FAR *next; /* next available space in table */ + const unsigned short FAR *base; /* base value table to use */ + const unsigned short FAR *extra; /* extra bits table to use */ + int end; /* use base and extra for symbol > end */ + unsigned short count[MAXBITS+1]; /* number of codes of each length */ + unsigned short offs[MAXBITS+1]; /* offsets in table for each length */ + static const unsigned short lbase[31] = { /* Length codes 257..285 base */ + 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, + 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; + static const unsigned short lext[31] = { /* Length codes 257..285 extra */ + 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, + 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 201, 196}; + static const unsigned short dbase[32] = { /* Distance codes 0..29 base */ + 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, + 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, + 8193, 12289, 16385, 24577, 0, 0}; + static const unsigned short dext[32] = { /* Distance codes 0..29 extra */ + 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, + 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, + 28, 28, 29, 29, 64, 64}; + + /* + Process a set of code lengths to create a canonical Huffman code. The + code lengths are lens[0..codes-1]. Each length corresponds to the + symbols 0..codes-1. The Huffman code is generated by first sorting the + symbols by length from short to long, and retaining the symbol order + for codes with equal lengths. Then the code starts with all zero bits + for the first code of the shortest length, and the codes are integer + increments for the same length, and zeros are appended as the length + increases. For the deflate format, these bits are stored backwards + from their more natural integer increment ordering, and so when the + decoding tables are built in the large loop below, the integer codes + are incremented backwards. + + This routine assumes, but does not check, that all of the entries in + lens[] are in the range 0..MAXBITS. The caller must assure this. + 1..MAXBITS is interpreted as that code length. zero means that that + symbol does not occur in this code. + + The codes are sorted by computing a count of codes for each length, + creating from that a table of starting indices for each length in the + sorted table, and then entering the symbols in order in the sorted + table. The sorted table is work[], with that space being provided by + the caller. + + The length counts are used for other purposes as well, i.e. finding + the minimum and maximum length codes, determining if there are any + codes at all, checking for a valid set of lengths, and looking ahead + at length counts to determine sub-table sizes when building the + decoding tables. + */ + + /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ + for (len = 0; len <= MAXBITS; len++) + count[len] = 0; + for (sym = 0; sym < codes; sym++) + count[lens[sym]]++; + + /* bound code lengths, force root to be within code lengths */ + root = *bits; + for (max = MAXBITS; max >= 1; max--) + if (count[max] != 0) break; + if (root > max) root = max; + if (max == 0) { /* no symbols to code at all */ + this.op = (unsigned char)64; /* invalid code marker */ + this.bits = (unsigned char)1; + this.val = (unsigned short)0; + *(*table)++ = this; /* make a table to force an error */ + *(*table)++ = this; + *bits = 1; + return 0; /* no symbols, but wait for decoding to report error */ + } + for (min = 1; min <= MAXBITS; min++) + if (count[min] != 0) break; + if (root < min) root = min; + + /* check for an over-subscribed or incomplete set of lengths */ + left = 1; + for (len = 1; len <= MAXBITS; len++) { + left <<= 1; + left -= count[len]; + if (left < 0) return -1; /* over-subscribed */ + } + if (left > 0 && (type == CODES || max != 1)) + return -1; /* incomplete set */ + + /* generate offsets into symbol table for each length for sorting */ + offs[1] = 0; + for (len = 1; len < MAXBITS; len++) + offs[len + 1] = offs[len] + count[len]; + + /* sort symbols by length, by symbol order within each length */ + for (sym = 0; sym < codes; sym++) + if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym; + + /* + Create and fill in decoding tables. In this loop, the table being + filled is at next and has curr index bits. The code being used is huff + with length len. That code is converted to an index by dropping drop + bits off of the bottom. For codes where len is less than drop + curr, + those top drop + curr - len bits are incremented through all values to + fill the table with replicated entries. + + root is the number of index bits for the root table. When len exceeds + root, sub-tables are created pointed to by the root entry with an index + of the low root bits of huff. This is saved in low to check for when a + new sub-table should be started. drop is zero when the root table is + being filled, and drop is root when sub-tables are being filled. + + When a new sub-table is needed, it is necessary to look ahead in the + code lengths to determine what size sub-table is needed. The length + counts are used for this, and so count[] is decremented as codes are + entered in the tables. + + used keeps track of how many table entries have been allocated from the + provided *table space. It is checked when a LENS table is being made + against the space in *table, ENOUGH, minus the maximum space needed by + the worst case distance code, MAXD. This should never happen, but the + sufficiency of ENOUGH has not been proven exhaustively, hence the check. + This assumes that when type == LENS, bits == 9. + + sym increments through all symbols, and the loop terminates when + all codes of length max, i.e. all codes, have been processed. This + routine permits incomplete codes, so another loop after this one fills + in the rest of the decoding tables with invalid code markers. + */ + + /* set up for code type */ + switch (type) { + case CODES: + base = extra = work; /* dummy value--not used */ + end = 19; + break; + case LENS: + base = lbase; + base -= 257; + extra = lext; + extra -= 257; + end = 256; + break; + default: /* DISTS */ + base = dbase; + extra = dext; + end = -1; + } + + /* initialize state for loop */ + huff = 0; /* starting code */ + sym = 0; /* starting code symbol */ + len = min; /* starting code length */ + next = *table; /* current table to fill in */ + curr = root; /* current table index bits */ + drop = 0; /* current bits to drop from code for index */ + low = (unsigned)(-1); /* trigger new sub-table when len > root */ + used = 1U << root; /* use root table entries */ + mask = used - 1; /* mask for comparing low */ + + /* check available table space */ + if (type == LENS && used >= ENOUGH - MAXD) + return 1; + + /* process all codes and make table entries */ + for (;;) { + /* create table entry */ + this.bits = (unsigned char)(len - drop); + if ((int)(work[sym]) < end) { + this.op = (unsigned char)0; + this.val = work[sym]; + } + else if ((int)(work[sym]) > end) { + this.op = (unsigned char)(extra[work[sym]]); + this.val = base[work[sym]]; + } + else { + this.op = (unsigned char)(32 + 64); /* end of block */ + this.val = 0; + } + + /* replicate for those indices with low len bits equal to huff */ + incr = 1U << (len - drop); + fill = 1U << curr; + min = fill; /* save offset to next table */ + do { + fill -= incr; + next[(huff >> drop) + fill] = this; + } while (fill != 0); + + /* backwards increment the len-bit code huff */ + incr = 1U << (len - 1); + while (huff & incr) + incr >>= 1; + if (incr != 0) { + huff &= incr - 1; + huff += incr; + } + else + huff = 0; + + /* go to next symbol, update count, len */ + sym++; + if (--(count[len]) == 0) { + if (len == max) break; + len = lens[work[sym]]; + } + + /* create new sub-table if needed */ + if (len > root && (huff & mask) != low) { + /* if first time, transition to sub-tables */ + if (drop == 0) + drop = root; + + /* increment past last table */ + next += min; /* here min is 1 << curr */ + + /* determine length of next table */ + curr = len - drop; + left = (int)(1 << curr); + while (curr + drop < max) { + left -= count[curr + drop]; + if (left <= 0) break; + curr++; + left <<= 1; + } + + /* check for enough space */ + used += 1U << curr; + if (type == LENS && used >= ENOUGH - MAXD) + return 1; + + /* point entry in root table to sub-table */ + low = huff & mask; + (*table)[low].op = (unsigned char)curr; + (*table)[low].bits = (unsigned char)root; + (*table)[low].val = (unsigned short)(next - *table); + } + } + + /* + Fill in rest of table for incomplete codes. This loop is similar to the + loop above in incrementing huff for table indices. It is assumed that + len is equal to curr + drop, so there is no loop needed to increment + through high index bits. When the current sub-table is filled, the loop + drops back to the root table to fill in any remaining entries there. + */ + this.op = (unsigned char)64; /* invalid code marker */ + this.bits = (unsigned char)(len - drop); + this.val = (unsigned short)0; + while (huff != 0) { + /* when done with sub-table, drop back to root table */ + if (drop != 0 && (huff & mask) != low) { + drop = 0; + len = root; + next = *table; + this.bits = (unsigned char)len; + } + + /* put invalid code marker in table */ + next[huff >> drop] = this; + + /* backwards increment the len-bit code huff */ + incr = 1U << (len - 1); + while (huff & incr) + incr >>= 1; + if (incr != 0) { + huff &= incr - 1; + huff += incr; + } + else + huff = 0; + } + + /* set return parameters */ + *table += used; + *bits = root; + return 0; +} diff --git a/tools/bsnes/lib/zlib/inftrees.h b/tools/bsnes/lib/zlib/inftrees.h new file mode 100755 index 0000000..b1104c8 --- /dev/null +++ b/tools/bsnes/lib/zlib/inftrees.h @@ -0,0 +1,55 @@ +/* inftrees.h -- header to use inftrees.c + * Copyright (C) 1995-2005 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* Structure for decoding tables. Each entry provides either the + information needed to do the operation requested by the code that + indexed that table entry, or it provides a pointer to another + table that indexes more bits of the code. op indicates whether + the entry is a pointer to another table, a literal, a length or + distance, an end-of-block, or an invalid code. For a table + pointer, the low four bits of op is the number of index bits of + that table. For a length or distance, the low four bits of op + is the number of extra bits to get after the code. bits is + the number of bits in this code or part of the code to drop off + of the bit buffer. val is the actual byte to output in the case + of a literal, the base length or distance, or the offset from + the current table to the next table. Each entry is four bytes. */ +typedef struct { + unsigned char op; /* operation, extra bits, table bits */ + unsigned char bits; /* bits in this part of the code */ + unsigned short val; /* offset in table or code value */ +} code; + +/* op values as set by inflate_table(): + 00000000 - literal + 0000tttt - table link, tttt != 0 is the number of table index bits + 0001eeee - length or distance, eeee is the number of extra bits + 01100000 - end of block + 01000000 - invalid code + */ + +/* Maximum size of dynamic tree. The maximum found in a long but non- + exhaustive search was 1444 code structures (852 for length/literals + and 592 for distances, the latter actually the result of an + exhaustive search). The true maximum is not known, but the value + below is more than safe. */ +#define ENOUGH 2048 +#define MAXD 592 + +/* Type of code to build for inftable() */ +typedef enum { + CODES, + LENS, + DISTS +} codetype; + +extern int inflate_table OF((codetype type, unsigned short FAR *lens, + unsigned codes, code FAR * FAR *table, + unsigned FAR *bits, unsigned short FAR *work)); diff --git a/tools/bsnes/lib/zlib/ioapi.c b/tools/bsnes/lib/zlib/ioapi.c new file mode 100755 index 0000000..d2ddb60 --- /dev/null +++ b/tools/bsnes/lib/zlib/ioapi.c @@ -0,0 +1,193 @@ +/* ioapi.c -- IO base function header for compress/uncompress .zip + files using zlib + zip or unzip API + + Version 1.01e, February 12th, 2005 + + Copyright (C) 1998-2005 Gilles Vollant +*/ + +#include +#include +#include + +#if defined(_WIN32) +#define WIN32_LEAN_AND_MEAN +//needed for MultiByteToWideChar() +#include +#endif + +#include "zlib.h" +#include "ioapi.h" + + + +/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */ + +#ifndef SEEK_CUR +#define SEEK_CUR 1 +#endif + +#ifndef SEEK_END +#define SEEK_END 2 +#endif + +#ifndef SEEK_SET +#define SEEK_SET 0 +#endif + +voidpf ZCALLBACK fopen_file_func OF(( + voidpf opaque, + const char* filename, + int mode)); + +uLong ZCALLBACK fread_file_func OF(( + voidpf opaque, + voidpf stream, + void* buf, + uLong size)); + +uLong ZCALLBACK fwrite_file_func OF(( + voidpf opaque, + voidpf stream, + const void* buf, + uLong size)); + +long ZCALLBACK ftell_file_func OF(( + voidpf opaque, + voidpf stream)); + +long ZCALLBACK fseek_file_func OF(( + voidpf opaque, + voidpf stream, + uLong offset, + int origin)); + +int ZCALLBACK fclose_file_func OF(( + voidpf opaque, + voidpf stream)); + +int ZCALLBACK ferror_file_func OF(( + voidpf opaque, + voidpf stream)); + + +voidpf ZCALLBACK fopen_file_func (opaque, filename, mode) + voidpf opaque; + const char* filename; + int mode; +{ + FILE* file = NULL; + const char* mode_fopen = NULL; + if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ) + mode_fopen = "rb"; + else + if (mode & ZLIB_FILEFUNC_MODE_EXISTING) + mode_fopen = "r+b"; + else + if (mode & ZLIB_FILEFUNC_MODE_CREATE) + mode_fopen = "wb"; + + if ((filename!=NULL) && (mode_fopen != NULL)) { + //[2008-10-17 byuu] wrap Win32 fopen() to support UTF-8 filenames + #if !defined(_WIN32) + file = fopen(filename, mode_fopen); + #else + wchar_t wfilename[_MAX_PATH + 1]; + wchar_t wmode_fopen[_MAX_PATH + 1]; + MultiByteToWideChar(CP_UTF8, 0, filename, -1, wfilename, _MAX_PATH); + MultiByteToWideChar(CP_UTF8, 0, mode_fopen, -1, wmode_fopen, _MAX_PATH); + file = _wfopen(wfilename, wmode_fopen); + #endif + } + return file; +} + + +uLong ZCALLBACK fread_file_func (opaque, stream, buf, size) + voidpf opaque; + voidpf stream; + void* buf; + uLong size; +{ + uLong ret; + ret = (uLong)fread(buf, 1, (size_t)size, (FILE *)stream); + return ret; +} + + +uLong ZCALLBACK fwrite_file_func (opaque, stream, buf, size) + voidpf opaque; + voidpf stream; + const void* buf; + uLong size; +{ + uLong ret; + ret = (uLong)fwrite(buf, 1, (size_t)size, (FILE *)stream); + return ret; +} + +long ZCALLBACK ftell_file_func (opaque, stream) + voidpf opaque; + voidpf stream; +{ + long ret; + ret = ftell((FILE *)stream); + return ret; +} + +long ZCALLBACK fseek_file_func (opaque, stream, offset, origin) + voidpf opaque; + voidpf stream; + uLong offset; + int origin; +{ + int fseek_origin=0; + long ret; + switch (origin) + { + case ZLIB_FILEFUNC_SEEK_CUR : + fseek_origin = SEEK_CUR; + break; + case ZLIB_FILEFUNC_SEEK_END : + fseek_origin = SEEK_END; + break; + case ZLIB_FILEFUNC_SEEK_SET : + fseek_origin = SEEK_SET; + break; + default: return -1; + } + ret = 0; + fseek((FILE *)stream, offset, fseek_origin); + return ret; +} + +int ZCALLBACK fclose_file_func (opaque, stream) + voidpf opaque; + voidpf stream; +{ + int ret; + ret = fclose((FILE *)stream); + return ret; +} + +int ZCALLBACK ferror_file_func (opaque, stream) + voidpf opaque; + voidpf stream; +{ + int ret; + ret = ferror((FILE *)stream); + return ret; +} + +void fill_fopen_filefunc (pzlib_filefunc_def) + zlib_filefunc_def* pzlib_filefunc_def; +{ + pzlib_filefunc_def->zopen_file = fopen_file_func; + pzlib_filefunc_def->zread_file = fread_file_func; + pzlib_filefunc_def->zwrite_file = fwrite_file_func; + pzlib_filefunc_def->ztell_file = ftell_file_func; + pzlib_filefunc_def->zseek_file = fseek_file_func; + pzlib_filefunc_def->zclose_file = fclose_file_func; + pzlib_filefunc_def->zerror_file = ferror_file_func; + pzlib_filefunc_def->opaque = NULL; +} diff --git a/tools/bsnes/lib/zlib/ioapi.h b/tools/bsnes/lib/zlib/ioapi.h new file mode 100755 index 0000000..7d457ba --- /dev/null +++ b/tools/bsnes/lib/zlib/ioapi.h @@ -0,0 +1,75 @@ +/* ioapi.h -- IO base function header for compress/uncompress .zip + files using zlib + zip or unzip API + + Version 1.01e, February 12th, 2005 + + Copyright (C) 1998-2005 Gilles Vollant +*/ + +#ifndef _ZLIBIOAPI_H +#define _ZLIBIOAPI_H + + +#define ZLIB_FILEFUNC_SEEK_CUR (1) +#define ZLIB_FILEFUNC_SEEK_END (2) +#define ZLIB_FILEFUNC_SEEK_SET (0) + +#define ZLIB_FILEFUNC_MODE_READ (1) +#define ZLIB_FILEFUNC_MODE_WRITE (2) +#define ZLIB_FILEFUNC_MODE_READWRITEFILTER (3) + +#define ZLIB_FILEFUNC_MODE_EXISTING (4) +#define ZLIB_FILEFUNC_MODE_CREATE (8) + + +#ifndef ZCALLBACK + +#if (defined(WIN32) || defined (WINDOWS) || defined (_WINDOWS)) && defined(CALLBACK) && defined (USEWINDOWS_CALLBACK) +#define ZCALLBACK CALLBACK +#else +#define ZCALLBACK +#endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef voidpf (ZCALLBACK *open_file_func) OF((voidpf opaque, const char* filename, int mode)); +typedef uLong (ZCALLBACK *read_file_func) OF((voidpf opaque, voidpf stream, void* buf, uLong size)); +typedef uLong (ZCALLBACK *write_file_func) OF((voidpf opaque, voidpf stream, const void* buf, uLong size)); +typedef long (ZCALLBACK *tell_file_func) OF((voidpf opaque, voidpf stream)); +typedef long (ZCALLBACK *seek_file_func) OF((voidpf opaque, voidpf stream, uLong offset, int origin)); +typedef int (ZCALLBACK *close_file_func) OF((voidpf opaque, voidpf stream)); +typedef int (ZCALLBACK *testerror_file_func) OF((voidpf opaque, voidpf stream)); + +typedef struct zlib_filefunc_def_s +{ + open_file_func zopen_file; + read_file_func zread_file; + write_file_func zwrite_file; + tell_file_func ztell_file; + seek_file_func zseek_file; + close_file_func zclose_file; + testerror_file_func zerror_file; + voidpf opaque; +} zlib_filefunc_def; + + + +void fill_fopen_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def)); + +#define ZREAD(filefunc,filestream,buf,size) ((*((filefunc).zread_file))((filefunc).opaque,filestream,buf,size)) +#define ZWRITE(filefunc,filestream,buf,size) ((*((filefunc).zwrite_file))((filefunc).opaque,filestream,buf,size)) +#define ZTELL(filefunc,filestream) ((*((filefunc).ztell_file))((filefunc).opaque,filestream)) +#define ZSEEK(filefunc,filestream,pos,mode) ((*((filefunc).zseek_file))((filefunc).opaque,filestream,pos,mode)) +#define ZCLOSE(filefunc,filestream) ((*((filefunc).zclose_file))((filefunc).opaque,filestream)) +#define ZERROR(filefunc,filestream) ((*((filefunc).zerror_file))((filefunc).opaque,filestream)) + + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/tools/bsnes/lib/zlib/trees.c b/tools/bsnes/lib/zlib/trees.c new file mode 100755 index 0000000..ecd62b5 --- /dev/null +++ b/tools/bsnes/lib/zlib/trees.c @@ -0,0 +1,1219 @@ +/* trees.c -- output deflated data using Huffman coding + * Copyright (C) 1995-2005 Jean-loup Gailly + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * ALGORITHM + * + * The "deflation" process uses several Huffman trees. The more + * common source values are represented by shorter bit sequences. + * + * Each code tree is stored in a compressed form which is itself + * a Huffman encoding of the lengths of all the code strings (in + * ascending order by source values). The actual code strings are + * reconstructed from the lengths in the inflate process, as described + * in the deflate specification. + * + * REFERENCES + * + * Deutsch, L.P.,"'Deflate' Compressed Data Format Specification". + * Available in ftp.uu.net:/pub/archiving/zip/doc/deflate-1.1.doc + * + * Storer, James A. + * Data Compression: Methods and Theory, pp. 49-50. + * Computer Science Press, 1988. ISBN 0-7167-8156-5. + * + * Sedgewick, R. + * Algorithms, p290. + * Addison-Wesley, 1983. ISBN 0-201-06672-6. + */ + +/* @(#) $Id: trees.c,v 1.3 2005/07/27 18:15:11 nach Exp $ */ + +/* #define GEN_TREES_H */ + +#include "deflate.h" + +#ifdef DEBUG +# include +#endif + +/* =========================================================================== + * Constants + */ + +#define MAX_BL_BITS 7 +/* Bit length codes must not exceed MAX_BL_BITS bits */ + +#define END_BLOCK 256 +/* end of block literal code */ + +#define REP_3_6 16 +/* repeat previous bit length 3-6 times (2 bits of repeat count) */ + +#define REPZ_3_10 17 +/* repeat a zero length 3-10 times (3 bits of repeat count) */ + +#define REPZ_11_138 18 +/* repeat a zero length 11-138 times (7 bits of repeat count) */ + +local const int extra_lbits[LENGTH_CODES] /* extra bits for each length code */ + = {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0}; + +local const int extra_dbits[D_CODES] /* extra bits for each distance code */ + = {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; + +local const int extra_blbits[BL_CODES]/* extra bits for each bit length code */ + = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7}; + +local const uch bl_order[BL_CODES] + = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15}; +/* The lengths of the bit length codes are sent in order of decreasing + * probability, to avoid transmitting the lengths for unused bit length codes. + */ + +#define Buf_size (8 * 2*sizeof(char)) +/* Number of bits used within bi_buf. (bi_buf might be implemented on + * more than 16 bits on some systems.) + */ + +/* =========================================================================== + * Local data. These are initialized only once. + */ + +#define DIST_CODE_LEN 512 /* see definition of array dist_code below */ + +#if defined(GEN_TREES_H) || !defined(STDC) +/* non ANSI compilers may not accept trees.h */ + +local ct_data static_ltree[L_CODES+2]; +/* The static literal tree. Since the bit lengths are imposed, there is no + * need for the L_CODES extra codes used during heap construction. However + * The codes 286 and 287 are needed to build a canonical tree (see _tr_init + * below). + */ + +local ct_data static_dtree[D_CODES]; +/* The static distance tree. (Actually a trivial tree since all codes use + * 5 bits.) + */ + +uch _dist_code[DIST_CODE_LEN]; +/* Distance codes. The first 256 values correspond to the distances + * 3 .. 258, the last 256 values correspond to the top 8 bits of + * the 15 bit distances. + */ + +uch _length_code[MAX_MATCH-MIN_MATCH+1]; +/* length code for each normalized match length (0 == MIN_MATCH) */ + +local int base_length[LENGTH_CODES]; +/* First normalized length for each code (0 = MIN_MATCH) */ + +local int base_dist[D_CODES]; +/* First normalized distance for each code (0 = distance of 1) */ + +#else +# include "trees.h" +#endif /* GEN_TREES_H */ + +struct static_tree_desc_s { + const ct_data *static_tree; /* static tree or NULL */ + const intf *extra_bits; /* extra bits for each code or NULL */ + int extra_base; /* base index for extra_bits */ + int elems; /* max number of elements in the tree */ + int max_length; /* max bit length for the codes */ +}; + +local static_tree_desc static_l_desc = +{static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS}; + +local static_tree_desc static_d_desc = +{static_dtree, extra_dbits, 0, D_CODES, MAX_BITS}; + +local static_tree_desc static_bl_desc = +{(const ct_data *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS}; + +/* =========================================================================== + * Local (static) routines in this file. + */ + +local void tr_static_init OF((void)); +local void init_block OF((deflate_state *s)); +local void pqdownheap OF((deflate_state *s, ct_data *tree, int k)); +local void gen_bitlen OF((deflate_state *s, tree_desc *desc)); +local void gen_codes OF((ct_data *tree, int max_code, ushf *bl_count)); +local void build_tree OF((deflate_state *s, tree_desc *desc)); +local void scan_tree OF((deflate_state *s, ct_data *tree, int max_code)); +local void send_tree OF((deflate_state *s, ct_data *tree, int max_code)); +local int build_bl_tree OF((deflate_state *s)); +local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes, + int blcodes)); +local void compress_block OF((deflate_state *s, ct_data *ltree, + ct_data *dtree)); +local void set_data_type OF((deflate_state *s)); +local unsigned bi_reverse OF((unsigned value, int length)); +local void bi_windup OF((deflate_state *s)); +local void bi_flush OF((deflate_state *s)); +local void copy_block OF((deflate_state *s, charf *buf, unsigned len, + int header)); + +#ifdef GEN_TREES_H +local void gen_trees_header OF((void)); +#endif + +#ifndef DEBUG +# define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len) + /* Send a code of the given tree. c and tree must not have side effects */ + +#else /* DEBUG */ +# define send_code(s, c, tree) \ + { if (z_verbose>2) fprintf(stderr,"\ncd %3d ",(c)); \ + send_bits(s, tree[c].Code, tree[c].Len); } +#endif + +/* =========================================================================== + * Output a short LSB first on the stream. + * IN assertion: there is enough room in pendingBuf. + */ +#define put_short(s, w) { \ + put_byte(s, (uch)((w) & 0xff)); \ + put_byte(s, (uch)((ush)(w) >> 8)); \ +} + +/* =========================================================================== + * Send a value on a given number of bits. + * IN assertion: length <= 16 and value fits in length bits. + */ +#ifdef DEBUG +local void send_bits OF((deflate_state *s, int value, int length)); + +local void send_bits(s, value, length) + deflate_state *s; + int value; /* value to send */ + int length; /* number of bits */ +{ + Tracevv((stderr," l %2d v %4x ", length, value)); + Assert(length > 0 && length <= 15, "invalid length"); + s->bits_sent += (ulg)length; + + /* If not enough room in bi_buf, use (valid) bits from bi_buf and + * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid)) + * unused bits in value. + */ + if (s->bi_valid > (int)Buf_size - length) { + s->bi_buf |= (value << s->bi_valid); + put_short(s, s->bi_buf); + s->bi_buf = (ush)value >> (Buf_size - s->bi_valid); + s->bi_valid += length - Buf_size; + } else { + s->bi_buf |= value << s->bi_valid; + s->bi_valid += length; + } +} +#else /* !DEBUG */ + +#define send_bits(s, value, length) \ +{ int len = length;\ + if (s->bi_valid > (int)Buf_size - len) {\ + int val = value;\ + s->bi_buf |= (val << s->bi_valid);\ + put_short(s, s->bi_buf);\ + s->bi_buf = (ush)val >> (Buf_size - s->bi_valid);\ + s->bi_valid += len - Buf_size;\ + } else {\ + s->bi_buf |= (value) << s->bi_valid;\ + s->bi_valid += len;\ + }\ +} +#endif /* DEBUG */ + + +/* the arguments must not have side effects */ + +/* =========================================================================== + * Initialize the various 'constant' tables. + */ +local void tr_static_init() +{ +#if defined(GEN_TREES_H) || !defined(STDC) + static int static_init_done = 0; + int n; /* iterates over tree elements */ + int bits; /* bit counter */ + int length; /* length value */ + int code; /* code value */ + int dist; /* distance index */ + ush bl_count[MAX_BITS+1]; + /* number of codes at each bit length for an optimal tree */ + + if (static_init_done) return; + + /* For some embedded targets, global variables are not initialized: */ + static_l_desc.static_tree = static_ltree; + static_l_desc.extra_bits = extra_lbits; + static_d_desc.static_tree = static_dtree; + static_d_desc.extra_bits = extra_dbits; + static_bl_desc.extra_bits = extra_blbits; + + /* Initialize the mapping length (0..255) -> length code (0..28) */ + length = 0; + for (code = 0; code < LENGTH_CODES-1; code++) { + base_length[code] = length; + for (n = 0; n < (1< dist code (0..29) */ + dist = 0; + for (code = 0 ; code < 16; code++) { + base_dist[code] = dist; + for (n = 0; n < (1<>= 7; /* from now on, all distances are divided by 128 */ + for ( ; code < D_CODES; code++) { + base_dist[code] = dist << 7; + for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) { + _dist_code[256 + dist++] = (uch)code; + } + } + Assert (dist == 256, "tr_static_init: 256+dist != 512"); + + /* Construct the codes of the static literal tree */ + for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0; + n = 0; + while (n <= 143) static_ltree[n++].Len = 8, bl_count[8]++; + while (n <= 255) static_ltree[n++].Len = 9, bl_count[9]++; + while (n <= 279) static_ltree[n++].Len = 7, bl_count[7]++; + while (n <= 287) static_ltree[n++].Len = 8, bl_count[8]++; + /* Codes 286 and 287 do not exist, but we must include them in the + * tree construction to get a canonical Huffman tree (longest code + * all ones) + */ + gen_codes((ct_data *)static_ltree, L_CODES+1, bl_count); + + /* The static distance tree is trivial: */ + for (n = 0; n < D_CODES; n++) { + static_dtree[n].Len = 5; + static_dtree[n].Code = bi_reverse((unsigned)n, 5); + } + static_init_done = 1; + +# ifdef GEN_TREES_H + gen_trees_header(); +# endif +#endif /* defined(GEN_TREES_H) || !defined(STDC) */ +} + +/* =========================================================================== + * Genererate the file trees.h describing the static trees. + */ +#ifdef GEN_TREES_H +# ifndef DEBUG +# include +# endif + +# define SEPARATOR(i, last, width) \ + ((i) == (last)? "\n};\n\n" : \ + ((i) % (width) == (width)-1 ? ",\n" : ", ")) + +void gen_trees_header() +{ + FILE *header = fopen("trees.h", "w"); + int i; + + Assert (header != NULL, "Can't open trees.h"); + fprintf(header, + "/* header created automatically with -DGEN_TREES_H */\n\n"); + + fprintf(header, "local const ct_data static_ltree[L_CODES+2] = {\n"); + for (i = 0; i < L_CODES+2; i++) { + fprintf(header, "{{%3u},{%3u}}%s", static_ltree[i].Code, + static_ltree[i].Len, SEPARATOR(i, L_CODES+1, 5)); + } + + fprintf(header, "local const ct_data static_dtree[D_CODES] = {\n"); + for (i = 0; i < D_CODES; i++) { + fprintf(header, "{{%2u},{%2u}}%s", static_dtree[i].Code, + static_dtree[i].Len, SEPARATOR(i, D_CODES-1, 5)); + } + + fprintf(header, "const uch _dist_code[DIST_CODE_LEN] = {\n"); + for (i = 0; i < DIST_CODE_LEN; i++) { + fprintf(header, "%2u%s", _dist_code[i], + SEPARATOR(i, DIST_CODE_LEN-1, 20)); + } + + fprintf(header, "const uch _length_code[MAX_MATCH-MIN_MATCH+1]= {\n"); + for (i = 0; i < MAX_MATCH-MIN_MATCH+1; i++) { + fprintf(header, "%2u%s", _length_code[i], + SEPARATOR(i, MAX_MATCH-MIN_MATCH, 20)); + } + + fprintf(header, "local const int base_length[LENGTH_CODES] = {\n"); + for (i = 0; i < LENGTH_CODES; i++) { + fprintf(header, "%1u%s", base_length[i], + SEPARATOR(i, LENGTH_CODES-1, 20)); + } + + fprintf(header, "local const int base_dist[D_CODES] = {\n"); + for (i = 0; i < D_CODES; i++) { + fprintf(header, "%5u%s", base_dist[i], + SEPARATOR(i, D_CODES-1, 10)); + } + + fclose(header); +} +#endif /* GEN_TREES_H */ + +/* =========================================================================== + * Initialize the tree data structures for a new zlib stream. + */ +void _tr_init(s) + deflate_state *s; +{ + tr_static_init(); + + s->l_desc.dyn_tree = s->dyn_ltree; + s->l_desc.stat_desc = &static_l_desc; + + s->d_desc.dyn_tree = s->dyn_dtree; + s->d_desc.stat_desc = &static_d_desc; + + s->bl_desc.dyn_tree = s->bl_tree; + s->bl_desc.stat_desc = &static_bl_desc; + + s->bi_buf = 0; + s->bi_valid = 0; + s->last_eob_len = 8; /* enough lookahead for inflate */ +#ifdef DEBUG + s->compressed_len = 0L; + s->bits_sent = 0L; +#endif + + /* Initialize the first block of the first file: */ + init_block(s); +} + +/* =========================================================================== + * Initialize a new block. + */ +local void init_block(s) + deflate_state *s; +{ + int n; /* iterates over tree elements */ + + /* Initialize the trees. */ + for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0; + for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0; + for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0; + + s->dyn_ltree[END_BLOCK].Freq = 1; + s->opt_len = s->static_len = 0L; + s->last_lit = s->matches = 0; +} + +#define SMALLEST 1 +/* Index within the heap array of least frequent node in the Huffman tree */ + + +/* =========================================================================== + * Remove the smallest element from the heap and recreate the heap with + * one less element. Updates heap and heap_len. + */ +#define pqremove(s, tree, top) \ +{\ + top = s->heap[SMALLEST]; \ + s->heap[SMALLEST] = s->heap[s->heap_len--]; \ + pqdownheap(s, tree, SMALLEST); \ +} + +/* =========================================================================== + * Compares to subtrees, using the tree depth as tie breaker when + * the subtrees have equal frequency. This minimizes the worst case length. + */ +#define smaller(tree, n, m, depth) \ + (tree[n].Freq < tree[m].Freq || \ + (tree[n].Freq == tree[m].Freq && depth[n] <= depth[m])) + +/* =========================================================================== + * Restore the heap property by moving down the tree starting at node k, + * exchanging a node with the smallest of its two sons if necessary, stopping + * when the heap property is re-established (each father smaller than its + * two sons). + */ +local void pqdownheap(s, tree, k) + deflate_state *s; + ct_data *tree; /* the tree to restore */ + int k; /* node to move down */ +{ + int v = s->heap[k]; + int j = k << 1; /* left son of k */ + while (j <= s->heap_len) { + /* Set j to the smallest of the two sons: */ + if (j < s->heap_len && + smaller(tree, s->heap[j+1], s->heap[j], s->depth)) { + j++; + } + /* Exit if v is smaller than both sons */ + if (smaller(tree, v, s->heap[j], s->depth)) break; + + /* Exchange v with the smallest son */ + s->heap[k] = s->heap[j]; k = j; + + /* And continue down the tree, setting j to the left son of k */ + j <<= 1; + } + s->heap[k] = v; +} + +/* =========================================================================== + * Compute the optimal bit lengths for a tree and update the total bit length + * for the current block. + * IN assertion: the fields freq and dad are set, heap[heap_max] and + * above are the tree nodes sorted by increasing frequency. + * OUT assertions: the field len is set to the optimal bit length, the + * array bl_count contains the frequencies for each bit length. + * The length opt_len is updated; static_len is also updated if stree is + * not null. + */ +local void gen_bitlen(s, desc) + deflate_state *s; + tree_desc *desc; /* the tree descriptor */ +{ + ct_data *tree = desc->dyn_tree; + int max_code = desc->max_code; + const ct_data *stree = desc->stat_desc->static_tree; + const intf *extra = desc->stat_desc->extra_bits; + int base = desc->stat_desc->extra_base; + int max_length = desc->stat_desc->max_length; + int h; /* heap index */ + int n, m; /* iterate over the tree elements */ + int bits; /* bit length */ + int xbits; /* extra bits */ + ush f; /* frequency */ + int overflow = 0; /* number of elements with bit length too large */ + + for (bits = 0; bits <= MAX_BITS; bits++) s->bl_count[bits] = 0; + + /* In a first pass, compute the optimal bit lengths (which may + * overflow in the case of the bit length tree). + */ + tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */ + + for (h = s->heap_max+1; h < HEAP_SIZE; h++) { + n = s->heap[h]; + bits = tree[tree[n].Dad].Len + 1; + if (bits > max_length) bits = max_length, overflow++; + tree[n].Len = (ush)bits; + /* We overwrite tree[n].Dad which is no longer needed */ + + if (n > max_code) continue; /* not a leaf node */ + + s->bl_count[bits]++; + xbits = 0; + if (n >= base) xbits = extra[n-base]; + f = tree[n].Freq; + s->opt_len += (ulg)f * (bits + xbits); + if (stree) s->static_len += (ulg)f * (stree[n].Len + xbits); + } + if (overflow == 0) return; + + Trace((stderr,"\nbit length overflow\n")); + /* This happens for example on obj2 and pic of the Calgary corpus */ + + /* Find the first bit length which could increase: */ + do { + bits = max_length-1; + while (s->bl_count[bits] == 0) bits--; + s->bl_count[bits]--; /* move one leaf down the tree */ + s->bl_count[bits+1] += 2; /* move one overflow item as its brother */ + s->bl_count[max_length]--; + /* The brother of the overflow item also moves one step up, + * but this does not affect bl_count[max_length] + */ + overflow -= 2; + } while (overflow > 0); + + /* Now recompute all bit lengths, scanning in increasing frequency. + * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all + * lengths instead of fixing only the wrong ones. This idea is taken + * from 'ar' written by Haruhiko Okumura.) + */ + for (bits = max_length; bits != 0; bits--) { + n = s->bl_count[bits]; + while (n != 0) { + m = s->heap[--h]; + if (m > max_code) continue; + if ((unsigned) tree[m].Len != (unsigned) bits) { + Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); + s->opt_len += ((long)bits - (long)tree[m].Len) + *(long)tree[m].Freq; + tree[m].Len = (ush)bits; + } + n--; + } + } +} + +/* =========================================================================== + * Generate the codes for a given tree and bit counts (which need not be + * optimal). + * IN assertion: the array bl_count contains the bit length statistics for + * the given tree and the field len is set for all tree elements. + * OUT assertion: the field code is set for all tree elements of non + * zero code length. + */ +local void gen_codes (tree, max_code, bl_count) + ct_data *tree; /* the tree to decorate */ + int max_code; /* largest code with non zero frequency */ + ushf *bl_count; /* number of codes at each bit length */ +{ + ush next_code[MAX_BITS+1]; /* next code value for each bit length */ + ush code = 0; /* running code value */ + int bits; /* bit index */ + int n; /* code index */ + + /* The distribution counts are first used to generate the code values + * without bit reversal. + */ + for (bits = 1; bits <= MAX_BITS; bits++) { + next_code[bits] = code = (code + bl_count[bits-1]) << 1; + } + /* Check that the bit counts in bl_count are consistent. The last code + * must be all ones. + */ + Assert (code + bl_count[MAX_BITS]-1 == (1<dyn_tree; + const ct_data *stree = desc->stat_desc->static_tree; + int elems = desc->stat_desc->elems; + int n, m; /* iterate over heap elements */ + int max_code = -1; /* largest code with non zero frequency */ + int node; /* new node being created */ + + /* Construct the initial heap, with least frequent element in + * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. + * heap[0] is not used. + */ + s->heap_len = 0, s->heap_max = HEAP_SIZE; + + for (n = 0; n < elems; n++) { + if (tree[n].Freq != 0) { + s->heap[++(s->heap_len)] = max_code = n; + s->depth[n] = 0; + } else { + tree[n].Len = 0; + } + } + + /* The pkzip format requires that at least one distance code exists, + * and that at least one bit should be sent even if there is only one + * possible code. So to avoid special checks later on we force at least + * two codes of non zero frequency. + */ + while (s->heap_len < 2) { + node = s->heap[++(s->heap_len)] = (max_code < 2 ? ++max_code : 0); + tree[node].Freq = 1; + s->depth[node] = 0; + s->opt_len--; if (stree) s->static_len -= stree[node].Len; + /* node is 0 or 1 so it does not have extra bits */ + } + desc->max_code = max_code; + + /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, + * establish sub-heaps of increasing lengths: + */ + for (n = s->heap_len/2; n >= 1; n--) pqdownheap(s, tree, n); + + /* Construct the Huffman tree by repeatedly combining the least two + * frequent nodes. + */ + node = elems; /* next internal node of the tree */ + do { + pqremove(s, tree, n); /* n = node of least frequency */ + m = s->heap[SMALLEST]; /* m = node of next least frequency */ + + s->heap[--(s->heap_max)] = n; /* keep the nodes sorted by frequency */ + s->heap[--(s->heap_max)] = m; + + /* Create a new node father of n and m */ + tree[node].Freq = tree[n].Freq + tree[m].Freq; + s->depth[node] = (uch)((s->depth[n] >= s->depth[m] ? + s->depth[n] : s->depth[m]) + 1); + tree[n].Dad = tree[m].Dad = (ush)node; +#ifdef DUMP_BL_TREE + if (tree == s->bl_tree) { + fprintf(stderr,"\nnode %d(%d), sons %d(%d) %d(%d)", + node, tree[node].Freq, n, tree[n].Freq, m, tree[m].Freq); + } +#endif + /* and insert the new node in the heap */ + s->heap[SMALLEST] = node++; + pqdownheap(s, tree, SMALLEST); + + } while (s->heap_len >= 2); + + s->heap[--(s->heap_max)] = s->heap[SMALLEST]; + + /* At this point, the fields freq and dad are set. We can now + * generate the bit lengths. + */ + gen_bitlen(s, (tree_desc *)desc); + + /* The field len is now set, we can generate the bit codes */ + gen_codes ((ct_data *)tree, max_code, s->bl_count); +} + +/* =========================================================================== + * Scan a literal or distance tree to determine the frequencies of the codes + * in the bit length tree. + */ +local void scan_tree (s, tree, max_code) + deflate_state *s; + ct_data *tree; /* the tree to be scanned */ + int max_code; /* and its largest code of non zero frequency */ +{ + int n; /* iterates over all tree elements */ + int prevlen = -1; /* last emitted length */ + int curlen; /* length of current code */ + int nextlen = tree[0].Len; /* length of next code */ + int count = 0; /* repeat count of the current code */ + int max_count = 7; /* max repeat count */ + int min_count = 4; /* min repeat count */ + + if (nextlen == 0) max_count = 138, min_count = 3; + tree[max_code+1].Len = (ush)0xffff; /* guard */ + + for (n = 0; n <= max_code; n++) { + curlen = nextlen; nextlen = tree[n+1].Len; + if (++count < max_count && curlen == nextlen) { + continue; + } else if (count < min_count) { + s->bl_tree[curlen].Freq += count; + } else if (curlen != 0) { + if (curlen != prevlen) s->bl_tree[curlen].Freq++; + s->bl_tree[REP_3_6].Freq++; + } else if (count <= 10) { + s->bl_tree[REPZ_3_10].Freq++; + } else { + s->bl_tree[REPZ_11_138].Freq++; + } + count = 0; prevlen = curlen; + if (nextlen == 0) { + max_count = 138, min_count = 3; + } else if (curlen == nextlen) { + max_count = 6, min_count = 3; + } else { + max_count = 7, min_count = 4; + } + } +} + +/* =========================================================================== + * Send a literal or distance tree in compressed form, using the codes in + * bl_tree. + */ +local void send_tree (s, tree, max_code) + deflate_state *s; + ct_data *tree; /* the tree to be scanned */ + int max_code; /* and its largest code of non zero frequency */ +{ + int n; /* iterates over all tree elements */ + int prevlen = -1; /* last emitted length */ + int curlen; /* length of current code */ + int nextlen = tree[0].Len; /* length of next code */ + int count = 0; /* repeat count of the current code */ + int max_count = 7; /* max repeat count */ + int min_count = 4; /* min repeat count */ + + /* tree[max_code+1].Len = -1; */ /* guard already set */ + if (nextlen == 0) max_count = 138, min_count = 3; + + for (n = 0; n <= max_code; n++) { + curlen = nextlen; nextlen = tree[n+1].Len; + if (++count < max_count && curlen == nextlen) { + continue; + } else if (count < min_count) { + do { send_code(s, curlen, s->bl_tree); } while (--count != 0); + + } else if (curlen != 0) { + if (curlen != prevlen) { + send_code(s, curlen, s->bl_tree); count--; + } + Assert(count >= 3 && count <= 6, " 3_6?"); + send_code(s, REP_3_6, s->bl_tree); send_bits(s, count-3, 2); + + } else if (count <= 10) { + send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count-3, 3); + + } else { + send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count-11, 7); + } + count = 0; prevlen = curlen; + if (nextlen == 0) { + max_count = 138, min_count = 3; + } else if (curlen == nextlen) { + max_count = 6, min_count = 3; + } else { + max_count = 7, min_count = 4; + } + } +} + +/* =========================================================================== + * Construct the Huffman tree for the bit lengths and return the index in + * bl_order of the last bit length code to send. + */ +local int build_bl_tree(s) + deflate_state *s; +{ + int max_blindex; /* index of last bit length code of non zero freq */ + + /* Determine the bit length frequencies for literal and distance trees */ + scan_tree(s, (ct_data *)s->dyn_ltree, s->l_desc.max_code); + scan_tree(s, (ct_data *)s->dyn_dtree, s->d_desc.max_code); + + /* Build the bit length tree: */ + build_tree(s, (tree_desc *)(&(s->bl_desc))); + /* opt_len now includes the length of the tree representations, except + * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. + */ + + /* Determine the number of bit length codes to send. The pkzip format + * requires that at least 4 bit length codes be sent. (appnote.txt says + * 3 but the actual value used is 4.) + */ + for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) { + if (s->bl_tree[bl_order[max_blindex]].Len != 0) break; + } + /* Update opt_len to include the bit length tree and counts */ + s->opt_len += 3*(max_blindex+1) + 5+5+4; + Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", + s->opt_len, s->static_len)); + + return max_blindex; +} + +/* =========================================================================== + * Send the header for a block using dynamic Huffman trees: the counts, the + * lengths of the bit length codes, the literal tree and the distance tree. + * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. + */ +local void send_all_trees(s, lcodes, dcodes, blcodes) + deflate_state *s; + int lcodes, dcodes, blcodes; /* number of codes for each tree */ +{ + int rank; /* index in bl_order */ + + Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); + Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, + "too many codes"); + Tracev((stderr, "\nbl counts: ")); + send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */ + send_bits(s, dcodes-1, 5); + send_bits(s, blcodes-4, 4); /* not -3 as stated in appnote.txt */ + for (rank = 0; rank < blcodes; rank++) { + Tracev((stderr, "\nbl code %2d ", bl_order[rank])); + send_bits(s, s->bl_tree[bl_order[rank]].Len, 3); + } + Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); + + send_tree(s, (ct_data *)s->dyn_ltree, lcodes-1); /* literal tree */ + Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); + + send_tree(s, (ct_data *)s->dyn_dtree, dcodes-1); /* distance tree */ + Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); +} + +/* =========================================================================== + * Send a stored block + */ +void _tr_stored_block(s, buf, stored_len, eof) + deflate_state *s; + charf *buf; /* input block */ + ulg stored_len; /* length of input block */ + int eof; /* true if this is the last block for a file */ +{ + send_bits(s, (STORED_BLOCK<<1)+eof, 3); /* send block type */ +#ifdef DEBUG + s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L; + s->compressed_len += (stored_len + 4) << 3; +#endif + copy_block(s, buf, (unsigned)stored_len, 1); /* with header */ +} + +/* =========================================================================== + * Send one empty static block to give enough lookahead for inflate. + * This takes 10 bits, of which 7 may remain in the bit buffer. + * The current inflate code requires 9 bits of lookahead. If the + * last two codes for the previous block (real code plus EOB) were coded + * on 5 bits or less, inflate may have only 5+3 bits of lookahead to decode + * the last real code. In this case we send two empty static blocks instead + * of one. (There are no problems if the previous block is stored or fixed.) + * To simplify the code, we assume the worst case of last real code encoded + * on one bit only. + */ +void _tr_align(s) + deflate_state *s; +{ + send_bits(s, STATIC_TREES<<1, 3); + send_code(s, END_BLOCK, static_ltree); +#ifdef DEBUG + s->compressed_len += 10L; /* 3 for block type, 7 for EOB */ +#endif + bi_flush(s); + /* Of the 10 bits for the empty block, we have already sent + * (10 - bi_valid) bits. The lookahead for the last real code (before + * the EOB of the previous block) was thus at least one plus the length + * of the EOB plus what we have just sent of the empty static block. + */ + if (1 + s->last_eob_len + 10 - s->bi_valid < 9) { + send_bits(s, STATIC_TREES<<1, 3); + send_code(s, END_BLOCK, static_ltree); +#ifdef DEBUG + s->compressed_len += 10L; +#endif + bi_flush(s); + } + s->last_eob_len = 7; +} + +/* =========================================================================== + * Determine the best encoding for the current block: dynamic trees, static + * trees or store, and output the encoded block to the zip file. + */ +void _tr_flush_block(s, buf, stored_len, eof) + deflate_state *s; + charf *buf; /* input block, or NULL if too old */ + ulg stored_len; /* length of input block */ + int eof; /* true if this is the last block for a file */ +{ + ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */ + int max_blindex = 0; /* index of last bit length code of non zero freq */ + + /* Build the Huffman trees unless a stored block is forced */ + if (s->level > 0) { + + /* Check if the file is binary or text */ + if (stored_len > 0 && s->strm->data_type == Z_UNKNOWN) + set_data_type(s); + + /* Construct the literal and distance trees */ + build_tree(s, (tree_desc *)(&(s->l_desc))); + Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, + s->static_len)); + + build_tree(s, (tree_desc *)(&(s->d_desc))); + Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, + s->static_len)); + /* At this point, opt_len and static_len are the total bit lengths of + * the compressed block data, excluding the tree representations. + */ + + /* Build the bit length tree for the above two trees, and get the index + * in bl_order of the last bit length code to send. + */ + max_blindex = build_bl_tree(s); + + /* Determine the best encoding. Compute the block lengths in bytes. */ + opt_lenb = (s->opt_len+3+7)>>3; + static_lenb = (s->static_len+3+7)>>3; + + Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", + opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, + s->last_lit)); + + if (static_lenb <= opt_lenb) opt_lenb = static_lenb; + + } else { + Assert(buf != (char*)0, "lost buf"); + opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ + } + +#ifdef FORCE_STORED + if (buf != (char*)0) { /* force stored block */ +#else + if (stored_len+4 <= opt_lenb && buf != (char*)0) { + /* 4: two words for the lengths */ +#endif + /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. + * Otherwise we can't have processed more than WSIZE input bytes since + * the last block flush, because compression would have been + * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to + * transform a block into a stored block. + */ + _tr_stored_block(s, buf, stored_len, eof); + +#ifdef FORCE_STATIC + } else if (static_lenb >= 0) { /* force static trees */ +#else + } else if (s->strategy == Z_FIXED || static_lenb == opt_lenb) { +#endif + send_bits(s, (STATIC_TREES<<1)+eof, 3); + compress_block(s, (ct_data *)static_ltree, (ct_data *)static_dtree); +#ifdef DEBUG + s->compressed_len += 3 + s->static_len; +#endif + } else { + send_bits(s, (DYN_TREES<<1)+eof, 3); + send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1, + max_blindex+1); + compress_block(s, (ct_data *)s->dyn_ltree, (ct_data *)s->dyn_dtree); +#ifdef DEBUG + s->compressed_len += 3 + s->opt_len; +#endif + } + Assert (s->compressed_len == s->bits_sent, "bad compressed size"); + /* The above check is made mod 2^32, for files larger than 512 MB + * and uLong implemented on 32 bits. + */ + init_block(s); + + if (eof) { + bi_windup(s); +#ifdef DEBUG + s->compressed_len += 7; /* align on byte boundary */ +#endif + } + Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, + s->compressed_len-7*eof)); +} + +/* =========================================================================== + * Save the match info and tally the frequency counts. Return true if + * the current block must be flushed. + */ +int _tr_tally (s, dist, lc) + deflate_state *s; + unsigned dist; /* distance of matched string */ + unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ +{ + s->d_buf[s->last_lit] = (ush)dist; + s->l_buf[s->last_lit++] = (uch)lc; + if (dist == 0) { + /* lc is the unmatched char */ + s->dyn_ltree[lc].Freq++; + } else { + s->matches++; + /* Here, lc is the match length - MIN_MATCH */ + dist--; /* dist = match distance - 1 */ + Assert((ush)dist < (ush)MAX_DIST(s) && + (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && + (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); + + s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++; + s->dyn_dtree[d_code(dist)].Freq++; + } + +#ifdef TRUNCATE_BLOCK + /* Try to guess if it is profitable to stop the current block here */ + if ((s->last_lit & 0x1fff) == 0 && s->level > 2) { + /* Compute an upper bound for the compressed length */ + ulg out_length = (ulg)s->last_lit*8L; + ulg in_length = (ulg)((long)s->strstart - s->block_start); + int dcode; + for (dcode = 0; dcode < D_CODES; dcode++) { + out_length += (ulg)s->dyn_dtree[dcode].Freq * + (5L+extra_dbits[dcode]); + } + out_length >>= 3; + Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", + s->last_lit, in_length, out_length, + 100L - out_length*100L/in_length)); + if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1; + } +#endif + return (s->last_lit == s->lit_bufsize-1); + /* We avoid equality with lit_bufsize because of wraparound at 64K + * on 16 bit machines and because stored blocks are restricted to + * 64K-1 bytes. + */ +} + +/* =========================================================================== + * Send the block data compressed using the given Huffman trees + */ +local void compress_block(s, ltree, dtree) + deflate_state *s; + ct_data *ltree; /* literal tree */ + ct_data *dtree; /* distance tree */ +{ + unsigned dist; /* distance of matched string */ + int lc; /* match length or unmatched char (if dist == 0) */ + unsigned lx = 0; /* running index in l_buf */ + unsigned code; /* the code to send */ + int extra; /* number of extra bits to send */ + + if (s->last_lit != 0) do { + dist = s->d_buf[lx]; + lc = s->l_buf[lx++]; + if (dist == 0) { + send_code(s, lc, ltree); /* send a literal byte */ + Tracecv(isgraph(lc), (stderr," '%c' ", lc)); + } else { + /* Here, lc is the match length - MIN_MATCH */ + code = _length_code[lc]; + send_code(s, code+LITERALS+1, ltree); /* send the length code */ + extra = extra_lbits[code]; + if (extra != 0) { + lc -= base_length[code]; + send_bits(s, lc, extra); /* send the extra length bits */ + } + dist--; /* dist is now the match distance - 1 */ + code = d_code(dist); + Assert (code < D_CODES, "bad d_code"); + + send_code(s, code, dtree); /* send the distance code */ + extra = extra_dbits[code]; + if (extra != 0) { + dist -= base_dist[code]; + send_bits(s, dist, extra); /* send the extra distance bits */ + } + } /* literal or match pair ? */ + + /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ + Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx, + "pendingBuf overflow"); + + } while (lx < s->last_lit); + + send_code(s, END_BLOCK, ltree); + s->last_eob_len = ltree[END_BLOCK].Len; +} + +/* =========================================================================== + * Set the data type to BINARY or TEXT, using a crude approximation: + * set it to Z_TEXT if all symbols are either printable characters (33 to 255) + * or white spaces (9 to 13, or 32); or set it to Z_BINARY otherwise. + * IN assertion: the fields Freq of dyn_ltree are set. + */ +local void set_data_type(s) + deflate_state *s; +{ + int n; + + for (n = 0; n < 9; n++) + if (s->dyn_ltree[n].Freq != 0) + break; + if (n == 9) + for (n = 14; n < 32; n++) + if (s->dyn_ltree[n].Freq != 0) + break; + s->strm->data_type = (n == 32) ? Z_TEXT : Z_BINARY; +} + +/* =========================================================================== + * Reverse the first len bits of a code, using straightforward code (a faster + * method would use a table) + * IN assertion: 1 <= len <= 15 + */ +local unsigned bi_reverse(code, len) + unsigned code; /* the value to invert */ + int len; /* its bit length */ +{ + register unsigned res = 0; + do { + res |= code & 1; + code >>= 1, res <<= 1; + } while (--len > 0); + return res >> 1; +} + +/* =========================================================================== + * Flush the bit buffer, keeping at most 7 bits in it. + */ +local void bi_flush(s) + deflate_state *s; +{ + if (s->bi_valid == 16) { + put_short(s, s->bi_buf); + s->bi_buf = 0; + s->bi_valid = 0; + } else if (s->bi_valid >= 8) { + put_byte(s, (Byte)s->bi_buf); + s->bi_buf >>= 8; + s->bi_valid -= 8; + } +} + +/* =========================================================================== + * Flush the bit buffer and align the output on a byte boundary + */ +local void bi_windup(s) + deflate_state *s; +{ + if (s->bi_valid > 8) { + put_short(s, s->bi_buf); + } else if (s->bi_valid > 0) { + put_byte(s, (Byte)s->bi_buf); + } + s->bi_buf = 0; + s->bi_valid = 0; +#ifdef DEBUG + s->bits_sent = (s->bits_sent+7) & ~7; +#endif +} + +/* =========================================================================== + * Copy a stored block, storing first the length and its + * one's complement if requested. + */ +local void copy_block(s, buf, len, header) + deflate_state *s; + charf *buf; /* the input data */ + unsigned len; /* its length */ + int header; /* true if block header must be written */ +{ + bi_windup(s); /* align on byte boundary */ + s->last_eob_len = 8; /* enough lookahead for inflate */ + + if (header) { + put_short(s, (ush)len); + put_short(s, (ush)~len); +#ifdef DEBUG + s->bits_sent += 2*16; +#endif + } +#ifdef DEBUG + s->bits_sent += (ulg)len<<3; +#endif + while (len--) { + put_byte(s, *buf++); + } +} diff --git a/tools/bsnes/lib/zlib/trees.h b/tools/bsnes/lib/zlib/trees.h new file mode 100755 index 0000000..72facf9 --- /dev/null +++ b/tools/bsnes/lib/zlib/trees.h @@ -0,0 +1,128 @@ +/* header created automatically with -DGEN_TREES_H */ + +local const ct_data static_ltree[L_CODES+2] = { +{{ 12},{ 8}}, {{140},{ 8}}, {{ 76},{ 8}}, {{204},{ 8}}, {{ 44},{ 8}}, +{{172},{ 8}}, {{108},{ 8}}, {{236},{ 8}}, {{ 28},{ 8}}, {{156},{ 8}}, +{{ 92},{ 8}}, {{220},{ 8}}, {{ 60},{ 8}}, {{188},{ 8}}, {{124},{ 8}}, +{{252},{ 8}}, {{ 2},{ 8}}, {{130},{ 8}}, {{ 66},{ 8}}, {{194},{ 8}}, +{{ 34},{ 8}}, {{162},{ 8}}, {{ 98},{ 8}}, {{226},{ 8}}, {{ 18},{ 8}}, +{{146},{ 8}}, {{ 82},{ 8}}, {{210},{ 8}}, {{ 50},{ 8}}, {{178},{ 8}}, +{{114},{ 8}}, {{242},{ 8}}, {{ 10},{ 8}}, {{138},{ 8}}, {{ 74},{ 8}}, +{{202},{ 8}}, {{ 42},{ 8}}, {{170},{ 8}}, {{106},{ 8}}, {{234},{ 8}}, +{{ 26},{ 8}}, {{154},{ 8}}, {{ 90},{ 8}}, {{218},{ 8}}, {{ 58},{ 8}}, +{{186},{ 8}}, {{122},{ 8}}, {{250},{ 8}}, {{ 6},{ 8}}, {{134},{ 8}}, +{{ 70},{ 8}}, {{198},{ 8}}, {{ 38},{ 8}}, {{166},{ 8}}, {{102},{ 8}}, +{{230},{ 8}}, {{ 22},{ 8}}, {{150},{ 8}}, {{ 86},{ 8}}, {{214},{ 8}}, +{{ 54},{ 8}}, {{182},{ 8}}, {{118},{ 8}}, {{246},{ 8}}, {{ 14},{ 8}}, +{{142},{ 8}}, {{ 78},{ 8}}, {{206},{ 8}}, {{ 46},{ 8}}, {{174},{ 8}}, +{{110},{ 8}}, {{238},{ 8}}, {{ 30},{ 8}}, {{158},{ 8}}, {{ 94},{ 8}}, +{{222},{ 8}}, {{ 62},{ 8}}, {{190},{ 8}}, {{126},{ 8}}, {{254},{ 8}}, +{{ 1},{ 8}}, {{129},{ 8}}, {{ 65},{ 8}}, {{193},{ 8}}, {{ 33},{ 8}}, +{{161},{ 8}}, {{ 97},{ 8}}, {{225},{ 8}}, {{ 17},{ 8}}, {{145},{ 8}}, +{{ 81},{ 8}}, {{209},{ 8}}, {{ 49},{ 8}}, {{177},{ 8}}, {{113},{ 8}}, +{{241},{ 8}}, {{ 9},{ 8}}, {{137},{ 8}}, {{ 73},{ 8}}, {{201},{ 8}}, +{{ 41},{ 8}}, {{169},{ 8}}, {{105},{ 8}}, {{233},{ 8}}, {{ 25},{ 8}}, +{{153},{ 8}}, {{ 89},{ 8}}, {{217},{ 8}}, {{ 57},{ 8}}, {{185},{ 8}}, +{{121},{ 8}}, {{249},{ 8}}, {{ 5},{ 8}}, {{133},{ 8}}, {{ 69},{ 8}}, +{{197},{ 8}}, {{ 37},{ 8}}, {{165},{ 8}}, {{101},{ 8}}, {{229},{ 8}}, +{{ 21},{ 8}}, {{149},{ 8}}, {{ 85},{ 8}}, {{213},{ 8}}, {{ 53},{ 8}}, +{{181},{ 8}}, {{117},{ 8}}, {{245},{ 8}}, {{ 13},{ 8}}, {{141},{ 8}}, +{{ 77},{ 8}}, {{205},{ 8}}, {{ 45},{ 8}}, {{173},{ 8}}, {{109},{ 8}}, +{{237},{ 8}}, {{ 29},{ 8}}, {{157},{ 8}}, {{ 93},{ 8}}, {{221},{ 8}}, +{{ 61},{ 8}}, {{189},{ 8}}, {{125},{ 8}}, {{253},{ 8}}, {{ 19},{ 9}}, +{{275},{ 9}}, {{147},{ 9}}, {{403},{ 9}}, {{ 83},{ 9}}, {{339},{ 9}}, +{{211},{ 9}}, {{467},{ 9}}, {{ 51},{ 9}}, {{307},{ 9}}, {{179},{ 9}}, +{{435},{ 9}}, {{115},{ 9}}, {{371},{ 9}}, {{243},{ 9}}, {{499},{ 9}}, +{{ 11},{ 9}}, {{267},{ 9}}, {{139},{ 9}}, {{395},{ 9}}, {{ 75},{ 9}}, +{{331},{ 9}}, {{203},{ 9}}, {{459},{ 9}}, {{ 43},{ 9}}, {{299},{ 9}}, +{{171},{ 9}}, {{427},{ 9}}, {{107},{ 9}}, {{363},{ 9}}, {{235},{ 9}}, +{{491},{ 9}}, {{ 27},{ 9}}, {{283},{ 9}}, {{155},{ 9}}, {{411},{ 9}}, +{{ 91},{ 9}}, {{347},{ 9}}, {{219},{ 9}}, {{475},{ 9}}, {{ 59},{ 9}}, +{{315},{ 9}}, {{187},{ 9}}, {{443},{ 9}}, {{123},{ 9}}, {{379},{ 9}}, +{{251},{ 9}}, {{507},{ 9}}, {{ 7},{ 9}}, {{263},{ 9}}, {{135},{ 9}}, +{{391},{ 9}}, {{ 71},{ 9}}, {{327},{ 9}}, {{199},{ 9}}, {{455},{ 9}}, +{{ 39},{ 9}}, {{295},{ 9}}, {{167},{ 9}}, {{423},{ 9}}, {{103},{ 9}}, +{{359},{ 9}}, {{231},{ 9}}, {{487},{ 9}}, {{ 23},{ 9}}, {{279},{ 9}}, +{{151},{ 9}}, {{407},{ 9}}, {{ 87},{ 9}}, {{343},{ 9}}, {{215},{ 9}}, +{{471},{ 9}}, {{ 55},{ 9}}, {{311},{ 9}}, {{183},{ 9}}, {{439},{ 9}}, +{{119},{ 9}}, {{375},{ 9}}, {{247},{ 9}}, {{503},{ 9}}, {{ 15},{ 9}}, +{{271},{ 9}}, {{143},{ 9}}, {{399},{ 9}}, {{ 79},{ 9}}, {{335},{ 9}}, +{{207},{ 9}}, {{463},{ 9}}, {{ 47},{ 9}}, {{303},{ 9}}, {{175},{ 9}}, +{{431},{ 9}}, {{111},{ 9}}, {{367},{ 9}}, {{239},{ 9}}, {{495},{ 9}}, +{{ 31},{ 9}}, {{287},{ 9}}, {{159},{ 9}}, {{415},{ 9}}, {{ 95},{ 9}}, +{{351},{ 9}}, {{223},{ 9}}, {{479},{ 9}}, {{ 63},{ 9}}, {{319},{ 9}}, +{{191},{ 9}}, {{447},{ 9}}, {{127},{ 9}}, {{383},{ 9}}, {{255},{ 9}}, +{{511},{ 9}}, {{ 0},{ 7}}, {{ 64},{ 7}}, {{ 32},{ 7}}, {{ 96},{ 7}}, +{{ 16},{ 7}}, {{ 80},{ 7}}, {{ 48},{ 7}}, {{112},{ 7}}, {{ 8},{ 7}}, +{{ 72},{ 7}}, {{ 40},{ 7}}, {{104},{ 7}}, {{ 24},{ 7}}, {{ 88},{ 7}}, +{{ 56},{ 7}}, {{120},{ 7}}, {{ 4},{ 7}}, {{ 68},{ 7}}, {{ 36},{ 7}}, +{{100},{ 7}}, {{ 20},{ 7}}, {{ 84},{ 7}}, {{ 52},{ 7}}, {{116},{ 7}}, +{{ 3},{ 8}}, {{131},{ 8}}, {{ 67},{ 8}}, {{195},{ 8}}, {{ 35},{ 8}}, +{{163},{ 8}}, {{ 99},{ 8}}, {{227},{ 8}} +}; + +local const ct_data static_dtree[D_CODES] = { +{{ 0},{ 5}}, {{16},{ 5}}, {{ 8},{ 5}}, {{24},{ 5}}, {{ 4},{ 5}}, +{{20},{ 5}}, {{12},{ 5}}, {{28},{ 5}}, {{ 2},{ 5}}, {{18},{ 5}}, +{{10},{ 5}}, {{26},{ 5}}, {{ 6},{ 5}}, {{22},{ 5}}, {{14},{ 5}}, +{{30},{ 5}}, {{ 1},{ 5}}, {{17},{ 5}}, {{ 9},{ 5}}, {{25},{ 5}}, +{{ 5},{ 5}}, {{21},{ 5}}, {{13},{ 5}}, {{29},{ 5}}, {{ 3},{ 5}}, +{{19},{ 5}}, {{11},{ 5}}, {{27},{ 5}}, {{ 7},{ 5}}, {{23},{ 5}} +}; + +const uch _dist_code[DIST_CODE_LEN] = { + 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, + 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, +10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, +11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, +12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, +13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, +13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, +14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, +14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, +14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, +15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, +15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, +15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 16, 17, +18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, +23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, +24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, +26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, +26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, +27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, +27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, +29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, +29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, +29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29 +}; + +const uch _length_code[MAX_MATCH-MIN_MATCH+1]= { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, +13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, +17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, +19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, +21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, +22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, +23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, +24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, +25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, +25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, +26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, +26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, +27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28 +}; + +local const int base_length[LENGTH_CODES] = { +0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56, +64, 80, 96, 112, 128, 160, 192, 224, 0 +}; + +local const int base_dist[D_CODES] = { + 0, 1, 2, 3, 4, 6, 8, 12, 16, 24, + 32, 48, 64, 96, 128, 192, 256, 384, 512, 768, + 1024, 1536, 2048, 3072, 4096, 6144, 8192, 12288, 16384, 24576 +}; + diff --git a/tools/bsnes/lib/zlib/unzip.c b/tools/bsnes/lib/zlib/unzip.c new file mode 100755 index 0000000..1e05038 --- /dev/null +++ b/tools/bsnes/lib/zlib/unzip.c @@ -0,0 +1,1605 @@ +/* unzip.c -- IO for uncompress .zip files using zlib + Version 1.01e, February 12th, 2005 + + Copyright (C) 1998-2005 Gilles Vollant + + Read unzip.h for more info +*/ + +/* Decryption code comes from crypt.c by Info-ZIP but has been greatly reduced in terms of +compatibility with older software. The following is from the original crypt.c. Code +woven in by Terry Thorsen 1/2003. +*/ +/* + Copyright (c) 1990-2000 Info-ZIP. All rights reserved. + + See the accompanying file LICENSE, version 2000-Apr-09 or later + (the contents of which are also included in zip.h) for terms of use. + If, for some reason, all these files are missing, the Info-ZIP license + also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html +*/ +/* + crypt.c (full version) by Info-ZIP. Last revised: [see crypt.h] + + The encryption/decryption parts of this source code (as opposed to the + non-echoing password parts) were originally written in Europe. The + whole source package can be freely distributed, including from the USA. + (Prior to January 2000, re-export from the US was a violation of US law.) + */ + +/* + This encryption code is a direct transcription of the algorithm from + Roger Schlafly, described by Phil Katz in the file appnote.txt. This + file (appnote.txt) is distributed with the PKZIP program (even in the + version without encryption capabilities). + */ + + +#include +#include +#include +#include "zlib.h" +#include "unzip.h" + +#ifdef STDC +# include +# include +# include +#endif +#ifdef NO_ERRNO_H + extern int errno; +#else +# include +#endif + + +#ifndef local +# define local static +#endif +/* compile with -Dlocal if your debugger can't find static symbols */ + + +#ifndef CASESENSITIVITYDEFAULT_NO +# if !defined(unix) && !defined(CASESENSITIVITYDEFAULT_YES) +# define CASESENSITIVITYDEFAULT_NO +# endif +#endif + + +#ifndef UNZ_BUFSIZE +#define UNZ_BUFSIZE (16384) +#endif + +#ifndef UNZ_MAXFILENAMEINZIP +#define UNZ_MAXFILENAMEINZIP (256) +#endif + +#ifndef ALLOC +# define ALLOC(size) (malloc(size)) +#endif +#ifndef TRYFREE +# define TRYFREE(p) {if (p) free(p);} +#endif + +#define SIZECENTRALDIRITEM (0x2e) +#define SIZEZIPLOCALHEADER (0x1e) + + + + +const char unz_copyright[] = + " unzip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll"; + +/* unz_file_info_interntal contain internal info about a file in zipfile*/ +typedef struct unz_file_info_internal_s +{ + uLong offset_curfile;/* relative offset of local header 4 bytes */ +} unz_file_info_internal; + + +/* file_in_zip_read_info_s contain internal information about a file in zipfile, + when reading and decompress it */ +typedef struct +{ + char *read_buffer; /* internal buffer for compressed data */ + z_stream stream; /* zLib stream structure for inflate */ + + uLong pos_in_zipfile; /* position in byte on the zipfile, for fseek*/ + uLong stream_initialised; /* flag set if stream structure is initialised*/ + + uLong offset_local_extrafield;/* offset of the local extra field */ + uInt size_local_extrafield;/* size of the local extra field */ + uLong pos_local_extrafield; /* position in the local extra field in read*/ + + uLong crc32; /* crc32 of all data uncompressed */ + uLong crc32_wait; /* crc32 we must obtain after decompress all */ + uLong rest_read_compressed; /* number of byte to be decompressed */ + uLong rest_read_uncompressed;/*number of byte to be obtained after decomp*/ + zlib_filefunc_def z_filefunc; + voidpf filestream; /* io structore of the zipfile */ + uLong compression_method; /* compression method (0==store) */ + uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ + int raw; +} file_in_zip_read_info_s; + + +/* unz_s contain internal information about the zipfile +*/ +typedef struct +{ + zlib_filefunc_def z_filefunc; + voidpf filestream; /* io structore of the zipfile */ + unz_global_info gi; /* public global information */ + uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ + uLong num_file; /* number of the current file in the zipfile*/ + uLong pos_in_central_dir; /* pos of the current file in the central dir*/ + uLong current_file_ok; /* flag about the usability of the current file*/ + uLong central_pos; /* position of the beginning of the central dir*/ + + uLong size_central_dir; /* size of the central directory */ + uLong offset_central_dir; /* offset of start of central directory with + respect to the starting disk number */ + + unz_file_info cur_file_info; /* public info about the current file in zip*/ + unz_file_info_internal cur_file_info_internal; /* private info about it*/ + file_in_zip_read_info_s* pfile_in_zip_read; /* structure about the current + file if we are decompressing it */ + int encrypted; +# ifndef NOUNCRYPT + unsigned long keys[3]; /* keys defining the pseudo-random sequence */ + const unsigned long* pcrc_32_tab; +# endif +} unz_s; + + +#ifndef NOUNCRYPT +#include "crypt.h" +#endif + +/* =========================================================================== + Read a byte from a gz_stream; update next_in and avail_in. Return EOF + for end of file. + IN assertion: the stream s has been sucessfully opened for reading. +*/ + + +local int unzlocal_getByte OF(( + const zlib_filefunc_def* pzlib_filefunc_def, + voidpf filestream, + int *pi)); + +local int unzlocal_getByte(pzlib_filefunc_def,filestream,pi) + const zlib_filefunc_def* pzlib_filefunc_def; + voidpf filestream; + int *pi; +{ + unsigned char c; + int err = (int)ZREAD(*pzlib_filefunc_def,filestream,&c,1); + if (err==1) + { + *pi = (int)c; + return UNZ_OK; + } + else + { + if (ZERROR(*pzlib_filefunc_def,filestream)) + return UNZ_ERRNO; + else + return UNZ_EOF; + } +} + + +/* =========================================================================== + Reads a long in LSB order from the given gz_stream. Sets +*/ +local int unzlocal_getShort OF(( + const zlib_filefunc_def* pzlib_filefunc_def, + voidpf filestream, + uLong *pX)); + +local int unzlocal_getShort (pzlib_filefunc_def,filestream,pX) + const zlib_filefunc_def* pzlib_filefunc_def; + voidpf filestream; + uLong *pX; +{ + uLong x ; + int i = 0; + int err; + + err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); + x = (uLong)i; + + if (err==UNZ_OK) + err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); + x += ((uLong)i)<<8; + + if (err==UNZ_OK) + *pX = x; + else + *pX = 0; + return err; +} + +local int unzlocal_getLong OF(( + const zlib_filefunc_def* pzlib_filefunc_def, + voidpf filestream, + uLong *pX)); + +local int unzlocal_getLong (pzlib_filefunc_def,filestream,pX) + const zlib_filefunc_def* pzlib_filefunc_def; + voidpf filestream; + uLong *pX; +{ + uLong x ; + int i = 0; + int err; + + err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); + x = (uLong)i; + + if (err==UNZ_OK) + err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); + x += ((uLong)i)<<8; + + if (err==UNZ_OK) + err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); + x += ((uLong)i)<<16; + + if (err==UNZ_OK) + err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); + x += ((uLong)i)<<24; + + if (err==UNZ_OK) + *pX = x; + else + *pX = 0; + return err; +} + + +/* My own strcmpi / strcasecmp */ +local int strcmpcasenosensitive_internal (fileName1,fileName2) + const char* fileName1; + const char* fileName2; +{ + for (;;) + { + char c1=*(fileName1++); + char c2=*(fileName2++); + if ((c1>='a') && (c1<='z')) + c1 -= 0x20; + if ((c2>='a') && (c2<='z')) + c2 -= 0x20; + if (c1=='\0') + return ((c2=='\0') ? 0 : -1); + if (c2=='\0') + return 1; + if (c1c2) + return 1; + } +} + + +#ifdef CASESENSITIVITYDEFAULT_NO +#define CASESENSITIVITYDEFAULTVALUE 2 +#else +#define CASESENSITIVITYDEFAULTVALUE 1 +#endif + +#ifndef STRCMPCASENOSENTIVEFUNCTION +#define STRCMPCASENOSENTIVEFUNCTION strcmpcasenosensitive_internal +#endif + +/* + Compare two filename (fileName1,fileName2). + If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) + If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi + or strcasecmp) + If iCaseSenisivity = 0, case sensitivity is defaut of your operating system + (like 1 on Unix, 2 on Windows) + +*/ +extern int ZEXPORT unzStringFileNameCompare (fileName1,fileName2,iCaseSensitivity) + const char* fileName1; + const char* fileName2; + int iCaseSensitivity; +{ + if (iCaseSensitivity==0) + iCaseSensitivity=CASESENSITIVITYDEFAULTVALUE; + + if (iCaseSensitivity==1) + return strcmp(fileName1,fileName2); + + return STRCMPCASENOSENTIVEFUNCTION(fileName1,fileName2); +} + +#ifndef BUFREADCOMMENT +#define BUFREADCOMMENT (0x400) +#endif + +/* + Locate the Central directory of a zipfile (at the end, just before + the global comment) +*/ +local uLong unzlocal_SearchCentralDir OF(( + const zlib_filefunc_def* pzlib_filefunc_def, + voidpf filestream)); + +local uLong unzlocal_SearchCentralDir(pzlib_filefunc_def,filestream) + const zlib_filefunc_def* pzlib_filefunc_def; + voidpf filestream; +{ + unsigned char* buf; + uLong uSizeFile; + uLong uBackRead; + uLong uMaxBack=0xffff; /* maximum size of global comment */ + uLong uPosFound=0; + + if (ZSEEK(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0) + return 0; + + + uSizeFile = ZTELL(*pzlib_filefunc_def,filestream); + + if (uMaxBack>uSizeFile) + uMaxBack = uSizeFile; + + buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); + if (buf==NULL) + return 0; + + uBackRead = 4; + while (uBackReaduMaxBack) + uBackRead = uMaxBack; + else + uBackRead+=BUFREADCOMMENT; + uReadPos = uSizeFile-uBackRead ; + + uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? + (BUFREADCOMMENT+4) : (uSizeFile-uReadPos); + if (ZSEEK(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0) + break; + + if (ZREAD(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize) + break; + + for (i=(int)uReadSize-3; (i--)>0;) + if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && + ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06)) + { + uPosFound = uReadPos+i; + break; + } + + if (uPosFound!=0) + break; + } + TRYFREE(buf); + return uPosFound; +} + +/* + Open a Zip file. path contain the full pathname (by example, + on a Windows NT computer "c:\\test\\zlib114.zip" or on an Unix computer + "zlib/zlib114.zip". + If the zipfile cannot be opened (file doesn't exist or in not valid), the + return value is NULL. + Else, the return value is a unzFile Handle, usable with other function + of this unzip package. +*/ +extern unzFile ZEXPORT unzOpen2 (path, pzlib_filefunc_def) + const char *path; + zlib_filefunc_def* pzlib_filefunc_def; +{ + unz_s us; + unz_s *s; + uLong central_pos,uL; + + uLong number_disk; /* number of the current dist, used for + spaning ZIP, unsupported, always 0*/ + uLong number_disk_with_CD; /* number the the disk with central dir, used + for spaning ZIP, unsupported, always 0*/ + uLong number_entry_CD; /* total number of entries in + the central dir + (same than number_entry on nospan) */ + + int err=UNZ_OK; + + if (unz_copyright[0]!=' ') + return NULL; + + if (pzlib_filefunc_def==NULL) + fill_fopen_filefunc(&us.z_filefunc); + else + us.z_filefunc = *pzlib_filefunc_def; + + us.filestream= (*(us.z_filefunc.zopen_file))(us.z_filefunc.opaque, + path, + ZLIB_FILEFUNC_MODE_READ | + ZLIB_FILEFUNC_MODE_EXISTING); + if (us.filestream==NULL) + return NULL; + + central_pos = unzlocal_SearchCentralDir(&us.z_filefunc,us.filestream); + if (central_pos==0) + err=UNZ_ERRNO; + + if (ZSEEK(us.z_filefunc, us.filestream, + central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0) + err=UNZ_ERRNO; + + /* the signature, already checked */ + if (unzlocal_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) + err=UNZ_ERRNO; + + /* number of this disk */ + if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_disk)!=UNZ_OK) + err=UNZ_ERRNO; + + /* number of the disk with the start of the central directory */ + if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_disk_with_CD)!=UNZ_OK) + err=UNZ_ERRNO; + + /* total number of entries in the central dir on this disk */ + if (unzlocal_getShort(&us.z_filefunc, us.filestream,&us.gi.number_entry)!=UNZ_OK) + err=UNZ_ERRNO; + + /* total number of entries in the central dir */ + if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_entry_CD)!=UNZ_OK) + err=UNZ_ERRNO; + + if ((number_entry_CD!=us.gi.number_entry) || + (number_disk_with_CD!=0) || + (number_disk!=0)) + err=UNZ_BADZIPFILE; + + /* size of the central directory */ + if (unzlocal_getLong(&us.z_filefunc, us.filestream,&us.size_central_dir)!=UNZ_OK) + err=UNZ_ERRNO; + + /* offset of start of central directory with respect to the + starting disk number */ + if (unzlocal_getLong(&us.z_filefunc, us.filestream,&us.offset_central_dir)!=UNZ_OK) + err=UNZ_ERRNO; + + /* zipfile comment length */ + if (unzlocal_getShort(&us.z_filefunc, us.filestream,&us.gi.size_comment)!=UNZ_OK) + err=UNZ_ERRNO; + + if ((central_pospfile_in_zip_read!=NULL) + unzCloseCurrentFile(file); + + ZCLOSE(s->z_filefunc, s->filestream); + TRYFREE(s); + return UNZ_OK; +} + + +/* + Write info about the ZipFile in the *pglobal_info structure. + No preparation of the structure is needed + return UNZ_OK if there is no problem. */ +extern int ZEXPORT unzGetGlobalInfo (file,pglobal_info) + unzFile file; + unz_global_info *pglobal_info; +{ + unz_s* s; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + *pglobal_info=s->gi; + return UNZ_OK; +} + + +/* + Translate date/time from Dos format to tm_unz (readable more easilty) +*/ +local void unzlocal_DosDateToTmuDate (ulDosDate, ptm) + uLong ulDosDate; + tm_unz* ptm; +{ + uLong uDate; + uDate = (uLong)(ulDosDate>>16); + ptm->tm_mday = (uInt)(uDate&0x1f) ; + ptm->tm_mon = (uInt)((((uDate)&0x1E0)/0x20)-1) ; + ptm->tm_year = (uInt)(((uDate&0x0FE00)/0x0200)+1980) ; + + ptm->tm_hour = (uInt) ((ulDosDate &0xF800)/0x800); + ptm->tm_min = (uInt) ((ulDosDate&0x7E0)/0x20) ; + ptm->tm_sec = (uInt) (2*(ulDosDate&0x1f)) ; +} + +/* + Get Info about the current file in the zipfile, with internal only info +*/ +local int unzlocal_GetCurrentFileInfoInternal OF((unzFile file, + unz_file_info *pfile_info, + unz_file_info_internal + *pfile_info_internal, + char *szFileName, + uLong fileNameBufferSize, + void *extraField, + uLong extraFieldBufferSize, + char *szComment, + uLong commentBufferSize)); + +local int unzlocal_GetCurrentFileInfoInternal (file, + pfile_info, + pfile_info_internal, + szFileName, fileNameBufferSize, + extraField, extraFieldBufferSize, + szComment, commentBufferSize) + unzFile file; + unz_file_info *pfile_info; + unz_file_info_internal *pfile_info_internal; + char *szFileName; + uLong fileNameBufferSize; + void *extraField; + uLong extraFieldBufferSize; + char *szComment; + uLong commentBufferSize; +{ + unz_s* s; + unz_file_info file_info; + unz_file_info_internal file_info_internal; + int err=UNZ_OK; + uLong uMagic; + long lSeek=0; + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + if (ZSEEK(s->z_filefunc, s->filestream, + s->pos_in_central_dir+s->byte_before_the_zipfile, + ZLIB_FILEFUNC_SEEK_SET)!=0) + err=UNZ_ERRNO; + + + /* we check the magic */ + if (err==UNZ_OK) + { + if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK) + err=UNZ_ERRNO; + else if (uMagic!=0x02014b50) + err=UNZ_BADZIPFILE; + } + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.version) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.version_needed) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.flag) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.compression_method) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.dosDate) != UNZ_OK) + err=UNZ_ERRNO; + + unzlocal_DosDateToTmuDate(file_info.dosDate,&file_info.tmu_date); + + if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.crc) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.compressed_size) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.uncompressed_size) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_filename) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_extra) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_comment) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.disk_num_start) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.internal_fa) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.external_fa) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info_internal.offset_curfile) != UNZ_OK) + err=UNZ_ERRNO; + + lSeek+=file_info.size_filename; + if ((err==UNZ_OK) && (szFileName!=NULL)) + { + uLong uSizeRead ; + if (file_info.size_filename0) && (fileNameBufferSize>0)) + if (ZREAD(s->z_filefunc, s->filestream,szFileName,uSizeRead)!=uSizeRead) + err=UNZ_ERRNO; + lSeek -= uSizeRead; + } + + + if ((err==UNZ_OK) && (extraField!=NULL)) + { + uLong uSizeRead ; + if (file_info.size_file_extraz_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) + lSeek=0; + else + err=UNZ_ERRNO; + } + if ((file_info.size_file_extra>0) && (extraFieldBufferSize>0)) + if (ZREAD(s->z_filefunc, s->filestream,extraField,uSizeRead)!=uSizeRead) + err=UNZ_ERRNO; + lSeek += file_info.size_file_extra - uSizeRead; + } + else + lSeek+=file_info.size_file_extra; + + + if ((err==UNZ_OK) && (szComment!=NULL)) + { + uLong uSizeRead ; + if (file_info.size_file_commentz_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) + lSeek=0; + else + err=UNZ_ERRNO; + } + if ((file_info.size_file_comment>0) && (commentBufferSize>0)) + if (ZREAD(s->z_filefunc, s->filestream,szComment,uSizeRead)!=uSizeRead) + err=UNZ_ERRNO; + lSeek+=file_info.size_file_comment - uSizeRead; + } + else + lSeek+=file_info.size_file_comment; + + if ((err==UNZ_OK) && (pfile_info!=NULL)) + *pfile_info=file_info; + + if ((err==UNZ_OK) && (pfile_info_internal!=NULL)) + *pfile_info_internal=file_info_internal; + + return err; +} + + + +/* + Write info about the ZipFile in the *pglobal_info structure. + No preparation of the structure is needed + return UNZ_OK if there is no problem. +*/ +extern int ZEXPORT unzGetCurrentFileInfo (file, + pfile_info, + szFileName, fileNameBufferSize, + extraField, extraFieldBufferSize, + szComment, commentBufferSize) + unzFile file; + unz_file_info *pfile_info; + char *szFileName; + uLong fileNameBufferSize; + void *extraField; + uLong extraFieldBufferSize; + char *szComment; + uLong commentBufferSize; +{ + return unzlocal_GetCurrentFileInfoInternal(file,pfile_info,NULL, + szFileName,fileNameBufferSize, + extraField,extraFieldBufferSize, + szComment,commentBufferSize); +} + +/* + Set the current file of the zipfile to the first file. + return UNZ_OK if there is no problem +*/ +extern int ZEXPORT unzGoToFirstFile (file) + unzFile file; +{ + int err=UNZ_OK; + unz_s* s; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + s->pos_in_central_dir=s->offset_central_dir; + s->num_file=0; + err=unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, + &s->cur_file_info_internal, + NULL,0,NULL,0,NULL,0); + s->current_file_ok = (err == UNZ_OK); + return err; +} + +/* + Set the current file of the zipfile to the next file. + return UNZ_OK if there is no problem + return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. +*/ +extern int ZEXPORT unzGoToNextFile (file) + unzFile file; +{ + unz_s* s; + int err; + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + if (!s->current_file_ok) + return UNZ_END_OF_LIST_OF_FILE; + if (s->gi.number_entry != 0xffff) /* 2^16 files overflow hack */ + if (s->num_file+1==s->gi.number_entry) + return UNZ_END_OF_LIST_OF_FILE; + + s->pos_in_central_dir += SIZECENTRALDIRITEM + s->cur_file_info.size_filename + + s->cur_file_info.size_file_extra + s->cur_file_info.size_file_comment ; + s->num_file++; + err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, + &s->cur_file_info_internal, + NULL,0,NULL,0,NULL,0); + s->current_file_ok = (err == UNZ_OK); + return err; +} + + +/* + Try locate the file szFileName in the zipfile. + For the iCaseSensitivity signification, see unzipStringFileNameCompare + + return value : + UNZ_OK if the file is found. It becomes the current file. + UNZ_END_OF_LIST_OF_FILE if the file is not found +*/ +extern int ZEXPORT unzLocateFile (file, szFileName, iCaseSensitivity) + unzFile file; + const char *szFileName; + int iCaseSensitivity; +{ + unz_s* s; + int err; + + /* We remember the 'current' position in the file so that we can jump + * back there if we fail. + */ + unz_file_info cur_file_infoSaved; + unz_file_info_internal cur_file_info_internalSaved; + uLong num_fileSaved; + uLong pos_in_central_dirSaved; + + + if (file==NULL) + return UNZ_PARAMERROR; + + if (strlen(szFileName)>=UNZ_MAXFILENAMEINZIP) + return UNZ_PARAMERROR; + + s=(unz_s*)file; + if (!s->current_file_ok) + return UNZ_END_OF_LIST_OF_FILE; + + /* Save the current state */ + num_fileSaved = s->num_file; + pos_in_central_dirSaved = s->pos_in_central_dir; + cur_file_infoSaved = s->cur_file_info; + cur_file_info_internalSaved = s->cur_file_info_internal; + + err = unzGoToFirstFile(file); + + while (err == UNZ_OK) + { + char szCurrentFileName[UNZ_MAXFILENAMEINZIP+1]; + err = unzGetCurrentFileInfo(file,NULL, + szCurrentFileName,sizeof(szCurrentFileName)-1, + NULL,0,NULL,0); + if (err == UNZ_OK) + { + if (unzStringFileNameCompare(szCurrentFileName, + szFileName,iCaseSensitivity)==0) + return UNZ_OK; + err = unzGoToNextFile(file); + } + } + + /* We failed, so restore the state of the 'current file' to where we + * were. + */ + s->num_file = num_fileSaved ; + s->pos_in_central_dir = pos_in_central_dirSaved ; + s->cur_file_info = cur_file_infoSaved; + s->cur_file_info_internal = cur_file_info_internalSaved; + return err; +} + + +/* +/////////////////////////////////////////// +// Contributed by Ryan Haksi (mailto://cryogen@infoserve.net) +// I need random access +// +// Further optimization could be realized by adding an ability +// to cache the directory in memory. The goal being a single +// comprehensive file read to put the file I need in a memory. +*/ + +/* +typedef struct unz_file_pos_s +{ + uLong pos_in_zip_directory; // offset in file + uLong num_of_file; // # of file +} unz_file_pos; +*/ + +extern int ZEXPORT unzGetFilePos(file, file_pos) + unzFile file; + unz_file_pos* file_pos; +{ + unz_s* s; + + if (file==NULL || file_pos==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + if (!s->current_file_ok) + return UNZ_END_OF_LIST_OF_FILE; + + file_pos->pos_in_zip_directory = s->pos_in_central_dir; + file_pos->num_of_file = s->num_file; + + return UNZ_OK; +} + +extern int ZEXPORT unzGoToFilePos(file, file_pos) + unzFile file; + unz_file_pos* file_pos; +{ + unz_s* s; + int err; + + if (file==NULL || file_pos==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + + /* jump to the right spot */ + s->pos_in_central_dir = file_pos->pos_in_zip_directory; + s->num_file = file_pos->num_of_file; + + /* set the current file */ + err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, + &s->cur_file_info_internal, + NULL,0,NULL,0,NULL,0); + /* return results */ + s->current_file_ok = (err == UNZ_OK); + return err; +} + +/* +// Unzip Helper Functions - should be here? +/////////////////////////////////////////// +*/ + +/* + Read the local header of the current zipfile + Check the coherency of the local header and info in the end of central + directory about this file + store in *piSizeVar the size of extra info in local header + (filename and size of extra field data) +*/ +local int unzlocal_CheckCurrentFileCoherencyHeader (s,piSizeVar, + poffset_local_extrafield, + psize_local_extrafield) + unz_s* s; + uInt* piSizeVar; + uLong *poffset_local_extrafield; + uInt *psize_local_extrafield; +{ + uLong uMagic,uData,uFlags; + uLong size_filename; + uLong size_extra_field; + int err=UNZ_OK; + + *piSizeVar = 0; + *poffset_local_extrafield = 0; + *psize_local_extrafield = 0; + + if (ZSEEK(s->z_filefunc, s->filestream,s->cur_file_info_internal.offset_curfile + + s->byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET)!=0) + return UNZ_ERRNO; + + + if (err==UNZ_OK) + { + if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK) + err=UNZ_ERRNO; + else if (uMagic!=0x04034b50) + err=UNZ_BADZIPFILE; + } + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) + err=UNZ_ERRNO; +/* + else if ((err==UNZ_OK) && (uData!=s->cur_file_info.wVersion)) + err=UNZ_BADZIPFILE; +*/ + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uFlags) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) + err=UNZ_ERRNO; + else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compression_method)) + err=UNZ_BADZIPFILE; + + if ((err==UNZ_OK) && (s->cur_file_info.compression_method!=0) && + (s->cur_file_info.compression_method!=Z_DEFLATED)) + err=UNZ_BADZIPFILE; + + if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* date/time */ + err=UNZ_ERRNO; + + if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* crc */ + err=UNZ_ERRNO; + else if ((err==UNZ_OK) && (uData!=s->cur_file_info.crc) && + ((uFlags & 8)==0)) + err=UNZ_BADZIPFILE; + + if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size compr */ + err=UNZ_ERRNO; + else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compressed_size) && + ((uFlags & 8)==0)) + err=UNZ_BADZIPFILE; + + if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size uncompr */ + err=UNZ_ERRNO; + else if ((err==UNZ_OK) && (uData!=s->cur_file_info.uncompressed_size) && + ((uFlags & 8)==0)) + err=UNZ_BADZIPFILE; + + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&size_filename) != UNZ_OK) + err=UNZ_ERRNO; + else if ((err==UNZ_OK) && (size_filename!=s->cur_file_info.size_filename)) + err=UNZ_BADZIPFILE; + + *piSizeVar += (uInt)size_filename; + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&size_extra_field) != UNZ_OK) + err=UNZ_ERRNO; + *poffset_local_extrafield= s->cur_file_info_internal.offset_curfile + + SIZEZIPLOCALHEADER + size_filename; + *psize_local_extrafield = (uInt)size_extra_field; + + *piSizeVar += (uInt)size_extra_field; + + return err; +} + +/* + Open for reading data the current file in the zipfile. + If there is no error and the file is opened, the return value is UNZ_OK. +*/ +extern int ZEXPORT unzOpenCurrentFile3 (file, method, level, raw, password) + unzFile file; + int* method; + int* level; + int raw; + const char* password; +{ + int err=UNZ_OK; + uInt iSizeVar; + unz_s* s; + file_in_zip_read_info_s* pfile_in_zip_read_info; + uLong offset_local_extrafield; /* offset of the local extra field */ + uInt size_local_extrafield; /* size of the local extra field */ +# ifndef NOUNCRYPT + char source[12]; +# else + if (password != NULL) + return UNZ_PARAMERROR; +# endif + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + if (!s->current_file_ok) + return UNZ_PARAMERROR; + + if (s->pfile_in_zip_read != NULL) + unzCloseCurrentFile(file); + + if (unzlocal_CheckCurrentFileCoherencyHeader(s,&iSizeVar, + &offset_local_extrafield,&size_local_extrafield)!=UNZ_OK) + return UNZ_BADZIPFILE; + + pfile_in_zip_read_info = (file_in_zip_read_info_s*) + ALLOC(sizeof(file_in_zip_read_info_s)); + if (pfile_in_zip_read_info==NULL) + return UNZ_INTERNALERROR; + + pfile_in_zip_read_info->read_buffer=(char*)ALLOC(UNZ_BUFSIZE); + pfile_in_zip_read_info->offset_local_extrafield = offset_local_extrafield; + pfile_in_zip_read_info->size_local_extrafield = size_local_extrafield; + pfile_in_zip_read_info->pos_local_extrafield=0; + pfile_in_zip_read_info->raw=raw; + + if (pfile_in_zip_read_info->read_buffer==NULL) + { + TRYFREE(pfile_in_zip_read_info); + return UNZ_INTERNALERROR; + } + + pfile_in_zip_read_info->stream_initialised=0; + + if (method!=NULL) + *method = (int)s->cur_file_info.compression_method; + + if (level!=NULL) + { + *level = 6; + switch (s->cur_file_info.flag & 0x06) + { + case 6 : *level = 1; break; + case 4 : *level = 2; break; + case 2 : *level = 9; break; + } + } + + if ((s->cur_file_info.compression_method!=0) && + (s->cur_file_info.compression_method!=Z_DEFLATED)) + err=UNZ_BADZIPFILE; + + pfile_in_zip_read_info->crc32_wait=s->cur_file_info.crc; + pfile_in_zip_read_info->crc32=0; + pfile_in_zip_read_info->compression_method = + s->cur_file_info.compression_method; + pfile_in_zip_read_info->filestream=s->filestream; + pfile_in_zip_read_info->z_filefunc=s->z_filefunc; + pfile_in_zip_read_info->byte_before_the_zipfile=s->byte_before_the_zipfile; + + pfile_in_zip_read_info->stream.total_out = 0; + + if ((s->cur_file_info.compression_method==Z_DEFLATED) && + (!raw)) + { + pfile_in_zip_read_info->stream.zalloc = (alloc_func)0; + pfile_in_zip_read_info->stream.zfree = (free_func)0; + pfile_in_zip_read_info->stream.opaque = (voidpf)0; + pfile_in_zip_read_info->stream.next_in = (voidpf)0; + pfile_in_zip_read_info->stream.avail_in = 0; + + err=inflateInit2(&pfile_in_zip_read_info->stream, -MAX_WBITS); + if (err == Z_OK) + pfile_in_zip_read_info->stream_initialised=1; + else + { + TRYFREE(pfile_in_zip_read_info); + return err; + } + /* windowBits is passed < 0 to tell that there is no zlib header. + * Note that in this case inflate *requires* an extra "dummy" byte + * after the compressed stream in order to complete decompression and + * return Z_STREAM_END. + * In unzip, i don't wait absolutely Z_STREAM_END because I known the + * size of both compressed and uncompressed data + */ + } + pfile_in_zip_read_info->rest_read_compressed = + s->cur_file_info.compressed_size ; + pfile_in_zip_read_info->rest_read_uncompressed = + s->cur_file_info.uncompressed_size ; + + + pfile_in_zip_read_info->pos_in_zipfile = + s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER + + iSizeVar; + + pfile_in_zip_read_info->stream.avail_in = (uInt)0; + + s->pfile_in_zip_read = pfile_in_zip_read_info; + +# ifndef NOUNCRYPT + if (password != NULL) + { + int i; + s->pcrc_32_tab = get_crc_table(); + init_keys(password,s->keys,s->pcrc_32_tab); + if (ZSEEK(s->z_filefunc, s->filestream, + s->pfile_in_zip_read->pos_in_zipfile + + s->pfile_in_zip_read->byte_before_the_zipfile, + SEEK_SET)!=0) + return UNZ_INTERNALERROR; + if(ZREAD(s->z_filefunc, s->filestream,source, 12)<12) + return UNZ_INTERNALERROR; + + for (i = 0; i<12; i++) + zdecode(s->keys,s->pcrc_32_tab,source[i]); + + s->pfile_in_zip_read->pos_in_zipfile+=12; + s->encrypted=1; + } +# endif + + + return UNZ_OK; +} + +extern int ZEXPORT unzOpenCurrentFile (file) + unzFile file; +{ + return unzOpenCurrentFile3(file, NULL, NULL, 0, NULL); +} + +extern int ZEXPORT unzOpenCurrentFilePassword (file, password) + unzFile file; + const char* password; +{ + return unzOpenCurrentFile3(file, NULL, NULL, 0, password); +} + +extern int ZEXPORT unzOpenCurrentFile2 (file,method,level,raw) + unzFile file; + int* method; + int* level; + int raw; +{ + return unzOpenCurrentFile3(file, method, level, raw, NULL); +} + +/* + Read bytes from the current file. + buf contain buffer where data must be copied + len the size of buf. + + return the number of byte copied if somes bytes are copied + return 0 if the end of file was reached + return <0 with error code if there is an error + (UNZ_ERRNO for IO error, or zLib error for uncompress error) +*/ +extern int ZEXPORT unzReadCurrentFile (file, buf, len) + unzFile file; + voidp buf; + unsigned len; +{ + int err=UNZ_OK; + uInt iRead = 0; + unz_s* s; + file_in_zip_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + + if ((pfile_in_zip_read_info->read_buffer == NULL)) + return UNZ_END_OF_LIST_OF_FILE; + if (len==0) + return 0; + + pfile_in_zip_read_info->stream.next_out = (Bytef*)buf; + + pfile_in_zip_read_info->stream.avail_out = (uInt)len; + + if ((len>pfile_in_zip_read_info->rest_read_uncompressed) && + (!(pfile_in_zip_read_info->raw))) + pfile_in_zip_read_info->stream.avail_out = + (uInt)pfile_in_zip_read_info->rest_read_uncompressed; + + if ((len>pfile_in_zip_read_info->rest_read_compressed+ + pfile_in_zip_read_info->stream.avail_in) && + (pfile_in_zip_read_info->raw)) + pfile_in_zip_read_info->stream.avail_out = + (uInt)pfile_in_zip_read_info->rest_read_compressed+ + pfile_in_zip_read_info->stream.avail_in; + + while (pfile_in_zip_read_info->stream.avail_out>0) + { + if ((pfile_in_zip_read_info->stream.avail_in==0) && + (pfile_in_zip_read_info->rest_read_compressed>0)) + { + uInt uReadThis = UNZ_BUFSIZE; + if (pfile_in_zip_read_info->rest_read_compressedrest_read_compressed; + if (uReadThis == 0) + return UNZ_EOF; + if (ZSEEK(pfile_in_zip_read_info->z_filefunc, + pfile_in_zip_read_info->filestream, + pfile_in_zip_read_info->pos_in_zipfile + + pfile_in_zip_read_info->byte_before_the_zipfile, + ZLIB_FILEFUNC_SEEK_SET)!=0) + return UNZ_ERRNO; + if (ZREAD(pfile_in_zip_read_info->z_filefunc, + pfile_in_zip_read_info->filestream, + pfile_in_zip_read_info->read_buffer, + uReadThis)!=uReadThis) + return UNZ_ERRNO; + + +# ifndef NOUNCRYPT + if(s->encrypted) + { + uInt i; + for(i=0;iread_buffer[i] = + zdecode(s->keys,s->pcrc_32_tab, + pfile_in_zip_read_info->read_buffer[i]); + } +# endif + + + pfile_in_zip_read_info->pos_in_zipfile += uReadThis; + + pfile_in_zip_read_info->rest_read_compressed-=uReadThis; + + pfile_in_zip_read_info->stream.next_in = + (Bytef*)pfile_in_zip_read_info->read_buffer; + pfile_in_zip_read_info->stream.avail_in = (uInt)uReadThis; + } + + if ((pfile_in_zip_read_info->compression_method==0) || (pfile_in_zip_read_info->raw)) + { + uInt uDoCopy,i ; + + if ((pfile_in_zip_read_info->stream.avail_in == 0) && + (pfile_in_zip_read_info->rest_read_compressed == 0)) + return (iRead==0) ? UNZ_EOF : iRead; + + if (pfile_in_zip_read_info->stream.avail_out < + pfile_in_zip_read_info->stream.avail_in) + uDoCopy = pfile_in_zip_read_info->stream.avail_out ; + else + uDoCopy = pfile_in_zip_read_info->stream.avail_in ; + + for (i=0;istream.next_out+i) = + *(pfile_in_zip_read_info->stream.next_in+i); + + pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32, + pfile_in_zip_read_info->stream.next_out, + uDoCopy); + pfile_in_zip_read_info->rest_read_uncompressed-=uDoCopy; + pfile_in_zip_read_info->stream.avail_in -= uDoCopy; + pfile_in_zip_read_info->stream.avail_out -= uDoCopy; + pfile_in_zip_read_info->stream.next_out += uDoCopy; + pfile_in_zip_read_info->stream.next_in += uDoCopy; + pfile_in_zip_read_info->stream.total_out += uDoCopy; + iRead += uDoCopy; + } + else + { + uLong uTotalOutBefore,uTotalOutAfter; + const Bytef *bufBefore; + uLong uOutThis; + int flush=Z_SYNC_FLUSH; + + uTotalOutBefore = pfile_in_zip_read_info->stream.total_out; + bufBefore = pfile_in_zip_read_info->stream.next_out; + + /* + if ((pfile_in_zip_read_info->rest_read_uncompressed == + pfile_in_zip_read_info->stream.avail_out) && + (pfile_in_zip_read_info->rest_read_compressed == 0)) + flush = Z_FINISH; + */ + err=inflate(&pfile_in_zip_read_info->stream,flush); + + if ((err>=0) && (pfile_in_zip_read_info->stream.msg!=NULL)) + err = Z_DATA_ERROR; + + uTotalOutAfter = pfile_in_zip_read_info->stream.total_out; + uOutThis = uTotalOutAfter-uTotalOutBefore; + + pfile_in_zip_read_info->crc32 = + crc32(pfile_in_zip_read_info->crc32,bufBefore, + (uInt)(uOutThis)); + + pfile_in_zip_read_info->rest_read_uncompressed -= + uOutThis; + + iRead += (uInt)(uTotalOutAfter - uTotalOutBefore); + + if (err==Z_STREAM_END) + return (iRead==0) ? UNZ_EOF : iRead; + if (err!=Z_OK) + break; + } + } + + if (err==Z_OK) + return iRead; + return err; +} + + +/* + Give the current position in uncompressed data +*/ +extern z_off_t ZEXPORT unztell (file) + unzFile file; +{ + unz_s* s; + file_in_zip_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + return (z_off_t)pfile_in_zip_read_info->stream.total_out; +} + + +/* + return 1 if the end of file was reached, 0 elsewhere +*/ +extern int ZEXPORT unzeof (file) + unzFile file; +{ + unz_s* s; + file_in_zip_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + if (pfile_in_zip_read_info->rest_read_uncompressed == 0) + return 1; + else + return 0; +} + + + +/* + Read extra field from the current file (opened by unzOpenCurrentFile) + This is the local-header version of the extra field (sometimes, there is + more info in the local-header version than in the central-header) + + if buf==NULL, it return the size of the local extra field that can be read + + if buf!=NULL, len is the size of the buffer, the extra header is copied in + buf. + the return value is the number of bytes copied in buf, or (if <0) + the error code +*/ +extern int ZEXPORT unzGetLocalExtrafield (file,buf,len) + unzFile file; + voidp buf; + unsigned len; +{ + unz_s* s; + file_in_zip_read_info_s* pfile_in_zip_read_info; + uInt read_now; + uLong size_to_read; + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + size_to_read = (pfile_in_zip_read_info->size_local_extrafield - + pfile_in_zip_read_info->pos_local_extrafield); + + if (buf==NULL) + return (int)size_to_read; + + if (len>size_to_read) + read_now = (uInt)size_to_read; + else + read_now = (uInt)len ; + + if (read_now==0) + return 0; + + if (ZSEEK(pfile_in_zip_read_info->z_filefunc, + pfile_in_zip_read_info->filestream, + pfile_in_zip_read_info->offset_local_extrafield + + pfile_in_zip_read_info->pos_local_extrafield, + ZLIB_FILEFUNC_SEEK_SET)!=0) + return UNZ_ERRNO; + + if (ZREAD(pfile_in_zip_read_info->z_filefunc, + pfile_in_zip_read_info->filestream, + buf,read_now)!=read_now) + return UNZ_ERRNO; + + return (int)read_now; +} + +/* + Close the file in zip opened with unzipOpenCurrentFile + Return UNZ_CRCERROR if all the file was read but the CRC is not good +*/ +extern int ZEXPORT unzCloseCurrentFile (file) + unzFile file; +{ + int err=UNZ_OK; + + unz_s* s; + file_in_zip_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + + if ((pfile_in_zip_read_info->rest_read_uncompressed == 0) && + (!pfile_in_zip_read_info->raw)) + { + if (pfile_in_zip_read_info->crc32 != pfile_in_zip_read_info->crc32_wait) + err=UNZ_CRCERROR; + } + + + TRYFREE(pfile_in_zip_read_info->read_buffer); + pfile_in_zip_read_info->read_buffer = NULL; + if (pfile_in_zip_read_info->stream_initialised) + inflateEnd(&pfile_in_zip_read_info->stream); + + pfile_in_zip_read_info->stream_initialised = 0; + TRYFREE(pfile_in_zip_read_info); + + s->pfile_in_zip_read=NULL; + + return err; +} + + +/* + Get the global comment string of the ZipFile, in the szComment buffer. + uSizeBuf is the size of the szComment buffer. + return the number of byte copied or an error code <0 +*/ +extern int ZEXPORT unzGetGlobalComment (file, szComment, uSizeBuf) + unzFile file; + char *szComment; + uLong uSizeBuf; +{ + unz_s* s; + uLong uReadThis ; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + + uReadThis = uSizeBuf; + if (uReadThis>s->gi.size_comment) + uReadThis = s->gi.size_comment; + + if (ZSEEK(s->z_filefunc,s->filestream,s->central_pos+22,ZLIB_FILEFUNC_SEEK_SET)!=0) + return UNZ_ERRNO; + + if (uReadThis>0) + { + *szComment='\0'; + if (ZREAD(s->z_filefunc,s->filestream,szComment,uReadThis)!=uReadThis) + return UNZ_ERRNO; + } + + if ((szComment != NULL) && (uSizeBuf > s->gi.size_comment)) + *(szComment+s->gi.size_comment)='\0'; + return (int)uReadThis; +} + +/* Additions by RX '2004 */ +extern uLong ZEXPORT unzGetOffset (file) + unzFile file; +{ + unz_s* s; + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + if (!s->current_file_ok) + return 0; + if (s->gi.number_entry != 0 && s->gi.number_entry != 0xffff) + if (s->num_file==s->gi.number_entry) + return 0; + return s->pos_in_central_dir; +} + +extern int ZEXPORT unzSetOffset (file, pos) + unzFile file; + uLong pos; +{ + unz_s* s; + int err; + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + + s->pos_in_central_dir = pos; + s->num_file = s->gi.number_entry; /* hack */ + err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, + &s->cur_file_info_internal, + NULL,0,NULL,0,NULL,0); + s->current_file_ok = (err == UNZ_OK); + return err; +} diff --git a/tools/bsnes/lib/zlib/unzip.h b/tools/bsnes/lib/zlib/unzip.h new file mode 100755 index 0000000..b247937 --- /dev/null +++ b/tools/bsnes/lib/zlib/unzip.h @@ -0,0 +1,354 @@ +/* unzip.h -- IO for uncompress .zip files using zlib + Version 1.01e, February 12th, 2005 + + Copyright (C) 1998-2005 Gilles Vollant + + This unzip package allow extract file from .ZIP file, compatible with PKZip 2.04g + WinZip, InfoZip tools and compatible. + + Multi volume ZipFile (span) are not supported. + Encryption compatible with pkzip 2.04g only supported + Old compressions used by old PKZip 1.x are not supported + + + I WAIT FEEDBACK at mail info@winimage.com + Visit also http://www.winimage.com/zLibDll/unzip.htm for evolution + + Condition of use and distribution are the same than zlib : + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + +*/ + +/* for more info about .ZIP format, see + http://www.info-zip.org/pub/infozip/doc/appnote-981119-iz.zip + http://www.info-zip.org/pub/infozip/doc/ + PkWare has also a specification at : + ftp://ftp.pkware.com/probdesc.zip +*/ + +#ifndef _unz_H +#define _unz_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef _ZLIB_H +#include "zlib.h" +#endif + +#ifndef _ZLIBIOAPI_H +#include "ioapi.h" +#endif + +#if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP) +/* like the STRICT of WIN32, we define a pointer that cannot be converted + from (void*) without cast */ +typedef struct TagunzFile__ { int unused; } unzFile__; +typedef unzFile__ *unzFile; +#else +typedef voidp unzFile; +#endif + + +#define UNZ_OK (0) +#define UNZ_END_OF_LIST_OF_FILE (-100) +#define UNZ_ERRNO (Z_ERRNO) +#define UNZ_EOF (0) +#define UNZ_PARAMERROR (-102) +#define UNZ_BADZIPFILE (-103) +#define UNZ_INTERNALERROR (-104) +#define UNZ_CRCERROR (-105) + +/* tm_unz contain date/time info */ +typedef struct tm_unz_s +{ + uInt tm_sec; /* seconds after the minute - [0,59] */ + uInt tm_min; /* minutes after the hour - [0,59] */ + uInt tm_hour; /* hours since midnight - [0,23] */ + uInt tm_mday; /* day of the month - [1,31] */ + uInt tm_mon; /* months since January - [0,11] */ + uInt tm_year; /* years - [1980..2044] */ +} tm_unz; + +/* unz_global_info structure contain global data about the ZIPfile + These data comes from the end of central dir */ +typedef struct unz_global_info_s +{ + uLong number_entry; /* total number of entries in + the central dir on this disk */ + uLong size_comment; /* size of the global comment of the zipfile */ +} unz_global_info; + + +/* unz_file_info contain information about a file in the zipfile */ +typedef struct unz_file_info_s +{ + uLong version; /* version made by 2 bytes */ + uLong version_needed; /* version needed to extract 2 bytes */ + uLong flag; /* general purpose bit flag 2 bytes */ + uLong compression_method; /* compression method 2 bytes */ + uLong dosDate; /* last mod file date in Dos fmt 4 bytes */ + uLong crc; /* crc-32 4 bytes */ + uLong compressed_size; /* compressed size 4 bytes */ + uLong uncompressed_size; /* uncompressed size 4 bytes */ + uLong size_filename; /* filename length 2 bytes */ + uLong size_file_extra; /* extra field length 2 bytes */ + uLong size_file_comment; /* file comment length 2 bytes */ + + uLong disk_num_start; /* disk number start 2 bytes */ + uLong internal_fa; /* internal file attributes 2 bytes */ + uLong external_fa; /* external file attributes 4 bytes */ + + tm_unz tmu_date; +} unz_file_info; + +extern int ZEXPORT unzStringFileNameCompare OF ((const char* fileName1, + const char* fileName2, + int iCaseSensitivity)); +/* + Compare two filename (fileName1,fileName2). + If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) + If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi + or strcasecmp) + If iCaseSenisivity = 0, case sensitivity is defaut of your operating system + (like 1 on Unix, 2 on Windows) +*/ + + +extern unzFile ZEXPORT unzOpen OF((const char *path)); +/* + Open a Zip file. path contain the full pathname (by example, + on a Windows XP computer "c:\\zlib\\zlib113.zip" or on an Unix computer + "zlib/zlib113.zip". + If the zipfile cannot be opened (file don't exist or in not valid), the + return value is NULL. + Else, the return value is a unzFile Handle, usable with other function + of this unzip package. +*/ + +extern unzFile ZEXPORT unzOpen2 OF((const char *path, + zlib_filefunc_def* pzlib_filefunc_def)); +/* + Open a Zip file, like unzOpen, but provide a set of file low level API + for read/write the zip file (see ioapi.h) +*/ + +extern int ZEXPORT unzClose OF((unzFile file)); +/* + Close a ZipFile opened with unzipOpen. + If there is files inside the .Zip opened with unzOpenCurrentFile (see later), + these files MUST be closed with unzipCloseCurrentFile before call unzipClose. + return UNZ_OK if there is no problem. */ + +extern int ZEXPORT unzGetGlobalInfo OF((unzFile file, + unz_global_info *pglobal_info)); +/* + Write info about the ZipFile in the *pglobal_info structure. + No preparation of the structure is needed + return UNZ_OK if there is no problem. */ + + +extern int ZEXPORT unzGetGlobalComment OF((unzFile file, + char *szComment, + uLong uSizeBuf)); +/* + Get the global comment string of the ZipFile, in the szComment buffer. + uSizeBuf is the size of the szComment buffer. + return the number of byte copied or an error code <0 +*/ + + +/***************************************************************************/ +/* Unzip package allow you browse the directory of the zipfile */ + +extern int ZEXPORT unzGoToFirstFile OF((unzFile file)); +/* + Set the current file of the zipfile to the first file. + return UNZ_OK if there is no problem +*/ + +extern int ZEXPORT unzGoToNextFile OF((unzFile file)); +/* + Set the current file of the zipfile to the next file. + return UNZ_OK if there is no problem + return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. +*/ + +extern int ZEXPORT unzLocateFile OF((unzFile file, + const char *szFileName, + int iCaseSensitivity)); +/* + Try locate the file szFileName in the zipfile. + For the iCaseSensitivity signification, see unzStringFileNameCompare + + return value : + UNZ_OK if the file is found. It becomes the current file. + UNZ_END_OF_LIST_OF_FILE if the file is not found +*/ + + +/* ****************************************** */ +/* Ryan supplied functions */ +/* unz_file_info contain information about a file in the zipfile */ +typedef struct unz_file_pos_s +{ + uLong pos_in_zip_directory; /* offset in zip file directory */ + uLong num_of_file; /* # of file */ +} unz_file_pos; + +extern int ZEXPORT unzGetFilePos( + unzFile file, + unz_file_pos* file_pos); + +extern int ZEXPORT unzGoToFilePos( + unzFile file, + unz_file_pos* file_pos); + +/* ****************************************** */ + +extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file, + unz_file_info *pfile_info, + char *szFileName, + uLong fileNameBufferSize, + void *extraField, + uLong extraFieldBufferSize, + char *szComment, + uLong commentBufferSize)); +/* + Get Info about the current file + if pfile_info!=NULL, the *pfile_info structure will contain somes info about + the current file + if szFileName!=NULL, the filemane string will be copied in szFileName + (fileNameBufferSize is the size of the buffer) + if extraField!=NULL, the extra field information will be copied in extraField + (extraFieldBufferSize is the size of the buffer). + This is the Central-header version of the extra field + if szComment!=NULL, the comment string of the file will be copied in szComment + (commentBufferSize is the size of the buffer) +*/ + +/***************************************************************************/ +/* for reading the content of the current zipfile, you can open it, read data + from it, and close it (you can close it before reading all the file) + */ + +extern int ZEXPORT unzOpenCurrentFile OF((unzFile file)); +/* + Open for reading data the current file in the zipfile. + If there is no error, the return value is UNZ_OK. +*/ + +extern int ZEXPORT unzOpenCurrentFilePassword OF((unzFile file, + const char* password)); +/* + Open for reading data the current file in the zipfile. + password is a crypting password + If there is no error, the return value is UNZ_OK. +*/ + +extern int ZEXPORT unzOpenCurrentFile2 OF((unzFile file, + int* method, + int* level, + int raw)); +/* + Same than unzOpenCurrentFile, but open for read raw the file (not uncompress) + if raw==1 + *method will receive method of compression, *level will receive level of + compression + note : you can set level parameter as NULL (if you did not want known level, + but you CANNOT set method parameter as NULL +*/ + +extern int ZEXPORT unzOpenCurrentFile3 OF((unzFile file, + int* method, + int* level, + int raw, + const char* password)); +/* + Same than unzOpenCurrentFile, but open for read raw the file (not uncompress) + if raw==1 + *method will receive method of compression, *level will receive level of + compression + note : you can set level parameter as NULL (if you did not want known level, + but you CANNOT set method parameter as NULL +*/ + + +extern int ZEXPORT unzCloseCurrentFile OF((unzFile file)); +/* + Close the file in zip opened with unzOpenCurrentFile + Return UNZ_CRCERROR if all the file was read but the CRC is not good +*/ + +extern int ZEXPORT unzReadCurrentFile OF((unzFile file, + voidp buf, + unsigned len)); +/* + Read bytes from the current file (opened by unzOpenCurrentFile) + buf contain buffer where data must be copied + len the size of buf. + + return the number of byte copied if somes bytes are copied + return 0 if the end of file was reached + return <0 with error code if there is an error + (UNZ_ERRNO for IO error, or zLib error for uncompress error) +*/ + +extern z_off_t ZEXPORT unztell OF((unzFile file)); +/* + Give the current position in uncompressed data +*/ + +extern int ZEXPORT unzeof OF((unzFile file)); +/* + return 1 if the end of file was reached, 0 elsewhere +*/ + +extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file, + voidp buf, + unsigned len)); +/* + Read extra field from the current file (opened by unzOpenCurrentFile) + This is the local-header version of the extra field (sometimes, there is + more info in the local-header version than in the central-header) + + if buf==NULL, it return the size of the local extra field + + if buf!=NULL, len is the size of the buffer, the extra header is copied in + buf. + the return value is the number of bytes copied in buf, or (if <0) + the error code +*/ + +/***************************************************************************/ + +/* Get the current file offset */ +extern uLong ZEXPORT unzGetOffset (unzFile file); + +/* Set the current file offset */ +extern int ZEXPORT unzSetOffset (unzFile file, uLong pos); + + + +#ifdef __cplusplus +} +#endif + +#endif /* _unz_H */ diff --git a/tools/bsnes/lib/zlib/zconf.h b/tools/bsnes/lib/zlib/zconf.h new file mode 100755 index 0000000..eb5a9ce --- /dev/null +++ b/tools/bsnes/lib/zlib/zconf.h @@ -0,0 +1,332 @@ +/* zconf.h -- configuration of the zlib compression library + * Copyright (C) 1995-2005 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id: zconf.h,v 1.3 2005/07/27 18:15:11 nach Exp $ */ + +#ifndef ZCONF_H +#define ZCONF_H + +/* + * If you *really* need a unique prefix for all types and library functions, + * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. + */ +#ifdef Z_PREFIX +# define deflateInit_ z_deflateInit_ +# define deflate z_deflate +# define deflateEnd z_deflateEnd +# define inflateInit_ z_inflateInit_ +# define inflate z_inflate +# define inflateEnd z_inflateEnd +# define deflateInit2_ z_deflateInit2_ +# define deflateSetDictionary z_deflateSetDictionary +# define deflateCopy z_deflateCopy +# define deflateReset z_deflateReset +# define deflateParams z_deflateParams +# define deflateBound z_deflateBound +# define deflatePrime z_deflatePrime +# define inflateInit2_ z_inflateInit2_ +# define inflateSetDictionary z_inflateSetDictionary +# define inflateSync z_inflateSync +# define inflateSyncPoint z_inflateSyncPoint +# define inflateCopy z_inflateCopy +# define inflateReset z_inflateReset +# define inflateBack z_inflateBack +# define inflateBackEnd z_inflateBackEnd +# define compress z_compress +# define compress2 z_compress2 +# define compressBound z_compressBound +# define uncompress z_uncompress +# define adler32 z_adler32 +# define crc32 z_crc32 +# define get_crc_table z_get_crc_table +# define zError z_zError + +# define alloc_func z_alloc_func +# define free_func z_free_func +# define in_func z_in_func +# define out_func z_out_func +# define Byte z_Byte +# define uInt z_uInt +# define uLong z_uLong +# define Bytef z_Bytef +# define charf z_charf +# define intf z_intf +# define uIntf z_uIntf +# define uLongf z_uLongf +# define voidpf z_voidpf +# define voidp z_voidp +#endif + +#if defined(__MSDOS__) && !defined(MSDOS) +# define MSDOS +#endif +#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) +# define OS2 +#endif +#if defined(_WINDOWS) && !defined(WINDOWS) +# define WINDOWS +#endif +#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) +# ifndef WIN32 +# define WIN32 +# endif +#endif +#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) +# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) +# ifndef SYS16BIT +# define SYS16BIT +# endif +# endif +#endif + +/* + * Compile with -DMAXSEG_64K if the alloc function cannot allocate more + * than 64k bytes at a time (needed on systems with 16-bit int). + */ +#ifdef SYS16BIT +# define MAXSEG_64K +#endif +#ifdef MSDOS +# define UNALIGNED_OK +#endif + +#ifdef __STDC_VERSION__ +# ifndef STDC +# define STDC +# endif +# if __STDC_VERSION__ >= 199901L +# ifndef STDC99 +# define STDC99 +# endif +# endif +#endif +#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) +# define STDC +#endif +#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) +# define STDC +#endif +#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) +# define STDC +#endif +#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) +# define STDC +#endif + +#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ +# define STDC +#endif + +#ifndef STDC +# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ +# define const /* note: need a more gentle solution here */ +# endif +#endif + +/* Some Mac compilers merge all .h files incorrectly: */ +#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__) +# define NO_DUMMY_DECL +#endif + +/* Maximum value for memLevel in deflateInit2 */ +#ifndef MAX_MEM_LEVEL +# ifdef MAXSEG_64K +# define MAX_MEM_LEVEL 8 +# else +# define MAX_MEM_LEVEL 9 +# endif +#endif + +/* Maximum value for windowBits in deflateInit2 and inflateInit2. + * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files + * created by gzip. (Files created by minigzip can still be extracted by + * gzip.) + */ +#ifndef MAX_WBITS +# define MAX_WBITS 15 /* 32K LZ77 window */ +#endif + +/* The memory requirements for deflate are (in bytes): + (1 << (windowBits+2)) + (1 << (memLevel+9)) + that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) + plus a few kilobytes for small objects. For example, if you want to reduce + the default memory requirements from 256K to 128K, compile with + make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" + Of course this will generally degrade compression (there's no free lunch). + + The memory requirements for inflate are (in bytes) 1 << windowBits + that is, 32K for windowBits=15 (default value) plus a few kilobytes + for small objects. +*/ + + /* Type declarations */ + +#ifndef OF /* function prototypes */ +# ifdef STDC +# define OF(args) args +# else +# define OF(args) () +# endif +#endif + +/* The following definitions for FAR are needed only for MSDOS mixed + * model programming (small or medium model with some far allocations). + * This was tested only with MSC; for other MSDOS compilers you may have + * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, + * just define FAR to be empty. + */ +#ifdef SYS16BIT +# if defined(M_I86SM) || defined(M_I86MM) + /* MSC small or medium model */ +# define SMALL_MEDIUM +# ifdef _MSC_VER +# define FAR _far +# else +# define FAR far +# endif +# endif +# if (defined(__SMALL__) || defined(__MEDIUM__)) + /* Turbo C small or medium model */ +# define SMALL_MEDIUM +# ifdef __BORLANDC__ +# define FAR _far +# else +# define FAR far +# endif +# endif +#endif + +#if defined(WINDOWS) || defined(WIN32) + /* If building or using zlib as a DLL, define ZLIB_DLL. + * This is not mandatory, but it offers a little performance increase. + */ +# ifdef ZLIB_DLL +# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) +# ifdef ZLIB_INTERNAL +# define ZEXTERN extern __declspec(dllexport) +# else +# define ZEXTERN extern __declspec(dllimport) +# endif +# endif +# endif /* ZLIB_DLL */ + /* If building or using zlib with the WINAPI/WINAPIV calling convention, + * define ZLIB_WINAPI. + * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. + */ +# ifdef ZLIB_WINAPI +# ifdef FAR +# undef FAR +# endif +# include + /* No need for _export, use ZLIB.DEF instead. */ + /* For complete Windows compatibility, use WINAPI, not __stdcall. */ +# define ZEXPORT WINAPI +# ifdef WIN32 +# define ZEXPORTVA WINAPIV +# else +# define ZEXPORTVA FAR CDECL +# endif +# endif +#endif + +#if defined (__BEOS__) +# ifdef ZLIB_DLL +# ifdef ZLIB_INTERNAL +# define ZEXPORT __declspec(dllexport) +# define ZEXPORTVA __declspec(dllexport) +# else +# define ZEXPORT __declspec(dllimport) +# define ZEXPORTVA __declspec(dllimport) +# endif +# endif +#endif + +#ifndef ZEXTERN +# define ZEXTERN extern +#endif +#ifndef ZEXPORT +# define ZEXPORT +#endif +#ifndef ZEXPORTVA +# define ZEXPORTVA +#endif + +#ifndef FAR +# define FAR +#endif + +#if !defined(__MACTYPES__) +typedef unsigned char Byte; /* 8 bits */ +#endif +typedef unsigned int uInt; /* 16 bits or more */ +typedef unsigned long uLong; /* 32 bits or more */ + +#ifdef SMALL_MEDIUM + /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ +# define Bytef Byte FAR +#else + typedef Byte FAR Bytef; +#endif +typedef char FAR charf; +typedef int FAR intf; +typedef uInt FAR uIntf; +typedef uLong FAR uLongf; + +#ifdef STDC + typedef void const *voidpc; + typedef void FAR *voidpf; + typedef void *voidp; +#else + typedef Byte const *voidpc; + typedef Byte FAR *voidpf; + typedef Byte *voidp; +#endif + +#if 0 /* HAVE_UNISTD_H -- this line is updated by ./configure */ +# include /* for off_t */ +# include /* for SEEK_* and off_t */ +# ifdef VMS +# include /* for off_t */ +# endif +# define z_off_t off_t +#endif +#ifndef SEEK_SET +# define SEEK_SET 0 /* Seek from beginning of file. */ +# define SEEK_CUR 1 /* Seek from current position. */ +# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ +#endif +#ifndef z_off_t +# define z_off_t long +#endif + +#if defined(__OS400__) +# define NO_vsnprintf +#endif + +#if defined(__MVS__) +# define NO_vsnprintf +# ifdef FAR +# undef FAR +# endif +#endif + +/* MVS linker does not support external names larger than 8 bytes */ +#if defined(__MVS__) +# pragma map(deflateInit_,"DEIN") +# pragma map(deflateInit2_,"DEIN2") +# pragma map(deflateEnd,"DEEND") +# pragma map(deflateBound,"DEBND") +# pragma map(inflateInit_,"ININ") +# pragma map(inflateInit2_,"ININ2") +# pragma map(inflateEnd,"INEND") +# pragma map(inflateSync,"INSY") +# pragma map(inflateSetDictionary,"INSEDI") +# pragma map(compressBound,"CMBND") +# pragma map(inflate_table,"INTABL") +# pragma map(inflate_fast,"INFA") +# pragma map(inflate_copyright,"INCOPY") +#endif + +#endif /* ZCONF_H */ diff --git a/tools/bsnes/lib/zlib/zip.c b/tools/bsnes/lib/zlib/zip.c new file mode 100755 index 0000000..2dc74df --- /dev/null +++ b/tools/bsnes/lib/zlib/zip.c @@ -0,0 +1,1220 @@ +/* zip.c -- IO on .zip files using zlib + Version 1.01e, February 12th, 2005 + + 27 Dec 2004 Rolf Kalbermatter + Modification to zipOpen2 to support globalComment retrieval. + + Copyright (C) 1998-2005 Gilles Vollant + + Read zip.h for more info +*/ + + +#include +#include +#include +#include +#include "zlib.h" +#include "zip.h" + +#ifdef STDC +# include +# include +# include +#endif +#ifdef NO_ERRNO_H + extern int errno; +#else +# include +#endif + + +#ifndef local +# define local static +#endif +/* compile with -Dlocal if your debugger can't find static symbols */ + +#ifndef VERSIONMADEBY +# define VERSIONMADEBY (0x0) /* platform depedent */ +#endif + +#ifndef Z_BUFSIZE +#define Z_BUFSIZE (16384) +#endif + +#ifndef Z_MAXFILENAMEINZIP +#define Z_MAXFILENAMEINZIP (256) +#endif + +#ifndef ALLOC +# define ALLOC(size) (malloc(size)) +#endif +#ifndef TRYFREE +# define TRYFREE(p) {if (p) free(p);} +#endif + +/* +#define SIZECENTRALDIRITEM (0x2e) +#define SIZEZIPLOCALHEADER (0x1e) +*/ + +/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */ + +#ifndef SEEK_CUR +#define SEEK_CUR 1 +#endif + +#ifndef SEEK_END +#define SEEK_END 2 +#endif + +#ifndef SEEK_SET +#define SEEK_SET 0 +#endif + +#ifndef DEF_MEM_LEVEL +#if MAX_MEM_LEVEL >= 8 +# define DEF_MEM_LEVEL 8 +#else +# define DEF_MEM_LEVEL MAX_MEM_LEVEL +#endif +#endif +const char zip_copyright[] = + " zip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll"; + + +#define SIZEDATA_INDATABLOCK (4096-(4*4)) + +#define LOCALHEADERMAGIC (0x04034b50) +#define CENTRALHEADERMAGIC (0x02014b50) +#define ENDHEADERMAGIC (0x06054b50) + +#define FLAG_LOCALHEADER_OFFSET (0x06) +#define CRC_LOCALHEADER_OFFSET (0x0e) + +#define SIZECENTRALHEADER (0x2e) /* 46 */ + +typedef struct linkedlist_datablock_internal_s +{ + struct linkedlist_datablock_internal_s* next_datablock; + uLong avail_in_this_block; + uLong filled_in_this_block; + uLong unused; /* for future use and alignement */ + unsigned char data[SIZEDATA_INDATABLOCK]; +} linkedlist_datablock_internal; + +typedef struct linkedlist_data_s +{ + linkedlist_datablock_internal* first_block; + linkedlist_datablock_internal* last_block; +} linkedlist_data; + + +typedef struct +{ + z_stream stream; /* zLib stream structure for inflate */ + int stream_initialised; /* 1 is stream is initialised */ + uInt pos_in_buffered_data; /* last written byte in buffered_data */ + + uLong pos_local_header; /* offset of the local header of the file + currenty writing */ + char* central_header; /* central header data for the current file */ + uLong size_centralheader; /* size of the central header for cur file */ + uLong flag; /* flag of the file currently writing */ + + int method; /* compression method of file currenty wr.*/ + int raw; /* 1 for directly writing raw data */ + Byte buffered_data[Z_BUFSIZE];/* buffer contain compressed data to be writ*/ + uLong dosDate; + uLong crc32; + int encrypt; +#ifndef NOCRYPT + unsigned long keys[3]; /* keys defining the pseudo-random sequence */ + const unsigned long* pcrc_32_tab; + int crypt_header_size; +#endif +} curfile_info; + +typedef struct +{ + zlib_filefunc_def z_filefunc; + voidpf filestream; /* io structore of the zipfile */ + linkedlist_data central_dir;/* datablock with central dir in construction*/ + int in_opened_file_inzip; /* 1 if a file in the zip is currently writ.*/ + curfile_info ci; /* info on the file curretly writing */ + + uLong begin_pos; /* position of the beginning of the zipfile */ + uLong add_position_when_writting_offset; + uLong number_entry; +#ifndef NO_ADDFILEINEXISTINGZIP + char *globalcomment; +#endif +} zip_internal; + + + +#ifndef NOCRYPT +#define INCLUDECRYPTINGCODE_IFCRYPTALLOWED +#include "crypt.h" +#endif + +local linkedlist_datablock_internal* allocate_new_datablock() +{ + linkedlist_datablock_internal* ldi; + ldi = (linkedlist_datablock_internal*) + ALLOC(sizeof(linkedlist_datablock_internal)); + if (ldi!=NULL) + { + ldi->next_datablock = NULL ; + ldi->filled_in_this_block = 0 ; + ldi->avail_in_this_block = SIZEDATA_INDATABLOCK ; + } + return ldi; +} + +local void free_datablock(ldi) + linkedlist_datablock_internal* ldi; +{ + while (ldi!=NULL) + { + linkedlist_datablock_internal* ldinext = ldi->next_datablock; + TRYFREE(ldi); + ldi = ldinext; + } +} + +local void init_linkedlist(ll) + linkedlist_data* ll; +{ + ll->first_block = ll->last_block = NULL; +} + +/* +local void free_linkedlist(ll) + linkedlist_data* ll; +{ + free_datablock(ll->first_block); + ll->first_block = ll->last_block = NULL; +} +*/ + +local int add_data_in_datablock(ll,buf,len) + linkedlist_data* ll; + const void* buf; + uLong len; +{ + linkedlist_datablock_internal* ldi; + const unsigned char* from_copy; + + if (ll==NULL) + return ZIP_INTERNALERROR; + + if (ll->last_block == NULL) + { + ll->first_block = ll->last_block = allocate_new_datablock(); + if (ll->first_block == NULL) + return ZIP_INTERNALERROR; + } + + ldi = ll->last_block; + from_copy = (unsigned char*)buf; + + while (len>0) + { + uInt copy_this; + uInt i; + unsigned char* to_copy; + + if (ldi->avail_in_this_block==0) + { + ldi->next_datablock = allocate_new_datablock(); + if (ldi->next_datablock == NULL) + return ZIP_INTERNALERROR; + ldi = ldi->next_datablock ; + ll->last_block = ldi; + } + + if (ldi->avail_in_this_block < len) + copy_this = (uInt)ldi->avail_in_this_block; + else + copy_this = (uInt)len; + + to_copy = &(ldi->data[ldi->filled_in_this_block]); + + for (i=0;ifilled_in_this_block += copy_this; + ldi->avail_in_this_block -= copy_this; + from_copy += copy_this ; + len -= copy_this; + } + return ZIP_OK; +} + + + +/****************************************************************************/ + +#ifndef NO_ADDFILEINEXISTINGZIP +/* =========================================================================== + Inputs a long in LSB order to the given file + nbByte == 1, 2 or 4 (byte, short or long) +*/ + +local int ziplocal_putValue OF((const zlib_filefunc_def* pzlib_filefunc_def, + voidpf filestream, uLong x, int nbByte)); +local int ziplocal_putValue (pzlib_filefunc_def, filestream, x, nbByte) + const zlib_filefunc_def* pzlib_filefunc_def; + voidpf filestream; + uLong x; + int nbByte; +{ + unsigned char buf[4]; + int n; + for (n = 0; n < nbByte; n++) + { + buf[n] = (unsigned char)(x & 0xff); + x >>= 8; + } + if (x != 0) + { /* data overflow - hack for ZIP64 (X Roche) */ + for (n = 0; n < nbByte; n++) + { + buf[n] = 0xff; + } + } + + if (ZWRITE(*pzlib_filefunc_def,filestream,buf,nbByte)!=(uLong)nbByte) + return ZIP_ERRNO; + else + return ZIP_OK; +} + +local void ziplocal_putValue_inmemory OF((void* dest, uLong x, int nbByte)); +local void ziplocal_putValue_inmemory (dest, x, nbByte) + void* dest; + uLong x; + int nbByte; +{ + unsigned char* buf=(unsigned char*)dest; + int n; + for (n = 0; n < nbByte; n++) { + buf[n] = (unsigned char)(x & 0xff); + x >>= 8; + } + + if (x != 0) + { /* data overflow - hack for ZIP64 */ + for (n = 0; n < nbByte; n++) + { + buf[n] = 0xff; + } + } +} + +/****************************************************************************/ + + +local uLong ziplocal_TmzDateToDosDate(ptm,dosDate) + const tm_zip* ptm; + uLong dosDate; +{ + uLong year = (uLong)ptm->tm_year; + if (year>1980) + year-=1980; + else if (year>80) + year-=80; + return + (uLong) (((ptm->tm_mday) + (32 * (ptm->tm_mon+1)) + (512 * year)) << 16) | + ((ptm->tm_sec/2) + (32* ptm->tm_min) + (2048 * (uLong)ptm->tm_hour)); +} + + +/****************************************************************************/ + +local int ziplocal_getByte OF(( + const zlib_filefunc_def* pzlib_filefunc_def, + voidpf filestream, + int *pi)); + +local int ziplocal_getByte(pzlib_filefunc_def,filestream,pi) + const zlib_filefunc_def* pzlib_filefunc_def; + voidpf filestream; + int *pi; +{ + unsigned char c; + int err = (int)ZREAD(*pzlib_filefunc_def,filestream,&c,1); + if (err==1) + { + *pi = (int)c; + return ZIP_OK; + } + else + { + if (ZERROR(*pzlib_filefunc_def,filestream)) + return ZIP_ERRNO; + else + return ZIP_EOF; + } +} + + +/* =========================================================================== + Reads a long in LSB order from the given gz_stream. Sets +*/ +local int ziplocal_getShort OF(( + const zlib_filefunc_def* pzlib_filefunc_def, + voidpf filestream, + uLong *pX)); + +local int ziplocal_getShort (pzlib_filefunc_def,filestream,pX) + const zlib_filefunc_def* pzlib_filefunc_def; + voidpf filestream; + uLong *pX; +{ + uLong x; + int i = 0; + int err; + + err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i); + x = (uLong)i; + + if (err==ZIP_OK) + err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i); + x += ((uLong)i)<<8; + + if (err==ZIP_OK) + *pX = x; + else + *pX = 0; + return err; +} + +local int ziplocal_getLong OF(( + const zlib_filefunc_def* pzlib_filefunc_def, + voidpf filestream, + uLong *pX)); + +local int ziplocal_getLong (pzlib_filefunc_def,filestream,pX) + const zlib_filefunc_def* pzlib_filefunc_def; + voidpf filestream; + uLong *pX; +{ + uLong x = 0; + int i = 0; + int err; + + err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i); + x = (uLong)i; + + if (err==ZIP_OK) + err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i); + x += ((uLong)i)<<8; + + if (err==ZIP_OK) + err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i); + x += ((uLong)i)<<16; + + if (err==ZIP_OK) + err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i); + x += ((uLong)i)<<24; + + if (err==ZIP_OK) + *pX = x; + else + *pX = 0; + return err; +} + +#ifndef BUFREADCOMMENT +#define BUFREADCOMMENT (0x400) +#endif +/* + Locate the Central directory of a zipfile (at the end, just before + the global comment) +*/ +local uLong ziplocal_SearchCentralDir OF(( + const zlib_filefunc_def* pzlib_filefunc_def, + voidpf filestream)); + +local uLong ziplocal_SearchCentralDir(pzlib_filefunc_def,filestream) + const zlib_filefunc_def* pzlib_filefunc_def; + voidpf filestream; +{ + unsigned char* buf; + uLong uSizeFile; + uLong uBackRead; + uLong uMaxBack=0xffff; /* maximum size of global comment */ + uLong uPosFound=0; + + if (ZSEEK(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0) + return 0; + + + uSizeFile = ZTELL(*pzlib_filefunc_def,filestream); + + if (uMaxBack>uSizeFile) + uMaxBack = uSizeFile; + + buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); + if (buf==NULL) + return 0; + + uBackRead = 4; + while (uBackReaduMaxBack) + uBackRead = uMaxBack; + else + uBackRead+=BUFREADCOMMENT; + uReadPos = uSizeFile-uBackRead ; + + uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? + (BUFREADCOMMENT+4) : (uSizeFile-uReadPos); + if (ZSEEK(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0) + break; + + if (ZREAD(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize) + break; + + for (i=(int)uReadSize-3; (i--)>0;) + if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && + ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06)) + { + uPosFound = uReadPos+i; + break; + } + + if (uPosFound!=0) + break; + } + TRYFREE(buf); + return uPosFound; +} +#endif /* !NO_ADDFILEINEXISTINGZIP*/ + +/************************************************************/ +extern zipFile ZEXPORT zipOpen2 (pathname, append, globalcomment, pzlib_filefunc_def) + const char *pathname; + int append; + zipcharpc* globalcomment; + zlib_filefunc_def* pzlib_filefunc_def; +{ + zip_internal ziinit; + zip_internal* zi; + int err=ZIP_OK; + + + if (pzlib_filefunc_def==NULL) + fill_fopen_filefunc(&ziinit.z_filefunc); + else + ziinit.z_filefunc = *pzlib_filefunc_def; + + ziinit.filestream = (*(ziinit.z_filefunc.zopen_file)) + (ziinit.z_filefunc.opaque, + pathname, + (append == APPEND_STATUS_CREATE) ? + (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_CREATE) : + (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_EXISTING)); + + if (ziinit.filestream == NULL) + return NULL; + ziinit.begin_pos = ZTELL(ziinit.z_filefunc,ziinit.filestream); + ziinit.in_opened_file_inzip = 0; + ziinit.ci.stream_initialised = 0; + ziinit.number_entry = 0; + ziinit.add_position_when_writting_offset = 0; + init_linkedlist(&(ziinit.central_dir)); + + + zi = (zip_internal*)ALLOC(sizeof(zip_internal)); + if (zi==NULL) + { + ZCLOSE(ziinit.z_filefunc,ziinit.filestream); + return NULL; + } + + /* now we add file in a zipfile */ +# ifndef NO_ADDFILEINEXISTINGZIP + ziinit.globalcomment = NULL; + if (append == APPEND_STATUS_ADDINZIP) + { + uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ + + uLong size_central_dir; /* size of the central directory */ + uLong offset_central_dir; /* offset of start of central directory */ + uLong central_pos,uL; + + uLong number_disk; /* number of the current dist, used for + spaning ZIP, unsupported, always 0*/ + uLong number_disk_with_CD; /* number the the disk with central dir, used + for spaning ZIP, unsupported, always 0*/ + uLong number_entry; + uLong number_entry_CD; /* total number of entries in + the central dir + (same than number_entry on nospan) */ + uLong size_comment; + + central_pos = ziplocal_SearchCentralDir(&ziinit.z_filefunc,ziinit.filestream); + if (central_pos==0) + err=ZIP_ERRNO; + + if (ZSEEK(ziinit.z_filefunc, ziinit.filestream, + central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0) + err=ZIP_ERRNO; + + /* the signature, already checked */ + if (ziplocal_getLong(&ziinit.z_filefunc, ziinit.filestream,&uL)!=ZIP_OK) + err=ZIP_ERRNO; + + /* number of this disk */ + if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_disk)!=ZIP_OK) + err=ZIP_ERRNO; + + /* number of the disk with the start of the central directory */ + if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_disk_with_CD)!=ZIP_OK) + err=ZIP_ERRNO; + + /* total number of entries in the central dir on this disk */ + if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_entry)!=ZIP_OK) + err=ZIP_ERRNO; + + /* total number of entries in the central dir */ + if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_entry_CD)!=ZIP_OK) + err=ZIP_ERRNO; + + if ((number_entry_CD!=number_entry) || + (number_disk_with_CD!=0) || + (number_disk!=0)) + err=ZIP_BADZIPFILE; + + /* size of the central directory */ + if (ziplocal_getLong(&ziinit.z_filefunc, ziinit.filestream,&size_central_dir)!=ZIP_OK) + err=ZIP_ERRNO; + + /* offset of start of central directory with respect to the + starting disk number */ + if (ziplocal_getLong(&ziinit.z_filefunc, ziinit.filestream,&offset_central_dir)!=ZIP_OK) + err=ZIP_ERRNO; + + /* zipfile global comment length */ + if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&size_comment)!=ZIP_OK) + err=ZIP_ERRNO; + + if ((central_pos0) + { + ziinit.globalcomment = ALLOC(size_comment+1); + if (ziinit.globalcomment) + { + size_comment = ZREAD(ziinit.z_filefunc, ziinit.filestream,ziinit.globalcomment,size_comment); + ziinit.globalcomment[size_comment]=0; + } + } + + byte_before_the_zipfile = central_pos - + (offset_central_dir+size_central_dir); + ziinit.add_position_when_writting_offset = byte_before_the_zipfile; + + { + uLong size_central_dir_to_read = size_central_dir; + size_t buf_size = SIZEDATA_INDATABLOCK; + void* buf_read = (void*)ALLOC(buf_size); + if (ZSEEK(ziinit.z_filefunc, ziinit.filestream, + offset_central_dir + byte_before_the_zipfile, + ZLIB_FILEFUNC_SEEK_SET) != 0) + err=ZIP_ERRNO; + + while ((size_central_dir_to_read>0) && (err==ZIP_OK)) + { + uLong read_this = SIZEDATA_INDATABLOCK; + if (read_this > size_central_dir_to_read) + read_this = size_central_dir_to_read; + if (ZREAD(ziinit.z_filefunc, ziinit.filestream,buf_read,read_this) != read_this) + err=ZIP_ERRNO; + + if (err==ZIP_OK) + err = add_data_in_datablock(&ziinit.central_dir,buf_read, + (uLong)read_this); + size_central_dir_to_read-=read_this; + } + TRYFREE(buf_read); + } + ziinit.begin_pos = byte_before_the_zipfile; + ziinit.number_entry = number_entry_CD; + + if (ZSEEK(ziinit.z_filefunc, ziinit.filestream, + offset_central_dir+byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET)!=0) + err=ZIP_ERRNO; + } + + if (globalcomment) + { + *globalcomment = ziinit.globalcomment; + } +# endif /* !NO_ADDFILEINEXISTINGZIP*/ + + if (err != ZIP_OK) + { +# ifndef NO_ADDFILEINEXISTINGZIP + TRYFREE(ziinit.globalcomment); +# endif /* !NO_ADDFILEINEXISTINGZIP*/ + TRYFREE(zi); + return NULL; + } + else + { + *zi = ziinit; + return (zipFile)zi; + } +} + +extern zipFile ZEXPORT zipOpen (pathname, append) + const char *pathname; + int append; +{ + return zipOpen2(pathname,append,NULL,NULL); +} + +extern int ZEXPORT zipOpenNewFileInZip3 (file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, raw, + windowBits, memLevel, strategy, + password, crcForCrypting) + zipFile file; + const char* filename; + const zip_fileinfo* zipfi; + const void* extrafield_local; + uInt size_extrafield_local; + const void* extrafield_global; + uInt size_extrafield_global; + const char* comment; + int method; + int level; + int raw; + int windowBits; + int memLevel; + int strategy; + const char* password; + uLong crcForCrypting; +{ + zip_internal* zi; + uInt size_filename; + uInt size_comment; + uInt i; + int err = ZIP_OK; + +# ifdef NOCRYPT + if (password != NULL) + return ZIP_PARAMERROR; +# endif + + if (file == NULL) + return ZIP_PARAMERROR; + if ((method!=0) && (method!=Z_DEFLATED)) + return ZIP_PARAMERROR; + + zi = (zip_internal*)file; + + if (zi->in_opened_file_inzip == 1) + { + err = zipCloseFileInZip (file); + if (err != ZIP_OK) + return err; + } + + + if (filename==NULL) + filename="-"; + + if (comment==NULL) + size_comment = 0; + else + size_comment = (uInt)strlen(comment); + + size_filename = (uInt)strlen(filename); + + if (zipfi == NULL) + zi->ci.dosDate = 0; + else + { + if (zipfi->dosDate != 0) + zi->ci.dosDate = zipfi->dosDate; + else zi->ci.dosDate = ziplocal_TmzDateToDosDate(&zipfi->tmz_date,zipfi->dosDate); + } + + zi->ci.flag = 0; + if ((level==8) || (level==9)) + zi->ci.flag |= 2; + if ((level==2)) + zi->ci.flag |= 4; + if ((level==1)) + zi->ci.flag |= 6; + if (password != NULL) + zi->ci.flag |= 1; + + zi->ci.crc32 = 0; + zi->ci.method = method; + zi->ci.encrypt = 0; + zi->ci.stream_initialised = 0; + zi->ci.pos_in_buffered_data = 0; + zi->ci.raw = raw; + zi->ci.pos_local_header = ZTELL(zi->z_filefunc,zi->filestream) ; + zi->ci.size_centralheader = SIZECENTRALHEADER + size_filename + + size_extrafield_global + size_comment; + zi->ci.central_header = (char*)ALLOC((uInt)zi->ci.size_centralheader); + + ziplocal_putValue_inmemory(zi->ci.central_header,(uLong)CENTRALHEADERMAGIC,4); + /* version info */ + ziplocal_putValue_inmemory(zi->ci.central_header+4,(uLong)VERSIONMADEBY,2); + ziplocal_putValue_inmemory(zi->ci.central_header+6,(uLong)20,2); + ziplocal_putValue_inmemory(zi->ci.central_header+8,(uLong)zi->ci.flag,2); + ziplocal_putValue_inmemory(zi->ci.central_header+10,(uLong)zi->ci.method,2); + ziplocal_putValue_inmemory(zi->ci.central_header+12,(uLong)zi->ci.dosDate,4); + ziplocal_putValue_inmemory(zi->ci.central_header+16,(uLong)0,4); /*crc*/ + ziplocal_putValue_inmemory(zi->ci.central_header+20,(uLong)0,4); /*compr size*/ + ziplocal_putValue_inmemory(zi->ci.central_header+24,(uLong)0,4); /*uncompr size*/ + ziplocal_putValue_inmemory(zi->ci.central_header+28,(uLong)size_filename,2); + ziplocal_putValue_inmemory(zi->ci.central_header+30,(uLong)size_extrafield_global,2); + ziplocal_putValue_inmemory(zi->ci.central_header+32,(uLong)size_comment,2); + ziplocal_putValue_inmemory(zi->ci.central_header+34,(uLong)0,2); /*disk nm start*/ + + if (zipfi==NULL) + ziplocal_putValue_inmemory(zi->ci.central_header+36,(uLong)0,2); + else + ziplocal_putValue_inmemory(zi->ci.central_header+36,(uLong)zipfi->internal_fa,2); + + if (zipfi==NULL) + ziplocal_putValue_inmemory(zi->ci.central_header+38,(uLong)0,4); + else + ziplocal_putValue_inmemory(zi->ci.central_header+38,(uLong)zipfi->external_fa,4); + + ziplocal_putValue_inmemory(zi->ci.central_header+42,(uLong)zi->ci.pos_local_header- zi->add_position_when_writting_offset,4); + + for (i=0;ici.central_header+SIZECENTRALHEADER+i) = *(filename+i); + + for (i=0;ici.central_header+SIZECENTRALHEADER+size_filename+i) = + *(((const char*)extrafield_global)+i); + + for (i=0;ici.central_header+SIZECENTRALHEADER+size_filename+ + size_extrafield_global+i) = *(comment+i); + if (zi->ci.central_header == NULL) + return ZIP_INTERNALERROR; + + /* write the local header */ + err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)LOCALHEADERMAGIC,4); + + if (err==ZIP_OK) + err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)20,2);/* version needed to extract */ + if (err==ZIP_OK) + err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.flag,2); + + if (err==ZIP_OK) + err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.method,2); + + if (err==ZIP_OK) + err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.dosDate,4); + + if (err==ZIP_OK) + err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* crc 32, unknown */ + if (err==ZIP_OK) + err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* compressed size, unknown */ + if (err==ZIP_OK) + err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* uncompressed size, unknown */ + + if (err==ZIP_OK) + err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_filename,2); + + if (err==ZIP_OK) + err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_extrafield_local,2); + + if ((err==ZIP_OK) && (size_filename>0)) + if (ZWRITE(zi->z_filefunc,zi->filestream,filename,size_filename)!=size_filename) + err = ZIP_ERRNO; + + if ((err==ZIP_OK) && (size_extrafield_local>0)) + if (ZWRITE(zi->z_filefunc,zi->filestream,extrafield_local,size_extrafield_local) + !=size_extrafield_local) + err = ZIP_ERRNO; + + zi->ci.stream.avail_in = (uInt)0; + zi->ci.stream.avail_out = (uInt)Z_BUFSIZE; + zi->ci.stream.next_out = zi->ci.buffered_data; + zi->ci.stream.total_in = 0; + zi->ci.stream.total_out = 0; + + if ((err==ZIP_OK) && (zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) + { + zi->ci.stream.zalloc = (alloc_func)0; + zi->ci.stream.zfree = (free_func)0; + zi->ci.stream.opaque = (voidpf)0; + + if (windowBits>0) + windowBits = -windowBits; + + err = deflateInit2(&zi->ci.stream, level, + Z_DEFLATED, windowBits, memLevel, strategy); + + if (err==Z_OK) + zi->ci.stream_initialised = 1; + } +# ifndef NOCRYPT + zi->ci.crypt_header_size = 0; + if ((err==Z_OK) && (password != NULL)) + { + unsigned char bufHead[RAND_HEAD_LEN]; + unsigned int sizeHead; + zi->ci.encrypt = 1; + zi->ci.pcrc_32_tab = get_crc_table(); + /*init_keys(password,zi->ci.keys,zi->ci.pcrc_32_tab);*/ + + sizeHead=crypthead(password,bufHead,RAND_HEAD_LEN,zi->ci.keys,zi->ci.pcrc_32_tab,crcForCrypting); + zi->ci.crypt_header_size = sizeHead; + + if (ZWRITE(zi->z_filefunc,zi->filestream,bufHead,sizeHead) != sizeHead) + err = ZIP_ERRNO; + } +# endif + + if (err==Z_OK) + zi->in_opened_file_inzip = 1; + return err; +} + +extern int ZEXPORT zipOpenNewFileInZip2(file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, raw) + zipFile file; + const char* filename; + const zip_fileinfo* zipfi; + const void* extrafield_local; + uInt size_extrafield_local; + const void* extrafield_global; + uInt size_extrafield_global; + const char* comment; + int method; + int level; + int raw; +{ + return zipOpenNewFileInZip3 (file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, raw, + -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, + NULL, 0); +} + +extern int ZEXPORT zipOpenNewFileInZip (file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level) + zipFile file; + const char* filename; + const zip_fileinfo* zipfi; + const void* extrafield_local; + uInt size_extrafield_local; + const void* extrafield_global; + uInt size_extrafield_global; + const char* comment; + int method; + int level; +{ + return zipOpenNewFileInZip2 (file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, 0); +} + +local int zipFlushWriteBuffer(zi) + zip_internal* zi; +{ + int err=ZIP_OK; + + if (zi->ci.encrypt != 0) + { +#ifndef NOCRYPT + uInt i; + int t; + for (i=0;ici.pos_in_buffered_data;i++) + zi->ci.buffered_data[i] = zencode(zi->ci.keys, zi->ci.pcrc_32_tab, + zi->ci.buffered_data[i],t); +#endif + } + if (ZWRITE(zi->z_filefunc,zi->filestream,zi->ci.buffered_data,zi->ci.pos_in_buffered_data) + !=zi->ci.pos_in_buffered_data) + err = ZIP_ERRNO; + zi->ci.pos_in_buffered_data = 0; + return err; +} + +extern int ZEXPORT zipWriteInFileInZip (file, buf, len) + zipFile file; + const void* buf; + unsigned len; +{ + zip_internal* zi; + int err=ZIP_OK; + + if (file == NULL) + return ZIP_PARAMERROR; + zi = (zip_internal*)file; + + if (zi->in_opened_file_inzip == 0) + return ZIP_PARAMERROR; + + zi->ci.stream.next_in = (void*)buf; + zi->ci.stream.avail_in = len; + zi->ci.crc32 = crc32(zi->ci.crc32,buf,len); + + while ((err==ZIP_OK) && (zi->ci.stream.avail_in>0)) + { + if (zi->ci.stream.avail_out == 0) + { + if (zipFlushWriteBuffer(zi) == ZIP_ERRNO) + err = ZIP_ERRNO; + zi->ci.stream.avail_out = (uInt)Z_BUFSIZE; + zi->ci.stream.next_out = zi->ci.buffered_data; + } + + + if(err != ZIP_OK) + break; + + if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) + { + uLong uTotalOutBefore = zi->ci.stream.total_out; + err=deflate(&zi->ci.stream, Z_NO_FLUSH); + zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ; + + } + else + { + uInt copy_this,i; + if (zi->ci.stream.avail_in < zi->ci.stream.avail_out) + copy_this = zi->ci.stream.avail_in; + else + copy_this = zi->ci.stream.avail_out; + for (i=0;ici.stream.next_out)+i) = + *(((const char*)zi->ci.stream.next_in)+i); + { + zi->ci.stream.avail_in -= copy_this; + zi->ci.stream.avail_out-= copy_this; + zi->ci.stream.next_in+= copy_this; + zi->ci.stream.next_out+= copy_this; + zi->ci.stream.total_in+= copy_this; + zi->ci.stream.total_out+= copy_this; + zi->ci.pos_in_buffered_data += copy_this; + } + } + } + + return err; +} + +extern int ZEXPORT zipCloseFileInZipRaw (file, uncompressed_size, crc32) + zipFile file; + uLong uncompressed_size; + uLong crc32; +{ + zip_internal* zi; + uLong compressed_size; + int err=ZIP_OK; + + if (file == NULL) + return ZIP_PARAMERROR; + zi = (zip_internal*)file; + + if (zi->in_opened_file_inzip == 0) + return ZIP_PARAMERROR; + zi->ci.stream.avail_in = 0; + + if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) + while (err==ZIP_OK) + { + uLong uTotalOutBefore; + if (zi->ci.stream.avail_out == 0) + { + if (zipFlushWriteBuffer(zi) == ZIP_ERRNO) + err = ZIP_ERRNO; + zi->ci.stream.avail_out = (uInt)Z_BUFSIZE; + zi->ci.stream.next_out = zi->ci.buffered_data; + } + uTotalOutBefore = zi->ci.stream.total_out; + err=deflate(&zi->ci.stream, Z_FINISH); + zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ; + } + + if (err==Z_STREAM_END) + err=ZIP_OK; /* this is normal */ + + if ((zi->ci.pos_in_buffered_data>0) && (err==ZIP_OK)) + if (zipFlushWriteBuffer(zi)==ZIP_ERRNO) + err = ZIP_ERRNO; + + if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) + { + err=deflateEnd(&zi->ci.stream); + zi->ci.stream_initialised = 0; + } + + if (!zi->ci.raw) + { + crc32 = (uLong)zi->ci.crc32; + uncompressed_size = (uLong)zi->ci.stream.total_in; + } + compressed_size = (uLong)zi->ci.stream.total_out; +# ifndef NOCRYPT + compressed_size += zi->ci.crypt_header_size; +# endif + + ziplocal_putValue_inmemory(zi->ci.central_header+16,crc32,4); /*crc*/ + ziplocal_putValue_inmemory(zi->ci.central_header+20, + compressed_size,4); /*compr size*/ + if (zi->ci.stream.data_type == Z_ASCII) + ziplocal_putValue_inmemory(zi->ci.central_header+36,(uLong)Z_ASCII,2); + ziplocal_putValue_inmemory(zi->ci.central_header+24, + uncompressed_size,4); /*uncompr size*/ + + if (err==ZIP_OK) + err = add_data_in_datablock(&zi->central_dir,zi->ci.central_header, + (uLong)zi->ci.size_centralheader); + free(zi->ci.central_header); + + if (err==ZIP_OK) + { + long cur_pos_inzip = ZTELL(zi->z_filefunc,zi->filestream); + if (ZSEEK(zi->z_filefunc,zi->filestream, + zi->ci.pos_local_header + 14,ZLIB_FILEFUNC_SEEK_SET)!=0) + err = ZIP_ERRNO; + + if (err==ZIP_OK) + err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,crc32,4); /* crc 32, unknown */ + + if (err==ZIP_OK) /* compressed size, unknown */ + err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,compressed_size,4); + + if (err==ZIP_OK) /* uncompressed size, unknown */ + err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,uncompressed_size,4); + + if (ZSEEK(zi->z_filefunc,zi->filestream, + cur_pos_inzip,ZLIB_FILEFUNC_SEEK_SET)!=0) + err = ZIP_ERRNO; + } + + zi->number_entry ++; + zi->in_opened_file_inzip = 0; + + return err; +} + +extern int ZEXPORT zipCloseFileInZip (file) + zipFile file; +{ + return zipCloseFileInZipRaw (file,0,0); +} + +extern int ZEXPORT zipClose (file, global_comment) + zipFile file; + const char* global_comment; +{ + zip_internal* zi; + int err = 0; + uLong size_centraldir = 0; + uLong centraldir_pos_inzip; + uInt size_global_comment; + if (file == NULL) + return ZIP_PARAMERROR; + zi = (zip_internal*)file; + + if (zi->in_opened_file_inzip == 1) + { + err = zipCloseFileInZip (file); + } + +#ifndef NO_ADDFILEINEXISTINGZIP + if (global_comment==NULL) + global_comment = zi->globalcomment; +#endif + if (global_comment==NULL) + size_global_comment = 0; + else + size_global_comment = (uInt)strlen(global_comment); + + centraldir_pos_inzip = ZTELL(zi->z_filefunc,zi->filestream); + if (err==ZIP_OK) + { + linkedlist_datablock_internal* ldi = zi->central_dir.first_block ; + while (ldi!=NULL) + { + if ((err==ZIP_OK) && (ldi->filled_in_this_block>0)) + if (ZWRITE(zi->z_filefunc,zi->filestream, + ldi->data,ldi->filled_in_this_block) + !=ldi->filled_in_this_block ) + err = ZIP_ERRNO; + + size_centraldir += ldi->filled_in_this_block; + ldi = ldi->next_datablock; + } + } + free_datablock(zi->central_dir.first_block); + + if (err==ZIP_OK) /* Magic End */ + err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)ENDHEADERMAGIC,4); + + if (err==ZIP_OK) /* number of this disk */ + err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,2); + + if (err==ZIP_OK) /* number of the disk with the start of the central directory */ + err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,2); + + if (err==ZIP_OK) /* total number of entries in the central dir on this disk */ + err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->number_entry,2); + + if (err==ZIP_OK) /* total number of entries in the central dir */ + err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->number_entry,2); + + if (err==ZIP_OK) /* size of the central directory */ + err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_centraldir,4); + + if (err==ZIP_OK) /* offset of start of central directory with respect to the + starting disk number */ + err = ziplocal_putValue(&zi->z_filefunc,zi->filestream, + (uLong)(centraldir_pos_inzip - zi->add_position_when_writting_offset),4); + + if (err==ZIP_OK) /* zipfile comment length */ + err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_global_comment,2); + + if ((err==ZIP_OK) && (size_global_comment>0)) + if (ZWRITE(zi->z_filefunc,zi->filestream, + global_comment,size_global_comment) != size_global_comment) + err = ZIP_ERRNO; + + if (ZCLOSE(zi->z_filefunc,zi->filestream) != 0) + if (err == ZIP_OK) + err = ZIP_ERRNO; + +#ifndef NO_ADDFILEINEXISTINGZIP + TRYFREE(zi->globalcomment); +#endif + TRYFREE(zi); + + return err; +} diff --git a/tools/bsnes/lib/zlib/zip.h b/tools/bsnes/lib/zlib/zip.h new file mode 100755 index 0000000..acacce8 --- /dev/null +++ b/tools/bsnes/lib/zlib/zip.h @@ -0,0 +1,235 @@ +/* zip.h -- IO for compress .zip files using zlib + Version 1.01e, February 12th, 2005 + + Copyright (C) 1998-2005 Gilles Vollant + + This unzip package allow creates .ZIP file, compatible with PKZip 2.04g + WinZip, InfoZip tools and compatible. + Multi volume ZipFile (span) are not supported. + Encryption compatible with pkzip 2.04g only supported + Old compressions used by old PKZip 1.x are not supported + + For uncompress .zip file, look at unzip.h + + + I WAIT FEEDBACK at mail info@winimage.com + Visit also http://www.winimage.com/zLibDll/unzip.html for evolution + + Condition of use and distribution are the same than zlib : + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + +*/ + +/* for more info about .ZIP format, see + http://www.info-zip.org/pub/infozip/doc/appnote-981119-iz.zip + http://www.info-zip.org/pub/infozip/doc/ + PkWare has also a specification at : + ftp://ftp.pkware.com/probdesc.zip +*/ + +#ifndef _zip_H +#define _zip_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef _ZLIB_H +#include "zlib.h" +#endif + +#ifndef _ZLIBIOAPI_H +#include "ioapi.h" +#endif + +#if defined(STRICTZIP) || defined(STRICTZIPUNZIP) +/* like the STRICT of WIN32, we define a pointer that cannot be converted + from (void*) without cast */ +typedef struct TagzipFile__ { int unused; } zipFile__; +typedef zipFile__ *zipFile; +#else +typedef voidp zipFile; +#endif + +#define ZIP_OK (0) +#define ZIP_EOF (0) +#define ZIP_ERRNO (Z_ERRNO) +#define ZIP_PARAMERROR (-102) +#define ZIP_BADZIPFILE (-103) +#define ZIP_INTERNALERROR (-104) + +#ifndef DEF_MEM_LEVEL +# if MAX_MEM_LEVEL >= 8 +# define DEF_MEM_LEVEL 8 +# else +# define DEF_MEM_LEVEL MAX_MEM_LEVEL +# endif +#endif +/* default memLevel */ + +/* tm_zip contain date/time info */ +typedef struct tm_zip_s +{ + uInt tm_sec; /* seconds after the minute - [0,59] */ + uInt tm_min; /* minutes after the hour - [0,59] */ + uInt tm_hour; /* hours since midnight - [0,23] */ + uInt tm_mday; /* day of the month - [1,31] */ + uInt tm_mon; /* months since January - [0,11] */ + uInt tm_year; /* years - [1980..2044] */ +} tm_zip; + +typedef struct +{ + tm_zip tmz_date; /* date in understandable format */ + uLong dosDate; /* if dos_date == 0, tmu_date is used */ +/* uLong flag; */ /* general purpose bit flag 2 bytes */ + + uLong internal_fa; /* internal file attributes 2 bytes */ + uLong external_fa; /* external file attributes 4 bytes */ +} zip_fileinfo; + +typedef const char* zipcharpc; + + +#define APPEND_STATUS_CREATE (0) +#define APPEND_STATUS_CREATEAFTER (1) +#define APPEND_STATUS_ADDINZIP (2) + +extern zipFile ZEXPORT zipOpen OF((const char *pathname, int append)); +/* + Create a zipfile. + pathname contain on Windows XP a filename like "c:\\zlib\\zlib113.zip" or on + an Unix computer "zlib/zlib113.zip". + if the file pathname exist and append==APPEND_STATUS_CREATEAFTER, the zip + will be created at the end of the file. + (useful if the file contain a self extractor code) + if the file pathname exist and append==APPEND_STATUS_ADDINZIP, we will + add files in existing zip (be sure you don't add file that doesn't exist) + If the zipfile cannot be opened, the return value is NULL. + Else, the return value is a zipFile Handle, usable with other function + of this zip package. +*/ + +/* Note : there is no delete function into a zipfile. + If you want delete file into a zipfile, you must open a zipfile, and create another + Of couse, you can use RAW reading and writing to copy the file you did not want delte +*/ + +extern zipFile ZEXPORT zipOpen2 OF((const char *pathname, + int append, + zipcharpc* globalcomment, + zlib_filefunc_def* pzlib_filefunc_def)); + +extern int ZEXPORT zipOpenNewFileInZip OF((zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level)); +/* + Open a file in the ZIP for writing. + filename : the filename in zip (if NULL, '-' without quote will be used + *zipfi contain supplemental information + if extrafield_local!=NULL and size_extrafield_local>0, extrafield_local + contains the extrafield data the the local header + if extrafield_global!=NULL and size_extrafield_global>0, extrafield_global + contains the extrafield data the the local header + if comment != NULL, comment contain the comment string + method contain the compression method (0 for store, Z_DEFLATED for deflate) + level contain the level of compression (can be Z_DEFAULT_COMPRESSION) +*/ + + +extern int ZEXPORT zipOpenNewFileInZip2 OF((zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int raw)); + +/* + Same than zipOpenNewFileInZip, except if raw=1, we write raw file + */ + +extern int ZEXPORT zipOpenNewFileInZip3 OF((zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int raw, + int windowBits, + int memLevel, + int strategy, + const char* password, + uLong crcForCtypting)); + +/* + Same than zipOpenNewFileInZip2, except + windowBits,memLevel,,strategy : see parameter strategy in deflateInit2 + password : crypting password (NULL for no crypting) + crcForCtypting : crc of file to compress (needed for crypting) + */ + + +extern int ZEXPORT zipWriteInFileInZip OF((zipFile file, + const void* buf, + unsigned len)); +/* + Write data in the zipfile +*/ + +extern int ZEXPORT zipCloseFileInZip OF((zipFile file)); +/* + Close the current file in the zipfile +*/ + +extern int ZEXPORT zipCloseFileInZipRaw OF((zipFile file, + uLong uncompressed_size, + uLong crc32)); +/* + Close the current file in the zipfile, for fiel opened with + parameter raw=1 in zipOpenNewFileInZip2 + uncompressed_size and crc32 are value for the uncompressed size +*/ + +extern int ZEXPORT zipClose OF((zipFile file, + const char* global_comment)); +/* + Close the zipfile +*/ + +#ifdef __cplusplus +} +#endif + +#endif /* _zip_H */ diff --git a/tools/bsnes/lib/zlib/zlib.h b/tools/bsnes/lib/zlib/zlib.h new file mode 100755 index 0000000..0228179 --- /dev/null +++ b/tools/bsnes/lib/zlib/zlib.h @@ -0,0 +1,1357 @@ +/* zlib.h -- interface of the 'zlib' general purpose compression library + version 1.2.3, July 18th, 2005 + + Copyright (C) 1995-2005 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu + + + The data format used by the zlib library is described by RFCs (Request for + Comments) 1950 to 1952 in the files http://www.ietf.org/rfc/rfc1950.txt + (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format). +*/ + +#ifndef ZLIB_H +#define ZLIB_H + +#include "zconf.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define ZLIB_VERSION "1.2.3" +#define ZLIB_VERNUM 0x1230 + +/* + The 'zlib' compression library provides in-memory compression and + decompression functions, including integrity checks of the uncompressed + data. This version of the library supports only one compression method + (deflation) but other algorithms will be added later and will have the same + stream interface. + + Compression can be done in a single step if the buffers are large + enough (for example if an input file is mmap'ed), or can be done by + repeated calls of the compression function. In the latter case, the + application must provide more input and/or consume the output + (providing more output space) before each call. + + The compressed data format used by default by the in-memory functions is + the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped + around a deflate stream, which is itself documented in RFC 1951. + + The library also supports reading and writing files in gzip (.gz) format + with an interface similar to that of stdio using the functions that start + with "gz". The gzip format is different from the zlib format. gzip is a + gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. + + This library can optionally read and write gzip streams in memory as well. + + The zlib format was designed to be compact and fast for use in memory + and on communications channels. The gzip format was designed for single- + file compression on file systems, has a larger header than zlib to maintain + directory information, and uses a different, slower check method than zlib. + + The library does not install any signal handler. The decoder checks + the consistency of the compressed data, so the library should never + crash even in case of corrupted input. +*/ + +typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); +typedef void (*free_func) OF((voidpf opaque, voidpf address)); + +struct internal_state; + +typedef struct z_stream_s { + Bytef *next_in; /* next input byte */ + uInt avail_in; /* number of bytes available at next_in */ + uLong total_in; /* total nb of input bytes read so far */ + + Bytef *next_out; /* next output byte should be put there */ + uInt avail_out; /* remaining free space at next_out */ + uLong total_out; /* total nb of bytes output so far */ + + char *msg; /* last error message, NULL if no error */ + struct internal_state FAR *state; /* not visible by applications */ + + alloc_func zalloc; /* used to allocate the internal state */ + free_func zfree; /* used to free the internal state */ + voidpf opaque; /* private data object passed to zalloc and zfree */ + + int data_type; /* best guess about the data type: binary or text */ + uLong adler; /* adler32 value of the uncompressed data */ + uLong reserved; /* reserved for future use */ +} z_stream; + +typedef z_stream FAR *z_streamp; + +/* + gzip header information passed to and from zlib routines. See RFC 1952 + for more details on the meanings of these fields. +*/ +typedef struct gz_header_s { + int text; /* true if compressed data believed to be text */ + uLong time; /* modification time */ + int xflags; /* extra flags (not used when writing a gzip file) */ + int os; /* operating system */ + Bytef *extra; /* pointer to extra field or Z_NULL if none */ + uInt extra_len; /* extra field length (valid if extra != Z_NULL) */ + uInt extra_max; /* space at extra (only when reading header) */ + Bytef *name; /* pointer to zero-terminated file name or Z_NULL */ + uInt name_max; /* space at name (only when reading header) */ + Bytef *comment; /* pointer to zero-terminated comment or Z_NULL */ + uInt comm_max; /* space at comment (only when reading header) */ + int hcrc; /* true if there was or will be a header crc */ + int done; /* true when done reading gzip header (not used + when writing a gzip file) */ +} gz_header; + +typedef gz_header FAR *gz_headerp; + +/* + The application must update next_in and avail_in when avail_in has + dropped to zero. It must update next_out and avail_out when avail_out + has dropped to zero. The application must initialize zalloc, zfree and + opaque before calling the init function. All other fields are set by the + compression library and must not be updated by the application. + + The opaque value provided by the application will be passed as the first + parameter for calls of zalloc and zfree. This can be useful for custom + memory management. The compression library attaches no meaning to the + opaque value. + + zalloc must return Z_NULL if there is not enough memory for the object. + If zlib is used in a multi-threaded application, zalloc and zfree must be + thread safe. + + On 16-bit systems, the functions zalloc and zfree must be able to allocate + exactly 65536 bytes, but will not be required to allocate more than this + if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, + pointers returned by zalloc for objects of exactly 65536 bytes *must* + have their offset normalized to zero. The default allocation function + provided by this library ensures this (see zutil.c). To reduce memory + requirements and avoid any allocation of 64K objects, at the expense of + compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h). + + The fields total_in and total_out can be used for statistics or + progress reports. After compression, total_in holds the total size of + the uncompressed data and may be saved for use in the decompressor + (particularly if the decompressor wants to decompress everything in + a single step). +*/ + + /* constants */ + +#define Z_NO_FLUSH 0 +#define Z_PARTIAL_FLUSH 1 /* will be removed, use Z_SYNC_FLUSH instead */ +#define Z_SYNC_FLUSH 2 +#define Z_FULL_FLUSH 3 +#define Z_FINISH 4 +#define Z_BLOCK 5 +/* Allowed flush values; see deflate() and inflate() below for details */ + +#define Z_OK 0 +#define Z_STREAM_END 1 +#define Z_NEED_DICT 2 +#define Z_ERRNO (-1) +#define Z_STREAM_ERROR (-2) +#define Z_DATA_ERROR (-3) +#define Z_MEM_ERROR (-4) +#define Z_BUF_ERROR (-5) +#define Z_VERSION_ERROR (-6) +/* Return codes for the compression/decompression functions. Negative + * values are errors, positive values are used for special but normal events. + */ + +#define Z_NO_COMPRESSION 0 +#define Z_BEST_SPEED 1 +#define Z_BEST_COMPRESSION 9 +#define Z_DEFAULT_COMPRESSION (-1) +/* compression levels */ + +#define Z_FILTERED 1 +#define Z_HUFFMAN_ONLY 2 +#define Z_RLE 3 +#define Z_FIXED 4 +#define Z_DEFAULT_STRATEGY 0 +/* compression strategy; see deflateInit2() below for details */ + +#define Z_BINARY 0 +#define Z_TEXT 1 +#define Z_ASCII Z_TEXT /* for compatibility with 1.2.2 and earlier */ +#define Z_UNKNOWN 2 +/* Possible values of the data_type field (though see inflate()) */ + +#define Z_DEFLATED 8 +/* The deflate compression method (the only one supported in this version) */ + +#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ + +#define zlib_version zlibVersion() +/* for compatibility with versions < 1.0.2 */ + + /* basic functions */ + +ZEXTERN const char * ZEXPORT zlibVersion OF((void)); +/* The application can compare zlibVersion and ZLIB_VERSION for consistency. + If the first character differs, the library code actually used is + not compatible with the zlib.h header file used by the application. + This check is automatically made by deflateInit and inflateInit. + */ + +/* +ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); + + Initializes the internal stream state for compression. The fields + zalloc, zfree and opaque must be initialized before by the caller. + If zalloc and zfree are set to Z_NULL, deflateInit updates them to + use default allocation functions. + + The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: + 1 gives best speed, 9 gives best compression, 0 gives no compression at + all (the input data is simply copied a block at a time). + Z_DEFAULT_COMPRESSION requests a default compromise between speed and + compression (currently equivalent to level 6). + + deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if level is not a valid compression level, + Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible + with the version assumed by the caller (ZLIB_VERSION). + msg is set to null if there is no error message. deflateInit does not + perform any compression: this will be done by deflate(). +*/ + + +ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); +/* + deflate compresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce some + output latency (reading input without producing any output) except when + forced to flush. + + The detailed semantics are as follows. deflate performs one or both of the + following actions: + + - Compress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in and avail_in are updated and + processing will resume at this point for the next call of deflate(). + + - Provide more output starting at next_out and update next_out and avail_out + accordingly. This action is forced if the parameter flush is non zero. + Forcing flush frequently degrades the compression ratio, so this parameter + should be set only when necessary (in interactive applications). + Some output may be provided even if flush is not set. + + Before the call of deflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming + more output, and updating avail_in or avail_out accordingly; avail_out + should never be zero before the call. The application can consume the + compressed output when it wants, for example when the output buffer is full + (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK + and with zero avail_out, it must be called again after making room in the + output buffer because there might be more output pending. + + Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to + decide how much data to accumualte before producing output, in order to + maximize compression. + + If the parameter flush is set to Z_SYNC_FLUSH, all pending output is + flushed to the output buffer and the output is aligned on a byte boundary, so + that the decompressor can get all input data available so far. (In particular + avail_in is zero after the call if enough output space has been provided + before the call.) Flushing may degrade compression for some compression + algorithms and so it should be used only when necessary. + + If flush is set to Z_FULL_FLUSH, all output is flushed as with + Z_SYNC_FLUSH, and the compression state is reset so that decompression can + restart from this point if previous compressed data has been damaged or if + random access is desired. Using Z_FULL_FLUSH too often can seriously degrade + compression. + + If deflate returns with avail_out == 0, this function must be called again + with the same value of the flush parameter and more output space (updated + avail_out), until the flush is complete (deflate returns with non-zero + avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that + avail_out is greater than six to avoid repeated flush markers due to + avail_out == 0 on return. + + If the parameter flush is set to Z_FINISH, pending input is processed, + pending output is flushed and deflate returns with Z_STREAM_END if there + was enough output space; if deflate returns with Z_OK, this function must be + called again with Z_FINISH and more output space (updated avail_out) but no + more input data, until it returns with Z_STREAM_END or an error. After + deflate has returned Z_STREAM_END, the only possible operations on the + stream are deflateReset or deflateEnd. + + Z_FINISH can be used immediately after deflateInit if all the compression + is to be done in a single step. In this case, avail_out must be at least + the value returned by deflateBound (see below). If deflate does not return + Z_STREAM_END, then it must be called again as described above. + + deflate() sets strm->adler to the adler32 checksum of all input read + so far (that is, total_in bytes). + + deflate() may update strm->data_type if it can make a good guess about + the input data type (Z_BINARY or Z_TEXT). In doubt, the data is considered + binary. This field is only for information purposes and does not affect + the compression algorithm in any manner. + + deflate() returns Z_OK if some progress has been made (more input + processed or more output produced), Z_STREAM_END if all input has been + consumed and all output has been produced (only when flush is set to + Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example + if next_in or next_out was NULL), Z_BUF_ERROR if no progress is possible + (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not + fatal, and deflate() can be called again with more input and more output + space to continue compressing. +*/ + + +ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any + pending output. + + deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the + stream state was inconsistent, Z_DATA_ERROR if the stream was freed + prematurely (some input or output was discarded). In the error case, + msg may be set but then points to a static string (which must not be + deallocated). +*/ + + +/* +ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); + + Initializes the internal stream state for decompression. The fields + next_in, avail_in, zalloc, zfree and opaque must be initialized before by + the caller. If next_in is not Z_NULL and avail_in is large enough (the exact + value depends on the compression method), inflateInit determines the + compression method from the zlib header and allocates all data structures + accordingly; otherwise the allocation will be deferred to the first call of + inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to + use default allocation functions. + + inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_VERSION_ERROR if the zlib library version is incompatible with the + version assumed by the caller. msg is set to null if there is no error + message. inflateInit does not perform any decompression apart from reading + the zlib header if present: this will be done by inflate(). (So next_in and + avail_in may be modified, but next_out and avail_out are unchanged.) +*/ + + +ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); +/* + inflate decompresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce + some output latency (reading input without producing any output) except when + forced to flush. + + The detailed semantics are as follows. inflate performs one or both of the + following actions: + + - Decompress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in is updated and processing + will resume at this point for the next call of inflate(). + + - Provide more output starting at next_out and update next_out and avail_out + accordingly. inflate() provides as much output as possible, until there + is no more input data or no more space in the output buffer (see below + about the flush parameter). + + Before the call of inflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming + more output, and updating the next_* and avail_* values accordingly. + The application can consume the uncompressed output when it wants, for + example when the output buffer is full (avail_out == 0), or after each + call of inflate(). If inflate returns Z_OK and with zero avail_out, it + must be called again after making room in the output buffer because there + might be more output pending. + + The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, + Z_FINISH, or Z_BLOCK. Z_SYNC_FLUSH requests that inflate() flush as much + output as possible to the output buffer. Z_BLOCK requests that inflate() stop + if and when it gets to the next deflate block boundary. When decoding the + zlib or gzip format, this will cause inflate() to return immediately after + the header and before the first block. When doing a raw inflate, inflate() + will go ahead and process the first block, and will return when it gets to + the end of that block, or when it runs out of data. + + The Z_BLOCK option assists in appending to or combining deflate streams. + Also to assist in this, on return inflate() will set strm->data_type to the + number of unused bits in the last byte taken from strm->next_in, plus 64 + if inflate() is currently decoding the last block in the deflate stream, + plus 128 if inflate() returned immediately after decoding an end-of-block + code or decoding the complete header up to just before the first byte of the + deflate stream. The end-of-block will not be indicated until all of the + uncompressed data from that block has been written to strm->next_out. The + number of unused bits may in general be greater than seven, except when + bit 7 of data_type is set, in which case the number of unused bits will be + less than eight. + + inflate() should normally be called until it returns Z_STREAM_END or an + error. However if all decompression is to be performed in a single step + (a single call of inflate), the parameter flush should be set to + Z_FINISH. In this case all pending input is processed and all pending + output is flushed; avail_out must be large enough to hold all the + uncompressed data. (The size of the uncompressed data may have been saved + by the compressor for this purpose.) The next operation on this stream must + be inflateEnd to deallocate the decompression state. The use of Z_FINISH + is never required, but can be used to inform inflate that a faster approach + may be used for the single inflate() call. + + In this implementation, inflate() always flushes as much output as + possible to the output buffer, and always uses the faster approach on the + first call. So the only effect of the flush parameter in this implementation + is on the return value of inflate(), as noted below, or when it returns early + because Z_BLOCK is used. + + If a preset dictionary is needed after this call (see inflateSetDictionary + below), inflate sets strm->adler to the adler32 checksum of the dictionary + chosen by the compressor and returns Z_NEED_DICT; otherwise it sets + strm->adler to the adler32 checksum of all output produced so far (that is, + total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described + below. At the end of the stream, inflate() checks that its computed adler32 + checksum is equal to that saved by the compressor and returns Z_STREAM_END + only if the checksum is correct. + + inflate() will decompress and check either zlib-wrapped or gzip-wrapped + deflate data. The header type is detected automatically. Any information + contained in the gzip header is not retained, so applications that need that + information should instead use raw inflate, see inflateInit2() below, or + inflateBack() and perform their own processing of the gzip header and + trailer. + + inflate() returns Z_OK if some progress has been made (more input processed + or more output produced), Z_STREAM_END if the end of the compressed data has + been reached and all uncompressed output has been produced, Z_NEED_DICT if a + preset dictionary is needed at this point, Z_DATA_ERROR if the input data was + corrupted (input stream not conforming to the zlib format or incorrect check + value), Z_STREAM_ERROR if the stream structure was inconsistent (for example + if next_in or next_out was NULL), Z_MEM_ERROR if there was not enough memory, + Z_BUF_ERROR if no progress is possible or if there was not enough room in the + output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and + inflate() can be called again with more input and more output space to + continue decompressing. If Z_DATA_ERROR is returned, the application may then + call inflateSync() to look for a good compression block if a partial recovery + of the data is desired. +*/ + + +ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any + pending output. + + inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state + was inconsistent. In the error case, msg may be set but then points to a + static string (which must not be deallocated). +*/ + + /* Advanced functions */ + +/* + The following functions are needed only in some special applications. +*/ + +/* +ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, + int level, + int method, + int windowBits, + int memLevel, + int strategy)); + + This is another version of deflateInit with more compression options. The + fields next_in, zalloc, zfree and opaque must be initialized before by + the caller. + + The method parameter is the compression method. It must be Z_DEFLATED in + this version of the library. + + The windowBits parameter is the base two logarithm of the window size + (the size of the history buffer). It should be in the range 8..15 for this + version of the library. Larger values of this parameter result in better + compression at the expense of memory usage. The default value is 15 if + deflateInit is used instead. + + windowBits can also be -8..-15 for raw deflate. In this case, -windowBits + determines the window size. deflate() will then generate raw deflate data + with no zlib header or trailer, and will not compute an adler32 check value. + + windowBits can also be greater than 15 for optional gzip encoding. Add + 16 to windowBits to write a simple gzip header and trailer around the + compressed data instead of a zlib wrapper. The gzip header will have no + file name, no extra data, no comment, no modification time (set to zero), + no header crc, and the operating system will be set to 255 (unknown). If a + gzip stream is being written, strm->adler is a crc32 instead of an adler32. + + The memLevel parameter specifies how much memory should be allocated + for the internal compression state. memLevel=1 uses minimum memory but + is slow and reduces compression ratio; memLevel=9 uses maximum memory + for optimal speed. The default value is 8. See zconf.h for total memory + usage as a function of windowBits and memLevel. + + The strategy parameter is used to tune the compression algorithm. Use the + value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a + filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no + string match), or Z_RLE to limit match distances to one (run-length + encoding). Filtered data consists mostly of small values with a somewhat + random distribution. In this case, the compression algorithm is tuned to + compress them better. The effect of Z_FILTERED is to force more Huffman + coding and less string matching; it is somewhat intermediate between + Z_DEFAULT and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as fast as + Z_HUFFMAN_ONLY, but give better compression for PNG image data. The strategy + parameter only affects the compression ratio but not the correctness of the + compressed output even if it is not set appropriately. Z_FIXED prevents the + use of dynamic Huffman codes, allowing for a simpler decoder for special + applications. + + deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if a parameter is invalid (such as an invalid + method). msg is set to null if there is no error message. deflateInit2 does + not perform any compression: this will be done by deflate(). +*/ + +ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, + const Bytef *dictionary, + uInt dictLength)); +/* + Initializes the compression dictionary from the given byte sequence + without producing any compressed output. This function must be called + immediately after deflateInit, deflateInit2 or deflateReset, before any + call of deflate. The compressor and decompressor must use exactly the same + dictionary (see inflateSetDictionary). + + The dictionary should consist of strings (byte sequences) that are likely + to be encountered later in the data to be compressed, with the most commonly + used strings preferably put towards the end of the dictionary. Using a + dictionary is most useful when the data to be compressed is short and can be + predicted with good accuracy; the data can then be compressed better than + with the default empty dictionary. + + Depending on the size of the compression data structures selected by + deflateInit or deflateInit2, a part of the dictionary may in effect be + discarded, for example if the dictionary is larger than the window size in + deflate or deflate2. Thus the strings most likely to be useful should be + put at the end of the dictionary, not at the front. In addition, the + current implementation of deflate will use at most the window size minus + 262 bytes of the provided dictionary. + + Upon return of this function, strm->adler is set to the adler32 value + of the dictionary; the decompressor may later use this value to determine + which dictionary has been used by the compressor. (The adler32 value + applies to the whole dictionary even if only a subset of the dictionary is + actually used by the compressor.) If a raw deflate was requested, then the + adler32 value is not computed and strm->adler is not set. + + deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a + parameter is invalid (such as NULL dictionary) or the stream state is + inconsistent (for example if deflate has already been called for this stream + or if the compression method is bsort). deflateSetDictionary does not + perform any compression: this will be done by deflate(). +*/ + +ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, + z_streamp source)); +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when several compression strategies will be + tried, for example when there are several ways of pre-processing the input + data with a filter. The streams that will be discarded should then be freed + by calling deflateEnd. Note that deflateCopy duplicates the internal + compression state which can be quite large, so this strategy is slow and + can consume lots of memory. + + deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being NULL). msg is left unchanged in both source and + destination. +*/ + +ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); +/* + This function is equivalent to deflateEnd followed by deflateInit, + but does not free and reallocate all the internal compression state. + The stream will keep the same compression level and any other attributes + that may have been set by deflateInit2. + + deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being NULL). +*/ + +ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, + int level, + int strategy)); +/* + Dynamically update the compression level and compression strategy. The + interpretation of level and strategy is as in deflateInit2. This can be + used to switch between compression and straight copy of the input data, or + to switch to a different kind of input data requiring a different + strategy. If the compression level is changed, the input available so far + is compressed with the old level (and may be flushed); the new level will + take effect only at the next call of deflate(). + + Before the call of deflateParams, the stream state must be set as for + a call of deflate(), since the currently available input may have to + be compressed and flushed. In particular, strm->avail_out must be non-zero. + + deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source + stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR + if strm->avail_out was zero. +*/ + +ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, + int good_length, + int max_lazy, + int nice_length, + int max_chain)); +/* + Fine tune deflate's internal compression parameters. This should only be + used by someone who understands the algorithm used by zlib's deflate for + searching for the best matching string, and even then only by the most + fanatic optimizer trying to squeeze out the last compressed bit for their + specific input data. Read the deflate.c source code for the meaning of the + max_lazy, good_length, nice_length, and max_chain parameters. + + deflateTune() can be called after deflateInit() or deflateInit2(), and + returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream. + */ + +ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, + uLong sourceLen)); +/* + deflateBound() returns an upper bound on the compressed size after + deflation of sourceLen bytes. It must be called after deflateInit() + or deflateInit2(). This would be used to allocate an output buffer + for deflation in a single pass, and so would be called before deflate(). +*/ + +ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, + int bits, + int value)); +/* + deflatePrime() inserts bits in the deflate output stream. The intent + is that this function is used to start off the deflate output with the + bits leftover from a previous deflate stream when appending to it. As such, + this function can only be used for raw deflate, and must be used before the + first deflate() call after a deflateInit2() or deflateReset(). bits must be + less than or equal to 16, and that many of the least significant bits of + value will be inserted in the output. + + deflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, + gz_headerp head)); +/* + deflateSetHeader() provides gzip header information for when a gzip + stream is requested by deflateInit2(). deflateSetHeader() may be called + after deflateInit2() or deflateReset() and before the first call of + deflate(). The text, time, os, extra field, name, and comment information + in the provided gz_header structure are written to the gzip header (xflag is + ignored -- the extra flags are set according to the compression level). The + caller must assure that, if not Z_NULL, name and comment are terminated with + a zero byte, and that if extra is not Z_NULL, that extra_len bytes are + available there. If hcrc is true, a gzip header crc is included. Note that + the current versions of the command-line version of gzip (up through version + 1.3.x) do not support header crc's, and will report that it is a "multi-part + gzip file" and give up. + + If deflateSetHeader is not used, the default gzip header has text false, + the time set to zero, and os set to 255, with no extra, name, or comment + fields. The gzip header is returned to the default state by deflateReset(). + + deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +/* +ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, + int windowBits)); + + This is another version of inflateInit with an extra parameter. The + fields next_in, avail_in, zalloc, zfree and opaque must be initialized + before by the caller. + + The windowBits parameter is the base two logarithm of the maximum window + size (the size of the history buffer). It should be in the range 8..15 for + this version of the library. The default value is 15 if inflateInit is used + instead. windowBits must be greater than or equal to the windowBits value + provided to deflateInit2() while compressing, or it must be equal to 15 if + deflateInit2() was not used. If a compressed stream with a larger window + size is given as input, inflate() will return with the error code + Z_DATA_ERROR instead of trying to allocate a larger window. + + windowBits can also be -8..-15 for raw inflate. In this case, -windowBits + determines the window size. inflate() will then process raw deflate data, + not looking for a zlib or gzip header, not generating a check value, and not + looking for any check values for comparison at the end of the stream. This + is for use with other formats that use the deflate compressed data format + such as zip. Those formats provide their own check values. If a custom + format is developed using the raw deflate format for compressed data, it is + recommended that a check value such as an adler32 or a crc32 be applied to + the uncompressed data as is done in the zlib, gzip, and zip formats. For + most applications, the zlib format should be used as is. Note that comments + above on the use in deflateInit2() applies to the magnitude of windowBits. + + windowBits can also be greater than 15 for optional gzip decoding. Add + 32 to windowBits to enable zlib and gzip decoding with automatic header + detection, or add 16 to decode only the gzip format (the zlib format will + return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is + a crc32 instead of an adler32. + + inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if a parameter is invalid (such as a null strm). msg + is set to null if there is no error message. inflateInit2 does not perform + any decompression apart from reading the zlib header if present: this will + be done by inflate(). (So next_in and avail_in may be modified, but next_out + and avail_out are unchanged.) +*/ + +ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, + const Bytef *dictionary, + uInt dictLength)); +/* + Initializes the decompression dictionary from the given uncompressed byte + sequence. This function must be called immediately after a call of inflate, + if that call returned Z_NEED_DICT. The dictionary chosen by the compressor + can be determined from the adler32 value returned by that call of inflate. + The compressor and decompressor must use exactly the same dictionary (see + deflateSetDictionary). For raw inflate, this function can be called + immediately after inflateInit2() or inflateReset() and before any call of + inflate() to set the dictionary. The application must insure that the + dictionary that was used for compression is provided. + + inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a + parameter is invalid (such as NULL dictionary) or the stream state is + inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the + expected one (incorrect adler32 value). inflateSetDictionary does not + perform any decompression: this will be done by subsequent calls of + inflate(). +*/ + +ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); +/* + Skips invalid compressed data until a full flush point (see above the + description of deflate with Z_FULL_FLUSH) can be found, or until all + available input is skipped. No output is provided. + + inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR + if no more input was provided, Z_DATA_ERROR if no flush point has been found, + or Z_STREAM_ERROR if the stream structure was inconsistent. In the success + case, the application may save the current current value of total_in which + indicates where valid compressed data was found. In the error case, the + application may repeatedly call inflateSync, providing more input each time, + until success or end of the input data. +*/ + +ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, + z_streamp source)); +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when randomly accessing a large stream. The + first pass through the stream can periodically record the inflate state, + allowing restarting inflate at those points when randomly accessing the + stream. + + inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being NULL). msg is left unchanged in both source and + destination. +*/ + +ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); +/* + This function is equivalent to inflateEnd followed by inflateInit, + but does not free and reallocate all the internal decompression state. + The stream will keep attributes that may have been set by inflateInit2. + + inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being NULL). +*/ + +ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, + int bits, + int value)); +/* + This function inserts bits in the inflate input stream. The intent is + that this function is used to start inflating at a bit position in the + middle of a byte. The provided bits will be used before any bytes are used + from next_in. This function should only be used with raw inflate, and + should be used before the first inflate() call after inflateInit2() or + inflateReset(). bits must be less than or equal to 16, and that many of the + least significant bits of value will be inserted in the input. + + inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, + gz_headerp head)); +/* + inflateGetHeader() requests that gzip header information be stored in the + provided gz_header structure. inflateGetHeader() may be called after + inflateInit2() or inflateReset(), and before the first call of inflate(). + As inflate() processes the gzip stream, head->done is zero until the header + is completed, at which time head->done is set to one. If a zlib stream is + being decoded, then head->done is set to -1 to indicate that there will be + no gzip header information forthcoming. Note that Z_BLOCK can be used to + force inflate() to return immediately after header processing is complete + and before any actual data is decompressed. + + The text, time, xflags, and os fields are filled in with the gzip header + contents. hcrc is set to true if there is a header CRC. (The header CRC + was valid if done is set to one.) If extra is not Z_NULL, then extra_max + contains the maximum number of bytes to write to extra. Once done is true, + extra_len contains the actual extra field length, and extra contains the + extra field, or that field truncated if extra_max is less than extra_len. + If name is not Z_NULL, then up to name_max characters are written there, + terminated with a zero unless the length is greater than name_max. If + comment is not Z_NULL, then up to comm_max characters are written there, + terminated with a zero unless the length is greater than comm_max. When + any of extra, name, or comment are not Z_NULL and the respective field is + not present in the header, then that field is set to Z_NULL to signal its + absence. This allows the use of deflateSetHeader() with the returned + structure to duplicate the header. However if those fields are set to + allocated memory, then the application will need to save those pointers + elsewhere so that they can be eventually freed. + + If inflateGetHeader is not used, then the header information is simply + discarded. The header is always checked for validity, including the header + CRC if present. inflateReset() will reset the process to discard the header + information. The application would need to call inflateGetHeader() again to + retrieve the header from the next gzip stream. + + inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +/* +ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, + unsigned char FAR *window)); + + Initialize the internal stream state for decompression using inflateBack() + calls. The fields zalloc, zfree and opaque in strm must be initialized + before the call. If zalloc and zfree are Z_NULL, then the default library- + derived memory allocation routines are used. windowBits is the base two + logarithm of the window size, in the range 8..15. window is a caller + supplied buffer of that size. Except for special applications where it is + assured that deflate was used with small window sizes, windowBits must be 15 + and a 32K byte window must be supplied to be able to decompress general + deflate streams. + + See inflateBack() for the usage of these routines. + + inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of + the paramaters are invalid, Z_MEM_ERROR if the internal state could not + be allocated, or Z_VERSION_ERROR if the version of the library does not + match the version of the header file. +*/ + +typedef unsigned (*in_func) OF((void FAR *, unsigned char FAR * FAR *)); +typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); + +ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, + in_func in, void FAR *in_desc, + out_func out, void FAR *out_desc)); +/* + inflateBack() does a raw inflate with a single call using a call-back + interface for input and output. This is more efficient than inflate() for + file i/o applications in that it avoids copying between the output and the + sliding window by simply making the window itself the output buffer. This + function trusts the application to not change the output buffer passed by + the output function, at least until inflateBack() returns. + + inflateBackInit() must be called first to allocate the internal state + and to initialize the state with the user-provided window buffer. + inflateBack() may then be used multiple times to inflate a complete, raw + deflate stream with each call. inflateBackEnd() is then called to free + the allocated state. + + A raw deflate stream is one with no zlib or gzip header or trailer. + This routine would normally be used in a utility that reads zip or gzip + files and writes out uncompressed files. The utility would decode the + header and process the trailer on its own, hence this routine expects + only the raw deflate stream to decompress. This is different from the + normal behavior of inflate(), which expects either a zlib or gzip header and + trailer around the deflate stream. + + inflateBack() uses two subroutines supplied by the caller that are then + called by inflateBack() for input and output. inflateBack() calls those + routines until it reads a complete deflate stream and writes out all of the + uncompressed data, or until it encounters an error. The function's + parameters and return types are defined above in the in_func and out_func + typedefs. inflateBack() will call in(in_desc, &buf) which should return the + number of bytes of provided input, and a pointer to that input in buf. If + there is no input available, in() must return zero--buf is ignored in that + case--and inflateBack() will return a buffer error. inflateBack() will call + out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. out() + should return zero on success, or non-zero on failure. If out() returns + non-zero, inflateBack() will return with an error. Neither in() nor out() + are permitted to change the contents of the window provided to + inflateBackInit(), which is also the buffer that out() uses to write from. + The length written by out() will be at most the window size. Any non-zero + amount of input may be provided by in(). + + For convenience, inflateBack() can be provided input on the first call by + setting strm->next_in and strm->avail_in. If that input is exhausted, then + in() will be called. Therefore strm->next_in must be initialized before + calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called + immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in + must also be initialized, and then if strm->avail_in is not zero, input will + initially be taken from strm->next_in[0 .. strm->avail_in - 1]. + + The in_desc and out_desc parameters of inflateBack() is passed as the + first parameter of in() and out() respectively when they are called. These + descriptors can be optionally used to pass any information that the caller- + supplied in() and out() functions need to do their job. + + On return, inflateBack() will set strm->next_in and strm->avail_in to + pass back any unused input that was provided by the last in() call. The + return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR + if in() or out() returned an error, Z_DATA_ERROR if there was a format + error in the deflate stream (in which case strm->msg is set to indicate the + nature of the error), or Z_STREAM_ERROR if the stream was not properly + initialized. In the case of Z_BUF_ERROR, an input or output error can be + distinguished using strm->next_in which will be Z_NULL only if in() returned + an error. If strm->next is not Z_NULL, then the Z_BUF_ERROR was due to + out() returning non-zero. (in() will always be called before out(), so + strm->next_in is assured to be defined if out() returns non-zero.) Note + that inflateBack() cannot return Z_OK. +*/ + +ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm)); +/* + All memory allocated by inflateBackInit() is freed. + + inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream + state was inconsistent. +*/ + +ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); +/* Return flags indicating compile-time options. + + Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other: + 1.0: size of uInt + 3.2: size of uLong + 5.4: size of voidpf (pointer) + 7.6: size of z_off_t + + Compiler, assembler, and debug options: + 8: DEBUG + 9: ASMV or ASMINF -- use ASM code + 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention + 11: 0 (reserved) + + One-time table building (smaller code, but not thread-safe if true): + 12: BUILDFIXED -- build static block decoding tables when needed + 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed + 14,15: 0 (reserved) + + Library content (indicates missing functionality): + 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking + deflate code when not needed) + 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect + and decode gzip streams (to avoid linking crc code) + 18-19: 0 (reserved) + + Operation variations (changes in library functionality): + 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate + 21: FASTEST -- deflate algorithm with only one, lowest compression level + 22,23: 0 (reserved) + + The sprintf variant used by gzprintf (zero is best): + 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format + 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure! + 26: 0 = returns value, 1 = void -- 1 means inferred string length returned + + Remainder: + 27-31: 0 (reserved) + */ + + + /* utility functions */ + +/* + The following utility functions are implemented on top of the + basic stream-oriented functions. To simplify the interface, some + default options are assumed (compression level and memory usage, + standard memory allocation functions). The source code of these + utility functions can easily be modified if you need special options. +*/ + +ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen)); +/* + Compresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total + size of the destination buffer, which must be at least the value returned + by compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressed buffer. + This function can be used to compress a whole file at once if the + input file is mmap'ed. + compress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer. +*/ + +ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen, + int level)); +/* + Compresses the source buffer into the destination buffer. The level + parameter has the same meaning as in deflateInit. sourceLen is the byte + length of the source buffer. Upon entry, destLen is the total size of the + destination buffer, which must be at least the value returned by + compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressed buffer. + + compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_BUF_ERROR if there was not enough room in the output buffer, + Z_STREAM_ERROR if the level parameter is invalid. +*/ + +ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen)); +/* + compressBound() returns an upper bound on the compressed size after + compress() or compress2() on sourceLen bytes. It would be used before + a compress() or compress2() call to allocate the destination buffer. +*/ + +ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen)); +/* + Decompresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total + size of the destination buffer, which must be large enough to hold the + entire uncompressed data. (The size of the uncompressed data must have + been saved previously by the compressor and transmitted to the decompressor + by some mechanism outside the scope of this compression library.) + Upon exit, destLen is the actual size of the compressed buffer. + This function can be used to decompress a whole file at once if the + input file is mmap'ed. + + uncompress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. +*/ + + +typedef voidp gzFile; + +ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); +/* + Opens a gzip (.gz) file for reading or writing. The mode parameter + is as in fopen ("rb" or "wb") but can also include a compression level + ("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for + Huffman only compression as in "wb1h", or 'R' for run-length encoding + as in "wb1R". (See the description of deflateInit2 for more information + about the strategy parameter.) + + gzopen can be used to read a file which is not in gzip format; in this + case gzread will directly read from the file without decompression. + + gzopen returns NULL if the file could not be opened or if there was + insufficient memory to allocate the (de)compression state; errno + can be checked to distinguish the two cases (if errno is zero, the + zlib error is Z_MEM_ERROR). */ + +ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); +/* + gzdopen() associates a gzFile with the file descriptor fd. File + descriptors are obtained from calls like open, dup, creat, pipe or + fileno (in the file has been previously opened with fopen). + The mode parameter is as in gzopen. + The next call of gzclose on the returned gzFile will also close the + file descriptor fd, just like fclose(fdopen(fd), mode) closes the file + descriptor fd. If you want to keep fd open, use gzdopen(dup(fd), mode). + gzdopen returns NULL if there was insufficient memory to allocate + the (de)compression state. +*/ + +ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); +/* + Dynamically update the compression level or strategy. See the description + of deflateInit2 for the meaning of these parameters. + gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not + opened for writing. +*/ + +ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); +/* + Reads the given number of uncompressed bytes from the compressed file. + If the input file was not in gzip format, gzread copies the given number + of bytes into the buffer. + gzread returns the number of uncompressed bytes actually read (0 for + end of file, -1 for error). */ + +ZEXTERN int ZEXPORT gzwrite OF((gzFile file, + voidpc buf, unsigned len)); +/* + Writes the given number of uncompressed bytes into the compressed file. + gzwrite returns the number of uncompressed bytes actually written + (0 in case of error). +*/ + +ZEXTERN int ZEXPORTVA gzprintf OF((gzFile file, const char *format, ...)); +/* + Converts, formats, and writes the args to the compressed file under + control of the format string, as in fprintf. gzprintf returns the number of + uncompressed bytes actually written (0 in case of error). The number of + uncompressed bytes written is limited to 4095. The caller should assure that + this limit is not exceeded. If it is exceeded, then gzprintf() will return + return an error (0) with nothing written. In this case, there may also be a + buffer overflow with unpredictable consequences, which is possible only if + zlib was compiled with the insecure functions sprintf() or vsprintf() + because the secure snprintf() or vsnprintf() functions were not available. +*/ + +ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); +/* + Writes the given null-terminated string to the compressed file, excluding + the terminating null character. + gzputs returns the number of characters written, or -1 in case of error. +*/ + +ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); +/* + Reads bytes from the compressed file until len-1 characters are read, or + a newline character is read and transferred to buf, or an end-of-file + condition is encountered. The string is then terminated with a null + character. + gzgets returns buf, or Z_NULL in case of error. +*/ + +ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); +/* + Writes c, converted to an unsigned char, into the compressed file. + gzputc returns the value that was written, or -1 in case of error. +*/ + +ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); +/* + Reads one byte from the compressed file. gzgetc returns this byte + or -1 in case of end of file or error. +*/ + +ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); +/* + Push one character back onto the stream to be read again later. + Only one character of push-back is allowed. gzungetc() returns the + character pushed, or -1 on failure. gzungetc() will fail if a + character has been pushed but not read yet, or if c is -1. The pushed + character will be discarded if the stream is repositioned with gzseek() + or gzrewind(). +*/ + +ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); +/* + Flushes all pending output into the compressed file. The parameter + flush is as in the deflate() function. The return value is the zlib + error number (see function gzerror below). gzflush returns Z_OK if + the flush parameter is Z_FINISH and all output could be flushed. + gzflush should be called only when strictly necessary because it can + degrade compression. +*/ + +ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, + z_off_t offset, int whence)); +/* + Sets the starting position for the next gzread or gzwrite on the + given compressed file. The offset represents a number of bytes in the + uncompressed data stream. The whence parameter is defined as in lseek(2); + the value SEEK_END is not supported. + If the file is opened for reading, this function is emulated but can be + extremely slow. If the file is opened for writing, only forward seeks are + supported; gzseek then compresses a sequence of zeroes up to the new + starting position. + + gzseek returns the resulting offset location as measured in bytes from + the beginning of the uncompressed stream, or -1 in case of error, in + particular if the file is opened for writing and the new starting position + would be before the current position. +*/ + +ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); +/* + Rewinds the given file. This function is supported only for reading. + + gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) +*/ + +ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); +/* + Returns the starting position for the next gzread or gzwrite on the + given compressed file. This position represents a number of bytes in the + uncompressed data stream. + + gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) +*/ + +ZEXTERN int ZEXPORT gzeof OF((gzFile file)); +/* + Returns 1 when EOF has previously been detected reading the given + input stream, otherwise zero. +*/ + +ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); +/* + Returns 1 if file is being read directly without decompression, otherwise + zero. +*/ + +ZEXTERN int ZEXPORT gzclose OF((gzFile file)); +/* + Flushes all pending output if necessary, closes the compressed file + and deallocates all the (de)compression state. The return value is the zlib + error number (see function gzerror below). +*/ + +ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); +/* + Returns the error message for the last error which occurred on the + given compressed file. errnum is set to zlib error number. If an + error occurred in the file system and not in the compression library, + errnum is set to Z_ERRNO and the application may consult errno + to get the exact error code. +*/ + +ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); +/* + Clears the error and end-of-file flags for file. This is analogous to the + clearerr() function in stdio. This is useful for continuing to read a gzip + file that is being written concurrently. +*/ + + /* checksum functions */ + +/* + These functions are not related to compression but are exported + anyway because they might be useful in applications using the + compression library. +*/ + +ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); +/* + Update a running Adler-32 checksum with the bytes buf[0..len-1] and + return the updated checksum. If buf is NULL, this function returns + the required initial value for the checksum. + An Adler-32 checksum is almost as reliable as a CRC32 but can be computed + much faster. Usage example: + + uLong adler = adler32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + adler = adler32(adler, buffer, length); + } + if (adler != original_adler) error(); +*/ + +ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, + z_off_t len2)); +/* + Combine two Adler-32 checksums into one. For two sequences of bytes, seq1 + and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for + each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of + seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. +*/ + +ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); +/* + Update a running CRC-32 with the bytes buf[0..len-1] and return the + updated CRC-32. If buf is NULL, this function returns the required initial + value for the for the crc. Pre- and post-conditioning (one's complement) is + performed within this function so it shouldn't be done by the application. + Usage example: + + uLong crc = crc32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + crc = crc32(crc, buffer, length); + } + if (crc != original_crc) error(); +*/ + +ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); + +/* + Combine two CRC-32 check values into one. For two sequences of bytes, + seq1 and seq2 with lengths len1 and len2, CRC-32 check values were + calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32 + check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and + len2. +*/ + + + /* various hacks, don't look :) */ + +/* deflateInit and inflateInit are macros to allow checking the zlib version + * and the compiler's view of z_stream: + */ +ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method, + int windowBits, int memLevel, + int strategy, const char *version, + int stream_size)); +ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, + unsigned char FAR *window, + const char *version, + int stream_size)); +#define deflateInit(strm, level) \ + deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream)) +#define inflateInit(strm) \ + inflateInit_((strm), ZLIB_VERSION, sizeof(z_stream)) +#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ + deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ + (strategy), ZLIB_VERSION, sizeof(z_stream)) +#define inflateInit2(strm, windowBits) \ + inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream)) +#define inflateBackInit(strm, windowBits, window) \ + inflateBackInit_((strm), (windowBits), (window), \ + ZLIB_VERSION, sizeof(z_stream)) + + +#if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL) + struct internal_state {int dummy;}; /* hack for buggy compilers */ +#endif + +ZEXTERN const char * ZEXPORT zError OF((int)); +ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp z)); +ZEXTERN const uLongf * ZEXPORT get_crc_table OF((void)); + +#ifdef __cplusplus +} +#endif + +#endif /* ZLIB_H */ diff --git a/tools/bsnes/lib/zlib/zutil.c b/tools/bsnes/lib/zlib/zutil.c new file mode 100755 index 0000000..8b278e3 --- /dev/null +++ b/tools/bsnes/lib/zlib/zutil.c @@ -0,0 +1,318 @@ +/* zutil.c -- target dependent utility functions for the compression library + * Copyright (C) 1995-2005 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id: zutil.c,v 1.3 2005/07/27 18:15:11 nach Exp $ */ + +#include "zutil.h" + +#ifndef NO_DUMMY_DECL +struct internal_state {int dummy;}; /* for buggy compilers */ +#endif + +const char * const z_errmsg[10] = { +"need dictionary", /* Z_NEED_DICT 2 */ +"stream end", /* Z_STREAM_END 1 */ +"", /* Z_OK 0 */ +"file error", /* Z_ERRNO (-1) */ +"stream error", /* Z_STREAM_ERROR (-2) */ +"data error", /* Z_DATA_ERROR (-3) */ +"insufficient memory", /* Z_MEM_ERROR (-4) */ +"buffer error", /* Z_BUF_ERROR (-5) */ +"incompatible version",/* Z_VERSION_ERROR (-6) */ +""}; + + +const char * ZEXPORT zlibVersion() +{ + return ZLIB_VERSION; +} + +uLong ZEXPORT zlibCompileFlags() +{ + uLong flags; + + flags = 0; + switch (sizeof(uInt)) { + case 2: break; + case 4: flags += 1; break; + case 8: flags += 2; break; + default: flags += 3; + } + switch (sizeof(uLong)) { + case 2: break; + case 4: flags += 1 << 2; break; + case 8: flags += 2 << 2; break; + default: flags += 3 << 2; + } + switch (sizeof(voidpf)) { + case 2: break; + case 4: flags += 1 << 4; break; + case 8: flags += 2 << 4; break; + default: flags += 3 << 4; + } + switch (sizeof(z_off_t)) { + case 2: break; + case 4: flags += 1 << 6; break; + case 8: flags += 2 << 6; break; + default: flags += 3 << 6; + } +#ifdef DEBUG + flags += 1 << 8; +#endif +#if defined(ASMV) || defined(ASMINF) + flags += 1 << 9; +#endif +#ifdef ZLIB_WINAPI + flags += 1 << 10; +#endif +#ifdef BUILDFIXED + flags += 1 << 12; +#endif +#ifdef DYNAMIC_CRC_TABLE + flags += 1 << 13; +#endif +#ifdef NO_GZCOMPRESS + flags += 1L << 16; +#endif +#ifdef NO_GZIP + flags += 1L << 17; +#endif +#ifdef PKZIP_BUG_WORKAROUND + flags += 1L << 20; +#endif +#ifdef FASTEST + flags += 1L << 21; +#endif +#ifdef STDC +# ifdef NO_vsnprintf + flags += 1L << 25; +# ifdef HAS_vsprintf_void + flags += 1L << 26; +# endif +# else +# ifdef HAS_vsnprintf_void + flags += 1L << 26; +# endif +# endif +#else + flags += 1L << 24; +# ifdef NO_snprintf + flags += 1L << 25; +# ifdef HAS_sprintf_void + flags += 1L << 26; +# endif +# else +# ifdef HAS_snprintf_void + flags += 1L << 26; +# endif +# endif +#endif + return flags; +} + +#ifdef DEBUG + +# ifndef verbose +# define verbose 0 +# endif +int z_verbose = verbose; + +void z_error (m) + char *m; +{ + fprintf(stderr, "%s\n", m); + exit(1); +} +#endif + +/* exported to allow conversion of error code to string for compress() and + * uncompress() + */ +const char * ZEXPORT zError(err) + int err; +{ + return ERR_MSG(err); +} + +#if defined(_WIN32_WCE) + /* The Microsoft C Run-Time Library for Windows CE doesn't have + * errno. We define it as a global variable to simplify porting. + * Its value is always 0 and should not be used. + */ + int errno = 0; +#endif + +#ifndef HAVE_MEMCPY + +void zmemcpy(dest, source, len) + Bytef* dest; + const Bytef* source; + uInt len; +{ + if (len == 0) return; + do { + *dest++ = *source++; /* ??? to be unrolled */ + } while (--len != 0); +} + +int zmemcmp(s1, s2, len) + const Bytef* s1; + const Bytef* s2; + uInt len; +{ + uInt j; + + for (j = 0; j < len; j++) { + if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1; + } + return 0; +} + +void zmemzero(dest, len) + Bytef* dest; + uInt len; +{ + if (len == 0) return; + do { + *dest++ = 0; /* ??? to be unrolled */ + } while (--len != 0); +} +#endif + + +#ifdef SYS16BIT + +#ifdef __TURBOC__ +/* Turbo C in 16-bit mode */ + +# define MY_ZCALLOC + +/* Turbo C malloc() does not allow dynamic allocation of 64K bytes + * and farmalloc(64K) returns a pointer with an offset of 8, so we + * must fix the pointer. Warning: the pointer must be put back to its + * original form in order to free it, use zcfree(). + */ + +#define MAX_PTR 10 +/* 10*64K = 640K */ + +local int next_ptr = 0; + +typedef struct ptr_table_s { + voidpf org_ptr; + voidpf new_ptr; +} ptr_table; + +local ptr_table table[MAX_PTR]; +/* This table is used to remember the original form of pointers + * to large buffers (64K). Such pointers are normalized with a zero offset. + * Since MSDOS is not a preemptive multitasking OS, this table is not + * protected from concurrent access. This hack doesn't work anyway on + * a protected system like OS/2. Use Microsoft C instead. + */ + +voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) +{ + voidpf buf = opaque; /* just to make some compilers happy */ + ulg bsize = (ulg)items*size; + + /* If we allocate less than 65520 bytes, we assume that farmalloc + * will return a usable pointer which doesn't have to be normalized. + */ + if (bsize < 65520L) { + buf = farmalloc(bsize); + if (*(ush*)&buf != 0) return buf; + } else { + buf = farmalloc(bsize + 16L); + } + if (buf == NULL || next_ptr >= MAX_PTR) return NULL; + table[next_ptr].org_ptr = buf; + + /* Normalize the pointer to seg:0 */ + *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4; + *(ush*)&buf = 0; + table[next_ptr++].new_ptr = buf; + return buf; +} + +void zcfree (voidpf opaque, voidpf ptr) +{ + int n; + if (*(ush*)&ptr != 0) { /* object < 64K */ + farfree(ptr); + return; + } + /* Find the original pointer */ + for (n = 0; n < next_ptr; n++) { + if (ptr != table[n].new_ptr) continue; + + farfree(table[n].org_ptr); + while (++n < next_ptr) { + table[n-1] = table[n]; + } + next_ptr--; + return; + } + ptr = opaque; /* just to make some compilers happy */ + Assert(0, "zcfree: ptr not found"); +} + +#endif /* __TURBOC__ */ + + +#ifdef M_I86 +/* Microsoft C in 16-bit mode */ + +# define MY_ZCALLOC + +#if (!defined(_MSC_VER) || (_MSC_VER <= 600)) +# define _halloc halloc +# define _hfree hfree +#endif + +voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) +{ + if (opaque) opaque = 0; /* to make compiler happy */ + return _halloc((long)items, size); +} + +void zcfree (voidpf opaque, voidpf ptr) +{ + if (opaque) opaque = 0; /* to make compiler happy */ + _hfree(ptr); +} + +#endif /* M_I86 */ + +#endif /* SYS16BIT */ + + +#ifndef MY_ZCALLOC /* Any system without a special alloc function */ + +#ifndef STDC +extern voidp malloc OF((uInt size)); +extern voidp calloc OF((uInt items, uInt size)); +extern void free OF((voidpf ptr)); +#endif + +voidpf zcalloc (opaque, items, size) + voidpf opaque; + unsigned items; + unsigned size; +{ + if (opaque) items += size - size; /* make compiler happy */ + return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) : + (voidpf)calloc(items, size); +} + +void zcfree (opaque, ptr) + voidpf opaque; + voidpf ptr; +{ + free(ptr); + if (opaque) return; /* make compiler happy */ +} + +#endif /* MY_ZCALLOC */ diff --git a/tools/bsnes/lib/zlib/zutil.h b/tools/bsnes/lib/zlib/zutil.h new file mode 100755 index 0000000..c7ad800 --- /dev/null +++ b/tools/bsnes/lib/zlib/zutil.h @@ -0,0 +1,269 @@ +/* zutil.h -- internal interface and configuration of the compression library + * Copyright (C) 1995-2005 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* @(#) $Id: zutil.h,v 1.3 2005/07/27 18:15:11 nach Exp $ */ + +#ifndef ZUTIL_H +#define ZUTIL_H + +#define ZLIB_INTERNAL +#include "zlib.h" + +#ifdef STDC +# ifndef _WIN32_WCE +# include +# endif +# include +# include +#endif +#ifdef NO_ERRNO_H +# ifdef _WIN32_WCE + /* The Microsoft C Run-Time Library for Windows CE doesn't have + * errno. We define it as a global variable to simplify porting. + * Its value is always 0 and should not be used. We rename it to + * avoid conflict with other libraries that use the same workaround. + */ +# define errno z_errno +# endif + extern int errno; +#else +# ifndef _WIN32_WCE +# include +# endif +#endif + +#ifndef local +# define local static +#endif +/* compile with -Dlocal if your debugger can't find static symbols */ + +typedef unsigned char uch; +typedef uch FAR uchf; +typedef unsigned short ush; +typedef ush FAR ushf; +typedef unsigned long ulg; + +extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ +/* (size given to avoid silly warnings with Visual C++) */ + +#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)] + +#define ERR_RETURN(strm,err) \ + return (strm->msg = (char*)ERR_MSG(err), (err)) +/* To be used only when the state is known to be valid */ + + /* common constants */ + +#ifndef DEF_WBITS +# define DEF_WBITS MAX_WBITS +#endif +/* default windowBits for decompression. MAX_WBITS is for compression only */ + +#if MAX_MEM_LEVEL >= 8 +# define DEF_MEM_LEVEL 8 +#else +# define DEF_MEM_LEVEL MAX_MEM_LEVEL +#endif +/* default memLevel */ + +#define STORED_BLOCK 0 +#define STATIC_TREES 1 +#define DYN_TREES 2 +/* The three kinds of block type */ + +#define MIN_MATCH 3 +#define MAX_MATCH 258 +/* The minimum and maximum match lengths */ + +#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */ + + /* target dependencies */ + +#if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32)) +# define OS_CODE 0x00 +# if defined(__TURBOC__) || defined(__BORLANDC__) +# if(__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__)) + /* Allow compilation with ANSI keywords only enabled */ + void _Cdecl farfree( void *block ); + void *_Cdecl farmalloc( unsigned long nbytes ); +# else +# include +# endif +# else /* MSC or DJGPP */ +# include +# endif +#endif + +#ifdef AMIGA +# define OS_CODE 0x01 +#endif + +#if defined(VAXC) || defined(VMS) +# define OS_CODE 0x02 +# define F_OPEN(name, mode) \ + fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512") +#endif + +#if defined(ATARI) || defined(atarist) +# define OS_CODE 0x05 +#endif + +#ifdef OS2 +# define OS_CODE 0x06 +# ifdef M_I86 + #include +# endif +#endif + +#if defined(MACOS) || defined(TARGET_OS_MAC) +# define OS_CODE 0x07 +# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os +# include /* for fdopen */ +# else +# ifndef fdopen +# define fdopen(fd,mode) NULL /* No fdopen() */ +# endif +# endif +#endif + +#ifdef TOPS20 +# define OS_CODE 0x0a +#endif + +#ifdef WIN32 +# ifndef __CYGWIN__ /* Cygwin is Unix, not Win32 */ +# define OS_CODE 0x0b +# endif +#endif + +#ifdef __50SERIES /* Prime/PRIMOS */ +# define OS_CODE 0x0f +#endif + +#if defined(_BEOS_) || defined(RISCOS) +# define fdopen(fd,mode) NULL /* No fdopen() */ +#endif + +#if (defined(_MSC_VER) && (_MSC_VER > 600)) +# if defined(_WIN32_WCE) +# define fdopen(fd,mode) NULL /* No fdopen() */ +# ifndef _PTRDIFF_T_DEFINED + typedef int ptrdiff_t; +# define _PTRDIFF_T_DEFINED +# endif +# else +# define fdopen(fd,type) _fdopen(fd,type) +# endif +#endif + + /* common defaults */ + +#ifndef OS_CODE +# define OS_CODE 0x03 /* assume Unix */ +#endif + +#ifndef F_OPEN +# define F_OPEN(name, mode) fopen((name), (mode)) +#endif + + /* functions */ + +#if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif +#if defined(__CYGWIN__) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif +#ifndef HAVE_VSNPRINTF +# ifdef MSDOS + /* vsnprintf may exist on some MS-DOS compilers (DJGPP?), + but for now we just assume it doesn't. */ +# define NO_vsnprintf +# endif +# ifdef __TURBOC__ +# define NO_vsnprintf +# endif +# ifdef WIN32 + /* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */ +# if !defined(vsnprintf) && !defined(NO_vsnprintf) +# define vsnprintf _vsnprintf +# endif +# endif +# ifdef __SASC +# define NO_vsnprintf +# endif +#endif +#ifdef VMS +# define NO_vsnprintf +#endif + +#if defined(pyr) +# define NO_MEMCPY +#endif +#if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__) + /* Use our own functions for small and medium model with MSC <= 5.0. + * You may have to use the same strategy for Borland C (untested). + * The __SC__ check is for Symantec. + */ +# define NO_MEMCPY +#endif +#if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY) +# define HAVE_MEMCPY +#endif +#ifdef HAVE_MEMCPY +# ifdef SMALL_MEDIUM /* MSDOS small or medium model */ +# define zmemcpy _fmemcpy +# define zmemcmp _fmemcmp +# define zmemzero(dest, len) _fmemset(dest, 0, len) +# else +# define zmemcpy memcpy +# define zmemcmp memcmp +# define zmemzero(dest, len) memset(dest, 0, len) +# endif +#else + extern void zmemcpy OF((Bytef* dest, const Bytef* source, uInt len)); + extern int zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len)); + extern void zmemzero OF((Bytef* dest, uInt len)); +#endif + +/* Diagnostic functions */ +#ifdef DEBUG +# include + extern int z_verbose; + extern void z_error OF((char *m)); +# define Assert(cond,msg) {if(!(cond)) z_error(msg);} +# define Trace(x) {if (z_verbose>=0) fprintf x ;} +# define Tracev(x) {if (z_verbose>0) fprintf x ;} +# define Tracevv(x) {if (z_verbose>1) fprintf x ;} +# define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;} +# define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;} +#else +# define Assert(cond,msg) +# define Trace(x) +# define Tracev(x) +# define Tracevv(x) +# define Tracec(c,x) +# define Tracecv(c,x) +#endif + + +voidpf zcalloc OF((voidpf opaque, unsigned items, unsigned size)); +void zcfree OF((voidpf opaque, voidpf ptr)); + +#define ZALLOC(strm, items, size) \ + (*((strm)->zalloc))((strm)->opaque, (items), (size)) +#define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr)) +#define TRY_FREE(s, p) {if (p) ZFREE(s, p);} + +#endif /* ZUTIL_H */ diff --git a/tools/bsnes/smp/core/bpp.sh b/tools/bsnes/smp/core/bpp.sh new file mode 100755 index 0000000..2520859 --- /dev/null +++ b/tools/bsnes/smp/core/bpp.sh @@ -0,0 +1,4 @@ +clear +bpp opcode_functions.cpp opcode_functions.bpp +bpp opcode_headers.hpp opcode_headers.bpp + diff --git a/tools/bsnes/smp/core/core.cpp b/tools/bsnes/smp/core/core.cpp new file mode 100755 index 0000000..e710263 --- /dev/null +++ b/tools/bsnes/smp/core/core.cpp @@ -0,0 +1,16 @@ +#include <../base.hpp> + +#define SMPCORE_CPP +namespace SNES { + +#include "opcode_algorithms.cpp" +#include "opcode_functions.cpp" +#include "opcode_table.cpp" +#include "disasm/disasm.cpp" + +SMPcore::SMPcore() { + initialize_opcode_table(); +} + +}; + diff --git a/tools/bsnes/smp/core/core.hpp b/tools/bsnes/smp/core/core.hpp new file mode 100755 index 0000000..9865fd8 --- /dev/null +++ b/tools/bsnes/smp/core/core.hpp @@ -0,0 +1,36 @@ +class SMPcore { +public: + #include "registers.hpp" + #include "memory.hpp" + #include "opcode_headers.hpp" + #include "disasm/disasm.hpp" + + regs_t regs; + uint16 dp, sp, rd, wr, bit, ya; + + virtual void op_io() = 0; + virtual uint8_t op_read(uint16_t addr) = 0; + virtual void op_write(uint16_t addr, uint8_t data) = 0; + + uint8 op_adc (uint8 x, uint8 y); + uint16 op_addw(uint16 x, uint16 y); + uint8 op_and (uint8 x, uint8 y); + uint8 op_cmp (uint8 x, uint8 y); + uint16 op_cmpw(uint16 x, uint16 y); + uint8 op_eor (uint8 x, uint8 y); + uint8 op_inc (uint8 x); + uint8 op_dec (uint8 x); + uint8 op_or (uint8 x, uint8 y); + uint8 op_sbc (uint8 x, uint8 y); + uint16 op_subw(uint16 x, uint16 y); + uint8 op_asl (uint8 x); + uint8 op_lsr (uint8 x); + uint8 op_rol (uint8 x); + uint8 op_ror (uint8 x); + + void (SMPcore::*opcode_table[256])(); + void initialize_opcode_table(); + + SMPcore(); +}; + diff --git a/tools/bsnes/smp/core/disasm/disasm.cpp b/tools/bsnes/smp/core/disasm/disasm.cpp new file mode 100755 index 0000000..3cab4ff --- /dev/null +++ b/tools/bsnes/smp/core/disasm/disasm.cpp @@ -0,0 +1,305 @@ +#ifdef SMPCORE_CPP + +uint16 SMPcore::__relb(int8 offset, int op_len) { + uint16 pc = regs.pc + op_len; + return pc + offset; +} + +void SMPcore::disassemble_opcode(char *output) { + char *s, t[512]; + uint8 op, op0, op1; + uint16 opw, opdp0, opdp1; + s = output; + + sprintf(s, "..%.4x ", regs.pc); + + //TODO: read from IPLROM when applicable + op = memory::apuram[(uint16_t)(regs.pc + 0)]; + op0 = memory::apuram[(uint16_t)(regs.pc + 1)]; + op1 = memory::apuram[(uint16_t)(regs.pc + 2)]; + opw = (op0) | (op1 << 8); + opdp0 = ((unsigned)regs.p.p << 8) + op0; + opdp1 = ((unsigned)regs.p.p << 8) + op1; + + strcpy(t, " "); + + switch(op) { + case 0x00: sprintf(t, "nop"); break; + case 0x01: sprintf(t, "tcall 0"); break; + case 0x02: sprintf(t, "set0 $%.3x", opdp0); break; + case 0x03: sprintf(t, "bbs0 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break; + case 0x04: sprintf(t, "or a,$%.3x", opdp0); break; + case 0x05: sprintf(t, "or a,$%.4x", opw); break; + case 0x06: sprintf(t, "or a,(x)"); break; + case 0x07: sprintf(t, "or a,($%.3x+x)", opdp0); break; + case 0x08: sprintf(t, "or a,#$%.2x", op0); break; + case 0x09: sprintf(t, "or $%.3x,$%.3x", opdp1, opdp0); break; + case 0x0a: sprintf(t, "or1 c,$%.4x:%d", opw & 0x1fff, opw >> 13); break; + case 0x0b: sprintf(t, "asl $%.3x", opdp0); break; + case 0x0c: sprintf(t, "asl $%.4x", opw); break; + case 0x0d: sprintf(t, "push p"); break; + case 0x0e: sprintf(t, "tset $%.4x,a", opw); break; + case 0x0f: sprintf(t, "brk"); break; + case 0x10: sprintf(t, "bpl $%.4x", __relb(op0, 2)); break; + case 0x11: sprintf(t, "tcall 1"); break; + case 0x12: sprintf(t, "clr0 $%.3x", opdp0); break; + case 0x13: sprintf(t, "bbc0 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break; + case 0x14: sprintf(t, "or a,$%.3x+x", opdp0); break; + case 0x15: sprintf(t, "or a,$%.4x+x", opw); break; + case 0x16: sprintf(t, "or a,$%.4x+y", opw); break; + case 0x17: sprintf(t, "or a,($%.3x)+y", opdp0); break; + case 0x18: sprintf(t, "or $%.3x,#$%.2x", opdp1, op0); break; + case 0x19: sprintf(t, "or (x),(y)"); break; + case 0x1a: sprintf(t, "decw $%.3x", opdp0); break; + case 0x1b: sprintf(t, "asl $%.3x+x", opdp0); break; + case 0x1c: sprintf(t, "asl a"); break; + case 0x1d: sprintf(t, "dec x"); break; + case 0x1e: sprintf(t, "cmp x,$%.4x", opw); break; + case 0x1f: sprintf(t, "jmp ($%.4x+x)", opw); break; + case 0x20: sprintf(t, "clrp"); break; + case 0x21: sprintf(t, "tcall 2"); break; + case 0x22: sprintf(t, "set1 $%.3x", opdp0); break; + case 0x23: sprintf(t, "bbs1 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break; + case 0x24: sprintf(t, "and a,$%.3x", opdp0); break; + case 0x25: sprintf(t, "and a,$%.4x", opw); break; + case 0x26: sprintf(t, "and a,(x)"); break; + case 0x27: sprintf(t, "and a,($%.3x+x)", opdp0); break; + case 0x28: sprintf(t, "and a,#$%.2x", op0); break; + case 0x29: sprintf(t, "and $%.3x,$%.3x", opdp1, opdp0); break; + case 0x2a: sprintf(t, "or1 c,!$%.4x:%d", opw & 0x1fff, opw >> 13); break; + case 0x2b: sprintf(t, "rol $%.3x", opdp0); break; + case 0x2c: sprintf(t, "rol $%.4x", opw); break; + case 0x2d: sprintf(t, "push a"); break; + case 0x2e: sprintf(t, "cbne $%.3x,$%.4x", opdp0, __relb(op1, 3)); break; + case 0x2f: sprintf(t, "bra $%.4x", __relb(op0, 2)); break; + case 0x30: sprintf(t, "bmi $%.4x", __relb(op0, 2)); break; + case 0x31: sprintf(t, "tcall 3"); break; + case 0x32: sprintf(t, "clr1 $%.3x", opdp0); break; + case 0x33: sprintf(t, "bbc1 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break; + case 0x34: sprintf(t, "and a,$%.3x+x", opdp0); break; + case 0x35: sprintf(t, "and a,$%.4x+x", opw); break; + case 0x36: sprintf(t, "and a,$%.4x+y", opw); break; + case 0x37: sprintf(t, "and a,($%.3x)+y", opdp0); break; + case 0x38: sprintf(t, "and $%.3x,#$%.2x", opdp1, op0); break; + case 0x39: sprintf(t, "and (x),(y)"); break; + case 0x3a: sprintf(t, "incw $%.3x", opdp0); break; + case 0x3b: sprintf(t, "rol $%.3x+x", opdp0); break; + case 0x3c: sprintf(t, "rol a"); break; + case 0x3d: sprintf(t, "inc x"); break; + case 0x3e: sprintf(t, "cmp x,$%.3x", opdp0); break; + case 0x3f: sprintf(t, "call $%.4x", opw); break; + case 0x40: sprintf(t, "setp"); break; + case 0x41: sprintf(t, "tcall 4"); break; + case 0x42: sprintf(t, "set2 $%.3x", opdp0); break; + case 0x43: sprintf(t, "bbs2 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break; + case 0x44: sprintf(t, "eor a,$%.3x", opdp0); break; + case 0x45: sprintf(t, "eor a,$%.4x", opw); break; + case 0x46: sprintf(t, "eor a,(x)"); break; + case 0x47: sprintf(t, "eor a,($%.3x+x)", opdp0); break; + case 0x48: sprintf(t, "eor a,#$%.2x", op0); break; + case 0x49: sprintf(t, "eor $%.3x,$%.3x", opdp1, opdp0); break; + case 0x4a: sprintf(t, "and1 c,$%.4x:%d", opw & 0x1fff, opw >> 13); break; + case 0x4b: sprintf(t, "lsr $%.3x", opdp0); break; + case 0x4c: sprintf(t, "lsr $%.4x", opw); break; + case 0x4d: sprintf(t, "push x"); break; + case 0x4e: sprintf(t, "tclr $%.4x,a", opw); break; + case 0x4f: sprintf(t, "pcall $ff%.2x", op0); break; + case 0x50: sprintf(t, "bvc $%.4x", __relb(op0, 2)); break; + case 0x51: sprintf(t, "tcall 5"); break; + case 0x52: sprintf(t, "clr2 $%.3x", opdp0); break; + case 0x53: sprintf(t, "bbc2 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break; + case 0x54: sprintf(t, "eor a,$%.3x+x", opdp0); break; + case 0x55: sprintf(t, "eor a,$%.4x+x", opw); break; + case 0x56: sprintf(t, "eor a,$%.4x+y", opw); break; + case 0x57: sprintf(t, "eor a,($%.3x)+y", opdp0); break; + case 0x58: sprintf(t, "eor $%.3x,#$%.2x", opdp1, op0); break; + case 0x59: sprintf(t, "eor (x),(y)"); break; + case 0x5a: sprintf(t, "cmpw ya,$%.3x", opdp0); break; + case 0x5b: sprintf(t, "lsr $%.3x+x", opdp0); break; + case 0x5c: sprintf(t, "lsr a"); break; + case 0x5d: sprintf(t, "mov x,a"); break; + case 0x5e: sprintf(t, "cmp y,$%.4x", opw); break; + case 0x5f: sprintf(t, "jmp $%.4x", opw); break; + case 0x60: sprintf(t, "clrc"); break; + case 0x61: sprintf(t, "tcall 6"); break; + case 0x62: sprintf(t, "set3 $%.3x", opdp0); break; + case 0x63: sprintf(t, "bbs3 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break; + case 0x64: sprintf(t, "cmp a,$%.3x", opdp0); break; + case 0x65: sprintf(t, "cmp a,$%.4x", opw); break; + case 0x66: sprintf(t, "cmp a,(x)"); break; + case 0x67: sprintf(t, "cmp a,($%.3x+x)", opdp0); break; + case 0x68: sprintf(t, "cmp a,#$%.2x", op0); break; + case 0x69: sprintf(t, "cmp $%.3x,$%.3x", opdp1, opdp0); break; + case 0x6a: sprintf(t, "and1 c,!$%.4x:%d", opw & 0x1fff, opw >> 13); break; + case 0x6b: sprintf(t, "ror $%.3x", opdp0); break; + case 0x6c: sprintf(t, "ror $%.4x", opw); break; + case 0x6d: sprintf(t, "push y"); break; + case 0x6e: sprintf(t, "dbnz $%.3x,$%.4x", opdp0, __relb(op1, 3)); break; + case 0x6f: sprintf(t, "ret"); break; + case 0x70: sprintf(t, "bvs $%.4x", __relb(op0, 2)); break; + case 0x71: sprintf(t, "tcall 7"); break; + case 0x72: sprintf(t, "clr3 $%.3x", opdp0); break; + case 0x73: sprintf(t, "bbc3 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break; + case 0x74: sprintf(t, "cmp a,$%.3x+x", opdp0); break; + case 0x75: sprintf(t, "cmp a,$%.4x+x", opw); break; + case 0x76: sprintf(t, "cmp a,$%.4x+y", opw); break; + case 0x77: sprintf(t, "cmp a,($%.3x)+y", opdp0); break; + case 0x78: sprintf(t, "cmp $%.3x,#$%.2x", opdp1, op0); break; + case 0x79: sprintf(t, "cmp (x),(y)"); break; + case 0x7a: sprintf(t, "addw ya,$%.3x", opdp0); break; + case 0x7b: sprintf(t, "ror $%.3x+x", opdp0); break; + case 0x7c: sprintf(t, "ror a"); break; + case 0x7d: sprintf(t, "mov a,x"); break; + case 0x7e: sprintf(t, "cmp y,$%.3x", opdp0); break; + case 0x7f: sprintf(t, "reti"); break; + case 0x80: sprintf(t, "setc"); break; + case 0x81: sprintf(t, "tcall 8"); break; + case 0x82: sprintf(t, "set4 $%.3x", opdp0); break; + case 0x83: sprintf(t, "bbs4 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break; + case 0x84: sprintf(t, "adc a,$%.3x", opdp0); break; + case 0x85: sprintf(t, "adc a,$%.4x", opw); break; + case 0x86: sprintf(t, "adc a,(x)"); break; + case 0x87: sprintf(t, "adc a,($%.3x+x)", opdp0); break; + case 0x88: sprintf(t, "adc a,#$%.2x", op0); break; + case 0x89: sprintf(t, "adc $%.3x,$%.3x", opdp1, opdp0); break; + case 0x8a: sprintf(t, "eor1 c,$%.4x:%d", opw & 0x1fff, opw >> 13); break; + case 0x8b: sprintf(t, "dec $%.3x", opdp0); break; + case 0x8c: sprintf(t, "dec $%.4x", opw); break; + case 0x8d: sprintf(t, "mov y,#$%.2x", op0); break; + case 0x8e: sprintf(t, "pop p"); break; + case 0x8f: sprintf(t, "mov $%.3x,#$%.2x", opdp1, op0); break; + case 0x90: sprintf(t, "bcc $%.4x", __relb(op0, 2)); break; + case 0x91: sprintf(t, "tcall 9"); break; + case 0x92: sprintf(t, "clr4 $%.3x", opdp0); break; + case 0x93: sprintf(t, "bbc4 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break; + case 0x94: sprintf(t, "adc a,$%.3x+x", opdp0); break; + case 0x95: sprintf(t, "adc a,$%.4x+x", opw); break; + case 0x96: sprintf(t, "adc a,$%.4x+y", opw); break; + case 0x97: sprintf(t, "adc a,($%.3x)+y", opdp0); break; + case 0x98: sprintf(t, "adc $%.3x,#$%.2x", opdp1, op0); break; + case 0x99: sprintf(t, "adc (x),(y)"); break; + case 0x9a: sprintf(t, "subw ya,$%.3x", opdp0); break; + case 0x9b: sprintf(t, "dec $%.3x+x", opdp0); break; + case 0x9c: sprintf(t, "dec a"); break; + case 0x9d: sprintf(t, "mov x,sp"); break; + case 0x9e: sprintf(t, "div ya,x"); break; + case 0x9f: sprintf(t, "xcn a"); break; + case 0xa0: sprintf(t, "ei"); break; + case 0xa1: sprintf(t, "tcall 10"); break; + case 0xa2: sprintf(t, "set5 $%.3x", opdp0); break; + case 0xa3: sprintf(t, "bbs5 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break; + case 0xa4: sprintf(t, "sbc a,$%.3x", opdp0); break; + case 0xa5: sprintf(t, "sbc a,$%.4x", opw); break; + case 0xa6: sprintf(t, "sbc a,(x)"); break; + case 0xa7: sprintf(t, "sbc a,($%.3x+x)", opdp0); break; + case 0xa8: sprintf(t, "sbc a,#$%.2x", op0); break; + case 0xa9: sprintf(t, "sbc $%.3x,$%.3x", opdp1, opdp0); break; + case 0xaa: sprintf(t, "mov1 c,$%.4x:%d", opw & 0x1fff, opw >> 13); break; + case 0xab: sprintf(t, "inc $%.3x", opdp0); break; + case 0xac: sprintf(t, "inc $%.4x", opw); break; + case 0xad: sprintf(t, "cmp y,#$%.2x", op0); break; + case 0xae: sprintf(t, "pop a"); break; + case 0xaf: sprintf(t, "mov (x)+,a"); break; + case 0xb0: sprintf(t, "bcs $%.4x", __relb(op0, 2)); break; + case 0xb1: sprintf(t, "tcall 11"); break; + case 0xb2: sprintf(t, "clr5 $%.3x", opdp0); break; + case 0xb3: sprintf(t, "bbc5 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break; + case 0xb4: sprintf(t, "sbc a,$%.3x+x", opdp0); break; + case 0xb5: sprintf(t, "sbc a,$%.4x+x", opw); break; + case 0xb6: sprintf(t, "sbc a,$%.4x+y", opw); break; + case 0xb7: sprintf(t, "sbc a,($%.3x)+y", opdp0); break; + case 0xb8: sprintf(t, "sbc $%.3x,#$%.2x", opdp1, op0); break; + case 0xb9: sprintf(t, "sbc (x),(y)"); break; + case 0xba: sprintf(t, "movw ya,$%.3x", opdp0); break; + case 0xbb: sprintf(t, "inc $%.3x+x", opdp0); break; + case 0xbc: sprintf(t, "inc a"); break; + case 0xbd: sprintf(t, "mov sp,x"); break; + case 0xbe: sprintf(t, "das a"); break; + case 0xbf: sprintf(t, "mov a,(x)+"); break; + case 0xc0: sprintf(t, "di"); break; + case 0xc1: sprintf(t, "tcall 12"); break; + case 0xc2: sprintf(t, "set6 $%.3x", opdp0); break; + case 0xc3: sprintf(t, "bbs6 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break; + case 0xc4: sprintf(t, "mov $%.3x,a", opdp0); break; + case 0xc5: sprintf(t, "mov $%.4x,a", opw); break; + case 0xc6: sprintf(t, "mov (x),a"); break; + case 0xc7: sprintf(t, "mov ($%.3x+x),a", opdp0); break; + case 0xc8: sprintf(t, "cmp x,#$%.2x", op0); break; + case 0xc9: sprintf(t, "mov $%.4x,x", opw); break; + case 0xca: sprintf(t, "mov1 $%.4x:%d,c", opw & 0x1fff, opw >> 13); break; + case 0xcb: sprintf(t, "mov $%.3x,y", opdp0); break; + case 0xcc: sprintf(t, "mov $%.4x,y", opw); break; + case 0xcd: sprintf(t, "mov x,#$%.2x", op0); break; + case 0xce: sprintf(t, "pop x"); break; + case 0xcf: sprintf(t, "mul ya"); break; + case 0xd0: sprintf(t, "bne $%.4x", __relb(op0, 2)); break; + case 0xd1: sprintf(t, "tcall 13"); break; + case 0xd2: sprintf(t, "clr6 $%.3x", opdp0); break; + case 0xd3: sprintf(t, "bbc6 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break; + case 0xd4: sprintf(t, "mov $%.3x+x,a", opdp0); break; + case 0xd5: sprintf(t, "mov $%.4x+x,a", opw); break; + case 0xd6: sprintf(t, "mov $%.4x+y,a", opw); break; + case 0xd7: sprintf(t, "mov ($%.3x)+y,a", opdp0); break; + case 0xd8: sprintf(t, "mov $%.3x,x", opdp0); break; + case 0xd9: sprintf(t, "mov $%.3x+y,x", opdp0); break; + case 0xda: sprintf(t, "movw $%.3x,ya", opdp0); break; + case 0xdb: sprintf(t, "mov $%.3x+x,y", opdp0); break; + case 0xdc: sprintf(t, "dec y"); break; + case 0xdd: sprintf(t, "mov a,y"); break; + case 0xde: sprintf(t, "cbne $%.3x+x,$%.4x", opdp0, __relb(op1, 3)); break; + case 0xdf: sprintf(t, "daa a"); break; + case 0xe0: sprintf(t, "clrv"); break; + case 0xe1: sprintf(t, "tcall 14"); break; + case 0xe2: sprintf(t, "set7 $%.3x", opdp0); break; + case 0xe3: sprintf(t, "bbs7 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break; + case 0xe4: sprintf(t, "mov a,$%.3x", opdp0); break; + case 0xe5: sprintf(t, "mov a,$%.4x", opw); break; + case 0xe6: sprintf(t, "mov a,(x)"); break; + case 0xe7: sprintf(t, "mov a,($%.3x+x)", opdp0); break; + case 0xe8: sprintf(t, "mov a,#$%.2x", op0); break; + case 0xe9: sprintf(t, "mov x,$%.4x", opw); break; + case 0xea: sprintf(t, "not1 c,$%.4x:%d", opw & 0x1fff, opw >> 13); break; + case 0xeb: sprintf(t, "mov y,$%.3x", opdp0); break; + case 0xec: sprintf(t, "mov y,$%.4x", opw); break; + case 0xed: sprintf(t, "notc"); break; + case 0xee: sprintf(t, "pop y"); break; + case 0xef: sprintf(t, "sleep"); break; + case 0xf0: sprintf(t, "beq $%.4x", __relb(op0, 2)); break; + case 0xf1: sprintf(t, "tcall 15"); break; + case 0xf2: sprintf(t, "clr7 $%.3x", opdp0); break; + case 0xf3: sprintf(t, "bbc7 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break; + case 0xf4: sprintf(t, "mov a,$%.3x+x", opdp0); break; + case 0xf5: sprintf(t, "mov a,$%.4x+x", opw); break; + case 0xf6: sprintf(t, "mov a,$%.4x+y", opw); break; + case 0xf7: sprintf(t, "mov a,($%.3x)+y", opdp0); break; + case 0xf8: sprintf(t, "mov x,$%.3x", opdp0); break; + case 0xf9: sprintf(t, "mov x,$%.3x+y", opdp0); break; + case 0xfa: sprintf(t, "mov $%.3x,$%.3x", opdp1, opdp0); break; + case 0xfb: sprintf(t, "mov y,$%.3x+x", opdp0); break; + case 0xfc: sprintf(t, "inc y"); break; + case 0xfd: sprintf(t, "mov y,a"); break; + case 0xfe: sprintf(t, "dbnz y,$%.4x", __relb(op0, 2)); break; + case 0xff: sprintf(t, "stop"); break; + } + + t[strlen(t)] = ' '; + strcat(s, t); + + sprintf(t, "A:%.2x X:%.2x Y:%.2x SP:01%.2x YA:%.4x ", + regs.a, regs.x, regs.y, regs.sp, regs.ya); + strcat(s, t); + + sprintf(t, "%c%c%c%c%c%c%c%c", + regs.p.n ? 'N' : 'n', + regs.p.v ? 'V' : 'v', + regs.p.p ? 'P' : 'p', + regs.p.b ? 'B' : 'b', + regs.p.h ? 'H' : 'h', + regs.p.i ? 'I' : 'i', + regs.p.z ? 'Z' : 'z', + regs.p.c ? 'C' : 'c'); + strcat(s, t); +} + +#endif + diff --git a/tools/bsnes/smp/core/disasm/disasm.hpp b/tools/bsnes/smp/core/disasm/disasm.hpp new file mode 100755 index 0000000..7c97b2f --- /dev/null +++ b/tools/bsnes/smp/core/disasm/disasm.hpp @@ -0,0 +1,3 @@ +void disassemble_opcode(char *output); +inline uint16 __relb(int8 offset, int op_len); + diff --git a/tools/bsnes/smp/core/memory.hpp b/tools/bsnes/smp/core/memory.hpp new file mode 100755 index 0000000..1d4b9c1 --- /dev/null +++ b/tools/bsnes/smp/core/memory.hpp @@ -0,0 +1,28 @@ +alwaysinline uint8_t op_readpc() { + return op_read(regs.pc++); +} + +alwaysinline uint8_t op_readstack() { + return op_read(0x0100 | ++regs.sp); +} + +alwaysinline void op_writestack(uint8_t data) { + op_write(0x0100 | regs.sp--, data); +} + +alwaysinline uint8_t op_readaddr(uint16_t addr) { + return op_read(addr); +} + +alwaysinline void op_writeaddr(uint16_t addr, uint8_t data) { + op_write(addr, data); +} + +alwaysinline uint8_t op_readdp(uint8_t addr) { + return op_read(((unsigned)regs.p.p << 8) + addr); +} + +alwaysinline void op_writedp(uint8_t addr, uint8_t data) { + op_write(((unsigned)regs.p.p << 8) + addr, data); +} + diff --git a/tools/bsnes/smp/core/opcode_algorithms.cpp b/tools/bsnes/smp/core/opcode_algorithms.cpp new file mode 100755 index 0000000..f4938eb --- /dev/null +++ b/tools/bsnes/smp/core/opcode_algorithms.cpp @@ -0,0 +1,127 @@ +#ifdef SMPCORE_CPP + +uint8 SMPcore::op_adc(uint8 x, uint8 y) { + int r = x + y + regs.p.c; + regs.p.n = r & 0x80; + regs.p.v = ~(x ^ y) & (x ^ r) & 0x80; + regs.p.h = (x ^ y ^ r) & 0x10; + regs.p.z = (uint8)r == 0; + regs.p.c = r > 0xff; + return r; +} + +uint16 SMPcore::op_addw(uint16 x, uint16 y) { + uint16 r; + regs.p.c = 0; + r = op_adc(x, y); + r |= op_adc(x >> 8, y >> 8) << 8; + regs.p.z = r == 0; + return r; +} + +uint8 SMPcore::op_and(uint8 x, uint8 y) { + x &= y; + regs.p.n = x & 0x80; + regs.p.z = x == 0; + return x; +} + +uint8 SMPcore::op_cmp(uint8 x, uint8 y) { + int r = x - y; + regs.p.n = r & 0x80; + regs.p.z = (uint8)r == 0; + regs.p.c = r >= 0; + return x; +} + +uint16 SMPcore::op_cmpw(uint16 x, uint16 y) { + int r = x - y; + regs.p.n = r & 0x8000; + regs.p.z = (uint16)r == 0; + regs.p.c = r >= 0; + return x; +} + +uint8 SMPcore::op_eor(uint8 x, uint8 y) { + x ^= y; + regs.p.n = x & 0x80; + regs.p.z = x == 0; + return x; +} + +uint8 SMPcore::op_or(uint8 x, uint8 y) { + x |= y; + regs.p.n = x & 0x80; + regs.p.z = x == 0; + return x; +} + +uint8 SMPcore::op_sbc(uint8 x, uint8 y) { + int r = x - y - !regs.p.c; + regs.p.n = r & 0x80; + regs.p.v = (x ^ y) & (x ^ r) & 0x80; + regs.p.h = !((x ^ y ^ r) & 0x10); + regs.p.z = (uint8)r == 0; + regs.p.c = r >= 0; + return r; +} + +uint16 SMPcore::op_subw(uint16 x, uint16 y) { + uint16 r; + regs.p.c = 1; + r = op_sbc(x, y); + r |= op_sbc(x >> 8, y >> 8) << 8; + regs.p.z = r == 0; + return r; +} + +uint8 SMPcore::op_inc(uint8 x) { + x++; + regs.p.n = x & 0x80; + regs.p.z = x == 0; + return x; +} + +uint8 SMPcore::op_dec(uint8 x) { + x--; + regs.p.n = x & 0x80; + regs.p.z = x == 0; + return x; +} + +uint8 SMPcore::op_asl(uint8 x) { + regs.p.c = x & 0x80; + x <<= 1; + regs.p.n = x & 0x80; + regs.p.z = x == 0; + return x; +} + +uint8 SMPcore::op_lsr(uint8 x) { + regs.p.c = x & 0x01; + x >>= 1; + regs.p.n = x & 0x80; + regs.p.z = x == 0; + return x; +} + +uint8 SMPcore::op_rol(uint8 x) { + unsigned carry = (unsigned)regs.p.c; + regs.p.c = x & 0x80; + x = (x << 1) | carry; + regs.p.n = x & 0x80; + regs.p.z = x == 0; + return x; +} + +uint8 SMPcore::op_ror(uint8 x) { + unsigned carry = (unsigned)regs.p.c << 7; + regs.p.c = x & 0x01; + x = carry | (x >> 1); + regs.p.n = x & 0x80; + regs.p.z = x == 0; + return x; +} + +#endif + diff --git a/tools/bsnes/smp/core/opcode_functions.bpp b/tools/bsnes/smp/core/opcode_functions.bpp new file mode 100755 index 0000000..fe0e381 --- /dev/null +++ b/tools/bsnes/smp/core/opcode_functions.bpp @@ -0,0 +1,12 @@ +//opcode_functions.cpp was generated via bpp -> opcode_functions.bpp + +@global class SMPcore + +@include "opcode_mov.bpp" +@include "opcode_pc.bpp" +@include "opcode_read.bpp" +@include "opcode_rmw.bpp" +@include "opcode_misc.bpp" + +@include "opcode_list.bpp" + diff --git a/tools/bsnes/smp/core/opcode_functions.cpp b/tools/bsnes/smp/core/opcode_functions.cpp new file mode 100755 index 0000000..7719d8d --- /dev/null +++ b/tools/bsnes/smp/core/opcode_functions.cpp @@ -0,0 +1,2238 @@ +//opcode_functions.cpp was generated via bpp -> opcode_functions.bpp + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +//============== +//opcode_mov.bpp +//============== + + void SMPcore::op_mov_a_x() { + op_io(); + regs.a = regs.x; + regs.p.n = (regs.a & 0x80); + regs.p.z = (regs.a == 0); + } + + void SMPcore::op_mov_a_y() { + op_io(); + regs.a = regs.y; + regs.p.n = (regs.a & 0x80); + regs.p.z = (regs.a == 0); + } + + void SMPcore::op_mov_x_a() { + op_io(); + regs.x = regs.a; + regs.p.n = (regs.x & 0x80); + regs.p.z = (regs.x == 0); + } + + void SMPcore::op_mov_y_a() { + op_io(); + regs.y = regs.a; + regs.p.n = (regs.y & 0x80); + regs.p.z = (regs.y == 0); + } + + void SMPcore::op_mov_x_sp() { + op_io(); + regs.x = regs.sp; + regs.p.n = (regs.x & 0x80); + regs.p.z = (regs.x == 0); + } + + void SMPcore::op_mov_sp_x() { + op_io(); + regs.sp = regs.x; + } + + + void SMPcore::op_mov_a_const() { + regs.a = op_readpc(); + regs.p.n = (regs.a & 0x80); + regs.p.z = (regs.a == 0); + } + + void SMPcore::op_mov_x_const() { + regs.x = op_readpc(); + regs.p.n = (regs.x & 0x80); + regs.p.z = (regs.x == 0); + } + + void SMPcore::op_mov_y_const() { + regs.y = op_readpc(); + regs.p.n = (regs.y & 0x80); + regs.p.z = (regs.y == 0); + } + + void SMPcore::op_mov_a_ix() { + op_io(); + regs.a = op_readdp(regs.x); + regs.p.n = (regs.a & 0x80); + regs.p.z = (regs.a == 0); + } + + void SMPcore::op_mov_a_ixinc() { + op_io(); + regs.a = op_readdp(regs.x++); + op_io(); + regs.p.n = (regs.a & 0x80); + regs.p.z = (regs.a == 0); + } + + + void SMPcore::op_mov_a_dp() { + sp = op_readpc(); + regs.a = op_readdp(sp); + regs.p.n = (regs.a & 0x80); + regs.p.z = (regs.a == 0); + } + + void SMPcore::op_mov_x_dp() { + sp = op_readpc(); + regs.x = op_readdp(sp); + regs.p.n = (regs.x & 0x80); + regs.p.z = (regs.x == 0); + } + + void SMPcore::op_mov_y_dp() { + sp = op_readpc(); + regs.y = op_readdp(sp); + regs.p.n = (regs.y & 0x80); + regs.p.z = (regs.y == 0); + } + + + void SMPcore::op_mov_a_dpx() { + sp = op_readpc(); + op_io(); + regs.a = op_readdp(sp + regs.x); + regs.p.n = (regs.a & 0x80); + regs.p.z = (regs.a == 0); + } + + void SMPcore::op_mov_x_dpy() { + sp = op_readpc(); + op_io(); + regs.x = op_readdp(sp + regs.y); + regs.p.n = (regs.x & 0x80); + regs.p.z = (regs.x == 0); + } + + void SMPcore::op_mov_y_dpx() { + sp = op_readpc(); + op_io(); + regs.y = op_readdp(sp + regs.x); + regs.p.n = (regs.y & 0x80); + regs.p.z = (regs.y == 0); + } + + + void SMPcore::op_mov_a_addr() { + sp = op_readpc() << 0; + sp |= op_readpc() << 8; + regs.a = op_readaddr(sp); + regs.p.n = (regs.a & 0x80); + regs.p.z = (regs.a == 0); + } + + void SMPcore::op_mov_x_addr() { + sp = op_readpc() << 0; + sp |= op_readpc() << 8; + regs.x = op_readaddr(sp); + regs.p.n = (regs.x & 0x80); + regs.p.z = (regs.x == 0); + } + + void SMPcore::op_mov_y_addr() { + sp = op_readpc() << 0; + sp |= op_readpc() << 8; + regs.y = op_readaddr(sp); + regs.p.n = (regs.y & 0x80); + regs.p.z = (regs.y == 0); + } + + + void SMPcore::op_mov_a_addrx() { + sp = op_readpc() << 0; + sp |= op_readpc() << 8; + op_io(); + regs.a = op_readaddr(sp + regs.x); + regs.p.n = (regs.a & 0x80); + regs.p.z = (regs.a == 0); + } + + void SMPcore::op_mov_a_addry() { + sp = op_readpc() << 0; + sp |= op_readpc() << 8; + op_io(); + regs.a = op_readaddr(sp + regs.y); + regs.p.n = (regs.a & 0x80); + regs.p.z = (regs.a == 0); + } + + + void SMPcore::op_mov_a_idpx() { + dp = op_readpc() + regs.x; + op_io(); + sp = op_readdp(dp + 0) << 0; + sp |= op_readdp(dp + 1) << 8; + regs.a = op_readaddr(sp); + regs.p.n = (regs.a & 0x80); + regs.p.z = (regs.a == 0); + } + + void SMPcore::op_mov_a_idpy() { + dp = op_readpc(); + op_io(); + sp = op_readdp(dp + 0) << 0; + sp |= op_readdp(dp + 1) << 8; + regs.a = op_readaddr(sp + regs.y); + regs.p.n = (regs.a & 0x80); + regs.p.z = (regs.a == 0); + } + + void SMPcore::op_mov_dp_dp() { + sp = op_readpc(); + rd = op_readdp(sp); + dp = op_readpc(); + op_writedp(dp, rd); + } + + void SMPcore::op_mov_dp_const() { + rd = op_readpc(); + dp = op_readpc(); + op_readdp(dp); + op_writedp(dp, rd); + } + + void SMPcore::op_mov_ix_a() { + op_io(); + op_readdp(regs.x); + op_writedp(regs.x, regs.a); + } + + void SMPcore::op_mov_ixinc_a() { + op_io(); + op_io(); + op_writedp(regs.x++, regs.a); + } + + + void SMPcore::op_mov_dp_a() { + dp = op_readpc(); + op_readdp(dp); + op_writedp(dp, regs.a); + } + + void SMPcore::op_mov_dp_x() { + dp = op_readpc(); + op_readdp(dp); + op_writedp(dp, regs.x); + } + + void SMPcore::op_mov_dp_y() { + dp = op_readpc(); + op_readdp(dp); + op_writedp(dp, regs.y); + } + + + void SMPcore::op_mov_dpx_a() { + dp = op_readpc(); + op_io(); + dp += regs.x; + op_readdp(dp); + op_writedp(dp, regs.a); + } + + void SMPcore::op_mov_dpy_x() { + dp = op_readpc(); + op_io(); + dp += regs.y; + op_readdp(dp); + op_writedp(dp, regs.x); + } + + void SMPcore::op_mov_dpx_y() { + dp = op_readpc(); + op_io(); + dp += regs.x; + op_readdp(dp); + op_writedp(dp, regs.y); + } + + + void SMPcore::op_mov_addr_a() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + op_readaddr(dp); + op_writeaddr(dp, regs.a); + } + + void SMPcore::op_mov_addr_x() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + op_readaddr(dp); + op_writeaddr(dp, regs.x); + } + + void SMPcore::op_mov_addr_y() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + op_readaddr(dp); + op_writeaddr(dp, regs.y); + } + + + void SMPcore::op_mov_addrx_a() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + op_io(); + dp += regs.x; + op_readaddr(dp); + op_writeaddr(dp, regs.a); + } + + void SMPcore::op_mov_addry_a() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + op_io(); + dp += regs.y; + op_readaddr(dp); + op_writeaddr(dp, regs.a); + } + + + void SMPcore::op_mov_idpx_a() { + sp = op_readpc(); + op_io(); + sp += regs.x; + dp = op_readdp(sp + 0) << 0; + dp |= op_readdp(sp + 1) << 8; + op_readaddr(dp); + op_writeaddr(dp, regs.a); + } + + void SMPcore::op_mov_idpy_a() { + sp = op_readpc(); + dp = op_readdp(sp + 0) << 0; + dp |= op_readdp(sp + 1) << 8; + op_io(); + dp += regs.y; + op_readaddr(dp); + op_writeaddr(dp, regs.a); + } + + void SMPcore::op_movw_ya_dp() { + sp = op_readpc(); + regs.a = op_readdp(sp + 0); + op_io(); + regs.y = op_readdp(sp + 1); + regs.p.n = (regs.ya & 0x8000); + regs.p.z = (regs.ya == 0); + } + + void SMPcore::op_movw_dp_ya() { + dp = op_readpc(); + op_readdp(dp); + op_writedp(dp + 0, regs.a); + op_writedp(dp + 1, regs.y); + } + + void SMPcore::op_mov1_c_bit() { + sp = op_readpc() << 0; + sp |= op_readpc() << 8; + bit = sp >> 13; + sp &= 0x1fff; + rd = op_readaddr(sp); + regs.p.c = (rd & (1 << bit)); + } + + void SMPcore::op_mov1_bit_c() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + bit = dp >> 13; + dp &= 0x1fff; + rd = op_readaddr(dp); + (regs.p.c) ? rd |= (1 << bit) : rd &= ~(1 << bit); + op_io(); + op_writeaddr(dp, rd); + } + + +//============= +//opcode_pc.bpp +//============= + + void SMPcore::op_bra() { + rd = op_readpc(); + if(0) return; + op_io(); + op_io(); + regs.pc += (int8_t)rd; + } + + void SMPcore::op_beq() { + rd = op_readpc(); + if(!regs.p.z) return; + op_io(); + op_io(); + regs.pc += (int8_t)rd; + } + + void SMPcore::op_bne() { + rd = op_readpc(); + if(regs.p.z) return; + op_io(); + op_io(); + regs.pc += (int8_t)rd; + } + + void SMPcore::op_bcs() { + rd = op_readpc(); + if(!regs.p.c) return; + op_io(); + op_io(); + regs.pc += (int8_t)rd; + } + + void SMPcore::op_bcc() { + rd = op_readpc(); + if(regs.p.c) return; + op_io(); + op_io(); + regs.pc += (int8_t)rd; + } + + void SMPcore::op_bvs() { + rd = op_readpc(); + if(!regs.p.v) return; + op_io(); + op_io(); + regs.pc += (int8_t)rd; + } + + void SMPcore::op_bvc() { + rd = op_readpc(); + if(regs.p.v) return; + op_io(); + op_io(); + regs.pc += (int8_t)rd; + } + + void SMPcore::op_bmi() { + rd = op_readpc(); + if(!regs.p.n) return; + op_io(); + op_io(); + regs.pc += (int8_t)rd; + } + + void SMPcore::op_bpl() { + rd = op_readpc(); + if(regs.p.n) return; + op_io(); + op_io(); + regs.pc += (int8_t)rd; + } + + + void SMPcore::op_bbs0() { + dp = op_readpc(); + sp = op_readdp(dp); + rd = op_readpc(); + op_io(); + if((sp & 0x01) != 0x01) return; + op_io(); + op_io(); + regs.pc += (int8_t)rd; + } + + void SMPcore::op_bbc0() { + dp = op_readpc(); + sp = op_readdp(dp); + rd = op_readpc(); + op_io(); + if((sp & 0x01) == 0x01) return; + op_io(); + op_io(); + regs.pc += (int8_t)rd; + } + + void SMPcore::op_bbs1() { + dp = op_readpc(); + sp = op_readdp(dp); + rd = op_readpc(); + op_io(); + if((sp & 0x02) != 0x02) return; + op_io(); + op_io(); + regs.pc += (int8_t)rd; + } + + void SMPcore::op_bbc1() { + dp = op_readpc(); + sp = op_readdp(dp); + rd = op_readpc(); + op_io(); + if((sp & 0x02) == 0x02) return; + op_io(); + op_io(); + regs.pc += (int8_t)rd; + } + + void SMPcore::op_bbs2() { + dp = op_readpc(); + sp = op_readdp(dp); + rd = op_readpc(); + op_io(); + if((sp & 0x04) != 0x04) return; + op_io(); + op_io(); + regs.pc += (int8_t)rd; + } + + void SMPcore::op_bbc2() { + dp = op_readpc(); + sp = op_readdp(dp); + rd = op_readpc(); + op_io(); + if((sp & 0x04) == 0x04) return; + op_io(); + op_io(); + regs.pc += (int8_t)rd; + } + + void SMPcore::op_bbs3() { + dp = op_readpc(); + sp = op_readdp(dp); + rd = op_readpc(); + op_io(); + if((sp & 0x08) != 0x08) return; + op_io(); + op_io(); + regs.pc += (int8_t)rd; + } + + void SMPcore::op_bbc3() { + dp = op_readpc(); + sp = op_readdp(dp); + rd = op_readpc(); + op_io(); + if((sp & 0x08) == 0x08) return; + op_io(); + op_io(); + regs.pc += (int8_t)rd; + } + + void SMPcore::op_bbs4() { + dp = op_readpc(); + sp = op_readdp(dp); + rd = op_readpc(); + op_io(); + if((sp & 0x10) != 0x10) return; + op_io(); + op_io(); + regs.pc += (int8_t)rd; + } + + void SMPcore::op_bbc4() { + dp = op_readpc(); + sp = op_readdp(dp); + rd = op_readpc(); + op_io(); + if((sp & 0x10) == 0x10) return; + op_io(); + op_io(); + regs.pc += (int8_t)rd; + } + + void SMPcore::op_bbs5() { + dp = op_readpc(); + sp = op_readdp(dp); + rd = op_readpc(); + op_io(); + if((sp & 0x20) != 0x20) return; + op_io(); + op_io(); + regs.pc += (int8_t)rd; + } + + void SMPcore::op_bbc5() { + dp = op_readpc(); + sp = op_readdp(dp); + rd = op_readpc(); + op_io(); + if((sp & 0x20) == 0x20) return; + op_io(); + op_io(); + regs.pc += (int8_t)rd; + } + + void SMPcore::op_bbs6() { + dp = op_readpc(); + sp = op_readdp(dp); + rd = op_readpc(); + op_io(); + if((sp & 0x40) != 0x40) return; + op_io(); + op_io(); + regs.pc += (int8_t)rd; + } + + void SMPcore::op_bbc6() { + dp = op_readpc(); + sp = op_readdp(dp); + rd = op_readpc(); + op_io(); + if((sp & 0x40) == 0x40) return; + op_io(); + op_io(); + regs.pc += (int8_t)rd; + } + + void SMPcore::op_bbs7() { + dp = op_readpc(); + sp = op_readdp(dp); + rd = op_readpc(); + op_io(); + if((sp & 0x80) != 0x80) return; + op_io(); + op_io(); + regs.pc += (int8_t)rd; + } + + void SMPcore::op_bbc7() { + dp = op_readpc(); + sp = op_readdp(dp); + rd = op_readpc(); + op_io(); + if((sp & 0x80) == 0x80) return; + op_io(); + op_io(); + regs.pc += (int8_t)rd; + } + + + void SMPcore::op_cbne_dp() { + dp = op_readpc(); + sp = op_readdp(dp); + rd = op_readpc(); + op_io(); + if(regs.a == sp) return; + op_io(); + op_io(); + regs.pc += (int8_t)rd; + } + + void SMPcore::op_cbne_dpx() { + dp = op_readpc(); + op_io(); + sp = op_readdp(dp + regs.x); + rd = op_readpc(); + op_io(); + if(regs.a == sp) return; + op_io(); + op_io(); + regs.pc += (int8_t)rd; + } + + void SMPcore::op_dbnz_dp() { + dp = op_readpc(); + wr = op_readdp(dp); + op_writedp(dp, --wr); + rd = op_readpc(); + if(wr == 0) return; + op_io(); + op_io(); + regs.pc += (int8_t)rd; + } + + void SMPcore::op_dbnz_y() { + rd = op_readpc(); + op_io(); + regs.y--; + op_io(); + if(regs.y == 0) return; + op_io(); + op_io(); + regs.pc += (int8_t)rd; + } + + void SMPcore::op_jmp_addr() { + rd = op_readpc() << 0; + rd |= op_readpc() << 8; + regs.pc = rd; + } + + void SMPcore::op_jmp_iaddrx() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + op_io(); + dp += regs.x; + rd = op_readaddr(dp + 0) << 0; + rd |= op_readaddr(dp + 1) << 8; + regs.pc = rd; + } + + void SMPcore::op_call() { + rd = op_readpc() << 0; + rd |= op_readpc() << 8; + op_io(); + op_io(); + op_io(); + op_writestack(regs.pc >> 8); + op_writestack(regs.pc >> 0); + regs.pc = rd; + } + + void SMPcore::op_pcall() { + rd = op_readpc(); + op_io(); + op_io(); + op_writestack(regs.pc >> 8); + op_writestack(regs.pc >> 0); + regs.pc = 0xff00 | rd; + } + + + void SMPcore::op_tcall_0() { + dp = 0xffde - (0 << 1); + rd = op_readaddr(dp + 0) << 0; + rd |= op_readaddr(dp + 1) << 8; + op_io(); + op_io(); + op_io(); + op_writestack(regs.pc >> 8); + op_writestack(regs.pc >> 0); + regs.pc = rd; + } + + void SMPcore::op_tcall_1() { + dp = 0xffde - (1 << 1); + rd = op_readaddr(dp + 0) << 0; + rd |= op_readaddr(dp + 1) << 8; + op_io(); + op_io(); + op_io(); + op_writestack(regs.pc >> 8); + op_writestack(regs.pc >> 0); + regs.pc = rd; + } + + void SMPcore::op_tcall_2() { + dp = 0xffde - (2 << 1); + rd = op_readaddr(dp + 0) << 0; + rd |= op_readaddr(dp + 1) << 8; + op_io(); + op_io(); + op_io(); + op_writestack(regs.pc >> 8); + op_writestack(regs.pc >> 0); + regs.pc = rd; + } + + void SMPcore::op_tcall_3() { + dp = 0xffde - (3 << 1); + rd = op_readaddr(dp + 0) << 0; + rd |= op_readaddr(dp + 1) << 8; + op_io(); + op_io(); + op_io(); + op_writestack(regs.pc >> 8); + op_writestack(regs.pc >> 0); + regs.pc = rd; + } + + void SMPcore::op_tcall_4() { + dp = 0xffde - (4 << 1); + rd = op_readaddr(dp + 0) << 0; + rd |= op_readaddr(dp + 1) << 8; + op_io(); + op_io(); + op_io(); + op_writestack(regs.pc >> 8); + op_writestack(regs.pc >> 0); + regs.pc = rd; + } + + void SMPcore::op_tcall_5() { + dp = 0xffde - (5 << 1); + rd = op_readaddr(dp + 0) << 0; + rd |= op_readaddr(dp + 1) << 8; + op_io(); + op_io(); + op_io(); + op_writestack(regs.pc >> 8); + op_writestack(regs.pc >> 0); + regs.pc = rd; + } + + void SMPcore::op_tcall_6() { + dp = 0xffde - (6 << 1); + rd = op_readaddr(dp + 0) << 0; + rd |= op_readaddr(dp + 1) << 8; + op_io(); + op_io(); + op_io(); + op_writestack(regs.pc >> 8); + op_writestack(regs.pc >> 0); + regs.pc = rd; + } + + void SMPcore::op_tcall_7() { + dp = 0xffde - (7 << 1); + rd = op_readaddr(dp + 0) << 0; + rd |= op_readaddr(dp + 1) << 8; + op_io(); + op_io(); + op_io(); + op_writestack(regs.pc >> 8); + op_writestack(regs.pc >> 0); + regs.pc = rd; + } + + void SMPcore::op_tcall_8() { + dp = 0xffde - (8 << 1); + rd = op_readaddr(dp + 0) << 0; + rd |= op_readaddr(dp + 1) << 8; + op_io(); + op_io(); + op_io(); + op_writestack(regs.pc >> 8); + op_writestack(regs.pc >> 0); + regs.pc = rd; + } + + void SMPcore::op_tcall_9() { + dp = 0xffde - (9 << 1); + rd = op_readaddr(dp + 0) << 0; + rd |= op_readaddr(dp + 1) << 8; + op_io(); + op_io(); + op_io(); + op_writestack(regs.pc >> 8); + op_writestack(regs.pc >> 0); + regs.pc = rd; + } + + void SMPcore::op_tcall_10() { + dp = 0xffde - (10 << 1); + rd = op_readaddr(dp + 0) << 0; + rd |= op_readaddr(dp + 1) << 8; + op_io(); + op_io(); + op_io(); + op_writestack(regs.pc >> 8); + op_writestack(regs.pc >> 0); + regs.pc = rd; + } + + void SMPcore::op_tcall_11() { + dp = 0xffde - (11 << 1); + rd = op_readaddr(dp + 0) << 0; + rd |= op_readaddr(dp + 1) << 8; + op_io(); + op_io(); + op_io(); + op_writestack(regs.pc >> 8); + op_writestack(regs.pc >> 0); + regs.pc = rd; + } + + void SMPcore::op_tcall_12() { + dp = 0xffde - (12 << 1); + rd = op_readaddr(dp + 0) << 0; + rd |= op_readaddr(dp + 1) << 8; + op_io(); + op_io(); + op_io(); + op_writestack(regs.pc >> 8); + op_writestack(regs.pc >> 0); + regs.pc = rd; + } + + void SMPcore::op_tcall_13() { + dp = 0xffde - (13 << 1); + rd = op_readaddr(dp + 0) << 0; + rd |= op_readaddr(dp + 1) << 8; + op_io(); + op_io(); + op_io(); + op_writestack(regs.pc >> 8); + op_writestack(regs.pc >> 0); + regs.pc = rd; + } + + void SMPcore::op_tcall_14() { + dp = 0xffde - (14 << 1); + rd = op_readaddr(dp + 0) << 0; + rd |= op_readaddr(dp + 1) << 8; + op_io(); + op_io(); + op_io(); + op_writestack(regs.pc >> 8); + op_writestack(regs.pc >> 0); + regs.pc = rd; + } + + void SMPcore::op_tcall_15() { + dp = 0xffde - (15 << 1); + rd = op_readaddr(dp + 0) << 0; + rd |= op_readaddr(dp + 1) << 8; + op_io(); + op_io(); + op_io(); + op_writestack(regs.pc >> 8); + op_writestack(regs.pc >> 0); + regs.pc = rd; + } + + + void SMPcore::op_brk() { + rd = op_readaddr(0xffde) << 0; + rd |= op_readaddr(0xffdf) << 8; + op_io(); + op_io(); + op_writestack(regs.pc >> 8); + op_writestack(regs.pc >> 0); + op_writestack(regs.p); + regs.pc = rd; + regs.p.b = 1; + regs.p.i = 0; + } + + void SMPcore::op_ret() { + rd = op_readstack() << 0; + rd |= op_readstack() << 8; + op_io(); + op_io(); + regs.pc = rd; + } + + void SMPcore::op_reti() { + regs.p = op_readstack(); + rd = op_readstack() << 0; + rd |= op_readstack() << 8; + op_io(); + op_io(); + regs.pc = rd; + } + + +//=============== +//opcode_read.bpp +//=============== + + void SMPcore::op_adc_a_const() { + rd = op_readpc(); + regs.a = op_adc(regs.a, rd); + } + + void SMPcore::op_and_a_const() { + rd = op_readpc(); + regs.a = op_and(regs.a, rd); + } + + void SMPcore::op_cmp_a_const() { + rd = op_readpc(); + regs.a = op_cmp(regs.a, rd); + } + + void SMPcore::op_cmp_x_const() { + rd = op_readpc(); + regs.x = op_cmp(regs.x, rd); + } + + void SMPcore::op_cmp_y_const() { + rd = op_readpc(); + regs.y = op_cmp(regs.y, rd); + } + + void SMPcore::op_eor_a_const() { + rd = op_readpc(); + regs.a = op_eor(regs.a, rd); + } + + void SMPcore::op_or_a_const() { + rd = op_readpc(); + regs.a = op_or(regs.a, rd); + } + + void SMPcore::op_sbc_a_const() { + rd = op_readpc(); + regs.a = op_sbc(regs.a, rd); + } + + + void SMPcore::op_adc_a_ix() { + op_io(); + rd = op_readdp(regs.x); + regs.a = op_adc(regs.a, rd); + } + + void SMPcore::op_and_a_ix() { + op_io(); + rd = op_readdp(regs.x); + regs.a = op_and(regs.a, rd); + } + + void SMPcore::op_cmp_a_ix() { + op_io(); + rd = op_readdp(regs.x); + regs.a = op_cmp(regs.a, rd); + } + + void SMPcore::op_eor_a_ix() { + op_io(); + rd = op_readdp(regs.x); + regs.a = op_eor(regs.a, rd); + } + + void SMPcore::op_or_a_ix() { + op_io(); + rd = op_readdp(regs.x); + regs.a = op_or(regs.a, rd); + } + + void SMPcore::op_sbc_a_ix() { + op_io(); + rd = op_readdp(regs.x); + regs.a = op_sbc(regs.a, rd); + } + + + void SMPcore::op_adc_a_dp() { + dp = op_readpc(); + rd = op_readdp(dp); + regs.a = op_adc(regs.a, rd); + } + + void SMPcore::op_and_a_dp() { + dp = op_readpc(); + rd = op_readdp(dp); + regs.a = op_and(regs.a, rd); + } + + void SMPcore::op_cmp_a_dp() { + dp = op_readpc(); + rd = op_readdp(dp); + regs.a = op_cmp(regs.a, rd); + } + + void SMPcore::op_cmp_x_dp() { + dp = op_readpc(); + rd = op_readdp(dp); + regs.x = op_cmp(regs.x, rd); + } + + void SMPcore::op_cmp_y_dp() { + dp = op_readpc(); + rd = op_readdp(dp); + regs.y = op_cmp(regs.y, rd); + } + + void SMPcore::op_eor_a_dp() { + dp = op_readpc(); + rd = op_readdp(dp); + regs.a = op_eor(regs.a, rd); + } + + void SMPcore::op_or_a_dp() { + dp = op_readpc(); + rd = op_readdp(dp); + regs.a = op_or(regs.a, rd); + } + + void SMPcore::op_sbc_a_dp() { + dp = op_readpc(); + rd = op_readdp(dp); + regs.a = op_sbc(regs.a, rd); + } + + + void SMPcore::op_adc_a_dpx() { + dp = op_readpc(); + op_io(); + rd = op_readdp(dp + regs.x); + regs.a = op_adc(regs.a, rd); + } + + void SMPcore::op_and_a_dpx() { + dp = op_readpc(); + op_io(); + rd = op_readdp(dp + regs.x); + regs.a = op_and(regs.a, rd); + } + + void SMPcore::op_cmp_a_dpx() { + dp = op_readpc(); + op_io(); + rd = op_readdp(dp + regs.x); + regs.a = op_cmp(regs.a, rd); + } + + void SMPcore::op_eor_a_dpx() { + dp = op_readpc(); + op_io(); + rd = op_readdp(dp + regs.x); + regs.a = op_eor(regs.a, rd); + } + + void SMPcore::op_or_a_dpx() { + dp = op_readpc(); + op_io(); + rd = op_readdp(dp + regs.x); + regs.a = op_or(regs.a, rd); + } + + void SMPcore::op_sbc_a_dpx() { + dp = op_readpc(); + op_io(); + rd = op_readdp(dp + regs.x); + regs.a = op_sbc(regs.a, rd); + } + + + void SMPcore::op_adc_a_addr() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + rd = op_readaddr(dp); + regs.a = op_adc(regs.a, rd); + } + + void SMPcore::op_and_a_addr() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + rd = op_readaddr(dp); + regs.a = op_and(regs.a, rd); + } + + void SMPcore::op_cmp_a_addr() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + rd = op_readaddr(dp); + regs.a = op_cmp(regs.a, rd); + } + + void SMPcore::op_cmp_x_addr() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + rd = op_readaddr(dp); + regs.x = op_cmp(regs.x, rd); + } + + void SMPcore::op_cmp_y_addr() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + rd = op_readaddr(dp); + regs.y = op_cmp(regs.y, rd); + } + + void SMPcore::op_eor_a_addr() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + rd = op_readaddr(dp); + regs.a = op_eor(regs.a, rd); + } + + void SMPcore::op_or_a_addr() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + rd = op_readaddr(dp); + regs.a = op_or(regs.a, rd); + } + + void SMPcore::op_sbc_a_addr() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + rd = op_readaddr(dp); + regs.a = op_sbc(regs.a, rd); + } + + + void SMPcore::op_adc_a_addrx() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + op_io(); + rd = op_readaddr(dp + regs.x); + regs.a = op_adc(regs.a, rd); + } + + void SMPcore::op_adc_a_addry() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + op_io(); + rd = op_readaddr(dp + regs.y); + regs.a = op_adc(regs.a, rd); + } + + void SMPcore::op_and_a_addrx() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + op_io(); + rd = op_readaddr(dp + regs.x); + regs.a = op_and(regs.a, rd); + } + + void SMPcore::op_and_a_addry() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + op_io(); + rd = op_readaddr(dp + regs.y); + regs.a = op_and(regs.a, rd); + } + + void SMPcore::op_cmp_a_addrx() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + op_io(); + rd = op_readaddr(dp + regs.x); + regs.a = op_cmp(regs.a, rd); + } + + void SMPcore::op_cmp_a_addry() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + op_io(); + rd = op_readaddr(dp + regs.y); + regs.a = op_cmp(regs.a, rd); + } + + void SMPcore::op_eor_a_addrx() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + op_io(); + rd = op_readaddr(dp + regs.x); + regs.a = op_eor(regs.a, rd); + } + + void SMPcore::op_eor_a_addry() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + op_io(); + rd = op_readaddr(dp + regs.y); + regs.a = op_eor(regs.a, rd); + } + + void SMPcore::op_or_a_addrx() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + op_io(); + rd = op_readaddr(dp + regs.x); + regs.a = op_or(regs.a, rd); + } + + void SMPcore::op_or_a_addry() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + op_io(); + rd = op_readaddr(dp + regs.y); + regs.a = op_or(regs.a, rd); + } + + void SMPcore::op_sbc_a_addrx() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + op_io(); + rd = op_readaddr(dp + regs.x); + regs.a = op_sbc(regs.a, rd); + } + + void SMPcore::op_sbc_a_addry() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + op_io(); + rd = op_readaddr(dp + regs.y); + regs.a = op_sbc(regs.a, rd); + } + + + void SMPcore::op_adc_a_idpx() { + dp = op_readpc() + regs.x; + op_io(); + sp = op_readdp(dp + 0) << 0; + sp |= op_readdp(dp + 1) << 8; + rd = op_readaddr(sp); + regs.a = op_adc(regs.a, rd); + } + + void SMPcore::op_and_a_idpx() { + dp = op_readpc() + regs.x; + op_io(); + sp = op_readdp(dp + 0) << 0; + sp |= op_readdp(dp + 1) << 8; + rd = op_readaddr(sp); + regs.a = op_and(regs.a, rd); + } + + void SMPcore::op_cmp_a_idpx() { + dp = op_readpc() + regs.x; + op_io(); + sp = op_readdp(dp + 0) << 0; + sp |= op_readdp(dp + 1) << 8; + rd = op_readaddr(sp); + regs.a = op_cmp(regs.a, rd); + } + + void SMPcore::op_eor_a_idpx() { + dp = op_readpc() + regs.x; + op_io(); + sp = op_readdp(dp + 0) << 0; + sp |= op_readdp(dp + 1) << 8; + rd = op_readaddr(sp); + regs.a = op_eor(regs.a, rd); + } + + void SMPcore::op_or_a_idpx() { + dp = op_readpc() + regs.x; + op_io(); + sp = op_readdp(dp + 0) << 0; + sp |= op_readdp(dp + 1) << 8; + rd = op_readaddr(sp); + regs.a = op_or(regs.a, rd); + } + + void SMPcore::op_sbc_a_idpx() { + dp = op_readpc() + regs.x; + op_io(); + sp = op_readdp(dp + 0) << 0; + sp |= op_readdp(dp + 1) << 8; + rd = op_readaddr(sp); + regs.a = op_sbc(regs.a, rd); + } + + + void SMPcore::op_adc_a_idpy() { + dp = op_readpc(); + op_io(); + sp = op_readdp(dp + 0) << 0; + sp |= op_readdp(dp + 1) << 8; + rd = op_readaddr(sp + regs.y); + regs.a = op_adc(regs.a, rd); + } + + void SMPcore::op_and_a_idpy() { + dp = op_readpc(); + op_io(); + sp = op_readdp(dp + 0) << 0; + sp |= op_readdp(dp + 1) << 8; + rd = op_readaddr(sp + regs.y); + regs.a = op_and(regs.a, rd); + } + + void SMPcore::op_cmp_a_idpy() { + dp = op_readpc(); + op_io(); + sp = op_readdp(dp + 0) << 0; + sp |= op_readdp(dp + 1) << 8; + rd = op_readaddr(sp + regs.y); + regs.a = op_cmp(regs.a, rd); + } + + void SMPcore::op_eor_a_idpy() { + dp = op_readpc(); + op_io(); + sp = op_readdp(dp + 0) << 0; + sp |= op_readdp(dp + 1) << 8; + rd = op_readaddr(sp + regs.y); + regs.a = op_eor(regs.a, rd); + } + + void SMPcore::op_or_a_idpy() { + dp = op_readpc(); + op_io(); + sp = op_readdp(dp + 0) << 0; + sp |= op_readdp(dp + 1) << 8; + rd = op_readaddr(sp + regs.y); + regs.a = op_or(regs.a, rd); + } + + void SMPcore::op_sbc_a_idpy() { + dp = op_readpc(); + op_io(); + sp = op_readdp(dp + 0) << 0; + sp |= op_readdp(dp + 1) << 8; + rd = op_readaddr(sp + regs.y); + regs.a = op_sbc(regs.a, rd); + } + + + void SMPcore::op_adc_ix_iy() { + op_io(); + rd = op_readdp(regs.y); + wr = op_readdp(regs.x); + wr = op_adc(wr, rd); + 1 ? op_writedp(regs.x, wr) : op_io(); + } + + void SMPcore::op_and_ix_iy() { + op_io(); + rd = op_readdp(regs.y); + wr = op_readdp(regs.x); + wr = op_and(wr, rd); + 1 ? op_writedp(regs.x, wr) : op_io(); + } + + void SMPcore::op_cmp_ix_iy() { + op_io(); + rd = op_readdp(regs.y); + wr = op_readdp(regs.x); + wr = op_cmp(wr, rd); + 0 ? op_writedp(regs.x, wr) : op_io(); + } + + void SMPcore::op_eor_ix_iy() { + op_io(); + rd = op_readdp(regs.y); + wr = op_readdp(regs.x); + wr = op_eor(wr, rd); + 1 ? op_writedp(regs.x, wr) : op_io(); + } + + void SMPcore::op_or_ix_iy() { + op_io(); + rd = op_readdp(regs.y); + wr = op_readdp(regs.x); + wr = op_or(wr, rd); + 1 ? op_writedp(regs.x, wr) : op_io(); + } + + void SMPcore::op_sbc_ix_iy() { + op_io(); + rd = op_readdp(regs.y); + wr = op_readdp(regs.x); + wr = op_sbc(wr, rd); + 1 ? op_writedp(regs.x, wr) : op_io(); + } + + + void SMPcore::op_adc_dp_dp() { + sp = op_readpc(); + rd = op_readdp(sp); + dp = op_readpc(); + wr = op_readdp(dp); + wr = op_adc(wr, rd); + 1 ? op_writedp(dp, wr) : op_io(); + } + + void SMPcore::op_and_dp_dp() { + sp = op_readpc(); + rd = op_readdp(sp); + dp = op_readpc(); + wr = op_readdp(dp); + wr = op_and(wr, rd); + 1 ? op_writedp(dp, wr) : op_io(); + } + + void SMPcore::op_cmp_dp_dp() { + sp = op_readpc(); + rd = op_readdp(sp); + dp = op_readpc(); + wr = op_readdp(dp); + wr = op_cmp(wr, rd); + 0 ? op_writedp(dp, wr) : op_io(); + } + + void SMPcore::op_eor_dp_dp() { + sp = op_readpc(); + rd = op_readdp(sp); + dp = op_readpc(); + wr = op_readdp(dp); + wr = op_eor(wr, rd); + 1 ? op_writedp(dp, wr) : op_io(); + } + + void SMPcore::op_or_dp_dp() { + sp = op_readpc(); + rd = op_readdp(sp); + dp = op_readpc(); + wr = op_readdp(dp); + wr = op_or(wr, rd); + 1 ? op_writedp(dp, wr) : op_io(); + } + + void SMPcore::op_sbc_dp_dp() { + sp = op_readpc(); + rd = op_readdp(sp); + dp = op_readpc(); + wr = op_readdp(dp); + wr = op_sbc(wr, rd); + 1 ? op_writedp(dp, wr) : op_io(); + } + + + void SMPcore::op_adc_dp_const() { + rd = op_readpc(); + dp = op_readpc(); + wr = op_readdp(dp); + wr = op_adc(wr, rd); + 1 ? op_writedp(dp, wr) : op_io(); + } + + void SMPcore::op_and_dp_const() { + rd = op_readpc(); + dp = op_readpc(); + wr = op_readdp(dp); + wr = op_and(wr, rd); + 1 ? op_writedp(dp, wr) : op_io(); + } + + void SMPcore::op_cmp_dp_const() { + rd = op_readpc(); + dp = op_readpc(); + wr = op_readdp(dp); + wr = op_cmp(wr, rd); + 0 ? op_writedp(dp, wr) : op_io(); + } + + void SMPcore::op_eor_dp_const() { + rd = op_readpc(); + dp = op_readpc(); + wr = op_readdp(dp); + wr = op_eor(wr, rd); + 1 ? op_writedp(dp, wr) : op_io(); + } + + void SMPcore::op_or_dp_const() { + rd = op_readpc(); + dp = op_readpc(); + wr = op_readdp(dp); + wr = op_or(wr, rd); + 1 ? op_writedp(dp, wr) : op_io(); + } + + void SMPcore::op_sbc_dp_const() { + rd = op_readpc(); + dp = op_readpc(); + wr = op_readdp(dp); + wr = op_sbc(wr, rd); + 1 ? op_writedp(dp, wr) : op_io(); + } + + + void SMPcore::op_addw_ya_dp() { + dp = op_readpc(); + rd = op_readdp(dp + 0) << 0; + op_io(); + rd |= op_readdp(dp + 1) << 8; + regs.ya = op_addw(regs.ya, rd); + } + + void SMPcore::op_subw_ya_dp() { + dp = op_readpc(); + rd = op_readdp(dp + 0) << 0; + op_io(); + rd |= op_readdp(dp + 1) << 8; + regs.ya = op_subw(regs.ya, rd); + } + + void SMPcore::op_cmpw_ya_dp() { + dp = op_readpc(); + rd = op_readdp(dp + 0) << 0; + rd |= op_readdp(dp + 1) << 8; + op_cmpw(regs.ya, rd); + } + + + void SMPcore::op_and1_bit() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + bit = dp >> 13; + dp &= 0x1fff; + rd = op_readaddr(dp); + regs.p.c = regs.p.c & !!(rd & (1 << bit)); + } + + void SMPcore::op_and1_notbit() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + bit = dp >> 13; + dp &= 0x1fff; + rd = op_readaddr(dp); + regs.p.c = regs.p.c & !(rd & (1 << bit)); + } + + void SMPcore::op_eor1_bit() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + bit = dp >> 13; + dp &= 0x1fff; + rd = op_readaddr(dp); + op_io(); + regs.p.c = regs.p.c ^ !!(rd & (1 << bit)); + } + + void SMPcore::op_not1_bit() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + bit = dp >> 13; + dp &= 0x1fff; + rd = op_readaddr(dp); + rd ^= 1 << bit; + op_writeaddr(dp, rd); + } + + void SMPcore::op_or1_bit() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + bit = dp >> 13; + dp &= 0x1fff; + rd = op_readaddr(dp); + op_io(); + regs.p.c = regs.p.c | !!(rd & (1 << bit)); + } + + void SMPcore::op_or1_notbit() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + bit = dp >> 13; + dp &= 0x1fff; + rd = op_readaddr(dp); + op_io(); + regs.p.c = regs.p.c | !(rd & (1 << bit)); + } + + +//============== +//opcode_rmw.bpp +//============== + + void SMPcore::op_inc_a() { + op_io(); + regs.a = op_inc(regs.a); + } + + void SMPcore::op_inc_x() { + op_io(); + regs.x = op_inc(regs.x); + } + + void SMPcore::op_inc_y() { + op_io(); + regs.y = op_inc(regs.y); + } + + void SMPcore::op_dec_a() { + op_io(); + regs.a = op_dec(regs.a); + } + + void SMPcore::op_dec_x() { + op_io(); + regs.x = op_dec(regs.x); + } + + void SMPcore::op_dec_y() { + op_io(); + regs.y = op_dec(regs.y); + } + + void SMPcore::op_asl_a() { + op_io(); + regs.a = op_asl(regs.a); + } + + void SMPcore::op_lsr_a() { + op_io(); + regs.a = op_lsr(regs.a); + } + + void SMPcore::op_rol_a() { + op_io(); + regs.a = op_rol(regs.a); + } + + void SMPcore::op_ror_a() { + op_io(); + regs.a = op_ror(regs.a); + } + + + void SMPcore::op_inc_dp() { + dp = op_readpc(); + rd = op_readdp(dp); + rd = op_inc(rd); + op_writedp(dp, rd); + } + + void SMPcore::op_dec_dp() { + dp = op_readpc(); + rd = op_readdp(dp); + rd = op_dec(rd); + op_writedp(dp, rd); + } + + void SMPcore::op_asl_dp() { + dp = op_readpc(); + rd = op_readdp(dp); + rd = op_asl(rd); + op_writedp(dp, rd); + } + + void SMPcore::op_lsr_dp() { + dp = op_readpc(); + rd = op_readdp(dp); + rd = op_lsr(rd); + op_writedp(dp, rd); + } + + void SMPcore::op_rol_dp() { + dp = op_readpc(); + rd = op_readdp(dp); + rd = op_rol(rd); + op_writedp(dp, rd); + } + + void SMPcore::op_ror_dp() { + dp = op_readpc(); + rd = op_readdp(dp); + rd = op_ror(rd); + op_writedp(dp, rd); + } + + + void SMPcore::op_inc_dpx() { + dp = op_readpc(); + op_io(); + rd = op_readdp(dp + regs.x); + rd = op_inc(rd); + op_writedp(dp + regs.x, rd); + } + + void SMPcore::op_dec_dpx() { + dp = op_readpc(); + op_io(); + rd = op_readdp(dp + regs.x); + rd = op_dec(rd); + op_writedp(dp + regs.x, rd); + } + + void SMPcore::op_asl_dpx() { + dp = op_readpc(); + op_io(); + rd = op_readdp(dp + regs.x); + rd = op_asl(rd); + op_writedp(dp + regs.x, rd); + } + + void SMPcore::op_lsr_dpx() { + dp = op_readpc(); + op_io(); + rd = op_readdp(dp + regs.x); + rd = op_lsr(rd); + op_writedp(dp + regs.x, rd); + } + + void SMPcore::op_rol_dpx() { + dp = op_readpc(); + op_io(); + rd = op_readdp(dp + regs.x); + rd = op_rol(rd); + op_writedp(dp + regs.x, rd); + } + + void SMPcore::op_ror_dpx() { + dp = op_readpc(); + op_io(); + rd = op_readdp(dp + regs.x); + rd = op_ror(rd); + op_writedp(dp + regs.x, rd); + } + + + void SMPcore::op_inc_addr() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + rd = op_readaddr(dp); + rd = op_inc(rd); + op_writeaddr(dp, rd); + } + + void SMPcore::op_dec_addr() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + rd = op_readaddr(dp); + rd = op_dec(rd); + op_writeaddr(dp, rd); + } + + void SMPcore::op_asl_addr() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + rd = op_readaddr(dp); + rd = op_asl(rd); + op_writeaddr(dp, rd); + } + + void SMPcore::op_lsr_addr() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + rd = op_readaddr(dp); + rd = op_lsr(rd); + op_writeaddr(dp, rd); + } + + void SMPcore::op_rol_addr() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + rd = op_readaddr(dp); + rd = op_rol(rd); + op_writeaddr(dp, rd); + } + + void SMPcore::op_ror_addr() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + rd = op_readaddr(dp); + rd = op_ror(rd); + op_writeaddr(dp, rd); + } + + + void SMPcore::op_tset_addr_a() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + rd = op_readaddr(dp); + regs.p.n = ((regs.a - rd) & 0x80); + regs.p.z = ((regs.a - rd) == 0); + op_readaddr(dp); + op_writeaddr(dp, rd | regs.a); + } + + void SMPcore::op_tclr_addr_a() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + rd = op_readaddr(dp); + regs.p.n = ((regs.a - rd) & 0x80); + regs.p.z = ((regs.a - rd) == 0); + op_readaddr(dp); + op_writeaddr(dp, rd &~ regs.a); + } + + + void SMPcore::op_incw_dp() { + dp = op_readpc(); + rd = op_readdp(dp) << 0; + rd ++; + op_writedp(dp++, rd); + rd += op_readdp(dp) << 8; + op_writedp(dp, rd >> 8); + regs.p.n = (rd & 0x8000); + regs.p.z = (rd == 0); + } + + void SMPcore::op_decw_dp() { + dp = op_readpc(); + rd = op_readdp(dp) << 0; + rd --; + op_writedp(dp++, rd); + rd += op_readdp(dp) << 8; + op_writedp(dp, rd >> 8); + regs.p.n = (rd & 0x8000); + regs.p.z = (rd == 0); + } + + +//=============== +//opcode_misc.bpp +//=============== + + void SMPcore::op_nop() { + op_io(); + } + + void SMPcore::op_sleep() { + while(true) { + op_io(); + op_io(); + } + } + + void SMPcore::op_stop() { + while(true) { + op_io(); + op_io(); + } + } + + void SMPcore::op_xcn() { + op_io(); + op_io(); + op_io(); + op_io(); + regs.a = (regs.a >> 4) | (regs.a << 4); + regs.p.n = (regs.a & 0x80); + regs.p.z = (regs.a == 0); + } + + void SMPcore::op_daa() { + op_io(); + op_io(); + if(regs.p.c || (regs.a) > 0x99) { + regs.a += 0x60; + regs.p.c = 1; + } + if(regs.p.h || (regs.a & 15) > 0x09) { + regs.a += 0x06; + } + regs.p.n = !!(regs.a & 0x80); + regs.p.z = (regs.a == 0); + } + + void SMPcore::op_das() { + op_io(); + op_io(); + if(!regs.p.c || (regs.a) > 0x99) { + regs.a -= 0x60; + regs.p.c = 0; + } + if(!regs.p.h || (regs.a & 15) > 0x09) { + regs.a -= 0x06; + } + regs.p.n = !!(regs.a & 0x80); + regs.p.z = (regs.a == 0); + } + + + void SMPcore::op_clrc() { + op_io(); + regs.p.c=0; + } + + void SMPcore::op_clrp() { + op_io(); + regs.p.p=0; + } + + void SMPcore::op_setc() { + op_io(); + regs.p.c=1; + } + + void SMPcore::op_setp() { + op_io(); + regs.p.p=1; + } + + void SMPcore::op_clrv() { + op_io(); + regs.p.v=regs.p.h=0; + } + + + void SMPcore::op_notc() { + op_io(); + op_io(); + regs.p.c = !regs.p.c; + } + + void SMPcore::op_ei() { + op_io(); + op_io(); + regs.p.i = 1; + } + + void SMPcore::op_di() { + op_io(); + op_io(); + regs.p.i = 0; + } + + + void SMPcore::op_set0_dp() { + dp = op_readpc(); + rd = op_readdp(dp); + rd |=0x01; + op_writedp(dp, rd); + } + + void SMPcore::op_clr0_dp() { + dp = op_readpc(); + rd = op_readdp(dp); + rd &=~0x01; + op_writedp(dp, rd); + } + + void SMPcore::op_set1_dp() { + dp = op_readpc(); + rd = op_readdp(dp); + rd |=0x02; + op_writedp(dp, rd); + } + + void SMPcore::op_clr1_dp() { + dp = op_readpc(); + rd = op_readdp(dp); + rd &=~0x02; + op_writedp(dp, rd); + } + + void SMPcore::op_set2_dp() { + dp = op_readpc(); + rd = op_readdp(dp); + rd |=0x04; + op_writedp(dp, rd); + } + + void SMPcore::op_clr2_dp() { + dp = op_readpc(); + rd = op_readdp(dp); + rd &=~0x04; + op_writedp(dp, rd); + } + + void SMPcore::op_set3_dp() { + dp = op_readpc(); + rd = op_readdp(dp); + rd |=0x08; + op_writedp(dp, rd); + } + + void SMPcore::op_clr3_dp() { + dp = op_readpc(); + rd = op_readdp(dp); + rd &=~0x08; + op_writedp(dp, rd); + } + + void SMPcore::op_set4_dp() { + dp = op_readpc(); + rd = op_readdp(dp); + rd |=0x10; + op_writedp(dp, rd); + } + + void SMPcore::op_clr4_dp() { + dp = op_readpc(); + rd = op_readdp(dp); + rd &=~0x10; + op_writedp(dp, rd); + } + + void SMPcore::op_set5_dp() { + dp = op_readpc(); + rd = op_readdp(dp); + rd |=0x20; + op_writedp(dp, rd); + } + + void SMPcore::op_clr5_dp() { + dp = op_readpc(); + rd = op_readdp(dp); + rd &=~0x20; + op_writedp(dp, rd); + } + + void SMPcore::op_set6_dp() { + dp = op_readpc(); + rd = op_readdp(dp); + rd |=0x40; + op_writedp(dp, rd); + } + + void SMPcore::op_clr6_dp() { + dp = op_readpc(); + rd = op_readdp(dp); + rd &=~0x40; + op_writedp(dp, rd); + } + + void SMPcore::op_set7_dp() { + dp = op_readpc(); + rd = op_readdp(dp); + rd |=0x80; + op_writedp(dp, rd); + } + + void SMPcore::op_clr7_dp() { + dp = op_readpc(); + rd = op_readdp(dp); + rd &=~0x80; + op_writedp(dp, rd); + } + + + void SMPcore::op_push_a() { + op_io(); + op_io(); + op_writestack(regs.a); + } + + void SMPcore::op_push_x() { + op_io(); + op_io(); + op_writestack(regs.x); + } + + void SMPcore::op_push_y() { + op_io(); + op_io(); + op_writestack(regs.y); + } + + void SMPcore::op_push_p() { + op_io(); + op_io(); + op_writestack(regs.p); + } + + + void SMPcore::op_pop_a() { + op_io(); + op_io(); + regs.a = op_readstack(); + } + + void SMPcore::op_pop_x() { + op_io(); + op_io(); + regs.x = op_readstack(); + } + + void SMPcore::op_pop_y() { + op_io(); + op_io(); + regs.y = op_readstack(); + } + + void SMPcore::op_pop_p() { + op_io(); + op_io(); + regs.p = op_readstack(); + } + + + void SMPcore::op_mul_ya() { + op_io(); + op_io(); + op_io(); + op_io(); + op_io(); + op_io(); + op_io(); + op_io(); + ya = regs.y * regs.a; + regs.a = ya; + regs.y = ya >> 8; + //result is set based on y (high-byte) only + regs.p.n = !!(regs.y & 0x80); + regs.p.z = (regs.y == 0); + } + + void SMPcore::op_div_ya_x() { + op_io(); + op_io(); + op_io(); + op_io(); + op_io(); + op_io(); + op_io(); + op_io(); + op_io(); + op_io(); + op_io(); + ya = regs.ya; + //overflow set if quotient >= 256 + regs.p.v = !!(regs.y >= regs.x); + regs.p.h = !!((regs.y & 15) >= (regs.x & 15)); + if(regs.y < (regs.x << 1)) { + //if quotient is <= 511 (will fit into 9-bit result) + regs.a = ya / regs.x; + regs.y = ya % regs.x; + } else { + //otherwise, the quotient won't fit into regs.p.v + regs.a + //this emulates the odd behavior of the S-SMP in this case + regs.a = 255 - (ya - (regs.x << 9)) / (256 - regs.x); + regs.y = regs.x + (ya - (regs.x << 9)) % (256 - regs.x); + } + //result is set based on a (quotient) only + regs.p.n = !!(regs.a & 0x80); + regs.p.z = (regs.a == 0); + } + + + + + diff --git a/tools/bsnes/smp/core/opcode_headers.bpp b/tools/bsnes/smp/core/opcode_headers.bpp new file mode 100755 index 0000000..e212d2f --- /dev/null +++ b/tools/bsnes/smp/core/opcode_headers.bpp @@ -0,0 +1,324 @@ +//============== +//opcode_mov.bpp +//============== + +@macro op_mov_reg(d, s) +void op_mov_{d}_{s}(); +@endmacro + +@macro op_mov_sp_x() +void op_mov_sp_x(); +@endmacro + +@macro op_mov_reg_const(r) +void op_mov_{r}_const(); +@endmacro + +@macro op_mov_a_ix() +void op_mov_a_ix(); +@endmacro + +@macro op_mov_a_ixinc() +void op_mov_a_ixinc(); +@endmacro + +@macro op_mov_reg_dp(r) +void op_mov_{r}_dp(); +@endmacro + +@macro op_mov_reg_dpi(r, i) +void op_mov_{r}_dp{i}(); +@endmacro + +@macro op_mov_reg_addr(r) +void op_mov_{r}_addr(); +@endmacro + +@macro op_mov_a_addri(i) +void op_mov_a_addr{i}(); +@endmacro + +@macro op_mov_a_idpx() +void op_mov_a_idpx(); +@endmacro + +@macro op_mov_a_idpy() +void op_mov_a_idpy(); +@endmacro + +@macro op_mov_dp_dp() +void op_mov_dp_dp(); +@endmacro + +@macro op_mov_dp_const() +void op_mov_dp_const(); +@endmacro + +@macro op_mov_ix_a() +void op_mov_ix_a(); +@endmacro + +@macro op_mov_ixinc_a() +void op_mov_ixinc_a(); +@endmacro + +@macro op_mov_dp_reg(r) +void op_mov_dp_{r}(); +@endmacro + +@macro op_mov_dpi_reg(r, i) +void op_mov_dp{i}_{r}(); +@endmacro + +@macro op_mov_addr_reg(r) +void op_mov_addr_{r}(); +@endmacro + +@macro op_mov_addri_a(i) +void op_mov_addr{i}_a(); +@endmacro + +@macro op_mov_idpx_a() +void op_mov_idpx_a(); +@endmacro + +@macro op_mov_idpy_a() +void op_mov_idpy_a(); +@endmacro + +@macro op_movw_ya_dp() +void op_movw_ya_dp(); +@endmacro + +@macro op_movw_dp_ya() +void op_movw_dp_ya(); +@endmacro + +@macro op_mov1_c_bit() +void op_mov1_c_bit(); +@endmacro + +@macro op_mov1_bit_c() +void op_mov1_bit_c(); +@endmacro + +//============= +//opcode_pc.bpp +//============= + +@macro op_branch(name, condition) +void op_{name}(); +@endmacro + +@macro op_bitbranch(name, bit, condition) +void op_{name}(); +@endmacro + +@macro op_cbne_dp() +void op_cbne_dp(); +@endmacro + +@macro op_cbne_dpx() +void op_cbne_dpx(); +@endmacro + +@macro op_dbnz_dp() +void op_dbnz_dp(); +@endmacro + +@macro op_dbnz_y() +void op_dbnz_y(); +@endmacro + +@macro op_jmp_addr() +void op_jmp_addr(); +@endmacro + +@macro op_jmp_iaddrx() +void op_jmp_iaddrx(); +@endmacro + +@macro op_call() +void op_call(); +@endmacro + +@macro op_pcall() +void op_pcall(); +@endmacro + +@macro op_tcall(bit) +void op_tcall_{bit}(); +@endmacro + +@macro op_brk() +void op_brk(); +@endmacro + +@macro op_ret() +void op_ret(); +@endmacro + +@macro op_reti() +void op_reti(); +@endmacro + +//=============== +//opcode_read.bpp +//=============== + +@macro op_read_reg_const(name, r) +void op_{name}_{r}_const(); +@endmacro + +@macro op_read_a_ix(name) +void op_{name}_a_ix(); +@endmacro + +@macro op_read_reg_dp(name, r) +void op_{name}_{r}_dp(); +@endmacro + +@macro op_read_a_dpx(name) +void op_{name}_a_dpx(); +@endmacro + +@macro op_read_reg_addr(name, r) +void op_{name}_{r}_addr(); +@endmacro + +@macro op_read_a_addri(name, i) +void op_{name}_a_addr{i}(); +@endmacro + +@macro op_read_a_idpx(name) +void op_{name}_a_idpx(); +@endmacro + +@macro op_read_a_idpy(name) +void op_{name}_a_idpy(); +@endmacro + +@macro op_read_ix_iy(name, write) +void op_{name}_ix_iy(); +@endmacro + +@macro op_read_dp_dp(name, write) +void op_{name}_dp_dp(); +@endmacro + +@macro op_read_dp_const(name, write) +void op_{name}_dp_const(); +@endmacro + +@macro op_read_ya_dp(name) +void op_{name}_ya_dp(); +@endmacro + +@macro op_cmpw_ya_dp() +void op_cmpw_ya_dp(); +@endmacro + +@macro op_and1(name, op) +void op_and1_{name}(); +@endmacro + +@macro op_eor1() +void op_eor1_bit(); +@endmacro + +@macro op_not1() +void op_not1_bit(); +@endmacro + +@macro op_or1(name, op) +void op_or1_{name}(); +@endmacro + +//============== +//opcode_rmw.bpp +//============== + +@macro op_adjust_reg(name, r) +void op_{name}_{r}(); +@endmacro + +@macro op_adjust_dp(name) +void op_{name}_dp(); +@endmacro + +@macro op_adjust_dpx(name) +void op_{name}_dpx(); +@endmacro + +@macro op_adjust_addr(name) +void op_{name}_addr(); +@endmacro + +@macro op_tadjust_addr(name, op) +void op_{name}_addr_a(); +@endmacro + +@macro op_adjustw_dp(name, op) +void op_{name}_dp(); +@endmacro + +//=============== +//opcode_misc.bpp +//=============== + +@macro op_nop() +void op_nop(); +@endmacro + +@macro op_wait(name) +void op_{name}(); +@endmacro + +@macro op_xcn() +void op_xcn(); +@endmacro + +@macro op_daa() +void op_daa(); +@endmacro + +@macro op_das() +void op_das(); +@endmacro + +@macro op_setbit(name, op) +void op_{name}(); +@endmacro + +@macro op_notc() +void op_notc(); +@endmacro + +@macro op_seti(name, bit) +void op_{name}(); +@endmacro + +@macro op_setbit_dp(name, op) +void op_{name}_dp(); +@endmacro + +@macro op_push(r) +void op_push_{r}(); +@endmacro + +@macro op_pop(r) +void op_pop_{r}(); +@endmacro + +@macro op_mul_ya() +void op_mul_ya(); +@endmacro + +@macro op_div_ya_x() +void op_div_ya_x(); +@endmacro + +// + +@include "opcode_list.bpp" + diff --git a/tools/bsnes/smp/core/opcode_headers.hpp b/tools/bsnes/smp/core/opcode_headers.hpp new file mode 100755 index 0000000..5a11937 --- /dev/null +++ b/tools/bsnes/smp/core/opcode_headers.hpp @@ -0,0 +1,675 @@ +//============== +//opcode_mov.bpp +//============== + + + + + + + + + + + + + + + + + + + + + + + + + + +//============= +//opcode_pc.bpp +//============= + + + + + + + + + + + + + + + +//=============== +//opcode_read.bpp +//=============== + + + + + + + + + + + + + + + + + + +//============== +//opcode_rmw.bpp +//============== + + + + + + + +//=============== +//opcode_misc.bpp +//=============== + + + + + + + + + + + + + + +// + +//============== +//opcode_mov.bpp +//============== + +void op_mov_a_x(); + +void op_mov_a_y(); + +void op_mov_x_a(); + +void op_mov_y_a(); + +void op_mov_x_sp(); + +void op_mov_sp_x(); + + +void op_mov_a_const(); + +void op_mov_x_const(); + +void op_mov_y_const(); + +void op_mov_a_ix(); + +void op_mov_a_ixinc(); + + +void op_mov_a_dp(); + +void op_mov_x_dp(); + +void op_mov_y_dp(); + + +void op_mov_a_dpx(); + +void op_mov_x_dpy(); + +void op_mov_y_dpx(); + + +void op_mov_a_addr(); + +void op_mov_x_addr(); + +void op_mov_y_addr(); + + +void op_mov_a_addrx(); + +void op_mov_a_addry(); + + +void op_mov_a_idpx(); + +void op_mov_a_idpy(); + +void op_mov_dp_dp(); + +void op_mov_dp_const(); + +void op_mov_ix_a(); + +void op_mov_ixinc_a(); + + +void op_mov_dp_a(); + +void op_mov_dp_x(); + +void op_mov_dp_y(); + + +void op_mov_dpx_a(); + +void op_mov_dpy_x(); + +void op_mov_dpx_y(); + + +void op_mov_addr_a(); + +void op_mov_addr_x(); + +void op_mov_addr_y(); + + +void op_mov_addrx_a(); + +void op_mov_addry_a(); + + +void op_mov_idpx_a(); + +void op_mov_idpy_a(); + +void op_movw_ya_dp(); + +void op_movw_dp_ya(); + +void op_mov1_c_bit(); + +void op_mov1_bit_c(); + + +//============= +//opcode_pc.bpp +//============= + +void op_bra(); + +void op_beq(); + +void op_bne(); + +void op_bcs(); + +void op_bcc(); + +void op_bvs(); + +void op_bvc(); + +void op_bmi(); + +void op_bpl(); + + +void op_bbs0(); + +void op_bbc0(); + +void op_bbs1(); + +void op_bbc1(); + +void op_bbs2(); + +void op_bbc2(); + +void op_bbs3(); + +void op_bbc3(); + +void op_bbs4(); + +void op_bbc4(); + +void op_bbs5(); + +void op_bbc5(); + +void op_bbs6(); + +void op_bbc6(); + +void op_bbs7(); + +void op_bbc7(); + + +void op_cbne_dp(); + +void op_cbne_dpx(); + +void op_dbnz_dp(); + +void op_dbnz_y(); + +void op_jmp_addr(); + +void op_jmp_iaddrx(); + +void op_call(); + +void op_pcall(); + + +void op_tcall_0(); + +void op_tcall_1(); + +void op_tcall_2(); + +void op_tcall_3(); + +void op_tcall_4(); + +void op_tcall_5(); + +void op_tcall_6(); + +void op_tcall_7(); + +void op_tcall_8(); + +void op_tcall_9(); + +void op_tcall_10(); + +void op_tcall_11(); + +void op_tcall_12(); + +void op_tcall_13(); + +void op_tcall_14(); + +void op_tcall_15(); + + +void op_brk(); + +void op_ret(); + +void op_reti(); + + +//=============== +//opcode_read.bpp +//=============== + +void op_adc_a_const(); + +void op_and_a_const(); + +void op_cmp_a_const(); + +void op_cmp_x_const(); + +void op_cmp_y_const(); + +void op_eor_a_const(); + +void op_or_a_const(); + +void op_sbc_a_const(); + + +void op_adc_a_ix(); + +void op_and_a_ix(); + +void op_cmp_a_ix(); + +void op_eor_a_ix(); + +void op_or_a_ix(); + +void op_sbc_a_ix(); + + +void op_adc_a_dp(); + +void op_and_a_dp(); + +void op_cmp_a_dp(); + +void op_cmp_x_dp(); + +void op_cmp_y_dp(); + +void op_eor_a_dp(); + +void op_or_a_dp(); + +void op_sbc_a_dp(); + + +void op_adc_a_dpx(); + +void op_and_a_dpx(); + +void op_cmp_a_dpx(); + +void op_eor_a_dpx(); + +void op_or_a_dpx(); + +void op_sbc_a_dpx(); + + +void op_adc_a_addr(); + +void op_and_a_addr(); + +void op_cmp_a_addr(); + +void op_cmp_x_addr(); + +void op_cmp_y_addr(); + +void op_eor_a_addr(); + +void op_or_a_addr(); + +void op_sbc_a_addr(); + + +void op_adc_a_addrx(); + +void op_adc_a_addry(); + +void op_and_a_addrx(); + +void op_and_a_addry(); + +void op_cmp_a_addrx(); + +void op_cmp_a_addry(); + +void op_eor_a_addrx(); + +void op_eor_a_addry(); + +void op_or_a_addrx(); + +void op_or_a_addry(); + +void op_sbc_a_addrx(); + +void op_sbc_a_addry(); + + +void op_adc_a_idpx(); + +void op_and_a_idpx(); + +void op_cmp_a_idpx(); + +void op_eor_a_idpx(); + +void op_or_a_idpx(); + +void op_sbc_a_idpx(); + + +void op_adc_a_idpy(); + +void op_and_a_idpy(); + +void op_cmp_a_idpy(); + +void op_eor_a_idpy(); + +void op_or_a_idpy(); + +void op_sbc_a_idpy(); + + +void op_adc_ix_iy(); + +void op_and_ix_iy(); + +void op_cmp_ix_iy(); + +void op_eor_ix_iy(); + +void op_or_ix_iy(); + +void op_sbc_ix_iy(); + + +void op_adc_dp_dp(); + +void op_and_dp_dp(); + +void op_cmp_dp_dp(); + +void op_eor_dp_dp(); + +void op_or_dp_dp(); + +void op_sbc_dp_dp(); + + +void op_adc_dp_const(); + +void op_and_dp_const(); + +void op_cmp_dp_const(); + +void op_eor_dp_const(); + +void op_or_dp_const(); + +void op_sbc_dp_const(); + + +void op_addw_ya_dp(); + +void op_subw_ya_dp(); + +void op_cmpw_ya_dp(); + + +void op_and1_bit(); + +void op_and1_notbit(); + +void op_eor1_bit(); + +void op_not1_bit(); + +void op_or1_bit(); + +void op_or1_notbit(); + + +//============== +//opcode_rmw.bpp +//============== + +void op_inc_a(); + +void op_inc_x(); + +void op_inc_y(); + +void op_dec_a(); + +void op_dec_x(); + +void op_dec_y(); + +void op_asl_a(); + +void op_lsr_a(); + +void op_rol_a(); + +void op_ror_a(); + + +void op_inc_dp(); + +void op_dec_dp(); + +void op_asl_dp(); + +void op_lsr_dp(); + +void op_rol_dp(); + +void op_ror_dp(); + + +void op_inc_dpx(); + +void op_dec_dpx(); + +void op_asl_dpx(); + +void op_lsr_dpx(); + +void op_rol_dpx(); + +void op_ror_dpx(); + + +void op_inc_addr(); + +void op_dec_addr(); + +void op_asl_addr(); + +void op_lsr_addr(); + +void op_rol_addr(); + +void op_ror_addr(); + + +void op_tset_addr_a(); + +void op_tclr_addr_a(); + + +void op_incw_dp(); + +void op_decw_dp(); + + +//=============== +//opcode_misc.bpp +//=============== + +void op_nop(); + +void op_sleep(); + +void op_stop(); + +void op_xcn(); + +void op_daa(); + +void op_das(); + + +void op_clrc(); + +void op_clrp(); + +void op_setc(); + +void op_setp(); + +void op_clrv(); + + +void op_notc(); + +void op_ei(); + +void op_di(); + + +void op_set0_dp(); + +void op_clr0_dp(); + +void op_set1_dp(); + +void op_clr1_dp(); + +void op_set2_dp(); + +void op_clr2_dp(); + +void op_set3_dp(); + +void op_clr3_dp(); + +void op_set4_dp(); + +void op_clr4_dp(); + +void op_set5_dp(); + +void op_clr5_dp(); + +void op_set6_dp(); + +void op_clr6_dp(); + +void op_set7_dp(); + +void op_clr7_dp(); + + +void op_push_a(); + +void op_push_x(); + +void op_push_y(); + +void op_push_p(); + + +void op_pop_a(); + +void op_pop_x(); + +void op_pop_y(); + +void op_pop_p(); + + +void op_mul_ya(); + +void op_div_ya_x(); + + + + + diff --git a/tools/bsnes/smp/core/opcode_list.bpp b/tools/bsnes/smp/core/opcode_list.bpp new file mode 100755 index 0000000..6b592e4 --- /dev/null +++ b/tools/bsnes/smp/core/opcode_list.bpp @@ -0,0 +1,319 @@ +//============== +//opcode_mov.bpp +//============== + +@op_mov_reg(a, x) +@op_mov_reg(a, y) +@op_mov_reg(x, a) +@op_mov_reg(y, a) +@op_mov_reg(x, sp) +@op_mov_sp_x() + +@op_mov_reg_const(a) +@op_mov_reg_const(x) +@op_mov_reg_const(y) +@op_mov_a_ix() +@op_mov_a_ixinc() + +@op_mov_reg_dp(a) +@op_mov_reg_dp(x) +@op_mov_reg_dp(y) + +@op_mov_reg_dpi(a, x) +@op_mov_reg_dpi(x, y) +@op_mov_reg_dpi(y, x) + +@op_mov_reg_addr(a) +@op_mov_reg_addr(x) +@op_mov_reg_addr(y) + +@op_mov_a_addri(x) +@op_mov_a_addri(y) + +@op_mov_a_idpx() +@op_mov_a_idpy() +@op_mov_dp_dp() +@op_mov_dp_const() +@op_mov_ix_a() +@op_mov_ixinc_a() + +@op_mov_dp_reg(a) +@op_mov_dp_reg(x) +@op_mov_dp_reg(y) + +@op_mov_dpi_reg(a, x) +@op_mov_dpi_reg(x, y) +@op_mov_dpi_reg(y, x) + +@op_mov_addr_reg(a) +@op_mov_addr_reg(x) +@op_mov_addr_reg(y) + +@op_mov_addri_a(x) +@op_mov_addri_a(y) + +@op_mov_idpx_a() +@op_mov_idpy_a() +@op_movw_ya_dp() +@op_movw_dp_ya() +@op_mov1_c_bit() +@op_mov1_bit_c() + +//============= +//opcode_pc.bpp +//============= + +@op_branch(bra, 0) +@op_branch(beq, !regs.p.z) +@op_branch(bne, regs.p.z) +@op_branch(bcs, !regs.p.c) +@op_branch(bcc, regs.p.c) +@op_branch(bvs, !regs.p.v) +@op_branch(bvc, regs.p.v) +@op_branch(bmi, !regs.p.n) +@op_branch(bpl, regs.p.n) + +@op_bitbranch(bbs0, 0x01, !=) +@op_bitbranch(bbc0, 0x01, ==) +@op_bitbranch(bbs1, 0x02, !=) +@op_bitbranch(bbc1, 0x02, ==) +@op_bitbranch(bbs2, 0x04, !=) +@op_bitbranch(bbc2, 0x04, ==) +@op_bitbranch(bbs3, 0x08, !=) +@op_bitbranch(bbc3, 0x08, ==) +@op_bitbranch(bbs4, 0x10, !=) +@op_bitbranch(bbc4, 0x10, ==) +@op_bitbranch(bbs5, 0x20, !=) +@op_bitbranch(bbc5, 0x20, ==) +@op_bitbranch(bbs6, 0x40, !=) +@op_bitbranch(bbc6, 0x40, ==) +@op_bitbranch(bbs7, 0x80, !=) +@op_bitbranch(bbc7, 0x80, ==) + +@op_cbne_dp() +@op_cbne_dpx() +@op_dbnz_dp() +@op_dbnz_y() +@op_jmp_addr() +@op_jmp_iaddrx() +@op_call() +@op_pcall() + +@op_tcall( 0) +@op_tcall( 1) +@op_tcall( 2) +@op_tcall( 3) +@op_tcall( 4) +@op_tcall( 5) +@op_tcall( 6) +@op_tcall( 7) +@op_tcall( 8) +@op_tcall( 9) +@op_tcall(10) +@op_tcall(11) +@op_tcall(12) +@op_tcall(13) +@op_tcall(14) +@op_tcall(15) + +@op_brk() +@op_ret() +@op_reti() + +//=============== +//opcode_read.bpp +//=============== + +@op_read_reg_const(adc, a) +@op_read_reg_const(and, a) +@op_read_reg_const(cmp, a) +@op_read_reg_const(cmp, x) +@op_read_reg_const(cmp, y) +@op_read_reg_const(eor, a) +@op_read_reg_const(or, a) +@op_read_reg_const(sbc, a) + +@op_read_a_ix(adc) +@op_read_a_ix(and) +@op_read_a_ix(cmp) +@op_read_a_ix(eor) +@op_read_a_ix(or) +@op_read_a_ix(sbc) + +@op_read_reg_dp(adc, a) +@op_read_reg_dp(and, a) +@op_read_reg_dp(cmp, a) +@op_read_reg_dp(cmp, x) +@op_read_reg_dp(cmp, y) +@op_read_reg_dp(eor, a) +@op_read_reg_dp(or, a) +@op_read_reg_dp(sbc, a) + +@op_read_a_dpx(adc) +@op_read_a_dpx(and) +@op_read_a_dpx(cmp) +@op_read_a_dpx(eor) +@op_read_a_dpx(or) +@op_read_a_dpx(sbc) + +@op_read_reg_addr(adc, a) +@op_read_reg_addr(and, a) +@op_read_reg_addr(cmp, a) +@op_read_reg_addr(cmp, x) +@op_read_reg_addr(cmp, y) +@op_read_reg_addr(eor, a) +@op_read_reg_addr(or, a) +@op_read_reg_addr(sbc, a) + +@op_read_a_addri(adc, x) +@op_read_a_addri(adc, y) +@op_read_a_addri(and, x) +@op_read_a_addri(and, y) +@op_read_a_addri(cmp, x) +@op_read_a_addri(cmp, y) +@op_read_a_addri(eor, x) +@op_read_a_addri(eor, y) +@op_read_a_addri(or, x) +@op_read_a_addri(or, y) +@op_read_a_addri(sbc, x) +@op_read_a_addri(sbc, y) + +@op_read_a_idpx(adc) +@op_read_a_idpx(and) +@op_read_a_idpx(cmp) +@op_read_a_idpx(eor) +@op_read_a_idpx(or) +@op_read_a_idpx(sbc) + +@op_read_a_idpy(adc) +@op_read_a_idpy(and) +@op_read_a_idpy(cmp) +@op_read_a_idpy(eor) +@op_read_a_idpy(or) +@op_read_a_idpy(sbc) + +@op_read_ix_iy(adc, 1) +@op_read_ix_iy(and, 1) +@op_read_ix_iy(cmp, 0) +@op_read_ix_iy(eor, 1) +@op_read_ix_iy(or, 1) +@op_read_ix_iy(sbc, 1) + +@op_read_dp_dp(adc, 1) +@op_read_dp_dp(and, 1) +@op_read_dp_dp(cmp, 0) +@op_read_dp_dp(eor, 1) +@op_read_dp_dp(or, 1) +@op_read_dp_dp(sbc, 1) + +@op_read_dp_const(adc, 1) +@op_read_dp_const(and, 1) +@op_read_dp_const(cmp, 0) +@op_read_dp_const(eor, 1) +@op_read_dp_const(or, 1) +@op_read_dp_const(sbc, 1) + +@op_read_ya_dp(addw) +@op_read_ya_dp(subw) +@op_cmpw_ya_dp() + +@op_and1(bit, !!) +@op_and1(notbit, !) +@op_eor1() +@op_not1() +@op_or1(bit, !!) +@op_or1(notbit, !) + +//============== +//opcode_rmw.bpp +//============== + +@op_adjust_reg(inc, a) +@op_adjust_reg(inc, x) +@op_adjust_reg(inc, y) +@op_adjust_reg(dec, a) +@op_adjust_reg(dec, x) +@op_adjust_reg(dec, y) +@op_adjust_reg(asl, a) +@op_adjust_reg(lsr, a) +@op_adjust_reg(rol, a) +@op_adjust_reg(ror, a) + +@op_adjust_dp(inc) +@op_adjust_dp(dec) +@op_adjust_dp(asl) +@op_adjust_dp(lsr) +@op_adjust_dp(rol) +@op_adjust_dp(ror) + +@op_adjust_dpx(inc) +@op_adjust_dpx(dec) +@op_adjust_dpx(asl) +@op_adjust_dpx(lsr) +@op_adjust_dpx(rol) +@op_adjust_dpx(ror) + +@op_adjust_addr(inc) +@op_adjust_addr(dec) +@op_adjust_addr(asl) +@op_adjust_addr(lsr) +@op_adjust_addr(rol) +@op_adjust_addr(ror) + +@op_tadjust_addr(tset, |) +@op_tadjust_addr(tclr, &~) + +@op_adjustw_dp(incw, ++) +@op_adjustw_dp(decw, --) + +//=============== +//opcode_misc.bpp +//=============== + +@op_nop() +@op_wait(sleep) +@op_wait(stop) +@op_xcn() +@op_daa() +@op_das() + +@op_setbit(clrc, regs.p.c = 0) +@op_setbit(clrp, regs.p.p = 0) +@op_setbit(setc, regs.p.c = 1) +@op_setbit(setp, regs.p.p = 1) +@op_setbit(clrv, regs.p.v = regs.p.h = 0) + +@op_notc() +@op_seti(ei, 1) +@op_seti(di, 0) + +@op_setbit_dp(set0, |= 0x01) +@op_setbit_dp(clr0, &= ~0x01) +@op_setbit_dp(set1, |= 0x02) +@op_setbit_dp(clr1, &= ~0x02) +@op_setbit_dp(set2, |= 0x04) +@op_setbit_dp(clr2, &= ~0x04) +@op_setbit_dp(set3, |= 0x08) +@op_setbit_dp(clr3, &= ~0x08) +@op_setbit_dp(set4, |= 0x10) +@op_setbit_dp(clr4, &= ~0x10) +@op_setbit_dp(set5, |= 0x20) +@op_setbit_dp(clr5, &= ~0x20) +@op_setbit_dp(set6, |= 0x40) +@op_setbit_dp(clr6, &= ~0x40) +@op_setbit_dp(set7, |= 0x80) +@op_setbit_dp(clr7, &= ~0x80) + +@op_push(a) +@op_push(x) +@op_push(y) +@op_push(p) + +@op_pop(a) +@op_pop(x) +@op_pop(y) +@op_pop(p) + +@op_mul_ya() +@op_div_ya_x() + diff --git a/tools/bsnes/smp/core/opcode_misc.bpp b/tools/bsnes/smp/core/opcode_misc.bpp new file mode 100755 index 0000000..1f5074d --- /dev/null +++ b/tools/bsnes/smp/core/opcode_misc.bpp @@ -0,0 +1,159 @@ +@macro op_nop() + void {class}::op_nop() { + op_io(); + } +@endmacro + +@macro op_wait(name) + void {class}::op_{name}() { + while(true) { + op_io(); + op_io(); + } + } +@endmacro + +@macro op_xcn() + void {class}::op_xcn() { + op_io(); + op_io(); + op_io(); + op_io(); + regs.a = (regs.a >> 4) | (regs.a << 4); + regs.p.n = (regs.a & 0x80); + regs.p.z = (regs.a == 0); + } +@endmacro + +@macro op_daa() + void {class}::op_daa() { + op_io(); + op_io(); + if(regs.p.c || (regs.a) > 0x99) { + regs.a += 0x60; + regs.p.c = 1; + } + if(regs.p.h || (regs.a & 15) > 0x09) { + regs.a += 0x06; + } + regs.p.n = !!(regs.a & 0x80); + regs.p.z = (regs.a == 0); + } +@endmacro + +@macro op_das() + void {class}::op_das() { + op_io(); + op_io(); + if(!regs.p.c || (regs.a) > 0x99) { + regs.a -= 0x60; + regs.p.c = 0; + } + if(!regs.p.h || (regs.a & 15) > 0x09) { + regs.a -= 0x06; + } + regs.p.n = !!(regs.a & 0x80); + regs.p.z = (regs.a == 0); + } +@endmacro + +@macro op_setbit(name, op) + void {class}::op_{name}() { + op_io(); + {op}; + } +@endmacro + +@macro op_notc() + void {class}::op_notc() { + op_io(); + op_io(); + regs.p.c = !regs.p.c; + } +@endmacro + +@macro op_seti(name, bit) + void {class}::op_{name}() { + op_io(); + op_io(); + regs.p.i = {bit}; + } +@endmacro + +@macro op_setbit_dp(name, op) + void {class}::op_{name}_dp() { + dp = op_readpc(); + rd = op_readdp(dp); + rd {op}; + op_writedp(dp, rd); + } +@endmacro + +@macro op_push(r) + void {class}::op_push_{r}() { + op_io(); + op_io(); + op_writestack(regs.{r}); + } +@endmacro + +@macro op_pop(r) + void {class}::op_pop_{r}() { + op_io(); + op_io(); + regs.{r} = op_readstack(); + } +@endmacro + +@macro op_mul_ya() + void {class}::op_mul_ya() { + op_io(); + op_io(); + op_io(); + op_io(); + op_io(); + op_io(); + op_io(); + op_io(); + ya = regs.y * regs.a; + regs.a = ya; + regs.y = ya >> 8; + //result is set based on y (high-byte) only + regs.p.n = !!(regs.y & 0x80); + regs.p.z = (regs.y == 0); + } +@endmacro + +@macro op_div_ya_x() + void {class}::op_div_ya_x() { + op_io(); + op_io(); + op_io(); + op_io(); + op_io(); + op_io(); + op_io(); + op_io(); + op_io(); + op_io(); + op_io(); + ya = regs.ya; + //overflow set if quotient >= 256 + regs.p.v = !!(regs.y >= regs.x); + regs.p.h = !!((regs.y & 15) >= (regs.x & 15)); + if(regs.y < (regs.x << 1)) { + //if quotient is <= 511 (will fit into 9-bit result) + regs.a = ya / regs.x; + regs.y = ya % regs.x; + } else { + //otherwise, the quotient won't fit into regs.p.v + regs.a + //this emulates the odd behavior of the S-SMP in this case + regs.a = 255 - (ya - (regs.x << 9)) / (256 - regs.x); + regs.y = regs.x + (ya - (regs.x << 9)) % (256 - regs.x); + } + //result is set based on a (quotient) only + regs.p.n = !!(regs.a & 0x80); + regs.p.z = (regs.a == 0); + } +@endmacro + diff --git a/tools/bsnes/smp/core/opcode_mov.bpp b/tools/bsnes/smp/core/opcode_mov.bpp new file mode 100755 index 0000000..b643f9e --- /dev/null +++ b/tools/bsnes/smp/core/opcode_mov.bpp @@ -0,0 +1,247 @@ +@macro op_mov_reg(d, s) + void {class}::op_mov_{d}_{s}() { + op_io(); + regs.{d} = regs.{s}; + regs.p.n = (regs.{d} & 0x80); + regs.p.z = (regs.{d} == 0); + } +@endmacro + +@macro op_mov_sp_x() + void {class}::op_mov_sp_x() { + op_io(); + regs.sp = regs.x; + } +@endmacro + +@macro op_mov_reg_const(r) + void {class}::op_mov_{r}_const() { + regs.{r} = op_readpc(); + regs.p.n = (regs.{r} & 0x80); + regs.p.z = (regs.{r} == 0); + } +@endmacro + +@macro op_mov_a_ix() + void {class}::op_mov_a_ix() { + op_io(); + regs.a = op_readdp(regs.x); + regs.p.n = (regs.a & 0x80); + regs.p.z = (regs.a == 0); + } +@endmacro + +@macro op_mov_a_ixinc() + void {class}::op_mov_a_ixinc() { + op_io(); + regs.a = op_readdp(regs.x++); + op_io(); + regs.p.n = (regs.a & 0x80); + regs.p.z = (regs.a == 0); + } +@endmacro + +@macro op_mov_reg_dp(r) + void {class}::op_mov_{r}_dp() { + sp = op_readpc(); + regs.{r} = op_readdp(sp); + regs.p.n = (regs.{r} & 0x80); + regs.p.z = (regs.{r} == 0); + } +@endmacro + +@macro op_mov_reg_dpi(r, i) + void {class}::op_mov_{r}_dp{i}() { + sp = op_readpc(); + op_io(); + regs.{r} = op_readdp(sp + regs.{i}); + regs.p.n = (regs.{r} & 0x80); + regs.p.z = (regs.{r} == 0); + } +@endmacro + +@macro op_mov_reg_addr(r) + void {class}::op_mov_{r}_addr() { + sp = op_readpc() << 0; + sp |= op_readpc() << 8; + regs.{r} = op_readaddr(sp); + regs.p.n = (regs.{r} & 0x80); + regs.p.z = (regs.{r} == 0); + } +@endmacro + +@macro op_mov_a_addri(i) + void {class}::op_mov_a_addr{i}() { + sp = op_readpc() << 0; + sp |= op_readpc() << 8; + op_io(); + regs.a = op_readaddr(sp + regs.{i}); + regs.p.n = (regs.a & 0x80); + regs.p.z = (regs.a == 0); + } +@endmacro + +@macro op_mov_a_idpx() + void {class}::op_mov_a_idpx() { + dp = op_readpc() + regs.x; + op_io(); + sp = op_readdp(dp + 0) << 0; + sp |= op_readdp(dp + 1) << 8; + regs.a = op_readaddr(sp); + regs.p.n = (regs.a & 0x80); + regs.p.z = (regs.a == 0); + } +@endmacro + +@macro op_mov_a_idpy() + void {class}::op_mov_a_idpy() { + dp = op_readpc(); + op_io(); + sp = op_readdp(dp + 0) << 0; + sp |= op_readdp(dp + 1) << 8; + regs.a = op_readaddr(sp + regs.y); + regs.p.n = (regs.a & 0x80); + regs.p.z = (regs.a == 0); + } +@endmacro + +@macro op_mov_dp_dp() + void {class}::op_mov_dp_dp() { + sp = op_readpc(); + rd = op_readdp(sp); + dp = op_readpc(); + op_writedp(dp, rd); + } +@endmacro + +@macro op_mov_dp_const() + void {class}::op_mov_dp_const() { + rd = op_readpc(); + dp = op_readpc(); + op_readdp(dp); + op_writedp(dp, rd); + } +@endmacro + +@macro op_mov_ix_a() + void {class}::op_mov_ix_a() { + op_io(); + op_readdp(regs.x); + op_writedp(regs.x, regs.a); + } +@endmacro + +@macro op_mov_ixinc_a() + void {class}::op_mov_ixinc_a() { + op_io(); + op_io(); + op_writedp(regs.x++, regs.a); + } +@endmacro + +@macro op_mov_dp_reg(r) + void {class}::op_mov_dp_{r}() { + dp = op_readpc(); + op_readdp(dp); + op_writedp(dp, regs.{r}); + } +@endmacro + +@macro op_mov_dpi_reg(r, i) + void {class}::op_mov_dp{i}_{r}() { + dp = op_readpc(); + op_io(); + dp += regs.{i}; + op_readdp(dp); + op_writedp(dp, regs.{r}); + } +@endmacro + +@macro op_mov_addr_reg(r) + void {class}::op_mov_addr_{r}() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + op_readaddr(dp); + op_writeaddr(dp, regs.{r}); + } +@endmacro + +@macro op_mov_addri_a(i) + void {class}::op_mov_addr{i}_a() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + op_io(); + dp += regs.{i}; + op_readaddr(dp); + op_writeaddr(dp, regs.a); + } +@endmacro + +@macro op_mov_idpx_a() + void {class}::op_mov_idpx_a() { + sp = op_readpc(); + op_io(); + sp += regs.x; + dp = op_readdp(sp + 0) << 0; + dp |= op_readdp(sp + 1) << 8; + op_readaddr(dp); + op_writeaddr(dp, regs.a); + } +@endmacro + +@macro op_mov_idpy_a() + void {class}::op_mov_idpy_a() { + sp = op_readpc(); + dp = op_readdp(sp + 0) << 0; + dp |= op_readdp(sp + 1) << 8; + op_io(); + dp += regs.y; + op_readaddr(dp); + op_writeaddr(dp, regs.a); + } +@endmacro + +@macro op_movw_ya_dp() + void {class}::op_movw_ya_dp() { + sp = op_readpc(); + regs.a = op_readdp(sp + 0); + op_io(); + regs.y = op_readdp(sp + 1); + regs.p.n = (regs.ya & 0x8000); + regs.p.z = (regs.ya == 0); + } +@endmacro + +@macro op_movw_dp_ya() + void {class}::op_movw_dp_ya() { + dp = op_readpc(); + op_readdp(dp); + op_writedp(dp + 0, regs.a); + op_writedp(dp + 1, regs.y); + } +@endmacro + +@macro op_mov1_c_bit() + void {class}::op_mov1_c_bit() { + sp = op_readpc() << 0; + sp |= op_readpc() << 8; + bit = sp >> 13; + sp &= 0x1fff; + rd = op_readaddr(sp); + regs.p.c = (rd & (1 << bit)); + } +@endmacro + +@macro op_mov1_bit_c() + void {class}::op_mov1_bit_c() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + bit = dp >> 13; + dp &= 0x1fff; + rd = op_readaddr(dp); + (regs.p.c) ? rd |= (1 << bit) : rd &= ~(1 << bit); + op_io(); + op_writeaddr(dp, rd); + } +@endmacro + diff --git a/tools/bsnes/smp/core/opcode_pc.bpp b/tools/bsnes/smp/core/opcode_pc.bpp new file mode 100755 index 0000000..8f9ecdd --- /dev/null +++ b/tools/bsnes/smp/core/opcode_pc.bpp @@ -0,0 +1,170 @@ +@macro op_branch(name, condition) + void {class}::op_{name}() { + rd = op_readpc(); + if({condition}) return; + op_io(); + op_io(); + regs.pc += (int8_t)rd; + } +@endmacro + +@macro op_bitbranch(name, bit, condition) + void {class}::op_{name}() { + dp = op_readpc(); + sp = op_readdp(dp); + rd = op_readpc(); + op_io(); + if((sp & {bit}) {condition} {bit}) return; + op_io(); + op_io(); + regs.pc += (int8_t)rd; + } +@endmacro + +@macro op_cbne_dp() + void {class}::op_cbne_dp() { + dp = op_readpc(); + sp = op_readdp(dp); + rd = op_readpc(); + op_io(); + if(regs.a == sp) return; + op_io(); + op_io(); + regs.pc += (int8_t)rd; + } +@endmacro + +@macro op_cbne_dpx() + void {class}::op_cbne_dpx() { + dp = op_readpc(); + op_io(); + sp = op_readdp(dp + regs.x); + rd = op_readpc(); + op_io(); + if(regs.a == sp) return; + op_io(); + op_io(); + regs.pc += (int8_t)rd; + } +@endmacro + +@macro op_dbnz_dp() + void {class}::op_dbnz_dp() { + dp = op_readpc(); + wr = op_readdp(dp); + op_writedp(dp, --wr); + rd = op_readpc(); + if(wr == 0) return; + op_io(); + op_io(); + regs.pc += (int8_t)rd; + } +@endmacro + +@macro op_dbnz_y() + void {class}::op_dbnz_y() { + rd = op_readpc(); + op_io(); + regs.y--; + op_io(); + if(regs.y == 0) return; + op_io(); + op_io(); + regs.pc += (int8_t)rd; + } +@endmacro + +@macro op_jmp_addr() + void {class}::op_jmp_addr() { + rd = op_readpc() << 0; + rd |= op_readpc() << 8; + regs.pc = rd; + } +@endmacro + +@macro op_jmp_iaddrx() + void {class}::op_jmp_iaddrx() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + op_io(); + dp += regs.x; + rd = op_readaddr(dp + 0) << 0; + rd |= op_readaddr(dp + 1) << 8; + regs.pc = rd; + } +@endmacro + +@macro op_call() + void {class}::op_call() { + rd = op_readpc() << 0; + rd |= op_readpc() << 8; + op_io(); + op_io(); + op_io(); + op_writestack(regs.pc >> 8); + op_writestack(regs.pc >> 0); + regs.pc = rd; + } +@endmacro + +@macro op_pcall() + void {class}::op_pcall() { + rd = op_readpc(); + op_io(); + op_io(); + op_writestack(regs.pc >> 8); + op_writestack(regs.pc >> 0); + regs.pc = 0xff00 | rd; + } +@endmacro + +@macro op_tcall(bit) + void {class}::op_tcall_{bit}() { + dp = 0xffde - ({bit} << 1); + rd = op_readaddr(dp + 0) << 0; + rd |= op_readaddr(dp + 1) << 8; + op_io(); + op_io(); + op_io(); + op_writestack(regs.pc >> 8); + op_writestack(regs.pc >> 0); + regs.pc = rd; + } +@endmacro + +@macro op_brk() + void {class}::op_brk() { + rd = op_readaddr(0xffde) << 0; + rd |= op_readaddr(0xffdf) << 8; + op_io(); + op_io(); + op_writestack(regs.pc >> 8); + op_writestack(regs.pc >> 0); + op_writestack(regs.p); + regs.pc = rd; + regs.p.b = 1; + regs.p.i = 0; + } +@endmacro + +@macro op_ret() + void {class}::op_ret() { + rd = op_readstack() << 0; + rd |= op_readstack() << 8; + op_io(); + op_io(); + regs.pc = rd; + } +@endmacro + +@macro op_reti() + void {class}::op_reti() { + regs.p = op_readstack(); + rd = op_readstack() << 0; + rd |= op_readstack() << 8; + op_io(); + op_io(); + regs.pc = rd; + } +@endmacro + diff --git a/tools/bsnes/smp/core/opcode_read.bpp b/tools/bsnes/smp/core/opcode_read.bpp new file mode 100755 index 0000000..1a5057d --- /dev/null +++ b/tools/bsnes/smp/core/opcode_read.bpp @@ -0,0 +1,170 @@ +@macro op_read_reg_const(name, r) + void {class}::op_{name}_{r}_const() { + rd = op_readpc(); + regs.{r} = op_{name}(regs.{r}, rd); + } +@endmacro + +@macro op_read_a_ix(name) + void {class}::op_{name}_a_ix() { + op_io(); + rd = op_readdp(regs.x); + regs.a = op_{name}(regs.a, rd); + } +@endmacro + +@macro op_read_reg_dp(name, r) + void {class}::op_{name}_{r}_dp() { + dp = op_readpc(); + rd = op_readdp(dp); + regs.{r} = op_{name}(regs.{r}, rd); + } +@endmacro + +@macro op_read_a_dpx(name) + void {class}::op_{name}_a_dpx() { + dp = op_readpc(); + op_io(); + rd = op_readdp(dp + regs.x); + regs.a = op_{name}(regs.a, rd); + } +@endmacro + +@macro op_read_reg_addr(name, r) + void {class}::op_{name}_{r}_addr() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + rd = op_readaddr(dp); + regs.{r} = op_{name}(regs.{r}, rd); + } +@endmacro + +@macro op_read_a_addri(name, i) + void {class}::op_{name}_a_addr{i}() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + op_io(); + rd = op_readaddr(dp + regs.{i}); + regs.a = op_{name}(regs.a, rd); + } +@endmacro + +@macro op_read_a_idpx(name) + void {class}::op_{name}_a_idpx() { + dp = op_readpc() + regs.x; + op_io(); + sp = op_readdp(dp + 0) << 0; + sp |= op_readdp(dp + 1) << 8; + rd = op_readaddr(sp); + regs.a = op_{name}(regs.a, rd); + } +@endmacro + +@macro op_read_a_idpy(name) + void {class}::op_{name}_a_idpy() { + dp = op_readpc(); + op_io(); + sp = op_readdp(dp + 0) << 0; + sp |= op_readdp(dp + 1) << 8; + rd = op_readaddr(sp + regs.y); + regs.a = op_{name}(regs.a, rd); + } +@endmacro + +@macro op_read_ix_iy(name, write) + void {class}::op_{name}_ix_iy() { + op_io(); + rd = op_readdp(regs.y); + wr = op_readdp(regs.x); + wr = op_{name}(wr, rd); + {write} ? op_writedp(regs.x, wr) : op_io(); + } +@endmacro + +@macro op_read_dp_dp(name, write) + void {class}::op_{name}_dp_dp() { + sp = op_readpc(); + rd = op_readdp(sp); + dp = op_readpc(); + wr = op_readdp(dp); + wr = op_{name}(wr, rd); + {write} ? op_writedp(dp, wr) : op_io(); + } +@endmacro + +@macro op_read_dp_const(name, write) + void {class}::op_{name}_dp_const() { + rd = op_readpc(); + dp = op_readpc(); + wr = op_readdp(dp); + wr = op_{name}(wr, rd); + {write} ? op_writedp(dp, wr) : op_io(); + } +@endmacro + +@macro op_read_ya_dp(name) + void {class}::op_{name}_ya_dp() { + dp = op_readpc(); + rd = op_readdp(dp + 0) << 0; + op_io(); + rd |= op_readdp(dp + 1) << 8; + regs.ya = op_{name}(regs.ya, rd); + } +@endmacro + +@macro op_cmpw_ya_dp() + void {class}::op_cmpw_ya_dp() { + dp = op_readpc(); + rd = op_readdp(dp + 0) << 0; + rd |= op_readdp(dp + 1) << 8; + op_cmpw(regs.ya, rd); + } +@endmacro + +@macro op_and1(name, op) + void {class}::op_and1_{name}() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + bit = dp >> 13; + dp &= 0x1fff; + rd = op_readaddr(dp); + regs.p.c = regs.p.c & {op}(rd & (1 << bit)); + } +@endmacro + +@macro op_eor1() + void {class}::op_eor1_bit() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + bit = dp >> 13; + dp &= 0x1fff; + rd = op_readaddr(dp); + op_io(); + regs.p.c = regs.p.c ^ !!(rd & (1 << bit)); + } +@endmacro + +@macro op_not1() + void {class}::op_not1_bit() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + bit = dp >> 13; + dp &= 0x1fff; + rd = op_readaddr(dp); + rd ^= 1 << bit; + op_writeaddr(dp, rd); + } +@endmacro + +@macro op_or1(name, op) + void {class}::op_or1_{name}() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + bit = dp >> 13; + dp &= 0x1fff; + rd = op_readaddr(dp); + op_io(); + regs.p.c = regs.p.c | {op}(rd & (1 << bit)); + } +@endmacro + diff --git a/tools/bsnes/smp/core/opcode_rmw.bpp b/tools/bsnes/smp/core/opcode_rmw.bpp new file mode 100755 index 0000000..bac5700 --- /dev/null +++ b/tools/bsnes/smp/core/opcode_rmw.bpp @@ -0,0 +1,61 @@ +@macro op_adjust_reg(name, r) + void {class}::op_{name}_{r}() { + op_io(); + regs.{r} = op_{name}(regs.{r}); + } +@endmacro + +@macro op_adjust_dp(name) + void {class}::op_{name}_dp() { + dp = op_readpc(); + rd = op_readdp(dp); + rd = op_{name}(rd); + op_writedp(dp, rd); + } +@endmacro + +@macro op_adjust_dpx(name) + void {class}::op_{name}_dpx() { + dp = op_readpc(); + op_io(); + rd = op_readdp(dp + regs.x); + rd = op_{name}(rd); + op_writedp(dp + regs.x, rd); + } +@endmacro + +@macro op_adjust_addr(name) + void {class}::op_{name}_addr() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + rd = op_readaddr(dp); + rd = op_{name}(rd); + op_writeaddr(dp, rd); + } +@endmacro + +@macro op_tadjust_addr(name, op) + void {class}::op_{name}_addr_a() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + rd = op_readaddr(dp); + regs.p.n = ((regs.a - rd) & 0x80); + regs.p.z = ((regs.a - rd) == 0); + op_readaddr(dp); + op_writeaddr(dp, rd {op} regs.a); + } +@endmacro + +@macro op_adjustw_dp(name, op) + void {class}::op_{name}_dp() { + dp = op_readpc(); + rd = op_readdp(dp) << 0; + rd {op}; + op_writedp(dp++, rd); + rd += op_readdp(dp) << 8; + op_writedp(dp, rd >> 8); + regs.p.n = (rd & 0x8000); + regs.p.z = (rd == 0); + } +@endmacro + diff --git a/tools/bsnes/smp/core/opcode_table.cpp b/tools/bsnes/smp/core/opcode_table.cpp new file mode 100755 index 0000000..c8964e7 --- /dev/null +++ b/tools/bsnes/smp/core/opcode_table.cpp @@ -0,0 +1,75 @@ +#ifdef SMPCORE_CPP + +void SMPcore::initialize_opcode_table() { + #define op(id, name) opcode_table[id] = &sSMP::op_ ## name; + + op(0x00, nop) op(0x01, tcall_0) op(0x02, set0_dp) op(0x03, bbs0) + op(0x04, or_a_dp) op(0x05, or_a_addr) op(0x06, or_a_ix) op(0x07, or_a_idpx) + op(0x08, or_a_const) op(0x09, or_dp_dp) op(0x0a, or1_bit) op(0x0b, asl_dp) + op(0x0c, asl_addr) op(0x0d, push_p) op(0x0e, tset_addr_a) op(0x0f, brk) + op(0x10, bpl) op(0x11, tcall_1) op(0x12, clr0_dp) op(0x13, bbc0) + op(0x14, or_a_dpx) op(0x15, or_a_addrx) op(0x16, or_a_addry) op(0x17, or_a_idpy) + op(0x18, or_dp_const) op(0x19, or_ix_iy) op(0x1a, decw_dp) op(0x1b, asl_dpx) + op(0x1c, asl_a) op(0x1d, dec_x) op(0x1e, cmp_x_addr) op(0x1f, jmp_iaddrx) + op(0x20, clrp) op(0x21, tcall_2) op(0x22, set1_dp) op(0x23, bbs1) + op(0x24, and_a_dp) op(0x25, and_a_addr) op(0x26, and_a_ix) op(0x27, and_a_idpx) + op(0x28, and_a_const) op(0x29, and_dp_dp) op(0x2a, or1_notbit) op(0x2b, rol_dp) + op(0x2c, rol_addr) op(0x2d, push_a) op(0x2e, cbne_dp) op(0x2f, bra) + op(0x30, bmi) op(0x31, tcall_3) op(0x32, clr1_dp) op(0x33, bbc1) + op(0x34, and_a_dpx) op(0x35, and_a_addrx) op(0x36, and_a_addry) op(0x37, and_a_idpy) + op(0x38, and_dp_const) op(0x39, and_ix_iy) op(0x3a, incw_dp) op(0x3b, rol_dpx) + op(0x3c, rol_a) op(0x3d, inc_x) op(0x3e, cmp_x_dp) op(0x3f, call) + op(0x40, setp) op(0x41, tcall_4) op(0x42, set2_dp) op(0x43, bbs2) + op(0x44, eor_a_dp) op(0x45, eor_a_addr) op(0x46, eor_a_ix) op(0x47, eor_a_idpx) + op(0x48, eor_a_const) op(0x49, eor_dp_dp) op(0x4a, and1_bit) op(0x4b, lsr_dp) + op(0x4c, lsr_addr) op(0x4d, push_x) op(0x4e, tclr_addr_a) op(0x4f, pcall) + op(0x50, bvc) op(0x51, tcall_5) op(0x52, clr2_dp) op(0x53, bbc2) + op(0x54, eor_a_dpx) op(0x55, eor_a_addrx) op(0x56, eor_a_addry) op(0x57, eor_a_idpy) + op(0x58, eor_dp_const) op(0x59, eor_ix_iy) op(0x5a, cmpw_ya_dp) op(0x5b, lsr_dpx) + op(0x5c, lsr_a) op(0x5d, mov_x_a) op(0x5e, cmp_y_addr) op(0x5f, jmp_addr) + op(0x60, clrc) op(0x61, tcall_6) op(0x62, set3_dp) op(0x63, bbs3) + op(0x64, cmp_a_dp) op(0x65, cmp_a_addr) op(0x66, cmp_a_ix) op(0x67, cmp_a_idpx) + op(0x68, cmp_a_const) op(0x69, cmp_dp_dp) op(0x6a, and1_notbit) op(0x6b, ror_dp) + op(0x6c, ror_addr) op(0x6d, push_y) op(0x6e, dbnz_dp) op(0x6f, ret) + op(0x70, bvs) op(0x71, tcall_7) op(0x72, clr3_dp) op(0x73, bbc3) + op(0x74, cmp_a_dpx) op(0x75, cmp_a_addrx) op(0x76, cmp_a_addry) op(0x77, cmp_a_idpy) + op(0x78, cmp_dp_const) op(0x79, cmp_ix_iy) op(0x7a, addw_ya_dp) op(0x7b, ror_dpx) + op(0x7c, ror_a) op(0x7d, mov_a_x) op(0x7e, cmp_y_dp) op(0x7f, reti) + op(0x80, setc) op(0x81, tcall_8) op(0x82, set4_dp) op(0x83, bbs4) + op(0x84, adc_a_dp) op(0x85, adc_a_addr) op(0x86, adc_a_ix) op(0x87, adc_a_idpx) + op(0x88, adc_a_const) op(0x89, adc_dp_dp) op(0x8a, eor1_bit) op(0x8b, dec_dp) + op(0x8c, dec_addr) op(0x8d, mov_y_const) op(0x8e, pop_p) op(0x8f, mov_dp_const) + op(0x90, bcc) op(0x91, tcall_9) op(0x92, clr4_dp) op(0x93, bbc4) + op(0x94, adc_a_dpx) op(0x95, adc_a_addrx) op(0x96, adc_a_addry) op(0x97, adc_a_idpy) + op(0x98, adc_dp_const) op(0x99, adc_ix_iy) op(0x9a, subw_ya_dp) op(0x9b, dec_dpx) + op(0x9c, dec_a) op(0x9d, mov_x_sp) op(0x9e, div_ya_x) op(0x9f, xcn) + op(0xa0, ei) op(0xa1, tcall_10) op(0xa2, set5_dp) op(0xa3, bbs5) + op(0xa4, sbc_a_dp) op(0xa5, sbc_a_addr) op(0xa6, sbc_a_ix) op(0xa7, sbc_a_idpx) + op(0xa8, sbc_a_const) op(0xa9, sbc_dp_dp) op(0xaa, mov1_c_bit) op(0xab, inc_dp) + op(0xac, inc_addr) op(0xad, cmp_y_const) op(0xae, pop_a) op(0xaf, mov_ixinc_a) + op(0xb0, bcs) op(0xb1, tcall_11) op(0xb2, clr5_dp) op(0xb3, bbc5) + op(0xb4, sbc_a_dpx) op(0xb5, sbc_a_addrx) op(0xb6, sbc_a_addry) op(0xb7, sbc_a_idpy) + op(0xb8, sbc_dp_const) op(0xb9, sbc_ix_iy) op(0xba, movw_ya_dp) op(0xbb, inc_dpx) + op(0xbc, inc_a) op(0xbd, mov_sp_x) op(0xbe, das) op(0xbf, mov_a_ixinc) + op(0xc0, di) op(0xc1, tcall_12) op(0xc2, set6_dp) op(0xc3, bbs6) + op(0xc4, mov_dp_a) op(0xc5, mov_addr_a) op(0xc6, mov_ix_a) op(0xc7, mov_idpx_a) + op(0xc8, cmp_x_const) op(0xc9, mov_addr_x) op(0xca, mov1_bit_c) op(0xcb, mov_dp_y) + op(0xcc, mov_addr_y) op(0xcd, mov_x_const) op(0xce, pop_x) op(0xcf, mul_ya) + op(0xd0, bne) op(0xd1, tcall_13) op(0xd2, clr6_dp) op(0xd3, bbc6) + op(0xd4, mov_dpx_a) op(0xd5, mov_addrx_a) op(0xd6, mov_addry_a) op(0xd7, mov_idpy_a) + op(0xd8, mov_dp_x) op(0xd9, mov_dpy_x) op(0xda, movw_dp_ya) op(0xdb, mov_dpx_y) + op(0xdc, dec_y) op(0xdd, mov_a_y) op(0xde, cbne_dpx) op(0xdf, daa) + op(0xe0, clrv) op(0xe1, tcall_14) op(0xe2, set7_dp) op(0xe3, bbs7) + op(0xe4, mov_a_dp) op(0xe5, mov_a_addr) op(0xe6, mov_a_ix) op(0xe7, mov_a_idpx) + op(0xe8, mov_a_const) op(0xe9, mov_x_addr) op(0xea, not1_bit) op(0xeb, mov_y_dp) + op(0xec, mov_y_addr) op(0xed, notc) op(0xee, pop_y) op(0xef, sleep) + op(0xf0, beq) op(0xf1, tcall_15) op(0xf2, clr7_dp) op(0xf3, bbc7) + op(0xf4, mov_a_dpx) op(0xf5, mov_a_addrx) op(0xf6, mov_a_addry) op(0xf7, mov_a_idpy) + op(0xf8, mov_x_dp) op(0xf9, mov_x_dpy) op(0xfa, mov_dp_dp) op(0xfb, mov_y_dpx) + op(0xfc, inc_y) op(0xfd, mov_y_a) op(0xfe, dbnz_y) op(0xff, stop) + + #undef op +} + +#endif + diff --git a/tools/bsnes/smp/core/registers.hpp b/tools/bsnes/smp/core/registers.hpp new file mode 100755 index 0000000..d1ac5c3 --- /dev/null +++ b/tools/bsnes/smp/core/registers.hpp @@ -0,0 +1,31 @@ +struct flag_t { + bool n, v, p, b, h, i, z, c; + + inline operator unsigned() const { + return (n << 7) + (v << 6) + (p << 5) + (b << 4) + + (h << 3) + (i << 2) + (z << 1) + (c << 0); + } + + inline unsigned operator=(uint8_t data) { + n = data & 0x80; v = data & 0x40; p = data & 0x20; b = data & 0x10; + h = data & 0x08; i = data & 0x04; z = data & 0x02; c = data & 0x01; + return data; + } + + inline unsigned operator|=(unsigned data) { return operator=(operator unsigned() | data); } + inline unsigned operator^=(unsigned data) { return operator=(operator unsigned() ^ data); } + inline unsigned operator&=(unsigned data) { return operator=(operator unsigned() & data); } + + flag_t() : n(0), v(0), p(0), b(0), h(0), i(0), z(0), c(0) {} +}; + +struct regs_t { + uint16_t pc; + union { + uint16 ya; + struct { uint8 order_lsb2(a, y); }; + }; + uint8_t x, sp; + flag_t p; + regs_t() : pc(0), ya(0), x(0), sp(0) {} +}; diff --git a/tools/bsnes/smp/core/ssmpgen.cpp b/tools/bsnes/smp/core/ssmpgen.cpp new file mode 100755 index 0000000..b6a67db --- /dev/null +++ b/tools/bsnes/smp/core/ssmpgen.cpp @@ -0,0 +1,12 @@ +#define CLASS_NAME "sSMP" +#include + +int main() { + generate("op_mov.cpp", "op_mov.b"); + generate("op_pc.cpp", "op_pc.b"); + generate("op_read.cpp", "op_read.b"); + generate("op_rmw.cpp", "op_rmw.b"); + generate("op_misc.cpp", "op_misc.b"); + + return 0; +} diff --git a/tools/bsnes/system/audio/audio.cpp b/tools/bsnes/system/audio/audio.cpp new file mode 100755 index 0000000..45e6aeb --- /dev/null +++ b/tools/bsnes/system/audio/audio.cpp @@ -0,0 +1,13 @@ +#ifdef SYSTEM_CPP + +Audio audio; + +void Audio::sample(uint16 l_sample, uint16 r_sample) { + system.interface->audio_sample(l_sample, r_sample); +} + +void Audio::init() { +} + +#endif + diff --git a/tools/bsnes/system/audio/audio.hpp b/tools/bsnes/system/audio/audio.hpp new file mode 100755 index 0000000..45acaf4 --- /dev/null +++ b/tools/bsnes/system/audio/audio.hpp @@ -0,0 +1,8 @@ +class Audio { +public: + void sample(uint16 l_sample, uint16 r_sample); + void init(); +}; + +extern Audio audio; + diff --git a/tools/bsnes/system/config/config.cpp b/tools/bsnes/system/config/config.cpp new file mode 100755 index 0000000..ca90602 --- /dev/null +++ b/tools/bsnes/system/config/config.cpp @@ -0,0 +1,26 @@ +#ifdef SYSTEM_CPP + +Configuration config; + +Configuration::Configuration() { + controller_port1 = Input::DeviceJoypad; + controller_port2 = Input::DeviceJoypad; + expansion_port = System::ExpansionBSX; + region = System::Autodetect; + + cpu.version = 2; + cpu.ntsc_clock_rate = 21477272; + cpu.pal_clock_rate = 21281370; + cpu.alu_mul_delay = 2; + cpu.alu_div_delay = 2; + cpu.wram_init_value = 0x55; + + smp.ntsc_clock_rate = 32041 * 768; + smp.pal_clock_rate = 32041 * 768; + + ppu1.version = 1; + ppu2.version = 3; +} + +#endif + diff --git a/tools/bsnes/system/config/config.hpp b/tools/bsnes/system/config/config.hpp new file mode 100755 index 0000000..8688a43 --- /dev/null +++ b/tools/bsnes/system/config/config.hpp @@ -0,0 +1,33 @@ +struct Configuration { + unsigned controller_port1; + unsigned controller_port2; + unsigned expansion_port; + unsigned region; + + struct CPU { + unsigned version; + unsigned ntsc_clock_rate; + unsigned pal_clock_rate; + unsigned alu_mul_delay; + unsigned alu_div_delay; + unsigned wram_init_value; + } cpu; + + struct SMP { + unsigned ntsc_clock_rate; + unsigned pal_clock_rate; + } smp; + + struct PPU1 { + unsigned version; + } ppu1; + + struct PPU2 { + unsigned version; + } ppu2; + + Configuration(); +}; + +extern Configuration config; + diff --git a/tools/bsnes/system/input/input.cpp b/tools/bsnes/system/input/input.cpp new file mode 100755 index 0000000..7535efd --- /dev/null +++ b/tools/bsnes/system/input/input.cpp @@ -0,0 +1,355 @@ +#ifdef SYSTEM_CPP + +Input input; + +uint8 Input::port_read(bool portnumber) { + port_t &p = port[portnumber]; + + switch(p.device) { + case DeviceJoypad: { + if(p.counter0 >= 16) return 1; + unsigned deviceid = (portnumber == 0 ? DeviceIDJoypad1 : DeviceIDJoypad2); + return system.interface->input_poll(deviceid, p.counter0++); + } //case DeviceJoypad + + case DeviceMultitap: { + if(cpu.joylatch()) return 2; //when latch is high -- data2 = 1, data1 = 0 + + unsigned deviceidx, deviceid0, deviceid1; + if(portnumber == 0) { + if(cpu.pio() & 0x40) { + deviceidx = p.counter0; + if(deviceidx >= 16) return 3; + p.counter0++; + + deviceid0 = DeviceIDMultitap1A; + deviceid1 = DeviceIDMultitap1B; + } else { + deviceidx = p.counter1; + if(deviceidx >= 16) return 3; + p.counter1++; + + deviceid0 = DeviceIDMultitap1C; + deviceid1 = DeviceIDMultitap1D; + } + } else { + if(cpu.pio() & 0x80) { + deviceidx = p.counter0; + if(deviceidx >= 16) return 3; + p.counter0++; + + deviceid0 = DeviceIDMultitap2A; + deviceid1 = DeviceIDMultitap2B; + } else { + deviceidx = p.counter1; + if(deviceidx >= 16) return 3; + p.counter1++; + + deviceid0 = DeviceIDMultitap2C; + deviceid1 = DeviceIDMultitap2D; + } + } + + return (system.interface->input_poll(deviceid0, deviceidx) << 0) + | (system.interface->input_poll(deviceid1, deviceidx) << 1); + } //case DeviceMultitap + + case DeviceMouse: { + if(p.counter0 >= 32) return 1; + unsigned deviceid = (portnumber == 0 ? DeviceIDMouse1 : DeviceIDMouse2); + + int position_x = system.interface->input_poll(deviceid, MouseX); //-n = left, 0 = center, +n = right + int position_y = system.interface->input_poll(deviceid, MouseY); //-n = up, 0 = center, +n = right + + bool direction_x = position_x < 0; //0 = right, 1 = left + bool direction_y = position_y < 0; //0 = down, 1 = up + + if(position_x < 0) position_x = -position_x; //abs(position_x) + if(position_y < 0) position_y = -position_y; //abs(position_x) + + position_x = min(127, position_x); //range = 0 - 127 + position_y = min(127, position_y); //range = 0 - 127 + + switch(p.counter0++) { default: + case 0: return 0; + case 1: return 0; + case 2: return 0; + case 3: return 0; + case 4: return 0; + case 5: return 0; + case 6: return 0; + case 7: return 0; + + case 8: return system.interface->input_poll(deviceid, MouseRight); + case 9: return system.interface->input_poll(deviceid, MouseLeft); + case 10: return 0; //speed (0 = slow, 1 = normal, 2 = fast, 3 = unused) + case 11: return 0; // || + + case 12: return 0; //signature + case 13: return 0; // || + case 14: return 0; // || + case 15: return 1; // || + + case 16: return (direction_y) & 1; + case 17: return (position_y >> 6) & 1; + case 18: return (position_y >> 5) & 1; + case 19: return (position_y >> 4) & 1; + case 20: return (position_y >> 3) & 1; + case 21: return (position_y >> 2) & 1; + case 22: return (position_y >> 1) & 1; + case 23: return (position_y >> 0) & 1; + + case 24: return (direction_x) & 1; + case 25: return (position_x >> 6) & 1; + case 26: return (position_x >> 5) & 1; + case 27: return (position_x >> 4) & 1; + case 28: return (position_x >> 3) & 1; + case 29: return (position_x >> 2) & 1; + case 30: return (position_x >> 1) & 1; + case 31: return (position_x >> 0) & 1; + } + } //case DeviceMouse + + case DeviceSuperScope: { + if(portnumber == 0) break; //Super Scope in port 1 not supported ... + if(p.counter0 >= 8) return 1; + + if(p.counter0 == 0) { + //turbo is a switch; toggle is edge sensitive + bool turbo = system.interface->input_poll(DeviceIDSuperScope, SuperScopeTurbo); + if(turbo && !p.superscope.turbolock) { + p.superscope.turbo = !p.superscope.turbo; //toggle state + p.superscope.turbolock = true; + } else if(!turbo) { + p.superscope.turbolock = false; + } + + //trigger is a button + //if turbo is active, trigger is level sensitive; otherwise it is edge sensitive + p.superscope.trigger = false; + bool trigger = system.interface->input_poll(DeviceIDSuperScope, SuperScopeTrigger); + if(trigger && (p.superscope.turbo || !p.superscope.triggerlock)) { + p.superscope.trigger = true; + p.superscope.triggerlock = true; + } else if(!trigger) { + p.superscope.triggerlock = false; + } + + //cursor is a button; it is always level sensitive + p.superscope.cursor = system.interface->input_poll(DeviceIDSuperScope, SuperScopeCursor); + + //pause is a button; it is always edge sensitive + p.superscope.pause = false; + bool pause = system.interface->input_poll(DeviceIDSuperScope, SuperScopePause); + if(pause && !p.superscope.pauselock) { + p.superscope.pause = true; + p.superscope.pauselock = true; + } else if(!pause) { + p.superscope.pauselock = false; + } + + p.superscope.offscreen = + p.superscope.x < 0 || p.superscope.x >= 256 + || p.superscope.y < 0 || p.superscope.y >= (ppu.overscan() ? 240 : 225); + } + + switch(p.counter0++) { + case 0: return p.superscope.trigger; + case 1: return p.superscope.cursor; + case 2: return p.superscope.turbo; + case 3: return p.superscope.pause; + case 4: return 0; + case 5: return 0; + case 6: return p.superscope.offscreen; + case 7: return 0; //noise (1 = yes) + } + } //case DeviceSuperScope + + case DeviceJustifier: + case DeviceJustifiers: { + if(portnumber == 0) break; //Justifier in port 1 not supported ... + if(p.counter0 >= 32) return 1; + + if(p.counter0 == 0) { + p.justifier.trigger1 = system.interface->input_poll(DeviceIDJustifier1, JustifierTrigger); + p.justifier.start1 = system.interface->input_poll(DeviceIDJustifier1, JustifierStart); + + if(p.device == DeviceJustifiers) { + p.justifier.trigger2 = system.interface->input_poll(DeviceIDJustifier2, JustifierTrigger); + p.justifier.start2 = system.interface->input_poll(DeviceIDJustifier2, JustifierStart); + } else { + p.justifier.x2 = -1; + p.justifier.y2 = -1; + + p.justifier.trigger2 = false; + p.justifier.start2 = false; + } + } + + switch(p.counter0++) { + case 0: return 0; + case 1: return 0; + case 2: return 0; + case 3: return 0; + case 4: return 0; + case 5: return 0; + case 6: return 0; + case 7: return 0; + case 8: return 0; + case 9: return 0; + case 10: return 0; + case 11: return 0; + + case 12: return 1; //signature + case 13: return 1; // || + case 14: return 1; // || + case 15: return 0; // || + + case 16: return 0; + case 17: return 1; + case 18: return 0; + case 19: return 1; + case 20: return 0; + case 21: return 1; + case 22: return 0; + case 23: return 1; + + case 24: return p.justifier.trigger1; + case 25: return p.justifier.trigger2; + case 26: return p.justifier.start1; + case 27: return p.justifier.start2; + case 28: return p.justifier.active; + + case 29: return 0; + case 30: return 0; + case 31: return 0; + } + } //case DeviceJustifier(s) + } //switch(p.device) + + //no device connected + return 0; +} + +//scan all input; update cursor positions if needed +void Input::update() { + system.interface->input_poll(); + port_t &p = port[1]; + + switch(p.device) { + case DeviceSuperScope: { + int x = system.interface->input_poll(DeviceIDSuperScope, SuperScopeX); + int y = system.interface->input_poll(DeviceIDSuperScope, SuperScopeY); + x += p.superscope.x; + y += p.superscope.y; + p.superscope.x = max(-16, min(256 + 16, x)); + p.superscope.y = max(-16, min(240 + 16, y)); + + latchx = p.superscope.x; + latchy = p.superscope.y; + } break; + + case DeviceJustifier: + case DeviceJustifiers: { + int x1 = system.interface->input_poll(DeviceIDJustifier1, JustifierX); + int y1 = system.interface->input_poll(DeviceIDJustifier1, JustifierY); + x1 += p.justifier.x1; + y1 += p.justifier.y1; + p.justifier.x1 = max(-16, min(256 + 16, x1)); + p.justifier.y1 = max(-16, min(240 + 16, y1)); + + int x2 = system.interface->input_poll(DeviceIDJustifier2, JustifierX); + int y2 = system.interface->input_poll(DeviceIDJustifier2, JustifierY); + x2 += p.justifier.x2; + y2 += p.justifier.y2; + p.justifier.x2 = max(-16, min(256 + 16, x2)); + p.justifier.y2 = max(-16, min(240 + 16, y2)); + + if(p.justifier.active == 0) { + latchx = p.justifier.x1; + latchy = p.justifier.y1; + } else { + latchx = (p.device == DeviceJustifiers ? p.justifier.x2 : -1); + latchy = (p.device == DeviceJustifiers ? p.justifier.y2 : -1); + } + } break; + } + + if(latchy < 0 || latchy >= (ppu.overscan() ? 240 : 225) || latchx < 0 || latchx >= 256) { + //cursor is offscreen, set to invalid position so counters are not latched + latchx = ~0; + latchy = ~0; + } else { + //cursor is onscreen + latchx += 40; //offset trigger position to simulate hardware latching delay + latchx <<= 2; //dot -> clock conversion + latchx += 2; //align trigger on half-dot ala interrupts (speed optimization for sCPU::add_clocks) + } +} + +void Input::port_set_device(bool portnumber, unsigned device) { + port_t &p = port[portnumber]; + + p.device = device; + p.counter0 = 0; + p.counter1 = 0; + + //set iobit to true if device is capable of latching PPU counters + iobit = port[1].device == DeviceSuperScope + || port[1].device == DeviceJustifier + || port[1].device == DeviceJustifiers; + latchx = -1; + latchy = -1; + + if(device == DeviceSuperScope) { + p.superscope.x = 256 / 2; + p.superscope.y = 240 / 2; + + p.superscope.trigger = false; + p.superscope.cursor = false; + p.superscope.turbo = false; + p.superscope.pause = false; + p.superscope.offscreen = false; + + p.superscope.turbolock = false; + p.superscope.triggerlock = false; + p.superscope.pauselock = false; + } else if(device == DeviceJustifier) { + p.justifier.active = 0; + p.justifier.x1 = 256 / 2; + p.justifier.y1 = 240 / 2; + p.justifier.x2 = -1; + p.justifier.y2 = -1; + + p.justifier.trigger1 = false; + p.justifier.trigger2 = false; + p.justifier.start1 = false; + p.justifier.start2 = false; + } else if(device == DeviceJustifiers) { + p.justifier.active = 0; + p.justifier.x1 = 256 / 2 - 16; + p.justifier.y1 = 240 / 2; + p.justifier.x2 = 256 / 2 + 16; + p.justifier.y2 = 240 / 2; + + p.justifier.trigger1 = false; + p.justifier.trigger2 = false; + p.justifier.start1 = false; + p.justifier.start2 = false; + } +} + +void Input::poll() { + port[0].counter0 = 0; + port[0].counter1 = 0; + port[1].counter0 = 0; + port[1].counter1 = 0; + + port[1].justifier.active = !port[1].justifier.active; +} + +void Input::init() { +} + +#endif + diff --git a/tools/bsnes/system/input/input.hpp b/tools/bsnes/system/input/input.hpp new file mode 100755 index 0000000..357fb8c --- /dev/null +++ b/tools/bsnes/system/input/input.hpp @@ -0,0 +1,114 @@ +class Input { +public: + enum Device { + DeviceNone, + DeviceJoypad, + DeviceMultitap, + DeviceMouse, + DeviceSuperScope, + DeviceJustifier, + DeviceJustifiers, + }; + + enum DeviceID { + DeviceIDNone, + DeviceIDJoypad1, + DeviceIDJoypad2, + DeviceIDMultitap1A, + DeviceIDMultitap1B, + DeviceIDMultitap1C, + DeviceIDMultitap1D, + DeviceIDMultitap2A, + DeviceIDMultitap2B, + DeviceIDMultitap2C, + DeviceIDMultitap2D, + DeviceIDMouse1, + DeviceIDMouse2, + DeviceIDSuperScope, + DeviceIDJustifier1, + DeviceIDJustifier2, + }; + + enum JoypadID { + JoypadB = 0, JoypadY = 1, + JoypadSelect = 2, JoypadStart = 3, + JoypadUp = 4, JoypadDown = 5, + JoypadLeft = 6, JoypadRight = 7, + JoypadA = 8, JoypadX = 9, + JoypadL = 10, JoypadR = 11, + }; + + enum MouseID { + MouseX = 0, MouseY = 1, + MouseLeft = 2, MouseRight = 3, + }; + + enum SuperScopeID { + SuperScopeX = 0, SuperScopeY = 1, + SuperScopeTrigger = 2, SuperScopeCursor = 3, + SuperScopeTurbo = 4, SuperScopePause = 5, + }; + + enum JustifierID { + JustifierX = 0, JustifierY = 1, + JustifierTrigger = 2, JustifierStart = 3, + }; + + uint8 port_read(bool port); + void port_set_device(bool port, unsigned device); + void init(); + void poll(); + void update(); + + //light guns (Super Scope, Justifier(s)) strobe IOBit whenever the CRT + //beam cannon is detected. this needs to be tested at the cycle level + //(hence inlining here for speed) to avoid 'dead space' during DRAM refresh. + //iobit is updated during port_set_device(), + //latchx, latchy are updated during update() (once per frame) + alwaysinline void tick() { + //only test if Super Scope or Justifier is connected + if(iobit && ppu.vcounter() == latchy && ppu.hcounter() == latchx) { + ppu.latch_counters(); + } + } + +private: + bool iobit; + uint16_t latchx, latchy; + + struct port_t { + unsigned device; + unsigned counter0; //read counters + unsigned counter1; + + struct superscope_t { + int x, y; + + bool trigger; + bool cursor; + bool turbo; + bool pause; + bool offscreen; + + bool turbolock; + bool triggerlock; + bool pauselock; + } superscope; + + struct justifier_t { + bool active; + + int x1, x2; + int y1, y2; + + bool trigger1, trigger2; + bool start1, start2; + } justifier; + } port[2]; + + friend class System; + friend class Video; +}; + +extern Input input; + diff --git a/tools/bsnes/system/interface/interface.hpp b/tools/bsnes/system/interface/interface.hpp new file mode 100755 index 0000000..21a069e --- /dev/null +++ b/tools/bsnes/system/interface/interface.hpp @@ -0,0 +1,8 @@ +class Interface { +public: + virtual void video_refresh(uint16_t *data, unsigned pitch, unsigned *line, unsigned width, unsigned height) {} + virtual void audio_sample(uint16_t l_sample, uint16_t r_sample) {} + virtual void input_poll() {} + virtual int16_t input_poll(unsigned deviceid, unsigned id) { return 0; } +}; + diff --git a/tools/bsnes/system/scheduler/scheduler.cpp b/tools/bsnes/system/scheduler/scheduler.cpp new file mode 100755 index 0000000..cb808b3 --- /dev/null +++ b/tools/bsnes/system/scheduler/scheduler.cpp @@ -0,0 +1,63 @@ +#ifdef SYSTEM_CPP + +Scheduler scheduler; + +void threadentry_cpu() { cpu.enter(); } +void threadentry_cop() { system.coprocessor_enter(); } +void threadentry_smp() { smp.enter(); } +void threadentry_ppu() { ppu.enter(); } +void threadentry_dsp() { dsp.enter(); } + +void Scheduler::enter() { + switch(clock.active) { + case THREAD_CPU: co_switch(thread_cpu); break; + case THREAD_COP: co_switch(thread_cop); break; + case THREAD_SMP: co_switch(thread_smp); break; + case THREAD_PPU: co_switch(thread_ppu); break; + case THREAD_DSP: co_switch(thread_dsp); break; + } +} + +void Scheduler::exit() { + co_switch(thread_snes); +} + +void Scheduler::init() { + clock.cpu_freq = system.region() == System::NTSC + ? config.cpu.ntsc_clock_rate + : config.cpu.pal_clock_rate; + clock.smp_freq = system.region() == System::NTSC + ? config.smp.ntsc_clock_rate + : config.smp.pal_clock_rate; + + clock.active = THREAD_CPU; + clock.cpucop = 0; + clock.cpuppu = 0; + clock.cpusmp = 0; + clock.smpdsp = 0; + + if(thread_cpu) co_delete(thread_cpu); + if(thread_cop) co_delete(thread_cop); + if(thread_smp) co_delete(thread_smp); + if(thread_ppu) co_delete(thread_ppu); + if(thread_dsp) co_delete(thread_dsp); + + thread_snes = co_active(); + thread_cpu = co_create(65536 * sizeof(void*), threadentry_cpu); + thread_cop = co_create(65536 * sizeof(void*), threadentry_cop); + thread_smp = co_create(65536 * sizeof(void*), threadentry_smp); + thread_ppu = co_create(65536 * sizeof(void*), threadentry_ppu); + thread_dsp = co_create(65536 * sizeof(void*), threadentry_dsp); +} + +Scheduler::Scheduler() { + thread_snes = 0; + thread_cpu = 0; + thread_cop = 0; + thread_smp = 0; + thread_ppu = 0; + thread_dsp = 0; +} + +#endif + diff --git a/tools/bsnes/system/scheduler/scheduler.hpp b/tools/bsnes/system/scheduler/scheduler.hpp new file mode 100755 index 0000000..62e7b38 --- /dev/null +++ b/tools/bsnes/system/scheduler/scheduler.hpp @@ -0,0 +1,140 @@ +//scheduler thread relationships: +//S-PPU <-> S-CPU <-> cartridge co-processor +// <|> +// S-SMP <-> S-DSP + +class Scheduler { +public: + cothread_t thread_snes; + cothread_t thread_cpu; //S-CPU (5a22) + cothread_t thread_cop; //cartridge co-processor (SuperFX, SA-1, ...) + cothread_t thread_smp; //S-SMP (SPC700) + cothread_t thread_ppu; //S-PPU + cothread_t thread_dsp; //S-DSP + + enum ActiveThread { + THREAD_CPU, + THREAD_COP, + THREAD_SMP, + THREAD_PPU, + THREAD_DSP, + }; + + struct { + unsigned cpu_freq; + unsigned smp_freq; + + ActiveThread active; + int64_t cpucop; + int64_t cpuppu; + int64_t cpusmp; + int64_t smpdsp; + } clock; + + //========== + //CPU <> COP + //========== + + alwaysinline void sync_cpucop() { + if(clock.cpucop < 0) { + clock.active = THREAD_COP; + co_switch(thread_cop); + } + } + + alwaysinline void sync_copcpu() { + if(clock.cpucop >= 0) { + clock.active = THREAD_CPU; + co_switch(thread_cpu); + } + } + + //========== + //CPU <> PPU + //========== + + alwaysinline void sync_cpuppu() { + if(clock.cpuppu < 0) { + clock.active = THREAD_PPU; + co_switch(thread_ppu); + } + } + + alwaysinline void sync_ppucpu() { + if(clock.cpuppu >= 0) { + clock.active = THREAD_CPU; + co_switch(thread_cpu); + } + } + + //========== + //CPU <> SMP + //========== + + alwaysinline void sync_cpusmp() { + if(clock.cpusmp < 0) { + clock.active = THREAD_SMP; + co_switch(thread_smp); + } + } + + alwaysinline void sync_smpcpu() { + if(clock.cpusmp >= 0) { + clock.active = THREAD_CPU; + co_switch(thread_cpu); + } + } + + //========== + //SMP <> DSP + //========== + + alwaysinline void sync_smpdsp() { + if(clock.smpdsp < 0) { + clock.active = THREAD_DSP; + co_switch(thread_dsp); + } + } + + alwaysinline void sync_dspsmp() { + if(clock.smpdsp >= 0) { + clock.active = THREAD_SMP; + co_switch(thread_smp); + } + } + + //========== + //add clocks + //========== + + alwaysinline void addclocks_cpu(unsigned clocks) { + clock.cpucop -= clocks; + clock.cpuppu -= clocks; + clock.cpusmp -= clocks * (uint64_t)clock.smp_freq; + } + + alwaysinline void addclocks_cop(unsigned clocks) { + clock.cpucop += clocks; + } + + alwaysinline void addclocks_ppu(unsigned clocks) { + clock.cpuppu += clocks; + } + + alwaysinline void addclocks_smp(unsigned clocks) { + clock.cpusmp += clocks * (uint64_t)clock.cpu_freq; + clock.smpdsp -= clocks; + } + + alwaysinline void addclocks_dsp(unsigned clocks) { + clock.smpdsp += clocks; + } + + void enter(); + void exit(); + void init(); + + Scheduler(); +}; + +extern Scheduler scheduler; diff --git a/tools/bsnes/system/system.cpp b/tools/bsnes/system/system.cpp new file mode 100755 index 0000000..4820e44 --- /dev/null +++ b/tools/bsnes/system/system.cpp @@ -0,0 +1,188 @@ +#include <../base.hpp> + +#define SYSTEM_CPP +namespace SNES { + +System system; +BUSCORE bus; +CPUCORE cpu; +SMPCORE smp; +DSPCORE dsp; +PPUCORE ppu; + +#include "scheduler/scheduler.cpp" +#include "tracer/tracer.cpp" +#include "config/config.cpp" + +#include "video/video.cpp" +#include "audio/audio.cpp" +#include "input/input.cpp" + +void System::coprocessor_enter() { + if(cartridge.mode() == Cartridge::ModeSuperGameBoy) sgb.enter(); + if(cartridge.has_sa1()) sa1.enter(); + + while(true) { + scheduler.addclocks_cop(64 * 1024 * 1024); + scheduler.sync_copcpu(); + } +} + +void System::run() { +} + +void System::runtoframe() { + scheduler.enter(); +} + +void System::init(Interface *interface_) { + interface = interface_; + assert(interface != 0); + + sgb.init(); + sa1.init(); + bsxbase.init(); + bsxcart.init(); + bsxflash.init(); + srtc.init(); + sdd1.init(); + spc7110.init(); + cx4.init(); + dsp1.init(); + dsp2.init(); + dsp3.init(); + dsp4.init(); + obc1.init(); + st010.init(); + + video.init(); + audio.init(); + input.init(); +} + +void System::term() { +} + +void System::power() { + snes_region = max(0, min(2, config.region)); + snes_expansion = max(0, min(1, config.expansion_port)); + + if(snes_region == Autodetect) { + snes_region = (cartridge.region() == Cartridge::NTSC ? NTSC : PAL); + } + + scheduler.init(); + + ppu.PPUcounter::reset(); + cpu.power(); + smp.power(); + dsp.power(); + ppu.power(); + bus.power(); + + if(expansion() == ExpansionBSX) bsxbase.power(); + if(memory::bsxflash.data()) bsxflash.power(); + if(cartridge.mode() == Cartridge::ModeBsx) bsxcart.power(); + if(cartridge.mode() == Cartridge::ModeSuperGameBoy) sgb.power(); + + if(cartridge.has_sa1()) sa1.power(); + if(cartridge.has_srtc()) srtc.power(); + if(cartridge.has_sdd1()) sdd1.power(); + if(cartridge.has_spc7110()) spc7110.power(); + if(cartridge.has_cx4()) cx4.power(); + if(cartridge.has_dsp1()) dsp1.power(); + if(cartridge.has_dsp2()) dsp2.power(); + if(cartridge.has_dsp3()) dsp3.power(); + if(cartridge.has_dsp4()) dsp4.power(); + if(cartridge.has_obc1()) obc1.power(); + if(cartridge.has_st010()) st010.power(); + + for(unsigned i = 0x2100; i <= 0x213f; i++) memory::mmio.map(i, ppu); + for(unsigned i = 0x2140; i <= 0x217f; i++) memory::mmio.map(i, cpu); + for(unsigned i = 0x2180; i <= 0x2183; i++) memory::mmio.map(i, cpu); + for(unsigned i = 0x4016; i <= 0x4017; i++) memory::mmio.map(i, cpu); + for(unsigned i = 0x4200; i <= 0x421f; i++) memory::mmio.map(i, cpu); + for(unsigned i = 0x4300; i <= 0x437f; i++) memory::mmio.map(i, cpu); + + if(expansion() == ExpansionBSX) bsxbase.enable(); + if(memory::bsxflash.data()) bsxflash.enable(); + if(cartridge.mode() == Cartridge::ModeBsx) bsxcart.enable(); + if(cartridge.mode() == Cartridge::ModeSuperGameBoy) sgb.enable(); + + if(cartridge.has_sa1()) sa1.enable(); + if(cartridge.has_srtc()) srtc.enable(); + if(cartridge.has_sdd1()) sdd1.enable(); + if(cartridge.has_spc7110()) spc7110.enable(); + if(cartridge.has_cx4()) cx4.enable(); + if(cartridge.has_dsp1()) dsp1.enable(); + if(cartridge.has_dsp2()) dsp2.enable(); + if(cartridge.has_dsp3()) dsp3.enable(); + if(cartridge.has_dsp4()) dsp4.enable(); + if(cartridge.has_obc1()) obc1.enable(); + if(cartridge.has_st010()) st010.enable(); + + input.port_set_device(0, config.controller_port1); + input.port_set_device(1, config.controller_port2); + input.update(); + video.update(); +} + +void System::reset() { + scheduler.init(); + + ppu.PPUcounter::reset(); + cpu.reset(); + smp.reset(); + dsp.reset(); + ppu.reset(); + bus.reset(); + + if(expansion() == ExpansionBSX) bsxbase.reset(); + if(memory::bsxflash.data()) bsxflash.reset(); + if(cartridge.mode() == Cartridge::ModeBsx) bsxcart.reset(); + if(cartridge.mode() == Cartridge::ModeSuperGameBoy) sgb.reset(); + + if(cartridge.has_sa1()) sa1.reset(); + if(cartridge.has_srtc()) srtc.reset(); + if(cartridge.has_sdd1()) sdd1.reset(); + if(cartridge.has_spc7110()) spc7110.reset(); + if(cartridge.has_cx4()) cx4.reset(); + if(cartridge.has_dsp1()) dsp1.reset(); + if(cartridge.has_dsp2()) dsp2.reset(); + if(cartridge.has_dsp3()) dsp3.reset(); + if(cartridge.has_dsp4()) dsp4.reset(); + if(cartridge.has_obc1()) obc1.reset(); + if(cartridge.has_st010()) st010.reset(); + + input.port_set_device(0, config.controller_port1); + input.port_set_device(1, config.controller_port2); + input.update(); + video.update(); +} + +void System::scanline() { + video.scanline(); + + if(ppu.vcounter() == 241) { + input.update(); + video.update(); + scheduler.exit(); + } +} + +void System::frame() { +} + +System::Region System::region() const { + return (System::Region)snes_region; +} + +System::ExpansionPortDevice System::expansion() const { + return (System::ExpansionPortDevice)snes_expansion; +} + +System::System() : interface(0), snes_region(NTSC), snes_expansion(ExpansionNone) { +} + +}; + diff --git a/tools/bsnes/system/system.hpp b/tools/bsnes/system/system.hpp new file mode 100755 index 0000000..ebb2e77 --- /dev/null +++ b/tools/bsnes/system/system.hpp @@ -0,0 +1,48 @@ +#include "config/config.hpp" +#include "interface/interface.hpp" +#include "scheduler/scheduler.hpp" +#include "tracer/tracer.hpp" + +#include "video/video.hpp" +#include "audio/audio.hpp" +#include "input/input.hpp" + +class System { +public: + void coprocessor_enter(); + + enum Region { NTSC = 0, PAL = 1 }; + enum RegionAutodetect { Autodetect = 2 }; + enum ExpansionPortDevice { ExpansionNone = 0, ExpansionBSX = 1 }; + + //system functions + virtual void run(); + virtual void runtoframe(); + + virtual void init(Interface*); + virtual void term(); + virtual void power(); + virtual void reset(); + + virtual void frame(); + virtual void scanline(); + + //return *active* region / expansion port device information + //settings cached upon power-on + Region region() const; + ExpansionPortDevice expansion() const; + + System(); + virtual ~System() {} + +private: + Interface *interface; + unsigned snes_region; + unsigned snes_expansion; + + friend class Video; + friend class Audio; + friend class Input; +}; + +extern System system; diff --git a/tools/bsnes/system/tracer/tracer.cpp b/tools/bsnes/system/tracer/tracer.cpp new file mode 100755 index 0000000..66dea59 --- /dev/null +++ b/tools/bsnes/system/tracer/tracer.cpp @@ -0,0 +1,93 @@ +#ifdef SYSTEM_CPP + +Tracer tracer; + +void tprintf(const char *s, ...) { + if(tracer.enabled() == false) return; + + char str[4096]; + va_list args; + va_start(args, s); + vsprintf(str, s, args); + va_end(args); + fprintf(tracer.fp, "%s\r\n", str); +} + +void Tracer::trace_cpuop() { + if(enabled() == false) return; + if(cpuop_enabled() == false) return; + + if(cpuopmask_enabled() == true) { + unsigned addr = cpu.regs.pc.d; + if(settings.cpuopmasktbl[addr >> 3] & 0x80 >> (addr & 7)) return; + settings.cpuopmasktbl[addr >> 3] |= 0x80 >> (addr & 7); + } + + char t[1024]; + cpu.disassemble_opcode(t); + fprintf(fp, "%s\r\n", t); +} + +void Tracer::trace_smpop() { + if(enabled() == false) return; + if(smpop_enabled() == false) return; + + if(smpopmask_enabled() == true) { + unsigned addr = smp.regs.pc; + if(settings.smpopmasktbl[addr >> 3] & 0x80 >> (addr & 7)) return; + settings.smpopmasktbl[addr >> 3] |= 0x80 >> (addr & 7); + } + + char t[1024]; + smp.disassemble_opcode(t); + fprintf(fp, "%s\r\n", t); +} + +void Tracer::enable(bool en) { + if(en == true && enabled() == false) { + fp = fopen("trace.log", "wb"); + } else if(en == false && enabled() == true) { + fclose(fp); + fp = 0; + } + + settings.enabled = en; +} + +void Tracer::cpuopmask_enable(bool en) { + if(en == true && cpuopmask_enabled() == false) { + settings.cpuopmasktbl = new(zeromemory) uint8_t[0x200000]; + } else if(en == false && cpuopmask_enabled() == true) { + delete[] settings.cpuopmasktbl; + } + + settings.cpuopmask = en; +} + +void Tracer::smpopmask_enable(bool en) { + if(en == true && smpopmask_enabled() == false) { + settings.smpopmasktbl = new(zeromemory) uint8_t[0x2000]; + } else if(en == false && smpopmask_enabled() == true) { + delete[] settings.smpopmasktbl; + } + + settings.smpopmask = en; +} + +Tracer::Tracer() { + fp = 0; + + settings.cpuop = false; + settings.cpuopmask = false; + settings.cpuopmasktbl = 0; + + settings.smpop = false; + settings.smpopmask = false; + settings.smpopmasktbl = 0; +} + +Tracer::~Tracer() { +} + +#endif + diff --git a/tools/bsnes/system/tracer/tracer.hpp b/tools/bsnes/system/tracer/tracer.hpp new file mode 100755 index 0000000..882a2c2 --- /dev/null +++ b/tools/bsnes/system/tracer/tracer.hpp @@ -0,0 +1,45 @@ +void tprintf(const char *s, ...); + +class Tracer { +private: + +FILE *fp; + +struct { + bool enabled; + + bool cpuop; + bool cpuopmask; + uint8 *cpuopmasktbl; + + bool smpop; + bool smpopmask; + uint8 *smpopmasktbl; +} settings; + +public: + void enable(bool en); + bool enabled() { return settings.enabled; } + + void cpuop_enable(bool en) { settings.cpuop = en; } + bool cpuop_enabled() { return settings.cpuop; } + + void cpuopmask_enable(bool en); + bool cpuopmask_enabled() { return settings.cpuopmask; } + + void smpop_enable(bool en) { settings.smpop = en; } + bool smpop_enabled() { return settings.smpop; } + + void smpopmask_enable(bool en); + bool smpopmask_enabled() { return settings.smpopmask; } + + void trace_cpuop(); + void trace_smpop(); + + Tracer(); + ~Tracer(); + + friend void tprintf(const char *s, ...); +}; + +extern Tracer tracer; diff --git a/tools/bsnes/system/video/video.cpp b/tools/bsnes/system/video/video.cpp new file mode 100755 index 0000000..38286cd --- /dev/null +++ b/tools/bsnes/system/video/video.cpp @@ -0,0 +1,106 @@ +#ifdef SYSTEM_CPP + +Video video; + +const uint8_t Video::cursor[15 * 15] = { + 0,0,0,0,0,0,1,1,1,0,0,0,0,0,0, + 0,0,0,0,1,1,2,2,2,1,1,0,0,0,0, + 0,0,0,1,2,2,1,2,1,2,2,1,0,0,0, + 0,0,1,2,1,1,0,1,0,1,1,2,1,0,0, + 0,1,2,1,0,0,0,1,0,0,0,1,2,1,0, + 0,1,2,1,0,0,1,2,1,0,0,1,2,1,0, + 1,2,1,0,0,1,1,2,1,1,0,0,1,2,1, + 1,2,2,1,1,2,2,2,2,2,1,1,2,2,1, + 1,2,1,0,0,1,1,2,1,1,0,0,1,2,1, + 0,1,2,1,0,0,1,2,1,0,0,1,2,1,0, + 0,1,2,1,0,0,0,1,0,0,0,1,2,1,0, + 0,0,1,2,1,1,0,1,0,1,1,2,1,0,0, + 0,0,0,1,2,2,1,2,1,2,2,1,0,0,0, + 0,0,0,0,1,1,2,2,2,1,1,0,0,0,0, + 0,0,0,0,0,0,1,1,1,0,0,0,0,0,0, +}; + +void Video::draw_cursor(uint16_t color, int x, int y) { + for(int cy = 0; cy < 15; cy++) { + int vy = y + cy - 7; + if(vy <= 0 || vy >= 240) continue; //do not draw offscreen + + bool hires = (pline_width[vy] == 512); + for(int cx = 0; cx < 15; cx++) { + int vx = x + cx - 7; + if(vx < 0 || vx >= 256) continue; //do not draw offscreen + uint8_t pixel = cursor[cy * 15 + cx]; + if(pixel == 0) continue; + uint16_t pixelcolor = (pixel == 1) ? 0 : color; + + if(hires == false) { + *((uint16_t*)ppu.output + vy * 1024 + 0 + vx) = pixelcolor; + *((uint16_t*)ppu.output + vy * 1024 + 512 + vx) = pixelcolor; + } else { + *((uint16_t*)ppu.output + vy * 1024 + 0 + vx * 2 + 0) = pixelcolor; + *((uint16_t*)ppu.output + vy * 1024 + 512 + vx * 2 + 0) = pixelcolor; + *((uint16_t*)ppu.output + vy * 1024 + 0 + vx * 2 + 1) = pixelcolor; + *((uint16_t*)ppu.output + vy * 1024 + 512 + vx * 2 + 1) = pixelcolor; + } + } + } +} + +void Video::update() { + uint16_t *data = (uint16_t*)ppu.output; + unsigned width, height; + + switch(input.port[1].device) { + case Input::DeviceSuperScope: draw_cursor(0x001f, input.port[1].superscope.x, input.port[1].superscope.y); break; + case Input::DeviceJustifiers: draw_cursor(0x02e0, input.port[1].justifier.x2, input.port[1].justifier.y2); //fallthrough + case Input::DeviceJustifier: draw_cursor(0x001f, input.port[1].justifier.x1, input.port[1].justifier.y1); break; + } + + unsigned yoffset = 1; //scanline 0 is always black, skip this line for video output + if(mode == ModeNTSC && ppu.overscan()) yoffset += 8; //NTSC overscan centers x240 height image + + switch(mode) { default: + case ModeNTSC: { width = 256; height = 224; } break; + case ModePAL: { width = 256; height = 239; } break; + } + + if(frame_hires) width <<= 1; + if(frame_interlace) height <<= 1; + + system.interface->video_refresh( + data + yoffset * 1024, + /* pitch = */ height <= 240 ? 2048 : 1024, + /* line[] = */ height <= 240 ? (pline_width + yoffset) : (iline_width + yoffset * 2), + width, height + ); + + frame_hires = false; + frame_interlace = false; +} + +void Video::scanline() { + unsigned y = ppu.vcounter(); + if(y >= 240) return; + + unsigned width = (ppu.hires() == false ? 256 : 512); + pline_width[y] = width; + iline_width[y * 2 + (int)ppu.field()] = width; + + frame_hires |= ppu.hires(); + frame_interlace |= ppu.interlace(); +} + +void Video::set_mode(Mode mode_) { + mode = mode_; +} + +void Video::init() { + for(unsigned i = 0; i < 240; i++) pline_width[i] = 256; + for(unsigned i = 0; i < 480; i++) iline_width[i] = 256; + frame_hires = false; + frame_interlace = false; + set_mode(ModeNTSC); +} + +#endif + diff --git a/tools/bsnes/system/video/video.hpp b/tools/bsnes/system/video/video.hpp new file mode 100755 index 0000000..b8d44f8 --- /dev/null +++ b/tools/bsnes/system/video/video.hpp @@ -0,0 +1,28 @@ +class Video { +public: + enum Mode { + ModeNTSC, + ModePAL, + }; + void set_mode(Mode); + +private: + Mode mode; + bool frame_hires; + bool frame_interlace; + + unsigned pline_width[240]; //progressive + unsigned iline_width[480]; //interlace + + void update(); + void scanline(); + void init(); + + static const uint8_t cursor[15 * 15]; + void draw_cursor(uint16_t color, int x, int y); + + friend class System; +}; + +extern Video video; + diff --git a/tools/bsnes/ui_qt/base/about.mh b/tools/bsnes/ui_qt/base/about.mh new file mode 100755 index 0000000..8312394 --- /dev/null +++ b/tools/bsnes/ui_qt/base/about.mh @@ -0,0 +1,16 @@ +class AboutWindow : public QObject { + Q_OBJECT + +public: + QWidget *window; + QVBoxLayout *layout; + struct Logo : public QWidget { + void paintEvent(QPaintEvent*); + } *logo; + QLabel *info; + QWidget *spacer; + + void setup(); + +public slots: +} *winAbout; diff --git a/tools/bsnes/ui_qt/base/htmlviewer.mh b/tools/bsnes/ui_qt/base/htmlviewer.mh new file mode 100755 index 0000000..b76fdfc --- /dev/null +++ b/tools/bsnes/ui_qt/base/htmlviewer.mh @@ -0,0 +1,13 @@ +class HtmlViewerWindow : public QObject { + Q_OBJECT + +public: + QWidget *window; + QVBoxLayout *layout; + QTextBrowser *document; + + void setup(); + void show(const char *title, const char *htmlData); + +public slots: +} *winHtmlViewer; diff --git a/tools/bsnes/ui_qt/base/loader.mh b/tools/bsnes/ui_qt/base/loader.mh new file mode 100755 index 0000000..d4dd52e --- /dev/null +++ b/tools/bsnes/ui_qt/base/loader.mh @@ -0,0 +1,46 @@ +class LoaderWindow : public QObject { + Q_OBJECT + +public: + QWidget *window; + QVBoxLayout *layout; + QGridLayout *grid; + QLabel *baseLabel; + QLineEdit *baseFile; + QPushButton *baseBrowse; + QPushButton *baseClear; + QLabel *slot1Label; + QLineEdit *slot1File; + QPushButton *slot1Browse; + QPushButton *slot1Clear; + QLabel *slot2Label; + QLineEdit *slot2File; + QPushButton *slot2Browse; + QPushButton *slot2Clear; + QHBoxLayout *controls; + QPushButton *load; + QPushButton *cancel; + QWidget *spacer; + + void setup(); + void syncUi(); + void loadBsxSlottedCartridge(const char*, const char*); + void loadBsxCartridge(const char*, const char*); + void loadSufamiTurboCartridge(const char*, const char*, const char*); + void loadSuperGameBoyCartridge(const char*, const char*); + +public slots: + void selectBaseCartridge(); + void clearBaseCartridge(); + void selectSlot1Cartridge(); + void clearSlot1Cartridge(); + void selectSlot2Cartridge(); + void clearSlot2Cartridge(); + + void onLoad(); + void onCancel(); + +private: + SNES::Cartridge::Mode mode; + void showWindow(const char *title); +} *winLoader; diff --git a/tools/bsnes/ui_qt/base/main.mh b/tools/bsnes/ui_qt/base/main.mh new file mode 100755 index 0000000..f24638a --- /dev/null +++ b/tools/bsnes/ui_qt/base/main.mh @@ -0,0 +1,129 @@ +class CanvasObject : public QWidget { +public: + void dragEnterEvent(QDragEnterEvent*); + void dropEvent(QDropEvent*); +}; + +class CanvasWidget : public CanvasObject { +public: + QPaintEngine* paintEngine() const; + void mouseReleaseEvent(QMouseEvent*); + void paintEvent(QPaintEvent*); +}; + +class MainWindow : public QObject { + Q_OBJECT + +public: + struct Window : public QMainWindow { + void closeEvent(QCloseEvent*); + } *window; + QVBoxLayout *layout; + QMenu *system; + QAction *system_load; + QMenu *system_power; + QAction *system_power_on; + QAction *system_power_off; + QAction *system_reset; + QMenu *system_port1; + QAction *system_port1_none; + QAction *system_port1_joypad; + QAction *system_port1_multitap; + QAction *system_port1_mouse; + QMenu *system_port2; + QAction *system_port2_none; + QAction *system_port2_joypad; + QAction *system_port2_multitap; + QAction *system_port2_mouse; + QAction *system_port2_superscope; + QAction *system_port2_justifier; + QAction *system_port2_justifiers; + QAction *system_exit; + QMenu *settings; + QMenu *settings_videoMode; + QAction *settings_videoMode_1x; + QAction *settings_videoMode_2x; + QAction *settings_videoMode_3x; + QAction *settings_videoMode_4x; + QAction *settings_videoMode_max; + QAction *settings_videoMode_correctAspectRatio; + QAction *settings_videoMode_fullscreen; + QAction *settings_videoMode_ntsc; + QAction *settings_videoMode_pal; + QMenu *settings_videoFilter; + QAction *settings_videoFilter_point; + QAction *settings_videoFilter_linear; + QAction *settings_videoFilter_none; + QAction *settings_videoFilter_scanline; + QAction *settings_videoFilter_scale2x; + QAction *settings_videoFilter_hq2x; + QAction *settings_videoFilter_ntsc; + QAction *settings_muteAudio; + QMenu *settings_emulationSpeed; + QAction *settings_emulationSpeed_slowest; + QAction *settings_emulationSpeed_slow; + QAction *settings_emulationSpeed_normal; + QAction *settings_emulationSpeed_fast; + QAction *settings_emulationSpeed_fastest; + QAction *settings_emulationSpeed_syncVideo; + QAction *settings_emulationSpeed_syncAudio; + QAction *settings_configuration; + QMenu *help; + QAction *help_documentation; + QAction *help_license; + QAction *help_about; + // + CanvasObject *canvasContainer; + QVBoxLayout *canvasLayout; + CanvasWidget *canvas; + QLabel *systemState; + + void setup(); + void syncUi(); + +public slots: + void loadCartridge(); + void powerOn(); + void powerOff(); + void reset(); + void setPort1None(); + void setPort1Joypad(); + void setPort1Multitap(); + void setPort1Mouse(); + void setPort2None(); + void setPort2Joypad(); + void setPort2Multitap(); + void setPort2Mouse(); + void setPort2SuperScope(); + void setPort2Justifier(); + void setPort2Justifiers(); + void quit(); + void setVideoMode1x(); + void setVideoMode2x(); + void setVideoMode3x(); + void setVideoMode4x(); + void setVideoModeMax(); + void toggleAspectCorrection(); + void toggleFullscreen(); + void setVideoNtsc(); + void setVideoPal(); + void setPointFilter(); + void setLinearFilter(); + void setNoFilter(); + void setScanlineFilter(); + void setScale2xFilter(); + void setHq2xFilter(); + void setNtscFilter(); + void muteAudio(); + void setSpeedSlowest(); + void setSpeedSlow(); + void setSpeedNormal(); + void setSpeedFast(); + void setSpeedFastest(); + void syncVideo(); + void syncAudio(); + void showConfigWindow(); + void showDocumentation(); + void showLicense(); + void showAbout(); +} *winMain; diff --git a/tools/bsnes/ui_qt/resource/resource.rcc b/tools/bsnes/ui_qt/resource/resource.rcc new file mode 100644 index 0000000..d7db447 --- /dev/null +++ b/tools/bsnes/ui_qt/resource/resource.rcc @@ -0,0 +1,8063 @@ +/**************************************************************************** +** Resource object code +** +** Created: Sun May 10 13:18:11 2009 +** by: The Resource Compiler for Qt version 4.4.3 +** +** WARNING! All changes made in this file will be lost! +*****************************************************************************/ + +#include + +static const unsigned char qt_resource_data[] = { + // /Users/david/Devel/arch/snes/tools/bsnes_v046/data/bsnes.png + 0x0,0x0,0x5,0x58, + 0x89, + 0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0, + 0x0,0x0,0x30,0x0,0x0,0x0,0x30,0x8,0x6,0x0,0x0,0x0,0x57,0x2,0xf9,0x87, + 0x0,0x0,0x0,0x1,0x73,0x52,0x47,0x42,0x0,0xae,0xce,0x1c,0xe9,0x0,0x0,0x0, + 0x6,0x62,0x4b,0x47,0x44,0x0,0xff,0x0,0xff,0x0,0xff,0xa0,0xbd,0xa7,0x93,0x0, + 0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,0x1, + 0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x7,0x74,0x49,0x4d,0x45,0x7,0xd8,0x5,0x10, + 0x0,0x37,0x22,0xef,0x27,0xd,0xdd,0x0,0x0,0x4,0xd8,0x49,0x44,0x41,0x54,0x68, + 0xde,0xed,0x98,0x59,0x6c,0xd4,0x55,0x14,0xc6,0x7f,0xdf,0x9d,0x21,0x42,0xab,0xb2, + 0xd8,0x1,0x89,0x85,0xc8,0x12,0xd,0x98,0x10,0xca,0x2e,0xd2,0xe,0x34,0x48,0x54, + 0x44,0x31,0xb2,0x68,0xc4,0x40,0x43,0xc,0xc6,0x18,0x63,0x14,0x13,0x63,0xc0,0x2d, + 0xd1,0x7,0xe9,0x8b,0x6,0xc,0x1a,0x84,0x22,0x82,0x8a,0x12,0x9,0xf,0x62,0xa2, + 0x44,0xa7,0x5,0x59,0xac,0x28,0x2a,0xab,0x28,0x81,0x50,0xad,0xad,0x14,0x4b,0xd8, + 0x4a,0x67,0xee,0xf1,0x81,0x91,0x16,0x68,0xd3,0x99,0xce,0x1f,0xcb,0xc3,0x7c,0xc9, + 0x24,0xf3,0xf0,0xbf,0xf7,0x9e,0xef,0x2c,0xdf,0x39,0xf7,0x42,0x16,0x59,0x64,0x91, + 0x45,0x16,0x19,0x40,0x19,0xef,0xb0,0xd6,0x42,0x91,0x53,0x36,0x46,0x4e,0x53,0xc0, + 0x86,0x60,0x44,0x10,0xd,0x6,0x87,0x64,0xaa,0x70,0x9,0xfb,0xac,0x7a,0xae,0xab, + 0xbd,0x2a,0x9,0x44,0x56,0xf8,0x3b,0x70,0x94,0xca,0x18,0x8d,0xd4,0xda,0x5e,0xf5, + 0x86,0x2d,0x9,0x9f,0xd5,0x6b,0x7f,0xce,0xd3,0xe9,0xab,0x83,0x80,0x99,0x7a,0xae, + 0xb4,0xa7,0x80,0x52,0xa4,0x70,0x8a,0x6b,0x76,0xc5,0x61,0x72,0xdd,0x1c,0x57,0xd5, + 0xe1,0x4,0x22,0x65,0xfe,0x49,0x89,0x37,0x41,0x2e,0x3d,0xde,0xb6,0xa7,0x93,0x28, + 0xfa,0x63,0xb6,0x3b,0x16,0x14,0x1,0x97,0xee,0x82,0xbc,0x95,0xbe,0x0,0xb1,0x28, + 0x5d,0xe3,0x1,0x24,0xd,0x6e,0x34,0xde,0xc2,0x4c,0x1d,0x46,0xc0,0xc1,0xeb,0x42, + 0x9d,0xdb,0x1d,0x72,0xf1,0x50,0xa4,0xcc,0xc6,0x76,0x8,0x81,0xc8,0xfb,0x7e,0x20, + 0x30,0x29,0xc3,0xac,0x75,0x92,0x1e,0xeb,0x98,0x8,0x78,0xee,0x6c,0x4f,0xea,0xb4, + 0x50,0xd,0x93,0x82,0x22,0x10,0x4e,0xf3,0xfb,0x5b,0xc,0x3b,0x2b,0x23,0x9c,0xb2, + 0xfa,0xb4,0x9c,0x47,0xbd,0xbb,0xae,0xb6,0xee,0xf5,0x8f,0xe8,0xf8,0x45,0xb4,0x26, + 0x4e,0xec,0x6a,0x8d,0x8d,0x85,0x98,0xd,0x41,0xea,0x81,0xd9,0x69,0xa4,0x5f,0x5, + 0x15,0xc4,0x62,0x87,0x5,0x96,0x91,0xa,0xf5,0x58,0xe5,0xaf,0xcf,0x39,0x4b,0x38, + 0xde,0x85,0xeb,0x12,0x8d,0xc,0x92,0xb8,0xd7,0x60,0xa6,0xa4,0xbc,0xb4,0x43,0x1f, + 0xb2,0x9b,0xab,0x67,0xb9,0xc3,0x0,0x7e,0xdc,0xb8,0x8,0xce,0xbd,0x20,0x28,0x41, + 0xea,0x7a,0x59,0xbc,0xa0,0x11,0xf8,0x12,0xef,0x17,0xba,0x8a,0x8a,0x9d,0x81,0x76, + 0xe2,0xde,0xab,0x2d,0x2f,0x11,0xb7,0x97,0x80,0x27,0xd2,0x49,0xaf,0x6,0x4f,0xf7, + 0xfa,0x12,0xfd,0xe3,0xb,0xb,0xc7,0x22,0x7d,0x2c,0x29,0x3f,0x5,0x19,0x6e,0x40, + 0x5a,0xe0,0x62,0xb1,0xd2,0xe0,0x46,0x89,0x24,0x7a,0x96,0xf9,0x59,0x26,0x96,0x9, + 0x5d,0x93,0x42,0xd,0x54,0xd5,0xcc,0x76,0xf9,0xbe,0xa8,0xa8,0x10,0xd8,0x28,0x29, + 0x37,0xcd,0xe3,0x5e,0x51,0x2c,0xf6,0x72,0xbb,0x64,0xb4,0x35,0xd4,0xcc,0x71,0x1f, + 0x0,0xcf,0x60,0x66,0x6d,0x9a,0xf,0x1b,0x7d,0x71,0x71,0xaf,0xa4,0xe7,0x73,0xd3, + 0x96,0x0,0xb3,0x5,0xbe,0xa8,0xe8,0xbe,0x40,0x9,0x0,0xd4,0xfe,0xae,0xa5,0xc0, + 0xc6,0x36,0x4e,0x4f,0x78,0x78,0x87,0x78,0x7c,0x81,0xa0,0x77,0xfb,0x34,0x40,0x21, + 0xa4,0x52,0x8b,0x46,0x3b,0x8b,0x80,0x71,0xe3,0x72,0x3f,0xd2,0x3b,0xb6,0xb7,0x36, + 0xdc,0x99,0xd9,0x7b,0x35,0xcb,0xa6,0x3c,0x67,0xa1,0x93,0x47,0x5,0x39,0x19,0x1e, + 0x37,0xa3,0x65,0x29,0x5c,0x4b,0x88,0x1,0xf4,0x3,0x6,0x61,0xf4,0x41,0x74,0xc7, + 0x8,0x63,0x9c,0x44,0x54,0x63,0x1c,0x24,0xc1,0x5e,0xc6,0x70,0xe2,0xd2,0xa5,0xd5, + 0x25,0xaa,0xec,0xb9,0xd2,0xe,0x0,0xb7,0xb6,0x60,0xfd,0xce,0x78,0x83,0x9e,0x35, + 0x9d,0xb8,0x4b,0xb8,0x4c,0x8d,0xc7,0x60,0xea,0xc5,0x4,0x76,0x32,0x12,0xcf,0x5c, + 0xc4,0xdd,0x18,0xf9,0x8,0x77,0xa1,0xcc,0xd5,0xac,0xe4,0xcf,0xff,0x3f,0x45,0x25, + 0x5b,0x71,0x7c,0x84,0xe7,0x43,0x46,0x70,0x3a,0x19,0x5f,0xb3,0x32,0xbf,0x59,0x97, + 0x12,0x30,0xfb,0xd6,0x25,0x98,0x7a,0x7c,0x9e,0xea,0x15,0x8d,0x16,0x4,0x14,0xf0, + 0x82,0xf3,0x35,0xf0,0x1d,0xbd,0xa9,0x64,0x1d,0x9e,0xed,0x88,0x79,0x40,0x5f,0xd4, + 0x46,0x7d,0x88,0x5c,0xc4,0x44,0x8c,0x65,0xc0,0x7e,0x2a,0x79,0x0,0x3b,0x4f,0x51, + 0xe2,0x70,0xb3,0x94,0xa9,0x31,0xb3,0xe7,0xf3,0x72,0x34,0xe1,0xbf,0x8b,0x8d,0x99, + 0xdd,0x60,0x66,0x71,0x6b,0xa1,0x31,0xa5,0x89,0x5e,0x62,0x17,0xf9,0xc4,0xf9,0x6, + 0x18,0x90,0xe1,0x66,0x9,0xe0,0x69,0x86,0xb3,0x38,0x52,0xe6,0xa7,0x9,0x26,0xc8, + 0x51,0xd1,0x28,0x3e,0xaf,0x7b,0xd4,0x5d,0x94,0x6a,0x16,0x8d,0x76,0xb3,0x50,0x28, + 0x97,0xc6,0xc6,0x9b,0x70,0x6e,0x34,0x66,0x33,0x91,0x6e,0x57,0x9a,0xa2,0x62,0x66, + 0xd5,0xa2,0x92,0x35,0x88,0x87,0x3,0xa,0xe9,0x19,0x60,0x10,0xc3,0x9b,0x22,0x90, + 0x62,0x2e,0x3b,0x8b,0x46,0x27,0x1,0x4b,0x4,0xfd,0xd3,0x20,0xb0,0xcd,0x1,0x45, + 0x1,0x8a,0x50,0x17,0x8c,0x51,0xed,0xb8,0x55,0x79,0x17,0x8b,0x7d,0x41,0x38,0x3c, + 0xca,0xcc,0x36,0xa7,0xb1,0x74,0xb3,0x3,0x7e,0xa,0x90,0x40,0x1c,0xc7,0xee,0x76, + 0x8f,0xc6,0x9b,0x36,0x1d,0xe3,0xdc,0xb9,0xfb,0xcd,0x6c,0x77,0xa,0xde,0x4f,0x0, + 0x6b,0x1c,0x8e,0xf9,0x40,0x50,0x57,0xbc,0x45,0xc,0x63,0x4f,0x46,0xf3,0xfd,0xb6, + 0x6d,0x75,0x92,0x1e,0x37,0xb3,0x78,0x1b,0xdd,0x6c,0x83,0xca,0xcb,0x7f,0x54,0x52, + 0x3e,0x7,0x63,0x2c,0x7,0x46,0xb7,0xf3,0xdc,0x13,0x78,0x16,0x32,0x82,0xc5,0x8, + 0xdf,0xe4,0x25,0x72,0xcc,0xe8,0x9f,0x14,0x88,0x9e,0x40,0x2e,0x70,0x2e,0xe9,0xb0, + 0x23,0xc0,0x7e,0x89,0xe3,0xd2,0xe5,0x6a,0xe4,0xa3,0xd1,0xd,0x82,0x29,0xad,0x78, + 0xff,0x2f,0x25,0x12,0xa3,0xb4,0x65,0xcb,0x91,0xa6,0x6e,0xf9,0x35,0x61,0xba,0x32, + 0x35,0xd9,0x7,0x8a,0x68,0xab,0x4b,0x1a,0x86,0x38,0x80,0xf1,0x9,0x21,0x96,0x52, + 0x40,0x15,0x80,0xf7,0xe4,0x4a,0x4c,0x37,0x63,0x3a,0x30,0x56,0xa2,0x5b,0xeb,0x69, + 0x40,0x83,0xc4,0x2f,0x66,0xac,0x7,0x56,0x39,0xd7,0x54,0xfc,0x7e,0xfc,0xf8,0x7, + 0x65,0xf6,0x69,0xb,0xc6,0x1f,0xc3,0xec,0x1e,0x57,0x51,0xb1,0xa3,0xf5,0x69,0xf4, + 0x7,0xba,0x91,0x60,0x18,0xe2,0x36,0xa0,0xf,0xd0,0x1d,0x23,0x4,0x9c,0x42,0x54, + 0x3,0x7,0x81,0xef,0xf9,0x8d,0x43,0xcc,0x20,0x71,0xe1,0x50,0xcf,0x4c,0xe0,0xd, + 0x89,0xbe,0xe9,0xf,0x68,0x9c,0x6,0xde,0x96,0x58,0x28,0x71,0xd6,0x17,0x17,0xf7, + 0x22,0x1e,0xaf,0x92,0x14,0x6a,0x66,0xfc,0x76,0xa0,0xc4,0x95,0x97,0xef,0xd,0x7c, + 0x9c,0xf6,0x9e,0x5,0xc0,0xab,0x52,0xc6,0x7b,0xc6,0xcc,0x98,0x2c,0xc7,0x19,0x8b, + 0x46,0xff,0xc6,0xac,0x13,0xd2,0xe,0xbc,0x7f,0x57,0xce,0xad,0x53,0x2c,0x16,0xf, + 0xfc,0x79,0xcf,0x7b,0xa,0xbc,0x27,0x6e,0x86,0x5,0xf1,0xf3,0x9e,0x17,0x1,0x7c, + 0x61,0x61,0x3f,0x8b,0x46,0xaf,0xbd,0xe2,0xf,0xac,0xde,0x33,0x3f,0x28,0xe3,0x93, + 0x4,0x52,0xee,0x5,0x41,0xdd,0x7,0xf6,0x5,0xec,0x93,0x7d,0xfc,0x9f,0x30,0xc3, + 0x79,0xcf,0xfa,0x80,0xbc,0x7f,0xd4,0x2c,0x7d,0x11,0x8,0x82,0x44,0x8e,0xf7,0x2c, + 0xc9,0xa4,0x16,0xbc,0x67,0xab,0xf7,0xc,0xa4,0x23,0x61,0xc6,0x50,0xef,0x59,0xe1, + 0x3d,0xb5,0x29,0x1a,0x7d,0xc6,0x7b,0xbe,0xf2,0x9e,0x69,0x76,0x5e,0xaa,0xaf,0xfc, + 0xeb,0x74,0xaa,0x11,0x31,0x63,0x28,0x30,0x2c,0xd9,0x89,0x23,0xcd,0x3a,0x71,0x9d, + 0xc4,0x61,0x33,0x7e,0x6,0x76,0x38,0x47,0x2d,0x59,0x64,0x91,0x45,0x16,0x59,0x74, + 0x4,0xfe,0x5,0x58,0xa9,0xdf,0x6f,0x25,0x7,0x15,0xfd,0x0,0x0,0x0,0x0,0x49, + 0x45,0x4e,0x44,0xae,0x42,0x60,0x82, + // /Users/david/Devel/arch/snes/tools/bsnes_v046/data/logo.png + 0x0,0x0,0x41,0x5d, + 0x89, + 0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0, + 0x0,0x2,0x58,0x0,0x0,0x0,0x6a,0x8,0x6,0x0,0x0,0x0,0x60,0x4b,0x2f,0x53, + 0x0,0x0,0x0,0x6,0x62,0x4b,0x47,0x44,0x0,0xff,0x0,0xff,0x0,0xff,0xa0,0xbd, + 0xa7,0x93,0x0,0x0,0x41,0x12,0x49,0x44,0x41,0x54,0x78,0xda,0xed,0x5d,0x7,0x78, + 0x14,0x55,0x17,0x9d,0x4d,0xe8,0xbd,0x83,0x80,0xa,0x64,0x77,0x36,0x21,0x84,0x0, + 0xa1,0xf7,0x4,0x42,0xef,0x10,0x7a,0x28,0x49,0x66,0x66,0x13,0xa4,0x89,0x34,0x11, + 0x44,0xa4,0x49,0x15,0x14,0xa9,0x8a,0x1d,0x7b,0xef,0x1d,0xc5,0xae,0xd8,0xb1,0x61, + 0x45,0x11,0x95,0x5f,0x10,0x41,0x8a,0xec,0xbc,0xff,0x9d,0x37,0x33,0x9b,0x4d,0xb2, + 0x49,0x36,0xd9,0xdd,0xcc,0x6c,0xf2,0xee,0xf7,0xdd,0xf,0x8,0xc9,0x66,0xe6,0x95, + 0xfb,0xce,0xbb,0xe5,0x5c,0x41,0xe0,0xc2,0x85,0xb,0x17,0x2e,0x5c,0xb8,0x70,0xe1, + 0xc2,0x85,0xb,0x17,0x2e,0x5c,0xb8,0x70,0xe1,0xc2,0x85,0x8b,0x59,0xd2,0x42,0x71, + 0x8,0xe,0x79,0x22,0xd5,0x15,0x54,0xf7,0x51,0x7d,0x51,0x70,0x48,0xef,0xa,0xa2, + 0xf2,0x81,0xe0,0x50,0xde,0xa6,0xff,0x7e,0x8a,0xfe,0x79,0x37,0xfd,0x73,0x29,0xfd, + 0x73,0x94,0x20,0x66,0xb6,0xe0,0x83,0xc6,0x85,0xb,0x17,0x2e,0x5c,0xb8,0x70,0xe1, + 0x92,0x43,0x96,0x47,0x8,0xa2,0xd4,0x57,0xb0,0xcb,0xbb,0x5,0x51,0xfe,0x91,0x2, + 0x27,0x52,0xc,0xfd,0x8e,0xea,0x16,0xc1,0xee,0xea,0x4d,0x3f,0xd0,0xc6,0xc7,0x94, + 0xb,0x17,0x2e,0x5c,0xb8,0x70,0xe1,0x52,0x36,0xa5,0x59,0x56,0x23,0xe6,0x85,0xf2, + 0x2,0x55,0xb6,0xb8,0xd9,0x6a,0xc5,0x21,0xdb,0x49,0x35,0xf9,0x59,0x52,0x73,0xf1, + 0x41,0x52,0x67,0xc3,0x2f,0xa4,0xde,0xf6,0x53,0xa4,0xfe,0xae,0x7f,0x49,0x83,0x3b, + 0x8,0xa9,0xbf,0xfb,0x1c,0xa9,0xbb,0xf5,0x7f,0xa4,0xf6,0xda,0x1f,0x48,0x8d,0x79, + 0x6f,0x93,0x2a,0x53,0x1f,0x26,0x15,0xfa,0x6d,0x26,0xb6,0x98,0x2c,0xd5,0xb,0x6c, + 0x7d,0x49,0x3f,0x73,0x86,0x10,0x9b,0x55,0x8d,0xf,0x32,0x17,0x2e,0x5c,0xb8,0x70, + 0xe1,0xc2,0xa5,0x6c,0x48,0xf4,0x8c,0xba,0x82,0x28,0xad,0x15,0x44,0xe5,0x5f,0xd, + 0x54,0xcd,0x51,0xab,0x4c,0xba,0x9f,0xd4,0x5e,0xfd,0x3d,0x69,0xb0,0xd7,0xcd,0x80, + 0x54,0x51,0x15,0xc0,0xab,0xe6,0xd5,0x1f,0x91,0x4a,0x23,0x76,0x13,0xc1,0x99,0xa9, + 0x81,0x2d,0x51,0x39,0x2e,0xd8,0xa5,0x2c,0x21,0x36,0xa5,0x2,0x1f,0x74,0x2e,0x5c, + 0xb8,0x70,0xe1,0xc2,0x85,0x4b,0xe9,0x15,0xbb,0x94,0x46,0x81,0xcf,0x49,0x0,0xa0, + 0x88,0x76,0xb,0xd4,0xea,0xb3,0xf7,0x93,0xfa,0xb7,0xfd,0x57,0x2c,0x50,0x95,0x9f, + 0xd6,0xdb,0xf6,0x37,0xa9,0x9a,0xfe,0x4,0xb1,0xb5,0xbc,0x42,0xf7,0x6a,0x29,0x87, + 0x5,0xbb,0xdc,0x8f,0xf,0x3e,0x17,0x2e,0x5c,0xb8,0x70,0xe1,0xc2,0xa5,0x74,0x9, + 0xc2,0x81,0xa2,0xfc,0x2c,0xf3,0x58,0xc5,0x64,0xa9,0xd5,0x5c,0xcf,0x93,0xfa,0xb7, + 0x5e,0x8,0x2a,0xb0,0xca,0x3,0xb4,0xb6,0x9f,0x22,0x95,0x27,0xdc,0xb,0x4f,0x16, + 0xc2,0x86,0x2a,0xfd,0xfd,0x9b,0x4,0xfb,0xcc,0x8a,0x7c,0x32,0xfc,0x14,0x84,0x58, + 0x51,0x40,0x60,0x5,0x8d,0x76,0x35,0xe3,0x13,0xc2,0x85,0xb,0x17,0x2e,0x5c,0xb8, + 0x78,0x4b,0xb4,0x1c,0x27,0x38,0x94,0x9f,0x1,0xae,0xca,0x27,0xae,0x25,0x75,0x37, + 0x1f,0xb,0x29,0xb0,0xca,0xad,0xb5,0x57,0x7c,0x4d,0x22,0x12,0x16,0x1a,0x39,0x5a, + 0x1f,0xa,0x31,0xf2,0x25,0x7c,0x52,0xfc,0x10,0x51,0x5e,0x53,0xcc,0x82,0x83,0xe0, + 0xab,0x28,0xbf,0xc9,0x27,0x84,0xb,0x17,0x2e,0x5c,0xb8,0x70,0x31,0x4,0xa1,0x39, + 0x51,0xf9,0x7,0x87,0x64,0xe5,0x89,0xfb,0x8a,0x9d,0x63,0x15,0xa8,0xd6,0xdf,0x79, + 0x86,0x54,0x1c,0xbc,0x4d,0x3b,0xac,0xed,0xf2,0x8f,0xf4,0xc0,0x8e,0xe6,0x93,0x53, + 0x18,0xc0,0x52,0xe,0x62,0xbc,0xba,0x28,0xcf,0x99,0xa6,0xe2,0xc8,0x5b,0xd,0x90, + 0xb5,0x94,0x4f,0x8,0x17,0x2e,0x5c,0xb8,0x70,0xe1,0x2,0x71,0x28,0xc9,0x14,0xc8, + 0x9c,0xc5,0x1,0x59,0x7d,0xe6,0x2b,0xa6,0x0,0xab,0x1c,0x4a,0xc1,0x5d,0xe5,0xf1, + 0xf7,0xe8,0x7,0xb6,0xf2,0xa7,0x10,0x95,0x6e,0xe7,0x93,0x94,0x1f,0x30,0x9e,0x5e, + 0x9f,0x8e,0x93,0x3b,0x6e,0xc2,0xbd,0x64,0x6,0x1d,0x3b,0xb3,0xb4,0x8b,0xfc,0xac, + 0x36,0x5f,0x51,0x19,0x9,0x7c,0x52,0xb8,0x70,0xe1,0xc2,0x85,0xb,0x17,0x87,0xdc, + 0x89,0x55,0x9,0x3a,0x5d,0x8c,0x4e,0xc1,0x74,0x70,0xe5,0xa5,0x48,0x80,0xd7,0xab, + 0xc,0xf,0xb,0xa2,0xab,0x9,0x9f,0x2c,0x9f,0xf3,0x7,0xa2,0x57,0x32,0x68,0xc9, + 0xc7,0xa6,0x2,0xac,0x26,0x7d,0x37,0xa8,0x36,0x91,0x82,0x61,0x70,0xa5,0x71,0xe1, + 0xc2,0x85,0xb,0x17,0x2e,0x65,0x5a,0x9a,0x67,0x34,0x14,0x44,0xf9,0x57,0x24,0x97, + 0xd7,0xb8,0xf2,0x4d,0x4b,0x81,0x2b,0x43,0xb3,0x3d,0x59,0xf2,0x41,0x9e,0xf8,0xee, + 0xb,0x60,0x29,0x7b,0x23,0x9c,0x2e,0x55,0xde,0x7d,0xd6,0x34,0x70,0x25,0xed,0xfa, + 0x97,0xe0,0x19,0xe8,0x1c,0xdd,0xce,0x27,0x84,0xb,0x17,0x2e,0x5c,0xb8,0x94,0x75, + 0xb1,0x9,0xe,0xe9,0x55,0x80,0x97,0x2a,0xa9,0xf,0x5a,0x12,0x5c,0x19,0xe1,0xc2, + 0xa,0x3,0x6f,0x32,0xc2,0x85,0xeb,0xf9,0xb4,0xe5,0x9a,0x44,0xd1,0xf5,0xdb,0x25, + 0x49,0xeb,0x4d,0xf5,0x5e,0xd,0x58,0xf4,0xa1,0xee,0x69,0x94,0xc6,0xf3,0x19,0xe1, + 0xc2,0x85,0xb,0x17,0x2e,0x65,0x5b,0x44,0x45,0xc6,0xa1,0x58,0x21,0x79,0xa3,0x69, + 0x9,0xed,0x7e,0xd3,0x38,0xec,0x38,0x4d,0x22,0xda,0x5c,0x5,0xf,0x89,0x5b,0x70, + 0x66,0x24,0xf1,0xc9,0xd3,0x25,0xca,0xd5,0xa,0x73,0xd8,0x49,0x7a,0xda,0x54,0x80, + 0xd5,0x32,0xe5,0x4e,0x80,0x5f,0xb7,0x10,0x9b,0x5e,0x87,0x4f,0xa,0x17,0x2e,0x5c, + 0xb8,0x70,0x29,0xcb,0x7,0x73,0x3,0xa,0xb0,0xfe,0xb6,0xc5,0x5c,0xa1,0xd6,0xdd, + 0xf2,0xa7,0xa5,0xc1,0x95,0xa1,0xb5,0x96,0x7d,0x6e,0xf0,0x64,0x7d,0x25,0x24,0xc8, + 0xe5,0xf9,0x24,0x32,0x90,0x7c,0x25,0x0,0xd6,0x98,0x35,0x3f,0x98,0x7,0xb0,0x6e, + 0x57,0x49,0x95,0x36,0xf3,0xdd,0x82,0x5d,0x39,0xc0,0x27,0x84,0xb,0x17,0x2e,0x5c, + 0xb8,0x94,0x6d,0x41,0xa8,0x8d,0x1e,0xcc,0xd5,0x32,0x5f,0x8,0xb,0x70,0x65,0x68, + 0xc5,0x61,0x3b,0xc,0xae,0xa5,0x2b,0xf8,0x24,0x2,0x60,0xc9,0xcf,0x56,0x6c,0x35, + 0xc7,0x9d,0x45,0x41,0x8e,0x59,0x0,0x6b,0xdc,0xba,0x23,0x46,0xf8,0xf6,0x1a,0x3e, + 0x21,0x5c,0xb8,0x70,0xe1,0xc2,0xa5,0xec,0x8a,0xc6,0xd4,0x7e,0x36,0xb2,0xfd,0x22, + 0x35,0xd8,0xad,0x6f,0x42,0xad,0xf0,0xb6,0x69,0xfd,0xb,0x95,0xa3,0x65,0xbe,0x6f, + 0x61,0xb3,0x69,0x95,0x6c,0xa2,0x72,0xce,0x3e,0x7c,0x97,0x35,0xe8,0x19,0xec,0x72, + 0x3b,0xbe,0xb9,0xb8,0x70,0xe1,0xc2,0x85,0x4b,0x59,0xf6,0x7a,0x2c,0x67,0x7c,0x57, + 0x73,0xdf,0x8,0x2b,0x70,0x65,0x68,0xa5,0x51,0xb7,0x19,0xd4,0xd,0x53,0xca,0xf6, + 0x3c,0x4a,0x7d,0x31,0xe,0x89,0x73,0xe,0x98,0xa,0xb0,0x2e,0x49,0x5a,0x47,0x6c, + 0xe,0xe5,0x98,0x80,0xa2,0x9,0x2e,0x5c,0xb8,0x70,0xe1,0xc2,0xa5,0x4c,0x4a,0xef, + 0xe5,0xe5,0x28,0x30,0xf9,0xc5,0x16,0x37,0x47,0xad,0xbf,0xe7,0x42,0x58,0x2,0xac, + 0x3a,0x1b,0x8e,0x1a,0xb4,0xd,0xaf,0x95,0xe9,0xb9,0x74,0xc8,0xeb,0x30,0xe,0x53, + 0x6f,0xfa,0xcb,0x5c,0x7a,0x6,0x91,0xd3,0x33,0x70,0xe1,0xc2,0x85,0xb,0x97,0xb2, + 0x2e,0xe,0x79,0xb0,0xd6,0xa,0xe7,0xbe,0xb0,0x4,0x57,0x86,0x96,0xef,0xb5,0x9a, + 0xb0,0x8a,0xc2,0xe6,0xe9,0x97,0x97,0xd5,0xa9,0xb4,0x89,0xca,0xa7,0xb5,0x3b,0x2f, + 0x73,0x9b,0xe9,0xbd,0xea,0xbf,0xf0,0x3,0x23,0x3c,0x98,0xc2,0x37,0x17,0x17,0x2e, + 0x5c,0xb8,0x70,0x29,0xbb,0x62,0x97,0x77,0xe3,0x40,0xac,0x75,0xdd,0x57,0x61,0xd, + 0xb0,0xaa,0xcd,0x78,0xc9,0x48,0x76,0x9f,0x51,0x26,0xe7,0x11,0x79,0x74,0xe,0x59, + 0x8d,0x9f,0x74,0xbf,0xa9,0xe1,0xc1,0x98,0x31,0xb7,0x6b,0xf4,0xc,0x97,0x65,0xd6, + 0xe6,0x9b,0x8b,0xb,0x17,0x2e,0x5c,0xb8,0x94,0x59,0xa7,0x7,0x92,0xc3,0x6d,0xad, + 0x66,0xa9,0xd,0xf6,0x5e,0xc,0x6b,0x80,0x55,0x77,0xf3,0xef,0x86,0xe7,0xe4,0xd1, + 0xb2,0x9,0x94,0xa5,0x54,0xbc,0xff,0x90,0xa5,0x9f,0x9a,0x4f,0xcf,0xe0,0x90,0xdf, + 0xe0,0x5b,0x8b,0xb,0x17,0x2e,0x5c,0xb8,0x94,0x5d,0x69,0xa1,0x38,0x70,0x28,0x57, + 0x1c,0x74,0x73,0x58,0x83,0x2b,0x43,0x23,0xdb,0x2f,0x82,0xf7,0xe4,0xa4,0x50,0x16, + 0x93,0xab,0x45,0xf9,0xae,0x88,0xe8,0x4c,0x55,0xde,0x73,0xce,0x34,0x80,0x35,0x76, + 0xed,0x4f,0x6,0xc8,0x5d,0xc4,0x37,0x17,0x17,0x2e,0x5c,0xb8,0x70,0x29,0xbb,0x82, + 0x36,0x26,0xf4,0x40,0x44,0x3,0xe5,0xd2,0x0,0xb0,0x2a,0xe,0xde,0xa6,0x1d,0xf0, + 0xce,0x8c,0xe6,0x65,0x6c,0x26,0x6d,0x36,0xd1,0xf5,0x47,0x93,0xe4,0x8d,0xa6,0x86, + 0x7,0x3b,0x2b,0xcf,0x70,0x7a,0x6,0x2e,0x5c,0xb8,0x70,0xe1,0xc2,0x45,0x10,0xe5, + 0x35,0x38,0x10,0x6b,0x5e,0xfd,0x51,0xa9,0x0,0x58,0x55,0xa7,0x3d,0xaa,0x1f,0xf0, + 0xca,0xd0,0x80,0xc7,0x26,0x36,0xab,0x9a,0x20,0x66,0xf4,0xa0,0x60,0x61,0xe,0xfd, + 0xcc,0x2d,0x82,0x43,0xba,0x97,0xfe,0xf9,0xa2,0xa6,0xd2,0xb,0x54,0x1f,0x64,0x5f, + 0xb7,0xcb,0x73,0x5,0x87,0x92,0x2c,0x38,0xd3,0xaa,0x9b,0x37,0x8f,0x4a,0x3c,0xde, + 0x1b,0xfc,0x53,0xa6,0xd3,0x33,0x88,0xae,0xdf,0x4,0x4e,0xcf,0xc0,0x85,0xb,0x17, + 0x2e,0x5c,0xca,0x38,0xc0,0xba,0x93,0x25,0xb8,0x5f,0x7b,0x88,0x11,0x76,0xd6,0xbb, + 0xf9,0x4,0xa9,0xbf,0xfb,0x6c,0xd8,0x2,0xac,0xea,0xb3,0x5e,0xd3,0x1,0x96,0x94, + 0x55,0xac,0xf1,0x80,0xe7,0x4b,0x6b,0x35,0xf3,0x6,0xab,0x48,0xd4,0xa8,0x1f,0xfc, + 0xd5,0x8b,0xf4,0x67,0x3f,0xa0,0x7f,0x2e,0x11,0xa2,0x25,0xb1,0x44,0xe7,0xd1,0x21, + 0x2f,0xc0,0x33,0x20,0x44,0x67,0x16,0xb8,0x4a,0xdf,0x79,0x9a,0x82,0x2b,0x5,0xf4, + 0xc,0xb7,0xf2,0x8d,0xc5,0x85,0xb,0x17,0x2e,0x5c,0xca,0xb6,0x38,0xe4,0x97,0x7c, + 0x82,0x5,0xd1,0x45,0x22,0x3b,0x2d,0x25,0x15,0x87,0x6c,0x27,0x55,0xd3,0x9f,0x24, + 0xb5,0x57,0x7e,0x6b,0xf9,0xe6,0xcf,0xd0,0x9a,0x8b,0xf,0x1a,0x84,0xa3,0xd7,0x15, + 0x61,0x14,0x6c,0x82,0x5d,0xee,0x47,0xf5,0x19,0x3,0x54,0x45,0x8a,0x32,0xe9,0xd8, + 0x32,0x95,0x64,0xb6,0x19,0x4b,0x76,0x75,0x18,0x46,0x5e,0xed,0x3c,0x90,0x7c,0xde, + 0x35,0x99,0xfc,0xde,0xa3,0xf,0x39,0xde,0x23,0x89,0x7c,0xd7,0x3d,0x99,0x1c,0xea, + 0x96,0x4c,0x9e,0xed,0x34,0x88,0x6c,0x6f,0x3f,0x9c,0x64,0xd1,0xef,0x6b,0x1d,0x33, + 0x95,0x44,0x38,0x24,0xef,0x71,0xdc,0x4f,0x81,0xde,0x30,0x41,0x58,0x1e,0x51,0x2, + 0xf3,0xf8,0x62,0xa5,0xd6,0x57,0x9a,0xda,0x1e,0xc7,0x43,0xcf,0x20,0xca,0xf,0x30, + 0x8a,0x86,0x50,0xa8,0x28,0x4f,0x65,0xd,0xc9,0x59,0x53,0x72,0x65,0xba,0xe0,0x90, + 0x86,0xd0,0xb5,0xda,0x51,0x88,0xca,0xba,0x14,0x2c,0xf6,0xa5,0x6e,0x7f,0xe2,0x9d, + 0x40,0x3b,0x82,0x5c,0xc9,0xa8,0x8c,0x4,0xfa,0xfe,0xdd,0x35,0x32,0x59,0x69,0x34, + 0x1d,0xeb,0x89,0x9e,0xb1,0xe0,0xa,0x1d,0xe7,0xf7,0xda,0xb1,0xa2,0x3a,0xa4,0x69, + 0xda,0x73,0xd2,0xf9,0xb5,0x2b,0x5d,0x84,0x16,0xf2,0x65,0xa5,0xf2,0xcc,0x81,0xa7, + 0x3f,0xda,0xd5,0x4c,0x70,0x2a,0xed,0xa9,0x7d,0xec,0x9f,0x73,0x8e,0x24,0x29,0xe7, + 0x98,0xc8,0x8a,0xcf,0xb1,0x42,0x41,0xf,0xfb,0x7e,0x65,0x10,0xb5,0x3,0x3d,0xb5, + 0xbd,0x91,0xd9,0x82,0xf5,0xd3,0x6d,0x9d,0x5a,0x95,0x1f,0xec,0xba,0x20,0xa,0x63, + 0xcf,0x68,0x2a,0x44,0xcb,0x71,0x5a,0x34,0x86,0x9e,0x47,0x20,0xe3,0x2e,0xea,0xda, + 0xb4,0x2b,0xe9,0x5,0xef,0x2d,0xba,0x66,0xf3,0xd7,0xe,0x6c,0x7e,0xfc,0x51,0x38, + 0x26,0x30,0x8f,0xc5,0x51,0xfb,0xcc,0x1a,0xd6,0x9b,0x0,0xd,0x54,0x1c,0x64,0x4, + 0x9d,0xe,0xe9,0x69,0xfa,0xe7,0xf3,0x74,0xc1,0xbe,0x4d,0xff,0x3c,0x44,0xf5,0x9c, + 0x37,0xe8,0xb2,0xc5,0xce,0x54,0x2b,0x8d,0xbc,0x95,0xd4,0x5a,0x7e,0x88,0x34,0xa0, + 0x7,0xb9,0x25,0x9b,0x3f,0x2f,0xfd,0xd4,0x38,0xe4,0xd7,0xf8,0xe7,0xc1,0x93,0x46, + 0xda,0x1c,0xf2,0x97,0xec,0xfd,0xa8,0xe,0x88,0x9b,0x44,0x6e,0xa3,0x80,0xea,0x4f, + 0xa,0xa2,0x48,0xaf,0x5e,0x45,0x56,0x80,0xaf,0xdd,0xf4,0xe7,0xfb,0xb5,0x9a,0xe4, + 0x1,0x5b,0x36,0x34,0xa2,0xa6,0xbf,0x27,0x64,0x73,0xd8,0x74,0x6e,0x65,0x9b,0x28, + 0x9f,0x17,0x47,0xee,0x31,0x35,0x3c,0x18,0x3d,0x7a,0x2f,0x29,0xa2,0xc7,0x2f,0xe8, + 0x6a,0x73,0x2a,0xbf,0xa3,0x17,0x23,0x3,0xd8,0x30,0x28,0x20,0xd1,0xb5,0xba,0x44, + 0xcf,0xa8,0x2b,0xd8,0x5d,0xbd,0xe9,0xbe,0x73,0xd1,0x3d,0xb8,0x15,0xcf,0x4f,0xe7, + 0xf3,0x73,0x9b,0xa8,0xfc,0x65,0xf6,0x78,0x86,0xbb,0xda,0x44,0xd7,0xc5,0xf0,0x7e, + 0x7e,0xe5,0x34,0x5,0x22,0x1f,0xa2,0x80,0x85,0xfe,0x7b,0x16,0xfd,0x33,0x3a,0x2c, + 0xe,0x76,0x5c,0x78,0xec,0xca,0x18,0xbd,0x43,0xc8,0x3e,0xba,0x1f,0xf,0x6a,0x7b, + 0x53,0xb9,0x50,0x22,0x63,0x47,0xed,0x21,0x9d,0xfb,0x1f,0xf5,0x48,0x4,0xfd,0xfd, + 0xf2,0x26,0x96,0xea,0x1,0x10,0x8e,0xb,0x59,0x63,0xb9,0x4a,0xe9,0x40,0x50,0x29, + 0x91,0x14,0x34,0xc5,0xd2,0xb1,0x9e,0x4c,0xdf,0x73,0xa5,0x96,0xc6,0xa2,0xbc,0x6d, + 0x73,0xba,0xfe,0xa0,0xef,0x7b,0xb1,0x4c,0xed,0x77,0x51,0xe9,0x13,0x7e,0x93,0x17, + 0x95,0x6e,0x67,0x1b,0xc5,0x21,0x6d,0xa7,0x2f,0x71,0xd8,0x78,0x99,0xc8,0x8e,0x57, + 0xab,0xd5,0x32,0x9f,0x27,0xf5,0xf7,0x9c,0xf,0x4f,0x80,0x5,0xa4,0xac,0xe5,0x53, + 0x91,0x48,0x87,0xa4,0xca,0xf1,0x63,0xc9,0x57,0xdd,0x92,0x8b,0x5,0xaa,0xf2,0xd3, + 0x6f,0xbb,0xf5,0x25,0xf8,0x5c,0x7c,0xbe,0x36,0x6e,0xd2,0xab,0x74,0x2c,0x5b,0x6, + 0xdf,0x98,0x29,0x3,0xf0,0xf9,0x7d,0xe6,0xbd,0x65,0x2a,0xc0,0x1a,0xb3,0xfa,0x7b, + 0x32,0x8c,0x82,0xef,0x50,0x6b,0xca,0xda,0x1f,0xc9,0x58,0xaa,0xa3,0x57,0x7d,0x47, + 0x6,0x2d,0xf9,0x98,0x24,0xce,0x7d,0x83,0x74,0x92,0x9e,0x26,0xad,0x27,0xde,0x47, + 0x9a,0xd,0xbe,0x99,0x54,0x6b,0xb7,0xd0,0xed,0x75,0x40,0xfd,0x43,0xd,0xce,0x5e, + 0x76,0xcb,0xb5,0xcc,0xd,0x3e,0xa3,0x39,0x35,0x8a,0x69,0x8,0xa5,0xda,0x1c,0xae, + 0x6f,0x73,0x1a,0xa,0x85,0x54,0x6d,0xbb,0xc0,0xdd,0x28,0x71,0x2d,0x89,0x1a,0xba, + 0x83,0xbd,0x13,0xde,0xad,0xab,0xeb,0x79,0xd2,0x7b,0xce,0xeb,0xa4,0xef,0x55,0x6f, + 0x33,0x4f,0xe1,0xb0,0x6b,0xbf,0x20,0x23,0x56,0x7c,0x4d,0xc6,0xac,0xf9,0x81,0x8d, + 0x45,0x59,0xd5,0xc2,0xd6,0x1c,0xc6,0x28,0xc7,0xbf,0xaf,0xfb,0xca,0xb2,0xef,0x32, + 0x7a,0xe5,0x61,0x3a,0xaf,0x87,0xd8,0xfc,0x26,0x5d,0xf9,0x26,0x9b,0x77,0xc7,0x88, + 0xdd,0xa4,0x5e,0xf7,0xeb,0xd5,0xc8,0x98,0x2c,0x35,0xfb,0x12,0x91,0xf9,0x3d,0xfd, + 0x73,0xa9,0xa5,0x3c,0x5c,0xec,0x92,0x20,0x4d,0x2,0x98,0xa1,0x40,0xea,0xa8,0xf7, + 0x9a,0x2e,0x17,0x73,0x85,0xbb,0x7e,0x8f,0x95,0x2a,0xf6,0x26,0x2e,0x61,0x6d,0x26, + 0x3f,0x40,0x3a,0xcb,0xcf,0x90,0x5e,0xb3,0xf6,0x93,0x1,0x8b,0x3f,0x64,0xef,0x6c, + 0xcc,0xf,0xe6,0xd3,0x9f,0xb1,0x1a,0x79,0xfd,0x37,0xec,0xfb,0x7,0x5d,0xfd,0x31, + 0x49,0x9e,0xff,0xe,0xe9,0x3d,0x7b,0x3f,0xe9,0xa2,0x3c,0x47,0xda,0x4f,0x7f,0x8c, + 0xc4,0x4f,0xbe,0x9f,0x38,0x47,0xdd,0x46,0x9a,0x26,0x6f,0x22,0x20,0x5d,0xc6,0xef, + 0xcf,0x7b,0x20,0x2b,0x6e,0xa,0xc0,0xbe,0xd2,0xf3,0x6a,0xe7,0x33,0x2f,0x4b,0x49, + 0x44,0x1a,0x2,0x15,0x0,0x43,0x78,0xed,0x44,0x69,0x2d,0x7d,0x87,0xb7,0xa8,0x7d, + 0x3b,0x9b,0x7b,0xac,0xeb,0x74,0x5d,0xce,0xc6,0x1a,0x7c,0x84,0x18,0xeb,0x4e,0x19, + 0x4f,0x91,0x1e,0x57,0xbc,0x42,0x6d,0xc7,0x3b,0x64,0xf0,0x35,0x9f,0xb0,0xb1,0x2b, + 0xf2,0xda,0xa4,0xb6,0x76,0xe8,0xb2,0xcf,0x7d,0xee,0x31,0x7c,0x1d,0x6b,0xd6,0x97, + 0xf6,0x5b,0xf8,0x3e,0xb3,0x5b,0xfe,0x68,0x8f,0x2b,0x5e,0x66,0x73,0x58,0x54,0xf5, + 0xbc,0xbf,0x7d,0x66,0xc5,0xf0,0x7,0xcc,0x70,0x35,0xb2,0x5b,0xb6,0xf2,0x37,0x5e, + 0x2a,0xa2,0xcd,0x3c,0xb5,0x3a,0x9d,0x3c,0xab,0x84,0xf,0x91,0xac,0xaf,0xf,0xf8, + 0xca,0xfc,0xbd,0x76,0x52,0x9a,0xcd,0x2e,0x9f,0xc1,0xf7,0xf5,0x6d,0x35,0x99,0x7c, + 0xd1,0xad,0x5f,0x50,0x81,0x55,0x6e,0xc5,0xe7,0xc3,0x33,0xa6,0x79,0xb3,0x24,0xba, + 0x21,0x94,0x99,0x42,0x30,0x93,0xc0,0x71,0x3b,0xa3,0x9f,0x3d,0x6d,0xdb,0x9,0x53, + 0x1,0x96,0x95,0x74,0xfa,0xb6,0xbf,0x99,0x41,0x69,0x3e,0x64,0x9b,0xd1,0xb6,0x7, + 0x60,0xeb,0x5d,0x16,0x92,0x30,0x25,0x14,0x9f,0x11,0x43,0xe7,0xfd,0x1a,0xfa,0xc, + 0x1f,0x7b,0x2e,0x29,0x31,0x59,0xee,0x4b,0x92,0xd6,0xab,0xed,0xa6,0x3d,0xc2,0x9e, + 0x15,0x86,0xcc,0x4c,0x8a,0xd,0xae,0xd6,0x55,0x84,0xfe,0xc7,0x6f,0xf8,0x85,0x74, + 0xcb,0x7a,0x91,0x34,0x4c,0x5c,0xe3,0xf6,0xe4,0x7c,0xda,0xa5,0x3b,0xd8,0x25,0xd8, + 0xc,0x69,0x3a,0xb7,0x32,0x40,0x95,0xcd,0x89,0xe8,0x87,0xc2,0x9e,0xa9,0x7c,0xcb, + 0x99,0xee,0xcb,0x6,0x6c,0x21,0x1d,0xd3,0x9f,0x64,0x7,0xaf,0x99,0x2d,0xbb,0x72, + 0xb6,0xef,0x3a,0x4b,0x26,0x6c,0x38,0xca,0xc0,0x1c,0x80,0x5d,0xec,0xb8,0xbb,0x49, + 0xc3,0x5e,0x6b,0xd4,0x72,0x31,0x33,0xbc,0x2e,0x63,0xae,0xe3,0xf4,0x3d,0xee,0x66, + 0xa1,0xf7,0xd8,0xf4,0x3a,0x96,0xa,0xf3,0x21,0xbc,0xed,0x90,0x9f,0xa0,0xf6,0xc3, + 0x13,0x55,0xaa,0xde,0x7e,0xb1,0x1b,0x0,0x1c,0x20,0x3,0xef,0x5,0x9b,0x57,0xe6, + 0xf6,0x5,0xc5,0x1d,0x15,0x5a,0xcd,0x76,0xb3,0x48,0x5c,0xe9,0x8a,0xed,0xd2,0x5, + 0x68,0x97,0x57,0xd1,0x89,0x3f,0xcd,0x36,0x56,0xcf,0xd5,0xa4,0xce,0x86,0x5f,0x4d, + 0x7,0x58,0x35,0xe6,0x1e,0x30,0x68,0x2,0xe6,0xe6,0x79,0xe6,0x4,0xb9,0xbc,0xe6, + 0xcd,0x90,0x49,0x65,0x31,0x43,0xdd,0xd1,0x61,0x78,0x48,0x81,0x55,0x6e,0xdd,0xdb, + 0x61,0x28,0xa9,0x2e,0xa6,0xab,0xfa,0xf3,0xdd,0x17,0xac,0x9c,0x21,0x6a,0x18,0xe, + 0xd5,0xe9,0xb2,0xdc,0xcd,0xf,0x22,0xdf,0x9a,0x76,0xcb,0x29,0x66,0xf0,0xd9,0x46, + 0x64,0xde,0x4d,0xe9,0x31,0xc1,0x99,0xd6,0xb8,0x44,0xe,0x20,0x51,0xce,0x40,0xfb, + 0x22,0xc3,0x28,0xd6,0xeb,0xbe,0xc2,0xd,0xcf,0x4,0xbc,0x15,0x99,0x7b,0x2f,0xf2, + 0xf9,0xe1,0x5a,0x2c,0x5,0x58,0x70,0x8e,0xbe,0x8d,0x15,0x95,0x50,0x3d,0xf,0xf0, + 0xce,0xec,0x5b,0x89,0xe4,0x5,0x66,0x35,0xc2,0xa5,0x8e,0xfe,0xde,0x13,0x58,0xd3, + 0x55,0xda,0x5e,0x75,0x31,0x7e,0xf2,0x3,0x64,0xf8,0x75,0x5f,0x86,0xdd,0x9a,0xce, + 0xa4,0x7,0x34,0x80,0x6b,0x77,0xa,0x5c,0x2f,0xed,0x7f,0x23,0x89,0x8c,0xce,0x72, + 0xeb,0x97,0xb1,0xb,0xcc,0x46,0x47,0xc9,0x89,0xe6,0x79,0xba,0x95,0xf6,0x38,0xaf, + 0x6c,0xe,0xe5,0x8c,0x1,0x5e,0xed,0xc3,0x77,0x32,0x2f,0xb6,0x55,0x80,0xab,0xd9, + 0xa,0x3b,0xaa,0x9f,0xa7,0x73,0x4a,0x67,0x12,0x9d,0xe8,0x6a,0x42,0x17,0xc1,0x93, + 0x6c,0x51,0x46,0x67,0xaa,0xd5,0x67,0xef,0x37,0x97,0xa6,0x21,0xfd,0x9,0xc3,0x5, + 0x3c,0x21,0xc7,0x73,0x22,0xf1,0x51,0xcb,0x37,0x23,0xce,0xe8,0xa9,0x21,0xf7,0x5a, + 0xe5,0xa7,0x48,0x8e,0x8f,0x6d,0x39,0xcd,0x8,0x63,0xbe,0x49,0x41,0x56,0xad,0xc0, + 0xc7,0x5f,0x66,0xae,0x60,0xbe,0xe1,0xa,0xd6,0x8c,0x1d,0x67,0x8,0xda,0x8,0xd9, + 0x44,0x19,0x87,0xd2,0xef,0x82,0x3d,0xa3,0x73,0x68,0xf6,0x84,0x5c,0xf,0x21,0x6a, + 0xfa,0x3b,0xfe,0x87,0xb9,0xa9,0x96,0xb0,0xd0,0xd,0x7e,0xb0,0xd4,0x2d,0x7f,0xf2, + 0x79,0xe0,0x1a,0x74,0xa0,0x75,0x49,0xe2,0x3a,0x55,0xcf,0x41,0x39,0x20,0x34,0xcf, + 0x68,0x18,0xd2,0x30,0xa0,0x43,0xbe,0x41,0xb,0x4b,0x29,0xe4,0xf2,0x1,0x5b,0xc9, + 0xe0,0x25,0x9f,0x30,0x2f,0x42,0x69,0x19,0x4f,0x65,0xcf,0x79,0xd6,0x9,0x23,0x7a, + 0xcc,0xed,0x24,0x52,0xf7,0x6e,0xd9,0x9c,0xca,0x5b,0x2c,0x59,0xbb,0xc4,0xf2,0xa2, + 0x5d,0xbd,0xe9,0x5c,0xbe,0xcc,0x22,0x44,0xa2,0x4b,0x85,0x17,0x1e,0xa1,0x50,0xd7, + 0x6d,0xff,0xf1,0x35,0x9f,0x4b,0x3b,0x18,0xe7,0x7d,0x28,0x52,0x6f,0xac,0x5,0xb4, + 0x94,0x29,0x82,0x8e,0xb4,0xab,0x4c,0xbe,0xdf,0xb4,0x90,0x21,0xaa,0x1e,0xd9,0x80, + 0x23,0x94,0xe9,0x1d,0xb7,0xb6,0x6b,0xb,0xb6,0x43,0xcb,0x29,0x2c,0x11,0xdd,0xc, + 0x70,0x65,0xe8,0xc9,0x1e,0x89,0x2c,0x34,0xa9,0x7b,0x35,0xde,0x9,0x88,0x3f,0x8b, + 0x55,0xd2,0xc9,0xcc,0x1d,0xcf,0x37,0x9c,0x7f,0x8a,0xbc,0x9c,0x8a,0x71,0x73,0xdd, + 0xec,0xa0,0xb0,0x4b,0xbd,0x82,0xe7,0xd5,0x4d,0xa9,0x40,0x81,0xd5,0x3c,0x9b,0xe8, + 0x62,0xe1,0xf3,0xc6,0x7d,0x36,0xa8,0xc8,0x31,0x29,0x4d,0x7,0x10,0x57,0x6b,0x86, + 0xf,0x11,0x26,0xd2,0xbd,0x59,0x87,0x99,0x87,0x29,0xe8,0x21,0x6e,0x65,0x14,0x88, + 0x8c,0xb1,0xae,0x2f,0x1b,0xb0,0x45,0x4d,0x59,0xfb,0x43,0xa9,0x1f,0x57,0x69,0xd7, + 0xbf,0x2c,0x24,0x5b,0x29,0x7e,0xae,0x9e,0x2c,0xae,0x3c,0xc9,0x2a,0xf2,0x42,0x6, + 0xac,0x28,0x48,0x70,0x28,0xcf,0xe1,0x77,0xc1,0xdb,0x8e,0x7c,0xb2,0xb2,0x18,0xf6, + 0x2b,0x8a,0x36,0x4a,0x5c,0x8b,0x35,0xff,0x4b,0xd9,0x28,0x9,0xb5,0xbb,0xda,0xd2, + 0x5,0xf2,0xb,0x3d,0x64,0xd4,0x4a,0x23,0x76,0x9b,0x2,0xb2,0x22,0x3b,0x5c,0xd, + 0xd0,0x72,0x81,0x1d,0x76,0x46,0xa2,0xbe,0x43,0x7e,0x1c,0x8b,0xb6,0x57,0xab,0x54, + 0xf2,0x4f,0xcf,0x44,0x53,0xc1,0x95,0xa1,0xe7,0x7b,0xf5,0x26,0xfd,0xe3,0x26,0x1b, + 0x9e,0xac,0x57,0xb2,0x9f,0xb7,0xa8,0x86,0x4f,0xba,0x37,0x32,0x3a,0x4b,0x55,0xf6, + 0x5c,0xe0,0x1b,0xae,0x8,0x3a,0x69,0xf3,0x31,0x52,0xb9,0xcd,0x3c,0x80,0xac,0x53, + 0x2c,0x3f,0x2a,0xe0,0xb,0x86,0xd4,0x97,0x7e,0xd6,0xf7,0x46,0x18,0x10,0x20,0x8e, + 0x8f,0x33,0xd7,0x92,0xd4,0x1,0x8b,0x3e,0xd4,0x40,0x16,0xaa,0xe,0x8b,0x6b,0x4f, + 0xf2,0xd8,0xf4,0x99,0x35,0x58,0xa8,0x8c,0x79,0x62,0x17,0xb9,0x51,0x5c,0x51,0xd6, + 0xc6,0x15,0x79,0x91,0x9,0xd3,0x1e,0x35,0x0,0xec,0x3f,0x79,0xa2,0x23,0x41,0xb9, + 0x98,0x21,0x69,0x5d,0xbe,0x88,0xbc,0x4c,0x0,0x2b,0x79,0xf7,0x59,0xbe,0xa6,0xb, + 0x8b,0x48,0xec,0x3c,0xa3,0xf1,0x2e,0x8a,0xd2,0x1e,0xa1,0xcc,0x88,0x16,0xb2,0xfa, + 0x6,0x1b,0xb2,0xd2,0xe8,0xbd,0x25,0xa,0xb2,0xea,0x6e,0x3d,0x9e,0xcd,0x3f,0x95, + 0x1d,0xae,0x61,0x4c,0xf5,0x71,0x31,0x53,0x99,0xe7,0xc8,0xa,0xe0,0xca,0xd0,0x33, + 0x14,0xec,0xf5,0x88,0x4d,0xd5,0x9f,0x59,0xda,0x5a,0xf4,0xc1,0x5e,0x1e,0x81,0x30, + 0xd4,0xa5,0xfd,0x36,0xf3,0xd,0x57,0xc,0x45,0xee,0x5,0xc2,0x0,0x74,0xc,0xbf, + 0x2c,0x76,0x3e,0x1c,0x2a,0x57,0xec,0xd2,0x46,0x3a,0x87,0x6a,0xe5,0xf8,0x79,0xee, + 0xa4,0xb9,0x7,0x88,0x99,0x5c,0x64,0x5c,0xcb,0xb6,0xf6,0x9a,0xf9,0xaa,0x61,0x3, + 0xd7,0x5,0xc3,0xa3,0x62,0x54,0xb9,0xc6,0x8e,0xbd,0x8b,0x25,0x8a,0x97,0xe5,0xb1, + 0x1d,0xb7,0xee,0x67,0x52,0xab,0xe3,0x35,0x8,0x1b,0xaa,0x2c,0xff,0x38,0x18,0x85, + 0x4a,0xf4,0x72,0x67,0x13,0x5d,0x9f,0x60,0x8c,0x9b,0xf,0xde,0x46,0xa6,0x6c,0xfd, + 0x1f,0x5f,0xc7,0xfe,0x5e,0x28,0x16,0x7f,0x68,0x90,0x8a,0x8f,0x15,0xca,0x94,0xc4, + 0xc8,0x97,0xd0,0x5,0xf8,0x35,0xeb,0x71,0x48,0x91,0x7f,0x89,0xb1,0xb8,0xcf,0x79, + 0xdd,0x30,0x2e,0x4b,0xf4,0x72,0xf8,0x24,0x10,0x87,0x36,0x72,0xa6,0xa9,0x47,0xba, + 0xf7,0xb1,0x14,0xb8,0x32,0xf4,0x8f,0x1e,0x49,0xa4,0x69,0xf4,0x74,0x3d,0x87,0x42, + 0x1a,0x5f,0x34,0x7a,0x86,0x8c,0x4,0xfc,0x1c,0x4a,0xf8,0xf9,0x86,0x2b,0x9e,0xa2, + 0x7a,0xaf,0x18,0xc4,0xb4,0x9e,0x9c,0x14,0x56,0x99,0x48,0x7f,0xbe,0xd9,0xa0,0x9b, + 0x49,0xda,0xf6,0x53,0x7c,0x4c,0xb9,0x9a,0xae,0x2d,0x86,0x6c,0xc7,0xcd,0xfe,0x3f, + 0xc1,0x99,0xe9,0xc,0x20,0xe5,0x63,0x10,0x92,0xab,0x51,0xf6,0xdf,0x6f,0xc1,0x7b, + 0x7c,0x5c,0xbd,0xc2,0x86,0xa8,0x92,0xd4,0x23,0xf,0x9b,0x2,0x3,0xb0,0x72,0x3f, + 0x78,0xd0,0x31,0xc6,0xa0,0x9a,0xe1,0xe3,0x5b,0x34,0x5,0xe8,0x67,0xd5,0xab,0x56, + 0xaa,0xf8,0x2c,0xb9,0x70,0x61,0x46,0x53,0xba,0x0,0x8f,0xd1,0x8d,0xca,0xb8,0xa9, + 0x4a,0x2,0x60,0x55,0x48,0xde,0x94,0x9d,0xf0,0x16,0x9b,0x55,0xcd,0xe6,0x90,0x7f, + 0x1,0x79,0xe8,0x4b,0x9d,0x7,0x5a,0x12,0x5c,0x19,0xfa,0x7e,0xd7,0xfe,0xa4,0x9c, + 0x43,0x52,0xe9,0xb3,0x1e,0x67,0x9,0xd2,0xfe,0x87,0xa5,0x16,0xe3,0x7d,0xc7,0xaf, + 0x3f,0xc2,0x37,0x5c,0x0,0x7a,0xf9,0xc0,0x9b,0xb4,0x4a,0x2c,0x78,0x5f,0xfd,0x95, + 0xe6,0xe9,0x97,0xd3,0x9f,0xf9,0x1a,0x9,0xf3,0xa8,0x40,0x9a,0xc1,0xbd,0x56,0x5c, + 0x2d,0xa2,0xa8,0x30,0x63,0xd5,0x70,0xc5,0xd,0x9d,0xd8,0xe5,0x14,0x54,0xd1,0x55, + 0x4f,0x58,0xe4,0x86,0x97,0x97,0x8f,0x69,0x5e,0x6a,0x0,0x24,0x9e,0xeb,0x97,0xf9, + 0x59,0x1,0xe4,0xce,0x5e,0x44,0x1,0xc,0x1f,0xe3,0xe2,0x29,0x42,0xd6,0x74,0x1c, + 0xdf,0x15,0xca,0xac,0x20,0x81,0x98,0x2e,0x22,0x5b,0xdc,0x6c,0xb5,0x1e,0xbd,0xdd, + 0x87,0x3c,0x3c,0x48,0xc1,0x9c,0xe0,0x90,0xde,0xd5,0x8d,0xc4,0x2a,0x6c,0x80,0x79, + 0x6d,0xc6,0x58,0x1a,0x5c,0x19,0x7a,0x4d,0xbb,0xd1,0x86,0xbb,0xf3,0xe,0xff,0x37, + 0xa9,0xfc,0x1a,0xf2,0x88,0xf8,0xe1,0x1e,0x78,0xa8,0x10,0x40,0x89,0x6e,0xd6,0x1b, + 0xfd,0x5b,0xd7,0xd3,0xeb,0xdb,0x44,0xd7,0x77,0x11,0xce,0x4c,0x15,0x44,0x7a,0x7c, + 0xc,0xb9,0x5a,0x4d,0xe3,0x26,0xdc,0xab,0x51,0xd,0x14,0xe5,0xc2,0xa6,0x5d,0xda, + 0xc6,0xc3,0x2b,0x80,0x50,0x18,0xa7,0x2,0xc8,0x5f,0x51,0xd1,0xd7,0xb0,0x37,0x12, + 0xac,0xe5,0xf3,0x82,0x33,0xa3,0x75,0x71,0xc6,0xb8,0x5e,0x8f,0x95,0x2a,0x4f,0x62, + 0x2f,0x66,0xe,0xed,0xa6,0x63,0x6,0xc0,0x5d,0x21,0x94,0x69,0x41,0xb8,0xe,0xf9, + 0x58,0x29,0x77,0x84,0x14,0x60,0x55,0x99,0xf2,0x90,0x1,0x50,0xd2,0xd0,0xa6,0xc1, + 0xe6,0x90,0xcf,0x5d,0xe2,0x4c,0x53,0xad,0x92,0xd4,0x5e,0x98,0x9e,0xeb,0xd9,0x9b, + 0xd1,0x47,0xb0,0x5e,0x88,0x68,0x7d,0x50,0x68,0x62,0x24,0xc8,0xe7,0x94,0xb,0xe0, + 0xc2,0xe1,0x1b,0x2e,0x8,0x5e,0xac,0x1,0x5b,0x9,0x4b,0x78,0x2f,0xac,0x85,0x6, + 0xfd,0x7f,0x84,0x5,0x91,0x5c,0x89,0xd2,0x69,0x3e,0x76,0x5c,0xad,0xa8,0xa3,0x56, + 0xe9,0xfc,0x40,0xe8,0xed,0xe7,0x37,0xef,0x52,0x46,0x12,0x40,0x59,0xed,0x2e,0xd7, + 0xba,0xf9,0xc1,0x5f,0xb8,0x4e,0xa1,0x97,0x7a,0x70,0x53,0x51,0x3b,0xfc,0x46,0x11, + 0x3c,0x57,0xc9,0x18,0xe3,0x5a,0x9d,0x96,0xba,0x79,0x4a,0x41,0xf1,0x15,0xcc,0xf4, + 0x7a,0x98,0xb6,0x7b,0xd9,0x6,0x58,0x8c,0xdc,0x53,0x3e,0x4,0xef,0x52,0xed,0xd5, + 0xdf,0x87,0x4,0x5c,0xd5,0xdb,0xfe,0xf,0xb1,0xb5,0xbc,0x42,0xa5,0xbf,0xe3,0x67, + 0x56,0x91,0x81,0x84,0x71,0x3a,0xf8,0xb7,0x77,0x1c,0x16,0x16,0xe0,0xca,0xd0,0x87, + 0x3a,0xe,0x36,0x12,0xde,0x1f,0xf4,0x3,0xb8,0xe,0xc6,0xf7,0xa2,0x4d,0x4,0xdf, + 0x70,0x81,0x2b,0xf2,0x4c,0x74,0xc2,0xba,0x94,0x42,0xc6,0xfd,0x56,0x56,0x91,0x3a, + 0xeb,0x35,0x3e,0x6e,0x5c,0x2d,0x4d,0xdd,0x50,0x3e,0x76,0x96,0xdb,0x2f,0x5b,0xe2, + 0x49,0xb6,0x56,0x4e,0xa1,0x4d,0x13,0xf7,0x5c,0xf9,0xaf,0x48,0xf,0xd0,0x6d,0xf6, + 0x90,0x42,0xc7,0xb8,0x85,0x7c,0x19,0x8a,0x92,0xaa,0xb4,0x9d,0xcf,0xc7,0x38,0xf0, + 0xb4,0xe,0xed,0x42,0x1c,0xe,0xbd,0x66,0x43,0x2e,0x60,0xc3,0xa5,0x8b,0xb0,0xe2, + 0xe0,0x9b,0x43,0x2,0xb0,0x2a,0x8f,0xbd,0xc3,0xf0,0x5e,0x65,0x81,0xb8,0xd3,0xe6, + 0x90,0x4e,0x47,0xc5,0x4c,0x57,0xdd,0xbd,0x7a,0x87,0x15,0xc0,0x52,0xa9,0xb6,0x6d, + 0x39,0x45,0x6b,0x81,0x81,0x66,0xa9,0x5,0xd3,0x33,0x6c,0x5,0xd9,0x1f,0xbf,0x69, + 0x6,0x2f,0x79,0x95,0x95,0xfc,0x82,0xe9,0x3f,0xff,0x90,0xf7,0x30,0xac,0xb3,0x96, + 0x74,0xbd,0xf1,0x31,0xe3,0x6a,0x75,0x6d,0x92,0xbc,0x91,0xb0,0x86,0xc7,0x85,0x9, + 0xf3,0xca,0xba,0xe,0x21,0xd9,0x9a,0xe7,0x3,0x15,0x3d,0x54,0x58,0x35,0x61,0xc1, + 0x45,0x6a,0x3b,0xf6,0xfb,0x51,0xf1,0xfd,0x36,0xd2,0xa,0xe0,0x5d,0xe4,0x63,0x17, + 0xd8,0x98,0x6b,0xfd,0x25,0x95,0x47,0x38,0xb8,0xca,0x6,0x4,0x2f,0x0,0x10,0xd4, + 0xd9,0x70,0x34,0xa8,0xe0,0xaa,0x36,0xa8,0xf2,0x59,0xee,0x95,0xfc,0xa5,0xee,0xbd, + 0x9a,0x8d,0x43,0x70,0x6b,0xfb,0x11,0x61,0x5,0xae,0xc,0xbd,0xab,0xc3,0x50,0xc3, + 0xf5,0xb9,0xbc,0xa0,0xe1,0xb4,0x39,0x94,0x6f,0xd0,0x4,0x96,0x6f,0xb8,0xe0,0x69, + 0x83,0x9e,0xab,0x55,0xd6,0x0,0xd6,0x67,0xf8,0x24,0xad,0x3a,0x3a,0xd4,0x57,0x4f, + 0x58,0xec,0xe6,0x1c,0x35,0x5c,0xc3,0x41,0xd1,0xec,0x57,0x40,0x35,0x61,0x61,0x4d, + 0x8c,0x75,0xaf,0x6c,0xdf,0x79,0x6f,0xf3,0x71,0x2b,0x86,0xa2,0x8a,0x9b,0xd9,0xec, + 0x28,0x57,0xab,0x2,0x42,0x83,0x2e,0x56,0xf1,0x9d,0xc9,0x2b,0xbe,0x3,0x26,0x8a, + 0xbe,0xee,0x2b,0xa3,0x5b,0x8b,0x8b,0x3,0xab,0xec,0xdb,0x7f,0x7f,0xd6,0x3,0x70, + 0xec,0x5d,0x41,0x3,0x57,0xf5,0x77,0xfd,0x4b,0x22,0xdb,0x2f,0xd6,0x28,0xe,0x40, + 0xc9,0xa0,0x19,0x8b,0xf7,0x2a,0x88,0x92,0x7a,0xc2,0x62,0x9c,0x57,0xfe,0xea,0xbf, + 0x3d,0x13,0x49,0x2d,0x67,0x3a,0x2a,0xa,0x7f,0xca,0x97,0x67,0xa5,0x85,0x7c,0x19, + 0xde,0xb9,0xdd,0xd4,0x87,0xf9,0x86,0xb,0x45,0xd9,0xaf,0xaf,0x3c,0x2c,0x24,0x53, + 0xd2,0x31,0xc7,0xe6,0xe6,0x63,0xc5,0x35,0x1c,0x14,0xed,0xb3,0x98,0x6d,0x6c,0x21, + 0xd7,0x2c,0x80,0xeb,0x6a,0x38,0xbe,0x7,0x60,0x8c,0x8f,0x59,0xf1,0x74,0xda,0xcd, + 0x27,0x60,0x37,0x30,0xd6,0x2b,0x7d,0x8e,0x31,0xa2,0x2a,0x4e,0xe5,0xaf,0xba,0xdd, + 0xae,0x73,0x67,0xf2,0xae,0xe,0x1,0x6b,0xbb,0x69,0x8f,0xe8,0x4e,0x88,0xcc,0x16, + 0x1c,0x58,0xe5,0x44,0xf1,0xdf,0xd9,0x5a,0xcd,0x52,0xeb,0xdf,0xf6,0x5f,0xe0,0x0, + 0xeb,0x76,0x95,0x54,0x1c,0xbe,0xd3,0xe0,0x30,0xda,0xa6,0x27,0x69,0x36,0xc7,0xbf, + 0x87,0xc4,0x4d,0xa,0x4b,0x70,0x65,0xe8,0xc4,0xd6,0xe3,0x8d,0x7c,0xa0,0x76,0xf9, + 0x54,0xa1,0x48,0xf8,0x7f,0x34,0x57,0xe5,0x1b,0x2e,0x88,0x24,0x8d,0xb3,0x5e,0xf3, + 0x3d,0xee,0xcd,0xb2,0x1a,0xd9,0x1c,0xae,0x7f,0x9b,0xd,0xde,0xc6,0x3d,0x86,0x5c, + 0xc3,0xef,0x20,0xca,0xf,0x60,0xd1,0xaf,0xdb,0x9c,0xae,0xdf,0x34,0xaf,0xec,0x39, + 0x3e,0x66,0x81,0x78,0xbf,0x7b,0xad,0x76,0x23,0xcc,0x9a,0x8f,0x73,0x61,0x19,0xe6, + 0x61,0xe4,0xf5,0xdf,0xf0,0xb1,0xa,0x82,0x22,0x72,0x83,0x2a,0x6e,0x13,0x10,0xcc, + 0xf2,0x8,0x7a,0x38,0x44,0x9,0xa2,0x3c,0x82,0x75,0x57,0x77,0xc8,0xb7,0xb,0xe, + 0xe9,0x69,0xfa,0xe7,0x47,0xf4,0x6b,0x3f,0x52,0xfd,0x8b,0xea,0xdf,0x7a,0x79,0x23, + 0x28,0xe6,0x4f,0xe8,0x5f,0xfb,0x91,0x7e,0xff,0xdb,0x5a,0x4b,0x19,0x69,0x3b,0x5, + 0x2c,0x57,0xa,0x51,0xca,0x0,0x1d,0x21,0xda,0x82,0x7,0xb0,0xe4,0x1b,0xf0,0xbb, + 0x6b,0x2d,0xfd,0x2c,0xf0,0xaa,0x41,0xc3,0x78,0x38,0xe4,0x8f,0x3d,0x2c,0xdc,0xe0, + 0x24,0xa1,0x5f,0xdb,0xdd,0x61,0x58,0x58,0x3,0xac,0xfb,0x3a,0xd,0x35,0xde,0x6d, + 0xa9,0x6f,0x80,0x25,0x3f,0x10,0x19,0x93,0xa5,0x5a,0xb6,0xf9,0x27,0x5,0xbf,0x29, + 0x6b,0x7f,0x24,0x20,0xcf,0x43,0x8b,0x9,0x78,0x86,0xa0,0xf8,0x7b,0x9f,0x79,0x6f, + 0x59,0x96,0xb7,0x6b,0xd0,0x92,0x8f,0x7d,0x27,0xac,0xb2,0x6e,0x0,0xa,0x99,0xb0, + 0xfe,0x57,0x6e,0xe0,0xb8,0x86,0xf,0xc0,0x9a,0xfa,0x70,0xc1,0x0,0xcb,0x21,0xef, + 0xc4,0xba,0xb6,0x72,0xfb,0x1b,0xb4,0xa9,0x1,0x30,0xe9,0x71,0xc5,0xcb,0xac,0xb1, + 0x2f,0x9a,0xb5,0xb7,0x1a,0x7f,0xf,0x7b,0x37,0x34,0x50,0x47,0x7b,0x20,0x2b,0xe4, + 0xa1,0xea,0x63,0xad,0x82,0xc2,0x25,0xc7,0x18,0xb7,0x4e,0xad,0x4a,0x41,0xec,0x5f, + 0x4d,0xfa,0x6e,0xe2,0x97,0xb3,0x20,0x68,0xda,0x2d,0xa7,0x34,0x6f,0xa1,0xe1,0x54, + 0x9,0xa9,0x20,0x83,0xde,0xa1,0xf4,0xd4,0xc3,0x17,0x6f,0x51,0x3d,0xad,0x1f,0xcc, + 0x79,0x35,0x6e,0x3a,0x11,0xda,0xa7,0x12,0xa1,0xdb,0x78,0x22,0x74,0x1f,0xaf,0xfd, + 0x9,0xed,0x30,0x99,0x8,0xad,0xd2,0x48,0xbe,0x3f,0x7,0xf2,0x4b,0x0,0x2f,0xbb, + 0xb2,0x50,0xb0,0x67,0x74,0x2e,0x34,0x9e,0x5f,0x30,0xf9,0x68,0x67,0x16,0x26,0x4c, + 0xb9,0x33,0x20,0x70,0x55,0x2d,0xf3,0x79,0xc3,0x73,0xf5,0xb,0xb,0x97,0x65,0xe7, + 0x79,0x3d,0x88,0xaf,0x1f,0xea,0x96,0x1c,0xd6,0x0,0xeb,0x68,0x8f,0x3e,0xc6,0x41, + 0xff,0x42,0xde,0x41,0x4c,0x89,0xb4,0x39,0x94,0x13,0xa0,0x15,0xb0,0xda,0xe2,0x4f, + 0xdf,0x71,0x9a,0xa0,0x8f,0x56,0x95,0x36,0x57,0xb9,0xb,0x58,0x4f,0x4c,0x6b,0x74, + 0x5c,0xe2,0xee,0x22,0x3f,0x6b,0xa9,0xe,0xf1,0x63,0xd6,0xfc,0x60,0x10,0xd5,0xa6, + 0x67,0xd3,0x61,0xa4,0x54,0xd0,0xdb,0x11,0x71,0x3,0xc9,0x35,0xc,0x43,0xde,0x74, + 0x3d,0xfb,0xba,0x24,0x3b,0xa4,0x36,0x0,0x4,0xe2,0xc8,0x3d,0x96,0x2c,0x38,0x41, + 0x19,0x7e,0xfd,0x1e,0x2b,0xdd,0x5a,0xe1,0x49,0xc1,0xb6,0x4,0xda,0xa4,0xef,0x46, + 0x75,0xc8,0xd2,0x4f,0x4d,0x23,0xfc,0x5,0x65,0x8b,0xcf,0xcb,0x99,0x5d,0x4a,0xc5, + 0xd7,0x87,0x2d,0x3f,0xc4,0xd7,0x64,0x10,0x14,0x55,0xf3,0x7a,0x41,0xdb,0xb0,0xd0, + 0x80,0x2a,0xf0,0x1f,0xd9,0xa5,0x49,0x82,0x28,0x3d,0x46,0x27,0x33,0x27,0xa0,0xea, + 0x48,0xc1,0xd2,0x98,0x41,0x44,0xb8,0xb2,0x13,0x11,0x36,0x8b,0x44,0xb8,0xb7,0x21, + 0x11,0x9e,0xab,0x46,0x84,0x77,0x22,0x89,0xf0,0xa1,0x50,0xb0,0xbe,0x55,0x8e,0x8, + 0xcf,0xd4,0xa0,0x3f,0xd3,0x88,0x8,0x1b,0x9c,0xda,0x67,0x8c,0x1b,0x40,0x84,0x76, + 0x53,0x72,0x2f,0xf0,0xdf,0xe9,0x1,0xb4,0xb,0xad,0x14,0x58,0x23,0xe5,0x22,0x3d, + 0x3b,0x92,0xd0,0x95,0x73,0xe5,0xba,0x5c,0x5b,0x6c,0x70,0x55,0x95,0x1e,0xe0,0x3a, + 0xb8,0x3a,0x29,0x44,0xcb,0x71,0xb9,0x6e,0x64,0xbf,0xd4,0x16,0xd3,0x55,0x35,0x8c, + 0xc1,0x95,0xa1,0x8d,0x9d,0x69,0xc4,0x66,0x97,0xff,0xf2,0x71,0xeb,0xec,0x84,0xf7, + 0x67,0xec,0xe1,0x16,0x2a,0x9,0xef,0x9e,0xf5,0x92,0x5e,0xd9,0xc1,0xd6,0xc8,0x1b, + 0x54,0xe7,0xb,0x51,0x52,0x57,0xa1,0x79,0x46,0x43,0x2f,0x4f,0x50,0x3d,0xc1,0xe9, + 0xea,0x6,0xcf,0x1c,0x35,0x9c,0x5f,0xe0,0x7b,0x6b,0x76,0xbc,0xc6,0x3d,0x79,0xf3, + 0xef,0x96,0x21,0x1c,0xd5,0x43,0x84,0x99,0x5e,0xe3,0x3d,0x11,0x5f,0x1b,0x78,0xf5, + 0x47,0xdc,0xc0,0x71,0xd,0x2b,0xb5,0xf,0xdf,0x89,0xca,0xd8,0x93,0xf9,0xb4,0xc2, + 0x79,0x5,0x8d,0x85,0xad,0xd4,0xfb,0xe,0xd,0xeb,0xe1,0x9,0x32,0xec,0x8,0xab, + 0x80,0x44,0xb5,0x34,0xce,0x3b,0x70,0x3,0x3a,0xd3,0x1a,0xb,0x4d,0xe7,0x56,0x66, + 0xe7,0xce,0x65,0x99,0xb5,0x85,0x16,0x8a,0x83,0x1d,0xb4,0xa2,0xbc,0xc9,0xe6,0x74, + 0xc1,0x11,0x40,0x1a,0x27,0xad,0x57,0x91,0x13,0x55,0xd2,0xcf,0xe,0xef,0xb6,0x9e, + 0x78,0x3d,0x33,0x47,0x31,0x92,0x28,0xbf,0x58,0x2d,0x61,0xe1,0x45,0x4e,0x6,0x1d, + 0x1c,0x5,0xef,0x23,0x2b,0xdc,0x70,0xa6,0x55,0xf,0x2e,0xb0,0x42,0x5f,0x29,0xb8, + 0x74,0x45,0x2f,0x50,0xd5,0x3e,0x55,0x15,0xa6,0x27,0x69,0x60,0xea,0xe5,0x2a,0x85, + 0x83,0xa8,0xe2,0xea,0x53,0x35,0x89,0xb0,0x91,0x82,0xae,0xd4,0xbe,0x44,0x68,0x35, + 0xdd,0xb,0x70,0x49,0xbf,0x32,0xef,0x99,0xb7,0x17,0xa9,0xf0,0x30,0xe1,0x5b,0xa8, + 0xfa,0x43,0x82,0x7a,0x91,0x12,0xda,0xf7,0x9c,0x27,0x95,0x46,0xdd,0x66,0x80,0xab, + 0xdf,0xd9,0xd,0x2c,0x57,0x3e,0x1,0xfe,0xaf,0x5b,0x6c,0x6a,0xd8,0x83,0x2b,0xe8, + 0xa0,0x56,0x13,0xd,0xf7,0xfe,0x65,0xb9,0xf2,0xd8,0x10,0xfa,0x25,0x13,0x36,0xfc, + 0x6a,0x99,0xdb,0x66,0xd3,0xe4,0xcd,0x7a,0xa1,0x81,0x42,0xe7,0xd6,0xd5,0xd1,0xcf, + 0x95,0x60,0xa3,0xf3,0x38,0x85,0x1e,0x0,0x67,0xab,0xb6,0x5b,0xe0,0x86,0xeb,0xd7, + 0x32,0x0,0xb,0xe0,0x30,0x7b,0xbd,0x3e,0x4,0x83,0x6f,0xd9,0x70,0x2c,0x57,0xae, + 0xf9,0x68,0xfd,0x1e,0x2b,0x55,0xa,0x3e,0x3e,0xf1,0x45,0x76,0x89,0x75,0x8e,0x90, + 0xbd,0x65,0x98,0xb9,0x37,0x1f,0x63,0x97,0x2d,0xdd,0x83,0xfc,0x32,0xe3,0xf9,0x2b, + 0x4a,0xb4,0x4,0x69,0x22,0x76,0x65,0x21,0x6b,0xf1,0xd3,0x7e,0xb1,0x1b,0xde,0xf4, + 0x12,0xd,0x65,0xee,0x3e,0x6b,0x78,0x56,0x36,0x7a,0x9e,0x9,0x3d,0x79,0x1d,0xb2, + 0x9a,0x30,0xf5,0x51,0xbe,0x1e,0x83,0x94,0x7a,0xa2,0x47,0x47,0xf6,0x7,0x1b,0x58, + 0x3d,0xc4,0x18,0xbe,0x31,0x81,0x1d,0x26,0xab,0xc2,0xdc,0xce,0x44,0x78,0xa8,0x1e, + 0x11,0x3e,0x10,0x42,0x7,0xaa,0xf2,0x53,0x78,0xc3,0x6e,0xbd,0x8c,0x8,0x53,0x28, + 0xd8,0x8a,0xce,0x30,0xc0,0xd6,0x7f,0x54,0x6f,0x61,0xb,0xaa,0x70,0xba,0x86,0xed, + 0xf8,0x99,0xda,0xd7,0x7f,0xe3,0x37,0xb8,0xaa,0xb3,0xfe,0x8,0x29,0xd7,0x6d,0x85, + 0x71,0xf8,0x7d,0x3,0x52,0x3c,0x1f,0x37,0xb2,0x78,0xfc,0xff,0xe4,0xf8,0xf1,0xa5, + 0x2,0x60,0xc9,0xf1,0x63,0x8d,0x70,0x55,0x97,0x5c,0x0,0xf5,0xd,0x10,0xd5,0x59, + 0x22,0x1e,0xbe,0xfd,0x14,0xa9,0xd7,0x6d,0x85,0xde,0x5d,0x5e,0x5a,0x56,0x64,0x8f, + 0xa6,0x96,0xb0,0x3f,0x90,0xce,0x9d,0x3b,0x6e,0xc2,0x3e,0xeb,0x0,0x2c,0xe4,0x20, + 0x32,0xf7,0xfe,0xcc,0x8a,0x68,0x78,0xb,0x4f,0x40,0xb8,0x19,0xa3,0xcc,0xbd,0x17, + 0x9,0x3c,0x83,0x63,0xd7,0xfe,0xc8,0xc2,0x13,0xf0,0xc0,0xc1,0xbd,0xde,0x7b,0xce, + 0xeb,0xa4,0x8b,0xf2,0x1c,0xd7,0x62,0x2a,0x42,0x57,0x7d,0xae,0x7c,0x93,0x8d,0x6b, + 0x96,0x95,0x2b,0xc2,0xe8,0x61,0xa4,0x79,0x82,0xa4,0x7b,0x7d,0x54,0xe,0xbe,0x8c, + 0xff,0x2b,0x69,0x10,0x52,0xd0,0xbe,0xab,0x18,0x37,0x7,0xe1,0xc0,0xb3,0x2c,0xa4, + 0x16,0x88,0xb0,0xfc,0x63,0x59,0x75,0x8c,0xd8,0x5d,0xe2,0xef,0x51,0xa1,0xd5,0xec, + 0x9c,0xc4,0xae,0xf4,0x2,0x9,0x7b,0x32,0x6a,0xe5,0xb7,0x61,0x67,0x3f,0xe0,0x4d, + 0xc4,0x25,0x1e,0x55,0xd3,0x83,0x97,0x7c,0xc2,0x88,0x98,0x61,0x3b,0xf2,0x53,0x50, + 0x7c,0xf4,0x5f,0xf8,0x41,0x48,0xb5,0xbd,0x27,0x7a,0x25,0x5f,0x1d,0x38,0xb0,0x42, + 0xa9,0x38,0x7a,0xa3,0x69,0xe0,0x85,0x8,0x49,0x63,0x88,0x70,0xa3,0x83,0x8,0xef, + 0x45,0x94,0x3c,0xa8,0xca,0x4f,0x5f,0xa9,0x4c,0x84,0xe5,0xf1,0x1a,0xe8,0xd3,0xda, + 0x32,0x9c,0xd6,0x5e,0xbe,0x80,0x83,0x56,0xaf,0xa8,0xa8,0xb9,0xf0,0xfd,0xc2,0xbd, + 0x56,0xbb,0xcf,0x91,0xaa,0x69,0x8f,0x13,0xa,0x32,0x55,0xf,0xc3,0xb9,0x7d,0x66, + 0x8d,0x82,0x48,0x20,0x17,0xb6,0x1d,0x5d,0x2a,0x0,0xd6,0x72,0x4f,0x6f,0x42,0x65, + 0x4c,0xf6,0x3b,0xd2,0x77,0x17,0x95,0xff,0xac,0x50,0x52,0xd,0x8f,0xce,0x25,0x49, + 0xeb,0x55,0xd,0x5c,0x79,0xe5,0x2c,0x15,0x8f,0xc2,0xe3,0xe,0x10,0xf0,0x99,0x6d, + 0xf0,0xc7,0xac,0xfe,0x3e,0xbb,0xdd,0x92,0x76,0xd3,0x47,0x7e,0x23,0x49,0x9c,0x73, + 0xc0,0xf2,0xc4,0x7b,0x23,0x56,0x7c,0x4d,0x3a,0x49,0x4f,0x33,0x86,0x63,0x34,0x41, + 0xb5,0x39,0xfd,0xcb,0x5d,0xe1,0x5a,0x7c,0xad,0xd8,0x7a,0xce,0xc5,0x8e,0xe9,0x4f, + 0x12,0x69,0x97,0xf5,0x78,0xd1,0xa6,0x6c,0x39,0xee,0xbb,0x50,0x46,0x94,0x3a,0xe0, + 0xeb,0xf1,0x93,0x1f,0xb0,0xc4,0x73,0x22,0x41,0x1d,0xec,0xf1,0x8c,0x95,0xdb,0x7f, + 0xef,0x77,0x61,0x51,0x92,0x7b,0x34,0x12,0xe6,0x93,0x25,0xce,0xa3,0xc7,0x22,0x34, + 0xd9,0x9e,0xc2,0xbb,0xd1,0x4a,0x7,0x97,0x1d,0x4b,0xd3,0x4c,0x6c,0x3b,0xc1,0x2e, + 0x5f,0xc8,0xd9,0x6b,0x94,0xb8,0x96,0xa0,0xbf,0xad,0xa5,0xf7,0x5e,0x54,0x46,0x42, + 0x80,0x5e,0x2b,0xa5,0xbd,0xe6,0xa9,0xd1,0x3d,0x56,0xc8,0x89,0x7a,0xdf,0x66,0x1d, + 0x60,0x95,0x5b,0xdf,0x2c,0x4f,0x84,0x6b,0xda,0x66,0x87,0xf,0x45,0xf9,0x15,0x94, + 0xb6,0xe7,0xc3,0xbb,0x92,0x8e,0xef,0xa9,0x96,0xf5,0x52,0x81,0xe1,0xc0,0xea,0x33, + 0x5f,0x25,0x11,0x6d,0xae,0xd2,0x3f,0x4f,0x39,0xce,0xe2,0xf0,0x5,0x6f,0x2a,0x96, + 0x2b,0xb3,0xa6,0xdd,0xc8,0x52,0x1,0xb0,0xf0,0x1e,0xfa,0x61,0x3f,0x29,0x37,0x67, + 0xd,0x6e,0x13,0x66,0x6f,0x4a,0x54,0xf3,0xe8,0xf9,0x4a,0x8b,0x82,0x40,0x42,0x3b, + 0x9a,0xd1,0x6b,0x2c,0xfd,0xcc,0xd4,0x77,0x1a,0xba,0xec,0x73,0x23,0x8f,0x62,0x94, + 0xfe,0x5c,0x8c,0xb4,0x76,0xec,0xd,0x3f,0x5b,0xd2,0x30,0xe2,0x70,0x2,0xd7,0x91, + 0x76,0x73,0xd6,0x8c,0xf,0xa,0x20,0x34,0x52,0x5f,0x79,0x7,0x2b,0x4c,0x11,0x15, + 0x99,0xae,0xa1,0xb1,0x2c,0x67,0x12,0xcd,0xd7,0x61,0x9c,0x90,0xbb,0x82,0xa,0x61, + 0xae,0x45,0x57,0xe4,0x7d,0xc2,0xab,0xec,0x90,0x15,0x6a,0xa7,0x9f,0x63,0xb6,0x2c, + 0x61,0xa1,0x65,0xf2,0x8,0xd,0x1d,0xb2,0xec,0x33,0xdf,0xad,0x9f,0x1c,0xf2,0xc3, + 0xb8,0xcc,0x58,0xa5,0x55,0x4b,0xb3,0x41,0x37,0x6b,0xdc,0x73,0xa2,0xd2,0x27,0x88, + 0xa4,0xd6,0xcc,0x9e,0x60,0x3f,0x97,0xe4,0xbb,0xd4,0xed,0x7a,0x9d,0x96,0x7f,0xea, + 0xc9,0xbf,0x52,0x7e,0x68,0x9a,0xbc,0xc9,0xd2,0x84,0x9d,0x97,0xf6,0xbf,0x51,0xd5, + 0x39,0xbc,0x8c,0x79,0xf8,0x8a,0xfe,0xfd,0x29,0xba,0x6e,0x6e,0x62,0x9e,0x7c,0x87, + 0x32,0x81,0x25,0xee,0xdb,0x5d,0xbd,0x99,0xed,0xc8,0x4f,0xf1,0xff,0xa2,0xd4,0xb7, + 0x44,0x34,0x90,0x42,0x3b,0xf6,0x32,0xe,0xf9,0xc,0x7b,0xe1,0xb4,0x44,0x22,0xec, + 0xaf,0x68,0x5d,0x60,0x95,0x5b,0x91,0x7,0x36,0x62,0x88,0xe1,0xc6,0xfb,0x53,0x10, + 0x33,0x7a,0xe4,0x7,0x84,0xaa,0xc9,0xcf,0xe6,0xe1,0xb5,0x42,0xaf,0xc2,0xca,0x13, + 0xef,0x23,0x11,0xad,0xe7,0x1a,0xc0,0xea,0x1c,0x9d,0xe8,0xd,0x20,0x6a,0xf3,0xe3, + 0xd6,0x32,0xd1,0x38,0x64,0x12,0x62,0xa7,0x92,0x1e,0xb1,0xa9,0x64,0x6c,0xeb,0x9, + 0x64,0x56,0x9b,0x14,0x72,0x4b,0xfb,0xe1,0xe4,0x9d,0x2e,0xfd,0x19,0x89,0x67,0xb8, + 0x0,0x2c,0x30,0xd1,0xfb,0x48,0xb8,0xbe,0x85,0x6e,0x5a,0x92,0xbe,0xfd,0x1f,0x53, + 0x37,0x26,0x5c,0xde,0x36,0x11,0x9e,0x2b,0xf9,0xbe,0xe0,0x90,0xd0,0xba,0xda,0x5a, + 0xa1,0xbf,0x1f,0x3c,0x55,0x5a,0x2e,0x99,0xab,0x9b,0x3e,0xde,0xb7,0x45,0x38,0x5d, + 0x96,0xa4,0xc3,0x18,0xbd,0xea,0x3b,0x52,0xa9,0xf5,0x95,0x3a,0xb0,0x52,0x5e,0x65, + 0x7,0xbe,0x16,0x3a,0xf,0x1e,0xad,0xa,0x17,0x7f,0xbc,0x25,0x83,0xe9,0x9e,0x3c, + 0x87,0x50,0x79,0x96,0x85,0x12,0x99,0xbb,0x1a,0x95,0xd6,0xde,0x8d,0xe3,0x45,0x39, + 0x1a,0x1e,0x67,0xab,0x90,0x8a,0xe,0x58,0xfc,0xa1,0x61,0xe3,0x56,0x5,0x97,0xd4, + 0x5a,0xb3,0x27,0xbd,0x67,0xef,0x2f,0xd1,0xf7,0xa9,0xd3,0x75,0xf9,0x45,0xf,0xc0, + 0xd2,0x72,0x82,0xd5,0x36,0xa9,0xf,0x5a,0x32,0x7c,0xc,0xaa,0xb,0x0,0x2b,0x56, + 0x4,0x81,0x48,0x19,0x2e,0x60,0x41,0x4f,0x1c,0xb7,0x9a,0x88,0xd2,0x78,0xba,0x21, + 0x2e,0xa,0x4e,0x89,0x8,0x1b,0xa2,0xc3,0x7,0x58,0x79,0x2b,0x3c,0x6d,0xb,0xdb, + 0x3,0x60,0x41,0xff,0xf5,0x1c,0x56,0xb9,0x80,0x50,0xe5,0x89,0xfb,0x58,0x1e,0x56, + 0xb5,0x19,0x2f,0x91,0x4a,0x23,0xf7,0x90,0x88,0xf8,0x2b,0xb3,0x43,0x1a,0xa2,0xf2, + 0x27,0x4b,0x9e,0x8f,0x72,0x35,0x28,0x2,0x30,0x9d,0x56,0xa8,0x4b,0x5f,0x94,0xd4, + 0x81,0xad,0x26,0x91,0xed,0x14,0x70,0xfd,0xd1,0x23,0xc9,0xd2,0x0,0x6b,0x63,0xfb, + 0x91,0x79,0x28,0x3,0x40,0xae,0x56,0xbf,0xc7,0x2a,0xd5,0xec,0xcd,0x89,0xc3,0x4, + 0xd4,0x5,0xac,0x2a,0x30,0x18,0x2,0xaf,0x80,0x5,0x0,0x16,0x92,0x51,0xf5,0x96, + 0x17,0xd,0xf4,0xb5,0xba,0x1f,0x89,0xb7,0xd6,0x2b,0x63,0x3f,0x6b,0x84,0x55,0xfe, + 0x64,0x5e,0x29,0x2e,0x66,0x83,0xac,0xf9,0x56,0xf0,0xc0,0x7a,0x6b,0xf3,0xc1,0xdb, + 0xb4,0x66,0xb8,0xde,0xe9,0x1a,0x76,0x65,0x17,0x2e,0x46,0x13,0x37,0xfd,0x66,0x81, + 0x1c,0x41,0x37,0xa9,0xd5,0x69,0x29,0xd6,0xf0,0x51,0xad,0x32,0x30,0x88,0x2,0x8f, + 0x8a,0x9,0x0,0xab,0x46,0x87,0xc5,0x0,0x58,0x2f,0x69,0x51,0x28,0x56,0x2d,0xcd, + 0xf2,0xf5,0xac,0x66,0x3f,0x3c,0x8d,0xed,0x91,0xdb,0x1d,0x3d,0xa3,0x6e,0x19,0x69, + 0x25,0x93,0xd1,0x99,0x1e,0x58,0x17,0x84,0xd8,0x34,0x55,0xd8,0x7d,0x59,0x78,0x82, + 0x2b,0x6f,0x5,0x40,0x64,0x20,0x4b,0xfa,0x43,0x10,0x5d,0x4d,0xbc,0xf2,0x6d,0x26, + 0xf9,0x4,0x40,0x76,0xe5,0x2f,0xfa,0xe7,0x3e,0x16,0x6,0x4b,0x90,0xcb,0x17,0x8b, + 0xbe,0x22,0x36,0xbd,0xe,0x2b,0xdf,0x85,0xe2,0xf0,0xb7,0x2b,0x2d,0x59,0xb,0x1d, + 0x34,0x81,0x16,0xa5,0x3d,0xf4,0xa6,0xf4,0xa9,0xf1,0xfb,0x2a,0x38,0x32,0xd4,0xd4, + 0xf8,0xf1,0xcc,0xb3,0x65,0x45,0x80,0xb5,0xa0,0xed,0x18,0x63,0x5c,0x86,0x6a,0xe0, + 0x3b,0xb3,0x5,0xf3,0xce,0x99,0x5c,0x91,0xd2,0x7f,0xe1,0xfb,0x39,0x13,0xc1,0x83, + 0x68,0x10,0x13,0xe7,0xbc,0x6e,0x72,0x59,0xfb,0x2e,0x1c,0x4a,0xff,0x78,0xb9,0xf8, + 0xf,0xa3,0x61,0xae,0xd5,0xc,0xa4,0x27,0xfc,0x23,0xca,0x19,0x1c,0xdd,0x58,0x40, + 0x60,0x7b,0x1c,0x28,0xd4,0xb8,0xd7,0x32,0xb4,0x29,0x7a,0xd8,0xf8,0x29,0xef,0xfc, + 0x4d,0x14,0x6c,0x58,0x85,0x3f,0xf,0x89,0xd1,0x7a,0xde,0xae,0x14,0x82,0x8e,0x21, + 0xac,0x4a,0x12,0xb6,0xaa,0x24,0x8b,0x4a,0x74,0xce,0xae,0x9d,0xfa,0x33,0x4c,0xb0, + 0x6a,0x6b,0xad,0xcb,0x7,0x6e,0x5,0x5,0xc6,0x6f,0xc5,0x2a,0x4a,0xa,0x4b,0x1, + 0xa0,0x70,0xc8,0x5f,0x30,0x40,0x72,0x73,0x8b,0xf0,0x7,0x57,0x86,0x2e,0x4e,0x30, + 0x36,0xd1,0x63,0x5e,0x95,0x15,0x32,0xfd,0x1a,0xe2,0xbc,0x2f,0x6a,0x7c,0x5a,0xf2, + 0xc,0x96,0x78,0x59,0x52,0x93,0xd,0xda,0x3,0x0,0x2e,0x87,0xf4,0xae,0x1,0xb6, + 0x7a,0xb7,0x9a,0x4c,0xe,0x76,0xb5,0x16,0xd0,0x9a,0x1e,0x3f,0xce,0x0,0x9f,0x9d, + 0xf4,0xd,0xcb,0x9a,0x85,0x8e,0x5c,0xf1,0xb5,0xa9,0x9b,0xf3,0x92,0xc4,0x75,0x2a, + 0x35,0x24,0x7f,0x5,0xf5,0xd6,0x89,0x92,0x6c,0xfa,0x6e,0x20,0xeb,0x33,0xbb,0x5, + 0x3,0x5d,0x9f,0x1f,0x7b,0x71,0xd8,0x9c,0xb5,0x22,0x11,0xa3,0x7,0xe4,0xe2,0x20, + 0xe1,0x62,0x9,0xb1,0x39,0x95,0xa3,0x28,0x30,0xb0,0x44,0x55,0xde,0xfa,0x23,0x86, + 0xed,0x58,0x90,0xd,0xb0,0xe4,0x4c,0x8d,0xcf,0xed,0xa0,0x25,0x42,0x54,0x35,0x3b, + 0x2e,0x71,0xb3,0x76,0x27,0x20,0xcb,0xe,0xba,0xb3,0x2,0xf6,0x5d,0x66,0x95,0x9e, + 0x25,0x46,0x33,0xb1,0xe9,0x58,0x4e,0x8a,0x17,0x87,0x74,0x15,0xfe,0x3d,0xc9,0x62, + 0xb9,0x79,0xd0,0x86,0xbd,0xd7,0xe0,0x72,0xf6,0x79,0xd9,0xd9,0x9d,0xa2,0x3c,0x95, + 0x4d,0x4e,0x46,0xef,0xd2,0x3,0xae,0x8c,0x70,0xe1,0xa0,0x11,0x6,0xc8,0xea,0x6b, + 0xb9,0x71,0x47,0x31,0x81,0x28,0x3f,0x8b,0xe7,0x8b,0x70,0x48,0x24,0x8d,0x82,0x9a, + 0xbf,0x7b,0x5a,0x23,0x74,0xd8,0x25,0x36,0x35,0x67,0x9b,0xb,0x87,0xf2,0x88,0xd9, + 0x7c,0x4c,0x48,0xe4,0xcd,0xd1,0xfb,0x31,0x78,0x49,0xa9,0x2c,0x99,0x7c,0xdc,0x3a, + 0x73,0x93,0xc9,0xcb,0xc7,0xce,0x74,0xa3,0xd,0x11,0x7b,0x26,0xe4,0xfd,0xd1,0x67, + 0x6a,0x9b,0xfa,0x90,0xf5,0x2a,0xc4,0xb6,0x1e,0xd7,0x72,0xe0,0x1c,0xca,0xde,0xc0, + 0x12,0x3e,0xb9,0x4,0xd,0x60,0x89,0xca,0x97,0x8d,0xfb,0xac,0xb7,0xc4,0xfa,0x0, + 0x95,0x84,0xe6,0xfd,0x46,0xe7,0xd,0xcf,0x65,0xe1,0xa3,0x2a,0x6d,0xe6,0x5b,0xa2, + 0xd9,0x30,0x7a,0xa8,0xe6,0x1,0x80,0x41,0x5,0x58,0xf2,0x4d,0xf8,0xfc,0x92,0xec, + 0xaf,0x98,0x3c,0xff,0x5d,0xc3,0x36,0xe,0xd2,0xcf,0xf4,0x35,0xf8,0xb7,0x55,0xa8, + 0x30,0x7c,0x34,0x1,0xbf,0xc8,0x72,0xd5,0xca,0x48,0xc,0xff,0xa0,0xd0,0x32,0x5d, + 0xd,0x29,0x59,0xa8,0x59,0x7a,0x67,0x63,0x63,0x33,0x3d,0x65,0xdd,0xf0,0xac,0xdc, + 0x8f,0x3e,0xdf,0x21,0x3c,0x67,0xf3,0xe8,0x69,0xea,0x5b,0x5d,0x6,0x98,0xa,0xae, + 0xc0,0x44,0x5f,0x4d,0x64,0x1c,0x63,0x3f,0x6b,0xf,0x98,0x12,0x89,0x7c,0xa,0x54, + 0xdc,0x98,0xb9,0x31,0xbb,0x65,0xbe,0x90,0xd3,0xab,0x16,0xbc,0x1b,0xe7,0x1d,0x11, + 0xd1,0x99,0xaa,0x99,0xe5,0xcc,0x0,0x2d,0xfa,0xbb,0xad,0xf0,0x78,0x3a,0xe9,0xbf, + 0xd1,0xce,0xc7,0x8a,0x15,0x40,0x2d,0x53,0xee,0x24,0x3a,0xdb,0xf5,0x77,0x5a,0xcf, + 0x51,0x79,0x29,0x5d,0xc7,0x73,0x19,0x58,0x65,0x6d,0xad,0xa0,0xf2,0xb5,0xf4,0x62, + 0xb3,0x56,0x53,0xa,0x8a,0x59,0xef,0x39,0x90,0x15,0x53,0x10,0x99,0x5b,0xb5,0xcf, + 0xd8,0xa9,0x1f,0xc,0xb,0x58,0xf8,0x11,0xd5,0x94,0x28,0x9d,0x7,0x65,0x4c,0xf0, + 0xf7,0xdc,0x2a,0xfa,0x4c,0x1f,0x98,0xae,0xe,0xf9,0x7b,0xfa,0x2c,0xef,0x7,0xea, + 0x41,0xb7,0x39,0x95,0xbf,0xa2,0x86,0xee,0xb0,0xc4,0xda,0x68,0x31,0x74,0x3b,0xaa, + 0x49,0xcf,0x78,0x52,0x2d,0x90,0x2a,0x41,0xd7,0xa,0x9a,0x3f,0x5b,0xa7,0x72,0x90, + 0xd1,0xee,0xbc,0xea,0x73,0x2d,0x6,0xaa,0xf4,0xb3,0x41,0x5e,0x5c,0xa2,0xfb,0x91, + 0xb5,0x25,0x52,0xdc,0x1e,0x1a,0x21,0x30,0xd0,0xd3,0xe7,0x0,0x9f,0x94,0xf5,0x2e, + 0x68,0xff,0xa3,0x97,0xc9,0x59,0xc8,0x7f,0x3b,0x47,0x9f,0xf1,0x79,0x56,0x48,0xc6, + 0x2a,0x8e,0xe5,0x2b,0x58,0x44,0xc9,0xb0,0x1f,0xe,0xe9,0xfa,0x6c,0xfb,0x41,0x15, + 0x5c,0x97,0x1e,0x1b,0x22,0xed,0xc9,0x1e,0x6f,0xe5,0x6e,0xf6,0x35,0x90,0xac,0xc2, + 0x7e,0x20,0x7d,0x4,0xd5,0xab,0x88,0x4c,0x15,0x25,0x8f,0x3a,0x64,0x21,0x2b,0x2c, + 0xb6,0x94,0x81,0xa5,0xf,0x5c,0x41,0x41,0x86,0xda,0x65,0x82,0x86,0x98,0x91,0xab, + 0x60,0x55,0x61,0xbc,0x63,0x6c,0x1,0xa9,0xe5,0x1d,0x92,0x8a,0x86,0xcb,0x66,0x1, + 0xac,0x2f,0xba,0xf5,0x33,0x42,0x40,0x8f,0x78,0x27,0x4c,0xe2,0x66,0x6a,0x6a,0x78, + 0x30,0x69,0x3d,0xe,0xf4,0x3f,0x82,0xed,0x35,0xa1,0x9f,0xf9,0x15,0x38,0x64,0xcc, + 0x7c,0xb7,0x81,0x8b,0xf,0x1a,0x79,0x4d,0x23,0xc2,0x1,0x60,0x69,0xed,0x89,0x5e, + 0x24,0xd,0x7b,0xaf,0x55,0x23,0xa3,0xb3,0x8a,0xc4,0x79,0x85,0xfc,0x9c,0xdc,0x8a, + 0xea,0xd4,0x2,0x7e,0xc6,0x6d,0x73,0xb8,0xbe,0xd5,0x8c,0x28,0xbd,0x8c,0x14,0x27, + 0x47,0x32,0xaf,0xc7,0xe7,0x17,0x7c,0x76,0xfd,0x9e,0xab,0x4c,0x55,0x7d,0x9f,0x9d, + 0xc,0xe8,0x65,0xd0,0xe,0xca,0x22,0xde,0x4e,0x90,0x9f,0xe6,0xc9,0xbf,0x72,0xc8, + 0x2b,0xf1,0x7c,0x20,0xf4,0xb4,0x42,0x81,0x46,0xe5,0xf8,0x79,0xf9,0xae,0xc3,0x60, + 0x28,0x3e,0xbb,0xd9,0xe0,0x92,0xbd,0x8c,0xa2,0xb7,0x2a,0xb5,0x1d,0xef,0x79,0x8d, + 0x39,0xce,0x12,0xcb,0x52,0x34,0xa0,0xb5,0xf,0x8,0x94,0x41,0x5a,0x5d,0x2c,0x2e, + 0x2a,0x6a,0x2f,0x8c,0xf1,0x2e,0x17,0x33,0xa3,0xc0,0xcf,0x60,0x60,0x1f,0x40,0x4e, + 0x94,0x16,0xe7,0x69,0x6f,0x57,0x2,0xde,0x2b,0x96,0x7f,0x22,0x5c,0xd5,0xb1,0x74, + 0x2,0x2c,0x28,0xe8,0x26,0xb4,0x72,0xdc,0x76,0xd6,0xf,0xd7,0x2a,0xe3,0x6c,0xe, + 0xe9,0xbc,0x8d,0x3e,0x2f,0xa8,0x12,0xcc,0x0,0x58,0x37,0x1a,0x14,0xd,0xc8,0xbb, + 0xd2,0xdc,0xcd,0xcb,0x59,0x3c,0x7f,0xd3,0x31,0xf3,0x1a,0x39,0xef,0x3c,0xad,0x25, + 0x71,0xda,0xe5,0xdd,0xc1,0x4f,0x10,0x96,0xdd,0x28,0x1b,0x36,0xd3,0xe0,0x78,0x58, + 0x82,0x8d,0xd6,0x44,0x16,0x7,0x58,0xb9,0x13,0x6c,0x71,0x2b,0x9d,0xb8,0xf1,0x28, + 0xe3,0xec,0x4a,0xdd,0xf2,0x27,0x53,0xf4,0x64,0xcb,0xd8,0x71,0x86,0xa9,0x5f,0xa1, + 0x65,0xa,0xda,0x10,0xd2,0x40,0xde,0x8,0x48,0x57,0x91,0x4c,0xdf,0x6b,0xd6,0x7e, + 0x12,0x3b,0xee,0x6e,0xd2,0x28,0xf1,0x6,0x12,0x21,0xba,0x54,0xcd,0x6b,0x46,0x1, + 0x9,0x3c,0x50,0xf6,0xe9,0xf5,0x8b,0x99,0x12,0x1,0xba,0x0,0xd2,0x21,0xfd,0x9, + 0x73,0x9,0x5a,0x6f,0xbd,0x40,0x22,0x18,0x89,0x31,0x42,0xad,0x81,0xd8,0xc,0x69, + 0x24,0xde,0x67,0xc0,0xa2,0xf,0x2d,0x41,0xdf,0xa1,0x7b,0x87,0x66,0x1b,0x58,0x16, + 0x7c,0x4c,0x75,0xba,0x5e,0xc7,0x9b,0x95,0x87,0x48,0xc1,0x29,0xa6,0x83,0x89,0x1b, + 0x72,0x3,0x2c,0xab,0x93,0x8c,0x42,0x33,0x76,0x9e,0x61,0xf6,0x2,0xb9,0x7b,0xe3, + 0xd6,0x1d,0xf1,0xd8,0xf,0xbc,0x97,0x61,0x3f,0xa0,0x85,0xbd,0xb,0xda,0x5,0xe1, + 0x9c,0x80,0x1d,0x2,0x7,0x19,0x6c,0x7,0x8a,0xb2,0xe0,0xd9,0xad,0x14,0x37,0xd7, + 0xed,0x5,0xce,0xf6,0x6b,0x17,0xd9,0x92,0x48,0x6f,0x0,0x9,0x20,0x7e,0xe9,0x92, + 0x76,0xa5,0x17,0x60,0xa1,0x5f,0x62,0xb8,0x0,0x2c,0x48,0x94,0x9c,0x48,0x1,0xd6, + 0xbf,0x0,0x59,0xe0,0xd0,0x2a,0x69,0x80,0xd5,0x3f,0x6e,0x32,0x61,0xc,0xe9,0xd1, + 0xae,0x66,0x7a,0xfe,0xd5,0xdb,0x20,0x33,0xb4,0x44,0x17,0x73,0xc3,0xc3,0x13,0xb4, + 0xb1,0x56,0x6,0xe0,0x73,0xd1,0x6a,0xc1,0xdc,0xca,0x9a,0x9b,0x8,0xa3,0x9e,0xc8, + 0xe5,0x59,0xe,0x7,0x80,0x55,0x62,0x86,0x98,0x1a,0xd9,0xa4,0x2b,0xdf,0x24,0x97, + 0xd,0xd8,0xa2,0x22,0x7,0x8c,0x55,0x5c,0x22,0xac,0x50,0x54,0xee,0x2d,0x84,0x21, + 0x50,0xb0,0x71,0xfd,0x37,0xa6,0xbe,0xf,0x7e,0xbf,0x6e,0xf4,0x95,0x0,0x2f,0xc9, + 0xeb,0xf0,0x39,0x56,0x20,0xef,0xec,0x94,0xf1,0x54,0x4e,0xfe,0x2b,0xd8,0x5c,0xfa, + 0x6f,0xb0,0xfc,0xf3,0x35,0x1c,0x1a,0xed,0x7b,0xd5,0xdb,0x46,0x9e,0xf1,0x40,0xaf, + 0x73,0x7d,0x23,0xbe,0x86,0x5e,0xad,0x7c,0x8c,0xb4,0xcb,0x1b,0x3c,0xa8,0xb8,0xc8, + 0x56,0xd4,0xc1,0x96,0xd,0x1e,0xbf,0x90,0x7b,0xb4,0x40,0xc6,0x89,0xc9,0x99,0xd8, + 0xaf,0xf4,0x2,0xac,0x1,0xcc,0x23,0xe3,0xb6,0x74,0x88,0x30,0xaf,0xd1,0xec,0x44, + 0x1,0xd6,0x3f,0x0,0x59,0xf7,0x76,0x2c,0xb9,0x70,0xe1,0xd1,0x1e,0x7d,0x48,0xa4, + 0x43,0x52,0x3d,0x84,0x75,0x2c,0xd9,0x5a,0x71,0x23,0xc6,0x6f,0x2e,0x85,0xc1,0x4e, + 0xc2,0x62,0xf6,0xc1,0x9e,0x43,0x87,0xbc,0xd9,0x8c,0xb6,0x16,0xb9,0xb5,0x52,0x3c, + 0x23,0xed,0x7c,0xd1,0xf3,0x5c,0x5a,0xa3,0x56,0x82,0x56,0x28,0xdc,0x40,0xe6,0x55, + 0x14,0x24,0x34,0xe8,0xb5,0xc6,0x20,0x4,0xbe,0x5f,0x88,0x4d,0xa9,0x50,0x84,0xfc, + 0xab,0x47,0x51,0xb0,0x61,0xf6,0xed,0x1e,0xcd,0x8e,0xb5,0xe7,0xcf,0x6c,0x11,0x60, + 0x91,0xd2,0x9b,0xd5,0x13,0x16,0x59,0x82,0x2f,0xed,0x92,0xa4,0x75,0x84,0x71,0x4b, + 0x65,0xef,0xaf,0xa5,0x56,0x9,0xf,0x96,0x56,0x75,0x8e,0xbe,0x4d,0x4b,0x81,0xf1, + 0x26,0xea,0x44,0x2e,0x27,0x1d,0x77,0xf4,0x6b,0xe5,0x63,0x94,0xd7,0x73,0xdc,0x7d, + 0xc6,0x4b,0xd9,0x79,0x60,0xb9,0xbb,0xd,0x4,0x55,0x50,0xee,0x2e,0xca,0xc7,0x19, + 0xff,0xd5,0x6b,0x95,0x4a,0x1f,0xb8,0x7a,0xaa,0x26,0x90,0x3d,0x61,0x31,0xd8,0x70, + 0x13,0xbb,0xab,0x37,0x5,0x58,0xe7,0x2a,0x8b,0x19,0xea,0x67,0x5d,0xfb,0x95,0x8, + 0xc0,0x5a,0x9b,0x30,0x2a,0x27,0x3f,0x8c,0xde,0xf6,0x1,0xcd,0x2e,0xcd,0x24,0x5, + 0xac,0x40,0x37,0x43,0x28,0xa,0x15,0x90,0x7f,0x55,0xb7,0xdb,0xa,0x53,0xc3,0x17, + 0x70,0x87,0xeb,0x61,0x95,0xeb,0x3d,0xf,0xa6,0x51,0xa7,0x90,0x56,0x16,0xe1,0x36, + 0xb2,0x66,0x68,0xd2,0x4d,0xc0,0xfd,0xe4,0xe9,0x13,0xea,0x97,0xcb,0x1f,0x5,0x1b, + 0xae,0xbf,0xad,0x40,0x69,0x50,0xaf,0xc7,0x4a,0xd5,0xe6,0x50,0xbe,0x9,0x68,0x1, + 0x37,0x9b,0x56,0x89,0x2,0xcc,0xb,0xce,0x51,0xb7,0x5a,0x22,0xbf,0x9,0x9d,0x7, + 0x72,0x84,0x3c,0x45,0xe5,0x83,0x1a,0x1d,0xae,0x76,0xf3,0xf5,0x1a,0xba,0x3d,0xa0, + 0x77,0x54,0x78,0x2d,0xe7,0xc5,0x51,0xa3,0xd5,0x19,0xbb,0xf6,0x27,0x3e,0x4e,0xf9, + 0x51,0x5b,0x6c,0x3e,0xc6,0xc8,0x66,0xb5,0xe2,0x0,0x69,0x58,0x28,0xbd,0x25,0xc, + 0xed,0xa,0x73,0x3a,0x97,0x3e,0x80,0x35,0x76,0x80,0x61,0x80,0x47,0x87,0x29,0x85, + 0x46,0x6,0x9e,0xdf,0x19,0x3d,0x35,0xe4,0xad,0x76,0xf0,0xf9,0xd,0xa3,0xd3,0xa8, + 0xd1,0x97,0x4f,0x7a,0x3c,0x45,0xe,0x79,0x7,0x72,0x9f,0x10,0xdb,0x36,0xb3,0x35, + 0x8e,0x9e,0x13,0x36,0x33,0x14,0x5,0x1e,0xed,0xa6,0x3e,0x6c,0xea,0x46,0xef,0x33, + 0xef,0x2d,0x23,0x84,0xdd,0x2f,0x67,0x65,0x98,0xeb,0x28,0x48,0xf9,0xb8,0x31,0x2c, + 0x58,0xb5,0xb6,0x1b,0x6c,0xfc,0xe6,0x16,0x7e,0x69,0xc9,0xe8,0x8c,0xef,0xed,0x9e, + 0xf5,0x92,0xe9,0xd,0x6e,0xf5,0x1e,0x6c,0x5b,0x2,0xb4,0xf,0xdd,0xb5,0x2e,0x4, + 0xfb,0x4d,0x9f,0x7,0xf0,0xc8,0xe9,0x21,0xcf,0x89,0x1a,0xf8,0xcb,0x6a,0x84,0x54, + 0x83,0xd6,0x13,0xef,0xe3,0xeb,0x34,0x44,0x3a,0x6c,0xf9,0x21,0x23,0x24,0x9b,0x95, + 0x2b,0x97,0x77,0x90,0x15,0xb8,0xfd,0xac,0xae,0xe8,0xa7,0x8a,0xb,0x0,0x2e,0x5d, + 0x42,0xf3,0xf4,0xcb,0x43,0xc4,0xc7,0x94,0x56,0x5d,0x10,0xa5,0x23,0xac,0x45,0xe, + 0x68,0xd,0x4a,0xb,0xb8,0x42,0x93,0x6a,0xed,0x60,0x7e,0x5d,0x8,0xe7,0x1e,0x69, + 0x5a,0x9,0x3b,0xb9,0xba,0xed,0xe8,0x90,0x2,0xac,0x4d,0x9,0x6,0x67,0x98,0xbc, + 0xdc,0x73,0xc8,0x3b,0x94,0x9f,0x1a,0xf6,0x5a,0x63,0xaa,0x87,0x7,0xe5,0xdd,0xfa, + 0x1,0x1a,0x15,0x5c,0xf,0xa1,0xd6,0xf8,0x1b,0xbc,0x38,0x66,0xbe,0x1f,0x7a,0xb3, + 0xf9,0xac,0x72,0x15,0xe5,0x67,0x4b,0xba,0xdc,0x3b,0x5c,0x6f,0xf1,0xa8,0x2,0x65, + 0xee,0x7e,0x67,0x5a,0xe3,0x42,0xf6,0xd2,0x12,0xcc,0x39,0xaa,0x98,0xcc,0x7c,0xe6, + 0xa4,0xb9,0x7,0x7c,0x82,0xea,0x62,0xd8,0x6,0xed,0x7d,0x36,0xfc,0x6a,0x3e,0xd0, + 0xd5,0xbc,0x89,0x6e,0x4f,0xf1,0x1,0x5a,0xaf,0xb1,0x16,0x3e,0x9f,0xf2,0x75,0x1a, + 0xda,0xee,0xf,0x17,0x58,0x25,0xa9,0x8f,0x42,0xe,0x50,0xdb,0xf0,0x71,0x2a,0x58, + 0x41,0x8,0xab,0xb3,0xe0,0xef,0xb,0x61,0x62,0x35,0x4b,0xf6,0x55,0x85,0xd6,0xd3, + 0x54,0xe1,0xd1,0x3a,0xa5,0x83,0xff,0x2a,0x3a,0x43,0xd5,0xfa,0x11,0x66,0xb4,0xe, + 0x6b,0x9e,0x32,0xb4,0x99,0xb0,0xcb,0xbf,0x81,0xbe,0xe1,0xcb,0x6e,0xc9,0x21,0xcb, + 0xbd,0xaa,0x2e,0xa6,0xab,0x36,0x87,0x74,0x8a,0xb5,0xfa,0x61,0x1e,0x1e,0xc5,0x81, + 0x4d,0x8a,0xc4,0x40,0x33,0x37,0x40,0xdd,0xae,0x2b,0x70,0x78,0x7e,0x1d,0x2,0xe0, + 0xba,0x2f,0x32,0x26,0xcb,0x8d,0x98,0xbc,0x99,0xef,0x87,0x1b,0x14,0xbd,0x4,0xbc, + 0x9b,0xf7,0xf9,0xa4,0xeb,0x31,0xfe,0xe0,0xc8,0xe2,0x86,0xb0,0xb0,0x9c,0xac,0x23, + 0x9a,0x47,0x48,0x94,0x37,0x15,0x32,0xe7,0xaf,0x55,0x6e,0x33,0xcf,0x3d,0xc3,0xe4, + 0xc6,0xc8,0x8,0xe9,0x31,0x40,0x88,0x10,0x5f,0x60,0x6b,0xd8,0x12,0xef,0x93,0x4d, + 0x15,0xa0,0x1c,0xf4,0x5a,0xbf,0xdb,0x71,0x70,0x21,0x74,0xc8,0xd7,0x68,0x68,0xf8, + 0xa4,0xb4,0xca,0x6a,0xe9,0xe,0xdf,0xdc,0x68,0xae,0xdf,0xcc,0xe6,0x2e,0xc,0x17, + 0x8d,0x1e,0xbd,0x57,0x2f,0xec,0x92,0xc4,0x50,0x12,0x5e,0x2e,0x62,0xb7,0xaa,0x36, + 0x53,0x55,0xe1,0xde,0x46,0xe1,0xb,0xae,0xd0,0xee,0x7,0x39,0x65,0x9a,0xeb,0x74, + 0x98,0x50,0x1a,0x44,0xbf,0xd,0x4e,0x6c,0x3d,0x3e,0x24,0x0,0x6b,0x6c,0xeb,0x9, + 0xc6,0x8d,0x7a,0x4e,0xee,0x6a,0x2b,0x84,0xe8,0xc2,0x3e,0x94,0xe2,0xc3,0xfe,0xd8, + 0x44,0xd7,0xf1,0x4b,0xfb,0x6d,0xb6,0x40,0xa8,0x88,0x79,0x59,0xd7,0xe7,0x1f,0xfe, + 0x79,0x8d,0x1b,0x41,0x7f,0x1b,0xc,0x3b,0x5d,0xc7,0xf3,0x6d,0x7f,0xd2,0x58,0xae, + 0x62,0x13,0xe5,0xf3,0xe2,0x48,0xf3,0xf3,0x95,0xaa,0xb7,0x5f,0xc,0xde,0xa2,0x37, + 0x3,0xcd,0x9f,0xb5,0xca,0xfb,0x78,0xf2,0x8,0x41,0xf4,0x68,0x21,0x7e,0xb9,0x52, + 0x9d,0xdc,0x3e,0xea,0x36,0xd,0x14,0x88,0x4a,0x7c,0x3e,0xc,0x1,0x77,0x58,0xa1, + 0x98,0x23,0x1c,0x14,0xd,0xc8,0xf5,0xf0,0xf6,0xca,0x10,0x7b,0x4b,0xc0,0xa0,0x4a, + 0x27,0x2d,0x26,0x5d,0x15,0x56,0xb4,0xd6,0xda,0xcd,0x84,0xb,0xb0,0x7a,0xbb,0x1c, + 0x11,0x66,0x77,0x31,0x9a,0x3c,0x9f,0xa7,0xb,0x2c,0x2d,0x18,0xde,0x23,0xe6,0xc9, + 0x89,0x92,0xba,0x32,0xb0,0x86,0xcf,0x44,0x3f,0x43,0x6f,0xb5,0x2b,0x63,0xe8,0x1, + 0xd9,0x93,0x31,0x16,0x17,0x97,0x9b,0xc7,0xbf,0xdb,0xea,0x7b,0x11,0xa2,0xac,0x7e, + 0x13,0x64,0x2f,0xd6,0xee,0xe,0xc3,0x8c,0xc5,0xf5,0x51,0x8e,0xc3,0xc9,0x21,0x3f, + 0x8e,0xf6,0x2d,0x66,0x6e,0x50,0xe4,0x96,0x4,0x25,0x94,0x92,0x97,0x6f,0x2c,0x9e, + 0xd1,0x20,0x28,0xcf,0x99,0xdb,0x59,0xde,0xe8,0xeb,0xe7,0xeb,0x22,0x90,0x20,0x97, + 0x7,0x8,0x4,0x99,0x27,0x37,0x82,0x45,0x69,0x4,0x9e,0x4f,0x5b,0x2c,0x9d,0x92, + 0xa3,0xcf,0x95,0x6f,0x9a,0xee,0x79,0xc8,0xd,0x46,0x8a,0x79,0x21,0x46,0x7,0x8, + 0x16,0x6e,0x34,0x7b,0xec,0x3d,0xfb,0x34,0x4a,0x4e,0x64,0xcf,0x6,0x2f,0x38,0x3d, + 0x47,0xda,0xa4,0x3e,0xc8,0xd7,0x66,0x8,0x14,0x3c,0x4f,0xfa,0xc5,0xf3,0x96,0xfc, + 0xcf,0xb,0xad,0xe1,0x33,0xcf,0xc3,0xf2,0x4f,0xb5,0x34,0x3,0xd7,0xa1,0x12,0x8, + 0x49,0x81,0x66,0x5e,0x3e,0xc9,0x36,0xcc,0xc0,0x11,0x44,0xd8,0xd7,0xd0,0xfa,0xe0, + 0xea,0xd6,0x4b,0x89,0xd0,0x73,0xac,0x61,0x60,0x8f,0xb0,0xdb,0x7f,0x51,0xab,0x29, + 0xd1,0x82,0x85,0x1,0x26,0xf9,0x66,0x96,0xb7,0xe5,0x90,0x4f,0x14,0x8b,0x65,0xd6, + 0x21,0xff,0xa7,0xb5,0xbe,0x91,0x1e,0x64,0xf9,0x4c,0x18,0x4f,0x67,0x46,0xf3,0x20, + 0x70,0x96,0xd,0xc3,0xe7,0x5f,0xd1,0x66,0x6c,0xd0,0xc0,0xd5,0xc7,0x5d,0xfb,0x11, + 0x54,0x29,0x82,0x77,0xcb,0xc3,0x5d,0xe3,0x39,0xdc,0x95,0xd3,0xcd,0x87,0x6c,0xb3, + 0x42,0x8e,0xc1,0xb9,0xa0,0x36,0x77,0xf6,0xf2,0xd6,0x82,0x18,0xd3,0xfc,0x96,0x33, + 0x8a,0xdb,0x13,0x96,0xcd,0x6b,0x24,0xd7,0xe3,0x39,0x53,0xd6,0xfe,0xc0,0x8d,0x60, + 0x21,0x9a,0x76,0xcb,0xa9,0xbc,0xd5,0x98,0x3e,0xc6,0xd2,0x6c,0xbe,0x28,0x4f,0x51, + 0x3,0x0,0x5f,0x10,0xf8,0xaf,0x0,0xd8,0xac,0xd1,0x1e,0xc7,0x45,0x6d,0xc8,0xcc, + 0x8a,0xfa,0x5,0xa6,0x8f,0x56,0x7d,0xfc,0x3e,0x5f,0x9b,0x41,0x56,0xd8,0x2,0x8d, + 0x62,0xc0,0xf5,0x9b,0xa7,0x57,0x6c,0xbe,0x1e,0x4e,0xe5,0x7f,0x8d,0x12,0x6f,0x50, + 0xad,0x10,0x42,0xb6,0xba,0xea,0xb9,0xbe,0x48,0x2b,0xaa,0x17,0x7a,0x90,0x85,0x8c, + 0x7a,0xbb,0xfc,0x8c,0x7,0x34,0x8c,0x18,0x42,0x84,0xbd,0x4d,0xad,0xd7,0x6,0x7, + 0xc0,0x6a,0xf8,0x50,0x4f,0x4b,0xd,0xc6,0xf4,0x5d,0xd0,0xa2,0xcb,0x91,0xdc,0x9f, + 0xd1,0x9a,0x82,0x8a,0x65,0xf4,0xe7,0xf6,0xdb,0xe0,0xf1,0xca,0x5,0x94,0xea,0x75, + 0x9c,0x42,0x3a,0x8d,0x19,0x41,0x86,0x2a,0xfd,0xc9,0xf4,0x45,0xbd,0xc8,0xa2,0xd, + 0x1d,0xc9,0xda,0x9d,0x6d,0xf2,0xe8,0xf2,0xad,0x9,0x64,0xc6,0xf2,0x6e,0x24,0x65, + 0x56,0x5f,0xd2,0x6b,0xd2,0x50,0x22,0x26,0x8f,0x23,0xe5,0xa2,0x33,0x7c,0x1,0xaf, + 0xef,0x59,0xf,0x25,0x90,0xbb,0x16,0x8f,0xcf,0xc9,0x46,0x81,0xd0,0xf,0xb5,0xc5, + 0x74,0xf5,0x7c,0xaf,0xde,0x1,0x83,0xab,0x6f,0xbb,0xf5,0x25,0xf5,0x9d,0x7a,0x28, + 0xd5,0x21,0x4d,0xf3,0xc5,0x8f,0xd6,0x6b,0xe6,0xab,0xe6,0xf2,0x43,0x31,0x52,0x38, + 0xe5,0xb9,0x10,0x78,0x3,0xf7,0xa3,0xf9,0xac,0xd9,0x86,0xa7,0x6a,0xdb,0x5,0x74, + 0xcd,0x2a,0x7,0xf2,0x7d,0xce,0x68,0x57,0x33,0x6a,0x24,0xcf,0x37,0x49,0xde,0xc8, + 0x8d,0xa4,0x1f,0x5a,0x39,0x7e,0x9e,0x9b,0xee,0xb1,0xc7,0x7c,0x53,0x72,0xc8,0x9f, + 0xa0,0x2c,0xdb,0xec,0x67,0x44,0x48,0xf,0xa1,0xbd,0x40,0x7b,0x2c,0xd2,0x75,0xf1, + 0x71,0xcd,0x8e,0xd7,0x98,0xfe,0x3e,0x59,0xbe,0x68,0x54,0xd0,0x4f,0x92,0xda,0xf, + 0x34,0x68,0xe7,0xeb,0x32,0xb8,0x95,0x9a,0x15,0x5b,0xcd,0x71,0xb3,0x6e,0x6,0xfe, + 0x90,0x64,0x6a,0xe7,0x1b,0x6b,0x6,0xcd,0xc7,0xaf,0x60,0x45,0x27,0x4,0x3d,0x5d, + 0x23,0xb9,0x24,0x69,0x2,0x46,0xb0,0xd0,0x91,0x1,0x12,0xfa,0x8c,0x21,0xc2,0x8a, + 0x38,0x22,0xbc,0x50,0xcd,0x3c,0x60,0xf5,0x44,0x2d,0x22,0xcc,0xef,0x40,0x84,0xae, + 0x13,0xb3,0xc1,0x8b,0x5d,0x79,0xd9,0xaf,0xee,0xdc,0xa8,0x32,0xd2,0x16,0xdd,0xb7, + 0xde,0xe0,0xa7,0x45,0xd2,0x78,0x32,0xf9,0xaa,0x44,0x72,0xc3,0xae,0x78,0xf2,0xdc, + 0xeb,0x4d,0xc9,0xd1,0x3f,0xaa,0x10,0x42,0x84,0x62,0xeb,0xb9,0xf3,0x91,0xe4,0xa3, + 0x43,0x75,0xc9,0x3d,0x4f,0xd8,0xc9,0xc2,0xf5,0x1d,0x19,0xf0,0xaa,0xd0,0x32,0x1b, + 0x74,0xd9,0x90,0x7c,0x8f,0xaa,0x5,0x78,0xa5,0xf2,0xcb,0x19,0xf1,0x9,0xc,0xb4, + 0xc4,0xe7,0x47,0x3b,0xd,0xe,0x8,0x5c,0xfd,0xd0,0xbd,0x2f,0x69,0x11,0x33,0x5d, + 0xcd,0x37,0x54,0xa1,0xf7,0xf,0x33,0xd3,0x40,0x82,0x24,0x2f,0x24,0x71,0x71,0x78, + 0x8b,0x44,0xe5,0x3f,0x24,0x36,0x9a,0xb9,0xa1,0x41,0xbe,0xa8,0xbf,0xdf,0xd2,0x42, + 0xbc,0x6d,0xd7,0xe2,0xfb,0x40,0x4c,0xc9,0xd,0x61,0xc1,0x5a,0xbf,0xe7,0x2a,0x95, + 0xda,0x82,0xf,0xf2,0x8e,0xe1,0xf4,0xfa,0xb8,0x9d,0xc6,0x99,0xcd,0x2b,0x46,0x41, + 0x32,0x92,0xd2,0xf3,0xf0,0x16,0x15,0xd9,0x3,0x6b,0x91,0xf7,0x41,0x7b,0x9c,0x95, + 0x87,0x73,0xb7,0xc7,0x81,0x7,0xeb,0x7e,0x78,0x59,0xf8,0xa5,0x20,0x98,0xbd,0xfb, + 0x76,0x19,0xd,0xd6,0x7f,0x65,0x8d,0x8c,0xfd,0x11,0x96,0x77,0xa8,0xfc,0x80,0xb9, + 0x40,0xb,0x19,0x3e,0x96,0x5,0x55,0x13,0xfe,0xe4,0x9b,0xf2,0xa2,0x64,0x2a,0xd9, + 0xa4,0xfe,0xf4,0x20,0x7e,0x25,0xbb,0x9f,0xf,0xd5,0xc1,0xc3,0x89,0xb0,0xac,0x8d, + 0x16,0x42,0x7c,0x3f,0x22,0xb4,0xb9,0x55,0xb7,0x37,0xd1,0xfa,0x25,0x26,0x8f,0xf2, + 0xf6,0x8,0x5d,0xa0,0xfa,0x30,0x35,0xa8,0x5d,0xa,0x7d,0x7e,0xa0,0x7d,0xba,0xe9, + 0x6d,0xe,0xe9,0x22,0x7e,0xb6,0x7c,0x4c,0x86,0x3a,0x30,0x7d,0x20,0xd9,0x75,0x7f, + 0x34,0xf9,0xf1,0x97,0x6a,0x1,0x81,0x29,0x7f,0xf5,0xf4,0xbf,0xe5,0xc8,0xb3,0xfb, + 0x2f,0x25,0x33,0x57,0x74,0x25,0xd,0x3a,0xa7,0xaa,0xd9,0x60,0x4b,0xfa,0x9e,0xb5, + 0xcb,0x30,0xdc,0xeb,0x5,0x93,0x8f,0xb6,0xc5,0xcf,0xa4,0xc6,0x17,0x3f,0xd9,0xfd, + 0x93,0x6e,0xfd,0x48,0xa3,0x6c,0xcf,0xd5,0x76,0x9f,0x14,0x16,0xa2,0xfc,0x1e,0x12, + 0x71,0xcd,0x5c,0xf0,0xa3,0x56,0x79,0xc,0xf7,0xb4,0xe0,0x7a,0xaf,0xa4,0xab,0xac, + 0x40,0xcf,0x80,0x36,0x38,0xfe,0xb5,0x70,0x4a,0x89,0x4,0x65,0x83,0x1,0xb2,0xb2, + 0xf8,0xa1,0x55,0x48,0xa2,0xbb,0xf2,0x7b,0x7e,0x45,0x22,0x3,0xaf,0xfe,0xc8,0xf4, + 0x83,0x52,0xdf,0xf7,0x4b,0x2,0x5b,0xc3,0xd6,0xc9,0xaf,0x41,0x4f,0x47,0xed,0x9d, + 0x32,0x62,0xbc,0xbc,0x6b,0x9f,0x36,0xe8,0xc5,0x13,0xdc,0x3,0xb9,0x5c,0x8e,0xb8, + 0xee,0x2b,0x36,0xb6,0xc8,0xc1,0xd4,0x7b,0x70,0x5e,0x60,0xf6,0x1a,0x79,0xc1,0x45, + 0xb3,0x77,0x6d,0xe8,0xcf,0x9e,0x85,0x77,0x97,0x13,0x8f,0xfa,0x91,0x1b,0x89,0xf4, + 0x11,0xd3,0xc4,0x99,0xe9,0xa4,0x9b,0xfb,0x1a,0xfa,0x20,0x9f,0xe4,0x8,0x7f,0xb5, + 0x9a,0xae,0xa,0xa3,0x7,0x11,0x61,0x5e,0x27,0x22,0x6c,0x76,0x10,0xe1,0xa1,0x7a, + 0x44,0xd8,0x5f,0xb1,0x68,0x40,0xa,0x9,0xf5,0x2f,0x55,0x21,0xc2,0x3d,0x8d,0x88, + 0xb0,0xb6,0x25,0x11,0xae,0xe8,0x46,0x84,0x21,0xc3,0x88,0xd0,0x32,0x5d,0xf5,0xfa, + 0x5d,0x28,0x4b,0x3d,0x40,0x7,0x21,0x53,0x88,0x4d,0xaf,0x53,0x38,0xb0,0x72,0x35, + 0xa3,0xdf,0x7b,0x1f,0xb,0x1f,0x82,0x19,0x7b,0xf0,0x18,0x72,0xd3,0x5d,0xb1,0xe4, + 0xc4,0xdf,0x15,0x4a,0x4,0x54,0xe5,0xa7,0x17,0x2f,0xda,0xc8,0xf3,0x6f,0x34,0x25, + 0xa9,0xf3,0x13,0x11,0x4e,0xd4,0x37,0x90,0x7c,0x54,0x43,0xcf,0x5,0x31,0x52,0x2f, + 0x8f,0xb0,0xd9,0xe5,0xbf,0x9a,0x44,0xa7,0xa9,0xc5,0x1,0x57,0x77,0x77,0x1c,0x4a, + 0xaa,0x8a,0x19,0xba,0xe7,0x4a,0x5a,0xeb,0x13,0x5c,0x61,0x5c,0x59,0x3,0xe4,0xbb, + 0x4d,0x5d,0xf0,0xe0,0xcf,0xd1,0xe7,0x7c,0x70,0xf0,0x16,0x30,0x1d,0x3f,0xd1,0xf5, + 0x5d,0xed,0xce,0xcb,0x4c,0xbf,0x5d,0x6b,0x6d,0x45,0x5c,0xbf,0xf9,0xc5,0xd1,0xd6, + 0x3a,0xb5,0xaa,0x11,0xb2,0x6f,0xd2,0x77,0x93,0xca,0x43,0x2f,0xf9,0x85,0xdf,0xf6, + 0x68,0xa9,0x2,0x79,0xbd,0x80,0xbb,0x35,0xca,0x0,0x73,0x7b,0xb3,0x75,0xcf,0x7a, + 0xd1,0x58,0xd3,0x9d,0x2,0xc,0x71,0xdf,0x66,0x85,0xf7,0x81,0x22,0xc7,0x87,0x3e, + 0xcb,0x2f,0xb9,0xc2,0x97,0x67,0xad,0x50,0xdd,0xd8,0x59,0x79,0x86,0x44,0xc6,0x64, + 0xa9,0x15,0x5a,0xcd,0x76,0x87,0x8b,0xa,0xa2,0x92,0x23,0xb5,0x4,0xf6,0x8a,0xe5, + 0xf2,0x82,0xb8,0xb5,0xd8,0x91,0xa8,0x8c,0x1e,0x20,0xd3,0x8c,0x88,0xce,0x54,0x51, + 0xd8,0xe3,0x57,0xf3,0xf5,0x32,0xa6,0x68,0x4e,0xaf,0xb7,0xde,0xba,0xce,0x1a,0xd4, + 0x1,0x51,0xe9,0x76,0x96,0x14,0xee,0x90,0xee,0xa5,0xf,0x76,0xd4,0x67,0xc2,0x77, + 0xcb,0x74,0x22,0x74,0x1b,0xaf,0x79,0xbb,0x46,0xd,0xd6,0x34,0xb5,0xaf,0xd6,0xfb, + 0x10,0x7f,0x1f,0x36,0x54,0xf3,0x4a,0x75,0x9c,0x4c,0x18,0xd1,0xa9,0xef,0xa4,0xf1, + 0x9f,0x19,0xd9,0xa6,0x5d,0x4a,0x2d,0x94,0x48,0xd0,0xeb,0x20,0x5,0xf3,0xb7,0x4d, + 0x94,0x4e,0xe3,0x33,0xe2,0x87,0x8e,0x26,0x4f,0xbc,0x7c,0xb9,0xa9,0xa0,0x2a,0x3f, + 0xfd,0xe9,0xd7,0x6a,0xe4,0x8a,0xeb,0xba,0x91,0x4a,0xad,0xc,0xaf,0x92,0xbc,0x9f, + 0x8d,0x6d,0xfe,0x94,0xd,0x8f,0xe1,0xfb,0x90,0x43,0xe5,0x2f,0xb0,0x3a,0xd1,0x23, + 0x91,0xa4,0xc7,0x6b,0x45,0x0,0x36,0x7,0x2a,0x2c,0x29,0x40,0xcd,0xdf,0x5b,0x39, + 0x56,0xbb,0xed,0x1f,0x2c,0x7d,0x0,0xcb,0xae,0x4c,0xb6,0x2,0xf5,0x1,0xe,0x46, + 0x8d,0xc3,0x46,0xde,0xed,0xff,0xc3,0xc3,0x93,0x25,0x2d,0x46,0x4e,0x56,0x84,0x33, + 0xd3,0xd,0x2e,0x25,0xdc,0x72,0xb9,0xb1,0xcc,0x9,0xb0,0x58,0x51,0x44,0x9e,0x7c, + 0x25,0xd7,0xcf,0x8d,0x12,0xcd,0xaf,0xc6,0x4,0x33,0x3f,0x63,0x8d,0xc6,0x5c,0x6, + 0x96,0x7f,0xf5,0xb,0x4b,0x5e,0x36,0xf9,0x7d,0x32,0x76,0x9e,0xd1,0xd6,0x31,0x72, + 0x4b,0x3d,0xf6,0xc9,0xd5,0xc4,0x2a,0x7d,0x34,0x2f,0xed,0xbf,0xd9,0x88,0xb8,0x3c, + 0x10,0x36,0xa,0x87,0x0,0x2e,0xbf,0xa2,0x32,0x25,0x28,0xc5,0x51,0xd9,0x39,0xc7, + 0xcd,0x6d,0x4e,0xf9,0x35,0x8c,0x7,0xbc,0x59,0x9,0x53,0x1f,0x25,0x93,0x6f,0xfc, + 0x83,0xdb,0xd,0x2f,0x9b,0x1c,0x94,0xea,0xde,0x90,0x26,0xc6,0xa3,0xa3,0x37,0x12, + 0x1c,0x41,0x7e,0xa6,0x55,0xe2,0x21,0xd7,0xe9,0x5f,0x3f,0x2a,0xef,0x50,0xb5,0xf8, + 0x5,0x6b,0x78,0xeb,0x90,0x6f,0xa5,0x2f,0x39,0x8f,0x85,0x25,0xa3,0xb2,0x2e,0x2d, + 0x16,0xb5,0x82,0x43,0x79,0x12,0x9f,0x5b,0xb5,0xf5,0x74,0x75,0xeb,0x9d,0xad,0x88, + 0xdb,0x6d,0xb3,0x24,0xb8,0xf2,0xd6,0xc3,0x3f,0xd5,0x60,0xb9,0x5a,0x9e,0x1c,0x2d, + 0x30,0x8d,0xfb,0x6,0x9,0xab,0xf1,0x3d,0x8f,0xfb,0x91,0x87,0xe5,0xee,0xd5,0x9b, + 0xdc,0xd1,0x71,0x18,0x6b,0x81,0xa3,0x83,0xab,0x6f,0x5,0xa7,0xd2,0xbe,0x10,0xce, + 0xad,0x3d,0x56,0xb8,0x1d,0xf,0xbb,0xd6,0xd3,0x6,0x62,0x52,0x90,0xf2,0x9,0xeb, + 0x81,0xf6,0x0,0xde,0x2b,0xb3,0x41,0x49,0xbf,0x5,0xef,0x19,0xb9,0x83,0x63,0x8a, + 0xfc,0x1e,0x68,0xf1,0xc3,0x3c,0x32,0x32,0x2b,0xcc,0x88,0x8c,0x99,0xe1,0x6,0x9f, + 0x17,0xc2,0x9,0x7d,0xe7,0xbd,0xcd,0x42,0xab,0x70,0x77,0x2b,0x7b,0xce,0x17,0xf9, + 0xb9,0xf0,0x33,0x19,0x3b,0xce,0xb0,0x16,0x12,0xe0,0x36,0x9a,0xb4,0xe9,0x18,0x63, + 0x3a,0x1e,0xbf,0xfe,0x8,0xab,0xbe,0xb3,0x7a,0x78,0x92,0x1,0x2c,0xa7,0xeb,0x9f, + 0x9c,0xe3,0x65,0xd,0xc2,0x5c,0xd0,0x9d,0x80,0x97,0x88,0xda,0xa6,0x47,0x2,0xf3, + 0x5e,0x65,0xc4,0xe0,0x7d,0x30,0xdf,0x66,0x8f,0xf7,0xc0,0xc5,0x7,0x8d,0x5b,0xff, + 0xb8,0xec,0x83,0xdc,0xd5,0x8d,0xd1,0x61,0xcc,0x7b,0xcb,0xf4,0xe7,0xd3,0xfb,0xf4, + 0x3d,0x21,0x70,0xf1,0x3e,0x3f,0x86,0xd3,0xf9,0xda,0x6f,0x9c,0xbd,0x68,0x14,0x8e, + 0x86,0xd1,0x68,0x80,0x3c,0x78,0xc9,0x27,0x2c,0x8c,0x9d,0xbe,0xe3,0x74,0xb1,0xd7, + 0x38,0xec,0x47,0xfa,0xf6,0x7f,0x98,0xfd,0x0,0x80,0x83,0xfd,0x0,0x11,0x70,0x71, + 0x3f,0xb3,0xa4,0x14,0xed,0xe0,0xac,0xd,0xb0,0xa,0x3,0x3d,0x2c,0xb9,0x38,0xb3, + 0x45,0xb6,0xd2,0x9b,0xe,0xbe,0xe6,0x4f,0xee,0x91,0xdf,0xbf,0x27,0xa3,0x29,0x1d, + 0xa4,0xef,0x98,0x41,0x1d,0x39,0x92,0xfc,0xf0,0x4b,0x75,0xcb,0x3,0x2b,0x6f,0x55, + 0x55,0x81,0xdc,0x7c,0x77,0x2c,0xa9,0x1c,0x67,0x78,0xb3,0x94,0x6b,0x7c,0x78,0x98, + 0x52,0xf1,0x7f,0xeb,0x12,0x46,0xe6,0xb,0xac,0xce,0xf5,0xec,0x4d,0xee,0xec,0x30, + 0x94,0xc4,0xc4,0x4c,0xd5,0x81,0x95,0x7c,0x81,0xb9,0x3e,0xfd,0xa0,0x3b,0xa0,0xe0, + 0xea,0xc8,0x25,0x16,0xb8,0x1d,0x63,0x43,0xea,0x5c,0x2f,0x9b,0x83,0xb0,0x32,0x6c, + 0xb8,0x1d,0x52,0x50,0xa2,0x2,0x80,0x98,0x5e,0xd6,0x3e,0xe4,0x16,0xad,0xac,0x1d, + 0xa1,0xbf,0x0,0x0,0xa3,0x4e,0x2b,0x72,0x1f,0x5,0x8e,0x7f,0xf8,0xba,0xb8,0x78, + 0x87,0x47,0xaa,0x51,0x43,0x8a,0xbc,0x3a,0x6f,0xad,0x18,0x37,0x97,0xfd,0x9f,0xd6, + 0xa4,0xb7,0x70,0xa,0x12,0x7c,0x6f,0xfc,0xa4,0xfb,0x2d,0xeb,0x35,0x73,0x68,0xb4, + 0x1e,0xa7,0x72,0xe5,0x2b,0xb1,0xc6,0xb7,0x23,0x57,0x7c,0x6d,0xea,0xb3,0x8d,0xbc, + 0xfe,0x9b,0xe0,0x24,0xd1,0xa2,0x27,0x27,0x8,0x80,0x2d,0xb0,0x8e,0x63,0xc7,0xdd, + 0xad,0x85,0x64,0xbd,0xd3,0x35,0xf4,0x6,0xf1,0xb8,0x20,0x99,0xf9,0x6c,0xca,0x9e, + 0xb,0x46,0x55,0xd8,0x8d,0x1c,0x55,0xe5,0x3,0xd4,0x71,0x59,0xb7,0x4b,0x7,0x8c, + 0xcb,0x5a,0xe,0x15,0x15,0xb6,0xdf,0xab,0x27,0x2c,0xce,0x63,0x37,0xc,0xad,0x12, + 0x7f,0x15,0xb3,0x1f,0xe5,0xe8,0x25,0xaf,0x30,0xdb,0x81,0x4b,0x7b,0xd3,0xe4,0x4d, + 0xea,0x98,0x35,0xd6,0xa4,0x9c,0xc9,0x26,0xcb,0x95,0x16,0xf3,0xc5,0xe1,0xfb,0x66, + 0x5f,0x93,0x1e,0x36,0x9f,0xda,0x44,0x49,0x9d,0x30,0x37,0x89,0xfc,0x7b,0xb6,0x5c, + 0x58,0x81,0x2b,0x6f,0x7d,0xe7,0xe3,0x6,0xa4,0x4e,0xfb,0x29,0xc6,0xa1,0xa7,0xe4, + 0x3c,0x58,0x35,0x8e,0x99,0x59,0x6d,0x52,0x72,0x80,0xaa,0x33,0x3d,0x13,0xc9,0x93, + 0x9d,0x6,0x11,0x25,0x7e,0x2c,0x1,0x95,0x83,0x7,0x58,0x39,0xe4,0x9d,0x7e,0x37, + 0xb2,0xd4,0x6f,0xc7,0x56,0x70,0xef,0x43,0xeb,0x74,0xbd,0x16,0x25,0xc9,0x9f,0x6, + 0x81,0x96,0xe1,0x6,0xbc,0x97,0x15,0xaa,0xae,0x10,0x56,0x41,0x2e,0x4,0x7d,0x9e, + 0x7b,0x82,0x4f,0xad,0xe2,0xea,0xcd,0xc8,0x70,0xb5,0x3c,0xc9,0xcd,0x14,0x84,0xdd, + 0xe9,0x9,0x3d,0x38,0xe4,0xe7,0x75,0xf,0xb1,0x97,0x2a,0x8f,0x68,0xff,0xa7,0xec, + 0x65,0xeb,0x4,0x8c,0xf9,0x8,0x4f,0xa0,0x1,0x3c,0x48,0x87,0x35,0x4f,0x72,0x96, + 0x7e,0xa8,0x2f,0xd5,0xbd,0xd2,0x24,0x7e,0xf2,0xfd,0x96,0x34,0x92,0x8,0x9,0x21, + 0x1c,0x98,0x6b,0xee,0x1f,0x82,0xe7,0xc8,0x6c,0x50,0xd8,0x3e,0xed,0x71,0xcd,0x80, + 0x7,0xda,0x8e,0xc3,0x21,0x3f,0x5,0x5a,0x4,0x2b,0x30,0x74,0x6b,0x8c,0xf4,0xca, + 0xfb,0xb9,0x80,0x3f,0xeb,0x0,0x31,0x6e,0xdd,0xcf,0x3c,0xe4,0x13,0x2e,0x82,0x8b, + 0x37,0xc8,0x97,0xe1,0xdd,0x42,0x35,0x28,0x3,0x5e,0xca,0x2e,0xec,0x9d,0xbc,0x36, + 0x23,0x87,0x3e,0xa5,0xdb,0x96,0x7b,0x74,0xfb,0x71,0x8b,0x16,0xde,0xa4,0x63,0xe, + 0xfb,0xa1,0x11,0x97,0x2b,0xac,0x43,0x8,0xb5,0xc1,0xd4,0x96,0xff,0x15,0x19,0x9d, + 0xa5,0xa2,0x82,0xda,0x72,0x55,0x84,0x37,0xfc,0x6c,0x24,0xb9,0x67,0xf2,0x5,0xe1, + 0xbb,0x5a,0xe2,0x41,0x76,0x73,0x72,0xf5,0x67,0x49,0xe4,0xe1,0xa,0xae,0xc,0xfd, + 0xf4,0xeb,0x3a,0xcc,0x93,0x45,0x6f,0x17,0x17,0x72,0x54,0x9a,0xa1,0x44,0x57,0x3, + 0x4f,0xe4,0xfa,0x76,0xa3,0x48,0x5a,0xfc,0x38,0xd2,0xae,0xe5,0x14,0x82,0x5e,0x85, + 0x9e,0xdb,0x82,0x43,0xfa,0x95,0x1d,0x92,0x45,0xd,0xb1,0x3a,0xe4,0x59,0xf8,0xf9, + 0xd1,0xab,0xbe,0xb3,0xc4,0xa2,0xf7,0x54,0x28,0xd9,0x95,0xa1,0xc5,0x5a,0x13,0x9, + 0x72,0x79,0x3a,0x76,0x37,0xe1,0x33,0x10,0x46,0xb3,0x82,0xe7,0x25,0x71,0xee,0x1b, + 0x81,0xbd,0x93,0xd9,0x42,0xd,0x2a,0x0,0x8b,0xbc,0xe7,0x9c,0x15,0x69,0x1a,0x30, + 0xb6,0x1f,0xe6,0x28,0x6a,0x70,0x28,0x27,0x2e,0x1f,0xb0,0xd5,0x92,0xc9,0xe0,0xc5, + 0x88,0x4,0x54,0xa4,0xef,0x73,0xa6,0xc5,0x90,0xed,0xa6,0xbf,0xcf,0xa4,0xcd,0xbf, + 0xfb,0xa6,0x51,0x81,0xa7,0x9c,0x7e,0x1d,0x61,0x66,0x33,0x9f,0xf,0x3d,0x46,0xf5, + 0x26,0xbe,0xb7,0xf0,0xc3,0xd1,0x22,0x12,0x95,0x6e,0x47,0x35,0x24,0x42,0xf9,0x56, + 0xb3,0x1d,0xa8,0x2a,0xcf,0x13,0xee,0xe6,0x92,0x33,0xee,0xdf,0x76,0xf8,0x28,0x72, + 0xe6,0xdf,0x72,0x61,0xf,0xae,0xc,0x7d,0xf8,0xf9,0xe6,0xc4,0x93,0xf8,0x6e,0x8, + 0x28,0x27,0xf2,0xba,0x60,0xdd,0x2c,0x87,0xd,0xcd,0x6e,0xe1,0xe1,0x2a,0x6e,0x12, + 0x2d,0x6e,0xc7,0xad,0x66,0xbb,0x41,0x1e,0x68,0x8d,0xc4,0xc3,0xb3,0x8c,0x37,0x88, + 0x85,0x7d,0xfc,0xe5,0x7e,0xf1,0x1c,0x46,0xae,0xb6,0x36,0xdc,0xae,0xc1,0x73,0x46, + 0xf,0x24,0xab,0x84,0xb5,0x50,0x76,0xcd,0x42,0x7a,0x0,0x7f,0xe1,0x9,0xb0,0xe6, + 0x61,0x4c,0x27,0x6d,0x3e,0x66,0x39,0x23,0x9,0x12,0x46,0xa,0xa8,0x1f,0xcd,0x7d, + 0x19,0xe9,0x96,0xf9,0x82,0xe9,0xeb,0x58,0x3f,0xec,0x6f,0xd,0x30,0x51,0x39,0x49, + 0x2b,0xd2,0xd8,0x6f,0xfa,0x58,0xf7,0x9c,0xf9,0xaa,0x11,0x82,0xeb,0x99,0x73,0xdf, + 0xc9,0x1b,0xf0,0x75,0x2b,0x54,0x38,0xd6,0xee,0xb2,0xc,0x17,0xd4,0xcf,0xf9,0x1, + 0x69,0x1d,0xa1,0x17,0x84,0x6f,0x1a,0xf7,0x59,0x6f,0x39,0xdb,0x91,0x74,0xe5,0x9b, + 0xda,0x7a,0x6,0x96,0xe0,0x92,0x7,0x18,0xb0,0xa4,0xbd,0x3,0x1f,0x36,0x2a,0x35, + 0xe0,0xca,0xd0,0x41,0x19,0x3,0xc,0x64,0x3d,0x48,0x33,0xb2,0x69,0x8d,0x75,0x37, + 0xec,0x3c,0x56,0x15,0x7,0x1e,0xb0,0xe2,0x31,0xc3,0xfb,0xbc,0x1d,0x47,0xd,0xdd, + 0x61,0xa9,0x85,0x8f,0x50,0x3,0x40,0x1f,0x3d,0xa0,0xfe,0x13,0x1c,0xd2,0x56,0xad, + 0xb9,0x69,0x3e,0x54,0x16,0x2c,0x4c,0xcc,0x5a,0xa,0x3d,0xc,0x4a,0xf,0x24,0x80, + 0xf7,0xb8,0xe2,0x65,0x62,0x15,0xc2,0x43,0xf,0xb9,0x68,0x38,0x87,0x2d,0xe8,0xd8, + 0xd2,0xb9,0x20,0x56,0xf3,0x60,0x21,0xf4,0xaa,0x5f,0x36,0xd6,0x79,0x1,0xac,0xc5, + 0x5a,0xb8,0xea,0x88,0xb9,0xc,0xdc,0x4b,0x3e,0x36,0xc0,0xc8,0x84,0x60,0x84,0xba, + 0xa7,0x6c,0x3d,0x6e,0xd,0xce,0x31,0x51,0x39,0x9d,0xe7,0xa2,0x0,0x8f,0x11,0x7d, + 0x46,0x2b,0xec,0x39,0xa4,0x3a,0xe4,0xdb,0xeb,0x93,0x4b,0xc9,0x4b,0xf3,0xf4,0xcb, + 0x51,0x5,0xdd,0x72,0xec,0x1d,0x96,0x3,0x58,0x28,0x82,0xd1,0x0,0x96,0xbf,0x4c, + 0x5,0x65,0x26,0xf7,0x4a,0xab,0x12,0x2,0x10,0x29,0x6d,0xe0,0xa,0xfa,0xc2,0x81, + 0xa6,0xc6,0xa1,0x7c,0x57,0x68,0xdd,0xb7,0x72,0x22,0x7e,0x4f,0xef,0xd9,0xfb,0x2d, + 0xb7,0xf8,0x51,0xc1,0xd6,0x6c,0xf0,0x36,0x55,0x4f,0x7a,0x27,0x0,0x82,0xf4,0xef, + 0x7,0xbd,0xf2,0x8a,0x5e,0xa3,0x1b,0xf7,0x30,0xeb,0xeb,0x87,0x64,0xec,0xb8,0xd9, + 0x17,0x91,0x27,0x34,0x7d,0xdb,0x49,0x4b,0xbd,0x47,0xdc,0x84,0x7d,0x1a,0x97,0x5b, + 0x41,0x34,0x1c,0x56,0x15,0x56,0x90,0xa2,0x85,0x5b,0x91,0xdc,0x6c,0xb5,0x35,0x32, + 0x6a,0xe5,0xb7,0x79,0x89,0x69,0x1d,0xf2,0x4b,0xa8,0x24,0x33,0xfb,0xb0,0xf7,0xcc, + 0x7b,0xf3,0x8c,0x86,0x1,0xdd,0xfe,0x45,0xe5,0xd3,0x5a,0x9d,0xcc,0x6f,0x8f,0x83, + 0xfc,0xaf,0xf2,0x2d,0x67,0xfa,0xae,0xd0,0xd3,0x38,0xba,0x2c,0x53,0x7a,0x5f,0xa5, + 0xed,0x7c,0x37,0xc2,0xc4,0x20,0xdc,0xe4,0x87,0xa5,0xa9,0x9e,0xef,0xee,0x36,0xd1, + 0xf5,0x23,0xa,0x6a,0xac,0xe8,0xfd,0xd6,0xa,0x8f,0xe8,0x3a,0xe1,0x92,0xdb,0xf3, + 0x22,0x67,0xc2,0xb0,0xa2,0xfa,0xae,0x34,0x2,0xac,0xb,0xff,0x45,0x90,0x1a,0x6d, + 0xa7,0xc1,0x40,0x1f,0xf,0xf1,0x6,0x58,0x63,0x95,0xdb,0x71,0xbe,0x79,0x1f,0x9b, + 0x8e,0x11,0x10,0xe5,0x45,0xd,0xdb,0x41,0x1a,0xf4,0x5c,0x45,0xaa,0xb6,0x5b,0xc0, + 0xaa,0x59,0x6a,0x75,0xbc,0xc6,0xdd,0x24,0x79,0x23,0x89,0x9f,0xfc,0x0,0xe3,0xcf, + 0xb2,0x42,0x2,0x70,0x9e,0xaa,0xc8,0xed,0xff,0x18,0x65,0xfa,0xcf,0x85,0xc7,0xbe, + 0x9a,0x59,0x91,0xf5,0xeb,0x44,0xa5,0x22,0x2a,0x30,0x51,0xf5,0x48,0xd7,0x7,0x5a, + 0x76,0x14,0x87,0x2,0x22,0xd4,0xda,0xcd,0x20,0xf1,0x4,0x19,0x32,0x44,0x6b,0x76, + 0x7b,0xce,0x31,0x62,0xb7,0x45,0x42,0x55,0x1,0x16,0x6b,0xc4,0xc8,0x97,0x0,0xa4, + 0xb5,0x9e,0x78,0x9f,0xe9,0xef,0xe3,0xa9,0x88,0x44,0x42,0x7b,0x5e,0x80,0x75,0x3b, + 0x8a,0x38,0xac,0xb2,0x2e,0xc6,0xac,0xfe,0x9e,0x94,0x8f,0x9d,0x9,0xf,0xf8,0x59, + 0x96,0x74,0x1d,0x60,0xf,0x48,0x2e,0xfe,0xdd,0x5,0x18,0x4b,0x80,0x16,0x4d,0xd8, + 0x42,0xd7,0xc9,0x21,0xd6,0x41,0x85,0x82,0x72,0x50,0x41,0x58,0xf1,0x6c,0x41,0x6f, + 0x5a,0xa,0xc2,0x5f,0xe0,0x53,0x97,0xe7,0x20,0xd0,0x78,0xa1,0x9e,0x7c,0xe5,0xb2, + 0x52,0x9,0xb0,0xa0,0x20,0x4a,0x65,0x6,0xad,0x28,0x7d,0xb,0x8b,0xc,0xb0,0x94, + 0x83,0x35,0x3b,0x2e,0x71,0x5b,0x15,0x5c,0x85,0xbb,0x76,0x92,0x9e,0x36,0x42,0xbd, + 0x7d,0xb4,0x75,0x8b,0x6a,0x3f,0x56,0x79,0x63,0x5,0x7d,0x42,0x67,0x8a,0x7f,0x83, + 0x1a,0xc3,0x4f,0x6c,0x4e,0xd7,0x51,0xa3,0xfb,0x1,0x34,0xc2,0x99,0xa9,0x36,0x1f, + 0xb2,0xcd,0xf4,0xf6,0x42,0x7e,0xde,0x40,0x6d,0x7a,0x78,0xb0,0x2f,0x9e,0x3d,0x69, + 0xee,0x1,0xd3,0xbd,0xaf,0x7a,0x75,0xd2,0x86,0x0,0x2f,0x40,0x53,0xf1,0x39,0xb8, + 0x40,0x58,0x26,0x9c,0xe2,0xab,0x22,0x12,0xd5,0xab,0xf4,0xff,0xac,0x4,0xc2,0x91, + 0x90,0x5f,0xbf,0xc7,0x2a,0xbd,0xb2,0x9a,0x5e,0x14,0xb4,0xd6,0x53,0xb7,0xfb,0xd8, + 0x7,0xfb,0xc2,0x8a,0x94,0xd4,0x4a,0xa,0x70,0xe2,0x50,0x5e,0xa7,0x40,0xf6,0x4b, + 0x46,0xf6,0xeb,0xc9,0xf,0x56,0x48,0x9d,0xae,0xcb,0x55,0xb4,0xf9,0x4a,0xbb,0xe5, + 0x94,0x25,0x6d,0x7,0xf8,0xba,0xac,0xc5,0xe2,0x6e,0x2d,0xd7,0xe3,0x72,0xc,0xce, + 0x7d,0x4f,0x47,0x95,0x5a,0x80,0x85,0x66,0xd4,0xf4,0x1d,0xcf,0x84,0xe,0xa4,0xb2, + 0xe6,0xb1,0x6e,0x2b,0xd0,0x18,0x94,0x46,0x45,0xbe,0x12,0x42,0x55,0x36,0x51,0xfe, + 0xc8,0x2b,0xdc,0x73,0xd8,0x1f,0xee,0xa9,0x92,0x50,0x34,0x83,0xad,0x9a,0x30,0xff, + 0x62,0xed,0xce,0xcb,0xd4,0x86,0xbd,0x56,0x33,0xc6,0x71,0xac,0x85,0xee,0x59,0x2f, + 0x31,0x6f,0x5,0x38,0x85,0xac,0x3c,0xbe,0x28,0x60,0xd0,0xbd,0x83,0x77,0xe7,0xc9, + 0x57,0xda,0x62,0xae,0x47,0x16,0x84,0x9b,0x3a,0xbf,0xce,0xc0,0x0,0xf3,0xaf,0xee, + 0x81,0x67,0xc8,0xa,0xc0,0xa5,0x41,0xcf,0xd5,0x2a,0x5,0xb3,0x3f,0xe5,0xf3,0x9c, + 0x4b,0xf1,0xbe,0x0,0x96,0x96,0x5a,0x27,0xb7,0xab,0x64,0xc0,0xe2,0xf,0x89,0x7d, + 0xf8,0x4e,0x16,0x36,0xc4,0xa5,0xc1,0x9f,0xbd,0x41,0xd7,0x55,0x58,0xb5,0xda,0x31, + 0x4b,0xc1,0x97,0x5,0x12,0x67,0xb4,0x0,0x8b,0x1e,0xbd,0x97,0xe5,0xbf,0xf5,0x5f, + 0xf8,0xbe,0xe9,0xd5,0xa4,0xfe,0x28,0xf2,0x74,0x83,0xd2,0xc2,0xaa,0x94,0x7a,0xb0, + 0x86,0x63,0x70,0xa6,0x2d,0xec,0x5d,0x2a,0xc1,0xd5,0xef,0xc7,0x2b,0x83,0xd9,0x1d, + 0xb9,0x25,0xaf,0x86,0x30,0x71,0x79,0x22,0xcb,0x63,0x5b,0xf2,0x31,0x7,0x44,0xa1, + 0xf4,0x5e,0x19,0xcc,0xed,0xe8,0x91,0x49,0xff,0xdd,0x6e,0xea,0xc3,0x7c,0x7c,0x82, + 0xa0,0x43,0x97,0x7d,0x6e,0x78,0x89,0x52,0xac,0xe6,0x91,0x45,0x4b,0x23,0x1,0x8d, + 0x7a,0x3,0x21,0x95,0x65,0x3d,0x34,0x95,0xff,0x35,0x4d,0xde,0x64,0x9,0xc6,0x6b, + 0x9b,0xd6,0x2f,0x6f,0x67,0x3e,0x17,0xde,0x2b,0xac,0x50,0x58,0xc0,0x95,0xab,0xdf, + 0xfc,0x79,0xfd,0x36,0xab,0x5a,0x93,0xf8,0x82,0xfa,0x0,0x97,0x55,0x69,0x2c,0x57, + 0xa1,0x0,0xe4,0x38,0x7a,0xf9,0x1d,0xfb,0xb3,0x72,0xa9,0x3,0x58,0x8b,0x36,0x74, + 0x34,0x2a,0x61,0xd2,0x42,0x7,0xb0,0x94,0xbd,0x48,0x3e,0x94,0x77,0x9f,0xe5,0x1b, + 0x2e,0x4,0x7,0x12,0x3c,0x44,0xf4,0x50,0xfa,0xc0,0x13,0xbe,0x2,0xf9,0x1e,0x9d, + 0x53,0x2b,0x87,0xdc,0xc2,0x49,0x35,0x6,0x77,0xd7,0x49,0x4f,0xa7,0x82,0xe8,0x19, + 0x75,0xad,0xd0,0xb0,0x9c,0xe5,0x76,0xb4,0x45,0x6e,0x87,0x17,0xcd,0x4a,0xb1,0xbc, + 0xf4,0x1a,0xdd,0x44,0x57,0xd7,0xf3,0xa6,0xbf,0xf,0xbc,0x12,0x7a,0x31,0xc1,0xe8, + 0x7c,0x9e,0x75,0xa0,0xd6,0xcb,0xf4,0x23,0xbe,0x36,0xb9,0x5a,0x5e,0xd1,0x56,0xc, + 0x1d,0x3e,0x98,0xc7,0x9b,0x4b,0xbe,0x1e,0x98,0x25,0xd8,0xd4,0xa9,0xf3,0x13,0x4b, + 0x15,0xb8,0xfa,0xfc,0x9b,0xda,0xa4,0x5c,0x74,0x6,0xb8,0x5c,0x8e,0x6,0x76,0x3, + 0x2e,0xac,0x3a,0xc9,0xf5,0xdb,0x25,0x49,0xeb,0xf9,0x86,0xb,0x81,0x22,0xf1,0x5e, + 0xcf,0x45,0x48,0xf6,0x5a,0xaf,0xf,0xa1,0xbd,0x4,0x6f,0xd4,0x1c,0xb8,0x4e,0xdb, + 0x76,0x2,0x39,0x62,0x6e,0xc6,0x1,0x97,0x5d,0xf8,0x92,0xc2,0xe,0xf9,0xc5,0xe6, + 0x36,0x2c,0x9f,0xb8,0xf1,0xa8,0xe1,0x59,0xbb,0x36,0xc0,0xb,0x10,0x98,0xf9,0x89, + 0x15,0x18,0xb0,0x51,0x62,0xcf,0xaa,0x75,0x51,0x55,0xea,0x4b,0x50,0xe6,0x6e,0xa1, + 0x6e,0x10,0x5c,0xb9,0xfa,0x91,0x4f,0xa8,0x7a,0x8a,0x63,0xb8,0xf8,0x90,0x66,0xd3, + 0x2a,0x51,0x10,0x82,0x66,0xd1,0x64,0xd7,0xfd,0xd1,0xa5,0x2,0x5c,0x9d,0x3c,0x55, + 0x81,0xc4,0xe,0x1a,0xa3,0xea,0xf9,0x1b,0xe3,0x43,0x36,0x76,0x51,0xae,0x56,0xf8, + 0x1d,0x8,0x63,0xf1,0xd,0x17,0x64,0xde,0xab,0xf5,0x47,0x74,0x82,0x49,0xe9,0xe9, + 0xec,0x1,0x4f,0x89,0xa4,0x5f,0x3b,0x69,0x5,0x76,0xf1,0xd2,0xa0,0xad,0xc6,0xdf, + 0x83,0x10,0x9c,0x3b,0x7,0xf5,0x85,0x43,0xde,0x81,0x71,0x47,0xe3,0x59,0x4b,0x90, + 0x71,0x8a,0x72,0xf7,0x0,0x2f,0x90,0x6f,0xa0,0xca,0xc9,0xa,0xdc,0x52,0xd5,0x12, + 0x16,0x22,0xd7,0xed,0xed,0x42,0x2e,0x6c,0x87,0x9b,0xf4,0xdd,0xa0,0xf2,0xf5,0xc9, + 0xd5,0xca,0xa,0xfb,0x80,0xe8,0x2,0x5d,0xcf,0x4f,0x72,0x10,0x55,0x68,0x2e,0x16, + 0x98,0xbb,0xe5,0x7f,0x23,0xa3,0x25,0xf2,0xc0,0x33,0x2d,0xc2,0x1a,0x5c,0x9d,0x3a, + 0x5d,0x9e,0xf4,0x9e,0x3c,0xc4,0xf0,0x7c,0xdc,0x1d,0xda,0x22,0x1,0xe5,0x4a,0xfc, + 0x1e,0xab,0x36,0xe1,0xc,0x57,0x5,0x1b,0xbe,0xde,0x1e,0xe5,0x1c,0x6b,0x6e,0xee, + 0x59,0xa7,0x19,0x9d,0x31,0xde,0xdd,0xb3,0x5e,0xe4,0xe3,0x14,0x68,0xf5,0xcf,0xe6, + 0xdf,0x89,0x96,0xac,0xac,0xec,0xcd,0x75,0xc0,0xff,0x88,0x44,0x6c,0xf3,0x2b,0x1b, + 0xb7,0x6b,0x9c,0x6d,0x81,0xb0,0xf6,0x83,0x3c,0x57,0x54,0xfe,0x8b,0x1e,0x73,0xbb, + 0xe9,0xe3,0xed,0xf1,0xc8,0x15,0x56,0x6d,0xe5,0x50,0x6e,0xc4,0xbc,0x80,0xc1,0x9e, + 0xaf,0x53,0xae,0x56,0xd5,0x36,0xa9,0xf,0x6a,0xde,0x2b,0xef,0x56,0x74,0x5c,0xa, + 0xda,0xd8,0xd2,0x10,0xf4,0xee,0x8b,0x70,0x4a,0xe4,0x86,0x5d,0xf1,0x44,0x55,0xc3, + 0xf,0x5c,0x7d,0xf3,0x43,0x4d,0x12,0x3b,0x28,0xc5,0x30,0x64,0x1f,0x30,0x3e,0xa2, + 0xd0,0x56,0x61,0x3e,0x8b,0x16,0x23,0x59,0x16,0x61,0x3b,0x2f,0x2d,0xda,0x59,0x79, + 0xc6,0x48,0x6c,0x5f,0x98,0xf3,0x22,0x20,0x2d,0xc3,0xd7,0x27,0xac,0xff,0x95,0x8f, + 0x53,0x20,0x0,0x96,0xae,0xd7,0xc6,0x49,0xeb,0x1,0x60,0xcf,0xb3,0xa2,0x1,0x4f, + 0x88,0x2a,0xa3,0x39,0xc6,0x37,0x61,0xea,0xa3,0xa6,0x3,0xec,0xa,0x71,0xb3,0xdd, + 0x8c,0xfe,0x22,0xb0,0xfc,0xab,0x91,0x78,0x9f,0x7e,0xb,0xde,0xb3,0x4e,0xb5,0x55, + 0x61,0xed,0x44,0x44,0x57,0x47,0x7c,0x1f,0xfa,0x6e,0xf2,0xb5,0xca,0xd5,0x8a,0x3a, + 0x76,0xed,0x4f,0x5a,0x74,0xc1,0x2e,0xdf,0xc7,0x81,0x53,0xd1,0x3c,0x32,0x7d,0x6c, + 0xa2,0x74,0x2,0x1b,0x7c,0x40,0xfa,0x40,0xf2,0xd3,0xaf,0xd5,0xc2,0x2,0x58,0xb9, + 0xdd,0x36,0xb2,0xf5,0xce,0x56,0xa4,0x4a,0x5c,0x9a,0x51,0x3e,0xbc,0x2f,0xe4,0xa4, + 0x78,0x5a,0x68,0xf5,0x2c,0xc8,0x23,0xf9,0xa6,0xb,0x9e,0x8e,0x5e,0x79,0x98,0x44, + 0x88,0x2e,0x55,0x70,0xca,0xaf,0xe5,0xe9,0xb,0x89,0x70,0x4f,0xdb,0xf9,0x9c,0x6f, + 0x2c,0x50,0x62,0xd1,0xcc,0x17,0x8c,0xd2,0xea,0x5,0xb9,0xf6,0xbf,0x6c,0x85,0x2, + 0x82,0x94,0xb5,0x3f,0x1a,0xe1,0xc1,0x79,0x1,0x86,0x7,0x11,0xee,0x24,0xe9,0x3b, + 0x4e,0x9b,0x3e,0xe6,0x97,0xf,0xbc,0x89,0xb0,0xbe,0xa0,0x7e,0xf0,0xf1,0xd9,0x9c, + 0xae,0x2f,0x6b,0x77,0xb9,0x96,0x5f,0xdc,0xb8,0x5a,0x92,0x36,0x7,0x6b,0xd3,0x26, + 0xba,0xfe,0x66,0x4,0xbe,0x5c,0x8a,0x1a,0x2e,0x94,0xa3,0xa8,0x61,0x7b,0x13,0x6, + 0xe,0xd5,0x85,0x8b,0x37,0x74,0x64,0x74,0x7,0x56,0x5,0x57,0x2f,0xbe,0xd9,0x84, + 0x35,0xaa,0x66,0x44,0x78,0xa2,0x74,0x9a,0xb1,0xd3,0x1b,0x15,0x67,0x21,0x5,0xa3, + 0x1a,0x19,0x63,0xe2,0x9c,0x3,0x7c,0xe3,0x5,0x91,0x58,0x52,0xe3,0xbc,0x72,0x1d, + 0x17,0xec,0x19,0x4d,0x73,0xae,0xcb,0x99,0x35,0xac,0x12,0xee,0x9,0x77,0x5a,0x6, + 0xdc,0x3e,0xa9,0x1e,0xc8,0x3,0x60,0xe9,0x8d,0x34,0x32,0x26,0xcb,0xf4,0x2,0x2, + 0x74,0x1c,0xd0,0xab,0xed,0xda,0x4,0x58,0x80,0xf2,0xb3,0x15,0xc2,0x9d,0x5e,0x5c, + 0x63,0x8f,0xf8,0xe9,0x19,0x67,0xc4,0xa8,0xc9,0xf3,0xdf,0xe1,0x6b,0x96,0xab,0xa5, + 0xf8,0xd0,0xd0,0x9,0x44,0x8f,0x2e,0x4c,0xe6,0x60,0xa9,0xd8,0x42,0xd,0xaf,0x43, + 0x9a,0x6d,0x13,0xe5,0x93,0x18,0xcc,0x8a,0xb1,0xe9,0xaa,0x7c,0x4d,0xf,0xf2,0xc5, + 0xb7,0xb5,0x2d,0x93,0x67,0x75,0xc7,0xa3,0x22,0x49,0x18,0x39,0xca,0xb8,0x89,0xab, + 0x8c,0x11,0x17,0x21,0x8e,0x92,0xab,0xbe,0x5c,0xa7,0xb5,0xc7,0xf9,0x1f,0xdf,0x78, + 0x41,0xea,0x7d,0x56,0xa7,0xcb,0x72,0x50,0x32,0x5c,0x60,0xbd,0x1d,0xf3,0xe1,0x6c, + 0x4b,0x9e,0xff,0x2e,0x1f,0xaf,0x0,0x5c,0xfb,0x1a,0xed,0x85,0xeb,0x57,0xd6,0x8e, + 0xc3,0x7,0x5f,0xd4,0xa5,0xfd,0x6f,0x34,0x9f,0x5b,0x87,0x3e,0x3,0x9e,0x25,0x20, + 0x6e,0x1d,0x51,0x8e,0xc6,0x7a,0x69,0x9f,0xf6,0xb8,0xe9,0xef,0x33,0x62,0xc5,0xd7, + 0x46,0x45,0x64,0xa6,0x5f,0xcf,0xde,0x7b,0x79,0x39,0xfa,0xfe,0x5f,0xe3,0xb2,0x1, + 0xaa,0x12,0xbe,0x76,0xb9,0x5a,0x1,0x5c,0x81,0x40,0x59,0x3f,0x6f,0x37,0x73,0x8c, + 0x14,0x9c,0x1c,0xa3,0x7a,0x48,0xca,0xa4,0x40,0xeb,0x4f,0x83,0x9d,0xb7,0x73,0xca, + 0x8,0xb2,0x6e,0x77,0x3c,0xf9,0xee,0xe7,0x1a,0x25,0xa,0xaa,0xce,0x9e,0x8b,0x24, + 0x8f,0xbc,0xd0,0x8c,0xa4,0xcc,0xea,0xcb,0x3c,0x6b,0x1e,0x60,0xe5,0x90,0x9f,0x32, + 0x83,0x45,0x96,0x8e,0xc9,0x27,0x60,0xdf,0xe5,0x9b,0x2f,0x38,0xe0,0xa,0x9e,0x6, + 0x2d,0x69,0x52,0x9a,0x94,0x4f,0xf8,0x7a,0x1b,0xc2,0x3d,0x56,0x6d,0x19,0x61,0x75, + 0x45,0x43,0x67,0x1d,0x5c,0xfd,0x2d,0x44,0xcb,0x71,0x3e,0x3c,0xd7,0xed,0xb0,0xa7, + 0xe0,0x3d,0x32,0xdb,0xdb,0x13,0x19,0x93,0xa5,0x5d,0x98,0x2,0xbb,0x0,0xcd,0xc2, + 0xfb,0xe0,0xbd,0xcd,0x1e,0xfb,0x76,0xd3,0x1e,0xd1,0x43,0x9e,0x5e,0x5,0x1b,0x85, + 0xd3,0x4b,0xf4,0xc4,0x7e,0x40,0xc5,0x2c,0x72,0xd2,0xf8,0x1a,0xe6,0x6a,0x66,0x4e, + 0x64,0x2b,0xf,0xb8,0x92,0x1e,0xcc,0xe3,0xf9,0xe6,0x12,0x78,0xbe,0x91,0x9e,0x9f, + 0xf1,0xb1,0x77,0x2b,0x84,0x96,0x3,0x53,0x48,0xe6,0xb5,0xdd,0xc9,0xbe,0xa7,0xa2, + 0xc8,0x91,0xdf,0xaa,0x6,0x15,0x50,0x9d,0x3b,0x1f,0x49,0xde,0xf8,0xa0,0x11,0x59, + 0x71,0x73,0x3b,0x92,0x94,0x3a,0x84,0x79,0xd1,0x8c,0xdf,0xcb,0xb8,0xad,0x80,0xa2, + 0x41,0x93,0x60,0xca,0x78,0x64,0x35,0xb2,0x4a,0xf3,0xd8,0xb0,0x27,0x13,0xdd,0xfe, + 0x8f,0xd1,0xeb,0xc,0xe0,0x2a,0x2b,0x7f,0x40,0xab,0x1c,0xae,0xd7,0xfd,0x7a,0x5e, + 0xbe,0x5e,0xc,0x45,0xcb,0x99,0xc8,0xe8,0x2c,0x80,0xab,0x3f,0xe8,0x3e,0x8e,0xcf, + 0x7,0x90,0x2c,0xc0,0xde,0x82,0x97,0xcb,0xcc,0x67,0x1d,0x69,0x78,0x7b,0x40,0x28, + 0x1b,0x18,0xc0,0x7a,0xaa,0x2,0x5,0x94,0x56,0x0,0x27,0xf5,0x7b,0xae,0x42,0x48, + 0xf6,0xfb,0x62,0xa4,0x6b,0xac,0xc2,0x58,0xc4,0x4d,0xd8,0x47,0x66,0xf0,0x7c,0x2c, + 0xae,0x26,0xd9,0xe7,0xa6,0xc9,0x9b,0x8c,0xb3,0xf7,0x61,0xe,0xae,0x42,0x2d,0xe0, + 0xcc,0x41,0x75,0x97,0x43,0x7e,0x87,0xea,0x45,0x6f,0xc0,0x55,0xa7,0xfd,0x54,0xd2, + 0x63,0xc2,0x30,0xe2,0x5a,0xd6,0x9d,0xac,0xbc,0xa5,0x2d,0xb9,0xfd,0x11,0x91,0x3c, + 0xbb,0xff,0x52,0xf2,0xc1,0x67,0xf5,0xc8,0xa7,0x5f,0xd7,0x61,0x5e,0x2f,0x43,0xf, + 0x1d,0xae,0xc5,0xbe,0xfe,0xda,0xbb,0x97,0x90,0x7b,0x9e,0xb0,0x93,0xcd,0x7b,0xe3, + 0xc8,0xbc,0x35,0x9d,0xc9,0x50,0xa5,0x3f,0xb1,0xf7,0x1d,0xaf,0xb7,0xb8,0xc9,0xa1, + 0x47,0xa8,0xc1,0xd9,0x2d,0x38,0x33,0x92,0x4c,0x9f,0x64,0xc4,0x9f,0x2d,0xd2,0x3c, + 0x36,0x9c,0x15,0xd5,0x80,0xd5,0xdb,0x2f,0x76,0xeb,0xe5,0xbe,0xf9,0x87,0x4f,0x78, + 0x7b,0x9c,0x62,0x7b,0x6,0x35,0x72,0x4b,0xd6,0xa8,0xf7,0xb3,0x1c,0x7c,0x57,0x79, + 0x1,0xc9,0xf3,0x15,0xe3,0xcc,0xaf,0x88,0xf5,0x34,0x43,0x6e,0xa1,0x38,0x8a,0xbf, + 0x3f,0x67,0x56,0xa4,0x80,0xe6,0x6c,0xd4,0xd0,0x1d,0xa6,0xcf,0x41,0xda,0xf6,0x53, + 0x46,0x7b,0x9c,0x5b,0x8a,0xe3,0x28,0x67,0x79,0x5b,0xb8,0xcc,0xd2,0x79,0xe4,0x9e, + 0x2c,0xae,0x25,0x7d,0xd9,0xa9,0x96,0xb0,0xc8,0xad,0x47,0x8a,0x96,0x96,0x48,0x6e, + 0x33,0x17,0x2f,0x71,0xa6,0x55,0x67,0xed,0x1d,0xec,0xca,0x6a,0x3a,0x1,0x2f,0x52, + 0xfd,0x35,0x48,0x4d,0x74,0x2f,0x50,0x3d,0x84,0x26,0xad,0xcc,0x73,0xe6,0xab,0xf3, + 0xbc,0xb9,0xa1,0xd3,0xbb,0xd0,0x3c,0x56,0xde,0x7d,0x8e,0x6f,0xc4,0x62,0x2a,0x4a, + 0xe7,0xcb,0xb7,0x9c,0x89,0x9c,0xab,0xd3,0x82,0x5d,0x1a,0x56,0x88,0x37,0x82,0xb7, + 0xc7,0x29,0x62,0xbe,0x4,0x98,0xd8,0xab,0xb6,0x5d,0x60,0x18,0xc7,0x5b,0xb,0xac, + 0xaa,0x65,0x80,0x44,0x3e,0xeb,0xb0,0x40,0x45,0xac,0xce,0x7f,0x76,0x24,0x18,0x5, + 0x28,0xbd,0xe7,0xbc,0x6e,0x89,0x75,0xae,0x27,0x5,0xf,0x2f,0x76,0x3e,0x2c,0xb5, + 0x37,0xf8,0x8c,0x26,0x7d,0x37,0xaa,0xd3,0xb7,0x9d,0xe4,0xeb,0x9b,0x6b,0x68,0xbd, + 0x56,0x3b,0x4e,0x93,0x98,0x14,0xd6,0x75,0x0,0x97,0x83,0x3f,0x41,0xe1,0xc4,0xc1, + 0x8e,0x55,0x4,0x6d,0x20,0xa2,0xa4,0xae,0x2c,0x97,0xc6,0x2e,0xcf,0x65,0x6d,0x38, + 0x1c,0xf2,0x6d,0x2c,0xa7,0xc2,0x21,0x3f,0xc4,0x80,0x98,0x28,0x3d,0xc6,0xfe,0x6d, + 0x97,0xee,0xa0,0xdf,0x73,0x93,0xd6,0x45,0x5e,0x99,0x4e,0xff,0x1c,0xcc,0xc0,0x94, + 0x1f,0xa5,0xcc,0x26,0x8a,0x8d,0x2e,0xba,0xdf,0x9b,0xf4,0xdd,0xc0,0x37,0x63,0x31, + 0x5d,0xce,0xf6,0xe1,0x3b,0xf5,0x50,0xaf,0xeb,0x2b,0x9f,0xf9,0x40,0x79,0x1,0x16, + 0x6f,0x8f,0xe3,0x87,0x66,0xee,0x75,0x93,0x1,0x8b,0x3f,0x24,0xd,0x7a,0xad,0x61, + 0x2e,0x7d,0x9b,0x33,0xf3,0x7b,0xba,0xbf,0xfa,0x15,0x7e,0x51,0xca,0x48,0xb2,0x2, + 0x20,0x41,0x3f,0x4f,0x8d,0xbd,0x9f,0xda,0x8b,0x80,0xc2,0x83,0xca,0x7a,0xab,0x14, + 0xa0,0xa0,0xea,0x15,0xd5,0xaf,0x8c,0xf4,0x34,0x0,0x9b,0xa3,0x47,0xd,0x2e,0x56, + 0x8c,0x9b,0xeb,0x4e,0x9a,0x7b,0x80,0x87,0xc,0xb9,0x86,0x84,0x9d,0xbd,0x43,0xfa, + 0x13,0x3a,0x43,0xbb,0x7e,0x31,0x8b,0x4d,0xaf,0xc3,0x41,0xd,0x97,0x12,0xf4,0x5e, + 0x29,0xf1,0x2c,0x19,0x58,0x7e,0x96,0x6f,0xca,0x22,0xa8,0xb2,0xe7,0x2,0x6b,0x29, + 0x54,0xa1,0xd5,0x6c,0x63,0xf3,0x6e,0xf6,0x34,0x18,0x2e,0xe4,0x6,0xcf,0xdb,0xe3, + 0x14,0xac,0xf0,0x6a,0x74,0xca,0x78,0xca,0x68,0x8e,0xac,0x55,0xe0,0x39,0x94,0x99, + 0x42,0x6c,0x4a,0x5,0x3f,0x43,0xde,0xab,0x59,0x3f,0xd2,0x2d,0x7f,0x9a,0xfa,0x1e, + 0x8,0xb9,0x7,0xa3,0x4,0xdc,0xe6,0x50,0x3e,0xab,0xd5,0x69,0xa9,0x25,0xf2,0xf5, + 0xf4,0x39,0x79,0x23,0x38,0xe9,0x19,0x52,0x57,0x7a,0x29,0xf9,0x4,0x63,0x54,0xbf, + 0xc7,0x4a,0x37,0x9a,0x42,0x73,0xae,0x2c,0xae,0x81,0xf3,0xce,0xfd,0x40,0x62,0xc7, + 0xde,0xa5,0x53,0x89,0xb0,0xfd,0xf7,0x2c,0x23,0xbc,0xe5,0xc2,0xa5,0xc4,0xc5,0x21, + 0xcf,0xd7,0x92,0x81,0x7f,0xe4,0x9b,0xd3,0xcf,0xc3,0x1f,0xa5,0xf2,0x95,0xe3,0xe7, + 0x19,0x87,0xff,0x3b,0xac,0xe5,0x8d,0xdf,0xf9,0x34,0xbc,0x3d,0x8e,0xcf,0xd6,0x2b, + 0x9b,0x7e,0x23,0x5d,0x5d,0xcf,0x93,0xa6,0x7d,0x37,0x69,0xc4,0xac,0xcc,0x63,0xa5, + 0x7c,0x28,0xd8,0xa5,0x34,0xff,0x80,0x6b,0x8e,0x4b,0xc3,0x17,0x6,0xc0,0x32,0x53, + 0xd1,0x1e,0x87,0x19,0xf8,0x40,0x8,0xc,0xf5,0x86,0xc9,0xcd,0x6,0xdf,0x6c,0xfa, + 0xfb,0xc,0x5a,0xf2,0xb1,0x91,0xf2,0xb0,0x34,0x68,0xf6,0x7,0xde,0x7d,0xbb,0x9c, + 0x69,0x73,0xba,0x50,0xe8,0xc3,0xfa,0x1b,0x2,0x5c,0x4f,0xda,0x7c,0x8c,0xef,0xb, + 0xae,0x7e,0x7a,0xba,0x2f,0x92,0x91,0xd7,0x7f,0x43,0xda,0xa6,0x3e,0x44,0x6a,0x76, + 0x5c,0x62,0xd8,0xe5,0xb,0xd4,0xe,0xdc,0x6f,0x46,0x45,0x3e,0x17,0x2e,0xde,0x0, + 0xeb,0x45,0xf0,0xd3,0xf0,0x9b,0x63,0x41,0xa0,0xea,0x6f,0x16,0x6e,0xba,0x6c,0xc0, + 0x96,0xec,0xc3,0x1f,0xad,0x8b,0x1c,0xca,0xa8,0x22,0x27,0x4a,0xf2,0xf6,0x38,0x4, + 0x7d,0xe9,0xc0,0xa5,0xd4,0x3d,0xeb,0x25,0xe2,0x1c,0x75,0x1b,0xa9,0xae,0x25,0x9e, + 0x1a,0x61,0xd6,0xe3,0x82,0x28,0xed,0x29,0xf6,0x8d,0x13,0x21,0xfd,0xe0,0xe4,0x4d, + 0x6,0x45,0x6d,0xa2,0x7c,0x28,0xb0,0xfd,0x29,0x4d,0xb3,0xd2,0xfb,0x68,0x1e,0x81, + 0x22,0x5c,0x28,0xfc,0x15,0x78,0x27,0x45,0x39,0x83,0x81,0x6a,0xfd,0xf7,0xd4,0xea, + 0xb4,0xd4,0xdd,0x7a,0xe2,0x3e,0x96,0xf7,0x35,0x65,0xcb,0x71,0x6e,0x8b,0xb8,0x32, + 0x30,0x85,0x3e,0x98,0xfd,0x17,0x7e,0xc0,0xc2,0x7f,0x4d,0x93,0x37,0x65,0x7b,0xaa, + 0x1c,0xb2,0xca,0xec,0x32,0x3a,0x26,0x44,0xb9,0x1a,0xf0,0xc3,0x9d,0x8b,0xb9,0xd2, + 0x74,0x6e,0x65,0x34,0x20,0x76,0x8c,0xd8,0xcd,0x37,0xaf,0xce,0x8f,0x82,0x3c,0x17, + 0x70,0xd,0x1,0x50,0xb5,0x4c,0xb9,0x93,0xd4,0xed,0xba,0x82,0x6e,0x5a,0xd9,0x0, + 0x55,0x27,0x59,0x82,0x2e,0x72,0xf2,0x8a,0xf,0x68,0x4b,0x6d,0x7b,0x1c,0x80,0x74, + 0xf0,0x7a,0xc1,0x0,0xe2,0x46,0x39,0xf0,0xea,0x83,0x24,0x91,0x8e,0x23,0x3c,0x12, + 0x48,0x32,0x6d,0xdc,0x77,0x3,0xa9,0xd2,0xf6,0xaa,0x1c,0x95,0xba,0x82,0x76,0xd3, + 0x7c,0x97,0x79,0x45,0x44,0xa9,0x43,0x40,0x64,0x9c,0x90,0x16,0xf2,0x65,0x2c,0xbf, + 0xc7,0x3a,0x3a,0x34,0xa0,0xf7,0x41,0xce,0x99,0x95,0xde,0x87,0xb5,0x23,0xa,0x71, + 0xd5,0x33,0xf2,0x18,0x1d,0xd2,0xf5,0xac,0x52,0x54,0xb,0xbf,0xb3,0xb5,0x52,0xb9, + 0xcd,0x3c,0x37,0x2e,0x39,0xe0,0x30,0xea,0x9a,0xf9,0x3c,0xcb,0xcf,0x83,0xe7,0x1d, + 0x5e,0x65,0x84,0xec,0xb9,0xd,0xb,0xf3,0xb6,0x35,0xbb,0xcf,0x91,0xc9,0x37,0xfe, + 0x41,0xc6,0xac,0xfe,0x8e,0xc,0xbe,0xe6,0x13,0xd2,0xe7,0xca,0x37,0xd9,0x3c,0xc3, + 0x33,0x5,0xc6,0xf5,0xda,0x9d,0x97,0xa9,0x11,0x4e,0x97,0x9a,0xf3,0x2,0xa3,0x1c, + 0x65,0xad,0xe4,0x50,0x3c,0x96,0x87,0x6c,0x98,0xb,0x17,0x33,0xc5,0xa9,0xb4,0x37, + 0x16,0x2a,0xe8,0x5,0x4a,0x54,0x13,0x16,0xb9,0xeb,0xf7,0x5c,0x45,0xa,0xd3,0x3a, + 0x5d,0xaf,0x25,0xfe,0x7c,0x9f,0xb7,0x36,0xec,0xbd,0x96,0x5c,0xda,0x6f,0xb3,0x5f, + 0xda,0xb0,0xf7,0x1a,0x76,0x53,0xae,0x12,0x7f,0x95,0x3b,0xf7,0xe6,0x65,0xc9,0xbc, + 0xa2,0xf2,0x3e,0x2b,0x5c,0xc0,0x41,0x97,0x20,0x97,0xf,0xec,0xb0,0x9c,0x59,0xc3, + 0xd7,0x78,0xd7,0xe8,0x78,0xb5,0x5a,0xd4,0x77,0xc,0xa5,0x36,0xe8,0xb9,0x3a,0xdf, + 0xf1,0xc2,0xff,0x19,0xdf,0x57,0xbb,0xcb,0x32,0xd5,0x78,0x7,0x24,0x2b,0x17,0xe8, + 0xf5,0xa0,0x63,0x9,0xee,0x2f,0xd6,0xf0,0xd8,0xa1,0xdc,0xc8,0x42,0x7f,0x20,0x3, + 0xd,0x74,0x4c,0xb9,0x94,0x6e,0x41,0x52,0x32,0x8a,0x85,0x28,0xe0,0x82,0xb7,0x9d, + 0xae,0xa1,0x63,0xf9,0xad,0x31,0x54,0x42,0x23,0x74,0x5f,0xab,0xd3,0x35,0x1e,0xdb, + 0xd2,0x24,0x79,0xa3,0xdf,0xb6,0x80,0x6b,0xfe,0xa,0x8a,0x90,0x4b,0xfb,0x7,0xf6, + 0x19,0x28,0xa4,0x32,0xe6,0x5,0xa1,0x3c,0xd8,0x8d,0xaa,0xed,0xe6,0x5f,0x44,0x1e, + 0x6b,0x64,0x74,0x96,0x5a,0xb0,0x27,0x58,0x39,0xa5,0x53,0x29,0xdd,0xca,0xd2,0x5a, + 0xa2,0x94,0x1,0x42,0xf3,0xf4,0xcb,0xf9,0x6,0xe1,0x62,0xf1,0x10,0xa1,0x74,0x15, + 0x4b,0x5a,0xd5,0x68,0x29,0x4a,0x50,0xa5,0x57,0x5,0xe6,0xce,0x2d,0x58,0x19,0xa1, + 0xa1,0x43,0xfe,0xdc,0x9f,0xef,0xf5,0xfa,0x99,0x2f,0xa8,0xfe,0xe0,0x8f,0xa,0xa2, + 0xfc,0x9,0x3d,0xf0,0x5f,0xa7,0xfa,0x24,0xe3,0x25,0x83,0x27,0xc5,0x2e,0xa5,0x32, + 0x6f,0x8a,0x7d,0x66,0xc5,0xa0,0x8e,0x75,0x54,0x46,0x2,0xfd,0xfc,0x97,0xe8,0xbb, + 0xbf,0xeb,0x35,0x16,0xfb,0x8b,0xf2,0x6e,0x25,0xa2,0xe,0xe5,0xb3,0x7c,0xc7,0xcb, + 0x21,0x7f,0xe4,0xf9,0x3e,0xbb,0x74,0xc0,0xeb,0x3d,0x1e,0xa6,0xef,0xb5,0x9d,0x1d, + 0x84,0x76,0x79,0xe,0x4b,0xec,0x6,0xe5,0x9,0xc6,0x11,0x5e,0x25,0x6b,0x57,0xd2, + 0x72,0x9,0x27,0x61,0x44,0xd1,0x72,0x34,0x3b,0x64,0x1d,0x8a,0x8b,0xfe,0x7d,0x39, + 0x5d,0x7f,0x5b,0x58,0x15,0xb7,0x43,0x7e,0xdc,0x7b,0x4f,0xd9,0x44,0xd7,0x77,0xfe, + 0xda,0x2,0xae,0xf9,0xea,0x5f,0xf0,0xde,0xdb,0x1c,0xca,0x89,0x0,0x3f,0xe7,0x70, + 0xb6,0x8d,0x91,0x5f,0x63,0x76,0x3,0x17,0x2e,0x4f,0x5,0xbe,0xb4,0x91,0xfe,0x7b, + 0x91,0x76,0xf9,0x92,0x86,0xb1,0x48,0x1,0xaa,0xf0,0x9b,0x4d,0xab,0xc5,0x17,0x3d, + 0x17,0x2e,0x5c,0xb8,0x70,0xe1,0xc2,0x85,0xb,0x17,0x2e,0x5c,0xb8,0x70,0xe1,0xc2, + 0x85,0xb,0x17,0x2e,0xa1,0x90,0xff,0x3,0x15,0x25,0x67,0x62,0x74,0x7b,0xa4,0xa3, + 0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82, + // /Users/david/Devel/arch/snes/tools/bsnes_v046/data/documentation.html + 0x0,0x0,0x9,0xc0, + 0x3c, + 0x21,0x44,0x4f,0x43,0x54,0x59,0x50,0x45,0x20,0x68,0x74,0x6d,0x6c,0x3e,0xa,0x3c, + 0x68,0x74,0x6d,0x6c,0x3e,0xa,0x3c,0x68,0x65,0x61,0x64,0x3e,0x3c,0x2f,0x68,0x65, + 0x61,0x64,0x3e,0xa,0x3c,0x62,0x6f,0x64,0x79,0x3e,0xa,0xa,0x3c,0x68,0x31,0x3e, + 0x62,0x73,0x6e,0x65,0x73,0x26,0x74,0x72,0x61,0x64,0x65,0x3b,0x20,0x55,0x73,0x61, + 0x67,0x65,0x20,0x44,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x61,0x74,0x69,0x6f,0x6e, + 0x3c,0x2f,0x68,0x31,0x3e,0x3c,0x62,0x72,0x3e,0xa,0xa,0x62,0x73,0x6e,0x65,0x73, + 0x20,0x69,0x73,0x20,0x61,0x20,0x53,0x75,0x70,0x65,0x72,0x20,0x4e,0x69,0x6e,0x74, + 0x65,0x6e,0x64,0x6f,0x20,0x2f,0x20,0x53,0x75,0x70,0x65,0x72,0x20,0x46,0x61,0x6d, + 0x69,0x63,0x6f,0x6d,0x20,0x65,0x6d,0x75,0x6c,0x61,0x74,0x6f,0x72,0x20,0x74,0x68, + 0x61,0x74,0x20,0x73,0x74,0x72,0x69,0x76,0x65,0x73,0x20,0x74,0x6f,0x20,0x70,0x72, + 0x6f,0x76,0x69,0x64,0x65,0xa,0x74,0x68,0x65,0x20,0x6d,0x6f,0x73,0x74,0x20,0x66, + 0x61,0x69,0x74,0x68,0x66,0x75,0x6c,0x20,0x65,0x6d,0x75,0x6c,0x61,0x74,0x69,0x6f, + 0x6e,0x20,0x65,0x78,0x70,0x65,0x72,0x69,0x65,0x6e,0x63,0x65,0x20,0x70,0x6f,0x73, + 0x73,0x69,0x62,0x6c,0x65,0x2e,0x20,0x49,0x74,0x20,0x66,0x6f,0x63,0x75,0x73,0x65, + 0x73,0x20,0x6f,0x6e,0x20,0x61,0x63,0x63,0x75,0x72,0x61,0x63,0x79,0x20,0x61,0x6e, + 0x64,0xa,0x63,0x6c,0x65,0x61,0x6e,0x20,0x63,0x6f,0x64,0x65,0x3b,0x20,0x6f,0x76, + 0x65,0x72,0x20,0x73,0x70,0x65,0x65,0x64,0x20,0x61,0x6e,0x64,0x20,0x66,0x65,0x61, + 0x74,0x75,0x72,0x65,0x73,0x2e,0xa,0x3c,0x68,0x72,0x3e,0xa,0xa,0x3c,0x68,0x32, + 0x3e,0x3c,0x75,0x3e,0x4d,0x6f,0x64,0x65,0x73,0x20,0x6f,0x66,0x20,0x4f,0x70,0x65, + 0x72,0x61,0x74,0x69,0x6f,0x6e,0x3c,0x2f,0x75,0x3e,0x3c,0x2f,0x68,0x32,0x3e,0x3c, + 0x62,0x72,0x3e,0xa,0xa,0x62,0x73,0x6e,0x65,0x73,0x20,0x69,0x73,0x20,0x63,0x61, + 0x70,0x61,0x62,0x6c,0x65,0x20,0x6f,0x66,0x20,0x72,0x75,0x6e,0x6e,0x69,0x6e,0x67, + 0x20,0x62,0x6f,0x74,0x68,0x20,0x69,0x6e,0x20,0x69,0x74,0x73,0x20,0x64,0x65,0x66, + 0x61,0x75,0x6c,0x74,0x20,0x6d,0x75,0x6c,0x74,0x69,0x2d,0x75,0x73,0x65,0x72,0x20, + 0x6d,0x6f,0x64,0x65,0x2c,0x20,0x61,0x73,0x20,0x77,0x65,0x6c,0x6c,0x20,0x61,0x73, + 0xa,0x69,0x6e,0x20,0x73,0x69,0x6e,0x67,0x6c,0x65,0x2d,0x75,0x73,0x65,0x72,0x20, + 0x6d,0x6f,0x64,0x65,0x2e,0x3c,0x62,0x72,0x3e,0xa,0x3c,0x62,0x72,0x3e,0xa,0xa, + 0x49,0x6e,0x20,0x6d,0x75,0x6c,0x74,0x69,0x2d,0x75,0x73,0x65,0x72,0x20,0x6d,0x6f, + 0x64,0x65,0x2c,0x20,0x63,0x6f,0x6e,0x66,0x69,0x67,0x75,0x72,0x61,0x74,0x69,0x6f, + 0x6e,0x20,0x64,0x61,0x74,0x61,0x20,0x69,0x73,0x20,0x73,0x74,0x6f,0x72,0x65,0x64, + 0x20,0x69,0x6e,0x73,0x69,0x64,0x65,0x20,0x74,0x68,0x65,0x20,0x75,0x73,0x65,0x72, + 0x27,0x73,0x20,0x68,0x6f,0x6d,0x65,0xa,0x64,0x69,0x72,0x65,0x63,0x74,0x6f,0x72, + 0x79,0x2e,0x20,0x4f,0x6e,0x20,0x57,0x69,0x6e,0x64,0x6f,0x77,0x73,0x2c,0x20,0x74, + 0x68,0x69,0x73,0x20,0x69,0x73,0x20,0x6c,0x6f,0x63,0x61,0x74,0x65,0x64,0x20,0x61, + 0x74,0x20,0x22,0x25,0x41,0x50,0x50,0x44,0x41,0x54,0x41,0x25,0x2f,0x2e,0x62,0x73, + 0x6e,0x65,0x73,0x22,0x2e,0x20,0x4f,0x6e,0x20,0x6f,0x74,0x68,0x65,0x72,0x20,0x6f, + 0x70,0x65,0x72,0x61,0x74,0x69,0x6e,0x67,0xa,0x73,0x79,0x73,0x74,0x65,0x6d,0x73, + 0x2c,0x20,0x74,0x68,0x69,0x73,0x20,0x69,0x73,0x20,0x6c,0x6f,0x63,0x61,0x74,0x65, + 0x64,0x20,0x61,0x74,0x20,0x22,0x7e,0x2f,0x2e,0x62,0x73,0x6e,0x65,0x73,0x22,0x2e, + 0x3c,0x62,0x72,0x3e,0xa,0x3c,0x62,0x72,0x3e,0xa,0xa,0x54,0x6f,0x20,0x65,0x6e, + 0x61,0x62,0x6c,0x65,0x20,0x73,0x69,0x6e,0x67,0x6c,0x65,0x2d,0x75,0x73,0x65,0x72, + 0x20,0x6d,0x6f,0x64,0x65,0x2c,0x20,0x63,0x72,0x65,0x61,0x74,0x65,0x20,0x61,0x20, + 0x62,0x6c,0x61,0x6e,0x6b,0x20,0x22,0x62,0x73,0x6e,0x65,0x73,0x2e,0x63,0x66,0x67, + 0x22,0x20,0x66,0x69,0x6c,0x65,0x20,0x69,0x6e,0x73,0x69,0x64,0x65,0x20,0x74,0x68, + 0x65,0x20,0x73,0x61,0x6d,0x65,0xa,0x66,0x6f,0x6c,0x64,0x65,0x72,0x20,0x61,0x73, + 0x20,0x74,0x68,0x65,0x20,0x62,0x73,0x6e,0x65,0x73,0x20,0x65,0x78,0x65,0x63,0x75, + 0x74,0x61,0x62,0x6c,0x65,0x2e,0x20,0x62,0x73,0x6e,0x65,0x73,0x20,0x77,0x69,0x6c, + 0x6c,0x20,0x74,0x68,0x65,0x6e,0x20,0x75,0x73,0x65,0x20,0x74,0x68,0x69,0x73,0x20, + 0x66,0x69,0x6c,0x65,0x20,0x74,0x6f,0x20,0x73,0x74,0x6f,0x72,0x65,0xa,0x63,0x6f, + 0x6e,0x66,0x69,0x67,0x75,0x72,0x61,0x74,0x69,0x6f,0x6e,0x20,0x64,0x61,0x74,0x61, + 0x2e,0xa,0x3c,0x68,0x72,0x3e,0xa,0xa,0x3c,0x68,0x32,0x3e,0x3c,0x75,0x3e,0x53, + 0x75,0x70,0x70,0x6f,0x72,0x74,0x65,0x64,0x20,0x46,0x69,0x6c,0x65,0x74,0x79,0x70, + 0x65,0x73,0x3c,0x2f,0x75,0x3e,0x3c,0x2f,0x68,0x32,0x3e,0x3c,0x62,0x72,0x3e,0xa, + 0xa,0x3c,0x62,0x3e,0x53,0x46,0x43,0x2c,0x20,0x53,0x4d,0x43,0x2c,0x20,0x53,0x57, + 0x43,0x2c,0x20,0x46,0x49,0x47,0x3a,0x3c,0x2f,0x62,0x3e,0x20,0x53,0x4e,0x45,0x53, + 0x20,0x63,0x61,0x72,0x74,0x72,0x69,0x64,0x67,0x65,0x20,0x26,0x6d,0x64,0x61,0x73, + 0x68,0x3b,0x20,0x52,0x4f,0x4d,0x20,0x69,0x6d,0x61,0x67,0x65,0x2e,0x3c,0x62,0x72, + 0x3e,0xa,0x3c,0x62,0x3e,0x42,0x53,0x3a,0x3c,0x2f,0x62,0x3e,0x20,0x53,0x61,0x74, + 0x65,0x6c,0x6c,0x61,0x76,0x69,0x65,0x77,0x20,0x42,0x53,0x2d,0x58,0x20,0x66,0x6c, + 0x61,0x73,0x68,0x20,0x63,0x61,0x72,0x74,0x72,0x69,0x64,0x67,0x65,0x20,0x26,0x6d, + 0x64,0x61,0x73,0x68,0x3b,0x20,0x45,0x45,0x50,0x52,0x4f,0x4d,0x20,0x69,0x6d,0x61, + 0x67,0x65,0x2e,0x3c,0x62,0x72,0x3e,0xa,0x3c,0x62,0x3e,0x53,0x54,0x3a,0x3c,0x2f, + 0x62,0x3e,0x20,0x53,0x75,0x66,0x61,0x6d,0x69,0x20,0x54,0x75,0x72,0x62,0x6f,0x20, + 0x63,0x61,0x72,0x74,0x72,0x69,0x64,0x67,0x65,0x20,0x26,0x6d,0x64,0x61,0x73,0x68, + 0x3b,0x20,0x52,0x4f,0x4d,0x20,0x69,0x6d,0x61,0x67,0x65,0x2e,0x3c,0x62,0x72,0x3e, + 0xa,0x3c,0x62,0x3e,0x53,0x52,0x4d,0x2c,0x20,0x50,0x53,0x52,0x3a,0x3c,0x2f,0x62, + 0x3e,0x20,0x6e,0x6f,0x6e,0x2d,0x76,0x6f,0x6c,0x61,0x74,0x69,0x6c,0x65,0x20,0x6d, + 0x65,0x6d,0x6f,0x72,0x79,0x2c,0x20,0x6f,0x66,0x74,0x65,0x6e,0x20,0x75,0x73,0x65, + 0x64,0x20,0x74,0x6f,0x20,0x73,0x61,0x76,0x65,0x20,0x67,0x61,0x6d,0x65,0x20,0x64, + 0x61,0x74,0x61,0x20,0x26,0x6d,0x64,0x61,0x73,0x68,0x3b,0x20,0x28,0x50,0x29,0x53, + 0x52,0x41,0x4d,0x20,0x69,0x6d,0x61,0x67,0x65,0x2e,0x3c,0x62,0x72,0x3e,0xa,0x3c, + 0x62,0x3e,0x52,0x54,0x43,0x3a,0x3c,0x2f,0x62,0x3e,0x20,0x72,0x65,0x61,0x6c,0x2d, + 0x74,0x69,0x6d,0x65,0x20,0x63,0x6c,0x6f,0x63,0x6b,0x20,0x6e,0x6f,0x6e,0x2d,0x76, + 0x6f,0x6c,0x61,0x74,0x69,0x6c,0x65,0x20,0x6d,0x65,0x6d,0x6f,0x72,0x79,0x2e,0x3c, + 0x62,0x72,0x3e,0xa,0x3c,0x62,0x3e,0x55,0x50,0x53,0x3a,0x3c,0x2f,0x62,0x3e,0x20, + 0x70,0x61,0x74,0x63,0x68,0x20,0x64,0x61,0x74,0x61,0x2c,0x20,0x75,0x73,0x65,0x64, + 0x20,0x74,0x6f,0x20,0x64,0x79,0x6e,0x61,0x6d,0x69,0x63,0x61,0x6c,0x6c,0x79,0x20, + 0x6d,0x6f,0x64,0x69,0x66,0x79,0x20,0x63,0x61,0x72,0x74,0x72,0x69,0x64,0x67,0x65, + 0x20,0x6f,0x66,0x20,0x73,0x61,0x6d,0x65,0x20,0x62,0x61,0x73,0x65,0x20,0x66,0x69, + 0x6c,0x65,0x6e,0x61,0x6d,0x65,0x20,0x75,0x70,0x6f,0x6e,0x20,0x6c,0x6f,0x61,0x64, + 0x2e,0x3c,0x62,0x72,0x3e,0xa,0x3c,0x62,0x3e,0x43,0x48,0x54,0x3a,0x3c,0x2f,0x62, + 0x3e,0x20,0x70,0x6c,0x61,0x69,0x6e,0x2d,0x74,0x65,0x78,0x74,0x20,0x6c,0x69,0x73, + 0x74,0x20,0x6f,0x66,0x20,0x22,0x47,0x61,0x6d,0x65,0x20,0x47,0x65,0x6e,0x69,0x65, + 0x22,0x20,0x2f,0x20,0x22,0x50,0x72,0x6f,0x20,0x41,0x63,0x74,0x69,0x6f,0x6e,0x20, + 0x52,0x65,0x70,0x6c,0x61,0x79,0x22,0x20,0x63,0x6f,0x64,0x65,0x73,0x2e,0xa,0x3c, + 0x68,0x72,0x3e,0xa,0xa,0x3c,0x68,0x32,0x3e,0x3c,0x75,0x3e,0x4b,0x6e,0x6f,0x77, + 0x6e,0x20,0x4c,0x69,0x6d,0x69,0x74,0x61,0x74,0x69,0x6f,0x6e,0x73,0x3c,0x2f,0x75, + 0x3e,0x3c,0x2f,0x68,0x32,0x3e,0x3c,0x62,0x72,0x3e,0xa,0xa,0x3c,0x62,0x3e,0x43, + 0x61,0x72,0x74,0x72,0x69,0x64,0x67,0x65,0x20,0x63,0x6f,0x2d,0x70,0x72,0x6f,0x63, + 0x65,0x73,0x73,0x6f,0x72,0x73,0x3a,0x3c,0x2f,0x62,0x3e,0x20,0x63,0x65,0x72,0x74, + 0x61,0x69,0x6e,0x20,0x63,0x61,0x72,0x74,0x72,0x69,0x64,0x67,0x65,0x73,0x20,0x63, + 0x6f,0x6e,0x74,0x61,0x69,0x6e,0x20,0x73,0x70,0x65,0x63,0x69,0x61,0x6c,0x20,0x63, + 0x6f,0x2d,0x70,0x72,0x6f,0x63,0x65,0x73,0x73,0x6f,0x72,0x20,0x63,0x68,0x69,0x70, + 0x73,0x20,0x74,0x6f,0x20,0x65,0x6e,0x68,0x61,0x6e,0x63,0x65,0xa,0x74,0x68,0x65, + 0x69,0x72,0x20,0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e,0x61,0x6c,0x69,0x74,0x79, + 0x2e,0x20,0x53,0x6f,0x6d,0x65,0x20,0x6f,0x66,0x20,0x74,0x68,0x65,0x73,0x65,0x20, + 0x61,0x72,0x65,0x20,0x65,0x69,0x74,0x68,0x65,0x72,0x20,0x70,0x61,0x72,0x74,0x69, + 0x61,0x6c,0x6c,0x79,0x20,0x6f,0x72,0x20,0x63,0x6f,0x6d,0x70,0x6c,0x65,0x74,0x65, + 0x6c,0x79,0x20,0x75,0x6e,0x73,0x75,0x70,0x70,0x6f,0x72,0x74,0x65,0x64,0x2e,0x20, + 0x41,0x20,0x6d,0x65,0x73,0x73,0x61,0x67,0x65,0x20,0x62,0x6f,0x78,0xa,0x77,0x61, + 0x72,0x6e,0x69,0x6e,0x67,0x20,0x77,0x69,0x6c,0x6c,0x20,0x70,0x6f,0x70,0x20,0x75, + 0x70,0x20,0x77,0x68,0x65,0x6e,0x20,0x61,0x74,0x74,0x65,0x6d,0x70,0x74,0x69,0x6e, + 0x67,0x20,0x74,0x6f,0x20,0x6c,0x6f,0x61,0x64,0x20,0x73,0x75,0x63,0x68,0x20,0x61, + 0x20,0x63,0x61,0x72,0x74,0x72,0x69,0x64,0x67,0x65,0x2e,0x3c,0x62,0x72,0x3e,0xa, + 0x3c,0x62,0x72,0x3e,0xa,0xa,0x3c,0x62,0x3e,0x53,0x61,0x74,0x65,0x6c,0x6c,0x61, + 0x76,0x69,0x65,0x77,0x20,0x42,0x53,0x2d,0x58,0x20,0x65,0x6d,0x75,0x6c,0x61,0x74, + 0x69,0x6f,0x6e,0x3a,0x3c,0x2f,0x62,0x3e,0x20,0x74,0x68,0x69,0x73,0x20,0x68,0x61, + 0x72,0x64,0x77,0x61,0x72,0x65,0x20,0x69,0x73,0x20,0x6f,0x6e,0x6c,0x79,0x20,0x70, + 0x61,0x72,0x74,0x69,0x61,0x6c,0x6c,0x79,0x20,0x73,0x75,0x70,0x70,0x6f,0x72,0x74, + 0x65,0x64,0x2e,0x20,0x41,0x73,0x20,0x61,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x2c, + 0xa,0x6d,0x6f,0x73,0x74,0x20,0x42,0x53,0x2d,0x58,0x20,0x73,0x6f,0x66,0x74,0x77, + 0x61,0x72,0x65,0x20,0x77,0x69,0x6c,0x6c,0x20,0x6e,0x6f,0x74,0x20,0x66,0x75,0x6e, + 0x63,0x74,0x69,0x6f,0x6e,0x20,0x63,0x6f,0x72,0x72,0x65,0x63,0x74,0x6c,0x79,0x2e, + 0x3c,0x62,0x72,0x3e,0xa,0x3c,0x62,0x72,0x3e,0xa,0xa,0x3c,0x62,0x3e,0x53,0x61, + 0x76,0x65,0x73,0x74,0x61,0x74,0x65,0x73,0x3a,0x3c,0x2f,0x62,0x3e,0x20,0x64,0x75, + 0x65,0x20,0x74,0x6f,0x20,0x74,0x68,0x65,0x20,0x64,0x65,0x73,0x69,0x67,0x6e,0x20, + 0x6f,0x66,0x20,0x62,0x73,0x6e,0x65,0x73,0x2c,0x20,0x69,0x74,0x20,0x69,0x73,0x20, + 0x6e,0x6f,0x74,0x20,0x70,0x6c,0x61,0x75,0x73,0x69,0x62,0x6c,0x65,0x20,0x74,0x6f, + 0xa,0x69,0x6d,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x20,0x73,0x75,0x70,0x70,0x6f, + 0x72,0x74,0x20,0x66,0x6f,0x72,0x20,0x73,0x61,0x76,0x65,0x73,0x74,0x61,0x74,0x65, + 0x20,0x61,0x6e,0x64,0x2f,0x6f,0x72,0x20,0x72,0x65,0x77,0x69,0x6e,0x64,0x20,0x66, + 0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e,0x61,0x6c,0x69,0x74,0x79,0x2e,0x3c,0x62,0x72, + 0x3e,0xa,0x3c,0x62,0x72,0x3e,0xa,0xa,0x3c,0x62,0x3e,0x4e,0x65,0x74,0x70,0x6c, + 0x61,0x79,0x3a,0x3c,0x2f,0x62,0x3e,0x20,0x69,0x6e,0x74,0x65,0x72,0x6e,0x65,0x74, + 0x20,0x6d,0x75,0x6c,0x74,0x69,0x70,0x6c,0x61,0x79,0x20,0x69,0x73,0x20,0x6e,0x6f, + 0x74,0x20,0x63,0x75,0x72,0x72,0x65,0x6e,0x74,0x6c,0x79,0x20,0x73,0x75,0x70,0x70, + 0x6f,0x72,0x74,0x65,0x64,0x20,0x6e,0x6f,0x72,0x20,0x70,0x6c,0x61,0x6e,0x6e,0x65, + 0x64,0x2e,0xa,0x3c,0x68,0x72,0x3e,0xa,0xa,0x3c,0x68,0x32,0x3e,0x3c,0x75,0x3e, + 0x43,0x6f,0x6e,0x74,0x72,0x69,0x62,0x75,0x74,0x6f,0x72,0x73,0x3c,0x2f,0x75,0x3e, + 0x3c,0x2f,0x68,0x32,0x3e,0xa,0x26,0x62,0x75,0x6c,0x6c,0x3b,0x20,0x41,0x6e,0x64, + 0x72,0x65,0x61,0x73,0x20,0x4e,0x61,0x69,0x76,0x65,0x3c,0x62,0x72,0x3e,0xa,0x26, + 0x62,0x75,0x6c,0x6c,0x3b,0x20,0x61,0x6e,0x6f,0x6d,0x69,0x65,0x3c,0x62,0x72,0x3e, + 0xa,0x26,0x62,0x75,0x6c,0x6c,0x3b,0x20,0x44,0x65,0x72,0x72,0x69,0x63,0x6b,0x20, + 0x53,0x6f,0x62,0x6f,0x64,0x61,0x73,0x68,0x3c,0x62,0x72,0x3e,0xa,0x26,0x62,0x75, + 0x6c,0x6c,0x3b,0x20,0x44,0x4d,0x56,0x32,0x37,0x3c,0x62,0x72,0x3e,0xa,0x26,0x62, + 0x75,0x6c,0x6c,0x3b,0x20,0x46,0x69,0x72,0x65,0x62,0x72,0x61,0x6e,0x64,0x58,0x3c, + 0x62,0x72,0x3e,0xa,0x26,0x62,0x75,0x6c,0x6c,0x3b,0x20,0x46,0x69,0x74,0x7a,0x52, + 0x6f,0x79,0x3c,0x62,0x72,0x3e,0xa,0x26,0x62,0x75,0x6c,0x6c,0x3b,0x20,0x47,0x49, + 0x47,0x4f,0x3c,0x62,0x72,0x3e,0xa,0x26,0x62,0x75,0x6c,0x6c,0x3b,0x20,0x4a,0x6f, + 0x6e,0x61,0x73,0x20,0x51,0x75,0x69,0x6e,0x6e,0x3c,0x62,0x72,0x3e,0xa,0x26,0x62, + 0x75,0x6c,0x6c,0x3b,0x20,0x6b,0x6f,0x64,0x65,0x35,0x34,0x3c,0x62,0x72,0x3e,0xa, + 0x26,0x62,0x75,0x6c,0x6c,0x3b,0x20,0x6b,0x72,0x6f,0x6d,0x3c,0x62,0x72,0x3e,0xa, + 0x26,0x62,0x75,0x6c,0x6c,0x3b,0x20,0x4d,0x61,0x74,0x74,0x68,0x65,0x77,0x20,0x43, + 0x61,0x6c,0x6c,0x69,0x73,0x3c,0x62,0x72,0x3e,0xa,0x26,0x62,0x75,0x6c,0x6c,0x3b, + 0x20,0x4e,0x61,0x63,0x68,0x3c,0x62,0x72,0x3e,0xa,0x26,0x62,0x75,0x6c,0x6c,0x3b, + 0x20,0x6e,0x65,0x76,0x69,0x6b,0x73,0x74,0x69,0x3c,0x62,0x72,0x3e,0xa,0x26,0x62, + 0x75,0x6c,0x6c,0x3b,0x20,0x4f,0x76,0x65,0x72,0x6c,0x6f,0x61,0x64,0x3c,0x62,0x72, + 0x3e,0xa,0x26,0x62,0x75,0x6c,0x6c,0x3b,0x20,0x52,0x65,0x64,0x44,0x77,0x61,0x72, + 0x66,0x3c,0x62,0x72,0x3e,0xa,0x26,0x62,0x75,0x6c,0x6c,0x3b,0x20,0x52,0x69,0x63, + 0x68,0x61,0x72,0x64,0x20,0x42,0x61,0x6e,0x6e,0x69,0x73,0x74,0x65,0x72,0x3c,0x62, + 0x72,0x3e,0xa,0x26,0x62,0x75,0x6c,0x6c,0x3b,0x20,0x53,0x68,0x61,0x79,0x20,0x47, + 0x72,0x65,0x65,0x6e,0x3c,0x62,0x72,0x3e,0xa,0x26,0x62,0x75,0x6c,0x6c,0x3b,0x20, + 0x74,0x65,0x74,0x73,0x75,0x6f,0x35,0x35,0x3c,0x62,0x72,0x3e,0xa,0x26,0x62,0x75, + 0x6c,0x6c,0x3b,0x20,0x54,0x52,0x41,0x43,0x3c,0x62,0x72,0x3e,0xa,0x26,0x62,0x75, + 0x6c,0x6c,0x3b,0x20,0x7a,0x6f,0x6e,0x65,0x73,0x3c,0x62,0x72,0x3e,0xa,0xa,0x3c, + 0x2f,0x62,0x6f,0x64,0x79,0x3e,0xa,0x3c,0x2f,0x68,0x74,0x6d,0x6c,0x3e,0xa, + // /Users/david/Devel/arch/snes/tools/bsnes_v046/data/license.html + 0x0,0x0,0xf,0x51, + 0x3c, + 0x21,0x44,0x4f,0x43,0x54,0x59,0x50,0x45,0x20,0x68,0x74,0x6d,0x6c,0x3e,0xa,0x3c, + 0x68,0x74,0x6d,0x6c,0x3e,0xa,0x3c,0x68,0x65,0x61,0x64,0x3e,0x3c,0x2f,0x68,0x65, + 0x61,0x64,0x3e,0xa,0x3c,0x62,0x6f,0x64,0x79,0x3e,0xa,0xa,0x3c,0x68,0x31,0x3e, + 0x62,0x73,0x6e,0x65,0x73,0x26,0x74,0x72,0x61,0x64,0x65,0x3b,0x20,0x52,0x65,0x66, + 0x65,0x72,0x65,0x6e,0x63,0x65,0x20,0x4c,0x69,0x63,0x65,0x6e,0x73,0x65,0x3c,0x2f, + 0x68,0x31,0x3e,0x3c,0x62,0x72,0x3e,0xa,0x3c,0x62,0x3e,0x43,0x6f,0x70,0x79,0x72, + 0x69,0x67,0x68,0x74,0x20,0x26,0x63,0x6f,0x70,0x79,0x3b,0x20,0x32,0x30,0x30,0x34, + 0x26,0x6e,0x64,0x61,0x73,0x68,0x3b,0x32,0x30,0x30,0x39,0x20,0x62,0x79,0x75,0x75, + 0x3c,0x62,0x72,0x3e,0xa,0x41,0x6c,0x6c,0x20,0x72,0x69,0x67,0x68,0x74,0x73,0x20, + 0x72,0x65,0x73,0x65,0x72,0x76,0x65,0x64,0x3c,0x2f,0x62,0x3e,0xa,0x3c,0x68,0x72, + 0x3e,0xa,0xa,0x3c,0x68,0x32,0x3e,0x3c,0x75,0x3e,0x31,0x2e,0x20,0x44,0x65,0x66, + 0x69,0x6e,0x69,0x74,0x69,0x6f,0x6e,0x73,0x3c,0x2f,0x75,0x3e,0x3c,0x2f,0x68,0x32, + 0x3e,0x3c,0x62,0x72,0x3e,0xa,0xa,0x54,0x68,0x65,0x20,0x74,0x65,0x72,0x6d,0x73, + 0x20,0x22,0x72,0x65,0x70,0x72,0x6f,0x64,0x75,0x63,0x65,0x22,0x2c,0x20,0x22,0x72, + 0x65,0x70,0x72,0x6f,0x64,0x75,0x63,0x74,0x69,0x6f,0x6e,0x22,0x2c,0x20,0x22,0x64, + 0x69,0x73,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x22,0x20,0x61,0x6e,0x64,0x20,0x22, + 0x64,0x69,0x73,0x74,0x72,0x69,0x62,0x75,0x74,0x69,0x6f,0x6e,0x22,0x20,0x68,0x61, + 0x76,0x65,0x20,0x74,0x68,0x65,0xa,0x73,0x61,0x6d,0x65,0x20,0x6d,0x65,0x61,0x6e, + 0x69,0x6e,0x67,0x20,0x68,0x65,0x72,0x65,0x20,0x61,0x73,0x20,0x75,0x6e,0x64,0x65, + 0x72,0x20,0x55,0x2e,0x53,0x2e,0x20,0x63,0x6f,0x70,0x79,0x72,0x69,0x67,0x68,0x74, + 0x20,0x6c,0x61,0x77,0x2e,0x3c,0x62,0x72,0x3e,0x3c,0x62,0x72,0x3e,0xa,0xa,0x22, + 0x54,0x68,0x65,0x20,0x73,0x6f,0x66,0x74,0x77,0x61,0x72,0x65,0x22,0x20,0x6d,0x65, + 0x61,0x6e,0x73,0x20,0x74,0x68,0x69,0x73,0x20,0x73,0x6f,0x66,0x74,0x77,0x61,0x72, + 0x65,0x20,0x70,0x61,0x63,0x6b,0x61,0x67,0x65,0x20,0x61,0x73,0x20,0x61,0x20,0x77, + 0x68,0x6f,0x6c,0x65,0x2c,0x20,0x69,0x6e,0x63,0x6c,0x75,0x64,0x69,0x6e,0x67,0x2c, + 0x20,0x62,0x75,0x74,0x20,0x6e,0x6f,0x74,0xa,0x6c,0x69,0x6d,0x69,0x74,0x65,0x64, + 0x20,0x74,0x6f,0x2c,0x20,0x74,0x68,0x69,0x73,0x20,0x6c,0x69,0x63,0x65,0x6e,0x73, + 0x65,0x2c,0x20,0x62,0x69,0x6e,0x61,0x72,0x69,0x65,0x73,0x2c,0x20,0x73,0x6f,0x75, + 0x72,0x63,0x65,0x20,0x63,0x6f,0x64,0x65,0x2c,0x20,0x64,0x6f,0x63,0x75,0x6d,0x65, + 0x6e,0x74,0x61,0x74,0x69,0x6f,0x6e,0x2c,0x20,0x61,0x6e,0x64,0x20,0x64,0x61,0x74, + 0x61,0x2e,0x3c,0x62,0x72,0x3e,0x3c,0x62,0x72,0x3e,0xa,0xa,0x22,0x59,0x6f,0x75, + 0x22,0x20,0x6d,0x65,0x61,0x6e,0x73,0x20,0x74,0x68,0x65,0x20,0x6c,0x69,0x63,0x65, + 0x6e,0x73,0x65,0x65,0x20,0x6f,0x66,0x20,0x74,0x68,0x65,0x20,0x73,0x6f,0x66,0x74, + 0x77,0x61,0x72,0x65,0x2e,0x3c,0x62,0x72,0x3e,0x3c,0x62,0x72,0x3e,0xa,0xa,0x22, + 0x54,0x68,0x65,0x20,0x6c,0x69,0x63,0x65,0x6e,0x73,0x6f,0x72,0x22,0x20,0x6d,0x65, + 0x61,0x6e,0x73,0x20,0x74,0x68,0x65,0x20,0x63,0x6f,0x70,0x79,0x72,0x69,0x67,0x68, + 0x74,0x20,0x68,0x6f,0x6c,0x64,0x65,0x72,0x20,0x6f,0x66,0x20,0x74,0x68,0x65,0x20, + 0x73,0x6f,0x66,0x74,0x77,0x61,0x72,0x65,0x2c,0x20,0x62,0x79,0x75,0x75,0x2e,0xa, + 0x3c,0x68,0x72,0x3e,0xa,0xa,0x3c,0x68,0x32,0x3e,0x3c,0x75,0x3e,0x32,0x2e,0x20, + 0x47,0x72,0x61,0x6e,0x74,0x20,0x6f,0x66,0x20,0x52,0x69,0x67,0x68,0x74,0x73,0x3c, + 0x2f,0x75,0x3e,0x3c,0x2f,0x68,0x32,0x3e,0x3c,0x62,0x72,0x3e,0xa,0xa,0x53,0x75, + 0x62,0x6a,0x65,0x63,0x74,0x20,0x74,0x6f,0x20,0x74,0x68,0x65,0x20,0x74,0x65,0x72, + 0x6d,0x73,0x20,0x6f,0x66,0x20,0x74,0x68,0x69,0x73,0x20,0x6c,0x69,0x63,0x65,0x6e, + 0x73,0x65,0x2c,0x20,0x74,0x68,0x65,0x20,0x6c,0x69,0x63,0x65,0x6e,0x73,0x6f,0x72, + 0x20,0x67,0x72,0x61,0x6e,0x74,0x73,0x20,0x79,0x6f,0x75,0x20,0x61,0xa,0x6e,0x6f, + 0x6e,0x2d,0x74,0x72,0x61,0x6e,0x73,0x66,0x65,0x72,0x61,0x62,0x6c,0x65,0x2c,0x20, + 0x6e,0x6f,0x6e,0x2d,0x65,0x78,0x63,0x6c,0x75,0x73,0x69,0x76,0x65,0x2c,0x20,0x77, + 0x6f,0x72,0x6c,0x64,0x77,0x69,0x64,0x65,0x2c,0x20,0x72,0x6f,0x79,0x61,0x6c,0x74, + 0x79,0x2d,0x66,0x72,0x65,0x65,0x20,0x63,0x6f,0x70,0x79,0x72,0x69,0x67,0x68,0x74, + 0x20,0x6c,0x69,0x63,0x65,0x6e,0x73,0x65,0x20,0x74,0x6f,0xa,0x72,0x65,0x70,0x72, + 0x6f,0x64,0x75,0x63,0x65,0x20,0x74,0x68,0x65,0x20,0x73,0x6f,0x66,0x74,0x77,0x61, + 0x72,0x65,0x20,0x66,0x6f,0x72,0x20,0x6e,0x6f,0x6e,0x2d,0x63,0x6f,0x6d,0x6d,0x65, + 0x72,0x63,0x69,0x61,0x6c,0x20,0x75,0x73,0x65,0x20,0x6f,0x6e,0x6c,0x79,0x2c,0x20, + 0x70,0x72,0x6f,0x76,0x69,0x64,0x65,0x64,0x20,0x74,0x68,0x65,0x20,0x73,0x6f,0x66, + 0x74,0x77,0x61,0x72,0x65,0xa,0x72,0x65,0x6d,0x61,0x69,0x6e,0x73,0x20,0x75,0x6e, + 0x6d,0x6f,0x64,0x69,0x66,0x69,0x65,0x64,0x2c,0x20,0x61,0x6e,0x64,0x20,0x74,0x68, + 0x65,0x72,0x65,0x20,0x69,0x73,0x20,0x6e,0x6f,0x20,0x63,0x68,0x61,0x72,0x67,0x65, + 0x20,0x66,0x6f,0x72,0x20,0x74,0x68,0x65,0x20,0x73,0x6f,0x66,0x74,0x77,0x61,0x72, + 0x65,0x20,0x69,0x74,0x73,0x65,0x6c,0x66,0x2c,0x20,0x6e,0x6f,0x72,0x20,0x66,0x6f, + 0x72,0x20,0x74,0x68,0x65,0xa,0x6d,0x65,0x64,0x69,0x75,0x6d,0x20,0x75,0x70,0x6f, + 0x6e,0x20,0x77,0x68,0x69,0x63,0x68,0x20,0x74,0x68,0x65,0x20,0x73,0x6f,0x66,0x74, + 0x77,0x61,0x72,0x65,0x20,0x69,0x73,0x20,0x64,0x69,0x73,0x74,0x72,0x69,0x62,0x75, + 0x74,0x65,0x64,0x2e,0x20,0x54,0x68,0x65,0x20,0x72,0x65,0x70,0x72,0x6f,0x64,0x75, + 0x63,0x74,0x69,0x6f,0x6e,0x20,0x6f,0x66,0x20,0x6d,0x6f,0x64,0x69,0x66,0x69,0x65, + 0x64,0x20,0x6f,0x72,0xa,0x64,0x65,0x72,0x69,0x76,0x61,0x74,0x69,0x76,0x65,0x20, + 0x77,0x6f,0x72,0x6b,0x73,0x20,0x6f,0x66,0x20,0x74,0x68,0x65,0x20,0x73,0x6f,0x66, + 0x74,0x77,0x61,0x72,0x65,0x20,0x69,0x73,0x20,0x73,0x74,0x72,0x69,0x63,0x74,0x6c, + 0x79,0x20,0x70,0x72,0x6f,0x68,0x69,0x62,0x69,0x74,0x65,0x64,0x20,0x77,0x69,0x74, + 0x68,0x6f,0x75,0x74,0x20,0x74,0x68,0x65,0x20,0x65,0x78,0x70,0x72,0x65,0x73,0x73, + 0xa,0x63,0x6f,0x6e,0x73,0x65,0x6e,0x74,0x20,0x6f,0x66,0x20,0x74,0x68,0x65,0x20, + 0x6c,0x69,0x63,0x65,0x6e,0x73,0x6f,0x72,0x2e,0xa,0x3c,0x68,0x72,0x3e,0xa,0xa, + 0x3c,0x68,0x32,0x3e,0x3c,0x75,0x3e,0x33,0x2e,0x20,0x4c,0x69,0x6d,0x69,0x74,0x61, + 0x74,0x69,0x6f,0x6e,0x73,0x3c,0x2f,0x75,0x3e,0x3c,0x2f,0x68,0x32,0x3e,0x3c,0x62, + 0x72,0x3e,0xa,0xa,0x54,0x68,0x69,0x73,0x20,0x6c,0x69,0x63,0x65,0x6e,0x73,0x65, + 0x20,0x64,0x6f,0x65,0x73,0x20,0x6e,0x6f,0x74,0x20,0x67,0x72,0x61,0x6e,0x74,0x20, + 0x79,0x6f,0x75,0x20,0x61,0x6e,0x79,0x20,0x72,0x69,0x67,0x68,0x74,0x73,0x20,0x74, + 0x6f,0x20,0x75,0x73,0x65,0x20,0x74,0x68,0x65,0x20,0x6c,0x69,0x63,0x65,0x6e,0x73, + 0x6f,0x72,0x27,0x73,0x20,0x6e,0x61,0x6d,0x65,0x2c,0x20,0x6c,0x6f,0x67,0x6f,0x20, + 0x6f,0x72,0xa,0x74,0x72,0x61,0x64,0x65,0x6d,0x61,0x72,0x6b,0x73,0x2e,0x3c,0x62, + 0x72,0x3e,0xa,0x3c,0x62,0x72,0x3e,0xa,0xa,0x54,0x68,0x65,0x20,0x73,0x6f,0x66, + 0x74,0x77,0x61,0x72,0x65,0x20,0x69,0x73,0x20,0x70,0x72,0x6f,0x76,0x69,0x64,0x65, + 0x64,0x20,0x22,0x61,0x73,0x20,0x69,0x73,0x22,0x2c,0x20,0x61,0x6e,0x64,0x20,0x61, + 0x6e,0x79,0x20,0x65,0x78,0x70,0x72,0x65,0x73,0x73,0x20,0x6f,0x72,0x20,0x69,0x6d, + 0x70,0x6c,0x69,0x65,0x64,0x20,0x77,0x61,0x72,0x72,0x61,0x6e,0x74,0x69,0x65,0x73, + 0x2c,0xa,0x69,0x6e,0x63,0x6c,0x75,0x64,0x69,0x6e,0x67,0x2c,0x20,0x62,0x75,0x74, + 0x20,0x6e,0x6f,0x74,0x20,0x6c,0x69,0x6d,0x69,0x74,0x65,0x64,0x20,0x74,0x6f,0x2c, + 0x20,0x74,0x68,0x65,0x20,0x69,0x6d,0x70,0x6c,0x69,0x65,0x64,0x20,0x77,0x61,0x72, + 0x72,0x61,0x6e,0x74,0x69,0x65,0x73,0x20,0x6f,0x66,0x20,0x6d,0x65,0x72,0x63,0x68, + 0x61,0x6e,0x74,0x61,0x62,0x69,0x6c,0x69,0x74,0x79,0x20,0x61,0x6e,0x64,0xa,0x66, + 0x69,0x74,0x6e,0x65,0x73,0x73,0x20,0x66,0x6f,0x72,0x20,0x61,0x20,0x70,0x61,0x72, + 0x74,0x69,0x63,0x75,0x6c,0x61,0x72,0x20,0x70,0x75,0x72,0x70,0x6f,0x73,0x65,0x20, + 0x61,0x72,0x65,0x20,0x64,0x69,0x73,0x63,0x6c,0x61,0x69,0x6d,0x65,0x64,0x2e,0x20, + 0x49,0x6e,0x20,0x6e,0x6f,0x20,0x65,0x76,0x65,0x6e,0x74,0x20,0x73,0x68,0x61,0x6c, + 0x6c,0x20,0x74,0x68,0x65,0x20,0x6c,0x69,0x63,0x65,0x6e,0x73,0x6f,0x72,0xa,0x62, + 0x65,0x20,0x6c,0x69,0x61,0x62,0x6c,0x65,0x20,0x66,0x6f,0x72,0x20,0x61,0x6e,0x79, + 0x20,0x64,0x69,0x72,0x65,0x63,0x74,0x2c,0x20,0x69,0x6e,0x64,0x69,0x72,0x65,0x63, + 0x74,0x2c,0x20,0x69,0x6e,0x63,0x69,0x64,0x65,0x6e,0x74,0x61,0x6c,0x2c,0x20,0x73, + 0x70,0x65,0x63,0x69,0x61,0x6c,0x2c,0x20,0x65,0x78,0x65,0x6d,0x70,0x6c,0x61,0x72, + 0x79,0x2c,0x20,0x6f,0x72,0xa,0x63,0x6f,0x6e,0x73,0x65,0x71,0x75,0x65,0x6e,0x74, + 0x69,0x61,0x6c,0x20,0x64,0x61,0x6d,0x61,0x67,0x65,0x73,0x20,0x28,0x69,0x6e,0x63, + 0x6c,0x75,0x64,0x69,0x6e,0x67,0x2c,0x20,0x62,0x75,0x74,0x20,0x6e,0x6f,0x74,0x20, + 0x6c,0x69,0x6d,0x69,0x74,0x65,0x64,0x20,0x74,0x6f,0x2c,0x20,0x70,0x72,0x6f,0x63, + 0x75,0x72,0x65,0x6d,0x65,0x6e,0x74,0x20,0x6f,0x66,0x20,0x73,0x62,0x75,0x73,0x74, + 0x69,0x74,0x75,0x74,0x65,0xa,0x67,0x6f,0x6f,0x64,0x73,0x20,0x6f,0x72,0x20,0x73, + 0x65,0x72,0x76,0x69,0x63,0x65,0x73,0x3b,0x20,0x6c,0x6f,0x73,0x73,0x20,0x6f,0x66, + 0x20,0x75,0x73,0x65,0x2c,0x20,0x64,0x61,0x74,0x61,0x2c,0x20,0x6f,0x72,0x20,0x70, + 0x72,0x6f,0x66,0x69,0x74,0x73,0x3b,0x20,0x6f,0x72,0x20,0x62,0x75,0x73,0x69,0x6e, + 0x65,0x73,0x73,0x20,0x69,0x6e,0x74,0x65,0x72,0x72,0x75,0x70,0x74,0x69,0x6f,0x6e, + 0x29,0xa,0x68,0x6f,0x77,0x65,0x76,0x65,0x72,0x20,0x63,0x61,0x75,0x73,0x65,0x64, + 0x20,0x61,0x6e,0x64,0x20,0x6f,0x6e,0x20,0x61,0x6e,0x79,0x20,0x74,0x68,0x65,0x6f, + 0x72,0x79,0x20,0x6f,0x66,0x20,0x6c,0x69,0x61,0x62,0x69,0x6c,0x69,0x74,0x79,0x2c, + 0x20,0x77,0x68,0x65,0x74,0x68,0x65,0x72,0x20,0x69,0x6e,0x20,0x63,0x6f,0x6e,0x74, + 0x72,0x61,0x63,0x74,0x2c,0x20,0x73,0x74,0x72,0x69,0x63,0x74,0xa,0x6c,0x69,0x61, + 0x62,0x69,0x6c,0x69,0x74,0x79,0x2c,0x20,0x6f,0x72,0x20,0x74,0x6f,0x72,0x74,0x20, + 0x28,0x69,0x6e,0x63,0x6c,0x75,0x64,0x69,0x6e,0x67,0x20,0x6e,0x65,0x67,0x6c,0x69, + 0x67,0x65,0x6e,0x63,0x65,0x20,0x6f,0x72,0x20,0x6f,0x74,0x68,0x65,0x72,0x77,0x69, + 0x73,0x65,0x29,0x20,0x61,0x72,0x69,0x73,0x69,0x6e,0x67,0x20,0x69,0x6e,0x20,0x61, + 0x6e,0x79,0x20,0x77,0x61,0x79,0x20,0x6f,0x75,0x74,0x20,0x6f,0x66,0xa,0x74,0x68, + 0x65,0x20,0x75,0x73,0x65,0x20,0x6f,0x66,0x20,0x74,0x68,0x65,0x20,0x73,0x6f,0x66, + 0x74,0x77,0x61,0x72,0x65,0x2c,0x20,0x65,0x76,0x65,0x6e,0x20,0x69,0x66,0x20,0x61, + 0x64,0x76,0x69,0x73,0x65,0x64,0x20,0x6f,0x66,0x20,0x74,0x68,0x65,0x20,0x70,0x6f, + 0x73,0x73,0x69,0x62,0x69,0x6c,0x69,0x74,0x79,0x20,0x6f,0x66,0x20,0x73,0x75,0x63, + 0x68,0x20,0x64,0x61,0x6d,0x61,0x67,0x65,0x2e,0x3c,0x62,0x72,0x3e,0xa,0x3c,0x62, + 0x72,0x3e,0xa,0xa,0x49,0x6e,0x20,0x74,0x68,0x65,0x20,0x65,0x76,0x65,0x6e,0x74, + 0x20,0x74,0x68,0x61,0x74,0x20,0x74,0x68,0x69,0x73,0x20,0x6c,0x69,0x63,0x65,0x6e, + 0x73,0x65,0x20,0x69,0x73,0x20,0x64,0x65,0x74,0x65,0x72,0x6d,0x69,0x6e,0x65,0x64, + 0x20,0x74,0x6f,0x20,0x62,0x65,0x20,0x69,0x6e,0x76,0x61,0x6c,0x69,0x64,0x20,0x6f, + 0x72,0x20,0x75,0x6e,0x65,0x6e,0x66,0x6f,0x72,0x63,0x65,0x61,0x62,0x6c,0x65,0x2c, + 0x20,0x74,0x68,0x65,0xa,0x47,0x72,0x61,0x6e,0x74,0x20,0x6f,0x66,0x20,0x52,0x69, + 0x67,0x68,0x74,0x73,0x20,0x77,0x69,0x6c,0x6c,0x20,0x62,0x65,0x63,0x6f,0x6d,0x65, + 0x20,0x6e,0x75,0x6c,0x6c,0x20,0x61,0x6e,0x64,0x20,0x76,0x6f,0x69,0x64,0x2c,0x20, + 0x61,0x6e,0x64,0x20,0x6e,0x6f,0x20,0x72,0x69,0x67,0x68,0x74,0x73,0x20,0x73,0x68, + 0x61,0x6c,0x6c,0x20,0x62,0x65,0x20,0x67,0x72,0x61,0x6e,0x74,0x65,0x64,0x20,0x74, + 0x6f,0x20,0x74,0x68,0x65,0xa,0x6c,0x69,0x63,0x65,0x6e,0x73,0x65,0x65,0x2c,0x20, + 0x77,0x69,0x74,0x68,0x69,0x6e,0x20,0x74,0x68,0x65,0x20,0x73,0x63,0x6f,0x70,0x65, + 0x20,0x6f,0x66,0x20,0x55,0x2e,0x53,0x2e,0x20,0x63,0x6f,0x70,0x79,0x72,0x69,0x67, + 0x68,0x74,0x20,0x6c,0x61,0x77,0x2e,0xa,0x3c,0x68,0x72,0x3e,0xa,0xa,0x3c,0x68, + 0x32,0x3e,0x3c,0x75,0x3e,0x34,0x2e,0x20,0x45,0x78,0x65,0x6d,0x70,0x74,0x69,0x6f, + 0x6e,0x73,0x3c,0x2f,0x75,0x3e,0x3c,0x2f,0x68,0x32,0x3e,0x3c,0x62,0x72,0x3e,0xa, + 0xa,0x54,0x68,0x65,0x20,0x73,0x6f,0x66,0x74,0x77,0x61,0x72,0x65,0x20,0x69,0x6e, + 0x63,0x6c,0x75,0x64,0x65,0x73,0x20,0x74,0x68,0x65,0x20,0x77,0x6f,0x72,0x6b,0x20, + 0x6f,0x66,0x20,0x6f,0x74,0x68,0x65,0x72,0x20,0x63,0x6f,0x70,0x79,0x72,0x69,0x67, + 0x68,0x74,0x73,0x20,0x68,0x6f,0x6c,0x64,0x65,0x72,0x73,0x2c,0x20,0x77,0x68,0x69, + 0x63,0x68,0x20,0x69,0x73,0x20,0x6c,0x69,0x63,0x65,0x6e,0x73,0x65,0x64,0xa,0x75, + 0x6e,0x64,0x65,0x72,0x20,0x64,0x69,0x66,0x66,0x65,0x72,0x65,0x6e,0x74,0x20,0x61, + 0x67,0x72,0x65,0x65,0x6d,0x65,0x6e,0x74,0x73,0x2c,0x20,0x61,0x6e,0x64,0x20,0x65, + 0x78,0x65,0x6d,0x70,0x74,0x20,0x66,0x72,0x6f,0x6d,0x20,0x74,0x68,0x69,0x73,0x20, + 0x6c,0x69,0x63,0x65,0x6e,0x73,0x65,0x2e,0x20,0x42,0x65,0x6c,0x6f,0x77,0x20,0x69, + 0x73,0x20,0x61,0x20,0x63,0x6f,0x6d,0x70,0x6c,0x65,0x74,0x65,0xa,0x6c,0x69,0x73, + 0x74,0x20,0x6f,0x66,0x20,0x61,0x6c,0x6c,0x20,0x73,0x75,0x63,0x68,0x20,0x73,0x6f, + 0x66,0x74,0x77,0x61,0x72,0x65,0x2c,0x20,0x61,0x6e,0x64,0x20,0x74,0x68,0x65,0x69, + 0x72,0x20,0x72,0x65,0x73,0x70,0x65,0x63,0x74,0x69,0x76,0x65,0x20,0x63,0x6f,0x70, + 0x79,0x72,0x69,0x67,0x68,0x74,0x20,0x68,0x6f,0x6c,0x64,0x65,0x72,0x73,0x20,0x61, + 0x6e,0x64,0x20,0x6c,0x69,0x63,0x65,0x6e,0x73,0x65,0x73,0x2e,0xa,0x4e,0x6f,0x74, + 0x65,0x20,0x74,0x68,0x61,0x74,0x20,0x65,0x78,0x70,0x6c,0x69,0x63,0x69,0x74,0x20, + 0x70,0x65,0x72,0x6d,0x69,0x73,0x73,0x69,0x6f,0x6e,0x20,0x68,0x61,0x73,0x20,0x62, + 0x65,0x65,0x6e,0x20,0x67,0x72,0x61,0x6e,0x74,0x65,0x64,0x20,0x74,0x6f,0x20,0x74, + 0x68,0x65,0x20,0x6c,0x69,0x63,0x65,0x6e,0x73,0x6f,0x72,0x20,0x74,0x6f,0x20,0x75, + 0x73,0x65,0x20,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65,0x64,0xa,0x73,0x6f,0x66,0x74, + 0x77,0x61,0x72,0x65,0x20,0x77,0x68,0x69,0x63,0x68,0x20,0x69,0x73,0x20,0x6f,0x72, + 0x64,0x69,0x6e,0x61,0x72,0x69,0x6c,0x79,0x20,0x6e,0x6f,0x74,0x20,0x63,0x6f,0x6d, + 0x70,0x61,0x74,0x69,0x62,0x6c,0x65,0x20,0x77,0x69,0x74,0x68,0x20,0x74,0x68,0x69, + 0x73,0x20,0x6c,0x69,0x63,0x65,0x6e,0x73,0x65,0x2c,0x20,0x73,0x75,0x63,0x68,0x20, + 0x61,0x73,0x20,0x74,0x68,0x65,0x20,0x47,0x50,0x4c,0x2e,0xa,0x3c,0x62,0x72,0x3e, + 0xa,0xa,0x3c,0x74,0x61,0x62,0x6c,0x65,0x20,0x62,0x6f,0x72,0x64,0x65,0x72,0x3d, + 0x22,0x31,0x22,0x20,0x63,0x65,0x6c,0x6c,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3d, + 0x22,0x33,0x22,0x3e,0xa,0x20,0x20,0x3c,0x74,0x72,0x3e,0x3c,0x74,0x64,0x3e,0x3c, + 0x62,0x3e,0x4e,0x61,0x6d,0x65,0x3c,0x2f,0x62,0x3e,0x3c,0x2f,0x74,0x64,0x3e,0x3c, + 0x74,0x64,0x3e,0x3c,0x62,0x3e,0x4c,0x69,0x63,0x65,0x6e,0x73,0x65,0x3c,0x2f,0x62, + 0x3e,0x3c,0x2f,0x74,0x64,0x3e,0x3c,0x74,0x64,0x3e,0x3c,0x62,0x3e,0x41,0x75,0x74, + 0x68,0x6f,0x72,0x28,0x73,0x29,0x3c,0x2f,0x62,0x3e,0x3c,0x2f,0x74,0x64,0x3e,0x3c, + 0x2f,0x74,0x72,0x3e,0xa,0xa,0x20,0x20,0x3c,0x74,0x72,0x3e,0x3c,0x74,0x64,0x3e, + 0x43,0x78,0x34,0x20,0x65,0x6d,0x75,0x6c,0x61,0x74,0x6f,0x72,0x3c,0x2f,0x74,0x64, + 0x3e,0x3c,0x74,0x64,0x3e,0x3c,0x2f,0x74,0x64,0x3e,0x3c,0x74,0x64,0x3e,0x61,0x6e, + 0x6f,0x6d,0x69,0x65,0x2c,0x20,0x4b,0x72,0x69,0x73,0x20,0x42,0x6c,0x65,0x61,0x6b, + 0x6c,0x65,0x79,0x2c,0x20,0x4e,0x61,0x63,0x68,0x2c,0x20,0x7a,0x73,0x4b,0x6e,0x69, + 0x67,0x68,0x74,0x3c,0x2f,0x74,0x64,0x3e,0x3c,0x2f,0x74,0x72,0x3e,0xa,0x20,0x20, + 0x3c,0x74,0x72,0x3e,0x3c,0x74,0x64,0x3e,0x44,0x53,0x50,0x2d,0x31,0x20,0x65,0x6d, + 0x75,0x6c,0x61,0x74,0x6f,0x72,0x3c,0x2f,0x74,0x64,0x3e,0x3c,0x74,0x64,0x3e,0x3c, + 0x2f,0x74,0x64,0x3e,0x3c,0x74,0x64,0x3e,0x41,0x6e,0x64,0x72,0x65,0x61,0x73,0x20, + 0x4e,0x61,0x69,0x76,0x65,0x2c,0x20,0x4a,0x6f,0x68,0x6e,0x20,0x57,0x65,0x69,0x64, + 0x6d,0x61,0x6e,0x2c,0x20,0x4b,0x72,0x69,0x73,0x20,0x42,0x6c,0x65,0x61,0x6b,0x6c, + 0x65,0x79,0x2c,0x20,0x6e,0x65,0x76,0x69,0x6b,0x73,0x74,0x69,0x3c,0x2f,0x74,0x64, + 0x3e,0x3c,0x2f,0x74,0x72,0x3e,0xa,0x20,0x20,0x3c,0x74,0x72,0x3e,0x3c,0x74,0x64, + 0x3e,0x44,0x53,0x50,0x2d,0x32,0x20,0x65,0x6d,0x75,0x6c,0x61,0x74,0x6f,0x72,0x3c, + 0x2f,0x74,0x64,0x3e,0x3c,0x74,0x64,0x3e,0x3c,0x2f,0x74,0x64,0x3e,0x3c,0x74,0x64, + 0x3e,0x4b,0x72,0x69,0x73,0x20,0x42,0x6c,0x65,0x61,0x6b,0x6c,0x65,0x79,0x3c,0x2f, + 0x74,0x64,0x3e,0x3c,0x2f,0x74,0x72,0x3e,0xa,0x20,0x20,0x3c,0x74,0x72,0x3e,0x3c, + 0x74,0x64,0x3e,0x44,0x53,0x50,0x2d,0x33,0x20,0x65,0x6d,0x75,0x6c,0x61,0x74,0x6f, + 0x72,0x3c,0x2f,0x74,0x64,0x3e,0x3c,0x74,0x64,0x3e,0x3c,0x2f,0x74,0x64,0x3e,0x3c, + 0x74,0x64,0x3e,0x4a,0x6f,0x68,0x6e,0x20,0x57,0x65,0x69,0x64,0x6d,0x61,0x6e,0x2c, + 0x20,0x4b,0x72,0x69,0x73,0x20,0x42,0x6c,0x65,0x61,0x6b,0x6c,0x65,0x79,0x2c,0x20, + 0x4c,0x61,0x6e,0x63,0x65,0x72,0x2c,0x20,0x7a,0x38,0x30,0x20,0x67,0x61,0x69,0x64, + 0x65,0x6e,0x3c,0x2f,0x74,0x64,0x3e,0x3c,0x2f,0x74,0x72,0x3e,0xa,0x20,0x20,0x3c, + 0x74,0x72,0x3e,0x3c,0x74,0x64,0x3e,0x44,0x53,0x50,0x2d,0x34,0x20,0x65,0x6d,0x75, + 0x6c,0x61,0x74,0x6f,0x72,0x3c,0x2f,0x74,0x64,0x3e,0x3c,0x74,0x64,0x3e,0x3c,0x2f, + 0x74,0x64,0x3e,0x3c,0x74,0x64,0x3e,0x44,0x72,0x65,0x61,0x6d,0x65,0x72,0x20,0x4e, + 0x6f,0x6d,0x2c,0x20,0x4a,0x6f,0x68,0x6e,0x20,0x57,0x65,0x69,0x64,0x6d,0x61,0x6e, + 0x2c,0x20,0x4b,0x72,0x69,0x73,0x20,0x42,0x6c,0x65,0x61,0x6b,0x6c,0x65,0x79,0x2c, + 0x20,0x4e,0x61,0x63,0x68,0x2c,0x20,0x7a,0x38,0x30,0x20,0x67,0x61,0x69,0x64,0x65, + 0x6e,0x3c,0x2f,0x74,0x64,0x3e,0x3c,0x2f,0x74,0x72,0x3e,0xa,0x20,0x20,0x3c,0x74, + 0x72,0x3e,0x3c,0x74,0x64,0x3e,0x53,0x2d,0x44,0x44,0x31,0x20,0x64,0x65,0x63,0x6f, + 0x6d,0x70,0x72,0x65,0x73,0x73,0x6f,0x72,0x3c,0x2f,0x74,0x64,0x3e,0x3c,0x74,0x64, + 0x3e,0x50,0x75,0x62,0x6c,0x69,0x63,0x20,0x44,0x6f,0x6d,0x61,0x69,0x6e,0x3c,0x2f, + 0x74,0x64,0x3e,0x3c,0x74,0x64,0x3e,0x41,0x6e,0x64,0x72,0x65,0x61,0x73,0x20,0x4e, + 0x61,0x69,0x76,0x65,0x3c,0x2f,0x74,0x64,0x3e,0x3c,0x2f,0x74,0x72,0x3e,0xa,0x20, + 0x20,0x3c,0x74,0x72,0x3e,0x3c,0x74,0x64,0x3e,0x53,0x2d,0x44,0x53,0x50,0x20,0x65, + 0x6d,0x75,0x6c,0x61,0x74,0x6f,0x72,0x3c,0x2f,0x74,0x64,0x3e,0x3c,0x74,0x64,0x3e, + 0x4c,0x47,0x50,0x4c,0x20,0x32,0x2e,0x31,0x3c,0x2f,0x74,0x64,0x3e,0x3c,0x74,0x64, + 0x3e,0x53,0x68,0x61,0x79,0x20,0x47,0x72,0x65,0x65,0x6e,0x3c,0x2f,0x74,0x64,0x3e, + 0x3c,0x2f,0x74,0x72,0x3e,0xa,0x20,0x20,0x3c,0x74,0x72,0x3e,0x3c,0x74,0x64,0x3e, + 0x53,0x50,0x43,0x37,0x31,0x31,0x30,0x20,0x64,0x65,0x63,0x6f,0x6d,0x70,0x72,0x65, + 0x73,0x73,0x6f,0x72,0x3c,0x2f,0x74,0x64,0x3e,0x3c,0x74,0x64,0x3e,0x50,0x75,0x62, + 0x6c,0x69,0x63,0x20,0x44,0x6f,0x6d,0x61,0x69,0x6e,0x3c,0x2f,0x74,0x64,0x3e,0x3c, + 0x74,0x64,0x3e,0x6e,0x65,0x76,0x69,0x6b,0x73,0x74,0x69,0x3c,0x2f,0x74,0x64,0x3e, + 0x3c,0x2f,0x74,0x72,0x3e,0xa,0x20,0x20,0x3c,0x74,0x72,0x3e,0x3c,0x74,0x64,0x3e, + 0x53,0x54,0x2d,0x30,0x30,0x31,0x30,0x20,0x65,0x6d,0x75,0x6c,0x61,0x74,0x6f,0x72, + 0x3c,0x2f,0x74,0x64,0x3e,0x3c,0x74,0x64,0x3e,0x3c,0x2f,0x74,0x64,0x3e,0x3c,0x74, + 0x64,0x3e,0x46,0x65,0x61,0x74,0x68,0x65,0x72,0x2c,0x20,0x4a,0x6f,0x68,0x6e,0x20, + 0x57,0x65,0x69,0x64,0x6d,0x61,0x6e,0x2c,0x20,0x4b,0x72,0x69,0x73,0x20,0x42,0x6c, + 0x65,0x61,0x6b,0x6c,0x65,0x79,0x2c,0x20,0x4d,0x61,0x74,0x74,0x68,0x65,0x77,0x20, + 0x4b,0x65,0x6e,0x64,0x6f,0x72,0x61,0x3c,0x2f,0x74,0x64,0x3e,0x3c,0x2f,0x74,0x72, + 0x3e,0xa,0xa,0x20,0x20,0x3c,0x74,0x72,0x3e,0x3c,0x74,0x64,0x3e,0x51,0x74,0x20, + 0x74,0x6f,0x6f,0x6c,0x6b,0x69,0x74,0x3c,0x2f,0x74,0x64,0x3e,0x3c,0x74,0x64,0x3e, + 0x4c,0x47,0x50,0x4c,0x20,0x32,0x2e,0x31,0x3c,0x2f,0x74,0x64,0x3e,0x3c,0x74,0x64, + 0x3e,0x4e,0x6f,0x6b,0x69,0x61,0x3c,0x2f,0x74,0x64,0x3e,0x3c,0x2f,0x74,0x72,0x3e, + 0xa,0x20,0x20,0x3c,0x74,0x72,0x3e,0x3c,0x74,0x64,0x3e,0x48,0x51,0x32,0x78,0x20, + 0x66,0x69,0x6c,0x74,0x65,0x72,0x3c,0x2f,0x74,0x64,0x3e,0x3c,0x74,0x64,0x3e,0x4c, + 0x47,0x50,0x4c,0x20,0x32,0x2e,0x31,0x3c,0x2f,0x74,0x64,0x3e,0x3c,0x74,0x64,0x3e, + 0x4d,0x61,0x78,0x53,0x54,0x3c,0x2f,0x74,0x64,0x3e,0x3c,0x2f,0x74,0x72,0x3e,0xa, + 0x20,0x20,0x3c,0x74,0x72,0x3e,0x3c,0x74,0x64,0x3e,0x4a,0x4d,0x41,0x20,0x64,0x65, + 0x63,0x6f,0x6d,0x70,0x72,0x65,0x73,0x73,0x6f,0x72,0x3c,0x2f,0x74,0x64,0x3e,0x3c, + 0x74,0x64,0x3e,0x47,0x50,0x4c,0x20,0x32,0x3c,0x2f,0x74,0x64,0x3e,0x3c,0x74,0x64, + 0x3e,0x4e,0x53,0x52,0x54,0x20,0x74,0x65,0x61,0x6d,0x3c,0x2f,0x74,0x64,0x3e,0x3c, + 0x2f,0x74,0x72,0x3e,0xa,0x20,0x20,0x3c,0x74,0x72,0x3e,0x3c,0x74,0x64,0x3e,0x4e, + 0x54,0x53,0x43,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x3c,0x2f,0x74,0x64,0x3e,0x3c, + 0x74,0x64,0x3e,0x4c,0x47,0x50,0x4c,0x20,0x32,0x2e,0x31,0x3c,0x2f,0x74,0x64,0x3e, + 0x3c,0x74,0x64,0x3e,0x53,0x68,0x61,0x79,0x20,0x47,0x72,0x65,0x65,0x6e,0x3c,0x2f, + 0x74,0x64,0x3e,0x3c,0x2f,0x74,0x72,0x3e,0xa,0x20,0x20,0x3c,0x74,0x72,0x3e,0x3c, + 0x74,0x64,0x3e,0x7a,0x6c,0x69,0x62,0x20,0x64,0x65,0x63,0x6f,0x6d,0x70,0x72,0x65, + 0x73,0x73,0x6f,0x72,0x3c,0x2f,0x74,0x64,0x3e,0x3c,0x74,0x64,0x3e,0x7a,0x6c,0x69, + 0x62,0x20,0x6c,0x69,0x63,0x65,0x6e,0x73,0x65,0x3c,0x2f,0x74,0x64,0x3e,0x3c,0x74, + 0x64,0x3e,0x7a,0x6c,0x69,0x62,0x20,0x74,0x65,0x61,0x6d,0x3c,0x2f,0x74,0x64,0x3e, + 0x3c,0x2f,0x74,0x72,0x3e,0xa,0x3c,0x2f,0x74,0x61,0x62,0x6c,0x65,0x3e,0xa,0xa, + 0x3c,0x2f,0x62,0x6f,0x64,0x79,0x3e,0xa,0x3c,0x2f,0x68,0x74,0x6d,0x6c,0x3e,0xa, + + // /Users/david/Devel/arch/snes/tools/bsnes_v046/data/joypad.png + 0x0,0x1,0x91,0x7a, + 0x89, + 0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0, + 0x0,0x1,0xe0,0x0,0x0,0x0,0xd2,0x8,0x6,0x0,0x0,0x0,0x92,0x11,0x13,0x87, + 0x0,0x0,0x0,0x6,0x62,0x4b,0x47,0x44,0x0,0xff,0x0,0xff,0x0,0xff,0xa0,0xbd, + 0xa7,0x93,0x0,0x1,0x91,0x2f,0x49,0x44,0x41,0x54,0x78,0xda,0xdc,0xbd,0x67,0x94, + 0x5e,0x47,0x7a,0x1e,0x38,0xa3,0x19,0x5,0x4b,0xd6,0xda,0x2b,0x7b,0x6d,0xc9,0x2b, + 0xc9,0x92,0x25,0xad,0x34,0xd2,0x8c,0x24,0x5b,0x9a,0xc0,0x88,0xc8,0x38,0xcc,0x99, + 0x60,0x2,0x9,0x82,0x4,0x48,0x4,0x22,0xe7,0x6,0x3a,0x3,0x8d,0x9c,0x88,0x9c, + 0x1a,0xd,0x74,0x3,0x68,0xa0,0xbb,0x81,0x46,0x3,0x8d,0xd4,0xe9,0xeb,0xf0,0x75, + 0x0,0x40,0x90,0x4,0x33,0x67,0x86,0xc3,0x19,0xc9,0xb2,0x7e,0xac,0xa5,0xe3,0x3d, + 0x6b,0x1f,0xdb,0xb5,0xf5,0xbc,0x55,0x6f,0xdd,0xb7,0xea,0xd6,0xfd,0xba,0x41,0x8e, + 0xb4,0x7b,0xb6,0xcf,0xa9,0x73,0xef,0xad,0x5b,0xe9,0x56,0x7f,0xf7,0x3e,0xf5,0xbc, + 0xa9,0xbe,0xf2,0x15,0xfd,0x97,0xcb,0xe5,0xbe,0xd2,0xdd,0xdd,0xed,0x12,0x5f,0xcb, + 0x7c,0x9c,0xcb,0xfc,0xb0,0x4c,0xa1,0x3a,0xb2,0x7c,0xa1,0x7b,0xc3,0xf5,0x1b,0x4b, + 0xb1,0x36,0x62,0xe7,0x59,0x75,0xb3,0x9e,0x79,0xb8,0x36,0xa,0x3d,0x4f,0xa1,0x7a, + 0x3d,0x3d,0x3d,0x94,0xc2,0xba,0x9d,0x9d,0x9d,0x48,0x5f,0xd5,0xe9,0xeb,0x9d,0x9d, + 0x1d,0x5f,0x37,0xc7,0xce,0xaf,0x77,0x74,0xe8,0x73,0x9d,0xf4,0xf1,0x6b,0x94,0x97, + 0x5c,0xe3,0xfe,0xcf,0xdb,0x23,0x9d,0xeb,0xfc,0x5f,0xa0,0x63,0xa7,0x3e,0x9a,0x32, + 0x38,0xc7,0xf1,0x17,0x6c,0x5b,0xbf,0x20,0x12,0xda,0xf9,0x5,0x7b,0xf,0xe5,0xd1, + 0xd6,0x2f,0xd2,0xb5,0xcd,0xb3,0xd7,0xbf,0xd8,0xe1,0x5f,0x87,0xc7,0x5f,0xd4,0xe5, + 0x7f,0xa9,0x23,0x69,0xeb,0xe7,0x3b,0xcd,0x98,0xbe,0xd2,0xd5,0xd5,0xe5,0xe6,0xa0, + 0xa7,0xbb,0xc7,0x3d,0x3b,0x52,0x38,0x3f,0x85,0xfe,0xe7,0x85,0xfe,0xb7,0x23,0xf9, + 0xff,0x17,0xfa,0xd,0x14,0xea,0xe3,0x8b,0xb4,0x17,0xfb,0xd,0x8f,0xe4,0xb7,0x3c, + 0x92,0xf7,0xa6,0xd0,0xef,0x30,0xeb,0x1d,0x1e,0xee,0xd9,0x6e,0x64,0xec,0xc3,0xcd, + 0xcf,0x17,0x79,0x5f,0x87,0x1b,0x57,0xa1,0x79,0xb8,0xd1,0xff,0x53,0xd6,0x6f,0x46, + 0xbe,0x97,0x32,0x89,0x77,0x13,0xef,0xa5,0x7e,0xff,0xe8,0x7d,0xca,0x7a,0xf,0x7e, + 0xc1,0xbe,0xb,0xa9,0xf7,0x43,0xbc,0x73,0x3f,0xdf,0x29,0xde,0x41,0xef,0xdc,0xbe, + 0xbf,0xe6,0xdc,0x5c,0xf3,0x7b,0x6a,0xde,0xe3,0xe4,0xda,0x7e,0x1f,0xf8,0xdd,0xfe, + 0xba,0xf8,0x6,0x7c,0xcd,0xde,0x47,0xd9,0xaf,0xb9,0x6f,0x86,0x79,0xf7,0xbf,0x66, + 0x9e,0xc1,0xbc,0x97,0xf2,0xdd,0x2c,0xf4,0x6d,0x1a,0xee,0x7f,0x57,0xe8,0xfb,0x59, + 0x68,0xbe,0xb3,0xca,0x16,0xfa,0xff,0x8e,0xe4,0xfb,0x3d,0x92,0x6f,0xf1,0x17,0x7d, + 0xf,0x6e,0xe4,0xdd,0x1d,0xc9,0x6f,0xde,0xfd,0xf1,0x3f,0x83,0xd3,0x70,0xd7,0x59, + 0x79,0xc3,0xa5,0x2f,0xda,0xce,0x8d,0xf6,0x95,0x55,0x7e,0x24,0xcf,0x35,0x92,0xfe, + 0xb2,0xee,0x27,0x93,0xde,0xe3,0xca,0xb5,0xb5,0xb5,0xfd,0xd2,0xa5,0x8b,0x17,0x7f, + 0xe3,0xdc,0xb9,0xd6,0x3f,0x3b,0x7b,0xf6,0xcc,0x5d,0xa7,0x4f,0x37,0xbf,0x74,0xaa, + 0xf9,0xe4,0xa2,0xe6,0xe6,0x53,0x6b,0x75,0xda,0xaf,0xaf,0x4f,0xb4,0xb4,0x9c,0xbe, + 0xd0,0x7c,0xfa,0x54,0xbe,0xe5,0xcc,0xe9,0x6b,0x67,0xce,0xb6,0x5c,0x3f,0xdb,0x7a, + 0xe6,0x7d,0x3a,0x9e,0x3d,0x43,0xe7,0x36,0xbd,0xd7,0xda,0x7a,0xd6,0x5d,0xeb,0xfb, + 0x74,0xd4,0x79,0xe6,0xfe,0x59,0xa4,0x96,0x8f,0x70,0x7d,0xee,0x7c,0xeb,0x47,0xb6, + 0xdc,0x47,0xad,0xe7,0xce,0xbe,0xaf,0x93,0x3c,0xe2,0xde,0x87,0xfa,0xf8,0x1,0x5d, + 0x9b,0x32,0x1f,0xe9,0xf1,0x7d,0xa4,0xeb,0x7d,0xa2,0xcf,0x3f,0x46,0x7d,0x7d,0x44, + 0x99,0x4f,0x74,0xfe,0xc7,0x74,0xcf,0xd4,0xa5,0xfb,0x26,0x5f,0x97,0x33,0x65,0x3f, + 0xd5,0xd7,0x9f,0xea,0xe3,0xc7,0x17,0x2f,0x5d,0xf8,0xe8,0xe2,0xc5,0xb,0xe8,0xff, + 0x3d,0xdd,0xc7,0x95,0x96,0x96,0xe6,0x81,0xe6,0xe6,0x93,0x1d,0xa7,0x4e,0x35,0x9d, + 0x6c,0x68,0x3c,0xb1,0xef,0xc4,0x89,0xe3,0x95,0x4d,0x4d,0x8d,0xcf,0xea,0x39,0xf9, + 0x35,0x9,0xc2,0x23,0x9d,0xeb,0x2f,0xf2,0x9b,0xfb,0x59,0xfc,0x46,0x7f,0x96,0xe5, + 0x47,0xfa,0xbb,0x94,0x1f,0xc9,0x91,0xb6,0x71,0x23,0xef,0x57,0xa1,0xb6,0xb3,0xfa, + 0xe7,0xeb,0xac,0xe3,0x97,0x79,0x97,0x86,0xeb,0xeb,0x1f,0x32,0xe1,0xb7,0x78,0xfe, + 0xfc,0xf9,0x7f,0x59,0x5d,0x7d,0x60,0xc2,0xae,0x5d,0x3b,0x4a,0x76,0xec,0xd8,0x76, + 0x60,0xf7,0xee,0x9d,0x8d,0xfb,0xf7,0xef,0xbd,0x54,0x7d,0xf0,0x40,0x7f,0x6d,0xed, + 0xa1,0x6b,0xf5,0xf5,0x47,0xaf,0xeb,0xdf,0xf0,0x7,0xfa,0xf7,0xfc,0xd1,0x99,0x33, + 0xa7,0x3f,0xd1,0xef,0xcd,0xc7,0xf2,0x7d,0x38,0x2b,0xae,0xf5,0xb9,0xc9,0xc7,0x51, + 0xe7,0xe3,0xfd,0xc1,0x7b,0x66,0xdf,0x21,0x7e,0x7,0xdd,0xb9,0x4d,0x1f,0xe8,0x77, + 0x37,0x79,0x1f,0xcf,0xb7,0xd2,0x35,0x8e,0xf6,0x7d,0xfc,0xc0,0xbe,0xb7,0xef,0x53, + 0xc2,0xbb,0x7f,0xee,0xac,0xfd,0x6,0x50,0xba,0x8e,0xf7,0xce,0xe5,0x9d,0xa3,0x6f, + 0x5,0x25,0x7d,0xfe,0x9e,0xfe,0x36,0x5c,0xd7,0xed,0xbd,0xab,0xcf,0xaf,0xea,0xef, + 0x4c,0xff,0x99,0x33,0x2d,0x97,0x74,0x3a,0xa9,0xd3,0x3e,0xfd,0xd,0x5a,0xaf,0x8f, + 0xb,0x74,0x7a,0xa9,0xb5,0xb5,0xf5,0x1e,0x3d,0x17,0x7f,0xd6,0xd6,0x76,0xe9,0x5f, + 0xb7,0xb7,0xb7,0xff,0x13,0x9a,0xff,0xae,0xdc,0xb0,0xc0,0xfa,0xf,0xfd,0xce,0xfc, + 0x63,0xfc,0xe,0x7e,0x16,0xfd,0xdf,0xc8,0xfb,0xe6,0xfe,0xc2,0x97,0x4e,0xbe,0x7c, + 0xb1,0xfc,0x91,0xa6,0xe1,0xea,0xc7,0x5e,0xf8,0x42,0xed,0x8c,0xb4,0x7c,0x56,0xff, + 0x37,0xfa,0x9c,0x85,0xfa,0x92,0x3f,0x48,0xac,0x2a,0xf5,0xf,0xf6,0x57,0xcf,0x9f, + 0x3f,0xf7,0x47,0x1a,0x54,0x1f,0x3c,0x79,0xb2,0x69,0x41,0x63,0x53,0x43,0xb5,0x6, + 0xda,0x76,0x7d,0xfd,0xa9,0x7e,0x9,0xfe,0xee,0xc2,0xc5,0xb,0xaa,0xb3,0xab,0x53, + 0xf5,0xf4,0x76,0xab,0xfe,0xc1,0x7e,0x35,0x78,0x79,0x50,0x5d,0x79,0xeb,0x8a,0x7a, + 0xeb,0xed,0xb7,0xd4,0xb5,0x77,0xae,0xa9,0xb7,0xdf,0x7d,0xdb,0xa5,0x77,0xdf,0x7b, + 0x97,0x12,0xce,0xdf,0xb9,0xfe,0xae,0xbb,0x96,0xe9,0x9d,0xeb,0xef,0x78,0xd7,0xd7, + 0xdf,0xbf,0x6e,0xcf,0xaf,0xd3,0xf9,0x7b,0x1f,0xbc,0x47,0xc7,0xeb,0xef,0xbf,0xe7, + 0xca,0x24,0x79,0x7e,0x19,0xae,0x8f,0x6b,0x4e,0xb8,0x7e,0xff,0xc3,0xf7,0xd5,0x7, + 0x1f,0x7d,0x90,0x2a,0x4f,0x65,0xf4,0x3d,0x99,0xf7,0x83,0x1f,0xfd,0x40,0x7d,0xfe, + 0xd3,0xcf,0xd5,0xa7,0xfa,0x88,0xf6,0x6,0x86,0x6,0x54,0x57,0x77,0x97,0xba,0x70, + 0xe9,0xa2,0x6a,0x39,0x7b,0x46,0x9d,0x68,0x38,0xa1,0xaa,0xf,0x56,0xab,0x4d,0x9b, + 0x37,0xaa,0x8d,0x1b,0x37,0x5c,0xd4,0x20,0xfc,0xb5,0xe1,0x56,0x94,0xe6,0xff,0x1d, + 0x5b,0x85,0x17,0x60,0xb3,0xb9,0xee,0x61,0x57,0xad,0xa9,0x5,0x53,0xaa,0x4e,0xf7, + 0x88,0x56,0xbe,0xc3,0xad,0x86,0xb3,0xc6,0xc6,0xcf,0x20,0x9f,0x65,0x38,0x76,0x7f, + 0xa3,0xef,0xe5,0x48,0x58,0xe9,0x48,0x24,0x4e,0x74,0x9e,0xcb,0x66,0x29,0x85,0x58, + 0x47,0x36,0xd3,0xe9,0x1e,0x96,0xa9,0xe,0xf7,0xbf,0x1c,0xe9,0x3c,0x8f,0xa4,0xfc, + 0xc5,0x8b,0x17,0xbf,0xfa,0xdc,0xb3,0xcf,0x5c,0x78,0xf0,0xc1,0xfb,0xd5,0xe4,0xc9, + 0x2f,0xab,0xf9,0xb,0xe6,0xa9,0xf2,0x8a,0x32,0xb5,0x51,0xff,0x56,0x77,0xef,0xdd, + 0xad,0x8e,0x1c,0x3b,0xa2,0x9a,0x4e,0x36,0xa9,0xb3,0xe7,0xce,0xaa,0xf6,0xce,0x76, + 0x7a,0x7f,0xf1,0xce,0xe2,0xdd,0xc4,0x7b,0x88,0xdf,0x7f,0xec,0x7d,0xc,0xdf,0x37, + 0x4e,0xb1,0xf7,0x51,0xbe,0x77,0x61,0x5e,0xf8,0x4e,0xe2,0x1c,0xc7,0xf7,0xdd,0x3b, + 0xf8,0x7e,0x2a,0x9f,0xaf,0x39,0xef,0x3a,0x9d,0xeb,0x7c,0xfd,0x3e,0xd3,0x7b,0xfd, + 0xf1,0x87,0xf4,0x6e,0xe3,0x3e,0x7f,0x4f,0xae,0xbe,0x75,0x95,0xde,0xdb,0xde,0xbe, + 0x9e,0xff,0xd9,0xd9,0xd5,0xf1,0x7f,0xea,0x5,0x35,0x16,0xd6,0x1d,0x1a,0xb8,0x77, + 0xe9,0x5,0xfe,0xdc,0x73,0xad,0xad,0xf7,0x5f,0xb8,0x70,0xe1,0xf,0x35,0x30,0xff, + 0xa,0xbe,0x79,0xc9,0x6f,0xf3,0xcb,0xe1,0xc4,0x97,0xc1,0x9a,0x70,0xb1,0xf6,0x45, + 0x31,0x60,0x24,0xf7,0xa,0xbd,0x93,0x23,0xc1,0xb8,0xb0,0x8e,0xc7,0x80,0x91,0xac, + 0x18,0xd4,0x4b,0xf2,0x9e,0x2c,0x13,0x96,0xcf,0xba,0x17,0xe,0x28,0xab,0x7e,0xac, + 0x7c,0x58,0x36,0x36,0x96,0xac,0xb1,0x67,0x8d,0x3b,0x6b,0xac,0xb1,0xc9,0x93,0x65, + 0xe4,0x44,0xea,0x1f,0xe0,0x57,0xcf,0x9d,0x3b,0xf7,0xbb,0xa7,0x4e,0x9d,0x7c,0xbc, + 0xa1,0xe1,0xc4,0xca,0xa6,0x93,0x8d,0xa7,0x75,0xfa,0x91,0x5e,0x5d,0xfe,0xb7,0xb6, + 0xf6,0x4b,0x2a,0xd7,0x93,0xd3,0x2f,0xe9,0x80,0xba,0x7c,0xf5,0x8a,0xba,0xaa,0x1, + 0xf6,0xea,0xb5,0xab,0x1a,0x6c,0xaf,0xaa,0xc1,0xa1,0x41,0x95,0xef,0xef,0x23,0x60, + 0xea,0xe8,0xea,0x50,0x1d,0xfa,0x65,0xbe,0xd4,0x76,0x51,0x69,0x36,0xab,0x4e,0xb7, + 0x34,0x53,0x6a,0x39,0x83,0x74,0x5a,0x69,0xd0,0x56,0xba,0x3d,0x3a,0xca,0xd4,0x7a, + 0x4e,0x1f,0xcf,0x89,0x73,0x71,0x34,0xa9,0x25,0x7d,0x7e,0xce,0xb6,0x65,0x8f,0xa6, + 0x7c,0x4b,0xb4,0x9e,0xb9,0x7f,0xd6,0x5e,0xb7,0x88,0xf6,0x5a,0x68,0x9c,0xe1,0xb8, + 0x90,0x87,0xf1,0x9e,0xbf,0x70,0x8e,0x9e,0x45,0xbf,0xb4,0x74,0x1f,0x79,0x7a,0x4e, + 0x54,0xfd,0xf1,0x63,0xaa,0xee,0x48,0xad,0x6,0xdf,0x3,0x6a,0xf7,0x9e,0x5d,0x6a, + 0xf3,0xe6,0x4d,0xaa,0xbc,0xbc,0x54,0xd5,0xd6,0x1e,0xae,0xd0,0x6c,0xf8,0xb5,0xc6, + 0xc6,0x86,0x37,0x6c,0x9a,0xa1,0xaf,0xa7,0x37,0x36,0x35,0xe2,0x7c,0x5a,0x43,0x63, + 0xc3,0xcc,0x86,0x6,0x9d,0xf4,0x91,0xef,0xeb,0x34,0x5d,0x96,0x6f,0x6c,0x6c,0xf4, + 0xaf,0x9b,0xf8,0xba,0x91,0xf3,0x66,0xda,0xf6,0x92,0xf6,0xf5,0x39,0xb5,0x2d,0xae, + 0xc3,0xfb,0x22,0xcd,0x4c,0xce,0x1b,0x45,0xfb,0x3a,0x35,0x35,0xce,0x44,0xf9,0x6, + 0xb4,0xd7,0x40,0xe5,0xfc,0xfb,0xa2,0xbe,0x79,0x86,0xc6,0x99,0xfe,0xfd,0x46,0x3c, + 0xcf,0x34,0x7b,0xdf,0xb5,0xc7,0xf7,0x6d,0x1d,0x3a,0xea,0xdf,0xda,0xef,0x77,0x74, + 0x74,0x7c,0x45,0xa7,0x9f,0xb3,0xe9,0xab,0xf8,0xd,0x72,0x42,0x9e,0xbc,0xc6,0x6f, + 0xb6,0xb9,0xb9,0xf9,0xf,0xf5,0x6f,0x73,0x16,0xcf,0x63,0x6c,0xbe,0xc4,0x7c,0x88, + 0xeb,0xc6,0x37,0x78,0xce,0x1a,0xbc,0xf1,0xc7,0xe7,0xab,0x21,0xde,0xde,0x4c,0xf1, + 0x1c,0x59,0xf3,0x9b,0xfc,0xbf,0x4d,0x7f,0x34,0xbe,0x6,0x6f,0xce,0xc5,0x5c,0x34, + 0x35,0x86,0xe3,0x7f,0x43,0xfc,0x6f,0xe5,0x78,0x66,0x8a,0xff,0xff,0x1b,0x4d,0xa6, + 0xc,0xe6,0x96,0xfb,0x9f,0x69,0xf3,0xe9,0xfa,0xe4,0xc9,0xc6,0x19,0xfb,0xf7,0xef, + 0xab,0x9c,0x30,0xe1,0x29,0x35,0x75,0xea,0x14,0xb5,0x60,0xe1,0x7c,0x55,0x5c,0xbc, + 0x42,0x55,0xad,0x5e,0x45,0x8b,0xc5,0x9d,0x3b,0x77,0xd0,0x6f,0xb7,0xb6,0xee,0x10, + 0xfd,0x96,0xf5,0xc2,0x5a,0xe9,0x85,0xb5,0x5e,0x54,0x9e,0x16,0xef,0x9f,0x79,0x67, + 0xce,0x9d,0x37,0xef,0x16,0x92,0x6,0x2e,0x97,0x6f,0xee,0xb5,0xd2,0x7d,0x99,0x8f, + 0x6b,0x7e,0x7f,0x4d,0x1d,0xbf,0xac,0xcc,0x4f,0xea,0x25,0xd7,0x5c,0xbe,0xf5,0xfc, + 0xd9,0x54,0xdb,0x3c,0x2e,0x53,0xae,0xd5,0xbd,0xbf,0x18,0xb7,0x19,0xfb,0x59,0x4d, + 0x8,0x3a,0xe8,0x5b,0x84,0x23,0xbe,0x4b,0x43,0x57,0x86,0x88,0x14,0x0,0xd4,0x1, + 0xce,0x1f,0x7d,0xf2,0x91,0xfa,0xf8,0xd3,0x8f,0x9,0xb0,0xdf,0x7e,0xf7,0x1d,0x75, + 0xe5,0xea,0x65,0x80,0x33,0xbe,0x71,0x3f,0xd4,0xa0,0xdc,0xaa,0x19,0x73,0xa5,0x66, + 0xf7,0xf,0x5e,0xbc,0x70,0xe1,0xb7,0xf1,0xbb,0xb,0xbf,0x9d,0x59,0x38,0x10,0xfb, + 0xf6,0x66,0x7d,0xbb,0xb,0x7d,0xaf,0x6f,0x14,0x3f,0x6e,0xb4,0x6c,0xa1,0x7e,0xb3, + 0x30,0x65,0x38,0xbc,0x94,0xf7,0xdd,0x5f,0x6c,0x70,0x32,0xe1,0xe5,0x2f,0x74,0x3d, + 0xd2,0xf4,0x45,0xeb,0xfd,0xbf,0x91,0xe4,0x44,0x19,0xc0,0x6d,0xfd,0x77,0x9a,0xcd, + 0x3e,0xdd,0xd0,0x78,0x62,0x9b,0x7e,0x9,0x87,0x34,0x58,0xfe,0x97,0x8b,0x9a,0xdd, + 0x75,0x6b,0x46,0x8b,0x55,0x23,0x7e,0xbc,0x97,0xf5,0xf,0x94,0x56,0x90,0xf9,0x5e, + 0xd5,0xd6,0xd1,0x66,0x81,0xf5,0x94,0x3a,0x7e,0xa2,0x5e,0x1d,0x7,0x10,0xd5,0x1d, + 0x56,0x47,0x8e,0xd6,0xa9,0xc3,0xb5,0x87,0x8,0x94,0xf0,0x42,0x9f,0x68,0x3c,0x41, + 0xec,0x10,0x2f,0x76,0xa3,0x6,0xac,0x93,0xa7,0x9a,0xd4,0x49,0xfd,0x82,0x37,0x9f, + 0x3e,0x65,0x92,0x6,0x65,0xa4,0x53,0x7c,0xad,0xd3,0x69,0x9b,0xe7,0x25,0x59,0xfe, + 0xb4,0x2d,0xef,0xf2,0x9b,0xbd,0x7b,0x7c,0x7e,0x5a,0x96,0x95,0x79,0xb6,0x5e,0xd8, + 0xcf,0x69,0x71,0x4c,0xca,0x5,0x7d,0xb8,0xf3,0xa4,0x1c,0xa5,0x33,0x78,0xf1,0xed, + 0x47,0xe0,0xc,0xe6,0xe5,0xb4,0xab,0x83,0xfe,0x4f,0x35,0x9f,0x4a,0x9e,0xd3,0x7b, + 0x26,0x1e,0x5f,0xb3,0x5f,0x3e,0x92,0x9a,0xbd,0x73,0x39,0xbe,0xa4,0xd,0xaf,0x7c, + 0x4b,0x73,0xd0,0x7e,0x78,0x2f,0x68,0xa7,0xc5,0x7f,0x46,0x39,0x2e,0x39,0x87,0xf2, + 0x7f,0xe5,0xb7,0xe5,0xf7,0x93,0x3c,0x93,0xfc,0x1f,0xfb,0xfd,0x61,0x5e,0xce,0x5d, + 0x38,0xff,0x79,0x57,0x77,0xee,0xaa,0x4e,0xd7,0x3a,0x73,0x5d,0x6f,0xeb,0x74,0x4d, + 0x26,0xca,0xef,0xea,0x7c,0x3b,0x67,0xee,0x5f,0xcb,0xf5,0x74,0x5f,0x59,0xbf,0x61, + 0xc3,0xe7,0xd,0xfa,0x37,0xe5,0xff,0x46,0x32,0xfa,0xc9,0x7a,0x86,0x58,0x1d,0x39, + 0xfe,0x96,0xe6,0xe0,0x99,0xe5,0xb3,0x37,0x7,0xf3,0xeb,0xcf,0xf7,0xa9,0xe0,0xb7, + 0xe2,0xb5,0xef,0x8d,0xeb,0x94,0xff,0x7b,0x96,0xbf,0x8d,0xf0,0x3c,0xa8,0xd3,0x1c, + 0x7d,0x4f,0xf8,0x77,0x9f,0xfc,0xde,0xf1,0x7b,0x3c,0x7b,0x2e,0x1,0x30,0xb7,0xb0, + 0x14,0x9,0xbf,0x5f,0xfc,0x66,0x4d,0x8a,0xfc,0xbe,0x23,0x79,0xcd,0xe1,0x7b,0x22, + 0xaf,0x45,0x1d,0xef,0xde,0xe9,0xf4,0x7b,0x76,0xba,0x25,0x7d,0x3f,0xf6,0x6e,0xc6, + 0xca,0xd3,0x7b,0x26,0x7e,0x93,0xf8,0xb6,0xe0,0x1b,0x83,0xc5,0x31,0x16,0x12,0xf8, + 0xee,0xe0,0xdb,0xd4,0xd0,0x70,0x5c,0x35,0x34,0x1e,0x57,0xc7,0x88,0xed,0x37,0x50, + 0x3e,0x40,0x1b,0x73,0xd2,0x95,0xeb,0xa4,0xef,0x1a,0xa4,0x75,0x0,0x63,0x0,0xf3, + 0x27,0x3f,0xf8,0x84,0x40,0xfa,0x2d,0x4d,0x2e,0xfa,0xf2,0xbd,0xff,0x45,0x2f,0xbe, + 0x7,0xf5,0x37,0x72,0xa3,0x4e,0x8f,0x6b,0x96,0xfc,0x6f,0xf5,0x37,0xb3,0x20,0xf8, + 0x15,0xc2,0x87,0x91,0xe0,0x44,0x56,0x59,0xbb,0x50,0xfd,0x42,0x98,0x23,0xeb,0x7e, + 0xd9,0x31,0x8c,0x4,0xff,0x3c,0x0,0xe6,0xce,0xbf,0x68,0x8a,0xd,0x48,0x1e,0xc3, + 0xf3,0x58,0xdd,0x30,0xaf,0xd0,0x3,0x17,0x6a,0x23,0xab,0x7c,0x6c,0xb2,0xb3,0x26, + 0x51,0xff,0x88,0x7e,0xf9,0x4c,0x4b,0xcb,0x2d,0x27,0x4e,0x1c,0x2f,0xd7,0x0,0x9a, + 0xd7,0x1f,0xc2,0xff,0xeb,0xa2,0x66,0x78,0x3d,0x7d,0x3d,0x24,0x3e,0x6,0xe0,0xe2, + 0x47,0x9,0x0,0x6,0xf3,0xc3,0x8f,0x1d,0x3f,0xe4,0xa3,0xfa,0x7,0x7c,0x44,0x83, + 0x2b,0x80,0xf6,0xe8,0xb1,0xa3,0xfa,0x47,0x7d,0x42,0xff,0xe0,0x4f,0xd2,0x4b,0xde, + 0xaa,0x7f,0xcc,0x10,0xc9,0x5e,0x6a,0x6f,0x53,0xed,0x7a,0xd5,0xa9,0x3f,0x96,0x9a, + 0x2d,0x77,0xab,0x6e,0xdd,0x66,0x6f,0xbe,0x4f,0xf5,0xf6,0xe7,0x55,0xdf,0x40,0x3f, + 0xa5,0xbc,0x4e,0x60,0xd1,0xfd,0x9a,0x35,0x53,0xc2,0x39,0x5f,0xdb,0xf3,0x1,0xba, + 0xe7,0xe7,0x23,0x8f,0xf3,0xf9,0x7c,0x40,0xdc,0x73,0xed,0xc,0xa6,0xef,0x7b,0x65, + 0xc2,0x7a,0x43,0xa2,0x8f,0xcb,0x83,0xe9,0xfb,0x5c,0xe7,0xf2,0x90,0x2d,0x9f,0xd4, + 0x19,0x8,0xd3,0xe5,0x48,0x1e,0xd7,0xbd,0x3c,0xe8,0xea,0xc7,0x9e,0x43,0x96,0x19, + 0x10,0xfd,0xa5,0xda,0xd5,0xe7,0x83,0x7c,0x2f,0x3c,0x6,0xed,0x51,0xb9,0x48,0x3b, + 0x83,0xa9,0xbe,0x44,0xf9,0xa1,0x41,0xef,0x88,0xe7,0x1f,0x14,0x6d,0xb8,0x36,0x6d, + 0x1b,0xfc,0x1c,0xdc,0x66,0x78,0xc,0xdb,0xa3,0x74,0xc5,0xb4,0x8b,0xdf,0xc6,0x0, + 0xfd,0xe6,0x2e,0x53,0xa2,0x7a,0xfa,0xe8,0xb7,0x61,0xea,0x5c,0x7e,0xeb,0xaa,0x3a, + 0x5c,0x57,0xab,0x9e,0x9e,0x30,0x81,0x7e,0x5b,0x28,0x8f,0x76,0x5c,0x9b,0x85,0xd2, + 0x95,0xf4,0x35,0xb7,0x3f,0x5c,0xe2,0xf1,0x99,0x39,0x92,0xe3,0xcb,0x68,0x5b,0xa7, + 0x21,0x5b,0xc6,0xdd,0xbf,0x22,0xf2,0xec,0xb3,0x46,0xc7,0x2f,0xef,0xd9,0x76,0x64, + 0x5b,0xae,0x8e,0x4b,0xe6,0x7a,0xe8,0xaa,0x5f,0x3e,0x96,0x92,0xfa,0x7e,0xff,0x9c, + 0x27,0xdb,0xa,0xc7,0xca,0xe5,0xd2,0xf9,0x41,0x1f,0x57,0x32,0xc6,0x70,0xf5,0x8a, + 0x49,0x91,0x36,0xe4,0x3d,0xce,0xbb,0xcc,0x79,0x57,0x4d,0x9b,0x7c,0x7d,0xf9,0x2d, + 0xd1,0xce,0xd5,0x64,0xc,0xf2,0xb7,0x86,0xdf,0x55,0x9f,0xfe,0xde,0xe0,0xb7,0xd5, + 0xdd,0xdb,0x43,0x52,0xbb,0x4e,0xd,0xb4,0x20,0xe,0x17,0x2e,0x5d,0xa0,0x5,0x9, + 0x16,0x1e,0xc,0xd2,0xf8,0x8e,0x1,0xa4,0x4f,0x6a,0xe0,0xc6,0xe2,0x4,0x92,0xbe, + 0xfc,0x40,0x1f,0x89,0xe2,0x1,0xc6,0x3f,0xf8,0xec,0x87,0xc4,0x96,0xa1,0x36,0xd3, + 0x4,0xe4,0xef,0x2f,0x5c,0xbc,0xd0,0xdb,0xd2,0x72,0x7a,0xa5,0x66,0xc9,0x63,0x2f, + 0x5d,0xba,0xf4,0x4f,0xc3,0xef,0x72,0xd6,0xb7,0x7f,0xb8,0xeb,0x1b,0xc5,0xa3,0x42, + 0xf7,0x47,0x82,0x4d,0x23,0xc1,0xbb,0x42,0x75,0xb,0xdd,0x73,0x7f,0xb8,0xc0,0x8a, + 0x85,0x53,0x58,0x30,0xcc,0x93,0xe5,0x62,0x75,0x62,0xf7,0x64,0xfb,0x32,0x2f,0xab, + 0x8d,0x58,0x2a,0x34,0xc6,0x58,0x99,0xb0,0x9f,0xd8,0xf8,0x64,0xfe,0xf9,0xf3,0xe7, + 0xff,0x97,0x93,0x27,0x9b,0xee,0xd3,0x40,0xba,0xf3,0x44,0xc3,0xf1,0x8f,0xce,0xe8, + 0x95,0x30,0x44,0xc5,0xf9,0x81,0x3c,0x81,0x2d,0x74,0x3f,0x10,0xd9,0x9c,0xbb,0x70, + 0x4e,0xff,0x28,0x4f,0x90,0x58,0xea,0xd0,0xe1,0x1a,0x62,0xb6,0x60,0xb3,0x4d,0x7a, + 0x65,0x89,0x95,0xb2,0x66,0x2c,0xea,0xa2,0xfe,0x81,0x76,0xe8,0x1f,0x74,0xae,0xd7, + 0x80,0x2b,0x0,0x95,0x5f,0x6e,0x88,0xa3,0x49,0x34,0xfd,0xf6,0x35,0x75,0xf5,0xda, + 0x5b,0x2e,0x21,0x9f,0xee,0xe9,0x73,0x7a,0xc1,0xf4,0x8b,0xc4,0x79,0x57,0xac,0x18, + 0x1b,0x2f,0x19,0x1d,0xe5,0x79,0x81,0x23,0x97,0xe3,0x73,0xbc,0x90,0x7c,0xff,0x8a, + 0xee,0x7,0x7d,0x5c,0xe6,0x3e,0x44,0xd9,0x2b,0x22,0xef,0xaa,0x2d,0xc7,0xf7,0xdf, + 0xd2,0xe3,0x76,0xf5,0x71,0xfd,0xce,0xdb,0x34,0x3e,0xf7,0x2c,0x6f,0xbf,0xe5,0xc6, + 0xc8,0xe5,0x64,0xfb,0xa6,0x5f,0x9b,0x2f,0x9e,0xeb,0x32,0xd7,0xa1,0x7c,0x53,0x67, + 0x48,0xe6,0xf3,0x58,0xc4,0xf8,0xae,0xda,0xb6,0xe4,0x5c,0xc9,0xe7,0xa3,0xb1,0x8a, + 0xb1,0x5d,0x9,0x9e,0x95,0xdb,0x70,0x73,0x6c,0xcb,0xf1,0x38,0x8d,0xa,0xc1,0xdc, + 0xe7,0xe7,0x96,0xcf,0x77,0x59,0x8c,0xe9,0xb2,0xcb,0xbb,0xe2,0x8d,0xcb,0xdd,0xbf, + 0x7a,0x25,0xf5,0x7f,0x36,0xf3,0x7f,0x25,0xf5,0xdc,0x3c,0x6e,0x9c,0xf7,0xd,0x98, + 0xf,0x25,0x3e,0x98,0x3d,0x7d,0xbd,0xf4,0xc1,0x44,0xc2,0x79,0x27,0x44,0x88,0x39, + 0xa8,0x34,0x3a,0x55,0x97,0xfe,0x88,0x6a,0x36,0xac,0xd9,0x4e,0xb3,0xaa,0xae,0x39, + 0x48,0x1f,0x5d,0xfe,0x8d,0xc9,0x3e,0xf9,0x3a,0x36,0x1f,0x97,0x83,0x72,0xf2,0x37, + 0x2a,0xf3,0x31,0xbe,0xb7,0xde,0xb9,0xe6,0xe6,0xb,0x73,0x82,0x6b,0x94,0x7f,0x8b, + 0xd3,0x3b,0xd7,0x52,0xbf,0xb,0x2a,0x17,0xfc,0xee,0xdf,0x12,0x75,0xae,0xe9,0xdf, + 0x12,0xb7,0x21,0xef,0xf1,0xfb,0x82,0xfb,0x48,0xa6,0x2f,0x73,0xff,0x9a,0xfe,0xe8, + 0x73,0x19,0xd7,0xc6,0xb5,0xa4,0x3c,0x8f,0x85,0xca,0xbd,0x93,0xf4,0xc1,0xf7,0x5c, + 0x9b,0xb6,0xd,0x9c,0x43,0xe4,0x6a,0xea,0xbc,0xe3,0xdd,0xe7,0x7b,0xe6,0xfe,0xdb, + 0xd4,0x26,0x25,0x5b,0xe6,0x9a,0xbd,0x67,0xfa,0x4a,0xca,0xba,0xfb,0x36,0x51,0xfe, + 0xf5,0x77,0x5c,0xfb,0x7c,0x6d,0x8e,0xef,0xba,0x3a,0xa6,0x2d,0x9b,0x77,0x3d,0x28, + 0x7b,0xfd,0x1d,0xaf,0x6f,0x94,0xb9,0xf6,0x6e,0xd2,0xa7,0x2c,0x7,0xdb,0x90,0xb7, + 0xaf,0x1b,0x1b,0x91,0x77,0xdf,0x7f,0x4f,0x5d,0xff,0xe0,0x7d,0x4a,0xef,0x7f,0xf8, + 0x81,0x66,0xb2,0x1f,0xaa,0xf,0x3e,0xfe,0x88,0xf4,0xc3,0xd0,0xd,0xc3,0x6e,0x4, + 0x65,0xf1,0xbf,0xc5,0x37,0xb,0xbf,0x3b,0xfc,0xae,0x0,0xce,0xf8,0xf6,0x41,0xbd, + 0x4,0x16,0x7d,0xa2,0xa1,0x9e,0x12,0x98,0x35,0x48,0x48,0x5f,0x7f,0x2f,0x1,0xf2, + 0x47,0x1a,0x88,0x7f,0x68,0x1,0xf9,0xb2,0x5e,0x18,0xb4,0x77,0xb4,0x7f,0x72,0xf6, + 0xec,0x99,0x37,0x5b,0x5b,0xcf,0xde,0x75,0xf1,0xe2,0xc5,0x5f,0x95,0xdf,0xdd,0x91, + 0x7c,0xab,0xc3,0xf2,0x59,0x38,0x33,0xd2,0x6f,0xfe,0x48,0xf0,0x2c,0xb,0x6b,0x6e, + 0xa4,0x8f,0xe1,0xda,0x71,0x7f,0x6d,0x6d,0x6d,0x99,0x95,0xbe,0x6c,0x92,0x6d,0x67, + 0xf5,0x83,0xfc,0xd8,0x3d,0xce,0xb,0xef,0x8d,0x74,0xbc,0x59,0xed,0xca,0x89,0xd2, + 0x3f,0x88,0x9f,0x3f,0x75,0xea,0xd4,0x6d,0xf5,0xf5,0xc7,0x36,0x6a,0xa6,0xfb,0x9, + 0x56,0x7d,0x58,0x9,0x2,0x6c,0x91,0xc0,0x78,0x99,0xe1,0x82,0xd9,0x1e,0xac,0xa9, + 0x56,0xb5,0xb5,0x46,0x1f,0x4,0xb1,0xce,0xd9,0x73,0xad,0xea,0x62,0x1b,0xc0,0xb6, + 0x4b,0x33,0xd9,0x5e,0x95,0xd7,0x75,0x98,0xf5,0xf0,0x47,0x97,0x99,0xd,0xb3,0x4c, + 0x62,0xb8,0x83,0xfd,0x6e,0x15,0x6a,0x58,0x6f,0xde,0x7c,0x68,0xf5,0x35,0xc0,0x9a, + 0xf2,0xc3,0xc4,0xf9,0x3,0xe6,0x3a,0x6f,0xd9,0x32,0xae,0xf3,0xe2,0x18,0xab,0x8f, + 0xbe,0xdc,0x3d,0x7b,0x5f,0x96,0xa5,0xfb,0x76,0x3c,0xdc,0x96,0x2c,0x93,0xb7,0xf5, + 0x7b,0xbd,0x71,0x24,0xed,0xc8,0x71,0xe7,0xed,0xf3,0x79,0x6d,0xd,0xe4,0xed,0x73, + 0xf,0xb8,0x67,0x90,0xfd,0xcb,0xb1,0xc9,0xb1,0xf2,0x39,0x8f,0x8f,0xcf,0xe5,0x33, + 0x99,0x7b,0x42,0x6a,0x10,0x24,0x79,0x8f,0x8e,0x43,0x3,0x6e,0xfe,0x65,0x7d,0xfe, + 0xdf,0xf0,0xff,0x2a,0x2f,0xfa,0x94,0xf3,0xcb,0x6c,0xdf,0x1b,0xa3,0x4d,0x94,0x1f, + 0xd4,0x75,0x63,0x10,0xd7,0xa9,0xf1,0x89,0xb1,0xf1,0x1c,0xc,0xa4,0xa4,0x1a,0x81, + 0xc4,0x22,0x90,0xa,0x30,0xcb,0xa6,0x45,0x96,0x6,0x75,0x59,0xdf,0x93,0xa8,0x78, + 0x12,0x14,0x6e,0x2b,0x22,0x55,0xe1,0xfc,0xa1,0x81,0xa8,0x54,0x82,0x8e,0x81,0x54, + 0x21,0xd5,0x56,0x20,0x6d,0x49,0x49,0x34,0x9c,0xa4,0xc4,0x8e,0x73,0xb0,0xdf,0x63, + 0xf6,0xfd,0x42,0x32,0x20,0xc7,0x27,0xe7,0x24,0x6f,0xa5,0x32,0x9c,0x8c,0x94,0x66, + 0xc8,0xd5,0x67,0x89,0x4d,0xc8,0x0,0xbd,0xb6,0x4,0x4b,0xcf,0xdb,0xfa,0xcc,0xea, + 0xa5,0x64,0x23,0x2f,0x25,0x47,0x97,0x23,0xd2,0x96,0xa1,0x64,0x1c,0x9e,0x94,0xc5, + 0x4a,0x33,0x6,0x2,0x69,0x8b,0x94,0x1a,0x24,0x69,0xc8,0x6b,0x47,0x4a,0xb,0xa4, + 0x14,0xc5,0xd4,0xf5,0xfb,0x65,0xc6,0x3f,0x10,0x48,0x56,0x6,0xa5,0x74,0x82,0xaf, + 0x87,0x6,0x13,0x46,0x6f,0x19,0x35,0x2f,0x1a,0xde,0x21,0x43,0xb2,0xf7,0x8,0xa0, + 0x3f,0xfa,0xf4,0x13,0x2,0xd5,0xf,0x35,0x48,0x3,0xc0,0xb1,0xb8,0xc1,0xb3,0x0, + 0x94,0x21,0xcd,0x6b,0xd5,0xdf,0x40,0xc3,0x94,0x4f,0xa8,0x26,0xcd,0x96,0xa1,0x8f, + 0x86,0x5e,0x19,0x2a,0x39,0x88,0xa9,0x61,0xa0,0x89,0x74,0x4d,0x2f,0x60,0xda,0x3b, + 0xdb,0x3f,0xd5,0xac,0x78,0xeb,0x99,0x33,0x67,0xc6,0x5c,0xb8,0x70,0xfe,0x9f,0x7c, + 0x19,0x4c,0xc9,0xc2,0x87,0x42,0x18,0x54,0x8,0x93,0xbe,0x28,0xce,0xc,0xd7,0x5f, + 0xd6,0xb8,0x53,0x0,0x1c,0x2,0x56,0xec,0x41,0x63,0xa9,0xd0,0xbd,0x91,0xa6,0xac, + 0x9,0xcd,0x2a,0x1b,0x8e,0x77,0xa4,0xfd,0x30,0xf0,0xea,0x15,0xd9,0x6f,0x6b,0xd0, + 0x5d,0x70,0xac,0xfe,0xe8,0x65,0xac,0xe0,0x60,0xdd,0xd8,0xd7,0xdf,0x47,0xa0,0xb, + 0x71,0xc,0x8c,0x89,0xb0,0xba,0xab,0xd1,0x80,0x8b,0x4,0x91,0x72,0x63,0x53,0xa3, + 0x3a,0xd3,0x7a,0x96,0xc4,0xc8,0x9d,0xe,0x70,0x93,0x97,0xdd,0x7f,0x51,0xfb,0x53, + 0x40,0xc3,0xa9,0x37,0x0,0x39,0x2e,0x67,0x0,0x20,0xef,0x44,0xd0,0x29,0x30,0x1d, + 0xc8,0x7b,0x60,0xeb,0xce,0xfb,0x7d,0xe0,0x96,0x80,0x22,0xeb,0x3b,0xb0,0x1b,0x4c, + 0xb7,0x9f,0xf7,0xc0,0x69,0x20,0xa9,0x2b,0x40,0xc7,0x1,0xb4,0xfd,0xc8,0xc6,0xea, + 0x30,0xb8,0xc9,0x3e,0xc2,0x45,0x47,0xde,0x3,0x9f,0x4,0x94,0x24,0x50,0xb8,0xfa, + 0x1e,0x38,0xd,0xba,0xba,0x7d,0x11,0x40,0x8d,0x1,0x76,0xbf,0x78,0x16,0xce,0xf3, + 0x0,0x56,0x2c,0x30,0x24,0x80,0x84,0xc0,0xca,0xff,0x53,0x6e,0x2b,0x4,0x0,0xf9, + 0x3c,0xee,0x37,0x60,0xc7,0x1c,0x8a,0xea,0xe3,0x22,0x7f,0x1,0x54,0x56,0xa4,0x1d, + 0x3,0xaf,0x10,0xc,0x63,0x22,0x7d,0x6,0x1b,0x7,0x66,0xb6,0x2e,0x8d,0x7f,0xc8, + 0x7,0x5f,0x16,0x9f,0xa7,0xc0,0xf1,0xb2,0x3f,0xe,0x29,0x5a,0x67,0xc0,0xeb,0x8f, + 0x1d,0x83,0x45,0x83,0xf,0x28,0x43,0x69,0x55,0x84,0x3,0xda,0x81,0x14,0x28,0xf3, + 0xa2,0xc2,0x9b,0xc3,0x60,0x4c,0x43,0x81,0x68,0xd5,0x9d,0xb,0xd5,0x82,0x3,0xbe, + 0xa1,0x40,0xd4,0x1f,0x0,0x15,0xb7,0x97,0x17,0xea,0x4,0x27,0x46,0xbf,0x22,0xc5, + 0xed,0x69,0x31,0xba,0xec,0x53,0x8a,0xc3,0x65,0x5d,0xaf,0xde,0xd5,0xcb,0x2,0x1c, + 0xd3,0xf7,0x19,0x24,0x63,0xa2,0x7b,0x37,0xa7,0x11,0x71,0x3a,0x3f,0x17,0x8b,0xdb, + 0x8d,0x1a,0x61,0xc8,0x5b,0xd4,0xf0,0xf8,0x98,0x1c,0x78,0x65,0x86,0xfc,0x45,0x7, + 0x3,0x33,0x4b,0xbe,0xde,0xb5,0xa0,0xfc,0xc9,0xf,0x3e,0x55,0x1f,0x43,0xf,0xac, + 0x19,0x33,0x18,0x3a,0xca,0x43,0x1d,0x7,0x32,0x2,0xc9,0x21,0x18,0x32,0x44,0xd7, + 0x2d,0x9a,0xb8,0x5c,0x6a,0xbf,0x48,0x6a,0x3b,0xe8,0x8f,0x3f,0xfb,0xfc,0x33,0xf5, + 0xe9,0xf,0x3f,0x25,0x70,0xd6,0xc4,0xe6,0x9d,0x96,0x33,0x2d,0xb,0xce,0x9d,0x3b, + 0xf7,0x3b,0x97,0x2e,0x5d,0x8a,0xe2,0x4e,0xa1,0xef,0xfe,0x70,0xdf,0xff,0x91,0xe4, + 0x8f,0x4,0x3b,0xa,0x61,0x52,0x21,0x9c,0x1a,0xee,0xbe,0x7,0xc0,0x98,0x0,0x3e, + 0x72,0xe2,0x82,0xf2,0xbc,0x50,0x5e,0x56,0xfd,0xb0,0xfd,0xb0,0x9c,0x2c,0x9f,0x95, + 0x9f,0xd5,0x6f,0xa1,0x71,0x87,0xc0,0x8b,0x7b,0x8d,0x8d,0xd,0xb7,0xd4,0xd4,0x1c, + 0xdc,0x5b,0x77,0xa4,0xf6,0x6f,0xc0,0x76,0x1,0xb6,0x79,0x12,0xf1,0xf5,0x5a,0xd0, + 0x3d,0xae,0xe,0x1e,0x3c,0x40,0x4c,0xf7,0xc8,0xd1,0x23,0xea,0x64,0xb3,0x66,0xb9, + 0xe7,0x5b,0x69,0xa5,0x87,0x15,0x1f,0x0,0x48,0xb2,0xe,0x9,0x62,0x2c,0x26,0x94, + 0xc0,0x2b,0x59,0x62,0x9f,0x0,0x3b,0xba,0x3f,0xd8,0x9f,0x2,0xe2,0x34,0x30,0x66, + 0x33,0x5a,0x9,0xc2,0xbd,0x1,0xb0,0x7a,0x6d,0x72,0x59,0xd9,0x87,0x0,0xb1,0xbe, + 0x0,0xe8,0xc3,0x76,0x52,0xc0,0x36,0x20,0xc1,0x31,0xbd,0x50,0x90,0xf7,0xf9,0x39, + 0x43,0xd6,0x2d,0xc1,0x99,0xc7,0xd0,0x17,0xb0,0x45,0x8f,0xe9,0x72,0xbf,0x1,0xa0, + 0x86,0xec,0x3e,0xc6,0x88,0xf3,0x29,0xb0,0xed,0x77,0x20,0x2b,0xc1,0xb3,0x5f,0x80, + 0x26,0x83,0x6c,0x7e,0x70,0x20,0xaa,0x3f,0xcf,0xd2,0xc9,0xf3,0x82,0x20,0xcd,0x72, + 0x7,0x3c,0xa0,0xcf,0x2a,0x9b,0xcf,0x2,0x5e,0xb1,0xa8,0xf2,0xfb,0x8f,0x8f,0x4d, + 0x8e,0xbd,0x5f,0xb4,0x81,0xdf,0x6d,0x5e,0xb0,0x7c,0xd7,0x46,0x44,0x8f,0xed,0x2d, + 0x6,0x4,0x68,0xf6,0x8b,0x85,0x87,0x3,0x4f,0xb,0x96,0x61,0x7d,0x39,0xbe,0x50, + 0x57,0x2e,0x99,0xea,0x40,0x4c,0xf,0x7f,0xd9,0x67,0x99,0x8e,0xb1,0x89,0x45,0x85, + 0xbf,0x38,0xf1,0xcb,0xf6,0x7,0x40,0xda,0x9f,0xb2,0xd,0x90,0x60,0x3c,0xe4,0xb5, + 0x1f,0xea,0xf9,0x7d,0xdd,0x7e,0xda,0xc6,0xc0,0xb3,0x23,0xb8,0xec,0xdb,0xb,0x30, + 0xe8,0x49,0xfb,0x6,0x9,0xb8,0x3,0x2,0x1c,0x7d,0xa0,0x1f,0x4c,0x81,0x3f,0xeb, + 0xe5,0xa5,0x9e,0x58,0xea,0xd9,0x13,0xdd,0x71,0xb0,0x18,0xb0,0xf7,0xc2,0x67,0x1a, + 0xc,0x75,0xdb,0x81,0xce,0x9b,0xc7,0xe0,0x49,0x2,0xec,0xf3,0x21,0xf,0x6c,0x19, + 0x80,0xc,0x30,0xfe,0xe4,0x87,0x3f,0x20,0x51,0x36,0xc4,0xe1,0xf8,0x8d,0x41,0x7d, + 0x7,0xa3,0x36,0xb0,0x63,0x18,0x7d,0x31,0xd1,0x1,0xf8,0x7e,0xa8,0x81,0xfb,0xb3, + 0xcf,0x7f,0xac,0x3e,0xd2,0xe5,0x7b,0x7a,0xbb,0xff,0x56,0xb3,0xe2,0x3d,0x67,0xcf, + 0x9e,0xbd,0xf9,0xe2,0xc5,0x8b,0xfa,0x7b,0xdd,0x3e,0x22,0x1c,0x8,0x31,0x2a,0xab, + 0x7c,0xec,0x7c,0x24,0xc7,0x42,0x78,0x32,0x12,0x7c,0xc,0x71,0x2d,0x13,0x80,0x63, + 0x83,0xff,0xff,0x43,0xe2,0x15,0xc8,0xf9,0xf3,0xe7,0x7f,0xae,0xfe,0xd8,0xb1,0xbb, + 0x77,0xef,0xde,0xd5,0xb4,0x67,0xef,0xee,0xff,0x1,0xf1,0x31,0xc,0xa2,0xf0,0x3, + 0xc1,0xf,0x2,0xab,0xb5,0x43,0x87,0xf,0xaa,0xea,0xea,0xfd,0xaa,0xb6,0xee,0x30, + 0x59,0x23,0x43,0xb4,0x7c,0xa9,0xa3,0x9d,0xc,0x59,0xf8,0x23,0x9f,0x62,0x4d,0x16, + 0xf8,0x38,0x49,0x0,0xea,0xed,0xef,0xb,0xc4,0xcb,0x2,0xa4,0xa4,0x28,0x39,0x10, + 0xf7,0x86,0x6c,0x37,0x5,0xde,0x52,0x8c,0x3c,0x90,0x88,0xa6,0xd1,0x9f,0x14,0x11, + 0x87,0x40,0xd7,0x17,0x3,0xc8,0x81,0x7e,0x6f,0x11,0x10,0x63,0xc4,0xf9,0x88,0xd8, + 0x3b,0x2c,0x9f,0x17,0x4c,0x3b,0x14,0x1d,0xcb,0x3e,0x64,0x59,0xd7,0x46,0x84,0x2d, + 0xc7,0x44,0xd0,0xa1,0x78,0xba,0x4f,0x96,0x1d,0x4c,0x83,0x69,0xf8,0x7f,0xa,0xdb, + 0x72,0xa0,0x36,0xe0,0xb3,0x5a,0xc9,0x6,0xa3,0xc,0x5a,0x3e,0xf,0x2f,0x14,0x86, + 0x6,0x9c,0x4,0xc3,0x81,0xbb,0x4,0xcb,0x0,0x20,0xc3,0x31,0x49,0xe6,0xda,0x1f, + 0x30,0xf4,0x94,0xb8,0x39,0x0,0x98,0x4,0x40,0x23,0xc6,0x74,0x1,0xfb,0x36,0x63, + 0xf3,0x45,0xcc,0xbc,0x10,0x8,0xc1,0x3d,0x14,0x7b,0x4b,0xf6,0x2d,0x17,0x5,0x21, + 0x50,0x49,0xc0,0xf,0x81,0x37,0x2d,0xc2,0x8e,0x3c,0x93,0x9c,0xb,0xb,0xaa,0xe, + 0x3c,0x43,0x31,0xf6,0xe5,0xb8,0xc8,0x37,0xc6,0xe4,0x53,0xe2,0xfc,0x60,0x8e,0x3c, + 0x31,0xb1,0x30,0x84,0x93,0xcc,0xd0,0x19,0x1f,0x5e,0x4e,0x1b,0xca,0xf9,0xe5,0x4, + 0x23,0xbf,0x12,0x18,0xd6,0x5,0x8c,0xd3,0x63,0xc0,0x21,0x83,0xb7,0xc,0x3d,0xc5, + 0x80,0x23,0xed,0x79,0x6,0x6d,0x1,0xe3,0xe5,0x45,0x45,0x62,0xc4,0xe5,0xf7,0x4b, + 0x6c,0xdc,0x7b,0xa6,0xcb,0xf1,0xfe,0xa4,0x51,0x5b,0xc4,0xb0,0xe,0xed,0x43,0x44, + 0xfd,0xe1,0x27,0xd0,0x1,0xff,0x48,0x7d,0xfc,0xe9,0x27,0xc4,0x8e,0x31,0x3f,0xf8, + 0xd6,0xc2,0xb0,0xb,0xdf,0x5a,0x0,0x31,0xdc,0x16,0xc1,0x98,0xe1,0x87,0xfc,0x89, + 0x66,0xc4,0xd0,0x1d,0xeb,0x6f,0xf1,0x7f,0xd7,0x40,0x7c,0x4a,0xa7,0xef,0x5f,0xb8, + 0x70,0xe1,0xe7,0x6e,0xe4,0x5b,0xf,0xe0,0x46,0xe2,0xf3,0x7f,0x6c,0xac,0xf9,0x22, + 0x7d,0xba,0xbf,0x70,0xf0,0x59,0x29,0xeb,0xfe,0x70,0xf5,0x62,0xe5,0xc3,0x89,0x8b, + 0xb5,0x93,0x75,0x1d,0xcb,0x8f,0x81,0x2f,0xee,0xd5,0xd5,0xd5,0xde,0xb1,0x76,0xed, + 0xea,0x4b,0x6b,0xd7,0xad,0x21,0x3f,0x54,0x58,0x26,0xb3,0x19,0x7e,0xdd,0x91,0xc3, + 0x6a,0xff,0xfe,0xbd,0xea,0x80,0x6,0xde,0xfa,0xe3,0xf5,0x64,0xf5,0x7,0x11,0x4a, + 0xa7,0x66,0xba,0x6c,0x38,0x15,0x32,0x3c,0xce,0x27,0xb6,0xeb,0x1,0x64,0x3e,0x2a, + 0xee,0x95,0x89,0x41,0x39,0x1f,0x1,0x48,0x6,0xd0,0x10,0xa0,0x13,0xb0,0xed,0xf7, + 0x74,0xc1,0x7e,0xf9,0x8,0xc0,0x4b,0xe6,0x1d,0x1,0xf7,0x7c,0x44,0xf,0xdc,0x97, + 0xc1,0x64,0xc3,0xf2,0x99,0xcf,0x80,0xb9,0x71,0x6c,0x36,0x64,0xe0,0x1,0xa3,0x1f, + 0x48,0xc4,0xee,0x1e,0x6b,0x97,0xfa,0x63,0x1,0xac,0x52,0xd7,0x1d,0x8a,0xd0,0x63, + 0xc0,0xc8,0x6d,0x47,0xc1,0x58,0xea,0x6b,0x23,0x6c,0xdc,0x6b,0x2f,0x4,0xcd,0x0, + 0x90,0x63,0xa2,0x74,0xa9,0xc7,0xf5,0xdb,0x1b,0x48,0x81,0xac,0xbc,0xcf,0xac,0x55, + 0xb6,0x13,0x8a,0x87,0x3d,0xfd,0xb5,0x78,0x8e,0x50,0x3c,0x9d,0x62,0xe9,0x43,0x3, + 0x9e,0xb8,0xdc,0x3,0xeb,0xcb,0x83,0xd1,0x85,0x82,0x4,0xc2,0x1,0x1,0x82,0xfc, + 0x51,0x76,0xa0,0x2d,0x44,0xd9,0xa9,0x67,0xb3,0xe3,0x92,0xe0,0x94,0x8c,0xa5,0xdf, + 0xbb,0xd7,0x9f,0xd2,0x2f,0xfb,0x62,0x6b,0x67,0x65,0x2f,0x99,0xd8,0x50,0xc2,0xc8, + 0x53,0x8c,0x35,0x10,0x3f,0x4b,0x2b,0xfe,0x50,0x24,0x2d,0xad,0xd4,0x7d,0x76,0x1a, + 0x32,0xf1,0xa1,0x94,0xc8,0x79,0x30,0x4,0x5f,0xd1,0x6e,0xdc,0x62,0x7c,0x28,0xd0, + 0xcd,0xe,0x45,0x45,0xdd,0xc,0x78,0x59,0x22,0x64,0xa9,0xa3,0x4e,0x89,0xbc,0x85, + 0x15,0xb5,0x2c,0x2b,0x59,0x30,0x9f,0xf,0xc9,0x31,0x4,0xe3,0xe,0x75,0xcf,0xe1, + 0xb3,0xe,0x46,0x9e,0x97,0x99,0x35,0x2,0x95,0x40,0x7f,0xc,0xa6,0xb,0x76,0xc, + 0xbd,0x32,0xde,0xeb,0x4b,0xfa,0x1b,0xb,0xf7,0x28,0x7c,0x83,0x1,0xc4,0xec,0xe2, + 0xc4,0xc1,0x7b,0xe0,0xfa,0xd4,0xd4,0xd4,0x78,0xb1,0xb9,0xf9,0x14,0x80,0x78,0x58, + 0xdc,0xb9,0x11,0xfc,0xc9,0x2,0xeb,0x1b,0xc1,0xaf,0x2f,0x83,0x7d,0xb2,0x5e,0xa, + 0x80,0x91,0xf0,0xc0,0xb1,0x63,0x56,0x99,0xf0,0x3c,0x56,0x3e,0x2c,0x3b,0x92,0xfb, + 0x61,0x7b,0x85,0xda,0xd,0x1f,0xc,0xe0,0x7b,0xe4,0xc8,0x91,0x3f,0x2f,0x29,0x5e, + 0xd1,0xb0,0x70,0xe1,0xfc,0xff,0x81,0xa8,0x36,0x5b,0xdf,0xdc,0xa2,0xf6,0x59,0xb0, + 0xdd,0xa3,0x81,0x18,0x9,0xfe,0xb8,0x88,0x70,0xd3,0x7a,0xfe,0x9c,0x6a,0xd3,0x6c, + 0x17,0x96,0xa5,0xa1,0xc1,0x53,0xf,0xdc,0x83,0x6c,0x92,0x62,0xe6,0xde,0x0,0x68, + 0x19,0x98,0x65,0x5d,0x9f,0x5,0xf7,0x7,0xf5,0xfb,0x3c,0xd6,0xdc,0x17,0x1,0x64, + 0xae,0x27,0x45,0xdb,0xbd,0xf2,0x18,0x3,0x52,0x1,0xa0,0x66,0x91,0x10,0x0,0xb0, + 0x6d,0x2f,0xa6,0x6f,0xee,0x8b,0xb4,0x11,0xd6,0xd,0xc5,0xe2,0xa1,0x21,0x58,0x3e, + 0x62,0x14,0xd6,0xcb,0x60,0xa,0x97,0x9a,0xfe,0x3e,0x4f,0xbc,0x9c,0x32,0x86,0xa, + 0x44,0xd7,0x21,0x2b,0xe6,0x85,0x47,0x7e,0x30,0x6d,0x48,0xc5,0x75,0x52,0xa0,0x97, + 0xd2,0x3,0x7,0x0,0x16,0xe8,0x9c,0xfb,0x23,0x75,0x7c,0xb6,0x18,0x61,0xdd,0x43, + 0x42,0x1f,0x1d,0xb0,0x73,0x9,0x6c,0x29,0xa9,0xc0,0x60,0x92,0x9c,0x68,0x37,0x0, + 0xfb,0x50,0xd4,0x1c,0xea,0x8d,0x53,0xc,0x3b,0x18,0x7b,0x28,0xa6,0xd,0x17,0x2e, + 0xa1,0x2b,0x5a,0x5e,0x2e,0x8,0x58,0x32,0x30,0x14,0x17,0x93,0x7b,0xcf,0x18,0x30, + 0x4b,0x8f,0x99,0xf,0x25,0xe2,0xea,0x7c,0x86,0x4b,0x5c,0xca,0x6d,0xed,0x72,0x5a, + 0xf7,0xeb,0x89,0x96,0x3,0x83,0xaa,0x34,0xab,0x1e,0x4a,0x95,0x97,0xe0,0xca,0x63, + 0xe1,0x7b,0x72,0xc1,0x12,0x3,0xe7,0x94,0x51,0xd9,0xe5,0xd0,0x18,0x6b,0xc8,0x3, + 0xb6,0xd0,0xcd,0x2c,0xe5,0xe6,0x76,0x45,0x88,0xc2,0x6d,0x9d,0x7e,0x8f,0x95,0x27, + 0xcf,0x30,0x28,0xc0,0x53,0xba,0xa3,0x79,0x65,0x2,0x60,0xe4,0x67,0x5,0x33,0x4d, + 0x19,0x95,0x5,0xec,0xd8,0x3,0x6b,0xb1,0x50,0x92,0xe0,0x2b,0x5d,0xb1,0x62,0xc0, + 0x3c,0x20,0x98,0x30,0xcf,0x27,0xbb,0xc6,0xc1,0xaa,0x1a,0x20,0xfc,0xe3,0x9f,0x7c, + 0xae,0x3e,0xd2,0xc,0x19,0x79,0x50,0xff,0x1,0x6c,0xc1,0x88,0x11,0x60,0x4,0xae, + 0x4d,0x0,0xe0,0x4b,0xfa,0x8,0x5f,0x6c,0xc4,0x4f,0x38,0x7a,0xb4,0xae,0xfe,0xf4, + 0xe9,0xe6,0x6f,0x85,0x40,0x17,0x62,0xc5,0x8d,0x60,0x48,0x16,0x56,0xc5,0xf2,0xb, + 0x9d,0x17,0xc2,0xb3,0x42,0x18,0xc7,0xf5,0xdc,0x9f,0xbc,0x81,0x74,0xfe,0xfc,0xf9, + 0xe8,0x79,0x56,0x99,0x1b,0xb9,0xf7,0x65,0xca,0x8e,0x24,0xe1,0xc1,0xd6,0xac,0x59, + 0x3d,0xf9,0x99,0x9,0x4f,0xfd,0xed,0xa4,0x49,0x2f,0x2a,0xd,0xc0,0xaa,0xa2,0xb2, + 0x5c,0xad,0xd3,0xc,0x78,0xcb,0x96,0x4d,0x6a,0xf7,0xee,0x9d,0x9a,0xf9,0xd6,0x91, + 0x6e,0xf7,0x3c,0xc2,0x43,0xe6,0xba,0x2c,0xd8,0xf9,0x6c,0x15,0x2e,0x1e,0x9,0x80, + 0xf4,0x39,0x3f,0x5d,0x73,0xec,0xf3,0xf5,0xbd,0x2c,0x86,0xb6,0x65,0x24,0x38,0xf5, + 0x4a,0x0,0x1f,0xf0,0xc1,0xb6,0xdf,0x2,0x92,0x2b,0x13,0x88,0xb2,0x25,0xa8,0x3b, + 0x30,0x97,0xc,0x59,0x8a,0xab,0x3,0xb6,0xed,0xf4,0xae,0x11,0xa3,0x2e,0x39,0x4e, + 0x67,0x2c,0x16,0xb2,0x5e,0xd1,0x8f,0xd4,0x13,0x4b,0xdd,0xb4,0x1,0xd3,0x8,0x18, + 0x47,0xac,0xa7,0x3d,0x26,0x1b,0x63,0xd0,0x42,0xb4,0x1c,0x63,0xe7,0xa9,0xb6,0x3c, + 0xa0,0xef,0x4f,0x19,0x8d,0xe5,0xa3,0x60,0x37,0x90,0x58,0x62,0xc7,0x2c,0x9b,0x23, + 0xc6,0x62,0xd2,0x9a,0xbb,0x3f,0x58,0x38,0xe4,0xb,0xe8,0xc3,0xf3,0x83,0xd9,0x60, + 0x47,0x96,0xf2,0x5,0xc4,0xd2,0x52,0x2,0x20,0x45,0xd1,0x92,0x19,0x4b,0xe3,0xb0, + 0x98,0xcf,0x77,0x54,0x94,0x1d,0xe8,0x92,0x43,0x26,0xcb,0xb,0x8,0x9,0xbc,0x4e, + 0x5c,0x1f,0x88,0x93,0xb,0x19,0x94,0x49,0xb0,0xc,0xd,0xd8,0x42,0x31,0x70,0xbf, + 0x58,0xd4,0xf4,0xb,0x2b,0x72,0xcf,0xff,0x3d,0x62,0x35,0xcd,0x73,0x98,0x62,0xbc, + 0x21,0x8b,0xce,0xa8,0x17,0x5a,0x94,0x3b,0xb6,0xe9,0x1,0xaf,0x64,0xde,0x83,0x29, + 0xc0,0x4f,0xe9,0x71,0x63,0x62,0xee,0x40,0x54,0xdd,0x9f,0xf1,0x3f,0x93,0x56,0xdb, + 0x31,0x23,0xb6,0x94,0x11,0x96,0xb4,0x7a,0x16,0x20,0x9d,0x88,0x9b,0x2f,0x3b,0x23, + 0x2b,0xcf,0x1f,0x38,0xc3,0xf,0x7b,0x40,0xfa,0x2d,0x47,0xc,0xc0,0x42,0x8b,0xf0, + 0xc1,0xc,0xd6,0x9e,0xf8,0x81,0x47,0xfc,0xeb,0xc9,0x42,0xff,0x8a,0x7a,0xef,0xc3, + 0xf,0xd4,0x8f,0x34,0x2b,0xfe,0xd1,0x8f,0x3f,0x23,0x96,0xdc,0x93,0xef,0x25,0xdf, + 0x63,0xe8,0x8a,0x4f,0x35,0x37,0x91,0x9b,0x13,0x7c,0x8d,0x61,0xc4,0x75,0xb0,0xe6, + 0x80,0xda,0xbe,0xfd,0xcd,0xff,0x54,0x57,0x57,0xfb,0x2c,0x40,0xf8,0xcb,0xe2,0x43, + 0x88,0x6d,0x21,0xfe,0x7c,0x59,0xec,0xba,0x11,0xbc,0xf4,0x0,0x98,0x7,0x23,0x53, + 0x56,0xfe,0x97,0x2d,0x5b,0xa8,0x6e,0xd8,0x4e,0x38,0x59,0x85,0x12,0xc0,0xb7,0xa6, + 0xe6,0xe0,0xff,0x71,0xcb,0x4d,0xdf,0xfd,0xfb,0x7b,0xef,0xb9,0x4b,0xbd,0xfc,0xf2, + 0x4b,0x4,0xc0,0x55,0x55,0x2b,0xd5,0xce,0x5d,0x3b,0x48,0xfc,0xdc,0x8c,0xb0,0x89, + 0xd6,0x8a,0x19,0xff,0x78,0xfe,0xc0,0x3,0x70,0x5d,0x30,0xc,0xe1,0xa0,0xee,0xb3, + 0xcf,0xf8,0x79,0x5f,0x0,0x9a,0x7c,0x2f,0x13,0x58,0xfb,0x65,0xd0,0x8d,0x0,0x6c, + 0x33,0x44,0xc5,0xb2,0xdd,0x44,0xc,0x9d,0xf7,0x18,0xb2,0xe7,0xf2,0xe3,0x31,0x57, + 0x9f,0x35,0x87,0xe2,0xec,0x14,0x7b,0xb6,0x6d,0xf4,0xe4,0x3,0x96,0x2e,0x5c,0x8e, + 0xe4,0x33,0x49,0xf7,0x25,0xe9,0xae,0x14,0x2,0x32,0x2f,0x42,0x52,0x22,0xfb,0x94, + 0xb1,0x5a,0xb2,0xf0,0x89,0x2,0x94,0x14,0xd1,0xb,0x3,0x2f,0xcf,0xea,0x7b,0x20, + 0x6e,0xf8,0xe5,0x74,0xe4,0xc1,0xa2,0x22,0x1f,0x11,0xe1,0x7b,0xd6,0xe0,0x2,0x10, + 0x63,0x6c,0xd6,0x89,0x9e,0x79,0xc1,0x12,0xd3,0x87,0xb,0xb6,0xdd,0x17,0x58,0x78, + 0x7b,0x22,0xed,0xa1,0xb8,0xde,0xb9,0x3f,0x62,0x31,0x9e,0x8f,0xb8,0x6d,0x65,0x49, + 0x3,0xc2,0x7a,0xde,0xc2,0xc0,0x5a,0x37,0x87,0x40,0x19,0x5b,0x40,0x48,0xb0,0x8e, + 0x59,0x99,0x47,0x75,0xdf,0x82,0x15,0x33,0x8,0x7a,0xed,0xd,0xf6,0xa7,0x40,0x29, + 0x14,0xc5,0xbb,0x85,0x80,0x58,0x48,0x64,0x19,0x8c,0xd,0x66,0x58,0x92,0xcb,0x85, + 0x88,0xd3,0xeb,0x72,0x5b,0x82,0xed,0x86,0x75,0xc2,0x60,0x2a,0xfd,0x11,0xb0,0x8d, + 0xbb,0x58,0x31,0xc0,0x5f,0xf6,0xa5,0x1,0x57,0x86,0x82,0xe0,0x2c,0x69,0xc0,0xa, + 0x45,0xcb,0x2e,0x8,0x87,0x75,0x33,0x63,0x3f,0x69,0xf6,0x21,0x67,0x86,0x1c,0x12, + 0x9,0xfe,0xe,0xf1,0xbb,0x85,0x7e,0x2f,0xdb,0x0,0x1e,0xec,0x8b,0xed,0xfc,0xfc, + 0xdf,0xba,0x22,0x2c,0xa8,0x2f,0xa7,0x98,0x35,0xfa,0xe8,0x17,0xee,0x4b,0xd2,0x80, + 0x2c,0xc,0x5e,0x13,0x5b,0x34,0xc8,0xdf,0x3,0xfc,0x93,0x11,0x3b,0xfe,0xb3,0x9f, + 0xfc,0x98,0xc,0xb9,0x30,0x2e,0xb0,0x5f,0xb8,0x7c,0xc2,0x3,0xe5,0x58,0xfd,0x11, + 0xa,0x3,0xba,0x61,0xe3,0x3a,0x55,0xbc,0xa2,0xe8,0xef,0x1a,0x1a,0x1a,0x7e,0x1f, + 0xdf,0xf8,0x1b,0xc5,0x96,0x42,0xf8,0x51,0x8,0x7b,0xbe,0xc,0x96,0x8d,0xa4,0x5d, + 0xf7,0x87,0x8b,0x73,0xe7,0xce,0x51,0xca,0x6a,0x98,0xef,0xc9,0xa3,0x2c,0x3f,0x5c, + 0x7e,0xac,0xad,0xd8,0x35,0xd7,0x1f,0x49,0xbd,0xd8,0xc3,0x6f,0xde,0xb4,0xe9,0xb6, + 0x6f,0xfc,0xe1,0x1f,0xa8,0xc7,0x1f,0x7b,0x44,0x2d,0x5b,0xb6,0x18,0xab,0x27,0x75, + 0xb4,0x5e,0x3,0x6f,0xcb,0x69,0x75,0xa1,0xed,0x12,0x59,0x32,0x1b,0x0,0xec,0xf3, + 0xc4,0xcb,0x32,0xf5,0x4,0x47,0xfc,0x90,0xe1,0x72,0x14,0xfe,0xa0,0x5d,0x70,0x4, + 0x2e,0xdb,0x9f,0xb0,0x64,0x9,0xc0,0x52,0x74,0xcc,0xbe,0xbe,0x52,0xbc,0x2d,0x59, + 0xb6,0x27,0x3e,0xce,0x60,0xdc,0x9,0xb0,0xf7,0x9,0x70,0x15,0x8b,0x7,0x29,0xfa, + 0xb6,0xd7,0xf9,0x2,0xac,0x59,0x8e,0x21,0x53,0x87,0x1d,0xea,0x81,0x3,0xf6,0x1c, + 0x13,0xa9,0x47,0xc5,0xd8,0x31,0x11,0xfa,0x40,0x3e,0xe5,0x92,0x15,0x5b,0x40,0xf4, + 0x45,0x5c,0xb3,0xe4,0x18,0x7c,0xeb,0xed,0xfe,0x28,0x70,0xa7,0xac,0xcc,0x23,0xe7, + 0x29,0xab,0xf1,0x0,0xc8,0x12,0x83,0xab,0x1,0x8f,0x1d,0xe7,0x3,0xd0,0x34,0xff, + 0xeb,0xbe,0x94,0x41,0x5b,0xa8,0xc3,0x76,0x22,0xf7,0x88,0xde,0x39,0x1,0xec,0x7c, + 0xa,0x88,0xf3,0x61,0xd4,0xb4,0xc0,0x2d,0x2c,0x1f,0xf8,0x13,0xc7,0x2c,0xb3,0x7d, + 0xfd,0xf4,0x40,0x4a,0x9f,0xee,0x89,0xa5,0x23,0xe2,0xe7,0xfe,0xc8,0xa2,0x24,0x6e, + 0x91,0x1d,0x37,0xb0,0x8b,0x59,0x95,0x67,0xde,0x8b,0x46,0x80,0x4b,0xfb,0x80,0x87, + 0x92,0x80,0xac,0xbc,0x14,0x73,0xf,0x74,0xec,0xd1,0xb9,0xcb,0x10,0x47,0xf7,0x47, + 0x40,0xbb,0x3f,0xf4,0x9d,0xe,0xac,0xba,0x93,0x5,0x45,0x5a,0x94,0x2e,0xdd,0x7f, + 0x38,0x48,0xa,0x7e,0x3,0xed,0x9d,0x1d,0x64,0xab,0x72,0xb4,0xfe,0x98,0xda,0xb9, + 0x7b,0x97,0x6,0xa7,0x8d,0xaa,0xbc,0xb2,0x42,0x2d,0x5b,0x5e,0xa4,0xe6,0xcd,0x9f, + 0xaf,0x66,0xce,0x9a,0xa5,0x5e,0x9f,0x3e,0x5d,0xbd,0x36,0x6d,0x9a,0x9a,0xf2,0xda, + 0x6b,0x6a,0xf2,0x94,0x29,0xea,0x15,0x9d,0x70,0x3e,0xe5,0xb5,0xd7,0x29,0x7f,0xfa, + 0xcc,0x99,0x6a,0xae,0x2e,0xbb,0x78,0xc9,0x12,0x55,0x5a,0x56,0xa6,0xd6,0xae,0x5f, + 0xa7,0xb6,0xef,0xd8,0xae,0xe,0xd5,0x1e,0xa2,0x20,0x2e,0x88,0xf8,0x87,0x6f,0x2, + 0x5,0xd,0xba,0x96,0x4,0x6c,0x49,0x58,0xed,0x60,0xa,0x64,0xb3,0x5c,0xcd,0x6, + 0x3,0x3d,0x7c,0xe8,0xaa,0x89,0xdf,0x13,0xda,0x86,0xc1,0xd6,0x4f,0xfe,0xfa,0xa7, + 0x64,0x4d,0x8d,0x32,0x6d,0xed,0x6d,0x24,0x9a,0x3e,0x5c,0x5b,0x43,0x92,0xcb,0xf9, + 0xf3,0xe6,0x28,0x4d,0xae,0x6e,0x5,0x0,0x4b,0x7c,0x18,0x9,0x6,0xc5,0x70,0xe4, + 0x46,0xee,0x17,0x3a,0x8f,0xa5,0xac,0x7b,0x61,0x1b,0xee,0x2f,0xab,0xa1,0x7f,0x8c, + 0xd4,0xda,0xda,0x7a,0xc3,0xe5,0x70,0x1e,0xd6,0xc3,0x3,0x41,0x44,0xb1,0x6d,0xdb, + 0x9b,0x77,0x3d,0xf3,0xcc,0x53,0x6a,0xe3,0xa6,0xd,0xc4,0x78,0xf1,0x83,0x3a,0x7f, + 0xe9,0x82,0x65,0xbc,0x6,0x24,0x8,0x30,0x2d,0x90,0x82,0x5,0x23,0x49,0xb6,0x9a, + 0xdc,0xeb,0xf3,0xef,0x89,0x6b,0xf,0xbc,0xfb,0xe3,0x40,0xee,0xda,0x12,0x4c,0xd5, + 0x3,0x79,0xa7,0xa7,0xcd,0xa7,0x16,0x3,0x3d,0x11,0x30,0xf6,0x75,0xbb,0xbe,0x3e, + 0xd8,0x3,0xfa,0x81,0x80,0xad,0x7,0xb,0x86,0x28,0x83,0x1f,0x48,0x83,0x7e,0x14, + 0xb0,0x23,0xec,0x58,0xfa,0x22,0xf7,0x65,0x81,0x70,0xe0,0x6,0xe5,0x2d,0x0,0x32, + 0xa4,0x9,0xbe,0xde,0x59,0x30,0x56,0xcb,0x7c,0x68,0x35,0x2e,0xd8,0x95,0x13,0xe3, + 0x85,0xac,0x2b,0xf2,0xb1,0xa5,0xc8,0x64,0x57,0x86,0x3c,0x71,0xa9,0x27,0x2a,0xb3, + 0x86,0x29,0x7c,0xcf,0x3,0x5a,0x3b,0x7e,0x16,0xe3,0xc5,0x24,0xa,0xfd,0xc2,0xa7, + 0x34,0x5c,0x38,0x30,0xeb,0x62,0xa3,0x35,0xe9,0x9e,0xc3,0x92,0x85,0xbc,0xdd,0xcc, + 0x83,0x41,0x9e,0xdb,0xe3,0x71,0x84,0x1f,0x3a,0x96,0x88,0x50,0x9f,0xd2,0xe0,0xcb, + 0x2,0x15,0xfa,0x2,0x4b,0xca,0x32,0x26,0xc3,0x47,0xd0,0x5,0x49,0xa1,0x31,0x1a, + 0x86,0x26,0x9f,0xa1,0x5f,0x8c,0x29,0x25,0x6a,0xc7,0xbd,0xb7,0xae,0x58,0x26,0xdd, + 0xef,0xfc,0x4c,0x43,0xd7,0x9e,0x41,0xb,0x2c,0x31,0x43,0x3a,0x29,0xf6,0xcf,0xf4, + 0xe9,0x1e,0xf2,0x75,0xf6,0x31,0x70,0xcf,0xd2,0xf3,0x87,0xfa,0xf9,0x98,0x4e,0x3d, + 0x74,0x9d,0x8a,0xf5,0x1d,0x86,0x6a,0xd,0xf5,0xf1,0xc3,0x85,0x5e,0x8d,0x89,0xee, + 0x19,0x70,0x29,0xfa,0x9b,0x3e,0x87,0xf7,0x5,0xa2,0xea,0x55,0xd7,0x54,0xab,0xb5, + 0xeb,0xd6,0xaa,0x45,0x8b,0x17,0xab,0xa9,0xaf,0x4f,0x53,0x2f,0x4d,0x7e,0x45,0xbd, + 0x30,0xe9,0x65,0x7d,0xd4,0xc0,0xfa,0xda,0x74,0x35,0x65,0xfa,0x1b,0x6a,0xe6,0xdc, + 0x85,0x6a,0xde,0x92,0x22,0x35,0x7f,0xe9,0xa,0xb5,0xb4,0xa4,0x42,0x2d,0xaf,0xa8, + 0x52,0x2b,0x2a,0x57,0xab,0xd2,0x55,0xeb,0x54,0x69,0xd5,0x3a,0x55,0xb2,0x6a,0xad, + 0x39,0xae,0x5c,0x4b,0xf9,0xcb,0x4a,0x2b,0xd5,0xa2,0x15,0xa5,0x6a,0x41,0x51,0xb1, + 0x9a,0xb3,0x68,0xa9,0x9a,0x36,0x6b,0xae,0x7a,0xe5,0xf5,0x19,0xea,0xa5,0x57,0xa7, + 0xaa,0x89,0x93,0x26,0xeb,0xf4,0xb2,0x7a,0x75,0xea,0x54,0x35,0x6b,0xce,0x1c,0x55, + 0x56,0x51,0xae,0x76,0xec,0xda,0xa9,0x4e,0x34,0x36,0x90,0x9d,0xc,0x9e,0x45,0x46, + 0xaf,0xb,0xe3,0x1f,0xa4,0xdc,0xb2,0x2e,0x7,0x6e,0x62,0x97,0x23,0x1,0x65,0xec, + 0xff,0xd,0xbf,0x1f,0x4,0xfb,0x80,0xd1,0x16,0x2c,0xa9,0x51,0x16,0xd1,0xb7,0x60, + 0xac,0xb5,0x61,0xc3,0x3a,0x75,0xe8,0x50,0xcd,0xdd,0x20,0x59,0xff,0x98,0xd8,0x33, + 0x52,0x7c,0xfa,0x22,0xc9,0xfd,0x31,0xa0,0x49,0x60,0xcb,0xca,0x8b,0xdd,0xbb,0x91, + 0xfa,0x5f,0x24,0xaf,0x50,0x59,0x24,0xfc,0x53,0x5a,0x5a,0x4e,0xff,0xd2,0xfe,0xfd, + 0xfb,0xa6,0x6d,0xdb,0xb6,0xf5,0x93,0x9a,0x43,0x35,0x4,0xbc,0x8,0x9,0x89,0x70, + 0x90,0x21,0x88,0x4a,0x0,0x34,0x0,0x69,0x0,0x99,0x12,0x3,0xac,0x60,0xba,0xe1, + 0x3d,0x8f,0xfd,0xca,0x72,0xc,0xd0,0x8e,0x81,0xe6,0x3d,0x16,0xed,0x0,0x9c,0xcf, + 0x2d,0xab,0xe,0x8d,0xbb,0x1c,0x93,0xee,0x4f,0x80,0xd8,0xbb,0x9f,0xf,0xf5,0xc6, + 0x11,0x80,0xe,0x44,0xe0,0x7d,0x42,0x47,0x1d,0xe6,0x39,0x36,0xde,0xdf,0x97,0xee, + 0x27,0x10,0xbb,0x4b,0xe0,0xed,0x8d,0xe9,0xaa,0x3,0xd6,0x2f,0xc5,0xf1,0x31,0xb7, + 0xaa,0xde,0xc,0xf1,0x7d,0xc8,0x96,0xfb,0x7,0xf1,0xe2,0xe,0x51,0x2,0x90,0x9c, + 0x39,0x77,0x4e,0x55,0x56,0xad,0x56,0x53,0xa7,0xcf,0x50,0x93,0xf5,0xca,0x7e,0x8a, + 0x5e,0xf5,0xcf,0x5f,0xbc,0x44,0xd5,0xd4,0xd6,0xea,0x17,0xf9,0x2d,0x5d,0xa7,0x5f, + 0x2d,0x5d,0xb1,0x42,0xbd,0xa8,0x3f,0x58,0xe5,0xab,0x56,0x19,0x0,0xd3,0x1f,0x8c, + 0xad,0xdb,0x77,0xa8,0x97,0xa7,0x4c,0x55,0x33,0xf5,0xc7,0x5,0x61,0x42,0x77,0xed, + 0xdd,0xab,0x5e,0xd5,0x1f,0xb6,0x57,0x74,0x1b,0x38,0x4e,0xd1,0xed,0xe1,0xbc,0xa8, + 0xa4,0x54,0x5d,0x68,0x6b,0xa3,0xc8,0x40,0x7b,0xf,0x1c,0x50,0xcf,0xbf,0x34,0x49, + 0x3d,0xf7,0xe2,0x4b,0x74,0x7c,0x5e,0x7f,0xa0,0x9e,0x99,0xf8,0xa2,0xaa,0x3e,0x74, + 0x88,0xc6,0xf1,0xf2,0xd4,0xd7,0xe8,0xde,0x73,0x28,0x63,0xd3,0xb4,0x37,0x66,0xa9, + 0x3,0x35,0x35,0x34,0x96,0x1,0x3b,0x6e,0xd6,0x51,0x2,0x84,0x30,0xa6,0xa7,0x9f, + 0x7f,0x41,0x4d,0x9f,0x35,0x5b,0xb5,0x77,0x75,0x91,0x18,0xb1,0xa3,0x3b,0xa7,0x5e, + 0x9f,0xf9,0x86,0x9a,0xf0,0xc2,0x44,0xb5,0x66,0xfd,0x6,0xca,0x7f,0x6d,0xc6,0x4c, + 0xba,0xde,0xb3,0x7f,0xbf,0x6a,0xeb,0xec,0xd4,0x1f,0xca,0xd7,0xe9,0x7a,0xdd,0xa6, + 0x4d,0xfa,0x79,0x8c,0xe8,0x71,0x6f,0x75,0x35,0xf5,0xff,0xc2,0xcb,0x93,0xd5,0x89, + 0xa6,0x26,0x55,0x52,0x51,0xa1,0xaf,0x27,0xd1,0xf5,0x8b,0x93,0x5f,0xa5,0x7b,0x98, + 0xa7,0x96,0xd6,0xb3,0x6a,0xc6,0xec,0x39,0xea,0x59,0x3d,0x76,0x3c,0xc3,0xb3,0x3a, + 0xff,0x19,0xdd,0x16,0x9e,0x35,0xaf,0xe7,0x77,0x71,0x51,0x11,0xb5,0xfd,0xba,0x66, + 0x48,0x5d,0x88,0x23,0xad,0xdb,0xcf,0xf5,0xf6,0xaa,0x37,0xe6,0xce,0x53,0x4f,0x3d, + 0xf7,0x3c,0xb5,0x8b,0xe7,0x58,0xb8,0x74,0xa9,0x99,0xb,0xdd,0x6,0x12,0xfa,0x99, + 0xa4,0xe7,0xb4,0x6a,0xdd,0x3a,0x2a,0x7f,0xf5,0xed,0xb7,0xf5,0xef,0x24,0xaf,0x56, + 0xae,0x59,0xa3,0xa6,0x4c,0x9b,0x4e,0xf3,0x8a,0x84,0xff,0xd3,0x82,0x25,0x4b,0xd5, + 0xe9,0xb3,0x67,0x69,0xe,0x3c,0xf1,0x3b,0xc7,0x27,0xe,0x80,0x37,0xcb,0x9f,0x3a, + 0x4,0x6b,0x19,0x64,0xc4,0x13,0xdb,0xf,0x65,0x33,0xf5,0x98,0xfb,0x5a,0xd4,0x70, + 0x6e,0x70,0x20,0x25,0x32,0x8f,0x31,0xeb,0x98,0x8a,0x22,0x16,0xbb,0x5d,0x1a,0x35, + 0x31,0xb3,0x4,0xb3,0x3d,0x76,0xbc,0x5e,0x6d,0xd8,0xb4,0x51,0x2d,0xd4,0x60,0xb, + 0xe6,0x8a,0xdf,0xda,0x8b,0x1a,0x68,0x1,0xb2,0x73,0x17,0x17,0xa9,0xa2,0xf2,0x55, + 0xaa,0x6c,0xf5,0x7a,0x55,0xb9,0x6e,0x93,0x5a,0xb9,0x7e,0xb3,0xaa,0xda,0xb8,0x55, + 0xad,0xda,0xb0,0x85,0x12,0xe5,0xad,0xdb,0x4c,0x47,0x4a,0x6b,0x37,0xaa,0x8a,0x35, + 0x1b,0xdd,0x75,0xf9,0x9a,0xd,0x54,0x87,0xaf,0x71,0xce,0x89,0xda,0x58,0xbf,0x45, + 0xb7,0xf7,0x26,0xb5,0x89,0xb2,0x25,0x2b,0xd7,0xa8,0xc5,0xc5,0x65,0x6a,0xf6,0xc2, + 0x25,0x6a,0xea,0x8c,0x37,0xe8,0x77,0x34,0x51,0x8f,0xe7,0x8d,0xd9,0xb3,0x54,0xc5, + 0xca,0x4a,0xda,0x5a,0x14,0x41,0x89,0xf0,0x4e,0x1b,0x31,0xf8,0x95,0x24,0x32,0x57, + 0xc4,0xd,0x2b,0x96,0x62,0x62,0x7c,0xcc,0x19,0xda,0x1,0x0,0xc3,0x60,0xb,0x7e, + 0xc5,0xf8,0x3f,0x42,0x47,0xac,0x81,0xf8,0x93,0xa6,0xa6,0xc6,0xa9,0x67,0x5a,0x5a, + 0xfe,0x69,0x8c,0x8c,0x8d,0x14,0x8f,0xbe,0x8,0xbe,0xd,0xd7,0xd7,0x70,0x6d,0xc6, + 0xea,0x47,0x1,0xf8,0xec,0xd9,0xb3,0xde,0x31,0x3c,0xe7,0x6b,0x4e,0xf2,0x3a,0x76, + 0x9e,0xd5,0xf6,0x70,0x6d,0x66,0xf5,0x2d,0xf3,0xf9,0x41,0x6a,0x6b,0xf,0x8f,0x7d, + 0xf3,0xcd,0xad,0x1d,0x70,0x33,0x3a,0xde,0x70,0x82,0x7e,0x18,0x58,0xad,0x79,0x4c, + 0x96,0x41,0xd4,0x26,0x6,0x40,0xd6,0xf3,0x72,0xea,0x16,0xf7,0x25,0xa8,0xca,0xb2, + 0xb2,0x7e,0x2,0xce,0x42,0x1c,0x1d,0xb4,0xe1,0x1,0x70,0x9f,0xf,0xc0,0x29,0x6, + 0xcd,0x40,0x67,0xcb,0x19,0x86,0xee,0xb3,0x6d,0xf9,0x5c,0xbd,0x42,0xf4,0x2d,0x99, + 0x7d,0x5f,0x4,0xa8,0x43,0x46,0xdc,0x97,0x21,0x2e,0xef,0x9,0x16,0xc,0x31,0x77, + 0x2a,0x69,0x58,0x16,0x8a,0xd9,0x53,0xb,0x94,0x42,0x7a,0xf2,0xd0,0xb2,0x5b,0x82, + 0xb6,0x4,0x78,0xb,0xc0,0x0,0x85,0xa6,0xe6,0x66,0xf5,0xd8,0x53,0x4f,0xab,0xef, + 0xdd,0x36,0x4a,0xdd,0x3c,0x6a,0x8c,0xba,0x69,0xd4,0x68,0x73,0xbc,0x7d,0xb4,0xba, + 0xf7,0x81,0x87,0x54,0xeb,0xc5,0xb,0xea,0xec,0xf9,0xf3,0x6a,0xdc,0xdd,0xf7,0xa8, + 0xbf,0xbc,0xe9,0x16,0x2,0x9f,0xcb,0x96,0xe1,0x1,0x30,0xbe,0x7d,0xf3,0xad,0xea, + 0xae,0xef,0xdf,0x4f,0x0,0xfb,0xd2,0x2b,0xaf,0xea,0x76,0x6e,0xa7,0xfa,0xdf,0xb9, + 0xe5,0x36,0x6a,0xf3,0x96,0xd1,0x63,0xa9,0xad,0xb9,0xb,0x17,0x11,0xc0,0xcd,0x9e, + 0x3f,0x9f,0xee,0x21,0x1f,0xf7,0x71,0x8e,0x36,0x0,0x8a,0x1b,0x36,0x6f,0x51,0xdf, + 0xbd,0xf5,0x36,0x5b,0x47,0xd7,0x1d,0x63,0xca,0x20,0x3d,0xf0,0xe8,0x63,0xea,0xdc, + 0xc5,0x8b,0x4,0x36,0x58,0x40,0xc,0x5c,0x36,0x3a,0x3c,0x0,0xff,0xa3,0x4f,0x3e, + 0xad,0xeb,0xdd,0xae,0x6e,0x1f,0x77,0x87,0x3a,0x76,0xe2,0x84,0x6,0xfa,0x77,0xd4, + 0xf1,0xc6,0x46,0x7d,0x3d,0x9e,0xda,0x5e,0x51,0x56,0xae,0xea,0xea,0xeb,0xd5,0xad, + 0xba,0x3d,0xf4,0xb7,0x7a,0xfd,0x7a,0x5a,0x2c,0x60,0xac,0xa8,0x7,0x40,0x1b,0xbc, + 0x62,0xe2,0x55,0x63,0xe1,0x81,0x32,0xa3,0xef,0xb8,0x53,0x1d,0x3a,0x72,0x44,0x3d, + 0xaa,0xe7,0x86,0xc7,0x7b,0xeb,0x98,0x71,0x54,0xfe,0xf1,0xa7,0x27,0xd0,0x82,0xe0, + 0xb6,0xb1,0xe3,0xf5,0xb3,0x8e,0xa6,0xe7,0xfb,0x9e,0x1e,0xef,0x5f,0x7c,0xef,0x26, + 0x5a,0x2c,0x5c,0xea,0xe8,0x50,0x77,0xdd,0x77,0x3f,0xcd,0xc3,0x98,0x3b,0xef,0x52, + 0x27,0x4f,0x9f,0xa6,0x78,0xc9,0xf5,0xd,0xd,0x6a,0xd4,0xf8,0x3b,0xa8,0xbd,0x85, + 0x4b,0x97,0xd1,0x22,0x0,0x73,0x87,0x72,0x3c,0x1f,0x37,0xbb,0xf9,0x1f,0xa5,0x2a, + 0x56,0x55,0x91,0xc5,0xeb,0x8a,0xb2,0x32,0x7d,0x7f,0x8c,0xcb,0x37,0xff,0x23,0xd3, + 0x27,0x16,0x15,0xe,0x3c,0x5,0x13,0xf6,0x22,0xa1,0x5,0x0,0x19,0x1a,0xd4,0x85, + 0xd1,0xde,0xc2,0xf6,0xa4,0xd4,0x81,0xfd,0xb4,0xc3,0x70,0x9c,0x46,0x1f,0xea,0x5b, + 0x87,0xf7,0x87,0x1,0x60,0x3c,0x76,0xee,0xb3,0xf1,0x98,0xff,0xba,0x14,0x51,0x87, + 0x80,0xed,0x98,0xae,0x6,0x2b,0xfc,0xa6,0x4f,0x9f,0x69,0x51,0xdb,0x76,0x6c,0x57, + 0xb,0x17,0x2d,0x52,0x2f,0xe9,0x45,0xcc,0xb,0x9a,0x7d,0xbe,0x3a,0x6d,0xa6,0x66, + 0xb3,0xcb,0x55,0x51,0xd9,0x4a,0x55,0xa1,0x41,0x94,0x1,0x96,0xc1,0x13,0x79,0x9c, + 0x0,0x94,0x48,0x38,0x67,0x60,0xe5,0x7b,0xc,0xba,0xc,0xb6,0x9c,0xe7,0xea,0x3, + 0x90,0x71,0x6d,0x41,0x1a,0xd7,0x0,0x6d,0x99,0x18,0xa0,0xd7,0x6c,0xde,0xa6,0xaa, + 0x36,0xbd,0x49,0xe0,0xbf,0x54,0xb3,0xe7,0xd9,0xb,0x96,0xe8,0xc5,0xd4,0x34,0xf5, + 0xa2,0x1e,0xf3,0xc,0xfd,0xdb,0x59,0xbd,0x76,0xd,0x89,0xc4,0x21,0x65,0x34,0x31, + 0xd4,0xaf,0xba,0x48,0x5f,0x61,0xf0,0x96,0x2c,0xc9,0x40,0x68,0x98,0x68,0x24,0x2a, + 0x57,0x69,0x93,0x7,0x88,0xa6,0xb1,0x97,0x31,0xbe,0xbf,0xf0,0x25,0x3e,0xd1,0x70, + 0xbc,0xbf,0xa9,0xa9,0x69,0x4c,0x88,0x27,0xb1,0x34,0x12,0x1c,0xc9,0x2a,0x17,0xc3, + 0xb9,0x91,0xd4,0x1b,0xae,0x2c,0xe7,0xb9,0xbf,0x42,0xf,0xf0,0xff,0xcd,0x64,0x1e, + 0xa2,0xa9,0xb1,0xf1,0x5f,0xee,0xda,0xb5,0x63,0x95,0x6,0xdf,0xff,0x5a,0x7b,0xa4, + 0x96,0x7e,0xd0,0xf0,0xe3,0xa5,0x1d,0x86,0x10,0xac,0x3e,0xdf,0xeb,0x8e,0xe,0x70, + 0xfb,0x12,0x30,0x95,0x40,0x29,0xc1,0x95,0xcb,0x49,0x30,0x96,0x22,0xe3,0x10,0x94, + 0xb1,0x9b,0x11,0xd7,0xe9,0xd,0xc4,0xd6,0xb2,0x3d,0xae,0x43,0xa0,0x36,0x90,0xcf, + 0xd0,0x3f,0xfb,0x75,0xb3,0xc4,0xd2,0x12,0xe8,0x1c,0x93,0x16,0x62,0x6e,0x8f,0xdd, + 0xa,0x50,0x4e,0x1,0x73,0xa4,0x7d,0x6f,0x1c,0x6e,0x31,0xc0,0x7a,0xf3,0xf4,0x7c, + 0xa4,0x2,0x66,0xc4,0x58,0xb8,0x27,0xde,0xce,0xa7,0x16,0xa,0x3d,0x62,0xac,0x31, + 0x83,0x37,0xf3,0x81,0x1d,0xa4,0x97,0x72,0xc9,0xf2,0xe5,0x4,0x44,0x0,0x80,0x3b, + 0xee,0xfd,0xbe,0x7a,0x7c,0xc2,0x33,0x4,0x12,0xb7,0x5a,0x40,0x0,0x33,0xad,0x3e, + 0x7c,0x58,0x83,0xcd,0x38,0x2,0x80,0xd2,0xca,0x4a,0x62,0x65,0x60,0x94,0x0,0x45, + 0xd4,0x3,0xfb,0x43,0xa0,0x95,0x7,0x1e,0x79,0x8c,0xca,0x8c,0xbd,0xeb,0x1e,0x62, + 0x75,0xf,0x3f,0xfe,0x4,0xdd,0x47,0xde,0x43,0xfa,0xbc,0xbd,0xab,0x93,0x18,0x2d, + 0xae,0x1,0xe8,0x60,0x90,0x0,0x66,0x30,0xb9,0x36,0xcd,0x5a,0x70,0xe,0x60,0x1, + 0xd0,0x81,0x39,0x83,0xc1,0x8e,0xd3,0x6d,0x1,0xe8,0xd0,0xce,0xa1,0xba,0x3a,0xb, + 0xfe,0x6,0x80,0xc1,0xc2,0xb1,0x38,0xb8,0x53,0x83,0x18,0xc0,0x77,0xd4,0xf8,0x3b, + 0x9,0x68,0xdf,0xbe,0x7e,0x5d,0x6d,0xdb,0xb5,0xcb,0xf5,0xbd,0x73,0xcf,0x1e,0xb5, + 0x71,0xeb,0x56,0xba,0x46,0x5b,0x7,0xf5,0xf3,0x94,0xad,0x5c,0x49,0xa0,0x6,0x50, + 0xc6,0x58,0xd9,0x72,0x15,0x2c,0x1f,0x80,0x7a,0xdf,0xc3,0x8f,0x10,0xbb,0x4,0xf8, + 0x3d,0xa8,0x9f,0x13,0xcf,0x8f,0x84,0x45,0x6,0xda,0xdb,0xfc,0xe6,0x9b,0x34,0x4e, + 0xb4,0xf7,0xb4,0x66,0xb4,0x18,0xfb,0xac,0x79,0xf3,0xd4,0xc1,0xda,0x5a,0x75,0xf4, + 0xf8,0x71,0x2a,0x8b,0xf1,0xa0,0xcc,0x61,0xd,0xe4,0xef,0xbc,0x77,0x5d,0xed,0xd0, + 0xf5,0x70,0x8d,0x3e,0x37,0xe9,0xfa,0x60,0xd8,0xa3,0xef,0xb8,0x8b,0xf2,0x1e,0x7c, + 0xec,0x71,0xd,0x18,0xd3,0xe8,0xc8,0xc0,0xe,0x9,0x2,0xe6,0x5,0x79,0x18,0x3b, + 0xda,0x7b,0x76,0xa2,0x61,0xda,0x68,0x1f,0xb,0x8c,0xfb,0x1f,0x7e,0x94,0xe6,0x9e, + 0x45,0xe7,0x51,0xdd,0x7f,0x4c,0x57,0x1f,0xd1,0x4f,0xa7,0x82,0xba,0xc,0xf8,0x21, + 0x58,0x43,0xd7,0x32,0xa7,0x6,0x60,0x1d,0x64,0x46,0x38,0xd6,0x74,0x48,0xd2,0xb4, + 0xab,0x5d,0x4a,0x2c,0x1d,0x31,0x98,0x63,0xb7,0x1c,0xda,0x54,0x43,0xf7,0xd1,0x74, + 0xea,0xa4,0x5a,0xbf,0x61,0x3,0xe9,0x69,0x5f,0x78,0xe9,0x65,0x35,0x79,0xea,0x34, + 0x35,0x67,0xd1,0x32,0x12,0x1b,0x3,0xc,0x19,0xf4,0x2a,0x2d,0x48,0x2,0x1c,0x1, + 0x7c,0xe5,0x16,0x20,0x71,0x2e,0x1,0xb7,0x52,0x0,0x2a,0x83,0x31,0xb3,0xdd,0xf2, + 0x20,0x8f,0xcb,0x49,0x10,0xf7,0x0,0xdb,0xf6,0x53,0x11,0xf4,0x53,0x2e,0x58,0x77, + 0xa5,0x5d,0x14,0x0,0x94,0x71,0xbd,0x5c,0xb3,0xf2,0xe9,0xb3,0xe7,0x11,0x43,0x9e, + 0xfc,0xea,0x14,0xb5,0xb4,0x68,0x99,0xaa,0x39,0x7c,0xc8,0x81,0x31,0xab,0x21,0x12, + 0x10,0x4e,0x16,0x40,0x3c,0x4f,0x59,0x16,0xfc,0x7d,0xf6,0x7f,0x1,0x4b,0xe9,0x1f, + 0xff,0xf4,0x27,0xea,0x33,0xcd,0x88,0x11,0xd8,0x3,0x1b,0x8f,0x34,0x9f,0x3e,0xf5, + 0x7f,0x37,0x34,0x9c,0x58,0x7b,0xba,0xb9,0xf9,0x7f,0x3,0x1e,0x14,0xc2,0x8b,0x33, + 0x67,0xce,0x14,0xbc,0x1e,0xe9,0xbd,0x1b,0xe9,0x63,0x24,0x29,0x5,0xc0,0xdc,0x8, + 0x8e,0xe1,0x79,0x2c,0x65,0xdd,0x1f,0xae,0xde,0x70,0x6d,0x86,0xf5,0x63,0xe3,0x3b, + 0x78,0xb0,0xfa,0xc1,0x4d,0x9b,0x37,0x5e,0xdf,0xbb,0x6f,0x8f,0xc2,0xbe,0xa7,0x10, + 0x37,0x73,0x7c,0x66,0x9,0x8c,0xdd,0x1,0x4b,0x95,0xd7,0x38,0xcf,0x9,0x20,0x36, + 0x79,0xc1,0xb5,0xdd,0x79,0x86,0x1,0x3b,0xa6,0xff,0x65,0xb1,0xb3,0x4,0xf9,0x6e, + 0x16,0x6d,0x47,0xc4,0xd9,0xd4,0x47,0x3e,0x19,0x93,0x4,0xb5,0x90,0xa5,0x3b,0x10, + 0xcf,0xa7,0xd9,0xbb,0x7,0x9e,0x92,0x95,0xe7,0xfd,0x85,0x40,0x16,0x23,0x8f,0x2d, + 0x14,0x24,0xb,0xf7,0x40,0x39,0x58,0x7c,0xe0,0x9c,0x5d,0x2b,0x10,0xa6,0xb3,0xb9, + 0xa5,0x85,0x44,0x9c,0xf8,0x1f,0x18,0xbd,0x61,0xbf,0x6f,0xd,0xde,0x1f,0xd1,0x43, + 0x7,0xa2,0xf0,0xbc,0xb0,0xe8,0xf6,0xe7,0xd7,0xfa,0xe,0xf,0x19,0x4b,0x5d,0x88, + 0x3c,0xc1,0xaa,0x0,0xbe,0x0,0x26,0xbc,0xd0,0xb3,0xe6,0xcd,0x27,0x50,0x0,0x8, + 0xd4,0x1d,0x3b,0xa6,0x56,0xad,0x59,0xeb,0x80,0x71,0xbf,0x66,0x7e,0x78,0x71,0x1b, + 0x4e,0x9e,0x24,0xa0,0x5,0x78,0xcf,0x59,0xb0,0x90,0x58,0x1e,0xd8,0x1e,0xd8,0x19, + 0xea,0x83,0x5d,0xd7,0x37,0x9c,0xd0,0xed,0xde,0x47,0x40,0xf7,0xc4,0x33,0xcf,0xaa, + 0x46,0xfd,0xc1,0xbc,0xf3,0xfb,0xf7,0x11,0xc0,0x1,0xc8,0x0,0xa2,0x10,0x2b,0xe3, + 0xa3,0x8a,0x7e,0x27,0x3c,0xff,0x2,0xf5,0x3,0x50,0x1,0xc0,0x83,0x91,0x82,0x9d, + 0x2,0xb0,0x0,0x36,0x60,0xb7,0xa6,0xac,0x11,0x3f,0x3,0x8c,0x1,0x78,0x0,0x5f, + 0x24,0x94,0xdb,0xbd,0x6f,0x1f,0x1,0x30,0x16,0x16,0x37,0xeb,0x7e,0xc1,0x64,0xc1, + 0x3c,0xc1,0xbc,0xb1,0xa0,0x0,0x33,0x3d,0xad,0xe7,0x16,0xed,0x32,0x20,0x3f,0xf2, + 0xe4,0x53,0xf4,0xdb,0x45,0xd0,0x98,0x87,0x1f,0x7f,0x92,0x9e,0x1,0x8b,0xa,0xb0, + 0x62,0xf4,0x81,0x85,0x0,0x9e,0x1,0x75,0x5b,0x5a,0x5b,0xf5,0x47,0xec,0xba,0x5a, + 0xbc,0xac,0x88,0xc0,0x1d,0xe3,0xaa,0xa9,0xab,0xd5,0x73,0xf2,0x2e,0x95,0xc5,0x71, + 0xc3,0x96,0x2d,0x74,0xf,0xe0,0x8a,0x7a,0xbb,0x35,0xbb,0x47,0xdc,0x5f,0x80,0x39, + 0x9e,0x6f,0xcc,0x9d,0x77,0xeb,0xb9,0x38,0xa5,0xaa,0xd6,0xad,0xa7,0xb9,0xc0,0x82, + 0x67,0xbb,0x5e,0x30,0x60,0xdc,0x18,0x3f,0xae,0x31,0xb6,0xd9,0xb,0x16,0xd0,0xfc, + 0xe3,0x19,0x30,0x4e,0xcc,0x59,0x77,0x5f,0x9f,0xba,0xd8,0xde,0xae,0x1e,0x7e,0xe2, + 0x49,0x2a,0x3,0xf6,0xdf,0xa1,0xe7,0x2a,0xc,0x3b,0x2a,0x1,0xd6,0xb,0x31,0x3a, + 0xd8,0x9f,0x6,0xe6,0xc1,0x7e,0xab,0x9a,0x18,0x48,0x7,0xcc,0x9,0x5c,0xce,0xfa, + 0x33,0xa2,0xa2,0x85,0x71,0xda,0x53,0x81,0x72,0x6,0x3,0xcb,0x74,0xa1,0x6f,0xe, + 0xeb,0x7a,0x16,0xe3,0x43,0x3,0x9e,0x8d,0x2,0x24,0x72,0x10,0x2d,0xc3,0xf8,0x69, + 0x22,0xb1,0xdc,0x19,0x6a,0x61,0x51,0x31,0xe9,0x65,0x1d,0x90,0x5a,0xa0,0x95,0x60, + 0x49,0xc0,0x47,0xd7,0xeb,0x13,0x11,0x32,0x83,0xa3,0x0,0x56,0xc7,0x6c,0x2d,0x48, + 0x33,0xf0,0xf2,0x79,0xa5,0x4,0xe0,0x80,0x41,0x4b,0xa6,0xcc,0xe7,0x92,0x25,0xcb, + 0xa3,0xbb,0x6f,0x13,0xc6,0x85,0xb6,0x21,0xb6,0x86,0xf8,0x1a,0xf7,0xe7,0x2e,0x5e, + 0xa6,0xff,0xe7,0x53,0xd5,0x2b,0x53,0xa6,0xaa,0xe5,0xc5,0x2b,0xd4,0x31,0xcd,0x8c, + 0x31,0xa7,0x6c,0x75,0xed,0x36,0xd8,0xb8,0x32,0x54,0x30,0x20,0x4d,0x7f,0xe0,0x31, + 0x80,0xf3,0x77,0xdf,0xbf,0xae,0x3e,0xff,0xab,0x9f,0xaa,0x4f,0x7f,0xf8,0x3,0xba, + 0x36,0xbb,0xd2,0x35,0xbc,0xd5,0xd4,0xd4,0x78,0xdf,0x70,0x18,0x92,0x85,0x33,0x37, + 0x52,0x2e,0x6,0xb6,0x31,0xdc,0x1b,0x69,0x19,0xf7,0x87,0x8c,0x96,0x96,0x16,0x97, + 0xe4,0x75,0x38,0xa0,0xb0,0x4c,0xd6,0xc0,0xc3,0x32,0xb1,0x3a,0xb1,0x3e,0xc2,0x3c, + 0x79,0x6e,0x59,0xef,0x3f,0xdf,0xbe,0xfd,0xcd,0x4d,0x5b,0xb7,0x6e,0xf9,0x9f,0x75, + 0x47,0x8f,0x18,0xd6,0xab,0x1,0x0,0xac,0x37,0xc6,0x4a,0x43,0x36,0xdb,0x53,0xe8, + 0xdc,0x82,0xac,0xa9,0xdf,0x9b,0x2,0x3e,0x66,0xb8,0xdd,0xae,0xcd,0x1e,0xbf,0xd, + 0x4f,0x5f,0x9c,0x16,0x6b,0x7b,0x65,0xf2,0xbd,0x1,0x68,0xa6,0x1,0x33,0x14,0x75, + 0x4b,0x20,0x73,0x7b,0x8,0x7,0xa0,0x1b,0x2,0x36,0x8f,0x31,0xc6,0x7c,0x53,0xfd, + 0x45,0x0,0x5d,0x2e,0x2c,0x24,0xdb,0xc6,0x4b,0x72,0xbc,0x51,0x83,0x84,0x6,0xae, + 0xfb,0x35,0xf3,0x1a,0xaf,0xd9,0xe1,0x1d,0xf7,0xdc,0xab,0x9e,0x7a,0xf6,0x39,0xb5, + 0x56,0xaf,0xf0,0xb1,0x35,0x1e,0x1b,0xff,0xf8,0xd6,0xe2,0x91,0x5,0x44,0x7f,0x5c, + 0x24,0xee,0xb9,0x50,0x58,0x4b,0x4a,0x88,0x40,0xef,0x7b,0xe8,0x61,0x2,0x81,0x89, + 0x1a,0x88,0x7,0xac,0xa3,0x3f,0xd8,0x27,0xb1,0x54,0xd,0xb0,0xa7,0xf4,0x62,0x0, + 0x62,0x55,0x94,0x19,0x6b,0x81,0x3,0x0,0xbc,0x51,0x83,0xc,0x89,0x8a,0x35,0xa8, + 0x81,0x5d,0xee,0x3b,0x78,0x90,0x0,0x10,0xf5,0x20,0xe2,0x5,0xe3,0x3,0xf0,0x8d, + 0xbd,0xeb,0x6e,0xaa,0x3b,0x73,0xce,0x5c,0xd2,0x29,0x9b,0x32,0xa3,0x35,0xeb,0x5d, + 0x42,0x0,0xb,0x30,0x5,0xf3,0x84,0x55,0x3d,0x44,0xde,0xc,0xce,0x2c,0x66,0x3, + 0x10,0xa2,0xcd,0x7b,0x1f,0x7c,0x88,0xc4,0xdc,0x0,0x6d,0xf3,0xf1,0x1e,0xa4,0xfa, + 0x15,0x55,0x55,0xd4,0x1e,0xd8,0x21,0x8e,0x6b,0x37,0x6e,0xa4,0x7c,0xb0,0x5a,0x2c, + 0x2c,0xc0,0x64,0xc1,0x92,0xc1,0x1c,0xd1,0x36,0xc4,0xed,0x10,0x65,0x3,0xc0,0xc, + 0xab,0x1d,0x4f,0x6d,0x63,0x2e,0x20,0xb6,0xc6,0x22,0x2,0xfd,0xcd,0xd1,0xe0,0x7, + 0xb1,0x31,0xe6,0xf9,0xb1,0xa7,0x26,0x58,0xb0,0xd3,0x40,0xad,0xe7,0x11,0xf3,0xf4, + 0xbc,0x65,0xf2,0x0,0xe5,0x73,0x17,0x2f,0xb8,0x85,0x1,0xfa,0x6,0xa3,0x97,0x0, + 0xbc,0x6e,0xe3,0x26,0xd2,0x7f,0x3,0xc8,0x91,0xff,0x7d,0x3d,0xe7,0xd8,0xf1,0xb, + 0xfa,0x60,0x16,0x53,0x63,0x5e,0x21,0x6e,0xde,0xb9,0x77,0x2f,0x2d,0x74,0x50,0x6f, + 0xf5,0xfa,0xd,0x24,0x96,0x67,0x11,0x35,0xce,0x51,0x6,0x92,0x84,0xfb,0x1f,0x79, + 0x94,0x9e,0x7,0x8c,0x5d,0x8a,0x70,0xc3,0x40,0x32,0x59,0x71,0xc5,0x65,0x54,0xb8, + 0x7e,0x6f,0xe7,0xae,0xfe,0x54,0xe4,0xb6,0xd0,0xcd,0x2d,0x16,0x63,0x3d,0x66,0x3d, + 0x1f,0xb,0xd3,0xea,0xbb,0xa7,0xe5,0xd3,0xa1,0x56,0x5,0x58,0xe3,0xbd,0x0,0xd8, + 0x60,0x21,0xa,0x26,0xb8,0x68,0xc9,0x62,0xcd,0x74,0x27,0xa9,0x97,0xa7,0xbe,0xae, + 0x16,0x2c,0x2b,0x36,0x3a,0x5c,0x1,0x66,0x48,0xcc,0x70,0xf9,0x9c,0x19,0x68,0xb9, + 0x3,0xba,0xd,0x1e,0x38,0xd3,0xb5,0x6,0x6f,0x79,0x2d,0xd9,0xab,0x3,0x71,0x79, + 0x6d,0x41,0x9b,0x1,0xb9,0x42,0xd4,0x91,0x4c,0xb9,0xc2,0x8a,0x9e,0x1,0xae,0x12, + 0x7c,0x53,0x4c,0x3a,0x48,0xa5,0x76,0x3c,0x46,0x64,0xbe,0x95,0xae,0x67,0xcd,0x5f, + 0xa4,0x5e,0xd2,0xcc,0x18,0x6c,0x7f,0xe3,0xe6,0x4d,0x14,0xfe,0x57,0xc6,0xb0,0xce, + 0xb2,0xd0,0xcf,0x47,0x77,0xb,0x33,0xb,0x2e,0x94,0xff,0xf8,0x7,0x9f,0x92,0x58, + 0xfa,0xfa,0x7,0xef,0xd1,0x3c,0x9f,0x6e,0x69,0xfe,0x1f,0x27,0x4e,0x1c,0x5f,0x7f, + 0xea,0xd4,0xa9,0x7f,0x1,0x60,0xcb,0xc2,0xad,0x42,0x18,0x95,0x85,0x45,0x85,0xea, + 0x17,0xaa,0x3b,0x1c,0x3e,0x22,0xb9,0x3f,0x6e,0xe0,0xf4,0xe9,0xd3,0x5e,0x83,0x61, + 0x7e,0xec,0x7e,0x56,0x9d,0xac,0x74,0xa3,0xe5,0x39,0x61,0x62,0xf,0xd5,0xd4,0xdc, + 0xb6,0x69,0xd3,0xc6,0xfc,0xee,0x3d,0xbb,0x3,0xd6,0x6b,0x40,0x86,0x45,0xcf,0xe, + 0x18,0x5,0xb,0x96,0x79,0x31,0x86,0xcb,0xa0,0xc5,0x22,0x6b,0xf,0xc4,0xac,0x78, + 0xba,0x5b,0x8a,0x99,0x63,0xa0,0x1b,0x11,0x6f,0xa7,0xc4,0xde,0x41,0xdb,0xd4,0x67, + 0x8,0xb6,0x12,0x9c,0xc5,0xb9,0x5b,0x54,0xc4,0xf4,0xda,0xf9,0x5e,0xa7,0x2f,0xe, + 0xc1,0x98,0xc0,0xba,0xbf,0x2f,0xce,0xac,0x53,0xb,0x83,0x74,0xbb,0x61,0x59,0xac, + 0xf0,0xf7,0x6b,0xf0,0x2,0xf0,0xe2,0xa3,0x3b,0x4a,0x33,0xb9,0x31,0xfa,0xc3,0x3d, + 0x4a,0x33,0xab,0xdb,0x20,0xae,0xd4,0x1f,0x5e,0x18,0x17,0x41,0xcc,0x88,0x8f,0x53, + 0x8c,0x81,0x67,0x32,0xf9,0x7c,0x10,0xf4,0xc4,0x96,0xc1,0x4b,0x9,0xc0,0x0,0xa3, + 0x4,0x73,0x4,0x50,0x41,0x84,0x7a,0xf5,0xda,0x35,0xcd,0x2,0xbb,0x9,0x9c,0x90, + 0xf7,0xa4,0x66,0xad,0x0,0x26,0xb0,0x57,0x7c,0xec,0x21,0xa,0x65,0x66,0x3a,0x7f, + 0xf1,0x62,0xca,0x3,0x30,0xd4,0x1e,0x3d,0xaa,0x8a,0xcb,0xcb,0xe9,0x1a,0xa0,0x6, + 0x26,0xd,0xa0,0xd8,0xba,0x7d,0xbb,0xd3,0x1,0xc3,0x10,0x6a,0xd3,0xd6,0x37,0x9, + 0x4c,0x0,0xc2,0x60,0x89,0x60,0xbf,0xc6,0xa0,0xeb,0x2a,0x89,0x6d,0xc1,0xf4,0x30, + 0x7,0x60,0x8a,0x0,0x2c,0x0,0x25,0x40,0x19,0x79,0x0,0xbc,0xc4,0x4a,0xd8,0xe8, + 0xb0,0xb1,0x58,0x0,0xdb,0x36,0x60,0x77,0x27,0x1d,0x97,0x97,0x96,0x11,0x9b,0x5, + 0xc8,0xe1,0x1a,0xc,0xbf,0xf5,0xc2,0x5,0x75,0xf7,0xfd,0xf,0xd0,0x58,0xc0,0x7c, + 0xa1,0xf7,0xc6,0xc2,0x0,0x4c,0x13,0xcf,0xf,0x71,0x38,0x98,0xed,0x96,0x6d,0xdb, + 0xdd,0xf8,0xd6,0x6f,0xda,0x44,0xb,0xd,0x80,0xeb,0xdd,0xf7,0x99,0xba,0x93,0xa7, + 0xbe,0x46,0x63,0xc5,0x9c,0x40,0xfc,0x8e,0x72,0x4f,0x4c,0x78,0x96,0xe6,0x19,0xb, + 0x3,0x0,0x73,0xdf,0xc0,0x0,0x2d,0x1a,0x0,0xa2,0x0,0x60,0x2c,0xa,0x30,0x37, + 0x18,0xf3,0x63,0x4f,0x4f,0xa0,0xb9,0x98,0xf0,0xfc,0x44,0x32,0xb0,0x82,0x91,0x16, + 0xfa,0x3,0x3,0xef,0xea,0xe9,0xa1,0x67,0x2e,0x2a,0x29,0x31,0xcc,0x5a,0x8f,0xd, + 0x22,0x77,0xe8,0xa4,0xd1,0x37,0xc6,0x9,0x9d,0xf4,0xdb,0x9a,0x61,0x9b,0xb9,0x32, + 0xb,0x85,0x45,0x9a,0x89,0xf3,0x3e,0xb3,0x61,0xc4,0x34,0x3f,0xfc,0x6a,0x24,0xfa, + 0x5b,0x56,0x84,0xb6,0x81,0xfe,0x6c,0xd1,0x75,0xcc,0x75,0x6d,0x20,0xef,0x89,0xad, + 0xc3,0x3a,0xb1,0x5d,0xcc,0xf2,0x61,0xb0,0x97,0x20,0x9e,0x37,0x80,0x5,0x2a,0xb0, + 0xcd,0x5b,0xb7,0x90,0xbb,0xf,0xc4,0xb2,0x33,0xe6,0x2e,0x20,0xcb,0x63,0x9,0x84, + 0x0,0x4f,0xf,0x34,0xf9,0x5c,0xa6,0x0,0x20,0x1d,0xeb,0x15,0xa2,0xe8,0x14,0xe0, + 0x6,0xe0,0x2b,0xeb,0x95,0x33,0x80,0x8b,0x76,0x38,0xcf,0x9d,0xb,0x30,0xaf,0x10, + 0xc0,0x2c,0xc7,0x58,0x21,0xd8,0xb9,0xbc,0xe6,0x45,0x83,0x1c,0x17,0x1b,0x78,0xc1, + 0x78,0x6c,0xea,0x8c,0x59,0x6a,0x92,0x5e,0xa4,0x2e,0x2b,0x2a,0x52,0xc7,0x1b,0x8e, + 0x3b,0xb,0xfb,0x81,0x58,0x14,0xb7,0xa1,0xb4,0x4b,0x9d,0xd4,0xcd,0x23,0xe1,0x77, + 0xe,0x10,0x46,0xcc,0x69,0xb4,0x71,0x5e,0x63,0x41,0x43,0xc3,0x89,0xcb,0x8d,0x8d, + 0xd,0xa3,0xb,0x61,0xcd,0x48,0xf0,0xe7,0x8b,0x62,0xd4,0x8d,0xe2,0x9f,0xfb,0x93, + 0x0,0x1b,0x9e,0xf,0x97,0xb2,0x0,0x7a,0xb8,0x3a,0x59,0x65,0xc2,0x7c,0xac,0x14, + 0xf4,0xca,0xe6,0xe7,0x76,0xed,0xda,0x39,0x5b,0x83,0xef,0xdf,0xb1,0x85,0x33,0xb6, + 0x4,0x4,0xcb,0x72,0xc,0x57,0x7f,0xc0,0x88,0x5,0x7,0x40,0xec,0x1,0xac,0x60, + 0xae,0x52,0x3c,0x2d,0xcb,0xf0,0xbd,0xa8,0x38,0x3a,0x64,0xd3,0xf9,0x34,0x8b,0x66, + 0x7d,0xb2,0x11,0x33,0xf7,0xa5,0x19,0xb8,0x5,0x52,0x1e,0x5b,0xc,0xa4,0x19,0xec, + 0x25,0x80,0x86,0xac,0xdd,0x31,0x6b,0x29,0xd6,0xe,0xc0,0xbf,0x5b,0x8a,0xd5,0x33, + 0xc4,0xd9,0x21,0xd8,0x33,0xd0,0xcb,0x67,0x90,0xe3,0xc1,0x4b,0xd0,0xd4,0x7c,0x8a, + 0x74,0xa7,0x0,0xda,0x31,0x1a,0x44,0x90,0xc6,0x6a,0x46,0x4,0xb6,0x39,0x5a,0x7f, + 0x84,0x47,0x8f,0x37,0xa0,0xb4,0x78,0xd9,0x32,0x27,0x8a,0x96,0x46,0x6f,0xde,0x42, + 0xc1,0x8a,0xf0,0x1d,0xa3,0xef,0xf,0x44,0xe2,0x4e,0x2f,0xdc,0x4f,0xac,0x13,0x8c, + 0x14,0x80,0xc9,0x46,0x52,0x6f,0xbd,0xfd,0x36,0xe9,0x25,0x6f,0xd7,0xac,0x10,0x6, + 0x57,0xb0,0x86,0x36,0x3a,0xd6,0xfb,0x8,0x90,0x1,0x40,0x3,0x56,0xfc,0xb,0xe6, + 0x85,0x71,0x8d,0xd7,0x4c,0x1d,0xba,0x52,0x58,0x43,0x3,0x10,0x70,0xd,0xd6,0xc, + 0x30,0x87,0xe5,0x34,0xc4,0xbe,0x60,0x99,0x35,0x1a,0x4c,0xc0,0x7a,0x8d,0xd8,0xf6, + 0xe,0x2,0xed,0x21,0x72,0xa1,0x31,0xa2,0xe4,0x4d,0x56,0x47,0x8b,0xf2,0x60,0x8c, + 0xf8,0x28,0x60,0x81,0x0,0x60,0xc5,0xf8,0x0,0x44,0x0,0xec,0xbc,0xb0,0xe0,0xc6, + 0x73,0xc3,0xa2,0x18,0x60,0x37,0x8a,0xe6,0x69,0x2c,0xb1,0xca,0xe6,0x33,0x67,0x68, + 0xfe,0x30,0x3e,0x88,0xc7,0xc1,0x6c,0x1,0xb6,0x0,0xc3,0xe5,0xa5,0xa5,0xa4,0xd3, + 0x46,0x1d,0x16,0x5d,0x23,0x41,0xd4,0x8b,0x3e,0xd0,0x17,0xc0,0xad,0xf6,0xd8,0x51, + 0x1a,0x3,0xe6,0x8,0xf3,0x81,0xfc,0x25,0xcb,0x57,0x38,0xf1,0xfb,0x18,0xdb,0x3e, + 0xa4,0x5,0x10,0x55,0x33,0x93,0x27,0xa9,0x82,0x5e,0x4c,0xb1,0xe,0x18,0xcf,0xcb, + 0xd6,0xca,0xe3,0xee,0xbe,0x97,0xc6,0x80,0x31,0x2,0xd8,0xd9,0x50,0x6b,0xd2,0xab, + 0x53,0x34,0x88,0x5e,0xa6,0x79,0x80,0xa5,0x33,0x44,0xe7,0x77,0xdc,0xf3,0x7d,0x55, + 0xdf,0xd8,0x60,0xc5,0xf2,0x63,0xc8,0x58,0xb,0xb,0x12,0xf4,0xbf,0x4e,0xb3,0x7c, + 0xc3,0x8a,0xc7,0xa8,0x2d,0x7a,0x91,0x63,0xdc,0xb7,0x7c,0x9f,0xf5,0xd0,0x17,0xbd, + 0x2f,0x88,0xdc,0xd6,0x2b,0x3,0xba,0x84,0x71,0xce,0x7,0xf2,0xa9,0x3d,0xaa,0xfb, + 0x22,0x2e,0x79,0x7d,0xfd,0xc1,0xbe,0xd4,0x41,0x5f,0x7d,0x21,0xb,0xf,0x37,0x10, + 0x11,0xfa,0x68,0x19,0x1d,0xc,0x5b,0xf0,0x55,0xad,0x5e,0xad,0x26,0xeb,0xdf,0xd4, + 0xa4,0x29,0xaf,0x11,0xdb,0x25,0x56,0x18,0xb2,0x5c,0x2,0xa9,0x75,0xee,0xda,0x81, + 0x96,0x0,0xaf,0xb2,0x0,0x84,0x19,0x54,0xbd,0xb2,0x55,0xeb,0x52,0xcc,0x99,0x99, + 0x71,0xc8,0x8a,0xb9,0xed,0x90,0x31,0x57,0x4,0x8b,0x0,0x29,0x7a,0x2e,0xf,0x18, + 0x78,0x8a,0x31,0xbb,0xf3,0xf5,0xc1,0xb3,0xad,0xf7,0xca,0x71,0xbb,0x0,0xe2,0xf2, + 0x35,0x1b,0xd5,0xcc,0x79,0xb,0x49,0xc,0xbf,0x70,0xf1,0x22,0x92,0x10,0xe0,0x7f, + 0x9,0xa3,0xb4,0x7e,0x61,0x5,0x1d,0x2e,0x6c,0x42,0x35,0x83,0xdb,0xbe,0x55,0x83, + 0xf3,0x47,0xe4,0x3f,0xfc,0x57,0xa4,0x27,0xc6,0x86,0xf,0xa7,0x9a,0x4f,0xfe,0xbd, + 0x66,0xc3,0xf3,0x34,0x66,0x7c,0x7d,0x38,0x2c,0xa,0x81,0x71,0x38,0x2c,0x1a,0xe, + 0xff,0xb2,0x80,0x36,0xab,0xae,0xfb,0x6b,0x6e,0x6e,0x8e,0x16,0xe0,0x7c,0x1c,0x65, + 0x92,0xf7,0xc3,0xfc,0x58,0x5b,0xb1,0x3a,0x23,0x1,0x77,0x80,0x6f,0x7d,0x7d,0xfd, + 0x6f,0x6c,0xdc,0xb8,0xa1,0xf6,0xcd,0x6d,0x5b,0xd5,0xb1,0xe3,0xc7,0x48,0x9f,0x2, + 0x93,0xfd,0x10,0x60,0x19,0x80,0x25,0x18,0xcb,0x32,0xc,0xce,0x21,0x43,0xe,0xf5, + 0xbc,0xb9,0x10,0xb0,0x7b,0x7b,0x52,0x7a,0x60,0x16,0x51,0xa7,0x44,0xdd,0xb6,0x7e, + 0x8f,0xd0,0x2d,0x77,0x8b,0xeb,0x5c,0xa4,0x5d,0x9,0x84,0x61,0xbf,0xb9,0x28,0x98, + 0xf6,0x66,0x3e,0x87,0x37,0x36,0x6,0x6e,0xaf,0x8f,0x3e,0x6f,0x71,0xc1,0x0,0x9b, + 0x1a,0x4b,0xc0,0x80,0xa5,0x81,0x1a,0x5e,0x88,0x45,0x4b,0x97,0xaa,0x9b,0xf1,0xd1, + 0x1f,0x7f,0x27,0x31,0x5f,0x73,0x34,0x89,0xcf,0xf1,0x31,0xbf,0x4b,0x83,0xe0,0x49, + 0xcd,0xdc,0x92,0x8f,0x68,0x9a,0xf1,0x76,0x47,0xc4,0xec,0xde,0x2,0xc1,0x19,0x6b, + 0x19,0xdf,0x57,0x80,0xa0,0x31,0xf8,0x19,0x43,0x16,0xcd,0xf8,0x10,0xb6,0x9c,0x6b, + 0x25,0xe3,0x28,0x58,0xd7,0x82,0x99,0x93,0xd8,0xd8,0x1a,0x33,0x81,0x9d,0x5d,0xd1, + 0xc0,0xa,0x2b,0xdf,0xfb,0x88,0xb1,0x8f,0x25,0x3,0x24,0x88,0x86,0xc1,0x9a,0x1, + 0x1c,0x60,0xcd,0x70,0x9b,0x1,0x18,0x19,0x50,0x1e,0xad,0xc6,0x6b,0xe0,0x39,0x71, + 0xb2,0xc9,0x31,0x3e,0xb0,0x53,0xe8,0x31,0x59,0x9c,0xc,0x20,0x9e,0x3d,0x7f,0x81, + 0xd3,0xa9,0x1e,0x38,0x74,0x88,0x80,0x6,0x86,0x54,0x0,0x4a,0x66,0xd0,0x0,0xe0, + 0x3e,0xeb,0x8e,0x82,0xf6,0xe1,0xb6,0x4,0x76,0xca,0x6,0x58,0xe8,0xb,0xe3,0x66, + 0x63,0x27,0x16,0x87,0x6f,0xdf,0xbd,0xdb,0x19,0x64,0xed,0xde,0xb7,0x5f,0x55,0xad, + 0x5d,0x47,0xe7,0xa8,0xc3,0xc0,0xbd,0x75,0xc7,0xe,0x62,0xcb,0xa8,0x7,0x60,0x44, + 0xdb,0x18,0x3,0xdc,0x7f,0x58,0xff,0x8d,0x32,0x60,0xf6,0x6c,0xe0,0x85,0x54,0x52, + 0x5e,0x61,0x44,0xe9,0xd6,0x88,0xb,0xe0,0x3f,0x5e,0x83,0x27,0x0,0x9f,0xda,0xd6, + 0x2c,0x19,0xf3,0x9,0xab,0x69,0xd6,0xab,0x63,0x81,0x1,0xc0,0xc7,0xb3,0x62,0x1c, + 0xb0,0x88,0xc6,0xbc,0x76,0xe4,0x72,0x66,0x1e,0x75,0x1e,0x8e,0x60,0xea,0xdf,0x7f, + 0xf0,0x21,0x6a,0xe3,0xa9,0x67,0x9f,0x27,0xd0,0x44,0xb9,0x79,0x8b,0x16,0x51,0xdf, + 0x60,0xee,0x10,0x5d,0x33,0x3,0x4e,0xfb,0x7d,0xe7,0xe3,0xdb,0x7b,0x66,0xd8,0xa, + 0x64,0xf9,0xc9,0xbb,0xcd,0x41,0x2,0x91,0x74,0x18,0x28,0x27,0x8c,0xe7,0xee,0x87, + 0x73,0x1d,0x48,0x81,0xba,0xc,0x5a,0x82,0x67,0x80,0x55,0x2e,0x2,0x61,0xc0,0x3f, + 0x17,0xbe,0xb4,0x8b,0x56,0x94,0x25,0x7a,0x57,0x1,0xb6,0x0,0xe3,0x32,0x9b,0xe0, + 0x97,0x5b,0x1e,0x0,0x2f,0xa7,0xd2,0x2a,0x1f,0x9c,0x4b,0x2d,0xa0,0x4a,0x0,0x94, + 0x7a,0x5e,0x66,0xb8,0x4,0xbc,0x1,0x70,0xb3,0x58,0x98,0x41,0x39,0x4,0xf6,0x10, + 0xc0,0xb9,0xd,0x27,0x7a,0x16,0xed,0x3a,0x86,0x1b,0x2c,0x2a,0xdc,0xe2,0xc0,0xe6, + 0xcb,0x7a,0x65,0x12,0xf8,0x57,0xaf,0xf7,0x5c,0xa1,0x16,0x2c,0x33,0x2e,0x82,0xb3, + 0xe7,0xce,0x55,0x87,0x6a,0xf,0x1b,0x3f,0x60,0x1b,0xb3,0xda,0xb,0x2b,0x3b,0x18, + 0x1,0xe3,0x41,0xdf,0x5a,0x1d,0xbf,0xf9,0xcf,0xff,0xea,0x27,0x14,0x6b,0x1a,0x75, + 0x10,0x47,0xba,0xbe,0xfe,0xd8,0x91,0xc6,0xc6,0xc6,0xdf,0x88,0x61,0xd9,0x70,0xb8, + 0x13,0x2b,0x1b,0x62,0x5c,0xec,0xbc,0x10,0xe6,0xc5,0xfa,0xf6,0x0,0x58,0xaf,0x18, + 0x52,0x80,0xca,0x9,0xf7,0xe4,0xfd,0x42,0x65,0x63,0x75,0x47,0x5a,0x36,0x7c,0x98, + 0xea,0xea,0xea,0x5b,0xd6,0xad,0x5b,0x73,0x65,0xd7,0xee,0x5d,0xaa,0xa1,0xa9,0xd1, + 0xf8,0xf5,0x76,0x75,0x7a,0x0,0x65,0x40,0x17,0xe7,0xdd,0x9,0x80,0x32,0xb,0x16, + 0xe5,0x24,0x48,0x3b,0x3,0x2c,0x6,0x69,0xa1,0xf3,0x75,0x80,0xad,0xdb,0xcb,0xf5, + 0x46,0xc0,0xdb,0xde,0x63,0x80,0xcb,0x9,0xb0,0xf,0x1,0x1b,0x2f,0x74,0x2e,0x5, + 0xdc,0x2,0xbc,0xb9,0x1f,0x3b,0x56,0x6,0x6a,0x69,0xc1,0xdd,0x2d,0x19,0xb0,0x0, + 0xe9,0xee,0x90,0xb9,0x7b,0x60,0xed,0x8b,0xd4,0xb9,0x9f,0xb4,0x7e,0x38,0x5b,0x8c, + 0x1e,0x1a,0xac,0x71,0x1f,0x98,0x7f,0xb8,0xb4,0x40,0x8f,0xa,0x71,0x73,0x8,0xbe, + 0x32,0xdd,0xa2,0x3f,0xdc,0x1b,0x36,0x6f,0xa6,0x17,0x25,0x6,0xec,0xbd,0x82,0x5, + 0xcb,0xe7,0x60,0x60,0x66,0xab,0x68,0x3a,0xb7,0xc1,0x27,0xa0,0x77,0xe5,0xf,0x3e, + 0x40,0xec,0x4d,0xd,0x30,0xd0,0x7b,0x72,0x20,0xe,0x9c,0xc3,0x3f,0x18,0xa0,0x81, + 0xf,0xfe,0x9b,0x3b,0x77,0x92,0x98,0x14,0x8c,0x92,0x75,0xbb,0x0,0x3c,0x5c,0x83, + 0xa9,0x2,0x60,0xc0,0xe0,0x0,0xa8,0x60,0x89,0xdf,0x7f,0xf0,0x61,0x12,0xd3,0xc2, + 0x95,0x7,0xc0,0x64,0xc4,0xc9,0x63,0x29,0xf8,0x81,0x19,0x43,0xe2,0xeb,0x48,0x3a, + 0x55,0xd,0xe0,0xd0,0x6d,0x22,0xbc,0x69,0x57,0x77,0x37,0x89,0xde,0xd1,0x7,0xda, + 0x80,0x35,0x36,0xc4,0xbf,0x10,0xf1,0xb2,0x8,0x1d,0x22,0x5a,0xb6,0x6,0x66,0x71, + 0x2f,0x74,0xd9,0x60,0xf3,0xc6,0xc0,0xca,0x88,0xc3,0xc1,0xc4,0xd1,0xe,0x9e,0x11, + 0x63,0x65,0x23,0x33,0x6,0x60,0x94,0x5b,0xb6,0xa2,0x98,0x2c,0xb5,0x91,0xf,0x3d, + 0x31,0xfb,0xee,0x2,0x3c,0x8d,0xe1,0xd4,0x5d,0xd6,0xc5,0xe9,0x6d,0x12,0x73,0xdf, + 0x64,0xf5,0xce,0x98,0x13,0x8c,0x1f,0x8b,0xe,0xb8,0x3f,0xc1,0xe0,0xa,0xe3,0x5, + 0x43,0x36,0x3a,0xe0,0xb1,0xf4,0x6c,0xf0,0xfb,0x5,0x90,0x62,0xc1,0x83,0x85,0xf, + 0x7c,0x8f,0xc9,0xd5,0x4a,0xdf,0xdf,0xbc,0x6d,0x1b,0x1,0x7b,0x63,0xf3,0x29,0x2, + 0x6f,0x30,0x5b,0xf8,0x2,0xc3,0x7a,0x9a,0x40,0x5a,0x5f,0x63,0x2e,0x30,0x1e,0x30, + 0x6d,0xb4,0x87,0x71,0xde,0x73,0xff,0x83,0x7a,0xae,0x2e,0xa5,0xec,0x3,0xf8,0x83, + 0xcb,0x6e,0x6f,0x72,0xd1,0x96,0x6d,0x4d,0xef,0xef,0x8,0x96,0x2a,0x1f,0x44,0x60, + 0xb,0xf7,0xeb,0x66,0xb1,0x36,0xa9,0x38,0xc2,0x68,0x74,0xe1,0xee,0x67,0xe2,0x1c, + 0xec,0x1d,0xdf,0xa2,0x95,0x55,0xab,0xc8,0x15,0xe7,0x55,0xd,0xbc,0x8,0x6e,0xc1, + 0xc6,0x50,0xc,0xb4,0x65,0x42,0xa4,0x2c,0x45,0xb4,0xc,0x6a,0x5c,0x2e,0xd4,0xe9, + 0x96,0x9,0x31,0x35,0x81,0xb0,0x6,0x6c,0x6,0x32,0x3e,0x97,0xe0,0x1d,0x8a,0xb7, + 0x19,0xb4,0x4b,0xb9,0x9f,0x80,0xb9,0x3a,0x66,0x2e,0x80,0x3e,0x56,0x5f,0x2,0x7f, + 0x59,0xc0,0xc4,0xb9,0x7d,0x2c,0x26,0x8c,0x3e,0x3b,0x61,0xe5,0xdc,0x2f,0xd7,0x97, + 0xc0,0x2f,0x2d,0xba,0xc1,0x8a,0x17,0x2d,0x2f,0x55,0x2f,0xbd,0x32,0x45,0xcd,0x5b, + 0xb0,0x80,0x80,0x98,0xd,0xb6,0xe4,0xae,0x62,0xf9,0x20,0xf2,0x5b,0x4c,0xed,0x80, + 0xc5,0xd0,0xa7,0x3f,0x32,0x2e,0x4b,0xb0,0x38,0x3f,0x7f,0xf1,0x3c,0xdc,0x95,0xae, + 0x36,0x34,0x34,0x7c,0xfb,0x46,0xf1,0xe7,0x1f,0x2b,0xa5,0x0,0x38,0x4c,0x12,0x40, + 0x63,0xf7,0xb3,0xca,0x7f,0x99,0xb2,0x3c,0xb8,0x5d,0xbb,0x76,0x4e,0x5c,0xb7,0x7e, + 0xed,0xdf,0x1e,0xa8,0x3e,0x40,0x1b,0x27,0x18,0x91,0x73,0xb7,0xcf,0x76,0xed,0x91, + 0x41,0x30,0x4c,0xdd,0x22,0x3f,0x64,0xb2,0xe,0xb4,0x9,0xf4,0x12,0xf0,0xce,0x9, + 0x40,0xce,0xc9,0xb2,0xdc,0x6e,0x46,0x3b,0xb2,0x3f,0xaf,0xdf,0x88,0x25,0x75,0xb2, + 0x40,0xe8,0xc9,0x70,0x67,0xf2,0xc7,0x91,0x66,0xc3,0x69,0xb0,0xef,0x16,0xd6,0xd5, + 0xfc,0x3c,0xdd,0x11,0xc6,0x1c,0x2e,0x14,0x50,0x36,0xc5,0xba,0xa3,0x80,0x9c,0x94, + 0xd9,0xb9,0x67,0xb7,0x5a,0xa5,0x59,0x16,0xc4,0x90,0x0,0x5a,0x0,0x31,0x33,0x61, + 0x6,0x64,0x1c,0xc1,0x92,0xe1,0x3a,0x43,0x0,0x9c,0xef,0x75,0x11,0xa5,0x20,0xc1, + 0x0,0x90,0xbb,0x5d,0x99,0x28,0xd4,0x67,0x4f,0x22,0xfe,0xe,0x75,0xd3,0xf4,0xe1, + 0xcd,0x93,0x28,0x17,0x20,0x6,0x63,0x2a,0x66,0x66,0xd0,0x5d,0x82,0x85,0x71,0x2c, + 0x63,0x1c,0xa7,0x4c,0x9b,0x46,0x60,0x3,0x30,0x61,0x0,0x82,0x6e,0x97,0xd,0x83, + 0xd6,0x6c,0xd8,0x40,0x3e,0xb5,0xec,0x92,0x73,0xcf,0x3,0xf,0xd2,0xb3,0x3c,0xf8, + 0xe8,0xe3,0x4,0x44,0x0,0x19,0x80,0x7,0xc,0xb2,0xd8,0xe5,0x6,0x65,0xa6,0x4e, + 0x47,0x50,0x89,0xd7,0x9,0xe0,0x61,0x90,0xc4,0xae,0x36,0x10,0x61,0xbf,0xf8,0xca, + 0xab,0x4,0xda,0x86,0x21,0x8e,0xa6,0x20,0x1b,0x86,0x31,0xf,0x39,0x71,0x25,0xc4, + 0xb5,0x0,0x31,0x88,0xac,0x99,0x6d,0x2,0x60,0xa1,0x67,0x85,0xd8,0x16,0x20,0x6, + 0x76,0xc,0xdd,0xee,0xa4,0x29,0x53,0x8,0x80,0xd1,0x2f,0xf4,0xc1,0x60,0xe2,0x68, + 0x1b,0xf5,0x30,0x66,0xd4,0x85,0x7f,0x33,0x98,0x2f,0xca,0x21,0x18,0x8,0x16,0x7, + 0x98,0x23,0xcc,0x9,0x9e,0x9f,0x58,0x7b,0x87,0x19,0x3,0x44,0xf1,0x68,0x1f,0xfd, + 0x1,0xb4,0x31,0x3e,0x0,0x26,0xf4,0xe3,0x25,0x15,0x95,0x34,0x66,0xb4,0xb,0x10, + 0xc6,0x11,0x96,0xd5,0x30,0x2c,0x63,0xa3,0xad,0x56,0xd,0x38,0x60,0xfc,0xec,0x5a, + 0x4,0x36,0xc,0xeb,0xe9,0xed,0xbb,0x76,0xd3,0x9c,0x21,0x1f,0xa2,0xf2,0x3d,0x7, + 0xe,0xb8,0xff,0xd,0xf4,0xc8,0x58,0x10,0xc1,0x2d,0x9,0x56,0xe2,0x64,0x59,0x3e, + 0xe1,0x19,0xfa,0x8d,0xf5,0x46,0xac,0xe3,0x7b,0x23,0x3e,0xea,0xbd,0x91,0xf0,0xab, + 0x59,0x21,0x64,0x7b,0x23,0x1,0x6b,0xa2,0x16,0xf7,0x19,0x61,0x62,0xa3,0x21,0x64, + 0x5,0x20,0xc3,0x72,0x17,0xbf,0xdb,0x4d,0x5b,0x36,0x9b,0x10,0x8f,0x1a,0x78,0x97, + 0x94,0x94,0x3b,0xb6,0x8b,0xe0,0x15,0x21,0x0,0x96,0x89,0x48,0x54,0xe5,0x82,0x19, + 0x3a,0x46,0xbc,0x7a,0x9d,0x13,0xe3,0x2,0x5c,0xb9,0xc,0x1,0xad,0x60,0x9b,0xa5, + 0x2,0xd4,0xcb,0xc2,0xb6,0xb8,0x9e,0xd4,0xc1,0x6,0x22,0x61,0xf,0x4,0x19,0xf8, + 0x25,0x3,0x17,0xcc,0xbb,0xb4,0x6a,0x6d,0xc2,0xc4,0x45,0x5e,0x79,0xcc,0x20,0x2c, + 0x2,0xb8,0xe5,0x11,0xc0,0x8f,0x2d,0x3e,0xa4,0x9f,0x32,0x44,0xf6,0xf8,0xbd,0x41, + 0x34,0x8d,0xef,0x3d,0x1b,0x6a,0x85,0x9b,0xb4,0x78,0x2e,0x60,0xa1,0x1a,0x41,0x27, + 0x44,0xd2,0xfa,0xeb,0xff,0xf4,0x37,0xb4,0x2f,0x31,0xbe,0x33,0x4d,0x27,0x9b,0xfe, + 0x56,0xb3,0xe1,0x17,0x4e,0x9e,0x3c,0x39,0x2c,0x3e,0x8d,0x4,0xbf,0xc2,0x32,0x85, + 0xea,0xc,0x57,0xd6,0xfd,0x61,0x70,0x48,0xc8,0xe4,0x73,0xbe,0x96,0x29,0xcc,0xf, + 0xeb,0xc4,0xf2,0xe5,0x31,0xab,0x1e,0x5f,0x63,0x80,0x8d,0x8d,0x8d,0x5f,0xdb,0xba, + 0x75,0xcb,0x92,0xf5,0x1b,0xd6,0xff,0xf7,0xda,0xba,0x5a,0xcd,0x42,0x5a,0xc8,0xcd, + 0x85,0x41,0xce,0x4b,0xbd,0x3e,0xd8,0xc5,0xc0,0x58,0x82,0x22,0x74,0xc6,0x48,0x2e, + 0xbf,0x37,0x2,0xcc,0x11,0x80,0xf,0x99,0xae,0xeb,0xa7,0x37,0x61,0xbe,0x3e,0x9b, + 0xee,0xf1,0x19,0xae,0x27,0x22,0xcf,0x16,0x9b,0x7b,0xa2,0x73,0xd1,0x96,0xf,0x98, + 0x3e,0xf0,0x7b,0x62,0xee,0xc8,0x42,0x23,0xfa,0x8c,0x7d,0xbe,0x28,0xdd,0x2c,0x44, + 0x7a,0xa2,0xe5,0xc2,0x7c,0x32,0xc2,0xb2,0x7a,0x2f,0xd4,0x85,0x2b,0xca,0x3d,0xf7, + 0x3f,0xa0,0x6e,0x87,0xfe,0x70,0xdc,0x1d,0x16,0x84,0xef,0x20,0x9d,0xf0,0x2d,0xfa, + 0xe3,0xbd,0x66,0xfd,0x7a,0x72,0x3f,0xc0,0x47,0x13,0x81,0x2b,0x0,0x1a,0xf,0x3d, + 0xfa,0x98,0x7a,0x48,0x83,0x17,0xd8,0x3,0x74,0x83,0x6d,0xd6,0x58,0x2b,0x11,0xd7, + 0xb,0x5d,0xbe,0x1d,0x2b,0x87,0xf3,0x4,0x90,0x41,0x67,0x89,0x68,0x4e,0x12,0x50, + 0x87,0xae,0x98,0x10,0x89,0xb9,0x9e,0x1e,0x12,0x29,0xe3,0xde,0x7d,0xf,0x3d,0x42, + 0xa2,0x66,0x88,0x5b,0xa1,0xb,0xbd,0x69,0x94,0x61,0xa6,0x10,0x51,0x13,0x23,0xb4, + 0xc,0x93,0x40,0xd7,0x6,0x8a,0x60,0x7d,0x2a,0x5c,0x97,0xc0,0xae,0x59,0xec,0xcb, + 0x62,0xe5,0xbf,0xfc,0xde,0xcd,0x64,0x61,0x6d,0x8c,0xa2,0xee,0x21,0x51,0x37,0xea, + 0xb3,0x7e,0x16,0xe7,0x0,0x40,0xe8,0x42,0x59,0x5f,0x9c,0x30,0xe0,0xab,0xd6,0x40, + 0x69,0xc,0x1,0x1d,0x98,0x33,0xc0,0xe,0xcc,0x1c,0x9,0x75,0x9f,0x7c,0xe6,0x39, + 0xd2,0x9b,0x42,0xc7,0x6e,0x8c,0x9f,0x5e,0xa0,0xbe,0x0,0x82,0x28,0xb,0x50,0x1d, + 0x6b,0xfd,0x8c,0xef,0xd2,0x60,0xcd,0x8c,0xd5,0xf8,0x3a,0x5f,0x23,0xd0,0x87,0xa8, + 0x9d,0xc6,0xa1,0xe7,0x88,0xe6,0x44,0xcf,0xeb,0x23,0x4f,0x3c,0x65,0xc6,0x68,0xdd, + 0x85,0x10,0x10,0xe3,0xce,0x7b,0xef,0x23,0xf,0x2,0x18,0x79,0xe1,0xd9,0x1,0xf6, + 0x4f,0xdb,0x85,0x0,0x16,0x15,0xb8,0x6,0xd3,0x86,0x41,0x1b,0x16,0xbf,0x68,0xcf, + 0x89,0xbb,0xcf,0x9f,0xa3,0xfe,0x30,0xaf,0x6c,0x4,0x6,0xdd,0xee,0x52,0xcd,0xca, + 0x99,0xc9,0xc3,0x3d,0xe9,0xda,0x3b,0xec,0xfe,0x75,0x37,0x95,0xc3,0xdc,0x61,0x1e, + 0xbc,0x98,0xeb,0x22,0xe8,0x4c,0x6f,0xc4,0xf,0x3d,0x2b,0x90,0x4d,0x6f,0x96,0x4f, + 0x7b,0x7f,0x9f,0x67,0x98,0x18,0x3,0xea,0x2c,0x50,0xe,0x1,0x98,0x2d,0xfe,0x71, + 0x3c,0x78,0xa8,0x46,0x4d,0x83,0x2b,0xd1,0xe4,0x57,0x9,0x30,0x18,0x60,0x8a,0x35, + 0xf0,0x7a,0x40,0x23,0xc4,0xcd,0x4,0x5e,0x0,0x60,0x9d,0x18,0x88,0xa5,0x38,0xda, + 0x5d,0xb,0x10,0x74,0xe2,0x68,0x5b,0x47,0xe6,0x53,0x94,0x2a,0x9b,0x57,0xb2,0x6a, + 0x8d,0x3,0x73,0x6,0xc1,0x52,0x6,0xef,0x40,0xac,0x5d,0x2e,0x74,0xc7,0xc,0xf8, + 0x61,0x7f,0x12,0x38,0x4b,0xc3,0xb1,0x89,0xe7,0xe3,0xfe,0x25,0x48,0x87,0xe3,0xe, + 0x99,0xb0,0xa7,0xd3,0xe6,0x5,0x85,0xe8,0x93,0xdd,0xa0,0x66,0x2d,0x58,0x4c,0xc6, + 0x5a,0x90,0x2e,0x80,0x74,0x51,0x10,0x9b,0xa1,0x81,0xe8,0x7e,0xe4,0xbd,0xb1,0xb8, + 0xf1,0x6c,0xa0,0xf5,0x57,0x26,0xae,0x34,0xbe,0x29,0x88,0x29,0x7d,0xac,0xfe,0xe8, + 0x8a,0xa6,0xa6,0xa6,0xaf,0x86,0xb8,0x93,0x85,0x73,0x59,0xf8,0x96,0x85,0x75,0x23, + 0xc1,0xc3,0xb0,0x4c,0xa,0x80,0x65,0xd2,0x83,0x8d,0xe6,0xdf,0x68,0xca,0x6a,0x47, + 0xe6,0xe3,0x1c,0xe0,0x5b,0x5f,0x5f,0xff,0x2b,0xeb,0xd6,0xad,0xdd,0x89,0x38,0xce, + 0x47,0x8e,0x1d,0x55,0x2d,0x67,0xcf,0xd0,0x2a,0x26,0xc6,0x6e,0xb1,0xa9,0x42,0x97, + 0x0,0xd2,0x82,0xc,0xb8,0xd7,0x24,0x94,0x27,0x0,0xe,0x0,0x50,0x2,0x77,0x9a, + 0x5d,0x77,0xfb,0x80,0x50,0x0,0xac,0xbb,0x23,0xed,0xc6,0x44,0xe0,0x52,0x2c,0x1d, + 0xf6,0x99,0x99,0xfa,0x7c,0x40,0xe5,0x67,0xee,0x9,0x0,0x34,0x57,0xa0,0x8d,0xb0, + 0x8f,0xdc,0xd,0xf4,0xeb,0xe9,0xbd,0x5,0x88,0xe3,0xe3,0xb4,0x7d,0xd7,0x4e,0x63, + 0xa1,0xb,0xbd,0x26,0x59,0x44,0x1b,0x10,0x86,0x8,0xf4,0x68,0x7d,0x3d,0xcd,0xfb, + 0xfc,0x45,0x8b,0x8,0xa4,0x6f,0xd5,0x1f,0x77,0x30,0x66,0x18,0x9,0x41,0x44,0x7d, + 0xd3,0x6d,0xb7,0x93,0x78,0x17,0x86,0x5d,0xd2,0x62,0x3a,0x34,0x8c,0x3,0x3,0x6, + 0x90,0x1,0x84,0x1,0x6c,0xf8,0xb8,0xb3,0xb1,0x13,0x58,0x15,0xc4,0x9a,0xf8,0xb0, + 0xc3,0x70,0xe8,0x4e,0x8a,0xd4,0x64,0x5d,0x83,0x34,0x0,0xe2,0x45,0x5,0x28,0x32, + 0x5b,0x3d,0xad,0x7f,0x57,0xc,0x3a,0x60,0x94,0x4f,0x3e,0xfb,0x1c,0x81,0xc,0x5c, + 0xa8,0xa0,0x97,0x42,0xc0,0xa,0xf4,0x1,0x63,0x28,0xc3,0x1a,0xc7,0x13,0x80,0x21, + 0x98,0x4,0xca,0xec,0xd8,0xbd,0x5b,0x6d,0xdb,0xb9,0xd3,0x1,0xd,0x9e,0x1d,0xa2, + 0x6b,0x16,0xd,0x83,0x29,0x9a,0xd0,0x99,0x83,0xd6,0x1f,0x95,0xf7,0x42,0xee,0x27, + 0x57,0x23,0xd2,0x97,0x6a,0x86,0x9,0x96,0x2d,0xd,0xab,0xd0,0xd7,0xd4,0x19,0x33, + 0xc8,0xa8,0xc,0x20,0x8b,0x67,0x83,0x38,0x19,0xe2,0x5f,0x73,0x1f,0x6,0x5b,0x73, + 0x9d,0xd8,0x19,0x63,0x67,0x31,0xfa,0x2e,0x3d,0x1f,0x60,0xfa,0x28,0xcb,0x86,0x54, + 0x18,0x7,0x40,0x12,0xfe,0xce,0xd0,0xbd,0x2,0xb4,0xf1,0xfc,0x78,0xe,0x3c,0x2f, + 0xdc,0x96,0xc0,0x4e,0xc1,0xdc,0x39,0x38,0x9,0xf2,0x58,0xd4,0xcd,0x7d,0xc2,0x15, + 0x9,0xf3,0xb,0x40,0xc6,0x35,0xd8,0xb8,0x61,0x84,0x57,0xc8,0xa0,0x8b,0x59,0x31, + 0xfc,0x9b,0x8d,0xa1,0x9b,0xd1,0xf5,0x62,0xe1,0x80,0x31,0x41,0xe4,0xcd,0x6e,0x4a, + 0x90,0x88,0x40,0x12,0xe0,0xc5,0x5c,0xef,0xeb,0xd,0x98,0x70,0x60,0x8c,0x27,0xad, + 0xfa,0xf3,0x81,0x45,0x7d,0x46,0x70,0x99,0xac,0x48,0x74,0x51,0x5f,0x74,0xc9,0x76, + 0xa5,0xe8,0x99,0x76,0x48,0x1a,0x24,0x57,0x47,0x4,0x98,0x80,0xf1,0xd0,0xac,0x5, + 0x4b,0x3c,0xe6,0xc9,0x80,0x17,0x5,0x56,0x1,0x54,0xf2,0x5e,0xb9,0x0,0x4d,0x59, + 0x97,0x99,0x67,0xa8,0x2f,0xe6,0x36,0x4a,0x18,0x58,0x3,0x11,0x76,0x8,0xa4,0x65, + 0xa2,0xd,0x16,0x5b,0xc7,0x16,0x7,0x21,0xb0,0xb3,0xbe,0xda,0xcb,0x93,0xb,0x9, + 0xa9,0x9f,0xe,0xce,0x4b,0xc3,0xc5,0x83,0x1c,0xa3,0x3d,0xb2,0xee,0xbb,0x34,0x63, + 0xc,0xc8,0x87,0x58,0x1a,0x63,0x9e,0x32,0x6d,0x26,0x6d,0x22,0xb1,0x77,0xdf,0x5e, + 0xfa,0x2d,0xc8,0x78,0xec,0x7d,0x91,0x5d,0xdd,0x64,0x3c,0x7a,0x8a,0x51,0xa0,0x9, + 0x2,0x82,0x77,0x60,0xcb,0x43,0x94,0xc5,0x6,0x16,0xc7,0x8e,0x1d,0xdd,0xd1,0xd0, + 0xd0,0xf0,0x2b,0x31,0x10,0xfe,0x59,0x60,0xda,0x8d,0x26,0xf7,0xc7,0xd,0x86,0xa0, + 0x28,0xf3,0x63,0x65,0xc2,0xb2,0xb1,0x3a,0xb1,0xba,0x31,0xf0,0xad,0xab,0xab,0xfd, + 0x37,0x55,0x55,0xab,0xce,0x6c,0x7d,0x73,0x2b,0xc5,0x44,0x85,0xb1,0x15,0xc4,0x3d, + 0xcc,0x5a,0x1,0xb8,0x1e,0xb8,0xf6,0xf5,0x44,0x18,0xae,0x3d,0x76,0xe7,0x22,0x8c, + 0xb5,0xdb,0x89,0x98,0x73,0x21,0xf8,0x86,0xec,0x39,0x0,0xf4,0x2e,0xef,0x3c,0xe7, + 0x1,0x6b,0x16,0xf8,0xa6,0xc4,0xd4,0x11,0x50,0xcf,0x5,0x22,0xf5,0x10,0xb0,0xe3, + 0xb,0x82,0x74,0xfb,0xde,0xdc,0xf4,0x76,0x7,0xfa,0x6f,0x7f,0xbe,0x42,0xa6,0x9e, + 0xf5,0x2c,0xac,0x4b,0x4f,0xfc,0x70,0x13,0xa3,0x8,0xc9,0x46,0xd8,0x2f,0xf8,0x35, + 0xcd,0x6c,0x6f,0xd3,0x2c,0x88,0x59,0xf0,0xf7,0x6e,0xbd,0x5d,0xbd,0xa6,0xc1,0x4, + 0xf7,0x96,0x14,0x2d,0x27,0xe0,0xbd,0x1d,0x1f,0x76,0x88,0x51,0xa1,0xff,0xb4,0xe5, + 0x0,0xca,0x37,0x6b,0x36,0x86,0x55,0x2f,0x16,0x5b,0xbd,0xc2,0x28,0x4c,0x2,0xbf, + 0x61,0xbf,0x43,0xf4,0xd1,0xc7,0xaa,0x18,0xfa,0x4b,0x7c,0xfc,0x1,0x52,0x48,0x10, + 0x7f,0x82,0xe9,0xc2,0x8,0xb,0x80,0x9,0x31,0x32,0x2c,0x79,0x1,0xa4,0x70,0x87, + 0x2,0xdb,0x4,0x0,0x0,0xbc,0x20,0xe2,0x5,0x0,0x2,0xa4,0x0,0xde,0x6d,0xd4, + 0x6f,0x12,0x16,0x73,0xc8,0x6e,0x38,0x0,0xa0,0x82,0xe,0x14,0x16,0xd5,0xd0,0xc3, + 0x82,0xcd,0xf6,0xf4,0xf5,0xd1,0xfd,0x45,0xcb,0x96,0x59,0xb1,0xed,0x38,0x12,0x89, + 0x83,0x95,0xcf,0x26,0xf7,0x22,0xa3,0x67,0x5,0x10,0x42,0x24,0x6c,0x16,0xd,0x26, + 0x88,0x8,0x98,0x2d,0x80,0x1a,0xe3,0x85,0xf8,0xd7,0x18,0x4b,0x19,0xdf,0x5b,0x6, + 0x4d,0x84,0xa0,0xc4,0xe2,0x82,0xfd,0x93,0x2b,0x57,0xaf,0x26,0x3d,0x3a,0x5b,0x10, + 0xe3,0xfa,0x31,0x2b,0xea,0x36,0xfa,0x60,0x3,0xc2,0x10,0xb5,0x93,0xaf,0xb3,0xb0, + 0xcc,0x86,0xbf,0x31,0x5c,0x80,0x0,0xce,0xa8,0xcb,0x16,0xd7,0x58,0x8,0x50,0x10, + 0xb,0x3d,0x26,0x18,0x6e,0xc1,0x7a,0x19,0xed,0xbf,0x3a,0x6d,0x3a,0xb9,0x6a,0x31, + 0xa0,0xb2,0x8b,0x15,0xe6,0xd6,0x84,0xa4,0x34,0xc6,0x5f,0x33,0xf5,0x22,0x80,0x62, + 0x57,0xe7,0xba,0x5c,0x70,0xd,0xb4,0x1,0xa3,0xad,0xfb,0xad,0xa1,0x1b,0x45,0x11, + 0xd3,0xf7,0xb1,0x0,0x40,0xfd,0x9b,0xad,0xf8,0x1b,0xfa,0x66,0xd4,0x4d,0x6f,0x4e, + 0x92,0x8e,0xc3,0xce,0xd7,0xb1,0x68,0x6e,0x3d,0x31,0xa0,0xed,0xf,0x36,0x35,0xc9, + 0x88,0xc8,0x26,0x23,0xba,0x85,0xa0,0xcd,0x81,0x67,0xfa,0x49,0x72,0xd0,0x4d,0xa1, + 0x22,0x11,0xe1,0x9,0x6e,0x34,0x2b,0x2a,0xaa,0xc,0x80,0x48,0xe0,0x5,0x4b,0xd5, + 0xc,0x38,0x11,0x37,0xaf,0x21,0xa0,0xe1,0xbc,0x12,0xc1,0x62,0xb9,0x7c,0x69,0x8, + 0xac,0x2b,0xd7,0x38,0x66,0x59,0x2a,0xf2,0x0,0xc8,0x8e,0x71,0x32,0xb0,0xba,0x36, + 0xd6,0x7a,0x8c,0xb7,0x5c,0x80,0x58,0x69,0xb0,0x8,0x90,0xd7,0x65,0x91,0x45,0x42, + 0xb8,0x80,0xf0,0xda,0x14,0xe0,0x5a,0x1a,0x2c,0x26,0x4a,0x53,0xf7,0xd6,0xfa,0xed, + 0x4b,0x26,0x1e,0x88,0xd0,0xa5,0x18,0xde,0x13,0xd5,0xdb,0x79,0x1,0x1b,0x46,0xd8, + 0x4b,0x18,0x45,0x2e,0x59,0xba,0x94,0x36,0xa6,0xe0,0x8d,0x3e,0xa4,0xdd,0x40,0x54, + 0xc7,0x6f,0x17,0xf2,0xf8,0x1f,0xc2,0x30,0xeb,0xc7,0x3f,0xfd,0x9c,0x16,0x52,0xad, + 0xe7,0x5a,0x61,0x9c,0x75,0xf2,0xf8,0xf1,0xfa,0xff,0x3d,0xc4,0xa3,0x42,0x58,0x17, + 0xe2,0x58,0x16,0x20,0xc7,0xca,0x65,0x61,0x27,0xce,0x3d,0x0,0x46,0x6a,0x6c,0x6c, + 0xf4,0x12,0xe7,0x85,0x60,0x1a,0x96,0xbf,0x91,0xfc,0x18,0x30,0xd7,0xd6,0xd6,0xfe, + 0xa6,0x6,0xdf,0xce,0x6d,0x3b,0xb6,0x51,0x2c,0xe7,0xb3,0x7a,0xa2,0x0,0xbe,0xc, + 0x78,0x5d,0x16,0x4,0xd,0xeb,0xb5,0x60,0xdc,0xdb,0xed,0x80,0x47,0x2,0x10,0x3, + 0xb1,0x97,0x2f,0x74,0xbc,0x32,0xcf,0xdd,0xd3,0xff,0x2c,0x6,0x56,0x77,0xd4,0xe5, + 0x62,0x3a,0x64,0xf,0x9c,0x23,0x22,0xf0,0x2e,0x71,0xaf,0x2b,0x2,0xda,0x6e,0x71, + 0x10,0x13,0x95,0xf7,0xa6,0xc1,0xdf,0x63,0xbd,0xe2,0x9a,0x25,0x0,0x5d,0x19,0x20, + 0xee,0xeb,0xb6,0x7d,0x29,0x80,0x34,0x1a,0xcb,0x45,0xf4,0xea,0x48,0xc4,0x46,0xf5, + 0x47,0xa,0xab,0xff,0xba,0x63,0x47,0x49,0x67,0xa,0x66,0xb8,0xaf,0xfa,0x80,0xaa, + 0xd7,0x1f,0x7b,0x16,0x1b,0xe3,0x47,0x8f,0xd5,0xe9,0x8e,0x5d,0xbb,0x88,0xd5,0x1a, + 0x66,0x3b,0x86,0x40,0xe2,0xe4,0xe9,0x66,0x52,0x21,0xdc,0x79,0xef,0xf7,0x29,0x9f, + 0xc5,0xd3,0xc6,0x67,0xf8,0xe,0xe7,0xb2,0x84,0x73,0x88,0x72,0xe1,0xc7,0xca,0xa2, + 0xe8,0x50,0x74,0x8e,0x97,0xa,0x46,0x4d,0x10,0xb,0xc3,0x25,0x7,0x6c,0x17,0xa2, + 0x64,0x30,0x2d,0xd6,0xb9,0x82,0x71,0x72,0x4,0x2c,0xa4,0xf5,0x1a,0xb8,0xe0,0x5a, + 0x4,0xf0,0xe0,0x60,0x15,0x60,0xbe,0x10,0x89,0x9a,0x7a,0xc6,0x25,0x87,0x23,0x6c, + 0x99,0x1d,0x85,0x8c,0x98,0x1b,0x56,0xd3,0x0,0x6d,0x6,0x69,0xf8,0x1a,0x27,0x9b, + 0xc5,0xf,0x39,0xfd,0x28,0xda,0x1,0xeb,0x86,0xa5,0x2f,0x18,0x2d,0x1,0x9d,0xce, + 0xc7,0x42,0x0,0xb,0x85,0x5e,0xab,0xbf,0x2,0x18,0xd7,0xda,0x8,0x51,0x18,0x1b, + 0x7c,0x61,0x11,0x8,0xc4,0xe8,0x73,0xef,0x20,0x40,0x65,0xa3,0x31,0x0,0x16,0x16, + 0x10,0x14,0xc5,0x4b,0x97,0x99,0xbb,0x70,0xa1,0xd,0x97,0x79,0x37,0x19,0x71,0x3d, + 0x6d,0xdd,0x98,0x18,0xb8,0xc1,0x4c,0xcf,0x9e,0x3f,0x47,0xc0,0x6,0xd6,0xce,0x16, + 0xd0,0xd0,0xc7,0x2,0x94,0x21,0x9e,0x66,0x0,0x5e,0xbf,0x69,0xb3,0xb,0x8d,0x89, + 0x85,0xc4,0x7e,0x6b,0xe9,0x8c,0x45,0x1,0x36,0x65,0x80,0x8e,0x9a,0xd,0xdc,0xcc, + 0x42,0x66,0x34,0x5,0xda,0x60,0x60,0x47,0x3b,0xd8,0x48,0x2,0xcc,0x16,0xc,0x17, + 0xd1,0xc8,0x50,0x1f,0xcc,0x1e,0x63,0x33,0xae,0x4e,0x63,0x69,0x5e,0x39,0x54,0x26, + 0xb9,0x29,0xd9,0xb9,0x82,0x5,0xb4,0x31,0x0,0xb,0x5c,0xec,0x32,0xa2,0xb2,0xc9, + 0xcd,0x52,0x64,0x0,0x1a,0xe7,0xc2,0x26,0xed,0x4,0xfa,0x93,0xd8,0xe5,0xb1,0x88, + 0x72,0x61,0x7c,0xf2,0x54,0x8,0x56,0xbb,0xbd,0x27,0xc6,0xd7,0xdc,0xd2,0xac,0x16, + 0x2c,0x5a,0x44,0xf1,0x99,0xd9,0xa5,0x8,0xc0,0x50,0x4c,0xbb,0xc,0x59,0x80,0x65, + 0xf0,0xb2,0xd7,0x94,0x2c,0x38,0x86,0x4c,0x97,0x81,0xb8,0x24,0xc6,0x9a,0x57,0xaf, + 0xf3,0xc4,0xbb,0x92,0x1d,0xa7,0xea,0xc9,0x72,0x41,0x5b,0x1e,0x80,0xc7,0x40,0x55, + 0x80,0x62,0xa9,0x0,0x3b,0x9,0xa2,0x72,0x7c,0x12,0x58,0x43,0x30,0x97,0xe2,0xe6, + 0x52,0xb1,0x40,0x90,0x79,0x12,0x94,0xa5,0x18,0x3e,0x4,0x73,0x6a,0x7f,0x95,0xf, + 0xde,0x58,0xc8,0xb0,0x3f,0xf1,0x8c,0x39,0xf3,0xd5,0xcb,0xfa,0x7d,0xdb,0xb1,0x6b, + 0x87,0x8b,0x94,0xe5,0xf6,0x43,0xf,0x75,0xfd,0xfd,0x89,0x14,0x83,0xc9,0xc1,0x47, + 0x9f,0x7c,0xac,0x7e,0xfa,0xd7,0x7f,0x45,0xdb,0x2a,0x5e,0xb8,0x78,0x1,0x4c,0xb8, + 0x5b,0x3,0xf1,0xef,0x7e,0x11,0x1c,0x93,0xd7,0x21,0x56,0x8e,0xe4,0xbe,0x4c,0xee, + 0x2f,0x4,0xde,0x91,0x24,0x4d,0xe5,0xbf,0x50,0x3d,0x99,0x0,0xbe,0x87,0xe,0x1d, + 0xfa,0xdd,0x35,0x6b,0xaa,0xba,0x76,0xec,0xdc,0x41,0xe0,0xb,0xeb,0x42,0x2,0x17, + 0x9b,0x3a,0x5,0xd0,0x74,0x39,0x40,0xce,0x79,0x62,0x68,0x7,0xc8,0x2,0x74,0x19, + 0xa8,0xbd,0x14,0x11,0x61,0x4b,0x90,0x4c,0xea,0x76,0xdb,0xbe,0xbb,0x52,0x75,0x93, + 0xeb,0x9c,0x3,0x69,0xbe,0xe,0x41,0x3f,0x26,0x16,0xcf,0x9,0xa6,0x1e,0xb2,0xee, + 0x70,0x91,0x20,0x1,0x5f,0x3e,0xa7,0x14,0x63,0x4b,0x90,0x75,0xb,0x89,0xde,0xb4, + 0x11,0x9a,0xf4,0x91,0x4e,0x16,0x1e,0x69,0xa6,0xcd,0x1f,0x25,0xb0,0xb0,0x57,0xf5, + 0x47,0x14,0xae,0x44,0x60,0xac,0x10,0x17,0xdf,0x4c,0x16,0xb0,0x63,0x8,0x38,0x11, + 0x33,0x79,0x79,0x49,0x9,0x2d,0x96,0xf0,0x42,0x20,0x84,0x23,0xd8,0xec,0x58,0xd, + 0xa,0x60,0xc3,0xa7,0x5a,0x4e,0x93,0x35,0x63,0xa5,0x66,0x61,0xdf,0xb9,0xf9,0x56, + 0xb,0xc0,0x6,0x74,0x19,0x7c,0x39,0xf,0xd7,0x68,0x1b,0x1f,0x6a,0x7c,0x0,0x43, + 0x43,0x31,0x7c,0x20,0xe1,0x83,0xa,0xfd,0xe7,0x77,0x6e,0xbd,0x8d,0x2c,0x6a,0xf1, + 0xf2,0x81,0x75,0x82,0x69,0x71,0xd4,0x29,0x5c,0x43,0x64,0xb,0xf6,0x37,0xc6,0x1a, + 0x60,0x81,0x81,0x1,0xb4,0xd9,0xb8,0x6a,0x45,0x69,0x99,0xda,0xb9,0x67,0xaf,0xd5, + 0x5b,0x8e,0x23,0xd0,0x19,0xe4,0x2d,0x5,0x19,0x80,0x7,0x4d,0x94,0x2f,0x3,0xda, + 0xa3,0x69,0x5c,0xfd,0x2e,0x6e,0x71,0x3f,0x19,0x2e,0xb1,0xb,0x13,0x98,0x34,0xae, + 0x1,0x68,0x88,0x19,0x6d,0xf4,0xbb,0x77,0x91,0x18,0x19,0x75,0xd0,0x1e,0x8b,0xcd, + 0xb1,0x20,0x30,0x81,0x40,0xc6,0xa8,0x2d,0xdb,0xb6,0xa9,0x23,0xf5,0xf5,0xce,0x18, + 0xcb,0x30,0xd9,0xbb,0x88,0x69,0xc3,0x4a,0x1b,0xe5,0x10,0xd5,0xb,0xae,0x50,0x13, + 0x29,0xf4,0xa6,0x89,0xf5,0xc,0x2b,0x70,0x8e,0xfa,0xc5,0x22,0x62,0xcc,0x7,0x8f, + 0xed,0x79,0x1a,0x83,0x61,0xa4,0x58,0x0,0xa1,0x5f,0xe8,0x5d,0x29,0x60,0x8a,0xee, + 0x3,0x8b,0x16,0x7e,0x5e,0x48,0x13,0xe0,0xf2,0xc4,0x73,0xf1,0xe6,0x8e,0x9d,0x6e, + 0xc3,0x6,0x3c,0x3,0x8f,0xb,0xb,0x18,0x8e,0x94,0x5,0xf5,0x1,0x76,0x87,0x82, + 0xf5,0xb4,0x71,0xb9,0x32,0x6,0x58,0x58,0x7c,0xc0,0x95,0x8a,0x5d,0xa7,0xe0,0xa6, + 0x4,0xa0,0x47,0xb0,0xe,0x18,0x99,0x21,0x1f,0xe3,0xc7,0xc2,0x6,0xf3,0xd2,0x13, + 0xb8,0x9b,0x49,0xcf,0x81,0xa8,0x2b,0x9c,0x70,0xad,0x63,0x29,0x49,0x56,0xe8,0x58, + 0x19,0xd5,0x2d,0xb4,0xf2,0xef,0xcd,0xa,0x38,0x63,0x2d,0xa1,0xd1,0xde,0xee,0xbd, + 0x7b,0xd4,0xcb,0x9a,0xf5,0xbe,0x36,0x73,0x36,0xe9,0x77,0x9,0x20,0x59,0xef,0x2a, + 0x80,0x96,0x41,0xd8,0x5c,0xaf,0x71,0x60,0xe2,0x40,0x93,0x1,0xd9,0x1,0xdd,0x5a, + 0x7,0x36,0x25,0x1,0x8b,0x2e,0xb6,0xed,0x4a,0x60,0xcc,0x12,0x67,0xb3,0xb1,0x57, + 0x89,0x58,0x0,0x78,0xe2,0xee,0x80,0xd5,0x4a,0xd0,0x2c,0xcd,0x0,0x69,0x6e,0x53, + 0xea,0x9e,0x3d,0xc0,0x14,0x6d,0x16,0xb,0x63,0xb3,0x32,0xb1,0xb8,0x28,0x95,0x2e, + 0x56,0xc1,0xf8,0x48,0xbc,0x1d,0x59,0x4,0x90,0x11,0x9a,0xb7,0xf0,0x48,0x8f,0x1b, + 0x6c,0x18,0xc1,0x3c,0x60,0x2d,0xd,0x55,0x40,0xab,0x5e,0x6c,0xc2,0x20,0x2e,0xc, + 0x1f,0x2a,0x37,0xc3,0xe1,0x3c,0x3e,0x47,0x58,0xd5,0x9f,0xfe,0xc7,0xbf,0x56,0x6f, + 0xeb,0x5,0x29,0xf6,0x3b,0x3e,0x56,0x7f,0xf4,0x8a,0x6,0xe2,0x6f,0xdc,0x28,0xb6, + 0x7d,0x51,0xdc,0x8b,0xd5,0x73,0x7f,0x7c,0x13,0xc7,0x58,0xca,0x6a,0x24,0x56,0x2e, + 0x56,0x27,0x76,0xd,0xf0,0xdd,0xbb,0x77,0xcf,0x5f,0x54,0x54,0x94,0x5d,0xc3,0xca, + 0x6,0xfb,0x4d,0x62,0x62,0xb1,0x7d,0xa0,0x64,0x93,0x88,0x74,0x85,0x84,0xeb,0xce, + 0x0,0x4c,0x19,0x4,0x39,0x3f,0x64,0xa0,0x21,0xf8,0x75,0x6,0xa0,0x9b,0xd2,0x2b, + 0xf7,0xe4,0x7c,0x66,0xda,0xdb,0x9d,0x16,0x7d,0x3b,0x63,0xae,0x6e,0xf,0x28,0x3b, + 0x3,0xf0,0x8e,0xb6,0x2d,0x1,0x3c,0x0,0xf2,0x28,0x70,0xf7,0xfa,0xcc,0x5a,0xb6, + 0xcb,0xed,0x85,0xa2,0x6b,0xaf,0x3d,0x1,0xee,0xc8,0x67,0x90,0x4d,0xd8,0x7e,0x22, + 0x61,0xe0,0x72,0xf8,0x40,0x95,0x69,0xc6,0x4,0x60,0x84,0x18,0x99,0xc5,0xca,0x89, + 0x81,0xd5,0x9d,0x36,0xda,0xd5,0x18,0x72,0x45,0x2,0x1b,0x3b,0x75,0xfa,0x34,0x31, + 0xe2,0x37,0xb7,0x6f,0xa7,0xff,0x23,0x31,0x56,0xbb,0x32,0xc5,0x26,0x0,0x10,0xcd, + 0x3e,0xfd,0xec,0x73,0xd6,0x35,0x69,0x8c,0x63,0xc1,0xcc,0x7e,0x1,0xc4,0x68,0x13, + 0xee,0x4d,0x3c,0x4e,0xa9,0xd3,0xc6,0x4b,0x6,0x76,0x5,0x46,0x86,0x9d,0x7d,0x20, + 0x26,0x85,0x7f,0x2d,0x5c,0x7f,0x0,0xca,0xf8,0xb8,0xc3,0x22,0x19,0x6,0x45,0xcf, + 0x8,0xbf,0x5d,0xdc,0xe7,0xcd,0x1b,0x78,0x67,0x1e,0xf8,0xd7,0x82,0x11,0x2,0xa4, + 0x1,0x3a,0x18,0x9f,0x11,0x15,0xf7,0x3b,0xd1,0x2c,0x6f,0x5b,0xc8,0x11,0xb1,0x60, + 0x68,0xc4,0x65,0x0,0x1e,0x60,0x7e,0xd0,0xa5,0x2,0x9c,0x61,0x3d,0xd,0xc6,0x84, + 0xbe,0x8c,0xf1,0xd3,0x38,0x2,0x67,0x3,0xca,0x3,0xe,0x80,0x1,0x7a,0xd8,0xc6, + 0x8f,0xfd,0x86,0x61,0x45,0xc,0x36,0x48,0xf3,0x89,0xe7,0xd7,0x9,0x1b,0x28,0x40, + 0x3c,0x6e,0x0,0x6b,0x8c,0x7a,0xe8,0xb1,0x27,0x48,0x7f,0xb,0xb,0x62,0x8c,0x3, + 0x3a,0x5a,0x4,0x15,0xc1,0xf3,0xb3,0x9e,0x16,0xf9,0xf0,0xb1,0x35,0xd1,0xae,0x3a, + 0xec,0x66,0x13,0x46,0xd4,0xe,0xeb,0x70,0xc4,0x61,0x86,0xbe,0x17,0x79,0x70,0x1, + 0x3a,0xab,0x17,0xb8,0x60,0xf0,0x10,0x8b,0x63,0xdc,0x73,0x34,0xbb,0x46,0x1b,0x0, + 0xdc,0x86,0x53,0x27,0x49,0x8f,0xb,0xb1,0x3a,0xc7,0x72,0xc6,0xc2,0x6,0x16,0xd0, + 0xec,0x72,0xc5,0x2c,0x16,0xb,0x1b,0xf8,0x58,0xf3,0x46,0xd,0x10,0xa7,0x97,0x56, + 0xae,0xa4,0xe7,0x43,0x2,0xd3,0x86,0x4a,0x0,0x1,0x4e,0xc0,0x92,0x31,0x97,0x58, + 0x48,0x18,0xb7,0x92,0x41,0xb1,0x41,0x49,0x2,0x84,0x99,0x71,0xd9,0x45,0x58,0x55, + 0xb6,0xd2,0xef,0xcd,0x0,0xd8,0x34,0x10,0x67,0xb8,0xda,0x5,0x56,0xce,0x10,0x57, + 0x62,0xcb,0xbb,0x92,0xb2,0x52,0xd2,0x63,0x63,0xfb,0x3f,0x9,0x18,0x0,0x28,0x66, + 0xbf,0xcc,0xea,0x18,0x8c,0x19,0x3c,0xf9,0x9c,0x40,0x58,0xe4,0x31,0x40,0x97,0x10, + 0xd0,0xae,0xf6,0xc0,0x4a,0x32,0xdd,0x62,0x6,0x74,0x9c,0xeb,0xbe,0x42,0x50,0x46, + 0xdd,0xd2,0x0,0xec,0xca,0xe4,0xf8,0x8,0x18,0x5,0x98,0xad,0xf2,0x41,0x36,0x64, + 0xd5,0x5c,0x4f,0x32,0x6a,0xc9,0xb8,0xcb,0x2c,0xd8,0xba,0x5,0x87,0xb5,0xb6,0x96, + 0x22,0xf2,0x90,0x15,0xa7,0x24,0x1,0x21,0xdb,0xd,0xc0,0xbd,0x44,0xd4,0x77,0xe2, + 0xfb,0x60,0x8c,0x2c,0xe,0x47,0xdf,0xaf,0xbf,0x31,0x47,0x4d,0x79,0xed,0x35,0x75, + 0xe8,0xf0,0x21,0xe7,0x17,0xec,0x1b,0xd3,0x5,0xf1,0xf7,0x85,0x2d,0xc1,0xdb,0xd7, + 0x4d,0xf4,0x2c,0x1c,0x1,0xc2,0xf5,0xc7,0x8f,0xbd,0x73,0xec,0xd8,0xb1,0x6f,0x86, + 0xf8,0x36,0x1c,0xe,0x16,0xc2,0xbe,0x18,0xe6,0x65,0xd5,0x71,0x7f,0x27,0x4e,0x9c, + 0xa0,0xc,0x3e,0xf2,0xb9,0xcc,0x97,0xd7,0x32,0x8d,0xe4,0x5e,0x78,0xe,0xf0,0xdd, + 0xb7,0x6f,0xef,0x9f,0x97,0x96,0x95,0x7c,0xb2,0x73,0xd7,0x4e,0xe7,0xe3,0x9b,0x0, + 0x6d,0x57,0xc0,0x82,0xbb,0xa2,0x80,0xe5,0x1,0x6f,0xf7,0xf0,0xf9,0xcc,0x9e,0xd1, + 0x8f,0xc7,0x94,0x3,0x90,0x93,0xcc,0xba,0x53,0xf4,0xd9,0x19,0xa9,0x13,0x2,0x6f, + 0x97,0x0,0x3c,0xf,0x30,0x23,0xe7,0x72,0x6c,0x39,0xc9,0xe4,0x45,0xff,0x61,0x99, + 0x2c,0xb6,0x2e,0xf3,0x52,0x3a,0xe5,0x2,0x56,0xe2,0xde,0xa2,0x43,0xf7,0x8d,0xd, + 0x15,0xee,0xbe,0xef,0x7e,0x7,0x94,0xcc,0x54,0x4d,0x1a,0xe7,0xd8,0xeb,0x28,0x7b, + 0xd,0x76,0x5b,0x5c,0x56,0x96,0xac,0x40,0x3d,0x96,0xdd,0xe3,0x7c,0x27,0xa1,0x52, + 0xd8,0xbd,0x6f,0xaf,0x7a,0xec,0xc9,0xa7,0x89,0xed,0x92,0x1e,0x78,0x7c,0x62,0x35, + 0xd,0x40,0x87,0xc5,0xaf,0x5c,0x1c,0x70,0x1b,0x78,0xc9,0x36,0x6e,0xd9,0xea,0xf4, + 0xa0,0xd0,0x89,0xe2,0xe3,0x8e,0xf0,0x86,0x63,0xac,0x2f,0x2d,0x80,0x10,0x62,0x58, + 0x84,0x6f,0x44,0x39,0x2c,0xc,0x7a,0xf2,0x26,0x98,0x2,0xc4,0xc5,0x0,0x0,0x80, + 0xc,0xd8,0x1c,0x2c,0xb1,0x51,0x7,0x22,0x5d,0x88,0xa3,0xf3,0xd6,0x50,0xcb,0x24, + 0xe3,0x6f,0x8c,0xbd,0x71,0xd9,0xba,0x17,0xa2,0x77,0xc3,0x1a,0x7,0xe8,0x8,0x71, + 0x3c,0x8b,0x63,0x61,0xf5,0xb,0x30,0x4a,0xc2,0x52,0x8e,0x25,0x17,0x22,0x94,0x35, + 0x80,0x6e,0x12,0x3e,0xa,0x26,0xd6,0xf3,0x68,0x72,0x35,0x2,0xa3,0x3f,0x73,0xae, + 0x95,0xc0,0x89,0xad,0xa7,0x9f,0x27,0x63,0xb4,0x66,0xd2,0x39,0xe3,0x1a,0xcf,0x4, + 0x5d,0x32,0x8b,0xcf,0x31,0x6e,0xf4,0x65,0xb6,0xfa,0x33,0xcf,0x83,0x31,0x20,0xe0, + 0x7,0xf2,0x8f,0xd9,0x38,0xd6,0x28,0xcb,0xb1,0xa9,0xa1,0xe3,0xe5,0xe8,0x55,0x88, + 0xc0,0x85,0x70,0x92,0xbc,0x49,0x3d,0xc0,0x19,0xf3,0x84,0x7b,0xb0,0xba,0x46,0xbc, + 0x66,0x36,0xd8,0x1a,0x6d,0x83,0xa9,0x20,0x1e,0x35,0xc,0xb0,0x8c,0xe,0x7d,0xac, + 0xb5,0x88,0xee,0xa1,0x39,0x32,0x9b,0x4e,0x98,0x1d,0x97,0x20,0x4e,0x7,0x73,0x67, + 0xfd,0x31,0x16,0x4c,0xd8,0x81,0xa,0x96,0xef,0xbc,0x33,0x14,0x2c,0xc0,0xc1,0xba, + 0x31,0x37,0x32,0x6a,0x5c,0x4f,0x5f,0x76,0xc,0xf7,0x18,0xa8,0x7a,0x2e,0x7a,0x19, + 0x65,0xa3,0xa0,0x1e,0xec,0xed,0xdd,0x23,0xa2,0xbb,0xe1,0x1b,0x34,0x73,0xd6,0x2c, + 0x8a,0xd9,0xc,0xb6,0x5,0x50,0x58,0x51,0x69,0x36,0xb6,0x2f,0xb6,0xe0,0x6b,0x40, + 0x6e,0xb5,0x1,0x47,0x7b,0x5d,0x1a,0x0,0x5,0xe5,0x7,0x62,0x69,0x7,0x9c,0x82, + 0x39,0x33,0xe0,0x4a,0x51,0x72,0x2,0xa2,0x2,0x28,0x2d,0x78,0x17,0x8b,0xba,0xc5, + 0x21,0x3,0x5f,0xe5,0xb3,0xee,0x62,0xb1,0x28,0xf0,0xfa,0xd,0xc0,0xbb,0x34,0x58, + 0x60,0x94,0x86,0xc,0x3a,0x4,0x6b,0x7,0xd8,0x49,0x7d,0xd7,0x97,0x5,0x4f,0xc9, + 0x8c,0x4b,0x83,0x67,0x2b,0xd,0xee,0xf3,0xdc,0xf0,0x3c,0xb9,0x3a,0x72,0x81,0xe3, + 0x2c,0xbe,0x4d,0x3b,0xd8,0xf3,0x78,0x49,0x71,0x39,0x79,0x50,0xac,0xdf,0xb8,0x81, + 0x7e,0x2f,0x3,0x24,0x69,0xa,0x8c,0xeb,0x2,0x4b,0x79,0xfe,0x7f,0x83,0x1,0xff, + 0xd5,0xdf,0xfc,0x47,0xda,0xd8,0x1,0xde,0x35,0xc7,0x4f,0xd4,0x6b,0x10,0x3e,0xfa, + 0x4d,0x89,0x7f,0x85,0x8e,0x21,0x46,0xc6,0xce,0xc3,0xbc,0x18,0xbe,0xa6,0x0,0x78, + 0x24,0xe9,0xf8,0xf1,0xe3,0x23,0x2e,0x9b,0x95,0xb0,0x12,0x38,0x58,0x5d,0xfd,0x7b, + 0x95,0x95,0xe5,0x97,0x25,0xf8,0x82,0xf9,0x32,0x30,0xf2,0x51,0x82,0x2f,0x31,0xe1, + 0xee,0x2e,0xf,0x8c,0x99,0x1d,0xc7,0x44,0xcd,0x59,0x79,0xa8,0x9f,0x8b,0x9c,0x87, + 0xac,0x3a,0x5e,0x37,0x17,0x5,0x4d,0x1e,0x53,0x66,0x5b,0xb1,0x36,0x6d,0xbd,0xce, + 0x8c,0x31,0xcb,0xb6,0xc2,0x73,0x29,0x42,0x4f,0x40,0xd4,0x17,0xbf,0xe7,0x1c,0xdb, + 0x8d,0x33,0x66,0x4f,0x67,0x2d,0xea,0x42,0xc4,0xf9,0xe4,0x84,0x67,0xc8,0x87,0x17, + 0xe0,0x6,0x8b,0x66,0x3,0xbc,0xe3,0x6d,0xba,0xc3,0x25,0xb0,0x63,0xda,0xd8,0x60, + 0xcb,0x16,0x13,0x74,0x24,0x26,0x7d,0xb0,0xaa,0x1,0x8e,0x21,0xd,0xfd,0x31,0x98, + 0x1e,0x74,0xbe,0xc,0xee,0x68,0x17,0xd6,0xd0,0x73,0x17,0x2c,0xa0,0x97,0xc7,0xd3, + 0x85,0xeb,0x23,0xc4,0xd2,0xf3,0x16,0x2e,0xb2,0xbb,0xf0,0xdc,0x49,0xc1,0x1e,0xa0, + 0x83,0x44,0x74,0x26,0xde,0x7,0x18,0xd1,0x9d,0x0,0x82,0xa3,0x6c,0x18,0xcc,0x99, + 0x73,0xe6,0x50,0x19,0x3c,0xf,0xeb,0x72,0xb1,0x89,0x3,0x82,0x6b,0x20,0x8e,0x31, + 0xc5,0x33,0x26,0xa6,0xda,0x49,0x60,0xd4,0x93,0xcf,0x3b,0xb6,0xa,0x80,0x30,0x3a, + 0xde,0xd1,0xe,0xb4,0xc1,0xa4,0x29,0x2,0x96,0x6,0x10,0x18,0x4a,0xb1,0xf1,0x17, + 0x62,0x31,0x3,0x68,0xb0,0x40,0x60,0x3d,0x2b,0x82,0x68,0x0,0x68,0x5c,0xf8,0x44, + 0xd,0xf0,0x0,0x31,0x30,0x64,0xb4,0xf9,0x94,0x5d,0x1c,0xb0,0x9e,0x99,0xf5,0xbf, + 0x8,0x7b,0x79,0x90,0xb6,0x51,0x34,0xd1,0xa6,0xc0,0xdc,0xb7,0x92,0xf8,0xdc,0x44, + 0xc8,0x42,0x60,0xc,0xe8,0xb4,0xe1,0x76,0x65,0x44,0xca,0xc6,0x52,0x19,0xe0,0x87, + 0x67,0x85,0x1b,0x10,0x95,0x1d,0x6d,0xe2,0x2d,0x3,0x94,0x6b,0x48,0x72,0x70,0x7, + 0xd5,0x87,0x35,0x33,0x98,0x32,0x7,0x12,0x1,0xdb,0x36,0x31,0xa3,0xc7,0x10,0x3b, + 0xc5,0x3c,0xc0,0x50,0x8c,0x5d,0x9e,0x78,0x83,0x7,0x30,0x5e,0x5a,0x4,0x8c,0x36, + 0x21,0x28,0x21,0x7d,0x0,0xc3,0x67,0xd7,0x26,0xec,0x1e,0x85,0xdd,0x95,0xc0,0xfc, + 0xb1,0x70,0x80,0x7b,0x13,0xc2,0x81,0xc2,0x4f,0x98,0x17,0xb,0x68,0xb,0x2c,0x19, + 0xd2,0x85,0x3e,0x12,0xf5,0xfa,0xfe,0xed,0x85,0xac,0xef,0x7b,0x22,0x41,0x67,0x62, + 0x80,0xdb,0x5d,0x28,0x6a,0x5c,0x24,0x60,0xd,0x33,0xe0,0xbd,0xfb,0xf7,0xa9,0x97, + 0x5f,0x7d,0x55,0x4d,0x9b,0x3d,0x2f,0xd,0x92,0x16,0x50,0x1,0x32,0x2b,0x18,0x78, + 0x5,0xc0,0x16,0x7,0xe5,0x8,0x2c,0x3,0xf6,0xca,0x0,0x8a,0xfc,0x15,0x16,0xb8, + 0x4b,0x4,0xab,0x96,0x46,0x5b,0x4,0xd6,0x2,0x8,0x8b,0x5,0xb3,0x2e,0x16,0x20, + 0x99,0x5,0xb8,0x25,0x2b,0x7d,0xf6,0x2b,0xdb,0x86,0x11,0x99,0x4,0xd4,0xe2,0x4a, + 0xdb,0xe6,0x2a,0x5f,0xf4,0x5c,0x2c,0x9e,0x4b,0x2,0x74,0x2,0xe2,0x6b,0x52,0x40, + 0x5d,0x2a,0x24,0x2,0x9e,0xdb,0x55,0x8,0xe6,0xc,0xaa,0x56,0x4c,0x2d,0x9f,0x8f, + 0xcb,0xaf,0xa8,0x5c,0xed,0x1,0xbc,0xbf,0x60,0x31,0xba,0x61,0x9c,0x43,0x24,0xbd, + 0x64,0xd9,0x32,0x72,0x57,0x72,0x7a,0xe1,0x8c,0xed,0x4e,0x19,0x88,0xf1,0xff,0x87, + 0x2e,0x18,0x3a,0x61,0x6c,0xe6,0x80,0xd8,0xdd,0xc7,0x8f,0xd7,0xbf,0x7d,0xe4,0xc8, + 0x91,0x6f,0x84,0x84,0xf2,0x67,0x89,0x7b,0xb1,0xe4,0x1,0x30,0x3a,0xf9,0x59,0x27, + 0xf9,0x0,0x48,0x4,0xbe,0x7,0xf,0xfe,0x66,0x65,0x65,0x45,0x1f,0x1b,0x5c,0xb5, + 0x5e,0x38,0x67,0xc1,0x35,0xe7,0x1d,0x25,0xc8,0x7a,0xc7,0xee,0x34,0x48,0x67,0x95, + 0x65,0xd0,0xec,0xc8,0x25,0xc0,0x4d,0xa0,0x97,0x93,0xa0,0x9e,0xcb,0x64,0xdb,0x9, + 0xe8,0xb,0x16,0x8c,0xba,0x82,0x5,0x77,0x6,0xec,0x5a,0xb2,0xed,0xce,0x18,0x7b, + 0xd,0xfb,0x11,0xe2,0xec,0xae,0x50,0x3f,0x1d,0x1,0x6d,0x8f,0x41,0x7b,0x20,0xdf, + 0x1d,0x61,0xc5,0xdd,0x99,0x2c,0x3c,0x27,0x16,0x15,0x12,0x8c,0xb1,0x92,0xac,0xd3, + 0xac,0xb,0x22,0x63,0x80,0x30,0x98,0x30,0x45,0x6e,0xb2,0x62,0x62,0x24,0xe4,0x41, + 0x3c,0x8d,0xdd,0x8f,0x96,0x6a,0x90,0x0,0xbb,0xd,0xd,0xd4,0x7a,0x44,0x48,0x50, + 0x39,0x76,0xb0,0x8d,0xd,0x9b,0x36,0x51,0x1b,0xcc,0xa6,0x71,0xe,0xb0,0xaf,0xae, + 0xa9,0xa1,0x17,0x26,0xe5,0xab,0xad,0x3f,0xc6,0x86,0xc5,0x1a,0xd0,0x59,0x5e,0x52, + 0x4a,0x3a,0x6a,0xb0,0x31,0xf6,0xc1,0x85,0x6e,0x13,0xb1,0x99,0xd9,0x37,0x18,0x6c, + 0x13,0xba,0x4a,0x58,0xfd,0xde,0x6a,0x43,0x30,0xc2,0xa2,0x12,0x60,0x2,0xd6,0x89, + 0x72,0xb8,0xee,0xb3,0x62,0x67,0x63,0x41,0x6b,0x2c,0x28,0x21,0xca,0x7d,0x84,0xac, + 0x7b,0xc7,0x10,0x98,0x0,0x5c,0x61,0xf8,0x5,0xe0,0x7,0x38,0x1b,0x9d,0xaa,0x89, + 0x1c,0x5,0x3d,0x2e,0xd8,0xf8,0xb2,0xe2,0x62,0xbb,0x57,0xef,0x38,0x1a,0x7,0x0, + 0x8e,0xdb,0x5,0x70,0x1f,0x39,0x5e,0x6f,0xd9,0xba,0x89,0x10,0x85,0x3c,0xb0,0x51, + 0xf8,0x2c,0xf3,0xbe,0xc5,0x60,0xda,0xf0,0x9b,0x36,0x91,0xb4,0x4c,0x18,0x49,0x66, + 0xe2,0xac,0xbf,0x5,0xa8,0xb2,0x95,0x34,0x80,0x1b,0x60,0x89,0x45,0x5,0x80,0x95, + 0x37,0x45,0x40,0x5a,0xbb,0x61,0x23,0x81,0x32,0xc,0xdb,0x6e,0x19,0x6d,0xe6,0x8, + 0xcf,0x8b,0x90,0x99,0xfb,0xaa,0xab,0x49,0x3c,0x6d,0xe2,0x6a,0x1b,0xa0,0x9d,0xb7, + 0x68,0x31,0x2d,0x32,0xb0,0x20,0x81,0xe8,0xdb,0xed,0x6e,0xb4,0x6e,0xbd,0x63,0xb1, + 0xe8,0xf,0x6d,0x80,0x95,0xc3,0x8f,0x1a,0xcf,0x8f,0x72,0xd8,0x71,0x9,0xcf,0xc7, + 0x6c,0x1e,0x31,0xad,0x1,0xb6,0x30,0xdc,0xba,0x9f,0x62,0x4c,0x8f,0xa7,0x7c,0x18, + 0x7c,0xd1,0xe6,0xf,0xfd,0xfd,0x11,0x17,0xb7,0x9e,0x68,0xd8,0xd7,0x5c,0xca,0x2f, + 0xbd,0x37,0x65,0x64,0x58,0xd0,0x75,0x2e,0xea,0x4e,0x67,0x54,0x24,0xf8,0x4d,0x62, + 0x6f,0x5e,0xec,0xcb,0x8b,0x3d,0x79,0x4b,0x5,0xf8,0x18,0x10,0x5d,0x4d,0x1f,0xfc, + 0x15,0x82,0xed,0x16,0x5b,0xd6,0x6,0x30,0x2b,0x16,0x0,0xea,0x31,0xe3,0x55,0xbe, + 0x8,0x9a,0xc0,0xdb,0x82,0x9f,0xb9,0xbf,0xc6,0x1d,0x4b,0x44,0x7f,0x25,0x1e,0xd8, + 0x4,0x6d,0x49,0xc0,0x5e,0xb9,0x26,0x0,0xed,0x4,0x1c,0x25,0x78,0x26,0xcf,0x61, + 0x2d,0xb2,0x57,0xae,0x75,0x80,0x2b,0x81,0xdb,0x1f,0xb3,0xaf,0x6b,0x76,0xd6,0xdc, + 0x21,0xa3,0xe,0x99,0xb8,0x5d,0x14,0xd0,0xb8,0x45,0xff,0x60,0xb3,0x2c,0x76,0xf7, + 0x17,0x35,0xc9,0xe2,0xc4,0xeb,0x83,0x81,0x97,0xc5,0xfd,0x11,0x91,0x39,0x8b,0xcd, + 0x21,0x6e,0x87,0x75,0x3a,0xb6,0x79,0x4,0x91,0xe3,0xf0,0xa6,0x3d,0xc2,0xb8,0xce, + 0xc5,0x11,0x10,0x62,0x69,0xfc,0x6,0x60,0x9f,0x2,0x71,0x34,0x76,0x40,0x3,0x80, + 0x1f,0x3d,0x76,0xe4,0x5a,0x5d,0x5d,0xdd,0x1f,0x85,0x58,0x18,0x3,0xe1,0x2c,0x7c, + 0x1b,0x29,0x8e,0x72,0x39,0xf7,0x17,0x16,0xa8,0xaf,0xaf,0x2f,0x78,0x2d,0xf3,0xb2, + 0x8e,0x61,0xc2,0xea,0xa2,0xba,0xba,0xfa,0x37,0x2b,0x2a,0xca,0x3b,0x10,0xd7,0x99, + 0xac,0x9d,0xa1,0xf3,0xd5,0x2f,0x3c,0x83,0xa2,0x4c,0xcc,0x88,0x3d,0xb0,0x14,0xe7, + 0xb8,0x9f,0x62,0x91,0x19,0x60,0xdc,0x19,0xcb,0xcb,0x65,0xd4,0xeb,0xee,0x8a,0x2f, + 0x0,0x4,0x3,0xee,0xc,0x0,0x36,0x3c,0x66,0x1,0x68,0x8,0xee,0x21,0xcb,0xe, + 0xc7,0xc4,0xb,0x80,0x5c,0x44,0xdf,0xcd,0xe5,0xc3,0xfe,0x63,0xac,0xbc,0x33,0x25, + 0x3e,0xf,0x40,0xdd,0x32,0x60,0x6e,0xf,0x3f,0x62,0xfc,0x28,0x37,0xeb,0xf,0xe8, + 0xd4,0x69,0xd3,0xc9,0xa2,0x19,0xec,0x11,0x1f,0x53,0xb0,0xd7,0x89,0x93,0x5e,0x56, + 0x45,0x1a,0x70,0x60,0x78,0x25,0x2d,0x55,0x51,0xf,0x6d,0x40,0xa2,0x1,0xf1,0x2a, + 0x74,0xfa,0xd0,0xd,0xb3,0x41,0x4,0x7f,0x0,0x71,0xdf,0x4,0xef,0x18,0x4f,0x2c, + 0x1a,0x6,0x5e,0x60,0x7b,0xc,0xda,0xa1,0xda,0x0,0xe3,0x7e,0x79,0xca,0x14,0xd2, + 0xff,0xf2,0xc7,0x1c,0x47,0x8e,0xb8,0x4,0xc0,0x0,0x9b,0xe4,0x28,0x53,0x0,0x34, + 0xf6,0x93,0x35,0x3a,0x4a,0x53,0xe,0x0,0xb7,0xd7,0x45,0x6a,0x32,0xc,0xd3,0x6c, + 0x90,0x90,0xb7,0xa9,0x8f,0xd8,0x2a,0x7c,0x92,0x11,0xb,0x9a,0x8d,0x9c,0xc,0x83, + 0x34,0x7b,0xfe,0xc2,0xe2,0x19,0x7e,0xb3,0x52,0xcf,0x8c,0x36,0x12,0x7f,0xd8,0x3b, + 0x8,0x94,0xa1,0x33,0x66,0x50,0x7,0xe8,0x18,0x11,0xfa,0x68,0x32,0x4,0x83,0x2b, + 0x11,0x18,0x32,0xee,0x21,0xb8,0x5,0xf5,0xa1,0x9f,0x7,0xf5,0xb0,0x7,0xb0,0xd9, + 0xa1,0x69,0x3c,0xb1,0x61,0x0,0x1e,0xee,0xd3,0x9e,0xc0,0xba,0x6f,0xe,0x67,0x69, + 0x82,0x83,0x98,0xb8,0xd6,0x70,0x8d,0x2,0x7b,0x5,0x3b,0x35,0x5b,0x5,0xde,0x4d, + 0x3a,0x66,0x2c,0xc,0x8c,0x5,0xf5,0x68,0x2,0x4f,0x16,0x75,0x63,0x8e,0x60,0x5d, + 0xbd,0x51,0x2c,0x58,0xaa,0xd6,0xae,0xa5,0xb6,0xb1,0x28,0x30,0xc1,0x38,0xc6,0xba, + 0xbd,0x94,0x61,0xa8,0x26,0x3,0x92,0x98,0xe8,0x60,0x66,0x5e,0x10,0xd0,0x3,0x6, + 0x57,0xf0,0xad,0x66,0x5f,0x63,0x13,0xad,0x6b,0x9c,0xfb,0x5f,0xa1,0x2e,0xfe,0x47, + 0xe7,0xf4,0x5c,0xb1,0xb5,0x79,0xd4,0x72,0x3f,0xc3,0x32,0x3f,0x57,0x20,0x28,0x4c, + 0x18,0x2c,0x27,0x1a,0xf1,0xad,0x2f,0xbd,0x35,0x67,0x7b,0x67,0xbb,0x2a,0x5a,0xb1, + 0x5c,0x3d,0x3f,0x69,0x32,0x85,0x43,0x24,0x76,0xa,0x50,0x65,0x51,0xb3,0xbd,0x76, + 0x8c,0xd6,0x2,0x59,0xc2,0x60,0x99,0xd1,0x56,0x79,0x80,0x24,0xeb,0xb3,0x78,0x95, + 0x59,0x1c,0xb7,0x5f,0x2c,0xea,0x7b,0xc,0x3a,0xac,0x2f,0x44,0xdd,0xb2,0x9c,0x3, + 0xfd,0x4a,0x5f,0x27,0x1c,0x8a,0xa9,0x4b,0x3,0x86,0x9,0xe0,0x5d,0x51,0xb1,0xda, + 0x63,0xd6,0x9,0x98,0x7,0x6c,0x3a,0x62,0xdd,0xed,0x58,0xf8,0xaa,0x88,0x8e,0x5b, + 0xb2,0x54,0x1,0xa8,0x92,0x9d,0xfb,0xb,0x96,0x35,0xbe,0xb1,0x9a,0xbb,0x96,0xee, + 0x5b,0xc1,0xc2,0x24,0xd2,0x6,0xac,0xa4,0x67,0x2f,0x5c,0x4a,0x91,0xc9,0xe,0xd7, + 0xd5,0x1a,0x9d,0x70,0x7f,0x5f,0xe6,0x9e,0xe9,0xf2,0x37,0xf6,0x96,0x5e,0xcc,0x62, + 0x23,0x7,0xe8,0x84,0xa1,0xff,0xaf,0x3b,0x52,0x7b,0x59,0x83,0xf0,0x6f,0x66,0x61, + 0x5f,0x21,0x1c,0xe4,0xf3,0x2c,0xfc,0xb,0xef,0xe1,0xdc,0xfd,0xf1,0xcd,0x7f,0xa8, + 0x4,0xc4,0x3f,0x7c,0xf8,0xf0,0xaf,0x96,0x95,0x95,0x9c,0xdf,0xbc,0x65,0x93,0xaa, + 0x3f,0x71,0x9c,0xfc,0x7c,0x13,0x20,0x4c,0x3,0xad,0x4,0x5c,0xf,0x6c,0x45,0xf9, + 0xe,0xc9,0x9c,0x73,0x22,0xcf,0x1e,0xc3,0xf6,0x62,0xed,0xa7,0x19,0xaf,0x64,0xba, + 0x69,0x83,0x29,0xaf,0xad,0x8,0x98,0xb2,0x11,0x19,0xda,0xa5,0xc5,0x45,0xf0,0x1c, + 0x3e,0xa0,0x77,0xc5,0x45,0xda,0xb9,0xae,0x94,0xae,0xb8,0xb3,0xdb,0xd7,0x5f,0xcb, + 0x3a,0x9,0xbb,0x17,0xc,0x3d,0x63,0x51,0x22,0xdb,0xf6,0xc6,0x1e,0xf4,0x67,0x5c, + 0x7f,0x8c,0x28,0xa7,0xbd,0xab,0x83,0x74,0x96,0xe7,0x75,0xe2,0xa8,0x64,0xd2,0xb7, + 0x12,0xfd,0xef,0xde,0xbb,0x57,0xbd,0x31,0x67,0x2e,0x89,0xaf,0x61,0x39,0xd,0xd7, + 0x23,0x1c,0x61,0x2d,0xd,0x10,0xdf,0xb8,0x65,0x33,0xd5,0x47,0x9b,0xe8,0xe3,0x89, + 0x9,0x13,0x28,0xaa,0xd4,0x5d,0x9a,0x61,0x96,0x56,0x54,0x90,0xf,0x30,0xfa,0x92, + 0xa0,0xeb,0x58,0xb9,0xee,0x3,0xc6,0x53,0xd0,0x8d,0x1a,0x86,0x37,0xda,0xba,0xe9, + 0x8c,0x25,0x17,0x1c,0x44,0xe3,0x2,0x3,0x4,0xe8,0x9b,0x8,0x59,0xa3,0x9,0x64, + 0x90,0x4c,0xb4,0xab,0xf1,0xa4,0x9f,0x84,0x2b,0x11,0x98,0x19,0x76,0x4d,0xfa,0xce, + 0x2d,0xb7,0x11,0xc3,0x64,0x8b,0x5c,0x6,0x4b,0x5c,0x3,0xa4,0xd9,0x95,0x89,0x1, + 0xa,0xfd,0xc1,0x10,0xa9,0xe1,0x64,0x13,0x45,0xa0,0xfa,0xee,0x6d,0xb7,0x93,0xb1, + 0xe,0xf4,0xa8,0x0,0xff,0x7,0x1e,0x79,0x94,0xda,0x24,0xa0,0xd1,0xcf,0xc9,0xfa, + 0x64,0xb4,0xd,0x80,0x5e,0xbc,0xac,0x88,0x16,0x10,0x0,0x30,0x30,0x50,0xb6,0x90, + 0x86,0x1e,0x15,0xf5,0xa0,0xbb,0x46,0x5c,0x65,0x18,0x91,0xc1,0xd2,0x1b,0xe2,0x6a, + 0xe8,0xa7,0x61,0x5c,0x86,0x7a,0xc6,0x5f,0xb9,0x93,0xda,0x32,0x3b,0x2e,0xdd,0x45, + 0x63,0x82,0xd5,0x37,0xf2,0x30,0x6,0xb0,0x76,0x3c,0x33,0xc0,0x1a,0xe2,0x65,0x8c, + 0xd,0xed,0x21,0x8f,0x75,0xd6,0xbc,0x97,0xef,0x9,0xcd,0x18,0x8a,0xcb,0x2b,0xa8, + 0x6f,0xb4,0x75,0x58,0xb3,0x5a,0x72,0x9b,0x82,0x4f,0xb7,0x9e,0xab,0x6f,0xdf,0x7c, + 0x2b,0x1,0x2a,0xac,0xb0,0x27,0xeb,0xc5,0x5,0xc6,0xc0,0x9b,0x39,0xb0,0x48,0x19, + 0xe0,0x8a,0x20,0x2a,0x30,0xb4,0xc2,0x82,0x3,0x60,0xcf,0x91,0xc1,0xb8,0xc,0x2d, + 0x54,0x1e,0x7c,0x98,0x7c,0x91,0xa5,0x54,0x40,0x82,0x67,0xca,0xff,0x3d,0x1a,0x51, + 0xce,0x77,0xd3,0xeb,0x8a,0x0,0x77,0x18,0xc1,0x2d,0x16,0x3a,0x16,0xe0,0xf,0xcb, + 0xfd,0x85,0x8b,0x17,0xd3,0xc6,0xf1,0x88,0xe1,0x5c,0x22,0xc4,0xcb,0x12,0xf4,0x1c, + 0x60,0xda,0xb4,0x42,0x80,0x34,0x33,0xe1,0x62,0x51,0x2e,0x7d,0xcf,0xe4,0x39,0x3d, + 0x32,0xeb,0x4a,0xa9,0x3f,0xbf,0x6d,0x2a,0x2b,0xf4,0xcd,0xc5,0x1,0xc3,0xf4,0xc4, + 0xd7,0x2b,0x7d,0x91,0xf6,0xa,0xb1,0x40,0x80,0x58,0x39,0x1,0x36,0x6,0xec,0x35, + 0x16,0x60,0xd7,0x6,0x63,0xf1,0x81,0xd0,0x30,0xe3,0xb5,0x8e,0x29,0x87,0x6c,0x39, + 0x6,0xc2,0x92,0x45,0x4b,0x63,0xb5,0x62,0xa9,0x3b,0x4f,0x81,0xec,0x5a,0x37,0x6e, + 0x6f,0x51,0x22,0x74,0xe6,0xc5,0x42,0xe2,0xe0,0x8c,0xd7,0xe4,0x7d,0xb1,0x10,0x2, + 0x8,0x2f,0x2c,0x2a,0xa1,0xd,0x31,0xb0,0x6f,0x80,0x73,0x43,0xca,0xf7,0x46,0xc3, + 0xf7,0x4a,0x30,0x86,0x38,0x1a,0x1,0x3b,0xae,0x61,0x2b,0xd1,0xb,0xe7,0xd4,0x91, + 0x23,0x75,0x4d,0x47,0x8e,0x1c,0xf9,0x67,0xff,0xd0,0x98,0x38,0x2c,0x0,0x1f,0x3b, + 0x76,0xcc,0x1d,0x65,0xca,0xba,0x27,0xeb,0xc9,0x3c,0xa0,0x7d,0x5d,0x5d,0xed,0xcf, + 0x57,0x56,0x56,0xec,0x59,0xb7,0x7e,0xad,0x3a,0x5a,0x7f,0x8c,0x22,0x5c,0x5d,0xea, + 0x68,0x23,0x71,0x17,0x81,0xa5,0x3e,0x52,0xca,0x75,0x46,0x45,0xc5,0x92,0xd,0x3b, + 0xc6,0x1c,0x3,0x57,0x1,0x2a,0xc,0x7e,0xed,0x2,0x4,0x25,0xf3,0xf5,0xd8,0x74, + 0x57,0x67,0xaa,0x9e,0xaf,0xa7,0x4d,0xca,0xc4,0xd8,0x78,0x78,0xcc,0x49,0x76,0x5a, + 0x80,0x6d,0xcb,0xfb,0xb1,0x7e,0x43,0x76,0x2b,0x17,0x5,0xa9,0x3e,0xc2,0xb1,0xf5, + 0xa4,0xfb,0xe0,0x67,0xe9,0x8c,0xe8,0xa5,0x49,0x54,0x6f,0x9f,0x91,0x99,0xb2,0x1c, + 0x73,0xc8,0x58,0x38,0xf,0x1f,0xb3,0x29,0x1a,0x44,0x20,0x9a,0x36,0x1b,0x34,0x8c, + 0x75,0xd1,0xae,0xc,0xbb,0x35,0xd6,0xd2,0xd0,0xf1,0x3e,0xf5,0xcc,0xb3,0xa4,0x3, + 0x6,0x1b,0x46,0x8,0x4a,0xc4,0x93,0x86,0xe8,0x88,0xc5,0x42,0xe1,0xe2,0x20,0xb1, + 0xc,0xef,0x21,0xe6,0x4,0x3,0x25,0x88,0x5f,0x61,0xb9,0x8c,0x48,0x54,0x0,0x4a, + 0xf8,0x19,0x73,0xcc,0x58,0x0,0x8,0x82,0x6e,0xc0,0x48,0xa,0x9b,0xdc,0x43,0xfc, + 0xba,0x76,0xc3,0x6,0x55,0x7d,0xa8,0x86,0xda,0x40,0x90,0x76,0x0,0x28,0xd8,0x1e, + 0xf2,0x51,0xd6,0x6c,0xc,0x3e,0xe8,0x62,0xcd,0x42,0x97,0x4,0x6b,0xea,0x1d,0x7b, + 0x76,0x53,0x3f,0x48,0x68,0xf,0xd7,0x70,0xad,0x2,0x70,0xee,0x3f,0x58,0x4d,0xd1, + 0xb0,0xd8,0xa7,0x15,0x7d,0x1f,0x3c,0x7c,0x88,0x16,0x2,0x47,0x34,0xf3,0xa4,0x3c, + 0xe,0x22,0x6f,0xe3,0x53,0x83,0x55,0x23,0x86,0x36,0x7c,0x99,0x7b,0xac,0xe1,0xf, + 0xfa,0x3e,0xd1,0xd8,0x48,0xf5,0xe0,0x6b,0x3d,0x48,0xbb,0x3d,0x1d,0xa1,0xfe,0x20, + 0xee,0x46,0x3d,0xb8,0x5,0xa1,0x2f,0x0,0x26,0xed,0x14,0x63,0x75,0x5d,0x7,0x6a, + 0xe,0x52,0xb9,0xd3,0x67,0xce,0x38,0xb7,0x22,0x88,0xf0,0xd1,0x7,0x44,0xcb,0x78, + 0x26,0x6e,0x8f,0x9f,0x1,0xf7,0xd0,0x16,0xe6,0x3,0xe3,0xc3,0x5c,0xc0,0x45,0xb, + 0xf3,0x68,0x16,0xa,0x66,0x4f,0x5b,0xb8,0x2f,0x6d,0xdb,0xb5,0x93,0x9e,0x9,0x7d, + 0x42,0x7,0x8e,0x31,0x62,0xee,0x77,0xed,0xdb,0x6b,0xe6,0x43,0xb7,0x83,0xfb,0xb4, + 0x1,0xc4,0x15,0xb3,0x41,0x5,0x98,0x38,0x58,0xfb,0xe,0xdb,0xf,0xca,0xa1,0xe, + 0xb9,0x43,0x69,0xc6,0x3f,0x60,0xfd,0xa8,0x1,0xc0,0x61,0x0,0x98,0x58,0x50,0x1d, + 0xcf,0xdd,0x2e,0x62,0x50,0x28,0xeb,0x27,0x6e,0x7a,0xe9,0x80,0x35,0x39,0xbb,0xb9, + 0x9,0xfa,0xc5,0x56,0xa6,0x33,0xde,0x98,0xa5,0x17,0x15,0xd3,0xd5,0xf2,0x8a,0x2a, + 0x7,0xbe,0x64,0x70,0x65,0xc1,0x60,0x79,0xf9,0x2a,0x7,0x6e,0xcb,0x2b,0x92,0xf3, + 0x62,0xc1,0x8c,0x19,0x3c,0x7c,0xc0,0x11,0x60,0x5a,0x51,0xe5,0x81,0xef,0x72,0x1, + 0xd2,0xc,0xbe,0xe,0xb8,0x5d,0xfb,0x1,0x0,0xb,0xd6,0xbd,0x42,0x9c,0x87,0x20, + 0xed,0xe5,0x5b,0x10,0x2e,0xb6,0xe2,0xe4,0x12,0xab,0xeb,0x35,0x60,0xbc,0x26,0x25, + 0xa6,0x5e,0x61,0x1,0x7a,0x85,0x0,0x70,0xae,0xeb,0x0,0x3d,0xc6,0x64,0x3,0x40, + 0x75,0x8b,0x16,0x2b,0x11,0x58,0xb5,0x7e,0x93,0x5a,0xb3,0x71,0xab,0x5a,0xbd,0x71, + 0x4b,0x9a,0xd1,0xeb,0xf2,0xab,0x37,0x6c,0x51,0x6b,0x37,0x6d,0x55,0x55,0x1b,0xc4, + 0xfd,0x98,0x24,0x41,0x80,0xae,0xb4,0x44,0x2f,0xe,0xc6,0x1,0x91,0x34,0xe6,0xf8, + 0xe5,0x29,0xaf,0xa9,0xcd,0x7a,0xb1,0xef,0xfb,0x89,0xfb,0x9b,0xbf,0xf4,0x4,0x1b, + 0xef,0xbc,0xf5,0x8e,0x61,0xc2,0xf8,0x3e,0x60,0x5b,0xc9,0xc3,0x87,0xf,0xe9,0xd7, + 0xef,0xc8,0xd7,0x62,0x98,0x16,0xe2,0xe0,0x70,0x79,0x85,0xee,0xb9,0xbf,0xa3,0x47, + 0x8f,0x46,0x2b,0x85,0xf9,0xb8,0x96,0x79,0x7c,0x1e,0x1e,0xf9,0x1c,0x9d,0xe2,0x58, + 0x59,0x51,0xbe,0x7a,0xe5,0xaa,0x95,0x24,0x22,0x40,0x60,0x7,0x88,0x25,0xd3,0x22, + 0xe7,0x2e,0x7,0x2,0x1d,0x2,0x94,0x0,0xbe,0x92,0x49,0x4a,0x30,0xf6,0x44,0xd1, + 0x1,0xb0,0x52,0x7e,0x4f,0xce,0x6b,0xc7,0xab,0xd7,0xd5,0x19,0x3d,0x8f,0x89,0xc3, + 0x65,0x5f,0xae,0x9d,0x10,0xdc,0x72,0x3e,0xb,0x95,0xa0,0x1e,0x3,0xda,0x50,0xc4, + 0x2e,0xdb,0xd,0xc5,0xde,0x51,0xbd,0x74,0xa0,0x13,0xf,0x19,0xb4,0x5c,0xc4,0x24, + 0x62,0xe8,0xae,0x34,0x13,0xee,0x49,0xe7,0xbb,0x71,0x74,0xc7,0x17,0x1a,0x7c,0x8e, + 0x1f,0x31,0x74,0xc0,0xb0,0x84,0x6,0xd8,0xde,0x4e,0xba,0xe2,0x44,0x5f,0x6c,0x8c, + 0xb5,0xc6,0x53,0x4,0x2c,0xe4,0x7f,0xf7,0x96,0x5b,0xc9,0x7a,0x11,0xf5,0xdd,0x4a, + 0x34,0xdf,0xeb,0xb3,0x79,0x31,0xb7,0x52,0xa,0x80,0xf,0x3b,0x40,0x7,0x1f,0xfd, + 0xc3,0x75,0x75,0x1a,0xa0,0xea,0x8,0xa4,0x6a,0x6a,0xf,0xab,0x83,0x1a,0xd4,0x0, + 0x6c,0x0,0x46,0xba,0x7f,0xc4,0xdc,0x7,0xf8,0xe0,0x3e,0x0,0xa7,0x9a,0xca,0xd4, + 0xb8,0xfb,0x87,0xf4,0x6f,0x11,0xe7,0xdc,0x2e,0x12,0x98,0x29,0x2,0x8d,0x1c,0x24, + 0x7d,0x6f,0x1d,0x89,0x7a,0x51,0xe,0x80,0x76,0xa8,0xb6,0x96,0xda,0x42,0x42,0x9e, + 0xa9,0x7f,0x98,0xda,0xc5,0x11,0xd7,0x18,0x17,0xda,0xe4,0xfe,0xd0,0x26,0x40,0x11, + 0xe7,0x87,0xeb,0x4c,0x7b,0xa6,0x4f,0x5b,0x46,0xdf,0x43,0xdb,0xd0,0xa9,0xa2,0x3e, + 0x95,0xe3,0x71,0xeb,0x36,0x31,0x9e,0xe4,0x79,0x8f,0x24,0x6d,0xea,0xba,0x5c,0x8e, + 0x9f,0xe3,0x0,0xf5,0x53,0x63,0xc6,0x57,0x5b,0x6b,0xdb,0xab,0xa1,0x23,0xca,0x1, + 0xe0,0x51,0x7,0xfd,0x61,0xbc,0x3c,0xf,0xe8,0xdb,0xe4,0xf3,0x3c,0xd5,0x50,0x7d, + 0xf4,0x87,0xf1,0x9a,0x36,0x6b,0x5d,0x7d,0x9e,0x13,0xb4,0x41,0xf3,0x42,0x65,0x4c, + 0xff,0x18,0x1b,0xda,0xa9,0xd5,0x75,0xeb,0x6c,0xbb,0x3c,0x46,0x33,0x4f,0x66,0xfc, + 0x58,0x34,0xd1,0xa6,0x21,0x41,0xf0,0x9c,0x30,0x18,0x4c,0x74,0x53,0x95,0x20,0xe4, + 0x6a,0x2e,0x6,0xda,0x91,0x88,0x72,0x60,0x44,0x27,0x4f,0x9d,0x54,0xaf,0xcf,0x98, + 0x41,0x7a,0x43,0xfe,0xc8,0x3,0x6c,0x1,0xb2,0x0,0xc3,0x4,0x78,0xab,0x9c,0x5, + 0x74,0x8,0xce,0x4,0xa6,0xb6,0x5c,0x98,0x18,0x74,0x8b,0x23,0x62,0x67,0x29,0xde, + 0x96,0x80,0xea,0x3,0xf3,0x6a,0x8f,0x75,0xaf,0x10,0xa0,0x14,0x2,0xba,0x27,0xbe, + 0x66,0xe0,0xa4,0xf6,0x13,0x50,0x95,0xe0,0x9d,0x30,0xe2,0x4,0x64,0x25,0x63,0x36, + 0x4c,0x7e,0x75,0x8a,0x1,0x9b,0xe7,0xad,0x72,0xec,0xdb,0x8d,0x27,0x60,0xb0,0x52, + 0x6c,0x8f,0xe3,0xbe,0x83,0x35,0xee,0xbb,0x53,0x7d,0xb8,0x8e,0xca,0x16,0xd1,0x5c, + 0x57,0xa9,0x83,0x75,0x47,0xcc,0x2,0x5e,0xff,0x2f,0xf7,0xd7,0x1c,0x4e,0xe9,0xbf, + 0x25,0x90,0x87,0xec,0xd8,0x67,0xfc,0x2,0xb4,0xf5,0x35,0x40,0x18,0x3e,0xc3,0x93, + 0x5e,0x9d,0xaa,0xaa,0xd6,0xac,0x76,0x1,0x85,0x7c,0xbf,0xf1,0xde,0x68,0x3c,0xfe, + 0xf7,0x3e,0x78,0x9f,0x40,0xd8,0x84,0x1e,0x3d,0xad,0xe,0xd7,0x1e,0x2e,0x91,0x78, + 0x37,0x12,0x8c,0x1c,0xae,0x7c,0x78,0xcf,0x3,0xe0,0x9f,0x45,0xd2,0xab,0x6,0xef, + 0x1a,0x0,0xbc,0x7e,0xdd,0xba,0x29,0xe5,0xe5,0x65,0x14,0xc8,0x1c,0x2b,0x61,0x88, + 0x30,0x7d,0xd6,0x6b,0xc0,0xa8,0x5d,0xb0,0x60,0x93,0xba,0xdc,0xbd,0x54,0xf9,0x18, + 0xa0,0x86,0x0,0xc7,0xa0,0xda,0xed,0xb3,0xbf,0x28,0xa8,0xb,0x50,0x94,0x29,0xba, + 0x48,0xc8,0x89,0x76,0x84,0xfe,0x3a,0x14,0x37,0xc7,0x44,0xe9,0x5e,0x1b,0x1,0x1b, + 0xef,0xc,0xda,0xee,0x64,0x50,0xee,0x96,0x80,0x98,0xb0,0x60,0x2a,0x17,0xb4,0xd7, + 0x65,0xd,0xce,0x24,0x60,0xa6,0xc6,0x25,0x53,0xae,0x2b,0xc5,0x82,0xa5,0x4e,0x3d, + 0x64,0xd8,0x21,0x18,0xe3,0xc7,0xfb,0xc6,0x9c,0x39,0x1a,0x80,0x6f,0x71,0xd6,0xcc, + 0xb7,0x5b,0x43,0x2d,0x77,0xb4,0x7a,0x5e,0x66,0xc8,0x4f,0x3f,0xf7,0x9c,0x1b,0xa3, + 0x94,0x78,0x74,0x45,0x16,0x8,0x2c,0xce,0x87,0xba,0x2,0xe2,0xec,0x6f,0xeb,0x7e, + 0x60,0xb5,0xb,0xb1,0x2a,0x74,0x8c,0xc6,0x12,0x79,0x14,0x25,0xe8,0x1d,0x8d,0x8e, + 0x78,0x1c,0x5d,0x43,0x7c,0x8c,0x6b,0xb8,0xd7,0x20,0xd6,0x33,0xc,0xa0,0xbe,0xa7, + 0x59,0x38,0xea,0xe0,0x8,0xd1,0x2e,0x8c,0xc8,0xc,0x3b,0x1f,0xa5,0xcb,0xde,0x46, + 0x7a,0x5f,0x88,0xcc,0x8d,0xe8,0x7a,0x94,0xd,0x9a,0x31,0x96,0xdc,0xa3,0x28,0x2c, + 0x25,0x85,0x78,0x34,0x6d,0x90,0x55,0xf5,0xc3,0x8f,0x90,0x31,0x9a,0x11,0xed,0x8e, + 0xa6,0x36,0xb0,0x9,0x3d,0x8f,0x1,0xe5,0x30,0x6,0xa,0xcd,0xa9,0xeb,0xd1,0x4e, + 0x49,0xb6,0x2e,0xae,0x59,0x84,0xe,0x31,0x30,0x7c,0x74,0xcd,0xd8,0x46,0xd1,0x3d, + 0xb4,0x1,0xcb,0x64,0xda,0x94,0xe1,0xb6,0x51,0x54,0x7,0x6d,0x41,0x7c,0x4c,0x6d, + 0x8d,0x1d,0xef,0xb6,0x6,0xc4,0x11,0xba,0x79,0xe8,0x8b,0xd1,0x1e,0xca,0xb1,0xcb, + 0x16,0xbb,0x52,0xa1,0x1c,0xc6,0x77,0xaf,0xbe,0x3f,0x91,0xf6,0x10,0x1e,0xeb,0xc6, + 0x2,0x5d,0x2d,0xc,0xa8,0x6e,0xb3,0x6e,0x66,0x2c,0x3a,0x46,0x3b,0xcf,0x4c,0x7c, + 0x91,0xac,0xb6,0xcd,0x9c,0x1a,0x8b,0x73,0xcc,0x5,0x44,0xe7,0xe3,0x28,0x5e,0xf5, + 0x28,0xb7,0x81,0x5,0x76,0x5c,0x82,0x55,0xb7,0x99,0x1f,0xf3,0xec,0x63,0xec,0x6e, + 0x52,0x1c,0xb6,0x13,0xa2,0x6d,0x58,0x46,0xf7,0x59,0x16,0x9c,0x4b,0x5,0x98,0x89, + 0xfb,0xcf,0xa7,0x23,0xcd,0xf5,0xc4,0x7d,0xe1,0x5,0xfb,0xe5,0xfb,0xe8,0xab,0x51, + 0xb3,0x7d,0x6c,0xa4,0xc0,0xe0,0xcb,0xa0,0xca,0x8c,0x74,0x85,0x0,0xd0,0x84,0x99, + 0x26,0xe0,0x8,0xd0,0x2d,0x2a,0x5b,0x99,0x2,0xca,0xe5,0x61,0x1b,0x5c,0xde,0x82, + 0xba,0x64,0x73,0x12,0xb8,0x3d,0xf1,0xb6,0x64,0xbb,0x2,0x68,0x65,0x3f,0x6,0x1c, + 0xd7,0x24,0xfd,0x55,0xac,0x16,0x47,0x63,0x39,0xbd,0xdc,0x5e,0x33,0xb0,0xd2,0x3d, + 0x5b,0x57,0x1e,0xdd,0x7d,0x8f,0x7d,0xaf,0xf1,0xf2,0x3d,0xc6,0x5c,0x99,0x88,0x92, + 0x97,0xb,0x63,0x32,0x29,0x7e,0x67,0x4b,0x6f,0x1e,0x3f,0xae,0x1b,0x4f,0x99,0xbd, + 0xc0,0xf1,0xff,0xd8,0xb1,0x77,0xbf,0x5a,0x52,0x52,0xa1,0x76,0xed,0xaf,0xa6,0xff, + 0x77,0xff,0x60,0x3f,0xb9,0xcd,0x49,0xbd,0xb7,0x99,0xaf,0xd5,0x9e,0x75,0x78,0xb8, + 0x18,0xc1,0xfd,0xe5,0x6e,0x21,0xe2,0x2f,0x7c,0xf0,0x3f,0x80,0xd1,0x17,0xee,0x4d, + 0x7c,0xf9,0x15,0x55,0x51,0x59,0xe9,0xa9,0xcb,0xc2,0x1d,0xe9,0xe4,0xb6,0xae,0x28, + 0x87,0x88,0x59,0x3f,0xfe,0xc9,0xe7,0x54,0xb6,0xe9,0x54,0x93,0xaa,0xa9,0x39,0x38, + 0x25,0xc4,0xb4,0x9f,0x65,0x72,0x7f,0x85,0x3a,0xc1,0x3d,0x99,0x24,0xd0,0x86,0x79, + 0x32,0x1,0xe1,0xb7,0x6e,0xdd,0x3a,0x76,0xf9,0x8a,0xa2,0xff,0xbc,0x6f,0xff,0x3e, + 0xfd,0x40,0x27,0xc9,0xe4,0x5b,0x82,0x29,0xf4,0x7e,0xbc,0x35,0x9d,0xcb,0xeb,0xea, + 0xb0,0xc7,0xe4,0x3c,0x61,0xb1,0x9,0xd8,0xf1,0xbd,0x4,0x3c,0xbb,0xa2,0xd7,0x3e, + 0xc0,0x6,0x20,0x17,0x30,0xed,0x10,0xc0,0x19,0xa8,0xa5,0x5e,0x99,0x17,0x7,0xa1, + 0xbe,0x39,0x1c,0x63,0xc8,0xb6,0x3b,0x32,0x59,0x75,0xda,0xf0,0xac,0x23,0x72,0x2f, + 0x64,0xe0,0x92,0xe1,0x76,0x84,0xb,0x90,0xc0,0x82,0xbb,0x33,0x0,0x62,0x96,0x1a, + 0x74,0x84,0xac,0x3f,0x22,0x5e,0xef,0xc,0x44,0xfb,0xf2,0x3e,0x7e,0xb8,0x47,0x8f, + 0xd7,0x93,0x91,0xd6,0x77,0x35,0x88,0x50,0xbc,0x67,0xe7,0x2f,0x6c,0x8e,0xce,0x6a, + 0xfa,0x96,0xdb,0x8,0x44,0x21,0xca,0x34,0x7a,0xe3,0x9c,0x27,0x6d,0xe8,0xc8,0x70, + 0x29,0xc3,0x7,0x14,0xc6,0x7a,0x1c,0xf2,0x10,0xc6,0x43,0x88,0x28,0x85,0x48,0x4f, + 0xb7,0x5a,0x40,0x44,0x80,0xa,0x88,0xb4,0x9f,0x7d,0xf1,0x45,0xda,0x37,0xf7,0xa6, + 0xdb,0x46,0xb9,0x58,0xca,0x88,0x38,0x5,0x91,0x32,0xc,0x8b,0xc,0xf0,0x8d,0xa2, + 0xed,0xa,0x61,0xb5,0xfb,0xca,0x6b,0xaf,0xb9,0x7d,0x83,0xe1,0x3f,0x7b,0x50,0xb3, + 0x37,0xe8,0x59,0x61,0x71,0xcd,0x7a,0x53,0xe,0x3c,0x1,0x17,0x27,0xa3,0x83,0x36, + 0x0,0x3e,0x59,0xd7,0x5,0x93,0x83,0x21,0x16,0x59,0x62,0x93,0xce,0xd3,0x6c,0x5c, + 0xff,0xa8,0x75,0x73,0xe2,0x7c,0x18,0x3b,0x41,0x37,0xd,0x4b,0xe9,0x71,0x1a,0xe4, + 0x1,0x78,0x18,0x23,0xc,0xae,0x10,0xf9,0xa,0xe3,0x80,0xff,0x2d,0x2,0x91,0xb0, + 0xfe,0x1a,0xba,0x5d,0x44,0xd3,0x82,0x61,0x15,0xbb,0x37,0xdd,0x6a,0xf7,0xe1,0x5, + 0x80,0x16,0x97,0x95,0x93,0x85,0x36,0x83,0x2b,0xb6,0xfe,0xc3,0x1c,0x52,0xc0,0xc, + 0x1b,0x8a,0xd2,0x4b,0xe4,0xf6,0x75,0x27,0x59,0x34,0x43,0x67,0xb,0xb0,0xbe,0xd9, + 0x46,0xe5,0x82,0x3b,0x11,0x42,0x60,0x62,0x9b,0x45,0x9e,0x27,0xe,0xc1,0x9,0x96, + 0x7b,0xf4,0xc4,0x71,0x3b,0xff,0x26,0x30,0x9,0xe6,0x1f,0x7a,0x68,0x2c,0x1a,0x78, + 0x1,0x80,0x20,0x23,0x10,0x65,0x3f,0x66,0x37,0x76,0xb8,0xd5,0xee,0x23,0xc,0x11, + 0x34,0xb6,0x3b,0x4,0xe8,0xc2,0x7d,0xea,0x3b,0xb7,0xdc,0x4a,0x3a,0x7f,0x7c,0x98, + 0xd3,0xae,0x7b,0xf1,0x0,0x36,0x69,0x2b,0xff,0x5c,0x76,0x30,0x9d,0x6e,0x3f,0x12, + 0x1c,0x3e,0xbe,0x50,0x73,0xbc,0x36,0x6d,0xba,0x9a,0x3e,0x7b,0x9e,0x3,0x47,0x62, + 0xbe,0x96,0xfd,0xca,0x6b,0x6,0x5b,0x6,0x68,0x99,0xef,0x40,0x3b,0xf8,0xe8,0x4b, + 0xe0,0x46,0x5b,0x0,0x6a,0xd9,0x96,0xab,0x6f,0x1,0xc6,0xb4,0xbf,0xda,0x3,0x64, + 0xb0,0xc3,0x50,0xaf,0xbb,0x3c,0x5,0xf2,0xab,0xd3,0xa0,0x5d,0xb9,0xc6,0x1,0x71, + 0xc2,0xa8,0x1,0x9c,0xeb,0x7c,0xb1,0x75,0xe5,0x9a,0xa8,0xa8,0xd9,0xe4,0x49,0x31, + 0xf6,0x5a,0xd7,0xb7,0x3,0xec,0x4a,0xbb,0x78,0xb0,0xe5,0x43,0x9,0x40,0xb8,0x98, + 0xe0,0xc5,0xc7,0xca,0x75,0x1b,0xc9,0xf,0x1d,0xea,0x16,0xbc,0x83,0xfb,0x6a,0xe, + 0x91,0x87,0x41,0x1e,0x9b,0x23,0xb4,0xb6,0xd2,0xfd,0x22,0x3b,0x3f,0x89,0xe4,0x21, + 0x5c,0x78,0x54,0x79,0xfa,0x72,0x69,0xec,0x25,0x17,0x38,0x32,0x71,0x50,0x90,0x49, + 0xaf,0xbe,0xa6,0xca,0x2b,0x2b,0x92,0x3d,0xc6,0x83,0x8d,0x68,0x62,0xf1,0xf6,0x3f, + 0xfa,0xf4,0x13,0xda,0x57,0xb8,0x4b,0x7f,0x9b,0x4e,0x34,0x9c,0xf8,0xcf,0x35,0x35, + 0x35,0xe3,0x42,0xac,0xb,0xf1,0x2e,0x86,0x7f,0x31,0xdc,0x2c,0x8,0xc0,0x75,0x75, + 0x75,0xae,0x70,0xec,0x3c,0x3c,0x86,0x49,0xde,0x7,0xf8,0xee,0xd9,0xb3,0xe7,0xdf, + 0x16,0x15,0x2d,0xfd,0x60,0xdb,0xf6,0x6d,0x14,0x1d,0x9,0x86,0x29,0x12,0x68,0x25, + 0xc0,0xb5,0x87,0xf9,0x5d,0x3e,0x13,0xed,0x88,0xdc,0x97,0x0,0x2c,0x99,0xb4,0x64, + 0xb7,0xc,0xf2,0x21,0x40,0x17,0x4c,0x1,0xe3,0xee,0xc,0xeb,0x49,0x30,0xec,0x4a, + 0xf7,0x17,0x2,0x9d,0x7f,0xed,0xb7,0x15,0xab,0xe3,0x19,0x97,0x75,0x77,0xa5,0x16, + 0x6,0x31,0xdd,0x32,0xf7,0x23,0x2d,0xc4,0x63,0xec,0x35,0x5c,0xa0,0xc4,0xc4,0xef, + 0xe1,0x98,0xfd,0x7e,0xd2,0xb,0x8,0xfc,0xb0,0x1,0x44,0x10,0x45,0xc3,0x0,0xb, + 0xa1,0x28,0x79,0x97,0x23,0x8a,0xa2,0x85,0x8,0x4f,0x9a,0xc5,0xc1,0x8f,0x17,0x56, + 0xd3,0x6c,0x68,0x15,0x95,0x10,0x84,0xfa,0x6a,0x9b,0xf,0x3d,0xf3,0x78,0xd,0x84, + 0x88,0xf2,0x4,0xeb,0x5e,0xb0,0x4c,0xb0,0xb9,0x5b,0x2d,0xab,0x83,0xdf,0x2d,0xac, + 0x91,0xa1,0xcf,0x9c,0x33,0x7f,0x81,0x35,0x76,0x1a,0x6b,0x3f,0xf6,0x95,0x64,0x75, + 0x8c,0x72,0xc,0xc0,0x0,0x2,0x18,0xc,0xc1,0x18,0xcb,0x0,0xf5,0x68,0x62,0x90, + 0x30,0x7a,0x2,0x10,0xce,0x98,0x3d,0xdb,0x45,0xca,0x42,0x1b,0x8,0xb9,0x8,0xc6, + 0xc7,0x46,0x54,0x0,0x1c,0xf8,0xdc,0x42,0x9f,0xc9,0x16,0xd1,0x58,0x64,0x80,0x11, + 0x2,0x84,0x0,0x8c,0xcc,0x3e,0x1,0x5c,0x88,0x24,0x5,0x9d,0x34,0x85,0xc4,0xb4, + 0xc6,0x50,0x68,0xb,0x56,0xdb,0xd0,0xbd,0x1e,0xd3,0xf3,0x2,0xbf,0xda,0x7b,0x1f, + 0x78,0x88,0x0,0xe,0x7d,0x62,0xd7,0x20,0xc4,0x84,0xc6,0x39,0xb9,0x37,0x21,0xbc, + 0xa4,0x6e,0xb,0xef,0x11,0x44,0xd3,0x7b,0x75,0x4a,0xac,0x9a,0x6f,0x27,0xf6,0x9, + 0x60,0x4,0x9b,0x36,0xe0,0x67,0x22,0x54,0xdd,0x66,0x3,0x65,0x0,0x14,0xb1,0x80, + 0xd8,0x77,0xb0,0x9a,0x16,0x18,0x58,0x38,0xf0,0x22,0x1,0x6e,0x43,0xcd,0x67,0xcf, + 0x50,0x9b,0xc6,0xba,0xdc,0xcc,0x9,0xdc,0xa5,0xe0,0x16,0x5,0x50,0x27,0xcb,0x66, + 0x3b,0x1f,0xf0,0x47,0xc6,0xae,0x4c,0xdc,0x17,0xe6,0x3,0xfb,0x2d,0x2f,0x5a,0xba, + 0xcc,0xfc,0x5f,0xac,0xb,0x13,0x9e,0x7,0xdb,0x23,0x22,0xb8,0xb,0xfe,0xb7,0x0, + 0x7f,0xcc,0x79,0x89,0x5e,0x2c,0xc0,0x18,0x2f,0x65,0x70,0xe7,0xb9,0xf4,0xf9,0x2e, + 0x7b,0xa9,0x0,0x36,0x31,0x76,0x1c,0x0,0xb4,0x61,0x32,0x27,0x89,0xf9,0x22,0xac, + 0xe4,0x72,0x1,0x88,0xe,0x20,0x2b,0x4,0xd8,0xa,0xf0,0xe4,0xfb,0x52,0x17,0x2c, + 0x81,0xb4,0xa8,0x7c,0xa5,0xd7,0xd6,0x72,0x5b,0xdf,0x30,0xb4,0x55,0x6a,0x19,0xb3, + 0x65,0x7,0xe8,0xab,0x1d,0x83,0x5e,0x6e,0x81,0xa3,0x28,0x0,0x67,0x66,0x76,0x9, + 0xe0,0xaf,0xe,0xc0,0x5e,0x18,0x75,0x31,0xa0,0xda,0xb6,0x96,0xbb,0xfb,0xab,0x1d, + 0x8,0x33,0x83,0x4d,0xda,0x61,0x40,0x66,0xb1,0xf2,0x1a,0x2,0x5c,0xc9,0x96,0x5d, + 0x9d,0xa,0x7f,0x11,0x80,0x6b,0xa,0x50,0x62,0x81,0x9d,0x9f,0x79,0x45,0xc0,0x50, + 0x31,0x97,0x3c,0xcf,0xd8,0x4c,0x61,0xfd,0xd6,0x6d,0x4,0xba,0xb4,0xe7,0xb7,0x5d, + 0x10,0x61,0x8b,0xd0,0x75,0x9b,0xdf,0xa4,0x39,0x72,0x62,0x72,0xd6,0xa7,0x7,0xc1, + 0x39,0xa4,0xf8,0x9d,0xc1,0xdd,0x18,0xac,0x55,0xf9,0x62,0x72,0x31,0xd7,0x5c,0x6, + 0x6e,0x4a,0xf0,0x15,0x5e,0xb9,0x6a,0x95,0x89,0xf2,0x27,0xa4,0x2e,0x7e,0xfc,0xfd, + 0x1e,0x17,0xe1,0x10,0xbf,0x19,0x0,0xf0,0x7,0x1f,0x7d,0x48,0xd2,0xda,0xba,0x23, + 0xb5,0xef,0x6b,0x10,0xfe,0xbd,0x2c,0xcc,0xcb,0x4a,0x85,0x30,0x92,0x93,0xfb,0x2b, + 0xd4,0xd0,0x8d,0xa4,0xda,0xda,0x5a,0x6a,0xf8,0xe0,0xc1,0x83,0xbf,0xb4,0x7c,0xf9, + 0xb2,0x93,0xeb,0x37,0xac,0x27,0xa3,0x2b,0x88,0x10,0x89,0xed,0x76,0x75,0x78,0x60, + 0xcb,0xec,0x57,0xb2,0xe0,0xb0,0x4c,0xc2,0x78,0xfd,0x3c,0x2,0xe0,0x9c,0x4,0xe4, + 0xce,0xa0,0x8d,0x8,0x40,0x77,0xc5,0x1,0xdd,0xf5,0x1f,0x0,0x7e,0x8a,0x11,0x47, + 0x52,0x67,0x0,0xfc,0x1d,0x11,0xf6,0x2c,0xc1,0x31,0xcd,0x8c,0x23,0xba,0xe9,0xee, + 0xb8,0x4b,0x56,0x4a,0x24,0x1f,0x2b,0x93,0x1,0xb0,0x1d,0x11,0xe6,0x9d,0x35,0x36, + 0xef,0xd9,0x2d,0xf0,0x76,0x4,0x2c,0x5c,0x8a,0xc7,0xc9,0xef,0x37,0xdf,0x4b,0xf3, + 0x8,0x51,0x5f,0xb5,0x35,0x1c,0x2,0x50,0x1c,0xd1,0xff,0x7f,0xb8,0x34,0x99,0x78, + 0xbe,0x3d,0x99,0xfa,0x75,0xa9,0xfb,0xd,0xf5,0xe3,0xf8,0x80,0x43,0xf4,0xa,0x90, + 0x81,0xc8,0x8,0x16,0xc5,0xec,0xdb,0xb,0x10,0x80,0x31,0x17,0x19,0x22,0xf5,0xf7, + 0x13,0x3b,0x64,0xf1,0x2e,0xee,0x81,0x19,0x23,0x82,0x14,0x5b,0x4d,0x23,0x81,0xbd, + 0x61,0x6c,0x66,0x7b,0xbd,0x31,0x4,0x1a,0x53,0xa6,0x4f,0x27,0x43,0x22,0x0,0x1c, + 0xc2,0x2f,0x72,0xcc,0x66,0x0,0xf,0xf4,0x97,0x26,0x88,0xc6,0x18,0x62,0x8d,0x70, + 0xa1,0xda,0x5f,0x73,0xd0,0xb0,0x56,0x4,0x2d,0xb1,0xa2,0x59,0x30,0xdf,0x9d,0x14, + 0xf,0x79,0x8c,0x3,0x26,0x6c,0x5f,0x88,0x71,0xe5,0x7,0x6,0x8,0xb4,0x69,0x6c, + 0x16,0x84,0xa1,0x37,0x85,0xe1,0x13,0x12,0xc6,0xc4,0x80,0x8a,0x3e,0xc0,0x3c,0xb1, + 0x20,0x20,0x46,0x69,0xdb,0x87,0xdf,0x33,0x9e,0x1f,0xcf,0x8a,0x45,0x1,0x3f,0x27, + 0xc0,0x7c,0xae,0x5e,0xe0,0x60,0x87,0x26,0x5e,0x24,0x18,0x37,0xa0,0x71,0x36,0xcc, + 0xa5,0x61,0xc1,0x28,0x8f,0x1d,0x92,0xb0,0x61,0x83,0x11,0x73,0x8f,0x77,0x3e,0xc8, + 0x70,0x81,0x82,0xf5,0x73,0x22,0xc6,0x37,0xb1,0xa7,0x1,0x9a,0xb0,0x62,0x66,0xb1, + 0x38,0x16,0x26,0x1b,0xb6,0x6c,0x71,0x11,0xb4,0x6e,0xb3,0xe2,0x65,0xe8,0x82,0xb1, + 0xf8,0x80,0x88,0x9b,0x5d,0x9d,0x0,0xf4,0xb4,0x33,0xd,0x36,0xec,0xd0,0x73,0xb, + 0x3f,0xe5,0xff,0xf0,0xdd,0x9b,0x88,0xad,0x3b,0x0,0x8e,0x85,0x97,0xed,0x9,0xe2, + 0xb4,0x17,0xa,0x92,0x13,0x82,0xb6,0xf0,0x43,0x6f,0x6e,0x39,0x4d,0x3e,0xa2,0x53, + 0xa6,0xcf,0x72,0xa0,0x6,0xe0,0xe4,0xe4,0x3,0xa8,0x60,0xc2,0x28,0xc7,0x60,0x29, + 0xee,0x2f,0x2b,0xab,0x74,0xf5,0x24,0x93,0x2e,0x16,0x62,0x67,0x5c,0xb3,0xa8,0x38, + 0xb3,0x2d,0x5b,0x47,0x82,0xb7,0x4,0x61,0x99,0xe7,0xd8,0x32,0xdf,0xa3,0x3c,0xd3, + 0x26,0xc0,0xb2,0x48,0x0,0x21,0x1,0x6c,0xe5,0x1a,0xc7,0x5e,0x8b,0xdc,0xc2,0x60, + 0x35,0x81,0x2d,0x83,0x2a,0xc4,0xcb,0xcb,0x2b,0x56,0x7b,0x22,0x6b,0x6,0x69,0x53, + 0xc7,0x94,0x77,0x62,0x6a,0xb,0xe8,0x45,0x8e,0xf9,0x26,0xac,0x53,0x8e,0x2f,0xd4, + 0x85,0x23,0x1f,0x20,0xbc,0x6b,0xdf,0x1,0x11,0x2a,0xb7,0x5b,0x6d,0xd9,0xb1,0x8b, + 0xf2,0xe5,0x22,0x47,0x32,0xd9,0x64,0xa1,0xb2,0xca,0xd3,0xa9,0x7b,0x73,0x12,0xa8, + 0xb,0xa2,0x6,0x6e,0x56,0x47,0xc,0x10,0x5e,0xbb,0x7e,0x9d,0x88,0x8e,0xd6,0x1d, + 0x8d,0x1a,0xc8,0x2a,0xe,0x30,0xf6,0xcf,0x7e,0xf2,0x63,0xda,0xc8,0x4,0xae,0x94, + 0x87,0xe,0x1f,0x6a,0x39,0x7c,0xf8,0xd0,0xaf,0xfc,0xac,0x70,0x92,0x93,0x7,0xc0, + 0x0,0x4f,0x99,0x42,0x60,0x1d,0x49,0xe2,0xf2,0x65,0x65,0xa5,0xab,0x2a,0x57,0x56, + 0x92,0xd1,0x15,0x5e,0x2,0x18,0x5d,0xc5,0xc0,0x35,0x64,0xc2,0x52,0x2c,0xed,0xc0, + 0xb9,0xab,0xc3,0x67,0xcb,0x16,0xc8,0xdb,0x62,0xe2,0xeb,0xce,0xa4,0x7d,0xb6,0x80, + 0xe,0xcb,0x30,0x70,0x71,0x59,0x66,0xc8,0x54,0x2e,0x57,0x0,0x64,0x63,0xac,0x3b, + 0x2,0xfe,0xa1,0x55,0x77,0x8c,0xe1,0x16,0x2,0x60,0x9f,0x8d,0xfa,0xec,0xb5,0x33, + 0xa6,0x83,0xe,0xf4,0xdd,0x5,0x17,0xe,0x21,0xbb,0xed,0xf6,0xeb,0xe2,0xf9,0xf8, + 0xe8,0x1,0x7a,0x77,0xc2,0x8e,0xc3,0x39,0xf0,0x9e,0xc5,0xee,0x60,0xe5,0xc5,0x72, + 0x16,0x2e,0x59,0x1d,0x5,0x25,0xb,0x9d,0xd1,0xc5,0x2,0x5b,0x5a,0x23,0x34,0x22, + 0x18,0xd6,0x3a,0x1b,0x58,0x82,0xd9,0x1b,0x3e,0xfe,0x0,0x53,0xfc,0x1e,0x20,0xe6, + 0x2,0xa8,0xb2,0xeb,0x10,0x80,0xe,0x80,0xf8,0x30,0x6d,0xd8,0x60,0x0,0x15,0x3a, + 0x64,0x88,0x93,0x27,0xd8,0x8d,0xe7,0x6f,0xb5,0x20,0xe,0xc6,0x9,0x71,0x30,0x58, + 0x3a,0x6f,0xc3,0x7,0x10,0x2,0x0,0x2,0xc,0xa1,0xbf,0x35,0x60,0x77,0x9b,0x9a, + 0x39,0x67,0xae,0x7e,0x81,0xbb,0xa9,0x4f,0xda,0x94,0xc1,0x8a,0x8d,0x11,0x69,0x8a, + 0xd9,0xb6,0x1,0xbc,0x51,0x14,0x49,0xa,0x22,0x5f,0x0,0x11,0xfc,0x8e,0x99,0x89, + 0x9b,0x68,0x51,0xe7,0x68,0x55,0xe,0x70,0x2,0x3b,0xe6,0x7b,0x70,0x23,0x2,0xd3, + 0xa7,0xb6,0xad,0x1e,0x1a,0x6d,0x81,0x91,0xb6,0x5e,0xb8,0x40,0xcc,0x1b,0xe2,0x6c, + 0x6,0x45,0x0,0x3d,0x62,0x2f,0x83,0xa9,0x7e,0xcf,0x8a,0xdf,0x39,0xbe,0x34,0xc6, + 0x6d,0x18,0xb0,0x89,0x76,0x5,0x90,0x5d,0x6f,0x77,0x3c,0x4a,0xf6,0x33,0xbe,0x87, + 0x8c,0xae,0xb0,0xf0,0x30,0xe2,0x6b,0xe3,0xcf,0xc,0xf1,0x37,0xc4,0xd2,0x8,0xd2, + 0xc1,0xa2,0x7a,0xe4,0x3,0x80,0x11,0xb,0x9b,0x5c,0x92,0xac,0x2e,0x1c,0x8b,0x14, + 0xb8,0x9e,0xdd,0x64,0xfd,0xb0,0x1,0xe4,0x10,0x4b,0xf,0x58,0x3f,0x6b,0x3c,0xff, + 0x8b,0xaf,0xbc,0xa2,0xfe,0xe2,0x7b,0x37,0x13,0x83,0x66,0x9f,0xf1,0x94,0xef,0xbd, + 0xf0,0x63,0x4f,0x5,0xd6,0xe9,0x9,0x3c,0x2,0x44,0x10,0x99,0x4e,0xc1,0xa6,0x1, + 0xf8,0xf8,0xcd,0xcc,0x78,0xe3,0xd,0xf5,0xea,0xb4,0x99,0xe,0xe8,0xe8,0xc3,0x5e, + 0x99,0xe8,0x73,0x39,0x81,0x89,0x15,0x85,0x6c,0x56,0xd4,0x21,0x66,0x2c,0x0,0xbb, + 0x48,0x82,0x36,0x83,0x6c,0xf9,0xca,0x14,0x38,0x98,0xba,0x55,0x69,0xa0,0x17,0x86, + 0x5f,0x92,0x25,0x9b,0xba,0x9,0xd8,0x32,0xf8,0x15,0x49,0x36,0x2d,0xc0,0xd6,0x33, + 0xe4,0xf2,0x8c,0xbb,0xd6,0x3a,0xd1,0x72,0xd2,0xde,0x6a,0x2,0x6e,0x4a,0x15,0xcc, + 0x94,0x93,0x7b,0x46,0xf4,0x6c,0x18,0xf1,0xa,0x2e,0x5b,0x51,0xe5,0x80,0x98,0xd9, + 0x76,0xb2,0x90,0x49,0x2f,0x1c,0x24,0x53,0x95,0xcf,0x56,0x7b,0xac,0x3e,0x71,0x3b, + 0xd3,0xe0,0x57,0x53,0x77,0xc4,0xce,0x99,0xbf,0x90,0x89,0xe9,0xe1,0xbd,0x5,0x4b, + 0x4,0x70,0x3d,0x31,0x7d,0x65,0x0,0xce,0x42,0x2c,0xe,0xc3,0xac,0xcd,0x5b,0xb7, + 0x38,0x17,0xa4,0x5c,0x60,0x65,0x2f,0xe3,0xf,0xe0,0xb7,0x5,0x8b,0xe8,0xcf,0x7e, + 0xf2,0x39,0x6d,0xfa,0x80,0x9d,0xb1,0xaa,0xab,0xf,0xac,0x3a,0x7c,0xf8,0xb0,0x87, + 0x87,0x59,0xe7,0x21,0x26,0x66,0xe1,0xa5,0xfb,0x43,0xc3,0x23,0x1,0x58,0x2e,0x17, + 0x96,0xe7,0x6b,0xb0,0xdf,0xd,0x1b,0xd6,0xdf,0x5b,0xb4,0x7c,0xd9,0x7f,0xdd,0x7f, + 0x60,0xbf,0x6a,0xb4,0x7a,0x5f,0x9,0xaa,0x5e,0xb2,0x0,0x98,0x0,0x74,0x5a,0x37, + 0x2c,0x41,0x35,0xd4,0x19,0xb7,0x75,0xb6,0x27,0x79,0xc1,0x7,0x3d,0x6c,0x3,0x65, + 0x25,0x80,0xb7,0x7,0xe0,0xc9,0x65,0xdb,0x4,0x1b,0x96,0x7d,0x87,0x6c,0x59,0x8a, + 0x98,0x43,0x6,0x1f,0xe6,0x65,0x81,0x63,0x8c,0xb9,0x7a,0x22,0x5f,0x3b,0xe,0xd6, + 0xd7,0xa6,0x59,0xaf,0xf,0x7e,0xa1,0x41,0x58,0x26,0x4b,0x17,0xcf,0xed,0xa4,0x9, + 0xc1,0xc2,0x25,0xc6,0xfa,0xe5,0xa2,0x21,0xf5,0x7c,0x22,0xb5,0x47,0xc5,0xea,0x69, + 0x57,0x2f,0x39,0xde,0x2c,0x7d,0x3e,0x89,0xa0,0x35,0x50,0x41,0x47,0xb,0x70,0x83, + 0xf5,0x2d,0xc7,0x40,0x6,0x28,0x0,0x8,0xb0,0x5d,0xde,0x7c,0xd,0x12,0x66,0xcf, + 0xda,0xc4,0x88,0x8,0xc0,0xc0,0x5b,0x16,0x32,0xa0,0x2,0x78,0xc1,0x72,0xb1,0xe1, + 0x1,0x5,0xbc,0xb0,0x41,0x39,0xc0,0x4e,0x1,0x96,0x60,0xcc,0xcc,0x96,0xd1,0x3e, + 0x40,0x15,0xa1,0x36,0x9d,0x68,0x15,0x1b,0xd,0x6c,0xde,0x4c,0x71,0x8d,0xe1,0x66, + 0xf3,0xc8,0x13,0x4f,0x3a,0x66,0xc,0x86,0xc7,0xbb,0x31,0x31,0xb,0x84,0x78,0x1c, + 0x61,0x31,0xe1,0x42,0x5,0x9f,0x59,0xf2,0x2d,0x6,0x9b,0x9d,0xf0,0x2c,0x89,0x67, + 0xc1,0x68,0xe1,0xe,0xc5,0x80,0x8a,0xb6,0x20,0xd6,0x46,0x8,0x4d,0x88,0xbd,0x25, + 0x9b,0xc6,0x8e,0x44,0xac,0x37,0x7e,0x49,0x83,0x23,0x3,0x30,0x9e,0x19,0x6e,0x59, + 0x78,0xde,0x5b,0x58,0xf7,0xcc,0x2c,0x78,0x4c,0xc2,0x7e,0xb1,0x9,0x5,0x74,0xf6, + 0x58,0x6c,0x24,0xbe,0xba,0xa3,0xc9,0x20,0xd,0xb,0x0,0x16,0x33,0x23,0x1f,0xfa, + 0x5d,0xcc,0x27,0x98,0xf9,0xc4,0xc9,0xaf,0xb8,0xed,0x11,0x21,0x56,0x5e,0xb5,0x76, + 0xad,0x1,0x78,0x5b,0x16,0x52,0x0,0xcc,0xe9,0xeb,0x9a,0x6d,0xb2,0x94,0x1,0x73, + 0xb,0x51,0x7f,0xce,0x6e,0x54,0x82,0x50,0x9c,0xf,0xe9,0x7e,0x60,0x48,0x87,0xb0, + 0xa1,0xcc,0x80,0x53,0xc1,0x67,0x32,0x22,0xdd,0xb1,0x7f,0x7b,0x87,0xf4,0x73,0xef, + 0x89,0xf8,0xd2,0xeb,0xf,0x3c,0xbe,0x39,0x8b,0x96,0x2c,0x51,0x2f,0x4f,0x9d,0xe6, + 0x0,0xd0,0x1,0xae,0x60,0xbf,0x3e,0xa0,0xac,0xf4,0xc,0xad,0x62,0xe5,0x64,0x99, + 0x22,0x7b,0xed,0xf2,0xca,0x13,0xa0,0x76,0x62,0xec,0x40,0xdf,0xcc,0x60,0x9e,0xb4, + 0xb1,0xd2,0x67,0xc1,0x16,0x70,0x8a,0xe4,0x82,0xc1,0x63,0xe1,0x55,0xa9,0xe4,0x44, + 0xce,0x56,0xb4,0x5c,0x6c,0x41,0xd4,0x84,0xa2,0x5c,0x67,0xc0,0xd8,0xa6,0xd2,0xaa, + 0xf5,0x94,0xd8,0xca,0x99,0x99,0xee,0x72,0x27,0x6e,0x16,0xc6,0x5a,0xc,0xd0,0xe5, + 0x55,0xe,0x90,0x93,0x7b,0xbe,0x48,0x7c,0xb9,0x98,0x47,0x29,0x1d,0xc0,0xf8,0xf7, + 0x54,0xd7,0x38,0xc3,0x27,0x84,0x39,0xe5,0x90,0xb5,0x30,0xc6,0x2a,0x12,0x8b,0x1d, + 0x5f,0x5c,0x1f,0x2c,0x4c,0x44,0x7f,0xce,0x62,0xbd,0xc2,0xd7,0xd7,0x1b,0x9,0x86, + 0xaf,0x8f,0xe7,0xfb,0xbc,0xfb,0x12,0xf6,0x1c,0xdf,0xb5,0x67,0xb7,0xd,0x77,0xdb, + 0x13,0xf5,0x27,0x77,0xb,0x3a,0xfd,0x3b,0x43,0x94,0xac,0x1f,0xfd,0xf8,0x33,0xca, + 0x3f,0xde,0x70,0xfc,0xbf,0x55,0x57,0x57,0xdf,0x53,0x8,0xb,0xb,0xe5,0xc5,0xce, + 0x3d,0x0,0xfe,0xb2,0x9,0x48,0xbf,0x6b,0xd7,0xae,0xdf,0x5e,0xbc,0x78,0x11,0xe9, + 0x7d,0x79,0x6b,0x41,0x6,0xc2,0x36,0x1,0x82,0xee,0xd8,0xd1,0xee,0x81,0x2c,0x97, + 0x75,0x8c,0x34,0x60,0xa8,0x4,0x9c,0x1,0x8,0x33,0x98,0x72,0x1f,0x1e,0x70,0xcb, + 0x72,0x91,0xfc,0xb6,0x90,0x6d,0x47,0xae,0x31,0x46,0x9f,0x91,0xb,0x90,0x16,0x80, + 0x15,0x3,0xb6,0x2c,0xf1,0x79,0xdc,0x0,0xcb,0xd7,0xb5,0x4a,0xd0,0xcd,0xb4,0xa8, + 0x66,0x40,0x66,0xb0,0xe,0xfa,0xc0,0xf,0x89,0xe7,0x2f,0x1c,0x67,0x47,0x20,0xee, + 0x4e,0xc4,0xf0,0x19,0x6,0x6c,0xa1,0xe,0x3c,0xd4,0xe3,0x77,0xa6,0xc5,0xfe,0x9e, + 0xf4,0x21,0x97,0x6,0xdb,0xf6,0x2,0x62,0x7d,0xe9,0xca,0x5,0x15,0x6,0xc0,0x1, + 0xc1,0x2e,0x0,0x7c,0x60,0xa8,0xd0,0x45,0xc2,0xa2,0x16,0x0,0x5,0x71,0x28,0x98, + 0x1e,0x0,0xe,0xc1,0x3d,0x0,0x96,0x60,0xb5,0x0,0x20,0x88,0x80,0xa1,0x77,0x44, + 0x1e,0xca,0x3,0xbc,0xb1,0x81,0x2,0x2c,0x79,0xa9,0xac,0x2e,0x7,0x37,0x2a,0x18, + 0x40,0x81,0x9,0xc2,0x8a,0x97,0x3,0x75,0xa0,0x3c,0x8c,0xbd,0x10,0x1,0xeb,0x2f, + 0x6f,0xba,0xd9,0xe4,0xe9,0x7b,0x0,0x2c,0x9c,0x9b,0x4d,0xe,0x46,0xdb,0xb1,0xdc, + 0x42,0xd7,0xc6,0x1a,0xfb,0x36,0x62,0x80,0xc8,0x7b,0x80,0x62,0x3d,0xdf,0x41,0xe2, + 0x58,0x16,0x8b,0x73,0x90,0xb,0x8c,0x17,0xc6,0x50,0x60,0xd9,0xd0,0x6b,0x9b,0x7e, + 0x6f,0x25,0x60,0x43,0x8,0x4d,0x3c,0x17,0xca,0x3,0x3c,0xd1,0x16,0xc0,0xf,0xcf, + 0xc4,0xfb,0x1,0xa3,0x2c,0xf7,0x5,0xf0,0xc5,0x39,0x40,0x9f,0x9e,0xc9,0x26,0x93, + 0x77,0x3b,0x31,0x4f,0x8c,0xd,0x7d,0xa2,0xd,0x3c,0xf,0xea,0xf1,0xc2,0x2,0x80, + 0xcb,0x79,0xa8,0x87,0x73,0x88,0xbc,0xc1,0xaa,0xb9,0x1d,0x4e,0xd0,0x75,0x63,0x3c, + 0xd4,0x17,0xb5,0x71,0x3b,0xcd,0x27,0x74,0xf4,0x66,0x4c,0xb7,0xd3,0x33,0x42,0x24, + 0x8f,0xfa,0x78,0x76,0xe,0x90,0x2,0x11,0x34,0xb6,0xb1,0x24,0x43,0x3c,0xb,0xa6, + 0x72,0x31,0x26,0xfd,0xdb,0x43,0xc3,0xbc,0xce,0xc0,0x15,0x4f,0xe6,0xb1,0xf4,0x5, + 0xf7,0x56,0x94,0x14,0x6b,0xb6,0xff,0x2a,0x5,0xd9,0x60,0x20,0xc3,0xb9,0x4,0x4b, + 0xce,0x83,0x58,0xd9,0x3,0xd5,0x32,0xc9,0x74,0x57,0x7a,0xd7,0x61,0x9e,0x63,0xb9, + 0x1,0x38,0xfb,0xf9,0xab,0xd2,0x60,0x2c,0x40,0x4b,0xb2,0xe4,0x22,0x2e,0x6f,0xc5, + 0xcc,0x49,0xfd,0xaa,0x34,0x3b,0xae,0x60,0x16,0xbc,0xc6,0xb1,0xd7,0x45,0xcb,0xcb, + 0xd4,0xcc,0xf9,0x8b,0xd5,0xe4,0xd7,0x67,0xaa,0x67,0x5f,0x7c,0x45,0x3d,0xfd,0xfc, + 0x4b,0x7a,0xa1,0xf7,0xbc,0xfe,0x3f,0xbe,0xa0,0x9e,0x7a,0xee,0x45,0xba,0x7e,0xf1, + 0xd5,0xd7,0xd5,0xeb,0xb3,0xe6,0xab,0x45,0x2b,0xca,0xa9,0xe,0x83,0x74,0xc2,0x88, + 0x13,0x50,0x96,0xc,0x59,0x82,0x3d,0x8f,0x27,0x7c,0x96,0x4,0x7c,0xab,0xf4,0xdc, + 0xae,0x54,0x9b,0xb7,0xef,0x74,0x76,0x22,0x50,0xa7,0xac,0x5a,0xb7,0x91,0xd4,0x36, + 0x14,0x89,0x4c,0xff,0xbf,0xd6,0x6f,0xd9,0x66,0xa4,0xf,0x76,0xee,0xa5,0xe,0x37, + 0x5,0xc2,0xa2,0x6d,0xd6,0x33,0x17,0x5,0xa2,0xe8,0x28,0x68,0xdb,0xff,0x5,0xf4, + 0xda,0x8b,0x8b,0xcb,0xd4,0x24,0xbd,0x98,0xac,0x3b,0x7a,0xc4,0xe9,0xa4,0xbd,0xd8, + 0x6,0xa1,0x2d,0x82,0x4e,0x30,0xca,0xfa,0xf0,0xe3,0x8f,0x48,0x1f,0x5c,0x5b,0x57, + 0x7b,0x5d,0x83,0xf0,0x6f,0xfd,0x2c,0xf0,0xd2,0x3,0xe0,0x43,0x87,0xe,0x51,0x42, + 0x66,0xa1,0xa3,0x4c,0xdc,0x8,0xce,0x81,0xe8,0x7,0xf,0x1e,0xfc,0xca,0xd2,0xa5, + 0x4b,0xea,0xaa,0xd6,0x54,0xd1,0x3,0x22,0xd8,0x6,0x83,0x57,0x9b,0x5,0xb2,0xe4, + 0xba,0xdd,0x3,0xbb,0x36,0xf,0x14,0xdb,0x7d,0x56,0x2c,0x44,0xce,0x21,0x48,0x72, + 0xdd,0x28,0xc8,0x76,0xf9,0x60,0x9e,0x2,0xd2,0x80,0x89,0x7b,0x80,0x1e,0x3,0xf9, + 0x90,0xd,0xe7,0x4,0x3,0xef,0xea,0x48,0x59,0x70,0x67,0x81,0x4a,0xd4,0x5,0xa9, + 0xbb,0x2b,0x15,0xe5,0x2b,0x1d,0x44,0x23,0xe7,0x19,0x42,0x15,0xb2,0xb6,0x66,0x86, + 0xea,0x19,0x8b,0x75,0x65,0xeb,0xa9,0xbd,0x5,0x4f,0x64,0xec,0xfc,0xbf,0x48,0xe9, + 0xcb,0x6d,0x79,0xdf,0x42,0x3c,0xa2,0x1f,0x17,0xf3,0x18,0xd3,0x33,0x47,0x8d,0xeb, + 0xc4,0x3d,0xe8,0x90,0xb1,0xe3,0xd2,0xe2,0x65,0xcb,0x68,0xc3,0x82,0x5,0x1a,0x84, + 0x11,0x23,0x19,0x9,0x7a,0xcf,0x85,0x3a,0xf,0x5b,0xf4,0xe1,0xfe,0xa2,0xa5,0x4b, + 0xcd,0x51,0x27,0x2e,0xf,0x9d,0x31,0xce,0x61,0x28,0xc6,0x65,0x21,0xce,0x6,0x3b, + 0x45,0xf9,0x45,0xb6,0x1e,0xb5,0xa5,0x8f,0x4b,0x6c,0xdb,0x7c,0x5c,0x64,0xf3,0x20, + 0x42,0x46,0x5b,0xd4,0xa6,0xe8,0x9f,0xfb,0x5b,0x62,0xaf,0x29,0x4f,0x9f,0x73,0xfb, + 0xb,0x74,0x7f,0x68,0x17,0xfd,0x73,0x3b,0xe8,0x1f,0x69,0x21,0x3d,0xcf,0x62,0xaa, + 0x83,0xf2,0xfc,0xc,0x60,0xf4,0xe8,0xc7,0x8c,0xcd,0xf4,0xb1,0xd8,0x8e,0x8f,0xfb, + 0x44,0xf9,0x85,0xfc,0xbc,0x4b,0xcd,0xf3,0xa1,0x6d,0xe4,0x2f,0xb1,0xfd,0x2f,0xb6, + 0xe3,0xc2,0xbd,0xa5,0xd4,0xef,0x52,0xfb,0x6c,0xcb,0x29,0x71,0xbb,0xc8,0x5b,0x26, + 0xca,0xd3,0xf3,0xd9,0xb9,0x5d,0x6c,0xeb,0x23,0xfc,0x28,0x8d,0x9d,0xdb,0x44,0x79, + 0x5b,0xe,0xff,0x13,0xd3,0x66,0x11,0xcd,0x11,0xcf,0x1,0xff,0xbf,0x16,0xda,0x7e, + 0x71,0xd,0x5f,0x6b,0x30,0xa2,0x4c,0x5f,0x78,0xc1,0x72,0x3b,0x42,0xdf,0xfc,0xee, + 0x2e,0x17,0x83,0x5d,0xd6,0x65,0x1f,0x61,0xec,0x90,0xf3,0xc2,0xa4,0xc9,0xb4,0x63, + 0x8e,0x64,0x9e,0xcc,0x38,0x1,0xb8,0xac,0xcb,0x65,0x30,0x75,0xc7,0x80,0x25,0xf3, + 0xc7,0xdb,0x88,0xa9,0x2b,0x3d,0x1d,0xb0,0x6c,0x8f,0xcb,0x38,0x6,0x5c,0x9e,0xd4, + 0x9,0xc1,0xdd,0xef,0x67,0x95,0x3,0x12,0x29,0xde,0x96,0xf9,0x2c,0xee,0x35,0x80, + 0x6e,0xf5,0xbf,0x16,0x8c,0x1,0x9c,0xb,0x35,0xe8,0xbe,0x32,0xed,0xd,0xd,0xb0, + 0x13,0xd5,0xd3,0xcf,0xbe,0xa0,0x5e,0x9f,0x31,0x53,0x95,0x96,0x57,0xa8,0xad,0xdb, + 0xb6,0xa9,0xfd,0xd5,0xd5,0xce,0x27,0x9b,0xec,0x32,0x76,0xed,0x56,0x2b,0xab,0x56, + 0xab,0x19,0xb3,0x66,0xab,0x67,0x9e,0x7f,0x51,0x3d,0xf2,0xc4,0x4,0xf5,0xc2,0xe4, + 0xd7,0xd4,0xbc,0x25,0xc5,0x8e,0x25,0x4b,0xe6,0x2b,0xc5,0xd6,0x1e,0xf8,0xa6,0x16, + 0x8,0xfe,0x2,0x3,0xb,0x9b,0xd5,0x1b,0x36,0x93,0x61,0x24,0x80,0xee,0x62,0x5b, + 0x1b,0x5d,0x2f,0xd6,0xa0,0x8f,0x0,0x1d,0x90,0xee,0x40,0x2,0x82,0xe3,0x5a,0x6b, + 0x8c,0xc5,0x6d,0x39,0xe9,0x83,0x9d,0xa3,0x15,0x42,0xb4,0xec,0x1,0x7d,0x65,0x20, + 0x5d,0x28,0xf7,0xf5,0xc6,0x29,0xe0,0xd6,0x47,0x58,0x47,0x2f,0x2c,0x2a,0x56,0xaf, + 0x20,0x26,0xfc,0xc9,0x26,0x63,0x10,0xda,0x23,0xb6,0x6e,0xe5,0x48,0x6b,0x42,0x75, + 0x86,0xc5,0xc3,0x67,0x9f,0xff,0x98,0x22,0x66,0x9d,0x3d,0x77,0x16,0xa2,0xe8,0xa3, + 0x35,0x35,0x35,0x3f,0x27,0xb1,0x31,0x76,0x1e,0xc3,0xcb,0xf0,0xe8,0xfe,0x74,0x83, + 0x94,0x89,0x63,0x2c,0x71,0x23,0xb2,0x9c,0x2c,0x8f,0xc6,0x2a,0x2b,0x2b,0x26,0x2d, + 0x5f,0x5e,0xa4,0xe,0x1c,0xac,0x56,0x27,0x9b,0x4f,0x91,0x3e,0xce,0x7,0xdd,0xe, + 0x8f,0x71,0xa6,0x81,0xb4,0x3d,0x5,0x94,0xf2,0x3c,0x64,0xa7,0x6d,0x81,0x2e,0x38, + 0x5,0xe8,0x16,0x38,0x52,0xc0,0x1d,0x82,0x65,0x81,0x7e,0xc2,0x3e,0x43,0x70,0xf, + 0x75,0xcc,0xb2,0xfd,0xb4,0xaf,0x73,0x57,0x34,0x2a,0x56,0x67,0xb0,0xdb,0x92,0x27, + 0xe,0xe9,0xed,0x8e,0xba,0x67,0x74,0x45,0xdc,0x82,0x62,0xfa,0xd5,0xf6,0x10,0x4, + 0x23,0x2e,0x60,0xa1,0x3a,0x20,0xd4,0xb9,0x47,0x5d,0xbe,0xd8,0x4d,0x2c,0xe2,0x42, + 0x96,0x6e,0xb7,0x23,0x2d,0x11,0x8,0x17,0x4d,0xb9,0xce,0xa8,0x95,0xba,0x4,0xec, + 0x9c,0xb5,0x6a,0x95,0xdb,0xc8,0x71,0xb8,0xb9,0x64,0x5f,0x58,0x8e,0x72,0xd3,0xe3, + 0x6d,0xc0,0x2e,0xe3,0x55,0x9b,0x6b,0x53,0xc6,0x85,0xab,0xcb,0x7,0xe5,0x44,0xfc, + 0x58,0x97,0xfa,0x45,0x4c,0xd9,0x3c,0xe2,0x9,0x8b,0xb1,0xf4,0xf7,0xc5,0xeb,0xe4, + 0xfb,0x52,0xe3,0xe4,0xfe,0x4d,0xec,0xec,0x3e,0x2f,0xa4,0x27,0x47,0xee,0x49,0xe5, + 0x7,0x7b,0xd9,0xc6,0xfa,0x30,0x63,0xa,0xfb,0xf1,0xf7,0xbc,0x75,0x79,0x3,0xf9, + 0xe8,0x3d,0x59,0x3f,0xd9,0x45,0x26,0x79,0x76,0xd4,0xeb,0xb3,0xd7,0xa9,0xf1,0x85, + 0xf5,0xf2,0xe6,0xf9,0xe4,0x16,0x71,0x1c,0xda,0xd4,0xec,0x9f,0x1d,0x73,0xb1,0x13, + 0x92,0x9f,0x5c,0x67,0x60,0x15,0x9f,0x4b,0x5b,0xf7,0x7,0x2e,0x71,0xfb,0xe,0xec, + 0x27,0xc6,0x3d,0x7f,0xe9,0xa,0x7,0x4,0x8e,0xfd,0x4a,0x10,0x14,0xc,0xd8,0x3, + 0x5d,0x9,0xb6,0x82,0x31,0xf3,0x7,0x3e,0x69,0x27,0xe,0xdc,0x12,0xec,0x1d,0x98, + 0x96,0x45,0x58,0xb4,0x37,0x96,0x84,0x5,0xfb,0x65,0xd,0xd0,0x2e,0x63,0x86,0x4c, + 0xf7,0x57,0x19,0xbd,0xae,0x4e,0x73,0x97,0xac,0xd0,0x2c,0x77,0xb2,0x9a,0xf0,0xdc, + 0xb,0xb4,0x38,0x82,0xaa,0xe5,0x52,0x7b,0x3b,0xc5,0x32,0xe7,0xd4,0xdb,0x6f,0xb6, + 0xc4,0xec,0xee,0xcb,0xdb,0xad,0x39,0xb1,0xb,0xd6,0x15,0x17,0x87,0xbc,0xf1,0xe4, + 0x29,0x55,0x5e,0xb9,0x52,0xbd,0xf0,0xd2,0x64,0xf5,0xe4,0xb3,0x13,0xd5,0x8c,0x79, + 0x8b,0x9,0x74,0x4b,0x56,0xae,0xd3,0x7d,0x57,0x39,0x16,0x5c,0x44,0x63,0x9,0x19, + 0x70,0x0,0xc2,0x82,0xc5,0x97,0x55,0xad,0x55,0x4d,0xc4,0x74,0xfb,0xe8,0xdb,0xba, + 0xf1,0xcd,0x1d,0xce,0xe8,0x6a,0x69,0x49,0x5,0x19,0x61,0xe1,0xfd,0x26,0xff,0xec, + 0x53,0xa7,0x74,0x7f,0xab,0x9d,0x11,0x9c,0x4,0xcf,0xd8,0xdc,0x49,0x9d,0x38,0x8b, + 0xfd,0xdd,0x22,0x25,0x90,0x54,0x84,0x6,0x76,0xcc,0x84,0xdf,0x98,0xbf,0x48,0xcd, + 0x9e,0x3b,0xd7,0x19,0x87,0x76,0x45,0x2c,0xeb,0xf9,0x1a,0xbf,0x45,0xc4,0x54,0x7, + 0x8,0xf7,0x92,0x3f,0x79,0xa3,0xda,0xb7,0x7f,0xdf,0xcb,0x12,0x7,0x25,0x3e,0xc6, + 0xf0,0x32,0xbc,0xcf,0xf9,0x1e,0x0,0x7f,0xd1,0x74,0xf8,0x70,0xed,0x57,0xb6,0x6f, + 0xdf,0xf6,0x3b,0xb,0x16,0xcc,0xff,0xf1,0xf6,0x1d,0xdb,0x3d,0xd1,0x33,0x40,0xd5, + 0x3,0x54,0x1,0xac,0x2e,0x75,0x72,0xf2,0xcb,0x48,0x60,0xc,0xdb,0x8,0xcb,0x70, + 0x1b,0x5e,0x19,0xd4,0xe9,0xea,0x48,0x31,0xee,0x91,0x88,0x9a,0xdb,0x3,0xdd,0x70, + 0xc8,0xd8,0xdb,0x33,0xc4,0xac,0x69,0x40,0xea,0xf4,0xc5,0x68,0x76,0xb3,0x79,0x16, + 0xbb,0xa1,0xfc,0x85,0xb6,0x8b,0x64,0x30,0xd2,0x7c,0xe6,0x34,0x85,0x6,0xc4,0xfc, + 0x1d,0x3b,0x51,0xaf,0x8e,0x1c,0x3b,0x4a,0xe9,0xd8,0xf1,0x7a,0xca,0xc3,0x8a,0xd, + 0x61,0xf4,0x50,0x16,0x3f,0x1c,0xd4,0xe5,0xf,0x4f,0xb8,0x59,0x43,0x47,0xc4,0x4a, + 0x3c,0x66,0x4,0xd7,0x1e,0x32,0xde,0x5c,0x2,0xa2,0x29,0xcb,0xf2,0x60,0xde,0x93, + 0xe7,0x2b,0x20,0x82,0x8e,0xe8,0xe2,0xa3,0x16,0xed,0x91,0x79,0x73,0x6a,0x87,0xce, + 0x8e,0x94,0x5b,0x99,0xe7,0x5e,0x56,0xc8,0x35,0x4d,0x2,0x7c,0x68,0x1,0x1f,0xba, + 0xb8,0xc5,0xc,0xc4,0x72,0xbe,0x8e,0x9c,0xf5,0xf8,0xb2,0x9f,0xf6,0x8c,0xff,0x7b, + 0x4a,0x4d,0x20,0x17,0x2e,0x72,0x9c,0xb9,0x4e,0x17,0x88,0x26,0x14,0xed,0xb7,0xcb, + 0x85,0x48,0xa4,0xbd,0xce,0x94,0x3a,0xa0,0x2b,0xe2,0x9a,0x57,0x20,0xaa,0x5b,0x1, + 0xb7,0x34,0x2f,0xfc,0x6b,0x2e,0x6d,0x71,0x1f,0xb7,0x67,0xe8,0x8a,0xd6,0x89,0xcd, + 0x6b,0x47,0x74,0xfc,0x9d,0x9e,0x1f,0x7b,0x74,0xa3,0x96,0xee,0xb4,0x35,0x3f,0xde, + 0x1,0x4,0x4e,0x80,0x8e,0x6f,0xe6,0xbc,0x85,0x69,0x23,0xab,0x0,0x88,0xe5,0x91, + 0x81,0x16,0xc7,0xa5,0xa5,0x15,0x29,0x66,0xcb,0x65,0x3c,0xb0,0x76,0x6d,0x54,0x26, + 0xcc,0x57,0x30,0x5e,0x7,0xe0,0x6c,0xe0,0x15,0x1,0xe7,0xa5,0xf6,0x7e,0x38,0xd6, + 0x22,0xcf,0xd0,0xcb,0x80,0x2e,0x1b,0x89,0x41,0x7,0xa,0x31,0xf3,0x73,0x2f,0xbd, + 0xa2,0x9e,0x9b,0xf8,0x92,0x5a,0xb3,0x6e,0x9d,0x6a,0x3d,0x7f,0xde,0xee,0x3d,0x3d, + 0xa0,0xbf,0x1,0xbd,0x7a,0x7e,0x7a,0x28,0xe1,0xbc,0xcb,0x1e,0x71,0xdd,0x91,0xeb, + 0xa6,0xc4,0xf7,0x73,0xbd,0x7d,0x54,0x7,0x60,0xdc,0xad,0xcf,0x77,0xed,0xd9,0xab, + 0x5e,0x7c,0xf9,0x15,0xf5,0xc4,0x33,0x13,0xf5,0x2,0xa6,0x84,0xd8,0xf0,0xf2,0x8a, + 0x35,0xd4,0x3f,0x83,0xf0,0x72,0x6b,0x59,0x4d,0x79,0x82,0xb1,0x86,0x8b,0xb,0x58, + 0x81,0x43,0xbc,0x8c,0x4,0xe6,0x1b,0x2e,0x50,0x70,0x84,0x1b,0xd2,0x86,0xad,0xdb, + 0xa9,0xc,0x5b,0x3e,0xa7,0x2c,0xd3,0xa5,0xee,0xdc,0x93,0x64,0xac,0x4a,0x49,0x22, + 0x52,0xfa,0x77,0x91,0xe8,0xff,0x22,0x74,0xc6,0xd8,0xce,0x70,0xca,0xb4,0x99,0xaa, + 0xb8,0xb4,0x34,0xd9,0x32,0xb5,0xd0,0xce,0x75,0xfa,0x37,0xf6,0xfe,0x87,0x1f,0x90, + 0x38,0x1a,0x9b,0x78,0xd4,0xd6,0x1d,0xfe,0x6c,0xff,0xfe,0x7d,0xbf,0xf7,0x65,0x70, + 0x13,0xc9,0x3,0x60,0x88,0x90,0x91,0xf8,0x5c,0x16,0x8c,0xe5,0xf3,0xf9,0x81,0x3, + 0x7,0xbe,0xb2,0x68,0xd1,0xc2,0xc3,0xab,0xaa,0x56,0x91,0xe8,0x19,0xfa,0x3a,0x9, + 0x9c,0xcc,0x42,0x25,0xe8,0xfa,0xf7,0x2,0x71,0x74,0x47,0x7b,0x8a,0x91,0xca,0x36, + 0x70,0x8d,0x38,0xd2,0x31,0x50,0xe,0x59,0x58,0x5b,0x6,0xd3,0x96,0xe3,0x8a,0xb2, + 0xf1,0x18,0x23,0x8e,0xe8,0x91,0x25,0x1b,0x4e,0x59,0x50,0xb,0x51,0x1a,0x8e,0x90, + 0x8,0x20,0xc,0x27,0xdc,0xb2,0xf6,0xec,0xdb,0x4b,0x66,0xf1,0xcb,0x8a,0x8a,0xd4, + 0xcc,0x59,0x6f,0xa8,0x97,0x26,0xbd,0xa4,0x9e,0x7a,0xfa,0x29,0xf5,0xc0,0x83,0xf, + 0xaa,0xbb,0xef,0xb9,0x47,0xdd,0x79,0xd7,0x9d,0x6a,0xdc,0xf8,0x71,0x6a,0xec,0xb8, + 0x71,0xea,0x8e,0x3b,0xef,0x54,0xf7,0xdc,0x7b,0x8f,0x7a,0xf0,0xa1,0x7,0xd5,0x93, + 0x4f,0x3d,0xa5,0x5e,0xd4,0x65,0xdf,0x98,0x35,0x8b,0x76,0x72,0x41,0x1b,0x68,0xb, + 0x40,0x8d,0xb6,0x29,0xca,0x98,0xf0,0x99,0xf4,0xdc,0x97,0xb2,0xac,0x8f,0x43,0x90, + 0xca,0x60,0xfa,0x31,0x31,0x7f,0x7c,0x9e,0x92,0xf9,0x68,0x77,0xc6,0x72,0x81,0xf4, + 0x21,0x2,0xca,0x21,0x60,0xa7,0xd,0xf1,0x3a,0xa2,0x46,0x76,0xb1,0x60,0x2e,0x31, + 0x3d,0x73,0x74,0xa1,0x64,0xc1,0x35,0x2d,0xc5,0xe8,0xf4,0xc1,0x32,0x17,0x1,0xf8, + 0x5c,0x44,0x5c,0x9f,0x1b,0x5e,0xbf,0x9d,0x1a,0x57,0x57,0xc7,0xb0,0xbe,0xe9,0x3e, + 0x70,0xf9,0x76,0x6,0xce,0x58,0xb0,0xb3,0x23,0x6a,0x19,0x5f,0xb0,0xfd,0xe1,0x16, + 0x21,0x91,0x90,0xb0,0x31,0xdb,0x80,0x98,0x2a,0xa4,0xbd,0xc0,0x42,0x21,0x6b,0xe1, + 0x10,0xba,0xcd,0x79,0x7d,0x76,0x77,0xa5,0x6c,0x3,0x58,0x62,0x84,0x4d,0x3e,0x66, + 0xcd,0x99,0xe3,0x2c,0x9e,0xc1,0xb2,0xf0,0x21,0xc6,0x91,0x45,0xc7,0xc,0x8a,0x12, + 0x68,0xf9,0x5c,0x2,0xa6,0xcb,0xb7,0x6d,0x50,0x3b,0xba,0x8c,0x64,0xd4,0x92,0x25, + 0x7b,0x60,0x1b,0x80,0xaa,0xb9,0xbf,0x32,0xb0,0xb8,0x16,0x79,0x16,0x44,0x24,0x48, + 0xf3,0x18,0x1d,0xeb,0xb5,0x80,0x7,0xf0,0x9d,0x3e,0x67,0x81,0x7a,0xfa,0xb9,0x89, + 0xaa,0xa4,0xac,0x5c,0x2f,0xc4,0xcf,0x11,0x80,0xe6,0x0,0xb0,0x39,0x1,0xba,0x3d, + 0xbd,0x4,0xae,0x60,0xbd,0x86,0xf9,0xf6,0xbb,0xc4,0x79,0x9,0x28,0xa3,0x1e,0xea, + 0x20,0xe,0xf8,0x15,0x6a,0x6f,0xe3,0xe6,0x2d,0xea,0x89,0x9,0xcf,0xa9,0x49,0x53, + 0x67,0x38,0xeb,0xe8,0xe5,0xe5,0xab,0xf5,0x18,0x57,0x25,0x62,0x69,0x31,0x2e,0x93, + 0x56,0xa6,0x98,0x3d,0xe6,0xcf,0xcd,0x7f,0x69,0x65,0xca,0x0,0x8d,0xef,0xd3,0xff, + 0x42,0xea,0xe9,0xc3,0xf9,0xa,0xa4,0xe,0x29,0x40,0x2e,0xf7,0x75,0xed,0xb2,0x1c, + 0xfa,0x96,0x6,0x76,0x4e,0x8d,0x40,0x2e,0x5c,0xab,0xd5,0x4b,0x93,0x5f,0x75,0x96, + 0xd1,0x31,0x83,0x3e,0x99,0x20,0xb9,0xf9,0xe1,0x67,0x3f,0xa2,0x1d,0x94,0x80,0x71, + 0xfb,0xf,0xec,0x3b,0x58,0xad,0xb1,0x4f,0x62,0x63,0x98,0x86,0xcb,0x77,0x7f,0x7c, + 0xa3,0xba,0xba,0x3a,0x7a,0x94,0x49,0xe6,0x81,0x46,0xaf,0x5a,0xb5,0xf2,0xd1,0x25, + 0x4b,0x17,0x93,0xf8,0x7,0x4e,0xef,0x90,0xeb,0x87,0x20,0xe7,0x31,0xde,0x20,0xc1, + 0x2,0xf4,0x92,0x15,0x57,0x5f,0xa,0xf2,0x53,0x60,0x9d,0x75,0x1d,0x63,0xd6,0xb6, + 0xdd,0x18,0x83,0xe6,0xbc,0x4b,0x1d,0xc3,0x83,0xbf,0x67,0xad,0x1d,0xb3,0x8a,0x16, + 0x80,0x2f,0x57,0xe9,0xb0,0xc4,0x84,0x28,0x1e,0xae,0x58,0x1b,0x37,0x6d,0x52,0xb, + 0x17,0x2f,0x52,0xcf,0x4f,0x7c,0x41,0x3,0xec,0xdd,0xea,0xe6,0x5b,0x6e,0x51,0xdf, + 0xfe,0xf6,0xb7,0xd5,0xb7,0xbf,0xf3,0x6d,0x75,0xd3,0xcd,0x37,0xab,0x31,0x63,0xc7, + 0x10,0xc8,0x3e,0xfa,0xf8,0x63,0xea,0x49,0xd,0xc4,0x13,0x9e,0x7d,0x46,0x3d,0xf3, + 0xec,0xb3,0xea,0xe9,0x9,0x13,0x8,0x74,0x1f,0x7e,0xe4,0x11,0x75,0xd7,0xdd,0x77, + 0xa9,0x51,0xa3,0x47,0x51,0xbd,0x6f,0xfd,0xe9,0xb7,0xd4,0x1f,0xff,0xc9,0x9f,0xa8, + 0x6f,0x7e,0xeb,0x5b,0xea,0x3b,0xdf,0xfd,0x8e,0x6,0xec,0xbb,0xd4,0xf3,0x2f,0xbc, + 0xa0,0x16,0x2c,0x5c,0xa8,0x36,0x6c,0xda,0xa8,0x6a,0x8f,0xd4,0x39,0xdf,0x6b,0x36, + 0x2e,0x28,0xe4,0xcb,0x1c,0xb3,0xdc,0xe,0xc5,0xf6,0x69,0x51,0x75,0x86,0x11,0x5b, + 0x0,0x8e,0xd2,0xfa,0x3c,0xa6,0x63,0x6f,0x8b,0xea,0xd0,0x25,0xf8,0xa7,0x81,0x3b, + 0xd4,0xff,0x4b,0xb6,0x5c,0x10,0xb4,0xc3,0x45,0x84,0x1c,0x73,0x84,0xf9,0xa7,0x2c, + 0xe6,0x23,0xb,0xd,0xaf,0x5e,0x67,0x7c,0x1e,0xb3,0xf2,0xb2,0xa2,0xc1,0x45,0x25, + 0x3,0x85,0xc,0xd8,0x72,0xd9,0xff,0xbb,0x18,0xc0,0xb1,0x68,0x3f,0x36,0x2e,0x2f, + 0x52,0x5d,0xc4,0x90,0x2e,0x6,0xe2,0xbc,0xe0,0x62,0xc0,0x6f,0xcf,0xd4,0xef,0x47, + 0x9e,0xb1,0x6b,0x4,0x7e,0xf7,0xb9,0x8c,0x88,0x77,0x96,0x9d,0x20,0xda,0xd1,0xc4, + 0xc9,0xaf,0xa,0xd6,0x99,0x0,0xad,0x64,0xaf,0x92,0xcd,0x72,0x9e,0x29,0x53,0x91, + 0x80,0xa9,0xd0,0xe9,0x4a,0x10,0x96,0xe0,0x9d,0xd5,0x9e,0xeb,0xb7,0xa4,0xc2,0x8a, + 0x8f,0x4d,0xde,0x92,0x92,0x72,0xb,0xf4,0x6,0xa0,0x70,0xdf,0xe4,0x31,0x3,0x5f, + 0xe5,0xea,0xb0,0xe8,0x79,0x69,0x89,0x5,0xe2,0x72,0x63,0xd0,0x34,0x69,0xca,0x34, + 0xcd,0xf0,0xa7,0x90,0x2e,0xb7,0xc7,0x82,0xa8,0x64,0xb4,0xc,0xb6,0xd8,0x1,0xab, + 0xf5,0xfc,0x5,0x72,0xa7,0xdb,0xbb,0x7f,0x9f,0xda,0xba,0x6d,0xab,0xda,0xb4,0x65, + 0xb3,0xc2,0xfe,0xeb,0x1c,0xe,0xb8,0xa3,0x2b,0x67,0x41,0x79,0x80,0xc0,0x97,0xc1, + 0x18,0xe7,0x10,0x51,0xb7,0xb4,0x9e,0x53,0xd3,0xdf,0x98,0xad,0x9e,0x7e,0x7e,0x92, + 0x5a,0x52,0x5c,0x49,0x22,0x6f,0x0,0x30,0xc6,0x51,0x54,0x26,0xc4,0xe3,0xa5,0x2b, + 0xed,0xd1,0x17,0xf1,0x2f,0xe3,0x14,0x4a,0xd,0xca,0xd2,0x92,0x84,0x70,0x61,0x93, + 0x12,0xe9,0x47,0xdc,0xbf,0x3c,0xe0,0xd,0xca,0xfb,0x46,0x76,0x15,0xce,0x10,0x2f, + 0x5c,0x60,0x61,0x41,0x83,0xe3,0xcb,0xaf,0x4e,0x21,0x29,0x23,0x81,0x70,0xa8,0x1a, + 0x14,0x56,0xf9,0xf8,0x8d,0x63,0x73,0x93,0x1f,0xfc,0xe8,0x87,0xe4,0xe6,0x76,0x2, + 0xf3,0xbb,0x77,0xcf,0xd3,0x12,0x2b,0xc3,0x73,0x99,0x17,0xc3,0x53,0xf7,0x17,0x56, + 0x18,0x49,0x42,0x3,0xdb,0xb7,0x6f,0xff,0xd7,0x73,0xe7,0xce,0xf9,0x60,0x8b,0x5e, + 0x45,0xe0,0x21,0x20,0x7a,0xc6,0x7,0x97,0x0,0x35,0x60,0xae,0x12,0x14,0xdb,0x22, + 0x40,0xeb,0xee,0x81,0xe1,0xea,0xe3,0xa5,0x8,0x88,0x26,0x75,0xda,0x32,0x1,0x39, + 0xcc,0x77,0x65,0x53,0xa2,0xef,0x44,0x7c,0x7d,0xc9,0x96,0xb,0x19,0x77,0x21,0x7d, + 0xb0,0xfb,0xc0,0xb,0xbd,0x14,0xf2,0xc0,0x44,0xf7,0x57,0x1f,0x50,0xa5,0xe5,0x65, + 0x6a,0xe2,0x8b,0x2f,0x12,0x70,0x2,0x64,0x6f,0xbd,0xed,0x56,0x75,0xff,0x3,0xf, + 0xa8,0xc9,0xaf,0x4c,0x56,0x4b,0x96,0x2e,0x25,0xa0,0x44,0x39,0x30,0x62,0x88,0x96, + 0x11,0x6c,0x2,0xa2,0xe5,0x8b,0x6e,0x31,0xd2,0xe6,0x9e,0xff,0x62,0xfb,0x25,0xd5, + 0x7a,0xe1,0x1c,0xed,0xb9,0xa,0x71,0x74,0x75,0xcd,0x41,0xbd,0x52,0xdd,0xa4,0x96, + 0x16,0x2d,0x53,0x2f,0xbe,0xf4,0x12,0x1,0xf0,0xbf,0xff,0xf,0xff,0x5e,0x7d,0xe3, + 0x8f,0xff,0x58,0xfd,0xe9,0x9f,0xfd,0x29,0xb1,0x67,0xe4,0x97,0x95,0x97,0x93,0x4e, + 0x1e,0x6,0x71,0xde,0xa6,0x15,0x81,0xab,0x51,0xe2,0xca,0x95,0x6,0x1a,0x96,0x50, + 0xf8,0x6,0x71,0xed,0x71,0x3d,0x72,0x4,0x20,0xfd,0xc5,0x4f,0x7b,0xa6,0x8e,0xd8, + 0xdd,0xcf,0xe8,0x3f,0xc5,0x9a,0x73,0x89,0x81,0x58,0x6a,0x71,0x10,0x82,0x7d,0xd6, + 0x58,0xbb,0x22,0xd7,0x5d,0xd2,0xcd,0xad,0x23,0xa,0xe4,0x31,0x51,0x72,0x21,0x7b, + 0x0,0x6f,0x61,0x51,0x48,0x9a,0x92,0x61,0xc5,0x1f,0x2b,0xef,0xfd,0xef,0x32,0x0, + 0xce,0x7,0xcf,0xc0,0xa8,0x2e,0xd7,0x19,0xb8,0xe3,0x5,0xd2,0x8e,0xc0,0x13,0x41, + 0xce,0x7b,0x96,0xe8,0x38,0xe6,0xa,0x18,0x46,0xb5,0x8b,0x1,0x7f,0xc8,0x8e,0xdb, + 0x33,0x17,0x0,0x3e,0xfb,0xcf,0x59,0xbd,0x2f,0xfc,0x9b,0x17,0xaf,0x28,0xa3,0xf, + 0x2a,0x8c,0xaf,0x1c,0xc3,0x75,0xac,0xb7,0xc2,0x89,0x8c,0x71,0xcf,0xb1,0x33,0x1, + 0x9e,0x4,0x88,0x25,0x9,0x10,0x73,0x1b,0x68,0x4f,0xb2,0x5d,0x59,0x2f,0x4,0x61, + 0x6e,0x5b,0xb2,0x6d,0x23,0xce,0x4e,0x98,0x34,0x1b,0x69,0x85,0xec,0x78,0x99,0x60, + 0xde,0xa6,0xee,0x4a,0x2,0x89,0x5,0xcb,0x4a,0xd4,0x84,0x17,0x5e,0x52,0xb3,0xe7, + 0xce,0x53,0xcd,0x2d,0x2d,0xa4,0xbb,0x25,0xe0,0xb5,0xe0,0xcb,0xcc,0xb6,0xb9,0xe5, + 0x8c,0x5a,0xb3,0x76,0x8d,0x7a,0x41,0x7f,0x73,0x6e,0xb9,0xfd,0x2e,0xf5,0x7,0x7f, + 0x72,0xbb,0xfa,0x57,0xbf,0x73,0xbb,0xfa,0xb5,0xdf,0x1e,0xab,0xfe,0xf9,0x6f,0x8d, + 0x53,0xbf,0xf6,0x5b,0xa3,0xd5,0x6f,0xfc,0xde,0x28,0xf5,0xc7,0x7f,0x3e,0x56,0xdd, + 0x7b,0xff,0xa3,0x6a,0xde,0x82,0x5,0xf4,0x6d,0xb8,0xd8,0xde,0x21,0x80,0xd8,0x80, + 0x7a,0x6f,0xff,0x20,0x6d,0x71,0xb9,0xbc,0xa4,0x54,0x3d,0xf6,0xd4,0x73,0x6a,0x71, + 0x71,0x85,0x15,0x49,0x1b,0x51,0xf4,0x52,0xbb,0x68,0x90,0x3a,0x6e,0x5e,0x48,0x84, + 0x73,0x23,0xa5,0xd,0x21,0xe8,0xba,0x85,0xa,0xb3,0xfe,0xf2,0xc4,0x88,0x8b,0x17, + 0x2f,0x72,0x11,0x25,0xff,0x2f,0xa1,0xfe,0x3d,0x5c,0x1c,0xc9,0xb6,0x3c,0xfd,0xba, + 0x55,0x17,0xa0,0x2c,0x58,0xf0,0xbc,0x25,0x90,0x42,0xce,0x22,0x29,0xa,0x44,0xd1, + 0xa1,0xd1,0x6b,0xb8,0x1,0xce,0x7b,0x1f,0x7e,0x40,0xe2,0x68,0x7c,0x93,0xf,0x1d, + 0xae,0x79,0x6f,0xdf,0xbe,0x7d,0xff,0x22,0x6,0xba,0x23,0x49,0x1e,0x0,0x43,0x94, + 0x1c,0x16,0xe0,0x3c,0x79,0xe4,0x73,0x74,0x5a,0x54,0xb4,0xac,0xbc,0xa4,0xb4,0x18, + 0x91,0x42,0x9c,0x8,0xb4,0x9d,0x1,0xb4,0xbd,0x2d,0xd,0xb8,0x42,0x7c,0x9c,0xba, + 0xdf,0x19,0x3,0x67,0xdb,0x4e,0x67,0xbb,0x7,0xc8,0x21,0x10,0x4b,0x10,0xbe,0x14, + 0x69,0x53,0x2,0x76,0x14,0x9c,0x23,0x8b,0x1,0x8f,0x39,0x7,0x1f,0x4a,0x66,0x27, + 0xec,0xfe,0x0,0x70,0x84,0x18,0x78,0x65,0xd5,0x2a,0xfd,0x2,0x4c,0x54,0x63,0xc7, + 0x8d,0xd5,0x80,0x7b,0x9b,0x7a,0xe0,0xc1,0x7,0xd4,0xf4,0x99,0x33,0x48,0x54,0x7c, + 0xa8,0xf6,0xb0,0x10,0x13,0xe7,0xdc,0xee,0x2f,0xa9,0x9d,0x5d,0x7a,0xbb,0xbd,0xa8, + 0x3e,0xd2,0x4a,0xcf,0x6d,0xad,0xc6,0x11,0x5d,0x60,0x24,0xa0,0xfb,0xc7,0xc2,0x7, + 0xfd,0x63,0xa5,0xfb,0xda,0xeb,0xaf,0x93,0x8,0x1b,0x2c,0xf9,0x1b,0xdf,0xf8,0x6, + 0x8d,0x3,0x60,0xbc,0x6a,0x75,0x15,0x31,0x63,0xfc,0xd0,0xf8,0x87,0x15,0x6,0x3b, + 0x49,0x19,0xa6,0x75,0x31,0xd3,0x4d,0x4b,0x1a,0x24,0x38,0xd2,0x3c,0x46,0x80,0x77, + 0x38,0x23,0xb7,0x70,0xa1,0x13,0x33,0xd8,0x8b,0xa9,0x1a,0xc2,0xff,0x65,0x1a,0x44, + 0xb,0x3,0x5b,0xf2,0x7f,0xed,0x88,0xea,0xf6,0x33,0x8d,0xfe,0xbc,0x79,0x49,0xda, + 0xc9,0x12,0xdd,0xcb,0x5,0x82,0xac,0x1f,0x13,0xb7,0x27,0x2e,0x6e,0xed,0x29,0xc0, + 0xee,0x88,0x44,0x79,0x8b,0x2,0x75,0x24,0x88,0x4d,0x4c,0xdc,0x1f,0x8a,0xa6,0xb, + 0x4a,0x2d,0x1c,0xc3,0xed,0xca,0x64,0xe9,0xa9,0x3e,0x43,0xcb,0xfa,0x70,0xd1,0x21, + 0xd,0x15,0x3,0xc3,0xc0,0x42,0x52,0x1a,0x9,0xfc,0x78,0x17,0x10,0x20,0x1,0x1b, + 0xb1,0x4f,0x9f,0x33,0xdf,0x7d,0x94,0x9d,0x68,0x33,0x0,0xd9,0xa5,0x12,0x60,0xed, + 0x35,0x81,0xb5,0xcd,0x93,0xc0,0x9c,0x30,0xe3,0x4,0x10,0xa5,0x48,0x95,0xca,0x96, + 0xa6,0x41,0x9c,0xeb,0x39,0x86,0x2b,0xc7,0x10,0x63,0xcc,0x29,0x46,0xbe,0xca,0x1, + 0x19,0x40,0x63,0xf6,0xc2,0x65,0x24,0x72,0xae,0x58,0xb9,0x8a,0x62,0x94,0xe7,0x7a, + 0x13,0x7d,0x2e,0xc4,0xcc,0x0,0xdf,0xc6,0x93,0x27,0xd5,0xbc,0xf9,0xf3,0xd5,0x77, + 0x6f,0x19,0xaf,0xfe,0x57,0xd,0xb2,0x5f,0xff,0xf5,0x27,0xd4,0xd7,0x7e,0x6b,0xa6, + 0xfa,0xc5,0xdf,0x2f,0x52,0xff,0xec,0x9b,0xab,0xd4,0xaf,0x7f,0x7b,0x83,0xfa,0x9d, + 0x5b,0xb7,0xa8,0x3f,0x1a,0xb7,0x5d,0xfd,0xf1,0x1d,0xdb,0xd4,0x1f,0x8c,0x5a,0xa7, + 0xfe,0xd5,0xb7,0xe6,0xab,0x5f,0xf9,0xad,0xc7,0x35,0x20,0x8f,0x51,0xf,0x3c,0xfc, + 0x34,0x89,0x61,0x2f,0xb5,0xeb,0x39,0xd5,0xed,0x19,0x66,0x8d,0xef,0x4c,0x5e,0xd, + 0xc,0x5d,0x56,0x2b,0x57,0xaf,0x51,0x8f,0x3f,0xfd,0x3c,0xb9,0x2d,0x39,0xa3,0xac, + 0x32,0x21,0x7e,0xb6,0x22,0xf4,0x65,0x32,0xa8,0x49,0x59,0x22,0x5a,0xf,0x1,0x59, + 0x1a,0xb3,0x49,0xf1,0x72,0xb8,0x68,0xc1,0xbc,0x39,0xe3,0xb7,0x88,0x64,0xc2,0x3, + 0x66,0x29,0xf9,0x28,0xab,0xf4,0x74,0xf4,0x69,0x89,0x46,0xa5,0xb7,0x8,0x80,0x51, + 0xd6,0x2b,0xaf,0xcf,0xd0,0x64,0xa5,0x2c,0xd9,0x1d,0x2e,0x97,0x11,0x89,0xd0,0xfe, + 0xee,0x3e,0xfd,0xd1,0xf,0x28,0x40,0xc7,0xa9,0xd3,0xa7,0xd4,0x9e,0x3d,0xbb,0x2b, + 0x24,0x2e,0x86,0xe7,0x21,0x9e,0xca,0xfb,0xee,0x4f,0xde,0x88,0xa5,0xfd,0xfb,0xf7, + 0x53,0xe2,0x73,0x80,0xef,0xe6,0xcd,0x9b,0xff,0x68,0xfe,0xfc,0x79,0x7f,0xbb,0x63, + 0xe7,0xe,0x8a,0xf5,0x8c,0xf,0x3b,0xc4,0xae,0x12,0x38,0x2f,0xa5,0x0,0x33,0x2e, + 0x76,0x66,0x90,0xc5,0x35,0x56,0x16,0xf2,0xc3,0x8a,0x6b,0x6,0x51,0x97,0x44,0xf9, + 0x10,0xb4,0x43,0x30,0xf,0x17,0x0,0x92,0x6d,0x5f,0x6a,0x6f,0xcb,0xd4,0x4b,0xf3, + 0x87,0xb6,0x2d,0xa2,0x3,0xe6,0x8f,0xb,0x98,0x25,0x56,0xe0,0x78,0x1,0xee,0xbb, + 0xff,0x7e,0x35,0x6a,0xf4,0x68,0xf5,0xe8,0x63,0x8f,0x91,0xb8,0x19,0xe,0xdf,0xa7, + 0x78,0xf7,0x27,0xb9,0xdb,0x8b,0xd8,0xbb,0xb4,0xd3,0xdb,0x73,0x38,0x11,0x7f,0x38, + 0xf1,0x9a,0xd8,0x48,0x21,0x34,0xa,0x90,0x96,0x7b,0xd2,0x72,0x1a,0x79,0x88,0x3d, + 0x8c,0xd5,0xed,0x22,0x3d,0x8e,0xef,0xdf,0x77,0x9f,0xfa,0xe6,0x37,0xbf,0x49,0xe9, + 0x9e,0x7b,0xef,0x55,0xf3,0xf5,0xca,0x17,0xa2,0x29,0x18,0x73,0x45,0xd,0x79,0x2c, + 0xd8,0xb4,0x65,0x2d,0x46,0xec,0x2,0x2b,0x35,0x6f,0x81,0x41,0xdc,0xa5,0x88,0xb4, + 0xc1,0x13,0xf3,0x77,0xc5,0xd9,0xb1,0x3,0xe5,0xae,0x8,0xd8,0x7,0xa0,0x97,0x5, + 0xb4,0xa1,0x6d,0x41,0x5b,0xc4,0xef,0xdb,0x2c,0x6,0x7d,0xd7,0x38,0xb9,0x20,0x60, + 0x89,0x48,0x68,0x2f,0xc0,0xd7,0x5e,0xf0,0x96,0x2,0xd6,0xfa,0x97,0x22,0x41,0x66, + 0x42,0xeb,0x7c,0x69,0x84,0x58,0xd0,0x13,0xa0,0x80,0x48,0xdd,0x49,0x27,0xe4,0xa2, + 0x31,0xc3,0x10,0xae,0x2d,0xc2,0xd4,0xa3,0x6e,0x7a,0x51,0xe6,0xef,0xcf,0x41,0xa6, + 0xc8,0x3d,0x60,0xd7,0xe1,0x98,0xe5,0x22,0x4d,0x32,0x73,0x6f,0xd1,0x91,0xeb,0x8c, + 0x4a,0x18,0xf8,0xf7,0xba,0x78,0xe9,0x52,0xa,0xb6,0xe1,0x98,0x6f,0x0,0x96,0xf2, + 0x43,0xcd,0xd7,0x92,0xe9,0xd2,0x35,0xd5,0x2b,0xa7,0x7c,0x62,0xbb,0xb6,0x2d,0x3e, + 0x5f,0x56,0x2a,0x41,0xbb,0xc2,0xab,0xbb,0xcc,0x81,0x30,0x3,0x72,0xb9,0xc7,0xd4, + 0x18,0x54,0xb8,0xf,0x9,0xda,0xa9,0x5,0x82,0x5,0x60,0xd6,0xad,0x4e,0x99,0x3e, + 0x5b,0x3d,0xff,0xe2,0x24,0xfd,0x1d,0xd9,0xa3,0xdf,0xef,0x1e,0xc3,0x78,0xad,0x21, + 0x15,0xc4,0xcc,0x6d,0x9d,0x5d,0xb4,0xe0,0xff,0x9e,0x6,0xde,0x5f,0xfe,0xf5,0x3b, + 0xd4,0x57,0xff,0xcd,0x54,0xf5,0xf5,0x7f,0x57,0xac,0x7e,0xf9,0x8f,0x56,0xfe,0x3f, + 0x9c,0xbd,0x7,0x94,0x15,0x47,0xba,0xe7,0x9,0x42,0xea,0x6e,0x39,0xe4,0x90,0x5, + 0x84,0x37,0x2,0x84,0x11,0xde,0x4b,0x2,0x49,0x80,0x24,0x8c,0x30,0x85,0x87,0x32, + 0x50,0x85,0x37,0x5,0xe5,0x7d,0x15,0x4e,0x78,0x61,0x24,0x10,0x20,0xd3,0x72,0x2d, + 0xdf,0x46,0x82,0xaa,0x7b,0x6f,0x19,0xa0,0x5f,0xfb,0x69,0xaf,0x56,0xdb,0xd7,0x6f, + 0x66,0xdf,0xec,0xec,0xec,0xec,0x59,0x37,0xbb,0xe7,0xed,0xee,0x39,0xf3,0x6d,0xfc, + 0xbf,0xcc,0x88,0xfc,0x22,0x32,0xf2,0x16,0x3d,0x75,0x4e,0x9c,0xcc,0x9b,0x99,0x37, + 0x6f,0xde,0xbc,0x59,0xf1,0x8b,0xff,0xe7,0x82,0xee,0x19,0xf9,0x32,0x3d,0x3c,0xfe, + 0x8,0xf5,0x99,0x72,0x8c,0x86,0x3c,0xf5,0xa,0x8d,0x9a,0x73,0x96,0xa6,0x2c,0xba, + 0x40,0xcf,0xad,0x7d,0x87,0x56,0x6e,0xff,0x94,0xb6,0xd5,0xb6,0xd0,0x8e,0x86,0xc, + 0xcd,0x2f,0xf8,0x80,0x1e,0x1e,0xb5,0x9b,0x7a,0xf4,0x7d,0x96,0x56,0xac,0xce,0xe3, + 0xb9,0xac,0x3,0x1f,0xf1,0x8f,0x8d,0x7f,0x18,0x10,0x46,0x5a,0x13,0x72,0x89,0xab, + 0x42,0x13,0x34,0xd4,0x79,0x35,0x3,0xed,0x80,0x9,0x12,0x93,0x20,0xd4,0xbf,0x45, + 0x8d,0xc7,0x14,0x6d,0x41,0x73,0x5f,0xfc,0xb5,0x2f,0x48,0xce,0x86,0xea,0xc1,0xc8, + 0x12,0xd1,0x74,0x20,0x16,0xe0,0x65,0xb9,0x2,0x84,0x22,0xae,0xf1,0xf8,0xd9,0xab, + 0x43,0x8b,0x4,0x20,0x8c,0x5c,0x75,0xf4,0x8b,0x41,0x7a,0x9c,0xbf,0xc6,0x3e,0x57, + 0x9,0x54,0xcf,0x20,0xfc,0xc0,0x98,0x39,0x9,0xeb,0x1f,0x7c,0xe7,0x83,0xff,0xe5, + 0xc2,0x85,0xb,0xc3,0x35,0x1b,0x7d,0xec,0x4c,0xda,0x66,0xfe,0x34,0x60,0x6f,0xac, + 0xbd,0xd5,0xe5,0xd2,0xa5,0x4b,0x5d,0x4a,0x4a,0xf6,0x7c,0xa0,0xcb,0x4d,0xc2,0x34, + 0xaa,0x4d,0xa5,0x80,0xb0,0x86,0x9b,0x6c,0x12,0x7a,0xad,0x1e,0x0,0xb6,0x79,0x15, + 0xae,0xb3,0xf4,0x9c,0x57,0x9e,0x47,0x7e,0xb6,0xab,0xa2,0xa3,0xcf,0x6e,0x4b,0x84, + 0xb0,0xf,0x38,0xbe,0x40,0x19,0xf8,0x57,0x2f,0x5c,0xba,0x48,0xdb,0xb6,0x6f,0xe3, + 0x20,0x29,0x98,0x80,0xa1,0x3c,0xcf,0xbc,0x7a,0x96,0xfd,0xbe,0xf8,0xc,0xe3,0x7b, + 0x95,0xd3,0x10,0xca,0xc2,0x1,0x32,0x52,0xd4,0x9d,0x84,0x20,0xb1,0x6e,0xb4,0x3b, + 0x79,0x41,0xe4,0x33,0x93,0x53,0x11,0x5e,0x17,0x69,0x4c,0xa8,0x50,0x84,0x40,0xad, + 0xcd,0x5b,0xb7,0xd0,0xa4,0xc9,0x93,0x69,0xc8,0x90,0x21,0x34,0x63,0xe6,0xc,0xda, + 0xbe,0x63,0x7,0xf,0x12,0x34,0x88,0x63,0x33,0x51,0xf9,0xcc,0xc9,0x57,0x3b,0xf1, + 0xc9,0x5f,0x4d,0xbe,0x8f,0x11,0x9c,0x3b,0xb2,0xba,0xe,0xda,0x3a,0x1b,0x8,0x25, + 0x44,0xc8,0xcb,0xcf,0x74,0xdd,0x17,0x7a,0xc0,0xe6,0xf3,0xf3,0xcb,0x8,0x7a,0xfd, + 0x79,0x12,0x6a,0x31,0x77,0x84,0x4e,0x6f,0xeb,0xb0,0xcd,0xe5,0x6d,0x8e,0x19,0xbb, + 0xb3,0xb8,0x2,0xfd,0xdc,0xb5,0x5f,0x4d,0x1e,0x88,0x58,0xbe,0xef,0x6b,0x1d,0x37, + 0x96,0x32,0x27,0x6,0x1a,0x89,0x16,0x88,0x6b,0x37,0x2,0xfb,0x78,0x6,0x80,0xb5, + 0xde,0xd1,0x9e,0xec,0xfb,0xbf,0xe6,0xff,0xad,0x5c,0xf7,0x41,0x52,0xb1,0x1c,0xce, + 0xb1,0x77,0xe3,0x33,0x84,0x2a,0x47,0xbe,0x2f,0x9e,0xdd,0x35,0xa,0x50,0xe5,0xb5, + 0x8d,0x31,0x98,0xba,0x90,0xd3,0x40,0xd0,0x40,0x36,0xdb,0x1c,0x73,0xb4,0x3c,0x46, + 0xbe,0xc7,0x85,0x7a,0x75,0x63,0x1c,0xf0,0xae,0x5a,0x8e,0x6d,0xf3,0x1c,0x67,0xef, + 0xf,0x54,0x32,0x72,0x65,0xd7,0xe6,0x17,0x52,0xe1,0xe6,0x2d,0xf4,0xf1,0xa7,0x9f, + 0x32,0x6c,0x3,0x3f,0xef,0xf,0x79,0xc2,0xe,0xbc,0xfe,0xe2,0xf2,0x65,0x2a,0x2c, + 0xda,0x44,0xf,0xf4,0x99,0x46,0x5d,0x1f,0xca,0xa5,0x6e,0xfd,0xea,0xe8,0x9b,0x83, + 0x9a,0xe8,0x8e,0xc7,0x9a,0xe8,0xae,0xe1,0xfb,0x14,0x80,0xf7,0xd3,0x3,0x63,0xe, + 0x29,0x8,0x1f,0x66,0x8,0xf,0x9c,0x71,0x92,0x1e,0x9b,0x75,0x8a,0x41,0x3c,0x61, + 0xfe,0x79,0x9a,0xbe,0xf4,0x12,0x2d,0x28,0x78,0x9f,0x76,0x36,0x5c,0xa1,0xfd,0x67, + 0x7f,0x44,0xcb,0xb6,0x7c,0x4c,0xf7,0xd,0xd9,0x48,0x23,0xc6,0xcd,0xa3,0xa3,0xc7, + 0x8e,0x85,0xc1,0x5c,0x3f,0x56,0x9f,0xf7,0x43,0x5e,0x22,0xca,0xba,0xac,0xa2,0x8a, + 0xd6,0x15,0x6c,0xe2,0x54,0x24,0x6,0x70,0xd8,0x2a,0x1b,0x2,0xdf,0x76,0x15,0x7f, + 0x17,0x3b,0xf2,0x3b,0xab,0xa9,0xbe,0x51,0xdc,0xbf,0xa6,0x3,0xd1,0x20,0xa6,0x51, + 0x83,0xd5,0xe,0x9c,0x93,0xe6,0x7f,0xb,0xe6,0x4d,0xf6,0x7d,0x74,0xb7,0x5b,0x9f, + 0xdb,0xe0,0xba,0x26,0xe,0x18,0xa5,0x5d,0x5e,0xd7,0x48,0x45,0xaa,0xf,0x47,0x7f, + 0x28,0x4d,0xd1,0x49,0x55,0x6,0xff,0xf4,0xd7,0x3f,0xd3,0xaf,0x10,0x90,0x5,0x11, + 0xf6,0xe6,0xa5,0x77,0xc1,0xc4,0x7f,0x8c,0xa3,0x6f,0x46,0x0,0x7e,0xe3,0x8d,0x37, + 0xac,0x86,0x9d,0x49,0xeb,0x90,0xce,0xfb,0xf7,0xed,0x7b,0x71,0xef,0xde,0x62,0xee, + 0xd8,0x31,0xd5,0x17,0x7c,0x97,0xd9,0xc0,0x18,0xc0,0xb9,0xcd,0x40,0xba,0xcd,0x3, + 0xd4,0x8c,0x84,0xb4,0xc7,0x4c,0xed,0x9a,0xa0,0x2d,0x88,0x5f,0x6d,0xf7,0x9e,0xd3, + 0x1b,0xf4,0x25,0x3a,0x3e,0xed,0xfb,0xb5,0x83,0xc6,0xda,0x2d,0x55,0x20,0x15,0x5, + 0x4c,0xcd,0x50,0xbc,0x3b,0x76,0xee,0xa4,0xe7,0xe6,0xcc,0xa1,0x5,0xb,0x17,0x52, + 0x45,0x65,0x5,0x7,0x37,0xb0,0x69,0xd7,0x93,0xa3,0xe8,0x9f,0x10,0xc2,0x29,0x9c, + 0x61,0x45,0x7e,0x7a,0xa6,0x3e,0x74,0xfc,0x10,0x1d,0x4e,0xa5,0x20,0x37,0x17,0xd8, + 0x2d,0xf1,0x77,0x3d,0x54,0xc6,0xb0,0x54,0x54,0xd7,0xd6,0xd0,0xec,0x67,0x9e,0xa1, + 0x21,0x43,0x87,0xd2,0xf4,0x19,0xd3,0x39,0xa2,0x1a,0xdf,0xa9,0x25,0xbc,0xfe,0x98, + 0xf,0xd8,0x31,0x25,0x5b,0xf7,0xda,0x13,0xf0,0x66,0xcc,0xfb,0x9e,0xe7,0xc0,0xeb, + 0xc7,0xbf,0xda,0x1e,0xfb,0x3d,0xf5,0x6f,0x23,0xcd,0xd9,0xbe,0x40,0x3d,0xf9,0x1b, + 0xb9,0xf0,0xb7,0x14,0xbb,0xe3,0x6a,0xf0,0xe5,0x9c,0x27,0xa9,0x67,0xd,0x4b,0x17, + 0xa6,0x96,0x2a,0xce,0x2,0x56,0x33,0xa8,0xb8,0x6a,0x5f,0x77,0x36,0xf8,0xb9,0xa0, + 0x73,0x3,0xe,0xf5,0xef,0xd1,0x9a,0x60,0xc2,0x77,0x73,0xba,0xb3,0xe6,0xdf,0x7b, + 0xa1,0xeb,0x64,0x16,0x24,0xe5,0xc3,0xfb,0x82,0xd9,0x5c,0x68,0x5e,0xef,0xdc,0xcf, + 0x6d,0x29,0x76,0xe7,0x33,0xda,0x1c,0xf3,0x39,0x9e,0x63,0xb8,0x72,0x36,0x6e,0xda, + 0xc4,0x29,0x47,0x52,0x71,0xd9,0xb0,0xdd,0x27,0x40,0xba,0x2f,0x66,0x96,0xb6,0x61, + 0x2a,0xde,0x93,0x0,0x5d,0x77,0xbf,0x54,0xb3,0x95,0x46,0xdd,0xee,0xb,0x15,0xf3, + 0x7e,0xb1,0x6d,0xbf,0x7f,0x20,0xd0,0x20,0x21,0x14,0x80,0xa3,0xb8,0x3c,0x30,0x39, + 0xa3,0x98,0x9,0xca,0xaf,0x5e,0x53,0xca,0xb7,0xe3,0xda,0x35,0xe,0x9a,0xea,0xb8, + 0x7e,0x9d,0xe1,0xfb,0xdd,0xef,0x7f,0x9f,0x16,0x2d,0xc9,0xa1,0x5b,0x1f,0x9c,0x45, + 0x5d,0x7a,0x16,0xd3,0x2d,0x3,0x1a,0x15,0x7c,0xeb,0xe9,0xd6,0xc1,0xd,0x74,0xfb, + 0x90,0x6,0xba,0x13,0x10,0x1e,0xb1,0x8f,0xee,0x1d,0x79,0x80,0x1e,0x78,0xe2,0x10, + 0x3d,0x2,0x8,0x4f,0x3e,0xaa,0x20,0x7c,0x82,0x86,0xcd,0x3a,0xad,0x20,0xfc,0x2a, + 0x8d,0x7f,0xf1,0x1c,0x4d,0x79,0xe9,0x2,0x4d,0x5b,0x72,0x89,0xe6,0xae,0x7b,0x87, + 0x76,0xd6,0x37,0xd3,0xae,0xa6,0x56,0x1a,0x38,0x75,0x1f,0xf5,0x1a,0x32,0x97,0xea, + 0x1b,0x9b,0xc,0x84,0xa1,0x84,0xe1,0x23,0xc6,0x75,0x20,0x5f,0x78,0xfb,0x9e,0xf2, + 0xd0,0xf,0xac,0x21,0x7c,0x20,0xc,0xce,0xa,0x14,0x71,0xb5,0xf6,0x9b,0x7b,0x6, + 0x1b,0x2e,0x84,0x7d,0x41,0x71,0x2e,0x50,0x7d,0xa6,0x66,0xdf,0x0,0x26,0xb6,0x2e, + 0x60,0xee,0xf3,0xdb,0x4b,0x60,0x63,0x1d,0xa9,0x53,0x98,0x2b,0x1a,0x71,0x33,0x96, + 0x2f,0xd8,0xcc,0x13,0x60,0xbb,0x4a,0x10,0x90,0xf5,0xb7,0xbf,0xff,0x33,0xb,0xad, + 0x8f,0x3e,0xfe,0xe8,0xbf,0x9d,0x3f,0x7f,0x7e,0xde,0x9b,0x6f,0xbc,0x99,0x95,0xa5, + 0xfa,0x75,0xa7,0x0,0x96,0xd,0x64,0x47,0xd3,0x6f,0x56,0x72,0xfb,0xa6,0xdd,0xbb, + 0x77,0x66,0xe0,0xf0,0x47,0xda,0x11,0x46,0xc,0x16,0x48,0x43,0x15,0x8a,0x25,0x72, + 0x5c,0x63,0xfb,0x3a,0xec,0xa5,0x31,0x31,0x7b,0x5a,0xc6,0x7,0x67,0xe7,0x73,0xdc, + 0xf5,0xd8,0x39,0x9c,0xcf,0xb0,0x4c,0xda,0x1e,0xb5,0xec,0x2a,0x36,0xdc,0x70,0x9c, + 0x3,0x3e,0x56,0x4,0x4f,0xc1,0xd4,0xbc,0x70,0xd1,0x22,0x6,0x19,0xb6,0xa1,0x13, + 0x34,0x93,0x15,0xb8,0xc5,0x2e,0x92,0x22,0x49,0xdd,0x40,0x16,0x1,0x5b,0xab,0x1c, + 0x64,0xc2,0xec,0x46,0xbe,0x3c,0xcf,0x8e,0x84,0x42,0x17,0xf2,0xfc,0xda,0xc,0x8e, + 0xe,0xac,0x69,0xff,0x3e,0x56,0xef,0x0,0x31,0x80,0x5c,0x55,0x5d,0xcd,0xdf,0x7, + 0xdf,0xdb,0x54,0xf,0x4b,0x50,0x4b,0xb1,0xa8,0x73,0xd7,0x7f,0x7f,0x35,0xae,0x4e, + 0x93,0x5c,0x5,0x31,0x45,0xea,0xd9,0x1f,0xf3,0xf1,0x77,0x64,0x77,0x6b,0xb4,0x39, + 0x3,0xab,0x78,0xce,0x78,0x64,0x3a,0x4e,0xba,0x5e,0xdf,0xf5,0xc5,0x4d,0xdb,0xed, + 0xb1,0x40,0x33,0x9f,0x42,0xb7,0x3e,0xc3,0xa3,0x22,0x65,0xde,0xba,0xef,0x5e,0x44, + 0x3,0x89,0xf6,0x58,0x45,0xb9,0x8,0xf0,0x7e,0x3f,0xb9,0xf4,0x61,0x67,0xf5,0x9b, + 0x3b,0x69,0x7a,0x6e,0xd,0x75,0x5f,0xda,0xa0,0xfe,0x2c,0x33,0xe8,0xb8,0xe6,0xf7, + 0xdd,0xdf,0x48,0x8b,0x97,0x7c,0xf5,0xf,0x88,0xb0,0xaf,0xa1,0xa9,0x91,0xe7,0x7a, + 0x95,0x4a,0xb6,0xb2,0xbe,0xc9,0x0,0x4e,0xaa,0x5b,0x17,0x7a,0xf2,0x38,0x94,0x26, + 0x74,0xa1,0x2d,0x81,0xad,0x4d,0xd1,0xdc,0x1a,0xec,0xf7,0x78,0x81,0xaa,0x8e,0x41, + 0x30,0x98,0xcf,0x7,0x1c,0x83,0xb9,0xd8,0x6,0x5,0xb6,0x75,0x77,0x89,0x82,0xef, + 0x3a,0x3a,0x76,0xe2,0x78,0x38,0xe8,0xe,0x14,0x2f,0x7c,0xbf,0x0,0x30,0xfc,0xbf, + 0x50,0xbe,0xb,0x5f,0x5a,0x46,0xb7,0xf4,0x78,0x96,0xba,0x3e,0x5a,0xce,0x26,0xe7, + 0x6f,0xc,0xa8,0xa5,0x6f,0xe,0xac,0xa3,0x6f,0x69,0x8,0xf,0x55,0x10,0x1e,0xe6, + 0x83,0xf0,0x31,0xea,0x3f,0xfd,0x38,0x9b,0xa4,0x47,0x3c,0x73,0x86,0xc6,0xcc,0x5, + 0x88,0xcf,0xd3,0xc4,0x5,0xaf,0xd3,0xa4,0x85,0xaf,0xd3,0xfc,0xfc,0xf7,0xa9,0xa0, + 0xec,0x4b,0x1a,0xf2,0xe4,0x51,0x7a,0x68,0xf0,0x42,0x36,0x3b,0xeb,0xa0,0xac,0x76, + 0xf5,0xf9,0x48,0x51,0x7a,0xe7,0xbd,0xf7,0x68,0xe9,0x8a,0x35,0xea,0xbb,0x1d,0xe0, + 0xa8,0x68,0x0,0x37,0x68,0xfb,0x4d,0x44,0xb7,0x86,0xb0,0xa5,0xf8,0xa5,0xe2,0x75, + 0xef,0x49,0x63,0x82,0xdb,0x20,0x8c,0x1e,0x8f,0xf,0x96,0xf6,0x7b,0x7,0x41,0xee, + 0xe7,0xf9,0x60,0x6f,0x7d,0x9e,0xfe,0x8c,0x70,0xb0,0xa0,0xa3,0xd4,0x73,0xb,0x36, + 0x70,0xbc,0xe,0x4c,0xd1,0x6e,0x3e,0xbc,0xdb,0xff,0x22,0x20,0xeb,0xb7,0xbf,0xff, + 0x9d,0x1a,0x2c,0x35,0xd3,0xa5,0x37,0x2e,0xb5,0x5d,0xbc,0x78,0xf1,0x26,0xcd,0xcc, + 0xce,0x78,0x8a,0x66,0xfe,0xe4,0xc6,0x6c,0xd,0x76,0x6b,0xa8,0xdf,0xd2,0xd2,0xbd, + 0xac,0x7e,0x51,0x1c,0xc2,0x82,0xaa,0x7,0x7e,0x31,0x30,0x6b,0x33,0x75,0x82,0x49, + 0x39,0xe3,0x3,0x70,0x5b,0xab,0x5,0x76,0x9,0x73,0x69,0x7e,0xf6,0x1d,0xef,0x9a, + 0xbd,0xa5,0x9f,0x39,0x9e,0xfa,0xd4,0x26,0x7c,0x90,0x57,0x4d,0x54,0x33,0x22,0x96, + 0x57,0xae,0x5a,0xc9,0x41,0x55,0x65,0xe5,0xe5,0x6c,0x76,0xc7,0xf9,0xe5,0xf,0xd2, + 0x96,0x34,0x81,0x84,0xa7,0xf9,0x22,0x44,0xaf,0xba,0xea,0x57,0x28,0xe5,0x76,0x47, + 0x21,0xbb,0xc5,0xf,0xda,0x6f,0x20,0xef,0x54,0xfa,0xdb,0xae,0x86,0x5,0x3c,0xf0, + 0xdd,0x2a,0xaa,0x2a,0x69,0xf2,0x94,0xc9,0x1c,0xb0,0xb5,0x74,0xd9,0x32,0xfe,0xae, + 0x88,0xc8,0xd6,0xbe,0xe8,0xf6,0x4e,0xd3,0xc8,0x84,0xa5,0xa3,0xc3,0x19,0xd0,0x48, + 0x6b,0x86,0x3c,0xde,0x63,0x72,0x6e,0xed,0xe8,0x24,0x75,0x4d,0x5b,0x2c,0xda,0xa3, + 0xdf,0x28,0xd1,0xd2,0x71,0x35,0x9e,0xea,0xd6,0xee,0x9,0xe0,0xf2,0xbd,0xcf,0x52, + 0xdd,0xae,0x25,0x26,0x36,0x18,0x68,0x8b,0xb9,0x49,0xda,0x12,0x21,0x19,0x1e,0x73, + 0xd5,0x19,0xe8,0x5d,0x6d,0xb7,0x8e,0xf1,0x45,0xfa,0xb7,0x3a,0x96,0x82,0x58,0x89, + 0xd7,0x2c,0x95,0xe4,0x7c,0x45,0x6e,0xda,0x7c,0xae,0x1,0x71,0x3d,0xad,0x96,0xba, + 0xf7,0xe7,0xe5,0xbb,0x45,0x70,0x7c,0x83,0x14,0x6f,0xd4,0x7b,0x16,0xc5,0x1e,0xbf, + 0x2e,0x19,0xf8,0x16,0xa8,0xdf,0x77,0xde,0x7b,0x97,0xeb,0x59,0x97,0x56,0xd7,0x5b, + 0x90,0xc,0xc0,0xb7,0xcf,0x82,0xa6,0xd,0xd5,0xfd,0xd6,0xd2,0x52,0xcd,0x21,0x38, + 0x2b,0x1b,0x34,0x68,0x25,0x84,0x93,0x21,0xcd,0x30,0x6f,0xd8,0xe7,0xff,0x8c,0x86, + 0x7d,0x16,0x84,0x35,0xc4,0x25,0x50,0x6a,0x42,0xd3,0x6d,0x5e,0xd1,0x16,0x2e,0x82, + 0x81,0xb8,0xd,0xcc,0xb2,0x5,0xb5,0xb,0xf8,0xb6,0x87,0xea,0x17,0xbe,0x5f,0xf4, + 0x6d,0xa8,0x63,0xfc,0xad,0x7,0x66,0x51,0xd7,0xde,0x65,0x74,0x4b,0xff,0x3a,0xd5, + 0x6a,0xc,0x80,0x3,0x8,0xd7,0xd1,0x6d,0x43,0x0,0xe1,0x46,0xa5,0x84,0x1b,0x43, + 0x8,0xc3,0x1c,0x7d,0x90,0x1e,0x1e,0xf7,0x32,0xf5,0x9e,0x74,0x94,0xfa,0x4d,0x3d, + 0xce,0x6a,0x78,0xe8,0xd3,0xa7,0x68,0xf8,0xec,0xd3,0x34,0xf2,0xb9,0xb3,0x34,0x5a, + 0xc1,0x18,0xd,0x7e,0xe2,0x17,0xf2,0x3f,0x54,0xc0,0x3e,0x48,0x7d,0x87,0xcf,0xa7, + 0xd3,0x67,0xcf,0xb0,0x4f,0x18,0x26,0x70,0x98,0xa3,0x7f,0xfa,0xf3,0x5f,0xb0,0x29, + 0x3a,0xaf,0x68,0x5b,0xa0,0x82,0x1b,0xe,0x18,0x53,0x74,0xf0,0x9d,0xe,0x58,0x3, + 0x8b,0x60,0x20,0x74,0xc0,0x32,0x37,0xfb,0xac,0xa,0xd2,0x27,0xab,0x15,0xab,0x5, + 0x6b,0xc7,0x64,0xec,0x9a,0xa5,0xe5,0x79,0x24,0x60,0x63,0x1,0x5b,0x4e,0x14,0xbc, + 0xf6,0xfd,0xeb,0xa0,0x3c,0xf8,0x83,0x8b,0xcb,0xaa,0x78,0x16,0x2d,0xf4,0xef,0xa6, + 0xf,0xbc,0xe6,0x19,0x18,0xaa,0x67,0x1b,0xa9,0x4b,0x28,0xce,0x81,0xbe,0xf4,0xe3, + 0x4f,0x3f,0xa6,0xf3,0xe7,0xcf,0xcd,0xbf,0x51,0x96,0x5a,0x0,0x56,0xe4,0xe6,0xd, + 0xbe,0xa5,0x5e,0x7,0xbd,0x95,0xcc,0xee,0xa6,0xd4,0x6f,0xeb,0x91,0xa3,0x87,0x4d, + 0xd1,0xd,0x9,0x3c,0x28,0x5e,0xbd,0xee,0x2a,0x5b,0x2f,0x8c,0xf5,0xb1,0x1e,0x60, + 0x7a,0xa1,0x2b,0xc0,0x1c,0xdf,0xd7,0x1a,0xf7,0xf7,0x3a,0xbe,0xe1,0x24,0x3f,0xb2, + 0xdb,0x9,0x73,0xf0,0xc,0x8a,0x6f,0x7f,0xe7,0x3,0xda,0xbd,0xa7,0x98,0xd3,0x87, + 0xa,0x37,0x15,0xb1,0x93,0xbe,0x25,0x93,0x72,0x72,0x25,0x3b,0x62,0x6a,0x37,0x6e, + 0x8a,0xf3,0x54,0xd8,0x92,0x25,0x1a,0xc5,0xcc,0x47,0xd2,0x5f,0x6c,0x99,0xab,0xdd, + 0xf9,0x80,0x1d,0xa5,0xdd,0x21,0xd3,0x37,0x12,0xca,0x64,0x5a,0xc1,0x2c,0xa2,0xde, + 0x34,0x52,0xa1,0x36,0x16,0x16,0xd2,0xf0,0x11,0xc3,0x69,0xe2,0xa4,0x89,0xfc,0x9d, + 0xa1,0x86,0xa5,0xe9,0xa5,0xdd,0x49,0xf,0x8b,0x99,0xfd,0x3b,0xda,0xfd,0xe0,0x6d, + 0x8f,0x43,0x59,0xbe,0xc7,0xfd,0x5d,0x92,0xd2,0xcd,0x6c,0xe8,0xb9,0x31,0x5,0x6d, + 0x31,0xb5,0x6d,0xfd,0xf6,0x12,0xa6,0x9e,0xc1,0x83,0xb,0x5a,0x9f,0xb9,0xb9,0x55, + 0xb4,0x18,0xe4,0xaf,0xc6,0xc1,0x9c,0x4,0xe5,0x56,0x17,0xa8,0xce,0xf5,0x27,0x17, + 0x8d,0x69,0x4f,0x4c,0xb7,0x8b,0x1d,0xeb,0xc2,0xab,0xb3,0x81,0x87,0x1b,0x44,0x97, + 0x65,0x80,0xe2,0x66,0x33,0xf8,0x3e,0xd3,0xf7,0x7d,0x8c,0x19,0xdf,0x57,0xc5,0xce, + 0x57,0x7c,0xe7,0xaa,0x5d,0x29,0x4f,0xff,0x4f,0xa2,0xe0,0xc6,0xe6,0x9d,0xc5,0x56, + 0xb0,0x54,0x4,0xd5,0xa6,0x0,0xa4,0x2,0xc2,0xfa,0xb5,0xbd,0x6c,0x8a,0xef,0xaf, + 0x6f,0x8a,0x29,0xde,0xe8,0x75,0x93,0x39,0xb7,0x6,0xaf,0xff,0xf3,0xf7,0x79,0x3f, + 0xdb,0x82,0xb0,0x8,0x16,0x2b,0xab,0x69,0xa0,0xd5,0xb9,0x5,0xb4,0x73,0x77,0x31, + 0xd7,0x50,0x80,0xab,0x28,0xe8,0x23,0xae,0x19,0xf5,0x8b,0x25,0x8a,0x6d,0x1c,0x38, + 0x74,0x90,0x1e,0xe8,0x3b,0x93,0xba,0xf6,0x2a,0xa6,0x9b,0xfb,0xd5,0xaa,0x56,0xcd, + 0x0,0xd6,0x10,0x8e,0x94,0x30,0x20,0x5c,0x1f,0x2a,0xe1,0x46,0xf6,0x9,0x3,0xc2, + 0x3d,0x46,0x1f,0xa0,0x7,0xc7,0xc2,0x2f,0xc,0x10,0x1f,0xa1,0xbe,0xa,0xc4,0x3, + 0xa6,0x9f,0xa0,0x41,0x33,0x4f,0xb2,0x2a,0x7e,0x4c,0x1,0x19,0x50,0x6,0x90,0x27, + 0x2c,0x78,0x83,0xee,0x18,0x5c,0x46,0x13,0x67,0x2e,0x65,0xb7,0x15,0x22,0xa2,0xdb, + 0x59,0x85,0x7,0x26,0xf0,0x25,0xcb,0x57,0x71,0x6a,0x52,0x55,0x63,0x60,0x76,0xae, + 0x34,0xdf,0x4f,0x2a,0xcd,0x3,0x96,0x6f,0xde,0x55,0xa2,0x52,0x91,0xca,0x1,0x8a, + 0xc,0x8a,0xab,0x8a,0xd,0x86,0xec,0xc1,0x8e,0x3b,0xa8,0xb2,0xcf,0x19,0xc2,0xb5, + 0xe9,0x40,0xfc,0xfe,0x87,0x2e,0x82,0xea,0xc6,0xb8,0x15,0x23,0x88,0x8a,0xde,0xc6, + 0x69,0x9e,0x0,0x6b,0xb6,0x5c,0x7e,0x3c,0x9f,0xbf,0xfd,0xea,0xf7,0xdc,0x9a,0x95, + 0xa,0x7e,0xf3,0xcd,0x37,0xda,0x5e,0x7f,0xfd,0xf5,0x6e,0x49,0x2c,0x75,0x97,0x16, + 0x80,0xd1,0x2e,0x5c,0xb8,0x60,0xd6,0xdd,0x6,0x0,0x37,0xd4,0xd7,0x2f,0x97,0xea, + 0x37,0xed,0x0,0x14,0x10,0x4c,0x3b,0x40,0x95,0xca,0xd4,0xb,0xdf,0x4,0x10,0x6b, + 0xa5,0x6c,0x6f,0xb3,0xd5,0xb1,0xa5,0x7a,0xdb,0xed,0xcf,0x89,0x1d,0xaf,0x3f,0xab, + 0x3d,0x1e,0x94,0x25,0x3b,0x5e,0xdc,0x58,0xf8,0x5f,0xce,0x9c,0x3d,0x4b,0xab,0xd7, + 0xac,0xa1,0x65,0x39,0xcb,0x8,0x55,0xbe,0x10,0x5c,0xd5,0xee,0xa4,0x70,0xc4,0x82, + 0x4d,0x7c,0xbe,0x45,0x2b,0x38,0x25,0x9c,0x49,0xc9,0x33,0x1f,0xb0,0x3b,0x33,0x52, + 0x87,0x98,0x19,0xc9,0x5f,0x0,0xe1,0x5a,0x7c,0x6e,0xe3,0x6b,0x1d,0xde,0xb2,0x91, + 0x91,0x2f,0xb0,0xdd,0x9b,0x96,0x2,0xb3,0x34,0xa0,0x80,0x87,0x6e,0xd6,0xec,0xd9, + 0x34,0x74,0xe8,0x50,0x5a,0xbe,0x62,0x5,0xbd,0x7a,0xee,0x35,0xbe,0x6f,0x6e,0x60, + 0x96,0x57,0xfd,0x6a,0xa0,0x76,0xb4,0x79,0xd5,0xaf,0xf,0xc2,0x6d,0xe,0xd4,0x6e, + 0x24,0x58,0xce,0x7,0xf6,0x56,0xf9,0x79,0x57,0xdb,0x63,0x41,0x7e,0x16,0xb4,0x3b, + 0xda,0xfc,0x4a,0x3d,0x61,0x40,0x66,0x47,0xec,0xb7,0xc5,0xe2,0x9,0xb4,0xa,0x6e, + 0x75,0x73,0xd9,0x3d,0x1,0x84,0x49,0xb9,0xf0,0x49,0xf9,0xf0,0xae,0xc2,0x4c,0x1c, + 0x98,0x58,0x2a,0xdb,0x7f,0x6f,0xbd,0x81,0x8e,0x1e,0x93,0x7f,0xbb,0xc7,0xbd,0xe0, + 0xba,0x0,0x12,0xb,0xed,0x88,0x60,0x3d,0x9f,0xb,0xa1,0xb3,0x81,0x40,0x52,0x70, + 0x9d,0x4e,0xf9,0xc3,0xf3,0xb8,0x46,0x1,0xb,0x81,0x57,0x12,0xa8,0x8,0xa0,0x89, + 0x83,0xaf,0xc9,0xee,0xd0,0x79,0x7b,0xa3,0x3,0xea,0xa6,0xc8,0xb4,0xec,0x80,0x3b, + 0x82,0xe5,0x3e,0x5b,0xd5,0xe2,0xbd,0x42,0x15,0xcb,0x73,0x69,0x13,0xb4,0xdb,0xd1, + 0x6b,0x70,0x1b,0xf8,0x28,0x65,0xb6,0xb3,0xa4,0x82,0x27,0x4f,0x68,0xdc,0xb7,0x8f, + 0x63,0x68,0x10,0xb0,0x19,0xfc,0x8f,0x5d,0x35,0xe0,0x65,0xf3,0xb3,0x52,0xc3,0xc8, + 0xfd,0x9f,0x38,0x75,0xe,0x75,0x7d,0x28,0x8f,0xba,0x1,0xbe,0xfd,0x1,0x5f,0x1f, + 0x80,0x6b,0x19,0xc0,0x68,0xb7,0xe,0xae,0x67,0x9f,0xf0,0x1d,0x4a,0x9,0x77,0x1f, + 0xde,0x44,0x77,0x87,0x6a,0xf8,0xfe,0xd1,0x7,0x3,0x10,0x2b,0x45,0xdc,0x6b,0xe2, + 0x11,0x7a,0x74,0xf2,0x51,0xe,0xd4,0xea,0x8b,0xa6,0xa0,0x8c,0x6,0x28,0x3f,0x3a, + 0xf5,0x34,0x7d,0xb3,0x77,0x3e,0x15,0x6d,0xd9,0x15,0x9a,0xc3,0xaf,0x73,0xe4,0xf5, + 0x4f,0x7e,0xf6,0x73,0x9e,0x28,0x64,0xe3,0xd6,0x5d,0x26,0x12,0xba,0x3a,0x6,0x62, + 0x69,0x5d,0xb0,0x3,0xae,0x62,0xd6,0x7,0x2b,0xd8,0x6d,0x7f,0x5c,0xa1,0xd6,0xdb, + 0x96,0x4,0x63,0xb1,0x90,0x2e,0x87,0x6,0x7f,0xc,0x80,0x1d,0xcd,0x6e,0xe7,0x7b, + 0xfb,0x4c,0xd9,0x3a,0xe7,0x1b,0xeb,0x48,0x6f,0x83,0x85,0x50,0x5a,0x2,0xdb,0x3d, + 0xc1,0x98,0x28,0xca,0x81,0xd9,0x92,0xb4,0xa,0x3e,0x77,0xee,0xdc,0x22,0xcd,0x52, + 0x97,0xa7,0xf2,0x35,0xd6,0xcd,0x9f,0x3e,0x38,0xa9,0xe1,0xd,0xea,0xc4,0xdd,0xb6, + 0x6f,0xdb,0x7a,0xfd,0xf0,0x91,0xc3,0xc6,0xf7,0xeb,0x42,0xd2,0x28,0x61,0xf5,0x40, + 0xa5,0x7d,0xaa,0x58,0x80,0x5a,0x3,0x31,0x28,0x3e,0xe1,0x6c,0xf7,0x98,0x9b,0xcd, + 0xfe,0x4e,0x14,0xb4,0xa5,0xc6,0x3d,0xe6,0x68,0x4b,0x69,0x77,0xb4,0xc5,0x7c,0xbf, + 0x0,0x2d,0x1c,0xf1,0x8b,0x97,0x2c,0xe6,0xc8,0x66,0x14,0xbd,0xc0,0xb9,0xdc,0x0, + 0x25,0xd9,0x59,0xb9,0x85,0x41,0xdc,0xd4,0x27,0x2b,0xf8,0xc4,0x5b,0xc2,0xf0,0x5a, + 0xd6,0xb2,0x7d,0xd6,0x3c,0xba,0x22,0xc8,0x2b,0xb1,0xf4,0xe1,0xf5,0x6b,0xc9,0x65, + 0x36,0xdd,0x49,0x2c,0xc4,0x7b,0x1,0xe2,0x4f,0xbf,0xfb,0x39,0x15,0xaa,0x87,0x6f, + 0xd8,0xb0,0x61,0x5c,0xa1,0xb,0x91,0xee,0x78,0x10,0xa5,0x1f,0x30,0x51,0xd1,0x66, + 0x71,0x41,0xb4,0xb2,0xe9,0xdf,0xb6,0x62,0x48,0x18,0x26,0xb6,0x2c,0xd1,0xf3,0x31, + 0x8,0x77,0xc4,0x8f,0xc9,0xc8,0x81,0x56,0x4c,0x81,0x7b,0xa2,0xf4,0x6f,0xf4,0xfb, + 0x79,0x6,0x21,0xae,0x45,0x20,0x6,0xfa,0xa4,0x41,0x45,0x42,0x71,0x9a,0x6c,0x59, + 0x2,0xad,0xde,0xc1,0x49,0x76,0x17,0x81,0x9b,0x22,0xd8,0xd9,0xb1,0x31,0xf3,0x79, + 0x4c,0xc9,0xfb,0x5d,0xe,0x6e,0x60,0xe4,0xd,0xab,0xef,0x84,0x7d,0x78,0x5e,0x2f, + 0x37,0x5f,0xe6,0xc8,0x60,0x4,0x5e,0x69,0x60,0xea,0xa6,0x15,0x2d,0x0,0x1b,0xa9, + 0xce,0x7d,0xb1,0xfd,0x1a,0xce,0xc6,0x4f,0x6b,0xd4,0xad,0x6,0x69,0xa3,0x38,0xa6, + 0xd1,0x28,0x63,0xeb,0x75,0xf8,0x7e,0xc,0x2,0x6c,0xe8,0x37,0x5a,0x70,0x89,0x3e, + 0x67,0x9f,0x80,0x70,0xa0,0xfc,0x36,0x6e,0xd9,0x41,0xab,0xd6,0xae,0xa7,0xb3,0xaf, + 0xbd,0x2a,0x2,0x7d,0xb4,0x9f,0xbe,0x23,0x0,0x70,0x8,0x61,0x0,0x78,0xcf,0xde, + 0xbd,0x74,0xeb,0x43,0x73,0xe9,0xa6,0x3e,0x95,0xac,0x7c,0xdd,0x6,0x18,0x7f,0x63, + 0x40,0x1c,0xc4,0x80,0x30,0x4c,0xd2,0x77,0x84,0x26,0xe9,0xee,0xc3,0x22,0x10,0x43, + 0x11,0x23,0x52,0x1a,0x30,0x7e,0x48,0xc1,0x18,0x7e,0x62,0x44,0x4d,0x3f,0x32,0xe1, + 0x8,0x2f,0x7b,0x4d,0x3a,0x46,0xb7,0xd,0xdd,0x47,0x7d,0x47,0x2c,0xe6,0x82,0x41, + 0x50,0xbf,0x0,0x30,0x4c,0xd2,0xef,0xbe,0xff,0x3e,0x4f,0x73,0xa8,0xa3,0xa0,0x4d, + 0xab,0x77,0x1,0x1b,0x5a,0x9,0x4,0x18,0xa5,0xe5,0xc0,0x32,0xe5,0x5b,0x16,0x3, + 0x91,0xc6,0xa4,0x8e,0x97,0xd6,0x9,0x69,0xb2,0x76,0x3,0xdc,0x4c,0xbe,0x77,0x63, + 0x96,0xc0,0x37,0x7,0xe4,0x58,0xe2,0xb7,0xd4,0xe7,0xc5,0xb5,0xa0,0x7c,0xa5,0xe, + 0xc8,0xe2,0x7a,0x9,0x9,0x39,0xfb,0x1a,0xc2,0xbf,0xf9,0xfd,0xef,0xe8,0x37,0xbf, + 0xfb,0xad,0x52,0xc1,0x2d,0xec,0xb,0x7e,0xfd,0xfc,0xf9,0x9b,0x3a,0x63,0x6a,0x22, + 0x80,0x95,0x84,0xe6,0x66,0x1,0x58,0x49,0xe6,0xa6,0xa6,0xc6,0x39,0xc5,0xc5,0xbb, + 0xe8,0xc2,0xc5,0xb,0xac,0x7e,0x75,0xde,0x6f,0x0,0xbb,0x8,0xbc,0x19,0x67,0x5d, + 0xaa,0xd9,0xb4,0xf,0xc2,0x62,0x5d,0xbe,0x3f,0x11,0xde,0x9,0x8a,0x3b,0xdd,0x99, + 0x39,0x3b,0xec,0x1c,0x5c,0x53,0xb5,0x1c,0x69,0x7f,0xfc,0xe9,0x27,0xfc,0xb0,0xbf, + 0xa4,0xe0,0x5b,0x57,0x5f,0xcf,0x66,0x21,0x69,0xfb,0x6f,0xcb,0x56,0xb6,0xf2,0x5a, + 0xf6,0x0,0x22,0x19,0xbd,0xac,0xb,0x6d,0x44,0x53,0x60,0x45,0x73,0x52,0x22,0xc5, + 0xc2,0x6c,0xb,0x27,0x6e,0x90,0xc7,0x58,0x33,0x77,0xfc,0x50,0x4f,0xee,0x70,0xdd, + 0x2a,0x3,0x28,0x15,0x6b,0x9b,0x53,0xcd,0xca,0x77,0xdd,0xd2,0xb4,0x82,0xcf,0xc0, + 0xfd,0x3a,0x78,0xe8,0x10,0x97,0xb9,0x1c,0x3b,0x76,0x2c,0xed,0x29,0xd9,0xcb,0xd1, + 0xee,0xfa,0x1e,0xb8,0x60,0x92,0x26,0xfe,0x8c,0x80,0x5d,0xc6,0x1,0x96,0x75,0xef, + 0x3b,0x7c,0xc1,0x76,0xad,0x5e,0x77,0x85,0x15,0x49,0x2f,0xa0,0x93,0xf1,0x40,0xac, + 0x55,0x54,0xf,0xb3,0xaf,0xab,0xd5,0xec,0xcf,0x74,0xe2,0x86,0x48,0xb2,0xa8,0x58, + 0xd6,0x17,0x11,0x81,0xef,0xbb,0x96,0x56,0x4f,0x44,0xbe,0x75,0x2f,0x74,0xc,0x43, + 0x47,0x5b,0x22,0x6c,0x2d,0x93,0x7a,0x47,0x1c,0x9a,0xbe,0x81,0x48,0xe6,0x46,0xd2, + 0xfb,0xbc,0x3,0x9d,0x2c,0xa9,0x83,0x37,0x30,0x28,0xe8,0x6c,0xbb,0x8c,0xaf,0x90, + 0xe7,0x4c,0x32,0xd3,0xcb,0xd7,0x78,0xb6,0x8f,0x9d,0x38,0x41,0xb9,0x1b,0x8a,0x8c, + 0xa,0x95,0xe0,0xd3,0x30,0xc4,0x32,0x50,0xc7,0x8d,0xe,0x28,0x23,0x10,0x47,0x8a, + 0xd9,0xde,0xa6,0x1,0x2c,0xdf,0x17,0x74,0xcc,0xfb,0xcd,0x31,0x15,0x5e,0xa5,0x6d, + 0x43,0xbc,0xbc,0xb6,0xc1,0x32,0x8b,0x6a,0xdf,0xb2,0x1e,0x10,0xac,0x2b,0x28,0xe4, + 0x8,0x6e,0x4c,0x13,0xa8,0xe7,0xeb,0x8e,0xc0,0x1b,0xc1,0x57,0xab,0x5f,0xf4,0x41, + 0xe3,0x26,0xcf,0xa1,0x2e,0xf,0x15,0x2a,0xd8,0xd6,0xa8,0x56,0x25,0x5a,0x4,0x60, + 0x5b,0xd,0xd7,0x30,0x84,0xd1,0x18,0xc2,0xc,0xe2,0x7a,0xb,0xc4,0x30,0x4d,0x3, + 0xc6,0xf7,0x3c,0xbe,0x9f,0xee,0x1b,0x75,0x40,0x1,0xf9,0xa0,0xd3,0xe,0xd1,0xdd, + 0x23,0xf,0x53,0xb7,0x9e,0x45,0x94,0x5f,0xb8,0xdd,0xa8,0xe0,0x76,0xf6,0x49,0x5f, + 0xa7,0xf5,0xf9,0x1b,0xa8,0xb8,0xa2,0x36,0x80,0x6e,0x68,0x72,0xc6,0xba,0x6b,0x8e, + 0x37,0xf7,0x21,0x76,0xcf,0x5c,0xd3,0xbc,0x70,0x1f,0x34,0xec,0x73,0xee,0x6b,0x4, + 0xea,0xce,0x2c,0x15,0x26,0x1e,0x20,0x84,0xb0,0xb4,0x74,0xc8,0xdf,0x2b,0x5e,0x94, + 0xc5,0x1e,0xb8,0x21,0x30,0xe,0xa5,0x3f,0x61,0x82,0xd7,0xf9,0xbf,0xfe,0x72,0xb8, + 0xed,0x3c,0xa3,0xd2,0x1f,0x95,0xa,0x66,0x77,0xde,0x47,0x1f,0xd2,0xd9,0xb3,0x67, + 0x9e,0xd7,0x1c,0x75,0x9b,0x17,0xc0,0xd8,0x71,0xfe,0xfc,0x79,0x6b,0x29,0xdf,0x80, + 0x6d,0x3b,0xb6,0x6f,0xfb,0xee,0x81,0x83,0xfb,0x39,0x42,0xc,0x5,0x28,0x18,0x7e, + 0x61,0xfa,0x91,0xab,0x7e,0x7d,0x40,0x64,0x55,0x2c,0xf6,0xe9,0xd7,0x69,0x47,0xbd, + 0xca,0x6d,0x31,0xc0,0xb,0x20,0xa7,0x2d,0x25,0xed,0x1,0xb9,0xe3,0x3b,0xce,0x38, + 0xbe,0x63,0x37,0x4f,0x14,0x81,0x55,0xc8,0x95,0x45,0xb0,0x15,0x4c,0xb1,0x18,0xcd, + 0xb8,0xe0,0x8d,0xa2,0x6b,0x3b,0xfc,0x2a,0xe2,0xaa,0x63,0x42,0xd4,0x95,0xb3,0xc2, + 0x1f,0x10,0x4a,0x12,0xe6,0xa4,0x4f,0xd4,0x8f,0xa,0xa0,0x61,0x9,0xc5,0x89,0xf5, + 0x4f,0xf5,0xeb,0x70,0x1f,0x66,0x46,0xc2,0x40,0x47,0xef,0xc3,0x3a,0x96,0x9f,0x8a, + 0x63,0x3e,0xf9,0x2c,0x5a,0x47,0xe0,0x94,0xac,0x70,0x15,0x8b,0x8e,0x75,0xfd,0x86, + 0xd7,0xec,0x28,0x5e,0x19,0x64,0xa4,0x55,0x37,0x7c,0xde,0x28,0xa5,0x9,0x35,0xc, + 0x1f,0x38,0x7c,0xe2,0x6e,0x6a,0x90,0x84,0x4d,0xcc,0x45,0xd0,0xde,0xea,0xd,0xc0, + 0x4b,0x1a,0x20,0x65,0x7c,0x6e,0x3,0x11,0x4f,0x20,0x7f,0xe7,0xec,0x6a,0x3b,0xea, + 0xf4,0xa5,0xab,0x43,0x42,0xca,0xb2,0xa8,0xb4,0xdb,0x56,0x13,0xb7,0x90,0x4c,0x12, + 0x48,0xdd,0xcf,0x74,0x7,0x77,0xde,0xc0,0xc4,0x4e,0xa0,0x27,0xc1,0x6c,0xbf,0xaf, + 0x35,0xae,0xdc,0x3b,0xf4,0xe7,0xc6,0x8f,0xb5,0xcf,0xd7,0x9e,0x98,0x96,0xe7,0x6, + 0x7e,0xf9,0xb2,0x3,0x7c,0x95,0xeb,0x5a,0x13,0x22,0xe0,0xb3,0xe,0x3c,0x9c,0x60, + 0x3d,0x7d,0xbf,0xbc,0x1,0x6f,0xe1,0xf1,0xf8,0x1f,0xc,0xd2,0x8e,0x36,0xd3,0xae, + 0xd2,0x4a,0x3,0x50,0x17,0xbc,0xc6,0x1c,0x1d,0x2,0xd7,0x74,0xde,0x61,0xc7,0x6c, + 0x9b,0xad,0x6d,0x48,0xbb,0x6a,0x5a,0x42,0x44,0x3,0x3d,0x3a,0x7f,0x83,0x80,0xbc, + 0xd,0xfc,0x8,0xd4,0x4d,0xe6,0xf3,0xb4,0x22,0xc3,0xb5,0x23,0xc5,0xa8,0xb4,0xbc, + 0x9c,0xfb,0x4f,0xfc,0x7f,0xd9,0x31,0x1,0x21,0x84,0x43,0x5,0xac,0x2b,0x5f,0xc1, + 0xfd,0x75,0xc7,0xc3,0xb3,0x82,0xa8,0x67,0x5,0xdd,0x6e,0x7d,0x2b,0x63,0x10,0xbe, + 0xa5,0xbf,0x1f,0xc2,0x58,0x7e,0x6b,0x60,0x64,0x92,0x96,0x8a,0x98,0x61,0xac,0x40, + 0xac,0x61,0x8c,0x80,0x2d,0x0,0x39,0x58,0xee,0xf,0xda,0xe3,0x7,0xd8,0xe4,0xfd, + 0xd8,0xb8,0x25,0x5c,0xfb,0x18,0xc1,0x58,0x50,0xc1,0x3f,0xfa,0xc9,0x4f,0xa9,0xa2, + 0xaa,0x9a,0x36,0x28,0x25,0xf,0x15,0x1c,0xc0,0x75,0x7f,0xb4,0xac,0x6b,0x12,0xbe, + 0xf5,0x7d,0xd6,0xeb,0x4a,0x61,0x11,0x90,0x26,0x62,0x9,0x63,0xe9,0x2a,0x90,0x51, + 0xeb,0xf6,0xfe,0xa6,0x98,0x7f,0xde,0x17,0x78,0x27,0x95,0xae,0x1e,0xc,0xf9,0x6, + 0x53,0xae,0x1a,0x7,0x80,0x37,0xef,0xd8,0x4d,0xb5,0x75,0x75,0xdc,0x1f,0xfa,0x6, + 0xc6,0xd2,0xdd,0x7,0x5,0xfc,0xcb,0x5f,0xff,0x8a,0x7f,0xdb,0xf3,0xaf,0x9f,0xfb, + 0xde,0xb9,0x73,0xe7,0xbc,0x3c,0x95,0x9c,0x35,0x7f,0x78,0x91,0xd4,0x60,0x7e,0xde, + 0xbf,0x7f,0xdf,0x84,0x6d,0xdb,0xb6,0xfe,0xbf,0xaf,0x9d,0x3f,0xc7,0x90,0x60,0xf5, + 0xdb,0x6e,0xc3,0x36,0x2d,0xe1,0x2b,0xe0,0xaa,0xa1,0x19,0x74,0x6e,0xc1,0x71,0xa9, + 0xd6,0x74,0xfc,0xd8,0xd0,0x14,0x2d,0x95,0xb3,0x4,0xbc,0xa5,0xae,0xdb,0x32,0x71, + 0xb5,0xec,0xbc,0x96,0x9d,0x7d,0xba,0xcd,0x5f,0x20,0x84,0x2b,0x6d,0xa9,0xed,0x30, + 0x33,0x17,0x6c,0x28,0xa0,0xbc,0x82,0x7c,0x86,0xe,0xb6,0xf9,0xd3,0x40,0x92,0x4c, + 0x9f,0x51,0xc7,0xe3,0xfa,0xcb,0xf0,0x8f,0x86,0xc2,0xe8,0x1b,0xa,0x37,0xd2,0xe8, + 0x31,0xa3,0xa9,0xff,0x80,0x1,0x41,0x1b,0x38,0x20,0x5a,0x57,0x6d,0xc0,0xc0,0x81, + 0x6a,0xd9,0x9f,0x5b,0x3f,0x2c,0xe5,0xfe,0x70,0xbd,0x5f,0xff,0xfe,0xd6,0x7b,0xf0, + 0x1a,0xc7,0xe,0x50,0xfb,0x27,0x4c,0x9c,0xc8,0xd1,0x7b,0x18,0x31,0xf3,0x3f,0xb7, + 0x47,0xad,0x7b,0x23,0x89,0x85,0x5f,0xcf,0xad,0xfd,0x7c,0x9d,0xfd,0x1a,0x9f,0xb0, + 0x3f,0x78,0xe8,0x63,0x43,0x69,0xed,0xba,0xb5,0x1c,0x85,0x6a,0x29,0xe1,0x84,0x74, + 0x32,0xd7,0x9f,0xef,0x73,0x19,0x44,0x95,0xd3,0xda,0x2d,0xc5,0x6a,0x41,0x57,0xb8, + 0x2a,0xdc,0xd4,0x32,0xdf,0xf9,0xe4,0xe7,0xb8,0xb0,0x4c,0x4a,0x79,0xb3,0x14,0xb7, + 0x7,0xf6,0xb1,0x6b,0x73,0x14,0xba,0xcf,0x55,0xe2,0x35,0x5d,0x77,0xb4,0xc7,0x6, + 0x0,0x5a,0x9d,0xdf,0x50,0x4a,0x5d,0xbb,0x9d,0x3b,0x9d,0x71,0x60,0xeb,0x6,0x9f, + 0xb9,0xa,0x36,0xeb,0xa0,0xc5,0x37,0x30,0xf0,0x98,0xcc,0x5d,0x1f,0xbf,0x6b,0xd1, + 0x70,0x4d,0xed,0x37,0x52,0x98,0x27,0x9b,0x2,0xc6,0xe0,0x15,0xa5,0x5c,0x73,0x37, + 0x16,0x85,0x9d,0x67,0x4,0x4e,0x4,0x31,0x5,0x10,0x6c,0xb0,0xe0,0xaa,0x55,0xa8, + 0x56,0xb1,0x52,0x49,0x69,0x30,0xda,0xad,0xd1,0xda,0x6e,0xde,0x27,0xcc,0xd8,0xfa, + 0x38,0x9f,0xf9,0xdb,0x55,0xc2,0xba,0xe3,0xd7,0x66,0x67,0x4,0x8d,0x2d,0x5f,0xbd, + 0x86,0xe,0x1f,0x3d,0x12,0xc,0x2a,0x54,0x87,0x1e,0xfc,0x1e,0x11,0x78,0x83,0xef, + 0xdc,0x61,0x81,0x18,0xb9,0xb7,0x8b,0x97,0x2e,0xa7,0x2e,0xf7,0x2d,0xd,0xd5,0xae, + 0x2,0x2e,0x0,0xec,0x40,0x58,0x3,0xd8,0xaf,0x86,0x6b,0x8d,0x1a,0xb6,0x40,0x3c, + 0x38,0x8,0xd4,0xba,0x3d,0x8c,0x9a,0x86,0xaf,0x58,0x37,0xe4,0x12,0xdf,0x11,0xb6, + 0x6f,0xe,0xda,0x4f,0xb7,0x3d,0xba,0x9a,0xe,0x1f,0x39,0xca,0xb9,0xc1,0xda,0xc, + 0xfd,0xea,0xb9,0x73,0xb4,0x72,0x5d,0x7e,0x98,0xf7,0xbb,0x9f,0xb,0x88,0x48,0x73, + 0x73,0x45,0x42,0x80,0x9a,0x5,0x67,0x4b,0xcd,0x36,0x85,0xc1,0x6d,0xfb,0x1d,0x35, + 0xda,0xe8,0xdc,0x6f,0x5b,0xed,0x66,0x53,0xd0,0xd2,0x27,0x6f,0xfb,0xf9,0x9b,0x4c, + 0x70,0x97,0xfd,0xbb,0xc9,0x20,0xbd,0xe0,0xb7,0x5b,0x9f,0x5f,0xc0,0xbe,0x5d,0x58, + 0x19,0xdb,0xad,0x19,0xf9,0x22,0xc1,0x82,0xe7,0x1d,0x73,0x1b,0x23,0x2d,0x9,0xaf, + 0xdf,0x7b,0xff,0xbd,0x7f,0x3b,0x7b,0xf6,0xec,0x78,0xd,0xda,0xa4,0x66,0xfe,0x40, + 0x6b,0xd9,0xf4,0x1,0x9a,0xe2,0xbb,0x77,0xef,0x3a,0x5b,0xdf,0x50,0xc7,0x5,0x27, + 0x7e,0xa0,0x46,0xa3,0xae,0xaa,0x45,0x4b,0xb5,0x66,0x62,0x26,0x68,0x6,0x65,0x5b, + 0xc6,0x3a,0xce,0x52,0xc2,0xee,0x7b,0xda,0xa2,0x73,0x79,0x95,0x33,0xf6,0x85,0xa6, + 0x6f,0x3,0x76,0xb1,0x4f,0x77,0xd4,0xf2,0x9c,0xbe,0xe,0x59,0x76,0xe,0xf0,0x6f, + 0x0,0xbc,0x45,0x9b,0x36,0xd1,0xbb,0x1f,0xbc,0x6f,0x46,0xdd,0xd9,0xfc,0x52,0xad, + 0x1e,0x9f,0x97,0x6b,0x2e,0xd5,0x53,0x3,0x42,0x9d,0x3e,0x3d,0x7b,0x16,0xdd,0x73, + 0xef,0xbd,0x74,0x6f,0x8f,0x1e,0xf4,0xe0,0x23,0x8f,0x50,0xff,0x41,0x83,0x69,0xe0, + 0x90,0xa1,0x34,0x60,0xc8,0x10,0x1a,0x38,0x74,0x28,0xaf,0xf3,0x72,0xe8,0x63,0x34, + 0x48,0xb4,0x60,0x5b,0xd0,0xf4,0x6b,0xbd,0x8f,0xdf,0xab,0xde,0xd7,0x47,0x41,0x18, + 0xe7,0xbd,0xa3,0xfb,0x9d,0x74,0xc7,0x9d,0x77,0xd2,0xfc,0x85,0xb,0xc2,0xc9,0x17, + 0xae,0x89,0xa8,0xd4,0x78,0x29,0x45,0xb7,0xd4,0x62,0xab,0x93,0x63,0xdb,0x2a,0x82, + 0x5f,0xf0,0x9b,0xe7,0xe5,0xe7,0x73,0xce,0xf0,0xca,0x55,0xab,0x78,0xc0,0x62,0x45, + 0x7,0xfb,0xcc,0xfd,0x9e,0x68,0x75,0x2b,0xe8,0xe,0xbf,0x95,0xf,0x5e,0x9e,0x1, + 0x53,0x52,0x47,0x2e,0x7f,0x63,0x6b,0x0,0xd6,0xee,0x4f,0x43,0xb3,0x5d,0x20,0x6d, + 0x31,0xb5,0xeb,0x83,0xac,0x3b,0x18,0x90,0x39,0xee,0x5e,0x70,0x27,0xb8,0x57,0x32, + 0x1e,0x57,0x49,0x3c,0x5a,0xdb,0x1,0x63,0x47,0xf6,0xc,0x82,0x6c,0x30,0xcd,0x78, + 0x6,0x16,0xba,0xb9,0x4a,0x54,0xbe,0xf6,0x5,0x3c,0xb6,0xa,0x57,0x83,0x5,0xfc, + 0x4,0x93,0xb6,0xfe,0x2e,0x72,0x70,0x91,0x64,0xa2,0xb7,0x7,0xa,0xf1,0xc1,0xc6, + 0x17,0x97,0xbf,0xa0,0x82,0x8d,0x85,0x4a,0x41,0x56,0xc4,0xd4,0xa5,0x84,0x67,0xa0, + 0x4c,0x1b,0xc4,0x31,0xd,0x6,0xd0,0xe8,0x4c,0xcb,0x6a,0xea,0x63,0x80,0x4d,0x86, + 0x70,0xa3,0x50,0xcc,0x81,0xe2,0xd6,0x20,0x8f,0x3e,0xcb,0xf6,0x9,0x47,0xd7,0xd1, + 0xc8,0x9f,0xab,0xd7,0xd7,0x6f,0x28,0xa2,0x75,0x79,0xc1,0xc0,0x5e,0x2b,0x29,0x7b, + 0x10,0xa2,0xfb,0x15,0xfc,0x9f,0x46,0xa,0x18,0xf0,0xc5,0x1c,0xc7,0xfd,0x6,0x8f, + 0xa3,0x2e,0xf,0x6d,0x8a,0xc3,0xd7,0x5d,0x2,0xc4,0xfd,0x6c,0x10,0x7,0x2a,0x38, + 0x4b,0xa0,0xd6,0xa0,0x48,0x15,0xa3,0x45,0xeb,0x8d,0xa6,0x7d,0x6b,0x70,0x13,0x75, + 0x7d,0x64,0xb,0xe5,0x17,0xee,0xe0,0xc2,0x20,0x0,0x30,0x52,0xa3,0x3e,0xfd,0xfc, + 0xbb,0xb4,0x74,0xc5,0x6a,0xe3,0xff,0xd5,0xea,0x57,0xc2,0x56,0xdf,0x43,0x73,0x5f, + 0x85,0x85,0x40,0xe7,0x54,0xdb,0x50,0xb6,0x5d,0xb,0xfc,0xdb,0xd5,0x35,0x79,0xa2, + 0xca,0xb3,0xbd,0xa7,0xc9,0xe3,0xcf,0x6f,0x8a,0x5,0xe8,0xd9,0xdb,0x9b,0x62,0xa6, + 0x71,0x2c,0x51,0x16,0x14,0x83,0xa7,0xca,0xea,0x2a,0xbb,0x38,0x8c,0x13,0xb7,0xa0, + 0x9f,0xd5,0xdf,0xfd,0xe1,0xf7,0xf4,0xb3,0x5f,0xfc,0x9c,0x7e,0xf0,0xc5,0xf,0xe8, + 0xb5,0xd7,0x5e,0x7d,0x4d,0xfd,0x59,0x4c,0x75,0x39,0x6b,0x1,0x58,0x1e,0x2c,0xdf, + 0x74,0xf4,0xe8,0xd1,0x9e,0x9b,0x37,0x17,0xfd,0xe7,0x57,0x4e,0xbf,0x12,0xcc,0x78, + 0x94,0x49,0x79,0x1,0xaa,0xe1,0x98,0xf2,0x80,0x16,0xd,0xfb,0x22,0x65,0x6c,0x3, + 0xd6,0x7d,0x8f,0x6,0x70,0x70,0xbe,0xa0,0xf9,0xa0,0xef,0xbe,0x76,0x7d,0xc6,0x69, + 0xd1,0x91,0xc9,0x8e,0x45,0xff,0x13,0x20,0xef,0xe,0xca,0x77,0xfb,0x8e,0xed,0xa6, + 0x8,0x85,0xbc,0xc9,0x71,0xdf,0x9d,0xab,0x92,0x1c,0xb3,0xa2,0xd3,0x19,0xe1,0x3c, + 0xbb,0x8a,0x77,0xd3,0xb0,0xc7,0x1f,0xa7,0x29,0x33,0x66,0xd0,0x13,0x13,0x26,0xd2, + 0xf4,0xa7,0x67,0xd1,0xf3,0x8b,0x5e,0xa2,0x85,0xcb,0x72,0x68,0xc1,0xd2,0x65,0xb4, + 0x70,0x69,0xb8,0x5c,0xe6,0x2c,0x9d,0xed,0x51,0x8b,0x5e,0x2f,0xca,0x59,0x4e,0xf3, + 0x97,0x2c,0xa3,0x27,0x9f,0x79,0x96,0x46,0x8d,0x1d,0x4b,0xf,0x3c,0xf4,0x10,0x43, + 0x18,0x5,0x43,0x8c,0x7f,0x29,0x21,0xa,0x39,0x16,0x7d,0xec,0xa9,0xd8,0x64,0x22, + 0x50,0xd5,0xb9,0x10,0x74,0xb7,0x75,0xdb,0x56,0x8e,0x90,0x5e,0xb1,0x72,0x5,0xbb, + 0x22,0xdc,0x9,0x2f,0x64,0x7,0xec,0x5a,0x24,0x18,0x92,0x6d,0x99,0x44,0x97,0x42, + 0xc,0x74,0x1d,0x6d,0xb1,0x28,0xf9,0x74,0x5b,0x72,0xd0,0x9f,0xcf,0xf4,0x1a,0x3b, + 0xce,0x63,0x39,0x71,0xe1,0x65,0xae,0xc9,0xfd,0x2e,0x4e,0x71,0x19,0xf7,0x3b,0x65, + 0x6e,0x20,0xdd,0xce,0x8a,0xde,0xf7,0xb8,0x5e,0x7c,0xf7,0xc1,0x32,0xdb,0x77,0xb4, + 0x25,0xe,0x76,0x24,0x64,0xa5,0xf,0x3b,0x1b,0xbc,0xdd,0x6b,0x4a,0x34,0x89,0x27, + 0x95,0x99,0x75,0xfd,0xf8,0x1d,0x32,0x27,0x3f,0x3e,0x0,0xba,0x11,0xeb,0x41,0xf4, + 0x2c,0x6,0xbe,0x5f,0xa8,0x5f,0xf8,0x4d,0xb5,0xe2,0xd,0xe0,0xd6,0xc0,0x79,0xc0, + 0x1a,0x7c,0x12,0xac,0x1,0x74,0x9b,0x62,0xe6,0x61,0xf9,0xda,0x28,0x67,0x47,0x5d, + 0xc5,0x55,0x70,0x83,0x75,0xe,0x17,0xf0,0x31,0x9f,0x73,0x7d,0xe4,0x6f,0x2c,0xa9, + 0xaa,0xe3,0x14,0xa3,0x6d,0x3b,0x76,0xb0,0x9b,0x48,0x9a,0x9c,0x35,0x78,0xb5,0xa, + 0x96,0xeb,0x5a,0xfd,0xc2,0xfc,0x7c,0xec,0xf8,0x51,0xba,0xa5,0xfb,0x30,0xba,0xa9, + 0xf7,0x5e,0x5,0x55,0xd,0xdf,0xca,0xd0,0xc,0x2d,0x54,0xb0,0x81,0x70,0x8,0x5f, + 0xb,0xc4,0x35,0x6,0xc4,0x51,0x8b,0x72,0x87,0x25,0x90,0x83,0x56,0x6f,0xda,0x37, + 0x7,0xaa,0x36,0xa8,0x81,0xba,0xf6,0x2c,0xa5,0xa7,0xe7,0xae,0xe5,0xff,0x3f,0xf8, + 0xa5,0x1,0xe1,0x96,0x74,0x9a,0xb,0x87,0x94,0xd5,0x34,0x1a,0xf3,0x33,0x54,0xb0, + 0xbc,0x9f,0x96,0x1f,0x3c,0xb,0x98,0x3,0x75,0xda,0xe8,0x35,0xd,0x4b,0xdf,0x6f, + 0x85,0xe5,0xbb,0x17,0xe7,0x12,0x6e,0x2,0x39,0x70,0x92,0x9f,0x21,0x3,0xea,0xdc, + 0x81,0x93,0xdc,0xe7,0xc6,0x10,0xc0,0x3c,0x8e,0xd9,0xb6,0xa0,0x82,0xdd,0x18,0x1a, + 0x69,0xf1,0xc4,0xb3,0xfb,0x93,0x9f,0xfd,0x94,0x21,0x8c,0xf5,0xb7,0xde,0x7a,0xf3, + 0x3f,0x9d,0x39,0x73,0xfa,0x61,0xc9,0x53,0x30,0x56,0x37,0xb,0xc0,0x72,0x87,0x6c, + 0x50,0xbf,0x65,0x65,0xa5,0x45,0x7b,0x4b,0xf6,0xd0,0x1b,0x6a,0x4,0x7,0xf3,0x26, + 0x43,0x31,0x6c,0x96,0xa9,0xd9,0x7,0x63,0x7d,0x4c,0xc,0x94,0xad,0x6,0xac,0x7c, + 0x4c,0x9b,0xb,0xe0,0x74,0xcc,0x97,0xec,0x3,0xaf,0x3e,0xce,0x7a,0xbf,0xe7,0x58, + 0x69,0xee,0xd3,0x37,0xb,0xa6,0x54,0x44,0xfb,0xee,0xd8,0xb5,0x93,0x3e,0x54,0x3, + 0x8b,0x6c,0x79,0x9c,0xd2,0x84,0xe7,0x8d,0xc0,0xb6,0x2a,0x6d,0x45,0xe6,0x5d,0x7c, + 0xb7,0x65,0x2b,0x57,0xd2,0xcc,0xd9,0xb3,0x69,0xf8,0xa8,0x51,0x34,0x76,0xe2,0x24, + 0x9a,0x3b,0x7f,0x1,0xad,0x55,0x3f,0xe8,0x86,0xcd,0x5b,0xa9,0x60,0xf3,0x16,0x2a, + 0xd8,0xb4,0x45,0xad,0x6f,0xe1,0xf5,0xbc,0xa2,0x4d,0x66,0x7d,0xc3,0x96,0x60,0xff, + 0xc6,0xad,0xdb,0xf8,0x98,0xfc,0x4d,0x9b,0xf9,0x35,0x2f,0x37,0xe1,0x7d,0x9b,0xa9, + 0x50,0xed,0xdb,0x59,0x52,0x4a,0x2b,0xd6,0xad,0xa7,0x19,0xb3,0x9f,0x61,0xc8,0xdf, + 0x75,0xcf,0xdd,0x3c,0x1b,0x92,0x9e,0x4,0x40,0xfb,0x79,0xe3,0x69,0x39,0x32,0x7d, + 0xa7,0x3d,0x6b,0x20,0x4e,0x30,0x7d,0xdd,0x35,0xf6,0x8b,0xef,0xd8,0xb9,0x83,0x8b, + 0x76,0xac,0x59,0xb7,0xd6,0xf8,0x84,0x93,0x4c,0xb9,0x3e,0x37,0x41,0xcc,0x55,0xd0, + 0x66,0x9b,0x7a,0x93,0x0,0x99,0xf6,0x58,0x3b,0xb2,0x6,0xe8,0x25,0xc,0x2,0x12, + 0xc1,0xe8,0x8d,0xa2,0x17,0xc1,0x7e,0x3a,0x5a,0xbf,0xdd,0x55,0xd1,0x71,0x58,0xc6, + 0x40,0xeb,0x14,0x95,0x31,0xf7,0xa7,0x2d,0x63,0x62,0x19,0x7c,0x7e,0xef,0x4c,0x82, + 0x85,0xe0,0x46,0x52,0xf9,0xbc,0x6e,0x81,0x4,0xb5,0xac,0xff,0x27,0xd2,0x4e,0x86, + 0x82,0xf5,0x79,0x1d,0x6d,0x59,0x4d,0xf8,0x5e,0xdf,0x7e,0x7b,0xdc,0x95,0x64,0x7, + 0x45,0x26,0x5,0xb0,0x5,0xeb,0x18,0xf4,0x21,0x1d,0x4,0x91,0xcf,0x96,0x72,0xad, + 0x97,0x10,0x14,0x8d,0x1,0x5d,0x2f,0x14,0xa8,0xdc,0x1f,0x29,0x53,0x57,0x35,0x7, + 0x60,0x15,0xdb,0x85,0x9a,0xd5,0xaa,0x57,0x7e,0xbe,0xed,0x3,0x76,0xcd,0xdd,0xfb, + 0x68,0xfb,0x9e,0x52,0xf5,0x7f,0xbf,0x9a,0x6a,0x1b,0xea,0x79,0xa6,0x32,0xc,0x24, + 0xbc,0x41,0x84,0x6d,0x6d,0xc,0xdb,0xe0,0xfb,0xeb,0x7e,0x26,0x50,0xc2,0x70,0xff, + 0xac,0x59,0xbb,0x9a,0xba,0xdc,0x3a,0x4a,0x1,0xb6,0x3c,0x4,0x2e,0x20,0x5c,0x61, + 0x40,0x6c,0x60,0x1c,0xf3,0xb,0xc7,0x7d,0xc4,0x58,0xba,0x10,0x96,0x30,0xb6,0xa1, + 0x2c,0x5b,0x3d,0x75,0x7d,0xb4,0x9a,0x46,0x4c,0xc8,0xe1,0xd9,0xa7,0xda,0xaf,0x42, + 0xc5,0x7,0xa,0x1d,0xe6,0xd9,0xbd,0x95,0x75,0x1,0x78,0xf9,0x1e,0x34,0x9,0x35, + 0xbc,0xcf,0x63,0xad,0x68,0x8a,0x99,0x93,0x5d,0xe8,0x1a,0xa0,0x8a,0x7b,0x2c,0xfd, + 0xbc,0x72,0x30,0x25,0xfd,0xc1,0xbe,0xf3,0x4a,0xc5,0x6b,0x1f,0x6f,0xe7,0x78,0xbb, + 0xd0,0x95,0x20,0xe6,0x2a,0x65,0xbb,0xf6,0xf0,0xf4,0xb2,0xd1,0x20,0xaa,0xcd,0x5b, + 0xff,0x0,0x7d,0xe1,0xef,0xbf,0xfe,0x8a,0xab,0x68,0x7d,0xf2,0xd9,0x27,0x74,0xfa, + 0xf4,0xa9,0xad,0x49,0x6c,0x45,0xb3,0x0,0xfc,0xea,0xab,0xaf,0x9a,0xa6,0xf,0x38, + 0x73,0xe6,0xcc,0x4d,0x9b,0x36,0x15,0x5e,0x47,0x20,0x0,0x3a,0x5b,0x98,0x36,0x2d, + 0x50,0xa,0x8,0x5b,0x40,0x16,0xdb,0x62,0xb0,0x14,0x6a,0xd5,0xbc,0x4f,0x74,0xce, + 0x29,0x1,0x61,0xf9,0x1e,0xad,0xbc,0x25,0xb8,0xf5,0x7e,0xeb,0x58,0x61,0x9a,0x76, + 0x53,0x91,0xf4,0x4d,0x42,0xe1,0x89,0xad,0xdb,0xb6,0xf1,0x54,0x81,0x58,0x77,0x67, + 0xdf,0x91,0xe0,0xcd,0x58,0xca,0xd7,0x5f,0x69,0x2b,0x2a,0x6f,0x69,0x9b,0x97,0xd0, + 0x81,0x2c,0x5a,0xb2,0x84,0xa6,0xce,0x9c,0xc9,0x66,0xe7,0x9,0x53,0xa7,0xd1,0xf3, + 0xb,0x17,0xb1,0xaa,0x5d,0x18,0xaa,0x58,0x2c,0xe7,0x2f,0x5e,0x12,0x28,0x5a,0xb5, + 0x7d,0xfe,0xe2,0xa5,0x34,0x45,0x1d,0x3f,0x7c,0xe4,0x28,0x56,0xb5,0x73,0x5e,0x9c, + 0x4f,0x2f,0x29,0xa5,0xbb,0x60,0xc9,0xd2,0xe0,0x3d,0x4b,0x82,0xf7,0x2c,0xa,0x95, + 0xf1,0x9a,0xbc,0x7c,0x5a,0x9b,0xbf,0x81,0x95,0xf5,0xe4,0xe9,0x33,0x68,0xc8,0xf0, + 0xe1,0x34,0x61,0xd2,0x44,0xfe,0xec,0x28,0xd0,0x2a,0x9e,0x6e,0x92,0x89,0xf9,0xfb, + 0xda,0x3d,0xbe,0x3c,0x3b,0x0,0xe7,0x6a,0x8,0x61,0x98,0xeb,0x87,0x2a,0x8,0x6f, + 0xd8,0xb8,0x91,0x47,0xf7,0x32,0xf8,0x4c,0x83,0xca,0x82,0x99,0xe3,0xcb,0x4f,0x2, + 0x73,0x2c,0x8e,0x40,0xfe,0x8e,0x8e,0x72,0x76,0xcf,0x67,0xd,0xd8,0xb2,0xc4,0xd, + 0x18,0xe8,0x79,0x54,0x75,0x92,0x6a,0x77,0x61,0x97,0x4e,0x80,0x9e,0xeb,0x16,0xf1, + 0x9a,0xc7,0xad,0x20,0xc2,0xc8,0xc,0x9f,0x11,0x83,0x96,0xa4,0x81,0x5e,0x62,0xd1, + 0x1b,0x2f,0x7c,0xdb,0x92,0x3f,0x3f,0x5b,0x60,0x5c,0x47,0x5b,0x72,0x6e,0x7e,0x16, + 0xf7,0x82,0xb9,0x4f,0x59,0x8a,0xef,0x24,0x5a,0x28,0x2c,0xb3,0x7b,0xbb,0xa9,0x32, + 0x17,0xe4,0xfd,0xe6,0x3b,0xf0,0x6b,0x30,0xe6,0xe5,0x60,0x59,0x2f,0x94,0x69,0xa3, + 0x5,0x5b,0x7d,0x8c,0x6,0xa9,0xde,0xa6,0x41,0x6c,0x2f,0x1b,0x2c,0xd5,0x1b,0x6c, + 0xf,0x61,0x1e,0xb,0xb8,0x92,0x90,0x8e,0xcc,0xd1,0x50,0xbe,0x48,0x5f,0x59,0xa9, + 0x94,0xe1,0x2b,0xa7,0x4e,0x45,0x33,0xba,0xb5,0xb5,0xc6,0x22,0xe8,0xf5,0xf7,0xe, + 0x14,0x6f,0xa4,0x84,0x33,0x61,0x4b,0xb5,0xb6,0xd2,0xa4,0x49,0x13,0xa8,0xcb,0x1d, + 0x53,0x15,0x64,0x2b,0x42,0xf0,0x56,0x84,0xeb,0xb6,0x1a,0xd6,0xcd,0xf,0x62,0x3b, + 0x48,0x4b,0x16,0xf0,0xd0,0xa6,0xe9,0x5b,0x1c,0x33,0x35,0x6f,0xeb,0xaf,0xd7,0xeb, + 0xa8,0x6b,0x9f,0x5a,0xea,0x3f,0x2a,0x87,0x3e,0xfb,0xfc,0x53,0x36,0x3f,0x7,0x66, + 0xe8,0x6b,0x94,0xbf,0xa1,0x90,0x76,0x97,0x57,0xab,0x7b,0xd1,0x64,0x0,0x9c,0x64, + 0xe2,0x97,0x11,0xeb,0x36,0x98,0x6d,0xeb,0x82,0xd9,0x5e,0x2b,0x3,0xed,0x9a,0xcc, + 0x20,0x89,0x5f,0x9b,0xfd,0x4d,0x42,0x1,0x37,0x59,0x4a,0x59,0xc2,0xda,0xd,0xba, + 0xb3,0x7,0x52,0xfe,0x6b,0xb6,0xa0,0xae,0xae,0x3d,0x6f,0xc3,0x46,0x9e,0x7e,0x50, + 0xab,0x60,0x37,0x78,0x50,0xf7,0x7f,0xa8,0x11,0xfd,0xef,0x7e,0xf5,0x4b,0xd5,0xff, + 0x5e,0x41,0x65,0xac,0x1f,0x9d,0x3d,0x73,0xa6,0x9b,0xe6,0xa9,0x64,0x2c,0x9a,0xf9, + 0x73,0x77,0xa0,0x41,0x22,0x37,0x36,0x36,0x4c,0xda,0xba,0x75,0xcb,0x7f,0xe3,0xe0, + 0xab,0xcf,0x3e,0x35,0x90,0x95,0xa6,0x61,0x5b,0xd5,0xda,0x80,0x95,0x2a,0x38,0x25, + 0x20,0x2d,0xdf,0xeb,0x55,0xd4,0xe,0xd4,0x6d,0x13,0x77,0x3a,0x6,0x6b,0x9f,0xbf, + 0xd9,0x97,0xa,0x5,0x50,0x20,0x9a,0x78,0x6f,0x69,0x9,0x6d,0xde,0xb2,0x99,0x7, + 0x15,0x6d,0xc2,0x91,0xde,0x96,0x30,0xfb,0x92,0x37,0xe0,0xa7,0xdd,0x5f,0x24,0x44, + 0x46,0x59,0xa3,0xa0,0xc7,0xa2,0x65,0xcb,0x68,0xe4,0x13,0x4f,0x50,0xaf,0x3e,0x7d, + 0x68,0xfc,0xe4,0x29,0x34,0x6f,0xc1,0xc2,0x0,0xba,0xa,0xa8,0x80,0xaa,0x86,0xb0, + 0x5e,0xce,0x98,0x35,0x5b,0x29,0xe5,0x89,0xf4,0xa4,0x52,0xb4,0x23,0x46,0x8f,0xa6, + 0xc7,0x46,0x3c,0x4e,0x2f,0xbc,0xb4,0xd8,0x98,0xa4,0x17,0x88,0xf7,0x2,0xdc,0x30, + 0x43,0x2f,0x5e,0xbe,0x82,0xa6,0x3e,0xf9,0x14,0x3,0x7b,0xdc,0xa4,0x49,0x34,0x69, + 0xca,0x64,0x6,0x25,0x0,0xec,0x16,0xc3,0xc8,0x24,0x14,0x29,0xc9,0x96,0x87,0x2b, + 0xab,0x1f,0xa1,0x63,0x44,0xc4,0xf5,0xfa,0xdc,0xf5,0x5c,0x39,0x6b,0x77,0x71,0x31, + 0x4f,0xbb,0x18,0xb,0x78,0x4a,0x4,0xa1,0xb,0xd9,0x4c,0x3c,0x77,0xdc,0x7,0x55, + 0x2b,0xc2,0x3e,0xe3,0xf,0xbc,0x93,0xc0,0xd1,0xf1,0x0,0x6d,0x37,0xae,0xc4,0x7d, + 0x30,0x4e,0x1c,0x3c,0xb6,0x25,0x14,0x9d,0xe9,0xcc,0xbc,0x6c,0xd,0xe,0xc5,0xbe, + 0xf6,0xd6,0xac,0x55,0xe2,0xbc,0x96,0x3,0xd7,0x4c,0xad,0xcd,0xe8,0xe2,0xda,0xe3, + 0xfe,0x71,0x3f,0x0,0xdd,0x81,0x89,0xeb,0xeb,0x8e,0xbd,0x3f,0x21,0xe8,0x2e,0x1a, + 0xb8,0xc4,0x55,0xb1,0x1c,0x10,0xbb,0xaa,0xdc,0xc,0xdc,0x8c,0xa5,0x29,0x43,0x5b, + 0xb7,0xef,0xa0,0x2d,0x3b,0xf7,0x18,0xb3,0xb1,0x86,0xad,0x86,0xa3,0x5c,0x8f,0x5e, + 0xc7,0xd5,0xaf,0x84,0x6e,0x4,0xed,0x46,0x7,0xea,0xea,0x3c,0xd6,0xb1,0xd,0x9e, + 0x63,0x5c,0x48,0x47,0x70,0xc6,0x39,0x61,0x2a,0x2f,0x28,0x2c,0x62,0xf7,0x8c,0x51, + 0xbd,0x4e,0xff,0x60,0xe2,0x1b,0xcc,0xf7,0x6c,0x33,0xa,0x58,0x2f,0xf1,0xbf,0x86, + 0x79,0x7e,0x87,0xc,0x19,0x4c,0x5d,0xba,0xcf,0x14,0xf0,0x2d,0x37,0xeb,0x46,0xd, + 0x1b,0x65,0xec,0xc0,0x97,0x81,0x5c,0xe5,0x4d,0x5b,0xb2,0xa1,0xec,0x1,0x32,0xaf, + 0x87,0x4b,0xf5,0x1a,0x0,0xee,0x33,0x22,0x87,0x3e,0xfe,0xe4,0xa3,0x0,0xc0,0x1d, + 0x41,0x8e,0xf2,0xc6,0xa2,0xcd,0x3c,0x67,0x31,0xab,0x5e,0xa5,0x82,0xcb,0xd,0xc8, + 0x3c,0x66,0x62,0xaf,0xa9,0xbf,0xd1,0x81,0x64,0xf8,0x3e,0x9f,0xb,0xa1,0x56,0x82, + 0x3a,0x80,0xae,0xf,0xd6,0xf2,0xb5,0x3c,0xaf,0xb4,0x5c,0x48,0x7f,0xf1,0x8d,0xc4, + 0x13,0x20,0x1f,0xb9,0xa0,0x68,0xb,0x61,0xfe,0x3,0xcb,0x8f,0xef,0xb1,0x18,0x42, + 0x25,0xff,0xee,0xf,0x5f,0x31,0x6b,0xde,0x53,0xcf,0xc1,0xa9,0x53,0xaf,0x4c,0x39, + 0x7b,0x36,0xe2,0xea,0xd9,0xb3,0x67,0xb9,0x59,0x0,0xd6,0x1b,0x65,0xc3,0x1,0x3b, + 0xb6,0x6f,0x3b,0x56,0x5d,0x53,0xc5,0xbe,0x52,0x74,0xb2,0x29,0x56,0xa2,0x71,0xd5, + 0x6b,0x81,0x59,0x36,0x71,0x5c,0xca,0x35,0x4b,0x5b,0x40,0xce,0xc4,0x80,0x1c,0xdf, + 0x6f,0x3,0x37,0xa3,0xa3,0xa9,0xdb,0x32,0x5e,0xff,0xb3,0xd5,0xa1,0x86,0x40,0x44, + 0xe9,0x4c,0x14,0x72,0xdf,0x58,0x18,0xd4,0x5d,0x95,0x79,0x9c,0x49,0x93,0x40,0x24, + 0xfa,0x14,0xb3,0x95,0xcd,0xc,0xa1,0x85,0x79,0x79,0xe7,0xbf,0xf4,0x12,0xdd,0xff, + 0xe0,0x83,0xd4,0xf3,0xd1,0x47,0x69,0x9c,0x2,0x30,0x4c,0xd0,0x50,0xb1,0x3e,0xf8, + 0xce,0x55,0x70,0x9e,0x30,0x75,0x2a,0x3,0x75,0xe5,0xba,0xf5,0xb4,0x6c,0xd5,0x1a, + 0x6,0x30,0xe0,0xfa,0x12,0xfb,0x7b,0x97,0x6,0x6d,0x71,0x8,0x60,0xd5,0x5e,0xca, + 0x59,0x41,0x2f,0xa9,0xe3,0xa7,0xcc,0x7c,0x92,0x1e,0x1f,0x33,0x86,0x26,0x4c,0x99, + 0x42,0x93,0xa7,0x4e,0xe1,0xcf,0xb6,0xa3,0x95,0xfd,0x15,0xa7,0xac,0x54,0x9c,0xf6, + 0x4e,0x8a,0x62,0x84,0xf7,0x11,0xa3,0x40,0xb8,0x23,0x30,0xf7,0xf1,0x98,0x27,0xc6, + 0xf0,0x3d,0x85,0xa9,0xcd,0x77,0xaf,0x6c,0x90,0x45,0x0,0xf5,0xd,0xb8,0x7c,0x83, + 0x27,0xef,0x31,0xe1,0x6f,0xef,0x8d,0x2f,0xf0,0xb8,0x1f,0xdc,0xf7,0x46,0xcf,0x4f, + 0x74,0x3d,0x96,0xca,0x6e,0x6f,0x8d,0xc5,0x29,0x24,0xa5,0xd9,0xa5,0x13,0x7c,0xcd, + 0x19,0xcf,0xa0,0xc1,0x0,0xd1,0x67,0x15,0x70,0x60,0x98,0x71,0x33,0x8,0x12,0x80, + 0xec,0x8b,0x7d,0xf0,0x67,0x5,0xb4,0x25,0xfa,0xc4,0xdd,0x74,0xc2,0x74,0x82,0xbf, + 0xdc,0xb5,0x30,0x24,0xd,0x2e,0xb2,0xe5,0xed,0xfb,0x6,0x22,0x69,0x67,0x30,0x81, + 0xe7,0xb,0x2e,0x22,0x14,0xab,0x80,0xaf,0x37,0x19,0xaa,0xf5,0x31,0xf5,0x6a,0x83, + 0xda,0x56,0xca,0x91,0x2,0xae,0xf,0x61,0x5b,0xef,0x9c,0x43,0x9c,0xbb,0xd6,0x35, + 0x67,0x37,0x3a,0xe7,0x8b,0x94,0xf5,0x9e,0x8a,0x6a,0xca,0x59,0xb5,0x96,0xf6,0x94, + 0x96,0x72,0x3f,0x89,0x4e,0x3a,0xa9,0xaf,0xb0,0x8b,0xc3,0xb4,0x8b,0xf4,0x3b,0x1d, + 0x1d,0xdf,0xc6,0x39,0xfc,0x6f,0xbe,0xfd,0x36,0xf5,0xed,0xdb,0x47,0x1,0x78,0x3a, + 0x75,0xeb,0x53,0xce,0x66,0x68,0xb3,0x94,0x20,0x36,0x30,0x8e,0x9a,0xab,0x86,0x6f, + 0xd1,0x11,0xd4,0x6,0xc2,0x7a,0x5b,0xb5,0xa5,0x88,0xed,0x2,0x1f,0x35,0x41,0x53, + 0xdb,0xbb,0xf6,0xa9,0xa1,0x7e,0x23,0x73,0xd8,0xac,0xa,0xf5,0xab,0x83,0xc5,0xf2, + 0x39,0x38,0xae,0x4a,0x0,0xae,0x29,0x6c,0xf1,0x60,0x34,0x5b,0x61,0x86,0xaf,0x6b, + 0x24,0x4c,0x1b,0x6c,0x9f,0xbb,0xc7,0x14,0xcd,0x9f,0x13,0xde,0xff,0x8,0xba,0x91, + 0x32,0xf6,0x81,0x58,0xe6,0x81,0xfb,0x83,0xee,0x1a,0xad,0xc1,0x94,0xb1,0x76,0x88, + 0x1,0x1b,0x8e,0xdf,0x5b,0x59,0x43,0x85,0x9b,0x36,0x71,0x3f,0x97,0x18,0x7c,0x1a, + 0xba,0x6a,0x30,0x5f,0x30,0xfc,0xc1,0xe8,0x23,0xcf,0x9c,0x39,0x7d,0xf2,0xcc,0x99, + 0x33,0x5e,0xc6,0x9a,0x3f,0x1c,0x20,0x1b,0xe0,0x7b,0xfc,0xf8,0xf1,0xdb,0x37,0x14, + 0xe4,0xff,0xe5,0xc8,0xb1,0xa3,0x5c,0xf9,0xa,0x8a,0x4a,0x83,0xe,0xe6,0x60,0x4b, + 0x89,0x7a,0x54,0x6c,0x1c,0xc6,0xe9,0x18,0x88,0x7d,0x2a,0x58,0x9e,0xa7,0xc5,0xb3, + 0xdd,0x77,0x4e,0x7f,0x27,0x6d,0xe7,0x18,0x63,0x1b,0xf2,0x7b,0xf3,0xb,0xf2,0x4d, + 0x89,0x45,0x5d,0xc9,0x24,0xc9,0x5c,0x96,0xa4,0x46,0x62,0x9d,0x8d,0xc7,0x8c,0x87, + 0xf3,0xe2,0xfa,0xa7,0x4c,0x9b,0x46,0xdf,0xba,0xed,0x56,0xea,0xdd,0xa7,0x2f,0x8d, + 0x57,0x70,0x9c,0x7,0x13,0x34,0xd4,0x6c,0x8,0x50,0xe,0xb2,0x52,0xcb,0x45,0xcb, + 0x96,0x2b,0xf5,0x3b,0x8b,0x9e,0x7e,0xf6,0x39,0x5a,0xbe,0x66,0x1d,0xe5,0xac,0x5e, + 0x43,0x2b,0x54,0x7,0x34,0xeb,0xb9,0x39,0x34,0xf8,0xb1,0x61,0xf4,0xc2,0xa2,0x97, + 0x18,0xc2,0xda,0xf4,0xbc,0x20,0x4,0x31,0xe0,0xbb,0x78,0xc5,0x4a,0x86,0xf4,0xc8, + 0x31,0x4f,0x28,0x95,0x3d,0x99,0xe7,0xfd,0xd,0x4c,0xd0,0x57,0x13,0x23,0xb7,0x33, + 0x4e,0x30,0x99,0x9d,0x76,0x13,0x57,0xb2,0xae,0x4f,0x18,0x9d,0xc,0x9e,0xb,0x94, + 0xae,0x9c,0x3e,0x63,0x6,0xcf,0x85,0x9c,0xe,0x7,0x1f,0x89,0xf9,0xdf,0x4e,0x85, + 0xb4,0x54,0xab,0xdf,0x77,0xaf,0x7,0x56,0x89,0x0,0xf6,0x80,0x36,0xe5,0xa4,0xbe, + 0x79,0x63,0xf,0x12,0x60,0xee,0x9a,0xbc,0x93,0x4c,0xe3,0xee,0x35,0x65,0xb,0xa, + 0x8c,0x99,0xd1,0x9d,0xf3,0xb8,0xae,0x18,0x1f,0xe8,0xd3,0x49,0xf0,0x4f,0x3a,0xde, + 0x93,0x67,0xdf,0x59,0x10,0x5a,0xda,0x1,0xb1,0xcf,0x5a,0xe1,0xe,0x28,0xac,0x54, + 0xc1,0xb6,0x4c,0xec,0xdc,0x59,0x21,0x9c,0x5,0xdc,0x7a,0x1b,0x6,0x8e,0x35,0x75, + 0x75,0x54,0xb0,0x69,0xab,0x51,0x97,0x65,0xd5,0xf5,0x2,0xae,0x8d,0xb1,0x80,0x2c, + 0x6c,0x2f,0x15,0xc7,0x60,0x89,0xd7,0xa5,0xd6,0xfb,0x1a,0x62,0x66,0x68,0x74,0xb8, + 0x65,0xb5,0x2e,0x98,0xfd,0x66,0x6a,0x5b,0x45,0x37,0xb0,0x2f,0x1a,0xb3,0x18,0xe5, + 0xa8,0x81,0xf2,0xfe,0x83,0x7,0xf8,0xfa,0xdb,0xc3,0x9a,0xd5,0x5e,0x37,0x87,0xd9, + 0xde,0xe6,0xc,0xdc,0xb4,0x12,0xe,0xcc,0xcf,0x8,0x74,0x42,0x9a,0x4f,0xff,0xfe, + 0x7d,0xa9,0xcb,0x1d,0xe3,0x14,0x78,0xcb,0x4,0x78,0x3d,0x0,0xd6,0xa6,0x69,0xa9, + 0x86,0xb3,0xfa,0x85,0xab,0x8c,0x5f,0xd8,0x55,0xc6,0x36,0x90,0x3,0x0,0x77,0xe9, + 0x5d,0x49,0xc3,0xc6,0xe7,0xd0,0xf7,0x7e,0xf0,0x3d,0x56,0xbf,0x0,0x70,0xba,0xb5, + 0x95,0xd6,0xe5,0x15,0xa8,0xc1,0x47,0x8d,0x81,0x6f,0x99,0x84,0x6d,0x9d,0xed,0x3b, + 0xe7,0x7b,0x57,0xd3,0xe0,0xf1,0xa1,0x47,0xa0,0x95,0x16,0xd,0x9,0xe1,0xf2,0xf0, + 0xbd,0xd2,0xef,0x1e,0x1,0xd6,0xe3,0xe3,0xf7,0x5a,0x2c,0xa2,0x38,0x1,0x37,0xc0, + 0xce,0xfd,0xad,0x6d,0x33,0x79,0x70,0x3d,0x8,0xc6,0xca,0xdd,0x50,0xc8,0x53,0xb7, + 0xa2,0x2,0x61,0x6b,0x42,0x3d,0x0,0xac,0x63,0x92,0x86,0x5f,0xfd,0xe6,0xd7,0xcc, + 0xcc,0xb,0x17,0x5f,0xff,0xeb,0xa9,0x53,0xa7,0xee,0x0,0x70,0x25,0x63,0xbd,0x0, + 0x3e,0x7d,0xfa,0xb4,0x1,0x70,0x55,0x55,0xd5,0xb3,0x5b,0xb7,0x6e,0xa1,0x73,0xe7, + 0xcf,0xb1,0x9f,0x4f,0xc3,0xb0,0x45,0xc2,0x54,0xbf,0xe,0x97,0x18,0x1d,0x58,0x90, + 0x6d,0xb5,0x8f,0x75,0x9b,0x17,0xb0,0x59,0x80,0xec,0x53,0xda,0x96,0x49,0x3c,0xdc, + 0xe6,0xfb,0x7,0x47,0xa,0x55,0x61,0x51,0x21,0x1d,0x7c,0xf9,0x10,0xdf,0x18,0x2b, + 0x8f,0xd5,0xf2,0xcb,0x78,0x6a,0x51,0xb7,0xfb,0x53,0x48,0x32,0x8e,0x4f,0x52,0xfe, + 0x18,0x30,0x6b,0xc3,0x67,0xde,0xb7,0x7f,0x7f,0xfa,0xd6,0xad,0xa,0xc0,0x7d,0xfb, + 0x6,0xa,0x58,0xa9,0xdc,0xc8,0x9f,0x1b,0x2c,0xd1,0xe6,0x2d,0x58,0x44,0x13,0xa7, + 0x4e,0x63,0xc8,0x2,0xbe,0xcb,0x74,0x5b,0xb5,0x9a,0x55,0xf0,0x94,0x19,0x33,0x8d, + 0xef,0x58,0x37,0xd,0x70,0xa8,0xe0,0x29,0x33,0x9f,0x62,0x5,0xc,0x0,0xb3,0x2, + 0xe,0xbf,0xa3,0x1b,0x40,0x26,0xab,0x55,0x59,0x66,0xe2,0xd8,0x77,0x6a,0xed,0x34, + 0xc7,0x15,0x10,0x46,0x39,0xbd,0xb1,0xe3,0xc6,0xb1,0x1a,0x46,0x31,0x13,0x59,0xfc, + 0x22,0xed,0x74,0xe4,0x5a,0xb5,0xfa,0x5c,0xe,0x89,0xf1,0x4,0xae,0x6b,0xc3,0x63, + 0x49,0x89,0x41,0xcd,0x5,0xbb,0xd3,0xc9,0xa7,0x7c,0x83,0xb5,0xac,0x90,0xce,0x24, + 0x82,0xd3,0xaf,0xac,0xd3,0xde,0x60,0xc0,0xa4,0xc8,0xfd,0x1b,0x1,0xb5,0xaf,0x48, + 0x8d,0x17,0xfe,0xae,0xba,0x4c,0xb0,0x8,0x64,0x7c,0x96,0x80,0x84,0xef,0xee,0x4d, + 0x19,0xcc,0x72,0x3e,0xaf,0xbb,0xa0,0xed,0xc6,0xe0,0x8c,0xe7,0xe7,0x7,0x5f,0x7e, + 0xc1,0xa9,0x3b,0x28,0x5e,0x21,0x1,0x2b,0x15,0x6c,0xb9,0x63,0x2a,0x8e,0xd4,0xac, + 0x84,0x70,0xbd,0xa3,0x7e,0xeb,0x2d,0x0,0x1b,0x98,0xd7,0x6,0x8a,0xd7,0xf6,0x1f, + 0x8b,0x73,0x79,0x4c,0xd3,0xd8,0x96,0xaf,0x6,0x8,0xb8,0xce,0xd7,0x2f,0x5e,0x8, + 0x26,0x8b,0xe8,0xb0,0xe3,0x3,0xd2,0x6e,0x9,0x5d,0x6f,0xf4,0x7a,0xa4,0x7c,0x75, + 0x83,0x7f,0xf5,0xf4,0xd9,0xb3,0x34,0x64,0xc8,0x20,0xea,0x76,0xfb,0x50,0xea,0xf6, + 0xe8,0xde,0x20,0x10,0x8b,0x55,0x70,0x99,0x51,0xc2,0xda,0x2c,0xdd,0xcd,0xf8,0x86, + 0x2b,0xac,0x68,0xe9,0x0,0xae,0x1e,0xd3,0x74,0x42,0xb0,0x96,0x5,0xe3,0xfe,0x91, + 0x12,0xee,0xf2,0xc8,0x5e,0x9a,0xf1,0xec,0x1a,0xf5,0x3f,0x97,0xa,0x0,0xdc,0x8e, + 0xbe,0xed,0xa,0xad,0x5a,0x9b,0xcb,0x51,0xd0,0xae,0xca,0x8d,0xfb,0xd7,0x1b,0x63, + 0x0,0x34,0xca,0x37,0xbc,0xd7,0x16,0x68,0xf5,0xba,0x50,0xba,0x1a,0xaa,0x15,0xc2, + 0x3f,0x2f,0x4d,0xc5,0xe5,0xb5,0x8d,0xe2,0xdc,0x4d,0x16,0xd0,0xed,0x6b,0x6a,0x30, + 0x83,0x81,0xb2,0xea,0x7a,0x3b,0xf8,0xae,0xb6,0xc1,0xe3,0x72,0x68,0x30,0xa5,0x2a, + 0x11,0x5c,0x87,0xd9,0xf0,0xf4,0xc4,0x20,0x19,0xcf,0x9c,0xf7,0xba,0x86,0xc4,0xaf, + 0x7f,0xf7,0x1b,0xb6,0xae,0xbe,0xaf,0xfa,0xc4,0x93,0x27,0x4f,0x3c,0xa3,0xf9,0xaa, + 0x19,0x8b,0x66,0xfe,0xf4,0xe,0x79,0xc0,0xa6,0x4d,0x45,0xe7,0xaa,0xaa,0x3,0xf3, + 0x33,0xfe,0x21,0x2c,0x70,0x2a,0xd0,0xb2,0xa,0x16,0xaf,0x63,0x70,0xc5,0x31,0x62, + 0x7b,0x4b,0x22,0x84,0x53,0xb1,0xf7,0xf9,0xb6,0x77,0x76,0x1e,0x5f,0xc7,0xaa,0x1f, + 0x74,0x98,0x2,0xf6,0x96,0x94,0x50,0x79,0x45,0x39,0x9b,0x88,0xda,0x13,0xca,0x29, + 0xfa,0xd4,0x41,0xa2,0x79,0xb1,0xdd,0xee,0x54,0x52,0xce,0x7b,0x71,0x5e,0xd4,0x95, + 0xee,0xd9,0xbb,0x17,0xdd,0x7a,0xdb,0x6d,0xf4,0x68,0xbf,0x7e,0x81,0x2,0x56,0x0, + 0x5e,0x24,0x53,0x8b,0x42,0x8,0xcf,0x78,0x7a,0x16,0xab,0xdd,0xe5,0x6b,0xd6,0x5a, + 0xf0,0x5d,0xbe,0x76,0x1d,0x6f,0x47,0x70,0x15,0x7c,0xbe,0x81,0x62,0xe,0x82,0xb0, + 0xf0,0x3e,0x0,0xfb,0xa5,0xd0,0x7,0xc,0x5f,0x33,0x3,0x78,0xa,0x4c,0xd0,0x2d, + 0x62,0x7a,0xb9,0x36,0xa7,0x9c,0x63,0x5b,0x94,0xa2,0xe5,0xf1,0x7,0xc6,0xcd,0x91, + 0xad,0xb1,0xc2,0x14,0xda,0x7c,0x8f,0xcf,0xc0,0xdc,0xc8,0x8f,0x8f,0x7c,0x9c,0xb6, + 0xef,0xdc,0xc1,0xcf,0xa,0xc0,0x6f,0x3,0x25,0x93,0xe8,0xdf,0x8f,0x6d,0x6f,0x15, + 0x3,0x37,0x4f,0x7a,0x5a,0x12,0x24,0xbd,0x31,0x4,0x37,0xa0,0x9e,0x6f,0xf4,0x5c, + 0xb1,0x18,0x4,0x91,0xb3,0x9e,0xba,0xc1,0xf3,0xa4,0x92,0xd2,0xe7,0xb2,0x99,0xe2, + 0x3d,0x85,0x6d,0xd2,0x9,0x96,0x3,0x19,0x2b,0x91,0xa8,0xc8,0x13,0xa,0xda,0xdc, + 0xf0,0xc0,0x23,0xcb,0x77,0xf0,0x9a,0xfc,0x7d,0x19,0x9,0x49,0x81,0x77,0xea,0x73, + 0xd0,0xb9,0x9d,0x3a,0x73,0xda,0x4c,0xba,0x10,0xc1,0x57,0xab,0xdc,0x3a,0x6e,0x91, + 0xca,0xad,0xb,0xcc,0xd4,0x35,0xe,0xa8,0x43,0xf0,0x46,0xa,0xb8,0xc1,0x86,0xb4, + 0x65,0x72,0xe,0x8e,0x2b,0x15,0xfb,0xcb,0x43,0x28,0x97,0x39,0xaa,0x19,0x9d,0x7b, + 0x49,0x55,0x2d,0xad,0x5c,0x97,0x47,0x5b,0xb6,0x6d,0xe7,0x42,0x35,0x50,0xec,0xd6, + 0xff,0x8a,0xbc,0xb7,0xce,0x60,0x3e,0xf8,0xbe,0x76,0x3e,0x7c,0x46,0xf8,0x82,0xd3, + 0xa1,0x9,0xfa,0xb5,0xf3,0xe7,0xe9,0xf1,0xc7,0x47,0xd0,0x37,0x6e,0x7f,0x84,0xba, + 0xf5,0xdc,0x62,0xe0,0x2b,0x97,0xb6,0x19,0xba,0xc2,0x51,0xc5,0x95,0xb1,0x60,0x2d, + 0x3,0x63,0xed,0x1f,0xee,0x9b,0x4,0xe2,0x6a,0x75,0x7c,0xb0,0xde,0xd,0x0,0x7e, + 0x68,0x33,0xad,0x5e,0xbf,0x25,0x4,0x4f,0x3b,0xe7,0x29,0x7f,0xf0,0xe1,0x87,0xb4, + 0x7c,0xf5,0xba,0x98,0xca,0x95,0x2a,0x52,0xe,0x5a,0x4c,0xfa,0x97,0xde,0x17,0xfe, + 0x66,0x15,0x61,0x50,0x55,0x79,0x8d,0xa3,0x52,0xc3,0x7d,0xfa,0xf7,0x90,0xaa,0xd6, + 0x4,0x65,0xe9,0x6d,0xe1,0xb1,0xd6,0x6b,0xa1,0xae,0xf5,0x40,0x4b,0xaa,0x67,0x39, + 0xd0,0x2a,0xaf,0x69,0xf0,0x6,0xef,0xd9,0x3,0xb9,0xe0,0x7c,0x8,0xc6,0x2,0x4f, + 0xac,0x1c,0x77,0x8f,0xab,0xe7,0x17,0xbf,0xfa,0x25,0x2b,0xe1,0xef,0x7e,0xef,0xbb, + 0x74,0xea,0xf4,0x2b,0x67,0x5c,0xc6,0xa2,0x59,0x0,0x56,0x32,0x99,0x1b,0xd6,0x8f, + 0x1c,0x39,0x72,0x57,0x6e,0xee,0xba,0x7f,0x39,0x1a,0x9a,0x9f,0x11,0x4c,0x24,0xa1, + 0xda,0x22,0xd7,0x35,0x30,0x1d,0xe0,0x6a,0x88,0xb6,0x38,0xea,0xd8,0x85,0x72,0x8b, + 0x80,0xed,0x8d,0x42,0x3a,0xa6,0xb8,0x5d,0xf5,0x1c,0x76,0x92,0xb8,0x39,0xf0,0x85, + 0xbe,0x7c,0xf8,0x30,0x6d,0x51,0x6a,0x1e,0xa,0x2d,0x52,0xbd,0x76,0x90,0x50,0xab, + 0x27,0x80,0x25,0xdd,0xe6,0xaf,0xf6,0x95,0xca,0x12,0x24,0x24,0x95,0xe6,0xe7,0xea, + 0x87,0x62,0x0,0xdf,0x7e,0x1b,0x2b,0xe0,0xf1,0x53,0xa6,0xb2,0x2,0x96,0xea,0x17, + 0x20,0x45,0x90,0x15,0x52,0x94,0x0,0x53,0xd,0xde,0x98,0xa,0x7e,0x1c,0xbe,0xe0, + 0x27,0x8d,0xc9,0x5a,0xfb,0x90,0x17,0xb1,0x2,0x5e,0x1e,0x2,0x58,0x7,0x61,0x4d, + 0x89,0x7c,0x15,0x59,0xa,0x35,0xa4,0x9d,0x34,0x99,0xc4,0x34,0x21,0xa7,0x1a,0x94, + 0x8c,0x78,0xd5,0xbe,0xf5,0x55,0xab,0x57,0xd3,0x38,0xa5,0x84,0xe1,0xb2,0xf0,0xa5, + 0xda,0xf8,0x14,0xac,0xfd,0x9b,0x65,0x62,0x1,0x7e,0xd2,0xc5,0x90,0xf2,0x45,0xc9, + 0x3b,0xa9,0x6e,0xd9,0x40,0xe8,0x73,0x7f,0xf8,0x5c,0x26,0x2e,0x68,0xdd,0x20,0xc2, + 0x54,0xc2,0x80,0xc1,0xb,0xdc,0x4c,0xda,0xab,0xd8,0xe5,0xb5,0x74,0x6,0x7d,0xf9, + 0xd9,0x19,0xcf,0x7d,0xec,0x7c,0x40,0x93,0x0,0xcd,0x84,0x42,0x3a,0x49,0x80,0xb7, + 0x3e,0xeb,0x6,0x60,0x7c,0x43,0x3,0x1d,0x8f,0x1b,0x0,0xcf,0xcd,0xf6,0x5d,0xbb, + 0xb8,0x0,0x42,0x0,0xe0,0x3a,0x61,0x4a,0x76,0x41,0x1c,0xc2,0xb5,0xba,0x5e,0x40, + 0x39,0x32,0x47,0xeb,0x6d,0xb6,0x69,0xba,0xde,0x28,0x28,0xec,0x2f,0x11,0x30,0xb7, + 0xde,0x2f,0x40,0x2d,0x81,0x8d,0x59,0x8c,0x72,0x56,0xaf,0xa5,0xca,0x9a,0x6a,0xba, + 0xdc,0x72,0x85,0xa1,0x64,0x6,0x46,0x31,0x37,0x8b,0x13,0x2b,0xe0,0xfe,0xcf,0xb5, + 0xd9,0x2d,0x1d,0x2e,0x31,0x80,0xfd,0xf6,0xbb,0xef,0xd2,0xf8,0xf1,0xe3,0xe9,0xee, + 0x7b,0x1e,0xa0,0x2e,0x3d,0x96,0x86,0xc0,0x2d,0xb,0x5b,0x79,0xac,0x75,0x33,0xad, + 0x22,0xe6,0x1f,0xee,0x66,0x96,0x7e,0x1f,0xb1,0x5f,0x9,0x57,0x31,0x84,0xbb,0xf5, + 0xad,0xa1,0x5b,0x1e,0x59,0x49,0x4d,0xfb,0xf,0x72,0xd,0xe8,0x4c,0x5b,0x60,0x22, + 0x3f,0x79,0xea,0x14,0xad,0x5a,0x5f,0xc0,0x11,0xc2,0x49,0xe0,0x8d,0x82,0xe7,0x1c, + 0x98,0x9,0x93,0x72,0xb9,0x56,0xb2,0xc6,0x44,0xad,0x81,0xda,0x60,0xa9,0x60,0xbd, + 0x5e,0x56,0x6d,0x5b,0x36,0xe4,0xbe,0x72,0xe7,0x33,0xca,0xc4,0x39,0xed,0xb8,0x0, + 0x11,0x84,0x27,0x5c,0x15,0x7b,0x2b,0x6b,0x39,0x7f,0xbb,0xb4,0x5a,0x40,0x57,0x7c, + 0x7,0x9e,0x25,0x69,0xd3,0x56,0x76,0x65,0x1a,0x3f,0x7f,0x7b,0xdc,0x42,0x88,0x67, + 0x0,0xa9,0x48,0xbf,0xe0,0x68,0xe8,0x66,0x7a,0xfd,0xc2,0xf9,0xbf,0x29,0x15,0x7c, + 0x67,0x22,0x80,0x35,0x7c,0xd1,0xa0,0x7e,0x2b,0x2b,0x2b,0x9f,0xdc,0xbc,0xb9,0x88, + 0x5e,0x3b,0xf7,0x1a,0x47,0x3f,0xbb,0xe0,0x75,0x61,0xc9,0xa0,0x75,0x61,0x2c,0xe0, + 0x2a,0x55,0xad,0xdc,0xe7,0x33,0x61,0xdb,0xe7,0x48,0x39,0xaa,0x3b,0xe,0x5d,0xbc, + 0x8e,0x77,0xea,0x69,0x13,0x55,0x9,0xd3,0xf3,0xa6,0x2d,0x9b,0x79,0x72,0x69,0x6, + 0x87,0x4e,0x2f,0x92,0xd1,0x99,0xb1,0xfc,0x62,0xbb,0x53,0x91,0x1d,0x68,0xa2,0x4f, + 0xcb,0x89,0xf0,0xc5,0x67,0xfc,0xe0,0xf2,0x17,0xd4,0xbb,0xcf,0xa3,0xec,0x3,0x66, + 0x5,0x1c,0x9a,0xa0,0x65,0xb1,0xd,0x1d,0xf9,0x3c,0x53,0x35,0xa8,0xdf,0x1c,0x1, + 0x5d,0xdd,0xa0,0x82,0xe1,0x1b,0x1e,0x32,0x6c,0x38,0xbd,0xa8,0x60,0xbd,0x40,0xa4, + 0x2e,0xb1,0xf,0x58,0x28,0x60,0x3b,0xa,0xfa,0x6a,0x14,0x68,0x66,0x5,0x7c,0xd8, + 0x66,0xf7,0x6c,0x81,0x35,0xb1,0xc8,0xe0,0x58,0x7e,0x68,0x10,0x94,0x85,0xc1,0xcd, + 0x93,0x6a,0x80,0x30,0x7f,0xc1,0x82,0xd0,0x14,0xdd,0x6e,0xf9,0x7a,0x93,0xe0,0xe1, + 0x2,0xae,0x25,0x29,0x9e,0xa0,0xd5,0x6f,0xe9,0x48,0x39,0x80,0x4d,0x82,0xd3,0x8d, + 0xc4,0x17,0xf8,0x9e,0xa3,0xac,0xd7,0xd1,0x89,0x8b,0xc4,0x1b,0x41,0xed,0x83,0x7d, + 0x26,0x39,0x9e,0x22,0xc9,0xdc,0xae,0x9f,0xfb,0x24,0xf0,0xc7,0xef,0x6f,0x36,0x55, + 0xef,0x87,0xa9,0x5b,0x3c,0x27,0x9d,0xc5,0x74,0xef,0xaa,0xef,0x94,0x27,0xaf,0x3f, + 0xed,0xc,0x6c,0xad,0x6b,0xc,0xff,0x1f,0x51,0x39,0x6e,0xf5,0xba,0xf5,0xdc,0x19, + 0x46,0xbe,0xdf,0x7a,0xd3,0x49,0xa2,0x83,0xe4,0xd7,0xa2,0xa3,0x94,0xc7,0x98,0xfd, + 0xd5,0x11,0x84,0x25,0xc0,0x19,0xba,0x55,0x75,0x31,0x28,0xf3,0x71,0x35,0x71,0x90, + 0x97,0x89,0x34,0xa3,0x4d,0x3b,0x76,0xd3,0x4a,0xf5,0xbf,0x78,0xfc,0xe4,0x9,0x93, + 0x4b,0x2f,0x23,0xe2,0x53,0x3e,0xbf,0x7d,0x2c,0xda,0xdc,0x56,0xc2,0xdc,0xda,0xec, + 0x86,0xf3,0x7e,0xff,0xcb,0x2f,0x69,0xd6,0xec,0x67,0xa8,0x8f,0xea,0x3f,0xba,0xdc, + 0x31,0x81,0xba,0x3d,0x5a,0x42,0x37,0x43,0xf9,0xf6,0x9,0x20,0x1c,0xa9,0x60,0x1b, + 0xc2,0xae,0x32,0xee,0x26,0x52,0x97,0xba,0xc9,0x1c,0x62,0x57,0x11,0x7b,0x60,0xc, + 0x0,0x77,0xe9,0x55,0x46,0x7d,0x86,0x2f,0xa2,0xef,0x7c,0xf8,0x1,0x47,0x3e,0xa7, + 0x43,0x13,0x79,0x49,0x59,0x19,0x6d,0xdc,0xba,0xd3,0x14,0x48,0xd1,0xf7,0x53,0xfa, + 0xc8,0x6d,0xeb,0x83,0x34,0x41,0x37,0x4,0xe0,0xad,0x9,0x96,0xc6,0x14,0x5d,0x5d, + 0x1f,0x2a,0xe3,0xfa,0x18,0x90,0xd9,0x5c,0x5c,0x2b,0x94,0xae,0x0,0xad,0x1b,0xb0, + 0x55,0x2e,0x94,0x76,0xb9,0x15,0x84,0x57,0x1f,0xba,0x34,0xea,0x2c,0x97,0x44,0x6d, + 0xd3,0x1,0x7a,0xfd,0x8d,0x37,0xe9,0xad,0x77,0xde,0xa5,0x73,0x17,0x2f,0xf1,0x77, + 0x92,0x10,0x96,0xee,0xa,0xb8,0x45,0x76,0xee,0xde,0x1d,0xcf,0x72,0x68,0x8f,0xac, + 0x8a,0x78,0x26,0x20,0x4c,0x50,0x1b,0x1a,0xcb,0xf7,0xde,0x7f,0x97,0x8e,0x1d,0x3b, + 0x3a,0x5b,0x33,0xf6,0x95,0x57,0x5e,0xe1,0xa5,0xf9,0xc3,0x6,0xdd,0x4e,0x9f,0x3e, + 0xd3,0x65,0xf3,0xe6,0x4d,0x7,0x4b,0xcb,0x4a,0xb9,0xf8,0x6,0xcc,0xa8,0xa9,0x4e, + 0x14,0x6f,0x4,0xd6,0x94,0x5f,0x25,0xbb,0xdb,0x33,0x29,0xb,0xc6,0xee,0xf9,0xed, + 0xe3,0x53,0x8e,0x9a,0xf6,0x3,0x5a,0x1f,0xa3,0xff,0xa1,0x71,0x23,0xbe,0xff,0xe5, + 0x17,0x54,0x59,0x55,0xc9,0x26,0xd2,0x2f,0xae,0x7c,0x19,0xab,0x89,0x1b,0x3,0xa8, + 0xa7,0x83,0x89,0x99,0x63,0x13,0x4c,0x6e,0x29,0x4f,0xfd,0x6b,0x98,0x2a,0x7a,0x3f, + 0xfa,0x68,0x64,0x82,0x16,0x69,0x48,0xb,0x42,0xff,0xed,0xf3,0xb,0x5f,0xa2,0x49, + 0xd3,0xa7,0x33,0x44,0x73,0x42,0xf3,0x73,0x4,0x61,0x5b,0xd,0xa3,0xa2,0xd6,0x34, + 0x44,0x44,0xab,0x63,0x75,0x10,0x97,0x4c,0x43,0xd2,0x0,0x9e,0x32,0x75,0x2a,0x5d, + 0x49,0x35,0x7,0x39,0x88,0x9e,0x89,0x11,0x32,0xed,0xfe,0x5c,0x4f,0x63,0x4e,0x75, + 0x6,0x14,0xd9,0xac,0x2,0x26,0x38,0x4b,0x7d,0x16,0xa6,0xef,0x82,0x29,0x7a,0xcf, + 0xde,0x3d,0xe1,0x84,0x1d,0x6d,0xf1,0xfc,0xee,0x2c,0xe0,0x93,0xbf,0x6d,0x62,0x64, + 0x7d,0x8,0x8c,0x16,0x5f,0x80,0x9f,0xf3,0xc,0xd8,0x8a,0xd6,0x56,0xb1,0xde,0x80, + 0xbe,0xce,0x54,0xb1,0x39,0x4f,0x76,0x60,0x46,0xca,0xd8,0x49,0xbf,0xcb,0x96,0x72, + 0xd7,0x9a,0xce,0xae,0x6c,0x85,0xef,0xdc,0x9c,0xdb,0xb5,0xe,0x38,0x96,0x84,0xd8, + 0x0,0xc5,0xd,0x7e,0xf4,0xdc,0x93,0xb4,0x88,0x2a,0x4f,0xba,0xa6,0x24,0x38,0xc7, + 0x4d,0xee,0x9,0xdf,0x29,0x21,0xb,0x2,0xcf,0xeb,0x89,0x57,0x4e,0xd2,0xda,0xbc, + 0xd,0x41,0x47,0x29,0x60,0x2a,0xc1,0x2a,0x4d,0xd1,0x6,0xb4,0x55,0x75,0x22,0xf0, + 0x2a,0x82,0x33,0xde,0x7,0x93,0xb1,0x39,0x8f,0x7e,0x4f,0xa8,0x72,0x35,0x78,0xb5, + 0xea,0x2d,0x9,0x5f,0x4b,0xe5,0x83,0x6d,0xeb,0x37,0x62,0x56,0xa0,0x42,0x7a,0xfb, + 0xdd,0x6f,0x7,0x26,0xe7,0x8e,0x30,0x75,0xab,0x3d,0x8a,0xa2,0xb7,0x41,0xea,0xc9, + 0x39,0xf7,0xfe,0x7f,0x39,0xeb,0x61,0xc3,0xe0,0x19,0xf3,0x91,0xf,0x1b,0xf6,0x18, + 0xdd,0x72,0xdb,0x23,0xd4,0xed,0x91,0xc2,0xd0,0xfc,0x5c,0x6a,0x20,0xac,0x41,0xac, + 0x5b,0x36,0x8,0xc7,0xf2,0x88,0xfb,0x39,0xf9,0xc3,0x42,0x15,0x47,0x13,0x3e,0xd4, + 0x50,0x97,0x7,0x37,0x50,0xce,0xaa,0x22,0x4e,0xb,0xd3,0xb9,0xca,0xf0,0xff,0xa2, + 0x8,0xc7,0xee,0xb2,0x2a,0x3,0x28,0xd,0xdb,0xd2,0xea,0x68,0x40,0x64,0xa9,0xdf, + 0xea,0x7a,0xdb,0xdc,0x5b,0x53,0x6f,0x5a,0x99,0xba,0xbf,0x15,0x2,0xc6,0x15,0x31, + 0x40,0x47,0x10,0x96,0x60,0xae,0xa8,0x95,0xd0,0x6e,0xe0,0xf3,0x18,0x95,0x5b,0x6d, + 0x5b,0x4b,0x74,0x2c,0x81,0x3b,0x38,0xc0,0xb3,0x71,0xf1,0xad,0xb7,0xc3,0xa,0x88, + 0x41,0x80,0xe9,0xf1,0xd3,0x67,0xcd,0x0,0x50,0x7f,0x1f,0x7d,0x3c,0x6,0x62,0x8, + 0x3e,0x43,0x65,0x2c,0x9f,0xfb,0x52,0x2e,0x7f,0xfe,0xcb,0x7f,0xc7,0x5,0x55,0x3e, + 0xfb,0xfc,0x33,0x3a,0x7e,0xfc,0xd8,0x41,0xc9,0x59,0x34,0xf3,0x77,0xf2,0xe4,0x49, + 0x6e,0xd8,0x78,0xe2,0xc4,0x89,0x2e,0xf9,0x79,0xb9,0x3f,0xda,0x7f,0x60,0x3f,0xa7, + 0x2,0xa0,0x23,0xc5,0x3f,0x4a,0xb3,0x0,0x24,0xd4,0x95,0xbb,0x84,0xcf,0xd1,0x82, + 0xa8,0xb,0x52,0xe7,0xbd,0x1a,0xbe,0x78,0x9f,0xab,0x80,0xbd,0x8a,0x3b,0xe1,0x9c, + 0x29,0x27,0x38,0x4c,0x76,0x0,0x88,0x76,0x46,0x99,0x49,0xe4,0xfb,0xfa,0xaa,0x20, + 0x79,0x67,0x6c,0x6a,0xcb,0x24,0x6,0x86,0xc9,0xa0,0x1e,0x6f,0x80,0x8d,0x73,0x7e, + 0x28,0xe0,0x47,0xfb,0xf4,0xb1,0x4d,0xd0,0xf3,0x17,0x4,0x3e,0x60,0x8e,0x7c,0xce, + 0x89,0xd4,0xaf,0x1a,0x59,0x4b,0xd5,0xab,0xe1,0xab,0xd5,0x30,0x22,0xa2,0x9f,0x7e, + 0xee,0x39,0xf6,0x5,0xbf,0x20,0x4a,0x59,0xba,0x3e,0x60,0xe4,0x10,0x23,0x8,0xcb, + 0x32,0x41,0x8b,0xd4,0x7,0xbb,0xb2,0x91,0x3d,0x55,0x64,0x52,0xb0,0x90,0xbc,0xaf, + 0xbe,0xc1,0x8,0x9b,0xdc,0xc3,0xa0,0xb3,0x9c,0xe5,0xcb,0x69,0xc6,0xcc,0x99,0x1c, + 0x98,0x92,0x4d,0xf5,0x26,0x6,0xe6,0x9,0xb,0xb,0xaf,0xb,0xd8,0xca,0xe8,0x7b, + 0xef,0x6f,0xd4,0xea,0x4,0x9,0x3a,0xc1,0x82,0x89,0x2a,0x35,0x1,0xf2,0x5a,0x29, + 0xfb,0xad,0x3e,0xe9,0xe4,0x18,0x8,0x27,0x57,0xdd,0xf7,0x99,0xd9,0x2c,0x37,0xae, + 0x3a,0xd5,0x83,0xa,0x3,0xe1,0x56,0x3f,0xe8,0x52,0x9,0x29,0x82,0xee,0x33,0x9c, + 0x35,0xb6,0x22,0x21,0x6d,0xb0,0x53,0xa5,0xef,0xcb,0xf7,0x77,0x7,0x23,0x9,0x66, + 0x74,0x69,0x5d,0xda,0xb6,0x63,0x27,0x17,0xb3,0x8,0x3a,0xc7,0x0,0xb2,0x91,0x69, + 0x30,0x6c,0xa1,0x82,0xc5,0x76,0x56,0x33,0xc,0xe8,0x5a,0x6e,0x52,0xe1,0x96,0x3a, + 0x8a,0xb7,0xd4,0xc0,0x3c,0x32,0x35,0x1a,0xe5,0x2b,0x22,0xa0,0x25,0x84,0x8b,0x2b, + 0xaa,0x39,0x2b,0x61,0x67,0x71,0x31,0xbb,0x94,0xda,0xaf,0x5f,0x35,0x60,0x4d,0x69, + 0x0,0xb7,0x87,0xeb,0x61,0x4b,0xb5,0x65,0x4c,0x3a,0x59,0x4a,0xf7,0x29,0xce,0x20, + 0x56,0x82,0xd8,0x82,0x72,0x6b,0x2b,0x17,0xe1,0x40,0xe5,0xb9,0xda,0xba,0x7a,0x1a, + 0x3d,0x66,0xc,0x3d,0xf4,0xd0,0xc3,0xd4,0xe5,0xae,0x27,0x15,0x78,0x4b,0x18,0xc0, + 0x1,0x84,0x4b,0x2d,0x45,0xec,0x33,0x47,0x7,0xd0,0xd,0xd7,0xfb,0x55,0x78,0x95, + 0x71,0x37,0x19,0x41,0xed,0xd4,0x97,0xee,0xd2,0xbb,0x8c,0xee,0xed,0x37,0x5f,0xf5, + 0xa3,0xaf,0xf2,0x14,0x89,0x1c,0xa1,0x7d,0xed,0x1a,0x47,0x68,0xaf,0x5a,0x97,0x67, + 0xe0,0x2a,0xa3,0xcd,0xad,0x48,0x73,0xe1,0x22,0x88,0xcc,0xcc,0xf5,0x36,0x48,0x1, + 0x58,0x28,0xd6,0xd0,0xec,0x5c,0x11,0x2,0xb7,0x4c,0xfd,0x3e,0x1a,0xd0,0xc,0xe7, + 0xea,0x0,0xd4,0xe5,0xe1,0xba,0xad,0x9e,0x25,0xcc,0x23,0xe0,0x96,0x3b,0x6e,0x5, + 0xed,0x7b,0x36,0x3,0x2b,0xf5,0x19,0x35,0x4a,0xfd,0x62,0x40,0x81,0x7e,0x10,0xcf, + 0x21,0x17,0x6a,0xfa,0xe4,0x13,0x2b,0xf8,0x4f,0xf,0x32,0x70,0x3c,0x0,0xc,0x33, + 0xf4,0xb1,0x13,0xc7,0x8d,0xef,0xdf,0x17,0xdd,0x8f,0x73,0x61,0xaa,0xd8,0x9f,0xfc, + 0xfc,0x67,0x3c,0x9b,0xd7,0xd9,0x57,0xcf,0xfc,0x13,0xd8,0xaa,0x59,0x8b,0x16,0x3, + 0x30,0x64,0x71,0x63,0x63,0xe3,0xc0,0x82,0x82,0xbc,0xff,0xf3,0x95,0x53,0xaf,0x70, + 0x95,0x28,0x17,0xb6,0xbc,0x9e,0x6e,0xb1,0x80,0xac,0x3b,0xa0,0x0,0xc4,0xfa,0x98, + 0x10,0xb0,0xe2,0x7d,0x29,0x1f,0x64,0x5d,0x90,0x87,0xeb,0x16,0xf4,0x5d,0x95,0x9c, + 0x49,0x6e,0x5a,0xfd,0xa2,0xe0,0x46,0xb1,0x52,0x62,0x48,0x9e,0xc6,0xb6,0x36,0xa7, + 0xa0,0x7c,0xac,0xfc,0xa5,0xaf,0x24,0x66,0x26,0xed,0xf1,0x95,0xa5,0xad,0xd1,0x6c, + 0x2a,0xc1,0xb7,0x85,0xcf,0xc2,0x8d,0xd7,0x26,0xe8,0x0,0xc0,0x91,0x2,0x46,0x43, + 0x55,0x2c,0xa8,0x62,0x80,0x38,0x67,0xb5,0x4,0xae,0x6d,0x82,0x96,0xdb,0x86,0x3d, + 0x3e,0x92,0x61,0x2b,0x83,0xb0,0x16,0xbb,0x0,0x56,0x9f,0xa3,0xbf,0x73,0xc6,0xc9, + 0x6b,0xd6,0xa6,0x12,0xcb,0x1c,0x18,0xb,0xf6,0x49,0x28,0x94,0x91,0x10,0xb9,0x6b, + 0x22,0xbf,0xd5,0x28,0x12,0xe0,0x1d,0x37,0x7e,0x3c,0x97,0xf9,0x44,0xc0,0x9b,0x36, + 0xf1,0x5b,0x69,0x68,0xad,0x71,0x78,0x19,0x15,0x9c,0x10,0x47,0xe0,0x83,0x9d,0x1b, + 0x57,0x20,0xdd,0x1d,0x49,0xc7,0xa4,0xb2,0x4,0xf1,0xb9,0xa,0x3c,0x0,0xbe,0x1f, + 0x96,0x66,0x9b,0x93,0xc7,0x9e,0x14,0x3c,0x78,0x23,0xcd,0xba,0xc6,0x56,0x1b,0xcc, + 0x72,0xf0,0x91,0x78,0x3f,0xcc,0x40,0x34,0xe3,0x49,0xff,0xeb,0x3c,0x95,0xaf,0xd3, + 0x6b,0x14,0xa6,0x64,0xf7,0x7e,0xa6,0xb3,0xe5,0xf9,0x27,0x64,0x38,0x48,0x33,0x3a, + 0xce,0xf9,0x39,0x9b,0x9f,0x73,0x39,0xaf,0xd6,0x2,0xa7,0xab,0x76,0xc3,0x7d,0x31, + 0x75,0x6b,0x0,0x5c,0x6b,0x94,0xae,0x6,0x84,0x1,0xb8,0xf1,0xef,0x36,0x18,0xe5, + 0xab,0x81,0xcb,0xfe,0x60,0x11,0x7c,0xb5,0xb5,0xb8,0x84,0xff,0x2f,0x9b,0x94,0x18, + 0x69,0x56,0xf7,0xbf,0xf5,0x5a,0xbb,0x1,0x6e,0xb6,0xa6,0x61,0xac,0xfb,0x19,0x3, + 0x6a,0x69,0x65,0x92,0xfd,0x87,0x1,0x6f,0xc6,0x2c,0x75,0xa0,0xd3,0x94,0xa9,0xd3, + 0x68,0xc4,0x88,0xe1,0xf4,0x8d,0xdb,0x1f,0xa6,0xae,0xf,0xae,0xf,0xe0,0xcb,0xca, + 0xb7,0x34,0x6c,0xb6,0x1a,0xb6,0x83,0xb4,0xec,0xfc,0x61,0x6f,0x41,0xf,0x4f,0x1e, + 0x31,0x9b,0xab,0xfb,0x55,0x53,0x97,0xfb,0x56,0xd3,0x92,0x15,0xf9,0x94,0xe1,0xff, + 0xf1,0xc8,0x57,0xbd,0x73,0x77,0x31,0x15,0x6d,0xdb,0xc5,0xa9,0x46,0xd1,0x6f,0x12, + 0x29,0xc5,0xe8,0xb7,0xaa,0x8b,0x4c,0xcb,0x35,0xc2,0x5d,0x20,0x0,0x1c,0x40,0xb5, + 0xde,0x80,0x37,0x2,0x71,0x0,0x63,0xa9,0x92,0xd,0x68,0xab,0xeb,0x8d,0x4a,0x2e, + 0xc5,0xef,0xef,0x9e,0xd3,0x98,0xa7,0x83,0xf7,0xc9,0xcf,0x65,0x4b,0x89,0xb0,0x8e, + 0xc0,0xe4,0xdc,0xaa,0x7e,0x1b,0xc4,0xb1,0xc0,0xc,0xad,0x19,0xf1,0xf2,0xf1,0x93, + 0x9c,0xfb,0x5b,0x1a,0x3e,0x67,0xd2,0xcf,0xad,0xcd,0xd0,0x6e,0x1e,0xbf,0x6b,0xdd, + 0x81,0xaa,0xfe,0x85,0x52,0xc1,0x58,0x7f,0xe3,0xcd,0x4b,0xff,0xf5,0xe8,0xd1,0xa3, + 0x3,0xbd,0x0,0x6,0x99,0xd1,0x0,0xe0,0x1d,0xdb,0xb7,0x17,0x6c,0xdb,0xb6,0x95, + 0xce,0xbd,0x7e,0x9e,0xfd,0x31,0x16,0x7c,0x43,0xc5,0xaa,0xd5,0xae,0x59,0x86,0xe0, + 0xe4,0x7d,0x6e,0xc0,0x56,0x2,0xbc,0xf5,0xb1,0x66,0x7f,0x26,0x80,0xb6,0xf,0xf8, + 0x2e,0xc8,0x7d,0xa,0xd8,0x1d,0x75,0x9f,0x3a,0x7d,0x9a,0x4d,0xa1,0xf8,0xe,0x96, + 0xa9,0x40,0x2a,0x5d,0x9f,0xaf,0x30,0x6b,0xa0,0x50,0x3a,0x21,0xf5,0x43,0xc0,0x48, + 0x0,0xf,0xb3,0x8,0xb1,0x2,0xe,0x7d,0xc0,0xba,0x10,0xc7,0xc2,0x70,0x92,0x85, + 0x99,0xb3,0x9f,0xe1,0x3a,0xd1,0x3a,0xef,0x77,0x99,0x15,0x78,0xe5,0xfa,0x82,0x3, + 0xd3,0x34,0x22,0xa2,0x87,0xe,0xf,0x7d,0xc1,0x4b,0x82,0x9,0x19,0x90,0x86,0x24, + 0x1,0xc,0x13,0x74,0xb3,0x27,0x8,0xcb,0x5b,0x6,0xd1,0x2d,0xe9,0xe8,0x3e,0x48, + 0xd9,0xa2,0x72,0x9d,0x20,0x34,0x9d,0x82,0x84,0x79,0x95,0x27,0x4e,0x9a,0xc8,0x7e, + 0x77,0xdb,0xfc,0x16,0x7,0xaa,0x5,0x8e,0x6c,0x1,0x76,0x32,0x5e,0xc0,0x8d,0x23, + 0xf0,0x6,0xf8,0x79,0x5c,0x25,0x7a,0x5d,0xc,0xa6,0xdc,0x73,0xf9,0xce,0xa7,0x15, + 0xab,0x1f,0x7a,0x29,0x3b,0xce,0xc1,0x89,0xe2,0x97,0x3,0xc3,0x16,0x27,0xa0,0x50, + 0x9e,0x47,0x7e,0x46,0x52,0x56,0x81,0xef,0x75,0x92,0x9f,0xdb,0x1d,0x4c,0x24,0xd, + 0x3a,0xdc,0xc1,0xe7,0xd,0xc3,0x58,0x9f,0xc3,0xa8,0xf2,0xa4,0x1,0x54,0x3c,0x2b, + 0xc2,0x37,0xd8,0xc2,0xb3,0xa,0x8b,0xd5,0xca,0xb5,0xb9,0x1,0x30,0x2b,0x3,0x45, + 0xab,0x97,0x12,0xb0,0xac,0x80,0x43,0x38,0x6b,0x8,0x4b,0x30,0xb3,0x6a,0xe,0x15, + 0x31,0xab,0xe7,0xea,0x8,0xd6,0x25,0x21,0xcc,0x35,0x74,0x1,0x5a,0x69,0x7a,0xd6, + 0xdb,0xa,0xb6,0x6c,0xa3,0xd5,0xb9,0xb9,0xf4,0xea,0xf9,0x73,0xd4,0x7a,0x55,0x81, + 0xb7,0xa3,0x95,0x5b,0x4b,0x5b,0x9a,0x81,0xaa,0xa1,0x2a,0x97,0xa9,0xf6,0xf8,0x36, + 0x5e,0xb6,0x66,0x84,0x42,0x6e,0xb5,0xa,0xb,0x49,0x8,0xa7,0x32,0x19,0x3,0x61, + 0x34,0xe4,0xdb,0x16,0x6c,0xd8,0xc0,0x2a,0x98,0x7d,0xc1,0xb7,0xd,0xa7,0x6e,0xbd, + 0xb6,0xb3,0xea,0x35,0x4a,0x38,0x84,0x71,0x14,0xa0,0x95,0x10,0xa4,0xd5,0xc7,0x67, + 0x9a,0x4e,0xca,0x27,0x56,0xea,0xf7,0xa1,0xad,0xd4,0x77,0xd8,0x1c,0x7a,0xfb,0xdb, + 0x6f,0xb1,0xfa,0x65,0xb3,0xb8,0x5a,0x62,0x26,0xb4,0xd5,0xeb,0xf3,0xb9,0x6,0xb4, + 0x84,0x6f,0xb9,0x34,0x3f,0x6b,0x37,0x41,0x8,0x3b,0x9,0x5a,0x9,0x51,0xa9,0x6e, + 0x19,0xb6,0x6c,0x8a,0x96,0x30,0xe,0x61,0x1b,0x2a,0xe4,0x72,0x61,0xaa,0x8e,0x5a, + 0x83,0x5,0xe9,0xd2,0x50,0x39,0x97,0x85,0x8a,0x59,0x9a,0xc3,0x8d,0xaa,0xd,0x9f, + 0x15,0x4c,0x7d,0xf8,0xfd,0x2f,0xbe,0x60,0xd5,0xfb,0xf6,0xbb,0xef,0xb1,0x9a,0xfe, + 0x9e,0x7a,0xd,0x70,0x7e,0xf8,0xe9,0xa7,0x6,0xd2,0x7a,0x69,0x5c,0x1d,0xea,0x3c, + 0xeb,0xf3,0xa,0x58,0xe4,0xb5,0x8a,0x8a,0x7b,0x3e,0xd7,0x12,0xcc,0xd0,0x78,0xb6, + 0xbf,0xf3,0xe1,0x77,0xe8,0xc8,0x91,0xc3,0x5,0x9a,0xb5,0x68,0xe6,0xef,0xf8,0xf1, + 0xe3,0xdc,0xb0,0x31,0x2f,0x2f,0xf7,0xdb,0x95,0x95,0x15,0x3c,0x4d,0x1f,0x52,0x4a, + 0x6c,0xc0,0xda,0x2a,0xd5,0x28,0x5d,0x61,0x86,0x76,0xf7,0x27,0x29,0x5e,0xeb,0x1c, + 0x29,0xfb,0x7d,0xee,0xbe,0xce,0x4c,0xd3,0x2e,0x2c,0x1,0x5d,0xa4,0x1d,0x21,0x9d, + 0xc1,0x14,0xd1,0x77,0x0,0x94,0x4a,0x8,0x6,0xf1,0x45,0xd6,0xc6,0x82,0x48,0x24, + 0x9c,0xda,0xe2,0x66,0x69,0x1c,0xaf,0x15,0x70,0x1f,0xa5,0x7c,0xe1,0x3,0xee,0xdd, + 0xb7,0x9f,0x31,0x41,0x3,0xbe,0x0,0xe8,0x4,0xf5,0x1a,0x4a,0xd6,0x5,0x6e,0x8e, + 0xf0,0x3,0xe7,0x84,0xfb,0x72,0xc4,0x3a,0x54,0x30,0x6a,0x3f,0x6b,0xff,0xaf,0x56, + 0xc0,0x8f,0x8f,0x79,0x82,0x9e,0x98,0x30,0xc1,0x0,0x58,0xfa,0x80,0x5b,0x65,0xc1, + 0x7d,0x19,0xb1,0xd7,0x16,0xaf,0xdb,0x9c,0x14,0xd5,0x2a,0x1f,0x30,0x77,0x6,0x2c, + 0xdd,0x19,0xe3,0x61,0x83,0xeb,0x62,0xf2,0xe4,0xc9,0x5c,0xf4,0x4,0x2a,0xd8,0xd, + 0xec,0xd1,0x6e,0x87,0x24,0x8b,0x48,0x3c,0x26,0x20,0xed,0x3d,0xa6,0xd9,0xf7,0x1e, + 0x17,0xbc,0xad,0x71,0xf7,0x86,0x65,0xc1,0xc9,0x84,0x3,0x49,0x17,0x74,0xad,0x69, + 0x6f,0xec,0x43,0x92,0x52,0xf7,0x5,0x24,0xba,0x41,0x89,0xee,0x33,0x16,0x7c,0xae, + 0x88,0x65,0x68,0x4d,0x7b,0x7,0xd,0x31,0x4b,0x41,0x6b,0x1c,0xb4,0xa6,0x66,0x7a, + 0x96,0x6b,0x6d,0xc9,0xa2,0xbc,0xa5,0x7b,0x47,0x5e,0x47,0xb6,0x40,0x35,0xf9,0xd9, + 0xde,0xc1,0x80,0xe7,0x7a,0x5c,0xdf,0xbd,0x56,0xc1,0x78,0x6e,0xca,0x2b,0x2b,0x69, + 0xc3,0xe6,0x6d,0x46,0xc5,0x6a,0x65,0xb,0x88,0x6a,0x33,0xb4,0x1,0x69,0x8,0x63, + 0xde,0x57,0x51,0x63,0x54,0x8a,0x56,0xcb,0xfa,0x18,0x6d,0x6e,0x2e,0xa9,0xae,0x8b, + 0x0,0x2e,0x22,0xa0,0xa5,0xfa,0x45,0xdb,0xa3,0x54,0xcf,0xaa,0xdc,0x7c,0x2a,0xda, + 0xb2,0x85,0x3e,0xf8,0xe8,0x3b,0xd4,0xfe,0xc3,0xab,0xc,0xd1,0x96,0x10,0xba,0x29, + 0x0,0x55,0x83,0xb6,0x3d,0x84,0x6e,0x47,0x6b,0xb8,0xbd,0xd5,0xde,0xef,0x80,0xda, + 0x34,0xe9,0x36,0xd0,0xf7,0x84,0xef,0x5b,0xd0,0x34,0x8c,0xe1,0xd6,0xb9,0xf8,0xc6, + 0x1b,0x34,0x49,0xd,0xdc,0xc7,0xa8,0xc1,0xf5,0x7d,0x3d,0x1e,0xa0,0x2e,0xdd,0xa7, + 0x51,0xb7,0xde,0xbb,0x42,0xf3,0x73,0x64,0x8e,0x8e,0x4c,0xd3,0x7e,0xb3,0x74,0x1c, + 0xc6,0x11,0x80,0xbb,0x59,0xea,0xb8,0x92,0xba,0xf6,0x2a,0xa6,0x6f,0xf6,0x78,0x92, + 0xaa,0x6b,0x6b,0xc3,0x5a,0xd6,0x41,0x1f,0x82,0x19,0x90,0x76,0xef,0xd9,0x43,0x85, + 0xdb,0x76,0x5a,0x66,0x5c,0xa3,0x78,0xcd,0xa0,0xa8,0xd6,0x51,0xbb,0xe1,0xb2,0xba, + 0x5e,0x28,0xde,0x48,0xe5,0xda,0xad,0x81,0x2a,0x15,0xe0,0xaa,0x30,0xf7,0x32,0xca, + 0x46,0xd6,0x46,0x4b,0x63,0x8a,0xd6,0xe6,0x69,0xa1,0x84,0xcb,0xaa,0x5d,0x53,0x75, + 0xa4,0xb8,0xa5,0x5,0x45,0xab,0x60,0x14,0x10,0x39,0xf5,0xea,0x39,0xee,0xfb,0xf0, + 0x2c,0x1e,0x38,0x72,0x9c,0x76,0x94,0x54,0xd0,0xe9,0xd7,0xce,0xf3,0xb3,0x88,0xdf, + 0xe3,0xf0,0xf1,0x57,0xf8,0x38,0xfd,0x1d,0x8d,0xb2,0x56,0xd7,0xb3,0x2e,0x7f,0x3, + 0xa1,0x44,0x33,0x8e,0x4d,0x4a,0xb9,0xc3,0xef,0x8a,0x79,0x82,0x61,0x8a,0xfe,0xfc, + 0x7b,0x9f,0xd3,0xf1,0x13,0xc7,0x2e,0x48,0xd6,0x9a,0xbf,0x63,0xc7,0x8e,0xf1,0xc6, + 0x23,0x47,0x8e,0x74,0x5b,0xbb,0x66,0xf5,0x6f,0xf6,0x1f,0xdc,0xcf,0xf5,0x4c,0xe1, + 0xd3,0x33,0x50,0x75,0x14,0xab,0xf,0x9a,0x49,0xfb,0x9b,0x1d,0x95,0x9c,0x64,0x76, + 0x36,0xcb,0xb4,0x6f,0x5b,0x5c,0x15,0x7b,0xcd,0x98,0xea,0xc1,0x86,0xf2,0x2a,0x29, + 0x2d,0x15,0xf9,0x5a,0xb6,0xaf,0xd3,0x2a,0x8,0xe1,0x9,0xa,0x71,0x83,0x25,0x52, + 0x4e,0xde,0x67,0x1c,0xc2,0xf1,0x32,0x85,0x0,0xde,0x17,0xea,0xfe,0xf5,0xe9,0x17, + 0x0,0xf8,0xd1,0xbe,0xfd,0x4c,0x21,0xe,0x40,0x17,0x53,0x8,0xa2,0xde,0xb3,0xc9, + 0xfb,0x5d,0xe5,0x42,0x57,0xf8,0x82,0x57,0xdb,0x70,0x46,0x44,0xf4,0xd0,0x11,0x23, + 0x38,0x7d,0x9,0x15,0xb4,0x74,0x29,0x4a,0x28,0x60,0x0,0xd8,0xf8,0x80,0xaf,0xb6, + 0xc7,0x66,0xe4,0x49,0x9a,0xc8,0xde,0x2a,0xc6,0x81,0x87,0x32,0x29,0x5d,0x45,0xab, + 0x1e,0x51,0x6,0xd4,0x97,0x86,0xb5,0x6d,0xfb,0x36,0xd5,0x71,0x4c,0xe2,0x42,0x1d, + 0xe9,0xf0,0x61,0x4c,0x52,0x90,0x5e,0x18,0x27,0xa9,0xd7,0x84,0x75,0x39,0x18,0x94, + 0xdb,0x9b,0x65,0xe0,0x9f,0x3,0x6a,0x7f,0xea,0x9c,0x1f,0xf6,0x1a,0x16,0x6e,0xac, + 0x83,0xa5,0x82,0xb3,0x80,0x38,0xf1,0xda,0x33,0x7e,0xf3,0xb6,0x51,0xe7,0xc2,0xe5, + 0xd2,0xec,0x4,0x25,0xfa,0x14,0xbb,0x1b,0xbc,0x68,0x81,0x3d,0x9b,0x65,0xc0,0xa3, + 0xc8,0x8d,0xe9,0x3b,0x11,0xc0,0x69,0x31,0x80,0x89,0x67,0x3a,0xc8,0x88,0xed,0xa4, + 0x6c,0x6,0xbd,0x44,0xba,0x46,0x6e,0x7e,0x1,0xed,0x2c,0x29,0x37,0x90,0x65,0x13, + 0x60,0xb5,0xf6,0x3,0xd7,0x18,0x45,0xab,0xcd,0x82,0x81,0xf,0xb8,0x3e,0x52,0xba, + 0xe1,0x7b,0x22,0x58,0x47,0xa0,0xb6,0xc0,0x2c,0xc0,0xab,0x5b,0x79,0x7d,0x13,0xed, + 0x2a,0xab,0xa0,0x15,0x6b,0xd7,0x51,0x79,0x55,0x15,0x7d,0xd1,0x7c,0x99,0xda,0xae, + 0x75,0x18,0xc8,0xb6,0xb4,0xe9,0x65,0xda,0x40,0x36,0xda,0x97,0x16,0x40,0x6e,0x8d, + 0x8e,0x6f,0x8b,0x96,0xb2,0xb9,0xbe,0xe1,0x48,0xf5,0x46,0xeb,0xc,0xe2,0x50,0x75, + 0xee,0xd8,0xb5,0x8b,0x46,0x8e,0x1a,0x4d,0x63,0xc6,0x8c,0xa6,0xee,0x77,0xdf,0x4f, + 0x5d,0xee,0x7a,0x8a,0x21,0x6c,0xfb,0x83,0xc3,0xe6,0x28,0xe2,0x6e,0x9,0x30,0xb6, + 0xcd,0xd4,0x1a,0xc2,0xa,0xbe,0xbd,0xf7,0x50,0x97,0x3b,0xa7,0xd3,0xa,0xd5,0xef, + 0xb4,0x86,0xa9,0x9a,0x6c,0x12,0x57,0x6a,0x1c,0x56,0x45,0xad,0x7e,0x4b,0x8c,0x69, + 0xb6,0x5e,0x58,0x28,0x22,0x48,0x19,0xf5,0x2b,0x95,0x28,0xc0,0x58,0x1d,0x29,0x5d, + 0xd,0xda,0x72,0x75,0x6c,0xb1,0xfa,0xdd,0xb7,0x6c,0xdb,0x45,0x1b,0x8b,0xb6,0xd0, + 0xda,0xf5,0x79,0xb4,0x66,0x5d,0x1e,0x2f,0xf3,0x37,0x14,0xf1,0xb6,0xed,0xbb,0xf6, + 0x50,0x49,0x45,0x35,0x83,0xb8,0x52,0x7,0x6a,0xe9,0xf3,0xf3,0x67,0x69,0x75,0xdc, + 0x60,0x29,0x60,0x7e,0x56,0x2a,0x6b,0x45,0xaa,0x5a,0x10,0x78,0x85,0x68,0xe9,0xcf, + 0x58,0xc1,0x22,0x58,0xf6,0xfb,0x74,0xe8,0xd8,0x9,0x6e,0xc7,0x4e,0x9d,0xe1,0xb4, + 0xdb,0xc0,0x17,0xfc,0xa9,0x89,0x9a,0x96,0xf1,0x7,0xd8,0xb6,0x79,0xc7,0x6e,0xaa, + 0xae,0xa9,0xe1,0xe3,0xd2,0x9,0xe9,0x8d,0x78,0xce,0x51,0x1b,0x1a,0x10,0x86,0x18, + 0x3b,0x73,0xf6,0xf4,0x6f,0x8f,0x1e,0x3d,0x7a,0xb3,0x86,0x70,0xc,0xc0,0x75,0x75, + 0x75,0xfd,0xd6,0xaf,0x5f,0xf7,0x7f,0x9d,0x38,0x79,0x82,0xe7,0xc7,0xc5,0x3f,0x85, + 0x84,0x5f,0x92,0x6a,0x45,0xbb,0xe2,0x2,0x39,0x9d,0x0,0x66,0x1,0xd8,0x2b,0xe, + 0x90,0x79,0x9b,0xfe,0xcc,0x4,0xa5,0x6d,0x77,0xac,0xa2,0xd3,0xb,0x47,0x94,0x50, + 0x5c,0x65,0x15,0xe5,0xc6,0xfc,0xa9,0x3,0x90,0xb2,0x29,0x3a,0xd7,0x2f,0x19,0x53, + 0x7a,0x96,0xbf,0x34,0x13,0xcb,0xf5,0x4b,0x39,0xc7,0x65,0x4,0x80,0xfb,0xf6,0xef, + 0x17,0x2a,0xe0,0xbe,0x41,0x1a,0x92,0x52,0xc0,0xf0,0xdb,0x3e,0xa5,0x20,0xa,0x53, + 0x74,0x8e,0x6b,0x72,0x5e,0x1d,0xa9,0x5d,0xb,0xc8,0x2,0xc0,0x4b,0xd5,0x12,0xb3, + 0x25,0x3d,0xfb,0xfc,0xb,0xb1,0x20,0xac,0x31,0xe3,0xc7,0x2b,0x0,0x47,0x26,0xe8, + 0x8c,0x33,0xd,0x5a,0xc6,0xa9,0xff,0x9c,0xf6,0xd4,0x5,0x76,0x2b,0x17,0xc9,0x1c, + 0x5b,0x33,0x7a,0x77,0xf3,0x43,0xdb,0xa2,0xfb,0x83,0x91,0x3b,0x54,0xf0,0x14,0x35, + 0x10,0x80,0x39,0x9a,0x23,0xa2,0x45,0x14,0xaf,0x3f,0x20,0x2f,0x52,0xa2,0x2d,0xe2, + 0xb7,0x4d,0x8a,0x3d,0x70,0x7,0x63,0xae,0xc2,0x95,0x9d,0x7b,0x67,0x8a,0x3b,0x6b, + 0xcb,0x74,0x6e,0x75,0xd1,0xcf,0xb0,0x8e,0x83,0x48,0x4a,0x97,0x6b,0x71,0x54,0xa1, + 0x76,0xbd,0xe8,0xf5,0xce,0xcc,0xcd,0xee,0xff,0x9f,0xeb,0x57,0x6d,0x71,0x94,0xbf, + 0xf5,0x1e,0x8f,0x9a,0xcf,0xaa,0xe4,0x93,0x4c,0xc9,0xce,0xef,0xe7,0xbe,0xc7,0xf7, + 0x3d,0xe2,0x3,0x96,0xb4,0xf5,0x3b,0xe1,0xf9,0x41,0xa0,0xe4,0x8a,0xd5,0x6b,0x2d, + 0x95,0xb,0x98,0x42,0x81,0x68,0xb8,0xf2,0xb6,0x8a,0x1a,0x7,0xb4,0xb5,0xe1,0x31, + 0x35,0x4e,0x3e,0x67,0xad,0x1,0x37,0xab,0xe4,0xaa,0xa0,0x49,0x25,0xac,0x5f,0x3, + 0xc0,0x45,0xaa,0x43,0x5d,0xb1,0x76,0x2d,0x1d,0x39,0x7e,0x4c,0xc1,0x54,0x3d,0xfb, + 0x57,0xdb,0x2,0xa0,0xb6,0x65,0x62,0x10,0x96,0x2d,0x50,0xbf,0x19,0x3,0xdf,0x8, + 0xd0,0x11,0x88,0x63,0xa6,0x6a,0x61,0x7a,0x96,0xc1,0x86,0x0,0x6e,0x30,0x70,0x89, + 0x7c,0xc2,0x88,0x3a,0x86,0x99,0xf4,0xa5,0xc5,0x4b,0x68,0xd4,0xe8,0xd1,0xa,0xc4, + 0x8f,0x7,0x10,0x86,0x12,0xee,0xb5,0x2d,0x80,0x2b,0x83,0xb8,0xc4,0x2,0xb1,0xad, + 0x8c,0xcb,0x2c,0x5f,0xb1,0x5f,0x19,0x57,0xd2,0x4d,0x3d,0xb7,0x53,0x97,0xdb,0x26, + 0xd0,0x53,0xb3,0x9e,0xe5,0x99,0x7f,0x82,0x29,0x55,0x3,0x7f,0x34,0x78,0x90,0xb7, + 0xa1,0x90,0xb6,0xef,0x29,0xb3,0x4c,0xcf,0x5a,0x59,0xf2,0x3d,0x95,0x83,0x1e,0xa8, + 0x60,0x80,0x51,0xa8,0xd5,0x32,0x80,0x2f,0x54,0xbd,0x80,0x69,0xe1,0xa6,0xad,0xb4, + 0x52,0xf5,0x7b,0x2b,0x56,0xac,0xa4,0xfc,0x7c,0x5,0xf6,0xbd,0x7b,0xa9,0xb1,0xa1, + 0x81,0x8e,0x1e,0x3d,0x82,0x49,0xc,0x50,0x41,0x8a,0xe,0x1c,0xd8,0x4f,0x15,0xe5, + 0xe5,0xb4,0x79,0xf3,0x66,0x5a,0xb9,0x72,0x15,0x2d,0xcb,0x59,0x41,0xeb,0x95,0xfa, + 0xdc,0x59,0x5c,0xe2,0xc0,0xb8,0x8e,0xcf,0x5f,0xc6,0xee,0x89,0xda,0xa8,0x90,0x47, + 0x75,0x9d,0x1,0x71,0x69,0xf8,0xbb,0x17,0x97,0x57,0xd3,0x89,0xd3,0x67,0x9d,0xc9, + 0x73,0x82,0x26,0xeb,0x38,0xe0,0xfe,0xef,0x3f,0x7c,0xd4,0xc4,0x24,0x68,0x17,0x7, + 0x6,0x18,0x78,0xe6,0x8a,0x36,0x6f,0x31,0x25,0x9a,0x65,0x7f,0x28,0x79,0x84,0xf3, + 0xfc,0xec,0x17,0x3f,0xe7,0xdf,0xf8,0xe2,0xa5,0xb,0xff,0xf7,0xe1,0xc3,0x2f,0xf7, + 0x5,0x6b,0xc1,0x5c,0xb,0xc0,0x90,0xc4,0xc5,0xc5,0xbb,0x17,0x15,0x6d,0x2a,0xa4, + 0x57,0x95,0x6a,0x41,0xfe,0x2f,0x60,0x68,0x41,0xd6,0x79,0x8d,0xce,0x90,0xb7,0x79, + 0xcc,0xc6,0xbe,0xd7,0xfa,0xfd,0xe6,0x3c,0x69,0x1,0xee,0xb0,0x13,0x43,0xfa,0x8c, + 0x4f,0xf9,0xe2,0x3d,0x57,0x3c,0xca,0xdb,0x56,0xd,0x19,0xba,0xf8,0xc6,0x25,0x2a, + 0x2b,0x2f,0x63,0x33,0xb4,0x29,0xd,0xe7,0x29,0x89,0x98,0x16,0x51,0xb3,0xbe,0x7c, + 0x48,0xaf,0x2,0x6c,0x6b,0xcd,0x52,0xd3,0xd7,0xa9,0x9d,0xab,0x7e,0xc8,0x2f,0xd5, + 0x28,0xba,0x5f,0xff,0xfe,0x46,0x1,0xc3,0x4,0x3d,0x27,0x4,0x70,0x50,0xdb,0x39, + 0x48,0x3d,0xb2,0x80,0xeb,0x98,0x9b,0x63,0x69,0x49,0x78,0xad,0xde,0x33,0x6e,0xd2, + 0xe4,0xe0,0x5c,0xcb,0x57,0x8,0x0,0x8f,0xa5,0x27,0xc6,0x87,0xa,0x58,0x7,0x9e, + 0x79,0x66,0x41,0x8a,0x15,0xc6,0xf7,0x54,0xbe,0xca,0x56,0x47,0xd9,0x5b,0xb0,0xa2, + 0x35,0x3e,0x57,0x33,0xa6,0x2d,0x7c,0xf2,0xa9,0xa7,0xb8,0x7e,0xaa,0xe,0xdc,0x49, + 0x7c,0x46,0xdc,0xc1,0x9a,0x67,0x0,0xe7,0x53,0x93,0x2e,0xc4,0xdd,0xc1,0x9a,0x1b, + 0x9f,0xd0,0xa9,0x7b,0x23,0xc1,0xac,0x6d,0x7d,0xa6,0x8c,0x75,0xc8,0x24,0x83,0xbb, + 0x39,0xe1,0x5a,0xb3,0xd,0x4,0x5c,0xb,0x91,0x1e,0x84,0xc8,0x67,0x3c,0xa,0x78, + 0x6c,0xb1,0x4d,0xed,0xee,0x67,0x65,0xfc,0x66,0x6c,0x9f,0x4a,0xf6,0x99,0xf7,0x5d, + 0x0,0xbb,0x3,0x9b,0xa4,0x41,0x8d,0xd7,0x9a,0x91,0x94,0xca,0x98,0x9,0x6,0x8a, + 0x48,0x3f,0x5a,0xa5,0xd4,0x55,0xa4,0x76,0x43,0x10,0x57,0x86,0xb0,0xad,0x88,0x14, + 0xb0,0x51,0xbb,0xd8,0x56,0x59,0x6b,0x29,0x64,0xd3,0xb4,0x79,0x5a,0x9a,0xa1,0x35, + 0xc4,0x1d,0x5f,0x30,0x52,0x8c,0xd6,0x29,0x0,0x5c,0x7a,0xfb,0x4d,0xa3,0x7a,0x3, + 0x90,0x46,0x4b,0xf6,0xff,0x3a,0xf0,0xd5,0xfb,0x2c,0x40,0x77,0xb4,0xa,0x85,0x1c, + 0x0,0xb7,0x5,0xbf,0x4d,0x6b,0xda,0xbc,0xe,0x20,0x9c,0xb6,0x60,0xdc,0x62,0x15, + 0x26,0xd2,0x3,0x9e,0x60,0xbb,0x2e,0xcc,0xf1,0xdc,0x9c,0x39,0xec,0xf,0x1e,0x3d, + 0x7a,0x54,0x60,0x8e,0xbe,0x75,0x18,0x75,0x7d,0x70,0x2d,0xdd,0xfc,0xe8,0x5e,0x4b, + 0xd,0x33,0x8c,0xfb,0x96,0x3a,0x4a,0xb8,0xd4,0x4a,0x59,0xb2,0xaa,0x69,0xa9,0x75, + 0x9c,0xa7,0xeb,0x6d,0x43,0x69,0xb2,0xea,0xa3,0x3e,0xfa,0xe4,0x23,0xe,0xa8,0x64, + 0x3f,0xb4,0x1a,0x0,0xc0,0x15,0x89,0xe8,0xf4,0x82,0x4d,0xdb,0x82,0xe2,0x28,0x96, + 0xff,0xbd,0x2e,0x4a,0xd3,0xd1,0x2a,0x53,0x44,0x2c,0x7,0x26,0xdf,0x5a,0x63,0x72, + 0xde,0xa1,0xc0,0xb9,0x7a,0x6d,0x2e,0xad,0x56,0xfd,0x58,0x59,0x59,0x19,0xa6,0xec, + 0xa3,0x2b,0x4a,0x1d,0x5e,0xbb,0xda,0x4e,0x3f,0xfe,0xa7,0xeb,0xf4,0xa3,0xeb,0xd7, + 0xe8,0x47,0x3f,0xbc,0xc6,0xeb,0xba,0xfd,0xf4,0x27,0x3f,0xe2,0x76,0x55,0x3d,0x27, + 0x9f,0x7e,0xfa,0x9,0x1d,0x3a,0x74,0x90,0xd6,0xaf,0xcf,0x65,0x18,0x6f,0x2c,0xda, + 0x6a,0xd4,0xb4,0x54,0xc3,0x41,0x70,0x56,0xb0,0xc,0x14,0x70,0xa4,0x60,0x71,0x4d, + 0x9f,0x7c,0xf6,0x19,0xb5,0x73,0xb5,0xc2,0x1f,0xd0,0x6b,0x17,0x2e,0xd2,0xf9,0x4b, + 0x6f,0xf0,0x12,0x81,0x58,0xe7,0x2f,0x5d,0x62,0xd1,0xc0,0x93,0x82,0xbc,0xff,0x41, + 0x64,0x51,0x11,0x4b,0xa8,0x60,0xa4,0x62,0x7d,0xf4,0xc9,0xc7,0xa6,0xfc,0xac,0xcf, + 0xd,0x83,0x7d,0x3f,0xfe,0xd9,0x4f,0x78,0xf9,0xee,0xfb,0xef,0x92,0x2,0xf0,0xa2, + 0xa3,0x47,0x8f,0x75,0x51,0x4a,0x38,0x2,0x30,0x5e,0x80,0xca,0x5,0x5,0xf9,0x47, + 0x10,0xb8,0x74,0xe1,0xd2,0x45,0xe,0xb9,0x6f,0x11,0xf0,0x8b,0x41,0x34,0x4,0x65, + 0xf4,0x3a,0x52,0xb5,0x57,0x3c,0xe6,0x69,0x7d,0x9c,0xab,0x9e,0x2d,0xb0,0xfa,0xcc, + 0xd7,0xe1,0x67,0xb9,0xe0,0x77,0x4d,0xd1,0xf8,0xd2,0x38,0x17,0x26,0x4e,0x3e,0x7e, + 0xe2,0x78,0x4c,0xbd,0xba,0x7e,0x4d,0xb7,0x10,0x48,0x52,0x95,0x26,0x6f,0x49,0x45, + 0x4f,0xa5,0x9b,0x94,0x33,0xc5,0x1c,0xe0,0xf,0x5,0xac,0x1,0xac,0x15,0x30,0x26, + 0x63,0x8,0xa2,0x9e,0xd7,0x72,0x1a,0x11,0xfc,0xb7,0x4b,0xd4,0xc8,0x6e,0xc9,0x8a, + 0x55,0xbc,0x5c,0xaa,0x9b,0x52,0xb9,0x4b,0x57,0x46,0x91,0xd0,0xfa,0x35,0xf6,0x3d, + 0xf7,0xc2,0x8b,0x9c,0xf,0x8c,0x62,0x1c,0xc,0xe0,0x1c,0x6d,0x82,0x1e,0xcb,0xa, + 0x78,0xca,0xb4,0x40,0x1,0xb7,0x8a,0x34,0xa4,0x56,0x4f,0x2d,0xda,0x8c,0x15,0x15, + 0x9e,0x3c,0xeb,0x8e,0xaf,0x7a,0x91,0x5b,0x2e,0xd2,0xbd,0x87,0xf8,0x9c,0xf3,0x17, + 0x5e,0xa7,0xf1,0x13,0x26,0x50,0x65,0x75,0x55,0x7c,0x32,0xf,0x1f,0x40,0xdd,0x40, + 0xbd,0x2c,0xb0,0xf4,0xed,0x6b,0xf6,0xb8,0x2a,0x12,0xcf,0x2f,0xc0,0xec,0xaa,0x37, + 0xa9,0x18,0xad,0xc8,0xfe,0x6c,0xf1,0xd,0x19,0x1b,0xd0,0x9d,0x5d,0x77,0xcc,0xdc, + 0x9d,0x49,0x75,0xaa,0xd0,0x13,0x7,0x22,0x99,0x54,0xe7,0x55,0xea,0x32,0x9,0x80, + 0x74,0xcc,0xe6,0xcd,0x8e,0x7f,0x3d,0x25,0x6,0x0,0x46,0xb1,0x67,0x52,0xb1,0x81, + 0x52,0xaa,0xb3,0x7c,0x7e,0xef,0x60,0x23,0xcc,0x5a,0x50,0xff,0x2b,0x25,0x4a,0xe5, + 0x60,0xf2,0x5,0xd,0xd3,0x3d,0x4a,0xa5,0xb8,0x50,0x95,0x1d,0xe1,0x5e,0x4f,0x8b, + 0x94,0x71,0x4d,0x1c,0xc8,0x21,0x78,0xa5,0x7f,0x19,0x29,0x46,0x2b,0xd7,0xe7,0xd1, + 0x8e,0xdd,0xbb,0xe9,0x93,0xef,0x7e,0xc6,0x51,0xce,0x91,0xea,0x8d,0xd4,0xac,0xd, + 0xda,0xe8,0xb5,0x1,0xb2,0xe,0xd0,0xd2,0x50,0x76,0x61,0xad,0xce,0xd7,0xc,0x8, + 0xb,0x18,0xb7,0xe8,0xd8,0x4,0x5d,0x49,0xcd,0x4,0x85,0x46,0x4b,0x3,0xe1,0x74, + 0x9a,0xd3,0x7f,0xde,0x7a,0xe7,0xdb,0x34,0x77,0xde,0x3c,0x36,0x47,0xa3,0xea,0x5c, + 0xef,0xde,0xbd,0xe8,0x96,0x5b,0x1f,0x54,0x6a,0x78,0x6,0xdd,0xf4,0x70,0x1,0x75, + 0x7b,0x74,0x8f,0xf1,0xd,0xdf,0xec,0xfa,0x86,0xb5,0x39,0x5a,0x80,0x17,0xc5,0x3d, + 0xba,0xaa,0xf7,0x41,0x4d,0xdf,0x7a,0xe7,0xc3,0x34,0x7b,0xf6,0x2c,0xe,0xb2,0xc2, + 0x67,0xe1,0xb3,0xd1,0x3f,0x20,0x3a,0x18,0xbe,0xf9,0xf5,0x1b,0x8a,0xa2,0xfb,0x1c, + 0x36,0xad,0x78,0xb5,0x5f,0x55,0xb7,0xe8,0x75,0xad,0x9,0xb6,0x2a,0x2e,0xa9,0xe0, + 0x8,0xf7,0x75,0xeb,0xd7,0xd3,0x91,0x23,0x47,0xe8,0xcb,0x2f,0x7e,0x40,0x3f,0x54, + 0x80,0xfb,0xa1,0x1a,0x5c,0x5c,0x55,0xfd,0x4c,0x87,0xfa,0xce,0x1d,0xc8,0x5,0x47, + 0x2a,0x90,0x7a,0x6e,0xb0,0xc4,0xb6,0xf6,0xd6,0xe8,0x75,0xbb,0x7a,0x7d,0x5d,0x1d, + 0xff,0x93,0x1f,0xff,0x13,0xfd,0xe8,0x9f,0x7e,0x48,0x1f,0x7c,0xf0,0x3e,0xed,0xdc, + 0xb9,0x93,0x72,0x96,0xaf,0xa4,0xcd,0xdb,0x76,0xb1,0x1a,0xd6,0x10,0xd6,0x9f,0x1d, + 0x1,0x39,0xb8,0x56,0x3c,0x57,0x47,0x4e,0x9e,0xa2,0x56,0x56,0xb9,0x6d,0xec,0x7, + 0xde,0x55,0x5a,0x41,0xc5,0x65,0x55,0xac,0x6a,0xd1,0x90,0xdf,0x7c,0xf1,0xcd,0xb7, + 0x38,0x2f,0x18,0x7d,0xd6,0xc1,0xa3,0xc7,0x79,0x7b,0xa9,0x81,0x70,0x2d,0x9b,0xb2, + 0xf3,0xb,0x37,0xb3,0x8b,0x8d,0xd5,0x72,0x96,0x38,0x9,0xf8,0x80,0x1,0x73,0xe4, + 0xe,0x1f,0x39,0x72,0x58,0x7d,0xfd,0x23,0x36,0x80,0xb1,0x1,0x6d,0xd5,0xaa,0x15, + 0x6d,0xb5,0x75,0x35,0xa6,0xfe,0x73,0x4c,0xf5,0xa6,0xb3,0xa8,0x61,0xd,0x53,0xa1, + 0x72,0x25,0x74,0x1,0x51,0x94,0x6e,0x33,0x90,0xe,0xf7,0x4b,0x80,0x5b,0x40,0xf7, + 0xa8,0x6d,0x9f,0x29,0x5c,0x8e,0x34,0x90,0x36,0x55,0x52,0x56,0xca,0xe5,0x33,0x59, + 0xfd,0xb6,0xc6,0x27,0x79,0x8f,0xe5,0x43,0xba,0x93,0x39,0x64,0x2b,0xe6,0xef,0xab, + 0xcd,0xdb,0xea,0x9f,0xe0,0x1d,0xd0,0xfb,0x32,0x4,0xf0,0xb7,0x44,0x14,0xf4,0xbc, + 0x70,0x32,0x86,0x25,0x2b,0x56,0xd2,0xaa,0xdc,0x3c,0x86,0x2e,0xa2,0x99,0x75,0x55, + 0x2c,0x3d,0xef,0xaf,0x9e,0x76,0x70,0x7e,0x58,0x72,0x12,0xef,0x41,0xe0,0x16,0x1a, + 0xcc,0xd8,0x5c,0x17,0x3a,0x4,0xf8,0xe2,0xe5,0xc1,0x64,0xc,0xc,0xe0,0x71,0x1, + 0x80,0x5b,0x44,0xea,0x95,0x35,0xe1,0x44,0xb6,0xd9,0x9d,0x62,0xb3,0xe0,0xb4,0xc6, + 0xab,0x17,0xb9,0x55,0xa8,0x1c,0x65,0xac,0xfd,0x82,0x38,0xf,0xfe,0x79,0x17,0x2f, + 0x59,0x4c,0x2f,0x2d,0x5e,0xcc,0x16,0x95,0x8c,0x50,0xc1,0x91,0xc2,0x4b,0xd9,0x83, + 0xb4,0x74,0x8b,0x17,0x5a,0xb1,0xc1,0x98,0x7,0x74,0xcd,0xbe,0x54,0xb6,0x4e,0x82, + 0x2,0xf5,0xfe,0x6c,0xc7,0x7a,0x95,0x6b,0xc6,0x81,0x72,0x26,0x59,0xdd,0x27,0xc5, + 0x3c,0xb4,0x38,0x16,0xa4,0x66,0x19,0xd4,0xe8,0xde,0x7,0x27,0xe8,0xcc,0xe7,0xfb, + 0x76,0x53,0x2,0xb3,0xaa,0x52,0x9f,0xaf,0xdc,0x93,0xe6,0xd7,0xec,0x9a,0x8e,0x33, + 0x9,0xdf,0xc9,0xf9,0x6c,0x9f,0xb5,0xca,0x37,0xd8,0xd0,0xc7,0x17,0x6c,0x2c,0xe4, + 0x62,0xf7,0xc6,0x64,0xac,0x97,0x15,0x35,0xa6,0x69,0x28,0xef,0x15,0x11,0xd2,0x11, + 0x80,0x6b,0x42,0xbf,0x70,0x8d,0x30,0x3d,0xd7,0x18,0x13,0xb5,0xeb,0xfb,0xdd,0x5a, + 0xbc,0x97,0x2d,0x4a,0x75,0x8d,0xd,0x74,0x59,0x3d,0x53,0x88,0x74,0x4e,0x19,0xbf, + 0x6d,0x5c,0xfd,0x46,0xad,0x8d,0x5b,0x2a,0x34,0x3d,0xb7,0x84,0x0,0xe,0x5a,0xf4, + 0xba,0x25,0xc9,0x4c,0x2d,0x15,0x71,0x6b,0xda,0xfc,0xae,0xcd,0x66,0x30,0x94,0x89, + 0x2d,0x83,0xe7,0x23,0xc5,0x7e,0xd8,0xb7,0xdf,0x7d,0x87,0xcd,0xd1,0x23,0x47,0x8d, + 0xe2,0x74,0xbf,0x11,0x8f,0xf,0xa7,0x7,0x1e,0x78,0x80,0x6e,0xfe,0xd6,0x43,0x3c, + 0x73,0x52,0xd7,0xfb,0x97,0x50,0xb7,0x9e,0x45,0x81,0x8f,0x98,0x95,0x71,0x89,0x80, + 0x72,0x89,0xda,0xbe,0x9b,0x6e,0x7a,0xa4,0x88,0xba,0xf6,0x58,0x42,0x5d,0xef,0x1c, + 0xaf,0xc0,0xdb,0x93,0x7a,0xf5,0xea,0x49,0x4b,0x97,0x2e,0x51,0x80,0xf8,0x94,0xfb, + 0x2d,0x7c,0x26,0x2,0xaf,0x60,0xfa,0xae,0xac,0xae,0x36,0xf0,0xd5,0x7e,0xf7,0xd8, + 0xfd,0xf,0xef,0xaf,0xf1,0xb1,0x73,0xfa,0x4e,0xa0,0x3a,0x1,0xc0,0xc2,0x2d,0xdb, + 0x69,0x95,0x12,0x1c,0x7,0xe,0x1c,0xa0,0xcb,0x4a,0xed,0x2,0xbc,0x1d,0x0,0x20, + 0xc0,0x2a,0xa0,0xb,0x0,0x5f,0x53,0x3,0x9c,0x6b,0x98,0x57,0x57,0xb5,0xab,0x6a, + 0x1d,0x70,0xbe,0xaa,0xee,0x19,0x8e,0x69,0x13,0xd,0xef,0xfb,0x91,0x52,0xc7,0xbf, + 0xf8,0xd9,0x4f,0xe9,0xfd,0xf7,0xdf,0xa3,0x5c,0xd5,0x97,0xae,0x84,0xb,0xa3,0xbc, + 0x9a,0xd5,0x70,0x99,0x50,0xc0,0x91,0x19,0xba,0x96,0x7,0x3,0x6f,0xbd,0xf3,0xe, + 0xbb,0x2a,0x3f,0xfc,0xf8,0x63,0xaa,0x6e,0xd8,0x67,0xac,0x2c,0xfa,0x3b,0xe0,0x79, + 0x69,0x3c,0x78,0x98,0x3e,0x56,0x2a,0x19,0x99,0x2c,0x48,0x55,0x92,0xdf,0x5b,0xfb, + 0x92,0x8b,0xb6,0xed,0xe4,0x22,0x4f,0x3a,0x90,0xcb,0x67,0x15,0xc2,0xb3,0x8d,0xb2, + 0x95,0xd7,0x7f,0xf4,0x43,0x8e,0x49,0x3a,0x7e,0xfc,0x68,0xea,0xf0,0xe1,0xc3,0xcc, + 0x5b,0xb,0xc0,0xfb,0xf7,0xef,0xbf,0x75,0xe5,0xca,0x15,0xff,0x7c,0xe0,0xe0,0x81, + 0x28,0x0,0xcb,0x1,0x65,0x52,0xcb,0xa6,0x58,0x5d,0xe5,0x1b,0x3,0xaf,0x50,0xd4, + 0xae,0x22,0xb6,0x60,0xee,0x98,0xa6,0x7d,0xfe,0x2c,0xf8,0x7d,0x1b,0x9b,0x9a,0x14, + 0xe8,0x9b,0xa3,0x79,0x57,0x9d,0xe8,0xe4,0x54,0x62,0x11,0x7,0x91,0x8e,0xe1,0xa9, + 0x5f,0x1c,0x2b,0x37,0xd9,0xee,0x4c,0xf3,0x66,0x55,0xc0,0x9,0xfc,0xa,0xac,0x80, + 0x7,0xf4,0x8f,0xf2,0x80,0x35,0x80,0xc3,0x52,0x92,0x1a,0xa0,0x80,0xf1,0x62,0xdd, + 0xc2,0xd7,0xbc,0x6d,0xf9,0x4a,0x7b,0x3f,0xab,0xdd,0xe5,0x26,0x8f,0x18,0x50,0xd6, + 0xdb,0xb4,0x9,0x7a,0xb4,0x1a,0x19,0x1b,0x0,0x87,0xb3,0x21,0x65,0x9c,0x9,0xd4, + 0xbd,0x10,0x6e,0xf7,0x14,0xd8,0x68,0x4f,0xaa,0xf4,0xd5,0xea,0xa9,0xe,0x15,0xaf, + 0xdc,0x84,0x1,0x0,0xe6,0xa,0x96,0x29,0x49,0xb1,0x8e,0x3f,0xc1,0xf2,0x91,0x14, + 0xec,0x67,0x3d,0x4f,0x69,0xdb,0x64,0x2d,0x9f,0x3b,0x5f,0x74,0x3d,0xee,0x89,0x5, + 0xf0,0x4,0x40,0x24,0x41,0x38,0x1e,0x5c,0x98,0xc5,0xed,0x12,0x6,0x26,0x35,0x27, + 0x80,0x48,0xd6,0x57,0x6f,0x4e,0xfa,0xac,0xb4,0x3f,0x35,0x2f,0xd1,0xe5,0xe3,0xe, + 0x2,0xd2,0x2d,0x5e,0xbf,0xb1,0x3f,0xa6,0xa2,0x73,0xd5,0x1e,0x33,0x7b,0xb,0xff, + 0x77,0xb3,0xf4,0x69,0x67,0xe2,0xe7,0x4c,0x2,0x37,0xce,0x81,0xc1,0xd9,0xca,0x35, + 0xeb,0x8c,0xaf,0xcd,0xd,0xa8,0x8a,0x5e,0xd7,0x1a,0xc8,0x66,0x6b,0x7b,0xc4,0x92, + 0x8f,0x7,0x84,0xb1,0x2d,0x84,0xf0,0xc6,0xad,0x3b,0x68,0x95,0x52,0x62,0x98,0x42, + 0x93,0x2b,0x5a,0x85,0xe9,0x45,0x12,0xb8,0xad,0xd7,0x3a,0x18,0xca,0x78,0x66,0x50, + 0xd,0xf0,0x93,0x4f,0x3f,0xa1,0xf,0xbe,0xf3,0x1,0x7d,0xf8,0xd1,0x87,0x3c,0x1, + 0x3,0xdc,0x4b,0xf0,0xe9,0xb6,0x5e,0xef,0xa0,0xc,0x94,0xb3,0x86,0xae,0xb3,0x6c, + 0x9,0x3,0xb1,0x9a,0xb5,0xea,0x6d,0x13,0x10,0xc6,0x3d,0x11,0x6a,0x38,0x25,0x4d, + 0xcf,0x69,0xed,0x6,0x88,0xd4,0x70,0x10,0xd7,0xd1,0xc1,0x66,0xd3,0x2d,0xdb,0xb6, + 0x71,0x74,0xf4,0xa8,0x50,0xd,0xc3,0x37,0xfc,0xe8,0xa3,0xbd,0xe9,0xae,0xbb,0x7b, + 0x28,0x55,0xfc,0x10,0x75,0xbd,0x75,0x10,0x75,0xb9,0x7d,0xc,0x75,0xb9,0x73,0xa, + 0xcf,0x29,0xdc,0xa5,0xbb,0x5a,0xde,0x3e,0x9a,0x6e,0xba,0x6d,0x10,0x43,0xf7,0xbe, + 0x1e,0xf,0x52,0x9f,0x3e,0xbd,0x69,0xf2,0x94,0x49,0x54,0x5a,0x5e,0xa6,0x4,0xd7, + 0x97,0x6c,0x6e,0xd6,0xca,0x17,0xbf,0x9,0x22,0x9e,0x73,0x37,0x6e,0xb2,0xee,0x7b, + 0x89,0x50,0xc0,0xd2,0xca,0x60,0x7c,0xac,0xc2,0xe4,0x5b,0xa2,0x40,0xb6,0x66,0x7d, + 0x1e,0x6d,0xda,0xbc,0x99,0x21,0x9,0x13,0x32,0x54,0x6c,0x0,0xd1,0x14,0xb7,0xe, + 0x75,0x2f,0xae,0xab,0xed,0xd7,0xd0,0x4f,0xa9,0xef,0xf7,0x7d,0x75,0xaf,0x3f,0xfe, + 0xe4,0x63,0xfa,0x40,0xdd,0x67,0xb4,0x8f,0xd5,0x75,0x7c,0xa9,0x20,0xd8,0xa6,0xfa, + 0xe,0x80,0x1b,0xc7,0xe1,0x3d,0x0,0xb0,0x6,0xf8,0x8f,0x95,0x1a,0x86,0x9,0xbb, + 0xa9,0xb1,0x91,0x96,0x2e,0xcb,0xe1,0x80,0x2e,0x3,0x61,0x7d,0x5d,0x95,0xc1,0xb5, + 0xe1,0x9a,0x2b,0xc3,0x1a,0xd4,0xa5,0x3c,0x38,0xab,0x36,0xf9,0xbe,0xf2,0xfb,0xf0, + 0xb3,0x18,0x6,0x5c,0xc9,0x8a,0x6a,0x5a,0xf9,0xe3,0xd8,0x9d,0x7b,0xcb,0x69,0xf3, + 0xd6,0xad,0x56,0x1a,0xa1,0xcf,0xb2,0x84,0x60,0x58,0x4c,0xcc,0x0,0x51,0x7b,0xe6, + 0xcc,0xa9,0xbf,0x1f,0x3c,0x78,0xf0,0xb6,0x18,0x80,0xab,0xaa,0xaa,0x6,0xac,0x5e, + 0xbd,0xf2,0xdf,0x50,0xe1,0x3,0xa,0x12,0xea,0xa5,0x33,0xe0,0xa2,0x33,0x8b,0xa9, + 0x5e,0x8f,0xa9,0xda,0xf7,0x3e,0x19,0xbc,0x65,0xce,0x9d,0x6a,0x36,0xaf,0x5d,0x55, + 0xed,0x2a,0x6a,0xd9,0x91,0x3,0x7a,0xb8,0x5e,0x74,0xf6,0xc8,0x5f,0xf6,0xcd,0xa9, + 0x9a,0x2d,0x7d,0x24,0xd1,0xef,0x7b,0x3,0x2a,0x31,0x29,0xaa,0x18,0xaa,0xf3,0x4b, + 0x75,0x4d,0xfd,0x7,0xe,0x30,0x26,0xe8,0x71,0x93,0xed,0x42,0x1c,0x81,0xb2,0x5d, + 0x66,0x26,0x57,0x90,0x60,0x35,0x53,0x16,0xea,0xd7,0x62,0x1a,0x42,0x3d,0x93,0x12, + 0x9b,0xa0,0x73,0xec,0x28,0xe8,0xd1,0x63,0xc7,0xd1,0xd4,0xe9,0xd3,0x82,0x0,0x0, + 0x3d,0x1d,0xa1,0xe3,0x3,0x4e,0xaa,0x8e,0x65,0xcc,0xd0,0xed,0x6d,0xf1,0x2a,0x61, + 0xd6,0xd4,0x72,0xf1,0x5c,0x61,0xf7,0x9e,0xea,0xe0,0x6,0x4,0x6f,0xcc,0x7c,0xf2, + 0x49,0xf5,0xcf,0x5c,0xcc,0xbf,0x91,0xe,0x42,0x4a,0x8a,0x86,0x8f,0x2b,0x5d,0x3f, + 0x98,0x8d,0xc5,0x24,0xc1,0x1a,0xd3,0xec,0x49,0x8d,0xb3,0x2,0xfc,0x3c,0x10,0x8b, + 0x62,0x13,0x92,0x41,0xe4,0xfb,0x8c,0x6c,0xca,0xda,0x1b,0x8c,0xe8,0x82,0x35,0x9d, + 0x5d,0x31,0xc6,0xf2,0xed,0x7d,0x81,0x8d,0x9e,0x1,0x80,0xb7,0x62,0x9d,0x1b,0xd8, + 0x98,0x89,0x9b,0xf1,0x93,0xcc,0xfc,0x51,0x46,0x44,0xca,0xae,0x7,0xe0,0xf1,0xe5, + 0xb7,0x24,0x29,0x79,0x6b,0xc0,0x10,0x3c,0x27,0x88,0xdb,0xc0,0x84,0xf6,0x6,0xa0, + 0x15,0xd1,0x12,0x1d,0xa1,0x36,0xd,0x6,0xeb,0xd5,0x81,0x22,0xae,0xac,0x8d,0x83, + 0xb7,0xc2,0x5e,0x9a,0x63,0x84,0x5f,0x78,0xdd,0x86,0x42,0xca,0xdf,0xb8,0x91,0xde, + 0x51,0x40,0x80,0xc9,0x19,0xf0,0xbb,0x92,0x69,0x9,0xc1,0xdb,0xc6,0x40,0x6,0x70, + 0x11,0xf1,0xbb,0x75,0xf7,0x76,0x9a,0xb3,0x6a,0x21,0x8d,0x5e,0x34,0x83,0x6,0x2c, + 0x9c,0x40,0xbd,0x16,0x8c,0xa1,0xde,0xb,0x9e,0xa0,0x81,0x8b,0x26,0xd2,0xc4,0xa5, + 0xb3,0x68,0x51,0xde,0x72,0x5,0x9a,0xa,0x7a,0xf3,0xad,0xb7,0xf8,0x7b,0xb6,0x29, + 0x18,0xa7,0xaf,0xb6,0x9,0xf8,0xa6,0x2d,0xb0,0xb7,0x84,0xea,0xba,0x25,0xf4,0xff, + 0xca,0xc8,0x76,0x63,0xe1,0x70,0x7d,0xc1,0x2,0xc4,0x26,0xba,0x3c,0x9c,0x43,0xf8, + 0xc2,0xa5,0x4b,0xb4,0x56,0xd,0x24,0x30,0xff,0x37,0x14,0xf1,0x13,0x63,0xc7,0x32, + 0x8c,0xe1,0x23,0x1e,0x3e,0xfc,0x31,0x1a,0x38,0xb0,0x3f,0xe7,0xf,0xa3,0xf5,0xeb, + 0xd7,0x97,0x6,0xd,0x1a,0x40,0x43,0x87,0xe,0x56,0xaa,0x79,0x4,0x4d,0x9b,0x3e, + 0x9d,0xb6,0x28,0x78,0xc0,0xe4,0xac,0x27,0x86,0x8,0x72,0x8f,0xdb,0xd9,0x2,0xba, + 0x69,0xcb,0x56,0xca,0x2b,0xdc,0x12,0x53,0xbe,0xc6,0x1f,0x2f,0x20,0x6c,0xd4,0x63, + 0x8,0x62,0x98,0xa0,0x77,0xee,0x29,0x65,0x45,0xaa,0xb8,0xc2,0x3e,0x5e,0xc0,0x17, + 0xe0,0x6d,0x45,0x7a,0xa4,0xea,0x3,0xae,0x42,0xe5,0xa2,0x5e,0xbe,0x52,0xa2,0x48, + 0x17,0x2d,0xd9,0xb5,0x93,0x36,0x2d,0x78,0x81,0x8a,0x26,0x8f,0xa7,0x5d,0xa3,0x86, + 0xd1,0xde,0xe1,0x3,0xa9,0x74,0xf8,0x20,0x2a,0x1e,0x3d,0x8c,0x76,0xcc,0x98,0x42, + 0x3b,0x96,0x2d,0xa1,0x1a,0x35,0x50,0xb8,0xf8,0xe6,0x1b,0x74,0x59,0x9,0x1b,0x6, + 0x31,0xfa,0x38,0xb8,0xda,0xd4,0xbd,0x87,0x5a,0xfe,0xc5,0xcf,0x7f,0x4a,0x6f,0x5c, + 0xba,0x48,0xab,0xd5,0xe7,0x6,0x41,0x5a,0xe,0x84,0xf5,0x0,0x41,0xe6,0x93,0x3b, + 0x29,0x6b,0x3e,0xb7,0xc7,0x1e,0xf1,0xbc,0x45,0x71,0x8,0xc1,0x7d,0xc8,0x2d,0xd8, + 0xc0,0xf3,0x24,0xa7,0xb2,0xd4,0xa,0xe0,0x39,0x82,0x7f,0xfa,0x63,0xee,0xff,0x2e, + 0x5c,0x78,0xfd,0xdf,0xe,0x1e,0x38,0xd0,0x1f,0x2a,0xd8,0xf2,0x1,0xef,0xdc,0xb9, + 0x63,0x5e,0x7e,0x7e,0x2e,0x9d,0x56,0x37,0x3,0x23,0x3c,0x98,0x8b,0x7d,0xf0,0xc3, + 0xd2,0xb7,0x4f,0x42,0x34,0x6,0xcf,0x4e,0x94,0xb4,0xb,0xda,0x24,0xf8,0x7b,0x47, + 0xe2,0x61,0xb5,0x22,0x38,0xc3,0xab,0x6a,0xaa,0x79,0xee,0x62,0x5d,0x10,0xdb,0xad, + 0x53,0x9b,0xf2,0xf8,0x7e,0x25,0x2c,0x64,0xe1,0xa,0x3d,0x81,0x81,0x2e,0xba,0xce, + 0x13,0xda,0x87,0xd3,0x18,0x62,0x9f,0x86,0x9b,0x9e,0xf2,0x8f,0xf7,0x85,0xdb,0x78, + 0xae,0xdc,0x1f,0x5e,0xe7,0x44,0xed,0x28,0xf,0x58,0x3,0x78,0x91,0x35,0xa7,0x6f, + 0x0,0xdb,0x8,0xba,0x1a,0xb6,0xb,0x4,0x6c,0xe5,0xfc,0xbf,0xfa,0x78,0xfd,0x5e, + 0xf8,0x93,0x75,0x1e,0xf0,0x28,0x36,0x41,0x8f,0x53,0x8a,0x73,0x12,0xdf,0x97,0x6b, + 0x6a,0x64,0x88,0x60,0x8a,0xa0,0x75,0x84,0xd7,0xda,0x61,0xb6,0x99,0xf5,0x70,0x3b, + 0xbf,0x96,0xcb,0xf0,0xbb,0xe8,0x26,0xd5,0xb3,0x3f,0x20,0x2b,0xda,0xa6,0x8f,0xc1, + 0x6f,0xb4,0x76,0xdd,0x3a,0x5a,0xb0,0x70,0x21,0x3f,0x57,0x66,0xa4,0x98,0x49,0x50, + 0x95,0x5e,0x9f,0x7f,0x34,0x90,0xf3,0x1,0xa7,0x39,0x29,0xd,0x2e,0x1b,0xd8,0x13, + 0x62,0x15,0x62,0xe9,0x76,0x2e,0x94,0xb2,0xc1,0xb6,0x93,0x4c,0x1,0xdf,0xe7,0x64, + 0x3d,0xc6,0x67,0x1,0xf0,0x58,0x82,0x3a,0xfb,0x5c,0xd7,0x5c,0xdd,0x69,0x3a,0xa1, + 0x88,0x46,0x77,0xc1,0x9c,0x6d,0xc0,0xe1,0x55,0xf0,0xa9,0x96,0xac,0xa6,0x7d,0xae, + 0x3a,0x74,0xe4,0x30,0xad,0xc9,0xdb,0xc0,0x1d,0x37,0x43,0xb6,0xbc,0xda,0x28,0x13, + 0xd3,0xc1,0x6b,0x73,0x74,0xa5,0xd,0x65,0xdd,0x11,0x46,0xd0,0x75,0x5a,0x55,0x14, + 0x88,0x5,0xf8,0x6e,0xd9,0xb1,0x9d,0x3e,0x41,0x1f,0x11,0x9a,0x9c,0x39,0x85,0x48, + 0x1,0x13,0xe0,0x85,0xf0,0xd8,0x5d,0xb2,0x87,0x26,0xbc,0xf4,0x34,0xdd,0xbd,0x68, + 0x38,0x75,0xcd,0x1f,0x46,0x5d,0x4b,0x9e,0xa0,0x6f,0xd4,0x4f,0xa1,0xee,0x87,0x9e, + 0xa6,0x7,0x8f,0xcf,0xa3,0xbe,0xa7,0x16,0xd2,0xc0,0x33,0x4b,0x68,0xe0,0xc9,0x45, + 0xd4,0xb3,0xe1,0x59,0xba,0xbb,0x68,0x1c,0x3d,0xb8,0x78,0x34,0x3d,0xb7,0x76,0x21, + 0x1d,0x3c,0xf2,0x32,0x97,0x9f,0x85,0x2a,0x76,0x1,0xdc,0xdc,0x9a,0x32,0xf0,0xe5, + 0x75,0x2c,0x33,0x62,0x29,0x4d,0xfc,0x99,0xb4,0x70,0x39,0xa4,0xd9,0xfc,0x2c,0x81, + 0xcc,0x8d,0xe3,0x2c,0x2,0x73,0xf1,0xdb,0xef,0xbc,0xc3,0x75,0xf,0x16,0x2c,0x5c, + 0xc4,0x35,0x0,0xc6,0xaa,0x41,0xf8,0xa8,0xd1,0x63,0x38,0x6a,0x1a,0x6d,0xf4,0x98, + 0x27,0x78,0xce,0x6e,0x94,0x88,0x85,0x3b,0x8,0x3e,0xdd,0x77,0xdf,0x7f,0xdf,0xcc, + 0x45,0xac,0x23,0xaf,0xf1,0x79,0xc7,0x4f,0x9e,0xa4,0xb5,0xb9,0xf9,0xb4,0x69,0xfb, + 0x6e,0x7,0xbc,0xc2,0xd4,0x2f,0xa2,0xd2,0x4b,0x4d,0xa0,0x53,0xb0,0x1d,0xca,0x12, + 0xfe,0xd8,0xd5,0x98,0xb4,0xe2,0xf8,0x71,0x6a,0x85,0x1f,0x17,0x3,0x6,0xa8,0x77, + 0x98,0x8e,0xd5,0x3d,0xbf,0xaa,0xee,0xf5,0x87,0xaa,0xbf,0xae,0x28,0xd9,0x4b,0x1b, + 0x9e,0x9c,0x4e,0xb5,0xfd,0x1f,0xa1,0xf7,0x7a,0xdd,0x4d,0x3f,0xee,0x7b,0x2f,0x7d, + 0xfd,0xd8,0xc3,0xf4,0xf7,0x27,0xfa,0xd3,0xff,0x30,0x75,0x4,0xfd,0xc7,0x67,0x26, + 0xd0,0xbf,0xce,0x9d,0x46,0xff,0x3c,0x67,0xa,0xfd,0x62,0xea,0x48,0xfa,0x78,0x78, + 0x5f,0x6a,0x7c,0xac,0x2f,0xed,0x7c,0xfe,0x39,0x3a,0x7c,0xe8,0x20,0x5b,0x69,0xaf, + 0x63,0x4a,0x54,0xa8,0x4c,0x80,0x5d,0xdd,0xbb,0x9f,0x29,0xa5,0xf9,0x91,0x1a,0xf4, + 0xaf,0x5a,0xb5,0x86,0x76,0xec,0x2e,0xe1,0x34,0xa7,0x32,0xd,0x5f,0xe3,0xbb,0xd6, + 0xd7,0x6b,0x7f,0x17,0x17,0xc0,0xfa,0x59,0xd3,0xc1,0x57,0xa5,0x26,0x3a,0x3f,0xa, + 0xec,0x5b,0xad,0x14,0x3e,0xe6,0xfc,0x8d,0xe5,0xdc,0x5b,0x79,0xf5,0xc1,0xec,0x48, + 0x78,0x8d,0xc2,0x26,0x7,0xf6,0xef,0x9f,0x17,0x3,0xf0,0x86,0xd,0x5,0x7b,0xb7, + 0x6e,0xdb,0xc2,0xc9,0xc5,0x88,0x20,0xbe,0x92,0x45,0x81,0x5e,0x71,0x4d,0xc6,0x16, + 0x80,0xa3,0x6d,0x97,0x9d,0xa5,0xb,0x6a,0xdf,0xbe,0x6c,0xbe,0x64,0xef,0x3f,0x73, + 0x98,0x47,0x9,0xe5,0xbb,0xff,0xe0,0x1,0xde,0x17,0x4d,0xb7,0x97,0xf1,0xe7,0x58, + 0x86,0x3e,0x5f,0xd,0x5e,0xd8,0xe6,0x1,0x70,0xf8,0x4,0x82,0xe5,0x47,0xf4,0x91, + 0x82,0x5,0x1e,0x12,0x2c,0x1,0xe,0xde,0xae,0x1a,0x4c,0x33,0x1f,0x7d,0x12,0x6e, + 0xb,0xf7,0xf1,0x71,0xe1,0xfe,0x8f,0xc2,0x63,0xf1,0xcf,0xbc,0xa1,0xb0,0x90,0xee, + 0xb8,0xf3,0x4e,0xba,0xed,0xf6,0xdb,0xa9,0x57,0x9f,0x3e,0xa,0xc0,0x93,0x4d,0x25, + 0x2c,0xa3,0x70,0x5,0x4c,0xa5,0xba,0xd5,0x50,0x96,0xe0,0xf5,0xcd,0x23,0xcc,0xd3, + 0x11,0x3a,0x79,0xc0,0xf,0x3c,0xf8,0x20,0x7,0x3e,0x61,0x30,0x2,0x13,0xe,0xae, + 0x11,0xcb,0x8f,0xc4,0x35,0x9b,0x6d,0xea,0x5a,0xf5,0x3a,0x7c,0x40,0x1f,0x89,0xef, + 0x22,0xef,0x43,0x70,0xf,0x3e,0x9,0xe6,0xfb,0xd,0x7,0x24,0x49,0x93,0x2c,0xe8, + 0xe2,0xa,0xda,0x17,0x7e,0xf0,0xd0,0x21,0x9a,0x3a,0x6d,0x1a,0xff,0x46,0x31,0xf3, + 0x73,0x52,0xc,0x81,0x17,0xcc,0x2d,0x1e,0x6b,0x8a,0xa3,0x72,0x53,0xcd,0x89,0x31, + 0xa,0x49,0xe7,0x4b,0x82,0x79,0x56,0x50,0xb9,0xdb,0x65,0xb4,0x7f,0x27,0xc7,0x7b, + 0xbf,0x7f,0x3a,0x95,0x1d,0xc8,0x1e,0xe0,0x5f,0x71,0x32,0xa,0x2c,0xd3,0x7c,0x82, + 0x3a,0xce,0x96,0xbf,0xef,0xba,0x5,0x5c,0x73,0xba,0xbe,0xe,0x5f,0x40,0xe5,0x95, + 0x6c,0xf7,0xda,0xbd,0x16,0x1,0x6c,0xfc,0xff,0x95,0x86,0x1,0x58,0xda,0x9f,0xa8, + 0x21,0xbc,0x57,0x2a,0x60,0xed,0xff,0xd5,0xfe,0xe0,0x70,0xbb,0xb5,0x6e,0xa9,0xe1, + 0x6a,0x3,0x60,0xf8,0x7c,0x73,0xb,0x37,0xd1,0xd6,0x1d,0x3b,0xe8,0x73,0xa5,0x56, + 0x0,0x5b,0xd,0x42,0xa4,0x1b,0xa1,0x23,0xaf,0xa9,0xab,0xa5,0x91,0xb,0xa7,0xd1, + 0x2d,0x2b,0x86,0x2a,0xe8,0x8e,0xa1,0x9b,0x9b,0xa6,0xd0,0xed,0x7,0x66,0xd2,0x3d, + 0x7,0x67,0xd1,0x83,0x2f,0xcf,0xa1,0xde,0x47,0x5f,0x50,0xd0,0x7d,0x89,0x46,0x9c, + 0x59,0x41,0x13,0x5f,0xcf,0xa5,0x39,0xef,0xec,0xa0,0xd5,0x9f,0xd7,0xd2,0x96,0x96, + 0xa3,0xb4,0xee,0x7,0x8d,0x34,0xe6,0x68,0xe,0xf5,0x58,0x3b,0x96,0x66,0xad,0x9d, + 0xcf,0x81,0x39,0x38,0x2f,0x4c,0xd3,0xc,0x5f,0xb,0xc4,0x69,0x3,0x62,0xd9,0x34, + 0x84,0x9b,0xa5,0x1a,0x4e,0xeb,0xff,0x15,0x1d,0x9f,0x90,0x8a,0x5e,0xeb,0xfd,0x7a, + 0x26,0x29,0xf5,0x7f,0x86,0xd7,0xf8,0x1f,0x46,0xf1,0x8e,0x63,0x27,0x4e,0xd0,0xc1, + 0x97,0x5f,0x56,0x7d,0xe2,0x41,0x5e,0xc7,0x36,0xf4,0x7,0x38,0x86,0x85,0x42,0x7b, + 0xbb,0x39,0x3f,0xde,0x8f,0xff,0xeb,0x9a,0xda,0x5a,0x6,0xca,0x8e,0xbd,0xe5,0x2, + 0xbe,0xf2,0xbe,0xda,0x50,0x92,0x26,0x69,0xae,0xc7,0xad,0x5e,0xaf,0x2f,0x28,0xa4, + 0x3c,0xa5,0xa,0xdf,0x7a,0xfb,0x2d,0xea,0x80,0x78,0x9,0x55,0x2f,0x96,0x57,0xc3, + 0xa0,0xae,0x86,0xc6,0x6,0xda,0x38,0x7d,0x32,0xbd,0xd2,0xeb,0x5e,0xfa,0x71,0xef, + 0xee,0xf4,0xb7,0x21,0xf,0xd0,0xdf,0x47,0xf6,0xa1,0xbf,0x8d,0x1f,0x4c,0x7f,0x9d, + 0x32,0x82,0xfe,0xf6,0xe4,0x13,0xf4,0xcf,0xcf,0x4d,0xa1,0xbf,0xcf,0x7f,0x8a,0xfe, + 0xc3,0x8a,0x17,0xe9,0x3f,0x16,0xae,0xa6,0xff,0x52,0xb1,0x93,0xfe,0x8f,0x83,0x35, + 0xf4,0xbf,0xd7,0x14,0xd3,0x57,0x8b,0x9e,0xa1,0x73,0xc3,0xfa,0xd1,0xde,0x79,0xcf, + 0xd0,0xd9,0xb3,0x67,0xd8,0x3c,0xd,0x5f,0x31,0x0,0xdc,0xaa,0xee,0xd3,0xcf,0x14, + 0xec,0x3e,0xfc,0xf0,0x3,0x5,0xe1,0xd5,0xac,0x84,0x11,0x7d,0xd,0xf8,0x96,0x89, + 0x81,0x82,0x6,0x70,0x69,0x95,0xad,0xe2,0x5d,0xd3,0xba,0x4c,0x73,0x93,0xae,0x90, + 0x60,0xb2,0x86,0x6,0x5a,0x57,0xb0,0x91,0xce,0xbe,0x7a,0x36,0x96,0xe5,0xe1,0xd6, + 0x90,0x47,0x20,0x16,0xfa,0x43,0xc0,0x7a,0xff,0xfe,0x7d,0x7b,0xf,0x1d,0x3a,0x14, + 0x1,0xf8,0xe5,0x97,0x5f,0xee,0xb2,0x6a,0xe5,0x8a,0x4b,0x7b,0xf6,0x16,0xd3,0x85, + 0x8b,0x17,0x19,0x48,0x11,0x44,0xaf,0x78,0xd5,0x29,0x96,0x3e,0xa5,0x6a,0x8e,0x4f, + 0x45,0xc7,0xde,0xa8,0x2f,0x39,0x76,0xae,0xe6,0x2b,0x59,0x53,0xa0,0xe4,0x17,0x3d, + 0x74,0xf8,0x65,0x1e,0x3c,0x48,0xf0,0xba,0x45,0x3,0x24,0x24,0xf0,0xc0,0x2,0xa6, + 0x98,0xaa,0xf0,0x89,0x71,0x63,0x69,0xe0,0xa0,0x41,0x6c,0x2e,0x1e,0x30,0x70,0x20, + 0x2f,0xe5,0x6b,0xac,0xa3,0x61,0x7d,0xc0,0xa0,0xa0,0xe9,0xd7,0x7a,0xdf,0xc0,0xc1, + 0xe1,0xfe,0xb0,0x21,0xf8,0xea,0xee,0x7b,0xef,0x61,0xf5,0x7b,0xfb,0x1d,0x77,0x50, + 0x9f,0x7e,0xfd,0x39,0xd,0x29,0x8,0xc2,0x5a,0xe6,0x85,0x2d,0xcf,0x70,0x14,0xfa, + 0x86,0x23,0x40,0xb,0x55,0x2c,0xb6,0x69,0x55,0xcc,0x95,0xb4,0xd4,0x83,0x36,0xed, + 0xa9,0xa7,0x69,0xd4,0xd8,0xb1,0x34,0x51,0x8d,0x80,0xef,0xe8,0xde,0x9d,0xee,0xed, + 0x71,0x9f,0xb9,0x4e,0x5c,0x9b,0xb9,0xfe,0xf0,0x9a,0x7,0x88,0xd7,0x7c,0x1c,0xae, + 0x7f,0x50,0xf4,0x5a,0x2e,0xfb,0xf,0x18,0x60,0x8e,0x1,0x48,0xe1,0x33,0x82,0x7f, + 0xbb,0x55,0x47,0xff,0x89,0x88,0x68,0xb7,0xa8,0x3f,0x87,0xdf,0xab,0x87,0x6e,0xfa, + 0x8c,0xe9,0xdc,0xc9,0xc9,0x32,0xa6,0x16,0x54,0x5d,0x9f,0xbf,0x9b,0x2,0x97,0xa, + 0xad,0x2b,0x69,0x67,0x0,0x98,0x6a,0x76,0xd6,0xfd,0x81,0x82,0xbe,0x94,0x3a,0x9f, + 0xcb,0x24,0x6,0xe0,0x4c,0x16,0x1f,0xb0,0x0,0x8f,0x2f,0x9d,0xea,0x4a,0x36,0x18, + 0x65,0x19,0x64,0xf8,0x52,0xff,0xae,0xa4,0xb2,0xfb,0xb8,0xa3,0x20,0x36,0x7f,0x3a, + 0x57,0xa7,0xfe,0x6c,0x8f,0x7f,0xdb,0x36,0xf9,0x37,0x27,0xfa,0xc0,0xbd,0xdf,0xc5, + 0x93,0x41,0xe1,0xb,0xe6,0xc4,0x33,0x52,0xb8,0x79,0x33,0x6d,0xdd,0xbd,0xd7,0x32, + 0x25,0x1b,0x73,0x73,0x18,0x11,0x1d,0xc1,0x36,0xda,0x27,0x95,0xb2,0xd9,0x5e,0x69, + 0xab,0x64,0x98,0x9d,0xb,0xb7,0xef,0x62,0xb3,0xf3,0x47,0x9f,0x7e,0xcc,0xf0,0xd5, + 0xa,0x14,0xeb,0xef,0x7f,0xf0,0x1,0x2d,0xc9,0x5b,0x49,0x77,0x2c,0x7a,0x8c,0xba, + 0x16,0x8f,0xa2,0x6e,0xd,0x93,0xe8,0x9b,0xd,0x53,0xe9,0xb6,0x86,0xe9,0x74,0x47, + 0xd3,0x4c,0xba,0x6b,0xdf,0x53,0x74,0xdf,0x81,0xd9,0xf4,0xc0,0xa1,0xe7,0xa8,0xe7, + 0x91,0xe7,0xa9,0xef,0xb1,0x5,0x34,0xe8,0xe4,0x62,0x1a,0x7e,0x3a,0x87,0x46,0xbf, + 0xba,0x8a,0xa6,0x5e,0x28,0xa0,0x65,0x1f,0x55,0x50,0x55,0xfb,0x39,0x2a,0x69,0x3f, + 0x43,0x23,0xf,0x2f,0xa1,0x5e,0xcb,0xc6,0xd1,0x9e,0xaa,0x52,0xee,0xb,0x1,0xe1, + 0xe6,0x10,0xc2,0xf8,0xdc,0xe6,0xd6,0x74,0xd8,0x52,0xc,0x5b,0xab,0xe1,0x7e,0xb6, + 0x46,0xd1,0xe8,0x76,0x50,0x5e,0xca,0x4,0x63,0x99,0xc0,0xad,0x54,0xd8,0xcc,0x71, + 0x69,0x53,0x49,0x2b,0x88,0x43,0x69,0x37,0x2a,0xd7,0x44,0x56,0x6b,0x45,0x1d,0x2a, + 0x69,0xfc,0xf,0xc3,0x4d,0xb4,0x63,0xd7,0x6e,0x5,0x93,0x42,0xce,0x91,0x65,0xf8, + 0x26,0x98,0xf3,0x2d,0xff,0x6f,0xa8,0x26,0x39,0x70,0xa9,0xac,0x8a,0x56,0xad,0xcd, + 0xa5,0xdd,0xc5,0xc5,0x3c,0xfb,0x4f,0x3b,0x44,0x10,0x82,0x31,0x19,0xbe,0x29,0x86, + 0xef,0xfb,0x1f,0x7e,0x48,0xdb,0xd6,0xad,0xa1,0x6,0xa5,0x78,0xaf,0x2b,0xf0,0xfe, + 0x69,0xd0,0xfd,0xf4,0x67,0xa5,0x78,0xff,0x38,0xa2,0x17,0xfd,0x71,0x54,0x5f,0xfa, + 0xe3,0x98,0xfe,0xf4,0x67,0x5,0xe1,0x3f,0x4f,0x1a,0x46,0x7f,0x9d,0x31,0x9a,0xfe, + 0x36,0x6b,0x3c,0xab,0xdf,0xbf,0xbf,0x30,0x93,0xfe,0x45,0x41,0xf7,0xdf,0x3,0xc6, + 0xdb,0xb,0xe8,0x7f,0x3b,0x7e,0x80,0xfe,0xeb,0x91,0x46,0xfa,0xed,0xb,0x4f,0xd2, + 0xe1,0xc7,0x7,0x52,0xdd,0xee,0x9d,0xec,0x27,0x46,0xe0,0x16,0x20,0xc,0x35,0xfc, + 0x53,0x5,0xe1,0x37,0xde,0xb8,0x44,0x8b,0x55,0x5f,0xb9,0xa7,0xb4,0x32,0x50,0xc1, + 0x0,0x2e,0xf,0xf2,0xaa,0x23,0xf8,0xea,0x20,0x3f,0x39,0xd0,0x88,0x59,0x53,0x6a, + 0xe3,0x83,0x91,0x8a,0x20,0xd8,0xf,0x95,0xdb,0x9a,0xf6,0xef,0x63,0x57,0xa4,0x2f, + 0x85,0x50,0xbf,0xc6,0xe4,0x1a,0xb8,0xd7,0x48,0xf1,0x3a,0x74,0xe8,0xc0,0xab,0x87, + 0xe,0xa,0x0,0x1f,0x3c,0x78,0xb0,0x4b,0xce,0xb2,0xa5,0xe9,0xca,0xaa,0xa,0xce, + 0xd9,0x44,0x84,0x98,0x84,0xa9,0x5,0xdd,0x96,0x38,0x78,0x79,0x5b,0x92,0xd2,0xcd, + 0x6,0xeb,0x2c,0xdb,0x93,0x95,0xb3,0x5b,0x43,0x3a,0xcd,0xd7,0x5b,0xd7,0x50,0xcf, + 0x8a,0x4d,0x47,0x3f,0x7b,0x2b,0x1b,0xe9,0x34,0xb,0xf5,0x90,0xc3,0x3c,0xfc,0xdc, + 0xdc,0x39,0xac,0x50,0xb9,0x75,0xbf,0x93,0xc1,0xc5,0x4b,0xfd,0x5a,0x2d,0xef,0x54, + 0xdb,0x74,0xb,0x8e,0x9,0x9a,0xdc,0xee,0x6b,0x30,0x39,0xf7,0x51,0x10,0xbe,0xf3, + 0xae,0xee,0xf4,0xc0,0xc3,0xf,0xd3,0x88,0xd1,0x63,0x18,0x92,0x2f,0x84,0xf3,0xf9, + 0x4a,0x93,0x73,0x64,0x6a,0xce,0x31,0xd3,0xc,0x66,0x3,0xaf,0xde,0x8f,0x25,0x7c, + 0xc0,0x79,0x85,0x45,0xf4,0xfc,0xa2,0x97,0x68,0xf2,0x8c,0x99,0x34,0xe3,0xe9,0x59, + 0xfc,0xd9,0x7c,0x1d,0x77,0xa1,0xdd,0x65,0xae,0x3d,0x58,0x76,0x8f,0xf6,0xc9,0xd7, + 0xe2,0x3b,0x62,0x9f,0xfc,0xae,0xe6,0x9e,0x84,0xf7,0xe5,0xae,0xbb,0xef,0xa6,0xdc, + 0xfc,0x3c,0xfe,0x3d,0xac,0x72,0x7a,0x9e,0x9a,0xca,0xd8,0xf,0x5f,0xf8,0xb2,0x9c, + 0x65,0xb4,0x3e,0x77,0x3d,0x7d,0xef,0x8b,0xef,0x5b,0x11,0xc7,0x57,0x92,0xac,0x2c, + 0x2e,0x94,0x3b,0x89,0xbe,0x4f,0x52,0xd3,0xe6,0x3c,0xa9,0xe6,0x98,0x6a,0x74,0xa1, + 0xe2,0x8d,0xbc,0x4f,0x52,0xa7,0x3e,0x35,0x99,0x6e,0xb9,0x31,0xb8,0x49,0x40,0x25, + 0xc1,0xd9,0xa7,0xf4,0x13,0xce,0xe3,0x7e,0xf,0x9,0x5b,0x37,0x2d,0x50,0x43,0x3a, + 0xae,0xc0,0x3b,0xf3,0x17,0xb7,0x64,0xd,0x9a,0xb3,0xe2,0x3d,0x9c,0xc1,0x54,0x36, + 0xe8,0x43,0x79,0x21,0x0,0xb,0x13,0xdd,0x4b,0xa8,0x46,0x11,0xcf,0x2,0xca,0x7a, + 0x5f,0xd8,0x8a,0xcb,0x6d,0xe5,0x5b,0x1c,0x33,0x5d,0xd7,0xd2,0x8e,0x92,0x72,0x5a, + 0xb5,0x6e,0x3d,0x5d,0x7a,0xeb,0x8d,0x0,0xbe,0x21,0xec,0xb0,0xfe,0xc6,0x9b,0x6f, + 0xd2,0x8c,0x9c,0xb9,0x74,0xd3,0x5a,0x5,0xdf,0xea,0xf1,0x74,0x73,0xfd,0x64,0xba, + 0xa5,0x76,0x32,0x7d,0xb3,0x6e,0xa,0x7d,0xab,0x7e,0x2a,0xdd,0xde,0x38,0x83,0xee, + 0x6c,0x9c,0x49,0x77,0xef,0x7b,0x9a,0x7a,0x1c,0x7c,0x86,0x1e,0x54,0x10,0xee,0x25, + 0x20,0x3c,0x4c,0x41,0x78,0xd4,0xd9,0x95,0x34,0xf6,0xdc,0x5a,0x9a,0x70,0x3e,0x97, + 0x16,0x7f,0xa7,0x94,0xca,0xdb,0x5e,0xa5,0x17,0xdf,0x2f,0xa6,0xfb,0xf2,0xc6,0xd1, + 0xaa,0xad,0x79,0xec,0x4f,0xd6,0x4a,0xd8,0x55,0xc3,0xda,0x34,0x1d,0x1,0x38,0x65, + 0x99,0xa3,0x23,0xc8,0xb6,0x44,0xb0,0x35,0xeb,0x2d,0x6,0xa4,0xf2,0x38,0xd,0x58, + 0x9,0x6c,0x9,0x6b,0xe9,0x53,0xc6,0xff,0x26,0x26,0x4f,0xc9,0xdf,0x58,0xa8,0x40, + 0xb2,0x3d,0xf2,0x75,0x5a,0x83,0x9d,0x1a,0xdb,0x25,0x20,0xcc,0xfe,0xc,0x21,0x5, + 0xb1,0xad,0x3b,0x8b,0x29,0x67,0xe5,0x6a,0x4e,0x1,0x6d,0x51,0xcf,0x0,0x14,0x69, + 0x1a,0xff,0xfb,0xea,0x99,0x69,0x65,0xb3,0x73,0x2b,0xbd,0xf5,0xee,0x3b,0x54,0xf4, + 0xfc,0x1c,0x7a,0xbd,0xd7,0x3d,0xf4,0x55,0xdf,0xbb,0xe9,0x4f,0x83,0x1f,0xa0,0x3f, + 0xc,0x7d,0x88,0xfe,0xa0,0x0,0xfc,0xf5,0xb0,0x9e,0xf4,0xc7,0xc7,0x7b,0x87,0x10, + 0x1e,0x40,0x7f,0x9e,0x30,0x84,0xfe,0x32,0x79,0x78,0x0,0xe1,0xa7,0xc7,0xd1,0xdf, + 0x9e,0x9d,0x44,0x7f,0x7f,0x7e,0x6,0xfd,0x7d,0xc1,0xd3,0xf4,0x2f,0x2f,0x29,0x10, + 0x2f,0x9d,0x43,0xff,0x5a,0xb4,0x86,0xfe,0xd7,0x3,0x35,0xf4,0x9f,0x37,0xae,0xa2, + 0x77,0x86,0xf5,0xa1,0xaa,0xb5,0xab,0x58,0x38,0x5e,0x47,0x41,0xd,0x98,0xbb,0xd5, + 0x67,0xff,0xe8,0x87,0xd7,0xa1,0x36,0x69,0xe5,0xaa,0xb5,0x5c,0xa8,0x83,0x3,0xb1, + 0x42,0xf0,0x96,0x56,0x46,0x1,0x63,0x5a,0xd,0xc7,0xdc,0x17,0x15,0x71,0xe5,0x2f, + 0x7,0x25,0x18,0xa8,0x60,0xe0,0x58,0xbc,0x77,0x2f,0xdf,0x4b,0xff,0xc4,0x45,0x21, + 0x80,0x11,0xf9,0xad,0x1a,0xac,0x10,0x87,0x8f,0xbc,0xdc,0x7c,0xe0,0xc0,0x81,0x8, + 0xc0,0x4d,0x4d,0x4d,0x37,0x2f,0x5d,0xb2,0xf8,0xab,0x7a,0x5,0x31,0x38,0xe5,0xf1, + 0x4f,0x11,0x87,0xac,0xd,0xcc,0x8,0x92,0x57,0xcc,0xbe,0x6c,0xb0,0x96,0xe7,0xd3, + 0xe7,0xb9,0xec,0xf1,0xf9,0x5e,0x8e,0x9d,0xfb,0x8a,0xd7,0x4,0xae,0xbf,0x24,0x46, + 0x7a,0x18,0xc1,0x35,0x34,0x36,0xf2,0x9c,0xbf,0xb2,0x10,0x44,0x52,0xb1,0x0,0x1c, + 0x83,0xa0,0xa0,0x9e,0xbd,0x7b,0xd3,0x63,0x23,0x1e,0xf,0xe6,0xd1,0x9d,0x3c,0x99, + 0x1,0xe6,0xb6,0x49,0xd3,0x67,0x98,0xa6,0x5f,0x4f,0xd6,0xaf,0xc3,0xe5,0xc4,0x69, + 0xd3,0xb9,0xf1,0x71,0xe1,0x3a,0xa6,0x19,0x84,0x59,0x18,0xf5,0x9e,0xb1,0x1d,0xaf, + 0x51,0x38,0xc3,0x67,0x5a,0x8e,0x40,0x9c,0x63,0x2d,0xa3,0x75,0x4f,0x70,0x96,0x50, + 0xcd,0xb9,0x1b,0x8b,0x68,0xf3,0xce,0x5d,0x7c,0x3e,0x94,0xb8,0x9c,0xa6,0x20,0x3c, + 0x71,0xea,0x34,0x73,0x5d,0xee,0xf5,0xc9,0xef,0x24,0xbf,0x9b,0x69,0xe2,0xfb,0x99, + 0xef,0xac,0x96,0xa3,0xc6,0x8d,0xa3,0x87,0x7b,0xf6,0x64,0x8,0xf7,0xb8,0xff,0x7e, + 0x3a,0x7a,0xfc,0x58,0xa4,0x82,0xdd,0x8a,0x4f,0xa6,0x58,0x7f,0xf0,0x8f,0xbe,0x47, + 0x3d,0xa4,0xf3,0x9e,0x7f,0x9e,0x7f,0x2b,0x9,0xe0,0xce,0xac,0x23,0x97,0x13,0x62, + 0x1,0x2e,0xff,0x3,0x96,0x94,0x1b,0x1,0x5a,0x92,0xc9,0xda,0xa,0xd2,0xf2,0x6d, + 0xf7,0x99,0xa3,0x6f,0xc0,0x9f,0x6b,0x29,0x5b,0x27,0xda,0xff,0x46,0xd4,0xbb,0xf6, + 0x7,0x5f,0x49,0x18,0x78,0xb4,0x8,0x30,0xeb,0x65,0x52,0x74,0xb4,0x6b,0xc6,0xf6, + 0x29,0xe8,0x2b,0x49,0xfe,0x79,0x61,0x85,0x90,0x7e,0x7a,0x5f,0x4c,0x48,0xb3,0xc7, + 0xe4,0xf,0xd7,0x6,0x3a,0x6f,0x86,0x67,0x79,0x14,0x64,0xc5,0x80,0x45,0x6e,0x66, + 0x39,0x40,0x5b,0xc5,0x2d,0x32,0x4b,0x47,0x2a,0x57,0xef,0x2b,0x2e,0xaf,0x16,0xca, + 0x37,0x50,0xc2,0x58,0xae,0xc9,0x2b,0xa0,0xfd,0x87,0xe,0xf2,0x73,0x28,0xe1,0x8b, + 0xc0,0xa9,0x49,0xcb,0x66,0x53,0x17,0xf8,0x79,0x6b,0x26,0xd0,0xcd,0x35,0x93,0xb8, + 0x1,0xc0,0xdf,0x8,0x21,0x7c,0x6b,0xfd,0x34,0xb,0xc2,0x50,0xc2,0x80,0xf0,0x23, + 0x87,0xe7,0x51,0x9f,0x63,0xf3,0x69,0xc0,0x89,0x45,0x34,0xe4,0x95,0x25,0xac,0x86, + 0x1,0xe2,0xd1,0xaf,0xae,0xa6,0x89,0xa,0xc4,0x6b,0x3e,0xaf,0xa3,0x17,0x3e,0xda, + 0x43,0xdd,0x37,0x8d,0xa3,0xe5,0x5b,0xd6,0xb3,0x40,0x48,0x5f,0x6d,0xa5,0x2b,0x80, + 0x6d,0x8,0x5e,0x4,0x7e,0x79,0x55,0x70,0x26,0x72,0x21,0x4,0x16,0x1f,0xc7,0x62, + 0x22,0xa0,0x7a,0xa5,0xa5,0x85,0x1b,0x5e,0x47,0xcf,0x81,0x74,0x21,0x44,0x26,0xec, + 0x2b,0xe6,0xf7,0xf,0x7c,0x92,0xf8,0x1d,0xe,0xbe,0x7c,0x88,0xd6,0xaa,0xfb,0xb3, + 0x59,0x1,0xb4,0x84,0xeb,0x23,0x57,0x47,0xf7,0x59,0x3,0x47,0x28,0x44,0x6d,0x7a, + 0xc6,0x7e,0x6d,0xca,0xc5,0xd4,0x7c,0xf0,0xf7,0x22,0xa2,0x1c,0xfe,0xde,0xc,0xfe, + 0xe7,0xd5,0xf5,0xa7,0x91,0xf7,0xaf,0x96,0x1d,0x4a,0x95,0x32,0x7c,0x9f,0x9d,0x45, + 0xef,0xf7,0xbc,0x8b,0xbe,0xee,0x7f,0x2f,0xfd,0x41,0x29,0xdf,0xaf,0x6,0x3d,0x40, + 0x5f,0xd,0x7e,0xd0,0x40,0xf8,0xf,0xc,0xe1,0x47,0x19,0xc2,0x7f,0x7a,0x62,0x0, + 0xfd,0x9,0x4a,0x78,0xf2,0x30,0xfa,0xcb,0xb4,0x91,0xf4,0xd7,0x27,0x9f,0xa0,0xbf, + 0xcd,0x9e,0x40,0x7f,0x7b,0x6e,0x32,0xfd,0xf3,0xf3,0xd3,0xd9,0x34,0xfd,0x2f,0x80, + 0xb1,0x52,0xc5,0xff,0x69,0x5b,0x1e,0xfd,0x97,0x82,0x1c,0xfa,0xfe,0xb0,0xde,0x54, + 0xb9,0x2a,0x87,0x7,0x3c,0xda,0x1c,0xd,0xdf,0x30,0x82,0xbf,0x36,0x6d,0xda,0x44, + 0x85,0x4a,0xa9,0x96,0x87,0x91,0xd9,0x25,0xfc,0x9d,0xaa,0xc3,0x56,0x63,0x37,0xe9, + 0xc2,0x70,0x6,0x1b,0x91,0xa5,0x25,0x72,0x7d,0x60,0xe0,0xb8,0x69,0xeb,0xd6,0xd8, + 0x24,0x44,0xee,0xff,0x12,0x5c,0x2d,0x0,0x70,0x98,0x8a,0xf4,0xdb,0x7d,0xfb,0xf6, + 0xdd,0x64,0x0,0x5c,0x53,0x53,0x73,0xdf,0xd2,0xa5,0x8b,0xff,0x67,0xa4,0x20,0xe9, + 0x39,0x80,0x63,0xb0,0x4c,0x30,0x3d,0xbb,0x30,0x45,0x78,0xbe,0x4,0xa8,0x7b,0xe, + 0x79,0x6c,0x4,0xea,0x6c,0x26,0xed,0x66,0x2f,0x84,0xd,0x80,0xd5,0x8f,0x8e,0xc2, + 0x21,0x47,0x8e,0x1d,0xb5,0xe6,0xdc,0x94,0x0,0x76,0xa7,0x4f,0xc4,0x39,0x72,0x56, + 0xae,0x54,0x70,0x9c,0xc2,0x66,0xdb,0xa9,0x4f,0x3e,0xcd,0xa0,0x5b,0x9d,0x97,0x1f, + 0xb4,0xdc,0x70,0xa9,0x1e,0x4e,0x2c,0x91,0xaf,0x6b,0x96,0x6a,0xdf,0x9a,0x70,0xbb, + 0xdc,0xb6,0x72,0x7d,0x2e,0xaf,0xa3,0x21,0xb9,0x1f,0xaf,0xb1,0x1d,0xf3,0xfc,0xc2, + 0x47,0x1b,0xc1,0x75,0x59,0xa4,0x72,0x3d,0x41,0x58,0x30,0x41,0xe3,0xf5,0x7c,0xb3, + 0x1e,0x5,0x5e,0x99,0xe8,0x67,0xf3,0xde,0x65,0xa1,0xa,0x5e,0x41,0x85,0xdb,0xb6, + 0xd3,0xae,0x92,0x32,0xca,0xdf,0xb4,0x39,0xb8,0x8e,0xf5,0x41,0xd3,0xd7,0xc8,0xaf, + 0xc3,0xef,0xb5,0x26,0xbf,0x80,0x9b,0xfd,0x5d,0xed,0xef,0xcc,0xfb,0x73,0xf3,0xcd, + 0x71,0xeb,0xd5,0x28,0x79,0xc5,0xba,0x5c,0x6,0x7c,0xdf,0x1,0x3,0x58,0xd,0xaf, + 0x5e,0xbb,0x26,0x30,0x6f,0x59,0x51,0x9b,0x4e,0x9e,0x67,0xf8,0x9b,0x1c,0x3f,0x79, + 0x82,0xa3,0xa1,0x31,0xe2,0x36,0xb9,0xa2,0x37,0x10,0xa0,0x97,0x55,0x21,0xc7,0xa0, + 0x2c,0x9e,0xa1,0x10,0xd2,0xd1,0xeb,0xec,0xe9,0x73,0x49,0x0,0x8e,0xab,0xe2,0x1b, + 0xf0,0x2b,0x8b,0xe3,0xae,0x78,0x8a,0xd3,0x78,0x41,0x9c,0x90,0x8e,0xe7,0xbb,0xee, + 0x58,0x96,0x80,0xcf,0xa4,0x6e,0x5d,0x4b,0x2a,0x6b,0xd9,0x58,0x3b,0x27,0x39,0xfb, + 0xc0,0xc1,0x56,0xef,0x9d,0xa4,0x20,0xa6,0x92,0xb3,0x26,0x74,0x1a,0x16,0x6,0xfc, + 0xcb,0x14,0x80,0xa1,0x32,0x24,0x68,0xa5,0xda,0xd5,0xdb,0x34,0x68,0xad,0xe3,0xe4, + 0x31,0x15,0xd5,0x96,0xf9,0x19,0xe5,0x25,0xd1,0x39,0x22,0x30,0x4a,0xfb,0x59,0x91, + 0x3a,0xf4,0xd1,0xc7,0x1f,0xd3,0xac,0x95,0x2f,0x52,0x97,0xdc,0xc7,0x18,0xbe,0xdd, + 0xaa,0x27,0x72,0xbb,0x19,0xd,0x10,0x56,0xed,0x9b,0xb5,0x53,0x22,0x8,0x37,0xd8, + 0x10,0xbe,0xff,0xe0,0xb3,0xf4,0xf0,0xcb,0x73,0x95,0x1a,0x7e,0x81,0xd5,0x30,0x40, + 0x3c,0x58,0x29,0xe2,0xc7,0x4e,0x2d,0x63,0x18,0xf,0x3f,0xbd,0x9c,0x66,0xbf,0xbd, + 0x95,0x26,0xbd,0x55,0x40,0x77,0x16,0x8c,0xa1,0x8d,0xbb,0xb7,0xf0,0x67,0x23,0x12, + 0x5a,0x7,0x63,0x5d,0x1,0x68,0x43,0x0,0x33,0x8c,0xb1,0xc,0x23,0xcb,0xcd,0x32, + 0x56,0x47,0x3f,0x0,0x68,0xdc,0x3d,0x23,0x8f,0xf3,0x2c,0xc3,0x1,0x94,0x16,0x2c, + 0x9f,0x7d,0xf7,0xbb,0xec,0x77,0xc7,0x9c,0xbe,0x0,0x48,0x49,0x38,0x39,0x81,0x36, + 0xe3,0x17,0x8b,0x81,0x8e,0xf4,0xaf,0x7,0x3,0xa0,0x6a,0x93,0xa6,0xb3,0x66,0x7d, + 0x3e,0x6d,0x28,0x2c,0xa2,0xf7,0xde,0x7f,0x8f,0x4d,0xce,0x29,0x80,0x97,0x95,0x6f, + 0xd0,0xda,0x10,0x1c,0xfb,0xd9,0xa7,0x54,0x38,0xff,0x79,0x7a,0xeb,0xe1,0xee,0xf4, + 0x55,0x3f,0xa5,0x7e,0x7,0xf6,0xa0,0xdf,0xa3,0x1,0xc2,0x83,0x3,0x8,0x7f,0xc5, + 0x10,0x7e,0x84,0xfe,0x30,0xbc,0x27,0x7d,0x1d,0x42,0x18,0xe6,0xe8,0x3f,0x8d,0x1b, + 0x44,0x7f,0x9a,0x38,0x94,0xfe,0x32,0x65,0x4,0xfd,0x65,0xfa,0x28,0x6,0xf1,0x5f, + 0x9f,0x1e,0x4f,0x7f,0x7b,0x66,0x12,0xc3,0xf8,0xef,0x73,0xa6,0xaa,0x36,0x85,0xfe, + 0x43,0xce,0x3c,0xfa,0x9f,0x16,0xcd,0xa6,0xef,0xe,0x7e,0x84,0xea,0xa,0xb,0x94, + 0xa,0x6f,0xe1,0x9c,0x62,0xa8,0x60,0x14,0xee,0x78,0x4f,0xd,0x0,0x96,0xa8,0xfe, + 0x77,0xaf,0x7a,0x46,0x4c,0x0,0x16,0xd2,0x8c,0xa4,0xfa,0xd,0xcd,0xd2,0x32,0xc6, + 0xc0,0x2c,0x2b,0xe3,0x71,0x7,0x7a,0xdb,0xee,0xd2,0x4a,0xca,0x2d,0x28,0x30,0x75, + 0x33,0x92,0x32,0x36,0x70,0xdf,0x91,0xf,0x8c,0xc1,0xd8,0xa9,0xd3,0xaf,0xfc,0x8f, + 0x4a,0xf4,0xde,0x65,0x0,0x5c,0x5a,0x5a,0x3a,0x64,0xf9,0xf2,0x65,0xff,0x1f,0xe6, + 0xce,0x45,0x4d,0x56,0xd,0x51,0x6f,0xf3,0x1,0x35,0x76,0x4c,0x70,0x1c,0x40,0x8e, + 0xd6,0x19,0xc0,0x63,0x2a,0xbb,0xe5,0x4a,0xe2,0x0,0xc0,0x4d,0x77,0x4a,0x87,0x9d, + 0x3b,0xa7,0x1f,0x39,0x9,0xd1,0xde,0x5c,0x53,0xb5,0xc4,0xf7,0x5b,0xbe,0x7a,0x15, + 0xcf,0x2a,0x84,0x19,0x84,0x66,0xcf,0x9d,0xc7,0x7e,0xd4,0x95,0xa,0x30,0xab,0x14, + 0x38,0x57,0xae,0x5b,0xcf,0x6d,0x35,0x60,0x8a,0x75,0x86,0x69,0x0,0xd5,0x55,0x21, + 0x68,0xd7,0x8,0xf8,0x6,0x20,0xd3,0x70,0xb6,0xd7,0xf1,0x1e,0x14,0xdb,0xd0,0xaa, + 0x35,0xf2,0xf1,0x46,0x6d,0x7e,0x8,0x64,0x14,0xd9,0x80,0x8f,0x18,0x95,0xae,0x50, + 0xe7,0x19,0x6d,0xce,0x8b,0xf3,0xb9,0x7a,0xd6,0x8b,0xea,0x7d,0xfa,0xbd,0x6e,0x14, + 0xf5,0xfc,0x30,0x40,0xb,0x13,0x3b,0xe8,0xcf,0xd5,0x83,0x84,0x68,0x19,0x5c,0x17, + 0x40,0xbc,0x36,0x84,0xea,0x4a,0xfe,0xae,0xb9,0xbc,0xd,0xc7,0xad,0xa,0x5f,0xeb, + 0xef,0xcb,0xaf,0xc3,0xef,0x9c,0x57,0xb4,0x89,0xb6,0xef,0xd9,0xcb,0x33,0x39,0x41, + 0x5d,0xdf,0x75,0xcf,0x3d,0xf4,0xfc,0xb,0x2f,0xc4,0x66,0xe1,0x69,0x71,0x60,0xac, + 0x83,0xdd,0xbe,0xad,0x6,0x76,0x0,0x30,0x46,0xdd,0x2e,0x10,0xdc,0xe7,0xa1,0xd9, + 0x13,0xc8,0xe7,0x6,0xef,0xdd,0x48,0xfc,0x80,0xf7,0xf8,0x54,0x73,0x3c,0xc0,0x30, + 0xd5,0x7c,0x43,0xca,0x55,0x9b,0x6f,0xaf,0x74,0x2,0xe0,0x44,0x9f,0x69,0xec,0x98, + 0x96,0xd8,0x77,0xcc,0x6a,0x11,0xf0,0x5d,0x7b,0xc2,0xf5,0xbb,0x79,0xd3,0x89,0x3, + 0x85,0x4e,0xd2,0x9a,0x3a,0x1b,0xa8,0x24,0xe,0x96,0x52,0xd1,0xf7,0xf2,0x6,0xd2, + 0xa9,0xfd,0x7a,0xe2,0x94,0xe5,0xab,0xd7,0x85,0xe9,0x1e,0xd5,0xb6,0xe2,0xb5,0x14, + 0x6e,0xb4,0x4d,0x9a,0xa0,0x23,0x28,0x57,0x1b,0x13,0x74,0x71,0xb8,0x7f,0x8d,0xfa, + 0x5f,0xc0,0x14,0x87,0xf0,0xcf,0x5d,0x9,0xfd,0xab,0xf8,0xfc,0xb5,0x9b,0xf2,0xe9, + 0xa6,0x9c,0xc1,0xd4,0xa5,0x6a,0x3c,0xdd,0x54,0xa5,0x0,0x5c,0x35,0x21,0x4,0xf0, + 0x24,0x86,0xf0,0x2d,0x1a,0xc2,0x75,0x12,0xc2,0xd3,0xe9,0x8e,0xc6,0xc0,0x27,0x7c, + 0xcf,0xfe,0x59,0x46,0xd,0x7,0x20,0x7e,0x9e,0xfa,0x1c,0x7d,0x91,0x61,0xdc,0xff, + 0xf8,0x42,0x6,0x32,0xda,0xd8,0xf3,0xeb,0xa8,0xcf,0xa9,0x85,0x74,0xdf,0xea,0x31, + 0xb4,0xff,0xf0,0x41,0x4e,0x7b,0x6a,0x96,0xea,0xb7,0xd5,0x81,0x6f,0x4c,0x1,0x3b, + 0x83,0xa9,0x16,0x9,0x56,0xd9,0x6c,0xe8,0x5e,0x71,0x9e,0x31,0x56,0xbd,0x61,0xb6, + 0x2,0x6,0x3c,0x5b,0xd4,0x60,0x1d,0xf9,0xbd,0xc5,0x8e,0x49,0x5f,0x6,0xbc,0x49, + 0x95,0x27,0xef,0x3b,0xfc,0x9e,0xdb,0x76,0x97,0xd0,0xf2,0x55,0x6b,0x38,0x9a,0x1a, + 0x79,0xbb,0x6d,0xe8,0x77,0x31,0xa0,0x12,0xd,0x4a,0x18,0x20,0xdc,0x51,0xb8,0x91, + 0x8e,0x3c,0x7c,0x37,0xfd,0xbe,0xef,0x3d,0xf4,0xbb,0x1,0xf7,0xd1,0xef,0x14,0x7c, + 0x75,0x3,0x84,0x7f,0xf,0x25,0x3c,0x44,0x41,0x78,0xc8,0x43,0xf4,0x15,0x20,0xac, + 0x94,0xf0,0x1f,0x46,0xf4,0xa6,0xaf,0x47,0xf6,0xa1,0xaf,0x47,0xf7,0xa3,0x3f,0x8d, + 0x1d,0x18,0xa8,0xe1,0x89,0x8f,0x29,0x45,0x3c,0x3c,0x50,0xc4,0x33,0x46,0xd3,0x5f, + 0x67,0x8e,0xa1,0xbf,0x3d,0x35,0x36,0x68,0xa,0xcc,0xff,0x32,0x6f,0x3a,0xfd,0xeb, + 0x8c,0x51,0x74,0x69,0x48,0x6f,0x7a,0xb9,0xa9,0x91,0x95,0x37,0x54,0x70,0x46,0x3d, + 0x67,0xff,0xa4,0xc0,0x87,0x3a,0xd3,0x98,0xd8,0x41,0xfb,0x82,0x1,0xe0,0xa0,0x49, + 0x35,0x1c,0x36,0x69,0x49,0x71,0x83,0xfd,0xca,0x65,0x5c,0x42,0xb0,0x8e,0x5c,0x67, + 0x58,0x72,0x92,0xeb,0x5,0x4,0xfd,0x22,0x0,0x8c,0x49,0x19,0x5e,0x3b,0xf7,0xea, + 0xff,0xd3,0xd8,0xd8,0x30,0xd0,0x0,0x78,0xf7,0xae,0x5d,0x93,0x56,0xaf,0x5e,0xc9, + 0x25,0x1c,0x61,0x22,0xb4,0x40,0x2a,0x97,0x9,0x20,0x96,0x90,0xe5,0xd7,0x9,0xe0, + 0xfe,0xd2,0x3a,0x26,0x82,0xb3,0xfb,0x7e,0xf7,0x3c,0xb1,0xd4,0x24,0xa7,0xc3,0x40, + 0x0,0xd6,0x7b,0x1f,0xbc,0x6f,0x42,0xea,0xe3,0x45,0xdf,0xed,0x94,0x12,0x9c,0xb, + 0xa,0x18,0xd5,0xa9,0x50,0xbc,0xe2,0xe9,0xe7,0xe6,0x4,0x55,0xa7,0x14,0xe0,0x5e, + 0x7c,0x69,0x89,0xa9,0x38,0x35,0x9f,0xa1,0xb7,0x34,0x9c,0x7b,0x77,0x29,0xef,0x9b, + 0x1f,0x82,0x50,0xfb,0x67,0x5f,0x58,0xb4,0x98,0x1,0x8,0x30,0xf1,0xbe,0x50,0xb9, + 0xba,0xcd,0x52,0xb1,0x61,0x95,0x2b,0xad,0x78,0xe1,0x17,0x6,0x6c,0x31,0x3f,0x30, + 0xcc,0xbd,0x28,0xd8,0x81,0x5a,0xcf,0x63,0x55,0xc3,0xfa,0x94,0x19,0x33,0x79,0xf2, + 0x6,0xc0,0xd8,0x5c,0x97,0x65,0x8e,0x8e,0xce,0xf5,0xa2,0xb8,0x6,0x7d,0xcd,0xf2, + 0xb8,0x17,0x43,0x1f,0xb4,0x8c,0xa8,0x7e,0x31,0x3c,0x56,0xfa,0x96,0x4d,0x15,0x2e, + 0x71,0x5e,0x40,0x19,0xe7,0x9b,0xa0,0x0,0xfc,0x50,0xcf,0x9e,0x6c,0x52,0xe6,0x12, + 0x7a,0xae,0x2,0xb6,0x2a,0x27,0x5,0xff,0xf8,0x30,0xbd,0xcc,0x5f,0xb0,0x80,0xd3, + 0x25,0x18,0xb2,0x69,0xdb,0x67,0x78,0xd9,0x13,0xe4,0x97,0x2d,0x5e,0xe0,0x46,0xad, + 0x25,0x12,0xc2,0x31,0xc5,0x98,0x6a,0x8e,0x45,0xf3,0x37,0x27,0xf8,0x4c,0xb3,0x55, + 0x65,0x73,0x83,0xc1,0xb2,0xa5,0xe1,0x79,0xf3,0xe7,0x53,0x76,0xf0,0xe2,0xd,0x5, + 0x2e,0x7a,0xf2,0xee,0x3b,0xf5,0x69,0x5b,0xca,0xbc,0x39,0x66,0x7a,0x4e,0x2a,0x52, + 0xd2,0x9c,0x90,0x73,0x9d,0x6d,0x40,0x73,0x23,0x3,0xa,0x3c,0x3b,0x18,0x90,0xad, + 0xc9,0x2d,0xe0,0xe,0xce,0x80,0xb6,0xcc,0x86,0x6d,0xf0,0x3a,0x0,0xc1,0x6e,0xc7, + 0x2c,0x1d,0x81,0x5a,0xc0,0x57,0x75,0x8a,0x30,0xab,0x6e,0xde,0xb6,0x8d,0xdd,0x52, + 0x5c,0x80,0x25,0x1d,0xc,0xd6,0x21,0x32,0xee,0x7d,0x61,0x38,0x75,0x29,0x19,0xc3, + 0xe0,0xbd,0xa9,0x32,0x4,0xb0,0x6a,0x37,0x6b,0x15,0x5c,0x1d,0x0,0x98,0x4d,0xd1, + 0x4a,0x9,0x7f,0xab,0x6e,0x2a,0xdd,0xaa,0xda,0x6d,0xf5,0x80,0xf0,0xc,0xea,0xde, + 0xf4,0xa4,0x52,0xc3,0x4f,0xd1,0xbd,0xa,0xc4,0x3d,0xe,0x3c,0xc3,0x8a,0xf8,0x21, + 0x5,0x62,0x98,0xa6,0x7b,0xaa,0x6,0x20,0xa3,0x21,0x72,0x7a,0xd0,0xe9,0x25,0xea, + 0x7d,0xd3,0x68,0xd4,0xca,0xa7,0xb8,0x90,0x7,0xf2,0x84,0xa3,0x80,0xac,0x54,0xcc, + 0x14,0xad,0x41,0x9c,0x64,0x39,0x9,0xee,0x9d,0x86,0x71,0x8b,0x59,0xd7,0xbf,0xcf, + 0x65,0x2b,0x68,0x2f,0xdc,0x17,0xfe,0x5f,0xbe,0x72,0xea,0x14,0xad,0x53,0x3,0x6f, + 0x14,0x22,0xd9,0x1b,0x9a,0x92,0x8d,0xe9,0x5f,0xc0,0x58,0xff,0x16,0x32,0x10,0x4e, + 0x7,0x5f,0xa1,0xfa,0xd3,0x72,0x25,0x56,0xf0,0xbb,0x1,0xb0,0x69,0xf8,0xac,0xf1, + 0x7c,0xa8,0xcf,0x85,0x2,0xe6,0x86,0xd9,0x84,0x54,0x5f,0x7c,0xf4,0xc4,0x9,0xda, + 0x3a,0xa0,0x37,0xfd,0xec,0xd1,0xbb,0xe8,0xf7,0x80,0xef,0x80,0x1e,0xf4,0x5b,0x3, + 0xe1,0xfb,0x43,0x8,0x3f,0x10,0x34,0xa9,0x84,0x15,0x84,0xbf,0x1e,0xd1,0xcb,0x2, + 0xf1,0x1f,0x61,0x96,0x86,0x22,0x9e,0x30,0x84,0x61,0xc,0x1f,0x31,0x3,0x79,0x4a, + 0xd0,0xfe,0xaa,0xda,0xdf,0x15,0x98,0xff,0xac,0xde,0xb7,0x7f,0xd2,0x18,0x2e,0x26, + 0x85,0xa,0x5a,0x88,0x8a,0x46,0x8e,0xf0,0x7,0x1f,0xbc,0x47,0x4b,0x97,0x2d,0xe7, + 0x4a,0x59,0x1,0x80,0x43,0xe5,0x1b,0xaa,0x7a,0xbd,0x2c,0x71,0x4c,0xef,0x76,0xc0, + 0x5f,0x3c,0x16,0x1,0xf7,0x71,0xb5,0x12,0x28,0xdf,0x56,0x2a,0x1b,0x3,0x4a,0xb7, + 0xcc,0xad,0x74,0x19,0x21,0x10,0xb,0xac,0x7b,0xfd,0xc2,0x79,0xaa,0xaf,0xaf,0x9b, + 0x64,0x0,0xbc,0x65,0xcb,0xe6,0xe7,0xd7,0xae,0x5d,0x4d,0x27,0x5f,0x39,0xc9,0x81, + 0x4c,0xae,0x2,0xf6,0x1,0x95,0xd5,0xad,0xd8,0x97,0x4,0xd1,0xac,0x50,0xe,0x41, + 0xec,0x53,0xd0,0xee,0xf9,0x64,0x27,0x2c,0xb,0x31,0x40,0xfa,0xef,0x3f,0xb0,0x9f, + 0x53,0xa7,0x74,0x51,0x6c,0x99,0x93,0x15,0x4b,0x95,0x8,0x3b,0xfe,0x17,0x16,0xcc, + 0xa7,0x1e,0xf,0x3c,0xc0,0x26,0xe8,0x59,0x73,0xe6,0x5a,0x81,0x51,0xb,0x9d,0x20, + 0x29,0x37,0x60,0xa,0xf0,0x82,0x3f,0x17,0xfe,0x5d,0xf8,0x90,0x31,0x35,0x20,0x82, + 0x9f,0xec,0x2,0x1b,0x4b,0x85,0xca,0x5d,0x1a,0xf3,0xf7,0xea,0x6,0xc5,0xb,0xb3, + 0xee,0xc4,0x69,0xd3,0x68,0xcc,0x84,0x9,0xec,0x8f,0x46,0xc0,0xd6,0xf0,0x51,0xa3, + 0x55,0x1b,0xc5,0xd,0xaf,0x47,0x8f,0x1b,0xcf,0x7e,0x5c,0x5c,0x2b,0x26,0x72,0x8, + 0xd4,0x70,0x8e,0xf5,0x59,0xb,0xa5,0x79,0x5a,0xa8,0x6c,0x6c,0x7,0xe0,0x71,0x8e, + 0xc1,0x8f,0xd,0xe3,0xcf,0xc0,0xa0,0x3,0x83,0x6,0x4,0x71,0x49,0x65,0x1d,0xe5, + 0x1d,0xe7,0x58,0x41,0x60,0x68,0x28,0xdd,0x87,0xeb,0x1d,0x3b,0x71,0x12,0x3d,0xdc, + 0xab,0x17,0xcd,0x7b,0xe1,0x79,0x7b,0xe,0xdb,0x4c,0x7c,0x6,0x21,0x3d,0xf2,0x46, + 0xc7,0xb0,0x6e,0xfd,0x3a,0x2a,0xd8,0x50,0x40,0xdf,0x17,0xf3,0x4c,0xfb,0x62,0xc, + 0x2e,0x67,0xc9,0x5,0xf7,0x1,0x99,0x97,0xa9,0x64,0x58,0x37,0x7b,0x22,0xac,0x7d, + 0xa0,0xf0,0xfa,0x8a,0x93,0x4c,0xd0,0xe9,0xce,0xd5,0xad,0xaf,0xf2,0x9b,0x84,0x5f, + 0x4,0xdd,0x96,0x4e,0xfd,0xde,0x59,0x73,0xed,0x53,0xcd,0xfe,0xc9,0x4e,0x3a,0x33, + 0x7f,0xa7,0xec,0x32,0xb0,0xee,0x84,0x15,0x3e,0x85,0x9b,0x54,0x4a,0xf6,0x86,0x32, + 0x1d,0xac,0xdf,0xfb,0xa,0xff,0xbf,0xd6,0xd6,0xd7,0x29,0x35,0xb6,0x39,0xc,0xa2, + 0xaa,0xb2,0x21,0x5c,0xe6,0x98,0x9c,0xc3,0x8e,0x70,0x77,0x59,0xa5,0xe5,0xfb,0xd5, + 0xc7,0x18,0x10,0x43,0x95,0xe4,0x15,0xd0,0x71,0xd5,0x9f,0x21,0xd7,0x57,0xab,0xdf, + 0xef,0x7e,0xef,0x7b,0x34,0x73,0xe9,0x1c,0xea,0xb2,0xe1,0xb1,0x40,0xf9,0x56,0x86, + 0xad,0x4a,0x2c,0xab,0x26,0x72,0xd3,0x10,0x96,0xe6,0x68,0x6,0xb1,0x51,0xc3,0x81, + 0x59,0x3a,0x50,0xc4,0x4f,0xd3,0xbd,0x4a,0x11,0x3,0xc6,0x8,0xd6,0x42,0xc4,0xb4, + 0x6e,0x48,0x61,0xba,0xff,0xd8,0x1c,0xba,0xb9,0xf0,0x71,0x2a,0x2a,0xde,0x66,0x4a, + 0x5c,0x2,0xbc,0x57,0x32,0x11,0x80,0xaf,0x84,0xa6,0x67,0x3,0x60,0xc7,0x14,0x7d, + 0xc5,0xe3,0xce,0x48,0xac,0x1a,0x28,0xd6,0xe1,0x2,0x82,0x5f,0xb4,0xb6,0xbe,0x9e, + 0x2d,0x2,0x50,0xaf,0x12,0xbe,0x31,0xb3,0x7f,0x79,0xdc,0xc2,0xa0,0x4d,0xd1,0x6b, + 0xf3,0x36,0xd0,0x7a,0x5,0x70,0x64,0xca,0xa0,0x96,0x72,0xa,0xcf,0x8,0xe0,0x82, + 0xe7,0x85,0x5b,0x33,0xc3,0x17,0xbe,0xe0,0xef,0x7d,0xf1,0x3,0x5a,0xf3,0xec,0x6c, + 0xfa,0xf0,0xc1,0xdb,0x59,0xf9,0xfe,0x96,0x9b,0x4,0x70,0x8f,0x8,0xc4,0x83,0xd0, + 0x14,0x84,0x95,0x12,0x46,0xfb,0x6a,0xe8,0xc3,0x42,0xd,0x7,0x20,0xfe,0x23,0x40, + 0xc,0xd3,0xf4,0xe8,0xfe,0x1,0x8c,0xc7,0xe,0xa,0x22,0xa6,0xc7,0xd,0xe6,0xe5, + 0x5f,0xc2,0xf6,0xef,0x15,0xa4,0x33,0x7d,0xef,0xa5,0xfa,0x4d,0x85,0x1c,0xc,0x6, + 0x33,0x34,0x54,0xf0,0xf5,0x6b,0x57,0x69,0xeb,0xd6,0x6d,0x9c,0xa3,0x2c,0x15,0xb0, + 0x56,0xbd,0x12,0xc6,0xd6,0x7d,0x28,0xaf,0x16,0x96,0x98,0x68,0x9f,0x36,0xd3,0x73, + 0x7e,0x79,0xfe,0x6,0xcb,0xb5,0xe6,0x96,0xd5,0xd5,0xbf,0x11,0x7c,0xc0,0xe8,0x97, + 0x2e,0x5e,0xba,0x48,0x75,0x75,0xb5,0x73,0xd,0x80,0x37,0x6e,0xdc,0xa0,0xc4,0xcd, + 0x7a,0x2e,0xc2,0x81,0x1c,0x50,0xd,0xcc,0x2f,0x13,0x20,0xea,0x83,0xae,0xbb,0xee, + 0x53,0xb7,0x3e,0x48,0x7f,0xe9,0x1e,0xd3,0x7c,0x39,0xa6,0x92,0xa5,0x5f,0x59,0x77, + 0x50,0xda,0xe9,0xd,0xf0,0x1e,0x40,0x52,0x36,0x4a,0xc3,0xc9,0x49,0x2,0x44,0x8d, + 0xd5,0x66,0xa7,0xe6,0x2f,0xde,0xf3,0xd8,0xb0,0x61,0x74,0xf7,0xbd,0xf7,0x2a,0x0, + 0x8f,0x63,0x18,0x99,0xfa,0xcb,0x2e,0x24,0x85,0xb9,0x17,0x73,0xef,0x2,0xbc,0x50, + 0xa5,0x43,0x87,0x8f,0xe0,0xe5,0x33,0x73,0xe7,0xd1,0xb4,0x99,0x4f,0x52,0xff,0x41, + 0x83,0x39,0xd0,0x6a,0x41,0x2c,0xb8,0x2a,0x4,0xe3,0x62,0x3f,0x7c,0xa7,0x2b,0x70, + 0x43,0xed,0x8e,0x19,0x3f,0x81,0x1,0x89,0xeb,0x81,0x2a,0x47,0xd3,0x20,0x7e,0xec, + 0xf1,0x91,0xdc,0x46,0x8c,0x1e,0x4d,0x4f,0x28,0xf8,0x1,0xd8,0x50,0xcd,0x2f,0x4a, + 0x1f,0xf1,0xd2,0x65,0xfe,0xf4,0x25,0xd5,0x0,0x6c,0x40,0x73,0xfa,0x53,0x4f,0xb3, + 0xb9,0x1d,0x13,0x36,0x40,0xfd,0xf,0x1b,0x39,0x92,0x66,0x2b,0xa0,0x4b,0x0,0xcf, + 0x17,0xfe,0x69,0xab,0xea,0x16,0xea,0x57,0xaf,0x5c,0xc5,0x85,0x44,0x9e,0x60,0x0, + 0xf7,0x64,0x0,0xa7,0xc5,0x94,0x6a,0xbe,0x74,0x17,0x19,0x8d,0x5e,0xbc,0x77,0xf, + 0x2d,0xcb,0xc9,0x9,0xf3,0x11,0x53,0x89,0x26,0xe8,0x98,0xc5,0xc5,0x9,0xe6,0xb3, + 0xe3,0xc,0x92,0x23,0xea,0xdd,0x80,0xc0,0xd8,0xbe,0x54,0x3c,0x7d,0x2e,0xd9,0xb7, + 0xda,0xdc,0x69,0x84,0xb2,0x57,0xf5,0xfd,0x77,0x6,0x9a,0x65,0x35,0xbb,0x27,0x5c, + 0x8b,0x57,0x81,0xfb,0xcc,0xc6,0x37,0x6a,0x1e,0xf7,0xf8,0x8c,0xdd,0x59,0xc9,0xfe, + 0x51,0xd7,0x80,0xfc,0xce,0x0,0x70,0x49,0x59,0x19,0xcf,0xb2,0x63,0x3a,0xb9,0xb2, + 0x48,0x1,0x4b,0x35,0xc,0x5f,0x9b,0xdc,0xb6,0xc7,0x28,0xe2,0x4a,0x4b,0x1d,0x63, + 0x89,0xe2,0xfa,0x6b,0x72,0x73,0xe9,0xe3,0xcf,0x3e,0x9,0x4c,0xb9,0xe8,0x84,0x95, + 0xa,0x42,0x8c,0xcb,0xed,0xcf,0xf,0xa6,0x2e,0x65,0x63,0x19,0xb8,0x37,0x55,0x8c, + 0x8f,0x20,0x2c,0x60,0x7c,0x73,0x55,0xa4,0x84,0x8d,0x1a,0xae,0x99,0x6c,0x29,0x62, + 0xa8,0x5a,0x56,0xc4,0xa1,0x7f,0x18,0xaa,0x18,0x30,0x86,0x9f,0xf8,0x6e,0x5,0x64, + 0x98,0xa9,0xef,0x39,0x30,0x8b,0xd7,0xef,0x3d,0x34,0x9b,0x23,0xac,0x7,0xaf,0x98, + 0xca,0x96,0x3a,0x40,0x98,0xe1,0x1b,0x2a,0x60,0xd3,0xd2,0xf1,0xa6,0x1,0xcc,0xcf, + 0xa7,0x27,0x17,0x3e,0x6,0x67,0xe9,0x9e,0xb,0xb,0x14,0xa1,0xa4,0x24,0xe0,0x8b, + 0x7b,0xb8,0x37,0x9c,0x6c,0xa0,0x38,0xab,0x9f,0x3d,0x1a,0xf0,0x40,0xf5,0xee,0x2a, + 0xa9,0xa0,0x55,0xeb,0x72,0x69,0xeb,0xf6,0x1d,0x5c,0x26,0x12,0xf0,0x5,0x70,0x23, + 0xf8,0x36,0x87,0xeb,0x41,0x6b,0x53,0xf7,0x7a,0xff,0xa1,0x43,0xb4,0xe9,0x81,0xbb, + 0xe9,0x97,0x7d,0xee,0x66,0xe8,0xfe,0xa6,0x7f,0xd8,0xc,0x88,0x83,0x66,0x43,0xf8, + 0x7e,0xa5,0x84,0x3,0x35,0xfc,0x7b,0x98,0xa4,0x25,0x88,0x87,0x87,0x8a,0x18,0x3e, + 0x62,0x5,0x63,0xf6,0x13,0x23,0x60,0xb,0xbe,0x62,0xa5,0x90,0xff,0x3c,0x46,0xb5, + 0xd1,0x41,0xfb,0x9b,0x82,0xf8,0xcb,0x63,0x1e,0xe3,0x78,0x26,0x94,0xad,0x4,0x80, + 0xaf,0x75,0xb4,0xd1,0x2b,0x98,0x71,0x6b,0xcd,0x3a,0x63,0x86,0x66,0xe0,0x96,0xb, + 0x33,0xb4,0x0,0x6c,0x0,0xe2,0x2a,0xa7,0xf0,0x4b,0xb5,0x65,0x6d,0xc1,0x71,0x98, + 0x5,0x6a,0x7d,0xc1,0x46,0xae,0xe6,0xa5,0x23,0xa1,0x7d,0xff,0x77,0x58,0x47,0x71, + 0x23,0xf4,0x3b,0x6f,0xbe,0xf5,0x6,0x14,0xf0,0x2a,0x3,0xe0,0xbc,0xdc,0xdc,0x6d, + 0x85,0x85,0x1b,0xe8,0xcc,0xd9,0xb3,0x9c,0x1b,0x2b,0x3b,0x39,0xd,0x53,0x9f,0xc9, + 0xd8,0x5,0xad,0x84,0xa5,0x56,0xc8,0x97,0x13,0xd4,0x73,0x36,0x75,0x6c,0xce,0xa9, + 0x1,0x6c,0x5e,0xdb,0x66,0x68,0x7c,0x61,0x98,0xcc,0xf,0x1f,0x39,0x6c,0x2,0xb2, + 0xac,0x6a,0x24,0x99,0xa8,0x64,0x9e,0x7e,0x58,0x61,0xa6,0x3e,0x71,0xf2,0x24,0xdd, + 0x7d,0xcf,0x3d,0x74,0xdf,0xfd,0xf7,0xb3,0x2,0x7e,0xfa,0xb9,0xb9,0x61,0x69,0x47, + 0xbb,0x18,0x86,0xf4,0xb5,0xc2,0xfc,0x3b,0x7e,0xca,0x14,0x56,0xbc,0x8,0xde,0x9a, + 0xbf,0x78,0x31,0xfb,0x5c,0xe1,0x3b,0x86,0x8f,0xf4,0xc9,0xd9,0xcf,0xf0,0xb9,0x16, + 0x8,0xd8,0x5a,0xa9,0x43,0xe,0x80,0x1,0x50,0x80,0x14,0x2a,0x1a,0x40,0x1b,0x1b, + 0xb6,0x27,0x26,0x4e,0xa4,0x27,0x26,0x4c,0x64,0x20,0xa3,0x1,0xc8,0xf0,0x53,0x3, + 0xc4,0x0,0x26,0x96,0x38,0xe,0x26,0x69,0x9c,0xc3,0xd,0xea,0x72,0xf3,0x84,0xa1, + 0x72,0x9f,0x7d,0xe1,0x45,0x75,0xfc,0xb3,0xb4,0x62,0xed,0x7a,0x9e,0xda,0x10,0x93, + 0x8e,0xe3,0x98,0xb1,0xea,0x73,0x90,0x2a,0x5,0x5f,0xf8,0xd3,0xea,0x7c,0x26,0xea, + 0x5a,0x16,0x8,0x11,0xf7,0x2,0x33,0x32,0xb9,0xa,0x58,0xdf,0xf3,0x6c,0xd5,0xa2, + 0xf4,0x1c,0xc2,0x8d,0x4d,0x8d,0xf4,0xe2,0xfc,0xf9,0xfc,0x9b,0x69,0xff,0xa4,0x57, + 0x1,0x77,0x1a,0x5f,0xe0,0xdf,0xe7,0x8b,0xb6,0xcf,0x6,0xb8,0x6c,0x40,0xc9,0x56, + 0x76,0xd2,0x97,0xe3,0x7a,0x25,0x21,0xc2,0xd9,0x55,0xbc,0x3e,0x18,0xbb,0xa9,0x7d, + 0xbe,0xeb,0xee,0xc,0xd2,0x3e,0xb3,0xb0,0xff,0xbb,0x36,0x27,0x56,0x1b,0xcb,0x96, + 0xbb,0x9b,0x2d,0xf8,0x2d,0xa9,0x8a,0x9d,0x37,0xe0,0x52,0xc,0x86,0xf0,0xec,0x6c, + 0xdf,0xb9,0x93,0x36,0x6e,0xd9,0x11,0xa9,0x31,0x9,0x60,0x1,0x62,0x40,0x83,0x61, + 0x5b,0x16,0x82,0xb6,0xac,0x2a,0x16,0x94,0x55,0x1c,0x76,0x98,0x9b,0xb6,0xef,0xa2, + 0x9d,0xc5,0xc5,0x91,0x9b,0x3,0xdf,0xad,0xa5,0x85,0xe6,0x2d,0x5f,0x48,0x5d,0xd6, + 0xf,0x9,0x4c,0xcf,0xa,0xbe,0x5e,0x0,0x87,0xed,0x66,0xa1,0x84,0x75,0x63,0x8, + 0x87,0x20,0x6,0x84,0x23,0xd3,0x74,0xa0,0x8a,0x11,0xac,0x5,0x3f,0xf1,0x9d,0x4d, + 0xf1,0x76,0xeb,0x81,0x19,0x74,0x4b,0xc1,0xe3,0x54,0x56,0x5b,0xc9,0x95,0xb7,0xa0, + 0x7a,0x2f,0xa7,0x9b,0x6d,0x5,0xec,0x42,0x58,0xe6,0xbe,0x3b,0xb5,0x15,0xac,0xe7, + 0xc2,0xfd,0xad,0x45,0x70,0x2a,0x82,0xa4,0xf2,0xa,0x37,0x47,0xa,0xae,0x42,0xe, + 0x5c,0xaa,0x3c,0x96,0x84,0xe8,0x18,0xa8,0xbb,0x2d,0xbb,0xf6,0x70,0x90,0x5c,0x75, + 0x6d,0x2d,0x5b,0x1b,0xd3,0xac,0xf2,0x2,0xe0,0xca,0xa6,0x55,0x70,0x2a,0xfc,0x1f, + 0x59,0xf2,0xdc,0xb3,0x74,0xf1,0xbe,0x6f,0x32,0x7c,0x7f,0x1d,0x82,0xf7,0xd7,0x21, + 0x84,0x25,0x80,0xd,0x84,0x35,0x80,0xd9,0x1c,0x1d,0xb6,0x21,0x11,0x88,0xb5,0x69, + 0x3a,0x80,0x71,0x4f,0xfa,0x5a,0x1,0xf9,0x8f,0x50,0xc6,0x48,0x5f,0x2,0x94,0xb1, + 0x1e,0xb6,0x7f,0x1e,0xf6,0x8,0x5d,0x7e,0xf4,0x1e,0x6a,0xdc,0xb3,0x9b,0x2b,0x6f, + 0xa1,0x54,0x25,0x52,0x93,0xbe,0xab,0x6,0xfe,0x98,0xc2,0x70,0xaf,0x7a,0x76,0x4a, + 0xb4,0xd9,0x19,0xcf,0x4c,0x8,0xdb,0x3d,0x26,0xd2,0x3e,0x8a,0x45,0xb0,0x15,0x70, + 0xdc,0x3d,0x2,0x6b,0x2,0x8a,0x8f,0x1c,0x3e,0x7a,0xc4,0xcc,0xc8,0x97,0x54,0x1b, + 0x3,0x5,0x8c,0xb0,0xfc,0xf6,0x3b,0x6f,0x53,0x43,0x43,0xfd,0x56,0x3,0xe0,0x35, + 0xab,0x57,0xd5,0x6e,0xda,0x5c,0xc4,0x1,0xb,0x0,0xb0,0x81,0x69,0x52,0x93,0xc0, + 0x15,0xb0,0xf4,0xc1,0xd9,0xa7,0x8c,0x25,0xd0,0xbd,0x10,0x77,0xde,0x97,0x64,0x9a, + 0x44,0xc7,0xe,0x5b,0x3f,0x7c,0x1b,0x72,0x82,0x0,0xdf,0xcc,0x34,0x32,0x1c,0xbc, + 0xac,0xbc,0x9c,0xba,0xdf,0x75,0x57,0x8,0xe0,0x71,0xc,0x33,0x3,0x32,0x59,0x8, + 0x43,0xc1,0xb,0x95,0xab,0xa0,0x50,0x23,0xf0,0x2e,0x11,0xf3,0xf3,0x6,0x53,0x5, + 0xe2,0x35,0x7c,0xab,0x50,0xad,0xba,0x62,0xd5,0xc2,0xb0,0x56,0xb3,0x8c,0x72,0x96, + 0x81,0x53,0x30,0x9,0x23,0xb5,0x7,0x2a,0x9a,0x9b,0x2,0x31,0x7c,0xab,0x80,0xfc, + 0x38,0xed,0x3,0x6,0x90,0x15,0x24,0x3,0x65,0x3c,0x56,0x81,0x78,0xc,0x43,0x18, + 0x4a,0x18,0xe0,0x46,0xb0,0x96,0xf6,0x4f,0xbb,0xa5,0x2a,0x25,0x44,0x71,0x1c,0xbe, + 0x87,0x1e,0x30,0x4,0xd7,0xbc,0x96,0x23,0xb4,0x71,0x8d,0x0,0x71,0xdf,0xfe,0x3, + 0x94,0xca,0x7e,0x3c,0x30,0x4d,0x87,0xe0,0xe,0x82,0xbb,0x96,0x9b,0xeb,0x37,0x0, + 0x56,0xd7,0x66,0x4c,0xd0,0xd2,0xcf,0x9e,0x54,0x3f,0x39,0x4c,0xfd,0x3a,0x79,0xea, + 0x15,0x7a,0x6e,0xce,0x73,0x5c,0x6b,0xb6,0x59,0x0,0x38,0xc9,0x5,0x91,0x1c,0x1b, + 0x70,0x39,0x11,0xbe,0xfe,0x8,0xfd,0x2b,0x9d,0x2b,0xcb,0x94,0xd,0xa9,0x6c,0x55, + 0xd9,0xe2,0xa0,0xbc,0x22,0x7c,0x6f,0x37,0xe0,0x3,0x4d,0xc5,0xc1,0xea,0xb3,0x2, + 0xfc,0xc3,0x69,0x56,0xa9,0xe6,0x1b,0xab,0x0,0x26,0x3a,0x6e,0xff,0x80,0x20,0x8b, + 0x79,0xb9,0x13,0x20,0xfb,0xce,0x91,0xf4,0x5b,0xe1,0xd9,0xc1,0xa4,0xe6,0x9b,0x76, + 0xec,0x66,0x20,0x98,0x16,0xaa,0x5d,0xac,0x43,0xcd,0xea,0xed,0x6,0xbe,0x12,0xc8, + 0x6,0xd0,0xe1,0x31,0x30,0x95,0x2a,0x45,0x72,0xe8,0xf0,0xe1,0x20,0xdd,0x6,0xaa, + 0x4c,0xd,0xfe,0xde,0x79,0xe7,0x1d,0x7a,0xe4,0xe9,0xe1,0xd4,0x65,0xf7,0xe8,0x0, + 0xbc,0x0,0x70,0x79,0xb8,0x4c,0x0,0x71,0x4,0xe1,0x89,0x74,0x8b,0x36,0x49,0x7b, + 0x14,0xb1,0x34,0x4f,0xa3,0xa1,0x88,0x87,0xdb,0x6e,0x6d,0x9a,0x4e,0x5d,0xcb,0x9e, + 0xa0,0x67,0xf3,0x5e,0xe2,0x22,0x36,0xac,0x7e,0x43,0x5,0x7c,0x39,0xdd,0x12,0xc0, + 0x98,0xc1,0xdb,0x6c,0xc1,0xf7,0xb2,0xc7,0xba,0x10,0x8f,0x65,0x88,0x62,0x28,0x70, + 0x4f,0xb1,0x44,0x56,0xc8,0x1a,0x25,0xc,0x8a,0xd4,0x60,0x44,0x42,0x97,0x7d,0xe8, + 0x4e,0xfa,0x96,0x2f,0xb2,0x1c,0x4a,0x19,0xd5,0xc9,0x56,0xaa,0x3e,0x3,0xe5,0x29, + 0x53,0x88,0xe2,0xe,0x4d,0xce,0x56,0x83,0x4b,0xb0,0x25,0x30,0x3d,0xc3,0xf,0xc, + 0xf3,0xf3,0x5b,0x4a,0x79,0xce,0x7d,0xe4,0x41,0xba,0xd6,0xbb,0xbb,0x1,0xef,0xaf, + 0x5,0x80,0x7f,0x13,0x82,0xd7,0x52,0xc3,0x3,0x83,0xa6,0x21,0x6c,0xcc,0xd2,0x83, + 0x23,0xff,0xb0,0x5,0x63,0xd5,0xbe,0x1e,0xf6,0x8,0xe7,0x10,0x73,0x1e,0x71,0xd8, + 0xbe,0x56,0xdb,0xff,0xa4,0xda,0xef,0xfb,0xdc,0x45,0x35,0xcf,0x3c,0xc9,0x51,0xc7, + 0xda,0xc,0x8d,0x7c,0xe4,0x82,0x82,0xd,0xb4,0x7d,0xd7,0x5e,0xa1,0x80,0xab,0x4, + 0x7c,0xa3,0x26,0xad,0x2c,0xd2,0x42,0x20,0x81,0xac,0xfd,0xc2,0xb8,0x4f,0x28,0xc6, + 0xe1,0x2,0xd8,0x72,0xb1,0xa9,0xfb,0xc4,0x0,0x56,0xdb,0x30,0x2f,0x70,0x5d,0x5d, + 0x6d,0x93,0x1,0xf0,0x8a,0x15,0xcb,0x8f,0x6c,0xdd,0xba,0x85,0x1,0xc,0xf3,0xac, + 0x34,0xd,0xc7,0xa0,0xd9,0xac,0x7d,0xbf,0x71,0x88,0xfa,0x60,0x8a,0x75,0x4,0x42, + 0x78,0x15,0x73,0x73,0x76,0xd0,0xbb,0xef,0x71,0xff,0xb1,0xf1,0x85,0xdf,0x7c,0xfb, + 0x2d,0xbe,0x6e,0x80,0xd5,0xaa,0x3e,0xe2,0x29,0xd9,0x87,0x25,0xf2,0x56,0x8b,0xf7, + 0xec,0x61,0x0,0xdf,0x7b,0x7f,0xf,0x63,0x82,0x96,0x81,0x55,0x1a,0x90,0xc8,0xd, + 0x7e,0x6c,0xc4,0x8,0x86,0x1d,0xf6,0x2f,0x5f,0xb3,0x8e,0x72,0x18,0x62,0x6b,0x82, + 0x66,0x40,0xbc,0x86,0xf7,0x3,0xc0,0x76,0xea,0x50,0xdc,0x1c,0xac,0xc1,0xc,0xf5, + 0x6b,0xe5,0xe0,0x8a,0x9c,0x5b,0xce,0xdb,0x55,0x30,0x66,0x20,0x2b,0x18,0x8f,0x9d, + 0x14,0x81,0x38,0x50,0xc3,0xa3,0x78,0x1d,0x26,0x6f,0xed,0xf,0x5e,0xe0,0xf8,0x9f, + 0xe7,0x8b,0x2,0x1f,0x0,0x30,0xc0,0xc9,0xd7,0x2e,0x6,0xe,0xfa,0xfa,0x57,0x68, + 0x10,0x4f,0xc,0x14,0x31,0x6,0x1b,0x6c,0x96,0x37,0x83,0x89,0x20,0x17,0x19,0x0, + 0xd6,0x3,0x12,0x0,0xf8,0xf9,0x17,0x5f,0x30,0x45,0x38,0xbc,0x13,0x8,0x88,0xdf, + 0x2,0x1,0x37,0xaf,0x5f,0xb8,0x40,0x73,0xe6,0xce,0xa1,0xd7,0x2f,0x5e,0x8c,0xd5, + 0x15,0xcf,0x66,0x21,0x89,0x5,0xfc,0xb5,0xc4,0xf3,0xc8,0x7d,0x20,0x8e,0x99,0xaf, + 0xb3,0x4,0x32,0xb9,0x3e,0x4e,0x5f,0x30,0x15,0x3a,0x4e,0xf8,0xd3,0x60,0x42,0xc7, + 0x40,0x15,0xd,0x5,0x5d,0x64,0xde,0x7c,0x60,0xda,0x6e,0xc9,0x9a,0xee,0x94,0xa4, + 0x16,0xa3,0x40,0x32,0xff,0xf7,0x4a,0x52,0xc3,0xcd,0x6e,0x65,0xb0,0x24,0xd3,0xb3, + 0x50,0xe6,0xb8,0x8f,0xe8,0x9c,0xb8,0x5c,0x69,0x58,0x9a,0xf4,0xb3,0xef,0x7d,0xce, + 0xdb,0xfc,0x59,0x7,0x9d,0x0,0xb7,0x39,0x21,0xe5,0x30,0xcb,0x6f,0x83,0xf3,0xa1, + 0x6c,0xe1,0x56,0xd5,0x21,0x16,0x97,0x55,0x59,0xa0,0xb5,0x54,0x70,0x99,0xad,0x8c, + 0x2d,0x58,0x87,0x50,0xe1,0x25,0x3a,0x45,0xd5,0xb1,0xa2,0x9c,0x22,0xa,0x6f,0x0, + 0xbc,0x5f,0xc2,0xd7,0xdc,0xd1,0x46,0x15,0x15,0x15,0x74,0xd3,0x33,0x7d,0xc,0x74, + 0x23,0x0,0x87,0xa6,0x68,0xb5,0xe4,0xe6,0xf1,0xb,0x7,0x20,0xd6,0xa6,0x69,0xed, + 0x1b,0x9e,0x6c,0x96,0xdf,0x50,0x10,0xfe,0x46,0x6d,0xb0,0x64,0x65,0x5c,0x1f,0x6f, + 0xdf,0x54,0xad,0x6b,0xfd,0x4,0xea,0xbf,0x62,0x32,0xbd,0xf7,0xfe,0xfb,0x5c,0x2b, + 0x5a,0x2b,0xe0,0x0,0xc2,0xcd,0x41,0x93,0x39,0xd5,0x29,0xe7,0x79,0x68,0x49,0x1e, + 0x98,0x5d,0xe,0x3,0x7d,0xf0,0x4c,0x22,0x3a,0x19,0x26,0x67,0x4c,0xef,0x68,0x29, + 0xde,0xb2,0x4,0xb,0x83,0xd8,0x8e,0xe3,0x61,0x72,0x46,0x60,0x1c,0xa6,0x88,0xc4, + 0x60,0x39,0x3,0xd3,0x2a,0x3e,0x27,0x84,0xed,0x95,0x96,0x60,0xd9,0x22,0x1a,0x40, + 0x8c,0x25,0x82,0xaf,0x8a,0x4b,0x4b,0x28,0xef,0xf6,0x9b,0x19,0xb6,0xbf,0xee,0x6f, + 0x3,0x58,0xab,0xe1,0xa8,0xf5,0xb0,0x20,0xc,0x73,0xf4,0x6f,0x4d,0x90,0x96,0xab, + 0x8a,0x1f,0xc,0x23,0xa6,0x1f,0x34,0x91,0xd3,0xc8,0x23,0xfe,0x5a,0x41,0x19,0xed, + 0xf,0x43,0xb0,0xae,0x9a,0xda,0xf7,0x17,0x75,0xee,0xe3,0xc3,0xfa,0xa9,0xeb,0xff, + 0x36,0xcf,0x98,0x4,0x0,0xa3,0x1a,0x57,0x69,0x69,0x29,0x6d,0x2c,0xda,0x62,0x14, + 0x30,0x9b,0x99,0x35,0x78,0xcb,0xa4,0x1a,0x46,0xf0,0x9f,0x6d,0x25,0x88,0xfc,0xbf, + 0xf6,0xfd,0x42,0xdd,0xec,0xfa,0x86,0x6,0x16,0x7e,0xf1,0x79,0x13,0xa2,0xff,0xf, + 0x30,0xa,0xdb,0x91,0xb6,0x55,0x5f,0x5f,0x17,0x4d,0x8,0x9c,0xb3,0x6c,0xe9,0xab, + 0xdb,0xb7,0x6f,0x33,0x75,0xa0,0x3,0x68,0x26,0xab,0x53,0x84,0x52,0xf3,0xf2,0xca, + 0x97,0x5e,0x70,0x7e,0xe1,0x55,0xcd,0x7e,0x95,0x9b,0xd,0xba,0xde,0x7d,0xe2,0x9f, + 0x19,0xaa,0x17,0xce,0x6f,0x34,0x3d,0x27,0xa3,0x6f,0xae,0x56,0xd9,0xe1,0xc2,0x17, + 0x84,0xa2,0x10,0xdd,0xef,0x56,0xa,0x98,0x83,0xb0,0xc6,0x71,0x60,0x93,0x6,0xd, + 0x60,0x5,0xe8,0x41,0xd,0x4e,0x99,0x31,0x23,0x2,0xaf,0x6,0x97,0xb5,0x8c,0x60, + 0x6,0x25,0xa,0x95,0x2a,0x4d,0xc1,0xf3,0xad,0xe8,0xe2,0x65,0xc6,0xc4,0xb,0xd3, + 0x31,0x7c,0xbf,0x28,0xd4,0x81,0x49,0x14,0x50,0x21,0x4b,0x37,0x6c,0xc7,0x12,0xfb, + 0x34,0x8c,0xa1,0x8e,0xa1,0x3a,0x61,0xaa,0xd6,0x10,0x46,0xc3,0xbe,0xb9,0xf3,0x17, + 0x6,0xaa,0x9d,0xa3,0xb0,0x97,0x5a,0xca,0x17,0xdb,0xd0,0x38,0x95,0x49,0x1,0x18, + 0xa,0xd8,0xa8,0x77,0xf7,0xfb,0x84,0x4d,0x82,0x18,0x7e,0x6e,0xc,0x14,0xf4,0xc0, + 0x81,0x83,0xb0,0x16,0x2e,0x32,0x0,0x7e,0xe1,0xc5,0x17,0x23,0x0,0x27,0x29,0x60, + 0x61,0x86,0xc6,0x60,0x69,0xce,0xdc,0xb9,0x74,0xf6,0xd5,0x57,0xa3,0x7,0x34,0x5b, + 0xe0,0x9e,0xc7,0xfd,0x91,0x15,0xd4,0xbe,0x54,0xb9,0x58,0x4,0xbd,0xd,0xb1,0x1b, + 0x9,0x1e,0xc2,0xf3,0xe,0x5f,0xda,0xa5,0x37,0xdf,0x60,0x15,0x8f,0x98,0x3,0x54, + 0xfd,0xa9,0x6f,0x6c,0xe0,0xf5,0x57,0x4e,0x9f,0xe2,0xf4,0xe,0xfc,0xef,0xc8,0x1c, + 0x7a,0x5f,0x3a,0x55,0x52,0x34,0xb7,0x5e,0x4a,0x75,0xff,0x8f,0x96,0x6e,0xcd,0xa6, + 0x78,0xf5,0x77,0xc7,0xf5,0xa1,0x93,0xc6,0x6f,0x81,0xeb,0x46,0x9d,0x6e,0xcc,0x22, + 0x86,0xb6,0xff,0xc0,0x1,0x3a,0xf1,0xca,0x49,0xae,0x86,0x87,0x9,0xb,0xf8,0x5a, + 0x12,0xcc,0xdf,0x97,0xb3,0x54,0xaf,0xcb,0x3a,0x20,0x12,0xdf,0xab,0x45,0xd,0xd2, + 0xd6,0xe7,0x17,0x70,0x60,0x90,0x56,0xb3,0x2e,0x5c,0x8d,0x2,0x2e,0xad,0x8c,0xed, + 0xd3,0x1d,0xa1,0x79,0x6f,0xd8,0xd6,0xe4,0xe6,0xf1,0xef,0xa5,0x95,0x24,0x9e,0xbf, + 0x67,0x9e,0x9f,0x43,0x5d,0x16,0xf7,0xb,0x4c,0xcf,0x0,0x6f,0xf9,0x78,0x1b,0xc6, + 0x5a,0x9,0x57,0xd8,0xbe,0x61,0xad,0x82,0xed,0x28,0x69,0x3b,0x48,0xcb,0x7,0x64, + 0xa8,0xe2,0x6f,0x98,0x36,0x99,0x97,0x37,0x35,0x4c,0xa2,0xee,0x6b,0x46,0xd1,0x89, + 0x53,0x27,0xd9,0xc,0x6d,0x4c,0xce,0x99,0x48,0x1,0x3,0xc0,0x12,0xc2,0x97,0x53, + 0x51,0x74,0xbf,0x77,0x60,0x24,0xea,0x72,0xe3,0x19,0xdc,0xb4,0x65,0xb,0x97,0x94, + 0xe4,0x49,0xe6,0xdd,0xfb,0x29,0x2c,0xb,0xc5,0xc2,0xa4,0x2f,0x7d,0xbe,0x3b,0xf6, + 0x94,0xd1,0xd2,0x15,0xab,0xd8,0x6f,0xfc,0xb9,0x7a,0x9e,0xb5,0xaa,0x6b,0xd6,0xbf, + 0x35,0x3e,0x3f,0x4,0xb1,0x54,0xc0,0x1a,0xc4,0x80,0xf5,0xec,0x59,0x4f,0xd3,0xbe, + 0xbb,0x6e,0x61,0xd8,0xfe,0xca,0xb4,0x7b,0xcd,0x7a,0x4,0xe2,0x1e,0x16,0x8c,0x2d, + 0x35,0x3c,0x40,0xf8,0x86,0x7,0xde,0x6f,0xa2,0xa5,0x7f,0xc7,0xf9,0xc3,0xf,0x86, + 0xed,0x1,0x6e,0x7f,0x50,0xc0,0x35,0xd,0xaf,0x55,0xfb,0xf3,0xa0,0x1e,0xf4,0x7e, + 0x9f,0xfb,0xe8,0xd8,0xcb,0x87,0xd8,0xc,0xd,0x0,0x77,0xa8,0xbe,0xff,0xc8,0x91, + 0x23,0xb4,0x4e,0xd,0x2e,0x2,0x5,0x1c,0x40,0x17,0xa0,0xd5,0xe0,0xd5,0xca,0xd7, + 0xf5,0x87,0xcb,0xe7,0x53,0x2e,0x71,0xcf,0xa,0xb7,0xee,0xa0,0x8a,0xaa,0x2a,0xe6, + 0x4f,0x92,0x4b,0xc,0x4b,0xb8,0x3f,0xb1,0x1e,0x0,0xb8,0xf6,0xb4,0x1,0xf0,0xd2, + 0x25,0x8b,0x2f,0xee,0xd8,0xb1,0x9d,0x73,0x69,0x75,0x27,0x2,0xb8,0xa2,0xe3,0xd1, + 0xcd,0x82,0x6f,0xb3,0x3,0xe3,0x4,0x40,0x77,0x6,0xe5,0x2f,0xdc,0xe3,0xad,0x4e, + 0xf7,0x4a,0x74,0x8c,0x15,0x98,0x25,0xbe,0x90,0x2,0xf0,0xf9,0xb,0xaf,0x73,0x67, + 0xd2,0x2a,0x52,0x90,0xf4,0xd2,0x97,0xaa,0x81,0xe3,0xf6,0x94,0x28,0x0,0xdf,0xd5, + 0x3d,0x88,0x82,0x1e,0x17,0x29,0x60,0x28,0xce,0xe1,0x23,0x47,0x71,0xda,0xf,0x5e, + 0x1b,0xc0,0xba,0xaa,0x51,0x0,0x4b,0xbf,0xe,0x14,0xf0,0x13,0x61,0x3a,0x93,0xed, + 0xef,0x35,0xaf,0x15,0xc4,0x10,0x75,0xfc,0xbc,0x82,0x18,0x40,0x8b,0x86,0xd4,0x23, + 0x98,0xc0,0x31,0x8,0x40,0x7b,0x4a,0x5d,0xcb,0x93,0xcf,0x3c,0xc7,0xdb,0x35,0xa4, + 0x27,0x85,0x8a,0x78,0x9c,0x3,0x61,0xbc,0x7e,0x66,0xde,0xf3,0x96,0xea,0x9e,0x2f, + 0x55,0xb7,0xf0,0x5f,0xe3,0x33,0x8d,0x2,0x36,0xdf,0x21,0x18,0x44,0xc8,0xc1,0x5, + 0x20,0x1d,0xf9,0x88,0x27,0x4,0x3e,0xe2,0x91,0x23,0x79,0x60,0x82,0x7d,0x73,0x15, + 0xc8,0xf1,0xb9,0x48,0x43,0x32,0x0,0x76,0x53,0xbd,0xdc,0x19,0x74,0xc2,0x7c,0x60, + 0x4,0xa0,0xe0,0x3d,0xe8,0xe4,0x75,0xf0,0x95,0x31,0x39,0x37,0xfb,0x53,0xd2,0x3a, + 0xb,0xe2,0xf3,0xa9,0xdd,0x2f,0xff,0x81,0x68,0xea,0xc4,0x28,0xe4,0xf0,0xfa,0x90, + 0x3e,0x85,0xe7,0xb,0x26,0x3d,0xcc,0xb6,0xb5,0x73,0xd7,0x2e,0x2a,0x2c,0x2a,0xe2, + 0x52,0x9c,0xeb,0x72,0x73,0x29,0x2f,0x3f,0x9f,0x8a,0x36,0x6f,0xa2,0xbd,0x6a,0xd4, + 0xf,0x3f,0x10,0x2,0x3f,0xa0,0x88,0x7d,0x81,0x49,0x3e,0xb5,0x9f,0xe4,0xb,0xbe, + 0x2c,0x9b,0xfe,0x2e,0x2d,0x57,0xb2,0xd6,0x57,0xf7,0xcd,0xa1,0x2d,0x27,0x44,0x81, + 0x7a,0x47,0x27,0x8d,0x29,0x47,0x31,0x91,0xf8,0xae,0xdd,0xbb,0xf9,0xda,0xf3,0xa, + 0xf2,0x69,0x7d,0x5e,0x2e,0x7f,0xa7,0xc2,0x4d,0x45,0x1c,0x2c,0x87,0x34,0x13,0x7c, + 0x6f,0x56,0xc4,0x42,0xd9,0xbb,0x51,0xd0,0x32,0xef,0xff,0x1f,0xf2,0xe3,0x87,0xdf, + 0x3,0x69,0x31,0xdb,0x8a,0x4b,0x6c,0xc8,0x96,0x3a,0xeb,0x2,0x18,0x2e,0x50,0x76, + 0x95,0x6,0xa,0x58,0x83,0x1a,0xa5,0x27,0x79,0x8a,0xb8,0x2f,0xbe,0x1f,0xb8,0x5, + 0xd4,0xb3,0x7,0x18,0xf7,0x1d,0x31,0x88,0xba,0xac,0x1f,0x1a,0xc1,0xb7,0x6c,0x9c, + 0x5,0x62,0x3,0xe6,0x4a,0xa1,0x88,0x2b,0xe3,0x8a,0xd8,0x98,0xa5,0x65,0xb4,0xb4, + 0x8,0xd6,0x2,0x80,0x75,0x31,0x8f,0xa8,0xba,0x56,0x50,0x61,0xab,0x5b,0xbd,0x7a, + 0x9d,0x3f,0x82,0x2a,0xea,0xaa,0x19,0xc0,0xda,0xf4,0xac,0x95,0x6f,0x0,0xe1,0x66, + 0x56,0xed,0x12,0xbc,0xf6,0x7d,0xbe,0x62,0x29,0x61,0xfd,0xbf,0x76,0xe6,0xec,0x19, + 0x75,0x2f,0xf3,0xb8,0x36,0x71,0xa0,0xde,0xaa,0xe2,0xfe,0x72,0x47,0x1,0x4b,0xc8, + 0xc0,0x77,0xe,0x73,0xf5,0x32,0x5,0xdf,0x7d,0x7,0xf6,0x1b,0x17,0xc1,0xe5,0x10, + 0xb8,0x12,0xbc,0x16,0x80,0xc3,0xd7,0x2d,0xa1,0x19,0x9a,0x3,0x5c,0xfb,0xf6,0xa1, + 0x4b,0xf7,0xdf,0xc6,0x90,0xfd,0xa5,0x0,0xaf,0x5,0xe1,0x1,0x1a,0xc0,0x3d,0x4c, + 0x70,0x96,0xcf,0x24,0x1d,0x57,0xc3,0xd1,0x32,0x80,0xf2,0xfd,0x6,0xc4,0x5f,0xa9, + 0x75,0x6,0xb0,0xda,0x8e,0x3a,0xd3,0x97,0x7b,0x76,0xa7,0xba,0xdd,0xbb,0xd8,0xf4, + 0x9c,0x86,0x3a,0x57,0x7d,0xd5,0x6b,0xaf,0xbd,0x4a,0x2b,0x56,0xad,0xd,0x6a,0x42, + 0xc7,0xcc,0xce,0x95,0xa2,0x45,0xa6,0x68,0x39,0xd8,0xf3,0xe5,0xa5,0x23,0xe6,0xa0, + 0xac,0xa2,0xdc,0x98,0xff,0xdd,0xff,0x67,0xdd,0xc0,0x2b,0xfc,0x5e,0x98,0x90,0xa1, + 0xa1,0xa1,0xee,0x75,0x3,0xe0,0x65,0x4b,0x97,0xbc,0xb5,0x73,0xe7,0xe,0x3a,0xa7, + 0x14,0x30,0x4c,0x6a,0xae,0x72,0x8d,0x1,0x58,0x0,0xd4,0x7,0xdb,0xac,0x20,0xbe, + 0x9c,0xac,0x9a,0xbd,0xfb,0x9a,0x6d,0x20,0xcb,0x51,0x5,0x3a,0x7f,0x0,0x18,0x39, + 0x58,0x1,0x80,0xfd,0x91,0xb8,0xb2,0x2a,0x12,0x8e,0x43,0x2e,0x2a,0xea,0x19,0xc3, + 0x7,0x3c,0x32,0xc,0xc2,0x2,0xf0,0x60,0x6a,0x6,0xb0,0x22,0x5f,0xe9,0x9a,0x2c, + 0xf0,0xb5,0xf7,0x1,0x82,0x50,0xd3,0xf3,0x1d,0xe0,0x2e,0x74,0x66,0x36,0x5a,0xba, + 0x72,0x15,0xc3,0x10,0x9f,0x7,0x75,0x39,0x6b,0xce,0x3c,0xe,0x92,0x42,0x74,0x31, + 0xb6,0xa3,0xcd,0x79,0x71,0x1,0x83,0x15,0x3,0x3,0x5d,0xd2,0x12,0x6a,0x78,0x82, + 0x86,0xf0,0x84,0x89,0x7c,0xdd,0x80,0x31,0x8e,0x31,0x7e,0xe0,0x65,0x39,0x51,0x55, + 0xad,0xd0,0x27,0xbc,0x28,0x54,0xc0,0x6,0xc0,0xa1,0xcf,0x5a,0xfa,0xaf,0x97,0xb9, + 0x4d,0xec,0xc3,0xb9,0x46,0xa9,0x81,0x5,0x20,0xbc,0x34,0x8c,0x82,0x66,0x5,0xac, + 0x0,0xcc,0x26,0x68,0x91,0xff,0xeb,0xce,0x4c,0x24,0xad,0x10,0xa9,0x30,0x60,0xe, + 0xd3,0x12,0x1e,0x3f,0x71,0xc2,0x5b,0x9,0x4d,0xe,0xbe,0x92,0xe0,0x9b,0x14,0x5b, + 0x90,0xd,0xde,0x5e,0x5f,0x6b,0x2a,0xee,0xa3,0x71,0x53,0x99,0x60,0x96,0xc5,0xf3, + 0xd5,0xb4,0x7f,0x3f,0x3,0x76,0xc3,0xc6,0x8d,0x3c,0x9d,0xdb,0xac,0xd9,0xb3,0x68, + 0xea,0xb4,0xa9,0x34,0x79,0xca,0x14,0x2e,0x2e,0x82,0x7c,0xe8,0x9c,0x15,0xcb,0x69, + 0x63,0x61,0x21,0x83,0xd,0xf3,0xdb,0x7e,0x2f,0xac,0xa7,0xee,0x5,0xb0,0x1b,0x74, + 0xd5,0xd2,0x79,0xea,0x5e,0xd6,0x19,0xc6,0xb2,0x4c,0x64,0xa1,0xcf,0xf,0x53,0x33, + 0x82,0x72,0x30,0x3b,0xe,0x26,0xd3,0x0,0x68,0x97,0x2e,0x5b,0x46,0xb3,0x9f,0x7d, + 0x86,0x27,0xd8,0xc0,0x34,0x76,0x33,0x9e,0x9c,0x49,0x73,0xe7,0xcd,0xa3,0xa5,0x39, + 0xcb,0xa8,0x60,0xe3,0x6,0x2a,0xaf,0xac,0xe0,0x41,0xb9,0x9e,0x9c,0xa5,0x33,0x13, + 0xf4,0xd,0x65,0x3d,0x58,0x2e,0xa5,0x2b,0xb4,0x76,0x7d,0x2e,0x6d,0x2f,0x2e,0xd, + 0x3a,0xba,0x52,0x5b,0xf5,0x16,0xb,0xb0,0x62,0x29,0xd7,0xe3,0x66,0xe8,0x0,0xc4, + 0x30,0xbb,0x22,0xf0,0x88,0x7,0x74,0xa1,0xff,0x17,0xd9,0x1d,0xdd,0x1f,0xbd,0x9f, + 0xba,0x14,0x8d,0x60,0xe0,0x72,0x2b,0x93,0x20,0x1e,0x17,0x6c,0xab,0xb0,0x55,0xb1, + 0x2f,0x42,0xda,0xe7,0x1f,0xee,0x56,0x35,0xd1,0x52,0xc7,0x16,0x7c,0xf5,0xba,0x82, + 0x70,0xb7,0xba,0x49,0xd4,0x55,0x5d,0xc3,0x96,0x3d,0x3b,0x28,0xad,0x4d,0xd0,0x5a, + 0xf5,0x6a,0x8,0xcb,0xd6,0x12,0xd,0xbc,0xf0,0x7d,0xdc,0x67,0x27,0x15,0xd6,0xc1, + 0xdf,0xa7,0x9e,0x4f,0x14,0x83,0x40,0xc0,0x14,0xfc,0xb9,0x3e,0x6b,0x1,0xdf,0x33, + 0x8f,0x2a,0xd6,0x20,0xc9,0xdd,0x50,0xc4,0x3e,0x63,0xb8,0xf3,0xd2,0xad,0xe9,0xe8, + 0x7f,0xe2,0x6,0x5a,0x73,0x4b,0x0,0x60,0x14,0xdf,0xc0,0xff,0x4b,0x1f,0x25,0x6e, + 0x3e,0x7a,0xe4,0x4e,0x6,0xed,0x2f,0x43,0xe0,0x2,0xc4,0x1a,0xc6,0x80,0x2f,0x60, + 0x1c,0x53,0xc2,0xfd,0x6d,0x93,0xb4,0x1,0xb2,0x95,0xb6,0x14,0x1,0x99,0x21,0x2c, + 0x96,0x0,0xf0,0x57,0xe1,0xf2,0x6b,0x75,0x5c,0x47,0xcf,0x3b,0xa8,0xaa,0x20,0x8f, + 0xfd,0xd2,0x0,0x30,0xa6,0x43,0x7c,0xf3,0xcd,0x37,0x68,0xb9,0x1a,0x64,0x94,0x58, + 0x81,0x57,0x91,0x9,0xda,0x80,0xd8,0xa3,0x7c,0x77,0xeb,0xe7,0xd2,0xba,0x87,0x55, + 0x54,0xb4,0x6d,0x97,0x12,0x75,0x25,0xd1,0x80,0xc5,0x33,0x68,0x46,0xd3,0x51,0xd2, + 0x1,0x80,0xeb,0xdf,0x36,0x0,0x5e,0xfc,0xd2,0xc2,0xf,0x77,0xed,0xda,0x19,0x29, + 0x60,0x98,0xa0,0x2f,0x7f,0x19,0x6b,0x59,0x1,0xea,0x6c,0xd7,0xff,0x6c,0xfc,0x5e, + 0xad,0xa6,0xaf,0x24,0x9f,0xf3,0x8b,0x7f,0x20,0xe0,0x4b,0x26,0xf2,0xe3,0x7,0x47, + 0x20,0x16,0x26,0x61,0xd0,0xd1,0xcf,0xcd,0x6e,0xe,0xa3,0x8,0x8e,0x1,0x80,0x31, + 0xc2,0xc7,0x84,0x3,0x3a,0x8,0xb,0xa9,0x39,0x0,0x99,0xae,0x26,0x15,0x57,0xbe, + 0x6b,0x3c,0xca,0x71,0x35,0xfb,0x44,0xf5,0xb6,0xc0,0x4,0x3d,0xce,0x9e,0x56,0x50, + 0x83,0x50,0x44,0x57,0xb3,0xbf,0x58,0x6d,0xc7,0xe7,0x1,0xb2,0x30,0xe9,0x6,0x73, + 0xfa,0xae,0x64,0xc0,0xa1,0x61,0x7e,0x5f,0xa4,0x18,0x3d,0xf7,0xc2,0x7c,0x56,0xc5, + 0x80,0x35,0x4c,0xd5,0x1a,0xc2,0x30,0x47,0x8f,0x1e,0x3f,0x9e,0x83,0xb4,0x4c,0x11, + 0x11,0xb7,0x74,0xe5,0xd2,0xc8,0xe4,0x2d,0x4d,0xd0,0x5a,0xf1,0xea,0x66,0xa9,0x79, + 0x9,0xe5,0xf0,0x38,0x4,0x6a,0xe1,0xda,0xe0,0x77,0xc6,0x75,0xc6,0x0,0x2c,0x7c, + 0xc0,0xb1,0x9,0x2,0x44,0x2d,0x61,0xfc,0x2e,0x50,0x22,0xb,0x17,0x2d,0xa4,0xa3, + 0xc7,0x8e,0x59,0x26,0xe8,0xa4,0x80,0x2b,0xe9,0xe6,0xe8,0xc,0xc2,0x89,0x3e,0xc7, + 0x84,0xda,0xe3,0x97,0x5b,0x12,0x2,0xb0,0x54,0xfb,0x81,0x7a,0x1e,0x31,0x9d,0x24, + 0xaa,0x34,0x35,0xee,0xdb,0xc7,0xf0,0x5d,0xb9,0x7a,0x15,0x8d,0x87,0x45,0xa0,0x6f, + 0x5f,0xea,0xd5,0xbb,0x37,0xf5,0x1b,0x30,0x80,0xfa,0xf,0x1c,0x48,0x7d,0xfb,0xf5, + 0xe3,0x19,0xa3,0xc6,0x4f,0x18,0xcf,0x11,0xde,0x50,0x91,0x95,0x55,0x55,0x74,0x9, + 0x93,0x9a,0x84,0xbe,0xe1,0xcb,0x9,0x41,0x49,0x2e,0xb8,0x7c,0x55,0xe3,0x62,0x35, + 0xd2,0x53,0xcd,0x31,0x5f,0x73,0xb3,0x2f,0x3f,0x34,0xfc,0x5e,0xf8,0xdf,0x42,0x6e, + 0x3f,0x3a,0x56,0x28,0x1b,0xa4,0xfd,0xac,0x59,0xb7,0x8e,0x26,0x4d,0x99,0xcc,0xd7, + 0xde,0xb3,0x57,0x2f,0xea,0xdb,0xbf,0x1f,0x7f,0x97,0x3e,0xe1,0x77,0xc1,0xc4,0xee, + 0x73,0x9f,0x9f,0xa7,0x14,0xfe,0x7a,0x86,0x35,0xfe,0xc7,0x58,0x51,0x3a,0x83,0x6, + 0xab,0xea,0x55,0x42,0x81,0x9d,0x58,0x26,0x83,0x5e,0xf,0x2b,0xe5,0xad,0x5e,0xbb, + 0x3e,0x52,0xc0,0xe,0x30,0xc,0x74,0x4b,0x7d,0x30,0xa9,0xf4,0xc2,0x78,0xa7,0x52, + 0xc0,0xdb,0x76,0xec,0x34,0xe6,0x73,0xf4,0x11,0x35,0x6a,0x50,0xf4,0x8d,0x87,0xba, + 0x53,0x97,0xcd,0x8f,0x47,0xd0,0x15,0x4d,0x6f,0xb3,0xcd,0xd2,0x13,0x4c,0xb0,0x56, + 0x37,0xd7,0x34,0xed,0xe6,0x10,0x57,0xc5,0x21,0xdc,0x4d,0xb4,0x9b,0x6b,0xc2,0x75, + 0x5,0xe0,0x2e,0x9b,0x86,0xd3,0x86,0x9d,0x9b,0x39,0x3f,0x39,0x6,0xdc,0x54,0xe4, + 0xe7,0xfd,0x32,0x6c,0xb1,0xa8,0x7f,0x11,0x6c,0x85,0x1,0x2d,0xfa,0x32,0xf8,0x7b, + 0x77,0xec,0x2d,0x8b,0xac,0x4,0x9,0x3,0x14,0xd7,0x9f,0xce,0xfe,0x5e,0x75,0x1f, + 0x57,0xac,0x59,0xc7,0x33,0x52,0xa1,0xa,0xa2,0x36,0x39,0x47,0xbf,0xb5,0xf8,0x7f, + 0x12,0x4b,0x6,0xaf,0x56,0xc2,0x21,0x84,0x91,0x77,0xb,0x57,0x46,0xaf,0x5b,0xbf, + 0x45,0x9f,0x2b,0xf5,0xa9,0x1,0xec,0xb6,0x5f,0x89,0xc6,0xbe,0xe1,0x1,0xae,0x6f, + 0xb8,0x47,0xdc,0x3c,0x6d,0x29,0xe2,0xb0,0xd,0xe8,0xc1,0xe0,0xe5,0x82,0x1e,0x0, + 0xb1,0x5a,0x2,0xc0,0xbf,0x57,0xdb,0x1,0xe0,0xeb,0xa,0xc0,0xe5,0x6b,0x57,0x71, + 0xb1,0x90,0xc,0xe2,0x7f,0xd4,0xf2,0xdb,0xdf,0x7e,0x9b,0x72,0xfe,0x7f,0xde,0xde, + 0x3,0xcc,0xaa,0x22,0x4f,0x1b,0x47,0x50,0x94,0xa4,0x2,0x8a,0x82,0xa,0x28,0x19, + 0x24,0x4a,0x52,0x72,0xce,0x39,0x43,0x43,0x37,0x74,0xce,0xb9,0x9b,0x26,0x83,0x80, + 0x88,0x4,0x31,0x91,0xc,0x28,0x18,0x10,0x15,0xe8,0x70,0xbb,0x9b,0x60,0xce,0x39, + 0x4c,0xd8,0x99,0xd9,0xff,0xb7,0x79,0xbf,0x9d,0x1d,0x67,0x67,0x66,0x67,0x1c,0x9d, + 0xd9,0x9d,0xaf,0xbe,0x7a,0x7f,0xa7,0xaa,0x4e,0x55,0x9d,0x3a,0xe7,0x5e,0x66,0xbf, + 0xe7,0xdf,0xcf,0x53,0xcf,0x39,0xf7,0xdc,0xd3,0xf7,0xde,0x93,0xea,0xfd,0xbd,0xef, + 0x2f,0xf1,0xf9,0x8c,0xfc,0xbf,0x82,0xed,0x4a,0x19,0x5a,0x7,0x60,0x32,0x56,0xc4, + 0xfb,0x36,0xe8,0xea,0x39,0xc1,0x58,0x66,0xe6,0x17,0x51,0x43,0x86,0x46,0x11,0x5b, + 0x61,0xa8,0x71,0xda,0xbd,0x2f,0x6b,0x70,0x3,0x80,0xb7,0x6d,0xdb,0xfa,0xb2,0x2, + 0xe0,0x5,0xf3,0xe7,0x9e,0x33,0x0,0xd8,0x6,0x4e,0x39,0x42,0xa4,0x69,0x1d,0x40, + 0x3,0xc0,0xad,0xfd,0x4f,0xcc,0xda,0x27,0xb0,0x6e,0xed,0xa7,0xef,0xaf,0x3f,0xd0, + 0xf2,0x46,0x84,0xa6,0xe,0xff,0x2f,0x0,0xf8,0xb2,0xd5,0x8f,0x51,0xaf,0x42,0xa2, + 0xb3,0x4,0xfc,0xf,0x1a,0x31,0x5c,0x2f,0x0,0x18,0x4c,0x72,0x12,0x7,0x60,0x19, + 0xb9,0xec,0xf4,0xf3,0x5a,0xcc,0xd0,0xc5,0x82,0x25,0x3,0xd6,0x9b,0x25,0xe8,0xf9, + 0xc0,0x88,0x26,0xc6,0x77,0x0,0xd4,0x16,0xaf,0x58,0xc9,0xa6,0xcc,0x9a,0x4d,0x72, + 0xee,0x82,0x65,0xcb,0xa9,0xfc,0x63,0x4a,0x7a,0x6,0xd5,0x71,0x4e,0xcd,0xca,0x66, + 0xc9,0x69,0xe9,0xc4,0x56,0xf1,0x7f,0xd8,0xc7,0x60,0xc2,0xc2,0x27,0x8c,0x74,0x25, + 0x44,0x4b,0xc3,0x78,0x70,0x5,0x7e,0xcd,0x17,0xc7,0x33,0x4f,0x93,0xa0,0x75,0x0, + 0xd6,0xc1,0x76,0x59,0x80,0xe5,0xaf,0x56,0xcc,0x18,0xbf,0x3,0x9f,0x3,0xbf,0x38, + 0xc,0x3,0x29,0x41,0xab,0x20,0x2c,0xdd,0xe0,0x71,0xd5,0x1b,0xd6,0x6a,0xb,0x3, + 0x80,0x17,0x2d,0x5e,0xcc,0x1,0x78,0x7f,0x0,0x7c,0xa3,0x22,0xe4,0xa5,0x9b,0xa3, + 0xce,0x91,0x9e,0xe6,0xa,0xd6,0x73,0xc9,0x9d,0x41,0x60,0x36,0x41,0x58,0xaa,0x2b, + 0x60,0x14,0x50,0x54,0x50,0xde,0x14,0x1d,0xb6,0xe0,0xb,0x9b,0xbf,0x70,0x1,0xb5, + 0x64,0xbc,0xa5,0x63,0x47,0x36,0x70,0xc8,0x3d,0x94,0x3b,0x3d,0x47,0xa4,0x80,0xc1, + 0xb0,0x19,0xc1,0xaf,0x7,0xc0,0xb,0xb9,0xe5,0x88,0xc,0x4f,0x4b,0x4f,0x27,0x1f, + 0x31,0x40,0x3c,0x96,0x40,0x30,0x92,0x62,0x37,0x8d,0xd,0xd1,0x41,0x65,0x17,0xdc, + 0xc1,0x64,0x61,0x81,0x39,0x90,0xc2,0x21,0xfb,0x1f,0x7a,0xec,0x51,0x9a,0x18,0xe1, + 0x7a,0x1,0xbb,0xed,0xd1,0xb3,0x27,0xb9,0x5f,0xfa,0xd,0xf0,0xd2,0xcf,0x10,0xc8, + 0x87,0xfb,0x5,0xcb,0x51,0xfc,0x1e,0xeb,0xce,0xdf,0xef,0xdd,0xa7,0x37,0x9b,0x36, + 0x7d,0x3a,0x5b,0xbb,0x6e,0x1d,0xb1,0x7a,0x59,0x23,0x3e,0x6e,0xb0,0x95,0x7e,0x5d, + 0x5d,0xd9,0x12,0xd6,0xf5,0x4d,0x4a,0x4e,0x21,0x6,0x4c,0x60,0x5a,0xb1,0x41,0xc8, + 0xca,0x1b,0xc,0x19,0x1a,0xaf,0x1,0xac,0x3a,0xd8,0xea,0x0,0xad,0x6f,0x7,0x10, + 0xe5,0xe4,0x79,0x15,0xb0,0x60,0x18,0x0,0x80,0xb,0xa,0xa,0xd8,0x35,0x1d,0xda, + 0x70,0xf6,0xd9,0x9f,0x98,0x6f,0xd3,0xca,0xa1,0xde,0xb0,0xc0,0x57,0x1f,0x4e,0x20, + 0x76,0xa5,0x2c,0x69,0x0,0x1c,0x58,0xd7,0x6a,0x4c,0xd3,0xfa,0xd6,0x11,0xec,0xaa, + 0xcc,0x7e,0x2c,0xb3,0x38,0xd7,0x3,0x60,0x8d,0xf5,0x2a,0xc0,0x75,0x31,0x60,0x2d, + 0x28,0x56,0x16,0x4d,0x39,0xce,0x8d,0xa2,0xf4,0xac,0x2c,0x3e,0x6f,0x64,0x19,0x92, + 0x7c,0x49,0xa8,0x3a,0x60,0xfa,0xd1,0x1,0x1e,0xa8,0x16,0xb6,0x8c,0x4a,0x4a,0x6e, + 0x20,0xf7,0x4,0x22,0x9d,0x83,0xcf,0x50,0xbd,0x5a,0x2,0x8c,0x1b,0x84,0x72,0xa1, + 0xa4,0x68,0x8d,0x5,0x3,0x80,0xcb,0xb8,0x41,0xd0,0x91,0x3,0xf0,0x99,0x4e,0x1e, + 0x0,0x7f,0xee,0x0,0x5f,0x53,0x96,0x6e,0x6f,0xf8,0x86,0x7d,0xf0,0xbd,0xc9,0x90, + 0xa5,0xbf,0xb6,0x8a,0x79,0xc8,0x82,0x1e,0xe4,0x2b,0xee,0xa6,0x3,0xf2,0x4d,0x54, + 0x75,0xeb,0xa7,0x7c,0xf9,0xf6,0xed,0x6d,0xd8,0x86,0xb5,0x6b,0xbc,0xda,0xd4,0x20, + 0x5f,0x7c,0xf9,0x2c,0x37,0x8c,0xc1,0x80,0xc9,0xe7,0x2b,0x80,0xb7,0xb4,0xd2,0x97, + 0x9e,0xcb,0x94,0x8f,0xdc,0x77,0x85,0xe8,0xfe,0x72,0xf9,0x5a,0xde,0xa3,0x0,0xe3, + 0x2c,0x2,0xe0,0x32,0xba,0x2e,0xae,0x8c,0x20,0x39,0x7,0x49,0x89,0x1a,0x15,0xd1, + 0xb6,0x6d,0xdb,0x72,0x4e,0x1,0xf0,0xc2,0x5,0xf3,0x5f,0x2c,0x2c,0x2a,0x50,0x41, + 0x58,0x4e,0x20,0x95,0x60,0xea,0xda,0x1e,0xe2,0x2b,0xbe,0x92,0x61,0x6,0x77,0x99, + 0x93,0xaf,0x4,0x71,0xfb,0x61,0x7,0xe8,0x42,0xee,0xf3,0x18,0xf0,0x9b,0xce,0xd4, + 0x23,0x7b,0xc2,0x2,0x0,0x97,0x12,0x0,0xdf,0x20,0x2a,0x61,0x79,0x3e,0x60,0xf8, + 0x3d,0x1,0x3c,0x0,0xca,0x45,0x1c,0x20,0x6d,0xa9,0xd6,0x0,0x65,0x8b,0x9,0xcb, + 0x34,0x24,0xa,0xc2,0x5a,0xb4,0x24,0x50,0xf9,0x4a,0x6,0x61,0x61,0x92,0x3,0xa3, + 0x44,0x1d,0x66,0x30,0x49,0x6c,0x5f,0xc1,0x27,0xa0,0xb4,0xec,0x5c,0x96,0x5b,0x54, + 0xc2,0x27,0xa0,0x4a,0x56,0x54,0x5e,0xc9,0xb2,0xb9,0x5,0xf,0x30,0x6,0x60,0xe2, + 0xf3,0x0,0xd6,0xe3,0xa6,0x4c,0x25,0x9f,0x30,0x22,0xa5,0x25,0xb,0x46,0x10,0x16, + 0x7c,0xb3,0x26,0xeb,0x35,0xa3,0xa0,0xe7,0x13,0x6b,0x9d,0xef,0x49,0xd0,0x49,0x6b, + 0x34,0xc0,0xb5,0xe4,0x74,0x71,0x6c,0xf2,0x7d,0x7c,0xb7,0x94,0xcb,0x71,0x7e,0x20, + 0x93,0x63,0xfb,0xc,0x91,0x86,0x74,0xeb,0x6d,0x9d,0xcc,0x20,0xac,0x40,0xb5,0x31, + 0xb3,0xd3,0xf,0xdc,0x3,0x60,0x62,0x0,0x60,0xf8,0x80,0x6d,0x0,0x26,0xe3,0xcb, + 0x2,0x60,0x3b,0xde,0xc0,0x55,0xe0,0x25,0xb4,0x6e,0xb9,0x55,0x5b,0xbc,0x3e,0x8e, + 0xf,0x18,0xfb,0xe1,0xde,0x47,0xa0,0xd5,0xde,0xfd,0xfb,0x8,0x74,0x72,0xf3,0xf3, + 0xd9,0xa4,0x29,0x93,0x59,0xc7,0x4e,0x1d,0xd9,0xed,0x5d,0xba,0x50,0x50,0x1e,0xce, + 0x25,0xc,0x28,0x5c,0x37,0xd9,0xb4,0x2,0xf5,0xb2,0x71,0x1d,0xd0,0x63,0xb9,0xff, + 0x80,0xfe,0x6c,0xd1,0x92,0xc5,0xac,0xa0,0xa8,0x90,0x92,0xf3,0x31,0xb1,0x85,0x95, + 0xd5,0x8c,0xc5,0xf3,0x75,0x5f,0x68,0x8,0x30,0x76,0xbb,0xdc,0x66,0xbd,0x76,0xc, + 0x92,0x59,0xe2,0xf5,0x79,0xfe,0xbd,0xd2,0x77,0x8d,0x1c,0x4e,0xfc,0x1e,0xc8,0xcb, + 0x9d,0x6e,0xbb,0x8d,0xae,0xdd,0x70,0x6e,0x50,0x21,0xa2,0x1d,0x31,0x9,0xc8,0xf, + 0xc7,0xb1,0xac,0x49,0x4d,0xa7,0xba,0xe0,0xb8,0xe6,0x3d,0x7b,0xf7,0x66,0x7d,0xfb, + 0xf5,0x65,0xf3,0x17,0x2c,0xe0,0xe7,0x21,0x8f,0xc,0x12,0xb8,0xa7,0x2,0x81,0x6e, + 0xc2,0x78,0x89,0x2a,0xc8,0x13,0x65,0x2c,0x1,0x80,0xd1,0xd2,0x4d,0x4e,0x76,0x6, + 0xa0,0x5a,0xdb,0x14,0x40,0x6b,0x40,0x6d,0x83,0x30,0x7c,0xc0,0xe8,0xfd,0x8b,0x6, + 0xc,0x38,0x4f,0x90,0xa0,0xd3,0x33,0xd2,0x59,0x8b,0x9b,0xae,0x67,0x57,0xad,0xeb, + 0x4b,0xc0,0xdb,0x4c,0x2,0x70,0x65,0x90,0x9,0x1b,0x0,0x5c,0xe5,0x47,0x4a,0xeb, + 0xc1,0x5a,0x4,0xbc,0x51,0x12,0xf5,0x26,0x1d,0x98,0x5,0x10,0x63,0x9,0x0,0x5e, + 0xdb,0x97,0x15,0x55,0x96,0x7a,0x11,0xda,0x17,0x1,0xb8,0x26,0xf0,0xc6,0x2e,0x4, + 0x7d,0xbd,0x76,0x9a,0xdb,0xc1,0x43,0x7,0x55,0x49,0x49,0x59,0xa4,0xc4,0x50,0x6, + 0x74,0xd5,0x40,0x7,0xe4,0x4a,0x1f,0x7c,0xd3,0x72,0xf2,0xd8,0x32,0xfe,0x7c,0x23, + 0x6e,0xa1,0x51,0x28,0x40,0x4e,0x65,0x89,0xd6,0xeb,0x15,0x10,0xfb,0xd2,0x73,0xbd, + 0xcf,0x82,0xc5,0xeb,0xcb,0xfc,0x98,0x72,0x72,0x73,0xd8,0x4d,0x2d,0x5b,0xb0,0x13, + 0xb7,0xb6,0x51,0x0,0x4c,0xe3,0xce,0x76,0x4,0xc0,0x72,0xa9,0x3,0xb2,0xce,0x82, + 0xbf,0x14,0x20,0xec,0x8e,0x98,0xb6,0x7c,0xc5,0xdd,0xb5,0xca,0x5a,0xb2,0xca,0x16, + 0x1,0x32,0x7,0x60,0xbe,0x6c,0xe8,0xd4,0x9a,0x6d,0xcc,0xc9,0x24,0x69,0xfc,0x22, + 0xdc,0x8f,0x7c,0xe,0x3a,0xc6,0x31,0x6e,0x5,0x9f,0xef,0x3c,0x6,0xbc,0xc9,0x60, + 0xc0,0x25,0x1a,0x10,0x97,0xe8,0xe7,0xd2,0xba,0x17,0x6d,0xc3,0x6,0x41,0x58,0xe5, + 0x95,0x95,0xa,0x80,0xc3,0x2,0x4a,0x2f,0xa,0x69,0xff,0x5,0x4a,0x43,0xda,0xf2, + 0xa2,0xe,0xc0,0x4f,0xe7,0xf3,0x87,0x4c,0xa6,0x21,0x25,0x2,0xa0,0xb8,0xc1,0x13, + 0x5,0x65,0x6f,0xff,0x20,0xeb,0x4d,0x68,0x58,0x7e,0x62,0x9d,0x1,0x5d,0x12,0x0, + 0xc,0xeb,0x5c,0xa6,0x21,0xb9,0xca,0xe8,0xe9,0x6c,0x42,0x7,0x60,0xbf,0x10,0x87, + 0x97,0x72,0x3,0xd0,0x59,0xc3,0xd9,0x27,0xc0,0x88,0x64,0x61,0x3e,0xd1,0x6,0xc1, + 0xca,0xd,0xc8,0x60,0xa1,0x83,0x86,0xe,0x35,0xa4,0x67,0x1d,0x8,0x65,0x97,0x23, + 0x80,0x1a,0x58,0x2e,0x64,0x5d,0xb0,0x5f,0x4c,0x7a,0x0,0xdc,0xd2,0xaa,0xd,0xac, + 0x6a,0xeb,0x36,0xb6,0x61,0xdb,0x76,0x5a,0xcf,0x45,0x83,0x6c,0xce,0x8a,0xf1,0x1b, + 0x88,0x5,0x73,0xd6,0x35,0x66,0xa2,0xc7,0x82,0xbd,0xc8,0xe8,0xfb,0x28,0x5a,0x1a, + 0x40,0x6e,0x4b,0xce,0x76,0x41,0xe,0xe5,0x3,0x4e,0x72,0x48,0xeb,0xab,0x4c,0x23, + 0x3,0xe7,0x60,0xb1,0x0,0x5e,0xb0,0x6b,0xfc,0xaf,0xfc,0x7c,0xec,0xe3,0x1,0xf0, + 0x48,0x15,0x5,0x7d,0x41,0xef,0x6c,0x64,0xe7,0xd0,0x6a,0xc5,0x1e,0x60,0xfd,0x81, + 0x11,0x2,0x80,0x11,0x7d,0x4b,0xf,0xbc,0x66,0x29,0x46,0x45,0xd4,0xdb,0xef,0xd5, + 0x3b,0x82,0xf5,0xe2,0xa6,0x30,0x45,0x34,0xf8,0xc0,0x77,0x9c,0x79,0xed,0x55,0x32, + 0x40,0x77,0xef,0x79,0x80,0x18,0x1,0x58,0xec,0xf0,0x11,0xc3,0xd9,0xcd,0xdc,0x48, + 0xeb,0xde,0xab,0x17,0x1b,0x37,0x69,0x32,0x1,0x16,0xce,0x5,0xce,0x23,0xae,0x4d, + 0x5a,0x4e,0x2e,0xd,0xac,0xc3,0x80,0x3,0x9b,0xec,0x74,0xfb,0x6d,0x6c,0xcc,0xb8, + 0xb1,0x2c,0x35,0x3d,0x8d,0x5a,0x64,0xca,0xd2,0xae,0xb1,0x38,0x81,0x49,0x91,0x51, + 0xde,0x9,0x14,0x15,0x91,0x13,0x34,0xbe,0x7,0x51,0xce,0x50,0x86,0x10,0xa1,0xbd, + 0x61,0xd3,0x46,0xf2,0xf7,0xc2,0xcf,0x8b,0x63,0x41,0x27,0xab,0x31,0x13,0x26,0xd0, + 0xb1,0x78,0x81,0x86,0x49,0x74,0xcf,0xc3,0xe0,0xc3,0xb1,0xa0,0xeb,0x15,0xc,0xa, + 0xa4,0xe1,0x75,0xee,0xda,0x95,0xfc,0xdc,0x8,0xd0,0x82,0x41,0x2,0x36,0x1d,0xf5, + 0x3b,0xc3,0xd4,0x8c,0xba,0x10,0x65,0x3,0xf7,0x7,0x4a,0x1b,0x22,0xd,0xc9,0x6, + 0xd4,0x0,0xc0,0x56,0x98,0x3e,0x60,0xf9,0x3a,0xb0,0xce,0xff,0x2f,0x85,0x1f,0xf, + 0x52,0xaa,0x28,0x35,0xe7,0xb2,0x7,0xc0,0x6d,0xda,0xdd,0xc0,0x9a,0x2c,0xe9,0x1e, + 0x0,0x60,0xac,0x13,0x2b,0xd6,0x0,0xb8,0xa9,0xce,0x8a,0x37,0x8,0x50,0x6,0x13, + 0xb6,0xa2,0xa6,0x75,0xf0,0xd5,0x5f,0xcb,0xfa,0xd2,0x4d,0xf5,0x75,0x8c,0x2d,0xc3, + 0xd9,0xb5,0xcb,0xfb,0xb0,0x6d,0xf7,0x6f,0xa7,0x72,0x94,0x3a,0xf3,0x8d,0x69,0xd2, + 0xb3,0xe,0xbc,0x9e,0x94,0xde,0x40,0x6,0xec,0xf9,0x9a,0xf3,0x74,0x1d,0x50,0x95, + 0xa,0xfe,0x5e,0x1d,0x74,0x8b,0x2d,0xd0,0x2d,0xd5,0xfc,0xbe,0xba,0x74,0x8a,0xd7, + 0x30,0xb2,0x70,0xde,0x31,0x77,0x82,0xf5,0x4a,0x86,0xab,0xae,0x6d,0x83,0xb9,0x5e, + 0x2f,0xc0,0x16,0xeb,0x3a,0x0,0x7b,0xaf,0xbd,0x1,0x10,0x6,0x0,0x3,0x47,0xda, + 0x5e,0x7f,0x3d,0xdb,0xd3,0xbe,0x25,0x1,0xec,0x67,0x1c,0x70,0x3f,0xbb,0xd3,0x7, + 0x62,0x1f,0x84,0xdb,0x59,0x72,0x74,0x3b,0x13,0x8c,0xad,0xb4,0x25,0x3,0x90,0x55, + 0x45,0x2d,0x9d,0x11,0xfb,0x0,0x8c,0xe5,0x4f,0xf8,0x40,0xfb,0xc3,0xed,0x1b,0xab, + 0xc8,0x7,0x7c,0x1,0x0,0xcc,0x7f,0xdf,0xc1,0x83,0x7,0xd8,0xaa,0xd5,0x29,0x82, + 0x1,0x9b,0x60,0x5b,0xaa,0x54,0x98,0x10,0xb7,0xc7,0x7a,0x2b,0x20,0x50,0x30,0xe0, + 0x8c,0xdc,0x2,0x5,0xc0,0x46,0x11,0x29,0xcb,0x1d,0x23,0x7d,0xc4,0xcf,0x73,0xbc, + 0xda,0xba,0x65,0xf3,0x49,0x5f,0x82,0x5e,0x30,0xef,0xc9,0xdc,0xdc,0x6c,0x2,0x60, + 0x4,0x6b,0x84,0x4a,0xc9,0x0,0xd2,0x58,0x5d,0x0,0x88,0xe5,0x36,0x2c,0x6b,0xf5, + 0xf7,0xe4,0xf6,0xfa,0xba,0x4,0x80,0xd6,0x62,0xc3,0x76,0xca,0x93,0x2e,0x4d,0x6b, + 0x4e,0x6d,0x58,0xf9,0xc8,0x55,0x3,0x3,0x76,0x35,0x1a,0xf7,0x4a,0xb8,0xf9,0x13, + 0x17,0x58,0x33,0x0,0x18,0xcd,0xe7,0xa5,0xf,0x98,0x6a,0x41,0xb,0x1f,0x2a,0x18, + 0x30,0x75,0x15,0xe2,0x37,0x28,0x26,0xa7,0xf9,0x1a,0x10,0x2f,0xd3,0x25,0x69,0x3b, + 0xa,0x9a,0x33,0x60,0x2,0x60,0x21,0x3d,0x1b,0x15,0xaa,0xb4,0x1,0xc6,0x81,0xc9, + 0xe,0x3d,0x7c,0x1,0x74,0x0,0x60,0x80,0x6d,0xc5,0xa6,0xcd,0x6c,0xd3,0x8e,0xfb, + 0xd9,0x96,0x9d,0xbb,0xd8,0xfa,0x2d,0x5b,0x59,0x61,0x59,0x5,0x1,0x35,0xfc,0xcc, + 0x68,0xf8,0x0,0x30,0xd4,0x7d,0xc1,0x60,0xc2,0x93,0x94,0xfc,0xec,0xd7,0x83,0x36, + 0x8a,0x71,0x88,0x20,0x2c,0xb0,0x36,0x30,0x74,0x19,0x84,0xb5,0x34,0xc9,0x21,0x43, + 0x6b,0x8c,0x57,0x7,0x5e,0x15,0xd8,0x25,0x2,0xc8,0xa6,0x6b,0x79,0xc0,0x3a,0x0, + 0xc7,0xeb,0xb1,0x8b,0xeb,0x2,0x43,0x9,0x0,0xc,0x57,0x87,0x4,0xc2,0xba,0xff, + 0x41,0xe0,0x5e,0x60,0x52,0x6f,0xc,0xef,0xbe,0x15,0xd6,0x73,0x5a,0xca,0xb4,0x60, + 0xab,0x3b,0x76,0xed,0x24,0x7f,0xef,0x8a,0x95,0x2b,0x49,0x4e,0xbe,0xf9,0x96,0x5b, + 0xd8,0x0,0xea,0x96,0x35,0x83,0xce,0xcb,0x3c,0x51,0x8e,0x13,0x2e,0x3,0xa8,0x16, + 0xe8,0xc1,0xc,0xe3,0x69,0x5d,0x56,0xe,0x6d,0xc3,0x35,0xef,0xd9,0xa7,0xf,0xeb, + 0xc9,0x1,0x3b,0x69,0xf5,0x6a,0xb6,0x7e,0xc3,0x6,0xba,0x3f,0xcd,0x52,0xab,0xe1, + 0x41,0x49,0x51,0x3e,0x6d,0x67,0x51,0x8b,0xb,0x66,0x44,0x34,0xce,0x13,0xfc,0x82, + 0xe8,0xcd,0x8a,0xc2,0x0,0xf0,0xdf,0xae,0x4e,0x5e,0xc3,0xee,0xee,0x7f,0x37,0x6b, + 0x7f,0xd3,0x4d,0x5e,0x7e,0x37,0x37,0x12,0xe4,0xb1,0xc0,0xa5,0x0,0xc3,0x61,0x6d, + 0x66,0x16,0xcb,0x29,0xc4,0xb1,0x14,0xd3,0x71,0xa1,0xe9,0x6,0xee,0x79,0x44,0xf5, + 0x77,0xeb,0xde,0x8d,0x2d,0x5f,0xb1,0x82,0xce,0xb,0x40,0x5d,0xba,0x83,0x1a,0xb4, + 0xe6,0x2a,0x76,0xe5,0xba,0xba,0x4,0x3,0x32,0x21,0x65,0x2,0x8,0x8,0x4c,0xc, + 0xa6,0x5b,0xe5,0x4,0x61,0xc8,0xd0,0x52,0x8a,0xe,0x2,0xef,0x6,0x91,0x7a,0xb3, + 0x99,0x7a,0xdc,0xe2,0x9a,0x7a,0x1d,0x97,0x2e,0x13,0x83,0xbf,0x99,0x3f,0xeb,0x4d, + 0x26,0xde,0xce,0x9a,0x56,0xdc,0xe3,0x81,0xae,0xcd,0x84,0x9,0x88,0xdd,0x8c,0x58, + 0xb2,0xe1,0x80,0x3f,0xd8,0x62,0xc3,0x26,0x8,0xf,0xa3,0xd1,0x4c,0x3,0xe0,0xab, + 0x36,0xd,0x63,0x37,0xcd,0xbd,0x9b,0x1d,0x3e,0x72,0x98,0xea,0x3d,0xd7,0x5d,0xa8, + 0x37,0x0,0x98,0x46,0xa3,0xf,0xba,0xf2,0xfa,0x7a,0xc6,0xeb,0x4b,0x2c,0xbf,0xa8, + 0x90,0x8e,0xad,0xb0,0xbc,0xca,0x2d,0xc3,0x5b,0xac,0x57,0x95,0xf0,0x14,0xeb,0x85, + 0x65,0x95,0x94,0x52,0x89,0xea,0x63,0x70,0x7,0x21,0xd8,0xca,0x7,0xde,0x7a,0x6b, + 0xbd,0xc1,0x7,0xde,0x46,0x37,0x8,0x13,0x38,0x6b,0x20,0xc,0xa0,0xab,0x28,0x2f, + 0x63,0x37,0xf1,0xe7,0x26,0xe3,0xfa,0x6b,0x15,0xf0,0x7a,0x20,0xec,0xd,0x80,0xaf, + 0x64,0xc4,0x9f,0x6b,0x81,0x59,0x5f,0x38,0xe4,0x68,0x1d,0x84,0xbf,0xb2,0x99,0xb1, + 0xce,0x8e,0x65,0x85,0x2d,0x31,0x48,0x8a,0xbe,0xb3,0x2d,0xdb,0xdf,0xb5,0x3,0xa9, + 0x6d,0xaf,0x63,0x8e,0xc2,0xef,0xe3,0xcb,0xad,0xdb,0xb6,0xb1,0x75,0xe9,0x59,0x1e, + 0xeb,0xc5,0xfd,0x62,0xb0,0x5e,0xdf,0xe7,0x5b,0x62,0xdd,0x7f,0x41,0x95,0xc1,0x7, + 0x67,0x0,0x30,0x9e,0x75,0x9d,0x1,0xbb,0x2,0x45,0xf1,0x3e,0x9e,0x8d,0x93,0xcf, + 0x9f,0x64,0x9b,0x37,0x6f,0xf4,0xa3,0xa0,0x17,0x2e,0x9c,0xff,0x44,0x36,0xb7,0x92, + 0xf1,0xe0,0xc2,0x7a,0xe,0x63,0xaf,0x4e,0x70,0x8d,0xd5,0x5d,0x11,0xa3,0x8d,0x2, + 0xe5,0x30,0x76,0xac,0x3f,0xc0,0xfa,0xc1,0x81,0xf5,0x22,0x70,0x40,0xa6,0x21,0xd9, + 0x0,0xec,0x8a,0x32,0x5,0x0,0x23,0xfd,0x42,0x2,0x30,0x40,0x73,0xa2,0x6a,0xc6, + 0xb0,0xd4,0xe8,0x5e,0x4,0xc9,0x16,0x6c,0x60,0xc9,0xca,0x24,0x62,0x96,0x98,0xb0, + 0xcc,0xfc,0x5f,0x1f,0x90,0x7d,0x0,0x76,0x37,0x70,0xd0,0xeb,0x42,0x63,0xb2,0xce, + 0x2f,0x29,0xa3,0x82,0xf1,0x2b,0xa9,0x5a,0x4d,0x21,0xbf,0xf0,0x3e,0x3,0xae,0xd8, + 0xb8,0x99,0xe5,0x97,0x96,0xd1,0xc4,0x88,0xef,0x99,0xb5,0x60,0xa1,0x2,0x60,0xb0, + 0x5e,0x80,0xef,0x58,0xbe,0x2e,0x27,0x52,0xd7,0x77,0xe9,0xa5,0x28,0x1,0xc0,0x54, + 0x88,0x23,0xc9,0x4c,0x39,0x5a,0xaa,0x49,0xcd,0x78,0x5f,0x2,0x2f,0x64,0xef,0x5, + 0x9a,0xf,0x59,0x32,0xe0,0x25,0x92,0x1,0xa3,0x14,0xa5,0x48,0x43,0xd2,0x23,0xcd, + 0x9d,0xe9,0x3d,0xb2,0x1b,0x8,0xbf,0xf9,0x91,0x5f,0x8a,0x28,0x62,0x5c,0x2f,0x29, + 0x79,0x49,0xe3,0xcb,0x74,0x39,0xc4,0x82,0x29,0x6a,0xf1,0x98,0xb0,0x83,0xd,0x7, + 0x82,0xb1,0xac,0x5a,0xd3,0x90,0x69,0x61,0xbc,0xed,0x3f,0x78,0x90,0x6d,0xd9,0xb6, + 0x95,0x15,0x95,0x14,0xb3,0xd9,0x73,0xe7,0xb0,0x3b,0xba,0x74,0xa6,0x5a,0xd7,0xa8, + 0x7c,0x46,0xd5,0xc6,0xf8,0xf9,0xc7,0xf9,0x58,0x42,0xe0,0x9b,0x42,0xb2,0x33,0x8c, + 0x28,0x80,0x16,0xae,0x1d,0xae,0x13,0x64,0x5c,0xec,0x83,0xaa,0x62,0xb7,0x74,0xbc, + 0x95,0x2d,0x5e,0xb2,0x84,0x40,0xb,0xc6,0x86,0x2c,0xd4,0x61,0xfb,0x7d,0x63,0x96, + 0xaf,0x34,0xac,0x3e,0x7a,0x20,0xa0,0xcc,0xee,0x7b,0xcc,0xd7,0xe1,0xbb,0x86,0x81, + 0x83,0x6,0x4,0x5b,0xc9,0x77,0x5d,0xca,0x16,0x2c,0x5c,0x48,0x81,0x56,0x1d,0x6e, + 0xbd,0x85,0xd,0x19,0x3e,0x9c,0x4d,0x99,0x39,0x93,0xee,0x19,0x5c,0x57,0x92,0xd1, + 0x39,0xf8,0xe2,0x1e,0x44,0xab,0x49,0x1c,0x87,0x67,0x4c,0x64,0xd3,0x3d,0x9,0x75, + 0x6,0xfe,0xe0,0x5b,0x3b,0x75,0xa4,0xc8,0xf5,0xe2,0xd2,0x52,0x32,0x52,0xf0,0x3d, + 0x31,0x47,0x2d,0x77,0x57,0xf9,0xd8,0xb0,0xc0,0x4d,0x9,0xe2,0xb8,0x7,0x52,0xd3, + 0x33,0xc8,0x17,0x89,0x9,0xad,0x48,0x3,0x5e,0x5a,0x17,0xaf,0xd,0xd0,0xd5,0x5f, + 0xdb,0x0,0x5c,0xe1,0x1,0x30,0x8c,0x5b,0xcc,0x65,0x70,0x85,0x0,0x80,0x91,0x22, + 0xd2,0xb5,0x73,0x17,0xd6,0xa4,0x4f,0x5b,0xd6,0xb4,0x64,0x88,0x7,0xbc,0x15,0x2, + 0x80,0x39,0x20,0xfb,0x4c,0xd8,0x67,0xc3,0x2e,0x10,0xd6,0x87,0xe,0xc6,0x3a,0x23, + 0xb6,0xfd,0xc5,0x4d,0x35,0x79,0xba,0x49,0xc9,0x40,0x36,0x60,0xee,0x28,0xf6,0x32, + 0x37,0x92,0x10,0xfd,0x6c,0x2,0x6f,0xbd,0xcf,0x82,0x65,0x5c,0x80,0x8,0x1c,0x3d, + 0x7a,0xfc,0x28,0xc9,0xea,0xa8,0xb8,0x64,0x33,0x32,0x9d,0xe5,0xfa,0x60,0xa1,0x19, + 0x24,0x90,0x58,0x91,0x2a,0xc3,0xef,0xd5,0x25,0xcb,0x57,0x52,0xee,0x7a,0xc,0x1d, + 0xa2,0x10,0x7d,0xad,0x49,0xcb,0x86,0x11,0xd8,0xa0,0x81,0xb1,0x18,0x31,0x72,0x1, + 0xd6,0x5b,0x2c,0xd8,0x7,0x64,0x2c,0xc1,0x80,0xef,0xe7,0x9f,0x8f,0x3a,0xf3,0xf7, + 0x5d,0x77,0x35,0x7b,0xbb,0x4b,0x5b,0xf,0x78,0x1,0xc2,0xda,0xf0,0xd8,0x70,0x3b, + 0x4d,0x8e,0x16,0xcb,0x3b,0x4d,0x56,0x6c,0x33,0x61,0xd7,0xb0,0x81,0x58,0xb2,0xe0, + 0x2f,0x3b,0xdf,0xc0,0x4a,0x7,0xf5,0x65,0xa7,0x10,0x58,0x6,0x2,0x0,0x1f,0x2c, + 0x3f,0x97,0x39,0xb9,0x79,0x2c,0x2b,0xaf,0x90,0x0,0xb8,0x44,0x9e,0x3b,0x3d,0xe0, + 0xca,0x76,0x85,0x38,0x8c,0x1c,0xc3,0xe0,0xe3,0x9f,0x83,0xd4,0x2f,0xcc,0x1f,0xca, + 0x7,0xac,0x19,0xa1,0xfa,0x1c,0x85,0x39,0x10,0xf7,0xfe,0x73,0x7c,0xce,0xd9,0xb4, + 0x69,0x83,0x91,0x7,0xbc,0x37,0x23,0x23,0x9d,0xa2,0x3e,0x91,0x7a,0x11,0xf,0x3c, + 0x13,0x1,0x58,0xc5,0x88,0x2d,0xa0,0xd6,0x81,0x57,0xbe,0x6f,0x30,0x68,0x8b,0x45, + 0xdb,0xf2,0xb5,0xcd,0x80,0xf1,0x7b,0x21,0xa5,0xbc,0xa1,0x31,0x60,0x5d,0x82,0x56, + 0xac,0x43,0xcb,0x1d,0x2e,0x2e,0x15,0x0,0xdc,0x41,0x63,0xc0,0x56,0x33,0x86,0xb9, + 0xa2,0x95,0x1f,0x0,0xc,0x40,0xe5,0x1,0xb1,0xd7,0xd7,0x57,0x49,0xd3,0x2,0xcc, + 0xc0,0x1e,0xc1,0x30,0x1,0x4c,0x3a,0xd0,0xea,0x35,0x9a,0xf5,0x7c,0x60,0xb0,0xe0, + 0xf4,0x9c,0x3c,0x3e,0x61,0xac,0x67,0xc9,0xe9,0x99,0x2c,0x39,0x2d,0x83,0x26,0xbf, + 0xa2,0xa,0x4,0xa3,0x54,0x11,0xfb,0xcd,0xcc,0x2f,0xa0,0x7e,0xc3,0xf8,0x2e,0xc8, + 0xcc,0x48,0x57,0x92,0x0,0x3c,0x6e,0xf2,0x54,0x92,0x10,0x3,0x5d,0x9b,0xb4,0x72, + 0x94,0x7a,0x1d,0x6b,0x4,0xd7,0xd8,0x69,0x48,0x3a,0xf0,0xe2,0xf8,0xa5,0x24,0x49, + 0x6d,0xa,0x17,0x7,0xd3,0xa8,0xe6,0x52,0x37,0xa4,0x24,0x4a,0x91,0xc2,0x71,0xca, + 0x3c,0x60,0x55,0x52,0xf2,0xa2,0x1b,0x7c,0xf5,0x6e,0x3b,0x0,0x23,0x34,0x63,0x0, + 0x50,0xc8,0xa2,0x10,0xbe,0xff,0x37,0x7e,0xd4,0x7d,0x94,0x1c,0xad,0xc7,0x8,0xb8, + 0x18,0xa7,0xce,0x7e,0xf1,0x3e,0x94,0x1e,0x30,0x3a,0xb4,0xb2,0x44,0x7e,0x6f,0x76, + 0x6e,0xe,0x1b,0x37,0x7e,0x1c,0x81,0x67,0xd7,0xbb,0xee,0x32,0x64,0x5a,0x5c,0x2f, + 0x5c,0x6b,0xd9,0x4b,0x19,0x1,0x73,0x90,0x9d,0xd7,0x66,0x64,0xd2,0x3a,0xf5,0x7c, + 0xe6,0xd7,0x9,0xe7,0x18,0xa9,0x6c,0xed,0x38,0xdb,0x5c,0xb0,0x70,0x1,0x1,0xf0, + 0x13,0x9c,0xed,0xd4,0xc4,0x6a,0x3,0x0,0x15,0xe5,0x27,0xd,0xeb,0x30,0xe6,0x2c, + 0x78,0xc1,0x97,0x67,0xab,0xcf,0x93,0x71,0x3,0x7f,0xde,0xa6,0x2d,0xbe,0xef,0x1a, + 0xe0,0x79,0x7b,0xe7,0xce,0x54,0x65,0x6d,0xfa,0x1c,0xaf,0x6c,0x29,0x19,0x12,0xe8, + 0x7d,0xcd,0x7f,0x33,0xd4,0x97,0x94,0x74,0xef,0x18,0xbc,0x65,0x26,0xb1,0xdf,0xc5, + 0x2b,0x56,0x91,0xd1,0x31,0x7a,0xfc,0x78,0x6e,0xa4,0xde,0x44,0xbe,0x63,0x4,0xa3, + 0xa1,0x8,0x9,0x52,0x92,0x62,0x51,0xf2,0x73,0xa3,0x1b,0x70,0xed,0x34,0x43,0xac, + 0xe3,0xde,0xc8,0xc9,0xcb,0xa3,0x28,0x52,0xc5,0x7c,0x2b,0x4c,0x90,0x55,0xcb,0x72, + 0xc1,0x7e,0x2b,0x3c,0xa0,0xd5,0x41,0x59,0xdf,0x17,0x40,0x94,0xce,0x19,0x9,0xfc, + 0xde,0x94,0x96,0xc8,0x7,0xce,0x4b,0xbf,0xbe,0xfd,0x58,0xf3,0x9b,0xdb,0x28,0x3f, + 0x30,0x1,0xaf,0x1a,0x26,0xb,0xa6,0x14,0x25,0x6d,0x4,0x22,0xa6,0x69,0xc,0xd, + 0x4a,0xd2,0x56,0x51,0xf,0x7d,0xc0,0xf,0xdc,0x64,0x4d,0x2f,0xb6,0x62,0xdd,0x6a, + 0xef,0x1e,0xd4,0xe4,0x65,0xbf,0xc2,0x60,0xbd,0xda,0x6,0xe3,0x1,0xf7,0x34,0x5c, + 0x22,0x6b,0xf8,0x35,0x41,0x8e,0xae,0xc,0x54,0x53,0xc7,0x8c,0xe3,0xd,0xf8,0x24, + 0x37,0xa8,0x20,0xa2,0x52,0x91,0x5e,0x3,0x55,0x63,0xd5,0x9a,0x35,0x94,0x8e,0x5, + 0xc9,0xb9,0x91,0xa2,0xd6,0xeb,0x43,0x46,0x83,0x2,0x5a,0xe3,0x1e,0x94,0xcc,0x58, + 0x3,0x65,0x25,0x43,0x8b,0x81,0x68,0xe3,0xc7,0xf8,0x3d,0x82,0x38,0x88,0x5b,0x5b, + 0x5c,0x47,0x7e,0x60,0x80,0xed,0xa7,0x42,0x86,0x26,0x0,0xbe,0xd3,0x63,0xc4,0x9f, + 0xeb,0xfe,0xe1,0x80,0x34,0xed,0xe,0xd2,0xa,0x44,0x4f,0x5b,0xcc,0x58,0xe6,0x14, + 0xc3,0x7,0x5c,0xd7,0xb1,0x35,0xcb,0x5f,0xec,0x95,0xfd,0xbc,0xc0,0xcf,0xe7,0x45, + 0xe4,0xc1,0xf3,0xe7,0x64,0x15,0x9f,0xf7,0x8a,0xca,0x2a,0xd,0xf6,0x2b,0x7d,0xbd, + 0x7e,0x9c,0x81,0x1e,0x6b,0x60,0x1,0x6f,0x85,0xe6,0xe,0x11,0x2c,0x18,0xbd,0x95, + 0xa1,0x38,0x49,0x9,0x3a,0x2c,0xf6,0x81,0xd2,0xc6,0x38,0xbe,0x3d,0xfb,0xdc,0x9, + 0xb6,0x61,0x43,0xd5,0x1e,0x5,0xc0,0xcb,0x97,0x2d,0xad,0x5c,0xbb,0x36,0x85,0x1e, + 0x30,0x48,0x13,0x36,0xa0,0x92,0xcc,0x1c,0x2,0xa8,0xc6,0x3e,0x1a,0xa0,0xd6,0x3a, + 0xde,0xd3,0x25,0xeb,0x5a,0xc7,0x67,0xd4,0x45,0x6c,0xb,0x4c,0x4e,0x48,0xfe,0x46, + 0x81,0xed,0xda,0x6a,0x9a,0xd8,0xdf,0x78,0xfb,0xcd,0x60,0xfe,0xaf,0x23,0xd7,0x54, + 0x32,0x60,0x8a,0x82,0xb6,0x0,0x58,0x7,0xb0,0xb9,0x56,0x21,0xd,0x0,0x11,0x80, + 0xb,0xc,0x8,0x32,0x24,0x80,0x79,0xb1,0xc,0xd6,0xe2,0x17,0x15,0xd2,0x9e,0xec, + 0x86,0x64,0x54,0xc1,0x5a,0x64,0x76,0x46,0x92,0xe9,0x42,0xf8,0xdf,0xbc,0x92,0x52, + 0x6e,0x9d,0x6e,0x24,0x36,0xb5,0x9a,0x4f,0x86,0x6b,0x33,0xb3,0x69,0x1d,0x2c,0x4, + 0x93,0x23,0x26,0x4a,0xec,0x3f,0x8d,0xb3,0x52,0xf8,0xa9,0x1,0xc0,0xf8,0xad,0xc4, + 0x7c,0xb5,0xd2,0x93,0x73,0xad,0x32,0x97,0xf3,0x2d,0xc0,0x97,0x51,0xda,0x0,0x5c, + 0x1c,0xc3,0x12,0x91,0x36,0x35,0x75,0xe6,0x6c,0x5,0xe4,0x0,0x99,0x79,0x46,0x2b, + 0x43,0xab,0x3f,0x30,0x3e,0x87,0xff,0x2f,0x24,0xe8,0x7b,0x44,0x37,0x24,0x44,0x41, + 0xcb,0xa6,0xa,0xf5,0x21,0xb9,0xa9,0xd2,0xf,0x8c,0xfd,0x50,0x0,0x62,0x35,0x9f, + 0x8,0xa8,0xe3,0xd6,0x85,0xc6,0xc8,0x80,0x3d,0x9b,0x41,0x5,0x5c,0x13,0xda,0x64, + 0x5f,0x17,0x21,0xf1,0x6,0x7a,0x52,0xf3,0x7d,0xe1,0x97,0x7d,0xe2,0xe8,0x11,0xca, + 0xef,0x85,0x74,0x84,0x48,0xdf,0xc1,0x43,0x86,0x90,0x8f,0xb4,0x77,0xbf,0x7e,0xd4, + 0xb8,0x62,0xe6,0xbc,0x79,0x4a,0xa6,0x85,0x12,0x2,0x60,0x4a,0x26,0xa0,0xca,0xa0, + 0x28,0x75,0x34,0xe0,0xc0,0x79,0xc5,0x75,0x5c,0x20,0x22,0x88,0x11,0x1d,0x8d,0x9c, + 0xe9,0x1b,0xdb,0xb5,0x25,0x6,0xc,0x5f,0x32,0xfc,0xca,0x35,0xfa,0xfd,0x6b,0x45, + 0x7,0xd7,0x87,0x44,0xa,0x7,0x8e,0xe7,0x82,0xfb,0x58,0xa0,0x58,0x1d,0xe1,0xf7, + 0xff,0xee,0x7,0xf7,0x50,0x9,0xc2,0x34,0xce,0x94,0x86,0x8d,0x18,0x4e,0xea,0xe, + 0xf9,0xae,0x27,0x4f,0x36,0xc,0x89,0x65,0x64,0x48,0xac,0xa5,0x63,0x48,0x21,0xe3, + 0x2f,0x9d,0x8e,0x4d,0x46,0xe7,0xcb,0x63,0x41,0x8a,0xdc,0xb0,0x91,0xf7,0xb2,0x1b, + 0xda,0xb6,0x65,0xb3,0x66,0xcf,0x26,0x39,0x1b,0x6,0x3a,0x1,0x70,0x2,0x95,0xeb, + 0x12,0x89,0xf,0xc1,0x84,0x4,0x66,0x9d,0x9a,0x95,0xab,0x26,0x3c,0x29,0x33,0x4b, + 0xc0,0x55,0xb2,0xb3,0x5,0xbc,0xce,0xf7,0x5,0x30,0x21,0x17,0x38,0x93,0x3f,0x47, + 0x4,0xf2,0x1c,0xc8,0x4e,0xbd,0xf8,0x3c,0xbb,0x6f,0xd4,0x7d,0xec,0x26,0xc8,0xd0, + 0xe3,0x6e,0x63,0x4d,0xcb,0x3c,0xe0,0x6d,0x56,0x31,0xd4,0x7,0x60,0xb,0x88,0x5d, + 0x41,0x5a,0x81,0x40,0x2d,0x51,0xcc,0xa3,0xa9,0x23,0x87,0xb8,0xa9,0xe5,0x2b,0x46, + 0x7,0xa6,0x36,0x53,0x7b,0xb0,0xbd,0x7b,0xf7,0xd2,0x6f,0xd2,0x59,0xaf,0xb1,0x6c, + 0xf4,0xfc,0xbd,0x30,0x10,0x2b,0xd6,0x57,0x92,0xbf,0x17,0x91,0xdd,0xc1,0xca,0x60, + 0x1b,0x14,0x0,0x17,0x57,0x56,0x29,0xe0,0xf5,0x0,0x19,0x4a,0xc0,0x46,0xda,0x8e, + 0xb2,0x9c,0xe9,0x59,0x99,0x24,0x7b,0x5e,0x42,0xed,0xe9,0xb,0xf5,0xc1,0xa1,0x45, + 0x38,0x1b,0x40,0xdb,0x68,0x32,0x5f,0x17,0x8,0x2b,0x20,0xe6,0xe7,0x1a,0xb9,0xc0, + 0xa7,0x5f,0x7e,0x89,0x8d,0x19,0x3d,0x9a,0xee,0xbf,0x94,0x36,0xcd,0xd9,0x47,0x5d, + 0xdb,0x11,0x0,0x7f,0x7a,0x67,0x7b,0xb1,0x6c,0x27,0x0,0x59,0x30,0x63,0x5,0xc6, + 0xed,0xac,0x88,0x69,0x9f,0x1d,0x13,0xe8,0x76,0x33,0xc1,0xf7,0xcb,0x8,0x46,0xfc, + 0xcd,0x9d,0x6d,0xd9,0xae,0xdb,0xda,0x51,0xf3,0x17,0x44,0x40,0x93,0x71,0xc0,0x97, + 0xc7,0xf8,0x73,0xb2,0x7c,0xd5,0x6a,0xcd,0xef,0xab,0x9d,0x43,0x69,0xcc,0x18,0x20, + 0x6c,0x31,0xdf,0xa,0x33,0x10,0x10,0xdb,0x11,0xd0,0x96,0x9c,0x9a,0xc1,0xf6,0x72, + 0x43,0x3e,0xc,0x80,0x25,0x69,0xc0,0xfb,0x50,0x90,0x9e,0x7e,0xe6,0x29,0x56,0x55, + 0xb5,0xbe,0x42,0x1,0xf0,0xaa,0x55,0x2b,0xd3,0x93,0x92,0x56,0x52,0xa4,0x23,0x7c, + 0x48,0x92,0x75,0xea,0x80,0x1b,0x8f,0xdd,0xd6,0x3a,0x80,0xd8,0xc5,0x74,0x3,0x3e, + 0x63,0xc7,0x7b,0xc6,0x67,0xd7,0x9b,0x9f,0xa5,0x1f,0x98,0x4,0x59,0x0,0xb0,0x9e, + 0x86,0xa4,0xba,0x87,0x68,0xed,0xeb,0xe4,0xc4,0x7,0xd6,0x5c,0x58,0x54,0xe4,0xf6, + 0x1,0xb,0x70,0x9c,0x6b,0x35,0xa8,0x37,0x9a,0x29,0x88,0x54,0xa2,0x15,0x2,0x88, + 0xb1,0xf,0x26,0xb8,0x49,0x22,0x35,0x45,0x7,0xec,0x79,0x21,0x7d,0x85,0x65,0x89, + 0x48,0x0,0x21,0x98,0x2f,0x24,0xe7,0x9c,0x22,0x2f,0xe8,0xa,0xcc,0x4,0x13,0xfe, + 0x42,0x3e,0xf1,0xe3,0x73,0x20,0xf9,0x22,0xa,0x1a,0x51,0xc8,0xb3,0xe6,0x2f,0x24, + 0x29,0x1c,0xf2,0xa0,0xea,0xd7,0xab,0xa5,0x3d,0xd9,0x45,0x3f,0x24,0x10,0x3,0x44, + 0x60,0x38,0x60,0x9,0xf0,0x9e,0x21,0x24,0x69,0xf5,0x3b,0x8d,0x66,0xe,0x3e,0x73, + 0x96,0xe7,0x42,0xee,0x3,0x0,0x9e,0xa9,0xa2,0xa0,0x6f,0x23,0xb9,0xd6,0xa8,0x38, + 0xe6,0xa8,0x71,0xac,0x8f,0x9d,0xbb,0x76,0x52,0xb1,0xa,0x44,0xd3,0x4a,0x9f,0x65, + 0xdc,0xc0,0xbc,0x4,0x98,0x71,0xcc,0xd9,0x39,0xab,0x3e,0x10,0x3d,0xc,0x20,0x44, + 0xc4,0xfc,0xc3,0xdc,0xd0,0xdc,0x7e,0xff,0xfd,0x94,0xbb,0x7,0x46,0xde,0xa3,0x67, + 0xf,0xd6,0xe1,0xd6,0x5b,0xa9,0x4d,0x23,0x64,0x78,0x29,0xd3,0xc2,0x60,0x59,0x4e, + 0x32,0x6d,0xaa,0x0,0xac,0xc,0x5a,0x87,0x74,0xb,0xb0,0xc2,0xf5,0x86,0x64,0x3f, + 0x95,0x8a,0xa6,0x4c,0xa3,0x28,0x69,0xe4,0x7,0xdf,0xc4,0xd,0x3b,0x4,0x2e,0x6d, + 0xdb,0xb1,0x83,0xd4,0x99,0x5a,0x1b,0x80,0xad,0x4a,0x6f,0x75,0x71,0xca,0xb1,0xba, + 0x98,0x7c,0x9d,0x96,0xab,0x8c,0x14,0x23,0xf2,0x5d,0xaf,0x5a,0xc9,0x7a,0xf5,0xe9, + 0x4d,0x40,0xd3,0x7f,0xd0,0x20,0x32,0x8,0x70,0xbd,0xe4,0x3d,0x0,0xd5,0x3,0xaa, + 0x8a,0x3c,0x16,0x4,0x5f,0x91,0x41,0xc9,0x19,0x2f,0xae,0xf3,0xc,0x71,0x2c,0x93, + 0xb8,0xb1,0x37,0x7a,0xfc,0x4,0xf2,0x67,0xdf,0xd0,0xf6,0x46,0xf2,0x89,0x6f,0xd9, + 0xb6,0x8d,0x3f,0x67,0xc7,0x3d,0x9,0x3a,0xa2,0xc2,0x5d,0x68,0x0,0x65,0x8,0x0, + 0x57,0x56,0x55,0x11,0x83,0x90,0xb2,0xb3,0x31,0x14,0xeb,0xc5,0xfa,0x7a,0x1f,0x74, + 0xcb,0xab,0x7c,0x30,0xd6,0x41,0x58,0xca,0xd0,0xd4,0xbb,0x36,0x95,0x5c,0x1d,0xb8, + 0x37,0x31,0x37,0x2d,0x58,0xb4,0x90,0x75,0xef,0xd6,0x9d,0x5d,0xd5,0xb1,0x15,0xbb, + 0x2a,0xfd,0x6e,0xf,0x70,0xcb,0x25,0x8,0xf,0xa5,0x65,0x33,0x25,0x4b,0xf,0xd, + 0xc8,0xd2,0x41,0x56,0x2c,0x87,0x6,0xc2,0x96,0xaf,0x58,0x55,0xd8,0x82,0xfc,0x9c, + 0xd2,0x93,0x8d,0x9a,0x3d,0x89,0x9d,0xe5,0xc0,0x4a,0xc1,0x57,0x16,0xeb,0xd5,0x99, + 0xef,0x33,0x9c,0x21,0xa1,0xa4,0x24,0xc,0xa4,0x22,0x5,0xb2,0x52,0x21,0xa8,0xd2, + 0x7c,0xe4,0x12,0x20,0xaa,0x7c,0xe0,0x15,0xa9,0x34,0x5,0xa5,0xfc,0x7e,0xe0,0xcf, + 0x2b,0xee,0x8b,0x73,0xd5,0xe7,0x88,0x9d,0x86,0x83,0x2f,0xee,0xb1,0x98,0x58,0xba, + 0x80,0x37,0x66,0x6e,0x97,0xb2,0x34,0x5c,0x9,0xe2,0xb5,0x64,0xc1,0x0,0xe1,0x55, + 0x2b,0x57,0x50,0x2a,0x5b,0xd7,0x6b,0xaf,0x61,0xa7,0x3b,0x5d,0x4f,0x20,0xfb,0x89, + 0x6,0xbe,0x1,0x20,0x96,0xbe,0x61,0x19,0x29,0x7d,0x57,0x3b,0x2b,0x77,0x58,0x97, + 0xaa,0xdb,0x5,0x7d,0xc5,0x7a,0x1a,0x13,0x1f,0x17,0x3a,0xb5,0x66,0x69,0x63,0xee, + 0x65,0xa7,0x5f,0x7b,0x95,0xd2,0xa3,0xf0,0xbb,0x50,0xa5,0xb,0x6,0xd,0xfc,0xbf, + 0xd1,0xe0,0xeb,0xdf,0x47,0xb6,0x61,0x67,0xb0,0x60,0x15,0x79,0xbf,0x89,0x1b,0xb0, + 0xa9,0xaa,0xba,0x9f,0x8b,0x34,0x28,0x9,0x9a,0xcf,0x95,0xc8,0x8a,0x38,0x76,0xec, + 0x8,0xab,0xac,0xac,0x48,0x53,0x0,0xbc,0x66,0xcd,0xea,0x25,0xcb,0x97,0x2f,0x65, + 0xfb,0xf6,0xef,0x23,0x9f,0xaa,0xc1,0x54,0x63,0xe,0x40,0x75,0x81,0xa7,0x18,0x35, + 0xae,0xed,0xe,0x86,0x2b,0x97,0x78,0xa0,0x6d,0xd0,0xb6,0x1,0xda,0x6,0x7f,0x3d, + 0x99,0x1f,0x80,0xa,0x96,0x21,0xfb,0xce,0xea,0xc1,0x40,0xf5,0x6,0x8,0x7b,0x93, + 0x32,0x42,0xc1,0x8b,0x4b,0x8a,0x9,0x80,0x21,0x15,0xa2,0x81,0x82,0x4,0x60,0xd9, + 0x88,0x9e,0x64,0x58,0x4d,0xc2,0x9d,0xa7,0x15,0xb9,0x90,0x12,0xad,0xcc,0x19,0x5e, + 0x22,0x22,0xa6,0xe7,0xcb,0xa6,0x5,0x4b,0xcc,0x20,0x2c,0x1d,0x20,0xe7,0x59,0x25, + 0x22,0xb1,0x3f,0x26,0x72,0x44,0x9e,0x16,0x95,0x57,0x90,0xfc,0xc,0x20,0x6,0x3, + 0x86,0xdc,0xb9,0x4c,0xab,0xc8,0x25,0x19,0x8a,0xca,0xef,0xd5,0xd,0x4,0xd5,0xee, + 0x70,0xa9,0x25,0x4b,0xfb,0x4c,0x78,0xe1,0x32,0x6f,0x2,0x6,0xb0,0x23,0xd0,0x4c, + 0x1d,0xe7,0x62,0xff,0xb7,0xd8,0xbe,0x6a,0x5b,0xca,0xc6,0xf7,0xa3,0x38,0x8,0x2a, + 0x71,0xc9,0x20,0xac,0x46,0xad,0xca,0x98,0x11,0xe4,0xa4,0x47,0x9f,0x8b,0x42,0xd, + 0x98,0xc,0xe0,0x9b,0x94,0x80,0x54,0xa7,0x55,0x40,0xab,0x4d,0xd4,0xd5,0xe1,0x48, + 0x53,0xf3,0x41,0xb8,0xc1,0x0,0x63,0x99,0x3f,0x8c,0xef,0x3e,0xc7,0x99,0x1b,0x64, + 0x5a,0x2f,0x2d,0x67,0xb,0xa5,0xe5,0xa0,0x2e,0xf5,0x6d,0x9c,0xc9,0xdf,0xd6,0xb9, + 0x33,0x1b,0xc9,0xad,0x76,0xc3,0xdf,0xb,0x99,0x16,0xfe,0x5e,0x2,0xdf,0xc,0x9f, + 0x29,0xf2,0x73,0x48,0x2c,0x91,0x83,0x34,0xc0,0xa,0x6d,0x28,0x51,0xba,0x14,0xb9, + 0xc0,0x68,0xeb,0x88,0xe8,0xfa,0x1e,0xbd,0x7a,0x52,0x5e,0xe0,0xde,0x7d,0xf,0x11, + 0xe0,0x1b,0x79,0xec,0x86,0x9c,0x5e,0xef,0xf6,0x6f,0xbb,0xf2,0x9a,0xb5,0x73,0xea, + 0x97,0x94,0x7c,0x98,0x1a,0xda,0x43,0xd1,0x81,0x31,0x84,0x2,0x21,0xc8,0x55,0x6, + 0x73,0xc5,0x6f,0xa3,0xfc,0xde,0x80,0x21,0x91,0x41,0x3,0xbe,0xdf,0x15,0x54,0x64, + 0x65,0x5,0x19,0x12,0xd3,0xb8,0x91,0x37,0x61,0xca,0x54,0x92,0x9d,0x47,0x8c,0x1a, + 0xc5,0x6,0xc,0x1e,0xcc,0x9f,0x8f,0xf6,0xe4,0xf,0xc7,0xb9,0x42,0x44,0x35,0xbe, + 0x33,0x4c,0x9d,0xb0,0xd,0x26,0xd7,0x7b,0xea,0xba,0x8a,0xf7,0x30,0x21,0xc1,0x78, + 0x58,0xbd,0x2e,0x5d,0x93,0x55,0xa5,0xcc,0xe7,0x60,0xb7,0x12,0x84,0xcb,0xfd,0x6d, + 0xc5,0x36,0x68,0xd3,0x4,0xba,0x91,0x65,0xe4,0x15,0x90,0x6b,0xc1,0x4b,0x81,0xbb, + 0xc4,0x36,0x6e,0xd9,0xc4,0x6,0xe,0x1a,0xc8,0xda,0xb7,0x6f,0xcf,0x9a,0xdc,0x7b, + 0x2b,0x6b,0x6,0x5f,0x30,0x80,0xb6,0xfc,0x1e,0x7f,0x8,0x26,0xac,0x40,0xd9,0x8e, + 0x98,0x16,0x39,0xc4,0xb6,0x2c,0x1d,0x18,0x55,0x26,0x0,0x37,0x29,0x1b,0xcc,0x5a, + 0x8c,0xea,0xcc,0x76,0x88,0x82,0xfd,0xa4,0xdc,0x58,0x43,0xe6,0xfd,0x1e,0x7a,0xf4, + 0x10,0xa5,0x18,0xa5,0xe5,0xe4,0x7b,0xbd,0x8d,0xe9,0x78,0xaa,0xc,0xf0,0x5,0xd0, + 0x4a,0xd0,0xf0,0xd8,0x5c,0x95,0x37,0x4,0xf3,0xcd,0xca,0x2f,0xe4,0x4c,0x2f,0x89, + 0xed,0xd9,0xbb,0x87,0x1f,0x7f,0x3,0xbb,0x88,0x8a,0x5b,0x1a,0xc8,0x62,0x5b,0x23, + 0x2d,0xeb,0x69,0x29,0x81,0xd8,0x3,0x59,0x9,0xbc,0x3e,0xb8,0xc6,0xb4,0x75,0xf9, + 0x5a,0x82,0xaf,0xc,0xc0,0xaa,0xd7,0x64,0xe8,0x1d,0x3b,0xb6,0xb3,0xc1,0xdc,0x0, + 0xc4,0xfc,0xba,0xac,0xd5,0x35,0xec,0xdd,0x2e,0x6d,0x15,0xb,0x96,0x40,0xfc,0x89, + 0x6,0xc0,0x9f,0x6a,0x7e,0x62,0x5b,0x9a,0xd6,0x81,0x39,0xac,0x98,0x87,0xe,0xc6, + 0x5f,0x76,0xbd,0x91,0xad,0xef,0xd8,0x96,0x6d,0xde,0xbc,0xc9,0xeb,0x59,0xdc,0xe8, + 0x49,0xd0,0xaf,0xbe,0xfa,0xa,0x4b,0xe2,0xf7,0x7b,0x1,0xea,0x8e,0xeb,0x60,0xab, + 0x81,0xb0,0xee,0x2,0x9,0xc4,0x1b,0x18,0xf7,0x67,0x95,0x91,0xfa,0x6,0x95,0x41, + 0x6,0x96,0x86,0xa6,0xe2,0xa,0xc2,0x88,0x48,0xf6,0x27,0x9e,0x78,0xc,0xc1,0x6a, + 0x4b,0xf5,0x7e,0xc0,0x93,0x16,0x2d,0x5a,0xc0,0xf6,0xf0,0x87,0xc,0x13,0x46,0x18, + 0xb8,0xba,0x0,0x39,0xa,0x78,0x3,0x52,0xb6,0xb6,0x2f,0x1,0xaf,0xfe,0xbf,0xf5, + 0x21,0x9f,0x5d,0x5f,0xa7,0xfc,0xc6,0xe6,0x84,0xeb,0x4d,0x4e,0x88,0x7e,0x46,0x89, + 0x3d,0x6c,0xbf,0x24,0xda,0x8f,0xb9,0xba,0xce,0xc8,0x93,0x2,0x90,0xc6,0x84,0x2, + 0x0,0x46,0x43,0x86,0x9e,0x7d,0xfb,0x52,0x50,0x93,0x8c,0x14,0xc6,0xa4,0x85,0x81, + 0x4a,0x54,0x78,0xed,0xd,0x6f,0x7d,0xb6,0x18,0x58,0x7,0x20,0xd3,0x7e,0xe2,0x35, + 0x22,0x95,0x67,0x8b,0xed,0xd8,0x1f,0xaf,0xe5,0xe7,0x5,0x7c,0xab,0x16,0xbb,0x96, + 0x72,0x36,0x26,0x48,0x48,0xd0,0x19,0xb9,0xf9,0x2c,0x3d,0x37,0x8f,0x82,0x7b,0x60, + 0x5d,0x1,0x7c,0x17,0x12,0xeb,0x5d,0xaa,0x80,0x5e,0xc9,0xcf,0x56,0x17,0xa7,0x39, + 0xea,0x37,0x2e,0xa6,0x63,0xa0,0xdf,0x29,0x7f,0xa3,0x3a,0x1e,0xef,0xf7,0xca,0xf7, + 0xf5,0x7d,0xf4,0xff,0x93,0xc7,0x29,0xcf,0x5,0x0,0xa,0x51,0xd8,0x88,0xa6,0xf5, + 0xf2,0x80,0x67,0x1b,0xe7,0x3a,0x16,0xd2,0x44,0x0,0xfb,0x0,0x34,0xb2,0x73,0xb2, + 0x69,0xc2,0xd,0x63,0x4c,0xae,0xfb,0x26,0x2c,0x4a,0xde,0xc5,0xc0,0x2,0xe5,0x2c, + 0x85,0xac,0x7,0x99,0x16,0xd5,0x9c,0x76,0x8b,0xb4,0x9c,0x8c,0xac,0x2c,0x2a,0xbd, + 0xd8,0xe1,0x96,0x5b,0x58,0x37,0x6e,0xa9,0x8f,0x9d,0x38,0xc9,0x93,0x69,0xf9,0x31, + 0x92,0xbf,0x77,0xd5,0x6a,0xe1,0x23,0x4d,0x23,0x55,0x82,0x98,0xa2,0x90,0x9c,0x65, + 0xf1,0xd,0xa,0x8a,0x9b,0x34,0x89,0xc0,0xa,0xc5,0x39,0x7a,0xf4,0xea,0xc5,0xda, + 0xf2,0xc9,0xfd,0xba,0x16,0x2d,0xd8,0xbc,0x5,0xf3,0xa9,0xea,0x14,0xfc,0xbf,0x68, + 0x6a,0xe0,0x8a,0xec,0x8f,0x6c,0x68,0x62,0x33,0x60,0x2d,0x1f,0x98,0x4a,0x4a,0x72, + 0x56,0x8d,0x76,0x7b,0x1b,0xf9,0x24,0x93,0x93,0x97,0x4b,0xe5,0x30,0x6f,0xbe,0xa5, + 0x3,0xd5,0xed,0x46,0xe0,0x14,0x58,0xb9,0xe7,0xef,0x5d,0x4e,0x1,0x84,0x9e,0x21, + 0xe1,0x1d,0x8b,0x27,0x9f,0x7b,0x92,0xb3,0x34,0x24,0xa6,0xd0,0xb1,0x4c,0x66,0xf7, + 0x8e,0x19,0xc3,0x6,0xf,0x1d,0xca,0x7a,0x89,0x8,0xf0,0x6b,0x5b,0x5c,0x47,0xa5, + 0x2a,0x71,0xcd,0x1e,0x79,0xfc,0x31,0xf6,0xf2,0xab,0x67,0x9c,0xd7,0x20,0x16,0x62, + 0x48,0x84,0xc5,0x7a,0xc8,0x1,0xb6,0xb7,0xff,0xe0,0x1,0xb6,0x3c,0x29,0xd9,0x8f, + 0x72,0x6,0xc8,0x5a,0xe0,0xeb,0xf2,0xff,0x6,0xa4,0xea,0x72,0x53,0xb6,0x6,0xb, + 0x5e,0x97,0x91,0x41,0xee,0xe,0x0,0xfd,0x8b,0x2f,0x9f,0x66,0x13,0x27,0x4f,0x62, + 0xbd,0x7b,0xf7,0x66,0x57,0xdf,0xd8,0x92,0x35,0x59,0xd4,0x9d,0x35,0xd3,0xc1,0x57, + 0xb0,0x61,0x5,0xca,0xb6,0x2c,0x5d,0x61,0x2,0xb1,0xc7,0x8c,0xcd,0xc0,0x2d,0x5b, + 0x96,0x96,0xa3,0xc9,0xcc,0x3b,0xd8,0xf4,0xf9,0xb3,0x48,0xbe,0xc7,0xb5,0x54,0xc5, + 0x89,0x4,0xf3,0xc5,0x79,0x40,0xa5,0x31,0x4,0x48,0xad,0xe1,0xcf,0x3b,0x82,0xd2, + 0xcc,0xa8,0xef,0x2a,0x1f,0x88,0xc5,0x20,0xc9,0x59,0x0,0x6f,0xa9,0x60,0xbe,0x0, + 0x5f,0x8a,0x4b,0x48,0x5d,0xc7,0x8e,0x3f,0x9,0x55,0xf0,0x22,0x7,0xa1,0x6,0x5, + 0xb4,0x8d,0x17,0x62,0x2,0x70,0x63,0xe2,0xb5,0x7,0xc2,0xd,0x6a,0xbb,0xc9,0x88, + 0x7d,0x20,0x16,0xa0,0x2b,0x86,0xce,0x80,0x15,0xb,0xe6,0x4b,0x0,0x30,0xa,0x74, + 0xbc,0xf2,0xca,0x19,0x36,0x65,0xf2,0x64,0xd6,0x9b,0xdf,0x47,0x37,0x5d,0x77,0x2d, + 0xdb,0xdd,0xbe,0x25,0xfb,0xa4,0xab,0xf,0xc0,0xfa,0x70,0xb1,0x61,0xc5,0x8a,0x75, + 0x10,0x76,0x56,0xd5,0x6a,0xe7,0x5,0x6e,0xdd,0xd9,0x4e,0xb1,0xdf,0x27,0x3b,0xb4, + 0x64,0xc9,0xb3,0x66,0xb0,0xd7,0xaa,0xcf,0x13,0x1b,0xc7,0xef,0x2,0xfb,0x7d,0x80, + 0x7c,0xe9,0x69,0x1,0xe0,0x2d,0x31,0x7c,0xba,0x9a,0x8f,0xb7,0xc2,0x11,0x79,0xaf, + 0xa9,0x2e,0xa,0x88,0xf9,0x72,0xe5,0x9a,0x14,0x32,0x4e,0x65,0x1b,0x55,0x97,0x1, + 0x2a,0xb,0xfd,0x20,0xcd,0xf7,0x51,0x6e,0x64,0x95,0x95,0x95,0x4e,0x52,0x0,0x9c, + 0x91,0x91,0x31,0x68,0xde,0xdc,0xd9,0x6c,0xd7,0xee,0x5d,0x54,0x5,0x48,0x81,0xa3, + 0x0,0x45,0x1d,0x2c,0x15,0x68,0xea,0x0,0xea,0x78,0x3f,0x8a,0x15,0xcb,0x87,0xb2, + 0xc6,0xf1,0xbf,0x35,0x21,0x0,0x5f,0xe7,0x8,0xc4,0x92,0x91,0xd0,0x8,0xea,0xc1, + 0xc4,0x24,0xdb,0x3d,0xd9,0xe9,0x26,0xfa,0xfe,0xd4,0x4,0xbc,0xb0,0x90,0x98,0x4a, + 0x8b,0x96,0x2d,0x49,0x7a,0x44,0xe7,0x23,0xb4,0x1e,0x44,0x81,0xb,0x4,0xd1,0xc8, + 0x56,0x80,0x23,0xc4,0x50,0xeb,0xa3,0xc7,0x78,0xfb,0xd8,0xdb,0xc5,0x7b,0x23,0x5c, + 0xaf,0xf9,0x12,0xa0,0x85,0xbc,0x4a,0xbb,0x39,0x83,0xce,0x32,0x25,0x40,0x63,0x9, + 0x10,0xf0,0x98,0xea,0x32,0xc5,0x4e,0xed,0x68,0x6a,0x55,0xf0,0x43,0x48,0xc4,0x0, + 0x5,0xd4,0x96,0x96,0x85,0x3a,0x46,0x8a,0xdf,0x6a,0xfc,0x1e,0xad,0xcd,0xa1,0x3e, + 0xbc,0x6d,0xa3,0x8c,0xa5,0x77,0xac,0xa3,0x8c,0xfd,0x90,0xff,0xdb,0x77,0xc0,0x40, + 0x62,0x8c,0x28,0x4c,0x1,0xdf,0xa0,0xbb,0x9f,0x6f,0x30,0x3f,0x15,0x79,0xb6,0x28, + 0xd3,0xf8,0xe8,0x63,0x8f,0xa9,0x16,0x95,0x98,0x88,0x6a,0x5d,0x2e,0xd,0x47,0x0, + 0x5e,0x54,0xc1,0x97,0x58,0x48,0x79,0x4a,0x3b,0x2d,0x7,0x12,0x14,0xa5,0xe5,0xc, + 0xe8,0x4f,0x32,0xf1,0xdd,0x3,0x7,0x92,0xdc,0xaa,0xcb,0xb4,0x0,0x26,0x30,0x5d, + 0xf8,0xe0,0x1,0x56,0x0,0x61,0xc9,0x14,0xa5,0x4c,0xb,0x7f,0x3f,0x24,0xda,0x61, + 0xfc,0x9e,0x81,0xd4,0xdb,0xf9,0xce,0xae,0x64,0xd0,0x35,0x6d,0xd6,0x8c,0x3e,0x1b, + 0x11,0x91,0xc8,0x75,0xc6,0xb3,0x44,0xc7,0xd4,0x10,0x73,0x56,0x80,0x8b,0x34,0x24, + 0x2c,0x1f,0xb0,0xf4,0x5d,0xcb,0x92,0x92,0x88,0xec,0xc5,0xf9,0x1c,0x34,0x64,0x30, + 0x31,0xd,0x80,0x26,0x18,0xec,0x4c,0xe1,0xef,0xa5,0x88,0xfd,0x55,0x9e,0xbf,0x97, + 0xc,0x9,0xb0,0x5e,0x14,0xd,0x11,0x92,0xf3,0x3c,0xe1,0x3a,0x81,0x4c,0x3d,0x66, + 0xc2,0x44,0xce,0xe0,0xef,0xa3,0x94,0xab,0x3b,0xbb,0x77,0x27,0xd9,0xb9,0xd9,0x35, + 0x57,0x53,0xc5,0x2c,0x7c,0xf,0x62,0x43,0x10,0x2d,0x1e,0x90,0x9f,0x23,0x82,0x2f, + 0x13,0x9,0xd0,0x24,0xf7,0xd1,0xb1,0x63,0x6c,0xf1,0xf2,0x55,0xa6,0x5f,0x97,0x2f, + 0xb,0x5,0xdb,0x95,0x0,0x8c,0xd7,0x72,0x48,0x90,0x96,0x13,0x62,0xa1,0x78,0xad, + 0xef,0x83,0xc8,0x5f,0xb0,0x60,0x54,0x33,0x93,0x85,0x60,0xca,0x2a,0xcb,0xd9,0xc0, + 0xc1,0xfc,0x7a,0xdd,0x7e,0x7,0x6b,0xd2,0xa9,0x35,0xbb,0x6a,0x4d,0x1f,0x5,0xc2, + 0x2e,0x30,0xd6,0x25,0x6a,0xdd,0x57,0xdc,0xac,0xd2,0xe,0xda,0x12,0xcc,0xb7,0xd2, + 0x97,0xab,0x65,0x90,0x56,0x93,0xe5,0xdd,0x58,0x97,0x21,0xbd,0xd8,0xf1,0xe3,0xc7, + 0x29,0xf5,0xc8,0xcb,0x8b,0x16,0x91,0xff,0x8d,0x9e,0xe4,0x7c,0xfa,0xcc,0x69,0x56, + 0x52,0x5e,0x46,0xc6,0x76,0x41,0xd9,0x7a,0x55,0x52,0xd3,0x4,0x5f,0x4d,0x6a,0x16, + 0x72,0xb3,0x2,0xdf,0xaa,0xd,0x54,0xc4,0x67,0x55,0x72,0x32,0xcb,0x2f,0x2c,0x60, + 0x67,0x5e,0x39,0xcd,0xe7,0xc2,0x4b,0x1c,0x7c,0x3d,0xd0,0x95,0x4b,0x80,0xed,0x5, + 0x31,0xf0,0xba,0xa1,0x31,0x8,0xc4,0x1e,0x8,0xc7,0x4,0x0,0xb,0x59,0x5a,0x31, + 0xe0,0x98,0x60,0xbb,0x31,0xc5,0x8a,0x9,0x80,0xeb,0xfd,0x25,0x45,0x43,0x73,0x92, + 0xb3,0x99,0x1b,0xba,0xf7,0xc,0x19,0xc2,0xee,0x40,0x79,0xd3,0x6b,0x9a,0xb1,0xa7, + 0x6f,0x6d,0x43,0x20,0x6c,0x82,0x6f,0x7b,0x8d,0xd,0xdb,0xc1,0x5a,0xd1,0x60,0xac, + 0x7,0x6c,0x7d,0x21,0xea,0x4a,0xbf,0x7a,0x4b,0x2b,0xb6,0xbc,0x7f,0x1f,0xf6,0x4, + 0x67,0xa3,0x0,0x5d,0x32,0x8,0x50,0xd3,0x9d,0x1b,0x61,0x6b,0x53,0x53,0x59,0x1e, + 0x45,0xdb,0x5b,0x6c,0x57,0x5b,0x7a,0xf7,0x9b,0xbe,0x5c,0xaf,0xde,0x77,0x1a,0x7d, + 0x62,0x1d,0xc5,0x64,0x70,0xd,0x63,0x4a,0xcd,0xab,0x73,0xde,0xf7,0xf5,0x22,0x47, + 0xff,0xc0,0xc1,0x7d,0x0,0xe0,0xc1,0xa,0x80,0xf3,0xf2,0xf2,0x6e,0x9f,0x39,0x73, + 0xfa,0xef,0xb7,0x6e,0xdf,0x4a,0x7e,0x13,0xb0,0x15,0x17,0xd8,0x22,0x9a,0x53,0x67, + 0xab,0x35,0x21,0x8c,0x36,0xf0,0x7f,0x21,0x60,0x8d,0xcf,0x4b,0xc8,0x37,0xac,0x47, + 0x46,0x37,0x98,0xc,0x18,0xbe,0x5f,0x1c,0x14,0x98,0xfb,0x5b,0xef,0xbc,0x2d,0x42, + 0xf7,0x2f,0x38,0xd9,0xaf,0xc,0x5,0x7,0x0,0xb7,0xe3,0x6c,0xa5,0x65,0xab,0x56, + 0xc4,0x58,0x6e,0x6c,0xd7,0x8e,0xa2,0x45,0xc1,0x20,0x50,0xa8,0x40,0x2e,0xed,0xd1, + 0xe5,0x2e,0x2c,0xbb,0xd3,0x12,0x13,0x15,0xb6,0xb9,0x97,0xdd,0xb5,0xff,0xeb,0xce, + 0x7a,0xf4,0xee,0x43,0xb2,0x2d,0x58,0x93,0xee,0x6f,0x9d,0x6b,0x5,0x79,0xd9,0xd2, + 0x32,0x0,0x78,0xae,0x21,0x31,0xfb,0x1,0x51,0x7a,0x8b,0x43,0xb0,0x6c,0x4,0x80, + 0xc1,0x9f,0xdd,0xbd,0x57,0x6f,0xed,0xfb,0xc5,0x92,0xff,0x26,0xf9,0xfb,0xec,0x61, + 0xff,0xfe,0xe0,0x31,0xdf,0xa5,0xce,0x7,0xce,0x11,0x54,0x3,0xb0,0xbd,0x1e,0x9c, + 0x49,0xac,0x5e,0xb3,0xda,0xe8,0x6a,0x64,0x97,0xa,0x95,0x29,0x60,0x88,0x94,0x46, + 0x85,0xa9,0xe4,0x94,0x14,0x9a,0xc8,0x89,0x5,0xc4,0x89,0x9c,0xb7,0xa3,0xe5,0xc3, + 0x0,0xd8,0xe,0xf9,0x97,0x3,0xf7,0x30,0x0,0xd0,0x93,0x69,0xbd,0xb4,0x1c,0x94, + 0x94,0x44,0x5a,0xe,0x52,0xa8,0x86,0x72,0x63,0x2,0x32,0xad,0x4a,0xcb,0x81,0x4c, + 0x2b,0xf2,0xbf,0x25,0xf8,0x2,0x88,0x49,0xb6,0xe7,0x6,0x11,0xce,0xf1,0xb4,0xd9, + 0x90,0x69,0x3d,0xc9,0x19,0x2d,0x1b,0xd1,0x2b,0x1a,0x85,0x37,0x5a,0xb6,0x6a,0xc9, + 0x9a,0x5f,0x7b,0x2d,0xeb,0xc7,0x5f,0x3,0xb0,0xc0,0x7c,0xf1,0x1c,0xc9,0xa2,0x36, + 0x91,0xc1,0x49,0xd,0xb1,0x90,0xce,0x60,0xfe,0x79,0xc4,0x33,0xf3,0x3c,0x4a,0x4a, + 0x92,0xef,0x7a,0x7,0xc9,0xdb,0x4b,0x97,0x2f,0xa3,0xba,0xcd,0x60,0xaa,0x28,0x26, + 0x33,0x49,0xf8,0x7b,0xe7,0x2f,0xf6,0x5c,0x5,0x32,0x70,0xc,0xec,0x9d,0x8e,0x85, + 0x1f,0x17,0x8e,0x85,0xc,0x9,0xf8,0xae,0x67,0xcf,0xf1,0xc,0x9,0xce,0x98,0x71, + 0x2e,0x50,0x96,0xf2,0x8e,0xae,0x5d,0x58,0xeb,0x36,0xad,0xd9,0x35,0xd7,0x36,0x67, + 0xdd,0x7b,0xf6,0xa0,0x73,0x6,0xe3,0x5,0xd7,0x8e,0xd2,0x13,0x1d,0xa9,0x62,0x89, + 0x66,0x44,0x98,0x1,0x9b,0x31,0x95,0x9a,0x85,0x7c,0xdd,0x85,0x9c,0xa9,0x63,0x92, + 0x93,0x40,0xaa,0xd8,0xac,0x8b,0xdd,0x96,0x57,0x19,0x80,0x6c,0xf8,0x86,0x35,0x6, + 0x4d,0x20,0xbc,0x71,0xb,0x5b,0xc7,0x59,0xff,0xc9,0x17,0x4e,0x91,0xeb,0x9,0x6c, + 0x18,0x35,0xae,0x7,0x72,0xa3,0xe9,0x96,0x9b,0x3b,0xb0,0x26,0x5d,0x38,0x8,0xa7, + 0xf4,0xf5,0x82,0xb2,0x34,0x10,0x6e,0x56,0x3e,0x34,0xc8,0x8a,0x43,0xa4,0xe9,0x66, + 0x16,0x2b,0xd6,0x23,0xa5,0x9b,0xac,0xec,0xc1,0xae,0xef,0xd5,0x91,0xed,0xd8,0xee, + 0x49,0xcf,0x75,0xba,0xdb,0x45,0x14,0x22,0x39,0xfe,0xd4,0x71,0x6a,0x1e,0x1,0x3f, + 0x78,0x20,0xdf,0x59,0x93,0x9c,0x8b,0x2a,0xd6,0xb,0x0,0x96,0xac,0xd7,0x5b,0x96, + 0x6f,0xd8,0xc8,0xf2,0x8a,0x4b,0xd8,0xf2,0xa4,0x55,0xc,0xf3,0x77,0x5d,0xac,0x86, + 0x5d,0x7e,0xfd,0x2,0x81,0xec,0xc5,0x4b,0x0,0xdb,0x98,0x18,0xde,0xeb,0x46,0xb1, + 0xae,0x83,0xb1,0xd,0xd0,0x4,0xce,0x6a,0xd4,0xfb,0xa0,0x8b,0xea,0x62,0xc2,0x1f, + 0xec,0xfb,0x7f,0x63,0x3e,0x13,0x16,0x3,0xa0,0x77,0x9e,0xdf,0xfb,0xb,0xe6,0xcf, + 0x63,0x83,0x7,0xd,0x64,0x37,0x73,0x92,0x33,0xb0,0x79,0x53,0x76,0xaa,0xe3,0xf5, + 0xa,0x7c,0x3f,0xee,0xea,0x8d,0x4f,0x2c,0x56,0xfc,0xa9,0x2e,0x49,0x3b,0x98,0xf1, + 0xe7,0x5a,0xe0,0x96,0x4c,0x5d,0x42,0x11,0x8f,0x73,0xb7,0xb6,0x62,0x8b,0xee,0xe8, + 0xc8,0xb6,0xef,0xdc,0x49,0xd2,0xb3,0x34,0x6,0xf0,0x5b,0x36,0x6d,0xde,0xcc,0x92, + 0xd7,0xa5,0x13,0xf8,0xfa,0xa0,0x1a,0x3e,0x5c,0xac,0xd7,0x15,0x18,0x28,0x3,0xfe, + 0xd6,0x72,0xc3,0x56,0x36,0x31,0xa,0xab,0x1c,0x29,0x9f,0xf1,0x33,0xdc,0x88,0x7e, + 0xe0,0x81,0x5d,0xdf,0x95,0x96,0x96,0x76,0x51,0x0,0x5c,0x52,0x5c,0x7c,0xdd,0xf4, + 0xe9,0x53,0xff,0x6e,0x7d,0xd5,0x7a,0x92,0x73,0x21,0x95,0xd8,0x40,0x5a,0xa3,0x0, + 0xb8,0x56,0xbc,0x8e,0xcf,0x80,0x75,0x0,0xf6,0x41,0xdc,0xfa,0x5c,0x9b,0x1,0x87, + 0x7c,0x96,0xfe,0x40,0xeb,0x72,0x97,0xf4,0xfb,0x62,0x92,0x78,0x93,0x0,0xf8,0x42, + 0x20,0x2,0xda,0x2f,0x10,0x10,0x53,0x12,0x74,0xe7,0x2e,0x9d,0x59,0xab,0xd6,0xad, + 0x9,0x84,0x31,0x79,0x36,0xe7,0x93,0xce,0xb5,0xd7,0x5d,0xab,0x8d,0xeb,0xc4,0xb8, + 0x96,0xa4,0xb8,0xeb,0x5a,0x5c,0xa7,0xb6,0xe9,0xeb,0x6a,0xb4,0x10,0x43,0xfe,0xcf, + 0x75,0xd7,0x7a,0x9f,0xcb,0x97,0x60,0x47,0xdd,0x7a,0xf6,0xa2,0x74,0x10,0xe9,0x97, + 0x73,0x5,0x67,0xcd,0x75,0xbd,0x96,0xc1,0x5c,0xe,0x9f,0xac,0x7c,0xd,0x10,0x1, + 0x63,0x5,0x48,0x82,0xd5,0xe3,0x7b,0xed,0xdf,0x6a,0x2c,0xb5,0xdf,0x69,0x6f,0x37, + 0x8f,0xcd,0xfb,0x1c,0xef,0xf3,0xae,0x65,0x57,0x73,0x56,0x4,0xe5,0x0,0x32,0x27, + 0xf2,0x4a,0x21,0x1f,0x1a,0x25,0xec,0x1a,0xcd,0x0,0x28,0xbd,0x72,0x13,0xf6,0xcd, + 0xca,0xce,0x56,0x7d,0x66,0x5d,0xb9,0xe6,0xae,0x88,0xfb,0xc8,0x62,0x2e,0x21,0xb2, + 0x34,0x80,0xf,0xc1,0x4f,0xf0,0xc1,0x6e,0xe4,0xf,0x1f,0xa5,0xe5,0x4c,0xf6,0xd2, + 0x72,0x90,0xa3,0x48,0x32,0x2d,0x7,0xa0,0xd9,0x9a,0xbf,0x77,0x85,0x28,0x11,0xa, + 0xf0,0x5d,0x23,0xca,0x4b,0x4a,0xc9,0x79,0xd6,0xfc,0xf9,0x4a,0xa6,0x85,0xaf,0x18, + 0x32,0x2d,0x2,0x94,0x48,0xa6,0xc5,0xf9,0xe1,0xe7,0x66,0xd4,0x98,0x31,0xd4,0xc2, + 0xf,0xf7,0xe1,0x49,0xa1,0xc8,0x4,0xa4,0xa8,0x6,0xf3,0x78,0x3,0x72,0x95,0xc3, + 0xa0,0x38,0x27,0xda,0x21,0xe2,0xfc,0x29,0xdf,0xf5,0xcc,0x19,0xdc,0x88,0xe8,0xc4, + 0xc1,0xff,0x76,0x52,0x2b,0xe0,0xbf,0x95,0xc7,0x2,0x43,0xc2,0x3c,0x16,0x2f,0x62, + 0x5b,0x97,0x9c,0xa5,0xef,0x1a,0x92,0xf3,0x90,0x61,0xc3,0x28,0xf2,0xbb,0x63,0xa7, + 0x4e,0xfc,0xde,0x69,0xc1,0xae,0x69,0x7e,0xd,0x1b,0x71,0xef,0x48,0xaa,0x65,0x8d, + 0x73,0xf8,0x1c,0x37,0x62,0x5e,0xe1,0xe0,0xab,0xfc,0xf6,0x96,0x11,0x14,0x2f,0x35, + 0x31,0x2c,0x30,0x53,0xfe,0x3f,0xae,0x15,0xf2,0x53,0xd1,0x87,0xd6,0x3,0x57,0xf, + 0x54,0x25,0x3,0x56,0xdb,0x35,0x86,0xeb,0x92,0x9e,0xb1,0x9f,0xce,0x80,0xa9,0x39, + 0x41,0x95,0xd7,0x1d,0x9,0x29,0x54,0x98,0xaf,0x0,0xc2,0x8,0x96,0x41,0x23,0x8a, + 0x1,0x3,0x7,0xb2,0xf6,0x6d,0xdb,0xb1,0x26,0xb7,0xb7,0x62,0x4d,0x57,0xf6,0x66, + 0x4d,0x4b,0x87,0x78,0xa0,0x5b,0x76,0x8f,0x2,0x64,0x9b,0xd,0x37,0x55,0x60,0x6c, + 0xb2,0xe2,0x66,0x76,0x55,0x2d,0xbe,0xbd,0xc9,0xe2,0xbb,0x58,0xf3,0x3b,0x6e,0x64, + 0x25,0x45,0xc5,0x64,0x80,0xea,0xc0,0x5b,0x2f,0xfa,0x3e,0x3f,0x74,0x60,0x1f,0xa5, + 0x18,0xc9,0x34,0x2c,0x53,0x7a,0xb7,0x58,0x98,0xf2,0xf3,0x7a,0xa3,0xac,0xa,0x11, + 0xb8,0x1b,0x59,0x66,0x6e,0x1e,0x4b,0xe2,0x86,0xf0,0xc1,0x43,0x7,0x8,0x78,0x2f, + 0x5d,0x6e,0x50,0xa0,0xa,0xc0,0xd5,0x87,0x4,0x63,0x4f,0x8a,0x8e,0x29,0x76,0xec, + 0x8f,0x58,0x60,0x1f,0x9d,0xd,0xeb,0x4c,0xd8,0x60,0xc0,0xa,0x84,0xeb,0x14,0x8, + 0x5f,0xe4,0xcc,0x1e,0xad,0xff,0xc6,0x8c,0x1e,0xc5,0x6,0x71,0x10,0x6e,0x7b,0xd3, + 0xcd,0xac,0xdf,0x35,0x4d,0xd9,0x13,0x1d,0x5a,0xb3,0xf,0xbb,0xb6,0x55,0xcc,0x97, + 0xc0,0x38,0x9e,0x2c,0xad,0x31,0x62,0x5,0xc0,0x77,0xfa,0xc1,0x58,0xcf,0x77,0x68, + 0xc5,0xa6,0xb4,0xbf,0x81,0x95,0xa0,0x21,0x2,0xe6,0x1b,0x21,0x8f,0x3,0x88,0x8f, + 0x1e,0x3d,0x42,0xc,0x15,0x45,0x48,0x4a,0x54,0x1c,0x81,0x79,0xaf,0xf9,0x4c,0x58, + 0xf,0xfa,0xb3,0xd6,0xcb,0x5d,0xb1,0x6,0x1b,0x58,0x6e,0x51,0x19,0xcb,0xca,0xcd, + 0xd,0x3c,0xeb,0x6,0x81,0x10,0xec,0x17,0xeb,0x88,0xb1,0xda,0xbe,0x7d,0xeb,0x3f, + 0x73,0x0,0x6e,0xad,0x0,0xb8,0xbc,0xbc,0xbc,0xc9,0xb4,0xa9,0x53,0x3e,0x42,0x70, + 0x92,0x6c,0xc8,0x10,0xa,0xa0,0xe,0xd0,0xd4,0xb7,0x1b,0xac,0xd6,0xc1,0x82,0x8d, + 0xcf,0x91,0x8c,0xda,0xfe,0xc,0xeb,0x3b,0x7c,0x49,0x3c,0x58,0x94,0x3,0x93,0x3b, + 0x72,0x80,0x31,0x59,0x40,0x82,0xb6,0x7b,0x32,0x36,0x58,0xe9,0x2e,0xf0,0x7,0x6d, + 0xde,0xb2,0x99,0xf5,0xe7,0x16,0x3f,0x26,0xb1,0x96,0xad,0x5b,0x11,0x10,0x4b,0x30, + 0x6,0x9b,0xc1,0xb2,0x5,0x5f,0xb6,0xa0,0x75,0x6f,0xb4,0x10,0xdb,0x5b,0xaa,0x65, + 0x2b,0xb5,0x9f,0xb9,0xbf,0xff,0x9e,0xfc,0x4c,0x4c,0x6c,0x90,0x6c,0xd1,0x3c,0x81, + 0x58,0x8a,0xee,0xbb,0xd5,0xeb,0x38,0x5b,0xcc,0xd8,0x28,0x69,0x9,0xbf,0xac,0xb5, + 0x9f,0x9e,0x7a,0x84,0xea,0x58,0x90,0xd3,0x1,0xa0,0xad,0x5a,0xb7,0xd2,0x8e,0x47, + 0x8c,0xd6,0xda,0x52,0xae,0x6b,0xbf,0x57,0x3f,0x3e,0xe3,0x38,0xc4,0xfe,0xd8,0x6, + 0xb5,0x0,0xc0,0x83,0xca,0x50,0x15,0xdc,0x58,0x73,0x5,0x17,0x5,0xca,0x27,0x8a, + 0xc8,0x40,0xa4,0xe4,0x60,0xe8,0x32,0x66,0x58,0xb4,0x7c,0x58,0x14,0x7e,0x22,0x39, + 0xe8,0x60,0x39,0xba,0x4c,0xbb,0x2e,0x2d,0x8d,0x3a,0x15,0xc1,0x47,0x2a,0x65,0x5a, + 0x48,0xaf,0x73,0x84,0xbf,0x57,0xa6,0x96,0xc1,0x47,0xa,0xb6,0x48,0x51,0xce,0xfc, + 0x35,0x2,0x97,0xa4,0xe4,0xc,0x99,0x1a,0x32,0xed,0x70,0x92,0x69,0x7,0x53,0xa4, + 0x33,0x54,0x13,0x80,0x15,0xba,0x6a,0xcd,0xe5,0x96,0x3e,0x24,0xe7,0x53,0x2f,0xbe, + 0x40,0x92,0xb7,0x9e,0xaa,0x13,0x16,0x94,0x64,0x44,0xf7,0x3b,0x58,0x32,0x8e,0x5f, + 0xfa,0xae,0x1f,0x78,0xf0,0x41,0x55,0x52,0xf2,0x5e,0xa4,0xd3,0x74,0xb8,0x99,0xdd, + 0xd5,0xa3,0x7,0xfd,0x26,0xe5,0xef,0x5d,0xe6,0xfb,0x7b,0x9,0x7c,0xc5,0xb1,0xe0, + 0xf5,0x12,0xe9,0xbb,0x16,0x92,0x33,0x7c,0xde,0x23,0x39,0x70,0xf,0xe2,0xcc,0x19, + 0xa9,0x4a,0xf8,0x3c,0x18,0x59,0xb8,0x67,0xa6,0x4c,0x9b,0x4a,0xe9,0x62,0x30,0x22, + 0x5e,0xe2,0xc7,0x42,0x96,0xbd,0xd6,0xd9,0xcc,0x95,0x42,0xa8,0x5f,0x2f,0x1d,0x74, + 0xc3,0xd4,0x2c,0x7d,0xbb,0xaa,0x7,0x5d,0x5c,0x6e,0x80,0xa9,0x3f,0x51,0x9a,0x2c, + 0x57,0x1,0x6c,0x99,0x37,0x0,0xb0,0x3a,0xeb,0x55,0xf2,0xb5,0x78,0x5d,0xb1,0x69, + 0x2b,0xe5,0xdc,0xc3,0x5,0xe1,0x15,0x84,0xb9,0x48,0xc1,0x59,0x43,0xee,0x19,0xc2, + 0x6,0xf1,0x6b,0x49,0x4c,0xb8,0xdd,0x75,0xac,0xc9,0xb4,0xce,0xac,0x69,0xde,0x40, + 0x5f,0x8a,0x2e,0xf3,0x97,0xcd,0x34,0x26,0xec,0x83,0xb1,0x96,0x43,0xac,0xa7,0x2f, + 0xe5,0xf,0x62,0x4d,0xc6,0x76,0x64,0x57,0xb7,0x6b,0xc9,0xb2,0xb3,0xb2,0xbd,0x7c, + 0x77,0x7e,0x8c,0x74,0x3e,0x0,0x5a,0x68,0xd,0x79,0xfe,0x2c,0x5d,0x4f,0x74,0x31, + 0x42,0x27,0x28,0x3,0x7c,0xc5,0xf1,0xa9,0xc8,0x6f,0xc1,0x7c,0xbd,0xb1,0x9e,0x83, + 0xc8,0x7a,0xe1,0xf3,0xad,0x62,0xc9,0xa9,0xa9,0x9c,0x3d,0x67,0xb0,0xe7,0x4e,0x9e, + 0x60,0x6f,0xbc,0x79,0x51,0x81,0xac,0x7,0xb8,0x62,0xa9,0x81,0xaa,0x64,0xc2,0x3a, + 0xc0,0x5e,0xb8,0x54,0xaf,0x49,0xd5,0x31,0xf5,0xff,0x72,0xdf,0x6,0x1,0xc2,0xd, + 0x12,0x80,0x1b,0xb5,0xe0,0xac,0xfa,0x98,0xa,0xc8,0xa2,0x11,0xab,0xf3,0x41,0x5a, + 0x80,0x30,0x2,0xb2,0x86,0xf,0x1b,0xca,0x6,0xf,0x1e,0xc4,0x3a,0x74,0xec,0xc8, + 0x3a,0x5d,0xdd,0x94,0x55,0xb4,0x6d,0xc1,0x2e,0x75,0x16,0x20,0xac,0x98,0x70,0x50, + 0x9e,0xa6,0xe5,0x5d,0xed,0x35,0x30,0xf6,0x3,0xb5,0xc0,0x7e,0xdf,0xeb,0xd2,0x96, + 0xed,0xe2,0xd7,0xae,0x7f,0x9b,0x56,0xe4,0xef,0x97,0xb5,0xa9,0x65,0x4a,0xd4,0x4b, + 0xa7,0x5f,0xe4,0xcf,0x7f,0x3a,0x15,0xde,0x8,0x65,0xbb,0xca,0xa0,0xb,0xde,0x6b, + 0x3a,0xf0,0x16,0x3a,0xb6,0xe3,0xba,0xa1,0xa,0x56,0x29,0x37,0xf0,0xea,0xe9,0x1a, + 0x7,0xc9,0x81,0xba,0xe7,0xf9,0xf9,0xf2,0x8a,0xe5,0x9c,0x62,0x1b,0x37,0x56,0x7d, + 0xc6,0x1,0x58,0xe1,0x6f,0x93,0xca,0xca,0xca,0x26,0x33,0x67,0x4c,0x7f,0x19,0xd5, + 0xb0,0x90,0xd6,0xf0,0xaa,0xb0,0x78,0x7d,0x50,0xf5,0xe5,0x62,0x1b,0x24,0x83,0x3e, + 0x5c,0x9d,0x25,0xbb,0xc1,0x3b,0x4a,0x9a,0xe,0x3,0x7b,0xb9,0x74,0xa5,0x38,0x80, + 0xf9,0x62,0xf2,0xc3,0x3e,0x0,0x61,0x57,0xf3,0x73,0x55,0x81,0x87,0x6f,0x3,0xa3, + 0x18,0x3b,0x6e,0x2c,0x49,0x51,0x77,0x75,0xef,0x46,0x69,0x1b,0x37,0xb6,0x6d,0xcb, + 0xda,0xb6,0x6b,0x4b,0x39,0x9c,0x6d,0xf9,0xe4,0x8a,0x25,0xb6,0xc1,0x1f,0x86,0xa5, + 0x5c,0x47,0x1f,0x61,0xb5,0xc,0x8c,0x1b,0x88,0x21,0x62,0x80,0xf5,0x2,0xb8,0x5a, + 0xb7,0x69,0xc3,0x5a,0xb5,0x69,0xcd,0xee,0xe8,0xda,0x95,0x0,0xd8,0xcb,0xbb,0x5d, + 0x66,0x30,0xda,0x79,0x7a,0xfa,0x93,0xc6,0x8e,0xe7,0x5a,0x5,0x31,0x4c,0xe9,0xda, + 0x3,0x62,0x4,0x65,0x51,0xd5,0xa2,0xf1,0x13,0x28,0x35,0x88,0x8c,0x89,0x36,0xde, + 0xd0,0x7f,0xe7,0x8d,0x6d,0xc5,0xef,0xd6,0xc6,0x8d,0xe2,0x78,0x6f,0xd4,0x8e,0x51, + 0x9e,0x7,0xfd,0x5c,0xe0,0xff,0xf1,0x79,0xbd,0x38,0xf8,0xa6,0x70,0x40,0x3b,0x78, + 0xe8,0x90,0x2,0x5f,0x17,0x2b,0xb5,0x4b,0x25,0xbe,0x7a,0xee,0x35,0x2a,0x74,0x81, + 0x34,0xb7,0x98,0xf0,0xff,0x46,0xc6,0xc,0x68,0xf7,0x45,0x58,0xc1,0x16,0x57,0x5a, + 0x12,0xc0,0xf,0xd5,0x9a,0x20,0xd3,0xa2,0xf3,0xcf,0xf2,0x95,0x2b,0x58,0x6f,0xc1, + 0x54,0x7,0xa1,0xed,0xa4,0x95,0x96,0x3,0x99,0x16,0xec,0x10,0xbe,0x51,0xc,0x99, + 0xf,0x2b,0x23,0x83,0xc1,0x92,0x91,0x13,0x3c,0x6a,0xdc,0x38,0x36,0x74,0xc4,0x8, + 0xd6,0xaf,0x7f,0x7f,0x8a,0xa,0x6e,0x7d,0x7d,0x1b,0x52,0x3,0x60,0xc0,0x65,0x64, + 0x65,0x92,0x6a,0x4,0x29,0x55,0xf,0xb8,0xd2,0x81,0xd4,0xf6,0x6d,0xd7,0x46,0xd4, + 0x4b,0x97,0xff,0x87,0x2,0x33,0x30,0x24,0xbc,0x76,0x88,0x95,0x94,0x3f,0xd,0x89, + 0x1b,0x85,0x31,0xfa,0xf2,0xdf,0x81,0xdf,0x35,0x43,0xf3,0xf7,0xca,0xfc,0x5e,0x1c, + 0x7,0x18,0xbc,0x4c,0x97,0x32,0x7c,0xd7,0xd3,0xa6,0x51,0x81,0x91,0xe1,0xc2,0x77, + 0x8d,0x82,0x23,0xb8,0xf,0xae,0xbe,0xe6,0x1a,0x2,0x61,0x30,0x29,0xe4,0x14,0x3f, + 0xff,0xd2,0xb,0xf4,0xfd,0xc4,0x7a,0x1b,0xf5,0x48,0x75,0x77,0x8a,0x60,0x68,0xca, + 0xa1,0x35,0x6f,0xb8,0xae,0x2f,0xc,0x62,0x14,0xe3,0x48,0xcb,0xce,0x37,0xfc,0xbf, + 0x3a,0xc8,0x4a,0x76,0xab,0x80,0x96,0x83,0xae,0xed,0x13,0xd6,0xd9,0xb1,0xf1,0xbf, + 0x4,0xc2,0xdb,0xf8,0x4,0x9d,0xe9,0xa5,0x8a,0x5c,0xf2,0xea,0x65,0x43,0xc6,0x1f, + 0x32,0xf4,0x1e,0x36,0x78,0xc8,0x60,0xaa,0x92,0x75,0x4d,0x8b,0x6b,0x59,0x93,0x9e, + 0x37,0xb2,0xab,0x16,0xf7,0x20,0x10,0xb5,0x59,0x70,0x60,0x48,0x30,0x96,0x32,0x74, + 0xc1,0x20,0x76,0xd5,0x82,0x6e,0xac,0x49,0xe7,0x96,0xf4,0xdc,0xe4,0x71,0x66,0x2a, + 0x53,0x8b,0x6a,0xc5,0xb5,0x5,0x18,0x63,0x2,0xce,0x2b,0x28,0x20,0x65,0x2,0xfe, + 0xde,0x20,0xb3,0x97,0x41,0x68,0x2,0x7c,0xe5,0xd0,0x2,0xae,0xa,0xcb,0xca,0xa9, + 0xb0,0x46,0x69,0x79,0x29,0x27,0x4b,0xaf,0x72,0xf0,0x85,0xe4,0x5c,0x67,0x80,0xa7, + 0x7,0xc0,0x31,0x1f,0x88,0xe5,0xd0,0x40,0xd6,0x64,0xc1,0x31,0x63,0x9f,0xc6,0xb, + 0x75,0x6,0x53,0x96,0x4c,0x58,0x2,0x31,0xd8,0xae,0x3e,0xf4,0x6d,0xf5,0x1a,0x18, + 0x3,0x8,0x37,0x70,0x63,0x1d,0x20,0x7c,0xf,0x37,0x7a,0xe0,0xce,0x6a,0x75,0x6d, + 0x73,0x36,0xf6,0xda,0x66,0xec,0xe0,0xcd,0xad,0xd8,0xeb,0x9d,0x6f,0x34,0x98,0xaf, + 0xed,0x1f,0xfe,0x54,0x15,0xf2,0xf0,0x53,0x95,0xde,0xe7,0xc0,0xfb,0xd4,0xad,0x6d, + 0xd8,0xf4,0x6b,0x9b,0xb2,0x4e,0xfc,0x5c,0xa7,0x65,0x65,0x91,0x1,0x0,0xf0,0xc5, + 0xf7,0xe2,0x3b,0xcf,0x72,0xc,0xcb,0xcb,0x2f,0x50,0x69,0x47,0xc5,0x1a,0xe3,0x2d, + 0xd2,0xd4,0x16,0x5d,0x65,0xf0,0x19,0xb1,0xe,0xcc,0x41,0x0,0x96,0xd7,0xb,0x0, + 0x8c,0x6e,0x54,0x98,0x6f,0x64,0x59,0x5b,0xbd,0xce,0x85,0xed,0xff,0xad,0xa6,0x6, + 0x29,0x27,0x58,0x65,0x65,0xf9,0xf9,0xb2,0xb2,0x32,0x13,0x80,0xe7,0xce,0x99,0xbd, + 0x1f,0xc5,0x38,0x70,0x93,0x22,0xd8,0xc3,0x5,0x8a,0xd5,0xe,0x0,0x8d,0x1a,0x51, + 0xfb,0xd4,0x46,0x80,0x73,0x60,0xc4,0x6a,0x3,0x93,0xb2,0x3e,0xf1,0x2,0x74,0x21, + 0xd5,0x21,0x2f,0xf2,0xed,0xf7,0xde,0x71,0x76,0x9e,0xa9,0xd3,0x3a,0xee,0x40,0x36, + 0x7d,0x68,0xdf,0x3e,0x92,0x25,0xd1,0xfb,0x74,0x10,0xb7,0xce,0x6,0xe,0x1c,0x48, + 0x16,0xf1,0x60,0xc,0xfe,0x50,0xc2,0x42,0xc6,0x18,0xca,0x6f,0x9c,0x61,0xc3,0x86, + 0x51,0x2f,0xd8,0x11,0x23,0x47,0xb2,0x91,0x7c,0xf2,0x42,0x81,0x7a,0x34,0x64,0x1f, + 0x33,0x76,0xc,0x55,0x4f,0x1a,0x3f,0x61,0x3c,0x9b,0x30,0x71,0x2,0x9b,0x32,0x75, + 0xa,0x9b,0xca,0x27,0x39,0xb4,0x71,0x9b,0x31,0x73,0x6,0xeb,0x7b,0x77,0x3f,0x92, + 0x75,0x1,0x8a,0x90,0x3e,0xd1,0x40,0x61,0xc6,0xdc,0xf9,0x5a,0xed,0xe6,0x25,0x1, + 0x20,0xe,0xcb,0x1d,0x76,0x49,0xd4,0xb2,0xaa,0x16,0xa4,0x45,0x34,0x69,0x40,0x6a, + 0x10,0x58,0x2b,0x40,0x74,0xc4,0xc8,0x11,0x6c,0xe2,0xa4,0x89,0xf4,0xdb,0xc6,0x72, + 0x0,0x19,0x3d,0x66,0xc,0x1f,0xa3,0xd9,0x7d,0xfc,0x37,0x8c,0xe4,0xc7,0x31,0x9c, + 0x3,0xa,0x9a,0xd,0xc,0x45,0x5f,0xe1,0xa1,0x43,0xe9,0x58,0xef,0xe1,0xe7,0x42, + 0x32,0x3,0xa4,0x6c,0xc0,0x40,0x81,0x54,0x7,0x6,0x9,0xf6,0x5,0x59,0x15,0xed, + 0xdd,0x28,0xe1,0xdc,0xe8,0xf7,0xec,0xae,0xf5,0x2b,0x15,0xa,0xc8,0xb2,0x19,0xb0, + 0xd4,0x4f,0x9d,0x34,0x99,0x94,0x96,0x8a,0xa6,0x1b,0x7b,0xf1,0x58,0x93,0xce,0xae, + 0xea,0x34,0xc0,0x82,0xef,0x75,0xc7,0xce,0x9d,0x54,0x52,0x12,0x6d,0x1,0x91,0x96, + 0x3,0x99,0x16,0x81,0x75,0x8,0x82,0xd3,0xcb,0x30,0xa2,0x26,0x2e,0x72,0x62,0xc1, + 0x7c,0x65,0x70,0x92,0x6c,0xc2,0x31,0x8b,0x83,0xb4,0x27,0xd3,0x4e,0x66,0xf7,0x8e, + 0x46,0x64,0xf0,0x30,0x62,0xcf,0x90,0xb0,0xa1,0x66,0x0,0xb0,0x0,0x86,0x1b,0x36, + 0x6d,0xa2,0x63,0x42,0x84,0xed,0x59,0xe1,0x3,0xa,0x44,0xff,0x4a,0xa0,0xba,0x82, + 0xaa,0x72,0x38,0xcf,0xc8,0xb9,0x5,0x8b,0x7,0x50,0xa0,0x23,0x11,0xfa,0x10,0x77, + 0xe8,0x78,0x2b,0xbb,0x87,0xdf,0x87,0x94,0xab,0xac,0x1b,0x12,0x22,0xbf,0x77,0x8d, + 0x30,0x24,0x56,0x91,0x21,0x61,0xa6,0x4b,0x81,0xf9,0xc3,0x90,0x90,0xbe,0xeb,0xdb, + 0xf8,0xb9,0xc1,0x7d,0x89,0x60,0xab,0x6e,0x3d,0xba,0x53,0x75,0x38,0x18,0xa6,0x2f, + 0x9c,0x7e,0x89,0x14,0x30,0xd5,0x2,0xd2,0x95,0x76,0x18,0xc1,0x6e,0xed,0xd8,0x8e, + 0x9a,0xb0,0xf7,0xc5,0xff,0x93,0x22,0xb5,0x75,0x8b,0x9f,0x8a,0x24,0x1,0xb5,0xcc, + 0x2,0x57,0x2,0xd4,0x4a,0x1f,0x7c,0xcb,0x82,0x0,0x6d,0x3,0xb2,0xfc,0x1c,0x7c, + 0x6e,0xc5,0xe6,0x6d,0x2c,0x95,0x83,0xb0,0x2c,0x51,0x89,0x63,0x43,0xb0,0x1c,0xe4, + 0x68,0xdc,0xef,0x77,0xf3,0x73,0x72,0x73,0xfb,0x9b,0x58,0xb3,0x96,0xcd,0x59,0x93, + 0xbb,0xae,0x67,0x4d,0xa6,0x76,0x66,0x57,0x25,0xf7,0x61,0xcd,0x0,0xc6,0xc5,0x43, + 0x14,0x13,0x56,0xac,0xb8,0x64,0x8,0x31,0xe6,0xab,0x56,0xf7,0x66,0x4d,0x26,0xdc, + 0xce,0x9a,0x74,0xe1,0x46,0x59,0x8b,0xe6,0xac,0x67,0xf7,0x1e,0x6c,0x2b,0xff,0xdc, + 0x46,0xf1,0x8c,0xd4,0xca,0x42,0x31,0x1c,0x88,0x41,0x6e,0x52,0x38,0x6b,0x45,0xe1, + 0x11,0x3b,0x68,0x4c,0xf,0x26,0x33,0x98,0x2f,0x31,0xb5,0xf5,0xa,0x7c,0x73,0xa, + 0x8b,0xd8,0x8a,0xa4,0x24,0xce,0xe8,0x77,0x12,0x30,0x5e,0x7e,0xbd,0xd1,0x63,0xab, + 0x17,0xea,0x8,0x84,0x2f,0xa,0xf0,0xbd,0xc4,0xc7,0xe5,0xcb,0xd,0xec,0xd2,0x65, + 0x14,0xa1,0xb0,0xfc,0xc1,0x17,0x4c,0x99,0x59,0x81,0xb6,0x2,0x67,0x4d,0x8a,0x6e, + 0xac,0xf3,0x98,0x30,0x1,0x70,0x9d,0x2,0xe2,0x58,0x43,0x9d,0x60,0xbf,0x12,0x84, + 0xbd,0xf5,0xba,0x98,0x6,0xc6,0x8,0xb4,0x13,0x7e,0x58,0x30,0x61,0x14,0xe8,0x18, + 0xc2,0xe7,0xda,0xfe,0xdc,0x80,0x6c,0xc7,0x49,0x4f,0x9b,0x66,0xcd,0xd8,0xa8,0xe6, + 0x4d,0x59,0x55,0xbb,0x16,0xec,0xc5,0x4e,0xd7,0xb3,0xcb,0x1c,0x8c,0x3f,0xe8,0xda, + 0xd6,0x4,0x60,0x3e,0x3e,0xe2,0xdb,0x50,0xd6,0xf2,0x55,0x34,0x57,0x68,0xdf,0x92, + 0x4d,0xbe,0xee,0x6a,0xd6,0xfe,0xea,0x66,0x14,0xdb,0x82,0x4c,0x0,0xd9,0x91,0x89, + 0x40,0x98,0xcf,0x37,0xaf,0x71,0xf0,0x2d,0x2a,0x29,0x61,0x6b,0xe0,0xf7,0xad,0x10, + 0x7e,0x5f,0x15,0x57,0x60,0x82,0xad,0xae,0x3a,0x98,0x60,0x6b,0x1a,0x76,0xc6,0x7d, + 0xa5,0x49,0xd0,0x2b,0x56,0x7b,0x5,0xac,0x88,0x1,0xbb,0xe6,0x27,0x2d,0xde,0x1, + 0xcf,0x15,0xa2,0xd3,0xcb,0x4a,0x4b,0xe,0x1a,0x0,0x5c,0xc1,0x1,0x78,0xc9,0xe2, + 0xc5,0x19,0x4b,0x96,0x2c,0xa2,0x8a,0x1e,0xb0,0xe6,0x25,0xe0,0x86,0x31,0xd7,0x84, + 0x80,0x37,0x76,0x65,0xe0,0xec,0xfc,0xae,0x10,0xd9,0x5b,0x67,0x5c,0xd,0xd4,0x78, + 0xfb,0x75,0x9a,0x40,0xde,0x7e,0xf7,0x1d,0xa3,0x1e,0xb4,0xd9,0xf2,0xce,0x7,0xa, + 0x3c,0x84,0x30,0x34,0x70,0xf2,0xe0,0x2b,0x84,0x8f,0xd,0x32,0x22,0x18,0x14,0x1e, + 0x52,0xe4,0x16,0x1f,0xe3,0x93,0x20,0xc0,0x3,0xf9,0xa3,0x8,0x1e,0x42,0xa0,0x17, + 0xce,0xd,0x80,0x1e,0x6c,0xeb,0xe5,0x57,0x5f,0xa1,0x89,0x1f,0x13,0x26,0x4e,0x2e, + 0xa4,0x47,0x58,0x39,0x38,0x6f,0xf8,0xde,0xa3,0x4f,0x1e,0x27,0xe9,0x13,0x92,0x30, + 0x0,0x18,0x40,0x40,0xc,0x6c,0xc9,0xd2,0x0,0x98,0xaa,0x42,0x18,0xe,0x6,0x1c, + 0x60,0xc6,0x8b,0xfc,0xa2,0x21,0x14,0x31,0xcd,0x7,0x4a,0x54,0x2,0x80,0xe1,0x93, + 0x44,0x8a,0xd,0x7e,0x13,0x6a,0x1d,0x63,0x89,0x81,0x28,0x64,0x1c,0x2f,0xc0,0x2, + 0xc7,0x81,0x0,0xa5,0x13,0xcf,0x3d,0x47,0xc7,0x6,0x6,0x87,0xb2,0x8c,0x90,0x3b, + 0x1,0x62,0x38,0x7,0x60,0xab,0x90,0x22,0xd1,0xbb,0x17,0xef,0xcb,0x30,0x7a,0x43, + 0x3e,0x6d,0x8,0xe6,0x7e,0xba,0x4a,0x28,0x3e,0xb0,0x67,0xf,0x4d,0xf0,0x90,0x33, + 0xed,0xb2,0xa4,0xf1,0x18,0x70,0x4d,0x44,0x40,0x9f,0xfc,0x9c,0x6a,0x51,0xd3,0x79, + 0x2f,0x37,0xaa,0x10,0xe9,0x8c,0x74,0x13,0xa4,0x18,0x21,0xb0,0xc,0x8c,0xcf,0x4f, + 0xcb,0xf1,0xea,0x39,0x53,0x2b,0xc1,0xb5,0xa9,0x4,0x58,0x58,0x7a,0x91,0xc1,0x2b, + 0xe9,0xdc,0xce,0xa4,0xa2,0x2a,0x9e,0xe4,0xec,0xa5,0x18,0xd,0xa1,0x54,0x25,0x34, + 0x33,0x40,0x9c,0x0,0x64,0xf8,0x71,0xdc,0xa8,0x79,0x68,0xff,0x7e,0x3a,0x8f,0xa7, + 0xf9,0x39,0xc5,0xf7,0xcb,0x38,0x3,0x5b,0x42,0x8f,0x97,0x8a,0xe3,0x32,0x46,0x20, + 0xff,0xe2,0x7e,0x84,0x4c,0x89,0xa0,0x21,0x1c,0xb,0x5c,0x18,0xf0,0xd9,0x4a,0x43, + 0x62,0x81,0x48,0x5d,0xa3,0xc0,0x31,0x18,0x12,0x82,0xf5,0xa2,0xce,0xb8,0x9e,0x2e, + 0xa5,0xfb,0xae,0x21,0x39,0xc3,0x85,0x0,0x57,0x5,0xc,0x43,0xf8,0xae,0x87,0x73, + 0x43,0xd,0xf2,0x2c,0x7c,0xbd,0xb8,0xaf,0x65,0xa9,0xc9,0x3a,0x71,0x2c,0xc6,0xf9, + 0xb6,0x8c,0x20,0xbc,0x67,0x4f,0x34,0x35,0x89,0x64,0x45,0x68,0xea,0x18,0xee,0x29, + 0x3c,0x83,0x4b,0x57,0xae,0xa6,0x9,0x4d,0x7,0x57,0xc5,0x86,0xcb,0x24,0x98,0x56, + 0x2a,0xc9,0xd9,0x9c,0x18,0x7d,0xe9,0xba,0x40,0x67,0xc7,0x62,0x1d,0x45,0x29,0x10, + 0x59,0x5c,0xbe,0x69,0x2b,0x4b,0xcd,0xcc,0x62,0x87,0xd0,0xe,0xf3,0xa2,0x27,0x47, + 0xe3,0x5e,0x87,0xb,0x1,0xd1,0xd1,0xa8,0x86,0xd6,0xaf,0x5f,0x3f,0x76,0x6b,0x87, + 0x5b,0x28,0xe6,0xa1,0x49,0xeb,0x6b,0x58,0x93,0x4e,0x2d,0xa9,0x86,0x74,0x93,0xe1, + 0xb7,0xb0,0x26,0xf7,0xdd,0xca,0x9a,0x8c,0xea,0xc8,0x9a,0xc,0xed,0xc0,0x9a,0xf4, + 0xba,0x91,0x35,0xe9,0xd8,0x92,0x35,0x6d,0xdd,0x9c,0xb5,0xe0,0xf7,0xc4,0xed,0x9d, + 0x6e,0x63,0xf3,0xe7,0xcf,0x27,0x17,0x9e,0x2c,0xba,0x2f,0x5b,0x22,0x22,0xc5,0x8, + 0xc6,0x54,0x52,0xca,0x5a,0x96,0x5d,0x58,0xe2,0x1f,0x67,0x0,0x80,0x2b,0x7d,0x80, + 0xd0,0xa4,0x67,0x2,0xdf,0xaa,0xd,0xf4,0xdb,0x57,0xa7,0x24,0xb3,0xc3,0x47,0x9f, + 0xf0,0xfc,0xbd,0x42,0x6a,0x6,0xf0,0x62,0x1d,0x3,0x80,0x7c,0xf9,0xd,0x74,0x1f, + 0xbb,0x40,0x25,0x27,0xbd,0x6b,0x86,0xfb,0xd1,0x7b,0x26,0x2f,0x5c,0xe2,0x73,0xe5, + 0xe5,0x46,0xe1,0x2b,0x16,0x60,0xcc,0xc1,0xfb,0xa2,0xf8,0xff,0x8b,0x1a,0x13,0x96, + 0x20,0xdc,0xd0,0x58,0xa7,0x58,0x30,0xd6,0xeb,0x1b,0x5c,0xcc,0x37,0x46,0xe0,0x2b, + 0xb7,0x63,0x9d,0xc0,0x58,0xf8,0x88,0x11,0x95,0xfc,0x24,0x9f,0x5f,0x16,0x2f,0x5a, + 0x44,0x20,0x8c,0x8,0x69,0x18,0xb1,0x8,0xd0,0x6a,0xc1,0xe7,0xac,0x9b,0x9a,0x5d, + 0xc5,0x6,0x5e,0xd3,0x94,0xcd,0x6e,0x79,0x35,0x4b,0xbd,0xfe,0x5a,0x96,0x7f,0x3, + 0xc6,0x75,0x2c,0xbd,0x4d,0x73,0x36,0xaf,0xe5,0x35,0x6c,0x18,0x67,0xcc,0x1d,0xb9, + 0xb1,0xd8,0x8a,0x9f,0xeb,0x5b,0x6e,0xbb,0x8d,0xe2,0x20,0x9e,0xe0,0x6,0xcd,0x45, + 0x11,0x70,0x85,0xef,0xba,0x70,0xd1,0xeb,0xb5,0x4b,0xa,0x3,0x7,0x5f,0x79,0xcf, + 0x14,0x95,0xad,0xf,0xf8,0x7e,0xc3,0x19,0xaf,0x9,0xb2,0xfa,0xff,0xe9,0xf7,0x94, + 0xbc,0x3f,0x97,0x73,0x43,0x57,0x27,0x16,0x81,0xc2,0x54,0x9a,0x4,0xd,0xac,0x78, + 0xf4,0xb1,0x47,0x58,0x71,0x51,0xe1,0x3a,0x13,0x80,0x2b,0x2a,0x9a,0xa4,0x24,0x27, + 0x8f,0x9a,0xc5,0xf,0xa,0xe5,0xbb,0xf0,0x81,0xb8,0x69,0xc,0xf6,0x4b,0xc0,0x52, + 0x13,0x90,0x96,0xb1,0x3d,0xc,0xac,0x5d,0x2c,0x56,0x1f,0xf8,0x3c,0xf5,0x99,0x71, + 0x80,0x5a,0x7f,0x78,0xed,0x3c,0x4a,0xc,0x0,0xaf,0xac,0x31,0xc,0x46,0xac,0xe7, + 0xa3,0xba,0x52,0x27,0xa4,0xbc,0xa6,0xf7,0xd9,0x74,0x76,0x9c,0x71,0x14,0x9d,0x77, + 0xd5,0xbf,0xb5,0x6b,0x1a,0x53,0xc8,0xf9,0xb9,0xd7,0xd8,0x1d,0x9d,0x3b,0x93,0xff, + 0x94,0x18,0xb0,0x2e,0x41,0xeb,0x35,0x9b,0x65,0x21,0xf,0x91,0x76,0x44,0x95,0xae, + 0xc4,0x6b,0x59,0xe4,0x63,0x81,0x60,0xba,0x72,0x48,0xdf,0xaf,0xb7,0xdd,0x93,0xa0, + 0xef,0xe8,0xd2,0x95,0x7c,0x92,0xc8,0xb,0xb5,0xcb,0x17,0xc6,0xf4,0x9a,0xd8,0x56, + 0xf3,0x77,0xbb,0x80,0x86,0xde,0xc5,0xa8,0x41,0x14,0xda,0x70,0xd5,0xea,0xae,0x75, + 0x44,0x26,0xdb,0xe7,0xd,0xa0,0x5b,0x58,0x5c,0x44,0x35,0x97,0x63,0xe,0x29,0x53, + 0xae,0xd3,0x7d,0x14,0x66,0xec,0xc5,0x6a,0xd,0x66,0x65,0x77,0xde,0x22,0xb9,0x96, + 0x1b,0x4c,0x98,0xe4,0xd0,0x80,0x0,0x25,0x25,0x7b,0xf6,0x31,0xd3,0x72,0xbc,0xfc, + 0xde,0x24,0xad,0xf7,0xad,0x64,0x8a,0x5e,0x8e,0xf5,0x1c,0x2d,0x32,0x18,0x41,0x5a, + 0xc3,0x46,0x8e,0x64,0x77,0xf,0x18,0xc0,0xba,0xf0,0xeb,0x86,0xc8,0xef,0x66,0x57, + 0x5f,0x4d,0x72,0xfc,0x92,0x65,0xcb,0x48,0x1a,0x7e,0xe1,0xf4,0x8b,0x4a,0xa6,0xd5, + 0xad,0x5f,0x57,0x4e,0xbb,0xed,0x42,0x9,0xe4,0xd0,0x6b,0xef,0xc1,0x58,0x82,0x21, + 0x84,0xf3,0x5,0x9,0x1d,0x6,0x9c,0x67,0x48,0x4c,0xf4,0xa,0x85,0x68,0x86,0xc4, + 0x4a,0x61,0x48,0x0,0x78,0xf5,0xa,0x5d,0xca,0x77,0xcd,0xd,0x89,0xb1,0x22,0xc5, + 0xa8,0x3f,0xb9,0x5b,0xba,0xb3,0xb6,0xed,0x85,0xef,0xfa,0xfa,0xeb,0xd9,0x9c,0xb9, + 0x73,0x85,0xef,0xfa,0x79,0xf2,0x9d,0xd7,0x8,0xc3,0x51,0x81,0x6f,0xbc,0x2,0x3b, + 0x89,0xd4,0x7,0x88,0x9a,0x17,0x44,0x8d,0x6c,0xcc,0x37,0x8b,0xf8,0x3d,0xac,0xe4, + 0x65,0x1,0xb4,0xa,0x40,0xe5,0xba,0x5,0xc4,0x12,0x5c,0x7d,0x60,0xae,0xa,0xf8, + 0x86,0x25,0x73,0xc6,0x6b,0x4,0x65,0x55,0x6d,0xbb,0x9f,0xa5,0x65,0xe5,0x50,0x90, + 0x19,0x7e,0xc3,0xc5,0x37,0x2e,0x93,0x7a,0x1,0x63,0x67,0xda,0x8c,0xe9,0xc4,0x86, + 0x91,0xda,0x5,0x55,0xc,0x39,0xc3,0x5d,0xee,0xe8,0x4c,0x7e,0xe2,0xb6,0x37,0xdc, + 0xc8,0x6e,0x68,0x73,0x3d,0xd,0x4,0x6f,0x75,0xb8,0xa9,0x3,0xa5,0x33,0xf5,0xe1, + 0x6,0xcd,0xdc,0x79,0x73,0xd9,0x4e,0x7e,0xef,0xe1,0x5e,0x97,0x35,0x9c,0x65,0x94, + 0x33,0xc,0x75,0x14,0xa0,0x41,0xb1,0x86,0xbc,0x92,0xa,0x15,0x39,0x1b,0x60,0xc0, + 0x82,0xf5,0x7a,0x80,0x60,0xca,0xcf,0x0,0xe0,0xd5,0xfc,0x5e,0x85,0x1b,0xe7,0xc5, + 0x97,0x9e,0xf7,0x0,0x56,0x0,0x2f,0x96,0x97,0x5f,0x6f,0x20,0x40,0xae,0xa9,0xab, + 0x63,0x27,0x4f,0x3d,0xc7,0x8e,0x3c,0xbe,0x87,0x1d,0x3e,0x50,0xc8,0x9e,0x39,0xb8, + 0x9a,0x3d,0x77,0x70,0x21,0x3b,0xf5,0xf0,0x5c,0x76,0xf2,0xd0,0x12,0x76,0xe2,0x50, + 0xa,0x3b,0xfe,0x48,0x9,0x7b,0xea,0xf8,0x1,0xfa,0x5d,0xb1,0x6,0x30,0xe4,0xb, + 0x2,0x6c,0x5,0x7b,0x56,0x6c,0x5a,0x2c,0x49,0x8a,0xf6,0x46,0x43,0x63,0x9d,0x2, + 0x60,0x5,0xc2,0x62,0x59,0x57,0xef,0x2f,0xeb,0xf8,0x75,0x95,0x0,0xec,0x8d,0x5a, + 0x7a,0xf,0x41,0x51,0xe7,0xab,0xcf,0x11,0x1b,0x9e,0xc5,0xd,0xcb,0x21,0xfc,0x5c, + 0x7b,0x63,0x10,0xeb,0xc5,0xcf,0x35,0x8c,0x4c,0x74,0x52,0xba,0xbe,0x6d,0x5b,0x3e, + 0x8f,0xdd,0xc0,0x5a,0xc3,0x9d,0xc7,0xcf,0x75,0x3b,0xfe,0x3c,0x83,0x5c,0xf4,0xee, + 0xdb,0x87,0xcd,0x98,0x31,0x83,0xfe,0xff,0x3c,0xf2,0x7c,0x31,0x37,0x35,0x78,0x72, + 0x37,0xfc,0xbf,0x4f,0x72,0x12,0x91,0x96,0x91,0xc9,0xd6,0x65,0x64,0x1b,0x41,0x56, + 0x6,0x88,0xea,0x4a,0x8a,0x8c,0x1f,0x28,0xf7,0xef,0xab,0xc2,0x72,0x53,0x51,0xf1, + 0xee,0x49,0xf3,0x73,0xe4,0x76,0xf8,0xef,0xe1,0xa,0x90,0xfd,0x13,0xec,0x74,0x5a, + 0x32,0xa8,0xb5,0xe7,0x1,0x4,0xe8,0xa1,0x87,0x1e,0x64,0x85,0x85,0x5,0xa3,0xc, + 0x1f,0x30,0xd0,0x38,0x3b,0x3b,0xeb,0xd6,0xc9,0x93,0x26,0xfe,0xb6,0x6a,0x43,0x15, + 0x31,0x1e,0xdc,0x4c,0x12,0x24,0xd,0xd0,0x4,0x10,0xd7,0x5a,0xdb,0x34,0x20,0xae, + 0xb1,0xd7,0x1d,0xf2,0xb5,0xfd,0x79,0x51,0x0,0x2c,0x19,0xa5,0xcb,0xd7,0x2c,0x41, + 0x0,0x7,0x9,0xd0,0xc5,0xbe,0x38,0xc8,0x77,0xde,0x7f,0xcf,0xe9,0x3,0xb6,0xa3, + 0xd4,0x5c,0x96,0x4a,0x6d,0xe0,0x44,0xd6,0x6,0x64,0xc4,0x80,0xce,0xef,0x90,0x14, + 0xf1,0x9d,0xb8,0x30,0xf0,0x19,0x42,0x16,0x86,0xef,0x3,0xc,0x78,0x86,0x90,0xe, + 0xa9,0x4f,0x2f,0x7,0x7,0x48,0xc7,0x94,0x6f,0xcb,0xdf,0x3,0x40,0xcb,0x25,0xe4, + 0x6a,0x4,0xfd,0x60,0x29,0x5f,0x63,0x89,0x48,0x6a,0x48,0x90,0xb2,0xba,0xd6,0x2, + 0xc1,0x80,0x91,0x1a,0x83,0xf6,0x71,0xc8,0x6d,0x85,0xe4,0x2c,0xc1,0xd0,0x67,0xa9, + 0xf5,0x46,0x58,0xbc,0x7e,0x4c,0xb5,0x61,0xe5,0x45,0xb5,0x89,0xb7,0xce,0x71,0x9e, + 0xdc,0x8d,0x32,0xf4,0x42,0x18,0x8d,0xc4,0xb0,0xb3,0x73,0x72,0x3c,0x2b,0xb1,0xb1, + 0xde,0x0,0xa7,0x9a,0x78,0x2a,0x48,0x88,0x7c,0x69,0xc7,0x3,0x80,0xd5,0x43,0xb5, + 0x0,0xfb,0x45,0x9a,0x11,0x1e,0x64,0x6a,0xa6,0x20,0x5a,0x2a,0xa2,0xf7,0x32,0x64, + 0x5a,0xb0,0x43,0x80,0x6f,0x92,0xc6,0x14,0x49,0x72,0x86,0x4c,0x3b,0x4b,0x46,0x6, + 0x8f,0x25,0x99,0x17,0x91,0xc1,0x9d,0x84,0xa4,0xdf,0xec,0xea,0x66,0x74,0x1d,0x11, + 0x4d,0xfd,0xcc,0x73,0xcf,0xd2,0xf7,0xbd,0x6,0x99,0x56,0xf8,0xbb,0xc3,0xce,0x93, + 0xa9,0xe4,0xd4,0xfa,0xf7,0xac,0xb,0xd0,0xc4,0xb1,0x60,0x62,0x3c,0x7c,0xf4,0x28, + 0xc9,0xa3,0x3d,0x7b,0xf7,0x22,0xd9,0x59,0x56,0xe9,0x9a,0xa7,0xd5,0x73,0xf6,0xc1, + 0x37,0xcd,0x8b,0x72,0x16,0xe9,0x52,0x73,0x64,0xba,0x14,0xf9,0xae,0xfd,0x14,0x23, + 0xf4,0xf6,0x5,0xe8,0xc2,0x77,0xd,0x29,0x1d,0xfd,0x8a,0xa1,0x7a,0x78,0xbe,0xeb, + 0xd7,0xc,0x9f,0x7e,0x3c,0x7f,0x7c,0x14,0xc3,0x8d,0x17,0xc3,0xe1,0xba,0xde,0x98, + 0x6b,0x96,0x72,0xc3,0x21,0x9f,0x3,0x94,0x62,0x19,0x2,0x34,0x4d,0x60,0xf5,0x81, + 0x57,0x67,0xc7,0x6a,0x52,0xd,0x30,0x5f,0x7f,0x1b,0x80,0x1a,0x13,0x26,0x26,0xce, + 0xaa,0x6d,0x3b,0x59,0x16,0x22,0x8f,0x4b,0x4b,0xd9,0xb3,0x27,0x9f,0x25,0xd0,0x4, + 0x1b,0x86,0xf,0x1f,0x91,0xec,0x6b,0x38,0xcb,0x9c,0x30,0x69,0x22,0xb9,0x5e,0x6, + 0x13,0x18,0x7b,0x2e,0x99,0x41,0xc2,0x3d,0x5,0xd5,0x60,0xa,0x3f,0xbf,0x69,0xfc, + 0x1c,0xa2,0xb2,0x9a,0xf,0xbc,0x3e,0xeb,0xc5,0xbd,0xf1,0xd8,0x13,0x8f,0x51,0x17, + 0x23,0xf8,0x9,0x6d,0x5f,0xb5,0x2,0x80,0xa,0x9f,0x59,0x15,0x69,0x40,0x5c,0xac, + 0xd,0x30,0x67,0xf8,0x7b,0xcf,0xd7,0x9c,0x65,0x97,0xa4,0xe4,0xc,0xd6,0xb,0x79, + 0x99,0x3,0x2f,0x19,0xa0,0x8f,0xee,0x64,0xc7,0xf6,0x2c,0x60,0xf5,0x87,0x7,0xb3, + 0x9f,0xbe,0xda,0x83,0xfd,0xfa,0xf5,0x9e,0xec,0x87,0xf,0xfb,0xb3,0xbf,0x7c,0x3e, + 0x9c,0xfd,0x9f,0xaf,0xc6,0xb2,0xff,0xf3,0xcd,0x64,0xf6,0xc3,0x17,0xd3,0xd8,0x6f, + 0x3e,0x98,0xcc,0x7e,0x51,0x37,0x86,0x5d,0x7e,0x66,0x2c,0x3b,0xf9,0xc8,0x2a,0xf6, + 0xcc,0x93,0x7,0xf8,0xe7,0xd6,0x18,0x8c,0x9a,0x86,0x0,0xe3,0x46,0x1,0xc6,0xfe, + 0xd2,0x1b,0x6,0x8,0xb,0xe0,0xad,0xd,0x0,0xaf,0x4,0x63,0x7e,0x9d,0xeb,0xbc, + 0x41,0x3e,0x5a,0x0,0x31,0x7f,0x7e,0xe,0xf0,0x73,0x97,0xc2,0xcf,0xf5,0xa4,0x89, + 0x13,0xd8,0xf0,0x61,0xc3,0xd8,0x50,0xb8,0xfd,0xa0,0x44,0xc,0xf2,0x6,0xc0,0xf9, + 0x5e,0x7e,0xff,0x4e,0x9b,0x3a,0x85,0xa5,0xae,0x5b,0xc7,0xf6,0xef,0xdf,0x47,0xa5, + 0x3c,0x89,0xf5,0x62,0x2e,0x23,0xe0,0xf5,0x52,0xa4,0x50,0xc5,0x71,0x35,0x3f,0x4f, + 0xe8,0x4c,0x64,0x46,0x3b,0xaf,0x37,0xc0,0xb6,0xd0,0x11,0x5,0xed,0x1b,0x6b,0x95, + 0xa6,0x3b,0xa3,0xcc,0xba,0x9f,0xac,0xd8,0x3,0xdc,0x43,0x88,0x5f,0x8,0xab,0x7d, + 0xa1,0xe3,0x1,0xb0,0x9,0xcf,0xda,0x8e,0xed,0x5b,0x7f,0x57,0x58,0x58,0x78,0x9b, + 0x1,0xc0,0x25,0x25,0x25,0x4d,0xf8,0xc6,0x66,0x93,0x26,0x4d,0xf8,0x71,0x11,0x67, + 0x2b,0x47,0xf8,0x4,0x0,0x4b,0x5c,0x7,0x5c,0xc5,0x74,0xb5,0xd7,0x3e,0xfb,0xb5, + 0x5f,0xd7,0x1a,0xe0,0x2d,0xd9,0xb3,0xfe,0xbe,0xd,0xd8,0xf6,0xe7,0x87,0x82,0x73, + 0xcc,0x2d,0x45,0x83,0xad,0xbd,0xf1,0xf6,0x5b,0x34,0xd1,0xbf,0xf3,0xde,0xbb,0x46, + 0x34,0xb4,0x1d,0x88,0x15,0x56,0xa1,0xcb,0x96,0xc8,0xe2,0x56,0xfc,0xa,0xab,0x83, + 0x2d,0x0,0x9,0xac,0xe2,0xf6,0xce,0x77,0x10,0x3,0x6,0x0,0xf,0x13,0x12,0x34, + 0x26,0x7d,0x48,0x89,0xfd,0x7,0xd,0xa6,0x2a,0x4a,0x48,0xe9,0x41,0x1d,0x62,0x2c, + 0xd5,0x18,0xe6,0xaf,0xe3,0x3d,0xf8,0x21,0xb1,0xad,0xdf,0x80,0x81,0xc4,0x88,0x0, + 0xb8,0xb2,0x80,0x7,0xf9,0x80,0xc7,0x8e,0x27,0x0,0xee,0xcf,0x6f,0x5a,0x4,0x98, + 0xd5,0x59,0x2c,0x3d,0x2c,0x67,0xd3,0x36,0x3a,0x6c,0xa6,0x1b,0x58,0x86,0x44,0x27, + 0xbb,0xa,0x61,0x60,0x1d,0xf2,0x26,0xa2,0x91,0xf5,0x3c,0x39,0x17,0x43,0xb4,0xef, + 0x87,0xd0,0xc8,0x79,0xdb,0x18,0xe3,0x9f,0x85,0x1c,0x59,0x0,0x30,0x72,0x63,0xa1, + 0x0,0xa0,0x24,0x24,0x64,0x57,0x9c,0x6b,0x55,0x3,0x19,0x1,0x4a,0x0,0x5f,0xce, + 0x24,0xc0,0x82,0xc1,0x20,0x49,0x72,0x9e,0xa7,0x47,0x6,0x8f,0xa2,0x9c,0x5a,0xe4, + 0x38,0xa3,0x85,0x1f,0x22,0xca,0xaf,0x69,0xde,0x9c,0xd,0xe6,0xdb,0xd0,0xe2,0xf, + 0xa,0x8b,0x8c,0x72,0xae,0x77,0xc9,0xb4,0xf5,0x75,0x91,0xc6,0x9c,0xab,0xd0,0x8c, + 0x6d,0xf8,0xbc,0xf8,0xf2,0x4b,0xe4,0xfe,0x40,0x91,0xd,0x0,0x66,0xf7,0x9e,0xbd, + 0xa8,0x3c,0x24,0x64,0x74,0x28,0x1d,0x1e,0xf8,0xa,0x43,0x82,0x1f,0x8b,0xf2,0x5d, + 0x8b,0x74,0x34,0x48,0xce,0xe4,0xbb,0x16,0x55,0xad,0x7a,0x93,0xef,0xba,0x13,0x45, + 0xb7,0xe3,0x58,0xfa,0xf4,0xeb,0x4b,0xf5,0x97,0x21,0xd9,0x43,0x72,0xa6,0x5c,0x65, + 0x51,0x91,0xa9,0x56,0x96,0x86,0x75,0xa8,0x4e,0x61,0xe9,0x82,0xee,0xec,0x86,0x3a, + 0x4d,0x2d,0xab,0x75,0x7e,0x96,0x3e,0x2f,0xe0,0xd9,0xcd,0xc8,0xce,0xe6,0x93,0x67, + 0x81,0x2,0xce,0x2,0x8d,0xa5,0xe8,0x3,0xef,0xe5,0x95,0x94,0x53,0xf,0x61,0x0, + 0x6a,0x81,0x6,0xd4,0x72,0x2,0xc5,0x76,0xec,0x93,0x2f,0x40,0x57,0x7,0x74,0xef, + 0xf5,0x7a,0x56,0xb5,0xf5,0x7e,0x2f,0x42,0x9a,0xb3,0x61,0xd4,0xb9,0x46,0x7a,0x88, + 0x2c,0x5b,0x59,0x4f,0x81,0x83,0x67,0xc9,0x78,0x84,0x2b,0xe0,0xfe,0xdd,0x3b,0xc9, + 0x20,0x82,0xc2,0x72,0xe0,0xd0,0xc3,0x64,0x84,0x21,0x50,0x55,0xf6,0x19,0x97,0xc5, + 0x35,0x24,0xf0,0x22,0x23,0x3,0xa9,0x4f,0x88,0x72,0x46,0x17,0x23,0x3d,0x70,0xcc, + 0xc9,0xec,0x25,0xfb,0xd5,0x86,0xc,0xbc,0x5a,0xbd,0x76,0x2d,0x67,0xd0,0xe5,0xfc, + 0xdc,0x55,0x73,0x60,0x6c,0x50,0xd1,0xca,0x90,0x91,0x71,0x1f,0x2,0x78,0x4f,0xec, + 0x99,0xc4,0xbe,0x78,0xa1,0x1b,0xfb,0xc3,0x3b,0xdd,0xd8,0x7f,0x7f,0x76,0x37,0x1f, + 0x43,0xd8,0x9f,0x3e,0x1d,0xc9,0x7e,0xf8,0x74,0xc,0xfb,0xd3,0xe7,0x93,0xd8,0x9f, + 0xbe,0x9c,0xce,0xfe,0xfc,0xf5,0x2,0xf6,0x5f,0x3f,0x49,0x62,0x7f,0xf9,0x45,0x3e, + 0x63,0xff,0xb4,0x8d,0xb1,0x7f,0xdd,0xc9,0xfe,0xeb,0x67,0x59,0xec,0xa7,0xb5,0x93, + 0xd8,0xe9,0xc7,0x17,0xb1,0xe7,0x9e,0xf1,0xfc,0x98,0x90,0xa6,0xa5,0x9c,0x2d,0x81, + 0x58,0x6,0x78,0xe9,0x2c,0xd8,0xb,0xc6,0xd2,0x2,0xb1,0xc8,0xd0,0xaf,0xf3,0x47, + 0x4c,0x5b,0xc6,0x3c,0x7f,0xb0,0xe,0xca,0x0,0x50,0xaf,0x54,0x64,0x3,0x7,0xd5, + 0xd7,0xd8,0xd3,0xfc,0x9c,0x1d,0xe2,0xe7,0x76,0xd7,0xae,0x9d,0xc4,0x70,0x1f,0xc0, + 0xb9,0xe6,0xe7,0xfe,0x59,0x7e,0xd,0xce,0xf1,0x6b,0x81,0x9a,0xce,0xd8,0x5f,0x4a, + 0xdd,0x9e,0xaf,0xb9,0x9e,0x9d,0xe3,0xf7,0x2f,0xd4,0x8b,0x55,0xfc,0x99,0xce,0x45, + 0x5,0xb1,0xa,0xdf,0x58,0xd3,0x15,0x10,0x1d,0x88,0x75,0x25,0x45,0x7,0x66,0xdd, + 0x90,0x2b,0x30,0x8c,0x3d,0xd3,0xd5,0x21,0xeb,0x42,0x27,0xa7,0x65,0x52,0x9a,0x23, + 0x3d,0x3b,0x71,0x5c,0x69,0x98,0xff,0x9e,0x3b,0xf5,0x1c,0xdb,0xb8,0x61,0xfd,0x97, + 0x45,0x45,0x45,0x4d,0x81,0xb9,0xea,0xaf,0xb8,0xb8,0x98,0x40,0x98,0x5b,0x1a,0xaf, + 0xa2,0x2d,0xe1,0x23,0x8f,0x3e,0x4a,0x4c,0xd2,0x5,0x82,0x3a,0x23,0x96,0x12,0xb2, + 0xd,0xc8,0x61,0xe0,0x69,0x3,0x6b,0xd8,0xff,0xb9,0x40,0xde,0x15,0xa8,0x23,0xeb, + 0x48,0xcb,0x89,0xc,0x32,0xf4,0x4b,0x67,0x4e,0xd3,0x8d,0x84,0xa2,0x1c,0x7a,0x3a, + 0x4c,0xcc,0xc5,0x82,0x1d,0x93,0x66,0x8d,0x63,0xc2,0xd4,0x65,0x77,0x77,0x13,0x89, + 0x98,0x90,0x1e,0x75,0x79,0xbb,0x81,0x7c,0xc4,0x8,0x4,0x2,0x8b,0xea,0x7c,0xa7, + 0xf,0xc0,0x0,0x4e,0xaa,0x8e,0x35,0x73,0x16,0xf9,0x23,0x51,0xa7,0x17,0x63,0x5, + 0x8d,0x14,0xd5,0xab,0xd7,0xab,0x3,0x6d,0xe,0x30,0x1d,0xf4,0x75,0x85,0xc4,0x8a, + 0x36,0x85,0x12,0x80,0x51,0x1,0xb,0x60,0xe,0x0,0x1e,0xc3,0x1,0x38,0x58,0x22, + 0xb0,0x3e,0x50,0xa9,0xc5,0xc5,0x6c,0x6b,0x22,0xaa,0x99,0xd5,0x28,0x89,0xd5,0x92, + 0x9f,0xad,0x20,0x2c,0x9,0xc0,0x67,0x5e,0x7b,0x85,0xe4,0x67,0xf8,0xd9,0xf4,0x9b, + 0x34,0xca,0x3d,0x21,0xbf,0x2b,0x70,0xdd,0x1d,0xff,0x2b,0x7f,0x3b,0x2c,0x4b,0xf8, + 0xae,0x47,0x8d,0x19,0x4d,0x0,0xc,0x15,0x80,0x7c,0xbf,0x9c,0x35,0xa2,0x6,0x36, + 0xc0,0x17,0x6c,0x11,0x4b,0x55,0x8c,0x82,0xb3,0x49,0xbc,0x2f,0x1b,0xf,0xc8,0xaa, + 0x56,0x48,0x31,0xf2,0x64,0xda,0xe6,0x14,0xa4,0x34,0x75,0xfa,0x74,0xa,0x4c,0xc4, + 0x77,0xbc,0xac,0xcb,0xb4,0x1a,0x58,0x5,0x8a,0xca,0x58,0xf7,0x55,0x8d,0x51,0xcc, + 0xc6,0x7d,0xbf,0xc9,0x73,0x9,0x50,0x84,0x4,0xd,0x86,0x85,0xef,0x47,0xf0,0x17, + 0x8c,0x2d,0x30,0x74,0x5c,0x67,0x59,0x9f,0xda,0x2b,0x12,0x92,0x6c,0xfa,0xae,0x45, + 0xba,0x14,0xea,0x52,0x7b,0xbe,0xeb,0x1e,0x14,0xe1,0x2f,0x73,0xd9,0xc7,0x8e,0x1f, + 0x47,0xf1,0xe,0xa7,0x34,0xdf,0xb5,0x3a,0x96,0x58,0x62,0xd5,0xec,0xe2,0x45,0x35, + 0xeb,0xdb,0x74,0xe5,0xaa,0xda,0x9a,0x3,0xf4,0x6b,0x89,0xde,0xb4,0x28,0x96,0x92, + 0xb4,0x36,0x4d,0x49,0x7e,0x3a,0x40,0x11,0x93,0x95,0x32,0xf2,0xfa,0x8d,0xec,0x81, + 0x87,0xf6,0xb3,0x5d,0xf,0x3e,0xc4,0xb6,0xed,0x7a,0x80,0x58,0xb3,0x4,0x6c,0x9, + 0xce,0x5b,0xee,0xdf,0xc5,0x76,0xed,0xdd,0x47,0xfb,0x94,0x6d,0xd8,0xa4,0x31,0x19, + 0x9f,0xc5,0x0,0x88,0x21,0x49,0x6f,0xdc,0xb1,0x8b,0xd6,0xd3,0x32,0xb3,0xc8,0x50, + 0x84,0x2a,0x80,0x7a,0xbd,0xb2,0x80,0xc,0xb5,0x38,0xbd,0x1c,0xec,0x31,0x2e,0x4b, + 0x84,0xca,0xf2,0x83,0xaf,0x9e,0x7d,0x95,0x7c,0xd9,0x60,0xd5,0x60,0xac,0xe8,0xdd, + 0x2b,0x27,0xed,0x2,0x8b,0x41,0x99,0x6,0x43,0xa5,0x25,0x41,0x57,0xd2,0x80,0xec, + 0x8c,0x2,0x2a,0x78,0x7e,0x6a,0xea,0xce,0x13,0xf8,0x36,0x34,0xca,0x48,0xe7,0x46, + 0xea,0x29,0x7b,0x68,0xc7,0x12,0xf6,0xde,0x53,0x1c,0x78,0xdf,0xbe,0x8b,0xfd,0xf9, + 0x93,0xbe,0xec,0x7b,0xce,0x78,0xff,0xf8,0xe1,0x40,0x3e,0x6,0xb3,0xef,0x3f,0x1a, + 0xca,0xbe,0xff,0x78,0x4,0xfb,0xfe,0x93,0xfb,0x38,0x10,0x8f,0x63,0x3f,0x7c,0x36, + 0x89,0x18,0xf0,0x9f,0xbe,0x9a,0xcd,0xfe,0xc4,0xc1,0xf8,0xcf,0x3f,0x49,0x61,0x7f, + 0xf9,0xbb,0xcd,0x8c,0xfd,0xf2,0x31,0xf6,0x97,0xbf,0x2d,0x62,0x5f,0xbc,0x3a,0x9e, + 0x9d,0x78,0x34,0x9b,0x48,0x3,0xc0,0x5d,0x7,0x5f,0x95,0xca,0xa4,0xa4,0xe8,0x5a, + 0xc3,0x1f,0x5c,0x57,0x5f,0x6b,0x30,0x61,0x62,0xbc,0x82,0xd,0xc7,0x34,0x49,0x1a, + 0xc,0xd8,0x5f,0xd6,0xaa,0xd7,0x32,0x62,0x1a,0x20,0xeb,0x8d,0x46,0x8a,0x64,0x96, + 0x8d,0x14,0xea,0x65,0x80,0x57,0x5d,0xad,0xf2,0x2f,0x63,0x9f,0xe7,0x65,0x44,0xf9, + 0xba,0x34,0x7,0xc8,0xfa,0x60,0x6b,0xaf,0x17,0x69,0x2a,0x84,0x64,0xc0,0xf2,0x1e, + 0x33,0x99,0xaf,0x9,0xc4,0xf2,0x5e,0xc4,0x6b,0xe4,0xe,0x2f,0x5b,0xb5,0x86,0xe6, + 0x6,0xc3,0x5,0xe5,0x20,0x8b,0x78,0xbe,0x60,0xe8,0x3e,0xf9,0xd4,0x71,0x56,0x5a, + 0x52,0xfc,0x9a,0xc4,0x5b,0xf5,0xc7,0x11,0xb9,0x9,0x28,0xf1,0xbc,0xb9,0x73,0x2a, + 0x97,0x2d,0x5b,0x42,0xfe,0x27,0x4c,0x38,0x89,0x0,0x66,0x18,0x70,0xba,0xb6,0x47, + 0x49,0xd8,0xb6,0x4c,0x1d,0x17,0x84,0xed,0x87,0x5e,0xd4,0x82,0x46,0x0,0x4,0x22, + 0x39,0xdf,0xfb,0xe0,0x7d,0xe5,0xd7,0xd5,0x1,0x58,0x56,0x1e,0xb2,0x19,0x4a,0x4d, + 0xd8,0x44,0xa3,0x1,0x3d,0x5,0x9e,0x44,0x4c,0x44,0xba,0x14,0x8d,0xef,0x3b,0xa3, + 0x1,0xb0,0x94,0xa0,0x1,0xc0,0x90,0xa,0x21,0x23,0xcb,0x72,0x81,0x6a,0x48,0xd0, + 0xb5,0xc1,0x57,0x7b,0xd,0x6,0x84,0x81,0xaa,0x57,0xd3,0x4,0xc0,0xe8,0x0,0x3c, + 0x40,0x30,0x60,0xd5,0x9b,0x55,0x7,0x5e,0xbb,0x31,0x86,0x25,0xc3,0xeb,0xb2,0x49, + 0x4d,0x2c,0x7e,0x19,0xd2,0xb0,0x8a,0x2f,0x12,0x84,0x1,0xbc,0x98,0x40,0x60,0xcc, + 0xe9,0x79,0xbf,0x81,0xe8,0x7a,0x2d,0xbe,0x20,0xae,0xdf,0x50,0x63,0xc8,0xf2,0xfb, + 0xf0,0xf9,0x60,0x8d,0x63,0xc6,0x8d,0xa3,0xb2,0x8c,0x90,0x8f,0x51,0x8a,0x13,0x80, + 0x4,0x9f,0xa9,0x2c,0xc9,0xb8,0x54,0x16,0xa3,0x58,0xb0,0x40,0x35,0x1f,0x40,0x7, + 0x23,0x48,0xce,0x7d,0xef,0xbe,0x9b,0xdd,0xd1,0xa5,0xb,0xb1,0x4e,0xf8,0x7b,0xe1, + 0x7b,0x85,0x14,0x9,0x30,0x4,0x3b,0xa2,0x4a,0x50,0xf5,0x9a,0xe4,0x6c,0xe7,0xaa, + 0xbb,0x7e,0x77,0xac,0x36,0x9c,0x31,0x5a,0xa0,0x2d,0x3f,0x1b,0xf7,0xc,0x18,0xd4, + 0x94,0x69,0xd3,0x28,0xfd,0xb,0x1,0x60,0xc3,0xef,0xbd,0x8f,0x24,0x65,0x30,0x5c, + 0xe9,0xfb,0x55,0xe9,0x52,0xb,0x16,0xa,0xdf,0xb5,0xd7,0x48,0x1,0x8d,0x18,0x60, + 0x80,0x50,0x8a,0xd1,0x8d,0x37,0x90,0xbf,0x17,0x51,0xf1,0x8b,0x96,0x2c,0x26,0x23, + 0x5,0x81,0x63,0xf8,0xe,0xe9,0xbb,0x4e,0x44,0x5,0xd2,0x65,0x74,0xfb,0xba,0x85, + 0x1a,0x55,0x56,0xac,0x88,0xd3,0xe0,0x12,0xef,0xe3,0x77,0x1c,0x3e,0x72,0x84,0x2d, + 0xe2,0xf7,0x72,0xb1,0xf0,0x91,0x7a,0x93,0xa2,0xe,0xae,0x15,0x34,0xf0,0xfe,0x89, + 0x93,0x27,0xe9,0xb9,0x6,0x3,0xdc,0xce,0x41,0x18,0x6c,0x18,0xfb,0x20,0x97,0x78, + 0xc3,0xd6,0xed,0x74,0xad,0x10,0x80,0xf4,0xfc,0x4b,0x2f,0x51,0x67,0xa0,0x7c,0xf1, + 0x39,0x6a,0x42,0x15,0xcc,0x58,0x2e,0xcb,0x36,0x6c,0x61,0x1b,0xb6,0xed,0xa4,0x49, + 0x15,0xfe,0xe1,0xcc,0x9c,0x1c,0x72,0x67,0x80,0xfd,0xe2,0x5a,0xe0,0xfa,0xbf,0xc6, + 0x59,0xda,0xd9,0xf3,0x5e,0xb0,0x25,0x24,0x5f,0xa4,0x6a,0x21,0xe0,0xa,0x4d,0x2a, + 0x8a,0x4a,0x4b,0x58,0xa,0x5,0xc1,0xa5,0x51,0x51,0xd,0xe9,0x23,0xb4,0x1,0xd7, + 0x4,0x5d,0x39,0xb1,0xfb,0xc3,0x93,0x44,0x3d,0xf0,0xcd,0xcc,0x2b,0x60,0xa9,0xe9, + 0xe9,0xfc,0xde,0x3e,0xed,0x81,0xaf,0x0,0x3f,0x18,0x2b,0x47,0xe,0x3f,0xc2,0x8e, + 0xee,0x18,0xc3,0xfe,0xd7,0xb9,0x2e,0xec,0x87,0xf,0x7a,0xb2,0x3f,0xbe,0xdf,0x87, + 0x8f,0x7e,0xec,0x8f,0x1f,0xdc,0xcd,0xc7,0x0,0xe,0xc0,0x83,0xf8,0x18,0xc2,0x41, + 0x78,0x98,0x0,0xe1,0x51,0xec,0x7b,0x80,0x30,0x67,0xc3,0x3f,0x7c,0x3e,0x95,0xfd, + 0xf0,0xe5,0x2c,0xe,0xc4,0x73,0xf9,0x98,0xc7,0xfe,0xf4,0xa3,0x15,0xec,0x2f,0xff, + 0x6b,0x3,0x63,0xff,0xb2,0x83,0xfd,0xdb,0x3b,0xd3,0x88,0xd,0xbf,0xf0,0xe2,0x49, + 0xf,0x84,0x49,0x86,0xae,0x53,0x40,0x4c,0xdf,0x7f,0x21,0x66,0xfa,0x82,0x1b,0x1, + 0xb2,0xb5,0x1a,0xe8,0x6a,0xeb,0xf5,0x1e,0xd8,0xfa,0xd2,0x74,0xad,0x21,0x4b,0xfb, + 0x20,0x5c,0x6b,0x31,0xe5,0x5a,0x3,0xb4,0xe5,0xf0,0x0,0xdd,0xcb,0x41,0x7e,0xe2, + 0xf0,0x13,0x94,0xe3,0xbb,0x2e,0x33,0x27,0x90,0x3b,0x1e,0x9,0xbc,0x65,0x7e,0xdc, + 0x40,0xa1,0xa5,0x46,0x48,0x97,0x45,0x81,0x26,0x45,0xfb,0xe0,0x6c,0xca,0xd7,0xd8, + 0xbe,0x74,0xc5,0x2a,0xa,0x66,0xd5,0x33,0x39,0xc2,0x94,0x3a,0x19,0x80,0x55,0x58, + 0x90,0x5f,0x6,0x0,0x6,0xe6,0x1a,0x0,0xc,0x44,0x4e,0x4a,0x5a,0x35,0x66,0xe6, + 0x8c,0xe9,0x6c,0xfb,0x8e,0xed,0x24,0x51,0xe1,0x6,0xaf,0x9,0xf1,0xef,0xba,0x98, + 0xaa,0x2e,0x35,0xa3,0x4f,0xaf,0xf4,0xdf,0x26,0xca,0x74,0xc3,0x80,0x3e,0x8a,0x15, + 0x9b,0x91,0x66,0x31,0xf6,0xee,0xfb,0xef,0xd1,0x3,0x3,0x9f,0xf0,0xeb,0x6f,0xbd, + 0xa1,0x55,0x67,0x72,0xf9,0x81,0x63,0x9,0xf9,0xb0,0xc2,0x80,0xc1,0x5,0xd8,0xfa, + 0x84,0xa,0x60,0xd0,0x1,0x18,0xc,0x18,0x41,0x58,0x5e,0xd0,0x8f,0xd7,0xa0,0x21, + 0x9c,0xed,0x4a,0x60,0xd6,0x5f,0x27,0xa9,0x89,0x17,0xfe,0xe0,0x59,0x7c,0xf2,0x95, + 0x35,0xa3,0xef,0x15,0x3e,0xe0,0x1,0x82,0x1,0xd7,0x69,0x0,0xac,0x83,0x64,0x22, + 0x4d,0x34,0x12,0xcd,0xcd,0xd,0x2b,0xf,0x29,0x83,0xaf,0x2a,0xd7,0xaf,0x27,0xc6, + 0x65,0xfb,0x98,0x6d,0xd6,0x1b,0x74,0x51,0xd4,0x84,0x4e,0xe2,0x3a,0xe3,0x94,0x2d, + 0x29,0x51,0xd8,0xe0,0xe9,0x67,0x4f,0x50,0x5e,0x27,0x2a,0x81,0xa1,0x22,0x18,0x24, + 0xfb,0x31,0x9c,0xd9,0xa2,0xaf,0xed,0x9c,0x85,0xb,0x55,0xad,0x6d,0x30,0x45,0xd5, + 0x7c,0x60,0xf4,0x18,0x55,0xd5,0xca,0x4b,0x31,0x6a,0x49,0xe0,0x8b,0xb4,0x1c,0x94, + 0x61,0xc4,0x33,0xf0,0xa2,0x4c,0xcb,0xd1,0xfc,0xbd,0x91,0xe5,0x57,0xb5,0xfb,0x40, + 0x6,0x32,0xba,0x59,0x7f,0x9d,0x11,0xbc,0x48,0xe9,0x71,0xdc,0x78,0x44,0x40,0x10, + 0xa4,0x6e,0x54,0xd6,0x42,0x44,0x3b,0x8c,0x2,0xb0,0x59,0x18,0xa,0x90,0xca,0x65, + 0xc5,0xab,0x60,0x47,0x26,0xcf,0x90,0xb0,0x53,0x8c,0x10,0x4,0x88,0x86,0xd,0x4f, + 0x9d,0x78,0xc6,0x33,0x24,0xce,0x99,0x86,0x44,0xa8,0xc4,0xec,0x34,0x28,0xea,0x22, + 0xd,0xa2,0x80,0x52,0xa6,0x4b,0xd1,0x11,0x71,0x22,0xde,0x4,0xf5,0xa,0x5b,0xc8, + 0x8f,0x29,0x9f,0x33,0x58,0x1d,0xac,0x8,0x80,0xd5,0xa8,0x20,0x90,0x5d,0xbf,0x79, + 0x2b,0x3f,0x96,0xd3,0x24,0x7b,0xc2,0xd8,0xae,0xd8,0xb8,0x85,0x98,0x2f,0x26,0xc7, + 0x67,0x9e,0x7b,0x8e,0x4a,0x25,0xc2,0x85,0xb6,0x79,0xc7,0x4e,0xda,0x2e,0x7d,0xc0, + 0x3a,0x93,0xf6,0x41,0xd8,0xff,0x6c,0x44,0x27,0xaf,0xdf,0xb2,0xdd,0x3,0x63,0xbe, + 0x9e,0x99,0x5f,0xe8,0x35,0x37,0xe0,0x13,0xfd,0x5a,0x6d,0x0,0x6c,0xd7,0xac,0xf3, + 0xfc,0xef,0x0,0x0,0x44,0x36,0xcb,0xb4,0x14,0xf5,0x5d,0x1a,0xe8,0xea,0x1,0x63, + 0xfa,0x7b,0xde,0x6f,0xa9,0x50,0x80,0x5c,0x28,0xd8,0x6f,0x41,0x29,0xf2,0x7c,0x93, + 0x39,0xc0,0x1f,0x25,0xf0,0xad,0x6f,0xa8,0xf5,0x22,0x91,0xb9,0x51,0xf1,0xc4,0x13, + 0xf,0xb3,0x27,0x77,0xc,0x65,0xff,0xbb,0xbe,0xb,0xfb,0xfe,0xfd,0xde,0xec,0xf, + 0xef,0xf1,0xf1,0x6e,0x1f,0xf6,0xdd,0x7b,0x7d,0xd9,0x77,0x1c,0x84,0xbf,0x7b,0xdf, + 0x3,0xe1,0xef,0x3e,0x18,0xc8,0xc7,0x60,0xf6,0x47,0xce,0x84,0xff,0xf8,0xd1,0x8, + 0xf6,0xc7,0x8f,0xef,0xe3,0x20,0x3c,0x86,0x8f,0xf1,0x1c,0x84,0x27,0xb,0x36,0x3c, + 0xcb,0x63,0xc4,0x5f,0xce,0x66,0x7f,0xfe,0x71,0x12,0x63,0xff,0x50,0xc6,0xfe,0xf0, + 0xc9,0x34,0x76,0xf6,0xc8,0x6c,0xf6,0xc2,0xb,0xcf,0x51,0x44,0xf5,0x25,0xe9,0xf, + 0xbe,0x4,0x86,0x5a,0x4b,0x69,0x49,0x8d,0xa,0x80,0xf1,0xc,0xd6,0x6a,0x81,0x58, + 0xb5,0xca,0x17,0x2c,0x81,0x57,0x7,0x50,0x35,0x34,0xe0,0x95,0xc0,0x5a,0x67,0x6d, + 0xb3,0x81,0x99,0xfc,0xc7,0xfc,0x7a,0x57,0x73,0x4c,0x42,0xcf,0x2,0x14,0x6f,0xc9, + 0x2e,0x28,0x16,0x92,0xb3,0xc6,0x60,0xad,0x75,0x23,0xa8,0xcf,0xa,0xb4,0x2a,0xb0, + 0xa2,0xea,0x75,0xd7,0x47,0x81,0x26,0x4f,0x17,0x4,0xd8,0xf4,0x7a,0xfa,0xee,0x94, + 0x75,0xeb,0x68,0x9e,0x33,0x5c,0x68,0x1,0x23,0xd6,0xbb,0xc7,0xa1,0x6c,0xed,0xd9, + 0xb3,0x9b,0xe5,0xe5,0xe5,0x8e,0xa,0x0,0x70,0x61,0x61,0x21,0x6d,0xc8,0xcc,0xcc, + 0xec,0x30,0x61,0xfc,0xb8,0xff,0xa8,0xa8,0xac,0x20,0xcb,0x1f,0x13,0x4f,0x24,0xd8, + 0x86,0x80,0xa7,0x4c,0xc7,0xa1,0x65,0x5d,0xf4,0xfe,0xfa,0x50,0x69,0x3c,0x21,0xa0, + 0x6e,0xc8,0x58,0xb1,0xa0,0x14,0x89,0xf1,0xe6,0xdb,0x6f,0xa9,0x0,0xa8,0xf7,0x3f, + 0xfa,0x20,0xd0,0x8c,0xc1,0x6e,0x81,0x17,0x29,0xb7,0x46,0xe5,0x2c,0x87,0x48,0xd5, + 0xba,0xf,0x18,0x0,0x7c,0x1b,0x2,0x79,0x5a,0xb,0x6,0x3c,0x6a,0x94,0xc8,0x45, + 0xf5,0xca,0x1f,0xa2,0xcb,0xd0,0x32,0x9,0xc0,0x16,0xfb,0x5d,0xe2,0x90,0x9f,0xa5, + 0x4,0x4d,0xb2,0xe9,0x84,0x89,0x14,0x84,0x5,0x0,0x6,0xa0,0x2b,0x0,0xe6,0x3, + 0x52,0x63,0x5d,0x44,0x63,0xf4,0x0,0xf8,0x3a,0x2c,0x38,0x3b,0x5,0xc8,0xa8,0xfb, + 0x1d,0xab,0xd,0x14,0xdf,0xb0,0x7d,0xc0,0x90,0xf2,0x4a,0x38,0x33,0x80,0x92,0x62, + 0xc8,0xb5,0xf5,0x6e,0x5f,0xe0,0x15,0xc7,0x2,0xe0,0xba,0xa3,0xf0,0x3b,0x37,0xb4, + 0xf0,0xfb,0xe1,0x97,0xeb,0xde,0xa3,0x7,0xa5,0xa,0x21,0xcd,0x6,0x2c,0x18,0xc5, + 0x33,0xc0,0xa,0x11,0xd9,0xc,0x9f,0x3b,0x82,0x93,0xbc,0x14,0xa3,0x9,0xaa,0xaa, + 0x55,0x37,0xfe,0x3f,0x28,0x42,0xe1,0x95,0xe,0x6d,0xce,0x86,0x8f,0x1c,0x49,0xbe, + 0x3e,0xdd,0xdf,0x2b,0x8f,0x4b,0xf7,0x67,0x46,0x5,0x1a,0x29,0x40,0x8a,0x13,0x64, + 0xa6,0xaf,0xe3,0x1c,0xa1,0xae,0x39,0x8e,0x9,0xf,0x2b,0x72,0xb0,0x21,0x83,0x83, + 0xd1,0xc3,0x27,0xd,0x83,0x2,0x52,0x34,0x58,0x3b,0x40,0x17,0xea,0x7,0x0,0x19, + 0x1d,0x99,0x64,0x55,0x2b,0xf2,0x5d,0xdf,0xe2,0xfb,0xae,0x11,0x34,0xb4,0x65,0xfb, + 0x36,0xf6,0xdc,0xf3,0x27,0xbd,0xaa,0x56,0xc2,0x77,0x1d,0x13,0x55,0x79,0xe2,0x49, + 0xfc,0xa1,0xc0,0xab,0xfb,0xee,0x5d,0x6e,0x2a,0xed,0xb9,0xd,0x66,0x3e,0xb8,0x5d, + 0x54,0x50,0xab,0xc8,0xf,0x9c,0x5b,0xe0,0x64,0x8d,0x3a,0x78,0x82,0xf1,0xee,0xd8, + 0xbd,0x47,0x5d,0x9b,0xa3,0x4f,0x3e,0x45,0xc0,0x7c,0xf0,0xd1,0xc7,0xbc,0x49,0x9a, + 0x7f,0xde,0x3,0xfb,0xf6,0xd3,0x36,0x3,0x8,0x5,0x0,0x16,0x1a,0xdb,0x2a,0xd, + 0x60,0x94,0xbe,0x63,0xaf,0x6,0xf3,0x26,0x62,0xc7,0xf0,0x15,0xa3,0xae,0x34,0xd, + 0xfe,0x1a,0xdb,0xa9,0x55,0xa0,0xe8,0x61,0xac,0x83,0xab,0xf4,0x31,0x1b,0x3e,0x67, + 0x5b,0x76,0xd6,0x40,0x5a,0x82,0xaf,0x94,0x9e,0xf1,0xbd,0x29,0x69,0x19,0x54,0xad, + 0x4b,0x6,0x3a,0x1,0xe8,0x90,0x3e,0x74,0xec,0xf8,0x11,0xf6,0xf8,0xe6,0xe1,0xec, + 0x5f,0x63,0x9d,0x39,0xe3,0xed,0xc5,0x7e,0xff,0x4e,0x2f,0xe,0xbe,0xbd,0xc5,0xf0, + 0x40,0xf8,0xf,0xef,0x79,0x20,0xfc,0xdd,0xfb,0xfd,0x9,0x84,0xc1,0x84,0xff,0x48, + 0x72,0xf4,0x70,0x3e,0xee,0x15,0x6c,0x78,0x2c,0xfb,0xe1,0xb3,0x9,0x9e,0x2c,0xfd, + 0xf9,0x14,0xf6,0x27,0xe,0xc6,0x3f,0x7c,0x31,0x95,0xc0,0x98,0xfd,0x3c,0x99,0x7d, + 0xf7,0xd1,0x68,0x76,0xfa,0xb1,0x79,0xec,0xe5,0x33,0xa7,0x29,0xc2,0x1a,0x2c,0x58, + 0xe6,0x19,0x5f,0xd0,0x22,0xa2,0xf1,0xbb,0x8,0x84,0xeb,0xbd,0x51,0x57,0xaf,0x31, + 0x57,0xd,0x84,0x75,0x10,0x35,0x19,0x6d,0xad,0x21,0x4b,0x9b,0xa3,0x86,0x96,0x35, + 0xfc,0x3e,0x91,0xfe,0xde,0x97,0xf9,0x3d,0x5c,0x56,0x51,0xc1,0x56,0x25,0xaf,0xe5, + 0xd7,0xb6,0xcc,0x3,0x47,0x9b,0xcd,0x26,0x34,0xd6,0x1b,0xf7,0x83,0x7e,0x2d,0xe4, + 0xfd,0xa0,0xcb,0xcd,0x85,0xe2,0x3a,0xfa,0xf7,0xcf,0x7a,0x96,0x9c,0x9a,0xc1,0x2a, + 0x38,0xc1,0x88,0xa9,0x8c,0x1,0xb7,0xd2,0x23,0x71,0xf0,0xe4,0xa9,0x93,0x6c,0xd3, + 0xa6,0xd,0xdf,0xe6,0xe5,0xe6,0x76,0x0,0xd6,0x2,0x73,0xd5,0x5f,0x41,0x41,0x1, + 0x6d,0xc8,0xcf,0xcf,0x6f,0x32,0x7e,0xfc,0xd8,0xf,0xb3,0x73,0xb2,0x28,0x3d,0x1, + 0x52,0x55,0x75,0x1c,0xc6,0x6a,0x80,0xad,0x35,0x79,0x1a,0x80,0x6a,0x1,0xac,0x4, + 0xdc,0xf3,0x9,0xb0,0x5d,0xc5,0xa6,0x5d,0x0,0x6e,0xd5,0xa6,0xc6,0x4,0xf3,0xde, + 0x87,0x1f,0x90,0xb5,0x8f,0xa0,0x2c,0x30,0x61,0xe5,0xaf,0x69,0xc,0xb6,0x8b,0x72, + 0xca,0xcf,0x8e,0x9,0xc3,0x59,0xd9,0xcb,0x25,0x45,0x2a,0x70,0x88,0x51,0xfb,0xb6, + 0xdb,0xee,0xf0,0x1,0x18,0x91,0xcc,0xf0,0xdb,0x82,0x89,0xa1,0x23,0x8d,0xec,0x7c, + 0x44,0x20,0xbc,0x2a,0xc8,0x82,0x97,0x48,0x40,0x16,0x43,0xa6,0xcc,0x8c,0x18,0x3d, + 0x9a,0x80,0x9c,0xa2,0xa0,0xc5,0x67,0x28,0x9,0x1a,0x0,0x3c,0x6e,0x5c,0xa0,0xc6, + 0x70,0x58,0x94,0x73,0x54,0x90,0x53,0x54,0x3a,0x98,0x94,0xb0,0x5d,0xcd,0xa7,0x71, + 0x6d,0x10,0xb4,0xf2,0xe0,0xde,0xbd,0x71,0xd3,0x52,0xaa,0x1d,0x41,0x79,0xfa,0xcd, + 0x1b,0xa5,0x86,0x48,0x83,0xb,0x1,0x77,0x0,0xfa,0xbb,0xfb,0xdf,0x4d,0x79,0xba, + 0x50,0x1c,0x10,0xc1,0xc,0xff,0x29,0x80,0x9,0x3e,0x51,0x14,0xa1,0x0,0xf0,0x82, + 0x29,0xe,0x1d,0x31,0x92,0x64,0x5a,0x44,0x6,0xa3,0x12,0x14,0x64,0x5a,0x54,0xb7, + 0x9a,0x33,0x6f,0x2e,0xc9,0xe6,0x90,0x17,0xa5,0x4c,0x2b,0x73,0x9f,0xa3,0xd2,0xe9, + 0x74,0x1f,0xa7,0xc1,0xec,0x5d,0x52,0x7a,0x44,0x35,0x39,0x94,0x54,0x85,0x1b,0x5, + 0x86,0x2f,0xa,0xbe,0xc8,0x5a,0xdd,0x60,0xe7,0x0,0x57,0x74,0x2b,0x82,0xaf,0x1a, + 0xc7,0x80,0x63,0xa1,0x74,0x29,0xe9,0xbb,0xee,0xee,0xfb,0xae,0x71,0xbf,0x4d,0x9c, + 0x3c,0x99,0x72,0xb9,0xe1,0xef,0x85,0x21,0x8,0x30,0xd4,0x7d,0xd7,0x51,0x69,0x7f, + 0x61,0x13,0x4a,0x75,0x88,0xb,0x29,0x34,0x7b,0x21,0x22,0x70,0xd3,0x36,0xbe,0x20, + 0xad,0xa2,0xed,0xe1,0x8a,0x35,0x6b,0x35,0xbf,0x9c,0xc6,0x52,0xd5,0x24,0x58,0x49, + 0x7e,0x5f,0x80,0xeb,0xbe,0x83,0x87,0xd4,0xf1,0x3c,0x71,0xec,0x38,0x67,0xbd,0x5e, + 0xf3,0x8b,0x47,0xf,0x1f,0xf6,0x82,0xb4,0xc0,0xa6,0x2d,0xd6,0x69,0x3,0xb2,0xc, + 0xd4,0xa,0xdb,0x8e,0xef,0xca,0xb7,0x24,0x6b,0x19,0xe4,0xa5,0x7f,0xae,0xfa,0x6d, + 0xf4,0x3f,0xe5,0x4e,0xf9,0x5c,0xed,0x27,0x98,0xaf,0x92,0xa0,0xc5,0x12,0xe0,0x9b, + 0x57,0x5c,0x4a,0xc5,0x3a,0x4e,0xbf,0xfc,0x12,0x75,0x29,0x2,0xb0,0xa1,0x1c,0xe4, + 0x4b,0x2f,0x9f,0x61,0x3b,0xcb,0x26,0xb3,0x5f,0xbc,0x72,0x7,0xfb,0xee,0xdd,0x5e, + 0xec,0x3f,0xdf,0x6,0x0,0xf7,0xf6,0x86,0x0,0x60,0x1a,0x60,0xc2,0x1c,0x84,0xff, + 0xf0,0x9e,0x0,0xe1,0xf7,0x7,0x78,0x4c,0xf8,0xc3,0x7b,0x3c,0x36,0xc,0x49,0x5a, + 0x0,0xf1,0xf,0xc4,0x88,0x1,0xc6,0x60,0xc5,0x13,0xd8,0x9f,0x68,0x4c,0x66,0xec, + 0x27,0xb3,0xd9,0x2f,0x2f,0xf,0x64,0x4f,0x1d,0x4c,0x25,0x0,0xbd,0x7c,0xb9,0x9e, + 0x40,0x98,0x18,0xb0,0xe6,0x7,0xae,0xc7,0x68,0xa8,0x13,0x0,0x5c,0xa7,0x0,0x98, + 0xc0,0x53,0xf3,0x3,0xd7,0x8,0x30,0xd,0xb0,0x60,0x8d,0xed,0xea,0xfb,0x28,0x0, + 0x97,0x7e,0x64,0x4,0xb6,0x3d,0xfd,0x14,0xcb,0xc8,0xca,0x26,0xe0,0x33,0x83,0xf2, + 0x2a,0xc,0x69,0x5f,0x2a,0x1a,0x9e,0xd4,0x5c,0xa9,0x0,0x53,0x37,0xbc,0xa,0x6d, + 0x89,0xd9,0x62,0xb7,0xce,0x60,0x2c,0x6d,0x3f,0x18,0x5d,0x4b,0xf8,0xfc,0xd,0xff, + 0xaf,0x9c,0xef,0xa2,0xdc,0xa4,0x50,0x63,0x9e,0x7a,0xfa,0x49,0x56,0x5a,0x52,0xf4, + 0x5e,0x7e,0x5e,0x1e,0x61,0x2d,0x30,0xd7,0x0,0x60,0xc,0x50,0xe3,0x69,0x53,0xa7, + 0x1e,0x5c,0xb1,0x62,0x39,0x49,0x87,0xd2,0xf,0xac,0x5b,0xb3,0x51,0x20,0xec,0x9a, + 0x2c,0xaf,0x84,0x41,0xfb,0x80,0x1b,0xe7,0xf3,0x1d,0x13,0x81,0xe,0x28,0x6f,0xbe, + 0xf3,0x16,0x49,0x93,0xf0,0x5,0x7d,0xf8,0xc9,0x47,0x46,0x57,0xa4,0x7a,0xcd,0x17, + 0x1c,0x15,0xd,0x1d,0x55,0x44,0x24,0xdc,0xf,0x6d,0x26,0x5e,0x13,0x3,0xd6,0x0, + 0x78,0xb8,0x16,0x84,0x85,0x42,0x1a,0xa8,0xdd,0x3b,0x57,0x67,0xc1,0x36,0xe3,0x15, + 0xdb,0x97,0x8,0x9,0x1a,0x1,0x44,0xd4,0x3e,0x6e,0xe2,0x24,0x55,0x4d,0x6b,0xa1, + 0xc8,0x3,0xd6,0x19,0xb0,0x1e,0x84,0x55,0x1b,0xe5,0xe3,0x73,0x18,0x12,0x4e,0xc6, + 0x16,0x33,0x73,0x72,0xed,0x62,0xe3,0x76,0x3,0x1,0xa8,0x27,0x28,0x5,0x89,0xfb, + 0x27,0xa6,0x45,0xa,0xbb,0xd2,0xcb,0xa2,0xdc,0x13,0x81,0x9c,0x71,0x7,0x23,0x86, + 0x81,0xf5,0xf6,0x7b,0xef,0xd2,0x31,0xa0,0x12,0x19,0xfc,0xa6,0x0,0x54,0x14,0x3f, + 0x41,0x73,0x7a,0xe4,0xbe,0x42,0x96,0x5,0x48,0xd,0x14,0x12,0x3d,0x22,0x83,0xd1, + 0xc5,0x8,0xfb,0x40,0x72,0x46,0x23,0x82,0xb4,0x8c,0x74,0xf2,0xf7,0xd9,0x25,0x25, + 0xa3,0x0,0xd4,0x57,0x66,0x6a,0x12,0x3,0xa2,0x88,0xe3,0xc3,0x0,0xf8,0xc2,0x85, + 0x72,0x91,0x2f,0x97,0x2d,0x5f,0xae,0xca,0x44,0x42,0x1a,0x87,0x4f,0x1a,0x7e,0x5d, + 0x30,0x7b,0x18,0xf,0x38,0x16,0xc,0x1c,0x1b,0xba,0x54,0x91,0xef,0xfa,0x9a,0xab, + 0x59,0xfb,0x9b,0xbd,0x92,0x92,0xf0,0x4f,0x42,0x9e,0x95,0x8d,0x14,0x6c,0xdf,0xb5, + 0x7e,0x3c,0xd5,0x8e,0x0,0x4b,0x57,0xae,0xbf,0x9d,0xf7,0x1f,0x2f,0xb6,0x23,0xd2, + 0x7d,0x65,0x6d,0xc3,0xb9,0x46,0xd1,0x9b,0x5,0x4b,0x96,0x91,0x8f,0xcd,0x67,0x1c, + 0x95,0xc6,0xba,0x4,0x31,0x9,0x72,0x47,0x9f,0x7c,0xd2,0x9b,0x4,0xf9,0x6f,0xc7, + 0x12,0x12,0x34,0xd2,0x50,0x28,0x38,0xcb,0x9a,0x94,0x15,0x98,0x6a,0x11,0xd2,0x6, + 0xe0,0x3a,0xc0,0xb6,0xc0,0x2,0x5e,0x3,0xac,0xad,0xcf,0x70,0xfb,0xae,0x4d,0x10, + 0xce,0xd7,0x19,0x57,0xb9,0x90,0xa0,0x5,0x8,0x23,0xf2,0x39,0x39,0x35,0x9d,0xc, + 0x91,0x46,0x6a,0x3,0x28,0x7c,0xac,0xfc,0xb8,0xb6,0x6f,0xcc,0x66,0xaf,0x3f,0x71, + 0x3b,0x7,0xdc,0x1e,0xec,0x77,0x6f,0xf5,0x24,0x0,0xa6,0xf1,0x8e,0xe,0xc4,0x7d, + 0x68,0xfc,0xe1,0x5d,0xc1,0x84,0x39,0x8,0x3,0x88,0xff,0xc0,0x41,0xf8,0xf,0xef, + 0xf,0x54,0x40,0xfc,0xdd,0x87,0x90,0xa5,0xe1,0x1f,0x1e,0x49,0x60,0xfc,0xc3,0xa7, + 0xa3,0x44,0xb0,0xd6,0x68,0x5a,0xff,0xd3,0x67,0x63,0x19,0xfb,0x66,0x34,0xfb,0xf2, + 0x74,0x7f,0x76,0xf4,0xf1,0xdd,0x94,0xa2,0xa4,0xb3,0x60,0x9b,0x1,0x4b,0x10,0x46, + 0x27,0x26,0xdd,0x17,0x5c,0x6b,0xd,0x80,0x2c,0x18,0xad,0x64,0xb6,0x12,0x74,0x6b, + 0x34,0xb6,0x2b,0x7,0x1,0xb1,0x8,0xb8,0x42,0x31,0x20,0x4a,0x31,0xca,0xce,0x13, + 0xfe,0xde,0x4a,0xc3,0x7d,0x20,0x3,0xf1,0x6c,0x60,0x36,0x98,0xab,0xa1,0xa4,0xac, + 0x37,0x41,0xdb,0xbe,0x66,0x16,0xe3,0xd5,0xdf,0x2f,0x14,0x2a,0xc9,0xd2,0xe5,0x2b, + 0x89,0xe4,0xc9,0x0,0xc6,0x28,0x8c,0x80,0x31,0xff,0x18,0x27,0xb4,0x79,0xb9,0x39, + 0x7,0x24,0xd6,0x3a,0x1,0x18,0xd4,0x78,0xc5,0xf2,0xe5,0x53,0xe0,0x7,0xde,0xba, + 0x7d,0x1b,0x3b,0xf1,0xec,0xb3,0x11,0xb2,0xb0,0x64,0xb0,0xd5,0x3e,0xb,0x76,0xb0, + 0x62,0x7d,0x84,0x81,0xb5,0xb,0x80,0xed,0xfd,0x5c,0x20,0x1c,0x0,0xc2,0xfa,0x3a, + 0x83,0x5,0x3,0x0,0xc1,0x90,0x0,0xc8,0xd2,0x87,0x67,0xa7,0xe5,0x44,0xe5,0xa4, + 0x86,0x46,0x6a,0x47,0x32,0x87,0x3a,0xd5,0x39,0x6,0xdf,0xef,0x4d,0xf4,0xad,0xc9, + 0x2f,0x69,0x0,0x30,0xd5,0xf0,0x5d,0x29,0xf2,0x78,0x57,0x8,0x16,0xec,0x8,0xc0, + 0xd2,0x7c,0xbf,0x92,0xfd,0x52,0x47,0x25,0xb4,0x2a,0x14,0x79,0xa1,0xb2,0x14,0xe5, + 0x0,0x31,0x29,0x13,0x3,0xd6,0x0,0xb8,0xce,0xe1,0x83,0x75,0x45,0xec,0x85,0xd6, + 0xf7,0x76,0x54,0x9f,0xaa,0x75,0xa5,0x20,0x35,0xd6,0x93,0x4f,0x4,0xf2,0xd9,0xbe, + 0xfd,0xfb,0x13,0x2b,0xc6,0x80,0xfb,0x28,0xc1,0x78,0x0,0xd7,0xfb,0x30,0xb4,0x3e, + 0xfe,0xf4,0x13,0xf6,0xee,0x7,0xef,0x51,0x51,0x74,0xe4,0x1,0x83,0x1,0x23,0xdf, + 0x15,0xc,0x12,0x45,0x34,0x90,0x52,0x4,0x57,0x0,0x80,0xa,0x6,0x51,0xbb,0x9b, + 0xda,0x93,0x7f,0x15,0xe0,0x86,0xe4,0x7e,0x44,0xbf,0x3e,0x2b,0x4b,0x4a,0x6a,0x2d, + 0x4,0x23,0x19,0x5e,0x80,0xed,0x9a,0xf7,0x64,0x75,0x4,0xb,0x74,0x65,0x14,0xc8, + 0x60,0xa4,0x8f,0x3e,0xf9,0x98,0xbd,0xff,0xd1,0x87,0x34,0x9,0xa3,0xdd,0x20,0xee, + 0x1d,0x3a,0x96,0x6b,0xaf,0xa5,0x8,0xef,0x9b,0x3a,0x74,0x60,0x9d,0x6e,0xbb,0x8d, + 0x7c,0xc3,0x48,0x71,0xc3,0x6b,0xb0,0xfe,0xab,0xb9,0xd1,0x1,0xdf,0x35,0xca,0x70, + 0xa2,0x22,0x9c,0x17,0x38,0x74,0x56,0xdd,0x7,0x1,0x75,0xa1,0x2e,0x8,0x98,0xf1, + 0xaa,0xdc,0x55,0x1b,0x0,0x7c,0x65,0x6e,0xa9,0xb0,0x39,0x44,0xdf,0xf,0x93,0xf4, + 0x4a,0x7e,0x9f,0xc3,0xa7,0xaa,0x4f,0x7a,0x3e,0xc8,0x69,0x40,0xc6,0x27,0x5d,0xb0, + 0x5c,0x4,0x59,0x9d,0x3e,0xe3,0x95,0xce,0x85,0xb1,0x51,0xb1,0x71,0x33,0x75,0xa8, + 0x21,0x30,0x15,0x23,0x0,0x8e,0xf6,0x4,0x6e,0x4c,0xb4,0x95,0x1,0xb6,0x9b,0xaf, + 0x7d,0xa7,0xc1,0x62,0x25,0xe3,0xb5,0xc0,0xda,0x94,0xce,0x83,0xa9,0x52,0x66,0x8a, + 0x55,0x85,0x37,0x84,0xef,0x77,0xcd,0xda,0xb5,0xdc,0x8,0x7c,0x81,0xda,0x0,0xc6, + 0x48,0x7a,0x6e,0xa0,0xbc,0xf0,0xfd,0xa5,0x7d,0xd8,0xaf,0x2f,0xdd,0xc9,0x41,0xb7, + 0x27,0x1,0xf0,0xef,0xde,0xea,0x65,0x80,0xb0,0xb7,0xec,0x4d,0x43,0x1,0x31,0x31, + 0x61,0x3e,0xde,0x7,0x10,0xf7,0x27,0x20,0xfe,0x8e,0x80,0xd8,0xb,0xd2,0x52,0xac, + 0x98,0xc0,0x78,0x38,0x8d,0x1f,0x3e,0x19,0xc1,0x7e,0xe0,0x4b,0xa4,0x31,0xfd,0xd7, + 0x27,0x77,0xb3,0x97,0x1e,0x9e,0x4c,0xae,0x18,0xe4,0x1c,0x5f,0x20,0x1f,0x70,0xad, + 0x88,0x82,0x96,0xf2,0x73,0x8d,0x92,0x9f,0xed,0x60,0x2c,0xc9,0x74,0x25,0xa0,0xea, + 0x20,0xac,0x33,0x5e,0xda,0x56,0x67,0x6e,0xa3,0x14,0xa3,0xea,0x73,0x54,0xd6,0x73, + 0x95,0xf0,0xf7,0x52,0x60,0x9b,0x7e,0x9e,0x3,0xac,0xb6,0x32,0x70,0x9d,0x95,0xeb, + 0x42,0x5d,0xef,0xa,0xf3,0x3e,0xb2,0xee,0xad,0x7c,0x25,0x3f,0x57,0x84,0x7c,0xd6, + 0x7a,0x96,0x9a,0x95,0xc7,0xb2,0x72,0x72,0x12,0xe,0x42,0x86,0x51,0xf,0xff,0x6f, + 0x76,0x76,0xd6,0xf4,0xfc,0x7c,0xf,0x6b,0xa1,0x36,0xab,0x3f,0xbc,0xc8,0xe3,0xd4, + 0x18,0x6f,0x64,0x64,0x64,0xb4,0x1d,0x3f,0x7e,0xec,0xbf,0xc2,0x7f,0x77,0xe4,0xe8, + 0x11,0x62,0x91,0x78,0xd8,0x24,0xd0,0xba,0x86,0x2,0xdb,0xda,0x6a,0x63,0xbf,0x30, + 0x99,0xda,0x6,0x56,0x35,0x34,0xf0,0x3d,0xaf,0xbd,0x57,0xed,0x58,0xf,0xf3,0xf, + 0xca,0x49,0x4,0xc0,0x8b,0x20,0x2c,0x58,0x1f,0x1f,0x7d,0xfa,0x31,0x55,0x74,0x52, + 0x85,0x22,0xf4,0xee,0x2e,0x6,0x8,0xd7,0x1a,0xfe,0x5f,0xbd,0x3a,0x53,0x68,0x8a, + 0x95,0x8,0x34,0xb1,0x23,0x79,0xf1,0xf9,0xb8,0x71,0x25,0x0,0xeb,0x79,0xc0,0xf3, + 0x55,0x7b,0xc1,0xa5,0x82,0x5,0x2f,0x89,0x1f,0xfd,0xc,0xf6,0x3b,0x63,0x26,0xf5, + 0xfd,0xf5,0xd8,0xaf,0xc7,0xa2,0xa9,0x6a,0xd6,0x12,0xf,0x80,0x91,0xc3,0xa,0xc9, + 0x15,0x0,0xac,0x3,0x65,0x4d,0x64,0xa1,0x91,0x3a,0xa7,0x41,0xa1,0xcb,0xbc,0x61, + 0xf9,0xb7,0xae,0x0,0x2c,0xe4,0xe3,0x2,0xd0,0x70,0xde,0xf5,0xc8,0xe7,0xd0,0x3c, + 0x50,0xc7,0x64,0xac,0x4f,0xee,0xe7,0xe3,0x4c,0xe4,0xf8,0xcc,0xf7,0xb9,0xb1,0xf5, + 0xd5,0x37,0x5f,0xd3,0x77,0x4e,0x9a,0x3c,0x89,0xdd,0xd1,0xf9,0xe,0x5,0x5c,0x18, + 0xb2,0xd5,0xe4,0x75,0xa2,0xb5,0x22,0x58,0xef,0x75,0x2d,0x5b,0x90,0x52,0x80,0x88, + 0x7f,0xf2,0xf7,0x5a,0x69,0x39,0x71,0xc1,0x28,0x4e,0xd0,0x60,0x18,0x5b,0x74,0x1e, + 0xaf,0x76,0x3f,0x21,0x87,0xfd,0xab,0x1f,0x7d,0x4d,0xc0,0x89,0x12,0x89,0xa8,0x1, + 0x8d,0x46,0x18,0x74,0x2c,0xfc,0x77,0x83,0xdd,0x3,0x8c,0xaf,0x13,0xed,0x22,0x71, + 0x2c,0x30,0x26,0x86,0x8d,0x18,0x4e,0x39,0xd7,0x88,0xca,0x54,0xbe,0x6b,0xc7,0xb1, + 0xc4,0xb,0x74,0xc,0x5,0xcc,0xba,0xf8,0x1,0x94,0x57,0xa2,0x82,0x19,0xf3,0x83, + 0x70,0x31,0x21,0x83,0x1,0x39,0xca,0xa8,0xb,0x4d,0xf9,0xbc,0x9a,0x94,0x9b,0xaf, + 0x4d,0x9c,0xba,0xdc,0xb,0xb0,0x7d,0x9a,0x13,0x5,0x1c,0x27,0xa2,0x9e,0xbd,0xff, + 0x9,0x2,0xa9,0x3d,0xe9,0xca,0xfd,0x88,0xd,0x97,0x4,0x59,0xb1,0x4a,0x6f,0xd2, + 0xa5,0x65,0x7,0x3b,0x4e,0x98,0x31,0xcb,0xef,0xd4,0xd8,0x95,0xf,0xc0,0x9e,0xff, + 0x37,0x2d,0x3b,0x97,0x82,0xff,0x50,0x6b,0x59,0x1,0x5a,0x7d,0x3d,0x2b,0xcb,0x5f, + 0xce,0xde,0x3b,0xde,0x51,0x3,0x5f,0x7f,0x28,0x10,0x7e,0xdb,0x4,0x61,0x2,0xe2, + 0x77,0x24,0x23,0xf6,0x24,0x69,0x8f,0xd,0x4b,0x59,0x7a,0xa0,0x18,0x2,0x8c,0x3f, + 0xf2,0xc6,0xf7,0x1f,0xdd,0xc3,0xc7,0x10,0x1a,0x7f,0xf9,0x7c,0x30,0xfb,0xf9,0xd9, + 0x1e,0xec,0xb1,0x3,0x1b,0xd9,0xc5,0xcb,0x8d,0x1e,0xfb,0x6d,0xf4,0x41,0x58,0xf9, + 0x80,0x1b,0x84,0xff,0xb7,0xde,0x64,0xbe,0x35,0x42,0x8a,0xae,0x51,0x40,0xeb,0x18, + 0x92,0xf5,0x6a,0xf2,0x34,0xaa,0x5a,0xbd,0xf0,0xe2,0xb,0xac,0xb0,0xa8,0x98,0x2a, + 0x88,0x5,0x40,0xb1,0xd4,0x64,0xb9,0xfa,0xb5,0x35,0xa4,0x69,0xeb,0x9a,0xb8,0x18, + 0x6f,0xbe,0x83,0xe5,0xe6,0x3b,0xc1,0xba,0x52,0x55,0x30,0x43,0xfa,0xd1,0xee,0x3d, + 0xf,0xf8,0x86,0xad,0x43,0x15,0x93,0xaf,0x61,0xd0,0xa3,0x1,0x43,0x55,0x55,0xe5, + 0xbf,0xe5,0xe4,0x64,0xdf,0xc,0xac,0x95,0x23,0x0,0xc0,0x18,0x58,0x9f,0x30,0x7e, + 0x5c,0xf5,0xba,0x75,0x6b,0xc9,0x87,0x84,0x87,0xd9,0x9,0x98,0x21,0xfe,0x59,0x17, + 0x50,0xba,0x80,0x34,0x2e,0x98,0x3b,0xf6,0x77,0x3e,0xbc,0x5a,0xfd,0x65,0x1d,0x24, + 0x70,0x72,0x3e,0xfc,0xf8,0x23,0x3a,0x1,0xc8,0xe3,0x3,0x23,0x76,0x36,0x47,0xd7, + 0xd8,0xa1,0xab,0xee,0xb0,0xb,0xe8,0x5d,0xe0,0x50,0xe3,0x48,0xd1,0x21,0x0,0xbe, + 0xcd,0x67,0xc0,0x12,0x80,0xf5,0x66,0xc,0x8b,0x44,0x10,0xd5,0x2,0xe5,0xb,0x76, + 0x3,0x31,0xf6,0x43,0x95,0x26,0x59,0x7,0x58,0x36,0x6f,0x40,0x10,0xd6,0x7c,0x99, + 0x86,0x24,0x1,0x78,0xfc,0xb8,0xc8,0x62,0x1b,0xb5,0x61,0xb9,0xce,0xae,0x74,0x11, + 0x47,0xce,0xb3,0x4,0x5f,0x3b,0xf0,0xa,0xc7,0xbb,0x61,0xe3,0x46,0x2a,0xd5,0xe8, + 0xaa,0x8,0x15,0x6f,0x22,0x96,0xf7,0x93,0xbc,0xa7,0x5c,0x93,0xb4,0x6b,0xc0,0xc5, + 0xf0,0xf5,0x8f,0xbf,0x61,0xdf,0xfc,0xe4,0xc7,0x64,0x0,0x8c,0x9f,0x30,0x81,0xd8, + 0x23,0x3a,0x7,0xc9,0x7e,0xcf,0x0,0x2e,0x80,0x15,0x9a,0xcd,0x83,0x29,0xa6,0xf0, + 0xfb,0x1b,0xa9,0x4b,0x48,0xcb,0x41,0xc0,0x9e,0x64,0xa0,0xae,0xeb,0x6e,0x4b,0xc8, + 0xca,0xf0,0xb2,0xef,0x89,0xba,0xf0,0x7b,0x25,0x4c,0x41,0xb2,0xb7,0x43,0xa9,0xf9, + 0xe2,0xab,0x2f,0xd9,0x4f,0xfe,0xe6,0xa7,0x14,0x85,0x3d,0x6d,0xfa,0x34,0xa,0x2e, + 0xbb,0xb9,0xc3,0xcd,0xe2,0x58,0x9a,0x93,0x9f,0x17,0x80,0x8c,0x63,0x42,0x94,0xfd, + 0xf2,0x95,0x2b,0xa9,0xd0,0xbf,0x4c,0x31,0xaa,0xb6,0x72,0x95,0xa3,0x72,0xf1,0xc3, + 0xd,0xa2,0x60,0x54,0xba,0xee,0xaf,0xb7,0x8b,0xef,0xe8,0x19,0x13,0x61,0x46,0x77, + 0x3c,0xf5,0xb,0xf7,0x11,0x82,0xf7,0x16,0x2e,0x5d,0x1e,0x90,0x9a,0xf5,0x21,0x59, + 0xad,0x2c,0xc8,0x1,0x0,0x46,0xe4,0xf3,0xf3,0x2f,0xbe,0x48,0xfb,0x53,0x20,0x95, + 0x6,0xb0,0xb6,0xc4,0x5c,0x60,0xcb,0xcd,0xc6,0x24,0xae,0x1,0xb7,0x6,0xca,0x2e, + 0x0,0xe,0x3,0x63,0xd7,0x6f,0xe,0x4,0xfd,0xa8,0xed,0x3e,0x0,0x83,0xe9,0x3d, + 0xcc,0xe7,0x5c,0xb0,0xdf,0x3a,0xf2,0xfd,0xd6,0xf3,0x7b,0xf4,0x38,0x5b,0xbf,0xf6, + 0x2e,0xf6,0xed,0xc5,0xbb,0x8,0x70,0x7f,0xfb,0x26,0x1f,0x82,0x1,0xff,0x4e,0x2d, + 0xf9,0xb0,0x41,0xf8,0x6d,0xf,0x80,0x25,0x10,0x93,0x2c,0xfd,0xae,0x60,0xc4,0xa, + 0x88,0x5,0x18,0xf3,0xf1,0x47,0xa,0xd8,0x1a,0xa8,0x96,0xdf,0x7f,0x34,0x90,0x33, + 0xe1,0x81,0xec,0xcf,0x1f,0xf6,0x64,0x4f,0xef,0x99,0xca,0x89,0xd8,0x59,0x15,0x9, + 0xdd,0xa0,0xb1,0x60,0x8f,0x1,0xd7,0x78,0xd1,0xd0,0xf5,0x7a,0x7a,0x51,0xd,0xd, + 0xc5,0x6e,0xd5,0xfd,0xa6,0x2f,0x35,0x17,0xa2,0x36,0x6f,0xe2,0xb9,0x44,0x8a,0x51, + 0x4a,0x5a,0x66,0x20,0x80,0xce,0x74,0x49,0xb8,0xcf,0xbd,0x52,0x3d,0x1c,0xec,0xb6, + 0x40,0x2b,0xd6,0x62,0x3,0xb8,0x71,0x2f,0x28,0xa3,0xa9,0xc2,0xf8,0x6e,0xc4,0x1e, + 0x2c,0xe2,0xf3,0x2d,0x9e,0x4d,0x59,0xe1,0x2a,0xca,0x0,0xc5,0xf3,0x78,0xe4,0xe8, + 0x61,0x56,0x90,0x9f,0x5b,0x93,0x93,0x93,0x63,0x60,0xad,0xfa,0xcb,0xcd,0xcd,0x55, + 0x3,0x2c,0x78,0xf6,0xec,0x59,0x25,0xb,0xb8,0xf5,0xbd,0x6b,0xf7,0x6e,0xb2,0xa8, + 0x13,0x6,0xd0,0x38,0xb2,0xb3,0x13,0x60,0x35,0xc6,0x1b,0xc6,0x8c,0x43,0x65,0xed, + 0xda,0x6a,0xa7,0x34,0x2c,0x27,0x51,0x34,0xe0,0x86,0x4f,0xd,0x5,0x14,0x3e,0xe0, + 0x60,0xc,0x7f,0xa1,0xdd,0xc3,0xd6,0x2e,0xaf,0x17,0xa5,0xe7,0x57,0x47,0xfa,0xf7, + 0x4c,0xb6,0x83,0x89,0x14,0xd1,0xac,0x9d,0x6e,0xeb,0x44,0xc,0x46,0x4a,0xd0,0xd3, + 0x45,0x6d,0x62,0x80,0xb0,0x4,0x51,0x80,0xac,0xc7,0x82,0x57,0x1b,0xbe,0x5f,0x5d, + 0x7e,0x46,0xf,0x5e,0xb0,0x5f,0x29,0x5f,0xcb,0xb6,0x84,0xb2,0x56,0x74,0x0,0x80, + 0x1d,0xb9,0xbf,0xce,0x94,0x92,0x4,0x9a,0x6b,0xd4,0x38,0x4a,0xab,0xb9,0x1a,0xb3, + 0x83,0x4d,0xee,0xdc,0xb5,0xcb,0xb,0xcd,0xaf,0x37,0xb,0x32,0x38,0x95,0xf,0xeb, + 0x5e,0x88,0x9a,0xa8,0xa3,0xc,0x30,0xc,0xf8,0x4f,0x7f,0xf6,0xb7,0x3f,0xa7,0x81, + 0x7b,0x76,0xc5,0xaa,0x95,0xd4,0xed,0x9,0x35,0x66,0x3b,0x77,0xed,0x42,0xe9,0x38, + 0xe8,0x7c,0x85,0xf6,0x81,0xf0,0x51,0xe3,0x9e,0xc0,0xc3,0x81,0x92,0x92,0x32,0x6a, + 0xbd,0xda,0xf6,0x35,0x5b,0xbe,0xea,0x48,0x36,0x6b,0x18,0x66,0xd5,0xce,0xa0,0xc4, + 0x78,0x81,0x8c,0x72,0x40,0x56,0x7,0x0,0xff,0xe2,0xff,0xfb,0x5b,0xf2,0x47,0xa7, + 0xa6,0xa5,0x51,0x83,0xd,0xb4,0x56,0xec,0x82,0x63,0xe9,0xd2,0x99,0xba,0x54,0xc1, + 0x88,0x80,0xc1,0x1,0x57,0x7,0x8e,0x5,0xfb,0x4a,0x17,0x4c,0x98,0xff,0xbc,0xc6, + 0x1,0xa0,0x57,0x22,0xfb,0x3b,0xb3,0x13,0xac,0xeb,0x19,0xcf,0x60,0x8a,0x8e,0xf3, + 0xa8,0x66,0xcb,0xf9,0x3d,0x9f,0x5d,0x50,0x22,0x98,0x68,0xb9,0x2,0xcf,0x3c,0x7, + 0xa8,0x4a,0x0,0x46,0xa0,0xce,0x29,0x0,0xb0,0xb,0x28,0xc5,0x67,0xd8,0xcc,0x34, + 0x5f,0x0,0xb5,0xfe,0x79,0x6,0xc3,0xb6,0x59,0xb1,0xfe,0x3f,0x1,0x40,0x2f,0xf, + 0x61,0xc9,0xfe,0xff,0x15,0x6,0xc0,0xc4,0x3,0x60,0x48,0xcf,0x5,0xa2,0xae,0x30, + 0x7a,0xd8,0x2,0x7c,0x6b,0x63,0x35,0x14,0x98,0x96,0x93,0x9d,0xce,0x9e,0xdb,0xdc, + 0x9e,0xc0,0xf6,0x37,0x6f,0xf0,0xf1,0xa6,0x0,0x61,0x6d,0x10,0x10,0xbf,0xad,0x3, + 0x71,0x6f,0x5,0xc6,0xb6,0x7f,0xf8,0xf7,0xc2,0x3f,0xec,0x8f,0xbb,0x45,0xd4,0x34, + 0xd2,0x97,0xfa,0xab,0xf1,0x3d,0xc6,0x87,0xfd,0xd9,0x7f,0x7f,0xda,0x97,0xbd,0x71, + 0xac,0x17,0x3b,0x7c,0xf8,0x11,0x76,0x9,0xf9,0xc8,0xd,0x35,0x1a,0xfb,0xf5,0xc1, + 0x57,0x31,0x60,0xf1,0xdb,0x25,0x0,0xd7,0x6,0x40,0x57,0x9b,0x37,0x75,0xf6,0x2b, + 0xc,0x5a,0xe4,0x55,0x27,0x25,0x7b,0x25,0x25,0x8d,0xd4,0x2d,0x7,0xa0,0xda,0xf2, + 0xb0,0x61,0x44,0xb9,0x5c,0x10,0x7a,0x2c,0x81,0xf2,0x1d,0x7,0x41,0xd6,0x8e,0x3b, + 0x90,0xd7,0x1a,0xd7,0xf,0x9d,0xac,0xd2,0x33,0x33,0x7d,0x23,0xba,0xb6,0x3a,0x54, + 0x55,0xc2,0x3d,0xd,0x57,0xd0,0xbe,0x7d,0x7b,0x59,0x66,0x46,0x7a,0x21,0x40,0x17, + 0x18,0x2b,0x97,0xea,0xf,0xc8,0x8c,0xe1,0xbd,0x99,0xdf,0x64,0xd5,0xca,0x95,0x83, + 0x27,0x8c,0x1f,0xfb,0x97,0xca,0xf5,0x95,0x14,0xcc,0x1,0x5f,0x92,0x5b,0x32,0xae, + 0x76,0x4e,0x86,0xf6,0x43,0xe8,0x94,0xaa,0x9d,0x80,0x6a,0x4d,0xcc,0x61,0xb2,0x77, + 0x6d,0x38,0x3b,0xb6,0xa5,0x68,0xa,0x6a,0xb9,0x7c,0x89,0xf6,0xf9,0xf8,0xb3,0x4f, + 0xbd,0xa8,0x56,0x57,0x73,0x86,0x10,0x1f,0x69,0xb5,0x63,0xd2,0x75,0x55,0x6,0xb3, + 0xb7,0xcb,0x1a,0xc5,0x1d,0x3b,0x75,0xa4,0x9e,0xc0,0xca,0x7,0x3c,0x7f,0x41,0xa0, + 0xdb,0xd1,0xa2,0x15,0x2b,0x55,0x57,0xa3,0x65,0x49,0x66,0xee,0x2f,0xda,0xca,0x2d, + 0xd4,0xd8,0xaf,0xac,0x1,0x2d,0xff,0xd7,0x63,0xc3,0x9a,0x4,0x3d,0x74,0xa8,0x97, + 0x7,0xec,0x8,0x2e,0x8b,0x1b,0xb9,0x1a,0x55,0x71,0xcc,0x51,0xb2,0x52,0xf7,0xfd, + 0x22,0x80,0x9,0xbe,0x5f,0xb0,0xb0,0xa8,0x48,0xdb,0x30,0x43,0xac,0x3a,0x64,0xf2, + 0xb6,0x8d,0xb3,0x28,0x16,0x5,0x10,0xfe,0xf9,0xdf,0xfe,0x82,0xfd,0xe3,0xbf,0xfc, + 0x13,0xfb,0xf4,0x8b,0xcf,0x89,0x91,0x23,0x52,0xf1,0xa1,0xfd,0xfb,0x8,0xa8,0x90, + 0x3,0x4b,0xad,0x14,0x29,0xa5,0xa8,0x4e,0xb5,0x89,0x23,0x4b,0xb6,0x2e,0x71,0x7f, + 0xa5,0x33,0xe7,0xfd,0xa,0xe5,0x59,0x17,0x10,0xe9,0xeb,0x70,0x99,0xfc,0xe4,0x67, + 0x7f,0x43,0xc7,0xf2,0xe5,0x37,0x5f,0x51,0xa,0x11,0x8e,0x1,0xb5,0x87,0xe9,0x58, + 0x50,0x6c,0x42,0xb6,0xbc,0x13,0x8a,0x4f,0xbd,0x1d,0xb1,0x1d,0x26,0x35,0x3b,0x2, + 0xda,0xaa,0xe3,0xfc,0xf6,0x78,0x46,0x92,0x1d,0x7,0xf2,0xd7,0xe,0x29,0x43,0xa3, + 0x2a,0x56,0x61,0x99,0x6,0xb6,0x25,0x15,0x81,0x49,0x95,0xa2,0x91,0x39,0x0,0x1f, + 0x7f,0xfa,0x19,0x3a,0x86,0xe7,0x4e,0x9d,0x52,0xf2,0xb1,0x2,0x48,0x1d,0x7c,0x4b, + 0x4c,0x86,0xaa,0x2f,0x25,0xc0,0x1b,0x81,0x5a,0x25,0x36,0x60,0x87,0x33,0x61,0xdb, + 0x57,0x6c,0x7c,0x8f,0xed,0x23,0x56,0xec,0x4b,0x2,0x70,0x5,0x37,0x38,0x8a,0x58, + 0x5a,0x66,0x6,0x3f,0x7,0xe7,0x95,0xfc,0x8c,0xa8,0xee,0x59,0x93,0x6,0xb2,0x4f, + 0x4f,0x74,0x22,0xa0,0x25,0x0,0xa6,0xd1,0x43,0xbd,0x36,0x40,0x58,0xb2,0xe1,0xb7, + 0x4c,0x59,0x5a,0x81,0xb0,0x90,0xa4,0x7d,0x69,0xba,0xaf,0x8,0xd8,0x92,0x91,0xd3, + 0x32,0x97,0xb8,0x9f,0x57,0xd8,0xe3,0xfd,0xbe,0xec,0xcf,0x1f,0xf5,0x65,0xff,0x50, + 0xd3,0x95,0xed,0xbd,0x3f,0x8f,0x2,0xc3,0xc,0xe9,0x59,0xb2,0x5f,0x3e,0xea,0xa4, + 0x2f,0x58,0x97,0x9f,0x35,0x6,0x5c,0x5d,0x6b,0xae,0xfb,0xaf,0xbd,0xfc,0x5e,0xd9, + 0xb4,0x62,0xc5,0xea,0x64,0x96,0x53,0x54,0x6a,0x5,0xc7,0x95,0x7,0x22,0xcc,0x75, + 0x95,0x21,0x60,0xc,0x59,0xc0,0xa9,0xdf,0x2f,0x5,0xf6,0x3d,0xa5,0xdd,0x27,0x5, + 0xb6,0xb,0xc1,0xfa,0x4c,0x18,0x4,0x4b,0x57,0x26,0xb1,0xdd,0xf,0xec,0xa6,0x39, + 0xcf,0x55,0x56,0x55,0x7f,0xd6,0xa0,0xbe,0xa2,0x62,0xd9,0x96,0x2d,0x1b,0xff,0x2b, + 0x23,0x23,0x7d,0xa0,0x24,0xb9,0x12,0x6f,0x3,0x0,0x2c,0x41,0x38,0x33,0x33,0xb3, + 0xe9,0xd8,0x31,0xa3,0x3f,0x42,0x59,0x4a,0x4c,0x60,0xd2,0xa7,0xf4,0xff,0xd7,0x8, + 0xb2,0xe4,0xc4,0xfc,0xcf,0x81,0xe0,0xac,0x98,0x27,0xc5,0x21,0x48,0x87,0x58,0xd2, + 0x1b,0xaf,0xb3,0xf,0x3f,0xf9,0x58,0x15,0xa9,0x70,0x36,0x67,0x88,0x2c,0x16,0x11, + 0x4,0x11,0xa7,0x9c,0x27,0xeb,0xfa,0x72,0xeb,0xe7,0x56,0x2,0x60,0xc1,0x80,0x47, + 0xe9,0x41,0x58,0x4b,0x14,0x93,0x25,0x5f,0x30,0x58,0x30,0xd8,0xb0,0x25,0x3f,0x7b, + 0xa5,0x27,0x67,0x51,0xe1,0x8,0x0,0xee,0x1c,0x62,0xcf,0x4b,0x54,0xeb,0x42,0xd9, + 0x41,0x49,0x46,0x41,0x3,0x80,0x65,0x1a,0x52,0x9d,0x0,0x1a,0xbb,0xaa,0x97,0x93, + 0xc5,0xc7,0xdc,0xac,0xd7,0x29,0x5b,0x6b,0xfe,0x5f,0x9c,0x5f,0x30,0x30,0x4,0xed, + 0xa1,0xd2,0x92,0xd,0xf6,0x61,0x4c,0x2b,0x51,0x95,0xc4,0xe9,0xe2,0xb0,0xae,0xb9, + 0xfe,0x3f,0xb8,0xa6,0x9f,0x70,0x43,0xeb,0xef,0xfe,0xf1,0xef,0xf9,0xf8,0x7,0xf6, + 0xd3,0x9f,0xff,0x8c,0x7d,0xf1,0xf5,0x57,0xec,0x23,0x11,0xa8,0xf5,0xd6,0xbb,0xef, + 0xb0,0x37,0xde,0x7e,0x93,0x72,0x6e,0x65,0x13,0xed,0xbf,0x6,0x38,0x43,0x41,0x34, + 0x8e,0x81,0x68,0x7,0x1a,0x46,0x31,0x7b,0xfc,0x36,0xdc,0xaf,0x7f,0xf7,0xf,0x7f, + 0xcf,0xfe,0xfe,0x9f,0xfe,0x91,0xfd,0xec,0x17,0x3f,0xe7,0x60,0xfc,0x35,0xdd,0xcf, + 0xa8,0xf4,0x86,0x63,0x41,0x80,0xe1,0xe5,0x37,0x5f,0x27,0xd6,0x2c,0x2b,0xb5,0x45, + 0xf9,0x71,0x4d,0xd6,0x1e,0x1,0xb6,0x75,0x35,0x81,0xf3,0xef,0x32,0xb6,0x5d,0x29, + 0x83,0xf1,0x2,0x2f,0xa3,0x5e,0xcb,0x68,0x68,0x92,0xa1,0xf5,0xc8,0x65,0x9b,0x95, + 0x4a,0xd0,0x44,0x20,0xd6,0xfa,0x8d,0xac,0x72,0xd3,0x16,0x56,0xbe,0x61,0x33,0x49, + 0x84,0x7a,0xaa,0x90,0x92,0xa4,0x3,0xac,0xd8,0x9a,0x80,0xc3,0xd8,0xb1,0xe,0xe4, + 0x25,0xd6,0xff,0x59,0x9f,0x17,0x2f,0x7d,0x29,0xc0,0x7c,0xcb,0xb0,0xbd,0x9c,0x96, + 0xe9,0x39,0x79,0x54,0x7d,0xb,0x45,0x2d,0xc0,0x20,0x21,0x3f,0xef,0x3b,0x70,0x90, + 0xcd,0xb8,0xef,0x46,0xf6,0xcf,0x75,0x77,0x11,0xd8,0xfe,0xc7,0xeb,0x3d,0xd8,0x7f, + 0x60,0xc9,0x1,0x58,0x82,0xaf,0xe,0xc2,0x1e,0x10,0xf7,0xf2,0x7d,0xc4,0x6f,0xf7, + 0x52,0x43,0x4a,0xd3,0xbf,0xd7,0x3,0xb5,0xde,0xe9,0xe3,0xa7,0x2f,0x89,0x14,0xa6, + 0x3f,0xbc,0x87,0x7c,0x62,0x6f,0x0,0x80,0xbf,0xff,0x80,0xef,0xf7,0xd6,0x5d,0xec, + 0xa1,0x4d,0xf3,0xe8,0x9e,0x69,0x94,0x5,0x38,0x34,0xf0,0xc5,0x40,0xad,0xea,0x3a, + 0xc9,0x7c,0x63,0x98,0xf,0xab,0x49,0xcd,0x90,0x40,0x5b,0x5d,0x6b,0x93,0x24,0x1f, + 0x7c,0x11,0x34,0x98,0x9d,0x9b,0x47,0x2d,0x4,0x65,0xee,0xb6,0xc9,0x4e,0x83,0xa0, + 0xa9,0xbb,0x23,0xc2,0xc,0x9d,0xa0,0x3c,0x1d,0x8c,0x1,0xb0,0xdd,0x1a,0x2e,0x95, + 0x44,0x6e,0x87,0x61,0x0,0xf9,0x19,0x31,0x23,0x92,0xb1,0xeb,0x2e,0x50,0xfb,0x59, + 0xa0,0xa,0x7d,0x47,0xf,0xb3,0xc2,0x82,0xbc,0xf7,0xb3,0xb2,0xb2,0xae,0xd2,0x71, + 0x36,0x0,0xc0,0xd9,0xd9,0xd9,0x34,0xb0,0xe,0x8a,0x3c,0x63,0xfa,0xb4,0xd,0xb, + 0x16,0xcc,0xf3,0x7a,0x85,0x9e,0x3a,0x99,0x90,0xe4,0xc,0xe9,0x31,0x1e,0xb8,0xda, + 0xfb,0x24,0xf2,0x3f,0x9,0x8d,0xda,0xea,0xd0,0x3c,0x43,0x4c,0xb6,0x88,0x2e,0x45, + 0x6d,0x62,0xf8,0x85,0x51,0x33,0xda,0x2b,0x17,0x69,0x97,0x69,0xbc,0x2,0xb6,0x68, + 0x4b,0x8f,0x96,0xcc,0xa7,0x0,0xb8,0x63,0x47,0xca,0x31,0x95,0x3e,0x60,0x54,0xc2, + 0x42,0xda,0xd0,0x7c,0xab,0xef,0x2f,0x4a,0xc,0x2e,0x16,0x4c,0xd8,0x67,0xc1,0x9e, + 0xef,0x17,0xf9,0x9e,0xb3,0x44,0xe4,0xb3,0xf4,0x1f,0x13,0x78,0xab,0x76,0x84,0xcb, + 0x2,0x0,0xec,0xec,0xcc,0x13,0x33,0x73,0x6f,0x6b,0x34,0xc9,0xbd,0x3a,0xac,0xf8, + 0x42,0xac,0xd6,0x68,0xc4,0x60,0x4b,0xcf,0x38,0x66,0xe4,0xfb,0x3e,0xb8,0xf7,0x41, + 0x55,0x15,0x26,0x8c,0x81,0xc5,0xf3,0xeb,0xcb,0xfb,0xc1,0x56,0x4f,0xe2,0xba,0x31, + 0xac,0x9,0x5d,0x36,0x7e,0x40,0x3d,0xf0,0x4f,0x3f,0xff,0x8c,0x7d,0xf6,0xe5,0x17, + 0x4,0xca,0x88,0x3,0x78,0x93,0x6f,0x3,0xcb,0x92,0xf,0x50,0x58,0xe4,0xbd,0x1d, + 0xeb,0x10,0x8f,0x1d,0x6,0x80,0xb7,0xd6,0x6d,0x2c,0xba,0x80,0xca,0x66,0xff,0xf6, + 0xf3,0x81,0x73,0x8d,0x1c,0x61,0x1c,0xc3,0xe7,0xe2,0x58,0x3e,0xf8,0xf8,0x43,0xba, + 0x8f,0xa1,0xee,0x48,0xd6,0x1b,0xef,0xf7,0x85,0x82,0x71,0x82,0x12,0x79,0xd0,0xe8, + 0xad,0x9,0x75,0x4b,0x39,0x63,0x42,0x42,0x5c,0x54,0x2e,0x10,0x4e,0x59,0x97,0x4a, + 0x32,0x64,0x90,0xd1,0xfa,0x43,0x2,0x2b,0x96,0x0,0xe2,0x3c,0x5d,0x4e,0x2e,0x9, + 0xfa,0x5,0xf3,0x94,0xe4,0x1c,0x4,0x68,0xb5,0xae,0x1,0xb8,0xfc,0x1f,0x93,0x19, + 0xeb,0x9f,0x53,0x6e,0xfd,0x2e,0x8b,0x45,0x19,0xbf,0x47,0x7e,0xae,0xfc,0xbf,0x72, + 0x23,0x38,0x68,0x6d,0x46,0x16,0x45,0xbe,0xa3,0xbb,0xf,0x40,0xc,0xbd,0x6d,0xe1, + 0x7,0x5d,0x35,0xb5,0x25,0xfb,0xf5,0xa5,0xee,0x6,0x0,0xff,0xc6,0x1e,0x6f,0x6a, + 0xd2,0xf4,0x5b,0xa6,0x8f,0xf8,0x3f,0xdf,0x76,0x33,0xe2,0xff,0xc,0xb0,0x62,0x99, + 0x4b,0xdc,0x5b,0x1,0xf0,0x77,0xef,0xf5,0xa6,0x32,0x97,0x7f,0xfa,0xa0,0x7,0x7b, + 0x74,0xf3,0x7d,0x14,0x6d,0xee,0xa5,0x1f,0xd5,0x4,0xd8,0xaf,0x97,0x82,0x54,0x13, + 0xf0,0xfd,0x4a,0x0,0xf6,0xae,0x6f,0xd0,0x35,0x83,0x7a,0x13,0x6b,0x53,0xbd,0x8a, + 0x62,0x85,0xb6,0xcc,0x6f,0x49,0xfd,0xb6,0xaa,0x11,0x4,0xd5,0xa,0x3,0xb8,0x7d, + 0xc3,0xc9,0xbc,0xee,0x36,0x60,0xbb,0x55,0x8c,0x72,0xe3,0x3a,0x2,0xac,0xd7,0xa4, + 0x66,0x50,0x47,0x34,0x7d,0xee,0x70,0x19,0x93,0x38,0x36,0x3c,0xb7,0x8,0x24,0x7b, + 0x68,0xdf,0x5e,0x96,0x91,0x91,0x56,0x21,0xb1,0x55,0x2e,0xd,0x0,0xe6,0xe8,0xac, + 0x0,0x58,0xee,0xb0,0x62,0xf9,0xf2,0x21,0xe3,0xc7,0x8d,0xf9,0x6f,0x54,0xc5,0x3a, + 0x7a,0xcc,0xeb,0x8e,0x14,0xa,0xa2,0xd6,0x84,0x41,0xa3,0xe6,0xbc,0xda,0x2f,0xc, + 0x64,0x8d,0xed,0xb5,0xe6,0x12,0xff,0x1f,0xc6,0x8a,0x5d,0x9f,0x67,0x9f,0xc,0x3d, + 0x8a,0x19,0x4b,0x30,0x6,0x44,0x98,0x42,0x16,0xc0,0xa4,0xc,0xb9,0x52,0x82,0xb0, + 0x2e,0xd7,0x86,0xc9,0xb6,0x61,0xd5,0xbe,0x82,0x11,0xbc,0x3e,0x0,0x43,0x8e,0xbd, + 0xe5,0xd6,0x5b,0x29,0xf,0xd8,0x63,0xc0,0xa3,0x9,0x80,0x3d,0xf0,0xf4,0x25,0x68, + 0xd9,0x9e,0x10,0x6c,0x17,0xef,0x49,0xf6,0x8b,0xbc,0x5f,0x2a,0x35,0x38,0x65,0xaa, + 0xca,0x1d,0x26,0xd6,0x2b,0x18,0x34,0xd8,0xf0,0x2,0xd1,0x2b,0x58,0x2,0xf0,0x60, + 0x9,0xc0,0x8e,0x8,0xe8,0xb0,0x9e,0xcc,0x2e,0x19,0x5a,0x8f,0xa,0x77,0xd5,0x7d, + 0x8e,0x89,0xd6,0x6b,0x90,0x43,0x31,0x71,0xc0,0xda,0xd3,0xe5,0x4f,0xdd,0x7f,0x1a, + 0xe9,0x4e,0xf8,0x2b,0x95,0x91,0xa8,0x28,0x7b,0x7b,0xc2,0x77,0xf9,0x68,0x9c,0xa, + 0x4b,0x6d,0xb5,0x53,0xf6,0x8e,0x97,0x2a,0x17,0xa,0xb2,0xf6,0x77,0x84,0xc4,0x30, + 0x44,0x19,0xb6,0x2e,0x20,0x74,0x5,0x7d,0x9d,0x8f,0xe3,0x2b,0xf,0x73,0x9,0x45, + 0xba,0x2,0xae,0x20,0xde,0x23,0xa,0xec,0xe3,0xc5,0x87,0xd8,0x3,0xca,0x4,0xa2, + 0x4c,0x97,0xae,0x5c,0x4d,0x1,0x33,0x3a,0x70,0xe6,0x49,0x90,0x2c,0x71,0x4f,0xc6, + 0xa,0x44,0x6d,0xe0,0xd4,0x1,0x55,0x14,0xe9,0xc8,0xb,0x48,0x91,0xe5,0x66,0x54, + 0xb4,0xfd,0xba,0x54,0x93,0xa9,0x2d,0xdf,0x74,0x20,0xc7,0xd8,0x6,0x11,0xc5,0xae, + 0xca,0xd,0x70,0xc6,0x6b,0xa4,0x20,0xa1,0x73,0xd2,0xde,0x87,0xf6,0x52,0x4,0x74, + 0xad,0xc8,0xa7,0x1d,0x3b,0x7e,0x22,0x2b,0x58,0xdc,0x9a,0xfd,0xe6,0x75,0xb4,0x17, + 0xe4,0xe0,0xfb,0x7a,0x4f,0x6f,0xbc,0x21,0xc6,0xeb,0x26,0x13,0x36,0x7c,0xc4,0x6f, + 0x45,0x49,0xd3,0xbd,0x2d,0x69,0xba,0x37,0x55,0xd5,0x92,0xeb,0x4,0xc2,0x4,0xc4, + 0xde,0xf8,0xd3,0x87,0x3d,0xd9,0xf1,0x6d,0x3,0x39,0x53,0x3d,0xe9,0x6,0x60,0x9, + 0xbe,0x60,0xbe,0xb5,0xd5,0x1a,0xf8,0x56,0x1b,0xcc,0x57,0xfa,0xf8,0x31,0x4f,0x20, + 0xc5,0x68,0xdb,0x8e,0xed,0xd4,0xc5,0x88,0xea,0x67,0x97,0x55,0x86,0x48,0xc9,0x96, + 0x9f,0xdd,0x71,0xfe,0xf3,0x2d,0x3,0xc9,0xdc,0x5e,0x1e,0x90,0x99,0x6d,0x76,0x6b, + 0xba,0x22,0xdc,0xfb,0xc0,0x10,0x44,0xcf,0x6a,0x34,0xdc,0xd0,0x8b,0x6f,0x84,0x19, + 0xab,0x70,0x11,0x9d,0x78,0xf6,0x4,0xdb,0xb4,0xb1,0xea,0xcf,0x69,0xa9,0xa9,0xfd, + 0x81,0xab,0x12,0x67,0xb1,0xc4,0x30,0x0,0x58,0x1f,0xd8,0x29,0x3d,0x3d,0xfd,0xaa, + 0x31,0xa3,0xef,0x7b,0x3f,0x2d,0x2d,0xd5,0x88,0x86,0xe,0x3,0xd1,0x44,0x99,0xec, + 0xb9,0x4,0x0,0x35,0xea,0xb3,0xe2,0x7d,0x4f,0x98,0xaf,0x16,0x17,0x1d,0xcc,0x1, + 0xc0,0xb,0x60,0x2,0x93,0x40,0x74,0xb4,0x1e,0xc9,0x1b,0x55,0xb0,0x22,0x2a,0xdf, + 0x2b,0x10,0x8c,0x3,0x2b,0x10,0x6d,0xf2,0x38,0x0,0xa3,0x34,0xa0,0x1e,0x5,0x2d, + 0xfb,0x1,0x4b,0xd0,0xd5,0xd9,0x2c,0x7c,0xbd,0xf0,0x7,0xc3,0xa7,0xb,0x16,0x3c, + 0x8f,0x83,0xec,0x7d,0x92,0xfd,0xca,0x7d,0xa5,0xc,0x2d,0x5e,0xcb,0x20,0x2c,0x99, + 0x7,0x8c,0xd6,0x85,0xf0,0x1,0x3b,0x4b,0xb,0xca,0xd2,0x81,0xe,0x83,0xc1,0x66, + 0xbe,0xae,0x96,0x8f,0x76,0xee,0x2f,0xa4,0xa3,0xad,0xdb,0xb6,0x91,0x42,0x52,0x1b, + 0x87,0x85,0xc5,0x9b,0xd0,0x13,0x89,0x90,0x57,0xf7,0x5a,0xa2,0x60,0x5d,0x1b,0x72, + 0xef,0x84,0x30,0x57,0x67,0x94,0x7f,0x88,0xbf,0x3a,0xa,0x58,0xe2,0x29,0x35,0x61, + 0x40,0x1d,0xf8,0x2d,0x61,0x9f,0x1d,0x92,0x71,0x10,0xe6,0xc2,0x9,0x3d,0xff,0x61, + 0xac,0xdf,0xe9,0x97,0xaf,0x49,0xe8,0xb8,0xe2,0xa5,0xe,0x26,0x72,0xfd,0x65,0xf4, + 0x28,0x26,0x3c,0xf2,0x7,0x3a,0x27,0x5a,0x9f,0xb1,0x1a,0x8c,0x54,0x49,0xd3,0xda, + 0xfb,0xae,0x7d,0x4a,0x2b,0xc,0xe6,0xeb,0x1a,0xfa,0x7b,0xc6,0x67,0x94,0x56,0x24, + 0x0,0xd2,0xe5,0x56,0x5b,0xc4,0x72,0xc5,0x7e,0x6d,0x86,0x5,0xf0,0x59,0xbd,0x76, + 0x1d,0x3b,0xf0,0xf0,0x1,0x92,0xa0,0xe1,0x3,0x7e,0xe5,0xd5,0x33,0xac,0xef,0xdd, + 0x3,0x58,0xf9,0xca,0xeb,0x9,0x68,0x7f,0x7d,0xd9,0xeb,0xf1,0xfb,0x6b,0x1,0xc2, + 0x1e,0x20,0xdb,0x8c,0xb8,0x47,0x40,0x92,0x96,0x6c,0xf8,0xb7,0xce,0xd4,0xa5,0xde, + 0x1a,0x23,0xf6,0x4a,0x5b,0xa2,0xaa,0x96,0x57,0xe2,0x52,0x96,0xb9,0xec,0x45,0xd, + 0x1f,0x4e,0xdc,0xdf,0x8f,0x1d,0x7f,0xea,0x29,0x2,0x60,0x1f,0x78,0xab,0x3d,0xe9, + 0x19,0x12,0x74,0x5d,0x35,0x19,0xd,0x41,0xdf,0x6f,0xb5,0xa5,0x6e,0x78,0xc1,0xa9, + 0x68,0xd7,0x88,0x92,0x92,0xb2,0xad,0xa4,0x79,0x3e,0xa3,0x0,0x36,0x91,0xeb,0x65, + 0x83,0x6f,0xb9,0x8a,0x9a,0xcf,0xb3,0xb6,0xdb,0xdf,0x5d,0xa0,0xbb,0x2f,0xb4,0x65, + 0x46,0x6e,0x1,0x4b,0x5a,0xb3,0x86,0x80,0x55,0x27,0x61,0x61,0xf7,0x31,0x8,0x9, + 0x1a,0x46,0xe4,0xe5,0x65,0x7f,0x98,0x91,0x91,0x71,0x95,0xe,0xbc,0x4e,0x0,0xce, + 0xcc,0xcc,0x54,0x6f,0x60,0x1d,0xff,0x30,0x73,0xe6,0x8c,0xc2,0x39,0xb3,0x67,0xb1, + 0xed,0x3b,0x76,0x50,0x6f,0x4c,0xc5,0x6e,0x35,0xd0,0xd,0x6c,0xab,0x9,0x82,0xa9, + 0xfd,0x3f,0x89,0x2,0xab,0xbe,0x2d,0xec,0x33,0x5c,0xdb,0x6c,0x80,0x94,0x40,0x4, + 0xcb,0x1a,0xec,0x57,0xd6,0xdd,0xfd,0xfc,0xab,0x2f,0x55,0x6b,0x31,0xbd,0x3a,0x56, + 0x20,0x37,0x58,0x15,0x2f,0x70,0xd7,0xb3,0x75,0xe6,0xa7,0xf2,0xcf,0x40,0x34,0xee, + 0xcd,0x1d,0x3a,0x50,0xfa,0xc8,0x1d,0x5d,0xbb,0xb2,0xa1,0xf7,0xde,0x47,0x7d,0x5d, + 0x75,0xf9,0x79,0xbe,0x60,0xb4,0x32,0x37,0x98,0xda,0x13,0xae,0x4e,0x26,0xa9,0x19, + 0xf5,0x8b,0x11,0x35,0x2d,0xfd,0xbc,0x1e,0xfb,0x5d,0x66,0xfc,0xf,0xde,0x3,0xa8, + 0x83,0x5d,0xdf,0x8d,0x46,0xd6,0x1c,0x80,0x11,0x5,0xed,0xaa,0x72,0x15,0xaf,0x8c, + 0xa0,0xab,0xe,0xb4,0xab,0xf1,0x2,0xce,0x15,0x35,0x97,0xe6,0xcc,0x17,0x69,0x23, + 0x1,0x3f,0xaa,0x16,0x1d,0xe8,0xc,0xae,0x73,0xdc,0x1b,0xe7,0xae,0x80,0x69,0xf9, + 0xc6,0xdc,0x79,0xa7,0x2c,0x2a,0xdf,0x53,0x72,0x76,0x4,0x8,0x46,0xc7,0x1e,0xd4, + 0x4,0xfd,0xcd,0xb5,0x57,0x96,0x4e,0x67,0x3f,0xf,0x89,0x8e,0x73,0x61,0x0,0x97, + 0x0,0xf0,0x86,0x31,0xe1,0x28,0x40,0x56,0xbf,0xf7,0x7f,0xe0,0x12,0x4a,0xc4,0x38, + 0x8e,0x3c,0x46,0x6d,0xc0,0xa7,0x8d,0xba,0xbf,0x49,0x29,0xa9,0x7e,0x34,0x74,0x1c, + 0xc0,0xcc,0xb7,0xd8,0xad,0x1a,0xc5,0x26,0x88,0xe6,0x69,0xc0,0x2c,0xc1,0xda,0x7f, + 0x5d,0x1e,0x0,0xe6,0xbc,0xa8,0x89,0x5e,0xf,0xd8,0x32,0xd8,0xb8,0x83,0x49,0x97, + 0xba,0x41,0x4,0x0,0x8c,0x7c,0xd7,0x87,0xf,0x1d,0x24,0x6,0xc,0x10,0x7e,0xfa, + 0x99,0xa7,0x58,0x97,0xae,0xdd,0x58,0xf1,0x32,0xe,0xc0,0x0,0xdf,0xcb,0x3d,0xd9, + 0xb7,0x7c,0xf9,0xed,0x65,0x9,0xc6,0x3d,0x14,0x10,0xff,0x46,0xf3,0xb,0xeb,0x20, + 0x1c,0x64,0xc3,0x26,0x13,0xe,0xa4,0x2f,0x29,0x89,0xda,0x1f,0x0,0xe1,0xef,0xdf, + 0xef,0xc9,0x8e,0x6d,0xe9,0xc7,0x8e,0x3d,0xe9,0x1,0x70,0x9d,0xf0,0xf7,0x4a,0xe9, + 0xd9,0x3,0x5f,0xcf,0xef,0x6b,0xb0,0x5f,0x43,0x91,0xac,0xa1,0xb9,0xe3,0xd8,0xf1, + 0x63,0x2c,0x3d,0x2b,0x8b,0x7a,0xe9,0xda,0xca,0x84,0x4b,0x3d,0x90,0xd7,0x24,0xc, + 0x58,0x3,0x41,0x72,0x96,0x1b,0xc2,0x76,0x17,0xd8,0xec,0x36,0x60,0x2c,0x95,0x4, + 0x3,0xf0,0x88,0xfd,0x2e,0x5b,0xc9,0xb6,0x6c,0xdd,0x4a,0xc4,0x2a,0x9e,0x21,0x9, + 0xb5,0xf8,0x14,0x9f,0xfb,0x1f,0x78,0x60,0x17,0x5b,0xb7,0x2e,0xa5,0x12,0x78,0x6a, + 0xf,0x3,0x80,0xb1,0x81,0xa3,0x74,0x60,0x87,0xa4,0xa4,0xa4,0xae,0x63,0xc7,0x8c, + 0xfa,0x6d,0x51,0x51,0x21,0x5,0xd8,0x20,0x5f,0xd2,0x39,0x79,0x46,0xd,0x4d,0x8a, + 0x76,0x3d,0xb0,0x3a,0xb0,0x46,0xb1,0xeb,0x30,0xf0,0x8f,0x9a,0x4,0x5c,0x55,0x49, + 0xc0,0x7a,0x3f,0xfb,0xe2,0x73,0x2,0x54,0x4,0xe3,0x60,0xbd,0x5e,0x8b,0x8c,0x76, + 0x46,0xf,0xc7,0xa2,0x8b,0x31,0x54,0x3b,0x58,0x30,0xfe,0xf,0xcc,0x10,0x85,0xfe, + 0x51,0x4a,0x10,0x39,0xa9,0x68,0x14,0x8f,0x82,0xfa,0x28,0xa8,0x1,0x70,0xc5,0x52, + 0xae,0x23,0xd0,0xa,0xeb,0x58,0x42,0xa6,0xc6,0x98,0x3a,0x7b,0x8e,0xd8,0x6f,0x96, + 0xf1,0xbe,0xbe,0x3e,0x61,0xea,0x34,0x92,0x9f,0xfb,0xf4,0xef,0x4f,0x65,0x9,0x75, + 0x0,0xb6,0x83,0xc7,0x12,0x49,0x37,0xa,0xeb,0x53,0xeb,0xb7,0x59,0xac,0x27,0x76, + 0x82,0xd8,0x0,0xdc,0x13,0xf6,0xb9,0x9,0xf8,0x74,0xc5,0x75,0x70,0xdd,0x1b,0x89, + 0x5c,0xe7,0xa8,0xfb,0xe1,0x4a,0x81,0xc0,0xf9,0x99,0x35,0x89,0x2b,0x38,0x81,0x7d, + 0xe2,0x58,0xc1,0xea,0xb7,0x26,0x2,0xc2,0xb5,0xe,0xa3,0x33,0xce,0xff,0x85,0xfd, + 0x66,0x9b,0xc9,0xc7,0xf3,0xcf,0xc6,0x3,0x7f,0xd7,0xb5,0x8a,0xfa,0x4d,0x91,0xd7, + 0xae,0x26,0xdc,0x7d,0xa5,0x9f,0x3,0xf9,0xfc,0xa0,0x34,0xa5,0xf,0xa0,0x65,0xa, + 0x1c,0xc1,0x9c,0x74,0xbf,0xaf,0xce,0x50,0x7d,0x90,0x2d,0xb,0x82,0x69,0xb1,0xe9, + 0xef,0xf5,0x46,0x99,0x1,0xd8,0xc6,0xbe,0x12,0xd0,0xe5,0x3e,0xc5,0xa6,0x3f,0x59, + 0xff,0xd,0x36,0xe0,0x86,0x32,0xec,0x52,0xfd,0x75,0x99,0x60,0xc0,0xa9,0x6c,0xdf, + 0x81,0x7d,0x5e,0x67,0xa1,0x6,0xb8,0x76,0x1e,0x63,0x9d,0xbb,0xde,0xc5,0x52,0x66, + 0xb6,0x61,0xbf,0xba,0xd0,0x9d,0x7d,0x7b,0xa9,0x87,0x37,0xc,0x10,0x36,0x99,0xb0, + 0x64,0xc3,0xa,0x8c,0xed,0x94,0x25,0x30,0x61,0x23,0x6a,0xda,0xc,0xd6,0xf2,0x41, + 0xb8,0xa7,0x1,0xc2,0x7f,0x7c,0xaf,0x7,0xdb,0x57,0xda,0x8f,0x3d,0x75,0xe2,0x84, + 0x0,0x60,0xd,0x7c,0xc1,0x82,0xeb,0xbc,0x41,0x0,0x5c,0x5b,0xad,0x64,0x68,0x29, + 0x39,0xcb,0x79,0x1,0xe5,0x8d,0xd1,0xc5,0x8,0xa9,0x3c,0x32,0x17,0x37,0x68,0xd8, + 0x98,0x4c,0x35,0xcc,0x10,0xca,0xb3,0xae,0x9f,0xad,0x7c,0x4,0x8c,0x30,0x97,0xbf, + 0xdf,0x4e,0x43,0xd3,0xae,0xa1,0xee,0x56,0x40,0x4a,0xdc,0xe2,0x65,0xcb,0x29,0xf8, + 0x4a,0xb9,0xd4,0x5c,0xcf,0x92,0xb8,0x7f,0x31,0x3f,0x82,0x98,0x94,0x95,0x15,0xff, + 0x76,0xdd,0xba,0x75,0x5d,0x33,0x39,0x96,0x2,0x5f,0xe5,0x90,0x18,0xab,0xfe,0xf4, + 0x37,0xed,0x31,0x76,0xcc,0xe8,0x33,0xcb,0x97,0x2f,0xa3,0x20,0x1b,0x48,0xaa,0xfa, + 0x83,0x63,0xb3,0x4f,0x9d,0xcd,0x84,0x1,0x72,0x14,0x2b,0x96,0x60,0x8d,0x1,0x5f, + 0x6d,0x10,0xcc,0xab,0x23,0x27,0xf0,0x48,0x26,0x1c,0xf3,0xb,0xfc,0x83,0xfd,0x2, + 0x78,0xb1,0xe,0xbf,0x30,0x58,0xb1,0xac,0x1a,0x64,0x37,0x6b,0xb0,0xf3,0x84,0x6b, + 0xad,0x16,0x6b,0x61,0x69,0x24,0xd8,0x4f,0xf9,0x80,0x39,0x3,0x46,0xe5,0x25,0x74, + 0xe9,0xe9,0xd9,0xb7,0x2f,0xeb,0x3f,0x78,0x8,0xf5,0xf3,0x1d,0x30,0xe4,0x1e,0x4a, + 0x1d,0x1a,0x30,0xc4,0x35,0x86,0x88,0xe1,0x6f,0xc3,0xbe,0xfa,0xfe,0xde,0xfa,0x10, + 0xfa,0x4c,0x94,0x24,0xbc,0x67,0xc4,0x8,0x2,0xe0,0x39,0x73,0xe7,0x8a,0xd4,0x9a, + 0xe8,0x8e,0x43,0x76,0x2b,0x39,0x57,0x4b,0x3d,0xfd,0x1c,0x78,0x8d,0xc7,0x5f,0xa3, + 0x7c,0x5f,0x14,0x7e,0x70,0xfa,0x56,0x6b,0x1d,0x0,0xe4,0x0,0xce,0xa8,0x65,0xa2, + 0x6a,0x89,0x6b,0xb2,0xb7,0x65,0x6a,0xfd,0xb5,0x3e,0xf9,0xbb,0x94,0x9a,0xff,0x57, + 0xc1,0x83,0x61,0x0,0x14,0xf7,0x3b,0xe2,0x1c,0xab,0x9b,0x19,0x87,0x7,0x44,0xb9, + 0x82,0xd9,0xaa,0xe3,0x4,0x4e,0x5e,0x9,0x3,0x8e,0x52,0xa4,0x12,0x8a,0xf7,0x70, + 0x9d,0x23,0x6d,0x1d,0x2c,0x18,0xd1,0xb1,0x60,0x4b,0x32,0x25,0x29,0x14,0x40,0x8b, + 0x1d,0xc,0xd7,0x31,0x11,0x1b,0x81,0x56,0x25,0xc1,0x40,0x2b,0x1f,0x68,0xcb,0xcc, + 0x60,0xaf,0x92,0x20,0x50,0xe7,0x85,0x31,0x6f,0x9,0xca,0x9a,0x9c,0xe9,0x83,0x84, + 0x9c,0xf0,0xbd,0x21,0x19,0x70,0x72,0x5a,0x6,0xb5,0xd9,0x8b,0x35,0x78,0xc,0x18, + 0x6c,0xf8,0xce,0x6e,0x3d,0xd8,0x94,0x61,0x2d,0xd8,0x3f,0xd7,0x76,0x23,0xf0,0xfd, + 0x95,0xe,0xc2,0x97,0x4,0x8,0x5f,0x36,0xfd,0xc3,0xbf,0x9,0x48,0xd2,0x3d,0x14, + 0x10,0xdb,0x8c,0xd8,0x2c,0xe8,0xa1,0x4b,0xd4,0xde,0xf8,0xbd,0x60,0xc3,0xbf,0x7b, + 0xa3,0x1b,0xdb,0x94,0x33,0x9c,0x9d,0x7a,0xf1,0x25,0xaa,0xfb,0x2c,0x7d,0xbe,0x86, + 0xef,0x57,0xb1,0xdf,0x6a,0x55,0x78,0x3,0xe0,0x8b,0x79,0xe3,0xf4,0x99,0xd3,0x54, + 0xa0,0x7,0xfe,0x5e,0x94,0x94,0x94,0x6d,0x25,0x3,0xe7,0xd5,0x32,0x98,0xf2,0x1c, + 0xee,0x4,0x1b,0x80,0x9d,0x2e,0x7,0xd7,0xf5,0xb4,0x94,0x8b,0x2,0x8d,0x1,0xdb, + 0xca,0x47,0x9e,0xa5,0x4e,0xac,0x58,0x9d,0x42,0x92,0x79,0x94,0xb,0x56,0x3e,0x83, + 0x14,0x7c,0xf5,0xd2,0x8b,0xec,0xe0,0xc1,0x3,0x2c,0x23,0x3d,0xf5,0x85,0xb4,0xb4, + 0xb4,0x50,0x6c,0x35,0x0,0x38,0x3d,0x3d,0x5d,0xd,0xb9,0x3,0x58,0xf0,0xbc,0x79, + 0x73,0xe7,0x4e,0x9a,0x38,0x9e,0x55,0x6d,0xa8,0xa2,0x2,0x6,0x32,0x18,0x2b,0x1e, + 0xa3,0x89,0x37,0xe2,0xee,0x17,0x7,0x6c,0xa3,0x3e,0xd3,0x98,0x60,0x6d,0x9f,0xad, + 0x0,0x61,0x44,0xc8,0x42,0x82,0xc6,0xd,0x82,0x5c,0x61,0x80,0x70,0xbd,0x48,0x4b, + 0x51,0x72,0xb4,0x8,0x34,0x72,0x6,0x65,0xd5,0x39,0x4a,0xed,0xd5,0x99,0x0,0xc, + 0x5f,0x7,0xaa,0x18,0xb5,0xe0,0xe0,0x8b,0x40,0x2c,0x94,0xe,0x44,0x4e,0x30,0x5a, + 0xcc,0x1,0x30,0xfd,0x71,0xb3,0xf1,0x1a,0x85,0xf7,0x5d,0x4b,0x63,0x88,0x6d,0x28, + 0xbe,0xf,0x86,0x8d,0xee,0x3f,0x13,0xa7,0x4d,0x63,0x23,0xee,0xbb,0x8f,0x6d,0xde, + 0xba,0x45,0x95,0x49,0xb,0x2d,0xb6,0x10,0xd5,0x54,0xc2,0x2,0x5e,0x59,0xa8,0x2, + 0xe0,0x8b,0x1a,0xcf,0x3a,0xf8,0xba,0xd2,0x54,0xae,0x44,0xc9,0x8,0x63,0xa1,0xf1, + 0xee,0x9d,0x78,0x0,0xe2,0xbc,0x7f,0x34,0x99,0x35,0x9e,0x1,0x77,0x25,0x2c,0x3b, + 0xf4,0xff,0x23,0xc0,0x37,0xcc,0xe0,0x70,0x1a,0xaf,0x9a,0x71,0x6a,0x3,0xb6,0x7d, + 0x8c,0x51,0xd2,0x77,0x94,0x61,0x13,0x4f,0x8d,0xb2,0x55,0x83,0x30,0xc9,0x3a,0x11, + 0xe3,0x3a,0xca,0xc5,0xa4,0xff,0x1f,0xee,0xb9,0x63,0xc7,0x8f,0x13,0xb,0xe,0x32, + 0x9f,0x32,0xa7,0x7f,0x37,0x4f,0x63,0xc6,0x6,0x53,0xd6,0x26,0xd9,0xdc,0xa2,0x52, + 0xb,0x68,0x4d,0x9,0xda,0xf,0xe6,0x2a,0xb3,0x7c,0xc9,0x65,0xfe,0x4,0xaf,0x3e, + 0xd7,0x4,0x5e,0xf3,0x77,0x96,0x5,0x80,0x37,0xaf,0xc4,0xf1,0x9a,0x3,0x31,0xca, + 0x50,0x56,0x52,0x1a,0x52,0x8c,0x64,0xe8,0x43,0x8f,0x3e,0xcc,0xfa,0xf4,0xed,0xc7, + 0x7a,0x77,0x69,0xc1,0xbe,0x3c,0xd5,0x85,0x80,0xf6,0x57,0x17,0xbb,0x9b,0x40,0x7c, + 0xc9,0x93,0xa6,0x7d,0xbf,0x70,0x4f,0x33,0x50,0xeb,0xf5,0x1e,0x6,0x20,0x4b,0x10, + 0x36,0xa2,0xa6,0x3,0xfe,0x62,0x13,0x88,0xe1,0x3,0xfe,0x87,0xea,0x2e,0xac,0x30, + 0x7d,0x1a,0xe5,0x25,0x4b,0xc9,0xd9,0x63,0xbc,0xe7,0x45,0xd1,0x8d,0x6a,0x5a,0xfa, + 0x41,0x57,0xd5,0x2a,0xd8,0xa,0x52,0x6c,0x5e,0x41,0x1,0x67,0xf8,0x69,0x1,0xe6, + 0x69,0x0,0xaf,0x7d,0xee,0x2,0xea,0x42,0xb8,0x2a,0xe1,0x62,0xd1,0x41,0x90,0x76, + 0x1b,0x51,0x1,0x0,0xb7,0x24,0xee,0x9c,0xc2,0x52,0x36,0x7f,0xd1,0x62,0xf6,0x24, + 0x67,0xb4,0xb2,0xb8,0x86,0x39,0x77,0x99,0xaf,0x31,0x47,0xc2,0x5d,0xbb,0x79,0xf3, + 0x46,0x96,0x92,0xbc,0x66,0x96,0xc4,0x52,0x1d,0x57,0xe5,0xba,0xfa,0xc3,0x6,0x20, + 0xb5,0x5c,0xca,0x81,0xd7,0x29,0x29,0x29,0xad,0xee,0x1d,0x39,0xe2,0x6f,0x10,0x8c, + 0x75,0xe0,0xe1,0x83,0x4,0x2a,0xae,0x9,0xf2,0x6c,0xb5,0xc9,0x58,0x9d,0xc,0x36, + 0x82,0xd,0xd9,0xeb,0xf6,0xff,0xcb,0xd7,0x51,0x9f,0xeb,0x4f,0x56,0xee,0x49,0xc6, + 0x6e,0x0,0x40,0x69,0x2a,0x90,0xa3,0x51,0x83,0xf7,0xfd,0x77,0xd9,0x97,0x5f,0x7f, + 0x25,0xf2,0x29,0xfd,0x3e,0xb7,0x81,0x72,0x95,0x11,0x2d,0xda,0x8c,0x50,0x74,0xe, + 0xf4,0xf0,0x1,0xf,0x1b,0x3e,0x8c,0xb5,0xbf,0xc9,0x2b,0x89,0x48,0x4c,0xb8,0x45, + 0xb,0x2a,0x25,0x88,0x32,0x82,0xb2,0xac,0xa0,0x1c,0x78,0x8d,0xb2,0x89,0xde,0x68, + 0xae,0x86,0xf7,0xde,0xb5,0x54,0x46,0xf1,0x1a,0x6d,0xbb,0x1c,0x8,0xf2,0x1a,0x3a, + 0x72,0x24,0x9b,0x30,0x75,0x2a,0xcb,0xc9,0xcf,0x27,0x23,0x49,0x85,0xca,0xd7,0xb9, + 0x3a,0xd9,0xd4,0x84,0x36,0x5c,0xd0,0x41,0x57,0xf9,0x7c,0x1b,0x1b,0x14,0xf8,0x42, + 0x76,0xd6,0xcb,0xe,0x9e,0x8f,0xe3,0x4b,0x8c,0xba,0x3e,0x89,0x18,0x58,0xa1,0x13, + 0x74,0x4d,0x1c,0x23,0xee,0x7f,0x0,0xe2,0x7a,0x24,0xbe,0x2e,0x21,0xbb,0x3e,0x3b, + 0xea,0xb7,0x86,0x19,0x13,0xa1,0xbf,0x3b,0x81,0xff,0xd,0x1a,0x2f,0xd5,0x7f,0x35, + 0x83,0x4d,0x94,0xb5,0xeb,0xee,0x24,0x97,0xef,0x3e,0xd2,0x70,0x8,0x1,0x68,0x5b, + 0xa2,0xf,0x3b,0x37,0xc8,0x33,0x87,0xcf,0x70,0x6d,0x46,0x8e,0x11,0xc5,0x6c,0x4c, + 0xa4,0x6a,0x2,0xaf,0x88,0x64,0x55,0xb9,0x1,0xc0,0x34,0x81,0xd4,0x0,0xf5,0xe2, + 0x20,0x8,0x4,0x0,0xd8,0x0,0xe2,0xe0,0x67,0x6,0xfc,0xc7,0xc4,0x86,0xc5,0x7b, + 0xa5,0xa6,0xfc,0x9,0x66,0x98,0x9d,0x9b,0x4b,0x40,0x6,0x6,0x7c,0xf4,0xd8,0x11, + 0x36,0x64,0xc8,0x10,0xd6,0xee,0xc6,0x56,0xec,0xf4,0xce,0x5b,0x3d,0xe0,0xbd,0xd8, + 0x83,0xfd,0x3b,0x7,0xe1,0x5f,0x39,0x40,0xf8,0x5b,0x29,0x49,0xeb,0x8c,0xf8,0xd, + 0x7d,0xf4,0xf0,0xa4,0xe9,0x37,0xb5,0xa8,0x69,0x5a,0xef,0x15,0xac,0xaa,0xa5,0x35, + 0x7b,0xf8,0xfd,0x3b,0x3d,0xd9,0xeb,0x8f,0xdf,0xce,0xa,0xf3,0x53,0xbd,0x0,0x31, + 0xcb,0xe7,0xab,0xd8,0xaf,0x90,0x9e,0x89,0xf5,0xd6,0x79,0x3d,0x7c,0x91,0x21,0x81, + 0x54,0xaa,0xb5,0xe9,0x59,0x8e,0x54,0x30,0x4b,0x39,0xb0,0xcf,0xa7,0xf3,0x3a,0xdb, + 0x40,0xac,0x33,0xe3,0x8a,0x80,0x71,0x64,0xbb,0x1d,0x5c,0x72,0x74,0xae,0x7e,0x7d, + 0x1d,0xe9,0x6c,0x2b,0xd7,0xac,0x65,0x5,0x45,0x45,0xc6,0xbc,0x16,0x65,0x4c,0x3, + 0x1f,0x1f,0x7b,0xfc,0x31,0x96,0x93,0x9d,0xf9,0x37,0x6b,0xd7,0xae,0x6d,0xad,0x63, + 0xaa,0x24,0xb8,0x72,0x5d,0xfd,0xe9,0xa0,0xab,0xef,0x2c,0xe9,0xf3,0x94,0x29,0x93, + 0xd7,0xcf,0x9a,0x39,0x9d,0x98,0x15,0x92,0xe4,0x6d,0x10,0xbc,0x52,0x36,0x1b,0x6, + 0xd4,0x61,0xeb,0x41,0xb0,0x37,0xff,0x9f,0x46,0x9c,0x49,0xd6,0x4c,0x1b,0xf2,0x4b, + 0x85,0x21,0x97,0x12,0xc0,0x2b,0x1b,0x38,0xa0,0xea,0x10,0x4a,0x58,0x4a,0x26,0x1c, + 0x73,0xb0,0x60,0xa3,0xf9,0x7a,0x98,0x3f,0x98,0x2f,0x11,0x9,0x37,0x71,0xd2,0x24, + 0x2a,0x1b,0x88,0x6,0x1,0x6d,0xdb,0xb5,0xa3,0xee,0x3c,0x68,0x99,0xa7,0xf,0x6c, + 0x93,0xdb,0xf5,0xf7,0xe3,0x6d,0xc3,0x0,0xb3,0x46,0x8b,0xbd,0xe5,0x49,0x49,0x6c, + 0xdb,0xfd,0xf7,0x13,0xf8,0xd6,0x58,0x39,0xae,0x61,0xcd,0xed,0x5d,0x51,0xdf,0xb6, + 0xcf,0x57,0x16,0xda,0x40,0x35,0x29,0xd4,0x68,0xd5,0xcb,0xac,0x85,0x15,0x5f,0xb0, + 0x27,0x5b,0xfd,0x5a,0x86,0x4f,0xee,0xee,0x9,0x39,0xf2,0x1e,0xab,0x9,0xf,0xf0, + 0x8b,0x7a,0x60,0xc2,0xa4,0xea,0x44,0x5d,0x1b,0x89,0xc6,0x2f,0x38,0x7f,0x7b,0x8d, + 0x69,0x44,0x9c,0x8b,0x2,0x5a,0x7,0xf3,0xb5,0x8f,0xcb,0x25,0x2f,0xc7,0x8b,0x8d, + 0x48,0x24,0x48,0xca,0xbe,0x6,0x89,0xb8,0xd,0xe2,0x19,0xe,0x67,0x1d,0xd7,0x2d, + 0x6c,0x7e,0xd0,0x59,0x30,0xee,0x3b,0x14,0xe6,0xd0,0x81,0x13,0x2c,0x56,0x31,0x59, + 0x63,0xc2,0xb6,0x26,0x75,0x27,0xb8,0x6,0xc1,0x36,0xdf,0xc1,0x6a,0xe5,0x90,0x93, + 0x74,0xae,0xf6,0x3d,0xb9,0xe2,0xff,0x73,0xd,0x96,0x1c,0x64,0xc8,0xb9,0xf6,0x6f, + 0x29,0x71,0xb0,0x62,0x1,0xc8,0xe8,0x84,0x74,0xe6,0xd5,0x33,0xd4,0x5b,0xf7,0xf9, + 0x17,0x4e,0xb1,0x31,0x63,0x46,0x71,0xe3,0xbd,0x3,0xcb,0x9a,0xd7,0x86,0xfd,0x5b, + 0x43,0x37,0x2,0xdd,0x7f,0xbf,0xd0,0x9d,0x83,0xb0,0x9,0xc4,0xbf,0x72,0xf8,0x86, + 0xff,0x43,0x1b,0xd2,0x4f,0x6c,0x6,0x6b,0xf5,0x54,0xf2,0x74,0x20,0x72,0xfa,0x4d, + 0x9d,0x5,0x77,0x67,0x7b,0xb,0xbb,0xb2,0x9d,0xbb,0x77,0x93,0xfc,0x6c,0xf8,0x7b, + 0xf5,0x21,0xfc,0xbe,0xb5,0xa4,0x30,0x56,0x53,0x1a,0x19,0x24,0x67,0x44,0xf,0xcb, + 0x20,0x3a,0xb7,0xe1,0x52,0x16,0x48,0xd,0xcb,0xb3,0xfd,0xfb,0xae,0xfd,0x43,0x3e, + 0x2b,0x60,0x84,0x59,0x9f,0x55,0x50,0x5a,0xe1,0x30,0xaa,0xca,0x9c,0xf2,0x77,0x4e, + 0x61,0x49,0x80,0xfd,0xba,0xdd,0x42,0xe7,0x15,0xfb,0x7d,0xf6,0xe4,0xb3,0xec,0xfe, + 0xfb,0xb7,0x83,0xfd,0xae,0x77,0xe1,0xaa,0x3e,0xd4,0x5f,0x6a,0x6a,0x2a,0xd,0xf9, + 0x86,0xbe,0xe,0x20,0x5e,0xb5,0x72,0xe5,0xed,0x9c,0x5,0xff,0xef,0xec,0x9c,0x6c, + 0x76,0xe8,0x91,0x43,0x34,0x21,0xcb,0x1f,0x20,0x1,0xd0,0x5,0xac,0xfa,0x88,0x2, + 0xde,0xb8,0xc,0xb7,0xc6,0x67,0xd9,0x61,0x9f,0x77,0x2e,0xe4,0xe1,0x76,0x46,0xbe, + 0xd6,0x56,0x1b,0xac,0xd0,0x3,0xde,0xaf,0xa9,0xfc,0x1f,0xa,0x1b,0x7c,0xfd,0xe3, + 0x1f,0x51,0xc1,0x6,0xc5,0x4,0xb5,0xce,0x49,0x75,0x8e,0x8,0x69,0xbb,0xa8,0x83, + 0x64,0xd8,0xd8,0x37,0x8b,0x9f,0xb3,0x1,0x3,0x7,0xb0,0x61,0xc3,0x86,0xb1,0x7b, + 0x86,0xde,0x43,0x56,0xed,0x60,0x1a,0x83,0xc5,0xd2,0x7e,0x3d,0x98,0xd,0xb9,0x67, + 0x8,0xed,0x47,0xcb,0x7b,0x86,0x18,0xfb,0xc9,0xd7,0x83,0x38,0xe8,0xf6,0xbb,0xbb, + 0x1f,0x5b,0xb6,0x7c,0x19,0xb5,0x61,0x3,0x50,0xca,0x1a,0xc0,0xba,0x21,0x70,0x3e, + 0x24,0x2d,0x2b,0x2a,0xd5,0x48,0x1e,0x33,0x3e,0xf,0xfe,0xc,0x94,0x3f,0x84,0xe1, + 0xa5,0x47,0x83,0xbb,0xd8,0x6f,0xc2,0x81,0x79,0x9,0x4,0xed,0x25,0x3a,0x6c,0x90, + 0xc5,0xb1,0xe0,0xfe,0x40,0xad,0x67,0x83,0xa9,0xf3,0x75,0xfd,0x7e,0x94,0x6e,0x2, + 0xb9,0x2e,0x3,0xc5,0x74,0x99,0xe9,0x35,0x6d,0x5f,0xb9,0x3f,0x8a,0xab,0x60,0x9c, + 0x13,0x9f,0x8d,0x7d,0x5f,0x3a,0xf3,0x32,0x7d,0x1f,0x52,0xf5,0x5e,0x16,0x5d,0x95, + 0x4c,0xdf,0x73,0xb8,0xff,0x3b,0x4a,0x7e,0xd6,0xf7,0xc5,0xb5,0x41,0x10,0x24,0xae, + 0x7,0x96,0xd2,0x8,0xc4,0x3a,0xbe,0xf7,0xc,0x96,0xfc,0xbb,0x65,0xd9,0x58,0xbc, + 0xff,0xf2,0x2b,0xaf,0xd0,0x36,0xbd,0x59,0x2,0x8e,0x87,0xf6,0xe7,0xbf,0x97,0x9a, + 0x50,0x88,0x7b,0x18,0xf7,0x10,0xa,0x2d,0xe0,0xf7,0xcb,0xcf,0x89,0x34,0x24,0xe2, + 0xa8,0x5d,0x89,0xb8,0x11,0xe2,0xad,0xeb,0x2c,0x38,0x2b,0x27,0x97,0xa5,0x8,0x26, + 0x65,0x3,0x6e,0xae,0x0,0x3a,0x9,0xc8,0xe8,0x90,0xa4,0x3,0x65,0xae,0x5,0x8c, + 0xb9,0xe,0x30,0xce,0xb7,0x40,0xd3,0x3,0xf9,0xb2,0x68,0xe6,0x1c,0x0,0xda,0xa, + 0x3,0x98,0x83,0x45,0x3e,0x4c,0x0,0x96,0xaf,0xc9,0xd7,0x58,0x8e,0x48,0xe8,0xb5, + 0xec,0xf0,0x91,0x27,0x88,0x69,0x9e,0xaf,0x39,0xc7,0xe6,0xcc,0x99,0xcd,0xee,0xbc, + 0xab,0x1b,0xeb,0x75,0x47,0x73,0xf6,0xf1,0xd3,0x9d,0x89,0xed,0x7a,0xe0,0xeb,0xd, + 0x30,0xe2,0x5f,0x5d,0xf2,0x97,0x81,0x20,0x2d,0x3,0x8c,0x7b,0x28,0x59,0x5a,0x5, + 0x6b,0xbd,0xee,0x7,0x6b,0xe9,0x25,0x2e,0xe5,0x80,0x4,0xfd,0xb3,0x33,0x77,0xb0, + 0x75,0xcb,0x46,0xb2,0x93,0x2f,0xbc,0x40,0xe9,0x51,0x35,0x1a,0x0,0xa3,0x6c,0xa6, + 0x8c,0x78,0xf6,0xa2,0x9c,0x71,0xcf,0xbd,0xcc,0xca,0xca,0xcb,0x39,0x73,0x4c,0x26, + 0x0,0xd3,0xd,0x98,0x20,0xc3,0x2d,0x77,0x4a,0xf8,0x3a,0x28,0xda,0xe7,0xd1,0xa5, + 0x34,0x18,0xd7,0x96,0xee,0x1,0xff,0x9a,0xd1,0x6b,0xe5,0x7a,0x30,0x7f,0x47,0x7e, + 0x98,0x24,0x4e,0xd7,0x63,0x3d,0x27,0x35,0xc9,0x9c,0xfd,0x16,0xc6,0xcd,0x68,0x90, + 0xf7,0x29,0xd8,0x2f,0x52,0x8f,0xa,0xf2,0x73,0x7f,0x99,0x9c,0x9c,0x7c,0xbb,0x8e, + 0xa5,0x12,0x63,0xf5,0xd7,0xea,0x6f,0xdd,0xba,0x75,0xc6,0xe,0x78,0x2d,0x87,0xfc, + 0x87,0xf1,0xe3,0xc6,0x3e,0x32,0x77,0xee,0x6c,0xb6,0x7d,0xc7,0xf6,0x40,0x4a,0x92, + 0x1,0xba,0xd5,0xe7,0x12,0x66,0xbb,0x67,0xed,0x6d,0xae,0x7d,0x1c,0x40,0x6d,0x83, + 0xb5,0xfd,0x19,0xae,0x49,0x21,0x2a,0x57,0x58,0x6,0x66,0xa1,0xd,0x1c,0xca,0xfa, + 0xe1,0x81,0xff,0xea,0x47,0xdf,0xb0,0xf,0x3f,0xf9,0xc8,0x8,0xca,0xf2,0x5b,0xfc, + 0xd5,0x19,0xe5,0x2b,0xc3,0xf2,0x84,0x65,0x35,0x2c,0x80,0xe4,0xa0,0xc1,0x83,0x58, + 0xff,0x1,0xfd,0x9,0x8c,0x69,0xc,0x18,0x40,0xcc,0xd8,0x7b,0xad,0x2f,0x7,0xb2, + 0x81,0xea,0xb5,0xbf,0xcd,0xde,0xe,0x10,0x5e,0xbe,0x62,0x5,0x45,0xe6,0xe1,0xf7, + 0x6,0xd2,0x4d,0xea,0xdc,0xd,0x3,0x8,0x78,0x45,0xce,0xae,0xab,0xe,0xb6,0xce, + 0xfc,0x71,0x9d,0xf7,0x1f,0x38,0x10,0x28,0xbd,0x96,0x28,0xe3,0x73,0xbd,0x17,0xd7, + 0x85,0xf0,0x57,0xe,0x9,0xbe,0x7b,0xf7,0xed,0x63,0x73,0x17,0x2c,0x64,0xe3,0x26, + 0x4e,0x62,0x6b,0xd3,0xd2,0x54,0xde,0x5e,0x7e,0x51,0x11,0x9b,0x3c,0x7d,0x3a,0x9b, + 0x34,0x6d,0x1a,0x45,0x34,0xe2,0x61,0x1,0x70,0x2e,0x5d,0xb9,0x92,0xed,0xda,0xb3, + 0x87,0xfe,0x57,0x6,0x51,0xa4,0x65,0x65,0xb1,0x29,0x33,0x66,0xd0,0xfe,0xc9,0xeb, + 0xd6,0xa9,0xcf,0xa8,0xdc,0xb0,0x81,0x8d,0x99,0x30,0x91,0x8d,0x18,0x35,0x9a,0x15, + 0x96,0x94,0xd0,0xb9,0xdb,0xbc,0x6d,0x2b,0x55,0x2a,0x1b,0xcb,0xb7,0x23,0xc2,0x7d, + 0xd6,0xbc,0x79,0xfc,0x7c,0xbd,0x10,0x0,0xdf,0xb0,0xc0,0xc5,0x78,0x81,0x50,0xe7, + 0x4,0xf8,0x3e,0xfa,0xc4,0xe3,0x6c,0xfa,0xac,0xd9,0xf4,0xdd,0x33,0xe6,0xcc,0x61, + 0xcf,0x3c,0xf7,0x2c,0x1,0x26,0x2c,0xf4,0x31,0x13,0x26,0xb0,0xb1,0xfc,0x78,0xf1, + 0xfd,0x45,0xa5,0xa5,0xb4,0x3f,0x6a,0x73,0xcf,0x9c,0x3b,0x97,0x4d,0x9b,0x35,0x8b, + 0x5b,0xe5,0x27,0x95,0xd1,0x94,0x91,0x9d,0xc3,0xc6,0x8c,0xf7,0xf6,0x9f,0x33,0x7f, + 0x81,0xd7,0x8a,0x51,0x7c,0xe,0x8e,0x3,0xc7,0x37,0x9a,0x2f,0x4b,0x2b,0x2a,0x94, + 0x21,0xa1,0x3f,0xd3,0x61,0xea,0xc5,0xd9,0x4,0xae,0xd1,0xd9,0xbf,0xf2,0xda,0x7a, + 0x5d,0x92,0x9e,0x62,0xb,0x85,0x2f,0x58,0x67,0xba,0xc4,0x84,0x1d,0x32,0x26,0x4d, + 0xb6,0xc5,0x16,0x6b,0x2d,0x2a,0x73,0x82,0x36,0xb6,0xdb,0x8c,0x5a,0x7,0xf4,0x3c, + 0x7b,0xdd,0x96,0xb7,0x75,0xf0,0xf,0xb0,0x6e,0xc7,0x28,0xd1,0x97,0xa5,0xb4,0x4, + 0x33,0x83,0x1f,0x78,0xc3,0xc6,0xd,0xc4,0x80,0xd1,0xdd,0x29,0x33,0x2b,0x83,0xcf, + 0x13,0xfd,0x59,0xeb,0xd6,0x6d,0xd8,0xc6,0xe4,0x1b,0x39,0xb,0xee,0x4e,0xc,0xf8, + 0x97,0x60,0xc1,0x17,0x7a,0x28,0x26,0x4c,0x6c,0xf8,0xa2,0xef,0x23,0xfe,0x56,0xa4, + 0x2d,0x79,0xc3,0x8e,0x98,0xd6,0x22,0xa7,0x5f,0xb7,0x80,0xd8,0x2a,0x6f,0xf9,0xbb, + 0xb7,0xba,0xb3,0xc3,0x95,0x9d,0x58,0x6e,0x6e,0xb6,0x97,0xe3,0xab,0x22,0x9c,0x75, + 0x0,0xf6,0xd6,0x1,0xbe,0x4f,0x3d,0xfd,0x14,0xc9,0xe8,0x6b,0xd6,0xa5,0x39,0x7d, + 0xe1,0x2e,0x9f,0xaf,0xe9,0x83,0x37,0xcf,0x73,0xc0,0xef,0x6e,0x45,0xbf,0xeb,0xae, + 0x2,0xfb,0xbc,0xeb,0x7e,0xfc,0xa0,0x1,0x60,0x1a,0x4e,0xb9,0xe,0x23,0x20,0x2b, + 0xbf,0x88,0xdf,0x6f,0x4b,0xd9,0xd3,0xfc,0x39,0xaa,0x16,0x95,0xad,0xa2,0xc,0x69, + 0xcc,0x11,0x88,0xda,0xdf,0xfd,0xc0,0x2e,0xb6,0x36,0x65,0xcd,0x5e,0x1d,0x3f,0xc3, + 0x86,0x1,0xc0,0x51,0x3,0x0,0xbc,0x64,0xc9,0x92,0x7e,0xa3,0x47,0xdd,0xfb,0xfb, + 0xfc,0x82,0x7c,0xf6,0xe8,0xe3,0x8f,0x91,0xa5,0x1c,0x5,0x94,0x36,0x28,0xcb,0x87, + 0xd8,0x66,0xc6,0x3a,0x88,0x3a,0xc1,0x36,0x82,0x1d,0x47,0x49,0xd6,0x61,0x32,0xb9, + 0x2b,0x45,0x49,0x75,0xa1,0xb9,0x74,0x91,0x98,0x30,0xfa,0xcb,0x62,0x42,0xfe,0xf8, + 0xb3,0x4f,0xe8,0x35,0x58,0x71,0xad,0xa3,0x1b,0x90,0xab,0xdc,0xa3,0x5d,0xea,0xf, + 0x93,0x7,0xd8,0x4,0xda,0x8c,0x6d,0xde,0xb2,0x85,0x6d,0xdc,0xbc,0x89,0xc6,0x86, + 0x4d,0x1b,0xbd,0xf5,0x4d,0x9b,0xd8,0x26,0xb1,0x6d,0x93,0xd8,0x8e,0xa6,0x6,0xb4, + 0x9d,0x2f,0xd5,0x6b,0x7a,0xdf,0x5b,0xa2,0xee,0x32,0x6a,0x74,0xe3,0x18,0xf1,0xfd, + 0xae,0x9a,0xbc,0xa6,0x1c,0xee,0xd,0x25,0x9d,0xd7,0xfb,0xa9,0x46,0x75,0x56,0x83, + 0x5,0x80,0x39,0x80,0x8,0x4d,0x38,0x1e,0x79,0xf4,0x51,0x62,0x4a,0xb2,0xed,0x56, + 0xa2,0xc1,0x55,0xff,0x53,0xc0,0x55,0xf7,0x4c,0x98,0x7b,0xa2,0xda,0x5c,0x27,0x96, + 0xca,0x8f,0xeb,0x38,0x9f,0x0,0x46,0x8e,0x1e,0xc3,0x56,0xac,0x5e,0xcd,0x66,0xcd, + 0x9d,0xc7,0x86,0x8e,0xbc,0x97,0x22,0xd1,0xc1,0x4e,0x47,0x73,0xd0,0x99,0x31,0x7b, + 0xe,0xab,0xe2,0xe7,0x73,0xc7,0xae,0x9d,0x5e,0x9,0x4d,0xe,0xd6,0xfd,0x6,0xe, + 0x62,0xbb,0x1,0xc0,0xc2,0x28,0xc1,0x44,0x3f,0x78,0xd8,0x70,0xb6,0x92,0x7f,0xc6, + 0xce,0x7,0x76,0xb3,0x43,0x8f,0x3d,0x4a,0xb1,0x0,0x7b,0xf7,0xef,0x63,0xf7,0x8c, + 0x18,0x49,0x3e,0x76,0x0,0x18,0x80,0x16,0xfb,0x3f,0xc6,0x2d,0x5e,0x7c,0xdf,0xdd, + 0x83,0x6,0xb3,0x75,0xe9,0xe9,0x6c,0xf7,0x83,0x7b,0x88,0x39,0xc7,0x93,0x6a,0x43, + 0x8d,0x15,0x2b,0x22,0x18,0xbf,0x13,0x8c,0x75,0xca,0xf4,0x19,0x6c,0xfe,0xe2,0xc5, + 0x2c,0x8b,0x4f,0x70,0xf8,0xcd,0x87,0xf8,0xb5,0xc1,0x71,0x97,0xaf,0x5f,0x4f,0x4d, + 0x3e,0xc6,0x4d,0x9a,0xc4,0x36,0xf0,0x7b,0x3,0x81,0x92,0xb8,0x86,0x99,0x39,0x39, + 0x14,0x6d,0x8f,0xdf,0xfc,0xcc,0xb3,0xcf,0x2a,0xf6,0x3e,0x6a,0xdc,0x38,0x36,0x77, + 0xe1,0x42,0xea,0xbc,0x83,0xdf,0xfc,0x8,0x7f,0x96,0xcf,0xd7,0xd4,0xb0,0xed,0x3b, + 0xef,0xa7,0xe3,0x9a,0x30,0x65,0x2a,0xbb,0x7f,0xd7,0x2e,0xf6,0xf4,0x89,0x13,0xce, + 0xf4,0x31,0x79,0x1d,0xce,0x47,0xf8,0x7c,0x13,0xba,0xbe,0x21,0x6e,0xa3,0x30,0x15, + 0x4,0xb1,0x19,0x38,0xf7,0x68,0xd2,0x90,0xef,0x60,0x40,0x4,0xa2,0x3a,0x0,0x6a, + 0xa0,0xab,0x83,0x63,0xae,0xdc,0x66,0xb1,0x5d,0x9d,0x35,0x99,0x0,0x5f,0x66,0x80, + 0x70,0x6e,0xb1,0xf5,0x3d,0x8e,0x91,0xaf,0x33,0xae,0x44,0x81,0x18,0x20,0x8c,0x92, + 0x94,0xa9,0x69,0x24,0x43,0xa3,0x24,0xe5,0xde,0x87,0x1e,0x64,0x43,0x86,0xc,0x66, + 0x9d,0xbb,0xdc,0xc9,0xba,0x75,0xba,0x9a,0xbd,0xf1,0xc4,0xed,0x4,0xb6,0xbf,0x24, + 0x10,0xee,0xe1,0x81,0xf0,0x85,0xee,0x42,0x96,0xee,0xee,0xf4,0xf,0x7f,0xab,0xe5, + 0x10,0xff,0xda,0x1a,0xff,0x11,0x1a,0x3d,0xed,0xc9,0xcf,0x9f,0x9e,0xb8,0x9d,0x2d, + 0x9f,0x3b,0x98,0x1d,0x39,0xfe,0x24,0xb1,0x72,0x2,0x5c,0xca,0xef,0x3d,0x2f,0x58, + 0x6f,0xb5,0xea,0xfd,0x7b,0xf0,0xe1,0x83,0x24,0xa1,0xa7,0x66,0xe5,0xa8,0x26,0x19, + 0xf6,0xc8,0x75,0x48,0xc6,0xb9,0x21,0xee,0x1,0xc3,0x80,0x72,0x5d,0xd7,0x10,0x50, + 0x37,0x3,0xf4,0x1c,0xd7,0x49,0x33,0x9c,0x8c,0x6b,0xab,0x2d,0x61,0xc,0xa1,0x4f, + 0x3b,0x9a,0x82,0xe0,0xd8,0x12,0x51,0xf7,0xf0,0x8c,0x1e,0x39,0x76,0x84,0x15,0x15, + 0xe6,0xff,0xb0,0x3a,0x29,0x69,0x50,0x3c,0x4c,0xc5,0x50,0x7f,0x6b,0xd7,0xae,0x55, + 0x43,0xdf,0xc1,0xde,0x36,0x6e,0xec,0x98,0xa7,0x16,0x2e,0x5c,0x40,0x5,0x18,0x50, + 0x5,0x29,0x4c,0x62,0x36,0x80,0xd5,0x2,0xd0,0x30,0xd0,0x4d,0x44,0xb2,0x3e,0x1b, + 0xf2,0x3f,0x89,0xc9,0xd8,0xd5,0xd1,0x7e,0x61,0xad,0xe,0xed,0xa7,0x5f,0x78,0xf5, + 0x83,0xb1,0xe,0x79,0x1a,0xad,0xe1,0xde,0xff,0xe8,0x43,0x3f,0x35,0xa9,0x21,0x16, + 0xc8,0x17,0xae,0x9,0xe9,0xad,0x2b,0x23,0xaf,0xf5,0xbe,0xb9,0x72,0xa0,0x8,0x88, + 0xde,0x1a,0x91,0xd6,0x51,0x9f,0x5a,0xbc,0x2f,0x3b,0xd,0x79,0xdb,0x1b,0xfc,0x7d, + 0x28,0x4a,0xbb,0x3e,0x50,0x86,0xd0,0xc5,0x76,0x5d,0x45,0x36,0x2,0x4c,0x5e,0x75, + 0xd3,0x69,0x20,0xc0,0x45,0x7d,0x56,0xe4,0xb1,0x49,0xe9,0xd3,0x55,0xaf,0x39,0x9a, + 0xe9,0x5c,0xa9,0x6a,0x11,0x7d,0xd,0xfd,0x7b,0x29,0x7c,0x1b,0x8e,0x61,0xf3,0xd6, + 0xad,0xec,0x6e,0xe,0x4e,0x7,0xb8,0xb1,0x73,0xf8,0xd8,0x51,0xb6,0x89,0xbf,0x96, + 0x20,0x89,0xb4,0x2f,0xf8,0xb1,0xe0,0x66,0x90,0xe7,0x15,0x13,0xfa,0xb0,0x7b,0xef, + 0xa3,0x2e,0x3a,0x52,0xb1,0xd8,0xb2,0x7d,0x3b,0xed,0xfb,0xf8,0x91,0xc3,0x5e,0xe7, + 0x2c,0x51,0xce,0x73,0xe9,0x8a,0x95,0x6c,0xda,0xcc,0x59,0xf4,0x5d,0x60,0x99,0xeb, + 0x37,0x6e,0xf4,0x7a,0x8,0xf3,0x7d,0xc0,0x8c,0x1,0x82,0x60,0xbe,0xf8,0x6c,0x8f, + 0x49,0x9b,0x40,0x7a,0x2e,0x81,0xc0,0x2b,0x57,0x1a,0x92,0xfc,0xfd,0x0,0x4b,0xb0, + 0x78,0x58,0xda,0xbb,0xf6,0x3c,0x40,0x92,0x31,0x8c,0x6,0x18,0x17,0x0,0x55,0x80, + 0xbf,0xbc,0x37,0x0,0x9e,0x30,0x38,0xd0,0x41,0xb,0x8c,0x19,0x2c,0x17,0xdb,0x1f, + 0x79,0xec,0x31,0x3a,0xb6,0x1d,0x3b,0x77,0xb2,0xdc,0x82,0x2,0x7a,0x1f,0xef,0xe1, + 0x18,0xf1,0xb9,0xe3,0x27,0x4d,0xa6,0x73,0x82,0xe3,0x96,0xf5,0x6c,0xff,0x5a,0x56, + 0x9b,0x88,0xdb,0xc9,0x75,0x1e,0xc2,0x9e,0xe9,0x3a,0x51,0xd8,0x66,0xe1,0xd2,0x65, + 0x14,0xb0,0x64,0x33,0x59,0x7b,0xd2,0xcd,0x8d,0xc3,0x4a,0xe5,0xe4,0x9b,0xeb,0x92, + 0x31,0xd,0xd6,0x6b,0xcb,0xd6,0x1a,0x73,0x2e,0x2e,0xb,0x0,0x44,0x6e,0x80,0xc5, + 0x5,0x1,0x3c,0xcf,0xe9,0x17,0x2e,0xf5,0xd2,0x91,0x52,0xd3,0xd9,0x43,0xfb,0x1f, + 0x22,0x6,0x7c,0xe6,0xd5,0x97,0xd9,0xd4,0xa9,0x53,0xd8,0xa0,0x41,0x3,0x58,0xab, + 0x56,0xd7,0xb3,0xc5,0xe3,0x5b,0xb2,0x9f,0xbf,0x72,0x27,0x31,0x5f,0x0,0xf0,0x2f, + 0x1b,0x75,0x26,0xac,0xc9,0xd2,0x4a,0x9a,0xd6,0xf2,0x87,0x65,0xb0,0xd6,0x25,0x53, + 0x9e,0x36,0x40,0x59,0xfa,0x8a,0xdf,0xec,0xc1,0xfe,0xa5,0xae,0x2b,0x2b,0x49,0xba, + 0x8d,0x15,0x16,0x17,0x2b,0xf6,0xb,0x0,0xa6,0x51,0xe3,0x1,0x31,0x55,0xec,0x7a, + 0xed,0xc,0xdb,0xb2,0x75,0xb,0xf5,0x32,0x6,0x6b,0x94,0x3e,0x56,0x27,0xfb,0x75, + 0x0,0x72,0xae,0x4b,0x61,0x70,0x1a,0x2e,0xe5,0x8e,0xeb,0x58,0xee,0x70,0x35,0x94, + 0x99,0xac,0x58,0xf3,0xe3,0xe7,0x5a,0xdf,0x1b,0x0,0x77,0xf1,0xbb,0xd3,0xb2,0xf3, + 0xd8,0x92,0xe5,0x9e,0xba,0x18,0x56,0xc3,0x40,0x1f,0x9e,0xef,0xf7,0x39,0xf6,0xc0, + 0x9e,0xdd,0x2c,0x79,0x4d,0xd2,0xa9,0xe4,0xe4,0x64,0x3,0x53,0x75,0x1c,0xd5,0x5f, + 0xab,0xbf,0x94,0x94,0x14,0x1a,0xae,0x7f,0x92,0xdb,0xd7,0xad,0x4b,0x6d,0xb2,0x68, + 0xe1,0xc2,0x81,0xa3,0xee,0x1b,0xf9,0x1d,0x58,0xf0,0x23,0x8f,0x3e,0xa2,0x58,0x70, + 0x18,0x0,0x9f,0xd,0x4c,0x96,0xe1,0x3e,0xe2,0xc8,0x51,0x6d,0x81,0x6e,0x1c,0xf0, + 0xd,0x5b,0x77,0x57,0xee,0xa,0x76,0xdc,0x1,0x78,0xbd,0xfd,0xde,0xbb,0xec,0x9b, + 0x1f,0xff,0x88,0xbd,0xc1,0x1,0x18,0x93,0x17,0x4a,0x57,0x7e,0xfd,0xa3,0x6f,0x48, + 0xa2,0x56,0x20,0x46,0x1,0x5a,0x41,0xdf,0xb0,0xc1,0x88,0xed,0x1e,0xb3,0x76,0xde, + 0x70,0x9d,0xbb,0x9d,0xdb,0x79,0x47,0x27,0x9b,0xd0,0x6,0x1,0xae,0x66,0xea,0xe, + 0x5f,0xaf,0xab,0xaa,0x95,0x64,0xbd,0xd8,0xe,0x3f,0x2f,0xd4,0xd,0x30,0x25,0xbd, + 0xc0,0x7f,0xdc,0xe8,0xd8,0x10,0xd7,0x41,0xc2,0xd7,0xa8,0x3a,0x22,0x86,0xa0,0x3a, + 0xdc,0xc0,0xd3,0x7,0x7e,0xeb,0xd6,0x1d,0x3b,0x8,0x80,0xa7,0xcf,0x9e,0x4d,0x6c, + 0x58,0x2,0x12,0x58,0x6f,0x7f,0xe,0x60,0x90,0x70,0x53,0x33,0x33,0x55,0x24,0x3f, + 0x24,0xda,0x79,0x8b,0x16,0xa9,0xe3,0xc2,0x39,0x58,0x9d,0xb2,0x96,0xc0,0xe,0x8c, + 0x33,0x8d,0xef,0xb,0xf5,0x2,0x12,0x2e,0x0,0x16,0xb2,0x33,0xc,0xa1,0x73,0x96, + 0xe1,0x86,0xe,0x29,0xf8,0xce,0xb3,0x1a,0xf3,0xd,0x8f,0x96,0xae,0x4e,0x9c,0x2d, + 0x8a,0xef,0x39,0x7c,0xf4,0x8,0x31,0x59,0x30,0xfa,0xcd,0xdb,0xb6,0x29,0xa3,0x8, + 0xbf,0x17,0xd2,0x34,0x98,0xee,0x76,0xe,0xaa,0x32,0xf5,0x2c,0x35,0x23,0x83,0x8c, + 0x85,0xb5,0x69,0xe9,0xf4,0xbb,0x4f,0xa,0x37,0x5,0x2a,0x4b,0x61,0xdf,0xc9,0xfc, + 0xd8,0xa0,0x14,0x90,0x11,0x21,0x72,0xbe,0x9f,0x38,0x72,0x84,0x98,0xff,0xbe,0x83, + 0x7,0x94,0xaa,0x92,0xe8,0xf5,0x74,0xc6,0x72,0x54,0x9f,0x4b,0xd8,0x0,0x4b,0x54, + 0x49,0x3,0xb,0x5e,0xcf,0x8d,0x9d,0xa5,0xab,0xd6,0xa8,0x5e,0xc0,0x2e,0x76,0xea, + 0x2,0x59,0x8f,0x9,0x87,0x30,0x62,0xb,0x8,0x6c,0x30,0xcd,0xd5,0x98,0xb4,0x64, + 0x66,0x36,0xb0,0x86,0xb2,0x36,0x7,0x8,0xe5,0x16,0x97,0x3a,0x99,0x70,0xbe,0x48, + 0x91,0x4a,0xcf,0xca,0xe4,0x93,0xfa,0xab,0xdc,0x10,0x6a,0x60,0x15,0x95,0xe5,0x4, + 0xc0,0x7d,0xfa,0xf4,0x61,0xd7,0x35,0xbf,0x9a,0x55,0xad,0xb9,0x91,0xfd,0x63,0x4d, + 0x37,0x4f,0x8a,0x6e,0x14,0x43,0xb0,0xe1,0x5f,0x8a,0x0,0x2d,0x9,0xc2,0x52,0x9a, + 0xfe,0xd6,0x62,0xc4,0xba,0x9f,0xf8,0x5b,0x83,0x11,0xf7,0x64,0xbf,0xe5,0xec,0xf7, + 0xdb,0x8b,0xdd,0xd8,0x81,0xc2,0xe,0x6c,0xf1,0xc2,0xd9,0xf4,0xac,0xc8,0x1a,0xcf, + 0x12,0x7c,0xb1,0x84,0x4c,0x7e,0xea,0x85,0x53,0xac,0xa0,0xb0,0x90,0xad,0x5c,0x93, + 0x12,0xe2,0x47,0x2f,0x73,0x1a,0x4a,0x4a,0xf6,0xb7,0xe5,0xe0,0xa2,0xa0,0xba,0x90, + 0xeb,0x90,0xa5,0xed,0xeb,0x1a,0xe5,0x5e,0xc8,0x51,0xd7,0xac,0x2c,0x54,0xbd,0xb0, + 0x95,0x13,0xa4,0xbd,0xdd,0xbf,0x6b,0x67,0x42,0x46,0x28,0xee,0x4b,0xcc,0x97,0x87, + 0xb9,0xc1,0xe,0xf6,0xbb,0x6a,0xd5,0xca,0x61,0x3a,0x6e,0xca,0x75,0xd7,0xeb,0x0, + 0x0,0x47,0xd,0xf9,0x8f,0x63,0xc7,0x8c,0x3a,0x3e,0x7f,0xfe,0x5c,0xe5,0xb,0x8e, + 0x9a,0x78,0xe3,0xbd,0x17,0xc6,0x7e,0x31,0x5e,0x8b,0x78,0x90,0x75,0x80,0x4f,0x84, + 0x85,0xc7,0x3,0xc,0x17,0xa8,0xc9,0x72,0x78,0x88,0x90,0xfe,0xfc,0xab,0x2f,0x88, + 0x1d,0xc2,0x4f,0xfc,0xa3,0x9f,0xfc,0x98,0xd8,0x31,0x3a,0xea,0x18,0x4d,0xea,0x1b, + 0x62,0x1,0x39,0x37,0xb4,0x9e,0x74,0x5d,0xfc,0xc6,0xe7,0x36,0x78,0x87,0x76,0xaf, + 0x71,0xf4,0x76,0xd5,0xb,0x69,0x38,0xeb,0x5b,0x8b,0xf7,0x25,0x13,0x3f,0xfd,0xca, + 0xcb,0x94,0x5e,0x4,0x0,0xa6,0xe0,0xb1,0x86,0x98,0x11,0xe9,0x1c,0x16,0xd9,0x1c, + 0x26,0x25,0x46,0x5d,0xe7,0x44,0x65,0x69,0x97,0xe1,0x65,0xcb,0xce,0xfa,0xfe,0x35, + 0x22,0xea,0x1c,0xd2,0x31,0x24,0x5a,0x48,0xc4,0x8,0x42,0xc2,0xf6,0x45,0xcb,0x96, + 0xb1,0xe1,0x9c,0xe9,0x22,0x9d,0x5,0x6c,0x15,0xa0,0x7a,0x82,0x5b,0xac,0x0,0xb5, + 0x8a,0xaa,0x2a,0x32,0xa4,0xa8,0x7e,0x2b,0x67,0x93,0xe3,0x27,0x4f,0x26,0xff,0x2f, + 0x98,0x20,0xa2,0xca,0x71,0x1d,0x21,0x51,0x3,0x94,0xc1,0xac,0x63,0xd,0xd,0x46, + 0xd9,0xcb,0x17,0xf8,0xc3,0x7,0x30,0x83,0xe4,0x5b,0x4b,0x45,0xe6,0xcf,0x7,0x64, + 0x64,0x5,0xba,0x11,0xc0,0x1b,0x66,0xd8,0x48,0x55,0x6,0x6c,0x7e,0xd0,0xd0,0x61, + 0x6c,0xc8,0xf0,0x11,0x1c,0x90,0x8f,0x2a,0xc6,0x5e,0x56,0x59,0x49,0xc0,0xf9,0x14, + 0xbf,0x76,0xd8,0xef,0xa9,0x67,0x9e,0x21,0xd6,0x9b,0x94,0x9c,0xcc,0xad,0xf8,0xe5, + 0xc4,0x72,0x31,0x41,0xe0,0x7a,0x2f,0x5a,0xba,0x94,0x40,0x1c,0xad,0x2d,0xc1,0xfc, + 0xe1,0x27,0x96,0xb1,0x0,0x25,0xe5,0xe5,0x1e,0x5b,0x7e,0xf1,0x5,0xcf,0xea,0x77, + 0xf8,0xee,0x13,0x55,0x9c,0x2,0xcf,0x75,0x84,0x72,0xa1,0x2f,0xcf,0xc6,0x31,0xea, + 0x70,0x8e,0x5e,0x3b,0xf7,0x1a,0x5b,0xb6,0x72,0x15,0x75,0x4a,0xca,0x77,0x48,0x8f, + 0x1,0x46,0x5a,0x14,0x64,0xa4,0xb9,0x16,0xd0,0xe6,0x68,0x81,0x3b,0xa,0x4,0x8a, + 0x6c,0xa0,0x28,0xf3,0xa3,0xaf,0x1d,0xec,0xda,0x4,0x97,0x52,0xd3,0x0,0xd0,0xbe, + 0xcb,0x94,0x53,0x83,0x4c,0xaf,0xa8,0x7c,0x3d,0x5b,0x9b,0x9e,0xc9,0xf6,0x3c,0xb8, + 0x87,0x64,0xe8,0x17,0x4f,0xbf,0xc8,0xa6,0x4d,0x9f,0xaa,0xa4,0xe8,0x36,0x2d,0x9b, + 0xb2,0xdd,0x59,0xed,0x5,0x8,0xf7,0xd0,0x40,0xd8,0xf7,0xd,0xab,0x75,0xd,0x88, + 0x3d,0x30,0xb6,0x0,0x59,0xf8,0x88,0xbf,0x55,0xc1,0x5a,0xd8,0xbf,0x1b,0x7b,0xbc, + 0xac,0x3d,0x9b,0x3c,0xfe,0x1e,0x3e,0x27,0x1c,0xa5,0xc8,0xe7,0x1a,0xc9,0x7c,0x85, + 0x4,0xd,0x40,0x86,0xdc,0x9a,0x9a,0x9e,0xce,0x52,0xf8,0x6f,0x2d,0x8,0x91,0x9c, + 0x13,0x91,0xa0,0xf3,0x1c,0x80,0x9b,0x17,0x70,0x15,0x94,0x9b,0xc0,0x5d,0x14,0x74, + 0x25,0xe4,0x59,0x46,0x56,0xc0,0x38,0x2a,0x8e,0xde,0x26,0xd,0x88,0xd5,0xeb,0xd2, + 0x59,0x1a,0x37,0x60,0xc1,0x6a,0x29,0x70,0xb3,0x3a,0x42,0xc9,0x41,0xd5,0xab,0xd7, + 0x5e,0x25,0x35,0x78,0xf7,0xee,0x9d,0x2c,0x69,0xd5,0xca,0x53,0x6b,0xd6,0xac,0x49, + 0x8,0x4f,0xd,0x0,0x6,0x65,0x96,0x1b,0xe5,0x3a,0x96,0x72,0xe8,0x20,0xbc,0x70, + 0xe1,0x82,0xfe,0xf7,0xdd,0x3b,0xe2,0xbb,0xdc,0xbc,0x5c,0xea,0xc,0x1,0xed,0xfb, + 0x5c,0x88,0xcc,0xac,0xa2,0x96,0xaf,0x94,0xf1,0x26,0xc0,0x86,0xa3,0x46,0x3c,0x86, + 0x1d,0x2f,0x2f,0xf4,0xbc,0x16,0xe1,0x8a,0xe5,0xbb,0x1f,0xbc,0xcf,0x7e,0xfc,0x37, + 0x3f,0xa1,0x76,0x76,0x98,0xac,0xd0,0x59,0xe9,0x47,0x3f,0xfd,0x31,0x15,0xef,0x20, + 0x20,0xd6,0x72,0x68,0x3,0x7e,0x62,0xbb,0xc5,0x61,0x48,0x83,0x87,0xc8,0xfc,0x62, + 0x6b,0x9b,0xdd,0x2e,0x50,0xef,0x7f,0xec,0xb7,0xf,0x34,0xdb,0x2b,0xea,0xeb,0x90, + 0x18,0x1b,0x2e,0x36,0xd2,0xb9,0x78,0x92,0x33,0x45,0xf8,0xd,0x21,0x3d,0x4b,0x6, + 0xe5,0x2a,0x90,0x11,0x25,0x29,0xc7,0x3b,0xcf,0x89,0x1a,0x64,0x2e,0xf9,0x3a,0x8a, + 0x41,0xe9,0x11,0xcd,0x88,0xe,0x86,0x6c,0xc,0x10,0x6,0x1b,0x5,0xd0,0x40,0xb2, + 0x7c,0x9e,0x6f,0x7,0xb0,0x64,0xe7,0xe5,0x19,0x46,0x8,0xfc,0xbb,0x0,0xb4,0x63, + 0x4f,0x3d,0xa9,0xd8,0xfe,0x13,0x9c,0x69,0x42,0xa2,0x45,0x50,0x96,0x94,0x61,0x71, + 0x4e,0x20,0xd7,0x82,0x49,0x82,0xd,0x6c,0xbb,0x7f,0x7,0xdb,0xb0,0x69,0x93,0x92, + 0xbd,0xf7,0x3f,0x7c,0x90,0xfe,0x7,0xcc,0x51,0xb7,0x98,0xcf,0x9e,0xb7,0x82,0x94, + 0xf0,0xbb,0x6d,0x50,0x8b,0x23,0xd1,0xe2,0xdc,0xbf,0xc8,0xbf,0x73,0xc7,0xae,0x5d, + 0x14,0xb1,0xc,0x9,0x1a,0x86,0x0,0xfc,0xbf,0xf2,0x3a,0xc1,0x2f,0x8c,0xa0,0x2c, + 0xfc,0x2f,0x7e,0xf,0x7c,0xc4,0x60,0xb9,0x0,0x6a,0x62,0xbb,0xd3,0xa6,0x53,0x1, + 0x5,0x80,0xf0,0xbd,0x63,0xc6,0x10,0x8b,0x87,0x9f,0x1a,0xef,0xc1,0xbf,0x2d,0x53, + 0xe9,0x0,0xce,0xb,0x96,0x2c,0xd1,0x2,0xaf,0xe2,0x5c,0xb7,0x28,0x37,0x43,0x75, + 0xb8,0xd1,0x15,0x16,0x64,0x19,0x30,0xac,0xed,0xb8,0x11,0xbe,0xe,0xc3,0x9,0x46, + 0x31,0xea,0x11,0xcc,0x5f,0xbc,0xcc,0x29,0x4d,0xda,0x2c,0xcb,0x60,0x56,0x36,0x78, + 0x16,0x59,0x80,0x2c,0x87,0xfd,0xda,0xb5,0xdd,0x2,0x5c,0x7d,0xe4,0x19,0x0,0x5e, + 0xea,0xf0,0x41,0xeb,0xfb,0xc9,0xf5,0x52,0x5,0xca,0x88,0xc0,0x45,0x0,0xe1,0xc9, + 0xe7,0x4f,0x92,0x14,0xbd,0xe7,0xc1,0x7,0xd8,0xd0,0xa1,0xf7,0xd0,0xb8,0xb5,0xe3, + 0x6d,0xac,0x4d,0x8b,0xab,0xd8,0xe6,0xb5,0x6d,0xd9,0x2f,0x20,0x47,0xb,0x26,0xfc, + 0x6f,0xda,0xd0,0x1,0xd8,0x96,0xa7,0xdd,0x79,0xc4,0x9e,0xf4,0xfc,0xcf,0xb5,0x77, + 0xb1,0x7,0xb2,0xda,0xb2,0x31,0x23,0xfb,0xb1,0x3d,0xf,0xed,0x23,0x96,0x2b,0x19, + 0x2f,0x96,0xb5,0x22,0xe2,0x19,0x55,0x11,0x57,0xa7,0xa4,0x90,0x54,0x6b,0x80,0x6f, + 0x89,0xee,0xd7,0xe,0x97,0x9f,0x73,0x5d,0xac,0xb4,0xc8,0xcd,0x7c,0x6d,0x23,0x28, + 0x37,0x44,0x79,0xd0,0x81,0x37,0xa8,0x6a,0x38,0x8c,0x20,0xcb,0x5,0x1,0xf0,0x85, + 0x6b,0x63,0xc1,0xe2,0x25,0xaa,0xaf,0x79,0x3c,0xf2,0x26,0xd9,0xef,0x13,0x87,0x1f, + 0x67,0xf9,0xf9,0x39,0x3f,0xac,0x5c,0xb1,0x62,0x98,0x8d,0xa5,0x61,0xaf,0xb1,0x34, + 0x0,0x18,0xc8,0x8d,0xa1,0x3,0xaf,0x6b,0xe0,0x9f,0xc7,0x8c,0x1e,0x75,0x78,0xce, + 0x9c,0x59,0x6c,0xcb,0xb6,0xad,0x64,0x45,0xe3,0xc1,0x88,0x3b,0x31,0xe3,0x1,0x3a, + 0x7f,0xd6,0xc9,0x74,0xc3,0xfe,0xcf,0x96,0xaf,0xff,0x27,0xa0,0xeb,0xfa,0xce,0xa8, + 0x42,0x3,0x46,0x63,0x1,0xbe,0xd,0x4c,0x11,0x80,0xfb,0xcd,0x4f,0x7e,0x44,0x5, + 0x3c,0x20,0x45,0x7e,0xf0,0xd1,0x87,0x1c,0x98,0x7f,0x4a,0xf2,0xf4,0xa5,0x37,0x2e, + 0x5b,0xfe,0x55,0x8f,0x15,0x1b,0x25,0x2d,0xc3,0x58,0x71,0x4c,0xf6,0xe6,0x35,0x53, + 0x9b,0x6c,0xff,0xad,0xab,0xc1,0x82,0x33,0x9f,0xb7,0xde,0x9d,0xdf,0xb,0x50,0xc1, + 0x4,0x86,0xe3,0x81,0x7a,0x1,0x3f,0xaf,0x6c,0x23,0x88,0xff,0x89,0x27,0x35,0x87, + 0xb9,0x1,0x12,0x91,0x9b,0xff,0x5f,0x19,0x5b,0xae,0xcf,0xc4,0xa4,0x20,0xfd,0xb9, + 0xf0,0x73,0x22,0xd8,0x6a,0xf6,0xbc,0xf9,0x74,0xc,0x7,0x1f,0x39,0x44,0x60,0x3, + 0x86,0x7,0x5f,0xaf,0x4c,0xe1,0x81,0x4c,0xb,0xe0,0x84,0xcf,0xf7,0xd8,0x93,0x1e, + 0x8,0x23,0xe8,0xe2,0xee,0x41,0x43,0x8,0x64,0x71,0x5f,0xcb,0x20,0x37,0x48,0xd1, + 0x0,0x71,0x80,0x36,0x80,0x38,0x23,0x3b,0x5b,0x31,0xd0,0x82,0xe2,0x62,0x62,0xc0, + 0x0,0x7a,0x3d,0x35,0x2f,0xd2,0x47,0x6a,0xcb,0xd1,0x21,0x4c,0x18,0xd7,0xf6,0xc1, + 0x87,0x1e,0x22,0xd0,0x5,0x1b,0xc7,0x6f,0x46,0xa0,0x14,0xc,0xb,0xbc,0x87,0x25, + 0xc,0xd,0x18,0x8,0xb8,0x3f,0x9f,0x7c,0xfa,0x69,0x36,0x92,0xff,0x4e,0x0,0x35, + 0xd8,0x3a,0xc0,0x77,0xe2,0xd4,0xa9,0xf4,0x99,0x30,0x10,0x70,0x1e,0x1e,0xe6,0x46, + 0x33,0x58,0x33,0xfe,0xef,0xd9,0x53,0x27,0xe9,0x73,0x10,0xa8,0x86,0x73,0x87,0x63, + 0xa9,0x13,0x2c,0xfe,0x6c,0x1c,0xd5,0xea,0x4a,0xae,0x73,0xa8,0x4f,0xdf,0xbe,0x67, + 0xaa,0x13,0x53,0xcc,0x20,0xcd,0xc2,0xa0,0x5a,0x4d,0x1,0x59,0x15,0xc6,0x4,0xab, + 0x64,0x47,0x8d,0xdd,0xda,0xc0,0x6b,0x83,0x61,0x8e,0xe,0x90,0x45,0x16,0x9b,0xb2, + 0x83,0xaf,0x8a,0x2c,0x66,0xab,0x81,0x84,0x8b,0x5d,0xe9,0xb2,0x77,0x80,0x89,0xeb, + 0xdb,0x84,0x1f,0x18,0xaf,0x1,0xc0,0x59,0xf9,0x85,0xac,0x98,0x1b,0x4b,0x68,0xdb, + 0x87,0x8,0x63,0x8a,0x88,0x1e,0xd8,0x9f,0xd,0x1b,0xe6,0x81,0x70,0xf3,0xab,0xaf, + 0x62,0x2b,0x26,0xb7,0x62,0x6f,0x1f,0xb9,0xc3,0x8f,0x8e,0x16,0x72,0xb4,0xc9,0x8a, + 0x7b,0x28,0x3f,0xf1,0xaf,0x8c,0xd1,0xdd,0xf0,0x7,0x7f,0x7a,0xe2,0xe,0x96,0x3a, + 0xbb,0x35,0xeb,0xd7,0xa7,0x3b,0x37,0x40,0x1f,0xe4,0xcc,0x37,0xa6,0x22,0x9d,0x31, + 0x10,0x8c,0x84,0xe,0x4d,0x55,0x1b,0x37,0x50,0xba,0x54,0x4e,0x61,0xb1,0x50,0x20, + 0x4a,0xd,0x59,0xdd,0x36,0x58,0x9c,0x7e,0x5f,0x47,0x60,0x5b,0x8e,0x61,0xe0,0x4, + 0x19,0xad,0xeb,0x3c,0xbb,0xc,0x1c,0x97,0x41,0x95,0xe7,0x30,0xbe,0x6c,0xb7,0x5, + 0xee,0xa3,0x25,0x2b,0x92,0xd8,0x7a,0x3e,0x7,0xe8,0x7e,0xdf,0x28,0x37,0x26,0x48, + 0xb,0xa2,0xa4,0x91,0xf7,0xbb,0x72,0xc5,0xb2,0x93,0xab,0x57,0xaf,0xe,0xc5,0x4d, + 0x89,0xaf,0x3a,0xce,0xaa,0x3f,0xfb,0xcd,0xa8,0x91,0xcc,0x1,0x98,0xb3,0xe0,0x3e, + 0x23,0x47,0xc,0xfb,0x75,0x7a,0x7a,0x1a,0xe5,0x88,0x82,0x7d,0x5c,0xe9,0xe4,0x2a, + 0xf,0xe8,0x35,0x31,0x99,0x3,0xc4,0x43,0x1,0xd3,0xf1,0x9e,0x7e,0x72,0xf0,0xbe, + 0xdc,0xc7,0xb5,0xae,0x6f,0xb,0xf3,0x69,0x85,0xa5,0x2d,0xd9,0xb2,0x34,0x18,0xef, + 0x17,0x5f,0x7f,0x45,0xb9,0xc2,0x4,0xc4,0x1c,0x60,0x51,0x4f,0x1a,0x69,0x4b,0x28, + 0xe2,0x81,0xc2,0x1e,0x94,0x8f,0xab,0x1,0xa9,0x2b,0x7a,0xba,0xc6,0x21,0x9,0xeb, + 0xfd,0x77,0x6b,0x1d,0x6d,0x1,0x8d,0x28,0x66,0x47,0x14,0xb6,0xab,0x76,0x35,0x7e, + 0xcb,0x85,0xcb,0x97,0x28,0x92,0x1b,0xc7,0x8,0xe0,0x5,0xb8,0x0,0x78,0x65,0xf0, + 0x97,0x94,0x1c,0xcf,0x7,0xa4,0xd3,0x70,0x26,0xea,0x32,0xa6,0x6c,0x6,0x64,0xb3, + 0xa5,0x84,0xd,0x24,0xd7,0xbd,0x60,0x5d,0x6f,0xfd,0xf3,0xf0,0xfb,0x1,0xb0,0x0, + 0x2a,0x80,0x21,0x52,0x90,0x10,0xb5,0x8c,0x73,0x1,0xb6,0xa,0xe0,0x81,0x4c,0x3b, + 0x6a,0xec,0x38,0xb6,0xff,0xe0,0x41,0x3a,0xc6,0xc5,0xcb,0x97,0x13,0x0,0x83,0x29, + 0xa2,0x40,0x3c,0x3e,0xf,0x81,0x4c,0xa8,0xb1,0x3d,0x62,0xd4,0x28,0xfa,0x8c,0x23, + 0xc7,0x8f,0xd1,0x39,0x84,0xdf,0x11,0xfb,0xe2,0xb3,0xc1,0x12,0x4f,0x3e,0xff,0xbc, + 0x4a,0x4d,0x58,0x95,0x9c,0xcc,0x27,0xa4,0x14,0x23,0x9a,0xd9,0x67,0x71,0x7f,0x7d, + 0x74,0x38,0x18,0x34,0x8e,0xb,0x3e,0x79,0x48,0xe5,0x0,0x48,0x48,0xc7,0x88,0x50, + 0x96,0x6d,0x25,0x11,0xc1,0x8c,0xd4,0xa1,0x47,0x1f,0x7f,0x5c,0xc8,0xd4,0x5b,0xd8, + 0xd4,0x19,0x33,0x89,0x35,0xe3,0xd8,0x71,0x5c,0x90,0xdf,0x71,0x2d,0x11,0x38,0x6, + 0xdf,0xef,0xb,0x2f,0xbd,0x44,0xec,0xa,0x41,0x65,0x67,0x85,0xa1,0x9,0xff,0xef, + 0x84,0xc9,0x53,0x48,0x41,0x90,0xb9,0xc2,0xce,0x18,0x8e,0x50,0x43,0xe9,0x7c,0x24, + 0xd8,0xda,0xd9,0xc,0xf2,0xde,0x49,0x24,0x1e,0xc4,0x66,0xdd,0xb2,0xca,0x1b,0x98, + 0xc7,0xe2,0x65,0x2b,0x58,0x66,0x5e,0xa1,0xc1,0x72,0x72,0x42,0x59,0xab,0x3f,0x29, + 0xe7,0x68,0xaf,0x73,0x2c,0x96,0x65,0xec,0x1b,0xf0,0x1f,0x97,0x6,0xfd,0xc4,0xe, + 0x36,0xeb,0x66,0xb8,0x65,0xd1,0xc,0xbb,0xd8,0xdf,0x2f,0xa7,0xa8,0x84,0x95,0x54, + 0x6e,0x60,0x69,0x59,0x39,0xd4,0x33,0x17,0xe5,0x29,0x1,0x7e,0x49,0xab,0x57,0xb1, + 0x81,0x1c,0x84,0x87,0xf,0x1f,0xca,0xee,0xbc,0xeb,0x2e,0xd6,0xb4,0xe9,0xd5,0xac, + 0xc7,0xed,0xcd,0xd8,0xae,0xcc,0xf6,0xec,0xf3,0xe7,0xba,0x18,0x69,0x4a,0xa,0x84, + 0x1b,0x5,0x13,0xd6,0x82,0xb5,0x14,0xfb,0xe5,0x20,0xfc,0xe3,0x97,0xba,0xb0,0x3, + 0x5,0xed,0xd9,0x90,0x5e,0x2d,0x58,0x8f,0x9e,0xbd,0xf8,0xf7,0xed,0x20,0xf0,0xb5, + 0xfd,0xbd,0xcf,0x9d,0x7c,0x96,0x4a,0x4a,0x22,0xc5,0xc8,0xcb,0x5d,0xf6,0xfd,0xd9, + 0x41,0x89,0xbf,0xd4,0x29,0x31,0x7,0xae,0x8b,0x1d,0x91,0xee,0x52,0x1d,0x74,0xd9, + 0xd9,0x8a,0x42,0xf,0xbd,0xce,0x11,0x8a,0x86,0xdb,0xd7,0x5c,0x4e,0xf5,0xc6,0x53, + 0xd6,0xa5,0x92,0xa2,0x9b,0x88,0xab,0xd,0x12,0x35,0x82,0xb4,0xe,0x3d,0x7a,0x88, + 0x65,0x67,0x67,0xfc,0xfb,0x8a,0x15,0xcb,0x7b,0x5d,0x9,0x8e,0xfe,0xdf,0xf6,0xbe, + 0x3b,0xbc,0xae,0xe3,0xba,0x53,0xb2,0x6c,0x49,0x96,0xed,0x95,0x65,0x3b,0x76,0x62, + 0x51,0x24,0x41,0xf4,0xde,0x7b,0x7,0x41,0x12,0xec,0x4,0x9,0x80,0x68,0x2c,0x0, + 0x88,0x4e,0xa2,0xb3,0x57,0x51,0x14,0x7b,0x93,0x44,0x8a,0x45,0x52,0x24,0x5b,0xb2, + 0x65,0x9b,0x4,0x48,0xa8,0xd3,0x4d,0x56,0xa2,0xd8,0x71,0x8b,0xed,0x6c,0xb2,0x1b, + 0x7b,0xb3,0x9b,0x75,0x76,0x93,0x4d,0x9c,0x75,0xec,0x8d,0xe5,0xcd,0x26,0xd9,0x68, + 0x76,0x7e,0xf3,0xde,0x3c,0xcc,0x9d,0x37,0xed,0x3e,0x3c,0xc6,0xfb,0x87,0xde,0xf7, + 0xcd,0xf7,0x6e,0x99,0x7e,0xcf,0x9c,0xdf,0x39,0x67,0xce,0xcc,0x20,0x84,0x7e,0x40, + 0x6e,0x1e,0xf0,0x42,0xbc,0x57,0x3d,0xdf,0xb4,0x69,0xf3,0x1d,0xd5,0xd5,0x55,0x7b, + 0x17,0xd5,0x2e,0xa4,0xcc,0x69,0x37,0x5b,0xb2,0x2,0xcd,0x42,0x66,0xbc,0x22,0x23, + 0x55,0x5d,0xcb,0x8c,0xd6,0x34,0x1f,0x6c,0x62,0xd0,0x72,0xde,0xa6,0xf7,0xce,0x66, + 0x69,0xdd,0x21,0xeb,0xc1,0xd,0x3d,0xb0,0x5b,0xd6,0xf7,0x7f,0xf8,0x47,0x14,0x88, + 0xff,0x3d,0x3,0x60,0x30,0x3c,0x0,0xdd,0xb7,0xbf,0xf7,0x1d,0xaa,0x25,0x7,0xe6, + 0x89,0x1,0xd0,0xf0,0xba,0xf5,0x68,0xb0,0xa2,0x69,0xfa,0x75,0x2f,0x10,0x7b,0xd6, + 0xe3,0xbe,0xae,0x77,0x9c,0x52,0xcf,0xeb,0xce,0x5c,0x63,0xbe,0x1a,0x80,0x8b,0xb3, + 0x8f,0xd9,0x1c,0x2f,0x25,0x2a,0xcc,0xef,0x72,0xcf,0x75,0x76,0x4,0xe3,0xad,0xd7, + 0xc3,0x76,0x55,0xb2,0x99,0x5b,0x6c,0x80,0xa9,0xeb,0xe7,0xa9,0x8,0x35,0xe0,0x50, + 0xbe,0x94,0x61,0x4f,0x19,0xe2,0xc0,0x72,0x1,0x69,0x14,0x5a,0x1f,0x2,0x6,0x6, + 0x37,0xed,0x63,0x8e,0x16,0x0,0x5,0xcd,0xf8,0xe2,0xa5,0x4b,0x64,0x32,0xb8,0x51, + 0x5,0xfa,0xe2,0x69,0x2a,0x88,0x40,0x18,0x81,0x0,0x89,0x7e,0x83,0x17,0x33,0xe6, + 0x50,0x31,0x9f,0x8a,0xfe,0xe2,0x96,0x10,0x94,0x71,0xe5,0xa9,0xa7,0x98,0xc5,0x0, + 0x3,0xf,0xcf,0xf8,0x9c,0x24,0xb4,0x50,0xee,0xd4,0x65,0x32,0xa9,0x6a,0xfb,0xd0, + 0xb2,0x4a,0x0,0xf9,0x62,0x69,0x14,0x9c,0xad,0x3e,0x1b,0xd4,0x58,0xb9,0x90,0x83, + 0x7a,0x41,0xa0,0xe2,0x74,0xa,0x50,0x42,0x7d,0xb8,0x13,0x1f,0xc0,0x96,0xb7,0xd, + 0xef,0xf8,0x7a,0x6e,0xcc,0xf3,0xe2,0x9e,0x4b,0xfa,0xc8,0x7,0x79,0xcb,0x9b,0xeb, + 0xc8,0xdf,0xc1,0xe4,0x94,0x15,0xe,0x96,0xd3,0x4e,0xd6,0xb,0x97,0xb1,0xa9,0xa2, + 0x27,0x58,0x72,0x8e,0x9d,0x38,0x41,0x5,0xa2,0xe6,0xd0,0xdc,0xac,0x99,0x89,0x8f, + 0xb3,0x8d,0x21,0x64,0x40,0x1c,0x50,0x82,0x42,0xe0,0xf9,0x80,0x92,0x79,0xb,0xe0, + 0x3d,0x1c,0x8,0x72,0xb9,0x72,0x9e,0x3,0x86,0xba,0x79,0x81,0x79,0xdc,0xa3,0x49, + 0x2,0x84,0x3b,0xba,0x7b,0xc8,0xb1,0xe3,0xc7,0xd8,0xb8,0xc7,0xf2,0xa4,0xb6,0xf6, + 0x56,0x92,0x91,0x91,0x46,0x35,0xe1,0x3c,0x92,0x4e,0xff,0xff,0xdd,0xfd,0xf,0x90, + 0xf7,0xdd,0x79,0x27,0x49,0x8b,0x79,0x3f,0x19,0x6f,0xbe,0x9f,0xbc,0x74,0xea,0xd3, + 0xe4,0x4f,0x5f,0x9c,0xcf,0xcc,0xc9,0x1,0x2f,0xe9,0x40,0x60,0xf3,0xbf,0xf4,0xff, + 0xaf,0x5f,0x8b,0x25,0x3f,0xbe,0x16,0x43,0x6e,0x9d,0xff,0x34,0xd9,0xb3,0xf1,0xa3, + 0x24,0x3f,0xe9,0x5e,0xf2,0xf1,0x8f,0x7d,0x94,0x64,0xe7,0xe4,0x91,0x93,0xa7,0x4e, + 0x6,0x97,0x1b,0x81,0x9e,0x82,0x4b,0x8d,0x68,0x78,0xe2,0xe2,0x13,0x14,0x9c,0x3a, + 0x49,0x67,0x4f,0x7f,0xd0,0xa3,0x78,0x3c,0xa4,0xad,0x87,0x40,0x58,0x2,0x62,0x7d, + 0x1b,0xf5,0x60,0x3b,0x60,0xd1,0x72,0x7,0x15,0xf3,0xf7,0x83,0xa3,0x6a,0xd3,0xb3, + 0x3c,0x4f,0x1c,0x36,0x5,0xc1,0x37,0xe0,0x18,0xdf,0x41,0x7a,0x83,0x6b,0x7e,0xb1, + 0xc7,0xbd,0x28,0x80,0xea,0x96,0xc2,0xf2,0xcd,0x6c,0x9e,0x7a,0xfa,0x29,0xb2,0x77, + 0xef,0x6e,0xd2,0xbc,0xbe,0xe9,0xa0,0xa,0x2f,0x39,0x66,0xea,0xae,0x43,0xbf,0xf6, + 0xf6,0x76,0x25,0xe8,0xf2,0x20,0xbe,0xe7,0xd7,0x4d,0x4d,0x4d,0xbf,0x55,0x90,0x9f, + 0xf7,0x1f,0x37,0x50,0xa9,0xec,0xd8,0x89,0xe3,0x6c,0xe0,0xbb,0xe,0xa8,0x29,0x5, + 0x50,0x7a,0xb4,0xd6,0x69,0x3d,0x43,0xd7,0x32,0x79,0x95,0xe6,0x3b,0x7d,0xc3,0x49, + 0x20,0x30,0x31,0x4d,0xdd,0x26,0x1e,0x7c,0xad,0x22,0xc0,0xec,0xdb,0xdf,0xfd,0xe, + 0x73,0xce,0x82,0x89,0x1a,0xc0,0x7,0xd3,0xf3,0x57,0x28,0xf8,0x7d,0xe7,0x7b,0xdf, + 0x65,0x9a,0x31,0x4e,0x5e,0xfa,0xe6,0xb7,0xbf,0x45,0xde,0x7c,0xeb,0x1b,0x33,0x4b, + 0x5b,0x94,0xa6,0xe3,0x70,0x27,0xae,0x97,0x5f,0x7b,0x35,0x7c,0x2e,0x59,0x98,0xe7, + 0x85,0xe6,0x83,0x3c,0x51,0xde,0xd7,0xdf,0x7a,0x93,0x7c,0xed,0x1b,0x6f,0x32,0xe6, + 0x84,0xf6,0xe1,0x9b,0xc0,0x3d,0x1e,0xc4,0xc2,0x4,0x4,0xaa,0xbd,0xc3,0x74,0xee, + 0xea,0xd1,0x1c,0xe9,0x7c,0xbb,0xb,0x10,0xeb,0x40,0xdb,0x94,0xd6,0xf3,0xfd,0xa4, + 0x6f,0x2e,0x4e,0x1b,0xc8,0x60,0x28,0x6f,0xd3,0xc8,0x81,0x4d,0xec,0x3,0x71,0x7d, + 0x2b,0xf,0x62,0xf9,0xf2,0x33,0x91,0xb6,0x4c,0x2,0x4a,0x28,0xde,0x4b,0xfe,0x5, + 0x10,0xb1,0xae,0xaa,0x76,0xe9,0x1c,0xe,0x65,0xc0,0x74,0x99,0x83,0x95,0x2d,0x4a, + 0xb3,0x9d,0x2a,0x60,0x79,0xbc,0x64,0x8f,0xaf,0xff,0xde,0x76,0x8b,0x18,0xe8,0x7e, + 0x60,0xeb,0x36,0xd2,0xba,0xa9,0x73,0xc6,0x14,0xad,0x30,0xd,0xcb,0x4c,0x1e,0xa0, + 0xe9,0x2,0xd8,0xe1,0x1a,0xf5,0x44,0x28,0x6d,0x38,0x20,0x7b,0x35,0xe8,0x1,0xf, + 0xf0,0xab,0x4d,0xd5,0x4c,0x20,0x10,0xc0,0x4b,0x5,0xce,0x13,0x7b,0xf6,0x93,0xcd, + 0x5d,0xdd,0xe4,0xe8,0xb1,0xa3,0x21,0x4d,0xb8,0xaf,0xbf,0x97,0xe4,0x62,0x47,0xbc, + 0xec,0x4c,0x6,0xc4,0x49,0x49,0x89,0xe4,0xc3,0x1f,0xb9,0x9f,0xdc,0x49,0x81,0xf8, + 0x43,0xf7,0xdc,0x41,0x52,0xe7,0xbf,0x9f,0xac,0xad,0xbc,0x8f,0x8c,0xae,0xbf,0x9f, + 0x1c,0xde,0xf2,0x31,0x72,0xbc,0xff,0xe3,0xe4,0x91,0xee,0x8f,0xb1,0xb3,0x85,0xb1, + 0x94,0x29,0x33,0xee,0x3,0xe4,0x93,0xf,0xdc,0x43,0x1e,0x78,0xe0,0xe3,0x64,0xde, + 0xfc,0x5,0x64,0xf9,0x8a,0xe5,0xe4,0xe2,0x93,0x17,0x2,0xe0,0xcb,0xa6,0xe1,0x2, + 0x3b,0x5c,0xdd,0xa0,0xdf,0x0,0xde,0xc0,0x1b,0x3b,0x3a,0x49,0xef,0xd6,0x21,0xcf, + 0xee,0x5d,0x6a,0x13,0xf0,0xb8,0x76,0x43,0x93,0x19,0x1,0x68,0x42,0xd,0xa8,0xa, + 0xc1,0xc5,0xe,0xd4,0x2a,0x8b,0x82,0xf7,0x7a,0x40,0x8c,0x2f,0x80,0x35,0x9c,0xad, + 0x70,0xc6,0x2f,0x3c,0xea,0xd7,0x36,0xb5,0x30,0x4b,0x43,0xa0,0xcd,0x76,0x7a,0x87, + 0xb2,0x9,0x81,0xf5,0xd4,0xe9,0x93,0xd8,0x74,0xe3,0xc7,0x2d,0xcd,0xcd,0x9f,0x90, + 0x71,0x52,0x75,0x2f,0x7,0xf,0x0,0xfb,0xd,0x40,0xf1,0xc5,0x8b,0x17,0xb5,0x57, + 0x56,0x94,0x91,0xd1,0xb1,0xd1,0xd0,0xe6,0x1c,0xba,0x41,0xa7,0x32,0x7,0xab,0x9e, + 0x87,0x1,0xe9,0xb4,0xda,0xa4,0xac,0x63,0xe4,0x2a,0x6d,0x59,0x1c,0xcc,0xca,0xb4, + 0x6,0x73,0x9a,0x6e,0xc3,0x7d,0xf9,0xcc,0x5b,0x0,0x22,0x0,0xf6,0x7,0x3f,0xfa, + 0x21,0xd3,0x8a,0xff,0xf0,0x3b,0xdf,0x66,0x1a,0xe8,0xcb,0xc1,0x35,0xb6,0x58,0xce, + 0x4,0x40,0xc6,0xfb,0x1f,0xfc,0xf1,0xf,0x19,0x58,0x63,0xc3,0xf,0x98,0xac,0xbf, + 0x4e,0x41,0x13,0xc0,0x7d,0xeb,0xab,0x5f,0x66,0xe0,0xc9,0xd7,0x7,0x8b,0x6b,0x85, + 0xf1,0x1c,0x67,0x19,0xc3,0x13,0x1b,0xe5,0x40,0xbb,0x46,0xc0,0x96,0x99,0xac,0x1c, + 0x78,0x1,0xd3,0xc1,0x9,0x2d,0x7,0x1,0x44,0x82,0x72,0x91,0xef,0x1b,0xc1,0x53, + 0x9e,0x54,0x9b,0x3e,0x98,0x0,0xc4,0xc3,0x94,0xa7,0xed,0x82,0x4f,0x24,0xda,0xb1, + 0xab,0x65,0x23,0x52,0x70,0x88,0x24,0xf,0xd7,0x32,0x2,0xb4,0xe5,0x9e,0x67,0xa4, + 0x96,0x19,0x53,0xfd,0x74,0x79,0xda,0xac,0x42,0x61,0xe3,0x6f,0xfa,0x46,0x64,0xe0, + 0x2b,0xd5,0x55,0xd7,0xce,0x88,0x34,0x5d,0x55,0x3e,0x42,0x3d,0xf9,0x89,0x63,0x58, + 0xb3,0x9,0x87,0xa0,0x99,0x39,0x5f,0xaf,0x76,0xab,0x4,0x2,0x51,0xd3,0xa5,0xf7, + 0x3,0x6,0x6,0xcf,0x34,0x5d,0xe1,0xf9,0x80,0xd2,0x44,0xaa,0x4b,0x1b,0x28,0x8b, + 0xe7,0x21,0x9a,0xb2,0x7,0x4,0xad,0x17,0x1,0xa6,0x67,0x11,0xc0,0xf8,0x56,0x8e, + 0xdb,0xf7,0x1e,0xa0,0xda,0x67,0x2f,0xd9,0x7f,0x60,0x3f,0xb9,0x49,0xdb,0xf,0x93, + 0x30,0x76,0x5c,0xc2,0x1a,0x61,0xec,0x94,0x5,0xf,0x69,0xcc,0xd,0xe3,0x7a,0xde, + 0xfc,0x79,0xe4,0xa3,0x14,0x58,0xef,0xbe,0xe7,0x3e,0xf2,0xbe,0xbb,0xee,0x26,0x77, + 0xdd,0xf5,0x1,0x16,0xee,0xbe,0xfb,0x5e,0xf2,0xc1,0xfb,0x3e,0x42,0x3e,0xfe,0x89, + 0x4f,0x31,0x6f,0x6a,0x2c,0x6b,0x2a,0x2b,0x2f,0x25,0x43,0xc3,0xdb,0xc8,0xe7,0x5f, + 0xfc,0x1c,0xcb,0x73,0xfa,0xa5,0x9b,0xc,0x7c,0xb1,0xbe,0x17,0xde,0xd7,0xe3,0x13, + 0x13,0x6c,0x89,0xd1,0x20,0xad,0x57,0x0,0x74,0xc7,0x2,0xd7,0xa3,0xea,0x1d,0xc2, + 0x64,0x13,0x74,0xc8,0xe2,0x60,0x33,0xbf,0x4b,0x4b,0xbd,0x6,0x84,0x79,0x79,0xdd, + 0xf4,0x82,0x28,0xd4,0xc,0x68,0xf2,0x1d,0x90,0xa7,0x18,0x82,0x1,0xe6,0xe6,0xde, + 0xfe,0x7e,0xe6,0x7c,0x8a,0xe9,0xa5,0xd1,0xf1,0x71,0xef,0xb4,0xa8,0x48,0x77,0x2f, + 0x79,0x95,0x7,0xbc,0x83,0x55,0x9,0xcb,0x8e,0xc6,0xc6,0x46,0x48,0x63,0x63,0xc3, + 0xc6,0x48,0xf0,0x13,0x21,0xf4,0x6b,0x6b,0x6b,0x53,0x6,0x44,0x12,0xaf,0xe5,0xfb, + 0x96,0x96,0x96,0xf7,0x17,0x16,0xe4,0xbf,0x51,0xbf,0x66,0x35,0x39,0x18,0x74,0xc8, + 0x82,0x89,0x4e,0xc5,0xa4,0xfc,0x30,0x28,0x15,0xd0,0xca,0x83,0xd0,0x34,0xcf,0xab, + 0x5,0x7e,0x29,0x9d,0x1f,0xb3,0xb4,0xa8,0x15,0xdb,0xce,0xba,0xe5,0x1b,0x78,0x7c, + 0x97,0x82,0x2c,0xb6,0xb7,0x84,0x93,0x16,0x8e,0x3c,0xe4,0x4b,0x97,0x98,0x77,0xed, + 0xad,0x80,0x99,0x18,0x60,0xfa,0xf6,0xb7,0xfe,0x80,0x81,0xf1,0xb7,0x28,0x68,0xff, + 0x21,0xd5,0xa6,0xa1,0x51,0xe3,0x1a,0xde,0xd7,0xf0,0xb8,0x86,0x89,0xfb,0x1b,0xbf, + 0xff,0x16,0x3,0xea,0x5b,0x41,0x93,0x36,0x77,0x2,0x80,0x29,0x11,0x4c,0x88,0x3b, + 0x53,0x71,0xd3,0x33,0x76,0xf5,0xe2,0xcb,0x6b,0xb4,0x87,0x1,0x28,0x4c,0x86,0xb2, + 0x50,0x22,0x7f,0x17,0x3f,0x0,0xa6,0xfd,0x26,0xd3,0x7a,0xd0,0x98,0x32,0x30,0x6e, + 0xdd,0x37,0x54,0xa,0x74,0xd3,0x37,0x9c,0xb4,0x28,0xab,0xf9,0xdc,0x20,0x30,0xfa, + 0x15,0x34,0xfc,0xf4,0x9b,0x9f,0x3c,0x5d,0xb5,0x48,0x5f,0xc2,0xd0,0xb4,0xbd,0x5f, + 0xa2,0x29,0xd4,0x4c,0x19,0xfa,0x5a,0x2f,0xfc,0xdc,0x60,0xe,0x59,0xd8,0x38,0x6, + 0x6b,0x37,0xc3,0xb4,0x24,0xc1,0x9,0x4b,0x4,0x3,0x15,0x90,0xe,0x88,0x60,0xa9, + 0x60,0xe8,0x3,0x1a,0x2d,0x4c,0x34,0x6b,0x73,0x93,0x74,0x8,0x1c,0x82,0xc0,0x3f, + 0x20,0x6a,0xde,0xa3,0x92,0x56,0x16,0x56,0x3f,0xb1,0x8c,0x31,0x16,0x0,0x42,0x3b, + 0xf6,0x1d,0x24,0xbd,0x83,0xdb,0xd8,0xc6,0x18,0xd8,0xf0,0xff,0xd6,0x57,0x6e,0xd1, + 0x71,0xff,0x5,0xb2,0x63,0xe7,0xe,0xb2,0x74,0x69,0x1d,0x5,0xe1,0x2c,0x36,0x3f, + 0x9c,0x9d,0x9d,0x45,0xf2,0xf2,0x3,0x1e,0xd3,0xb9,0xb9,0xd9,0x2c,0x40,0x53,0xe6, + 0x1,0xf7,0x35,0x35,0xd5,0xa4,0xbf,0xbf,0x8f,0x3c,0xfd,0xcc,0x53,0xcc,0xb9,0xa, + 0xce,0x56,0xd8,0x7b,0x3a,0x70,0x8e,0xef,0x4b,0x54,0x1b,0xbe,0xc8,0x96,0xec,0x6d, + 0xde,0xd2,0x13,0x4,0xc1,0x19,0xd3,0x78,0x48,0x48,0x10,0x4c,0xe5,0x5b,0x25,0xe1, + 0x66,0x60,0x44,0xad,0xd5,0x7b,0x84,0x23,0x49,0xe8,0xd1,0x59,0x2b,0x94,0x60,0x1b, + 0x4,0xd2,0x1,0x5,0xb8,0xf,0x8,0x7d,0xa9,0xea,0x67,0x4c,0x57,0x6c,0xe8,0xdc, + 0xc2,0x4e,0x2c,0xe2,0xbc,0x92,0xaf,0x7b,0x77,0xa1,0x51,0x58,0x13,0x81,0x73,0x87, + 0xf,0x1f,0x22,0x6d,0xad,0x2d,0x2f,0x51,0xc,0xbc,0x53,0x85,0x95,0xa6,0x6b,0xfe, + 0x1f,0x6,0xc0,0xad,0xad,0xad,0x2c,0x88,0x20,0xcc,0x9f,0xa9,0x2,0x32,0x5a,0xb5, + 0x72,0x65,0x76,0x61,0x41,0xde,0xcf,0xbb,0xb6,0x74,0x91,0x93,0xa7,0x4f,0x31,0xed, + 0xeb,0xa6,0xc2,0xa9,0x4a,0xa9,0xdd,0xa,0xe0,0xac,0xd5,0x8a,0x15,0x20,0x6a,0x73, + 0xb6,0x32,0x31,0x4c,0xcf,0xb5,0x6,0xc0,0xe5,0x3c,0x4c,0xcb,0x2f,0xe4,0x13,0x31, + 0x64,0xb3,0x2e,0xc0,0x16,0xc0,0xb,0x10,0xfd,0xee,0xf7,0xbf,0xc7,0xc0,0x18,0x9a, + 0x30,0x40,0xf6,0xf7,0x29,0x28,0x33,0x50,0xd,0x2e,0x65,0x12,0x4f,0x1a,0x12,0x41, + 0x1f,0x75,0x81,0x46,0xcb,0x97,0xbe,0x0,0xe0,0x91,0x27,0xcc,0xcd,0x5f,0xa7,0x0, + 0xe,0xb0,0x7,0x31,0x5,0x9c,0xbf,0x5e,0xb5,0x6e,0x6e,0x6f,0x35,0x97,0x3a,0x80, + 0x81,0xca,0xf2,0xa0,0x2,0x6b,0x17,0xa1,0xcb,0xf4,0x1d,0x55,0x34,0x62,0x62,0xd2, + 0x2e,0xa6,0x6d,0x9d,0xc3,0x5e,0xa4,0x60,0xe9,0x42,0x87,0x26,0x7f,0x5,0x53,0x3f, + 0xd8,0x68,0x58,0x55,0x17,0xdb,0x77,0x74,0xb5,0x58,0x4c,0xf9,0xb4,0x76,0xe8,0xea, + 0x7a,0xc3,0x30,0xce,0x9c,0x4,0x36,0x4b,0x3a,0xb6,0x41,0xc7,0xde,0x3d,0xcc,0x94, + 0xe8,0xf1,0x7c,0x96,0xb4,0xd6,0x1,0x9,0x98,0x7,0x14,0xef,0x7,0x55,0xa0,0x2c, + 0x82,0xb,0x37,0xa3,0x5a,0x0,0x5a,0xd6,0xd4,0xc4,0x7c,0xac,0x26,0x55,0xb9,0xdc, + 0x20,0xe8,0x1,0x84,0x47,0x77,0xee,0x26,0x5d,0x54,0x1b,0x7e,0xf8,0x91,0x87,0x99, + 0x39,0x1a,0x2,0xc8,0x14,0x55,0x7a,0xce,0x3d,0x76,0x8e,0xc,0x8f,0xc,0x91,0x86, + 0xc6,0x75,0x64,0xe1,0xc2,0x1a,0x52,0x5a,0x56,0x42,0x8a,0x8b,0x8b,0xd8,0x3f,0x0, + 0x77,0xd5,0xaa,0x95,0xcc,0x74,0x8d,0x25,0x4d,0x38,0x69,0xe9,0xd5,0xe0,0x16,0x92, + 0x7c,0x79,0x11,0xc0,0xf7,0xf9,0x17,0x3e,0x4b,0x76,0xed,0xde,0xc5,0xe,0x52,0xe8, + 0x1e,0xd8,0x3a,0xb3,0x97,0xb2,0xc6,0x59,0x4c,0xa7,0xd1,0x9a,0xda,0x6a,0xb2,0x1a, + 0xcc,0xf4,0xef,0x8c,0xc0,0x32,0x10,0xf6,0x5e,0xb2,0x4a,0xc,0x87,0xbf,0x93,0x85, + 0xac,0x1,0xe1,0x5b,0xa2,0xde,0x38,0x1e,0x71,0x7c,0xfb,0x84,0x6f,0x9f,0x15,0xf0, + 0x60,0x4c,0xe9,0x9d,0x3d,0x77,0x86,0xf4,0xf4,0x74,0xfd,0xb2,0xb1,0xa1,0x21,0x87, + 0x63,0xa4,0x4e,0x89,0x15,0xf1,0x52,0x8e,0x1b,0xfa,0x89,0x91,0x28,0xa2,0x1b,0x41, + 0x57,0x5,0xc2,0x95,0x95,0x15,0xbb,0x6b,0xaa,0x2b,0xc9,0xf8,0xc4,0x38,0x3b,0x3, + 0x12,0x9a,0x99,0x8d,0x1,0xa8,0xe6,0xf3,0x5c,0xcc,0xd2,0x5a,0xb3,0xa2,0x3,0x43, + 0x33,0x31,0xce,0xc9,0x9b,0x53,0x46,0x26,0xa7,0x33,0xb,0xf2,0x25,0x1b,0x1e,0xf3, + 0xee,0x2b,0xfa,0xf3,0x4f,0xf9,0x8e,0x4b,0x70,0xce,0x82,0x39,0x19,0x26,0x68,0x68, + 0xc7,0x58,0xd2,0x4,0xb3,0x35,0x9c,0xb8,0xb0,0xed,0x25,0xe6,0x8c,0xa1,0x15,0x23, + 0xbc,0xcd,0xb5,0x60,0xa,0xb4,0xd8,0x89,0x8b,0x99,0x95,0x69,0x7a,0x71,0x8f,0x66, + 0xd3,0x59,0xb1,0x2e,0x26,0x66,0x13,0x38,0x98,0x40,0xcf,0x97,0x20,0x64,0xa1,0x3, + 0x17,0x7a,0xd1,0x69,0xc9,0xb2,0x60,0xe6,0x22,0xa8,0x59,0x81,0x61,0xfa,0x86,0x15, + 0x6c,0x55,0xda,0xb9,0x9c,0xde,0xd5,0x2c,0xae,0x16,0x12,0xed,0x42,0x82,0x8d,0xd6, + 0xd5,0x26,0xe7,0x9b,0x5a,0x41,0xd4,0x36,0x66,0x5c,0x34,0x75,0xdb,0x98,0x55,0x69, + 0xe7,0xce,0x6d,0x90,0xd2,0xf0,0x2d,0x53,0x7b,0xfa,0xfa,0x49,0xcb,0xc6,0x8e,0x90, + 0x53,0xd6,0x80,0x8a,0xd9,0xf,0x8f,0x87,0x1,0xaa,0xcc,0xa4,0x7,0x14,0x1a,0x6e, + 0x38,0x10,0x87,0x83,0x8e,0x8,0xd8,0xfd,0x43,0x63,0x6c,0x5d,0x69,0x1f,0xce,0xf9, + 0x95,0x43,0x30,0xbd,0xa,0xa8,0x6,0x8c,0x4e,0x64,0xa3,0x6c,0xa3,0x8e,0x3d,0x87, + 0x1e,0xa1,0xf9,0x8c,0xd0,0xf6,0xf6,0x91,0xc3,0x8f,0x1c,0x66,0x80,0x8a,0xf9,0xe1, + 0xd7,0xbe,0x72,0x2b,0xb0,0x5c,0x68,0xea,0x3a,0xf9,0xfc,0x17,0x3e,0x4f,0x5e,0xf8, + 0xdc,0xf3,0xe4,0x73,0x2f,0x7e,0x8e,0x39,0x6f,0x4d,0xb3,0xe5,0x4c,0xaf,0x4,0x4e, + 0x34,0xa,0x3a,0x57,0x5,0xf6,0x39,0xbe,0x49,0x9e,0x7d,0xee,0x77,0xc9,0xde,0x7d, + 0x7b,0xc9,0xe6,0xae,0xae,0x90,0xd6,0xcb,0x77,0xe5,0xd2,0xb,0xd,0x63,0x92,0x90, + 0x30,0xee,0x0,0xba,0x52,0x5f,0x89,0x56,0x3,0x83,0x10,0xa4,0x9e,0x4b,0x57,0xcc, + 0xb5,0x4b,0xdf,0x41,0xae,0x5f,0x68,0x4a,0x62,0x6c,0x7,0x73,0xba,0xba,0xfa,0xd4, + 0x55,0x27,0xc1,0x93,0x2b,0x94,0xdc,0xf4,0xbc,0x7d,0xfb,0x18,0x69,0x6c,0x58,0xb7, + 0xb3,0xa5,0xa5,0xd5,0x17,0x56,0xca,0x21,0xf4,0x3,0xe8,0x8a,0x41,0x6,0x63,0xdd, + 0x3b,0x7e,0xdf,0xd0,0xd0,0xf0,0xe1,0xbc,0xdc,0x9c,0x6f,0x35,0x34,0xac,0x23,0x87, + 0x1e,0x3e,0x14,0x32,0x45,0xcb,0x4c,0x49,0xc5,0x58,0x74,0x21,0x94,0x3e,0x4a,0xc1, + 0xa8,0x61,0x39,0x2,0x3d,0xaf,0xb3,0xd6,0x13,0xd4,0x30,0x7f,0xac,0x5b,0x63,0x2b, + 0x1f,0xaa,0x2e,0xce,0x2d,0xeb,0x4e,0x1f,0x32,0x9d,0xed,0x6a,0xdb,0x59,0xca,0x4, + 0xac,0x26,0xad,0xc3,0x6,0xa2,0x36,0x10,0x36,0x69,0x86,0xb6,0x38,0x4e,0xe0,0x3f, + 0x7d,0x43,0x29,0x84,0x69,0xe9,0xc8,0xa8,0x71,0xdb,0x4d,0xdf,0x7e,0x81,0x5d,0x6b, + 0xfd,0xd1,0x58,0x1f,0x8c,0xfd,0x35,0xed,0x6d,0x9b,0x5f,0x8d,0xdf,0x5a,0x57,0x87, + 0x3a,0x59,0x57,0x3a,0x4c,0x87,0xb,0x4d,0xfa,0xf2,0xfc,0xd1,0x91,0x8a,0x4e,0x21, + 0xd4,0x42,0xf0,0xc7,0x2e,0x59,0x38,0xb6,0x10,0x20,0xec,0xd1,0xa8,0xe4,0x6b,0x9, + 0x5c,0x7,0x24,0x50,0x9c,0x99,0xb3,0x95,0x4c,0x9a,0xb2,0x96,0xa6,0xd0,0xa4,0x1, + 0xbe,0xf0,0x60,0x3e,0x70,0xf8,0x8,0xd9,0x73,0xf0,0x61,0xb2,0xef,0xd0,0x61,0xb2, + 0xf7,0xe0,0xe1,0xe0,0xff,0xc3,0x64,0xe7,0xde,0x3,0xc,0x48,0xfb,0x38,0x18,0x6b, + 0x80,0x5f,0x65,0x96,0x1e,0xc,0x2,0xdf,0xc4,0xee,0x7d,0x64,0xd7,0x81,0x87,0xd9, + 0x7d,0x67,0x77,0xf,0x19,0x1b,0x1f,0x27,0xa7,0xcf,0x9c,0x22,0x9f,0xf9,0xec,0x73, + 0x6c,0x1b,0x4b,0x76,0x3c,0xe0,0x6b,0xaf,0xb0,0x35,0xc4,0x5c,0xdb,0x7d,0x99,0x6d, + 0x67,0x3b,0xcd,0x8e,0xc,0xc4,0xfa,0x55,0x38,0x76,0x6d,0x1d,0xda,0xc6,0x96,0xab, + 0x61,0xf7,0x2d,0x98,0x9a,0x4d,0xc0,0xcb,0x34,0x71,0x69,0xae,0x3a,0x4c,0x98,0x19, + 0x1e,0x33,0x2,0xee,0xa0,0x42,0xd8,0x19,0xd4,0x6a,0xc0,0x63,0x61,0x80,0x1a,0x66, + 0x95,0x90,0xfb,0x4c,0x65,0x7d,0xf0,0x68,0xc5,0x13,0xa4,0x6d,0x53,0x7,0xdb,0xc3, + 0xc2,0xc9,0x42,0x25,0x78,0x3d,0x63,0xd3,0xa2,0x47,0xa8,0xc0,0xd3,0xda,0xb2,0xfe, + 0x9b,0x8d,0x8d,0x8d,0x1f,0x92,0xf1,0x51,0x77,0xad,0xb,0xa1,0x5f,0x73,0x73,0xb3, + 0x36,0x12,0x7f,0x87,0x7f,0x39,0x1e,0xbf,0x47,0x61,0x75,0x75,0x75,0x95,0x85,0x5, + 0x79,0xef,0x74,0x6d,0xe9,0x24,0x27,0x4e,0x9d,0x64,0xa6,0xe8,0x88,0x81,0x55,0xa5, + 0xa1,0x6,0xe7,0x96,0x75,0xf9,0x89,0x1a,0xac,0xb,0x23,0x14,0xeb,0x81,0x78,0xaa, + 0xf4,0xa6,0x39,0x29,0x93,0x76,0x6c,0x3a,0x8d,0x49,0x9e,0x87,0xd5,0x81,0x2e,0x33, + 0x69,0x8b,0x7b,0x43,0x6b,0xe,0x89,0x37,0x9d,0x36,0xe3,0x7,0x78,0x4d,0xfd,0x36, + 0x19,0xa9,0xe0,0x33,0x3d,0xb,0xc1,0x6a,0xda,0x51,0x70,0x72,0xd0,0xc2,0x5d,0x9c, + 0xf7,0x6c,0x40,0xe5,0xd7,0x89,0xd0,0xa6,0x5d,0x3a,0xa5,0x55,0x98,0x96,0x6d,0x7d, + 0x14,0xd6,0xbf,0xd3,0xfe,0x85,0x4,0xd3,0x37,0x91,0xc7,0x8d,0x8b,0x69,0x59,0x1c, + 0xc3,0xda,0xef,0x60,0xfb,0xde,0xd3,0xe6,0xbe,0x9a,0xc,0x9e,0x89,0xd,0xe1,0xbf, + 0x9e,0x6a,0x37,0xdd,0x3,0x43,0xe1,0x73,0x8a,0xa,0x86,0xef,0x5,0x84,0x70,0x6d, + 0x56,0x6,0x16,0xd5,0x73,0x39,0x5d,0xdf,0xb6,0x51,0x72,0xe2,0xcc,0xd9,0xd0,0x72, + 0xb5,0x97,0x82,0xe3,0x3a,0x30,0xcd,0xf4,0x52,0xf0,0xec,0xd8,0x2f,0x91,0x33,0xe7, + 0x1f,0x53,0xa,0x2,0x2a,0xcd,0x9b,0x6b,0x9c,0x81,0x32,0xc6,0x98,0x36,0x8c,0xeb, + 0x71,0xa,0xc4,0x7b,0xe,0x1d,0x61,0xe6,0x69,0x68,0xc5,0x5d,0x3d,0x7d,0x64,0x4b, + 0x4f,0x2f,0x5b,0xb3,0x8b,0x8d,0x3c,0x76,0xee,0xda,0x49,0x76,0xef,0xd9,0x4d,0x76, + 0xd0,0xff,0x11,0x7a,0x8f,0xe3,0x2,0xb1,0xe,0x1c,0x9e,0xcd,0xd8,0x46,0x12,0x1a, + 0x39,0x96,0xe2,0xa8,0x81,0x77,0x2c,0x18,0xc2,0xfb,0x4f,0x5,0xb6,0x4a,0xb0,0xc, + 0xeb,0x2f,0xd1,0x7c,0x2c,0xf5,0xa3,0x6e,0x6e,0x5d,0x63,0xca,0xf,0xb3,0x4a,0x68, + 0x34,0x61,0x71,0xb3,0x95,0x56,0xa,0xbe,0xc3,0xa3,0x63,0x81,0x65,0xb3,0x6,0x27, + 0x61,0x31,0x5c,0xf,0x6e,0x37,0x79,0xe6,0xec,0x69,0xd2,0xbd,0xa5,0xf3,0x9d,0xb5, + 0x6b,0xeb,0x2b,0x65,0xc,0x94,0xaf,0x55,0xf7,0xf2,0x73,0xf,0x0,0xeb,0xc2,0xfa, + 0xf5,0xeb,0x8d,0xef,0x45,0x60,0xae,0xac,0x28,0x9f,0xa8,0xac,0x2c,0x27,0x23,0xa3, + 0x23,0xcc,0x31,0x2,0x52,0x83,0x9,0xfc,0x2,0xc0,0x17,0xb8,0x8f,0x98,0xc9,0xcb, + 0x4c,0x47,0x63,0xfe,0x32,0x1,0xac,0x9,0x14,0x58,0xdd,0xa4,0xf7,0x91,0x7a,0x78, + 0xba,0x1e,0x50,0xae,0x9c,0xbb,0x55,0x6c,0x63,0x68,0x5b,0x8f,0x69,0x2,0x5b,0x1b, + 0x10,0xfa,0x5,0x24,0x27,0xb0,0x9a,0xb6,0xf7,0xb7,0xaf,0xb9,0xe1,0x28,0x7,0xd0, + 0x88,0x2f,0x8f,0xfd,0x69,0xff,0xa0,0x16,0x12,0x18,0x1d,0xfb,0x3f,0x12,0x2b,0x91, + 0x9,0xf4,0x94,0x79,0x9b,0x4c,0xff,0xd3,0x36,0x1,0x23,0x4a,0x96,0xac,0xe9,0xd9, + 0x5b,0xb5,0x50,0x16,0x7c,0x23,0xce,0x3d,0x76,0x9e,0xac,0x59,0xd7,0xc8,0x4e,0xe7, + 0x9,0x37,0x79,0xa,0x40,0xa0,0x4,0x53,0x11,0x44,0xc6,0xcd,0xef,0x82,0xd7,0xfd, + 0x52,0x1c,0x94,0x7b,0xfc,0xf4,0x19,0x36,0x86,0x51,0xa7,0xf3,0x17,0x2e,0x90,0x53, + 0x67,0xcf,0x91,0xd3,0xe7,0xce,0x93,0xf3,0x4f,0x5c,0x20,0x4f,0x3f,0xfb,0x2c,0x3, + 0x65,0x68,0xa3,0x47,0x8e,0x9f,0x8,0xd5,0x73,0xd0,0x30,0xf,0xad,0xd3,0x2c,0xb9, + 0x59,0x1b,0xe0,0x32,0x4a,0xb5,0x6e,0x78,0x4c,0xef,0xdc,0x7f,0x88,0x1,0xf2,0xc8, + 0x8e,0xdd,0x64,0x68,0x62,0xe6,0x5c,0x5c,0x6c,0x1b,0x89,0x0,0xed,0x1b,0x61,0x68, + 0x7c,0xbb,0x4,0xa6,0x12,0xc8,0xb,0x0,0x2c,0x6a,0xbd,0x2a,0xcb,0x40,0x58,0x3f, + 0x1b,0x40,0xd2,0xd3,0xf7,0x92,0x46,0x3c,0xe8,0xe9,0x7b,0xbd,0x65,0x20,0x5c,0x40, + 0x51,0x3b,0x76,0xf1,0xbc,0xb8,0xf3,0x15,0x8e,0x7b,0xc4,0xce,0x6f,0xdc,0xe9,0xca, + 0xe6,0x5f,0xc1,0x37,0xdc,0x80,0xd3,0xd6,0xd8,0xe8,0x30,0x59,0x5b,0xbf,0x66,0x9f, + 0x2b,0x26,0xda,0x42,0xe8,0xc7,0x33,0xc4,0xbf,0x18,0x54,0xcf,0x74,0xef,0x71,0xdd, + 0xd8,0xd8,0x70,0x77,0x5e,0x5e,0xee,0xeb,0x2b,0x57,0xae,0x60,0xe7,0xd9,0x62,0x83, + 0xe,0x98,0x85,0x5c,0x81,0xce,0xc5,0x54,0x68,0x2,0x52,0x13,0xb3,0x73,0x65,0x7c, + 0x72,0x1a,0x15,0xf8,0xca,0x4c,0x4b,0x8e,0xe7,0xb2,0xf9,0x84,0x78,0xd8,0x44,0xf8, + 0x69,0x4f,0xe6,0xb3,0x8d,0x55,0x9b,0x3b,0x4c,0x49,0x20,0xe7,0xca,0xd0,0x65,0x33, + 0xa6,0x2a,0x8d,0x6b,0xdf,0xd9,0xbe,0xa7,0xf8,0x2c,0x92,0x29,0x6,0x97,0x34,0x91, + 0x4e,0x5d,0xe8,0xac,0x2b,0xaa,0xb6,0xab,0xbe,0xb9,0x56,0x78,0xbb,0xe9,0x6,0xb4, + 0x9e,0xbe,0x89,0xa4,0x8d,0xd3,0x91,0x9,0x1c,0x7e,0xfa,0xce,0xa3,0x69,0xdb,0xf2, + 0xf2,0x69,0x91,0x72,0xb5,0x2a,0xb8,0xd4,0x15,0x4e,0x59,0xd8,0x31,0x6c,0x35,0x5, + 0xe1,0xfe,0x30,0xf0,0xc,0x37,0x67,0xf6,0xcb,0xc,0x5f,0x1b,0xd4,0x80,0x2b,0x3, + 0xf6,0xc,0x0,0x7,0x56,0x2a,0x0,0xec,0xba,0x7,0x87,0xd8,0xae,0x5d,0xf8,0x7, + 0x8,0xbe,0xf8,0xc5,0x2f,0x32,0x93,0xf0,0x63,0x17,0x2e,0x32,0x8d,0x59,0xa9,0xc1, + 0xc9,0xf3,0x98,0x61,0x26,0xf3,0x31,0x25,0x20,0x1,0x90,0xbd,0x9b,0x8e,0xcc,0x98, + 0xb1,0x45,0x80,0x9d,0xc9,0x53,0xf,0xf0,0x36,0xf3,0xb2,0xa9,0x3e,0x4a,0x13,0xf3, + 0x88,0x49,0xa8,0x9,0x77,0xc0,0xea,0xd7,0x9a,0xa1,0xcd,0xfd,0xe1,0x5,0xdf,0x9, + 0xd2,0xd1,0xd3,0xcf,0xb4,0x7e,0x98,0xde,0xf9,0xe6,0x3a,0x26,0x61,0x90,0xd3,0x21, + 0x56,0x99,0x5c,0xb9,0x7a,0x85,0xec,0xdf,0xbf,0x97,0x34,0x36,0xac,0x7d,0xad,0xa1, + 0xa1,0xe1,0x1e,0x1b,0x26,0xda,0x70,0x93,0x87,0xd0,0xaf,0xa9,0xa9,0x29,0x14,0xc4, + 0x8,0xfc,0x5e,0xf5,0x5e,0xbc,0xe7,0xff,0x28,0x78,0xf9,0xf2,0xe5,0xe9,0xb9,0x39, + 0x59,0x3f,0x6b,0x6f,0x6f,0x23,0x47,0x1e,0x3d,0xc2,0x76,0xea,0x11,0xcd,0xc7,0xf2, + 0xc0,0x51,0x32,0xea,0x9b,0x5e,0xc6,0x37,0xe9,0x83,0xc1,0xcb,0x4c,0x5e,0x66,0xa0, + 0x22,0xb0,0xba,0xd4,0xc5,0x4,0xe4,0x2e,0xcc,0xde,0xc5,0xbb,0x53,0x37,0x7,0x11, + 0xe6,0x24,0xe5,0x73,0x9,0x97,0x11,0x64,0x35,0xda,0xa8,0xa,0x70,0x54,0x66,0x7e, + 0x55,0x3a,0x5d,0x9f,0xcc,0x16,0xb8,0x8d,0x20,0x69,0xf9,0x4e,0x26,0x70,0xe3,0xed, + 0x31,0xa,0x68,0xd3,0x6a,0x1a,0x9b,0xf4,0x9,0x6e,0xb6,0x3e,0x8a,0xba,0x36,0xef, + 0x19,0x3f,0x8a,0xb6,0x4d,0x9b,0xb5,0x50,0x3f,0xdf,0x21,0xe2,0x6f,0x1e,0x14,0x64, + 0x54,0x2,0x4b,0x24,0xc2,0xba,0x48,0xe7,0x0,0xe1,0xed,0x3b,0x77,0x32,0xcf,0x68, + 0xe,0x2,0xfd,0x12,0x90,0xe,0x68,0xef,0xc7,0x1c,0x80,0xd8,0x9b,0x86,0x39,0x5d, + 0x5,0xaf,0x1,0xb4,0x5c,0x3,0xc6,0x89,0x5c,0x7b,0xe,0x1c,0x22,0xa3,0x54,0x1b, + 0x1d,0xdb,0xb9,0x9b,0x8c,0xef,0xda,0xcb,0xde,0x71,0xd3,0xe6,0xfe,0xc3,0x8f,0x30, + 0xc0,0xb6,0x6a,0xdc,0x92,0x19,0x3a,0xcc,0x2c,0x1d,0x16,0x46,0x3d,0x9a,0x6d,0x48, + 0xbb,0x1d,0x51,0x81,0x95,0xf7,0xdd,0xc,0x58,0x8e,0x79,0x35,0xdf,0x61,0x45,0x1e, + 0xaa,0xb9,0x71,0x8b,0xc0,0x12,0xfa,0x16,0x8a,0xb8,0xe1,0xdf,0x6a,0x4c,0x39,0x67, + 0xcf,0x85,0xc,0xdd,0x74,0xc0,0x60,0xc8,0xeb,0x79,0x3b,0xe9,0xec,0x1d,0x20,0xeb, + 0x5b,0xda,0xc8,0xe5,0xab,0x81,0x53,0xc4,0x3c,0x63,0x73,0xfa,0x86,0x76,0xee,0x97, + 0x2f,0x39,0xc2,0x9a,0xeb,0x4d,0x1b,0xda,0xfe,0xba,0xbe,0x7e,0x4d,0x8a,0x8c,0x8d, + 0x72,0x50,0x3d,0x57,0x61,0x67,0x18,0x0,0x37,0x36,0x36,0x7a,0x80,0x56,0x17,0x4c, + 0xf1,0x38,0x8,0xd7,0x54,0x57,0xb5,0x17,0x15,0xe6,0xbf,0xdb,0xdb,0xdb,0x43,0x4e, + 0x9d,0x39,0xcd,0x76,0x64,0x8a,0x4,0x3c,0xcd,0xc,0xce,0x4d,0xbb,0xe2,0xcc,0x32, + 0x12,0x2d,0xce,0xc4,0x54,0xe5,0x7c,0x23,0xca,0xdb,0xe0,0x15,0xae,0x72,0x6a,0xb1, + 0x79,0x9,0x9b,0xb4,0x37,0x1d,0x20,0xe8,0x84,0x9,0xd7,0xb6,0xb8,0x32,0x4a,0x97, + 0xef,0xe9,0x2,0xe2,0x93,0x37,0x6f,0xf8,0x10,0xe4,0xd4,0x73,0x97,0x21,0x21,0xcf, + 0x61,0xba,0xc1,0xd4,0x6f,0xc6,0x74,0x3e,0x2c,0x2d,0xd1,0xea,0x63,0x3f,0xe5,0x1a, + 0x69,0xdb,0x52,0x47,0xe5,0x37,0x98,0x8e,0x4c,0x40,0x98,0x6d,0x7b,0x74,0x74,0xcf, + 0x77,0xa9,0xc3,0x1e,0xe1,0xd8,0xf1,0x48,0xa9,0xad,0x59,0xb4,0x31,0xef,0x12,0x17, + 0xf5,0x7c,0xa5,0xa,0xc4,0x39,0x0,0x73,0x1,0x1a,0x40,0x2b,0xb6,0x83,0x9b,0x3f, + 0x4f,0x9f,0x7f,0x8c,0x6d,0x83,0x28,0x83,0x89,0x1e,0x5c,0xc6,0xac,0xda,0x6f,0x38, + 0xc8,0x8e,0x2a,0x1,0x57,0xf6,0x66,0x56,0x3,0xa8,0xda,0x71,0x4d,0xf5,0x5e,0x67, + 0x1e,0x16,0xb5,0x58,0x9d,0xa7,0x72,0xbf,0x52,0x18,0x1a,0xd7,0xf6,0x87,0x6a,0xdd, + 0xb5,0x98,0x97,0xa8,0xbd,0x77,0xf5,0xd,0xb2,0x8d,0x5a,0x30,0x2d,0x11,0xd2,0x7c, + 0x1d,0xa6,0xc2,0xb0,0xaf,0x2,0xe6,0x7d,0x4f,0x53,0xfc,0xea,0xed,0xd9,0xf2,0xee, + 0x9a,0xd5,0xab,0x36,0x44,0x8a,0x8b,0xba,0x10,0xfa,0x89,0x89,0xf9,0x35,0xfe,0xe5, + 0x6b,0x97,0x67,0x3c,0x9f,0xe2,0xa2,0xc2,0xd3,0x55,0x95,0x15,0x64,0x64,0x74,0x98, + 0x9c,0xa7,0x8d,0x87,0x2a,0x3f,0x33,0x1f,0x6b,0x1e,0x80,0x2a,0x4d,0xd3,0xab,0xc5, + 0xa8,0xc1,0x5a,0xd6,0x6e,0x4d,0x0,0x20,0x6b,0xd9,0x26,0x46,0x6a,0xd3,0x7c,0x6d, + 0x60,0x27,0xbe,0x8f,0xd6,0x9c,0xa6,0x58,0x9e,0x4d,0xf3,0xe5,0x75,0xa,0x13,0x20, + 0x34,0xfd,0xe5,0x57,0xa8,0x30,0x69,0x31,0xca,0x7b,0x8b,0xa5,0x42,0xf9,0x3e,0x2, + 0x30,0x33,0x6a,0xc2,0x37,0xa6,0xac,0x9a,0xa9,0xee,0xbb,0xbb,0xf6,0x95,0x8d,0x16, + 0x75,0x6d,0xd6,0x99,0xad,0xc3,0xe2,0xdf,0x74,0xd3,0x3c,0x4d,0x60,0xef,0x67,0x9a, + 0xc1,0x6f,0xde,0x93,0x8e,0x75,0xb5,0xf5,0xbd,0xed,0xdb,0x8a,0xf4,0x21,0xd2,0x9, + 0x0,0x10,0x8e,0x59,0xd8,0xe9,0xa8,0xb1,0xb5,0x5d,0x60,0xda,0x7a,0xed,0xb7,0x5f, + 0xd4,0x68,0x19,0xe3,0xf,0x8f,0xdf,0x2f,0x1,0x83,0xac,0xad,0x89,0x1a,0x30,0xea, + 0x76,0xe9,0xea,0x55,0xf2,0xe4,0x95,0xab,0xec,0xff,0xca,0xd3,0x4f,0xb3,0x53,0xa8, + 0xd0,0xef,0x30,0x4f,0x9f,0x3c,0x7b,0x8e,0x99,0xa0,0x4d,0xa0,0x1b,0xd0,0x8,0x47, + 0xd5,0xde,0xdc,0x2e,0xa0,0xac,0xd3,0x94,0x47,0xcc,0x71,0xb4,0x8e,0x61,0x2a,0xe7, + 0x2a,0x45,0x7d,0xc2,0x4,0xb,0x43,0x5d,0xd1,0xdf,0xfa,0x36,0x8c,0x4b,0x79,0xc9, + 0xdf,0x71,0x6,0xb4,0x3,0xdf,0x2d,0x90,0x6e,0x4b,0xff,0x36,0x52,0xdf,0xd0,0xc4, + 0x94,0x40,0x38,0xc0,0xb9,0xf2,0x30,0xbe,0xd5,0xe4,0xe3,0x4f,0x3c,0x4e,0x46,0x46, + 0x86,0xc8,0xea,0x55,0x2b,0xcf,0x34,0x34,0x34,0x28,0x41,0x57,0x15,0x6c,0xef,0x79, + 0xf0,0x0,0xb0,0x2a,0xa0,0x50,0x4,0xdd,0x33,0xd5,0x35,0xaf,0x68,0x7d,0x7d,0xfd, + 0x7d,0x79,0xb9,0xd9,0xb7,0x96,0x2f,0xab,0x63,0x8b,0xbb,0x71,0xc6,0xa2,0xe8,0x94, + 0xa5,0x63,0xba,0x3a,0x30,0x50,0x32,0xbf,0x9b,0x32,0xe3,0xba,0x61,0x4d,0x6b,0x3, + 0x55,0xa5,0x66,0x7b,0x73,0xca,0x38,0x37,0x67,0xaa,0xbb,0xab,0x40,0xa0,0x3,0x5, + 0x9d,0xa6,0x62,0x13,0x40,0x4c,0x26,0x79,0xbf,0x66,0x78,0x97,0x7e,0x35,0xbd,0x57, + 0xe5,0x65,0x12,0x70,0x5c,0x4c,0xb7,0x9e,0x36,0xdc,0x34,0xe7,0xe1,0x62,0xfa,0x35, + 0xbd,0x77,0xa1,0x4b,0x97,0x3c,0x6d,0x74,0x61,0x34,0xff,0x3b,0xa,0x8b,0x36,0x80, + 0xd6,0x99,0xe4,0x75,0xc2,0x92,0x2b,0x18,0x5a,0x2d,0x30,0x16,0x81,0xc5,0xcf,0xf7, + 0x99,0x74,0x18,0x37,0x3c,0xf0,0x35,0xc2,0xdd,0xbd,0xbd,0xa4,0xa1,0xb9,0xcd,0x3, + 0xc2,0x22,0x80,0xaa,0x0,0x40,0x5,0x20,0x33,0xeb,0x78,0xc7,0xb4,0x1a,0x30,0x4c, + 0xca,0x27,0x4e,0x9f,0x25,0xd3,0x2f,0x4d,0x33,0x4d,0xa,0x73,0xc0,0x0,0xe5,0xde, + 0xad,0x23,0x2c,0x20,0xdd,0x85,0x4b,0x97,0x59,0xdd,0x0,0xc2,0x30,0x4d,0x8b,0xf3, + 0xb6,0x2e,0x80,0x15,0x78,0x3f,0xaa,0x4,0xc0,0x40,0x1d,0x47,0xbd,0x79,0x8e,0x78, + 0xdb,0x33,0x38,0xa2,0x3,0xc2,0x51,0xbb,0x86,0x6d,0x31,0xcf,0xf7,0xf3,0xbe,0xf2, + 0xd4,0x67,0x66,0xae,0x9d,0xb,0x37,0xfd,0x6,0xad,0x57,0xd6,0x90,0xfb,0x65,0x73, + 0xff,0xd0,0xa8,0xb6,0x8e,0xf0,0x7e,0xc7,0xd6,0xa4,0x4d,0xad,0x6d,0x6c,0x45,0xe, + 0xdf,0x43,0x5d,0xcd,0x3b,0xc2,0xbd,0xe9,0xe1,0x74,0x85,0xdd,0xc0,0x76,0xed,0xda, + 0x41,0xd6,0xd6,0xaf,0xfe,0x72,0x7d,0xfd,0x9a,0xf,0x89,0xf8,0x27,0xfe,0xcb,0xb8, + 0x28,0x3e,0x97,0xe3,0xc8,0xcf,0x42,0x3f,0x9e,0x70,0xdd,0xba,0x75,0x9e,0x8c,0x22, + 0x9,0x3c,0xf,0x80,0xf0,0xb2,0x65,0xcb,0x12,0x72,0x73,0xb2,0x7e,0x8c,0xf5,0xc1, + 0xd8,0xc7,0xf4,0xaa,0xe0,0x94,0x65,0xd2,0x2c,0xe4,0xe,0xe2,0xd7,0xd7,0x25,0xa6, + 0x6b,0x63,0x52,0xb6,0x79,0x60,0x9b,0x46,0x62,0x73,0xce,0xb2,0x6a,0x6d,0x86,0xb6, + 0x19,0x19,0xf2,0x4d,0x37,0x73,0xbc,0x9f,0xf6,0xa8,0xcb,0xb9,0xa1,0x14,0x3c,0x22, + 0xd,0x53,0x8e,0xe9,0x6d,0xa6,0x5b,0x65,0x9e,0x37,0xdd,0x84,0x1a,0x13,0xd,0xd8, + 0xb4,0x51,0xab,0xc0,0x72,0x53,0xaf,0x99,0xab,0xeb,0x3c,0x23,0x51,0xab,0xc1,0x6f, + 0xca,0x6a,0x66,0x77,0x69,0x8f,0x2c,0x8c,0xaa,0xac,0x45,0x4e,0x20,0x79,0xd3,0x6e, + 0x31,0xb0,0x7e,0xef,0x9b,0x53,0xee,0xc2,0xa4,0x83,0xb6,0x6d,0xb5,0x4c,0xdc,0x9c, + 0xd2,0xa,0xa7,0x8c,0x67,0x4c,0x4d,0x86,0xe,0x3e,0x19,0x1a,0x19,0x21,0xd,0x2d, + 0x6d,0x61,0xa6,0x65,0x9d,0x26,0x2b,0x7a,0x19,0xcb,0xd7,0xa6,0x0,0xb0,0x65,0x0, + 0x8c,0x39,0x60,0xca,0xef,0x46,0x77,0x4,0x9c,0xb0,0x7a,0x6,0x87,0x49,0xcf,0xd6, + 0x40,0x38,0xfb,0xf8,0x13,0xa1,0xe9,0xa5,0x5d,0xfb,0xe,0x84,0xd6,0x4,0xf7,0xcb, + 0x9a,0xb8,0x1,0x88,0x59,0x5d,0x46,0xbc,0xda,0x61,0xff,0xf0,0xa8,0xb6,0xfe,0x33, + 0x26,0xe9,0x99,0xf6,0xd8,0xe7,0x92,0x23,0xb,0x3a,0x90,0x14,0x5,0x9d,0x7e,0x9d, + 0xe5,0x41,0x16,0x4,0x44,0x8f,0x6f,0x7,0xad,0x1f,0x66,0x67,0x1c,0x55,0x89,0x9d, + 0x19,0x45,0xf0,0x75,0x51,0xee,0xb0,0xd9,0xc6,0xe5,0x2b,0x97,0xc9,0xc1,0x83,0xfb, + 0xc9,0xfa,0xa6,0x86,0x9f,0xac,0x5e,0xb5,0x6a,0x81,0xc,0xb0,0x7e,0x70,0xd0,0x14, + 0x42,0x3f,0x44,0xe6,0x9,0xf8,0xb5,0x98,0x81,0xe9,0x5a,0x8e,0x2f,0xde,0x3,0x84, + 0x6b,0x17,0x2e,0x5c,0x44,0x41,0xf8,0x97,0x6d,0x6d,0xad,0x6c,0xd7,0x16,0x2c,0x66, + 0xe6,0xc,0xc9,0x85,0x59,0xf3,0xf9,0x13,0x3f,0xc,0xde,0x68,0xde,0xbc,0x69,0x7, + 0x10,0x3f,0xe5,0xa8,0xcc,0xba,0xae,0x1a,0xbe,0x4e,0x8b,0xf3,0x15,0x2c,0xf9,0xbb, + 0xd4,0x45,0xfe,0x1e,0x36,0xe7,0x2c,0xd7,0x76,0xc9,0x9a,0x95,0x4b,0x1b,0x4d,0x82, + 0x98,0x4d,0xc8,0x72,0xd5,0xf6,0x5d,0x84,0xa8,0x68,0x9,0x1b,0x26,0x10,0x17,0x85, + 0x4a,0xbf,0x26,0x6b,0x3f,0x16,0x1e,0x93,0xd9,0x76,0x56,0x63,0xc9,0xa1,0xf,0x6d, + 0x5e,0xe5,0x1e,0x3a,0xb4,0x8,0xb1,0xa6,0xa9,0x24,0xdb,0x37,0xc2,0xfc,0x1f,0x9b, + 0x13,0x9e,0x98,0x20,0x6b,0x29,0x73,0xe,0xcd,0x4f,0x2a,0xc0,0x57,0x4,0x0,0x15, + 0x60,0x84,0x34,0xba,0xa0,0x89,0x5a,0x8e,0x2b,0x9a,0xa0,0xd1,0xa6,0x27,0x9e,0xbc, + 0xc4,0x0,0xf7,0x1c,0xc2,0x13,0x17,0x98,0x19,0x3a,0x50,0xa7,0x97,0xc8,0xef,0x7e, + 0xe6,0x33,0xcc,0x4b,0xb7,0x4f,0x4,0x51,0x6,0x9a,0xe1,0xe0,0x29,0x3,0x90,0xab, + 0x40,0x60,0x9c,0xf3,0xb6,0x2,0xa9,0xa2,0x7f,0x86,0xc2,0x5,0x4,0x4f,0x3f,0x89, + 0x96,0x5,0x4f,0x3d,0xc7,0x3d,0x56,0x4,0x55,0x7f,0x8a,0xef,0xfa,0x5,0x20,0x97, + 0x77,0x10,0x53,0x39,0xc0,0x1,0x7c,0xe1,0x70,0xb5,0xae,0xa9,0x99,0x9c,0x3a,0x7d, + 0x3a,0x34,0x5,0xe0,0x11,0x80,0xd,0xab,0x12,0x30,0x4d,0xa,0x25,0xf1,0x91,0x23, + 0x87,0x49,0x7b,0x5b,0xf3,0x2f,0x57,0xae,0x58,0xbe,0x50,0xc4,0x3c,0x13,0xd6,0x45, + 0xf2,0xdc,0x3,0xc0,0x6b,0xd7,0xae,0xd,0xbd,0x10,0xaf,0xf9,0x3d,0x7f,0x26,0x5f, + 0xeb,0xe2,0x88,0x5,0x57,0x55,0x56,0xb4,0x15,0xe4,0xe7,0xfe,0x4b,0x47,0xc7,0x66, + 0xf2,0xe8,0xb1,0xa3,0x6c,0x72,0x3b,0x12,0xd0,0xb9,0x7e,0x63,0xd2,0xa,0xd2,0x91, + 0x0,0x9c,0x1f,0xcd,0x4d,0xab,0x3d,0x5a,0xea,0x6c,0x8c,0x67,0xd0,0x44,0x65,0xc6, + 0xa5,0x6b,0xab,0x89,0x29,0x5e,0x9f,0x85,0x56,0xeb,0x57,0xe0,0xb1,0x6a,0xb2,0x36, + 0xad,0xee,0xa6,0x1b,0x98,0xba,0x9a,0xff,0x6d,0x96,0x6,0x9b,0xa7,0xb7,0xc9,0xbc, + 0xed,0x22,0x34,0x46,0x54,0x2f,0x8b,0x75,0xc5,0xf8,0xad,0xa7,0x26,0xa3,0x2a,0x44, + 0x88,0x1a,0x7c,0x24,0xf3,0xf7,0x91,0xb4,0xd9,0x45,0xe0,0x9b,0xb2,0x58,0x6f,0xc2, + 0xc0,0x3d,0xb8,0x97,0x3a,0xe6,0x84,0xe1,0x1d,0xbd,0x7a,0x5d,0x53,0x48,0x83,0x94, + 0x41,0x57,0x6,0x38,0x11,0x60,0x3c,0x0,0xe1,0x1,0x4a,0xaf,0x17,0x34,0x36,0xe2, + 0x90,0x8f,0xb9,0xe4,0xff,0xa8,0x1b,0x2c,0x81,0x17,0x2f,0x5f,0x66,0xe6,0x67,0xc4, + 0x1f,0x50,0x80,0x98,0xf7,0x7e,0xcc,0xa3,0x89,0xcb,0x2,0x81,0x1f,0x27,0x2e,0xd3, + 0x7b,0x66,0xba,0x1e,0xd6,0x83,0xa9,0x2e,0x1f,0x55,0x9d,0xc2,0x4,0x8,0xb1,0x1f, + 0x15,0xa0,0xae,0xd7,0x9e,0xd5,0xe,0x59,0x62,0x7e,0x0,0x5f,0x2c,0x35,0x6a,0x6a, + 0x69,0x25,0x67,0xce,0x9d,0xf5,0xac,0xf3,0x75,0x19,0x7f,0x38,0xd0,0x6,0xe7,0x7d, + 0x1f,0x3b,0x7e,0x94,0x74,0x6c,0xde,0xf0,0xcf,0xcb,0x96,0xd6,0x75,0xa8,0x70,0x50, + 0x5,0xae,0xba,0xc0,0x31,0x51,0xc6,0x45,0xfe,0x2c,0xf4,0x13,0x23,0xda,0x42,0x7d, + 0x7d,0xbd,0xaf,0xf8,0xac,0x40,0x1a,0x4a,0x4a,0x8a,0xf7,0x94,0x14,0x17,0x92,0xde, + 0xbe,0x5e,0x66,0x97,0xc7,0xa6,0xd6,0x36,0x50,0x11,0x7,0x8f,0x4a,0x13,0x9e,0x9a, + 0xa5,0xc9,0xd4,0x17,0xf8,0x7,0xcb,0xbf,0xae,0x60,0xb0,0xaa,0x7b,0x91,0x31,0x38, + 0x9,0x8,0x72,0x39,0x1a,0x46,0xaa,0x63,0x88,0xae,0x1a,0xaf,0x4d,0xfb,0xf0,0xab, + 0x61,0x47,0xd2,0x87,0x3a,0x81,0xc2,0xd9,0x9,0xcf,0x40,0x1b,0x22,0xb0,0x5e,0x8f, + 0x96,0xf6,0x6a,0x3,0x49,0x87,0xb9,0x48,0x3f,0x40,0x68,0x15,0xea,0x24,0xaf,0xda, + 0x68,0x4d,0xf,0xd8,0x34,0x4a,0x17,0x8d,0x5e,0xd7,0x3f,0xa6,0x7e,0xf4,0xdb,0xe, + 0x57,0x21,0x4f,0x55,0x1e,0x0,0x11,0x7b,0xa9,0x1f,0x38,0x74,0x88,0xad,0x13,0xee, + 0x1e,0xd8,0xe6,0xd5,0x62,0x15,0x60,0x2c,0x6a,0xb8,0x61,0x20,0x28,0xed,0xf3,0xcc, + 0x9f,0x8d,0x6c,0xdf,0x49,0x76,0x1f,0x38,0x44,0x76,0xed,0x3b,0x18,0x8,0xfb,0x83, + 0x61,0xdf,0x1,0x32,0xb1,0x7b,0x2f,0x19,0xdd,0xbe,0x2b,0xb0,0x57,0x74,0x70,0x9, + 0x92,0x4a,0xd3,0x9d,0xc9,0x37,0xbc,0x5e,0x3a,0x10,0xed,0x37,0x0,0xb2,0x68,0x9e, + 0x56,0xa,0x1b,0xb2,0xe9,0x5b,0xd9,0x7,0xa3,0x61,0x20,0xab,0xba,0x9e,0xe9,0xaf, + 0x31,0xbd,0x36,0xaf,0x2,0x69,0x45,0x9e,0xfd,0x8a,0x7a,0xca,0x66,0x67,0x9c,0xef, + 0x8b,0x2d,0x35,0xe1,0x6b,0x4,0xcb,0x82,0x55,0xe0,0x17,0xa6,0x2b,0xe0,0x9b,0x84, + 0xf5,0xc1,0x27,0x4f,0x9d,0x20,0xdd,0xdd,0x9d,0x64,0xf9,0xb2,0xa5,0xa3,0x7e,0x71, + 0x2e,0x92,0x10,0xfa,0x89,0x85,0xc9,0xd7,0x2e,0xc1,0x16,0x97,0xbd,0x5f,0x53,0x7f, + 0x47,0x61,0x41,0xfe,0xd9,0x8a,0xf2,0x52,0x32,0x30,0x38,0xc0,0xec,0xf3,0xf0,0x34, + 0xf3,0xad,0x1d,0xfa,0xd4,0x3a,0xfc,0x68,0xc9,0x7e,0x80,0xd2,0x25,0xf,0x55,0x7e, + 0xd1,0x28,0x43,0x6,0x9f,0xeb,0x1a,0xf0,0xd6,0x81,0xeb,0x94,0x67,0x5e,0x7d,0xd2, + 0x6a,0x61,0x90,0x81,0xee,0x7a,0x94,0xda,0x22,0xf7,0x95,0x4e,0x90,0x31,0x95,0x63, + 0x66,0xfc,0x91,0x97,0xfd,0xff,0x53,0x88,0xa4,0x6e,0x91,0x98,0xd5,0x6f,0x57,0x1d, + 0x6d,0xeb,0xf4,0x5d,0xbc,0xf3,0x23,0x6d,0xfb,0x94,0x16,0x84,0xbf,0x42,0x4e,0x9d, + 0x39,0x43,0x56,0xad,0x6d,0x20,0x1d,0xbd,0x3,0xc1,0x33,0x7b,0xcd,0xe0,0xa0,0x4, + 0x23,0x41,0xb,0x96,0x1,0x1c,0xe0,0xda,0xcb,0x3,0x73,0xc0,0x1a,0x66,0xcf,0x78, + 0x90,0xcd,0xad,0x6a,0xcd,0x57,0xd,0xf4,0x5e,0xed,0x5c,0xfd,0x2e,0x1c,0x38,0x47, + 0x8d,0x66,0x6c,0x25,0xf8,0x29,0xb5,0x58,0x3,0x68,0x2a,0x80,0x52,0x9,0xbc,0x22, + 0x40,0xcb,0xd6,0x4,0x83,0xc9,0x3d,0xcc,0x83,0x9d,0x82,0x6f,0x73,0xfb,0xa6,0xc0, + 0x26,0x1b,0xcf,0x3d,0x1b,0x32,0x3b,0xbb,0xd2,0x9,0x34,0x5f,0xac,0xf5,0xc5,0x3e, + 0xda,0xfd,0xfd,0x3d,0x64,0xd9,0xd2,0x25,0x97,0x57,0xaf,0x5e,0x7d,0xa7,0xb,0xc6, + 0xb9,0x3e,0xd3,0x85,0xd0,0x6f,0xcd,0x9a,0x35,0xec,0x81,0xfc,0xcf,0x3,0xee,0x79, + 0x30,0x3d,0x17,0xff,0xc5,0xb8,0xec,0x9a,0x56,0x6c,0xd5,0xca,0x95,0xf7,0xe5,0x64, + 0x67,0x4e,0x56,0x55,0x96,0x93,0xad,0x5b,0x7,0x43,0x6b,0x84,0x5d,0x81,0xc6,0x75, + 0xd0,0xcb,0x60,0xa1,0x2,0x26,0x1b,0x50,0x2a,0xe3,0xdd,0x98,0xd4,0x6a,0xaa,0x2e, + 0x75,0x73,0x2d,0xc7,0xe5,0x99,0xa,0x38,0x3d,0xed,0xb6,0xd4,0xcf,0xd6,0x1f,0x7e, + 0x40,0x29,0x20,0x4,0x84,0x97,0xeb,0x57,0x28,0x52,0xd5,0x7,0xf9,0x9a,0xe6,0xae, + 0xa3,0x21,0x8,0x19,0xcd,0xc9,0x11,0x5a,0x2e,0xfc,0x68,0xd1,0xfa,0x34,0xb7,0xf, + 0x1c,0xbd,0x56,0x1a,0xff,0x1a,0xaf,0x5f,0x6d,0xdd,0x4f,0xbf,0x8b,0x1a,0xfe,0xf5, + 0x1b,0xd1,0x13,0x50,0xe4,0xb2,0x71,0x16,0x2c,0x34,0xa6,0x86,0xa6,0x66,0xd2,0xb6, + 0xb9,0xcb,0xbb,0xbd,0xa3,0x4,0x36,0x5a,0x20,0x54,0x68,0xc8,0x5e,0x60,0x1c,0x53, + 0x9c,0x84,0x34,0x16,0xf6,0x7c,0xc0,0x64,0xba,0x35,0x81,0xb0,0xc2,0xec,0xab,0xf4, + 0xdc,0x16,0xb4,0x60,0x65,0x9b,0x34,0xc2,0x87,0xc9,0x9,0x2d,0xac,0x6d,0x3a,0xe1, + 0x40,0xe3,0x88,0x25,0x3,0xb7,0xae,0xef,0xc2,0xeb,0x15,0xf4,0x36,0xa7,0xd7,0x58, + 0x5e,0xd6,0xdb,0xdf,0xcf,0x3c,0x97,0x45,0xf0,0x35,0x4d,0x3,0x89,0x6b,0x7d,0x3, + 0xe0,0x7b,0x9a,0xc,0xe,0xf6,0x53,0xf0,0xad,0x7b,0x6e,0xe5,0xca,0x95,0x77,0xcb, + 0xf8,0xa6,0x3,0x50,0x1d,0xde,0x99,0x82,0x18,0xcf,0x3,0xc0,0x3c,0x50,0xf4,0xf7, + 0xdc,0x47,0x33,0x0,0x84,0x57,0xac,0x58,0x7e,0x3f,0x5,0xe1,0xeb,0x38,0xbe,0x70, + 0xdb,0xd0,0x36,0x66,0xaf,0x47,0xe7,0xf9,0x61,0xa4,0x3a,0xed,0xc5,0x5,0x74,0x4c, + 0x8c,0xd3,0xf,0xd3,0xf6,0x3,0x52,0xb2,0xe6,0xe8,0x22,0x5c,0x98,0xe6,0x93,0xaf, + 0x5b,0xb4,0x46,0x2b,0x78,0x4f,0xb9,0x1,0xb6,0xae,0xef,0x75,0x6d,0x8f,0xd4,0xa, + 0x21,0xb6,0xcb,0x6,0xe0,0x91,0xb6,0x39,0x9a,0x5a,0x26,0xb7,0x3a,0xa8,0xac,0x2, + 0x11,0x5b,0x0,0x6e,0x4c,0x46,0x65,0xae,0xde,0x45,0x8b,0xf4,0x23,0x34,0xba,0xe4, + 0x1d,0x69,0xbd,0x23,0x1a,0xaf,0x11,0x82,0xbd,0x2e,0x3e,0x76,0xcc,0x82,0x9,0x12, + 0x1a,0x14,0x3c,0xa4,0x65,0x70,0xd0,0x83,0x8c,0x23,0xf8,0x58,0x2,0x5f,0xb6,0x64, + 0x4,0x79,0x87,0xd0,0xe7,0x52,0x27,0xa5,0xd0,0x10,0xe,0x96,0x76,0xe0,0x1d,0x35, + 0x6b,0xce,0x61,0xcf,0xc6,0x1c,0xfb,0x48,0xd5,0xf7,0xb2,0x96,0x1c,0x70,0xe6,0xc2, + 0x32,0xa3,0x75,0xeb,0x5b,0xc8,0xee,0xbd,0x7b,0xd9,0xf1,0x8b,0x98,0x5f,0xf7,0xf3, + 0xed,0x99,0xd9,0x99,0x6a,0xcc,0xa7,0xcf,0x6,0xc0,0x77,0xc9,0xe2,0xda,0x37,0x56, + 0xac,0x58,0x71,0xbf,0x8c,0x59,0xb7,0x13,0xf,0x43,0x3f,0x5e,0x88,0xe9,0x9f,0x7, + 0xf9,0xde,0xf6,0x4c,0x6c,0x8,0x2,0x90,0x7f,0xf9,0xf2,0x65,0x1f,0xcb,0xce,0x4c, + 0xff,0x7a,0xed,0xc2,0x6a,0x32,0x3c,0x32,0x4c,0x25,0x90,0x33,0x1e,0x4d,0xd8,0x6, + 0x86,0x26,0x26,0x1d,0x62,0x8e,0x26,0x93,0xac,0x2,0x40,0x44,0x53,0xae,0x4a,0xb3, + 0x33,0x81,0x80,0x9c,0x9f,0xae,0xfe,0x72,0x19,0x26,0x20,0x74,0x5,0x7c,0x25,0xe8, + 0xdc,0xb0,0xb7,0xd7,0x8f,0x26,0x6a,0xeb,0x7f,0x9b,0x60,0x64,0xd3,0x48,0x4d,0x82, + 0x41,0xa4,0xc2,0x8a,0xec,0x94,0x14,0x89,0x96,0x1c,0x89,0xc5,0xc0,0x8f,0x70,0xe0, + 0xc7,0xea,0x73,0xdd,0x67,0x3a,0x3f,0xfd,0x3d,0x5b,0x61,0xd5,0x6a,0x85,0xb2,0xc4, + 0xf,0xfb,0xfe,0x9a,0x69,0x11,0xdd,0xfc,0xff,0x6c,0x5,0x6f,0xac,0x13,0xc6,0x79, + 0xba,0xf0,0x90,0x5e,0xd3,0xd0,0x14,0x9c,0x17,0x1e,0xd3,0x3,0xc5,0xb0,0xfa,0xac, + 0xdf,0x3e,0x2d,0x40,0xab,0x35,0xbc,0x3e,0x1d,0xe8,0x2a,0xb4,0xef,0x7e,0xc3,0x7c, + 0xb3,0x19,0x48,0xf5,0x1a,0x7d,0x9f,0x15,0xd0,0xcd,0xc2,0x4,0xdf,0xc3,0xda,0xa, + 0xae,0x1a,0x10,0x57,0x9,0x1e,0x7d,0x52,0x7f,0x89,0x71,0x2,0xcb,0xa6,0x26,0x48, + 0x7b,0xc7,0x16,0xe6,0x6c,0x75,0xe2,0xe4,0xc9,0x90,0xa3,0x9b,0x4e,0x48,0x56,0x8d, + 0x81,0x90,0xd9,0x99,0x82,0xef,0xb6,0x6d,0x3,0xa4,0x6e,0xc9,0xa2,0x37,0x97,0x2e, + 0x5d,0xfa,0x3b,0x6b,0x24,0xab,0xae,0xa,0xd7,0x54,0x98,0xe6,0x27,0x88,0xe9,0x3c, + 0x0,0xcc,0xc3,0xaa,0x55,0xab,0xac,0x99,0x20,0xe,0x8f,0xc7,0xaf,0x55,0xe9,0xc4, + 0x38,0xe2,0x33,0x54,0xa2,0xae,0x6e,0xc9,0x9c,0xcc,0x8c,0xb4,0xb7,0x17,0xd6,0x54, + 0x31,0x4d,0xf8,0xd4,0xe9,0x53,0xcc,0x31,0xcb,0xa8,0xa5,0xdd,0x98,0xd4,0x82,0x96, + 0x17,0xe4,0x26,0x8d,0x20,0x69,0xd3,0x0,0xc5,0x0,0x6f,0x45,0xd3,0x5c,0xab,0xe, + 0x8c,0xc2,0x81,0x77,0x52,0x5b,0xc6,0x4c,0xfe,0x93,0x56,0x86,0xaa,0x15,0x1e,0x1c, + 0x98,0x91,0xb1,0xde,0x3e,0xf2,0x36,0x69,0x25,0xbc,0xcf,0x5c,0x18,0xb8,0xfc,0x5d, + 0x6d,0xa0,0xe1,0xe2,0xfc,0xe6,0x7,0x54,0xb5,0xdf,0xdf,0xd1,0x2,0xa2,0xd6,0x64, + 0xfd,0x6b,0xd8,0xba,0x69,0xe,0xd3,0xb4,0x43,0xa4,0xc2,0x49,0x28,0x8e,0xe8,0x7, + 0x60,0xe8,0x47,0x9b,0x60,0x68,0xa2,0x57,0x97,0x6f,0xe8,0xa,0xf6,0x36,0x2b,0x97, + 0x49,0x60,0x13,0xc7,0x9e,0x2a,0xf,0xd0,0x2b,0xcc,0x97,0x30,0x49,0x9f,0x3e,0x7b, + 0x96,0xed,0x9e,0x4,0x26,0x3f,0x18,0x5c,0xa6,0xa4,0x5a,0x16,0xe4,0x5f,0x4b,0x1d, + 0x13,0x80,0x6b,0x44,0x1,0x3a,0x6a,0x0,0xef,0x73,0xc8,0x4f,0x9,0xd8,0x22,0x78, + 0xcd,0x4a,0xab,0x36,0xb4,0xc3,0xc9,0x32,0x30,0xa6,0x5,0x64,0x5b,0x3f,0xca,0xeb, + 0x9d,0x31,0x97,0xbe,0xbe,0x6d,0x23,0xd9,0xdc,0xd9,0xc5,0xe,0xfa,0x51,0x99,0x9c, + 0x6d,0x63,0x11,0xe0,0x8b,0xa5,0xb0,0xc0,0x1b,0x68,0xbe,0x75,0x8b,0x6b,0xdf,0x5a, + 0x5a,0x57,0x37,0x47,0x85,0x6f,0x32,0x6e,0xa9,0x70,0x4d,0x7e,0x2e,0x63,0x9e,0xe, + 0x3,0x3d,0x0,0x2c,0x16,0x28,0x86,0x95,0x2b,0x57,0x6a,0xdf,0x45,0x1a,0x9f,0xc7, + 0x59,0xbd,0x7a,0xcd,0x1d,0x8b,0x17,0x2f,0x5a,0x90,0x91,0x96,0xf2,0xad,0xea,0xaa, + 0x72,0xda,0x19,0x3,0xe4,0xe4,0xa9,0x93,0x6c,0x89,0x92,0xcd,0xf4,0xa9,0x64,0x98, + 0x37,0x74,0xe,0x48,0x5e,0xe0,0xbc,0x6e,0xd0,0xb8,0xac,0xa0,0xa5,0x1,0x4f,0x17, + 0x33,0xb5,0x53,0xd0,0xd4,0xd1,0x24,0x3c,0xf8,0xd1,0x98,0x75,0xe9,0x6d,0x65,0x4c, + 0x3a,0xb6,0xdb,0x96,0xb7,0xc9,0x7a,0x10,0xa9,0x66,0xaa,0x5b,0x6a,0x65,0xdb,0x44, + 0xc5,0x65,0xad,0xb3,0xd1,0xa1,0xc9,0x71,0x61,0xff,0x94,0x8f,0x75,0xda,0xda,0x74, + 0x51,0xf0,0x74,0x56,0xed,0x61,0x2e,0x3b,0x41,0xa9,0x1c,0x98,0x7c,0x6d,0x8a,0xe1, + 0x58,0x47,0x5f,0xbb,0xc9,0x39,0x6c,0x61,0x6a,0x15,0xa8,0x1c,0xad,0x4b,0xb8,0xc6, + 0x71,0x86,0x98,0x12,0xdb,0xb0,0xb9,0x83,0x99,0x38,0x45,0x2f,0x65,0xe,0x28,0x7d, + 0x8e,0xa0,0xd6,0xa7,0x2,0xc3,0xb0,0x67,0xfa,0x79,0xe5,0x3e,0x85,0xc6,0x29,0x3, + 0x78,0x9f,0x2b,0x98,0x6e,0xd3,0x5d,0x8f,0xf8,0x4a,0xab,0x4a,0xe3,0x71,0x2a,0x33, + 0xd4,0xdf,0xaa,0x65,0x6b,0x4c,0xff,0x3,0xc1,0xf5,0xbd,0xd8,0x5c,0x63,0xe7,0xee, + 0xdd,0xc,0x44,0xa1,0xf9,0x9a,0x78,0xa2,0x8a,0xe,0xf8,0x52,0xa3,0x13,0x27,0x4f, + 0x90,0xbe,0xbe,0x1e,0xb2,0xa8,0xb6,0xe6,0x2d,0x28,0x82,0x0,0x43,0xbf,0x58,0x17, + 0x8d,0x10,0xfa,0xa1,0x70,0x39,0x88,0x60,0xa9,0x7b,0x37,0xdb,0x80,0x86,0x2f,0x59, + 0xbc,0x78,0x4e,0x66,0x7a,0xea,0xd7,0x2a,0x2b,0x4a,0x49,0x5f,0x7f,0x2f,0x39,0x76, + 0xfc,0x18,0xb3,0xcd,0xcb,0x5a,0x94,0x4a,0x9a,0x35,0x83,0x99,0x21,0x8e,0x83,0x76, + 0xe9,0x7,0x98,0xae,0x4d,0x5d,0xf,0xd5,0xd7,0x45,0x1b,0xbd,0x6e,0xd1,0x82,0xad, + 0x0,0xed,0xf2,0xee,0x86,0xdd,0x3c,0x6c,0xd3,0xfe,0x4d,0xed,0x77,0xd1,0xce,0xad, + 0x1a,0xf5,0xd,0x3b,0xd8,0x8b,0xf7,0xe8,0x63,0x38,0x4e,0x60,0xfe,0x6,0x83,0x9, + 0xbb,0xd6,0xe0,0x6c,0x4f,0x5b,0x0,0x43,0xe5,0x71,0x3d,0x69,0xe8,0x73,0x39,0xae, + 0xf8,0xfe,0x5,0xc5,0xfb,0xb0,0xf8,0x72,0x9e,0x9a,0xfc,0xf8,0x3f,0xcf,0x33,0xf4, + 0xfc,0xc5,0x17,0xb5,0xe5,0xab,0xe2,0x9b,0xea,0x31,0xab,0xf7,0x42,0xfe,0xaa,0xb2, + 0x94,0xe5,0x7f,0x5e,0x2e,0xe3,0x45,0xe3,0x37,0x90,0xe3,0xbb,0x4,0xe4,0xa9,0x2a, + 0x5b,0xec,0x17,0x4,0xd0,0x3,0xe8,0x42,0xe6,0x1b,0x53,0x92,0xa6,0x6f,0xa3,0x6b, + 0xa4,0x87,0x49,0x1a,0xeb,0x85,0xf7,0x1f,0x3c,0xc8,0xce,0x15,0xde,0xd8,0xd5,0x63, + 0x5e,0x22,0xc4,0x81,0x19,0x40,0x24,0x1,0x4c,0x9f,0x1,0x90,0x65,0x40,0xd,0xbf, + 0xd6,0x3f,0xb3,0xcd,0x1,0x8b,0x42,0x43,0x9f,0x1,0x0,0xfb,0x2c,0xef,0xb5,0xc2, + 0xc1,0x36,0xb1,0x2e,0xc1,0x79,0x6c,0xcb,0xdc,0x79,0x78,0xdd,0x67,0x80,0x5a,0xee, + 0x3b,0x71,0x97,0x2f,0x78,0x39,0xb7,0x6d,0xdc,0x44,0x1e,0x7b,0xe2,0x71,0x76,0xc4, + 0x23,0x3f,0xe0,0xc2,0xc5,0x2f,0x85,0xbf,0x7,0x8d,0x40,0x6b,0xc6,0x3a,0xdf,0x9e, + 0x9e,0x2d,0x64,0x61,0x75,0xd5,0xef,0x2d,0x59,0xb2,0x78,0x8e,0xa8,0x18,0x9a,0x82, + 0x1c,0xc7,0x96,0x4e,0x85,0x9f,0xf2,0x75,0xe8,0xb7,0x62,0xc5,0x8a,0xd0,0xb,0x5c, + 0xf3,0xc0,0xef,0xc5,0xe7,0x62,0x3c,0xdd,0xbf,0x29,0x3f,0x39,0x3d,0x2a,0x52,0xb7, + 0x64,0xc9,0xef,0x50,0x4d,0xf8,0xab,0x65,0x25,0x45,0x64,0x4b,0x77,0x17,0x3b,0xc6, + 0x10,0x92,0xa,0x98,0xad,0xab,0x16,0xe8,0x7,0x4c,0x22,0xd2,0x4e,0x35,0xa6,0xe9, + 0x48,0x35,0xdd,0x48,0x5,0x0,0x1b,0x60,0xfb,0xcd,0xc7,0x63,0x62,0xf7,0x29,0x80, + 0xf8,0xd1,0x98,0xfd,0x7e,0x47,0x51,0x6a,0x7d,0xfe,0x85,0x17,0xd8,0x9c,0xd,0xb6, + 0x88,0x7b,0xfc,0xc2,0x13,0xe4,0xdc,0xf9,0x73,0xcc,0x84,0x74,0xfc,0xe4,0x71,0x26, + 0xb0,0x89,0xe1,0xe8,0xb1,0xa3,0x81,0x40,0x7,0x1a,0xbb,0xf,0xfe,0x8b,0xef,0x3c, + 0xf7,0xc7,0x67,0x9e,0x85,0xee,0x8f,0x1f,0xf5,0xe6,0xa5,0xc8,0xd3,0xfb,0xdc,0x90, + 0xff,0x31,0x45,0xfe,0xc1,0x34,0x62,0xfa,0xa3,0x8a,0xfa,0xab,0xf2,0xe2,0xd7,0x61, + 0x6d,0xb,0xfd,0x1f,0xd5,0xc6,0xf5,0xe4,0x2d,0xa4,0x9,0xcb,0x5f,0xca,0x43,0xd5, + 0x9e,0xb0,0x7e,0xd5,0x94,0xa5,0x6a,0xd3,0x51,0xc3,0xb3,0xb0,0x7e,0xf2,0xd4,0xeb, + 0x98,0x37,0x2d,0x9e,0x9f,0x38,0xce,0x34,0x1a,0xac,0xa8,0x38,0x4b,0xe9,0xe2,0xc2, + 0x93,0x17,0x19,0xa3,0x85,0x25,0xd,0x4c,0x57,0x4,0x64,0x57,0x6b,0x10,0xdf,0x2e, + 0x17,0x26,0x69,0x4c,0x8b,0x6d,0xec,0xe8,0x60,0xc7,0x1a,0xce,0x6c,0x98,0xe1,0x5, + 0x46,0x93,0x16,0x19,0xb6,0xec,0x48,0xa5,0xd1,0x3a,0x68,0xa2,0x7d,0x9a,0xff,0xb0, + 0xba,0x18,0xb4,0x6d,0xf,0x90,0x4b,0x79,0xa9,0x84,0x80,0xf0,0x7f,0xbb,0xe6,0xdc, + 0xa7,0x10,0x1c,0x94,0xa6,0x75,0x19,0x70,0x25,0xf0,0x46,0x3f,0x63,0x63,0x8d,0x86, + 0xe6,0x56,0x76,0x98,0x6,0x84,0xad,0xe9,0x57,0x5e,0x32,0x4e,0x99,0xa9,0xfe,0xaf, + 0xd1,0x0,0x61,0xed,0xd2,0x95,0x4b,0xe4,0x91,0x23,0x8f,0x90,0x8e,0xcd,0x1b,0x49, + 0x55,0x65,0xf9,0xd7,0x16,0x2f,0x5e,0xfc,0x69,0x60,0x8f,0x9,0xc7,0x5c,0x70,0x4f, + 0xc6,0x38,0xd3,0x7b,0xf9,0xde,0x3,0xc0,0x7e,0xc3,0xf2,0xe5,0xcb,0x59,0x88,0x24, + 0xad,0x9c,0xf,0x2a,0x55,0x57,0x57,0xf7,0x31,0xaa,0x9,0x5f,0x2f,0xcc,0xcf,0x21, + 0x1b,0x37,0x6e,0x20,0x7,0xf,0x1d,0x64,0xe7,0x37,0x82,0x1,0x9b,0xe6,0x2a,0x4d, + 0x40,0xc1,0xe7,0x77,0x66,0xb,0x2e,0xae,0xa0,0xa5,0xab,0xa7,0x6d,0x6e,0xd9,0x3c, + 0x3f,0x1a,0x3d,0x40,0xb5,0xce,0x9d,0x5b,0xe6,0x7f,0xfd,0xa,0x42,0xb6,0x7b,0x5d, + 0xb9,0x10,0xbc,0x30,0x68,0x20,0x84,0xe1,0x44,0x92,0x63,0x27,0x8e,0xb1,0xbd,0xc4, + 0xc7,0x27,0xc6,0xc8,0xd6,0xad,0x3,0x64,0xcb,0x96,0x4e,0x4a,0x23,0xed,0xa4,0xb5, + 0x65,0x3d,0x69,0x5e,0xdf,0x40,0x9a,0x1a,0xd7,0x91,0xa6,0xa6,0x75,0xec,0x7f,0x7d, + 0x53,0x3,0xbb,0x66,0xff,0xc1,0xe7,0xb8,0xe,0xdd,0xf3,0xd0,0x24,0xfd,0x7,0x43, + 0x63,0xc3,0x5a,0x6f,0x1c,0x21,0x34,0x36,0xae,0x55,0xc6,0xe5,0x65,0x86,0xe5,0xd1, + 0x24,0x97,0xb3,0x96,0xe5,0x21,0xe6,0x13,0x4a,0x2b,0xd4,0x8f,0xc5,0x69,0xf0,0x96, + 0x25,0x7,0xbc,0xf7,0x1b,0x47,0x75,0x2f,0xf6,0x91,0x1c,0x47,0xac,0xa7,0xaa,0x3c, + 0x53,0xf9,0x8d,0x86,0xf7,0x2c,0xdf,0x26,0x75,0x5d,0x3d,0xe5,0x37,0xac,0x55,0xd6, + 0xc1,0xd3,0x7f,0xeb,0x1b,0x19,0x1d,0x6c,0xda,0xb4,0x81,0x74,0x75,0x75,0xb0,0xa9, + 0xac,0x89,0xed,0x13,0x8c,0x7f,0x60,0xc3,0x1f,0x6c,0xaa,0x8f,0x33,0xc9,0xa1,0x1d, + 0xbb,0xac,0xa6,0xe0,0xe3,0x7,0xff,0x5c,0x1b,0x7e,0xe3,0xcb,0x6f,0x90,0x3,0x87, + 0x2,0xda,0x70,0xeb,0xc6,0xe,0xed,0x7a,0x61,0x3f,0x66,0x5d,0x9d,0x96,0xdb,0x27, + 0x82,0x76,0x48,0xd3,0x1c,0x71,0x2a,0x47,0xb,0xca,0x2a,0x40,0x56,0x80,0xb0,0xd1, + 0xec,0x6c,0x2c,0x47,0xad,0xc9,0xab,0x4c,0xd5,0x36,0x4d,0x1b,0xfd,0xda,0x33,0x38, + 0x44,0x9a,0x5a,0xdb,0x49,0x67,0x77,0x37,0x79,0xe2,0xe2,0x5,0xa6,0xf5,0xca,0xfb, + 0x1,0xb8,0xf0,0x30,0x7c,0xbf,0xe7,0x5f,0x78,0x9e,0x5c,0xa0,0x79,0x1c,0x3c,0x74, + 0x80,0xd1,0x49,0x59,0x49,0xf1,0x2b,0x8b,0x17,0x2d,0xfa,0x6d,0x15,0x70,0xaa,0xb0, + 0x49,0xfc,0x37,0xc5,0xb1,0xc5,0x53,0x85,0xd0,0x4f,0x2c,0x48,0xbe,0x96,0x81,0x56, + 0x2e,0x44,0x8e,0xa7,0x4a,0x67,0x8b,0xc3,0xe3,0x2d,0xad,0xab,0xfb,0x48,0x56,0x66, + 0xfa,0x33,0x39,0x59,0x19,0xa4,0xb9,0xb9,0x89,0xec,0xd9,0xb7,0x87,0x7d,0x0,0x48, + 0x3f,0x91,0x6a,0xa8,0x7e,0xe3,0xb3,0xff,0x1b,0xb3,0x7,0x63,0x3f,0xe6,0x5a,0x55, + 0x5e,0x4e,0xf5,0xbf,0xe1,0x4d,0xab,0x3,0x4e,0xd7,0xbe,0x88,0x96,0xe5,0x40,0x94, + 0x3e,0xfd,0xf4,0x1d,0xee,0x1,0xbc,0x57,0xa8,0xe0,0x85,0xb5,0x79,0xfb,0xf7,0xef, + 0x23,0xdb,0xb6,0xd,0xb2,0x81,0xb3,0xac,0x6e,0x31,0x29,0x2b,0x2e,0x20,0x79,0xd9, + 0xe9,0x24,0x3d,0x39,0x9e,0xa4,0x24,0x2c,0x20,0x49,0x71,0xf3,0x48,0xe2,0x82,0x87, + 0xc2,0x43,0xec,0x5c,0xf5,0xbf,0x2a,0x8e,0x14,0x12,0x62,0xe6,0xa8,0xf3,0xe4,0xef, + 0x35,0xd7,0x89,0x86,0xe7,0x9,0x86,0xfc,0xe4,0xfa,0x78,0xf2,0x8f,0x9,0xdc,0x87, + 0xfe,0x85,0x6b,0x5e,0x57,0xfe,0x8c,0xa7,0x4d,0xd0,0xd4,0xc7,0xf3,0x3c,0xd6,0xdb, + 0xd6,0xb0,0xfa,0xc6,0x48,0xef,0x63,0xbc,0xfd,0xe3,0xb9,0xb7,0x94,0x29,0xd7,0x2f, + 0xf4,0x8e,0xd7,0xdd,0x93,0xc7,0x5c,0x12,0x1f,0xcc,0x3f,0x5e,0xfa,0xe,0x9,0x8a, + 0x7c,0x11,0x1f,0x1,0x74,0x90,0x4c,0xe9,0x21,0x3d,0x25,0x81,0xe4,0x66,0x67,0x90, + 0x8a,0xb2,0x62,0xb2,0x62,0x79,0x1d,0x69,0x6f,0x6f,0xa5,0xf4,0xb3,0x95,0x81,0x31, + 0xac,0x26,0x98,0xda,0xfa,0xa2,0xc1,0xaa,0xa6,0xa3,0x51,0x30,0x7f,0xec,0x9e,0x5, + 0xc1,0x70,0xeb,0xd0,0x30,0xdb,0xbc,0x63,0x73,0x77,0x5f,0xc8,0x44,0x2a,0x6b,0x88, + 0x2e,0x80,0x29,0x82,0xac,0xa,0x30,0xe5,0xf9,0x61,0xf9,0x9d,0xac,0x59,0xf7,0x19, + 0x0,0x57,0xd4,0xb4,0xb5,0x60,0x2f,0xe5,0x25,0x83,0x68,0x9f,0xd4,0x4e,0x95,0x46, + 0xad,0x33,0x5b,0x9b,0x34,0xe7,0x50,0x1f,0xb0,0xe5,0x58,0xa3,0xa4,0x75,0x53,0x27, + 0x69,0xa4,0x5a,0x2f,0x76,0x2a,0xbb,0x36,0x79,0x2d,0xcc,0xd1,0xca,0x95,0xff,0x40, + 0xe0,0x82,0xe0,0x85,0xa3,0x70,0xf7,0xec,0xdd,0x4d,0xd6,0xad,0x5d,0x4d,0x4a,0x4b, + 0x8a,0xaf,0x2e,0x59,0xb2,0xe4,0xc3,0xae,0x98,0xa4,0xc2,0x3a,0x39,0xad,0x4a,0x21, + 0x75,0x79,0x87,0xe0,0x1,0x60,0x39,0x2c,0x5b,0xb6,0xcc,0x73,0xcd,0xef,0xf9,0xb5, + 0x1c,0x54,0xe9,0xc5,0x34,0xa6,0x32,0xf8,0x3f,0x2a,0x88,0xeb,0xfc,0xbc,0x9c,0x3, + 0x19,0x69,0x29,0xef,0xae,0x5e,0xbd,0x92,0x6a,0x3d,0xe3,0xe4,0xf4,0xd9,0x33,0xcc, + 0x14,0xa4,0x3,0x12,0x2e,0xad,0xba,0x2,0x6,0xe6,0x6c,0x55,0x80,0xe7,0x7,0xb4, + 0xfd,0xc6,0x57,0x2,0xbd,0x4b,0xfc,0x29,0xa9,0x8e,0x53,0x8e,0x65,0xfa,0x14,0x20, + 0xe4,0xf6,0xa0,0x1c,0x71,0x5e,0xcc,0xa5,0x1f,0x5c,0x1c,0xb0,0x74,0xa0,0xc,0x4b, + 0x7,0x18,0x24,0x18,0xe5,0xfe,0x3,0xfb,0x48,0x6f,0xef,0x16,0xb2,0x62,0xd9,0x12, + 0x52,0x90,0x9b,0x49,0x19,0xec,0x7c,0x12,0x37,0xef,0x41,0x12,0x3f,0x7f,0xe,0x49, + 0x5a,0x30,0xe7,0x9d,0xb4,0x84,0x98,0x9f,0x66,0x24,0xc7,0xfd,0x51,0x4e,0x46,0xf2, + 0x57,0xf2,0xb2,0xd2,0x5e,0xa6,0xe1,0x6,0x42,0x7e,0x76,0xfa,0xa4,0xe2,0x7f,0x9a, + 0x86,0x9b,0x79,0x59,0xe9,0x88,0x73,0x3d,0x70,0xcd,0x2,0xee,0x27,0x3d,0xf7,0xc1, + 0x74,0xc1,0xe7,0xa1,0xf4,0xb9,0x99,0xa1,0xf8,0x9e,0xf4,0xc1,0xf7,0x37,0x73,0x33, + 0x53,0x6f,0xe6,0x4a,0xf7,0x3c,0x9f,0xdc,0x40,0xdc,0x69,0xb1,0x3c,0x1e,0x9f,0xbf, + 0x67,0x21,0x33,0xed,0x6,0xd,0xd7,0x73,0x85,0xf2,0xd9,0xfb,0x40,0x5e,0x33,0xf1, + 0x3,0xf7,0xc1,0xfc,0xd2,0x27,0x15,0xed,0x11,0xff,0x43,0xf5,0xa5,0xe9,0xc2,0xdb, + 0x3b,0x73,0x3f,0xed,0x49,0x47,0xdb,0x11,0x2c,0xef,0x7a,0xa8,0xfc,0x4c,0xa9,0x3e, + 0xc1,0xfc,0x58,0x5b,0x32,0x3d,0xf9,0x4d,0xf3,0xf7,0x68,0x4f,0x9e,0x14,0x3f,0x98, + 0x97,0x94,0x3e,0xd0,0x1f,0xf4,0x7f,0x72,0xa6,0x9d,0xe1,0xe5,0xe5,0x6,0x9e,0x7, + 0xfb,0x2b,0x95,0x7e,0x97,0xd4,0x57,0x72,0xd2,0x93,0xbf,0x92,0x99,0x12,0xff,0xed, + 0xd4,0x84,0x98,0xff,0x92,0x14,0xfb,0xd0,0xaf,0x40,0x27,0xb1,0x73,0xe7,0x90,0x5, + 0x73,0x1f,0xa4,0xa0,0x1c,0x4b,0x8a,0xb,0xf3,0xc8,0xaa,0x95,0xcb,0x49,0x5f,0x5f, + 0x2f,0x39,0x70,0xf0,0x0,0x13,0xe8,0xb1,0xe4,0x51,0x9e,0xf7,0x75,0x19,0x1b,0x38, + 0xd0,0xe1,0x6b,0x6f,0x7e,0x9d,0x99,0xb8,0x37,0x75,0x74,0xb2,0xfd,0xa4,0xe1,0x1c, + 0x24,0x9b,0xa5,0xc3,0xc1,0x75,0x2c,0x1c,0x70,0x54,0xf1,0x45,0xc0,0xb,0xce,0x11, + 0x87,0x99,0x81,0xd,0x4e,0x50,0x62,0xde,0x66,0xd3,0xb7,0x2e,0xbd,0x7a,0xce,0x59, + 0x27,0x2c,0xa8,0x4c,0xd5,0xe2,0x7c,0x6e,0x9f,0xca,0xf4,0xed,0x49,0x17,0x4,0x5e, + 0x7a,0x8d,0xad,0x24,0x61,0x6e,0x1e,0x1e,0x1d,0x65,0xc0,0xc9,0xb7,0x93,0xc,0xe7, + 0x87,0x76,0xc1,0x1f,0x53,0xf,0xf0,0x74,0x86,0x10,0x3f,0x36,0x36,0x42,0x56,0xae, + 0x58,0xfa,0x6e,0x59,0x69,0xf1,0xc1,0xba,0xba,0xba,0xbb,0x54,0xd8,0x66,0xc3,0x2e, + 0x39,0x8e,0x2e,0x8d,0xe,0xc4,0x75,0x18,0x19,0xfa,0xe9,0x40,0x55,0xc,0x4b,0x97, + 0x2e,0x75,0x7a,0x36,0xdb,0xc0,0x2b,0x57,0x54,0x90,0xdf,0x9b,0x9a,0x94,0xf0,0xce, + 0xa2,0xda,0x1a,0x66,0x56,0xc2,0x1c,0x10,0x3a,0x15,0x52,0xa8,0xe,0x4,0x64,0x60, + 0xb5,0x69,0x94,0xae,0x80,0x6e,0x8b,0x67,0x3,0x53,0x53,0x5e,0xd7,0x5c,0xc1,0x31, + 0x2,0x61,0xc0,0x19,0xac,0xd,0xf9,0xe9,0x9c,0xcb,0x54,0x7d,0xe0,0x2a,0xd0,0xc8, + 0xcf,0x61,0xe1,0xc0,0x29,0x24,0xc7,0x4f,0x1c,0x63,0x7,0x60,0xaf,0x59,0xb5,0x9c, + 0xe4,0x64,0xa4,0x50,0xc0,0x7d,0x90,0x2,0xee,0x43,0xff,0x98,0x95,0x9a,0xf0,0x76, + 0x49,0x61,0xde,0xce,0x9a,0xea,0xca,0x9a,0xc5,0x8b,0x17,0xcd,0xa3,0x74,0x77,0x9f, + 0x6a,0x80,0xb8,0xd0,0x95,0x1c,0x4f,0x25,0xc,0x9a,0xe2,0xeb,0xca,0x35,0xe5,0xef, + 0x12,0xcf,0x25,0x3f,0x55,0x5e,0xaa,0x7f,0x57,0xa6,0xe2,0xc2,0x58,0x54,0x79,0xdb, + 0xfa,0x4f,0x55,0xf,0x5b,0xde,0x3a,0xa1,0x5f,0xd5,0x27,0xe1,0xef,0x96,0x83,0x17, + 0xdd,0xbb,0x78,0xd1,0xa2,0x7,0x6b,0xaa,0xab,0xca,0x4b,0x8b,0xa,0x26,0xb2,0xd3, + 0x93,0xbf,0x4a,0x1,0xf9,0x7f,0x3,0x88,0xe3,0xa9,0x96,0x5c,0x98,0x97,0x43,0xb5, + 0xa0,0x35,0x64,0x74,0x74,0x84,0x6d,0x83,0xb,0x26,0x2f,0xf3,0x12,0x9b,0x96,0xc5, + 0x69,0xfa,0xb5,0x37,0x5e,0x67,0x1b,0x78,0x60,0x2b,0x4b,0xac,0x47,0xc5,0xfc,0x30, + 0x36,0x86,0xd0,0xcd,0xf,0x87,0x83,0xab,0x9b,0x56,0xdb,0x1f,0x66,0x8e,0xf6,0x2, + 0xad,0x3c,0xdf,0x2a,0x82,0xb6,0x7,0x38,0xb7,0x8d,0x6a,0xc1,0x59,0xa5,0xd,0x9b, + 0xca,0xd,0x3,0x5a,0xc3,0x7c,0xb3,0x4e,0x83,0x16,0xe7,0x7d,0xe1,0xe0,0x6,0xe0, + 0xdd,0x36,0x3c,0x42,0xae,0x3e,0xfd,0x94,0xe7,0xb0,0xa,0x17,0x45,0x47,0x5e,0xfe, + 0x18,0x98,0xef,0xbd,0x4c,0x1e,0x3d,0xfa,0x28,0xf3,0x74,0xae,0xa9,0xaa,0xf8,0x35, + 0xd5,0x7c,0xbb,0x81,0x55,0x9c,0x76,0x44,0xdc,0xba,0x1d,0x18,0xe6,0x1a,0x42,0x3f, + 0x55,0x85,0x4c,0x95,0x94,0xe3,0xe0,0x5f,0x17,0x6c,0xef,0x55,0xf1,0xf8,0xc0,0x2a, + 0x2f,0x2b,0xad,0x4d,0x49,0x8a,0xff,0x49,0x69,0x49,0x11,0xe9,0xec,0xdc,0xcc,0x4c, + 0x49,0xd8,0x3a,0xe,0x12,0x8e,0xac,0x55,0xc9,0xa0,0x61,0x4,0x15,0xb,0x8,0x5f, + 0x13,0x3c,0x9b,0x5d,0xc0,0x58,0x2e,0xd7,0x55,0x0,0xd0,0x69,0xe1,0x2e,0xc2,0x82, + 0xdc,0xde,0xd9,0x6a,0xe4,0x2e,0xe5,0x99,0xb4,0x78,0x6d,0x3f,0x1a,0xac,0x13,0x60, + 0x80,0xb0,0x6c,0xc0,0x71,0xe6,0xf0,0x23,0xf,0x93,0x9e,0xee,0x2e,0x52,0x59,0x5e, + 0xcc,0x4c,0x8d,0x49,0xb1,0x73,0xff,0xae,0x28,0x2f,0xfb,0xd8,0xa2,0xda,0x85,0x29, + 0x32,0x53,0xf7,0x43,0x57,0xb6,0xb8,0x62,0x9e,0xaa,0xe7,0xa6,0x77,0xba,0x72,0x5c, + 0xde,0xeb,0xc6,0x9c,0x2e,0x9e,0x6e,0xcc,0xd9,0xda,0x66,0x8b,0xa7,0x6b,0x67,0x24, + 0xfd,0x6b,0xfa,0x3e,0xa6,0xba,0xa8,0xf8,0x8c,0xef,0x6f,0x29,0x2,0x72,0x90,0x56, + 0x6a,0x17,0x2e,0x4c,0x2b,0xcc,0xcb,0x3e,0x97,0x1c,0x37,0xef,0xef,0x3,0x1a,0xf1, + 0x2,0xb2,0xa8,0xb6,0x9a,0xf4,0xf6,0xf6,0xb0,0xa3,0x51,0xb9,0x8f,0x89,0x6d,0x3c, + 0xa8,0xc6,0x28,0xe8,0x17,0x20,0xc,0x6f,0xe9,0x13,0x14,0xd0,0x9b,0xdb,0xda,0x49, + 0x7d,0x53,0x73,0x50,0x23,0x1e,0xf,0x9a,0x54,0x47,0x94,0xda,0xa5,0x6e,0x6e,0x54, + 0x9,0xbc,0x61,0x40,0xa8,0x1,0x4a,0x4d,0xe8,0xd7,0x1,0xa8,0x31,0xff,0xf0,0xb9, + 0x5d,0x97,0x7c,0x75,0x1e,0xde,0x62,0xfe,0xfd,0xec,0xb4,0xa8,0x91,0x10,0xf0,0xf6, + 0xf4,0xf5,0x93,0x8b,0x97,0x9e,0xc,0x9d,0xdb,0xeb,0x62,0x25,0x54,0x3d,0x87,0xc9, + 0x19,0x8e,0x77,0x70,0xd2,0x3c,0x70,0x70,0x3f,0xd9,0xb8,0xa1,0x8d,0x94,0x16,0x17, + 0xfe,0x59,0x59,0x59,0xe9,0x22,0x9d,0xf2,0xe8,0x3a,0xd6,0x4d,0xd7,0x36,0xda,0x95, + 0x9f,0x89,0xd7,0xa1,0x1f,0x55,0xcd,0x59,0xe0,0x2f,0xf8,0xbd,0xee,0x99,0xf8,0x5c, + 0xf5,0x8e,0xbf,0xb7,0xfd,0xeb,0xca,0xe2,0xcf,0x31,0x90,0x6a,0xaa,0xab,0x13,0x52, + 0x93,0x13,0xdf,0xc8,0xc9,0x4a,0x67,0x8e,0x1d,0xdb,0x77,0x6c,0x67,0xdb,0x57,0x3e, + 0xf7,0x99,0xcf,0x4,0x24,0x58,0x1f,0xa6,0x56,0x1d,0x48,0xab,0x80,0x33,0x92,0x39, + 0x64,0xaf,0xc6,0x7a,0x5d,0xab,0x4d,0xbb,0xe6,0xaf,0x8a,0xa7,0xcb,0x4b,0x17,0x4f, + 0x8e,0xa3,0x6c,0xb7,0x2a,0x5f,0x7,0xed,0x96,0xb,0x29,0x26,0xab,0x81,0x8e,0xa1, + 0xe1,0xec,0x4d,0x78,0x36,0xc3,0xe4,0xbc,0x67,0xcf,0x2e,0xd2,0xda,0xd2,0x44,0xf2, + 0xb2,0xd3,0x48,0x2,0xd5,0x7a,0xf3,0xb2,0xd3,0x5f,0xa4,0xc0,0x9b,0x28,0x13,0xaf, + 0x8a,0x7e,0x74,0x74,0x28,0x3f,0x17,0xdf,0x9b,0x9e,0xeb,0x68,0xdf,0x4,0x40,0xba, + 0xb8,0xa6,0xf2,0x74,0x75,0xb0,0x8d,0x2f,0x5b,0xbd,0x5d,0x41,0xd3,0x35,0x8d,0xad, + 0xcf,0x55,0xf5,0x30,0xb5,0xcd,0xa5,0x9f,0x4c,0xf9,0x98,0xbe,0x89,0xaa,0x9c,0x0, + 0x10,0xd7,0x24,0xe7,0xe7,0x64,0xbe,0x88,0x79,0xe7,0xd8,0xf9,0x73,0x48,0x49,0x51, + 0x3e,0x69,0x6f,0x6b,0x25,0xbb,0xf7,0xec,0x66,0x4b,0x5b,0x60,0x92,0x8e,0x64,0xbc, + 0xf3,0x55,0x1a,0x0,0x62,0x68,0xc5,0x27,0x4e,0x9d,0x22,0x2d,0x14,0x88,0xb1,0x9b, + 0xd6,0xa6,0x2d,0xbd,0x21,0x67,0x2d,0x35,0xd0,0xa9,0x80,0xcc,0xe,0xa8,0xa6,0xb8, + 0x2a,0x93,0xb2,0x9,0x84,0x7d,0x81,0xb3,0xc1,0x84,0xde,0x6f,0x30,0x35,0x8b,0xbb, + 0x7d,0xc1,0x8b,0x1c,0x7b,0x6e,0x37,0x6,0x4d,0xcd,0x10,0x80,0xf8,0x11,0x8d,0xae, + 0xc2,0xbf,0xea,0x3b,0x40,0x21,0x83,0xc3,0x26,0x56,0x46,0x6c,0xdf,0x3e,0x4e,0xea, + 0x57,0xaf,0x24,0x85,0x5,0x79,0xb7,0xaa,0xab,0xab,0xe7,0x9b,0xc6,0xaa,0x8d,0x86, + 0x75,0x18,0x68,0xa3,0x79,0x13,0x9d,0x8a,0xf7,0x61,0x0,0x3c,0x9b,0xb0,0x64,0xc9, + 0x12,0xe3,0xbd,0xf8,0x5c,0xf7,0x4e,0x95,0xe,0x92,0xed,0xe2,0xc5,0x8b,0x3f,0x98, + 0x9d,0x95,0x71,0x9a,0x6a,0xc3,0xef,0x2e,0x5e,0xb4,0x90,0xf4,0xf,0xf4,0xb1,0xa5, + 0x4a,0x98,0x8b,0x11,0x25,0x58,0x1d,0x90,0xda,0xb4,0xe3,0xeb,0x1a,0xd,0xfa,0x9a, + 0xa0,0x2d,0xab,0xf2,0xb1,0x4a,0xcb,0x53,0xd7,0xc3,0xb4,0x6d,0x5d,0x9d,0x4c,0xf9, + 0x2b,0xeb,0xe6,0x0,0x76,0xd7,0x7c,0x80,0xb9,0xab,0xe6,0x6b,0x2,0x7d,0x71,0x4d, + 0xb4,0x6e,0xb9,0x16,0xf3,0x70,0xa6,0xc,0xef,0xd2,0xe5,0x4b,0x6c,0x5a,0x61,0x74, + 0x64,0x88,0xcd,0xf5,0xa6,0x25,0xc6,0x12,0xaa,0xa9,0xfc,0x92,0x4a,0xad,0x43,0xf4, + 0xbb,0xbf,0x6f,0xe9,0xd2,0x65,0x51,0xa1,0x4b,0x17,0x9a,0xfc,0x4d,0x6,0x5b,0x9d, + 0xa2,0x5d,0x67,0xd3,0xb8,0x54,0x8d,0x51,0x97,0xf2,0x67,0x53,0x47,0xb9,0xdc,0xd9, + 0xe6,0xad,0x8a,0xcf,0x19,0x5f,0x59,0x69,0xf1,0x50,0x4a,0x7c,0xcc,0xcf,0x31,0x47, + 0x9c,0x95,0x9e,0x42,0xd6,0x50,0x46,0x3d,0x32,0x3a,0xcc,0x96,0x31,0x3d,0xfd,0xcc, + 0x33,0x4c,0x8b,0xb2,0xd1,0xbe,0xea,0x5a,0x4,0x62,0x6c,0xe4,0x1,0x13,0x68,0x47, + 0xd7,0x16,0xe6,0xac,0xd5,0xb2,0xb1,0x83,0x79,0xf5,0x86,0xed,0x7a,0xe5,0x0,0x7c, + 0xf2,0xbc,0xb1,0x76,0x2e,0x76,0x68,0x54,0xef,0x3c,0xa5,0x32,0x5f,0x6f,0x73,0xd0, + 0xa6,0xad,0x1a,0xae,0xca,0x1c,0x3e,0x12,0xbe,0xbd,0x24,0xd,0xb0,0xa,0x34,0xb5, + 0x6d,0x20,0xeb,0x5b,0xdb,0xd8,0x92,0x22,0x4c,0x25,0xbe,0xfc,0xea,0xcb,0x4a,0x8d, + 0xf7,0x9a,0xf,0x4b,0x20,0xfa,0x1d,0x27,0xea,0x41,0x83,0xc6,0x12,0xa3,0xde,0x9e, + 0x2d,0xa4,0xa6,0xaa,0x9c,0xe4,0xe7,0xe5,0x9c,0xab,0xad,0xad,0xbd,0xef,0x76,0xf0, + 0x10,0xbf,0x78,0x67,0xa,0xa1,0x1f,0x1f,0x70,0x72,0x50,0x1,0xa6,0xfc,0xdc,0x94, + 0x56,0x8e,0xa7,0x7a,0x66,0x2a,0x4f,0x4e,0x57,0x5c,0x54,0xd8,0x90,0x94,0x10,0xfb, + 0xd3,0xa2,0x82,0x3c,0xb2,0x61,0x43,0x1b,0xd9,0x45,0x35,0xa7,0x73,0x8f,0x9d,0xf, + 0x73,0xd0,0xb2,0x7d,0x40,0x71,0x4e,0xd5,0x6,0x86,0x26,0xed,0xd8,0x6,0x9c,0xae, + 0x5a,0xaa,0x2d,0x5f,0xd3,0xfc,0xaa,0xb5,0x9d,0x96,0x60,0x32,0x25,0xdb,0xc0,0xd6, + 0xaf,0x16,0xe,0xad,0x17,0xe7,0x6e,0x9e,0x7b,0xec,0x1c,0x39,0x70,0x60,0x1f,0xe9, + 0xec,0xd8,0x48,0x2a,0x4b,0x8b,0x98,0xc9,0x39,0x33,0x35,0xe1,0xfb,0xd5,0x55,0x95, + 0xc5,0x75,0x41,0x66,0x69,0xa3,0x2f,0x1d,0x1d,0xba,0xd2,0xa6,0x4b,0xfe,0x7e,0x82, + 0x49,0xc8,0xb4,0xd1,0x77,0x34,0xea,0xa4,0x1a,0x9b,0xb6,0xfe,0xd1,0x1,0xef,0x6c, + 0xcb,0xd3,0x95,0xab,0x2b,0xc3,0x6f,0x9d,0x23,0xa9,0x6b,0x20,0x2c,0xbd,0xa3,0xa6, + 0xba,0x2a,0x3f,0x2b,0x2d,0xe9,0x87,0xb1,0x73,0x1f,0x24,0x49,0xf1,0x31,0xa4,0xa6, + 0xba,0x82,0x2d,0x5f,0x62,0xe,0x5a,0x17,0xc2,0x1d,0xb4,0x5c,0xc6,0xbe,0xfc,0xe, + 0xda,0x30,0xd6,0x10,0xc3,0xb7,0x1,0x3b,0x37,0x35,0x36,0xb7,0x90,0xfa,0xc6,0x66, + 0x66,0x76,0x15,0x77,0xd6,0xf2,0x9a,0x7b,0x4d,0x40,0xa9,0x7,0x46,0x7e,0xe4,0xa1, + 0xe9,0xbd,0x8b,0x66,0xdd,0x6b,0x34,0x4b,0xfb,0x33,0x71,0xf7,0x7,0x97,0x12,0x41, + 0xdb,0x85,0x99,0xb9,0xab,0xbb,0x87,0x1c,0x39,0x7a,0x94,0xbc,0x48,0x35,0xd5,0x97, + 0x5f,0x7d,0xc5,0xb3,0x91,0x86,0xa9,0x3f,0x75,0xbc,0x5c,0xd4,0x7a,0xb1,0x9f,0xf3, + 0xae,0xdd,0x3b,0xc9,0xfa,0xa6,0x75,0xa4,0x30,0x3f,0xf7,0xa7,0x14,0x23,0x9a,0xa8, + 0xc2,0x16,0x11,0x9d,0xf8,0xe1,0x2b,0xaa,0xf1,0xee,0x8a,0x85,0xfc,0x5a,0x9,0xc0, + 0xa8,0xbc,0x7c,0x2f,0x3e,0x93,0xaf,0xf9,0xbd,0xf8,0x2f,0x3f,0xd3,0xe5,0x25,0x3e, + 0x53,0xa5,0x91,0xe3,0xa3,0xe2,0x55,0x95,0x95,0x89,0x69,0x29,0x49,0xaf,0x66,0xa4, + 0x25,0x93,0xe5,0xcb,0xea,0xd8,0xd9,0xc2,0xd0,0x86,0x2f,0x5f,0xb9,0x12,0x5a,0x78, + 0xef,0xa,0x40,0xa6,0xf,0xec,0x62,0xca,0x95,0x3d,0x94,0x55,0x73,0xcd,0xae,0x60, + 0xea,0x42,0x80,0x7e,0x41,0xd5,0x35,0x8e,0x6d,0x20,0xcc,0xb6,0x4f,0xa1,0x59,0x40, + 0x48,0x7a,0x32,0xa8,0xf5,0xc2,0x33,0xb1,0x7e,0xf5,0xa,0x42,0x19,0x21,0x5,0xdf, + 0x39,0xa4,0x20,0x37,0xeb,0x72,0x6d,0xed,0xc2,0x4f,0x72,0xc2,0x94,0x69,0x44,0x47, + 0x3b,0x26,0x1a,0xd2,0x3d,0xd3,0xa5,0xd3,0xe5,0xaf,0xa2,0x6f,0x5d,0x1c,0x5d,0x3c, + 0xd7,0xf6,0xa8,0xea,0x63,0x1b,0x63,0xaa,0x31,0xa7,0xeb,0x27,0xdb,0x38,0xf7,0xd3, + 0xdf,0xb6,0xb1,0x6b,0xeb,0x1f,0x97,0xf8,0xba,0x6f,0x63,0xea,0x63,0x5d,0x5f,0xf0, + 0x6b,0xd0,0xd8,0xa2,0xda,0xda,0x4f,0x51,0x9a,0x7b,0x92,0xa,0x7e,0xef,0xc6,0xcd, + 0x9f,0x43,0xf2,0x72,0x32,0xd9,0xfa,0xe2,0xb1,0xb1,0x51,0xa6,0xd,0x83,0xb1,0x43, + 0x58,0xb4,0xf9,0x5f,0x78,0xc7,0xfa,0xcc,0x3d,0x34,0x33,0x4,0x78,0xf2,0x2,0x88, + 0x1,0xc8,0xe7,0x1f,0x7f,0x8c,0x74,0xf7,0xf6,0x91,0xd5,0xeb,0x1a,0xc9,0xda,0xa6, + 0x66,0xb6,0x8c,0xc9,0xb3,0x1f,0x74,0x4,0xe0,0x67,0x6,0x45,0xd7,0x3c,0x47,0xd, + 0xda,0xec,0xa8,0x1a,0x98,0x55,0x9a,0x31,0x6d,0x47,0x37,0x5,0x5d,0xec,0xa1,0xdd, + 0xd0,0xdc,0x46,0x5a,0xda,0x37,0x92,0x89,0x1d,0x3b,0x82,0x7b,0x36,0x4f,0x33,0xf, + 0x72,0x71,0x5f,0x6,0x13,0x8f,0x35,0x59,0xf5,0xd8,0x5c,0xef,0x67,0x9e,0xa3,0xc2, + 0xd2,0x13,0x6c,0x1e,0xbf,0xbf,0xbf,0x97,0x2c,0x59,0x54,0x43,0xbf,0x61,0xd6,0xcd, + 0xca,0x8a,0x8a,0x78,0x91,0x87,0xd8,0xb0,0xc5,0x95,0x7,0x98,0x68,0xcc,0x5,0xf3, + 0x74,0xcf,0x43,0x3f,0xdd,0xa0,0x5f,0xb4,0x68,0x91,0xaf,0xe7,0xff,0x16,0x21,0x38, + 0x80,0x3e,0x90,0x97,0x93,0xbd,0x3d,0x31,0x2e,0xe6,0x17,0xc5,0x85,0xf9,0xa4,0xa5, + 0xa5,0x99,0xec,0xd8,0xb9,0x83,0x2d,0x57,0xc2,0xbc,0x22,0xdf,0x92,0x4e,0x9c,0xa7, + 0x74,0x5,0x3f,0xc,0x1c,0x57,0x8d,0xd8,0xf,0x8,0x39,0x83,0xd7,0x94,0x5b,0xfe, + 0x5a,0xb3,0x7b,0x84,0xda,0xaf,0x4b,0x79,0xb6,0xf4,0xaa,0x41,0xc4,0x25,0xd5,0xb3, + 0xe7,0xcf,0x92,0x7d,0xfb,0xf7,0x32,0xad,0xb7,0xaa,0xbc,0x98,0x24,0xc7,0xcd,0x85, + 0xd9,0xf9,0xcf,0xcb,0x4b,0x4b,0x1a,0x55,0x0,0xa4,0xa2,0xb1,0x48,0xe9,0xf1,0x76, + 0xd2,0x6b,0xa4,0x79,0xfb,0x69,0xdf,0xed,0xae,0x93,0x18,0x3f,0x1a,0x75,0xf8,0x4d, + 0x96,0xef,0x42,0xb,0x1,0x5a,0x5b,0x72,0x47,0x79,0x59,0xc9,0xda,0xb4,0xa4,0xd8, + 0x3f,0x87,0x36,0x9c,0x92,0x18,0x4b,0x6a,0x6b,0xaa,0x48,0x67,0x67,0x7,0xd9,0xbb, + 0x6f,0x2f,0x9b,0x1b,0x86,0xd0,0x28,0x7a,0x4a,0x1b,0xfd,0x28,0x34,0xbc,0x84,0xa7, + 0x87,0xb3,0x16,0xc0,0x18,0xda,0x1f,0xe6,0x8a,0x3b,0xa9,0x56,0x88,0x43,0x1f,0xe0, + 0x41,0xd,0xd0,0x82,0xc6,0xc8,0xf7,0x43,0x56,0x6a,0xb9,0x5b,0x87,0x83,0xff,0x6a, + 0x8d,0x95,0xbf,0x37,0x79,0x20,0xeb,0xe2,0xc8,0x20,0x8c,0x78,0xbd,0x86,0x78,0xa2, + 0x29,0x1a,0xe6,0x65,0x98,0xd9,0x21,0x54,0xb4,0x6e,0xa0,0xa0,0xbb,0x73,0x27,0x33, + 0x9,0xe3,0x88,0x40,0xa6,0xed,0xbe,0x74,0xd3,0x99,0xf7,0x70,0xde,0xab,0x33,0x37, + 0xc3,0x3a,0x81,0x79,0x63,0x8,0x49,0xdb,0xb7,0x4f,0x50,0xa1,0xa9,0x9e,0x14,0xe4, + 0x65,0xff,0x22,0x3f,0x2f,0x67,0x7b,0x6d,0x6d,0xed,0x5d,0x2a,0x40,0x9d,0xd,0x3d, + 0xb9,0xa4,0x95,0xe3,0x98,0xd2,0xc8,0xef,0x42,0x3f,0xbc,0xe0,0x41,0x37,0x28,0xf8, + 0xbd,0x18,0x57,0xe,0xaa,0xb8,0xb6,0x34,0xaa,0x3c,0x54,0x69,0xe4,0x7a,0xa1,0xb3, + 0xcb,0xcb,0xcb,0xb2,0x53,0x92,0x12,0x6e,0xa5,0x26,0xc5,0xe3,0x3c,0x47,0xd2,0xd3, + 0xd3,0xcd,0x4c,0x49,0xf0,0x84,0x53,0xd,0x1e,0xdd,0xc7,0xf6,0xb,0x94,0xae,0x41, + 0x4,0xf3,0xa8,0x68,0xaf,0x11,0xd4,0x4f,0x24,0xe0,0xd9,0x6a,0xcd,0x2a,0x61,0x46, + 0x97,0xf,0x5f,0xd7,0xb,0x49,0x15,0xf3,0x33,0xdb,0xb6,0xe,0x90,0x95,0xcb,0xeb, + 0xa8,0xd6,0x9b,0x48,0x12,0x62,0x1e,0x24,0x79,0x59,0xe9,0x2f,0x2c,0xac,0xa9,0x99, + 0xcb,0x7,0x8d,0xea,0x5b,0xeb,0xe8,0xd0,0x44,0x77,0xba,0x67,0xb6,0x3c,0x22,0xa1, + 0x71,0x1d,0xcd,0xbb,0xd0,0xb5,0x6b,0x39,0x7e,0xc7,0x8f,0x2a,0xad,0xee,0xdf,0xef, + 0x58,0xb6,0xc5,0xb1,0xc5,0x33,0x7d,0x27,0x5b,0x5e,0xa6,0xef,0x19,0x69,0xbf,0x83, + 0xf6,0x6a,0x6a,0xaa,0x1f,0xca,0xcb,0x4e,0xff,0x6c,0x62,0xcc,0x1c,0x12,0x37,0xff, + 0x41,0x92,0x9b,0x95,0x4e,0xea,0xd7,0xac,0x22,0xdb,0x86,0xb6,0x32,0xcb,0x1a,0xac, + 0x36,0x58,0xda,0x62,0x9b,0xda,0xb1,0x8d,0x2f,0xe,0xc6,0x58,0x62,0xf3,0xda,0xad, + 0xd7,0xc9,0xd7,0xde,0xfc,0x1a,0x73,0x3e,0x7a,0xe2,0xe2,0x45,0x32,0x34,0x32,0xca, + 0x96,0x33,0x41,0x3b,0x5e,0xd7,0xdc,0xca,0xd6,0xc4,0x32,0x40,0x96,0x4e,0x4c,0xd2, + 0x99,0x8c,0x5d,0x81,0x35,0x52,0x6d,0x9a,0xaf,0x65,0x6,0xf8,0x3,0x70,0x21,0x30, + 0xa0,0x9e,0xeb,0xd6,0x37,0xb3,0xb9,0xee,0x3d,0xfb,0xf7,0x93,0x27,0x2f,0x5d,0x62, + 0x1a,0x2e,0x40,0x17,0x8e,0x55,0x62,0x9b,0x23,0xe1,0x79,0xb2,0xb9,0xf9,0x69,0x8, + 0xf1,0xe7,0xce,0xb2,0x3d,0x2,0xba,0xb7,0x74,0xb2,0xb9,0xde,0xec,0xcc,0xf4,0xd7, + 0xcb,0xca,0x4a,0xb3,0xd9,0x37,0xb5,0xd0,0x8b,0x9f,0x71,0x32,0x5b,0xbe,0xe0,0x1a, + 0x57,0x9,0xc0,0x8,0x54,0x9a,0x70,0x1e,0xec,0x3c,0x2e,0xfe,0x79,0x90,0x9f,0xab, + 0xd2,0xd8,0xca,0x50,0xe5,0x23,0xe7,0x8f,0x86,0xd4,0xd6,0x2e,0xfc,0x40,0x7e,0x6e, + 0xf6,0x50,0x42,0xec,0xfc,0xbf,0xc5,0xe,0x5a,0xe2,0xe0,0x81,0x33,0x4,0x6,0x8f, + 0x12,0x88,0xd,0xc0,0x6b,0x22,0x1a,0xf9,0x1d,0x23,0xb2,0x28,0x81,0xb1,0xb1,0x5c, + 0xc9,0xe9,0x23,0x12,0x21,0xc0,0x5,0x64,0xc5,0xf8,0x72,0x39,0x2e,0x26,0x73,0x0, + 0x2f,0x33,0x37,0x53,0x29,0x18,0x7b,0xf5,0x4e,0x4c,0x8c,0x31,0xf,0xe7,0xe2,0x82, + 0x1c,0xb6,0xfb,0x11,0xd5,0x38,0xfe,0xb4,0xac,0xb4,0x78,0xb5,0x8a,0x1e,0x6c,0x34, + 0xa3,0xa2,0x1f,0x13,0x7d,0xe9,0xd2,0xe8,0xe8,0x53,0xce,0xcb,0x74,0x2f,0x96,0xa1, + 0xaa,0xbf,0xea,0xda,0x65,0x8c,0xf9,0xe9,0x3,0x5b,0x5b,0x74,0x71,0x74,0xe3,0x54, + 0x77,0xad,0x8b,0xe7,0xf7,0xbb,0xd8,0xea,0xaa,0xaa,0xa3,0x29,0x9e,0xae,0x5d,0x2e, + 0x65,0x87,0xe2,0x5,0x99,0x61,0x79,0x69,0x31,0xb4,0xe1,0x3f,0x83,0x36,0x9c,0x18, + 0x37,0x9f,0xed,0xa6,0xd5,0xd6,0xda,0x42,0xb6,0xef,0x98,0x60,0xa7,0xb4,0xc1,0x8a, + 0xc3,0x97,0x3f,0xda,0xfc,0x3f,0x5c,0xc1,0x18,0x80,0xf5,0xea,0xeb,0xaf,0x32,0xcd, + 0x18,0xce,0x5b,0xb0,0xdc,0xc1,0x8a,0xb7,0x6d,0x64,0x84,0x1,0xf2,0xca,0x35,0x6b, + 0x49,0x7d,0xe3,0x7a,0xd2,0xd8,0xda,0xce,0x40,0x19,0x6b,0x8d,0x3d,0x47,0x19,0xe, + 0x7b,0xcf,0xcd,0xe5,0x80,0xcb,0xb5,0x64,0x97,0x79,0x5b,0xd9,0x61,0x6a,0x20,0xb8, + 0x23,0x15,0x4,0x0,0xe,0xb6,0x4d,0xad,0x1b,0xd8,0xc9,0x50,0xf0,0x5e,0x6,0xe0, + 0xee,0xda,0x1b,0xb0,0x10,0xc0,0x4c,0xf,0xc0,0x8d,0x16,0xe8,0x5e,0x53,0xac,0x94, + 0x80,0x10,0xff,0xd8,0xe3,0x8f,0x31,0x73,0x33,0x8e,0xf,0xc4,0xe,0x67,0xb9,0xd9, + 0x19,0xff,0xa3,0x20,0x3f,0xb7,0x67,0xe1,0xc2,0x85,0x77,0x5,0x30,0xc0,0x4c,0x3b, + 0xb6,0x31,0x6e,0xc3,0x23,0x57,0xda,0x74,0xc1,0x4f,0xf1,0x5d,0xe8,0xa7,0x63,0x26, + 0x62,0xa0,0x8d,0x65,0xc1,0xe5,0xbd,0x2e,0x9e,0xea,0xb9,0xf8,0xcc,0x94,0xbf,0x29, + 0x3f,0x34,0xa6,0xb2,0xa2,0x3c,0x29,0x3d,0x35,0xf9,0xb9,0xc4,0xb8,0x98,0x7f,0x2d, + 0x29,0x2e,0x20,0x2d,0x2d,0xeb,0xc9,0xd8,0xf8,0x18,0xdb,0xac,0x1d,0x66,0xb,0x38, + 0x44,0x70,0x20,0xf6,0x2,0xdb,0xb5,0x59,0x6b,0x99,0xb7,0x23,0xa8,0x34,0x74,0x1d, + 0x61,0x47,0x2,0x9a,0xb7,0xa3,0xbe,0x0,0x5e,0x1c,0x98,0x0,0x86,0xb5,0x7b,0xcf, + 0x2e,0xd2,0xb1,0x79,0x3,0xa9,0xa9,0x2c,0x23,0xa9,0x9,0x31,0x58,0xd7,0xfb,0xab, + 0x82,0xdc,0xcc,0x93,0x35,0xd5,0xd5,0x9f,0x92,0x9,0xd9,0x44,0x3,0xb6,0x7b,0x57, + 0x1a,0x89,0x24,0xcc,0x86,0x36,0xfd,0xd6,0x61,0x36,0xf9,0xfb,0x1d,0xab,0xd1,0xac, + 0xc7,0x6c,0xeb,0xed,0xc2,0x57,0xa2,0xd9,0x2f,0x5a,0xc1,0x89,0x32,0xf2,0x9a,0x9a, + 0x9a,0x4f,0x15,0xe4,0x66,0x9f,0x4a,0x8e,0x9b,0xfb,0x4e,0xdc,0x3c,0x2a,0x2c,0x26, + 0x27,0xb0,0x75,0xc3,0x9d,0x1d,0x9b,0xc9,0x9e,0xbd,0x7b,0xc8,0x19,0xa,0x8e,0xf0, + 0xe0,0x5,0x30,0x68,0xa7,0x66,0x1c,0xa6,0xb6,0xe4,0xe7,0x7c,0xca,0xc,0x20,0x86, + 0xf9,0x62,0xec,0xb6,0x85,0xad,0x2f,0x1,0xd0,0xd8,0x9c,0xe2,0xf0,0x91,0x23,0xc, + 0x94,0x61,0xe2,0x85,0xd9,0x7a,0xf5,0xda,0x6,0xb6,0xb,0x17,0xcc,0xd7,0x38,0x1f, + 0x17,0xfb,0x53,0xc3,0xc1,0xb,0xf3,0xca,0x5d,0x7d,0x83,0xc,0xa8,0xbb,0x7,0xb6, + 0xb1,0x39,0xd9,0x9e,0xc1,0x61,0x6,0xa6,0x8,0xb8,0xc7,0x3b,0xc4,0xc1,0x41,0x7, + 0x9b,0xbb,0xfb,0x19,0xc0,0xb6,0x6c,0xdc,0xcc,0x40,0x16,0xf9,0x61,0x9,0xd5,0x5a, + 0xa,0xfa,0x58,0xd7,0xdc,0xd5,0xd3,0x4b,0xc6,0xb7,0x6f,0x27,0xc7,0x4f,0x9e,0x60, + 0x40,0x88,0xb6,0xbe,0xf2,0xda,0x2b,0x34,0xbc,0x1a,0xda,0x22,0xd2,0x95,0x2f,0xb9, + 0x3a,0xb0,0x71,0xe0,0x7d,0x36,0x38,0xcf,0x8b,0xd,0x35,0xb0,0x79,0x4a,0xe3,0xba, + 0x7a,0xf8,0x8a,0xbc,0x9b,0x99,0x9e,0xfa,0x5c,0x79,0x59,0x59,0x9c,0x4d,0x10,0x8e, + 0x16,0xcd,0x46,0x83,0x36,0x75,0x34,0x1e,0xfa,0xf1,0x8,0xd1,0xc,0x62,0xc1,0xba, + 0xe7,0x62,0x23,0x5c,0xe3,0xea,0xe2,0xf1,0xf7,0x25,0xc5,0x45,0x8b,0x92,0x13,0xe3, + 0x7e,0x8f,0x6,0x52,0x55,0x51,0x46,0xda,0xdb,0xdb,0x98,0x14,0xb,0x22,0x82,0x43, + 0x80,0x8,0xc4,0x91,0x80,0x53,0x24,0x66,0xe5,0xd9,0x68,0xc0,0x32,0xb8,0xba,0x96, + 0x1f,0x69,0x3d,0xfd,0x86,0xc0,0x69,0x45,0xcf,0x33,0x21,0x7,0xc0,0x8b,0x7d,0x57, + 0xbb,0xbb,0x3b,0x49,0xdd,0xe2,0x85,0x24,0x23,0x25,0x1e,0xeb,0x7a,0xff,0x25,0x3b, + 0x2d,0xe9,0xb,0x15,0xe5,0xa5,0x85,0x3a,0x82,0x74,0xf9,0xbe,0xba,0x38,0x2e,0xe9, + 0xfd,0xd0,0xa0,0xa9,0x8e,0xae,0xb4,0x6d,0x4b,0xef,0x5a,0x3f,0xbf,0x6d,0x72,0x19, + 0x47,0xae,0xf9,0x46,0x6b,0x6c,0x9a,0xea,0xaa,0x13,0xb0,0xa2,0xd5,0x4f,0xb6,0xfc, + 0x74,0xdf,0xba,0xa2,0xbc,0x2c,0x2f,0x3b,0x23,0x65,0x1a,0x6b,0xd2,0x63,0xe7,0x3d, + 0x48,0xb2,0x33,0x53,0x99,0xc3,0x27,0x8e,0xb1,0xdb,0xb7,0x7f,0x1f,0x3b,0x75,0x9, + 0xbe,0x26,0x1c,0x88,0x4d,0x0,0x63,0x1a,0xd3,0x5f,0x32,0x0,0x32,0xd7,0x90,0xe1, + 0xbc,0x84,0xf9,0x63,0x0,0x32,0x5f,0x6f,0x8c,0xe7,0xd8,0x74,0xe2,0xfc,0xe3,0x8f, + 0x53,0x70,0x7e,0x84,0x79,0x5a,0x8f,0x8c,0x8d,0x93,0xde,0xfe,0x1,0xb2,0xa9,0xb3, + 0x8b,0x1d,0xdd,0xd7,0x46,0xc1,0xba,0xb5,0x7d,0x3,0x3,0x52,0x2c,0xff,0x41,0x68, + 0xa1,0xf7,0xed,0x9b,0x36,0x93,0x8d,0x9b,0x3b,0xc8,0xe6,0xae,0x2e,0x32,0xb0,0x75, + 0x2b,0x19,0xdf,0xb1,0x83,0xed,0xbb,0xc,0x45,0x5,0x53,0x77,0xfc,0x28,0x58,0x94, + 0x8b,0xb2,0x70,0x18,0x5,0x34,0x5c,0xbe,0x3b,0x55,0xb4,0xf8,0x8b,0x8a,0xff,0x72, + 0xe0,0xc5,0xe1,0x9,0xb0,0x9e,0xe1,0xf0,0x95,0x96,0xe6,0x26,0x52,0x56,0x52,0x48, + 0x32,0xd3,0x52,0xde,0x2a,0x2a,0x2c,0x58,0x82,0xef,0x4,0xe0,0xb5,0xd1,0x82,0x8d, + 0x9e,0x5c,0x69,0xcd,0xcf,0x58,0xf1,0x3b,0x16,0x43,0x3f,0x2a,0xf9,0x85,0x5,0x44, + 0x90,0xff,0xf9,0xb5,0xf8,0x5c,0x7c,0x27,0xc7,0xd5,0xe5,0x21,0xbf,0x57,0x95,0xeb, + 0xf2,0x5c,0x55,0x6,0x1a,0x58,0x5d,0x5d,0x7d,0x77,0x5e,0x6e,0x76,0x4f,0x42,0xec, + 0xfc,0xff,0x9c,0x92,0x14,0x4f,0xaa,0xab,0xca,0xc9,0x86,0xd,0xed,0x6c,0x13,0x8f, + 0xe3,0x94,0xd0,0x60,0x9a,0xc6,0x84,0x3e,0x5f,0xf7,0x67,0xd3,0x7a,0x4d,0x1a,0xa6, + 0xcb,0xf3,0x99,0x1,0x77,0x2d,0x62,0xf3,0xb1,0x2e,0xcf,0xb0,0x32,0xa4,0x7f,0x67, + 0x70,0x9f,0xbc,0x66,0x6c,0xa7,0x7c,0xcf,0x4d,0xcd,0xe8,0xcb,0x93,0xa7,0x4f,0x92, + 0x7d,0xfb,0xf6,0xb2,0x9d,0xac,0x96,0x2f,0x5d,0x44,0xb2,0xd3,0x93,0x99,0x77,0x73, + 0x66,0x6a,0xc2,0xf5,0xb2,0x92,0xe2,0x4a,0x13,0x3d,0xa9,0x68,0xca,0x85,0x36,0x74, + 0xb4,0x64,0xa3,0x3b,0x13,0x3d,0xba,0xd2,0xbb,0xae,0xe,0xba,0xf1,0xa3,0x2b,0xc3, + 0x4f,0x5b,0x54,0x6d,0xb3,0xe5,0xeb,0xa7,0x7c,0x5d,0xdf,0xf9,0x69,0xaf,0xed,0x9d, + 0xb,0xdf,0xd0,0xf5,0x87,0xad,0x8f,0x4c,0xfd,0x62,0xea,0x4b,0x55,0xd9,0x9c,0x49, + 0x96,0x16,0x17,0xd6,0x53,0x21,0xf2,0xbb,0x6c,0x1f,0xf2,0x98,0x39,0x84,0xa2,0x32, + 0xf6,0x15,0x26,0xbd,0x7d,0x3d,0xec,0x74,0x2e,0xae,0x11,0x7b,0x56,0x5f,0x28,0x78, + 0x89,0x6c,0xcd,0xf2,0xc3,0x43,0xf8,0xd8,0x16,0xc7,0x38,0xf2,0x81,0xb6,0xcc,0x41, + 0xf2,0x8d,0x2f,0xdf,0xa2,0xe0,0x7c,0x8b,0x1,0x34,0x2,0xee,0x71,0x82,0xd3,0xeb, + 0xb7,0x5e,0xa7,0xef,0x5f,0x63,0x1a,0x2b,0x80,0x14,0xd7,0x78,0x7,0x40,0x47,0x3a, + 0xfe,0x8f,0xe7,0xc8,0xb,0x79,0x8a,0x40,0xab,0x2a,0xdb,0xc6,0x47,0xc2,0x9e,0x3b, + 0x68,0xbc,0xe8,0x3f,0x8,0x34,0x4c,0xe3,0x3d,0xf6,0x68,0x70,0xda,0x6a,0x3d,0x29, + 0xa7,0xc0,0x9b,0x9e,0x92,0xf8,0x17,0x94,0x97,0x77,0x81,0xa7,0xe3,0xbb,0xb8,0x7c, + 0x73,0xbf,0x3c,0xc1,0x44,0x2f,0x7e,0xf3,0xf0,0x33,0xae,0xb5,0x0,0x4c,0x1b,0xcb, + 0x2,0xbf,0x56,0xbd,0x8f,0xe4,0x99,0x2a,0x4e,0xa4,0xc1,0x96,0x17,0x1a,0x58,0x55, + 0x59,0xf9,0x5b,0xb9,0xd9,0x99,0x3b,0x28,0x10,0xff,0x34,0x35,0x39,0x81,0x2c,0xac, + 0xae,0x64,0x27,0xa4,0x60,0xb9,0x1,0x4c,0x1b,0xd8,0x2,0x11,0x20,0x2,0x30,0xf1, + 0x33,0x97,0x23,0x13,0xa4,0xea,0xda,0x5,0xc,0x75,0x80,0x67,0x1a,0x88,0xae,0x0, + 0x29,0x7a,0x60,0x9a,0x34,0x68,0x79,0x80,0x99,0xe6,0x6b,0x10,0x7,0x83,0x5,0x52, + 0xea,0xc5,0x4b,0x17,0x99,0x30,0x83,0x35,0x78,0x5b,0xb6,0x74,0x50,0xe0,0x5d,0xcc, + 0xf6,0x6f,0x86,0x83,0x55,0x7a,0x52,0xec,0xd7,0x4b,0x8a,0xa,0x56,0xd4,0x54,0x57, + 0xbf,0x4f,0x26,0x4a,0xdd,0x77,0x8b,0x26,0x6d,0xcc,0x96,0x76,0xfc,0xc6,0xbd,0xdd, + 0x75,0x9f,0xcd,0x38,0x32,0x8d,0x63,0xd7,0x38,0xa6,0xf2,0x5d,0xd2,0xe8,0x78,0x43, + 0x24,0xfd,0x66,0x2a,0x2f,0x52,0xda,0xd2,0xbd,0xf,0xd0,0x6e,0xf5,0xbd,0xc5,0x85, + 0xf9,0x1d,0x69,0x49,0xb1,0x7f,0xc,0xb3,0x74,0xc2,0x82,0xb9,0x24,0x3f,0x37,0x8b, + 0x2,0xf1,0x32,0xd2,0x4d,0x5,0xce,0x3d,0x7b,0x76,0xb3,0xb3,0x88,0x61,0x5d,0xe3, + 0x42,0xbd,0x67,0xcc,0x58,0xc6,0xa7,0x1f,0xa1,0x5a,0x37,0x6e,0xb9,0xc6,0x2c,0x6a, + 0xd0,0xfc,0x99,0x1c,0x4c,0xef,0x5c,0x78,0x81,0x9,0x90,0x8d,0xcf,0x26,0xbd,0x42, + 0x8,0xea,0xc0,0x8f,0x1c,0xc5,0x89,0x45,0x98,0xe3,0xc5,0xa6,0x28,0xf0,0x17,0xa9, + 0x28,0x2d,0x2,0xf0,0xfe,0xd7,0xec,0xac,0x8c,0x5d,0x15,0xe5,0xe5,0x9f,0x32,0xf1, + 0x10,0xbf,0x58,0x14,0xc9,0x58,0x72,0x19,0x3b,0x91,0x84,0xd0,0x8f,0x13,0xaf,0xc, + 0xbc,0xa6,0x60,0x3,0x6b,0x55,0x5e,0xaa,0x7c,0xe5,0x67,0xba,0x4e,0x8e,0xa4,0x5e, + 0x7c,0x10,0x55,0x54,0x94,0x7f,0x32,0x3b,0x33,0x7d,0x4f,0xfc,0x82,0x79,0x7f,0x99, + 0x9c,0x18,0x4b,0x2a,0xca,0x4a,0xd8,0x39,0xa2,0x43,0x43,0xdb,0xc8,0xa1,0x87,0xf, + 0x91,0x73,0xe7,0xcf,0x33,0x42,0xf8,0x5c,0xd0,0x61,0x4b,0x7,0xc4,0x32,0x31,0x79, + 0x1d,0xb1,0xae,0x39,0x99,0x89,0x5d,0x9,0x3e,0x6c,0xc0,0x5a,0x0,0x5b,0x37,0x10, + 0x4c,0x40,0x6d,0x12,0x1e,0x64,0x93,0x18,0x98,0xb,0xe6,0xa3,0x30,0x58,0xe0,0xe0, + 0x86,0x65,0x0,0x98,0xe3,0x5d,0x5c,0x5b,0xc5,0x3c,0x9b,0xe1,0x45,0x9a,0x9a,0x10, + 0xf3,0xed,0xe2,0x82,0xdc,0x8d,0x55,0x55,0x55,0xf7,0xca,0xdf,0x4e,0x45,0x27,0x26, + 0x7a,0xf2,0x43,0x93,0x3a,0x3a,0xb4,0xbd,0x33,0x9,0x9a,0xae,0xe5,0xeb,0xf2,0x72, + 0x69,0x93,0xb,0x8d,0xab,0x18,0x88,0x2d,0xae,0x2d,0x3f,0x3f,0x7d,0xec,0x3a,0x7e, + 0x5d,0xca,0xd1,0x8d,0x6b,0xbf,0x7d,0x1c,0x49,0x30,0x31,0x70,0x1b,0x1d,0xd5,0x40, + 0x98,0xaf,0xaa,0xba,0xbf,0x30,0x3f,0x77,0x2c,0x35,0x61,0xc1,0x8f,0xb9,0x46,0x8c, + 0xed,0x71,0x71,0x4c,0x66,0x47,0xc7,0x26,0xb2,0x63,0xc7,0xf6,0x90,0x50,0xf,0x1, + 0x15,0x42,0xbd,0xd3,0xb8,0x56,0x58,0xae,0x5c,0x80,0xd0,0xa6,0x25,0xab,0xf2,0x53, + 0xfa,0xbc,0x38,0xa,0x4,0x7e,0xcc,0xce,0xa6,0x78,0x30,0x33,0xc3,0x7c,0xe,0xcb, + 0x19,0x4,0x97,0x83,0x7,0xf,0xb0,0x33,0xbe,0x1b,0xd6,0xad,0x61,0x27,0x57,0x51, + 0x45,0x9,0xc0,0xbb,0x5b,0x6,0x5e,0xd7,0x6f,0xec,0x87,0x7e,0x5d,0x69,0xd4,0x5, + 0x83,0x74,0xe3,0xc0,0xc4,0x97,0x42,0x3f,0x4a,0x5c,0xec,0x21,0xfe,0x55,0xd7,0x3c, + 0xf0,0x67,0xe2,0x73,0x39,0x8d,0xf8,0xef,0x92,0xa7,0x4b,0x3c,0xd7,0x3c,0xc4,0xf8, + 0x72,0x3d,0xd0,0x60,0xa,0xc4,0xbf,0x4d,0x81,0x78,0x17,0xd5,0x88,0xff,0x34,0x31, + 0x2e,0x86,0x7d,0x70,0x6c,0x47,0x87,0xb9,0x9d,0x5d,0xbb,0x77,0xb1,0x79,0x10,0xac, + 0x61,0xc3,0x0,0x82,0xa6,0xe7,0xa2,0x2d,0xba,0x10,0xbd,0xe,0xec,0x4c,0x66,0x63, + 0xdb,0x80,0x72,0xd1,0xa8,0xc5,0xc1,0xa6,0xab,0x93,0x9c,0x27,0x5f,0xb2,0x4,0xd0, + 0xc5,0x7c,0x39,0xe6,0x84,0xd0,0x27,0xd8,0x67,0x15,0x9b,0x9c,0xf,0x6d,0x1b,0x24, + 0xcd,0xeb,0x1b,0x48,0x55,0x79,0x9,0x3c,0x9a,0x19,0xf0,0x66,0x24,0xc7,0xbf,0x5e, + 0x94,0x9f,0xdb,0x5a,0x55,0x55,0x79,0x5f,0x75,0x75,0x8d,0xf6,0x3b,0xa8,0xbe,0xa9, + 0xed,0xbb,0xaa,0x68,0xc1,0x35,0x8e,0x2e,0xae,0x5c,0xbe,0xea,0x99,0x8e,0xee,0x55, + 0x69,0x5c,0xc6,0x88,0xae,0x1e,0xb6,0x71,0xe0,0x4a,0xdf,0xba,0x3a,0xda,0xc6,0x8a, + 0xaa,0x4f,0x74,0xf9,0xb9,0xd6,0xd1,0x54,0xb6,0xae,0xff,0x74,0x6d,0xb2,0xd1,0x92, + 0x6b,0x3d,0x54,0xdf,0xc9,0xa5,0x3d,0xde,0xfb,0x9a,0x3b,0x2a,0x2b,0x2b,0xef,0x2f, + 0x2a,0xc8,0xed,0x48,0x4f,0x8a,0xfb,0x2e,0x8e,0xc7,0xc4,0xd2,0xa5,0xcc,0xb4,0x64, + 0x66,0x5d,0xc3,0x7c,0xe5,0xd0,0xf0,0x36,0x76,0x68,0xc,0xcc,0xd3,0x5c,0x2b,0x16, + 0x2d,0x6c,0x2e,0x3e,0x1e,0x91,0x98,0x7d,0x6d,0x3c,0x45,0xc7,0x8f,0x6c,0x56,0x35, + 0x53,0x3e,0x26,0x7e,0x27,0xe6,0xc1,0xfc,0x44,0x68,0x3f,0x3c,0xf5,0xf4,0xd3,0x6c, + 0x43,0x12,0x8,0xf0,0x3b,0x77,0xee,0x20,0x5b,0xb6,0x74,0x32,0xaf,0x66,0x98,0xf6, + 0x53,0x93,0xe2,0xff,0x24,0x27,0x2b,0x63,0x47,0x79,0x59,0xd9,0x27,0x45,0x10,0x73, + 0xa1,0x5f,0x17,0xda,0x76,0xc1,0x1a,0x13,0x7f,0xb2,0xd1,0x96,0xcb,0xd8,0x93,0x9f, + 0x79,0x0,0xd8,0x25,0x50,0xe2,0xf3,0x5c,0x8b,0xf7,0xba,0x78,0x91,0xe4,0x1d,0x8d, + 0x78,0xaa,0x74,0x33,0x83,0xa8,0xe2,0xbe,0xbc,0xdc,0xec,0xb6,0xa4,0xf8,0x5,0xdf, + 0x8c,0x8b,0x99,0x4b,0x32,0xd3,0x53,0x48,0xed,0xc2,0x2a,0xb6,0xec,0x60,0x68,0x78, + 0x88,0xad,0x25,0x3e,0x75,0xfa,0x34,0x5b,0x3,0x8,0x69,0x8d,0x83,0xb1,0x6d,0xf3, + 0xe,0x17,0xb3,0x8e,0xcd,0x64,0x6d,0x1b,0x84,0x61,0x69,0x44,0xcd,0xdb,0x30,0x8f, + 0xeb,0xa2,0xed,0x72,0xd0,0x85,0x0,0x2,0x6f,0x66,0x30,0x91,0x87,0xf,0x3f,0xcc, + 0xe6,0x64,0xba,0xba,0x36,0x93,0x55,0x2b,0x96,0x92,0xc2,0xdc,0x4c,0x92,0x1c,0x3f, + 0x8f,0x2,0xef,0x83,0xbf,0xca,0x4c,0x49,0x78,0x5,0xa6,0x66,0xda,0xbf,0x77,0x55, + 0x49,0x44,0x79,0x3b,0x69,0xe5,0x76,0xd1,0xcd,0x6c,0xeb,0xe2,0x67,0xec,0xf8,0x29, + 0xdf,0x25,0xed,0x6c,0xea,0x11,0xed,0x6f,0xa0,0xca,0xef,0x76,0xf6,0xed,0x6c,0xfb, + 0xcb,0x5f,0xdd,0x42,0x40,0x7c,0x4f,0x71,0x61,0x41,0x63,0x46,0x4a,0xc2,0xeb,0x9, + 0x31,0xf,0xfe,0x1f,0x38,0x6b,0xe1,0xb4,0x25,0x3a,0x1e,0xc8,0xea,0x55,0x2b,0xc8, + 0x96,0xae,0x4e,0x32,0xb1,0x7d,0x82,0x81,0xd,0x40,0x7,0xeb,0x58,0x95,0x26,0x6a, + 0x47,0x6b,0x95,0xeb,0x54,0x98,0x4d,0xc0,0x76,0x55,0x16,0xac,0x2,0x82,0xa5,0x5e, + 0xd0,0x74,0x9f,0x7f,0xe1,0x5,0xb6,0xc7,0x36,0xce,0x60,0x86,0x13,0xec,0xfe,0xfd, + 0xfb,0xc8,0x36,0x26,0xc0,0x37,0x92,0xaa,0x8a,0x52,0x92,0x91,0x9a,0x44,0x52,0x12, + 0xe3,0xbe,0x49,0x79,0x71,0x7b,0x65,0x45,0xc5,0x7,0xd1,0xaf,0xe8,0x5f,0xd3,0xf7, + 0xf0,0x4b,0x47,0xd1,0x1c,0x3b,0xd1,0x1a,0x13,0xfc,0xda,0x3,0xc0,0x9c,0x49,0x8a, + 0x83,0x32,0x5a,0x41,0x66,0xc4,0xba,0x38,0xba,0x67,0xba,0xf4,0xb6,0x67,0xba,0x32, + 0x79,0x7e,0x15,0x15,0x15,0xef,0x2f,0x2a,0xcc,0xaf,0x4d,0x4b,0x49,0x7c,0x26,0x7e, + 0xc1,0xdc,0x9f,0x61,0x0,0x51,0xe9,0x96,0x79,0x3c,0x6e,0xda,0xb4,0x81,0xc,0x8f, + 0xc,0x7,0xc0,0xf8,0xcc,0x69,0xa6,0x5,0x42,0x1b,0xc4,0xbc,0x85,0x3c,0xe7,0xe2, + 0x3a,0x30,0x74,0x60,0xec,0x44,0xf0,0x8e,0xd2,0xb1,0x72,0xb0,0x19,0xea,0xc9,0xa5, + 0x53,0x38,0x41,0xa0,0x8d,0x0,0x5d,0xcc,0xc7,0xc0,0xa4,0xd6,0xdb,0xbb,0x85,0x34, + 0xac,0x5d,0x43,0x2a,0xca,0x8a,0x98,0x47,0x33,0xb4,0xdd,0xe4,0xb8,0x79,0x7f,0x42, + 0x25,0xd6,0x3d,0xa5,0x25,0xc5,0xa9,0x26,0xc0,0x88,0x36,0xfd,0x44,0x42,0x63,0xa6, + 0x7a,0xb9,0xd2,0x89,0x6b,0x3d,0x74,0x71,0x23,0xed,0x8f,0x48,0xf2,0x33,0xf5,0xbf, + 0xaa,0xbd,0xba,0xfe,0x9a,0x2d,0x2f,0x50,0xe5,0xaf,0x12,0xc6,0x74,0x71,0x54,0x8c, + 0x2b,0xda,0x34,0xe5,0xe7,0xbb,0xab,0xda,0x20,0xd6,0x91,0x8e,0x85,0xec,0x9c,0xcc, + 0xd4,0xcb,0x74,0x6c,0xfc,0xd,0xd6,0x11,0xc3,0x3c,0xd,0xad,0xb8,0xaa,0xb2,0x8c, + 0x34,0x35,0xae,0x63,0xe7,0xd2,0x42,0xe3,0x3b,0x72,0xf4,0x8,0x9b,0xc2,0xc1,0xd9, + 0xd7,0xf0,0x3d,0xe1,0x82,0xbd,0xc9,0xa2,0x65,0x9a,0x6f,0x35,0xc5,0xb3,0xf9,0xa3, + 0xd8,0x94,0x3,0x57,0xff,0x10,0x71,0x9a,0xa,0xed,0x41,0xbb,0xd0,0x3e,0x78,0x54, + 0x63,0xc7,0x2a,0x6c,0x9c,0x31,0x3c,0xbc,0x8d,0xed,0xdd,0x5f,0xb7,0xb8,0x96,0x69, + 0xbb,0xc9,0x9,0xb1,0x7f,0x97,0x9e,0x9a,0xf4,0x4c,0x61,0x41,0x7e,0xd,0x5,0x5e, + 0x26,0xbc,0x47,0xfb,0x3b,0xf9,0x19,0x3,0xa6,0xf1,0x70,0x3b,0x78,0x55,0x18,0x0, + 0x53,0x20,0xa,0xbd,0x30,0x5d,0x8b,0xf7,0xba,0xa0,0x4b,0x2f,0xe7,0x23,0xbf,0xe3, + 0xf7,0xaa,0x32,0x75,0xf1,0x55,0xc1,0x96,0x5f,0x78,0x5b,0x2,0x1d,0x56,0x56,0x5a, + 0xfa,0xdb,0xb9,0xd9,0x99,0x7d,0x54,0x2b,0xfe,0x3,0xa,0xc6,0xff,0x94,0x9a,0x14, + 0xc7,0x8e,0x2d,0x5b,0xb9,0x7c,0x29,0x3,0x63,0x6c,0xee,0x81,0xb5,0x80,0x47,0x8f, + 0x1f,0x63,0x12,0x2d,0xcc,0x4b,0xd0,0x8e,0xa1,0x31,0x8a,0x80,0x2c,0x9a,0x71,0x6d, + 0x4,0x6c,0x2,0x6a,0xdb,0xfc,0x8e,0x2d,0xbe,0x38,0x77,0xac,0x2,0x5c,0x68,0xb9, + 0x57,0xae,0x5e,0x61,0x8b,0xdc,0x8f,0x9f,0x3c,0x4e,0xe,0x1e,0x3a,0xc0,0xdc,0xfe, + 0xb1,0xcb,0xcc,0xba,0xb5,0xab,0x49,0x75,0x65,0x29,0xc9,0x49,0x4f,0x26,0x49,0xb1, + 0xf,0xc1,0xa3,0xf9,0xd7,0xe9,0xc9,0x71,0xaf,0x15,0xe6,0xe5,0x34,0x57,0x94,0x97, + 0x3d,0x20,0x12,0x99,0xee,0xbb,0x98,0xbe,0xbf,0x89,0xb6,0x74,0xd7,0xa6,0xb8,0xa6, + 0xf8,0xa6,0xb2,0x5d,0x69,0xc8,0x34,0x6,0x6c,0xb4,0xa9,0xa3,0x3b,0x5d,0x1d,0x4c, + 0x6d,0x54,0xd5,0xcf,0x54,0x67,0xdd,0xb7,0x30,0xe5,0xe5,0x27,0x9d,0xad,0xdf,0x6d, + 0xdf,0xc2,0xf4,0x1d,0x6d,0x7c,0xc3,0x94,0xc6,0x85,0xe,0x4c,0xfd,0x6a,0x6b,0x47, + 0x58,0xfc,0xe0,0x78,0x28,0x2f,0x2b,0xc3,0x3a,0xe2,0x4d,0x54,0x58,0xbd,0x45,0xb5, + 0xe2,0x7f,0x64,0x7,0x3e,0xc4,0xcd,0x67,0x73,0xc5,0xb,0x6b,0x2a,0xd9,0x71,0xaa, + 0xd8,0xad,0x6f,0x62,0xfb,0x38,0xb3,0x2c,0x71,0xc1,0x1e,0x9e,0xd4,0x18,0x93,0xd0, + 0x1a,0x3d,0xdb,0xe8,0x1a,0x34,0x52,0x57,0xa1,0xdc,0x95,0x97,0x98,0x0,0x57,0xe5, + 0x17,0xc3,0xad,0x65,0x38,0x8d,0x48,0x14,0xde,0xa1,0xf1,0x63,0xf,0x80,0x21,0xca, + 0x2f,0x37,0xb4,0xb7,0x92,0xa5,0x4b,0x6a,0x49,0x61,0x5e,0x16,0xb6,0xfa,0xfc,0x57, + 0xa,0xbc,0x6f,0xe7,0x64,0x65,0xc,0x96,0x96,0x96,0x3c,0x64,0xea,0x4f,0x1d,0x5d, + 0x99,0x68,0xc4,0x65,0xbc,0x99,0x30,0xc1,0x84,0x61,0x26,0x7a,0x71,0xe1,0x25,0xba, + 0x3a,0x78,0x0,0x58,0xc,0xe5,0xe5,0xe5,0x9e,0xff,0x48,0x82,0x4b,0x5a,0x55,0x9c, + 0xd9,0x94,0x39,0x9b,0xf4,0x42,0x87,0xdf,0x59,0x52,0x5c,0x94,0x91,0x95,0x91,0xb6, + 0x3f,0x31,0x6e,0xfe,0xf7,0xe3,0x62,0x1e,0xfa,0xbf,0xd8,0x27,0xb6,0x30,0x2f,0x9b, + 0x2c,0x5e,0x54,0x43,0xd6,0x37,0x35,0x50,0xcd,0xb0,0x9b,0x81,0x15,0x96,0x22,0xe0, + 0x70,0x1,0x9c,0xc8,0x4,0x93,0x2d,0x8,0x11,0x4,0x9,0x49,0x50,0xe7,0x84,0x61, + 0x9b,0xbb,0x8d,0x4,0x74,0x75,0x9e,0x91,0xa8,0x3,0x34,0x76,0x48,0xa5,0xa8,0x1b, + 0x1c,0x1f,0x20,0x3c,0x9c,0x38,0x75,0x92,0x31,0x80,0x5d,0xbb,0x76,0x32,0x7,0x8, + 0x1c,0x5e,0xbd,0x7a,0xe5,0x32,0x52,0x51,0x5a,0x48,0x32,0x53,0x13,0xd9,0xe9,0x44, + 0x89,0x94,0x81,0xa4,0x27,0x2e,0x78,0x3b,0x3f,0x27,0x73,0x98,0x4a,0xf8,0xf1,0x32, + 0x51,0xa2,0x9f,0xc5,0xbe,0xe6,0xf7,0x72,0xff,0x47,0xf2,0x3d,0x54,0xf4,0x17,0xd, + 0x9a,0x8c,0x6,0x9d,0xd8,0x68,0x56,0x77,0xed,0x9a,0xc6,0x4f,0x3d,0xfd,0xb4,0xe1, + 0x76,0x8f,0xe5,0xd9,0xb6,0xf3,0x37,0xf1,0x2d,0xa3,0x9d,0x47,0x85,0x30,0x3e,0x28, + 0xf,0x49,0xcd,0xcd,0x4a,0xdf,0x9f,0x96,0xb8,0xe0,0x3b,0x9,0xf3,0x3,0x60,0x9c, + 0x18,0x3b,0x8f,0x64,0x67,0xa4,0x92,0xca,0xf2,0x12,0x66,0xa6,0xde,0xb4,0x31,0x20, + 0xd8,0xc3,0xff,0x4,0xeb,0x79,0xe1,0x67,0x71,0xe1,0xe2,0x45,0xe6,0xec,0x8,0x1, + 0x19,0x63,0x17,0x63,0x98,0xb,0xf8,0x2e,0xfb,0xd7,0xbb,0xce,0xed,0x9a,0x9e,0x8b, + 0xe6,0x71,0x51,0xbb,0xe5,0x82,0xfb,0x53,0xb4,0x7e,0x17,0x9f,0xbc,0x18,0x2,0x5c, + 0xac,0x8d,0x1e,0x1b,0x1f,0xa5,0xc2,0x7b,0x17,0x3b,0xd4,0xa2,0x96,0xa,0x1b,0xd0, + 0x74,0x29,0xdf,0x7c,0x37,0x39,0x61,0xc1,0xf,0xb3,0x32,0x52,0xf,0x14,0x15,0x16, + 0xe4,0x56,0x94,0x97,0xbf,0xcf,0x6,0x6a,0x3a,0xde,0x12,0x2d,0x9a,0x73,0xc9,0xd7, + 0xc6,0x6b,0x66,0xcb,0x8b,0x78,0x3a,0x25,0x0,0x8b,0x8c,0x54,0x2c,0x48,0x17,0x6c, + 0xef,0xe5,0x38,0x72,0x3,0x4c,0x69,0x54,0x71,0xfd,0x94,0xa7,0xeb,0x30,0x5b,0xfd, + 0x38,0xd8,0xd0,0xfb,0xf7,0x83,0x70,0xb2,0xd2,0x53,0xf,0x25,0xc7,0xc7,0x7c,0x27, + 0x6e,0xfe,0x9c,0x5f,0x63,0x10,0xc1,0xbc,0x84,0xc5,0xe1,0x4b,0xeb,0x16,0xb1,0xf9, + 0x8c,0x2d,0x94,0xf0,0xe0,0x42,0x8f,0x3,0xbe,0xe1,0x55,0xd,0x67,0x2e,0x80,0x32, + 0xa4,0x42,0xc,0x26,0x80,0x1f,0xb4,0x65,0x10,0x30,0xa4,0x46,0x48,0xba,0xe2,0xc0, + 0x72,0x31,0x35,0xa9,0x96,0x13,0x20,0xf,0xc,0xc,0xe4,0x89,0xc1,0x8a,0x32,0x50, + 0x16,0xb4,0x73,0x94,0x8d,0x3a,0x60,0x73,0x8c,0x23,0x8f,0x3e,0xc2,0xe,0x42,0xc0, + 0x61,0xd5,0x3,0x3,0x7d,0xc,0x70,0x71,0x68,0xf5,0xc2,0xaa,0x72,0x52,0x90,0x93, + 0xc1,0x76,0xaa,0xc2,0xa6,0x3,0x89,0x31,0x73,0xfe,0x81,0x32,0x8c,0x6f,0x50,0xd0, + 0x1d,0x2c,0x29,0x2e,0x4c,0x9,0xf4,0x7,0xfa,0xa1,0x22,0x18,0xdc,0xfa,0xdf,0x4, + 0xce,0x7e,0xf3,0xf0,0x43,0x33,0xd1,0x48,0xa3,0xa2,0x1d,0xd7,0x76,0xa9,0xca,0xd3, + 0xd1,0xb1,0x9f,0x31,0x15,0x8d,0x74,0x2e,0xdf,0x21,0xd2,0x72,0x22,0x19,0xff,0xa6, + 0x7e,0x75,0x89,0xaf,0x6b,0x8f,0xdf,0xba,0xf9,0xa9,0xa3,0xcb,0xb7,0xf4,0xd0,0xf, + 0xc0,0xa6,0xbc,0x1c,0x2,0x7d,0x2a,0x5,0xa4,0x89,0x8c,0xe4,0xf8,0xaf,0x52,0xcd, + 0xf8,0x57,0x71,0x41,0x33,0x75,0x5a,0x52,0x3c,0xe,0x13,0x60,0x87,0x40,0x60,0xb, + 0xdd,0x8d,0x1b,0xdb,0xc9,0xe0,0xe0,0x0,0x5b,0x61,0x0,0x50,0x3b,0x72,0xf4,0x51, + 0x72,0x9a,0x6a,0xc9,0x30,0xe7,0xc2,0x1f,0x5,0x2b,0x35,0x0,0x80,0x9c,0x8f,0x70, + 0x41,0x9f,0xb,0xfb,0x36,0xa1,0x5d,0x6,0xda,0x2f,0xa,0x7c,0x84,0xf3,0x12,0x2e, + 0xb0,0x33,0xa0,0xa5,0xe5,0x41,0x68,0x47,0xf9,0xd8,0x22,0x13,0x9b,0x63,0x80,0xbf, + 0x41,0x60,0x80,0xb3,0x59,0x67,0xe7,0x66,0x66,0x62,0xc7,0xa6,0x3b,0xa5,0x45,0xf9, + 0x24,0x3d,0x25,0x1,0x42,0xc6,0xaf,0x93,0xe3,0x17,0xfc,0x61,0x66,0x7a,0xca,0x91, + 0xc2,0x82,0xfc,0xfc,0xb2,0xb2,0xb2,0xf,0x80,0x87,0xf8,0xf9,0xa6,0xd1,0xc0,0x1c, + 0x97,0xf1,0xac,0x2b,0xcf,0xf6,0x7c,0xb6,0xe3,0x81,0x87,0xd0,0x8f,0x76,0x52,0xe8, + 0x21,0xbf,0x96,0x9f,0xc9,0x41,0x7c,0x2e,0xa7,0x93,0xe3,0x99,0xf2,0x96,0xd3,0xe8, + 0xca,0x36,0x5d,0xfb,0x29,0xc3,0x94,0x56,0x95,0x4f,0x39,0x3a,0x97,0x6,0x7a,0x8f, + 0x81,0xb4,0x20,0x3f,0x37,0xab,0x35,0x3d,0x39,0xe1,0x73,0x9,0xb,0x1e,0xfa,0x29, + 0x5,0xe4,0x7f,0x4e,0x88,0x9d,0x8b,0x35,0x6b,0xcc,0xa3,0x1a,0x9e,0x90,0x58,0x1f, + 0xd8,0xdc,0xdc,0xc4,0xce,0x18,0x85,0x76,0x39,0x31,0x31,0xce,0x4c,0x32,0x98,0x4b, + 0x86,0xb4,0x8,0x67,0x4,0x98,0x9e,0x0,0x8e,0x20,0x6c,0x2c,0x5b,0xc0,0xe0,0xc2, + 0x4e,0x52,0x57,0xae,0x5e,0x65,0x80,0xd,0xc2,0xf,0x5,0x7a,0x7f,0xf5,0xa9,0xa7, + 0x18,0xa8,0x22,0xce,0xa5,0xcb,0x97,0x19,0xb8,0xc2,0xb1,0x1,0xda,0xec,0x99,0x73, + 0x67,0xd8,0x5c,0xb,0x6,0x7,0xb4,0x5a,0x9c,0xe4,0x82,0x9d,0xbf,0x30,0xef,0x2, + 0x4d,0x1d,0x60,0xb,0x93,0x32,0x4c,0x41,0x58,0xd8,0x9e,0x9b,0x99,0x1a,0x0,0x5c, + 0xca,0x0,0x28,0xe0,0xfe,0x53,0x4a,0xdc,0xbc,0x9f,0x64,0xa5,0x25,0x3e,0x5d,0x90, + 0x97,0xb3,0x96,0x6a,0xba,0x73,0x3,0xed,0xaf,0xd0,0xf7,0x87,0xa6,0xaf,0x75,0xdf, + 0xdf,0xf6,0x1d,0x54,0xdf,0xdf,0x56,0xae,0xee,0xbd,0x8d,0xde,0x4c,0xdf,0x5f,0x47, + 0xdf,0x2e,0x63,0xc2,0x85,0x66,0x55,0x6d,0xd4,0xb5,0x5f,0x15,0x4f,0x57,0x8e,0xa9, + 0xad,0x26,0x3a,0x77,0x8d,0xa7,0x4b,0xeb,0x3a,0xce,0x5c,0xbf,0x97,0x1f,0x5a,0xd1, + 0xd5,0xdb,0x4f,0x1c,0x97,0x3e,0x30,0xd1,0xb1,0x8d,0x2f,0x86,0x97,0x17,0x18,0x53, + 0x25,0x25,0xc5,0x31,0x5,0xb9,0xd9,0xcd,0x59,0xe9,0xc9,0x97,0x53,0xe2,0xe7,0xff, + 0x88,0xa,0xbe,0xff,0xc4,0x97,0x35,0xa5,0x26,0xc6,0x32,0xcd,0x11,0xfb,0x50,0x2f, + 0x5d,0xb2,0x88,0x34,0xac,0xab,0x67,0xd3,0x5f,0x98,0x43,0x86,0x80,0x8f,0x13,0xdf, + 0x60,0x75,0x7b,0xf8,0x91,0xc3,0x6c,0xbc,0x43,0xb8,0x3e,0x77,0xfe,0x1c,0x9b,0x46, + 0x2,0x3f,0x0,0x5f,0x0,0x60,0x82,0x4f,0x30,0x3e,0xc2,0x79,0x49,0xf0,0x1a,0x3c, + 0x24,0xc4,0x47,0xae,0x78,0xf9,0x8,0x76,0xf7,0x2,0x5f,0x82,0xf2,0x0,0x6d,0x1c, + 0x2b,0x1e,0x0,0xb4,0xb0,0xf4,0xd,0xc,0xf6,0xb3,0xa5,0x56,0x50,0x36,0xb0,0x11, + 0x9,0xe,0x42,0xa0,0x6a,0x9,0x49,0x4f,0x8e,0x27,0x49,0x71,0xf3,0x48,0x52,0xec, + 0xbc,0xbf,0x48,0x4b,0x8e,0xff,0x52,0x5e,0x76,0xe6,0xe6,0xe2,0xa2,0xc2,0x38,0xb9, + 0xcd,0xae,0x7c,0xdb,0x34,0x96,0x4d,0x3c,0xc7,0xc6,0xa3,0xfc,0x8c,0x6b,0x13,0x2e, + 0xb9,0xc6,0xb1,0xd5,0x8b,0xc7,0xf7,0x0,0x30,0xf,0xa5,0xa5,0xa5,0x4a,0xc2,0x32, + 0x5,0x55,0x1a,0xf9,0x19,0xbf,0x37,0xe5,0xef,0x52,0x76,0x24,0xf5,0x73,0xa9,0xa7, + 0x4b,0xbe,0x62,0x27,0xd2,0xf8,0x1f,0x2e,0x2e,0x2c,0x48,0xca,0xcb,0xc9,0x6a,0xcf, + 0x48,0x4d,0xbc,0x9c,0x1c,0x37,0xff,0x47,0x74,0x10,0xbd,0x13,0x3f,0xff,0x41,0x46, + 0x94,0x14,0xa4,0x49,0x1e,0xd5,0x2e,0x4b,0x8b,0xb,0x28,0xc1,0x56,0x90,0xe5,0x4b, + 0x97,0x90,0xb5,0xf5,0xab,0xd9,0xe,0x2f,0x18,0x54,0x0,0xe8,0xde,0xde,0x1e,0xa, + 0xd2,0x83,0x64,0x64,0x64,0x98,0x6d,0xe,0x2,0x33,0xe,0xe6,0x87,0x0,0xa0,0x3b, + 0x77,0xed,0xa4,0x61,0x7,0xbb,0xe6,0x1,0x83,0x61,0x64,0x64,0x88,0x79,0x12,0x62, + 0x63,0x72,0x2c,0x9f,0xea,0xa4,0x3,0xa3,0xad,0xb5,0x99,0x99,0x7e,0xd6,0xac,0x5a, + 0x41,0x16,0xd7,0xd6,0xb0,0x1,0x8c,0x79,0x17,0xec,0x48,0x95,0x92,0xb0,0x80,0x99, + 0x94,0xa1,0xe1,0x26,0x2d,0x98,0xf3,0xb,0xac,0xd5,0xcd,0x4a,0x4b,0x3a,0x9f,0x9f, + 0x93,0xd5,0x52,0x5c,0x54,0x90,0x48,0xdb,0x71,0x6f,0x59,0x59,0x60,0xb0,0x44,0xb3, + 0x5f,0xff,0xad,0x82,0x9f,0xef,0xf7,0x9b,0x6a,0xdb,0x6c,0x69,0x7e,0xb6,0x63,0x3, + 0xcf,0x5d,0xd3,0xdb,0xe2,0xdd,0x8e,0x7e,0x76,0xad,0x9f,0x8d,0xb7,0x44,0x9a,0xdf, + 0x6c,0xda,0x67,0xfb,0xb6,0xaa,0xf7,0x1c,0x9c,0xe8,0xf5,0xfb,0x29,0x60,0x25,0x50, + 0xa1,0xbe,0x85,0x8e,0xc9,0x8b,0x74,0x6c,0x7e,0x2f,0x69,0xc1,0x43,0xff,0x13,0x80, + 0x8c,0x90,0xb8,0x60,0x2e,0x81,0x2f,0x4a,0x76,0x46,0xa,0x29,0xcc,0xcf,0x21,0x95, + 0x15,0xa5,0xa4,0x8e,0x2,0x33,0xcc,0xd7,0x98,0x4f,0x6e,0x6f,0x6b,0x61,0x5a,0x28, + 0x4,0xed,0x81,0x81,0x7e,0xca,0x17,0xb6,0xb2,0x7d,0x93,0xc1,0x27,0x20,0xf8,0xc3, + 0xb,0x1b,0xa0,0xd,0x3e,0x82,0x7f,0xec,0x4,0x38,0x4e,0x9f,0x23,0x80,0xdf,0x40, + 0x8b,0x5,0x1f,0x41,0x7a,0xf0,0x23,0x98,0xc4,0x1,0xb2,0xf5,0x6b,0x56,0x32,0xeb, + 0x1e,0x80,0xb6,0x84,0x2a,0x16,0x39,0x54,0x68,0x4f,0xa3,0xf5,0xa0,0x40,0x4b,0x35, + 0xdc,0xb9,0xef,0x24,0xc7,0xcf,0xff,0x1,0xe5,0x6f,0xcf,0xe6,0x66,0x67,0x6c,0x29, + 0x2a,0xc8,0xcf,0xa5,0x6d,0xfc,0x90,0xa,0x90,0xc4,0xb6,0x47,0x32,0x6,0x5c,0xd3, + 0xbb,0xd0,0x84,0x5f,0x9a,0x8b,0x16,0x9d,0x9b,0xea,0x15,0xfa,0xf1,0xca,0xdc,0xce, + 0x20,0x36,0xda,0xf6,0x5c,0xd7,0xf9,0x7e,0xcb,0x30,0xe5,0xad,0xba,0xd7,0x5d,0xab, + 0x43,0x19,0xb,0x33,0x75,0x2c,0xb9,0xab,0xb8,0xa8,0x68,0x4e,0x61,0x7e,0x6e,0x79, + 0x6e,0x56,0x7a,0x7f,0x66,0x2a,0x1d,0x50,0x89,0xb,0xbe,0x91,0x14,0x3b,0xf7,0x2f, + 0xa8,0xb6,0xf9,0xf,0xd0,0x38,0x13,0x62,0x1e,0x62,0xe0,0xc,0x50,0x84,0xf4,0x98, + 0x99,0x96,0x44,0x72,0xb3,0xd2,0xd8,0xfc,0x32,0x34,0x68,0x98,0x71,0x60,0xda,0x6, + 0x80,0xc2,0x4d,0x1f,0x73,0x45,0xb8,0x86,0xe6,0x8a,0xe7,0x88,0x83,0xb8,0x90,0x92, + 0x31,0x28,0x30,0x5f,0xb,0xa9,0x99,0xe,0x8,0x6,0xb2,0x0,0x7f,0x84,0xc4,0x5, + 0x73,0xfe,0x57,0x72,0xec,0xdc,0xff,0x90,0x96,0x14,0xfb,0x55,0x3a,0xb0,0x1f,0xa3, + 0xf1,0x3b,0xb,0xb,0xf2,0x8a,0x8b,0x8b,0x8b,0x3e,0xc5,0xda,0x6,0x1,0x42,0x22, + 0x44,0x5d,0xff,0xab,0xde,0x95,0x39,0xa4,0x8d,0x84,0x16,0xfc,0xd2,0x8b,0xad,0x9e, + 0xa6,0x6f,0x6e,0xaa,0x83,0x6a,0x90,0xba,0xe6,0x1b,0x8d,0x31,0x32,0xdb,0x7c,0xa2, + 0x59,0x8e,0x8e,0x19,0xce,0xe6,0xdb,0xfa,0xa5,0x3,0x97,0x71,0xec,0x52,0x5f,0x3f, + 0xdf,0xdc,0x95,0xbf,0xb8,0xd0,0x83,0x79,0xcc,0x4,0xdf,0x5,0x84,0xfa,0x3b,0xa9, + 0x86,0xfc,0x9,0x3a,0x56,0x4b,0x72,0xb3,0x32,0xfa,0xe9,0xd8,0x7d,0x82,0x8e,0xe1, + 0x2f,0x27,0xc7,0xcd,0xfd,0x4f,0x9,0x31,0xf,0xfe,0x3,0x1f,0xdf,0x8,0x9,0x74, + 0xbc,0x27,0xc7,0xc7,0x30,0x80,0x6,0x1f,0x1,0x3f,0xc8,0xcf,0xc9,0x64,0xab,0x38, + 0x20,0xf4,0x73,0x3e,0x2,0x1e,0x12,0xe2,0x23,0xa5,0x45,0xa4,0x8c,0xbe,0x3,0x9f, + 0x29,0x2e,0xcc,0xa5,0x5a,0x6c,0x26,0x4b,0x47,0xcb,0x61,0xfc,0x88,0xf2,0x2b,0x1c, + 0x9a,0x12,0xf0,0x1,0x59,0xf0,0xd0,0x3b,0x54,0x0,0xf8,0xcb,0x94,0xf8,0x98,0xb7, + 0x33,0x52,0x12,0x2f,0xe4,0x64,0xa5,0xf,0x14,0xe4,0xe5,0x54,0x51,0x81,0x61,0x6e, + 0x59,0x59,0xe9,0xfb,0x42,0x75,0x76,0xa4,0x8f,0x68,0x8c,0x21,0x97,0xfe,0x76,0xa1, + 0x6d,0x1b,0xe6,0xe8,0x30,0x28,0x92,0xb1,0x69,0x6a,0x5f,0xe8,0x57,0x52,0x52,0x12, + 0xa,0xfc,0xa5,0x78,0x2f,0xfe,0xab,0x9e,0xeb,0xde,0x89,0xef,0xc5,0x78,0xa6,0x67, + 0xba,0xf7,0xa6,0x74,0xb6,0x7f,0xbf,0x79,0xc9,0xef,0x6d,0xf9,0x79,0x9e,0x85,0x3e, + 0x58,0x19,0x7f,0xff,0x41,0xa,0x7c,0x9f,0x2e,0xcc,0xcf,0xcb,0xa4,0x92,0xee,0xb2, + 0x9c,0xcc,0xb4,0xad,0x59,0x69,0xc9,0xa7,0x33,0x52,0x12,0x9e,0xa1,0x52,0xe5,0x24, + 0x95,0x7a,0xdf,0x4c,0x89,0x9f,0xff,0xc7,0x0,0xea,0xa4,0xd8,0x87,0xfe,0x92,0x4a, + 0xc0,0x7f,0x45,0x89,0xff,0x67,0x14,0x44,0xff,0x3e,0x31,0x66,0xce,0x2f,0xd8,0xff, + 0x82,0x39,0x7f,0x4b,0x9f,0xfd,0xd,0xd,0x7f,0x95,0x1c,0x37,0xef,0x27,0x34,0xfe, + 0xf,0xe8,0x60,0x79,0x8b,0xe,0xce,0x97,0x69,0x3e,0xbf,0x9b,0x9d,0x91,0x7a,0x80, + 0x82,0x6c,0x6f,0x7e,0x6e,0xf6,0x6a,0x3a,0x78,0x73,0xe9,0x20,0xf9,0x34,0x2d,0xf7, + 0xae,0xd0,0x7,0xe7,0xc1,0xd2,0x26,0x15,0x1d,0xa8,0x82,0x2b,0x1d,0xc8,0xc1,0x46, + 0x5b,0xba,0x3e,0x55,0xd1,0x95,0xee,0x1b,0xe9,0xbe,0xa7,0x5f,0x5a,0xd5,0xa5,0xb3, + 0xa5,0x37,0x8d,0x1b,0x97,0x76,0x9a,0x68,0xd1,0x44,0xe7,0xae,0xdf,0x40,0xf7,0x6d, + 0x5d,0xc6,0xb8,0xad,0x9e,0xa6,0x6f,0x62,0x4a,0xe3,0x12,0xcf,0x46,0x1b,0xae,0x7d, + 0x65,0x4a,0xe3,0xa7,0x9d,0x2e,0xdf,0xde,0x54,0x77,0x73,0x7f,0x89,0x80,0x5d,0x6, + 0xb3,0xf5,0x3d,0x54,0xb8,0xff,0x74,0x61,0x41,0x7e,0x16,0x1d,0xe3,0xcb,0x21,0xe0, + 0x67,0xa7,0xa7,0x1c,0xa6,0x2,0xf8,0x33,0xe9,0xc9,0x71,0xd3,0x94,0x17,0xbc,0x49, + 0xf9,0xc2,0x8f,0xa8,0xd0,0xfd,0x13,0xca,0x43,0xfe,0x3b,0xe5,0x21,0x7f,0x4d,0xc3, + 0xcf,0x68,0xf8,0x39,0xe5,0x21,0xbf,0xa4,0xe1,0xe7,0xf4,0xfa,0xef,0x28,0x1f,0xc1, + 0xf3,0xff,0x46,0x79,0xcd,0x9f,0x23,0x3e,0xe5,0x3d,0x6f,0xa5,0x25,0x32,0x1e,0xf2, + 0x2c,0xe5,0x49,0x27,0x29,0x6f,0x1a,0x2,0xf,0x29,0xc8,0x67,0x3c,0x64,0x4e,0x49, + 0x71,0xf1,0x7d,0x1e,0xd0,0x10,0x78,0x88,0x5f,0xfe,0x6e,0xfa,0x36,0xb6,0x71,0x6a, + 0xe3,0x3,0xb6,0x7e,0xf5,0x43,0xab,0x36,0x2c,0x72,0x1d,0xcf,0x2e,0x74,0xa2,0x4, + 0x60,0x53,0xa0,0x2a,0x94,0xf6,0xb9,0xed,0x9d,0xee,0xbd,0x9f,0xf2,0xc4,0x7b,0x53, + 0x79,0x7e,0xea,0x1d,0x49,0xd9,0x91,0xb4,0xcf,0xf3,0x1,0x43,0x1f,0x29,0xf0,0x4f, + 0xd3,0xde,0x49,0x41,0xfa,0x5e,0xfa,0xf,0xb0,0xfe,0x10,0xd,0x1f,0x2d,0x2a,0x2a, + 0xfc,0x4,0x1d,0x4,0x9f,0x64,0xff,0xf4,0x9e,0xe,0x86,0xfb,0xe9,0xff,0x87,0xe9, + 0xff,0x7,0xd4,0x4,0x14,0xfe,0xe1,0x79,0x9d,0x74,0x6d,0x71,0x6d,0xa3,0xdf,0xbe, + 0xbb,0x5d,0x41,0x57,0xef,0xd9,0xd6,0x73,0x36,0x6d,0x99,0x6d,0x5a,0x15,0xed,0xcc, + 0x66,0xac,0xb8,0xa6,0xd5,0x8d,0x25,0x97,0xb1,0x22,0x97,0xf5,0x6f,0x4d,0x47,0x2e, + 0x7c,0xc8,0xcf,0xd8,0xbe,0x9d,0xf4,0x19,0xd,0x3e,0x85,0xb1,0xcd,0xfe,0x5,0xde, + 0xe1,0x1d,0xf3,0xec,0xfd,0x9d,0xe0,0xd,0x8c,0x7f,0x14,0x15,0x7d,0x98,0xfe,0x3f, + 0x40,0xff,0x3f,0x5e,0x54,0x58,0xf8,0x49,0xfa,0xff,0x5b,0x34,0x3c,0x40,0x9f,0x7d, + 0x84,0x96,0x71,0x1f,0x8d,0x77,0xf,0x8b,0x2f,0xe4,0xcb,0x2d,0x7a,0x26,0x1,0xce, + 0xf,0x4f,0xb4,0xd1,0x7c,0x34,0xfb,0x3b,0x5a,0xe9,0x23,0x69,0x8f,0xea,0x7b,0xbb, + 0xd6,0xeb,0xbd,0xdf,0x7b,0xbf,0xf7,0x7e,0xef,0xfd,0xde,0xfb,0xbd,0xf7,0x7b,0xef, + 0xf7,0x1b,0xfa,0xfd,0x3f,0xb2,0x5c,0x91,0x31,0xe1,0xab,0xd4,0x22,0x0,0x0,0x0, + 0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82, + +}; + +static const unsigned char qt_resource_name[] = { + // bsnes.png + 0x0,0x9, + 0x4,0xc6,0x84,0x7, + 0x0,0x62, + 0x0,0x73,0x0,0x6e,0x0,0x65,0x0,0x73,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67, + // logo.png + 0x0,0x8, + 0x5,0xe2,0x59,0x27, + 0x0,0x6c, + 0x0,0x6f,0x0,0x67,0x0,0x6f,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67, + // documentation.html + 0x0,0x12, + 0x8,0x77,0x5e,0x5c, + 0x0,0x64, + 0x0,0x6f,0x0,0x63,0x0,0x75,0x0,0x6d,0x0,0x65,0x0,0x6e,0x0,0x74,0x0,0x61,0x0,0x74,0x0,0x69,0x0,0x6f,0x0,0x6e,0x0,0x2e,0x0,0x68,0x0,0x74,0x0,0x6d, + 0x0,0x6c, + // license.html + 0x0,0xc, + 0x7,0x5b,0xc3,0x9c, + 0x0,0x6c, + 0x0,0x69,0x0,0x63,0x0,0x65,0x0,0x6e,0x0,0x73,0x0,0x65,0x0,0x2e,0x0,0x68,0x0,0x74,0x0,0x6d,0x0,0x6c, + // joypad.png + 0x0,0xa, + 0x6,0x79,0x79,0x47, + 0x0,0x6a, + 0x0,0x6f,0x0,0x79,0x0,0x70,0x0,0x61,0x0,0x64,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67, + +}; + +static const unsigned char qt_resource_struct[] = { + // : + 0x0,0x0,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x5,0x0,0x0,0x0,0x1, + // :/bsnes.png + 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0, + // :/logo.png + 0x0,0x0,0x0,0x18,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x5,0x5c, + // :/joypad.png + 0x0,0x0,0x0,0x76,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x5f,0xd6, + // :/license.html + 0x0,0x0,0x0,0x58,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x50,0x81, + // :/documentation.html + 0x0,0x0,0x0,0x2e,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x46,0xbd, + +}; + +QT_BEGIN_NAMESPACE + +extern bool qRegisterResourceData + (int, const unsigned char *, const unsigned char *, const unsigned char *); + +extern bool qUnregisterResourceData + (int, const unsigned char *, const unsigned char *, const unsigned char *); + +QT_END_NAMESPACE + + +int QT_MANGLE_NAMESPACE(qInitResources)() +{ + QT_PREPEND_NAMESPACE(qRegisterResourceData) + (0x01, qt_resource_struct, qt_resource_name, qt_resource_data); + return 1; +} + +Q_CONSTRUCTOR_FUNCTION(QT_MANGLE_NAMESPACE(qInitResources)) + +int QT_MANGLE_NAMESPACE(qCleanupResources)() +{ + QT_PREPEND_NAMESPACE(qUnregisterResourceData) + (0x01, qt_resource_struct, qt_resource_name, qt_resource_data); + return 1; +} + +Q_DESTRUCTOR_FUNCTION(QT_MANGLE_NAMESPACE(qCleanupResources)) + diff --git a/tools/bsnes/ui_qt/settings/advanced.mh b/tools/bsnes/ui_qt/settings/advanced.mh new file mode 100755 index 0000000..e2cd094 --- /dev/null +++ b/tools/bsnes/ui_qt/settings/advanced.mh @@ -0,0 +1,54 @@ +class AdvancedSettingsWindow : public QObject { + Q_OBJECT + +public: + QWidget *panel; + QVBoxLayout *layout; + QLabel *title; + QGridLayout *driverLayout; + QLabel *videoLabel; + QLabel *audioLabel; + QLabel *inputLabel; + QComboBox *videoDriver; + QComboBox *audioDriver; + QComboBox *inputDriver; + QLabel *driverInfo; + + QLabel *regionTitle; + QHBoxLayout *regionLayout; + QButtonGroup *regionGroup; + QRadioButton *regionAuto; + QRadioButton *regionNTSC; + QRadioButton *regionPAL; + + QLabel *portTitle; + QHBoxLayout *portLayout; + QButtonGroup *portGroup; + QRadioButton *portSatellaview; + QRadioButton *portNone; + QWidget *portSpacer; + + QLabel *focusTitle; + QHBoxLayout *focusLayout; + QButtonGroup *focusButtonGroup; + QRadioButton *focusPause; + QRadioButton *focusIgnore; + QRadioButton *focusAllow; + QWidget *spacer; + + void setup(); + void initializeUi(); + +public slots: + void videoDriverChange(int index); + void audioDriverChange(int index); + void inputDriverChange(int index); + void setRegionAuto(); + void setRegionNTSC(); + void setRegionPAL(); + void setPortSatellaview(); + void setPortNone(); + void pauseWithoutFocus(); + void ignoreInputWithoutFocus(); + void allowInputWithoutFocus(); +} *winAdvancedSettings; diff --git a/tools/bsnes/ui_qt/settings/audio.mh b/tools/bsnes/ui_qt/settings/audio.mh new file mode 100755 index 0000000..f0667b4 --- /dev/null +++ b/tools/bsnes/ui_qt/settings/audio.mh @@ -0,0 +1,28 @@ +class AudioSettingsWindow : public QObject { + Q_OBJECT + +public: + QWidget *panel; + QVBoxLayout *layout; + QLabel *title; + QHBoxLayout *boxes; + QLabel *frequencyLabel; + QComboBox *frequency; + QLabel *latencyLabel; + QComboBox *latency; + QGridLayout *sliders; + QLabel *volumeLabel; + QSlider *volume; + QLabel *frequencySkewLabel; + QSlider *frequencySkew; + QWidget *spacer; + + void setup(); + void syncUi(); + +public slots: + void frequencyChange(int value); + void latencyChange(int value); + void volumeAdjust(int value); + void frequencySkewAdjust(int value); +} *winAudioSettings; diff --git a/tools/bsnes/ui_qt/settings/cheateditor.mh b/tools/bsnes/ui_qt/settings/cheateditor.mh new file mode 100755 index 0000000..053f50c --- /dev/null +++ b/tools/bsnes/ui_qt/settings/cheateditor.mh @@ -0,0 +1,28 @@ +class CheatEditorWindow : public QObject { + Q_OBJECT + +public: + QWidget *panel; + QVBoxLayout *layout; + QLabel *title; + QTreeWidget *list; + QHBoxLayout *controls; + QPushButton *addCode; + QPushButton *editCode; + QPushButton *deleteCode; + + void setup(); + void syncUi(); + void reloadList(); + void updateList(); + +public slots: + void itemChanged(QTreeWidgetItem *item); + void listChanged(); + void addNewCode(); + void editSelectedCode(); + void deleteSelectedCode(); + +private: + array listItem; +} *winCheatEditor; diff --git a/tools/bsnes/ui_qt/settings/input.mh b/tools/bsnes/ui_qt/settings/input.mh new file mode 100755 index 0000000..97583be --- /dev/null +++ b/tools/bsnes/ui_qt/settings/input.mh @@ -0,0 +1,32 @@ +class InputSettingsWindow : public QObject { + Q_OBJECT + +public: + QWidget *panel; + QVBoxLayout *layout; + QLabel *title; + QHBoxLayout *selection; + QComboBox *port; + QComboBox *device; + QTreeWidget *list; + QHBoxLayout *controls; + QPushButton *assign; + QPushButton *assignAll; + QPushButton *unassign; + + void setup(); + void syncUi(); + +public slots: + void portChanged(); + void reloadList(); + void listChanged(); + void updateList(); + void assignKey(); + void assignAllKeys(); + void unassignKey(); + +private: + array deviceItem; + array listItem; +} *winInputSettings; diff --git a/tools/bsnes/ui_qt/settings/paths.mh b/tools/bsnes/ui_qt/settings/paths.mh new file mode 100755 index 0000000..a0ca502 --- /dev/null +++ b/tools/bsnes/ui_qt/settings/paths.mh @@ -0,0 +1,49 @@ +class PathSettingsWindow : public QObject { + Q_OBJECT + +public: + QWidget *panel; + QVBoxLayout *layout; + QLabel *title; + QLabel *gameLabel; + QHBoxLayout *games; + QLineEdit *gamePath; + QPushButton *gameSelect; + QPushButton *gameDefault; + QLabel *saveLabel; + QHBoxLayout *saves; + QLineEdit *savePath; + QPushButton *saveSelect; + QPushButton *saveDefault; + QLabel *patchLabel; + QHBoxLayout *patches; + QLineEdit *patchPath; + QPushButton *patchSelect; + QPushButton *patchDefault; + QLabel *cheatLabel; + QHBoxLayout *cheats; + QLineEdit *cheatPath; + QPushButton *cheatSelect; + QPushButton *cheatDefault; + QLabel *dataLabel; + QHBoxLayout *data; + QLineEdit *dataPath; + QPushButton *dataSelect; + QPushButton *dataDefault; + QWidget *spacer; + + void setup(); + void syncUi(); + +public slots: + void selectGamePath(); + void defaultGamePath(); + void selectSavePath(); + void defaultSavePath(); + void selectPatchPath(); + void defaultPatchPath(); + void selectCheatPath(); + void defaultCheatPath(); + void selectDataPath(); + void defaultDataPath(); +} *winPathSettings; diff --git a/tools/bsnes/ui_qt/settings/settings.mh b/tools/bsnes/ui_qt/settings/settings.mh new file mode 100755 index 0000000..8e97014 --- /dev/null +++ b/tools/bsnes/ui_qt/settings/settings.mh @@ -0,0 +1,31 @@ +#include "video.moc" +#include "audio.moc" +#include "input.moc" +#include "paths.moc" +#include "cheateditor.moc" +#include "advanced.moc" + +#include "utility/inputcapture.moc" +#include "utility/codeeditor.moc" + +class SettingsWindow : public QObject { + Q_OBJECT + +public: + QWidget *window; + QHBoxLayout *layout; + QListWidget *list; + QListWidgetItem *video; + QListWidgetItem *audio; + QListWidgetItem *input; + QListWidgetItem *paths; + QListWidgetItem *cheatcodes; + QListWidgetItem *advanced; + QWidget *panel; + QStackedLayout *panelLayout; + + void setup(); + +public slots: + void listChanged(); +} *winSettings; diff --git a/tools/bsnes/ui_qt/settings/utility/codeeditor.mh b/tools/bsnes/ui_qt/settings/utility/codeeditor.mh new file mode 100755 index 0000000..dc19466 --- /dev/null +++ b/tools/bsnes/ui_qt/settings/utility/codeeditor.mh @@ -0,0 +1,43 @@ +class CodeEditorWindow : public QObject { + Q_OBJECT + +public: + QWidget *window; + QVBoxLayout *layout; + QLabel *descLabel; + QTextEdit *description; + QLabel *codeLabel; + QHBoxLayout *codeLayout; + QListWidget *codeList; + QVBoxLayout *controls; + QLineEdit *codeValue; + QPushButton *codeAdd; + QPushButton *codeDelete; + QPushButton *codeDeleteAll; + QWidget *spacer; + QCheckBox *enabled; + QHBoxLayout *finishControls; + QPushButton *okButton; + QPushButton *cancelButton; + + void setup(); + void syncUi(); + void addCode(); + void editCode(unsigned code); + CodeEditorWindow(); + +public slots: + void listChanged(); + void codeChanged(); + void addCodeToList(); + void deleteCodeFromList(); + void deleteAllCodesFromList(); + void accept(); + void dismiss(); + +private: + signed activeCode; + void showWindow(const char *title); + + friend class CheatEditorWindow; +} *winCodeEditor; diff --git a/tools/bsnes/ui_qt/settings/utility/inputcapture.mh b/tools/bsnes/ui_qt/settings/utility/inputcapture.mh new file mode 100755 index 0000000..d753cbe --- /dev/null +++ b/tools/bsnes/ui_qt/settings/utility/inputcapture.mh @@ -0,0 +1,89 @@ +class InputCaptureWindow : public QObject { + Q_OBJECT + +public: + struct Window : public QWidget { + void closeEvent(QCloseEvent*); + } *window; + QVBoxLayout *layout; + QHBoxLayout *hlayout; + QLabel *title; + QPushButton *mouseAxes; + QPushButton *mouseButtons; + QWidget *imageSpacer; + struct ImageWidget : public QWidget { + void paintEvent(QPaintEvent*); + } *imageWidget; + QWidget *spacer; + + void setup(); + void activate(InputObject *object); + void activate(InputGroup *group); + void inputEvent(uint16_t code, bool forceAssign = false); + InputCaptureWindow(); + +public slots: + void assignMouseAxis(); + void assignMouseButton(); + +private: + InputObject *activeObject; + InputGroup *activeGroup; + unsigned groupIndex; + bool inputLock; + + friend class InputCaptureWindow::Window; +} *winInputCapture; + +class InputMouseCaptureWindow : public QObject { + Q_OBJECT + +public: + enum Mode { AxisMode, ButtonMode }; + + QWidget *window; + QVBoxLayout *layout; + QLabel *info; + QLabel *captureBox; + QHBoxLayout *buttonLayout; + QPushButton *xAxis; + QPushButton *yAxis; + QWidget *spacer; + + void setup(); + void activate(Mode); + void inputEvent(uint16_t code); + +public slots: + void assignAxisX(); + void assignAxisY(); + +private: + Mode activeMode; + signed activeMouse; +} *winInputMouseCapture; + +class InputCalibrationWindow : public QObject { + Q_OBJECT + +public: + struct Window : public QWidget { + void closeEvent(QCloseEvent*); + } *window; + QVBoxLayout *layout; + QLabel *info; + QPushButton *ok; + QWidget *spacer; + + void setup(); + void activate(unsigned joy); + InputCalibrationWindow(); + +public slots: + void dismiss(); + +private: + int activeJoypad; + + friend class InputCalibrationWindow::Window; +} *winInputCalibration; diff --git a/tools/bsnes/ui_qt/settings/video.mh b/tools/bsnes/ui_qt/settings/video.mh new file mode 100755 index 0000000..7c5f3ce --- /dev/null +++ b/tools/bsnes/ui_qt/settings/video.mh @@ -0,0 +1,29 @@ +class VideoSettingsWindow : public QObject { + Q_OBJECT + +public: + QWidget *panel; + QVBoxLayout *layout; + QLabel *title; + QGridLayout *sliders; + QLabel *lcontrast; + QSlider *contrast; + QLabel *lbrightness; + QSlider *brightness; + QLabel *lgamma; + QSlider *gamma; + QHBoxLayout *options; + QCheckBox *enableGammaRamp; + QCheckBox *enableNtscMergeFields; + QWidget *spacer; + + void setup(); + void syncUi(); + +public slots: + void gammaRampToggle(int); + void ntscFieldsToggle(int); + void contrastAdjust(int); + void brightnessAdjust(int); + void gammaAdjust(int); +} *winVideoSettings;