From e4689484e2a2885ed58f29d7ca5f17a745682eb0 Mon Sep 17 00:00:00 2001 From: msiewert76 Date: Sat, 4 Jun 2011 21:51:39 +0000 Subject: [PATCH] - add basic framework to support new types of exotic hardware; there are now stubs for big saves (Band Bros DX/Wario Ware DIY) - Wario Ware DIY is now officially *not* supported --- arm9/Makefile | 1 - arm9/source/auxspi.cpp | 210 ++++++++++++++++++++++++++---------- arm9/source/auxspi.h | 56 +++++++--- arm9/source/auxspi_core.inc | 7 +- arm9/source/display.cpp | 31 +++--- arm9/source/globals.cpp | 2 +- arm9/source/globals.h | 3 +- arm9/source/hardware.cpp | 98 +++++------------ arm9/source/hardware.h | 2 +- savegame_manager.odt | Bin 27246 -> 27704 bytes 10 files changed, 254 insertions(+), 156 deletions(-) diff --git a/arm9/Makefile b/arm9/Makefile index 8b8266a..75257af 100644 --- a/arm9/Makefile +++ b/arm9/Makefile @@ -41,7 +41,6 @@ LDFLAGS = -specs=ds_arm9.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map) # any extra libraries we wish to link with the project #--------------------------------------------------------------------------------- LIBS := -lfat -ldswifi9 -lnds9 -#LIBS := -lnds9 #--------------------------------------------------------------------------------- # list of directories containing libraries, this must be the top level containing diff --git a/arm9/source/auxspi.cpp b/arm9/source/auxspi.cpp index 036741e..02d98bf 100644 --- a/arm9/source/auxspi.cpp +++ b/arm9/source/auxspi.cpp @@ -68,7 +68,7 @@ uint8 jedec_table(uint32 id) }; } -uint8 type2_size(bool ir = false) +uint8 type2_size(auxspi_extra extra) { static const uint32 offset0 = (8*1024-1); // 8KB static const uint32 offset1 = (2*8*1024-1); // 16KB @@ -76,12 +76,12 @@ uint8 type2_size(bool ir = false) u8 buf2; // +8k data read -> read u8 buf3; // +0k ~data write u8 buf4; // +8k data new comp buf2 - auxspi_read_data(offset0, &buf1, 1, 2, ir); - auxspi_read_data(offset1, &buf2, 1, 2, ir); + auxspi_read_data(offset0, &buf1, 1, 2, extra); + auxspi_read_data(offset1, &buf2, 1, 2, extra); buf3=~buf1; - auxspi_write_data(offset0, &buf3, 1, 2, ir); - auxspi_read_data (offset1, &buf4, 1, 2, ir); - auxspi_write_data(offset0, &buf1, 1, 2, ir); + auxspi_write_data(offset0, &buf3, 1, 2, extra); + auxspi_read_data (offset1, &buf4, 1, 2, extra); + auxspi_write_data(offset0, &buf1, 1, 2, extra); if(buf4!=buf2) // +8k return 0x0d; // 8KB(64kbit) else @@ -90,47 +90,46 @@ uint8 type2_size(bool ir = false) // ======================================================== -uint8 auxspi_save_type(bool ir) +uint8 auxspi_save_type(auxspi_extra extra) { - uint32 jedec = auxspi_save_jedec_id(ir); // 9f - int8 sr = auxspi_save_status_register(ir); // 05 + uint32 jedec = auxspi_save_jedec_id(extra); // 9f + int8 sr = auxspi_save_status_register(extra); // 05 if ((sr & 0xfd) == 0xF0 && (jedec == 0x00ffffff)) return 1; if ((sr & 0xfd) == 0x00 && (jedec == 0x00ffffff)) return 2; if ((sr & 0xfd) == 0x00 && (jedec != 0x00ffffff)) return 3; - // TODO: add support for Band Brothers DX (as soon as I know how) return 0; } -uint32 auxspi_save_size(bool ir) +uint32 auxspi_save_size(auxspi_extra extra) { - return 1 << auxspi_save_size_log_2(ir); + return 1 << auxspi_save_size_log_2(extra); } -uint8 auxspi_save_size_log_2(bool ir) +uint8 auxspi_save_size_log_2(auxspi_extra extra) { - uint8 type = auxspi_save_type(ir); // TESTME: "ir" was missing, should fix recent issues + uint8 type = auxspi_save_type(extra); switch (type) { case 1: return 0x09; // 512 bytes break; case 2: - return type2_size(ir); + return type2_size(extra); break; case 3: - return jedec_table(auxspi_save_jedec_id(ir)); + return jedec_table(auxspi_save_jedec_id(extra)); break; default: return 0; } } -uint32 auxspi_save_jedec_id(bool ir) +uint32 auxspi_save_jedec_id(auxspi_extra extra) { uint32 id = 0; - if (ir) - auxspi_disable_infrared(); + if (extra) + auxspi_disable_extra(extra); auxspi_open(0); auxspi_write(0x9f); id |= auxspi_read() << 16; @@ -141,11 +140,11 @@ uint32 auxspi_save_jedec_id(bool ir) return id; } -uint8 auxspi_save_status_register(bool ir) +uint8 auxspi_save_status_register(auxspi_extra extra) { uint8 sr = 0; - if (ir) - auxspi_disable_infrared(); + if (extra) + auxspi_disable_extra(extra); auxspi_open(0); auxspi_write(0x05); sr = auxspi_read(); @@ -153,15 +152,15 @@ uint8 auxspi_save_status_register(bool ir) return sr; } -void auxspi_read_data(uint32 addr, uint8* buf, uint16 cnt, uint8 type, bool ir) +void auxspi_read_data(uint32 addr, uint8* buf, uint16 cnt, uint8 type, auxspi_extra extra) { if (type == 0) - type = auxspi_save_type(ir); + type = auxspi_save_type(extra); if (type == 0) return; - if (ir) - auxspi_disable_infrared(); + if (extra) + auxspi_disable_extra(extra); auxspi_open(0); auxspi_write(0x03 | ((type == 1) ? addr>>8<<3 : 0)); @@ -183,7 +182,7 @@ void auxspi_read_data(uint32 addr, uint8* buf, uint16 cnt, uint8 type, bool ir) auxspi_close(); } -void auxspi_write_data(uint32 addr, uint8 *buf, uint16 cnt, uint8 type, bool ir) +void auxspi_write_data(uint32 addr, uint8 *buf, uint16 cnt, uint8 type, auxspi_extra extra) { if (type == 0) type = auxspi_save_type(); @@ -200,15 +199,15 @@ void auxspi_write_data(uint32 addr, uint8 *buf, uint16 cnt, uint8 type, bool ir) // we can only write a finite amount of data at once, so we need a separate loop // for multiple passes. while (addr < addr_end) { - if (ir) - auxspi_disable_infrared(); + if (extra) + auxspi_disable_extra(extra); auxspi_open(0); // set WEL (Write Enable Latch) auxspi_write(0x06); auxspi_close_lite(); - if (ir) - auxspi_disable_infrared(); + if (extra) + auxspi_disable_extra(extra); auxspi_open(0); // send initial "write" command if(type == 1) { @@ -233,42 +232,139 @@ void auxspi_write_data(uint32 addr, uint8 *buf, uint16 cnt, uint8 type, bool ir) auxspi_close_lite(); // wait programming to finish - if (ir) - auxspi_disable_infrared(); + if (extra) + auxspi_disable_extra(extra); auxspi_open(0); auxspi_write(5); - do { REG_AUXSPIDATA = 0; auxspi_wait_busy(); } while (REG_AUXSPIDATA & 0x01); // WIP (Write In Progress) ? + auxspi_wait_wip(); auxspi_wait_busy(); auxspi_close(); } } +void auxspi_disable_extra(auxspi_extra extra) +{ + switch (extra) { + case AUXSPI_INFRARED: + auxspi_disable_infrared_core(); + break; + case AUXSPI_BBDX: + // TODO: + auxspi_disable_big_protection(); + break; + case AUXSPI_BLUETOOTH: + // TODO + //auxspi_disable_bluetooth(); + break; + default:; + } +} + void auxspi_disable_infrared() { auxspi_disable_infrared_core(); } -bool auxspi_has_infrared() +void auxspi_disable_big_protection() { - return (slot_1_type == 1); + static bool doonce = false; + if (doonce) + return; + doonce = true; + sysSetBusOwners(true, true); + + auxspi_open(3); + auxspi_write(0xf1); + auxspi_wait_busy(); + auxspi_close_lite(); + + auxspi_open(3); + auxspi_write(0x6); + auxspi_wait_busy(); + auxspi_close_lite(); + + auxspi_open(3); + auxspi_write(0xfa); + auxspi_wait_busy(); + auxspi_write(0x1); + auxspi_wait_busy(); + auxspi_write(0x31); + auxspi_wait_busy(); + auxspi_close(); + // -- + + auxspi_open(3); + auxspi_write(0x14); + auxspi_wait_busy(); + auxspi_close_lite(); + + auxspi_open(3); + auxspi_write(0x6); + auxspi_wait_busy(); + auxspi_close_lite(); + + auxspi_open(3); + auxspi_write(0xf8); + auxspi_wait_busy(); + auxspi_write(0x1); + auxspi_wait_busy(); + auxspi_write(0x0); + auxspi_wait_busy(); + auxspi_close(); + // -- + + auxspi_open(3); + auxspi_write(0xe); + auxspi_wait_busy(); + auxspi_close(); + } -void auxspi_erase(bool ir) +auxspi_extra auxspi_has_extra() { - uint8 type = auxspi_save_type(ir); + sysSetBusOwners(true, true); + + // Trying to read the save size in IR mode will fail on non-IR devices. + // If we have success, it is an IR device. + u8 size2 = auxspi_save_size_log_2(AUXSPI_INFRARED); + if (size2 > 0) + return AUXSPI_INFRARED; + + // It is not an IR game, so maybe it is a regular game. + u8 size1 = auxspi_save_size_log_2(); + if (size1 > 0) + return AUXSPI_DEFAULT; + +#if 0 + // EXPERIMENTAL: verify that flash cards do not answer with the same signature! + // Look for BBDX (which always returns "ff" on every command) + uint32 jedec = auxspi_save_jedec_id(); // 9f + //int8 sr = auxspi_save_status_register(); // 05 + if (jedec == 0x00ffffff) + return AUXSPI_BBDX; +#endif + + // TODO: add support for Pokemon Typing DS (as soon as we figure out how) + + return AUXSPI_FLASH_CARD; +} + +void auxspi_erase(auxspi_extra extra) +{ + uint8 type = auxspi_save_type(extra); if (type == 3) { uint8 size; - size = 1 << (auxspi_save_size_log_2(ir) - 16); + size = 1 << (auxspi_save_size_log_2(extra) - 16); for (int i = 0; i < size; i++) { - if (ir) - auxspi_disable_infrared(); + if (extra) + auxspi_disable_extra(extra); auxspi_open(0); // set WEL (Write Enable Latch) auxspi_write(0x06); auxspi_close_lite(); - if (ir) - auxspi_disable_infrared(); + if (extra) + auxspi_disable_extra(extra); auxspi_open(0); auxspi_write(0xd8); auxspi_write(i); @@ -277,36 +373,36 @@ void auxspi_erase(bool ir) auxspi_close_lite(); // wait for programming to finish - if (ir) - auxspi_disable_infrared(); + if (extra) + auxspi_disable_extra(extra); auxspi_open(0); auxspi_write(5); - do { REG_AUXSPIDATA = 0; auxspi_wait_busy(); } while (REG_AUXSPIDATA & 0x01); // WIP (Write In Progress) ? + auxspi_wait_wip(); auxspi_wait_busy(); auxspi_close(); } } else { - int8 size = 1 << max(0, (auxspi_save_size_log_2(ir) - 15)); + int8 size = 1 << max(0, (auxspi_save_size_log_2(extra) - 15)); memset(data, 0, 0x8000); for (int i = 0; i < size; i++) { - auxspi_write_data(i << 15, data, 0x8000, type, ir); + auxspi_write_data(i << 15, data, 0x8000, type, extra); } } } -void auxspi_erase_sector(u32 sector, bool ir) +void auxspi_erase_sector(u32 sector, auxspi_extra extra) { - uint8 type = auxspi_save_type(ir); + uint8 type = auxspi_save_type(extra); if (type == 3) { - if (ir) - auxspi_disable_infrared(); + if (extra) + auxspi_disable_extra(extra); auxspi_open(0); // set WEL (Write Enable Latch) auxspi_write(0x06); auxspi_close_lite(); - if (ir) - auxspi_disable_infrared(); + if (extra) + auxspi_disable_extra(extra); auxspi_open(0); auxspi_write(0xd8); auxspi_write(sector & 0xff); @@ -315,11 +411,11 @@ void auxspi_erase_sector(u32 sector, bool ir) auxspi_close_lite(); // wait for programming to finish - if (ir) - auxspi_disable_infrared(); + if (extra) + auxspi_disable_extra(extra); auxspi_open(0); auxspi_write(5); - do { REG_AUXSPIDATA = 0; auxspi_wait_busy(); } while (REG_AUXSPIDATA & 0x01); // WIP (Write In Progress) ? + auxspi_wait_wip(); auxspi_wait_busy(); auxspi_close(); } diff --git a/arm9/source/auxspi.h b/arm9/source/auxspi.h index cc41f17..07bb45b 100644 --- a/arm9/source/auxspi.h +++ b/arm9/source/auxspi.h @@ -31,22 +31,52 @@ #include +// This is a handy typedef for nonstandard SPI buses, i.e. games with some +// extra hardware on the cartridge. The following values mean: +// AUXSPI_DEFAULT: A regular game with no exotic hardware. +// AUXSPI_INFRARED: A game with an infrared transceiver. +// Games known to use this hardware: +// - Personal Trainer: Walking (aka Laufrhytmus DS, Walk With Me, ...) +// - Pokemon HeartGold/SoulSilver/Black/White +// AUXSPI_BBDX: A game with what seems to be an extra protection against reading +// out the chip. Exclusively found on Band Brothers DX. +// AUXSPI_BLUETOOTH: A game with a Bluetooth transceiver. The only game using this +// hardware is Pokemon Typing DS. +// +// NOTE: This library does *not* support BBDX (I do have the game, but did not find the +// time to reverse engineer this; besides, a separate homebrew for this game already exists), +// and also *not* BLUETOOTH (the game is Japan-only, and I am from Europe. Plus I can't +// read Japanese. And it is unlikely that this game will ever make it here.) +// +typedef enum { + AUXSPI_DEFAULT, + AUXSPI_INFRARED, + AUXSPI_BBDX, + AUXSPI_BLUETOOTH, + AUXSPI_FLASH_CARD = 999 +} auxspi_extra; -extern bool with_infrared; +// These functions reimplement relevant parts of "card.cpp", in a way that is easier to modify. +uint8 auxspi_save_type(auxspi_extra extra = AUXSPI_DEFAULT); +uint32 auxspi_save_size(auxspi_extra extra = AUXSPI_DEFAULT); +uint8 auxspi_save_size_log_2(auxspi_extra extra = AUXSPI_DEFAULT); +uint32 auxspi_save_jedec_id(auxspi_extra extra = AUXSPI_DEFAULT); +uint8 auxspi_save_status_register(auxspi_extra extra = AUXSPI_DEFAULT); +void auxspi_read_data(uint32 addr, uint8* buf, uint16 cnt, uint8 type = 0,auxspi_extra extra = AUXSPI_DEFAULT); +void auxspi_write_data(uint32 addr, uint8 *buf, uint16 cnt, uint8 type = 0,auxspi_extra extra = AUXSPI_DEFAULT); +void auxspi_erase(auxspi_extra extra = AUXSPI_DEFAULT); +void auxspi_erase_sector(u32 sector, auxspi_extra extra = AUXSPI_DEFAULT); -uint8 auxspi_save_type(bool ir = false); -uint32 auxspi_save_size(bool ir = false); -uint8 auxspi_save_size_log_2(bool ir = false); -uint32 auxspi_save_jedec_id(bool ir = false); -uint8 auxspi_save_status_register(bool ir = false); -void auxspi_read_data(uint32 addr, uint8* buf, uint16 cnt, uint8 type = 0, bool ir = false); -void auxspi_write_data(uint32 addr, uint8 *buf, uint16 cnt, uint8 type = 0, bool ir = false); +// These functions are used to identify exotic hardware. +auxspi_extra auxspi_has_extra(); +//bool auxspi_has_infrared(); + +void auxspi_disable_extra(auxspi_extra extra = AUXSPI_DEFAULT); void auxspi_disable_infrared(); -void auxspi_erase(bool ir = false); -void auxspi_erase_sector(u32 sector, bool ir = false); +void auxspi_disable_big_protection(); -bool auxspi_has_infrared(); - -bool auxspi_is_unknown_type3(); +// The following function returns true if this is a type 3 save (big saves, Flash memory), but +// the JEDEC ID is not known. +bool auxspi_is_unknown_type3(auxspi_extra extra = AUXSPI_DEFAULT); #endif \ No newline at end of file diff --git a/arm9/source/auxspi_core.inc b/arm9/source/auxspi_core.inc index 81ec5af..5dbd6bc 100644 --- a/arm9/source/auxspi_core.inc +++ b/arm9/source/auxspi_core.inc @@ -34,9 +34,14 @@ inline void auxspi_wait_busy() while (REG_AUXSPICNT & 0x80); } +inline void auxspi_wait_wip() +{ + do { REG_AUXSPIDATA = 0; auxspi_wait_busy(); } while (REG_AUXSPIDATA & 0x01); // WIP (Write In Progress) ? +} + inline void auxspi_open(uint8 device) { - REG_AUXSPICNT = 0xa040 | (device & 3) | 3; + REG_AUXSPICNT = 0xa040 | (device & 3); auxspi_wait_busy(); } diff --git a/arm9/source/display.cpp b/arm9/source/display.cpp index 5a80be3..684c05b 100644 --- a/arm9/source/display.cpp +++ b/arm9/source/display.cpp @@ -67,7 +67,6 @@ void displayPrintUpper() { bool gba = (mode == 1); u32 dstype = (mode == 3) ? 1 : 0; - bool ir = (slot_1_type == 1) ? true : false; // print upper screen (background) consoleSelect(&upperScreen); @@ -98,7 +97,7 @@ void displayPrintUpper() // fetch cartridge header (maybe, calling "cardReadHeader" on a FC messes with libfat!) sNDSHeader nds; - if (slot_1_type != 2) + if (slot_1_type != AUXSPI_FLASH_CARD) cardReadHeader((uint8*)&nds); char name[MAXPATHLEN]; @@ -136,7 +135,7 @@ void displayPrintUpper() // 1) The cart id. consoleSetWindow(&upperScreen, 10, 3, 22, 1); sprintf(&name[0], "----"); - if (slot_1_type == 2) { + if (slot_1_type == AUXSPI_FLASH_CARD) { sprintf(&name[0], "Flash Card"); } else { memcpy(&name[0], &nds.gameCode[0], 4); @@ -148,7 +147,7 @@ void displayPrintUpper() // 2) The cart name. consoleSetWindow(&upperScreen, 10, 4, 22, 1); sprintf(&name[0], "----"); - if (slot_1_type == 2) { + if (slot_1_type == AUXSPI_FLASH_CARD) { sprintf(&name[0], "Flash Card"); } else { memcpy(&name[0], &nds.gameTitle[0], 12); @@ -160,11 +159,11 @@ void displayPrintUpper() // 3) The save type consoleSetWindow(&upperScreen, 10, 5, 22, 1); sprintf(&name[0], "----"); - if (slot_1_type == 2) { + if (slot_1_type == AUXSPI_FLASH_CARD) { sprintf(&name[0], "Flash Card"); } else { - uint8 type = auxspi_save_type(ir); - uint8 size = auxspi_save_size_log_2(ir); + uint8 type = auxspi_save_type(slot_1_type); + uint8 size = auxspi_save_size_log_2(slot_1_type); switch (type) { case 1: sprintf(&name[0], "Eeprom (%i Bytes)", size); @@ -174,7 +173,7 @@ void displayPrintUpper() break; case 3: if (size == 0) - sprintf(&name[0], "Flash (ID:%x)", auxspi_save_jedec_id(ir)); + sprintf(&name[0], "Flash (ID:%x)", auxspi_save_jedec_id(slot_1_type)); else sprintf(&name[0], "Flash (%i kB)", 1 << (size - 10)); break; @@ -190,10 +189,18 @@ void displayPrintUpper() consoleSetWindow(&upperScreen, 10, 6, 22, 1); consoleClear(); memset(&name[0], 0, MAXPATHLEN); - if (slot_1_type == 1) { - sprintf(&name[0], "Infrared"); - } else { - sprintf(&name[0], "----"); + switch (slot_1_type) { + case AUXSPI_INFRARED: + sprintf(&name[0], "Infrared"); + break; + case AUXSPI_BBDX: + sprintf(name, "XXL"); + break; + case AUXSPI_BLUETOOTH: + sprintf(name, "Bluetooth"); + break; + default: + sprintf(&name[0], "----"); } iprintf("%s", name); diff --git a/arm9/source/globals.cpp b/arm9/source/globals.cpp index aeff760..90c8d85 100644 --- a/arm9/source/globals.cpp +++ b/arm9/source/globals.cpp @@ -28,7 +28,7 @@ u8 *data; u32 size_buf; -u32 slot_1_type = ~0; +auxspi_extra slot_1_type = AUXSPI_FLASH_CARD; char ftp_ip[16] = "ftp_ip"; char ftp_user[64] = "ftp_user"; diff --git a/arm9/source/globals.h b/arm9/source/globals.h index 85bcbd5..eac3f52 100644 --- a/arm9/source/globals.h +++ b/arm9/source/globals.h @@ -27,11 +27,12 @@ #define GLOBALS_H #include +#include "auxspi.h" extern u8 *data; extern u32 size_buf; -extern u32 slot_1_type; +extern auxspi_extra slot_1_type; extern char ftp_ip[16]; extern char ftp_user[64]; diff --git a/arm9/source/hardware.cpp b/arm9/source/hardware.cpp index d184f6d..39c5e99 100644 --- a/arm9/source/hardware.cpp +++ b/arm9/source/hardware.cpp @@ -80,9 +80,9 @@ bool swap_cart() while (!swap) { if (keysCurrent() & KEY_A) { // identify hardware - slot_1_type = get_slot1_type(); + slot_1_type = auxspi_has_extra(); // don't try to dump a flash card - if (slot_1_type == 2) + if (slot_1_type == AUXSPI_FLASH_CARD) continue; sysSetBusOwners(true, true); @@ -102,37 +102,6 @@ bool swap_cart() return true; } -u32 get_slot1_type() -{ - sysSetBusOwners(true, true); - - // Trying to read the save size in IR mode will fail on non-IR devices. - // If we have success, it is an IR device. - u8 size2 = auxspi_save_size_log_2(true); - if (size2 > 0) - return 1; - - // It is not an IR game, so maybe it is a regular game. - u8 size1 = auxspi_save_size_log_2(false); - if (size1 > 0) - return 0; - - // No save size test returned a save chip, so it must be a flash card, - // or a type 3 save with an unknown JEDEC ID. Unfortunately, due to - // different behaviour of flash cards, we can't test for this case, - // or the flash card may be recognised as "type 3 game". - /* - u32 id2 = auxspi_save_jedec_id(true); - u32 id1 = auxspi_save_jedec_id(false); - if (id2 != 0x00ffffff) - return 1; - if (id1 != 0x00ffffff) - return 0; - */ - - return 2; -} - bool swap_card_game(uint32 size) { return false; @@ -195,8 +164,8 @@ bool hwDetectSlot2DLDI() // This function is called on boot; it detects the hardware configuration and selects the mode. u32 hwDetect() { - // Identify Slot 1 devide. This is used by pretty much everything. - slot_1_type = get_slot1_type(); + // Identify Slot 1 device. This is used by pretty much everything. + slot_1_type = auxspi_has_extra(); // First, look for a DSi running in DSi mode. if (isDsi()) { @@ -294,10 +263,9 @@ void hwBackup3in1() swap_cart(); displayPrintUpper(); - bool ir = (slot_1_type == 1) ? true : false; - uint8 size = auxspi_save_size_log_2(ir); + uint8 size = auxspi_save_size_log_2(slot_1_type); int size_blocks = 1 << max(0, (int8(size) - 18)); // ... in units of 0x40000 bytes - that's 256 kB - uint8 type = auxspi_save_type(ir); + uint8 type = auxspi_save_type(slot_1_type); displayMessage2F(STR_HW_3IN1_FORMAT_NOR); hwFormatNor(0, size_blocks+1); @@ -314,7 +282,7 @@ void hwBackup3in1() for (int i = 0; i < size_blocks; i++) { displayProgressBar(i+1, size_blocks); - auxspi_read_data(i << 15, data, LEN, type, ir); + auxspi_read_data(i << 15, data, LEN, type, slot_1_type); uint32 ime = hwGrab3in1(); SetSerialMode(); WriteNorFlash((i << 15) + pitch, data, LEN); @@ -462,25 +430,22 @@ void hwRestore3in1() void hwRestore3in1_b(uint32 size_file) { - bool ir = (slot_1_type == 1) ? true : false; - // Third, swap in a new game - uint32 size = auxspi_save_size_log_2(ir); + uint32 size = auxspi_save_size_log_2(slot_1_type); while ((size_file < size) || (slot_1_type == 2)) { if (slot_1_type == 2) displayMessage2F(STR_HW_SWAP_CARD); else if (size_file < size) displayMessage2F(STR_HW_WRONG_GAME); swap_cart(); - ir = (slot_1_type == 1) ? true : false; - size = auxspi_save_size_log_2(ir); + size = auxspi_save_size_log_2(slot_1_type); } displayPrintUpper(); - uint8 type = auxspi_save_type(ir); + uint8 type = auxspi_save_type(slot_1_type); if (type == 3) { displayMessage2F(STR_HW_FORMAT_GAME); - auxspi_erase(ir); + auxspi_erase(slot_1_type); } // And finally, write the save! @@ -508,7 +473,7 @@ void hwRestore3in1_b(uint32 size_file) uint32 ime = hwGrab3in1(); ReadNorFlash(data, (i << shift) + pitch, LEN); hwRelease3in1(ime); - auxspi_write_data(i << shift, data, LEN, type, ir); + auxspi_write_data(i << shift, data, LEN, type, slot_1_type); } displayProgressBar(1, 1); @@ -519,10 +484,9 @@ void hwRestore3in1_b(uint32 size_file) // ------------------------------------------------------------ void hwErase() { - bool ir = (slot_1_type == 1) ? true : false; displayMessage2F(STR_HW_WARN_DELETE); while (!(keysCurrent() & (KEY_UP | KEY_R | KEY_Y))) {}; - auxspi_erase(ir); + auxspi_erase(slot_1_type); } // -------------------------------------------------------- @@ -533,9 +497,8 @@ void hwBackupSlot2() swap_cart(); displayPrintUpper(); - bool ir = (slot_1_type == 1) ? true : false; - uint32 size = auxspi_save_size_log_2(ir); - uint8 type = auxspi_save_type(ir); + uint32 size = auxspi_save_size_log_2(slot_1_type); + uint8 type = auxspi_save_type(slot_1_type); // just select a filename, no extra work required! char path[256]; @@ -572,7 +535,7 @@ void hwBackupSlot2() u32 LEN = min(1 << size, 0x100); for (u32 i = 0; i < size_blocks; i++) { displayProgressBar(i+1, size_blocks); - auxspi_read_data(i << 8, data, LEN, type, ir); + auxspi_read_data(i << 8, data, LEN, type, slot_1_type); fwrite(data, 1, LEN, file); } fclose(file); @@ -585,9 +548,8 @@ void hwRestoreSlot2() { // First, swap in a new game swap_cart(); - bool ir = (slot_1_type == 1) ? true : false; - uint32 size = auxspi_save_size_log_2(ir); - uint8 type = auxspi_save_type(ir); + uint32 size = auxspi_save_size_log_2(slot_1_type); + uint8 type = auxspi_save_type(slot_1_type); displayPrintUpper(); // second, select a save file @@ -610,7 +572,7 @@ void hwRestoreSlot2() // 2a, format game if required if (type == 3) { displayMessage2F(STR_HW_FORMAT_GAME); - auxspi_erase(ir); + auxspi_erase(slot_1_type); } // and third, write save @@ -637,7 +599,7 @@ void hwRestoreSlot2() displayProgressBar(i+1, num_blocks); fread(data, 1, LEN, file); sysSetBusOwners(true, true); - auxspi_write_data(i << shift, data, LEN, type, ir); + auxspi_write_data(i << shift, data, LEN, type, slot_1_type); } fclose(file); @@ -656,11 +618,10 @@ void hwBackupFTP(bool dlp) // First: swap card if (!dlp) swap_cart(); - bool ir = (slot_1_type == 1) ? true : false; displayPrintUpper(); - uint8 size = auxspi_save_size_log_2(ir); + uint8 size = auxspi_save_size_log_2(slot_1_type); int size_blocks = 1 << max(0, (int8(size) - 18)); // ... in units of 0x40000 bytes - that's 256 kB - uint8 type = auxspi_save_type(ir); + uint8 type = auxspi_save_type(slot_1_type); if (size < 15) size_blocks = 1; else @@ -735,7 +696,7 @@ void hwBackupFTP(bool dlp) int num_ftp_blocks = 1 << (size - 9); for (int i = 0; i < num_ftp_blocks; i++) { displayProgressBar(i+1, num_ftp_blocks); - auxspi_read_data(i << 9, (u8*)&data[0], length, type, ir); + auxspi_read_data(i << 9, (u8*)&data[0], length, type, slot_1_type); u32 out = 0; while (out < length) { u32 delta = FtpWrite((u8*)&data[out], length-out, ndata); @@ -767,7 +728,7 @@ void hwBackupFTP(bool dlp) } // an internal function used to read big files from the FTP server -bool hwRestoreFTPPartial(u32 ofs, u32 size, u32 type, netbuf *ndata, bool ir) +bool hwRestoreFTPPartial(u32 ofs, u32 size, u32 type, netbuf *ndata) { int num_blocks_ftp = 1 << (size - 9); u8 *pdata = data; @@ -808,14 +769,14 @@ bool hwRestoreFTPPartial(u32 ofs, u32 size, u32 type, netbuf *ndata, bool ir) u32 num = max(u32(0), size-16); for (int i = 0; i < (1 << num); i++) { displayProgressBar(i+1, 1 << num); - auxspi_erase_sector(sector+i, ir); + auxspi_erase_sector(sector+i, slot_1_type); } displayProgressBar(0,0); } displayMessage2F(STR_HW_WRITE_GAME); for (int i = 0; i < (1 << (size - shift)); i++) { displayProgressBar(i+1, 1 << (size - shift)); - auxspi_write_data(ofs + (i << shift), ((u8*)data)+(i<zljouQ`9JR-Ij1 zr*=JiKYO3cdC=BnP(&qJa0m<#5Eu{;<*dPYL>cgZMWR0_X}lN4f2#2bV*hQq0wqoC z`3VRAKZO4ymBKCV zuWn-Z%h~LgGlRRW%>w_M>fUI2&z8aL#1Fmn!C26riFCh>B5~7j>+eX?v|O)Ftz=VH zU7@wAe#qh+)%08~RHZP({~XoRqhW_{p8t4w^5pZAM-}f{!(W3uh}8pR|=mt>b*6!sgPQ9=J`0byDEXs-!GJ^f%WYQlx3# zhEW#LstWdJ)xh(K=xU^(!vhU)e|B&G?pkGcHqsq6?Yb#X5xbR66tgu|Zu+vEdZQ&| z_5M09@OYq;id>9U+f9|YS}E-C`}gka!c=GV1TZjb(WZ-(3N5NLDdDx{^RyAxjR;b* z(^g;R=t(0h$+Og&j(>spB=NZtT%9=5A38luf;nlNUm;mQQI^Q7=EB(^=`=WbPBdS5 zSLn%RH#4AjOJo{Lc_ob1(;;>G!q4_Has1s|`pf%$=2oQ1{apXq2KtAk*|;QeVouCf z3$O^KbOVW{1m^ZN6q)+{li$o^v&}^jodR^Nv5YZWadpPa3lRF3JyAwUfW{_rljuoDz&*T?NQM4skdBtf;?3^i)?; zkof`EYx8_^Um_VdOTXa`h-EK9Ghfu^<>{c6!&~b?9H|Y5o`Hirm&y^+sXSL}C(e!= zI2&y4y=loP2G}sHf2d0`2GSBFWT3&Awh%cd*(oB5ns$-~C_mi!(XA)M^@YZYGXT?b zPT)a1j&>}u6G*K&*T*LPKr&}}8S^>5%H&=7>^9h6ku_oZ3wvxc2CV6bSS!u@pl1b_ z|60IsrcBYZjA8r4c!1|CK55aX=aB$tE#Q&ey9-Qb@S`KyPp(`NP|o0iWOq+g3voXL zor&40^9C3CynAbLmEBv{u+=k_2C5fusH(a%HzJcRO=5e)b=tHUyP;U}PP_I$UpFM5 z>hip^*_y;R6`>mywiRDnz|UUvmu3Cv5^2(ZNOM0K^ge(y zPiEO0=hH&8Q4RcE2F;CQ!Nis8ePTVlp_R>vvQpq@_ZIu z?{Y+YtY+~2Q=byY;DR7J5%`VkoiAhyMo#lE7rFC!T~w*Q*(0Q381uu{wwi+0aPo5k%aNRQ{fs2Wd8y6A9iFvUGVIk@V1+2&Z9a^0GS z#$gq1R~O%v_w(gL-RX{CKy82d+}vH{G%@r;`TS0u1CmHRG0@eV@^Js+3*&?6a#0P3*#SD%@M}%y#YOY^Om$m|FubM}pZCOiKYpfa&iHs2L z48;v0!2}tiGz#~;=veL2&HpD=|Bu?wS;=?rG6HmA&kR zJ!42AzYJ$~C&237TQhLeUo^Ap?fzx=-c&Cor`q*#J~mhni$oEL#9i~M@$L=B3PH*t5>o1C0q5R%<4O{~I>~)-6*PI_X zQpD9l-=sa|qT_TN)RdPC>JTK$JqZ-JR8Y{qo3H&H6;nf7yBrf~EF0x#g^bXC?-N z%mp3d%;(({V{LNrKuFA2AyMdiTL^P`bV3lvDdjEPKwdJvLsm|Jxze&#IMz)OnG&M`T?Kno(yMJmmt zKg%VOF$jcx6K={i#*MAK!D6mtFHfbtpbCDOE!;MQ8r`VQM4R-H&^3P5FH_c^Y=)GO z8O7D=gC88D^pzb-y(F?(M?UQSS${BAf?xvaB!N*Vfs;f?$zv3PWm>zxXOh=QLD-T8 za4Se*tObp|kFRI!ctcCc;$mDbw|B>O_C%^g=u_Yu)_VZ=bVXv%_^}nZFRKUu| zG5Zm(9(GW#bA=<~bd*#a5F4ScE2*W8QD(J%#$gIk`{^$IVbW)kj+v$U&XI^AS8K8| zhzY#Hor7Co26I1=RrOVZMjI|Ar9vVgyDeZQzsF6K#0`KW zh}y%R`$0b@Xeb=1Lc!<3#3UM2WZt9j#TG(TJEK)(8Iaq; zFbszUij~j?iQm#rArNrzBDvdN#C)Q@aLg;;LJQSbHn)#<2nS_X)o^+Ss#TS+ae?xw zA)4jyo?CS|nPp}w^DsYt=8zQd&pbnFYpazqhCmNscbryHN1>l-HqDMJWd*1f%nYSZ zig)Ct|4AJiZ;C++Bu7Fs89$ENpoH^WZOEIcC(85-4{18&Ffa6%Ap;}Zj$obIS$Kzy z0_28+D#Kh0%G!b-SWPjm!B`Ov!+@a+<5`SieSU242(1&SuY!V)JiN0EzO+$ji*Z{I zr$7@Ne9hYGf*ippB!%IvQpIy62yx5`pi;Jd8SSmR{&@P{~{Y z55zs}&7YgnK~EK8djsE`-VvRk%YP>E8nOo#DQ+uX&vn5!GFh69P=Y%LhXAK}MgFmS zMSWj;Vbx$wK?$k;D)n>nv`@bAbCldv4sqT=k$>XL)?B2V#(0kF`Xue~R?ofaNAW5U z7=*r3GKV<#2^F-u<9_uysj=!MDpb)p+X-3sG4~c-t1v;!e(P)9`A(0{@lr_s>elHe zaH6Zr?XFeYB3E^3Z0t3zF9Cp})+gVg?uzPTn!VmZK<4d{e-m@G>K%i&uF=tDB^B11 zHPkGMlRXg|u*A^K1x zlYetcfh?7FzUClQc!wxp7!;Gtw~7de zoeybmwfv?I77HbaXmO-(onaf_VCB;g5LXO=k-53tNs0l%JtFSLJx)Sqr)JQn)g#(e z)M^2N4|Wal#vn;fjMXggp}1I=I-BGDb-Q0Lrbbe70t1O zuO^AQ+@?oerrwmbdjlNm#DY1QKkk_Y6yNnvuh%1+24?4W+ zRjgH<_#%r~Z9!r_dAAzDmBYLmHNTTlT+}g`;>9~A7)zy9Q8ky ze)BBVC`8(TWOTf;bA02KoURSaWaM6b%so!6_3yCWpi06oSG*P}{1eW03~JKX#IjA` zAi+@aC;C~>`d&NMf?AhdJcBbmX0EI=pa7w%EDbd7$D)sEo!$ekxDJL2$4#n$}Z4R zY*!_1FQWw(F#au%=qB@E!h`qtxeU46+OA(F4!)%v5mdFQZ-XiF%f}k>8rNVi>b+^P z$PIWH(n8pr*Jh%Ku*alKl?EGJbW`CbVIeD9HxWYR=9j&-C0i20k70}v4A?SQa+m29 zRrk;8xF^4eXEdLKPh07A)KFO2NeSoXLr{ibV#}N^N|xZi<)!(0(G3nvqweZ?fyfq% z#_M;SVRpKD2MI7TYgRhS%#&Ot?ZUEw^#d@q5*<&{fEc*Z!iD_ngf%*lEW-@v-y?KP zf#ZmI^P&x9NeG1`%ws`0W&1XsLO5@I1`K*#O5n+6-Un9|yK9Rw{^^cAJG=masZtGk43O6| zf%lKU#7;DZ^bzf4Ku}_=D(ph07Cc^?A^yWokEqR0k~^Oz#EI% zPrdDIr?&>jsv+(KOM6ncOfudUU3>_z>90|2S`M(5-A_Kpg(!CurGW_JnNYvzq zC&#Xx-n5Ci=8Sg1czr9mk`vY#>oTzk2k1#k(-z5V@pXb8c@LHT=u6EaC37y03%RWt zL!EW}aEIjS6P&~tPgh2!PzH`PPG;+L*`Sz$=u=273BPN= zcb)7=(LXl9`tMtxwtz&hGJxqe*s+vg0@y7{O8;&aocd)iM~c2goafDi8dFmIp3`-4 zK5p&pU@@n9%{evoQMT!r^^ODs1IlN>{k4rRLjC2MX_jReSdTjvxNY?@k{9~By?N+WSh!^~geKIK1Q7ch^$T8s2b%m^ z*d!rZu!H%>hT)Tt%JfHg?e~H&D$j^etg?|N@K=*bjj6&c+YkZ+W9d=rS($h2sjAgx zWT~h>gwEG8V^`bTx*G6%Got@04kbFdLT$wnj_r<_lNDgkv`1R|yE5f)gmV+p5OvRg zzccU9kTh3>*Ms=j10!ZW%g)Ls;o#;B_dCJbAEydhxyHoE*VSVtDS-!LG74liAw;l? z?5&?8kA;*aLIv1l+7`3(DcMgIAm;cvx6oKZPf*DtcP-8vbv7HmbSEF+`hD9_(X`r_ zR?>4AUwdMGU{PuZrE-G)as8o7@?GqW@r(C_BxlL1&A!E~fNIUq@t~sGR=LZ*) zS+5o-n*a2nR&2WTsCb49SlZWC{`I+KPU?Vss^qYk;x?$eK}XK%O3#muO_r8Eb5 zP%pv=FnQc}V7ZAKne;97;r-^O?euy&@CMHw&RVw8xybOBm>Z8nV>=d^*o`~Ld@qKU znYvz9_Fj}v)2@gQBU$EqeTVHDwEPEnQ@l^-hEbG)2o7_#?WvV&>sDxuZ} zDgG=^ZIB|~WS{JCWe*RnE@I~_^5Q^B<8q-^FwrO@u(w3u!OKEFFM0$`F3Ktc;mx`1 zT^lk@@7G8wX4;B-f&Rlhp?M`8)_)^GC~_u5`Nabz;kRA4x|Ue@h>RYYW{`0CN}2Po zw^LAdUyz)e@8G`i{q2Hir<75W7<-%9Y+3+xJYSPLHb9Z7Wdll za%s~G0ZGbW=AcF_O^Lx-&JvEFgkB2QnOmxl^l__RglgkbA}RVj{<4PnIhfaDkm)4x z8^K_rF8ZMPGx39_0S|Nu8{6KQa|w;7q|=7Z>%vt9y+5e5)6x2Et~fjqScQVzA5NU2 zYUHypTQkKx2*8!jixVIpc?F9wn}{GOrUvx_@;=^czX*Oc+_D? z<69&oGh0fTg02l;crrY5=n}f|kU*8^tvpA(9acf_m96Y%zOQaJnNFvd^klfO!17g1 z0plWYBuP-p9=o_fda0gZR_%+0*NsnET9ayg{F5yI!L-QfE((}n@#CPa8)kfXKIU^_j5!7elvWe! zKTN`(g|eci6@(V0Hr>{4spz)m23C|Ffe&YvLt?V51}xQC+QtNr`MBT={9Lcl)1ZnF z_RL?lIevbJn4X$- zDbr~%^$uwXS3F}gu3OySOqZ8W$tMdINSj{6M15`9`F&}|%ym{9x`T2!n>M6<(wH20 zrAmcaJy1V>C9Jpn9K?dHz2|3T!`wBc1B>c3Y7#Eaq7X&}{%)`H{&sCI2TG3<{WOBQ zH2nCthNxA^>CGGRV4Wy;%M*vNo?BX$mlu?BwcB{ZIcHTI@XA~KEG{cWe#{+xPyB|# zCb?NpY@4?^1>F$TxUlikYTpO);*>Hx+?iRY{P98{pnqFygdB8DxqWMTe?&!wDqWq5 z!Y{#!yD#VnAW}_`Te)))0`fm0FXR1Lf8AZj98Dkj5CulS?Xrmq`LcK^vra(ZmdDP6 z^!ISW((ti+?E0nM)jG_^Ri`YuqzE3>ri=m$V-A46VphPuvzn5MY4U+3PJ&ky}21A+8PuB5nMBLE^RH@{S%6Wz)zxH7<3m9QnsV zKZap=CtWR{BHLp~oXicZxuUXxnjU|_yf^;RYXQ=FRZ*yDpGB|&i?F~*afNV3(qMQN zRzI9|7>=5~ih0$+bv7HW01d5btkM;--?d;E?C>?Fr@Mz_-QVKTjPx z{xHiaB@Z{ee&ccu^CKnk+#YjCl$jqvx4(udr;~XFaLO44&M;O%o0HcRxdIgNBw5JP zup=D;=5lv2ad4%rEcyo&mU1F%l-mkc=i1oIIw5!FuK@NsLb!s?;%4eA5ZM4f{Qdm; zh9r-&mVEkhV?p8IRZq(S^>te9U|MF8x`pW|hgdqF0D2wax`}8OBZ}7-s@9U{xV3}} zdLo8$3xzP0$oiizjy*@D9Mn(LpJq@-?kZ-a=O%AxIS zHSCw1$`3E%PxrdBlkExI%B@z}OlbL{;PslBEWlK7FD%;O@@;5r@4Q`2#S+^|66d)0 zSVW<0cn#^aId-=UJUR;DmhWAQBkIY1lcY@OLRl*hgt4X16HFksLNYP`n&Bvy>HGd& zuz>S{_907W%as4}F*FY}FX61!(PHc&Y5n@E8i_%Y;pfVDQY}_jjvaq_%}~IUS;Qn&6Hj8>O+ZmK)CJPcD#BF#UYEmx zcaefQE82HEIR<;V;?>Q}&Ib=~1SwsXg(f?*NAT^bt&@Iq1kyeV)XGGwWjjQxc>qeF ze24NJEIB5Bo`Is5eX2V# z4tOP_>z2&!y20t(n&Tnz6$=#H7XVJB%fdQ~Imj#dy9Wl{)92uKAks&4{93~nWH|T% z&9o-b-WeCqC-{!AuBdwhbb6}0DAlBW{eZLvl~Ntc>Axq%cLd0UXQ zi9j`eQ{Lu7s@M|-!v|$-M8)<{)4-f#(kt-P2W+vXzMtOxe?qu@vZrE8N+^<8G}eh3 zvZTmxmLs`HI~d6caV`CQnvc3A9s9;WD7!ctgfmuY61B3qw!(eV+rNLxmEDBr4_y!Q z{nnqr^h;p4I|nr?B^ykq@d3(W67g{jMxU6q7C{Qsv11;VZUPDn` zTzm;0pj_gesWY)D{M(TWTA%Cq4lnh0MN)zzcILJ79K>=pJFY^zi<9V?a*A$1XNJE5 zz;~U|kqyHWSNZokLM4k{cS05rlBqY$&KbR|?{@gq9`IHOrPIxKrU0?+&xeuW<}FVG zvoU4^8!@4^F&7eo5A3Wr$s4(guDXlbWL-TdxdlANPKr@C@i%TRV8Y}Y~?ILS8bNbh_!#V_DD#NVpWp4Rp zO_80lClWoZaO3rg+<-zhZo0J!3cAXDmFu~Dn1Gf)7UXjM>~hqovtA7-Rok`_As>^r;{Qk_i0_<+U3L^& zUt%As8m@jjKNlskb*5dxe-li9H0CJ4IY5i120M_>2KqZnp#kFPeHQ*N<3E`3jPMYC zV2egCErx6LP2hUe&4@E}b7SZFm>%&%yYrn#8OOvNf;8jG-Ax^n^MWmV2(QHiCQrR< zE-E@3WuF!$53%r!b3aq-7$|lkj&W?3d0=jptpsGRYWY8z2?U2|Bn29r1X-k`h`eLU z)fh~4?|gPsH2~AhD)=ekwX!KcSdRCp-Fs%<%svJB0_L!AOhLFQR_K+>Is3+~S&P1| zB-Z~DJ}2tXk%IK=!i4A+BBih(`#|wfFB1k;I#PYG&eW)+pR5Cxmm!2Wk8_R01|(St zNR|VUwTO;{2KX{d)m2;;uc>fOrYe^1ArG{&_$dxK{Qxxa)qP3bVoy6)2j7Ffd+S#9 zg`|p!VA}}21gq2cKs+_6csxX2}lf#lT4HcAp`B4ZKj-hIx|w)TGptl5o;t1mvN-?c(B zLV!#JeFG2748dU1)j}E+uBw-x6}HnZn3q-1JG(4*hiCKozYprbgPSbKAi1d9jB-}$Ne(Ji}leG;oCuk@Ne-&swQ`@ zW4`DMQ7CyzDqvP!t!dC;+FL6!tMN}livd063q_a=#v4URZWknqYDJ>&mPN-B0qb(* zWOA@}cS~FdKbuYzJsN4jDgAUcVlao%H3Sef6)lb}>3gIbd#%lt@gt!H{9&w>?y6w+ z@#L-L)c?gyO9&GR0BI5QIieUu(;g1?UJf-uV|W_9%Jg|>c@cA%69>Momh_S*S0Lsy z$_)YiWq$3U`3C7-Ac=34D$>R8?SL3nsvb^#+->;6L)i@L6?#nS8wa&i(yi4 zwGms(?K1ZMX?CLPz&k6XYVocrD~cO&HP^akO0ZmC%Ft~?u5#4h=^Hrr+@R6Q3cXK7 zZfhR~h&@u{oRX^R{T9_Lxb}tJJ7r6g#M8UcdchZ{k}NdLJKPB;*>?~SEjJL5|0gjB z=0Ax+4g2Kyp#MqQX#k_FghBjI){dN1K}0142uNi^2crxa1hYIlb0Q22BPd%U7mFVX z2R##;8VfTI8w(FB8v`4A;wZ})2`e+(HxgSjXCodH3nND(6K69=dJ{XBU(WpBn7P=P z*b?hlr;z?Lw)}+Jl`bs^h%RknG@CF$`(0X0Sj|22LT|c)aAdYhXnPDT#RPJ#o=HTr zUxdWI5L&{*(j4)HSB+KiRTux$N5U%|gVWLD{r#W$tm^V=o`->}p07nTvN?DX~d;dC^W=l^y8dRAjMAeAljuWQ4!fY;sO zBtGY__nTPY{eTgGb#U;0IY^~c%zl5{`nu%Z0=|6C*O!-Dy`C3Ym~x<34E_j>mz8bin{0ek&HsgSu1Lc*|oxPspd#(sOVVxH4=5B!z=L>BOV zt_6Hf%SztwfUmc$i?x;~r@MtoLneN0Gq>;gW9^ zbnUp0a~XDr5%YrVzRUn0NQo>uDVfVr_4?a^GU;ncm8T-W^aR{Za!&KzMP079*yZ4{ zD-kgpJabSY5$Fq^hFts`y47JvyF_psS@2zH5^khQr=|Pz)q3lBHr97PV7I)2Hkko& zaV+Tf;O2HkP4{XKAcze6ZK1Y8={qq4=r8tOO&4K*l->x?_jmw!+HhOMW&fPI=7jbQ zJ_g~N38v@_#dAfr+6RY{H45;PoOn%#%vqkRZK)-HwL}jdf%;#o6m*f_-TM0E#1;cN z#@#uHm&X(&Se0H0qNXKZ@q?p$EgtyOz?P(3meY>X>izsZ&uIg4sO4&_$1W?kHU9Rm zEMr@~=fCd@Obfh4F}T`6(Juh`4`;7%p1t1)_|AOi&uV&*)}ReOCGmlpoCj(~D#;=VldnskLWX8b#doz5X5g zmxtK`$%_MKNcP*hhD$nzSLAOn26vtEVhslWCw;(sdA^-s-07^JR3_9-QSBwncZJAk zLW$$|$9qwV?bk5yae28t2t_7tZ+$liy*rxjm?7Y@-@ZSY)2IRT9}pY)9Cm}Q+|o4- z4BTGqVMQCxmTCk)?&o~n8^qm6PY(ha{lE#k-!6G=o)v&c24-4X+Qlxx&%2y20zP+? z&0m7!YrRz`_?zd?H+zd6s`#$>G!Mu;iVKnBF9E#lm+Ksi$xTtk{Qku`9REwl@m}n~ zO_`p*AF+c1FwbdQ+PJ#$$h;qCM>#;X`JcY~#Q;Hy0+vsVK4MLe&`J`%4O^7dY@fGB ztrj*rpWe``ydP00h*X6Zdmn~^?ILQ>t}GJ!1IU61wz@3~$B6`TTTFzqVPA%(Art-+ zp^;!{&L60+zrg_q#1o+~sK;DHdL6`DlFn!fBkSJ)iVs@AiGll0aJa@2(}Hi^r10sY zR{3*scYSRhDc-4~SCJ@}a#{n_8k-GaN=?p`x97l``6I~nhAsgvQAfTnA-1)OnlGXOAifG_86wb793VmXB+Wv_ZX_4D* z5coP6!Zy&=(V0l};gKLsJ#bf6n_?VIWR-Th-MQTAG1xF$q-5!vv?8S6D3VRxOx)*T z1)WU9;iUx5$p-2BaS7vKdmsn{H>1h(v$yWp$j`_laRh%!^_ptPI%eB2O%P3~_QjGBLb`T3k2)S{&@3;r* zoa8T*pXz!VccMZp1^(eCJV7opAYa7G+^Y0A5Ys@iYP-W}=d)y~cj$nqr{|(C(`p?& z0w>Lxrf1#VGfrxL@%&kd`-Bm)YF$;1Kvn8lE!R;4%i=<5R%;jmw<8(dl-5(qqaus4 z|LMG-j|@^G{4at9?3r96*AY30dRjigsYMEO?$6?RL6omzRvz>b_NDb675E#Xxa^p8 zNIW6fD;%Uyo`dMXgrJ*Hd~rya2t40_n4x&3hCcZLnB+25*k=ArZmpbQeEX zHvc7^!ecXR3+Pbdy3Yxb46Ef^&5ug%B*&EbDB1N&2#e#WS&tvlGimJDGYRAhOFd6* zFFS^Q;ss{!+jTH!FZLV8sR|tRc-Uml_;32Y*`8goj#L(`Vm`v7{+t6|mNseBLWP?Q zXPo@pkbMI@_)yh&$5(b(kqxl=ee^xQ#G<`tsFq3zTzu`bi*x*{keef6Wytg$i zknJOK$$vIRMSX}Pt?#e2%0g0-H5;!W-MZ&&yZ-}Mdt`1FL(z2mVV_ zV;wQlUw`1Tu+EvEBK})Zb9cAz={$8&Ga#-da;852Yoi^KGraoDv&HRdv&&&`I8QWG z|DQthx?LJpRmW2*igkJSMv5m`dkR+F6=`EkyFL;1nd}5DP@T0Z&(N z4PsKsf_9bmf2+m}nbcul+XEkb<@mS}Gj3CIv2L^L{zfloJ0Igq#t__aTzeT`B<+MS zP{B~G{KLde+~=`olJe6rVSa!m%Mhkaq)|8qf>pYAUhqcqJ}DYP-b~Q)m^jyf{n;G< zv=-t6Bi8gR1qI*rzc_8gdk&=9&$ALfyU^{{+nncqMP!uS1px_(bDV|@%rI52J2JDFlT=Xc0j$t#hD$d;TT$YQgBpY`orcQH`Ny*|3RkxpfC4uVD#;3G?mwzM?KGJEK#5p&5WFvkyD#=aZMe15|3Rsqsn?Fx zO86+tM1F0}aL3AeK=zx=L_&s&D~Z(%ijhV))g_N6(1SCOu--m}+?HQ0DA+%wjuek# zZu@u%g(vZi(O?zhJne%8cq43#!h-uz7HPc_qADkR@V?ssH1){7v^&vdLp8u z9xFdg|1%hwTGlx3Jg0+-DUFa>YjHcYOMC^CODhd5H+W}=X_CJ8%+ACPW6=Ik%d-`# z6VZ>eBe8~}mZ;t$WnXb)X~9>nnCD-qvWg^y!265hn9+q!#;;lR%6;H^#XWyyJ|K*A zFvBj91@*pWO09k(T4Q}_rXYa)u6{SY4L>CTk>{x9&LqkTKF#;&>|kI)rPX~5Z^)hCnJWG7 zaRwpRQv5qk=Z1ZdDk#}^UX|TzT6zliq`bfR(DtI0)zzDAP9q#O6HLL0h3ZmW_c~ba zDvgNxM5s?^n)Jss>3ML zfmH4+D|5VC_a*hx+mcbgsSMdVwY+6eRcX*Wn-C7Um@7CMRxNq^k64ypK`un7nkDvQ zZ#8kqEcF9ASNLaVXXew{MX-BH`mkK{+(el`hAUPS;g*mX+Ug!|X_bH!V$r@Pj2qmS z`$25(74g0DCoWE*P(zAkk&P1qhC)Q-K~{}umoHq)Py15Zc>nH|XNo7u3R4KHkRU{H z4z~NrKkoU44H%o7tA<2Z9oqW3Y-2V8CZ`R>Ss~2eeN^za{lVLx)6%Bwnrx1~atn%p z%h1YKD+61gT^%5N9&~v$N8AEIXxl!Z6CWE-?>mz z?&NWCqc5odhIgI5@Yue}J092f`(AJ0n-xbD$)SqU*p(mqQ$KuWPdgRDtElZA0fBce zHw!lt%>lYu_jt%j>AYYwFxmAZdIgp3%kn>GhgoyT(Kp1~lL_|%RNmFarO9x0=0hBd zjXe3Mq$%c8zzI#Mus&YzUV}u8=WVCk(|OtxC$IdTrlM=K%n^VH2pMuhyh6 z6b5*|l)D?vjK*G1wna)G7>xuJ6y9Ns#kWb!b@x$seq1qX=4fG6^%B;)Y>o-%Z>tPkMmIX@pw z`iD*w31#aU5UbNGz5)HPX`k*}FA&3z7f@=8&@^Yzr+f#>>FdH<(I!8FGgzI?nWeuh z{vgHjXM8pOpRm2s0Jfy0nnthNd&O3{mV9zflvVc$!fHRTn&v@E@9g@_;A<7~U}qq7 z%lGZ#W^Y6>N1&^@+4baaQO?J?Ij~se-p14h(x&$D&pqe%e!l+aIe+|fUAH$Dh|k3ibQ^=rW{M6+XL&uRN4-w<%X;7W zc6tj&FsqJBIK19lhNxRgls{O4Qv_l7)(K46AEjcJ>W&$Nm1K((m8JgUHTe6@P~n1d zq_+H^@T?-gX8!QWppPH)JxcvyBjvj0KQ_=3T^1cpOqb*aTJ4Rr{Ku1Tgj1INUQVVr zL+S}}T_d4PK!r^_lDKhM8;J|0YP0W+qT;#krQZ)ZduEN0d4k6(IbG=+FW9xMnEE~J zrHl+a5x%E3V*C)p$=o@uV4*`@GkC%FW~V(B@!riFP_ zbIu2idML31KM0f@c6)=d7*hW2q3tt3E&rcIt3>r;k;`CFJ)fB=?Q2ttFZs~Fg{ubd zZe?RH0j&c+C1q@S_9>)&*!OBmvwqXm#Ln`dU4uz#1PiULxHMQX+(6Ljil(1Su0}xh zZSgEmxJUVw_LNiiZ@#ym{-Ppi2Gta=nxwlW%u+B=K7y}uV-HTVMJz?$-~2NqShp-a zQ<{roJ{sP~N*?B~m63#b1S&jHE;)LfBl6;j;`n^zX0<`j6f}Yvq#~iTeD3HF;q+3> zlr%l)%EAq++V9uszXr-Z!X{S)E_@%q?DymHatHGGYqVYPek2sGq4Hl>?@_OW+-IZGW*pZ6HhdZ*u~d3Mbqr=KXf`3FFNN?+?6x zdwXYiW1op+lDY_!Mg@2mpzdQQbb0EfA-{qig5EjAFv10PN_%VQl*Jz)ts+i|OOF7v z-^pk{B>OSVHl=)0g&1)=lvfp%NZg6*fuW!z$C-h;tkQVo@_+wh#A~4{+k!}VABMq& z+Q)7cpTFcfTp65{*4_**i5O9NLlse)OC7Za2UsUCz+FH~udO^2+}D&ggKm8(6e0h5 zdR@;K>khoTydQIa8+*jYbF%0RECK~qUu{KUWi@*y5xPeEG*+*4wc|Zruc2#0g;&d& zRl5yC=7WV|v#8dT_OV7roj}+A!5e8181!9Ziv#jUlEwA-!`joP7jneHLWM@GtJx5j zjNHO!R9#v)WXZpS++)D?evoQVEOH%4{JyOSye6&&$>@j+9;W(a={RyZFad`21)j2j z;`|DWig&4u2F;%Wo;d<)d_U{Y=6Z42#%J$f|f zRJCl1gnp7(1PdRwQX#HU&P!@yu;2Qd!(wNb->eVQLLiQQf?Pu?L;`*ZeQuTZO8gzcEcDv<|az?!AmlSMa{gm(JcCC7%9>MWwK?E8Of|vP${%{7{2W zs)vH>sb48mEm{6tKzbfXF8R|}mMWXelz@s>XK}1{>0y(x6+%{h;3?kJBGjeqlRy5T z1JGnTFiVEi;0^72X#&P0&=J^N`fkn)C&pzVL6*t6$;p`50xpvd%4!?AmGltM6|i4D zE)C%>fIM9fX&`)4iA}@weD-KSG3dV?;UcM4ZfPkzzDM*BR`A+`&LQuhMY%Kvq@|In zAl&Q{AY=uqUKL2jR(k#9NjrxsDh4|ysHtf6)z2B#6KEvn0KAOhGob$Q)qF!+PHfob zN_>a!!|)g%DL*fdc+)IsjIz`zPih^1%RVzfTGz_?@s~l$gEx;0s*_}`(guq>jdQhN zOaiO_;fs4OL=!D%Tvf2kIYwjDhH~$mmE*d$A|Sz7(neXaezBPUDeHDG_jofGv2EFY z)RWoA`DYja|LAZrm@wM3f3!ER{Wb_ISLGeAk%VLhl(z@M`#*MEXePwP6N(PrPVkV= z%mSvf)XJb#c6RVSSBF)sDx?%CF-|2hcdBj~!&904O+qpl26+aAm9CH7xd+_dI^=Jm zJ#Hip8YKqP_MrAo#ou9zt4Prum;+_YS}p__$X+JBRe)T<`W-lXTtbhwR~K zRr=s=6YAC55p47Bycxy^-qyCZNA5X}rgNTXC0mQK1Ey55q?<1F_cXj0%5&J{3_tz4 zwmhMHp)AW~lN1&R=D9gQ2=!ep%3~A6;p9XlMJ-j%VK;w3qq|yUhRT4FW@3FGg#6DM z08>_)hgji5EOv<7H~FmcRYy7@_Afk&;yS5?^O*U*ec*@GA8G`{Yp`jTT2gbW+&3r7 zzXZP%&|Tq7Kbg=5(o#n&RL6R{D^F~*vnNz15s zbNYVQ-FL3bd{G}7{&9s#+_#B%NhXr60*6&oNR(IP0gl2p>UuS;jx+4>!8CSm3MA9; z!VfugYI4>148*&9&fH`M$e2kcEf&%r&Q}`b)NtkKjoP8rlbH(6PTZ?AT_e$r`WI&u zj=yo!bBuHuFFXIXYNt~eA75`1s4%wK;1WAubvLB@RKo#RNCMYznN(*-o3x$M&g;*U0dnR zw3#vyM|x*g`<31{xv|sCjXDocJ7F(ISr?RG|!wQys3bP_PIk|cM1<=fw5E$Ow#3K?s$NgwDlKgKlY5e_T zVc~}wrQUI`+os3S?ocGAxy>@QTDPDs{>R3Z@6oOQg7-cl|I@mY4airP4(C#}-rI>H z0M~Nzj~`+@%hbTf$IsmscK36+bZRZF_(9KRP)}<`po1(xA1nt|uP!HZ36JT=s zC!O`zd8Qyhv_rCZ@Yla|-m~WTUqnDLlgmH&(~LU=KPBMx*>sXUAQGX@2#*wN@#bb> z2)->kZ>>s!!?LuOW};e0!|}^aLe6#hUpYj%KxsQ)QyALDKLODq2Y3!I)83!w2Gt zc6pPm&T_8L1Yd?{Qk`$L*bzI?qke&*hp;s+mYBZQXw>MFBL_%hys7ew3glZZE-s?H z2bBJdzP~{l88+E~^LwZ(4P#OX;VRz$T^RiHF9cbHwxXpZgZ`F~JJWy+kcLve?u20Y z^O6~PI@QL z+Mz?Jid5+!9VAq#p%)3&fOI1zgeqMrav;DI%n^hy`N{?WXt)g4T%o=5E8wa?tB z4`$Y;gQP;?j~PFK-M5Q+IGO__?^JGSTF|wQf<&3`%d5L$3Qy9@o=;v|OZsSD7xRg0 z18WJCq-tb=o;Hzw%@ILtwN>O6{Axl0?CP(%ymbPIQg`qk)O{0{~ zg)5p)p+j*7Dpej)LKwcoN!@dU_0$F~N~d1-eU!PM%LKZ9Cee%ei*_c*;;^@wf;@RB zOp@68PKoNh#|NTqRJJ{4Tm__Zk8Di@zIJ~ZUP#e%Q8Uv>-1Rmr;(C<~&~j2o4PKr4WWXNR+OTa=C3`Qxa)*eHkgUaS2kSS(Ku2%)n_AM4WW! zB{poZxs$nvJd4mdQkEIOp+-WPe-7U1jXmD0GCLta$K4y=kq@Ah1XfvsOpYv(PU1E` z^5@8A%p2HQge$QpC%^8-I9PSjloEQEr>j6pz_ws`z%l{x%&Cd2$I#YunW;0QH&af2 zUv{!-i}pMxN?Rs+;LvfMzEVbqMZelHvo}aIx(}?X^6)qfZ(OZlMpkTsj)*Ze`?-h2 z_dq!ccfJmJcfu;MNfCiIS!F3}SCr|>*3_Lf8i^`@98l;My=Iw|)$u~U*Vo%Cx zCQB)IqPP+snW0yYb}FjT-4Hi!O{(ifK4wZzc-J&@i;Z9FGs`MV@m|~LZIFFX*1_13 zh$$QD;X`()H}Ipb)tI+~g?)h47uyI$3CJhLwcjqe6(|mrR6=oy1T!|%w3lLZ#8K)& zMzXT9J41vQ0JG}IYgp}TV-H;hQRPRo$IF66KJPI>q55-u*Y(x}@t2;RCt|hzj=@a{ z&C+GBAXN6Ei6W_H={3)G_0G!a0;=hii`(GU>Zu>PfzlsPiuwqR?jF4=b=oz>8AxbM z*ar5+;3Dd_*>wTxlPP(bu)scnhVWQP#4vOz&j@uq@MDzTVC_iEGIFFa$B;y(LSoLi zV_b_2DlAGjLjF$a(XndPA=!%U=X~r(ztRzJbgrqKk4W0yndH`NDjKim(EBn7dBnVI zhD0bJJE1cfiY~&J2E3v4@Y1{H zHm)|Y@HEPhZPA}yvc73d+wQWMN;%;hITh5hqtcBx4b#g@_CE)7x;)zp4k7eLCTiOe z+bDm3fA=o}4Q)M%uRnBt**ske5pG}QxRwDt6;O2>DUzpGiqd{#z;alG&FrY(%aMy(r@menu2 z=V-MuyO_FhWDLt;nj;u2P?y@#-L{a-hHDqSqu!{U z!;>M==b-&{s8laVZ0XAvp#euYVlOI-Lk`F_llPCOfSMtA2U!*36`~+ZeES>ULiL`USOX92A!WT zZ5o*I!WX})Un_Fd{Dg|UPhJfUH7lR2Sc=-s>`J+QLbYByX#ffS%fWgZ+D#26>H01^ zDJVKSWNILZnq|AcWt;pxrKb9zB8a22T?~+q8TNmWnbKu1IZJzNW>8Y+#&x)mxtCHI z6z+cvxcVypP>u<@_=f240@|^_EnjZ6XNsDxLmsU2{WHC;7>+Syx38P(Q**Zl+{6So zwfIrV&F>E$tgUU%cC3F!<~7fy54@S}kz)Vt{{G(yCZlb`*h2g<>;aRp>DRtwUb%bo zaH)IlSsZCGc)vG9>6AE81bZ)a=QZW z6NI*O;ZsCx3yd2^mMEf9hOzPv>_R1SMASV8>r;uG(9kdMD7MKITW0V#PPCjVAtygP zF5La*XXAs8c7Ar?W4DLfWJli`K8LP%E~-~mSAS6lH4AaX9>?2cJF~#~`i}q;BYeny z?#+E$6|XXV3}uY|kPhcVTqo{1eP#V!6ZjhEgW8+kS^bn6gx+30dlnnc$$~g>2Y#NJ z>Ux)H!wvDX+HX8>sNd+Tum)VMFFD^FT9}q63K2%T7m*31zOp|jzgyUgm0u22uk>|2 zc>In6f8;SIS2yMkT0dq>x~yDn^BJRG$hpbCM9?zZ{WN*mJC$C(v`x@ z`&Hq&a0^_kX^wz4J8zKXp5CQ>R!L}3Tp}c+bxQp|Ap?4YF&S2yf3g1;^ zGca?ld-@j2v9re;5*-dT(v!Ct^>{to0d80jc4{^~N`DLFPsM@EJVkOl7%EggcYDIiI;B z7n24*J{n5rW-|SHk4)qfsT~nV1(F8RGb-KpjE*pb?nqV_e)lphHjA~hzDHMTR5`xN z=9wzl%Q+wSySmnot^un>QAasa=<|VM*0j)w5c^XF*~;rzF!>2B^w8@@1LywLA6(TK z_aSF4{NY-Swo>#hNskM`)P^m}^>!^lcH~DlH#eB}=myuiXX*AwRVUa)64j4r>Vl*f z3RD795|vVY@G4)OO6&S@xulbBe>c1^=e+ECwO;@Gd=m8MDnhn2*ye12XzPz8+z`Uy0F8(iCfvML+rIN^9MMuwA zrIHr}sxDkk;}*eTx68l5qFBPiN2I<<)X%)jE&$xwyE@H{DkjdR*cGN;z@8bBcWFPzy`%r2*6gl4~H~!uVy*t_2BX-iU7nC~X#2 zRLzEu{x&Wf`2^Q7jRQ+Jm+--11lPz+Owkfk;QFMPLC;T-81TzbQ)69Kl%!ik`Uma_ zV4*0&2yYRPexyL&m~S=xE!W2=8RMeVba|?Fh}> z>+2%gZlS1A-ZC5xtbKp#cZ0ntc%pVu$cyn%6}tIiLSDU)=Gs^xM9Utyyp-aR!BePF zIGb@&6O*7>#vN^&Zmp}wyLG76)`U>F;23A zukWFA7oDlZr(oIZDR;k`h?<|)&q6kZhb|wSm19je66yR-8<`Mz)sx&gh&GSQ5RV zU76%hh>Ej$SeMtET6V%G!HOMjO7$~9H1$@CJy!_oI+VYgP+pfulM9t?R_p?MO*?2j zB_1Y`6N$UBVTC`Gb-rU^H1Vi8C%}=Itr0)C9B$OQ@Vz!PM;x{yTkz9s&di0W(|%*x zs&tYY2M+M^TUNGAWghPd5R+R63XWAH_QAv+Q(5BU`53g_Pon(?jOx=G4T0c34YB?7 zDXSUo+f`kbJ?5BRY0R8NL>i;dur;#Dmx$&V9;>u3+n2qQ<}sg z%W2tOF@oppS7UO^Tt$S$q#Vqph0`NjTj>d^W?|vAgC^ggPE9`R2FyW?E>BP-K4LQj zl@g!HLdm1_Qa5v+pmF@J(2Z;ar_*}RJ4x1f9HLzZvEy<5vR2_m+S0(?&ZGl#J+H3# zBwo3d_|1_!G8=xtNHYZ~p>n1<)j^etkJGkrigjf1v5RhLh?B3!aiK%mit;7DYNn4H z8UHW2meL~sq-oX4s=fpSVKXN+UwZKBn*Y-7vGigWi#QpbX}p?S5AMqT zV>BcW#NQHaLV$-U@GxdHQr#t4Y^~fS5}ng1&YkQHd`rK@ zW_DHU64BVXLw!QM(RMR#j?zo|g((u%YG+QYV5ON8;# z^A;=l@B8e^#025tRpqN46gnRQ4;gJ}TILtb&IwBrdT)_j)H-X3Z5zG_p-^^;9KJt&TxkL!#fa=Q%G-;g}$8U&gumd0#tUu@Rf#&G#%} z*EFlFS%$gW^!c{sX|noDQ)V-v2K&k?xh}7#`M_HY)<1eK)^av#isRn0SCgFfSvVNg z6T33q934Eo+>Hc0%DougY7AT=`0O2GtVTc|!tIq+!c8K^PeivO7qP2M(lqa=F1Xkk zKTfEB$;M6-e9JI0KlkQ{cAfRaheg)Bv4KNOhiEzb(aR{f{|HN1#DJFP%f;i8{%g0~ zDnlYgE*HL1n3w9>Fh98;ivj=e63?I3(cR#oBx_esv)}vzY=tU&QRc_?6H#|Se&mlU z5zC;T1e%C$>2)rsD0Doz!MN^BJ&-d;k!L}gjKoE2WAEraiy*f}8afM`s67+$c(tV- zlbI#Wew3!^V7#3PU$ER#ijhi_+(F^DT_zF zFdxpcLXeo~kOJIR7AsOUVi4^F52vfYZUK_ILfl9*Uf_NloJak<%)|a0lP59}#t)Nb zsA{U2@1l`qdo8MO_G*e$D@xq_g;+53#2CFhAXyGvlp;3xX%w0Vd$_jb^1TE;WgA^v z+8#l`%&=`_B_u~vavY|GRUEzy14J(-+tH=>;;SdnC5WrphaOUwGu2Z`_KG_l6HT*u z(|wDr4W*f~>;rIwX)bv@@ki9u!V8sl_8T^>l$3NA7KR13l4%z8tAXtD^^Nu<0Hscysajj|y~eYiM~=E7dEo`e7cb*fq{y0pWcK$wKR&^`~x`V2F;^)q<#IkIip@X zOI{rUPg}XVg_nxegLP7%!k6Niv&S2JxY5wr;dLFl?k@%NCks;vyYrP~12LhuKOWNl zLKpBY#X4({fIwN?|DX&0{@MN)11JOjmu#Q~R}<5#x$5}*H|QX>#pw@o=$@0-Z{|=% zr0MTE390eBo<#oX=Wy2f-9|b8X;(S_8Bao9O}&H?{5__G`onRGLCO8b8vKiSNF7Fr z{GM`(x(d+qgFqg4JzbDazJB69j!0vD0>UexE1-W=4s3F8zK>^3eSaMU0{=22|63pe zAds(Lpu3arF9y?pU delta 21529 zcmb5VW0W94(=OPyZQHhO+qUg$a~jjOJ#EdjZBE;m?w+>oo%j9r?%s3m{@MIdnUxt; zk##a7BIAjuU#p;(i=c=q^575{ARsUxAo$ts-x1}&|5Yg=prk41)(E)&GX(RWAt8`| z1?)eUe}y`Q)Q0Z+1j2ubuRuw^zoPv=&#{1F{I@L)%Kd-$asDr|ly%Vmp}PWQ|8E~9 z7~g+uGcY6IfARPq4j>@#{~G4bP9By{9!x%t4oiY>?i(Xny*tK@zo$1<7>UylTH@9C z$@QCRN02pB_wSvY*hm^Eeu6c^V4)0uK0I}MHIh`xq^5PYD~)~+9v13(a(`GMcEWD& z_?^by=F{lS63|xR@qK*?qZ!-3pdQ#p_-uL_oCMx}diNC=XUJ9w5|;{PDbe7*+*Y$vjcYW#9R0TG92x%-Lw=@CLAHF<^?C zEGeqBDha#ld2^C*9*kUIsdK2#m9jjMIl{wsFA3Z0A4@bm=JP%NbaCh^E7n!;crclx z@N5dv^k(;Gk=&fR1X1Kuu7+NKLcA<~qVebPOKf`HkW`z!>KiwfBHpF^xZ4YqhhO?r zWWTqHR5?G9iY!Exn9%!kITEP-13gvPvNdQuo1ggnWOIMZ9mPzqeny9v|M~ZtV|)R` zwR07U1IL>s6cs!$%mNRF7V6Lly}=Xbk*gm2W$Qe_`D0Eu%~C&Vz$-zj?-l6t3BxbR_}cy+ z)vJiS6K|tJVo>5fOKDm|Aia~`!RC`pAuWc(KmdXmJ(xcFd&MwIhtY|cix4e*y8Mj2 zj#c_}Q?(lrN;`u*fLkODL`+#LR)bU|7sSUvTXxUI2!-WY?k^ZaJE^I2uzs1WFIG~C zNDx!KbVKhTT@KP-MmLaQ6vqbLq3Xi|>ByH!RYhdMH@!94+r)v8i20SE@^8PSOI=n^N8;^L7&a7xrHE%j?n46=gYDF zgc<_r{qTB?89k@=@%>;dJq+zxPrDUVELU%PM=fWK0LRbluEw1uh!rGAA-2=FBroYq zA2&EEamMYbzYgF+ihO$$-abE8dLM&_uz7}jsvP@t%q8OCk07LG7tGY)YlmXg(~ge> z{|!?CIQAjJgg3k-Sx_ld60KA%9p zSeXtTds~-PS}UgR+C*$k7LGaj$Wxl@UH9izaByHJ*8xs$gP`D&5fUXmA>VZ(`_6uv3lKv23EWdQ%#Z||4 z5(?;cV9UvHUx!c*{Q-`rVGaEp{5TgC$P9{~rUzvEA&q7Zz_PLDff0lRY~3W>-{FIt z&##HZ=b$;7NSAgrMEE^YR7tI4T~u2fsfJK{h(sv_gU%#LDh- zuSrmFE%d7}hZ+tt4rFznI-XvVJlfmPrml|qg6V_%F*C!&Bpisd_(Ltqbe|yefaTTg zX$$DZ!kW~EtCcwnF7F3B?(X)f58?~w+}z~yU7m;dRW*#zW^&^bydbn7W+^(&6r2sm z`CBf`Dg-wNO(B3pW{CZo6eW~)E<#MLuRh(q_HOGb;BZaB63cN&S$l#N4I@~_a=JJi zGuXpkhj&&}bSQnTh>upQ0Tv~t&PpzRBnsd?#^)J&*+?v4npIlyeYr6^68X?swFG@X zFoAxW%;V&RPldq4FhCEc5o5QfLmtCJ3K!0}8?x=gCE^)h;!xfs;3cS3*_oM!ppwC` zd7=vgpGm<7U%hOG0lyr?ji!`MfR&3nofN17)$w)8NH|n-64_p>>PSc!H11HVfCBCV zyEsV9CYsQIho-IAUqkKDk#G^6MyRU3)%xqFdJiDVeIR4vE&_b?B7Jih7cGUPkKW4y z#Ub*A>(k$%LEPt23bR!R!+1E1mIkny6GKou>BC~Mu5wV6h?M)GDO7Ac-D2nwzChP4 zL4ROoOY+(rQH_V>BsUEKODAs&?tmthi8QjNb4>^~r}G^Q4ML1x$RDB-a7=q1?oC~m zP49$)zM!9oG#5v7)1d55;4BT0EUmuGrWn5+6`Adm$O{Rzei6mQFLFVufWcvv)*fz_ zx{Ex=YjHQ>pyMT_fXS+B(-#NfKV$thq#;Qvo4M=B?vt~MwGfLIO(r)1&japd!}c#- z_#3pgOIMH!30;_tf|x9LMP|MYfOSsRYgb|zYhr=!EuPGl^!EFP-*9w84&^I^(C$^L ztD`(xWBGFDos~kUq|tA32dqSqnuvm9leUsn{2{1BG^wGDF-MuxwMxPep#d>oQDDhu zjY(9cCFe-N&}cB<9>RTvy9dB!Fe6x>C~8G(K@&`tQY#=~u9S?z3WMvlDE!CgK@?E) zVNO~=xs$A#Ru=T|eHbtEDM2ivdulVDg^~CRiX* z_=G?H2<;IVp+hTqf@Oo3-4k5chqLh-A+Te0h$mY!9N+jpL+vGVVe-v1oMJq4h-bCx zKuU`2@R#?xw<^Tqd8e&Ovq&RLIEK(6QLZ)b{k~r7@iT|pmtfSa&0*27Hc_N$VYG5b zrLQcwwQO>$jTqQKn*_p1Ej>oO;C=Bg){^vfKomu|2MpYE*ylvBP{Gg|LU8|H+x9dM z;8vn1|Dot<#aEnWoGKtK3Vul|!j`0P!j3Cvc{r_tQ91BkIV0*8AgFGv8~2D#bymNW z%h6|O(rFIS!~b{>^6=pMlnS&^ylgSrr6ybhpCh5DKWRNGTmcZ|>4yFo99h~|oHGR& zmD~?GevH<~*Y=Dd0rn1G& zIp-?CiDPswr%95YbjOAw=hfl(cU$=2UKVK{n}_&G(ywpvLV%*(f`}t+7d1B$>n&fS zXym#Fz7r7FS_kaeCd;Rcqkoz-Rb|!5mTO_IW0JJ);uKB_Vo&uep)#*te@}-!(@RGC zKz!Js&WdA)zJoeUuUev_@ESeWJcuFD<-N+@vYt_i7F13`<@<|!DWinQ;_H0j32!e& z0rMkEns$)zPz!8hE{%J|ZbtK}7wwFd z`m5QYM9ize1IA&KzK%e3XwJX1FpQ8o6yUueKqbO^9jHSwm?^_4RSb>%+{USc6bKb` zR**D7qXztO1X&)_VjTBdKoidmTfUU~_DIF2h{M20F%V_aYMJAJ5G}!lRgrp9Ky|Lb zCMp;{wNPy~Vq-r?p5E;tKtOa3r_X$slkAH$sQulh&sr!Fbd^HDCl84_C|nKOqL@^b zQ?g&$E>OXM1C=pEI;;Sy#jRd*x@}CirN=0QSrq_-nQ?O1Mu7n<*e`u^*hWwK8C!2c z>1^UiONDoV$bAj-!6Z$IkCiU;rkvi0@dS!tcS~S`n6TwwN)f-!lUTu6se?%rN=iF1 zf0E6;o+|G78k2f?bd%NL=Pjf~ER>gD#eAfFwKy)lIrx@x!|(Z-!uQ1^)Y-L;V0Z4v z5(}vGKjO`sAq%Aiw7OQ3CuawPU5J_Np6$-MrCZ?Zh#3(NULq~Qdy=sAV;Ej|9`#Vp zwK<;cI1P@Lv>6r}N{n!T_=ws44!O$7IiCrP*xhT(69i)O8h^)ejc%sfBmESiOkj(7 z%;Gxc6-c{*LsOC@gFn2UnOP|3vTcR@+6JyNDH+mNG$Rs+g9W9im=mbzu{6A;j_GAI z%KU!SZ-?fY5M%quVk{{VnzuX+=dFi)fY;-$W)ybl%%R=W30GyH9D;?)Y34q zzvAoTn%u9lp^=hqc~^CumQ4Nz>yw&{IaJ5kz&Ggb^89v+9gIl1*}isd`R=!Xi#BV) z;5rt`5gr_NVB+NodH?m&0%WvmU{_=^}hINiaMt$^`cN{NbIaTY^N8d^swH7cw)_#@EMoW7wb$ z9dwxG(`txOb8-@AKc_4#2WTpde}!ypY{VZ5Z9I;YuOtV)B*n}>L($YY{_p_2Qd18k z0`IL(wG}I@Jjg!k z_iy5RD|#8*i`eF@I_mZ_nJ@#I1WS}iD26+*hai(E6>e??0&aNn?~WA9BJc^!%0j_g z#w$K@!QxsW`JK1z2j6GO7oY*0wLSrLq-80Ep>rZAW-u7MnWK5R5`q`R?_VC}1F8zC z+uH#Uip3I$PP}88?c6~ieJt$umGDUM_bh}XIq)Lo|)*B}VeIH7=D^wJGNpllKWJh-wbj=7|4NZO?4e&3Wzw}Lq;%mp(@ z@(GHN-Qg~REg0fOR_j_2jtJ{MSJ;W^!@=VzD_r&4KjdNr-zq~|%nwN>JmgcFX4|xSxUs}DG zkAX(b4J=?cI(ZEQdN%bP3W3R^l?93M9tnZSs{@iP)xMghoPKmoh~5D>6o@eh`d%X@ z{osZo%F#pl16DqWHgAhT4i$?8nM+~$O%q$wgNNm>7^uP6Qa#r^80Ll#h_@nEGXaCL zmKzxWEvlXNZDAvwP>v)LPgC3 zx+Qc5kxqM&P6NJt{A*P06OyKCLNz-Gj48sqKF9B9OG<4)JGjQ$ZsR>`Mxpy}3A&(a z(2r%!9RF@vx0(p?-39!F*cHMQYrwjI=zf}+=5;YnT6S!dA4W}tGhQoC^Q=tWr5~=W9$X@I<)g+dwlpa zyN;JItd?~@7i^gi1G1X!x$%elCHSN8^8P3_cD1e|WB+^JpC z?(jaS3RsGDn(o8lIatod4@~M)f70E9iY>r-lBsf)*(bKa{8n{6G7JnxG?zFg73!-G z+Zb0m_J`s3VZvn8X>j%D!rufn7T;cf+zl*=;C~bfI>@FdW^2+2y$b{l=l>*M665sf z5og6Hk;u8?%X#{H-42n21(Aq=UE*1Mt}w5K%TCsyfa-!e!9uqaEgEn)y#g0UbFBkZ zO+uuwM04_|CEFGV77id6vJX# z62%&_iQW;nm5+T)9Nq_aWfKyHG$Ie$ab7542~J`z&*e_EtOYAJpDx!zn5@^~4BlYV7iK14gy|zs?Q>psHIM zQKGQOBg3H-gF?t6Hq8KIvW*c!Axyc@ut3*5N|Xp2yzaKutE?Y!rE|Un-e~4K8PfdkZJ*njp0^FDjyPH|j?k#B<i`Vvp(Lsxo*eRJR#8gMxv=PH`rtfzM@Q3db#`ArZAb{CY4U>&wFTgq;S z$(rL_yM*8;(zPuV`R?|KC($nJW}J;`PZ2!-q%fBnoze!QavM1eRpn*ZFYzoJ;(isd zUR7OOstl%ux@-h`AAnimk=Bwr9ZPke7hR=4%7o79Tf9U1U>QsFOfF@>a9y~9=t z;C}GB$%dz#QTimRDnqR$8W@8QxW%9mDM>S`hWM2(#7zox?Y-Pd7Q7`Ehx0t3B;`$M zEl#nCMV^AEf!H8imZ(E5H>w*MjOOh5Pz4^`Q7UIY@~Ht=zptNLLBUIn1V{9#So5V* zl4{+xGx{wSQFn`)@Gblt(-fImc&WpM`!-1M? zke11Y`lkKjD%dqFDFPjsE<&EHJN1wY44B$OrC;<~eC@5dioj%LM#L)OPEu1Zn+}~N z3WsSN?`8l%oOHQUFf4em5y8Hre`FQ)wh@^IR+-f0tBZpSQ3u%37tt zt@hqTVvhf%xo=NXK97IJ!I18{27=Nh-u#pJGT& zL~CNxy)UXX$OPl~egygVC}w0G1&vl{_nh@KrTPazeURLVGUDAzi_w?5SjB*@gQ7Ai-avQ?_*^14ldOalf}tZYaAZ z@XT~yxbh#!j4z+3kHw-!%PCxVzps|6(sdj;l)Qe|Y1n{hTy8V5J71&-{mZ_~nv~rT zrfm)sqAh|vPZ`i}qRTI1->{j!_=jmf9|2Q@U?XX8itM zr?VnCFSB(LduZ8LH&EXdrNr4+RKf#mMAO-Z8cSa6!-3Qyu49LQhVtbd*Q0OWS5Yzt z^;8C*Rqy??iJU~=DP`2Vfu4O>ilGHOX;MmARfL4hZ%B;2W86f#zR=ED6##j;=#1G&2w&7y+(hdP zA|D(Ke^A`gT!}>_UM_Z5E{;1_PXFwF0=hPze6CLr(wz+`XX4A%#4fFmy_yP|M@Lwm9{yOkdMVP4 zx5Raj!+1O%iz&dG#Lbf}stU9feGd^$j}o3te9sJ(!U*x*^d_VS& z;(~sW%6N!+cr1R*OlI-os2_+c&h1pe?rD4tp+>+)7?dl{WcE3~ zXQIZ!MUy&{=M*+yO4ayo5XzcYhtN$G9!3O05ZZ9@Q(VQURz6GaNOlV=ZoeqWZi5~} zez}~>A#))tRnS7P&59=R1kLC{6dTdIBg!P~>X`Hlyn@oXUHzJ{fTg)exuElI|FQ}; zVhVF5N}dvp6$)4;Q7#mR?(!UAc1@p$ z!h{YM-5YwcM6b)exq~hFxF&74#b)Xi(FZd2|Md~A*MSJQ#ZmHz;J}M!#0~YUy#htEqEwLGVf;S`+`bSFepp!XJsD>!{si9& zI(^*F$x%-xt@TGu7p>lZ<2zYz#pGA)rDvC>OUt&_>0$e6iuc6oacx>66kqn4F?sic z-8mxa?PA@Jg7Y!Y-@uH6oqN7gGzQ}($%Rj`&+=1{^iH&T76a$oE(IvHr5_+% zd8WN_RyOb{l<0%7TX%^O?1mc@ExSz#CVD#bmexrpUW2PxSV;r!;n;ec5jB^G zB;SCP659oi^e3RjGeA++L#aUbBvn_f;IRNIE30U{5Bux^%R+SlQF0cu`;XDzk2avz zFob;f{iy#PZRo};n3Kt+vNta;zZ-xm^yki>hs@8-{QlEWKCDK`_fOR;gW+ZUjhsV)|LAKpAj4XLqPRrsie5pM{m^q%&B&xsn z#jf(+7472UfyMRf1ar}|I!rNQHCX6EwsYJ1gMslt#7&<;uGMx>o}Nb;zgA(xqEzF& z(Q$&+^!4~W7$D{>{4BoM)C>Fwy9EXJ%Y^wwrAGaufQi9)hBsUrcehz)N#4Xw6dS}w z+)I3{Ro7wrrZ)oRkHnD&rl`J?qAVCFwszWrC;5j;3w`wms?r_i=QLFXlgRMHxEVzi z#+FP{j%->u)1KicLS%m>*9T&}msKIe?%70RpU=URHRvfUr(o?cH!OhdbHN~I-q=UI zYl>*sgBhYwVjJHdD-Cj96Xw>!9Aj&?IoJq#u~Ht{jkuJk6Do&oPsM4NGG{C1hoeaB zP;nC0odJySN5X!2v_8%FrmGX5*P$`B*03JN`o_y6svUM`oeI6N;}Fy!)bGpIq33?9 zySfKZtkAhHB$xBv$n9RJzIu9p=GHGXEctb{qO(>=;d5Lp4MQ)%gPzxA#o+R?D3y|0 zXY(lVca||@Vz6ftfFy)?!P!kDyyHs(?bRRgUzJP83B59Jw*ZKWJTwf2({kT283@R{ z7s$W+|1FiLnS=@-^gnqw%|g^QFo^$2yh%fb=KTQy0`jBziCGQ|oJEl*MUssfls(0h zEf|H9k&RP>jg^m;i;t6&iG@1_l6@SUjfW@YH#;6U8y9cNCHoB0f8G*uZ)Y=23j#7t zn=-*63ecv?N{DLs{1uWVE{LR zx}|ceyz26Po6gX% zzByjGdc4@!dU(}Zs^xnayz2ehMvFmxcd39*0#=t~USt-NZogNO9+InyPe>O>rY1@t z(h|qusR^NRmIhGR{r@MxdU-xbQGUNW{$0Y{bv;l#${u{SQr~+!L9bnJ6nNQwWEA+I zdG33?+Yh|l9sTYD{5~F5ewtD!ljII0UyC2u>w+C~adroFIka=DIKv4EQ z74Uh+f(QRH$+1>;fc(dyc~;2(q%7l|IN$&nL;dOizJk8qcfLNok7n|Y3IHPhL_+?^ z5o6$^_3Nr}I*-Z7;V;-wT^ICMKwX$TDPAXsLA%@G^UZz`+?R*$&0ru%&z^Dj+WPu> zIDb-Qk)+VTMc@td)JKpc&pNC&(#CoB7x6v;HKY3kuuOC&Z+u#{*_eLV@^FD)x z->=0v=?Q*1?|lBvaSqs*7JmH>AN!-OPNRcEhZ@}p%|EQZ=k>HN1YCe3TEk5H-<%A< zHtm8NPeZ{-gE7IM$$|Uh@19cey#V|Bbciu29|*EX5$sjb(4}ZxK%YsK0?M_Gu5j}% zx<8sfynb;(IgJ3T%p0YucuCM{_E7KFhci<&$Q=8?WC@4nyNeCACwh5ZYATcl&+ngv zT!Qk&2~r=65q*b)#ISj1Of)?oyZzv25X14Q8Ag8Nm`nc__dg%$(df?(*i?O@*BY;A z&w*p@?dm?27y%!it3uDG!Y{NW8QW0SqO&?^ZmQRHn;xNQ5F2!9JG7a6y?t)3yQaiK z0jtKy@8f&;$izYi>IWe{5iZDnBJ!DBt5+K+oL-?NE<$YaZohPPF_Uei;sTzD z7h^SXB)1Aw?dms6n*U{#h^&tos~)EI3o;RGCmRzB2jwy+(%O7a%=5H%{SBaqKF{BA zq1yKTe@MZ;;i+2{V>25*JV@z4xQOr^D@VVlWEX(BQLv zFajRizy^s(;8#~yz{NV}j>x3?KiD7$$cSle<;+0NVBzR=-5+6}71)oeVC;bZ%|sjk zN^pLC{F~h2SqXS#VwIPdU+xzEyes%3;PZglb`qZ0=&L=!-#$MWPg(9%NAE<8e}&Gg zIF&pM=+DFRcEZn?U@NgzCV5!+A8FP*7(`6!-%VtzhZX4?Jzt*KjSW~m0gQ#e-rWVw zaTT0#-&t|vZz^Cu`zH7;Aoot3!hYSKZ~UC?DDyo77YabGH4C>9A(h0xf`0prSUV@Em6^11-kU0PSeAW|suL z=g0x8zY%_%f}-&CCyrUE3+NcqcpK(|s?xWv`lJ0iF%TJPQz?9rhO{SPI)mqsvdYI` zB)oP1atOXH{@)Gwzbh!bl_y85m4&yfUf}cn<)4P>Y~^*PdC8nrR5X)3AsZy&j;Ew) zt{tGI+wOI#YwTZatb%V$hHWde`HuXnZTCvg$cXQsoV9t%(zy8d0g%Gsp175G^-Ap@I_saUL%>R>8Se~6>K2|jy~!EbCwG7Dcs<$ z-fDsZ2xw=`|H}=F1Hvb~c?3!;GS-o$_`O2*q|*4(jm{Z_Mj|R{FJ5W4-Bt%R9L_3~ z&kp$*W?pK(d2-rOGm(uZ5W>f~FL#%Hq$p?<@;xXQBo7{h;!8h3a@b^Uv7(2Z!_6i( zw~k9B^wK^c5A~jWn;CMQ=6tGO6zhU6tuVI|3y~V&j~pyg^4%|_Fn!;XQUwhyjw~oN zccoZ#a9Lo{uaawFzujA~AW3Zss*8v{?KMMU!af4o^fs8yVz+*u)tgBf5nuuG_>ZFO z{jt3PfzK3UjblXZaG|i|p_>eDI6NqwUo~&d-EWtj*vv*lfo)1`*X1E1->M|0|4H-& zJ)!zr;dXF*Y%ELV^5U$%Y2Cn{Nq|UL(zRizIX(aV3eG(Run~XLq6HO}dyD%uZN49l zbpN>FtPd3MS`jYQH5f;;g@`XmLexz&tzhP_QV-Fkur?sDBB7UG@d-%a-VWnPB#m(dTXXu}G`?msWv# zY^}a(XW$#xCPhcx+17Ta_toF&oG4`CpqpXrtL^T%)(#5g{AjP2VC*=GmHQyQBl%V) zKKS`QI#J-`%osJo@*~+Cm*}suM_}L<*E6)Xy<=P$MZO8g?cHG1%`VUn4y40W-5$kbDs^z;B8 zkoPN~u{j9uaNHx$)#JT4$8a%-2oIC5bx;lsA^q1zZ0H5v753s;utD3?tV1WNQ{UvOk^=<^Q){p7olnN znaH9w6T+>@a*RflL6oq zC#*JqmKL>kC9$bP@u~*Ft$P1*`HI1`#;${OiuyoPfPL3Xe_7)=Eai|L`If5UQaP21 z+g0gexExW9@OKNrYivMQ%jT?zi~)h;8{%&kO2mX9#3FXfuLt>@P{L+oE9c&@^xpyuhM+0KQ5?K>ji^ z!Xj+u`Rp90WF4%0=f&&Ar4@t8s7Z>I2wF(4oTI}Edd8DN7|NNOU{3>Nd@LcA=Upxi zmdLWQ}wjrk)T(g^kpXfOXIS9p%l5IC3Cq&KJaXEzN( z9`_IDMXCYXC;jW*e8}r(qZBGmsfn84sR%z3ZaD!ghaVNy?aWWXL$5DBh0J6$SZ_IX zJX3l)Qei|CDcJ8@!Qqe&F-}V*-|$WIq#>4R4Q@Z_55m5kUoXFn{8K#b?ngEQJgM4X zNS+DMKt*{Tr1>Z}%J=X`A1J#Y$ZF!Wy#Hd61Hwix>(^EdhCe0e#+v_G+SDkuB1{}0& z0V9jniu{P?P@$?=>*4VI9|hmX>>6wi&NHilg45XMFIPhws4Sv~#4|@L501vH&%F_= zOHs#?lWZ>O4Z?Z?&R<5&C<^D*l0v`AXMM95NYO5ep#E6G{FMT5&D@qknGK$_nZ((Q z{;<19B^AMuha`ufLq0ZFEabJi{Ieb_n>P*MOQBpPIrFa(&nnl$evoAp8Gly#aEqXU zbn0TO6i8O=P^lp3ns#lY-S;I)(>Y>0{G;7na7OYJ@DerO;^cZZR>Jt#(Z~9B>!nOW z(N|@3&X&nh6U@mq+}o3Wixy~(wY0RfSX=QYY~8UM^Q&ruUN(LqT|g{IwqkkTWHR&5!C3*0+Iu|#+;ODGq16lHNoaDF+GIF`6vW6qN0i&%kDX|@p7#y>V zPg0A`#p1tvaR*hT2BJvXLH^JSv!6>nUuoqP+Fu#Av;%>FJVIJFiFWCA{dd02jHA`@ zV3B;*2__Ua!|Qri6iJzxQO6gZ)iw~2;;nsV9aLrrh~WkmsLd3riRN4WUiqk(pU^nh zk0BsJdtXz28 zTPUJ2uoE=?A>{NmgiqO5L-w-pYNWAR>;z#;S7BZ_d2KI7`akRbfB5j`A96f`o|-2U zY4lEUp^UcaMDs3N=>HDI9o380p524>z=u6{>VGWy)0Q{2a=w9)k&&TccfiZ-Y|taX zex}uBkZBNXQ2lwE(M!PVb}*C2|M~LI5jE=eTfz^x|1JG_lK1}jvv>Ft(!k6NZ2hn# z0Q&t8cCX7G&uV`}Uzw?`?a4piRQT&A0s$AP8A|klIFZ`zvd1`fw=Bf$SC`?p1V@{%{p4 zH3*VRJktJXYDisj-Rw1LHGbSuL^?QP{5sSRa=q9HXP=iK4D<5Tcr#z$tRl_q?{!9t56pwgtORA+80-=%wMqq+<$q~|fbW=dw&zO8~@JQcPMXbgj5QX}Qs@0tB) z8fVNhlzPU-&=JXrP^Y1P<)+874n`w8Ts4^A^F&*ND@LHKJsMhfzfnlFT_TrS64fY| z4-gs~8d9p)Kj@*NrMnb9cqn$+2~76eQ}03Qi4BL4nROH4-Q$<_76%PdGEP7rTYg{^ z#{B6L_YBX7bTI@f{kljIk+}R5r*tRK9^ z0!(c!%=0yc?Vnj+gwH+l{q zS_@!DHtHl+L$i-)OcP&Hy;*V5f5v1Mo*_g@X!>BtV8JdwB`!;wjmb(RNGV3nrgS_~ z(>jfx1Y&M=5;*G?#Ae*mcN6=Eq1tNK-jKtPsol;ox+UXMK4q~1Uf)4sQL#_fVi~|8 zcUW-@HA^_&o4*`ic<4{2vEB*OFYuYZZM-&uHHts1)REG))CuFA z{b6`ei36ySY;NNU1nagqm$DTW4cQH(`JksNO${STxR8hoP?5y3 zh+)7)U4k+h${6 z!+UJ3>ImNRl_y8MdHK-p8xsJ1v~`kl^O$lm%lUWC2U;EgKX`R4j)bh)Nk`}&>(^et zYHA_7yWc}LK@MxtG%pVrMzDnsA>voH75}bJK+X)m8i@wtPKv>kS=Jrze_SCE#$C75 z^R(@+Qd4Kx>D5I~KcZ?@{b>DdSb>43w!Z%DV_=WD_ni$hl=yuY8hBkOSftWer+a1X zJwMw_9*hCPK<#mt^zj%@U7Lckd)*FWAD(`{-532~O))HhnkiI`MEaoDYLIo0P$$md zvt+_zA_(Hk9T>7AT@d0>`NHncnxro#lxSkItea=Eqq=|Op;e$LqmPW;nwsAsBX;u6 z`{!X%3%`tSb$TNc2^_B^9!gZl2hl5gKmP+sE_Z<5*}UZyQK|c;pI^`Wi7U&?a(;y9 zXHdqX_4fF-1&ij<=^Q!=3>bdGtYY8NC7pUt`<9e&c+3Odc;K}f{$(d%G%$YjhG4)c z9rPg*)X6Z1IKKByW-#|YEbAZ75ku6nj1gd$nZAX;!rT>03SBeo4XAVGZ}>zMg02yR z^z;F?s48sFOpJ=)oWvfT9MGphnh>h=i^O`_nC4Qt1T2%q)iK6rhDD(;0_mnJJ zK`UiP(S=~Fm&~$ff86O|T#Ur_fPKi=AbP7yY`#nzI@3HY>XQaH{q$>7xMhwj1{p(y_H32p;J*GJ}EY7yymadlu3lO*~=nA0>$D_$|5f|#6QDBq}=`myBFIX)pK znScoRR0G7y+y_!$Ev{V303iyQSj|e5PH`(ibL7In*IPd{F$;pK;&5aXfIpYHbA3`# zpl8i|+`0G9+zU0uVKcwB_D7t~jzfZ7!hMY&?#FX)KX2@OLJ61uYFr=viSzJOsLcHK|)#hQqdUltw@w#hM>WlWT$&?pN%7H^H%u5=PY%Q#Ya!R~1 zACQ6CX&%zJILEoi1yMJ!FP+H3i8k%nW+ZCs(-Z6UwtSTuDQhN@{kxj|?4RS3S;>~E zH{gL>LuV?rvT$Qyxz4B*4y!NDUlf;W+i1B-AF24Ws(kWKY0Z@3vbE;7TKuSJLww|K z!v%2WeK8Y#nug7q@e=MilRumWOP|$E9Do)Fu{!8{E~DwD zqubqwWDUY;a%=f0E_!4V=WZrtxBWi)OyZGK8U3H!(~eFf`8SCX`s&!75g7=pT*lQ# z+O&cjiBccp=+QrAv=z^xTE?PgKcdIO=&hubHiwKP_TQV@+WuBkrt)alq^GC5RRMP~ z|CIf=;cm)&fpgpsjz;qT#E0fGdwZLjLQhNG37=>9uM9dos`kFcaL{_*-y@OfY1lJj|H{M9t$+uGBE1Vs7@4^I2F`@{SP+0V>2 zesO?4@9$7(2N>v}8J)K}9{wTwz}+ z+}pBZ3{m#cha<^p1--b_cavaRac^6FAi>@eZ$mGe4(S zkbKf>)aey307IpE{^lPUAhA$WS4Z{?sXC2!vQL;0KiYu_a%QfIYFdimsxZzi3(qKv zoPk7FY>;1V#Yum0sZ}{O{Jc&i<&=wV`aOadP#O%Ga8%7$Wf}H= zwQ}CkaCPq*KcDqYRZu7MBxpD>f>Bz_+Af8`Nnp^oO1@?3GNZ|xRFo2Hi zDV1BBs2WIP;$tv)*t_spxq*lNvepw%iAyA(ymKmpfAl3xZb(Qu!<&xyO=rBF>BL}A zZIeioy`cqUaM+;Xn$*4a@bRya1kX06S2(m+R-bd)i&jj>qC@PBp0#jEetA_zg>h`5K$hO34oXtr>GdZs z9MkF4FSh9fhLinH5(`13)*i1wmrDNld%iHvlW&ACm{HQ1>V9PKl9!UqcKWHg)yP1*BS@&*_cVFI zW{`b@b+x6;p93@XGlBiII2z<_m99c^^bsYJ0p{C{JgGj?b04l|;P{$hAF%j=WjVht z-d~Mm#;*yX)}nIaCHRr`OXm^bnz)?OB|D-ICoAI0C+#&^@14NTEp9Ovjo3n^8JE*a zZTD0wFKEMgZILd8R_LA>s8c*vib1-%{0)rR7^_V@Jz#{Sdpa##~H*L5X9t-8Kj3~O>-+UZ5{Qv^c znE_>FWE8-mRmDn0N0+Oa%@J~C7~VIND)*;Z)Mdb6PYCZ!Ok-_T#Amg1jb!1^eN95U zu?VD5PMWT3@iNu@oU#Z}!|~7BQ`fx86ZczkNhBELAVK0uvE3aD7`>K_YC{B{ym`>$q>+!d@|HDAk}iUZJSO_kb^8 zG8QWG`Nv%6)`Fwgrl;lk7mwwvgrhueR}IAf#uct3^%r$$a5$D2^9|OY5Kq^3)5a8n zx!y3H4c6f28DIa?xwH3)cH0gq8ai(r&4=t>T%L4XO;(51U*}@6-zUic_bdFH{5F&0 zZhh}+k_~@;xjp-KDoO8=NHODlllSsk`Yte}!=XKw7`&F{wDYxf{U97> ztz{)?WhZ~O!3p5L$_c8Ec{EmrSRCVzf@o6E(uhXTru4fe86Yg#C2ojN4{l?Wier9s z?u_dj0cJgBtPuxEGakP~Zp{Piy7T~Fv-L>W$5<6%f*ch5j$-r zUmr_SZm6IXBdySLD0F^K)MpBWz!|pl&JCxCL=flu{YZ^*OaQUtS|;`MHEtj7dG%}I zDxw}yUV(1(cm7ySZY#NBSjYc1b%$iXF_LZ#&l{i8R3wuDrnz^b$e6{9_n7LZcqXqa z4P^yIOQ(h3ZO#uGC%`Ugi5d!>*43G=7Y(<_M)d^_<(zI@q#23v`V;EM)Pl z;?!4@g`#jwCW?b``zDhH2d<0^&or=FWI$?o%R$bJ24oK48ZOG0hG3VV40ayZYcgTq zHfO0p(hrK&$4LovsF7gU7urcWr5*Y;l^Q6dWcgkB1GxDzpeVvZyl=9>Otg|>nbN~AbdkdWr`3Z*05XSIzLGY1-PsvvT+rWS3d6AjchO4Nz%5B?}0MB^WQ zOUV5crhJE^7vkC_OHPYiG8OlwXuiL2odvc z0lMv4K+$pcpugZDDxovbe*;WqkzRx#y^WJf2!;!uo9Sc9r~FDWNVLL+V)RE4*mVx5 zdBxDS7&RPcDc3B1vJkL1Z!Mv5iQjRjH$DrnH9r`#1eqUEuob>qb1bOQX(R7j`g6IClrGUwq%nApMSE{ z#1k!}Bn5AOkSHbt@g6TG^&;@$S!mNWi?jOX$2DwgvIl!;8MiLMxK^Vz+3XdAJElxb zvN@$U^~2wyiOyVz9QrAAW}8T~aNKiMx-7rLe2czz6ymD0W^!*FuU?KTV-A%LBFJ7w z&Yn|`AOpgPu9VR+F}Wp?KEu5|H;*D4ONMg1M(s!WqNNhk>Z373Z3sK(Q^v?4v7D|% z|G}DlUY_zx^Rasod_?MI`g|qS5&?$0&0K+If}htj0MZk4sRZs%40*~@#$}8{GPi6d zc-GDgQP}Etqe1h+5Q;LnQ7;*jsDXfIlb`OeO;Ap7#^jyf!3)pZ3nw)|*t~_t0%GZU~;F zX7}WaH}H}kM8RmlSM2Zc6zBYn0Ir%(s(;}I%L?#O6wLXMB6y!!Y*t#i-Rwb^V8j}< zWJ@)-qZx}6G%ss)0R{l)q}@wP^Uise$A70h%$h%pB5${TKj$hUt(t5OZkPv`d%cOV z@;PM1_7oY&pN}c2!(_SN`I#{ul`CZh##`gdS4^|n_Kx1Jn}@^iC5o}xPQS3#xp%9j zca&1u95HEPXyMpb;cP5O5*o^b2TcLmjBS7&nju@d48ctb1Kpl zZkVeggtngTSg$5gYpbsZbQ`$>MXN*iJ^*40#}F8w0-)_ca5-0#tr{< zztI*FLOi)llbhHYc^`*e{$$IiZ_ZpaT0d zz|5JPXUy$|z~Ay?nyPv#RZ7r^zo42c(p1(t&^;N2 z4C{t>K!rx%Uyd}m^2`D-ne)?KeZBnYs8I*}urL@8AGe9bv`k!7J>`&^Ykf=b0zW^l04RO ze(MVxx;yQBbxh;kT$n1Yk}bQlj=)-}6`5(PN7zcXhPCNkanf-xfhYUB_U0Mc2KCkx z4F``-+n;Mz1e0wqcG zg*I=?YdXiU&6kqLQY(Qm8}C(c zMa-jom=1rcfEPuw>Em=N78Pq9yw0n42IXJ249sy@q7zf4j_tMc0}8mBkwUiih^Z-3 z(@vRUX6ikbej>UYsFE_V)%C_vF;0`M=jVs~$NCCY5?NGQO+e0Cbn=Z1KoUBYcFDPn z=AFThbgXYvG($Zoeg>L7mGJnJ5=wf59IfbZN8%IYy{FIM#AgB4rC2jQR08ENuyyj1 z#jfI9E=Sw^n3|?_AOg1rr^Kuk(bW2o@=F)c{y;$=j=bO%qg058I@r*~1t$ZW67}GB zV|&h2BkP<3BY4vlxfq)ZsMk%$*VyqgvOZ;L8IP`MF`-&VIUKol)#dw_7$%6gbKycO z!g4r@NA`+8^igAJwkD>^gu0z8Rl(LgbX>m|Fb4>j9_Jx@3^wea{jlUHEDs?Yuhmd6tOde8lDI98hth{oa(rq))MuLr80Fx z^&&VWr6YNBXWLvW$zgLNTk2G5cT9If_qNo$cL6tgl{+fSu84j^>XmpW-&6^3aB?~R zfz*?a?;Olqa$KDa5jf-~+=N8W2-Y2^;;bFN`Slk#){sXVSM(nSZ zHvd(Mg|6*5_}TuJxctY)-(sBq!s&5v82&W}2ghGDWkmG0;6D@oeyIGvKjweB8)TC* k=63tfYwujUb^=TJ>HwgJXcG|rwo7w;p{`x4a`@f*FS>_7ZvX%Q