From 18a26d7e1afeff5a9c07efee284f73a97e4969cb Mon Sep 17 00:00:00 2001 From: dimok321 <15055714+dimok789@users.noreply.github.com> Date: Sun, 12 Dec 2010 16:31:13 +0000 Subject: [PATCH] *Fixed booting games for huge ext2/3/4 drives *Rewrote complete main menu function *Moved ext2/3/4 disc cache to mem2 as on FAT/NTFS (added ext2 as custom lib due to that) *Added missing header files from R1011 for ext support *Fixed crash on Numpad when pressing a button *Fixed boot of WiiMC *Changed SVN line ending to LF (Unix style) --- Languages/norwegian.lang | 2764 ++++++++-------- Make.config.default | 24 +- Makefile | 23 +- data/app_booter.dol | Bin 100768 -> 105856 bytes gui.pnproj | 2 +- source/ZipFile.h | 116 +- source/banner/MD5.h | 482 +-- source/bannersound.h | 12 +- source/gecko.c | 2 +- source/homebrewboot/dolloader.c | 83 +- source/homebrewboot/dolloader.h | 10 +- source/libs/libext2fs/bitops.h | 638 ++++ source/libs/libext2fs/com_err.h | 70 + source/libs/libext2fs/ext2_err.h | 152 + source/libs/libext2fs/ext2_ext_attr.h | 71 + source/libs/libext2fs/ext2_frag.c | 9 +- source/libs/libext2fs/ext2_frag.j | 107 + source/libs/libext2fs/ext2_io.h | 136 + source/libs/libext2fs/ext2_types.h | 18 + source/libs/libext2fs/ext2fs.h | 11 +- source/libs/libext2fs/ext3_extents.h | 109 + source/libs/libext2fs/libcustomext2fs.a | Bin 0 -> 398524 bytes source/libs/libext2fs/mem_allocate.h | 21 +- source/libs/libwbfs/rijndael.c | 864 ++--- source/libs/libwbfs/wiidisc.h | 136 +- source/libwiigui/gui.h | 6 - source/libwiigui/gui_element.cpp | 1640 +++++----- source/libwiigui/gui_gamebrowser.cpp | 6 +- source/libwiigui/gui_gamebrowser.h | 2 +- source/libwiigui/gui_gamecarousel.cpp | 4 +- source/libwiigui/gui_gamecarousel.h | 2 +- source/libwiigui/gui_gamegrid.cpp | 2 +- source/libwiigui/gui_gamegrid.h | 2 +- source/libwiigui/gui_numpad.cpp | 8 +- source/libwiigui/gui_searchbar.h | 4 + source/lstub.cpp | 200 +- source/memory/memory.h | 72 +- source/menu/GameBrowseMenu.cpp | 1341 ++++++++ source/menu/GameBrowseMenu.hpp | 155 + source/menu/menu_disclist.cpp | 1637 +--------- source/mload/modules/ehcmodule_5.c | 3170 +++++++++---------- source/network/http.c | 522 +-- source/prompts/PromptWindows.cpp | 38 +- source/prompts/PromptWindows.h | 2 +- source/settings/menus/FlyingButtonsMenu.cpp | 12 +- source/settings/menus/GUISettingsMenu.cpp | 4 + source/settings/menus/UninstallSM.cpp | 10 + source/settings/newtitles.h | 72 +- source/sys.cpp | 2 +- source/sys.h | 2 +- source/themes/Theme_Downloader.h | 30 +- source/usbloader/frag.c | 1 + source/usbloader/splits.c | 696 ++-- source/usbloader/splits.h | 92 +- source/usbloader/wbfs/wbfs_base.cpp | 288 +- source/usbloader/wbfs/wbfs_rw.c | 336 +- source/usbloader/wbfs/wbfs_rw.h | 50 +- source/usbloader/wbfs/wbfs_wbfs.h | 68 +- source/utils/rockout.cpp | 35 + source/utils/rockout.h | 6 + source/utils/tools.h | 6 + source/wad/utils.h | 46 +- 62 files changed, 8844 insertions(+), 7585 deletions(-) create mode 100644 source/libs/libext2fs/bitops.h create mode 100644 source/libs/libext2fs/com_err.h create mode 100644 source/libs/libext2fs/ext2_err.h create mode 100644 source/libs/libext2fs/ext2_ext_attr.h create mode 100644 source/libs/libext2fs/ext2_frag.j create mode 100644 source/libs/libext2fs/ext2_io.h create mode 100644 source/libs/libext2fs/ext2_types.h create mode 100644 source/libs/libext2fs/ext3_extents.h create mode 100644 source/libs/libext2fs/libcustomext2fs.a create mode 100644 source/menu/GameBrowseMenu.cpp create mode 100644 source/menu/GameBrowseMenu.hpp create mode 100644 source/utils/rockout.cpp create mode 100644 source/utils/rockout.h create mode 100644 source/utils/tools.h diff --git a/Languages/norwegian.lang b/Languages/norwegian.lang index af180410..dbef7817 100644 --- a/Languages/norwegian.lang +++ b/Languages/norwegian.lang @@ -1,1382 +1,1382 @@ -# USB Loader GX language source file. -# norwegian.lang - r813 -# don't delete/change this line (é). -msgid "" -msgstr "" -"Project-Id-Version: USB Loader GX\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-05-30 23:36+0200\n" -"PO-Revision-Date: 2009-10-01 01:00+0200\n" -"Last-Translator: raschi\n" -"Language-Team: raschi\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" - -msgid " " -msgstr "" - -msgid " Wad Saved as:" -msgstr " WAD lagret som:" - -msgid " could not be downloaded." -msgstr " kan ikke lastes ned." - -msgid " has been Saved. The text has not been verified. Some of the code may not work right with each other. If you experience trouble, open the text in a real text editor for more information." -msgstr " har blitt lagret. Teksten har ikke blitt verifisert. Noe av koden vil kanskje ikke fungere riktig. Hvis du fÃ¥r problemer, Ã¥pne teksten i et ekte redigeringsprogram for mer informasjon." - -msgid " is not on the server." -msgstr " finnes ikke pÃ¥ serveren." - -#, c-format -msgid "%s : %s May not boot correctly if your System Menu is not up to date." -msgstr "%s : %s vil kanskje ikke starte riktig hvis System Menyen ikke er oppdatert." - -msgid "0 (Everyone)" -msgstr "0 (Alle)" - -msgid "1 (Child 7+)" -msgstr "1 (Barn 7+)" - -msgid "1 hour" -msgstr "1 time" - -msgid "10 min" -msgstr "" - -msgid "2 (Teen 12+)" -msgstr "2 (Ungdom 12+)" - -msgid "20 min" -msgstr "" - -msgid "2D Cover Path" -msgstr "2D Cover sti" - -msgid "3 (Mature 16+)" -msgstr "3 (Ungdom 16+)" - -msgid "3 min" -msgstr "" - -msgid "30 min" -msgstr "" - -msgid "3D Cover Path" -msgstr "3D Cover sti" - -msgid "3D Covers" -msgstr "3D cover" - -msgid "4 (Adults Only 18+)" -msgstr "4 (Voksen 18+)" - -msgid "5 min" -msgstr "" - -msgid ">> Deleting tickets..." -msgstr ">> Sletter tickets..." - -msgid ">> Deleting tickets...ERROR! " -msgstr ">> Sletter tickets...FEIL! " - -msgid ">> Deleting tickets...Ok! " -msgstr ">> Sletter tickets...OK! " - -msgid ">> Deleting title ...ERROR! " -msgstr ">> Sletter tittel ...FEIL! " - -msgid ">> Deleting title ...Ok!" -msgstr ">> Sletter tittel ...OK!" - -msgid ">> Deleting title contents..." -msgstr ">> Sletter tittel innhold..." - -msgid ">> Deleting title contents...ERROR! " -msgstr ">> Sletter tittel innhold...FEIL! " - -msgid ">> Deleting title contents...Ok!" -msgstr ">> Sletter tittel innhold...OK!" - -msgid ">> Deleting title..." -msgstr ">> Sletter tittel..." - -msgid ">> Finishing installation..." -msgstr ">> Sluttfører installasjon..." - -msgid ">> Installing content #" -msgstr ">> Installerer innhold #" - -msgid ">> Installing ticket..." -msgstr ">> Installerer ticket..." - -msgid ">> Installing title..." -msgstr ">> Installerer tittel..." - -msgid ">> Reading WAD data..." -msgstr ">> Leser WAD data..." - -msgid ">> Reading WAD data...ERROR! " -msgstr ">> Leser WAD data...FEIL! " - -msgid ">> Reading WAD data...Ok!" -msgstr ">> Leser WAD data...OK!" - -msgid "AUTO" -msgstr "" - -msgid "All partitions" -msgstr "" - -msgid "All the features of USB Loader GX are unlocked." -msgstr "Alle funksjonene til USB Loader GX er opplÃ¥st." - -msgid "Alternate DOL" -msgstr "Alternativ DOL" - -msgid "An Error occured" -msgstr "En feil oppstod" - -msgid "Anti" -msgstr "" - -msgid "App Language" -msgstr "Program sprÃ¥k" - -msgid "Apr" -msgstr "" - -msgid "Are you sure you want to enable Parent Control?" -msgstr "" - -msgid "Are you sure?" -msgstr "Er du sikker?" - -msgid "Aug" -msgstr "" - -msgid "Author:" -msgstr "Forfatter:" - -msgid "AutoInit Network" -msgstr "Autostart nettverk" - -msgid "AutoPatch" -msgstr "" - -msgid "BCA Codes Path" -msgstr "" - -msgid "BCA Codes Path changed" -msgstr "" - -msgid "BETA revisions" -msgstr "" - -msgid "Back" -msgstr "Tilbake" - -msgid "Back to HBC or Wii Menu" -msgstr "Tilbake til HBC eller Wii meny" - -msgid "Back to Loader" -msgstr "HBC/Loader" - -msgid "Back to Wii Menu" -msgstr "Wii meny" - -msgid "Backgroundmusic" -msgstr "Bakgrunnsmusikk" - -msgid "Big thanks to:" -msgstr "Stor takk til:" - -msgid "Block IOS Reload" -msgstr "Blokkér IOS Reload" - -msgid "Boot/Standard" -msgstr "Boot/Standard" - -msgid "Boot?" -msgstr "Start?" - -msgid "Both" -msgstr "Begge" - -msgid "Can't be formatted" -msgstr "Kan ikke formateres" - -msgid "Can't create directory" -msgstr "Kan ikke opprette mappe" - -msgid "Can't create file" -msgstr "Kan ikke opprette fil" - -msgid "Can't delete:" -msgstr "Kan ikke slette:" - -msgid "Cancel" -msgstr "Avbryt" - -msgid "Change Play Path" -msgstr "" - -msgid "Channels" -msgstr "Kanaler" - -msgid "Cheatfile is blank" -msgstr "Juksefil er blank" - -msgid "Checking existing artwork" -msgstr "Sjekker eksisterende bilder" - -msgid "Checking for Updates" -msgstr "Søker etter oppdateringer" - -msgid "Click to Download Covers" -msgstr "Klikk for Ã¥ laste ned cover" - -msgid "Click to change game ID" -msgstr "Klikk for Ã¥ endre spill ID" - -msgid "Clock" -msgstr "Klokke" - -msgid "Close" -msgstr "Lukk" - -msgid "Code Download" -msgstr "Kode nedlasting" - -#, c-format -msgid "Coded by: %s" -msgstr "Kodet av: %s" - -msgid "Coding:" -msgstr "Koding:" - -msgid "Confirm" -msgstr "Bekreft" - -msgid "Connection lost..." -msgstr "" - -msgid "Console" -msgstr "Konsoll" - -msgid "Console Default" -msgstr "Konsoll Standard" - -msgid "Console Locked" -msgstr "Konsoll lÃ¥st" - -msgid "Console should be unlocked to modify it." -msgstr "Konsoll mÃ¥ være opplÃ¥st for Ã¥ modifisere." - -msgid "Continue to install game?" -msgstr "Fortsett Ã¥ installere spill?" - -msgid "Controllevel" -msgstr "KontrollnivÃ¥" - -msgid "Correct Password" -msgstr "Riktig passord" - -msgid "Could not create GCT file" -msgstr "Kan ikke opprette GCT fil" - -msgid "Could not find a WBFS partition." -msgstr "Kan ikke finne en WBFS partisjon." - -msgid "Could not initialize DIP module!" -msgstr "Kan ikke initialisere DIP modul!" - -msgid "Could not initialize network!" -msgstr "Kan ikke initialisere nettverk!" - -msgid "Could not open Disc" -msgstr "Kan ikke Ã¥pne plate" - -msgid "Could not open WBFS partition" -msgstr "Kan ikke Ã¥pne WBFS partisjon" - -msgid "Could not read the disc." -msgstr "Kan ikke lese plate." - -msgid "Could not save." -msgstr "Kan ikke lagre." - -msgid "Could not set USB." -msgstr "Kan ikke velge USB." - -msgid "Cover Download" -msgstr "Cover nedlasting" - -msgid "Cover Path Changed" -msgstr "Cover sti endret" - -msgid "Create" -msgstr "Opprett" - -msgid "Credits" -msgstr "Medvirkende" - -msgid "Custom Paths" -msgstr "Endre stier" - -msgid "Customs/Original" -msgstr "Custom/Original" - -msgid "DOL Path" -msgstr "DOL sti" - -msgid "DOL path changed" -msgstr "DOL sti endret" - -msgid "Dec" -msgstr "Des" - -msgid "Default" -msgstr "Standard" - -msgid "Default Gamesettings" -msgstr "Standard innstillinger" - -msgid "Default Settings" -msgstr "Standard innstillinger" - -msgid "Delete" -msgstr "Slett" - -msgid "Delete ?" -msgstr "Slett ?" - -msgid "Delete Cheat GCT" -msgstr "Slett juksefil GCT" - -msgid "Delete Cheat TXT" -msgstr "Slett juksefil TXT" - -msgid "Delete Cover Artwork" -msgstr "Slett cover" - -msgid "Delete Disc Artwork" -msgstr "Slett platebilde" - -msgid "Design:" -msgstr "" - -msgid "Developed by" -msgstr "Utviklet av" - -msgid "Directory does not exist!" -msgstr "Mappestruktur finnes ikke!" - -msgid "Disc Artwork Download" -msgstr "Platebilde nedlasting" - -msgid "Disc Artwork Path" -msgstr "Platebilde sti" - -msgid "Disc Default" -msgstr "Spill Standard" - -msgid "Disc Images" -msgstr "Plate bilder" - -msgid "Disc Path Changed" -msgstr "Plate sti endret" - -msgid "DiskFlip" -msgstr "Snu plate" - -msgid "Display" -msgstr "Vis" - -msgid "Display as a carousel" -msgstr "Vis som karusell" - -msgid "Display as a grid" -msgstr "Vis som rutemønster" - -msgid "Display as a list" -msgstr "Vis som liste" - -msgid "Display favorites" -msgstr "Vis favoritter" - -msgid "Do you really want to delete:" -msgstr "Er du sikker pÃ¥ at du vil slette:" - -msgid "Do you want to apply it now?" -msgstr "" - -msgid "Do you want to change language?" -msgstr "Vil du endre sprÃ¥k?" - -msgid "Do you want to download this theme?" -msgstr "Vil du laste ned dette temaet?" - -msgid "Do you want to format:" -msgstr "Vil du formatere:" - -msgid "Do you want to retry for 30 secs?" -msgstr "Vil du fortsette Ã¥ prøve i 30 sekunder?" - -msgid "Do you want to use the alternate DOL that is known to be correct?" -msgstr "Vil du bruke alt DOL filen som er kjent for Ã¥ være riktig?" - -msgid "Do you wish to update/download all language files?" -msgstr "Vil du oppdatere/laste ned alle sprÃ¥kfiler?" - -msgid "Done!" -msgstr "Ferdig!" - -msgid "Download" -msgstr "Last ned" - -msgid "Download Boxart image?" -msgstr "Last ned cover bilde?" - -msgid "Download Discart image?" -msgstr "Last ned plate bilde?" - -msgid "Download Now" -msgstr "Last ned nÃ¥" - -msgid "Download failed." -msgstr "Nedlasting feilet." - -msgid "Download finished" -msgstr "Nedlasting ferdig" - -msgid "Download request failed." -msgstr "Nedlast spørring feilet." - -msgid "Downloading" -msgstr "Laster ned" - -msgid "Downloading Page List:" -msgstr "Laster ned side liste:" - -msgid "Downloading file" -msgstr "Laster ned fil" - -msgid "Downloading image:" -msgstr "Laster ned bilde:" - -msgid "Dutch" -msgstr "Nederlandsk" - -msgid "ERROR" -msgstr "FEIL" - -msgid "ERROR:" -msgstr "FEIL:" - -msgid "ERROR: Can't set up theme." -msgstr "" - -msgid "Enable Parental Control" -msgstr "" - -msgid "English" -msgstr "Engelsk" - -msgid "Error" -msgstr "Feil" - -msgid "Error !" -msgstr "Feil !" - -msgid "Error 002 fix" -msgstr "Error 002 fiks" - -msgid "Error reading Disc" -msgstr "Feil ved lesing av plate" - -msgid "Error while transfering data." -msgstr "Feil ved overføring av data." - -msgid "Error..." -msgstr "Feil..." - -msgid "Error:" -msgstr "Feil:" - -msgid "Extracting files..." -msgstr "Pakker ut filer..." - -msgid "FAT: Use directories" -msgstr "" - -msgid "Failed formating" -msgstr "Feil ved formatering" - -msgid "Failed to extract." -msgstr "Utpakking feilet." - -msgid "Failed to open partition" -msgstr "Feil ved Ã¥pning av partisjon" - -msgid "Feb" -msgstr "" - -msgid "File not found." -msgstr "Fil ikke funnet." - -msgid "Finishing installation... Ok!" -msgstr "Sluttfører installasjon... OK!" - -msgid "Flip-X" -msgstr "" - -msgid "Force" -msgstr "Tving" - -msgid "Format" -msgstr "Formatér" - -msgid "Formatting, please wait..." -msgstr "Formaterer, vennligst vent..." - -msgid "Free Space" -msgstr "Ledig plass" - -msgid "French" -msgstr "Fransk" - -msgid "Full Shutdown" -msgstr "Skru helt av" - -msgid "GAMEID_Gamename" -msgstr "" - -msgid "GCT Cheatcodes Path" -msgstr "GCT Juksekode sti" - -msgid "GCT Cheatcodes Path changed" -msgstr "GCT Juksekode sti endret" - -msgid "GCT File created" -msgstr "GCT fil opprettet" - -msgid "GUI Settings" -msgstr "GUI innstillinger" - -msgid "GXtheme.cfg not found in any subfolder." -msgstr "" - -msgid "Game ID" -msgstr "Spill ID" - -msgid "Game Language" -msgstr "SprÃ¥k" - -msgid "Game Load" -msgstr "Lasting av spill" - -msgid "Game Region" -msgstr "Region" - -msgid "Game Size" -msgstr "Spill størrelse" - -msgid "Game Sound Mode" -msgstr "" - -msgid "Game Sound Volume" -msgstr "" - -msgid "Game is already installed:" -msgstr "Spillet er allerede installert:" - -msgid "Game partition" -msgstr "" - -msgid "Gamename [GAMEID]" -msgstr "" - -msgid "Games" -msgstr "Spill" - -msgid "German" -msgstr "Tysk" - -msgid "HOME Menu" -msgstr "HOME Meny" - -msgid "Hermes CIOS" -msgstr "" - -msgid "Homebrew Apps Path" -msgstr "Homebrew Apps sti" - -msgid "Homebrew Appspath changed" -msgstr "Homebrew Apps sti endret" - -msgid "Homebrew Launcher" -msgstr "Homebrew Laster" - -msgid "Hour" -msgstr "Timer" - -msgid "How do you want to update?" -msgstr "Hvordan vil du oppdatere?" - -msgid "How to Shutdown?" -msgstr "Hvordan skru av?" - -msgid "If you don't have WiFi, press 1 to get an URL to get your WiiTDB.zip" -msgstr "Hvis du ikke har WiFi, klikk 1 for Ã¥ fÃ¥ en URL til din WiiTDB.zip" - -#, c-format -msgid "Incoming file %0.2fKB" -msgstr "Laster ned fil %0.2fKB" - -#, c-format -msgid "Incoming file %0.2fMB" -msgstr "Laster ned fil %0.2fMB" - -msgid "Initializing Network" -msgstr "Initialiserer nettverk" - -msgid "Insert Disk" -msgstr "Sett inn plate" - -msgid "Insert a Wii Disc!" -msgstr "Sett inn en Wii plate!" - -msgid "Insert an SD-Card to download images." -msgstr "Sett inn et SD-kort for Ã¥ laste ned bilder." - -msgid "Insert an SD-Card to save." -msgstr "Sett inn et SD-kort for Ã¥ lagre." - -msgid "Insert an SD-Card to use this option." -msgstr "Sett inn et SD-kort for Ã¥ bruke innstillingen." - -msgid "Install" -msgstr "Installér" - -msgid "Install 1:1 Copy" -msgstr "" - -msgid "Install Error!" -msgstr "Installasjonsfeil!" - -msgid "Install a game" -msgstr "Installér et spill" - -msgid "Install not possible" -msgstr "" - -msgid "Install partitions" -msgstr "" - -msgid "Installing content... Ok!" -msgstr "Installerer innhold... OK!" - -msgid "Installing game:" -msgstr "Installerer spill:" - -msgid "Installing ticket... Ok!" -msgstr "Installerer ticket... OK!" - -msgid "Installing title... Ok!" -msgstr "Installerer tittel... OK!" - -msgid "Installing wad" -msgstr "Installerer WAD" - -msgid "Invalid PIN code" -msgstr "" - -msgid "It seems that you have some information that will be helpful to us. Please pass this information along to the DEV team." -msgstr "Det ser ut til at du har informasjon som kan være nyttig for oss. Vennligst videresend denne informasjonen til utviklerteamet." - -msgid "Italian" -msgstr "Italiensk" - -msgid "Jan" -msgstr "" - -msgid "Japanese" -msgstr "Japansk" - -msgid "July" -msgstr "Jul" - -msgid "June" -msgstr "Jun" - -msgid "Keep" -msgstr "Behold" - -msgid "Keyboard" -msgstr "Tastatur" - -msgid "Korean" -msgstr "Koreansk" - -msgid "Language File" -msgstr "SprÃ¥k Fil" - -msgid "Language change:" -msgstr "Endre sprÃ¥k" - -msgid "Languagepath changed." -msgstr "SprÃ¥ksti endret." - -msgid "Left" -msgstr "Venstre" - -msgid "Like SysMenu" -msgstr "Lik Systemmeny" - -msgid "Load" -msgstr "Start" - -msgid "Load From SD/USB" -msgstr "Start fra SD/USB" - -#, c-format -msgid "Load file from: %s ?" -msgstr "Start fil fra: %s ?" - -msgid "Load this DOL as alternate DOL?" -msgstr "Last denne DOL som alternativ DOL?" - -msgid "Loading standard language." -msgstr "Laster standard sprÃ¥k." - -msgid "Loading standard music." -msgstr "Laster standard musikk." - -msgid "Lock Console" -msgstr "LÃ¥s konsoll" - -msgid "Locked" -msgstr "LÃ¥st" - -msgid "Loop Directory" -msgstr "" - -msgid "Loop Music" -msgstr "" - -msgid "Loop Sound" -msgstr "" - -msgid "Mar" -msgstr "" - -msgid "Mark new games" -msgstr "" - -msgid "May" -msgstr "Mai" - -msgid "Missing files" -msgstr "Manglende filer" - -msgid "Most likely it has dimensions that are not evenly divisible by 4." -msgstr "Sannsynligvis har bildet dimensjoner som ikke kan deles med 4." - -msgid "Mount DVD drive" -msgstr "Last DVD stasjon" - -msgid "Music Loop Mode" -msgstr "" - -msgid "Music Volume" -msgstr "Musikk volum" - -msgid "Neither" -msgstr "Ingen" - -msgid "Network init error" -msgstr "Nettverk init feil" - -msgid "New Disc Detected" -msgstr "Ny plate oppdaget" - -msgid "Next" -msgstr "Neste" - -msgid "No" -msgstr "Nei" - -msgid "No .dol or .elf files found." -msgstr "Ingen .dol eller .elf filer funnet." - -msgid "No Cheatfile found" -msgstr "Ingen juksefil funnet" - -msgid "No DOL file found on disc." -msgstr "Ingen DOL fil funnet pÃ¥ plate." - -msgid "No Favorites" -msgstr "Ingen favoritter" - -msgid "No SD-Card inserted!" -msgstr "Intet SD-kort satt i!" - -msgid "No USB Device" -msgstr "Ingen USB enhet" - -msgid "No USB Device found." -msgstr "Ingen USB enhet funnet." - -msgid "No WBFS or FAT/NTFS partition found" -msgstr "" - -msgid "No cheats were selected" -msgstr "Ingen juksefiler valgt" - -msgid "No data could be read." -msgstr "Ingen data kan leses." - -msgid "No file missing!" -msgstr "Ingen filer mangler!" - -msgid "No new updates." -msgstr "Ingen nye oppdateringer." - -msgid "No themes found on the site." -msgstr "Ingen temaer funnet pÃ¥ websiden." - -msgid "None" -msgstr "" - -msgid "Normal" -msgstr "" - -msgid "Normal Covers" -msgstr "Normale cover" - -msgid "Not Found" -msgstr "Ikke funnet" - -msgid "Not a DOL/ELF file." -msgstr "Ikke en DOL/ELF fil." - -msgid "Not a WAD file." -msgstr "" - -msgid "Not a Wii Disc" -msgstr "Ikke en Wii plate" - -msgid "Not enough free memory." -msgstr "Ikke nok ledig minne." - -msgid "Not enough free space!" -msgstr "Ikke nok ledig plass!" - -msgid "Not supported format!" -msgstr "Ikke et støttet format!" - -msgid "Nov" -msgstr "" - -msgid "OFF" -msgstr "AV" - -msgid "OK" -msgstr "" - -msgid "ON" -msgstr "PÃ…" - -msgid "Oct" -msgstr "Okt" - -msgid "Official Site:" -msgstr "Offisiell nettside:" - -msgid "Only Customs" -msgstr "Kun custom" - -msgid "Only Original" -msgstr "Kun original" - -msgid "Only for Install" -msgstr "Kun for installering" - -msgid "Original/Customs" -msgstr "Original/Custom" - -msgid "Parental Control" -msgstr "Foreldrekontroll" - -msgid "Parental Control disabled" -msgstr "" - -msgid "Partition" -msgstr "Partisjon" - -msgid "Password" -msgstr "Passord" - -msgid "Password Changed" -msgstr "Passord endret" - -msgid "Password has been changed" -msgstr "Passord har blitt endret" - -msgid "Paste it into your browser to get your WiiTDB.zip." -msgstr "Lim den inn i nettleseren din for Ã¥ fÃ¥ WiiTDB.zip." - -msgid "Patch Country Strings" -msgstr "Patch land strenger" - -msgid "Pick from a list" -msgstr "Velg fra liste" - -msgid "Play Count" -msgstr "Ganger spilt" - -msgid "Play Next" -msgstr "" - -msgid "Play Once" -msgstr "" - -msgid "Play Previous" -msgstr "" - -msgid "Playing Music:" -msgstr "" - -msgid "Please wait..." -msgstr "Vennligst vent..." - -msgid "Power off the Wii" -msgstr "Skru av Wii" - -msgid "Prev" -msgstr "Forrige" - -msgid "Prompts Buttons" -msgstr "Dialog knapper" - -msgid "Published by" -msgstr "Publisert av" - -msgid "Quick Boot" -msgstr "Hurtig start" - -msgid "Random Directory Music" -msgstr "" - -msgid "Reading WAD data... Ok!" -msgstr "Leser WAD data... OK!" - -msgid "Receiving file from:" -msgstr "Mottar fil fra:" - -msgid "Released" -msgstr "Utgitt" - -msgid "Reload SD" -msgstr "Les SD pÃ¥ nytt" - -msgid "Remove update" -msgstr "" - -msgid "Rename Game on WBFS" -msgstr "Gi nytt navn til spill pÃ¥ WBFS" - -msgid "Reset BG Music" -msgstr "" - -msgid "Reset Playcounter" -msgstr "Nullstill teller" - -msgid "Reset to standard BGM?" -msgstr "" - -msgid "Restarting..." -msgstr "Starter pÃ¥ nytt..." - -msgid "Return" -msgstr "GÃ¥ tilbake" - -msgid "Return to Wii Menu" -msgstr "Tilbake til Wii meny" - -msgid "Right" -msgstr "Høyre" - -msgid "Rumble" -msgstr "Vibrasjon" - -msgid "SChinese" -msgstr "S.Kinesisk" - -msgid "SFX Volume" -msgstr "Effekt volum" - -msgid "Save" -msgstr "Lagre" - -msgid "Save Failed" -msgstr "Lagring feilet" - -msgid "Save Game List to" -msgstr "Lagre spilliste som" - -msgid "Saved" -msgstr "Lagret" - -msgid "Screensaver" -msgstr "Skjermbeskytter" - -msgid "Select" -msgstr "" - -msgid "Select a DOL" -msgstr "Velg en DOL fil" - -msgid "Selected DOL" -msgstr "Valgt DOL fil" - -msgid "Sept" -msgstr "Sep" - -msgid "Set Search-Filter" -msgstr "Angi søkefilter" - -msgid "Settings" -msgstr "Innstillinger" - -msgid "Shutdown System" -msgstr "Skru helt av" - -msgid "Shutdown to Idle" -msgstr "Skru av" - -msgid "Sort alphabetically" -msgstr "Sortér alfabetisk" - -msgid "Sort by rank" -msgstr "Sortér etter rangering" - -msgid "Sort order by most played" -msgstr "Sortér etter ganger spilt" - -msgid "Sound" -msgstr "Lyd" - -msgid "Sound+BGM" -msgstr "" - -msgid "Sound+Quiet" -msgstr "" - -msgid "Spanish" -msgstr "Spansk" - -msgid "Special thanks to:" -msgstr "Spesielt takk til:" - -msgid "Standard" -msgstr "Standard" - -msgid "Success" -msgstr "Suksess" - -msgid "Success:" -msgstr "Suksess:" - -msgid "Successfully Saved" -msgstr "Vellykket lagring" - -msgid "Successfully Updated" -msgstr "Vellykket oppdatering" - -msgid "Successfully Updated thanks to www.techjawa.com" -msgstr "" - -msgid "Successfully deleted:" -msgstr "Vellykket sletting:" - -msgid "Successfully extracted theme." -msgstr "Vellykket utpakking av tema." - -msgid "Successfully installed:" -msgstr "Vellykket installering:" - -msgid "System Default" -msgstr "System Standard" - -msgid "TChinese" -msgstr "T.Kinesisk" - -msgid "TXT Cheatcodes Path" -msgstr "TXTjuksekode sti" - -msgid "TXT Cheatcodes Path changed" -msgstr "TXTjuksekode sti endret" - -msgid "The entered directory does not exist. Would you like to create it?" -msgstr "Valgt mappe finnes ikke. Vil du opprette den?" - -msgid "The wad file was installed. But It could not be deleted from the SD card." -msgstr "WAD filen ble installert. Men ble ikke slettet fra SD kort." - -#, c-format -msgid "The wad installation failed with error %ld" -msgstr "WAD installasjonen feilet med feilkode %ld" - -msgid "Theme Download Path" -msgstr "Tema nedlasting sti" - -msgid "Theme Download Path changed" -msgstr "Tema nedlasting sti endret" - -msgid "Theme Downloader" -msgstr "Tema Nedlaster" - -msgid "Theme Path" -msgstr "Tema sti" - -msgid "Theme Path Changed" -msgstr "Tema sti endret" - -msgid "Theme Title:" -msgstr "Tema tittel:" - -msgid "Time left:" -msgstr "Tid igjen:" - -msgid "Title Launcher" -msgstr "Tittel Laster" - -msgid "Titles from WiiTDB" -msgstr "Titler fra WiiTDB" - -msgid "Tooltips" -msgstr "Verktøystips" - -msgid "Transfer failed." -msgstr "Overføring feilet." - -msgid "USB Device not found" -msgstr "USB enhet ikke funnet" - -msgid "USB Loader GX is protected" -msgstr "USB Loader GX er beskyttet" - -msgid "USB Loader GX will only run with Hermes CIOS rev 4! Please make sure you have revision 4 installed!" -msgstr "" - -#, c-format -msgid "Unable to open the wad that was just downloaded (%s)." -msgstr "Kan ikke Ã¥pne nedlastet WAD fil (%s)." - -msgid "Uninstall" -msgstr "Avinstallér" - -msgid "Uninstall Game" -msgstr "Avinstallér spill" - -msgid "Uninstall Menu" -msgstr "Avinstallér Meny" - -msgid "Uninstalling wad" -msgstr "Avinstallerer WAD" - -msgid "Unlock Parental Control" -msgstr "" - -msgid "Unlock console to use this option." -msgstr "LÃ¥s opp konsollen for Ã¥ bruke denne innstillingen." - -msgid "Unlocked" -msgstr "OpplÃ¥st" - -msgid "Unsupported format, try to extract manually." -msgstr "Format ikke støttet, prøv Ã¥ pakk ut manuelt." - -msgid "Update" -msgstr "Oppdater" - -msgid "Update All" -msgstr "Oppdater alt" - -msgid "Update DOL" -msgstr "Oppdater DOL" - -msgid "Update Files" -msgstr "Oppdater filer" - -msgid "Update Path" -msgstr "Oppdatering sti" - -msgid "Update Path changed." -msgstr "Oppdatering sti endret." - -msgid "Update all Language Files" -msgstr "Oppdater alle sprÃ¥kfiler" - -msgid "Update failed" -msgstr "Mislykket oppdatering" - -msgid "Update to" -msgstr "Oppdater til" - -msgid "Updating" -msgstr "Oppdaterer" - -msgid "Updating Language Files..." -msgstr "Oppdaterer sprÃ¥kfiler..." - -msgid "Updating Language Files:" -msgstr "Oppdaterer sprÃ¥kfiler:" - -msgid "Updating WiiTDB.zip" -msgstr "Oppdaterer WiiTDB.zip" - -msgid "Uploaded ZIP file installed to homebrew directory." -msgstr "Opplastet ZIP fil installert i homebrew mappen." - -msgid "VIDTV Patch" -msgstr "" - -#, c-format -msgid "Version: %s" -msgstr "Versjon: %s" - -msgid "Video Mode" -msgstr "Video modus" - -msgid "WIP Patches Path" -msgstr "" - -msgid "WIP Patches Path changed" -msgstr "" - -msgid "Waiting for USB Device" -msgstr "Venter pÃ¥ USB enhet" - -msgid "Waiting..." -msgstr "Venter..." - -msgid "What do you want to update?" -msgstr "Hva vil du oppdatere?" - -msgid "WiFi Features" -msgstr "WiFi egenskaper" - -msgid "Widescreen Fix" -msgstr "Widescreen fiks" - -msgid "Wii Menu" -msgstr "Wii Meny" - -msgid "Wii Settings" -msgstr "Wii Innstillinger" - -msgid "WiiTDB Files" -msgstr "WiiTDB filer" - -msgid "WiiTDB Path" -msgstr "WiiTDB sti" - -msgid "WiiTDB Path changed." -msgstr "WiiTDB sti endret." - -msgid "Wiilight" -msgstr "Wii DVD lys" - -msgid "Wrong Password" -msgstr "Feil passord" - -msgid "Yes" -msgstr "Ja" - -msgid "You are about to delete " -msgstr "Du er i ferd med Ã¥ slette " - -msgid "You are choosing to display favorites and you do not have any selected." -msgstr "Du prøver Ã¥ vise favoritter nÃ¥r du ikke har noen valgt." - -msgid "You are using NTFS filesystem. Due to possible write errors to a NTFS partition, installing a game is not possible." -msgstr "" - -msgid "You don't have Parental Control enabled. If you wish to use Parental Control, enable it in the Wii Settings." -msgstr "" - -msgid "You have attempted to load a bad image" -msgstr "Du har forsøkt Ã¥ vise et korrupt bilde" - -msgid "You need to select or format a partition" -msgstr "" - -#, c-format -msgid "Your URL has been saved in %sWiiTDB_URL.txt." -msgstr "Din URL ble lagret i %sWiiTDB_URL.txt." - -msgid "and translaters for language files updates" -msgstr "og oversettere for sprÃ¥kfiler" - -msgid "available" -msgstr "tilgjengelig" - -msgid "does not exist!" -msgstr "finnes ikke!" - -msgid "does not exist! Loading game without cheats." -msgstr "finnes ikke! Laster spill uten juksekode." - -msgid "does not exist! You Messed something up, Idiot." -msgstr "finnes ikke! Du har gjort noe galt." - -msgid "file left" -msgstr "fil gjenstÃ¥r" - -msgid "files left" -msgstr "filer gjenstÃ¥r" - -msgid "files not found on the server!" -msgstr "filer ikke funnet pÃ¥ serveren!" - -msgid "for FAT/NTFS support" -msgstr "" - -msgid "for Ocarina" -msgstr "" - -msgid "for WiiTDB and hosting covers / disc images" -msgstr "for WiiTDB og hosting av bilder" - -msgid "for diverse patches" -msgstr "for diverse patcher" - -msgid "for his awesome tool LibWiiGui" -msgstr "for hans rÃ¥e verktøy LibWiiGui" - -msgid "for hosting the themes" -msgstr "for hosting av tema" - -msgid "for hosting the update files" -msgstr "for hosting av oppdateringer" - -msgid "for the USB Loader source" -msgstr "for kilden til USB Loader" - -msgid "formatted!" -msgstr "formatert!" - -msgid "free" -msgstr "ledig" - -msgid "not set" -msgstr "ikke satt" - -msgid "of" -msgstr "av" - -msgid "seconds left" -msgstr "sekunder gjenstÃ¥r" +# USB Loader GX language source file. +# norwegian.lang - r813 +# don't delete/change this line (é). +msgid "" +msgstr "" +"Project-Id-Version: USB Loader GX\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-05-30 23:36+0200\n" +"PO-Revision-Date: 2009-10-01 01:00+0200\n" +"Last-Translator: raschi\n" +"Language-Team: raschi\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +msgid " " +msgstr "" + +msgid " Wad Saved as:" +msgstr " WAD lagret som:" + +msgid " could not be downloaded." +msgstr " kan ikke lastes ned." + +msgid " has been Saved. The text has not been verified. Some of the code may not work right with each other. If you experience trouble, open the text in a real text editor for more information." +msgstr " har blitt lagret. Teksten har ikke blitt verifisert. Noe av koden vil kanskje ikke fungere riktig. Hvis du fÃ¥r problemer, Ã¥pne teksten i et ekte redigeringsprogram for mer informasjon." + +msgid " is not on the server." +msgstr " finnes ikke pÃ¥ serveren." + +#, c-format +msgid "%s : %s May not boot correctly if your System Menu is not up to date." +msgstr "%s : %s vil kanskje ikke starte riktig hvis System Menyen ikke er oppdatert." + +msgid "0 (Everyone)" +msgstr "0 (Alle)" + +msgid "1 (Child 7+)" +msgstr "1 (Barn 7+)" + +msgid "1 hour" +msgstr "1 time" + +msgid "10 min" +msgstr "" + +msgid "2 (Teen 12+)" +msgstr "2 (Ungdom 12+)" + +msgid "20 min" +msgstr "" + +msgid "2D Cover Path" +msgstr "2D Cover sti" + +msgid "3 (Mature 16+)" +msgstr "3 (Ungdom 16+)" + +msgid "3 min" +msgstr "" + +msgid "30 min" +msgstr "" + +msgid "3D Cover Path" +msgstr "3D Cover sti" + +msgid "3D Covers" +msgstr "3D cover" + +msgid "4 (Adults Only 18+)" +msgstr "4 (Voksen 18+)" + +msgid "5 min" +msgstr "" + +msgid ">> Deleting tickets..." +msgstr ">> Sletter tickets..." + +msgid ">> Deleting tickets...ERROR! " +msgstr ">> Sletter tickets...FEIL! " + +msgid ">> Deleting tickets...Ok! " +msgstr ">> Sletter tickets...OK! " + +msgid ">> Deleting title ...ERROR! " +msgstr ">> Sletter tittel ...FEIL! " + +msgid ">> Deleting title ...Ok!" +msgstr ">> Sletter tittel ...OK!" + +msgid ">> Deleting title contents..." +msgstr ">> Sletter tittel innhold..." + +msgid ">> Deleting title contents...ERROR! " +msgstr ">> Sletter tittel innhold...FEIL! " + +msgid ">> Deleting title contents...Ok!" +msgstr ">> Sletter tittel innhold...OK!" + +msgid ">> Deleting title..." +msgstr ">> Sletter tittel..." + +msgid ">> Finishing installation..." +msgstr ">> Sluttfører installasjon..." + +msgid ">> Installing content #" +msgstr ">> Installerer innhold #" + +msgid ">> Installing ticket..." +msgstr ">> Installerer ticket..." + +msgid ">> Installing title..." +msgstr ">> Installerer tittel..." + +msgid ">> Reading WAD data..." +msgstr ">> Leser WAD data..." + +msgid ">> Reading WAD data...ERROR! " +msgstr ">> Leser WAD data...FEIL! " + +msgid ">> Reading WAD data...Ok!" +msgstr ">> Leser WAD data...OK!" + +msgid "AUTO" +msgstr "" + +msgid "All partitions" +msgstr "" + +msgid "All the features of USB Loader GX are unlocked." +msgstr "Alle funksjonene til USB Loader GX er opplÃ¥st." + +msgid "Alternate DOL" +msgstr "Alternativ DOL" + +msgid "An Error occured" +msgstr "En feil oppstod" + +msgid "Anti" +msgstr "" + +msgid "App Language" +msgstr "Program sprÃ¥k" + +msgid "Apr" +msgstr "" + +msgid "Are you sure you want to enable Parent Control?" +msgstr "" + +msgid "Are you sure?" +msgstr "Er du sikker?" + +msgid "Aug" +msgstr "" + +msgid "Author:" +msgstr "Forfatter:" + +msgid "AutoInit Network" +msgstr "Autostart nettverk" + +msgid "AutoPatch" +msgstr "" + +msgid "BCA Codes Path" +msgstr "" + +msgid "BCA Codes Path changed" +msgstr "" + +msgid "BETA revisions" +msgstr "" + +msgid "Back" +msgstr "Tilbake" + +msgid "Back to HBC or Wii Menu" +msgstr "Tilbake til HBC eller Wii meny" + +msgid "Back to Loader" +msgstr "HBC/Loader" + +msgid "Back to Wii Menu" +msgstr "Wii meny" + +msgid "Backgroundmusic" +msgstr "Bakgrunnsmusikk" + +msgid "Big thanks to:" +msgstr "Stor takk til:" + +msgid "Block IOS Reload" +msgstr "Blokkér IOS Reload" + +msgid "Boot/Standard" +msgstr "Boot/Standard" + +msgid "Boot?" +msgstr "Start?" + +msgid "Both" +msgstr "Begge" + +msgid "Can't be formatted" +msgstr "Kan ikke formateres" + +msgid "Can't create directory" +msgstr "Kan ikke opprette mappe" + +msgid "Can't create file" +msgstr "Kan ikke opprette fil" + +msgid "Can't delete:" +msgstr "Kan ikke slette:" + +msgid "Cancel" +msgstr "Avbryt" + +msgid "Change Play Path" +msgstr "" + +msgid "Channels" +msgstr "Kanaler" + +msgid "Cheatfile is blank" +msgstr "Juksefil er blank" + +msgid "Checking existing artwork" +msgstr "Sjekker eksisterende bilder" + +msgid "Checking for Updates" +msgstr "Søker etter oppdateringer" + +msgid "Click to Download Covers" +msgstr "Klikk for Ã¥ laste ned cover" + +msgid "Click to change game ID" +msgstr "Klikk for Ã¥ endre spill ID" + +msgid "Clock" +msgstr "Klokke" + +msgid "Close" +msgstr "Lukk" + +msgid "Code Download" +msgstr "Kode nedlasting" + +#, c-format +msgid "Coded by: %s" +msgstr "Kodet av: %s" + +msgid "Coding:" +msgstr "Koding:" + +msgid "Confirm" +msgstr "Bekreft" + +msgid "Connection lost..." +msgstr "" + +msgid "Console" +msgstr "Konsoll" + +msgid "Console Default" +msgstr "Konsoll Standard" + +msgid "Console Locked" +msgstr "Konsoll lÃ¥st" + +msgid "Console should be unlocked to modify it." +msgstr "Konsoll mÃ¥ være opplÃ¥st for Ã¥ modifisere." + +msgid "Continue to install game?" +msgstr "Fortsett Ã¥ installere spill?" + +msgid "Controllevel" +msgstr "KontrollnivÃ¥" + +msgid "Correct Password" +msgstr "Riktig passord" + +msgid "Could not create GCT file" +msgstr "Kan ikke opprette GCT fil" + +msgid "Could not find a WBFS partition." +msgstr "Kan ikke finne en WBFS partisjon." + +msgid "Could not initialize DIP module!" +msgstr "Kan ikke initialisere DIP modul!" + +msgid "Could not initialize network!" +msgstr "Kan ikke initialisere nettverk!" + +msgid "Could not open Disc" +msgstr "Kan ikke Ã¥pne plate" + +msgid "Could not open WBFS partition" +msgstr "Kan ikke Ã¥pne WBFS partisjon" + +msgid "Could not read the disc." +msgstr "Kan ikke lese plate." + +msgid "Could not save." +msgstr "Kan ikke lagre." + +msgid "Could not set USB." +msgstr "Kan ikke velge USB." + +msgid "Cover Download" +msgstr "Cover nedlasting" + +msgid "Cover Path Changed" +msgstr "Cover sti endret" + +msgid "Create" +msgstr "Opprett" + +msgid "Credits" +msgstr "Medvirkende" + +msgid "Custom Paths" +msgstr "Endre stier" + +msgid "Customs/Original" +msgstr "Custom/Original" + +msgid "DOL Path" +msgstr "DOL sti" + +msgid "DOL path changed" +msgstr "DOL sti endret" + +msgid "Dec" +msgstr "Des" + +msgid "Default" +msgstr "Standard" + +msgid "Default Gamesettings" +msgstr "Standard innstillinger" + +msgid "Default Settings" +msgstr "Standard innstillinger" + +msgid "Delete" +msgstr "Slett" + +msgid "Delete ?" +msgstr "Slett ?" + +msgid "Delete Cheat GCT" +msgstr "Slett juksefil GCT" + +msgid "Delete Cheat TXT" +msgstr "Slett juksefil TXT" + +msgid "Delete Cover Artwork" +msgstr "Slett cover" + +msgid "Delete Disc Artwork" +msgstr "Slett platebilde" + +msgid "Design:" +msgstr "" + +msgid "Developed by" +msgstr "Utviklet av" + +msgid "Directory does not exist!" +msgstr "Mappestruktur finnes ikke!" + +msgid "Disc Artwork Download" +msgstr "Platebilde nedlasting" + +msgid "Disc Artwork Path" +msgstr "Platebilde sti" + +msgid "Disc Default" +msgstr "Spill Standard" + +msgid "Disc Images" +msgstr "Plate bilder" + +msgid "Disc Path Changed" +msgstr "Plate sti endret" + +msgid "DiskFlip" +msgstr "Snu plate" + +msgid "Display" +msgstr "Vis" + +msgid "Display as a carousel" +msgstr "Vis som karusell" + +msgid "Display as a grid" +msgstr "Vis som rutemønster" + +msgid "Display as a list" +msgstr "Vis som liste" + +msgid "Display favorites" +msgstr "Vis favoritter" + +msgid "Do you really want to delete:" +msgstr "Er du sikker pÃ¥ at du vil slette:" + +msgid "Do you want to apply it now?" +msgstr "" + +msgid "Do you want to change language?" +msgstr "Vil du endre sprÃ¥k?" + +msgid "Do you want to download this theme?" +msgstr "Vil du laste ned dette temaet?" + +msgid "Do you want to format:" +msgstr "Vil du formatere:" + +msgid "Do you want to retry for 30 secs?" +msgstr "Vil du fortsette Ã¥ prøve i 30 sekunder?" + +msgid "Do you want to use the alternate DOL that is known to be correct?" +msgstr "Vil du bruke alt DOL filen som er kjent for Ã¥ være riktig?" + +msgid "Do you wish to update/download all language files?" +msgstr "Vil du oppdatere/laste ned alle sprÃ¥kfiler?" + +msgid "Done!" +msgstr "Ferdig!" + +msgid "Download" +msgstr "Last ned" + +msgid "Download Boxart image?" +msgstr "Last ned cover bilde?" + +msgid "Download Discart image?" +msgstr "Last ned plate bilde?" + +msgid "Download Now" +msgstr "Last ned nÃ¥" + +msgid "Download failed." +msgstr "Nedlasting feilet." + +msgid "Download finished" +msgstr "Nedlasting ferdig" + +msgid "Download request failed." +msgstr "Nedlast spørring feilet." + +msgid "Downloading" +msgstr "Laster ned" + +msgid "Downloading Page List:" +msgstr "Laster ned side liste:" + +msgid "Downloading file" +msgstr "Laster ned fil" + +msgid "Downloading image:" +msgstr "Laster ned bilde:" + +msgid "Dutch" +msgstr "Nederlandsk" + +msgid "ERROR" +msgstr "FEIL" + +msgid "ERROR:" +msgstr "FEIL:" + +msgid "ERROR: Can't set up theme." +msgstr "" + +msgid "Enable Parental Control" +msgstr "" + +msgid "English" +msgstr "Engelsk" + +msgid "Error" +msgstr "Feil" + +msgid "Error !" +msgstr "Feil !" + +msgid "Error 002 fix" +msgstr "Error 002 fiks" + +msgid "Error reading Disc" +msgstr "Feil ved lesing av plate" + +msgid "Error while transfering data." +msgstr "Feil ved overføring av data." + +msgid "Error..." +msgstr "Feil..." + +msgid "Error:" +msgstr "Feil:" + +msgid "Extracting files..." +msgstr "Pakker ut filer..." + +msgid "FAT: Use directories" +msgstr "" + +msgid "Failed formating" +msgstr "Feil ved formatering" + +msgid "Failed to extract." +msgstr "Utpakking feilet." + +msgid "Failed to open partition" +msgstr "Feil ved Ã¥pning av partisjon" + +msgid "Feb" +msgstr "" + +msgid "File not found." +msgstr "Fil ikke funnet." + +msgid "Finishing installation... Ok!" +msgstr "Sluttfører installasjon... OK!" + +msgid "Flip-X" +msgstr "" + +msgid "Force" +msgstr "Tving" + +msgid "Format" +msgstr "Formatér" + +msgid "Formatting, please wait..." +msgstr "Formaterer, vennligst vent..." + +msgid "Free Space" +msgstr "Ledig plass" + +msgid "French" +msgstr "Fransk" + +msgid "Full Shutdown" +msgstr "Skru helt av" + +msgid "GAMEID_Gamename" +msgstr "" + +msgid "GCT Cheatcodes Path" +msgstr "GCT Juksekode sti" + +msgid "GCT Cheatcodes Path changed" +msgstr "GCT Juksekode sti endret" + +msgid "GCT File created" +msgstr "GCT fil opprettet" + +msgid "GUI Settings" +msgstr "GUI innstillinger" + +msgid "GXtheme.cfg not found in any subfolder." +msgstr "" + +msgid "Game ID" +msgstr "Spill ID" + +msgid "Game Language" +msgstr "SprÃ¥k" + +msgid "Game Load" +msgstr "Lasting av spill" + +msgid "Game Region" +msgstr "Region" + +msgid "Game Size" +msgstr "Spill størrelse" + +msgid "Game Sound Mode" +msgstr "" + +msgid "Game Sound Volume" +msgstr "" + +msgid "Game is already installed:" +msgstr "Spillet er allerede installert:" + +msgid "Game partition" +msgstr "" + +msgid "Gamename [GAMEID]" +msgstr "" + +msgid "Games" +msgstr "Spill" + +msgid "German" +msgstr "Tysk" + +msgid "HOME Menu" +msgstr "HOME Meny" + +msgid "Hermes CIOS" +msgstr "" + +msgid "Homebrew Apps Path" +msgstr "Homebrew Apps sti" + +msgid "Homebrew Appspath changed" +msgstr "Homebrew Apps sti endret" + +msgid "Homebrew Launcher" +msgstr "Homebrew Laster" + +msgid "Hour" +msgstr "Timer" + +msgid "How do you want to update?" +msgstr "Hvordan vil du oppdatere?" + +msgid "How to Shutdown?" +msgstr "Hvordan skru av?" + +msgid "If you don't have WiFi, press 1 to get an URL to get your WiiTDB.zip" +msgstr "Hvis du ikke har WiFi, klikk 1 for Ã¥ fÃ¥ en URL til din WiiTDB.zip" + +#, c-format +msgid "Incoming file %0.2fKB" +msgstr "Laster ned fil %0.2fKB" + +#, c-format +msgid "Incoming file %0.2fMB" +msgstr "Laster ned fil %0.2fMB" + +msgid "Initializing Network" +msgstr "Initialiserer nettverk" + +msgid "Insert Disk" +msgstr "Sett inn plate" + +msgid "Insert a Wii Disc!" +msgstr "Sett inn en Wii plate!" + +msgid "Insert an SD-Card to download images." +msgstr "Sett inn et SD-kort for Ã¥ laste ned bilder." + +msgid "Insert an SD-Card to save." +msgstr "Sett inn et SD-kort for Ã¥ lagre." + +msgid "Insert an SD-Card to use this option." +msgstr "Sett inn et SD-kort for Ã¥ bruke innstillingen." + +msgid "Install" +msgstr "Installér" + +msgid "Install 1:1 Copy" +msgstr "" + +msgid "Install Error!" +msgstr "Installasjonsfeil!" + +msgid "Install a game" +msgstr "Installér et spill" + +msgid "Install not possible" +msgstr "" + +msgid "Install partitions" +msgstr "" + +msgid "Installing content... Ok!" +msgstr "Installerer innhold... OK!" + +msgid "Installing game:" +msgstr "Installerer spill:" + +msgid "Installing ticket... Ok!" +msgstr "Installerer ticket... OK!" + +msgid "Installing title... Ok!" +msgstr "Installerer tittel... OK!" + +msgid "Installing wad" +msgstr "Installerer WAD" + +msgid "Invalid PIN code" +msgstr "" + +msgid "It seems that you have some information that will be helpful to us. Please pass this information along to the DEV team." +msgstr "Det ser ut til at du har informasjon som kan være nyttig for oss. Vennligst videresend denne informasjonen til utviklerteamet." + +msgid "Italian" +msgstr "Italiensk" + +msgid "Jan" +msgstr "" + +msgid "Japanese" +msgstr "Japansk" + +msgid "July" +msgstr "Jul" + +msgid "June" +msgstr "Jun" + +msgid "Keep" +msgstr "Behold" + +msgid "Keyboard" +msgstr "Tastatur" + +msgid "Korean" +msgstr "Koreansk" + +msgid "Language File" +msgstr "SprÃ¥k Fil" + +msgid "Language change:" +msgstr "Endre sprÃ¥k" + +msgid "Languagepath changed." +msgstr "SprÃ¥ksti endret." + +msgid "Left" +msgstr "Venstre" + +msgid "Like SysMenu" +msgstr "Lik Systemmeny" + +msgid "Load" +msgstr "Start" + +msgid "Load From SD/USB" +msgstr "Start fra SD/USB" + +#, c-format +msgid "Load file from: %s ?" +msgstr "Start fil fra: %s ?" + +msgid "Load this DOL as alternate DOL?" +msgstr "Last denne DOL som alternativ DOL?" + +msgid "Loading standard language." +msgstr "Laster standard sprÃ¥k." + +msgid "Loading standard music." +msgstr "Laster standard musikk." + +msgid "Lock Console" +msgstr "LÃ¥s konsoll" + +msgid "Locked" +msgstr "LÃ¥st" + +msgid "Loop Directory" +msgstr "" + +msgid "Loop Music" +msgstr "" + +msgid "Loop Sound" +msgstr "" + +msgid "Mar" +msgstr "" + +msgid "Mark new games" +msgstr "" + +msgid "May" +msgstr "Mai" + +msgid "Missing files" +msgstr "Manglende filer" + +msgid "Most likely it has dimensions that are not evenly divisible by 4." +msgstr "Sannsynligvis har bildet dimensjoner som ikke kan deles med 4." + +msgid "Mount DVD drive" +msgstr "Last DVD stasjon" + +msgid "Music Loop Mode" +msgstr "" + +msgid "Music Volume" +msgstr "Musikk volum" + +msgid "Neither" +msgstr "Ingen" + +msgid "Network init error" +msgstr "Nettverk init feil" + +msgid "New Disc Detected" +msgstr "Ny plate oppdaget" + +msgid "Next" +msgstr "Neste" + +msgid "No" +msgstr "Nei" + +msgid "No .dol or .elf files found." +msgstr "Ingen .dol eller .elf filer funnet." + +msgid "No Cheatfile found" +msgstr "Ingen juksefil funnet" + +msgid "No DOL file found on disc." +msgstr "Ingen DOL fil funnet pÃ¥ plate." + +msgid "No Favorites" +msgstr "Ingen favoritter" + +msgid "No SD-Card inserted!" +msgstr "Intet SD-kort satt i!" + +msgid "No USB Device" +msgstr "Ingen USB enhet" + +msgid "No USB Device found." +msgstr "Ingen USB enhet funnet." + +msgid "No WBFS or FAT/NTFS partition found" +msgstr "" + +msgid "No cheats were selected" +msgstr "Ingen juksefiler valgt" + +msgid "No data could be read." +msgstr "Ingen data kan leses." + +msgid "No file missing!" +msgstr "Ingen filer mangler!" + +msgid "No new updates." +msgstr "Ingen nye oppdateringer." + +msgid "No themes found on the site." +msgstr "Ingen temaer funnet pÃ¥ websiden." + +msgid "None" +msgstr "" + +msgid "Normal" +msgstr "" + +msgid "Normal Covers" +msgstr "Normale cover" + +msgid "Not Found" +msgstr "Ikke funnet" + +msgid "Not a DOL/ELF file." +msgstr "Ikke en DOL/ELF fil." + +msgid "Not a WAD file." +msgstr "" + +msgid "Not a Wii Disc" +msgstr "Ikke en Wii plate" + +msgid "Not enough free memory." +msgstr "Ikke nok ledig minne." + +msgid "Not enough free space!" +msgstr "Ikke nok ledig plass!" + +msgid "Not supported format!" +msgstr "Ikke et støttet format!" + +msgid "Nov" +msgstr "" + +msgid "OFF" +msgstr "AV" + +msgid "OK" +msgstr "" + +msgid "ON" +msgstr "PÃ…" + +msgid "Oct" +msgstr "Okt" + +msgid "Official Site:" +msgstr "Offisiell nettside:" + +msgid "Only Customs" +msgstr "Kun custom" + +msgid "Only Original" +msgstr "Kun original" + +msgid "Only for Install" +msgstr "Kun for installering" + +msgid "Original/Customs" +msgstr "Original/Custom" + +msgid "Parental Control" +msgstr "Foreldrekontroll" + +msgid "Parental Control disabled" +msgstr "" + +msgid "Partition" +msgstr "Partisjon" + +msgid "Password" +msgstr "Passord" + +msgid "Password Changed" +msgstr "Passord endret" + +msgid "Password has been changed" +msgstr "Passord har blitt endret" + +msgid "Paste it into your browser to get your WiiTDB.zip." +msgstr "Lim den inn i nettleseren din for Ã¥ fÃ¥ WiiTDB.zip." + +msgid "Patch Country Strings" +msgstr "Patch land strenger" + +msgid "Pick from a list" +msgstr "Velg fra liste" + +msgid "Play Count" +msgstr "Ganger spilt" + +msgid "Play Next" +msgstr "" + +msgid "Play Once" +msgstr "" + +msgid "Play Previous" +msgstr "" + +msgid "Playing Music:" +msgstr "" + +msgid "Please wait..." +msgstr "Vennligst vent..." + +msgid "Power off the Wii" +msgstr "Skru av Wii" + +msgid "Prev" +msgstr "Forrige" + +msgid "Prompts Buttons" +msgstr "Dialog knapper" + +msgid "Published by" +msgstr "Publisert av" + +msgid "Quick Boot" +msgstr "Hurtig start" + +msgid "Random Directory Music" +msgstr "" + +msgid "Reading WAD data... Ok!" +msgstr "Leser WAD data... OK!" + +msgid "Receiving file from:" +msgstr "Mottar fil fra:" + +msgid "Released" +msgstr "Utgitt" + +msgid "Reload SD" +msgstr "Les SD pÃ¥ nytt" + +msgid "Remove update" +msgstr "" + +msgid "Rename Game on WBFS" +msgstr "Gi nytt navn til spill pÃ¥ WBFS" + +msgid "Reset BG Music" +msgstr "" + +msgid "Reset Playcounter" +msgstr "Nullstill teller" + +msgid "Reset to standard BGM?" +msgstr "" + +msgid "Restarting..." +msgstr "Starter pÃ¥ nytt..." + +msgid "Return" +msgstr "GÃ¥ tilbake" + +msgid "Return to Wii Menu" +msgstr "Tilbake til Wii meny" + +msgid "Right" +msgstr "Høyre" + +msgid "Rumble" +msgstr "Vibrasjon" + +msgid "SChinese" +msgstr "S.Kinesisk" + +msgid "SFX Volume" +msgstr "Effekt volum" + +msgid "Save" +msgstr "Lagre" + +msgid "Save Failed" +msgstr "Lagring feilet" + +msgid "Save Game List to" +msgstr "Lagre spilliste som" + +msgid "Saved" +msgstr "Lagret" + +msgid "Screensaver" +msgstr "Skjermbeskytter" + +msgid "Select" +msgstr "" + +msgid "Select a DOL" +msgstr "Velg en DOL fil" + +msgid "Selected DOL" +msgstr "Valgt DOL fil" + +msgid "Sept" +msgstr "Sep" + +msgid "Set Search-Filter" +msgstr "Angi søkefilter" + +msgid "Settings" +msgstr "Innstillinger" + +msgid "Shutdown System" +msgstr "Skru helt av" + +msgid "Shutdown to Idle" +msgstr "Skru av" + +msgid "Sort alphabetically" +msgstr "Sortér alfabetisk" + +msgid "Sort by rank" +msgstr "Sortér etter rangering" + +msgid "Sort order by most played" +msgstr "Sortér etter ganger spilt" + +msgid "Sound" +msgstr "Lyd" + +msgid "Sound+BGM" +msgstr "" + +msgid "Sound+Quiet" +msgstr "" + +msgid "Spanish" +msgstr "Spansk" + +msgid "Special thanks to:" +msgstr "Spesielt takk til:" + +msgid "Standard" +msgstr "Standard" + +msgid "Success" +msgstr "Suksess" + +msgid "Success:" +msgstr "Suksess:" + +msgid "Successfully Saved" +msgstr "Vellykket lagring" + +msgid "Successfully Updated" +msgstr "Vellykket oppdatering" + +msgid "Successfully Updated thanks to www.techjawa.com" +msgstr "" + +msgid "Successfully deleted:" +msgstr "Vellykket sletting:" + +msgid "Successfully extracted theme." +msgstr "Vellykket utpakking av tema." + +msgid "Successfully installed:" +msgstr "Vellykket installering:" + +msgid "System Default" +msgstr "System Standard" + +msgid "TChinese" +msgstr "T.Kinesisk" + +msgid "TXT Cheatcodes Path" +msgstr "TXTjuksekode sti" + +msgid "TXT Cheatcodes Path changed" +msgstr "TXTjuksekode sti endret" + +msgid "The entered directory does not exist. Would you like to create it?" +msgstr "Valgt mappe finnes ikke. Vil du opprette den?" + +msgid "The wad file was installed. But It could not be deleted from the SD card." +msgstr "WAD filen ble installert. Men ble ikke slettet fra SD kort." + +#, c-format +msgid "The wad installation failed with error %ld" +msgstr "WAD installasjonen feilet med feilkode %ld" + +msgid "Theme Download Path" +msgstr "Tema nedlasting sti" + +msgid "Theme Download Path changed" +msgstr "Tema nedlasting sti endret" + +msgid "Theme Downloader" +msgstr "Tema Nedlaster" + +msgid "Theme Path" +msgstr "Tema sti" + +msgid "Theme Path Changed" +msgstr "Tema sti endret" + +msgid "Theme Title:" +msgstr "Tema tittel:" + +msgid "Time left:" +msgstr "Tid igjen:" + +msgid "Title Launcher" +msgstr "Tittel Laster" + +msgid "Titles from WiiTDB" +msgstr "Titler fra WiiTDB" + +msgid "Tooltips" +msgstr "Verktøystips" + +msgid "Transfer failed." +msgstr "Overføring feilet." + +msgid "USB Device not found" +msgstr "USB enhet ikke funnet" + +msgid "USB Loader GX is protected" +msgstr "USB Loader GX er beskyttet" + +msgid "USB Loader GX will only run with Hermes CIOS rev 4! Please make sure you have revision 4 installed!" +msgstr "" + +#, c-format +msgid "Unable to open the wad that was just downloaded (%s)." +msgstr "Kan ikke Ã¥pne nedlastet WAD fil (%s)." + +msgid "Uninstall" +msgstr "Avinstallér" + +msgid "Uninstall Game" +msgstr "Avinstallér spill" + +msgid "Uninstall Menu" +msgstr "Avinstallér Meny" + +msgid "Uninstalling wad" +msgstr "Avinstallerer WAD" + +msgid "Unlock Parental Control" +msgstr "" + +msgid "Unlock console to use this option." +msgstr "LÃ¥s opp konsollen for Ã¥ bruke denne innstillingen." + +msgid "Unlocked" +msgstr "OpplÃ¥st" + +msgid "Unsupported format, try to extract manually." +msgstr "Format ikke støttet, prøv Ã¥ pakk ut manuelt." + +msgid "Update" +msgstr "Oppdater" + +msgid "Update All" +msgstr "Oppdater alt" + +msgid "Update DOL" +msgstr "Oppdater DOL" + +msgid "Update Files" +msgstr "Oppdater filer" + +msgid "Update Path" +msgstr "Oppdatering sti" + +msgid "Update Path changed." +msgstr "Oppdatering sti endret." + +msgid "Update all Language Files" +msgstr "Oppdater alle sprÃ¥kfiler" + +msgid "Update failed" +msgstr "Mislykket oppdatering" + +msgid "Update to" +msgstr "Oppdater til" + +msgid "Updating" +msgstr "Oppdaterer" + +msgid "Updating Language Files..." +msgstr "Oppdaterer sprÃ¥kfiler..." + +msgid "Updating Language Files:" +msgstr "Oppdaterer sprÃ¥kfiler:" + +msgid "Updating WiiTDB.zip" +msgstr "Oppdaterer WiiTDB.zip" + +msgid "Uploaded ZIP file installed to homebrew directory." +msgstr "Opplastet ZIP fil installert i homebrew mappen." + +msgid "VIDTV Patch" +msgstr "" + +#, c-format +msgid "Version: %s" +msgstr "Versjon: %s" + +msgid "Video Mode" +msgstr "Video modus" + +msgid "WIP Patches Path" +msgstr "" + +msgid "WIP Patches Path changed" +msgstr "" + +msgid "Waiting for USB Device" +msgstr "Venter pÃ¥ USB enhet" + +msgid "Waiting..." +msgstr "Venter..." + +msgid "What do you want to update?" +msgstr "Hva vil du oppdatere?" + +msgid "WiFi Features" +msgstr "WiFi egenskaper" + +msgid "Widescreen Fix" +msgstr "Widescreen fiks" + +msgid "Wii Menu" +msgstr "Wii Meny" + +msgid "Wii Settings" +msgstr "Wii Innstillinger" + +msgid "WiiTDB Files" +msgstr "WiiTDB filer" + +msgid "WiiTDB Path" +msgstr "WiiTDB sti" + +msgid "WiiTDB Path changed." +msgstr "WiiTDB sti endret." + +msgid "Wiilight" +msgstr "Wii DVD lys" + +msgid "Wrong Password" +msgstr "Feil passord" + +msgid "Yes" +msgstr "Ja" + +msgid "You are about to delete " +msgstr "Du er i ferd med Ã¥ slette " + +msgid "You are choosing to display favorites and you do not have any selected." +msgstr "Du prøver Ã¥ vise favoritter nÃ¥r du ikke har noen valgt." + +msgid "You are using NTFS filesystem. Due to possible write errors to a NTFS partition, installing a game is not possible." +msgstr "" + +msgid "You don't have Parental Control enabled. If you wish to use Parental Control, enable it in the Wii Settings." +msgstr "" + +msgid "You have attempted to load a bad image" +msgstr "Du har forsøkt Ã¥ vise et korrupt bilde" + +msgid "You need to select or format a partition" +msgstr "" + +#, c-format +msgid "Your URL has been saved in %sWiiTDB_URL.txt." +msgstr "Din URL ble lagret i %sWiiTDB_URL.txt." + +msgid "and translaters for language files updates" +msgstr "og oversettere for sprÃ¥kfiler" + +msgid "available" +msgstr "tilgjengelig" + +msgid "does not exist!" +msgstr "finnes ikke!" + +msgid "does not exist! Loading game without cheats." +msgstr "finnes ikke! Laster spill uten juksekode." + +msgid "does not exist! You Messed something up, Idiot." +msgstr "finnes ikke! Du har gjort noe galt." + +msgid "file left" +msgstr "fil gjenstÃ¥r" + +msgid "files left" +msgstr "filer gjenstÃ¥r" + +msgid "files not found on the server!" +msgstr "filer ikke funnet pÃ¥ serveren!" + +msgid "for FAT/NTFS support" +msgstr "" + +msgid "for Ocarina" +msgstr "" + +msgid "for WiiTDB and hosting covers / disc images" +msgstr "for WiiTDB og hosting av bilder" + +msgid "for diverse patches" +msgstr "for diverse patcher" + +msgid "for his awesome tool LibWiiGui" +msgstr "for hans rÃ¥e verktøy LibWiiGui" + +msgid "for hosting the themes" +msgstr "for hosting av tema" + +msgid "for hosting the update files" +msgstr "for hosting av oppdateringer" + +msgid "for the USB Loader source" +msgstr "for kilden til USB Loader" + +msgid "formatted!" +msgstr "formatert!" + +msgid "free" +msgstr "ledig" + +msgid "not set" +msgstr "ikke satt" + +msgid "of" +msgstr "av" + +msgid "seconds left" +msgstr "sekunder gjenstÃ¥r" diff --git a/Make.config.default b/Make.config.default index 1a10dbf2..63e7993a 100644 --- a/Make.config.default +++ b/Make.config.default @@ -1,12 +1,12 @@ -# -# to use this file rename Make.config.default to Make.config -# or create a new Make.config -# -# you can here add defines -# -# in example i have included a switch to diseble -# the gecko-debug stuff. so also in source gecko.c+gecko.h -# -# NOTE when add, remove or change a define here then a "make clean" is needed -# -CFLAGS += -DNO_DEBUG DDEBUG_WBFS +# +# to use this file rename Make.config.default to Make.config +# or create a new Make.config +# +# you can here add defines +# +# in example i have included a switch to diseble +# the gecko-debug stuff. so also in source gecko.c+gecko.h +# +# NOTE when add, remove or change a define here then a "make clean" is needed +# +CFLAGS += -DNO_DEBUG DDEBUG_WBFS diff --git a/Makefile b/Makefile index 26947e51..f85e4935 100644 --- a/Makefile +++ b/Makefile @@ -64,7 +64,8 @@ LDFLAGS = -g $(MACHDEP) -Wl,-Map,$(notdir $@).map,--section-start,.init=0x80B00 #--------------------------------------------------------------------------------- # any extra libraries we wish to link with the project #--------------------------------------------------------------------------------- -LIBS := -lpngu -lpng -lgd -lm -lz -lwiiuse -lbte -lasnd -logc -lfreetype -lvorbisidec -lmad -lmxml -ljpeg -lzip -lext2fs +LIBS := -lpngu -lpng -lgd -lm -lz -lwiiuse -lbte -lasnd -logc -lfreetype -lvorbisidec \ + -lmad -lmxml -ljpeg -lzip -lcustomext2fs #--------------------------------------------------------------------------------- # list of directories containing libraries, this must be the top level containing # include and lib @@ -99,7 +100,7 @@ PCMFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.pcm))) WAVFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.wav))) DOLFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.dol))) MP3FILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.mp3))) - + #--------------------------------------------------------------------------------- # use CXX for linking C++ projects, CC for standard C #--------------------------------------------------------------------------------- @@ -127,7 +128,7 @@ export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \ #--------------------------------------------------------------------------------- # build a list of library paths #--------------------------------------------------------------------------------- -export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) \ +export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) -L$(CURDIR)/source/libs/libext2fs/ \ -L$(LIBOGC_LIB) export OUTPUT := $(CURDIR)/$(TARGET) @@ -167,15 +168,15 @@ run: $(MAKE) @echo Done building ... @echo Now Run That Shit ... - + wiiload $(OUTPUT).dol #--------------------------------------------------------------------------------- reload: wiiload -r $(OUTPUT).dol -#--------------------------------------------------------------------------------- -release: +#--------------------------------------------------------------------------------- +release: $(MAKE) cp boot.dol ./hbc/boot.dol @@ -183,7 +184,7 @@ release: #--------------------------------------------------------------------------------- else -DEPENDS := $(OFILES:.o=.d) +DEPENDS := $(OFILES:.o=.d) #--------------------------------------------------------------------------------- # main targets @@ -211,15 +212,15 @@ language: $(wildcard $(PROJECTDIR)/Languages/*.lang) %.png.o : %.png @echo $(notdir $<) @bin2s -a 32 $< | $(AS) -o $(@) - + %.ogg.o : %.ogg @echo $(notdir $<) @bin2s -a 32 $< | $(AS) -o $(@) - + %.pcm.o : %.pcm @echo $(notdir $<) @bin2s -a 32 $< | $(AS) -o $(@) - + %.wav.o : %.wav @echo $(notdir $<) @bin2s -a 32 $< | $(AS) -o $(@) @@ -227,7 +228,7 @@ language: $(wildcard $(PROJECTDIR)/Languages/*.lang) %.mp3.o : %.mp3 @echo $(notdir $<) @bin2s -a 32 $< | $(AS) -o $(@) - + %.certs.o : %.certs @echo $(notdir $<) @bin2s -a 32 $< | $(AS) -o $(@) diff --git a/data/app_booter.dol b/data/app_booter.dol index 2f1df769b1e92bf560d22f9fb149c6a12530f331..a2a2e52d2cd7143a732f43ac961555a083a4d5d6 100644 GIT binary patch delta 24433 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 F{||FJXs`eP diff --git a/gui.pnproj b/gui.pnproj index 02a4005a..7a64453e 100644 --- a/gui.pnproj +++ b/gui.pnproj @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/source/ZipFile.h b/source/ZipFile.h index 237c1290..7e714625 100644 --- a/source/ZipFile.h +++ b/source/ZipFile.h @@ -1,58 +1,58 @@ -/*************************************************************************** - * Copyright (C) 2009 - * by Dimok - * - * 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. - * - * ZipFile.cpp - * - * for Wii-FileXplorer 2009 - ***************************************************************************/ -#ifndef _ZIPFILE_H_ -#define _ZIPFILE_H_ - -#include - -typedef struct -{ - u64 offset; // ZipFile offset - u64 length; // uncompressed file length in 64 bytes for sizes higher than 4GB - bool isdir; // 0 - file, 1 - directory - char filename[256]; // full filename -} FileStructure; - -class ZipFile -{ - public: - //!Constructor - ZipFile(const char *filepath); - //!Destructor - ~ZipFile(); - //!Extract all files from a zip file to a directory - //!\param dest Destination path to where to extract - bool ExtractAll(const char *dest); - protected: - bool LoadList(); - unzFile File; - unz_file_info cur_file_info; - FileStructure *FileList; -}; - -#endif +/*************************************************************************** + * Copyright (C) 2009 + * by Dimok + * + * 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. + * + * ZipFile.cpp + * + * for Wii-FileXplorer 2009 + ***************************************************************************/ +#ifndef _ZIPFILE_H_ +#define _ZIPFILE_H_ + +#include + +typedef struct +{ + u64 offset; // ZipFile offset + u64 length; // uncompressed file length in 64 bytes for sizes higher than 4GB + bool isdir; // 0 - file, 1 - directory + char filename[256]; // full filename +} FileStructure; + +class ZipFile +{ + public: + //!Constructor + ZipFile(const char *filepath); + //!Destructor + ~ZipFile(); + //!Extract all files from a zip file to a directory + //!\param dest Destination path to where to extract + bool ExtractAll(const char *dest); + protected: + bool LoadList(); + unzFile File; + unz_file_info cur_file_info; + FileStructure *FileList; +}; + +#endif diff --git a/source/banner/MD5.h b/source/banner/MD5.h index 1faa9fa0..07902c2b 100644 --- a/source/banner/MD5.h +++ b/source/banner/MD5.h @@ -1,241 +1,241 @@ -#ifndef MD5_H -#define MD5_H - -#ifdef __cplusplus -extern "C" -{ -#endif - - /* ========================================================================== ** - * - * MD5.h - * - * Copyright: - * Copyright (C) 2003-2005 by Christopher R. Hertel - * - * Email: crh@ubiqx.mn.org - * - * $Id: MD5.h,v 0.6 2005/06/08 18:35:59 crh Exp $ - * - * Modifications and additions by dimok - * - * -------------------------------------------------------------------------- ** - * - * Description: - * Implements the MD5 hash algorithm, as described in RFC 1321. - * - * -------------------------------------------------------------------------- ** - * - * License: - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * 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 - * - * -------------------------------------------------------------------------- ** - * - * Notes: - * - * None of this will make any sense unless you're studying RFC 1321 as you - * read the code. - * - * MD5 is described in RFC 1321. - * The MD*4* algorithm is described in RFC 1320 (that's 1321 - 1). - * MD5 is very similar to MD4, but not quite similar enough to justify - * putting the two into a single module. Besides, I wanted to add a few - * extra functions to this one to expand its usability. - * - * There are three primary motivations for this particular implementation. - * 1) Programmer's pride. I wanted to be able to say I'd done it, and I - * wanted to learn from the experience. - * 2) Portability. I wanted an implementation that I knew to be portable - * to a reasonable number of platforms. In particular, the algorithm is - * designed with little-endian platforms in mind, but I wanted an - * endian-agnostic implementation. - * 3) Compactness. While not an overriding goal, I thought it worth-while - * to see if I could reduce the overall size of the result. This is in - * keeping with my hopes that this library will be suitable for use in - * some embedded environments. - * Beyond that, cleanliness and clarity are always worth pursuing. - * - * As mentioned above, the code really only makes sense if you are familiar - * with the MD5 algorithm or are using RFC 1321 as a guide. This code is - * quirky, however, so you'll want to be reading carefully. - * - * Yeah...most of the comments are cut-and-paste from my MD4 implementation. - * - * -------------------------------------------------------------------------- ** - * - * References: - * IETF RFC 1321: The MD5 Message-Digest Algorithm - * Ron Rivest. IETF, April, 1992 - * - * ========================================================================== ** - */ - /* -------------------------------------------------------------------------- ** - * Typedefs: - */ - - typedef struct - { - unsigned int len; - unsigned int ABCD[4]; - int b_used; - unsigned char block[64]; - } auth_md5Ctx; - - /* -------------------------------------------------------------------------- ** - * Functions: - */ - - auth_md5Ctx *auth_md5InitCtx(auth_md5Ctx *ctx); - /* ------------------------------------------------------------------------ ** - * Initialize an MD5 context. - * - * Input: ctx - A pointer to the MD5 context structure to be initialized. - * Contexts are typically created thusly: - * ctx = (auth_md5Ctx *)malloc( sizeof(auth_md5Ctx) ); - * - * Output: A pointer to the initialized context (same as ). - * - * Notes: The purpose of the context is to make it possible to generate - * an MD5 Message Digest in stages, rather than having to pass a - * single large block to a single MD5 function. The context - * structure keeps track of various bits of state information. - * - * Once the context is initialized, the blocks of message data - * are passed to the function. Once the - * final bit of data has been handed to the - * context can be closed out by calling , - * which also calculates the final MD5 result. - * - * Don't forget to free an allocated context structure when - * you've finished using it. - * - * See Also: , - * - * ------------------------------------------------------------------------ ** - */ - - auth_md5Ctx *auth_md5SumCtx(auth_md5Ctx *ctx, const unsigned char *src, const int len); - /* ------------------------------------------------------------------------ ** - * Build an MD5 Message Digest within the given context. - * - * Input: ctx - Pointer to the context in which the MD5 sum is being - * built. - * src - A chunk of source data. This will be used to drive - * the MD5 algorithm. - * len - The number of bytes in . - * - * Output: A pointer to the updated context (same as ). - * - * See Also: , , - * - * ------------------------------------------------------------------------ ** - */ - - auth_md5Ctx *auth_md5CloseCtx(auth_md5Ctx *ctx, unsigned char *dst); - /* ------------------------------------------------------------------------ ** - * Close an MD5 Message Digest context and generate the final MD5 sum. - * - * Input: ctx - Pointer to the context in which the MD5 sum is being - * built. - * dst - A pointer to at least 16 bytes of memory, which will - * receive the finished MD5 sum. - * - * Output: A pointer to the closed context (same as ). - * You might use this to free a malloc'd context structure. :) - * - * Notes: The context () is returned in an undefined state. - * It must be re-initialized before re-use. - * - * See Also: , - * - * ------------------------------------------------------------------------ ** - */ - - unsigned char * MD5(unsigned char * hash, const unsigned char *src, const int len); - /* ------------------------------------------------------------------------ ** - * Compute an MD5 message digest. - * - * Input: dst - Destination buffer into which the result will be written. - * Must be 16 bytes, minimum. - * src - Source data block to be MD5'd. - * len - The length, in bytes, of the source block. - * (Note that the length is given in bytes, not bits.) - * - * Output: A pointer to , which will contain the calculated 16-byte - * MD5 message digest. - * - * Notes: This function is a shortcut. It takes a single input block. - * For more drawn-out operations, see . - * - * This function is interface-compatible with the - * function in the MD4 module. - * - * The MD5 algorithm is designed to work on data with an - * arbitrary *bit* length. Most implementations, this one - * included, handle the input data in byte-sized chunks. - * - * The MD5 algorithm does much of its work using four-byte - * words, and so can be tuned for speed based on the endian-ness - * of the host. This implementation is intended to be - * endian-neutral, which may make it a teeny bit slower than - * others. ...maybe. - * - * See Also: - * - * ------------------------------------------------------------------------ ** - */ - - unsigned char * MD5fromFile(unsigned char *dst, const char *src); - /* ------------------------------------------------------------------------ ** - * Compute an MD5 message digest. - * - * Input: dst - Destination buffer into which the result will be written. - * Must be 16 bytes, minimum. - * src - filepath to the file to be MD5'd. - * - * Output: A pointer to , which will contain the calculated 16-byte - * MD5 message digest. - * - * Notes: This function is a shortcut. It takes a single input block. - * For more drawn-out operations, see . - * - * This function is interface-compatible with the - * function in the MD4 module. - * - * The MD5 algorithm is designed to work on data with an - * arbitrary *bit* length. Most implementations, this one - * included, handle the input data in byte-sized chunks. - * - * The MD5 algorithm does much of its work using four-byte - * words, and so can be tuned for speed based on the endian-ness - * of the host. This implementation is intended to be - * endian-neutral, which may make it a teeny bit slower than - * others. ...maybe. - * - * See Also: - * - * ------------------------------------------------------------------------ ** - */ - - const char * MD5ToString(const unsigned char *hash, char *dst); - unsigned char * StringToMD5(const char * hash, unsigned char * dst); - -/* ========================================================================== */ - -#ifdef __cplusplus -} -#endif -#endif /* AUTH_MD5_H */ +#ifndef MD5_H +#define MD5_H + +#ifdef __cplusplus +extern "C" +{ +#endif + + /* ========================================================================== ** + * + * MD5.h + * + * Copyright: + * Copyright (C) 2003-2005 by Christopher R. Hertel + * + * Email: crh@ubiqx.mn.org + * + * $Id: MD5.h,v 0.6 2005/06/08 18:35:59 crh Exp $ + * + * Modifications and additions by dimok + * + * -------------------------------------------------------------------------- ** + * + * Description: + * Implements the MD5 hash algorithm, as described in RFC 1321. + * + * -------------------------------------------------------------------------- ** + * + * License: + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * 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 + * + * -------------------------------------------------------------------------- ** + * + * Notes: + * + * None of this will make any sense unless you're studying RFC 1321 as you + * read the code. + * + * MD5 is described in RFC 1321. + * The MD*4* algorithm is described in RFC 1320 (that's 1321 - 1). + * MD5 is very similar to MD4, but not quite similar enough to justify + * putting the two into a single module. Besides, I wanted to add a few + * extra functions to this one to expand its usability. + * + * There are three primary motivations for this particular implementation. + * 1) Programmer's pride. I wanted to be able to say I'd done it, and I + * wanted to learn from the experience. + * 2) Portability. I wanted an implementation that I knew to be portable + * to a reasonable number of platforms. In particular, the algorithm is + * designed with little-endian platforms in mind, but I wanted an + * endian-agnostic implementation. + * 3) Compactness. While not an overriding goal, I thought it worth-while + * to see if I could reduce the overall size of the result. This is in + * keeping with my hopes that this library will be suitable for use in + * some embedded environments. + * Beyond that, cleanliness and clarity are always worth pursuing. + * + * As mentioned above, the code really only makes sense if you are familiar + * with the MD5 algorithm or are using RFC 1321 as a guide. This code is + * quirky, however, so you'll want to be reading carefully. + * + * Yeah...most of the comments are cut-and-paste from my MD4 implementation. + * + * -------------------------------------------------------------------------- ** + * + * References: + * IETF RFC 1321: The MD5 Message-Digest Algorithm + * Ron Rivest. IETF, April, 1992 + * + * ========================================================================== ** + */ + /* -------------------------------------------------------------------------- ** + * Typedefs: + */ + + typedef struct + { + unsigned int len; + unsigned int ABCD[4]; + int b_used; + unsigned char block[64]; + } auth_md5Ctx; + + /* -------------------------------------------------------------------------- ** + * Functions: + */ + + auth_md5Ctx *auth_md5InitCtx(auth_md5Ctx *ctx); + /* ------------------------------------------------------------------------ ** + * Initialize an MD5 context. + * + * Input: ctx - A pointer to the MD5 context structure to be initialized. + * Contexts are typically created thusly: + * ctx = (auth_md5Ctx *)malloc( sizeof(auth_md5Ctx) ); + * + * Output: A pointer to the initialized context (same as ). + * + * Notes: The purpose of the context is to make it possible to generate + * an MD5 Message Digest in stages, rather than having to pass a + * single large block to a single MD5 function. The context + * structure keeps track of various bits of state information. + * + * Once the context is initialized, the blocks of message data + * are passed to the function. Once the + * final bit of data has been handed to the + * context can be closed out by calling , + * which also calculates the final MD5 result. + * + * Don't forget to free an allocated context structure when + * you've finished using it. + * + * See Also: , + * + * ------------------------------------------------------------------------ ** + */ + + auth_md5Ctx *auth_md5SumCtx(auth_md5Ctx *ctx, const unsigned char *src, const int len); + /* ------------------------------------------------------------------------ ** + * Build an MD5 Message Digest within the given context. + * + * Input: ctx - Pointer to the context in which the MD5 sum is being + * built. + * src - A chunk of source data. This will be used to drive + * the MD5 algorithm. + * len - The number of bytes in . + * + * Output: A pointer to the updated context (same as ). + * + * See Also: , , + * + * ------------------------------------------------------------------------ ** + */ + + auth_md5Ctx *auth_md5CloseCtx(auth_md5Ctx *ctx, unsigned char *dst); + /* ------------------------------------------------------------------------ ** + * Close an MD5 Message Digest context and generate the final MD5 sum. + * + * Input: ctx - Pointer to the context in which the MD5 sum is being + * built. + * dst - A pointer to at least 16 bytes of memory, which will + * receive the finished MD5 sum. + * + * Output: A pointer to the closed context (same as ). + * You might use this to free a malloc'd context structure. :) + * + * Notes: The context () is returned in an undefined state. + * It must be re-initialized before re-use. + * + * See Also: , + * + * ------------------------------------------------------------------------ ** + */ + + unsigned char * MD5(unsigned char * hash, const unsigned char *src, const int len); + /* ------------------------------------------------------------------------ ** + * Compute an MD5 message digest. + * + * Input: dst - Destination buffer into which the result will be written. + * Must be 16 bytes, minimum. + * src - Source data block to be MD5'd. + * len - The length, in bytes, of the source block. + * (Note that the length is given in bytes, not bits.) + * + * Output: A pointer to , which will contain the calculated 16-byte + * MD5 message digest. + * + * Notes: This function is a shortcut. It takes a single input block. + * For more drawn-out operations, see . + * + * This function is interface-compatible with the + * function in the MD4 module. + * + * The MD5 algorithm is designed to work on data with an + * arbitrary *bit* length. Most implementations, this one + * included, handle the input data in byte-sized chunks. + * + * The MD5 algorithm does much of its work using four-byte + * words, and so can be tuned for speed based on the endian-ness + * of the host. This implementation is intended to be + * endian-neutral, which may make it a teeny bit slower than + * others. ...maybe. + * + * See Also: + * + * ------------------------------------------------------------------------ ** + */ + + unsigned char * MD5fromFile(unsigned char *dst, const char *src); + /* ------------------------------------------------------------------------ ** + * Compute an MD5 message digest. + * + * Input: dst - Destination buffer into which the result will be written. + * Must be 16 bytes, minimum. + * src - filepath to the file to be MD5'd. + * + * Output: A pointer to , which will contain the calculated 16-byte + * MD5 message digest. + * + * Notes: This function is a shortcut. It takes a single input block. + * For more drawn-out operations, see . + * + * This function is interface-compatible with the + * function in the MD4 module. + * + * The MD5 algorithm is designed to work on data with an + * arbitrary *bit* length. Most implementations, this one + * included, handle the input data in byte-sized chunks. + * + * The MD5 algorithm does much of its work using four-byte + * words, and so can be tuned for speed based on the endian-ness + * of the host. This implementation is intended to be + * endian-neutral, which may make it a teeny bit slower than + * others. ...maybe. + * + * See Also: + * + * ------------------------------------------------------------------------ ** + */ + + const char * MD5ToString(const unsigned char *hash, char *dst); + unsigned char * StringToMD5(const char * hash, unsigned char * dst); + +/* ========================================================================== */ + +#ifdef __cplusplus +} +#endif +#endif /* AUTH_MD5_H */ diff --git a/source/bannersound.h b/source/bannersound.h index 6cf7b526..b6da62d1 100644 --- a/source/bannersound.h +++ b/source/bannersound.h @@ -1,6 +1,6 @@ -#ifndef BANNERSOUND_H -#define BANNERSOUND_H - -const u8 *LoadBannerSound(const u8 *discid, u32 *size); - -#endif /* BANNERSOUND_H */ +#ifndef BANNERSOUND_H +#define BANNERSOUND_H + +const u8 *LoadBannerSound(const u8 *discid, u32 *size); + +#endif /* BANNERSOUND_H */ diff --git a/source/gecko.c b/source/gecko.c index 21bbf356..06a1e15a 100644 --- a/source/gecko.c +++ b/source/gecko.c @@ -21,7 +21,7 @@ void gprintf(const char *format, ...) if((vasprintf(&tmp, format, va) >= 0) && tmp) { u32 level = IRQ_Disable(); - usb_sendbuffer(1, tmp, strlen(tmp)); + usb_sendbuffer_safe(1, tmp, strlen(tmp)); IRQ_Restore(level); } va_end(va); diff --git a/source/homebrewboot/dolloader.c b/source/homebrewboot/dolloader.c index 32f0ef29..d957f7e8 100644 --- a/source/homebrewboot/dolloader.c +++ b/source/homebrewboot/dolloader.c @@ -8,52 +8,57 @@ #include "dolloader.h" -typedef struct _dolheader -{ - u32 text_pos[7]; - u32 data_pos[11]; - u32 text_start[7]; - u32 data_start[11]; - u32 text_size[7]; - u32 data_size[11]; - u32 bss_start; - u32 bss_size; - u32 entry_point; +typedef struct _dolheader { + u32 text_pos[7]; + u32 data_pos[11]; + u32 text_start[7]; + u32 data_start[11]; + u32 text_size[7]; + u32 data_size[11]; + u32 bss_start; + u32 bss_size; + u32 entry_point; } dolheader; u32 load_dol(const void *dolstart, struct __argv *argv) { - u32 i; - dolheader *dolfile; + u32 i; + dolheader *dolfile; - if (dolstart) - { - dolfile = (dolheader *) dolstart; - for (i = 0; i < 7; i++) - { - if ((!dolfile->text_size[i]) || (dolfile->text_start[i] < 0x100)) continue; - ICInvalidateRange((void *) dolfile->text_start[i], dolfile->text_size[i]); - memcpy((void *) dolfile->text_start[i], dolstart + dolfile->text_pos[i], dolfile->text_size[i]); - } + if (dolstart) + { + dolfile = (dolheader *) dolstart; + for (i = 0; i < 7; i++) + { + if ((!dolfile->text_size[i]) || (dolfile->text_start[i] < 0x100)) + continue; - for (i = 0; i < 11; i++) - { - if ((!dolfile->data_size[i]) || (dolfile->data_start[i] < 0x100)) continue; - memcpy((void *) dolfile->data_start[i], dolstart + dolfile->data_pos[i], dolfile->data_size[i]); - DCFlushRangeNoSync((void *) dolfile->data_start[i], dolfile->data_size[i]); - } + memmove((void *) dolfile->text_start[i], dolstart + + dolfile->text_pos[i], dolfile->text_size[i]); - memset((void *) dolfile->bss_start, 0, dolfile->bss_size); - DCFlushRange((void *) dolfile->bss_start, dolfile->bss_size); + DCFlushRange ((void *) dolfile->text_start[i], dolfile->text_size[i]); + ICInvalidateRange((void *) dolfile->text_start[i], dolfile->text_size[i]); + } - if (argv && argv->argvMagic == ARGV_MAGIC) - { - void *new_argv = (void *) (dolfile->entry_point + 8); - memcpy(new_argv, argv, sizeof(*argv)); - DCFlushRange(new_argv, sizeof(*argv)); - } + for (i = 0; i < 11; i++) + { + if ((!dolfile->data_size[i]) || (dolfile->data_start[i] < 0x100)) + continue; - return dolfile->entry_point; - } - return 0; + memmove((void *) dolfile->data_start[i], dolstart + + dolfile->data_pos[i], dolfile->data_size[i]); + + DCFlushRange((void *) dolfile->data_start[i], + dolfile->data_size[i]); + } + + if (argv && argv->argvMagic == ARGV_MAGIC) + { + void *new_argv = (void *) (dolfile->entry_point + 8); + memmove(new_argv, argv, sizeof(*argv)); + DCFlushRange(new_argv, sizeof(*argv)); + } + return dolfile->entry_point; + } + return 0; } diff --git a/source/homebrewboot/dolloader.h b/source/homebrewboot/dolloader.h index 96d2abc8..af644414 100644 --- a/source/homebrewboot/dolloader.h +++ b/source/homebrewboot/dolloader.h @@ -2,14 +2,14 @@ #define _DOLLOADER_H_ #ifdef __cplusplus -extern "C" -{ +extern "C" { #endif - extern void __exception_closeall(); - typedef void (*entrypoint)(void); +extern void __exception_closeall(); +typedef void (*entrypoint) (void); + +u32 load_dol(const void *dolstart, struct __argv *argv); - u32 load_dol(const void *dolstart, struct __argv *argv); #ifdef __cplusplus } diff --git a/source/libs/libext2fs/bitops.h b/source/libs/libext2fs/bitops.h new file mode 100644 index 00000000..bf6ee82a --- /dev/null +++ b/source/libs/libext2fs/bitops.h @@ -0,0 +1,638 @@ +/* + * bitops.h --- Bitmap frobbing code. The byte swapping routines are + * also included here. + * + * Copyright (C) 1993, 1994, 1995, 1996 Theodore Ts'o. + * + * %Begin-Header% + * This file may be redistributed under the terms of the GNU Library + * General Public License, version 2. + * %End-Header% + */ +#ifndef _BITOPS_H_ +#define _BITOPS_H_ + +extern int ext2fs_set_bit(unsigned int nr,void * addr); +extern int ext2fs_clear_bit(unsigned int nr, void * addr); +extern int ext2fs_test_bit(unsigned int nr, const void * addr); +extern void ext2fs_fast_set_bit(unsigned int nr,void * addr); +extern void ext2fs_fast_clear_bit(unsigned int nr, void * addr); +extern int ext2fs_set_bit64(__u64 nr,void * addr); +extern int ext2fs_clear_bit64(__u64 nr, void * addr); +extern int ext2fs_test_bit64(__u64 nr, const void * addr); +extern void ext2fs_fast_set_bit64(__u64 nr,void * addr); +extern void ext2fs_fast_clear_bit64(__u64 nr, void * addr); +extern __u16 ext2fs_swab16(__u16 val); +extern __u32 ext2fs_swab32(__u32 val); +extern __u64 ext2fs_swab64(__u64 val); + +#ifdef WORDS_BIGENDIAN +#define ext2fs_cpu_to_le64(x) ext2fs_swab64((x)) +#define ext2fs_le64_to_cpu(x) ext2fs_swab64((x)) +#define ext2fs_cpu_to_le32(x) ext2fs_swab32((x)) +#define ext2fs_le32_to_cpu(x) ext2fs_swab32((x)) +#define ext2fs_cpu_to_le16(x) ext2fs_swab16((x)) +#define ext2fs_le16_to_cpu(x) ext2fs_swab16((x)) +#define ext2fs_cpu_to_be32(x) ((__u32)(x)) +#define ext2fs_be32_to_cpu(x) ((__u32)(x)) +#define ext2fs_cpu_to_be16(x) ((__u16)(x)) +#define ext2fs_be16_to_cpu(x) ((__u16)(x)) +#else +#define ext2fs_cpu_to_le64(x) ((__u64)(x)) +#define ext2fs_le64_to_cpu(x) ((__u64)(x)) +#define ext2fs_cpu_to_le32(x) ((__u32)(x)) +#define ext2fs_le32_to_cpu(x) ((__u32)(x)) +#define ext2fs_cpu_to_le16(x) ((__u16)(x)) +#define ext2fs_le16_to_cpu(x) ((__u16)(x)) +#define ext2fs_cpu_to_be32(x) ext2fs_swab32((x)) +#define ext2fs_be32_to_cpu(x) ext2fs_swab32((x)) +#define ext2fs_cpu_to_be16(x) ext2fs_swab16((x)) +#define ext2fs_be16_to_cpu(x) ext2fs_swab16((x)) +#endif + +/* + * EXT2FS bitmap manipulation routines. + */ + +/* Support for sending warning messages from the inline subroutines */ +extern const char *ext2fs_block_string; +extern const char *ext2fs_inode_string; +extern const char *ext2fs_mark_string; +extern const char *ext2fs_unmark_string; +extern const char *ext2fs_test_string; +extern void ext2fs_warn_bitmap(errcode_t errcode, unsigned long arg, + const char *description); +extern void ext2fs_warn_bitmap2(ext2fs_generic_bitmap bitmap, + int code, unsigned long arg); + +extern int ext2fs_mark_block_bitmap(ext2fs_block_bitmap bitmap, blk_t block); +extern int ext2fs_unmark_block_bitmap(ext2fs_block_bitmap bitmap, + blk_t block); +extern int ext2fs_test_block_bitmap(ext2fs_block_bitmap bitmap, blk_t block); + +extern int ext2fs_mark_inode_bitmap(ext2fs_inode_bitmap bitmap, ext2_ino_t inode); +extern int ext2fs_unmark_inode_bitmap(ext2fs_inode_bitmap bitmap, + ext2_ino_t inode); +extern int ext2fs_test_inode_bitmap(ext2fs_inode_bitmap bitmap, ext2_ino_t inode); + +extern void ext2fs_fast_mark_block_bitmap(ext2fs_block_bitmap bitmap, + blk_t block); +extern void ext2fs_fast_unmark_block_bitmap(ext2fs_block_bitmap bitmap, + blk_t block); +extern int ext2fs_fast_test_block_bitmap(ext2fs_block_bitmap bitmap, + blk_t block); + +extern void ext2fs_fast_mark_inode_bitmap(ext2fs_inode_bitmap bitmap, + ext2_ino_t inode); +extern void ext2fs_fast_unmark_inode_bitmap(ext2fs_inode_bitmap bitmap, + ext2_ino_t inode); +extern int ext2fs_fast_test_inode_bitmap(ext2fs_inode_bitmap bitmap, + ext2_ino_t inode); +extern blk_t ext2fs_get_block_bitmap_start(ext2fs_block_bitmap bitmap); +extern ext2_ino_t ext2fs_get_inode_bitmap_start(ext2fs_inode_bitmap bitmap); +extern blk_t ext2fs_get_block_bitmap_end(ext2fs_block_bitmap bitmap); +extern ext2_ino_t ext2fs_get_inode_bitmap_end(ext2fs_inode_bitmap bitmap); + +extern void ext2fs_mark_block_bitmap_range(ext2fs_block_bitmap bitmap, + blk_t block, int num); +extern void ext2fs_unmark_block_bitmap_range(ext2fs_block_bitmap bitmap, + blk_t block, int num); +extern int ext2fs_test_block_bitmap_range(ext2fs_block_bitmap bitmap, + blk_t block, int num); +extern int ext2fs_test_inode_bitmap_range(ext2fs_inode_bitmap bitmap, + ino_t inode, int num); +extern void ext2fs_fast_mark_block_bitmap_range(ext2fs_block_bitmap bitmap, + blk_t block, int num); +extern void ext2fs_fast_unmark_block_bitmap_range(ext2fs_block_bitmap bitmap, + blk_t block, int num); +extern int ext2fs_fast_test_block_bitmap_range(ext2fs_block_bitmap bitmap, + blk_t block, int num); +extern void ext2fs_set_bitmap_padding(ext2fs_generic_bitmap map); + +/* These routines moved to gen_bitmap.c (actually, some of the above, too) */ +extern int ext2fs_mark_generic_bitmap(ext2fs_generic_bitmap bitmap, + __u32 bitno); +extern int ext2fs_unmark_generic_bitmap(ext2fs_generic_bitmap bitmap, + blk_t bitno); +extern int ext2fs_test_generic_bitmap(ext2fs_generic_bitmap bitmap, + blk_t bitno); +extern int ext2fs_test_block_bitmap_range(ext2fs_block_bitmap bitmap, + blk_t block, int num); +extern __u32 ext2fs_get_generic_bitmap_start(ext2fs_generic_bitmap bitmap); +extern __u32 ext2fs_get_generic_bitmap_end(ext2fs_generic_bitmap bitmap); + +/* 64-bit versions */ + +extern int ext2fs_mark_block_bitmap2(ext2fs_block_bitmap bitmap, + blk64_t block); +extern int ext2fs_unmark_block_bitmap2(ext2fs_block_bitmap bitmap, + blk64_t block); +extern int ext2fs_test_block_bitmap2(ext2fs_block_bitmap bitmap, + blk64_t block); + +extern int ext2fs_mark_inode_bitmap2(ext2fs_inode_bitmap bitmap, + ext2_ino_t inode); +extern int ext2fs_unmark_inode_bitmap2(ext2fs_inode_bitmap bitmap, + ext2_ino_t inode); +extern int ext2fs_test_inode_bitmap2(ext2fs_inode_bitmap bitmap, + ext2_ino_t inode); + +extern void ext2fs_fast_mark_block_bitmap2(ext2fs_block_bitmap bitmap, + blk64_t block); +extern void ext2fs_fast_unmark_block_bitmap2(ext2fs_block_bitmap bitmap, + blk64_t block); +extern int ext2fs_fast_test_block_bitmap2(ext2fs_block_bitmap bitmap, + blk64_t block); + +extern void ext2fs_fast_mark_inode_bitmap2(ext2fs_inode_bitmap bitmap, + ext2_ino_t inode); +extern void ext2fs_fast_unmark_inode_bitmap2(ext2fs_inode_bitmap bitmap, + ext2_ino_t inode); +extern int ext2fs_fast_test_inode_bitmap2(ext2fs_inode_bitmap bitmap, + ext2_ino_t inode); +extern blk64_t ext2fs_get_block_bitmap_start2(ext2fs_block_bitmap bitmap); +extern ext2_ino_t ext2fs_get_inode_bitmap_start2(ext2fs_inode_bitmap bitmap); +extern blk64_t ext2fs_get_block_bitmap_end2(ext2fs_block_bitmap bitmap); +extern ext2_ino_t ext2fs_get_inode_bitmap_end2(ext2fs_inode_bitmap bitmap); + +extern int ext2fs_fast_test_block_bitmap_range2(ext2fs_block_bitmap bitmap, + blk64_t block, + unsigned int num); +extern void ext2fs_fast_mark_block_bitmap_range2(ext2fs_block_bitmap bitmap, + blk64_t block, + unsigned int num); +extern void ext2fs_fast_unmark_block_bitmap_range2(ext2fs_block_bitmap bitmap, + blk64_t block, + unsigned int num); +/* These routines moved to gen_bitmap64.c */ +extern void ext2fs_clear_generic_bmap(ext2fs_generic_bitmap bitmap); +extern errcode_t ext2fs_compare_generic_bmap(errcode_t neq, + ext2fs_generic_bitmap bm1, + ext2fs_generic_bitmap bm2); +extern void ext2fs_set_generic_bmap_padding(ext2fs_generic_bitmap bmap); +extern int ext2fs_mark_generic_bmap(ext2fs_generic_bitmap bitmap, + blk64_t bitno); +extern int ext2fs_unmark_generic_bmap(ext2fs_generic_bitmap bitmap, + blk64_t bitno); +extern int ext2fs_test_generic_bmap(ext2fs_generic_bitmap bitmap, + blk64_t bitno); +extern int ext2fs_test_block_bitmap_range2(ext2fs_block_bitmap bitmap, + blk64_t block, unsigned int num); +extern __u64 ext2fs_get_generic_bmap_start(ext2fs_generic_bitmap bitmap); +extern __u64 ext2fs_get_generic_bmap_end(ext2fs_generic_bitmap bitmap); +extern int ext2fs_test_block_bitmap_range2(ext2fs_block_bitmap bitmap, + blk64_t block, unsigned int num); +extern void ext2fs_mark_block_bitmap_range2(ext2fs_block_bitmap bitmap, + blk64_t block, unsigned int num); +extern void ext2fs_unmark_block_bitmap_range2(ext2fs_block_bitmap bitmap, + blk64_t block, unsigned int num); + +/* + * The inline routines themselves... + * + * If NO_INLINE_FUNCS is defined, then we won't try to do inline + * functions at all; they will be included as normal functions in + * inline.c + */ +#ifdef NO_INLINE_FUNCS +#if (defined(__GNUC__) && (defined(__i386__) || defined(__i486__) || \ + defined(__i586__) || defined(__mc68000__))) + /* This prevents bitops.c from trying to include the C */ + /* function version of these functions */ +#define _EXT2_HAVE_ASM_BITOPS_ +#endif +#endif /* NO_INLINE_FUNCS */ + +#if (defined(INCLUDE_INLINE_FUNCS) || !defined(NO_INLINE_FUNCS)) +#ifdef INCLUDE_INLINE_FUNCS +#define _INLINE_ extern +#else +#ifdef __GNUC__ +#define _INLINE_ extern __inline__ +#else /* For Watcom C */ +#define _INLINE_ extern inline +#endif +#endif + +/* + * Fast bit set/clear functions that doesn't need to return the + * previous bit value. + */ + +_INLINE_ void ext2fs_fast_set_bit(unsigned int nr,void * addr) +{ + unsigned char *ADDR = (unsigned char *) addr; + + ADDR += nr >> 3; + *ADDR |= (1 << (nr & 0x07)); +} + +_INLINE_ void ext2fs_fast_clear_bit(unsigned int nr, void * addr) +{ + unsigned char *ADDR = (unsigned char *) addr; + + ADDR += nr >> 3; + *ADDR &= ~(1 << (nr & 0x07)); +} + + +_INLINE_ void ext2fs_fast_set_bit64(__u64 nr, void * addr) +{ + unsigned char *ADDR = (unsigned char *) addr; + + ADDR += nr >> 3; + *ADDR |= (1 << (nr & 0x07)); +} + +_INLINE_ void ext2fs_fast_clear_bit64(__u64 nr, void * addr) +{ + unsigned char *ADDR = (unsigned char *) addr; + + ADDR += nr >> 3; + *ADDR &= ~(1 << (nr & 0x07)); +} + + +#if ((defined __GNUC__) && !defined(_EXT2_USE_C_VERSIONS_) && \ + (defined(__i386__) || defined(__i486__) || defined(__i586__))) + +#define _EXT2_HAVE_ASM_BITOPS_ +#define _EXT2_HAVE_ASM_SWAB_ + +/* + * These are done by inline assembly for speed reasons..... + * + * All bitoperations return 0 if the bit was cleared before the + * operation and != 0 if it was not. Bit 0 is the LSB of addr; bit 32 + * is the LSB of (addr+1). + */ + +/* + * Some hacks to defeat gcc over-optimizations.. + */ +struct __dummy_h { unsigned long a[100]; }; +#define EXT2FS_ADDR (*(struct __dummy_h *) addr) +#define EXT2FS_CONST_ADDR (*(const struct __dummy_h *) addr) + +_INLINE_ int ext2fs_set_bit(unsigned int nr, void * addr) +{ + int oldbit; + + addr = (void *) (((unsigned char *) addr) + (nr >> 3)); + __asm__ __volatile__("btsl %2,%1\n\tsbbl %0,%0" + :"=r" (oldbit),"+m" (EXT2FS_ADDR) + :"r" (nr & 7)); + return oldbit; +} + +_INLINE_ int ext2fs_clear_bit(unsigned int nr, void * addr) +{ + int oldbit; + + addr = (void *) (((unsigned char *) addr) + (nr >> 3)); + __asm__ __volatile__("btrl %2,%1\n\tsbbl %0,%0" + :"=r" (oldbit),"+m" (EXT2FS_ADDR) + :"r" (nr & 7)); + return oldbit; +} + +_INLINE_ int ext2fs_test_bit(unsigned int nr, const void * addr) +{ + int oldbit; + + addr = (const void *) (((const unsigned char *) addr) + (nr >> 3)); + __asm__ __volatile__("btl %2,%1\n\tsbbl %0,%0" + :"=r" (oldbit) + :"m" (EXT2FS_CONST_ADDR),"r" (nr & 7)); + return oldbit; +} + +_INLINE_ __u32 ext2fs_swab32(__u32 val) +{ +#ifdef EXT2FS_REQUIRE_486 + __asm__("bswap %0" : "=r" (val) : "0" (val)); +#else + __asm__("xchgb %b0,%h0\n\t" /* swap lower bytes */ + "rorl $16,%0\n\t" /* swap words */ + "xchgb %b0,%h0" /* swap higher bytes */ + :"=q" (val) + : "0" (val)); +#endif + return val; +} + +_INLINE_ __u16 ext2fs_swab16(__u16 val) +{ + __asm__("xchgb %b0,%h0" /* swap bytes */ \ + : "=q" (val) \ + : "0" (val)); \ + return val; +} + +#undef EXT2FS_ADDR + +#endif /* i386 */ + +#if ((defined __GNUC__) && !defined(_EXT2_USE_C_VERSIONS_) && \ + (defined(__mc68000__))) + +#define _EXT2_HAVE_ASM_BITOPS_ + +_INLINE_ int ext2fs_set_bit(unsigned int nr,void * addr) +{ + char retval; + + __asm__ __volatile__ ("bfset %2@{%1:#1}; sne %0" + : "=d" (retval) : "d" (nr^7), "a" (addr)); + + return retval; +} + +_INLINE_ int ext2fs_clear_bit(unsigned int nr, void * addr) +{ + char retval; + + __asm__ __volatile__ ("bfclr %2@{%1:#1}; sne %0" + : "=d" (retval) : "d" (nr^7), "a" (addr)); + + return retval; +} + +_INLINE_ int ext2fs_test_bit(unsigned int nr, const void * addr) +{ + char retval; + + __asm__ __volatile__ ("bftst %2@{%1:#1}; sne %0" + : "=d" (retval) : "d" (nr^7), "a" (addr)); + + return retval; +} + +#endif /* __mc68000__ */ + + +#if !defined(_EXT2_HAVE_ASM_SWAB_) + +_INLINE_ __u16 ext2fs_swab16(__u16 val) +{ + return (val >> 8) | (val << 8); +} + +_INLINE_ __u32 ext2fs_swab32(__u32 val) +{ + return ((val>>24) | ((val>>8)&0xFF00) | + ((val<<8)&0xFF0000) | (val<<24)); +} + +#endif /* !_EXT2_HAVE_ASM_SWAB */ + +_INLINE_ __u64 ext2fs_swab64(__u64 val) +{ + return (ext2fs_swab32(val >> 32) | + (((__u64)ext2fs_swab32(val & 0xFFFFFFFFUL)) << 32)); +} + +_INLINE_ int ext2fs_mark_block_bitmap(ext2fs_block_bitmap bitmap, + blk_t block) +{ + return ext2fs_mark_generic_bitmap((ext2fs_generic_bitmap) bitmap, + block); +} + +_INLINE_ int ext2fs_unmark_block_bitmap(ext2fs_block_bitmap bitmap, + blk_t block) +{ + return ext2fs_unmark_generic_bitmap((ext2fs_generic_bitmap) bitmap, + block); +} + +_INLINE_ int ext2fs_test_block_bitmap(ext2fs_block_bitmap bitmap, + blk_t block) +{ + return ext2fs_test_generic_bitmap((ext2fs_generic_bitmap) bitmap, + block); +} + +_INLINE_ int ext2fs_mark_inode_bitmap(ext2fs_inode_bitmap bitmap, + ext2_ino_t inode) +{ + return ext2fs_mark_generic_bitmap((ext2fs_generic_bitmap) bitmap, + inode); +} + +_INLINE_ int ext2fs_unmark_inode_bitmap(ext2fs_inode_bitmap bitmap, + ext2_ino_t inode) +{ + return ext2fs_unmark_generic_bitmap((ext2fs_generic_bitmap) bitmap, + inode); +} + +_INLINE_ int ext2fs_test_inode_bitmap(ext2fs_inode_bitmap bitmap, + ext2_ino_t inode) +{ + return ext2fs_test_generic_bitmap((ext2fs_generic_bitmap) bitmap, + inode); +} + +_INLINE_ void ext2fs_fast_mark_block_bitmap(ext2fs_block_bitmap bitmap, + blk_t block) +{ + ext2fs_mark_generic_bitmap((ext2fs_generic_bitmap) bitmap, block); +} + +_INLINE_ void ext2fs_fast_unmark_block_bitmap(ext2fs_block_bitmap bitmap, + blk_t block) +{ + ext2fs_unmark_generic_bitmap((ext2fs_generic_bitmap) bitmap, block); +} + +_INLINE_ int ext2fs_fast_test_block_bitmap(ext2fs_block_bitmap bitmap, + blk_t block) +{ + return ext2fs_test_generic_bitmap((ext2fs_generic_bitmap) bitmap, + block); +} + +_INLINE_ void ext2fs_fast_mark_inode_bitmap(ext2fs_inode_bitmap bitmap, + ext2_ino_t inode) +{ + ext2fs_mark_generic_bitmap((ext2fs_generic_bitmap) bitmap, inode); +} + +_INLINE_ void ext2fs_fast_unmark_inode_bitmap(ext2fs_inode_bitmap bitmap, + ext2_ino_t inode) +{ + ext2fs_unmark_generic_bitmap((ext2fs_generic_bitmap) bitmap, inode); +} + +_INLINE_ int ext2fs_fast_test_inode_bitmap(ext2fs_inode_bitmap bitmap, + ext2_ino_t inode) +{ + return ext2fs_test_generic_bitmap((ext2fs_generic_bitmap) bitmap, + inode); +} + +_INLINE_ blk_t ext2fs_get_block_bitmap_start(ext2fs_block_bitmap bitmap) +{ + return ext2fs_get_generic_bitmap_start((ext2fs_generic_bitmap) bitmap); +} + +_INLINE_ ext2_ino_t ext2fs_get_inode_bitmap_start(ext2fs_inode_bitmap bitmap) +{ + return ext2fs_get_generic_bitmap_start((ext2fs_generic_bitmap) bitmap); +} + +_INLINE_ blk_t ext2fs_get_block_bitmap_end(ext2fs_block_bitmap bitmap) +{ + return ext2fs_get_generic_bitmap_end((ext2fs_generic_bitmap) bitmap); +} + +_INLINE_ ext2_ino_t ext2fs_get_inode_bitmap_end(ext2fs_inode_bitmap bitmap) +{ + return ext2fs_get_generic_bitmap_end((ext2fs_generic_bitmap) bitmap); +} + +_INLINE_ int ext2fs_fast_test_block_bitmap_range(ext2fs_block_bitmap bitmap, + blk_t block, int num) +{ + return ext2fs_test_block_bitmap_range(bitmap, block, num); +} + +_INLINE_ void ext2fs_fast_mark_block_bitmap_range(ext2fs_block_bitmap bitmap, + blk_t block, int num) +{ + ext2fs_mark_block_bitmap_range(bitmap, block, num); +} + +_INLINE_ void ext2fs_fast_unmark_block_bitmap_range(ext2fs_block_bitmap bitmap, + blk_t block, int num) +{ + ext2fs_unmark_block_bitmap_range(bitmap, block, num); +} + +/* 64-bit versions */ + +_INLINE_ int ext2fs_mark_block_bitmap2(ext2fs_block_bitmap bitmap, + blk64_t block) +{ + return ext2fs_mark_generic_bmap((ext2fs_generic_bitmap) bitmap, + block); +} + +_INLINE_ int ext2fs_unmark_block_bitmap2(ext2fs_block_bitmap bitmap, + blk64_t block) +{ + return ext2fs_unmark_generic_bmap((ext2fs_generic_bitmap) bitmap, block); +} + +_INLINE_ int ext2fs_test_block_bitmap2(ext2fs_block_bitmap bitmap, + blk64_t block) +{ + return ext2fs_test_generic_bmap((ext2fs_generic_bitmap) bitmap, + block); +} + +_INLINE_ int ext2fs_mark_inode_bitmap2(ext2fs_inode_bitmap bitmap, + ext2_ino_t inode) +{ + return ext2fs_mark_generic_bmap((ext2fs_generic_bitmap) bitmap, + inode); +} + +_INLINE_ int ext2fs_unmark_inode_bitmap2(ext2fs_inode_bitmap bitmap, + ext2_ino_t inode) +{ + return ext2fs_unmark_generic_bmap((ext2fs_generic_bitmap) bitmap, + inode); +} + +_INLINE_ int ext2fs_test_inode_bitmap2(ext2fs_inode_bitmap bitmap, + ext2_ino_t inode) +{ + return ext2fs_test_generic_bmap((ext2fs_generic_bitmap) bitmap, + inode); +} + +_INLINE_ void ext2fs_fast_mark_block_bitmap2(ext2fs_block_bitmap bitmap, + blk64_t block) +{ + ext2fs_mark_generic_bmap((ext2fs_generic_bitmap) bitmap, block); +} + +_INLINE_ void ext2fs_fast_unmark_block_bitmap2(ext2fs_block_bitmap bitmap, + blk64_t block) +{ + ext2fs_unmark_generic_bmap((ext2fs_generic_bitmap) bitmap, block); +} + +_INLINE_ int ext2fs_fast_test_block_bitmap2(ext2fs_block_bitmap bitmap, + blk64_t block) +{ + return ext2fs_test_generic_bmap((ext2fs_generic_bitmap) bitmap, + block); +} + +_INLINE_ void ext2fs_fast_mark_inode_bitmap2(ext2fs_inode_bitmap bitmap, + ext2_ino_t inode) +{ + ext2fs_mark_generic_bmap((ext2fs_generic_bitmap) bitmap, inode); +} + +_INLINE_ void ext2fs_fast_unmark_inode_bitmap2(ext2fs_inode_bitmap bitmap, + ext2_ino_t inode) +{ + ext2fs_unmark_generic_bmap((ext2fs_generic_bitmap) bitmap, inode); +} + +_INLINE_ int ext2fs_fast_test_inode_bitmap2(ext2fs_inode_bitmap bitmap, + ext2_ino_t inode) +{ + return ext2fs_test_generic_bmap((ext2fs_generic_bitmap) bitmap, + inode); +} + +_INLINE_ blk64_t ext2fs_get_block_bitmap_start2(ext2fs_block_bitmap bitmap) +{ + return ext2fs_get_generic_bmap_start((ext2fs_generic_bitmap) bitmap); +} + +_INLINE_ ext2_ino_t ext2fs_get_inode_bitmap_start2(ext2fs_inode_bitmap bitmap) +{ + return ext2fs_get_generic_bmap_start((ext2fs_generic_bitmap) bitmap); +} + +_INLINE_ blk64_t ext2fs_get_block_bitmap_end2(ext2fs_block_bitmap bitmap) +{ + return ext2fs_get_generic_bmap_end((ext2fs_generic_bitmap) bitmap); +} + +_INLINE_ ext2_ino_t ext2fs_get_inode_bitmap_end2(ext2fs_inode_bitmap bitmap) +{ + return ext2fs_get_generic_bmap_end((ext2fs_generic_bitmap) bitmap); +} + +_INLINE_ int ext2fs_fast_test_block_bitmap_range2(ext2fs_block_bitmap bitmap, + blk64_t block, + unsigned int num) +{ + return ext2fs_test_block_bitmap_range2(bitmap, block, num); +} + +_INLINE_ void ext2fs_fast_mark_block_bitmap_range2(ext2fs_block_bitmap bitmap, + blk64_t block, + unsigned int num) +{ + ext2fs_mark_block_bitmap_range2(bitmap, block, num); +} + +_INLINE_ void ext2fs_fast_unmark_block_bitmap_range2(ext2fs_block_bitmap bitmap, + blk64_t block, + unsigned int num) +{ + ext2fs_unmark_block_bitmap_range2(bitmap, block, num); +} + +#undef _INLINE_ +#endif + +#endif diff --git a/source/libs/libext2fs/com_err.h b/source/libs/libext2fs/com_err.h new file mode 100644 index 00000000..0c31a4ec --- /dev/null +++ b/source/libs/libext2fs/com_err.h @@ -0,0 +1,70 @@ +/* + * Header file for common error description library. + * + * Copyright 1988, Student Information Processing Board of the + * Massachusetts Institute of Technology. + * + * For copyright and distribution info, see the documentation supplied + * with this package. + */ + +#if !defined(__COM_ERR_H) && !defined(__COM_ERR_H__) + +#ifdef __GNUC__ +#define COM_ERR_ATTR(x) __attribute__(x) +#else +#define COM_ERR_ATTR(x) +#endif + +#ifndef DEBUG_GEKKO +#define OMIT_COM_ERR +#endif + +#include +#include + +typedef long errcode_t; + +struct error_table { + char const * const * msgs; + long base; + int n_msgs; +}; +struct et_list; + +extern void com_err (const char *, long, const char *, ...) + COM_ERR_ATTR((format(printf, 3, 4))); + +extern void com_err_va (const char *whoami, errcode_t code, const char *fmt, + va_list args) + COM_ERR_ATTR((format(printf, 3, 0))); + +extern char const *error_message (long); +extern void (*com_err_hook) (const char *, long, const char *, va_list); +extern void (*set_com_err_hook (void (*) (const char *, long, + const char *, va_list))) + (const char *, long, const char *, va_list); +extern void (*reset_com_err_hook (void)) (const char *, long, + const char *, va_list); +extern int init_error_table(const char * const *msgs, long base, int count); + +extern errcode_t add_error_table(const struct error_table * et); +extern errcode_t remove_error_table(const struct error_table * et); +extern void add_to_error_table(struct et_list *new_table); + +/* Provided for Heimdall compatibility */ +extern const char *com_right(struct et_list *list, long code); +extern const char *com_right_r(struct et_list *list, long code, char *str, size_t len); +extern void initialize_error_table_r(struct et_list **list, + const char **messages, + int num_errors, + long base); +extern void free_error_table(struct et_list *et); + +/* Provided for compatibility with other com_err libraries */ +extern int et_list_lock(void); +extern int et_list_unlock(void); + +#define __COM_ERR_H +#define __COM_ERR_H__ +#endif /* !defined(__COM_ERR_H) && !defined(__COM_ERR_H__)*/ diff --git a/source/libs/libext2fs/ext2_err.h b/source/libs/libext2fs/ext2_err.h new file mode 100644 index 00000000..4f127443 --- /dev/null +++ b/source/libs/libext2fs/ext2_err.h @@ -0,0 +1,152 @@ +// +// Copyright (C) 1993, 1994, 1995, 1996 Theodore Ts'o. +// +// This file may be redistributed under the terms of the GNU Public +// License. +#ifndef EXT2_ERR_H_ +#define EXT2_ERR_H_ + +#define EXT2_ET_OK 0 +#define EXT2_ET_BASE -1 +#define EXT2_ET_MAGIC_EXT2FS_FILSYS -2 +#define EXT2_ET_MAGIC_BADBLOCKS_LIST -3 +#define EXT2_ET_MAGIC_BADBLOCKS_ITERATE -4 +#define EXT2_ET_MAGIC_INODE_SCAN -5 +#define EXT2_ET_MAGIC_IO_CHANNEL -6 +#define EXT2_ET_MAGIC_UNIX_IO_CHANNEL -7 +#define EXT2_ET_MAGIC_IO_MANAGER -8 +#define EXT2_ET_MAGIC_BLOCK_BITMAP -9 +#define EXT2_ET_MAGIC_INODE_BITMAP -10 +#define EXT2_ET_MAGIC_GENERIC_BITMAP -11 +#define EXT2_ET_MAGIC_TEST_IO_CHANNEL -12 +#define EXT2_ET_MAGIC_DBLIST -13 +#define EXT2_ET_MAGIC_ICOUNT -14 +#define EXT2_ET_MAGIC_PQ_IO_CHANNEL -15 +#define EXT2_ET_MAGIC_EXT2_FILE -16 +#define EXT2_ET_MAGIC_E2IMAGE -17 +#define EXT2_ET_MAGIC_INODE_IO_CHANNEL -18 +#define EXT2_ET_MAGIC_EXTENT_HANDLE -19 +#define EXT2_ET_BAD_MAGIC -20 +#define EXT2_ET_REV_TOO_HIGH -21 +#define EXT2_ET_RO_FILSYS -22 +#define EXT2_ET_GDESC_READ -23 +#define EXT2_ET_GDESC_WRITE -24 +#define EXT2_ET_GDESC_BAD_BLOCK_MAP -25 +#define EXT2_ET_GDESC_BAD_INODE_MAP -26 +#define EXT2_ET_GDESC_BAD_INODE_TABLE -27 +#define EXT2_ET_INODE_BITMAP_WRITE -28 +#define EXT2_ET_INODE_BITMAP_READ -29 +#define EXT2_ET_BLOCK_BITMAP_WRITE -30 +#define EXT2_ET_BLOCK_BITMAP_READ -31 +#define EXT2_ET_INODE_TABLE_WRITE -32 +#define EXT2_ET_INODE_TABLE_READ -33 +#define EXT2_ET_NEXT_INODE_READ -34 +#define EXT2_ET_UNEXPECTED_BLOCK_SIZE -35 +#define EXT2_ET_DIR_CORRUPTED -36 +#define EXT2_ET_SHORT_READ -37 +#define EXT2_ET_SHORT_WRITE -38 +#define EXT2_ET_DIR_NO_SPACE -39 +#define EXT2_ET_NO_INODE_BITMAP -40 +#define EXT2_ET_NO_BLOCK_BITMAP -41 +#define EXT2_ET_BAD_INODE_NUM -42 +#define EXT2_ET_BAD_BLOCK_NUM -45 +#define EXT2_ET_EXPAND_DIR_ERR -46 +#define EXT2_ET_TOOSMALL -47 +#define EXT2_ET_BAD_BLOCK_MARK -48 +#define EXT2_ET_BAD_BLOCK_UNMARK -49 +#define EXT2_ET_BAD_BLOCK_TEST -50 +#define EXT2_ET_BAD_INODE_MARK -51 +#define EXT2_ET_BAD_INODE_UNMARK -52 +#define EXT2_ET_BAD_INODE_TEST -53 +#define EXT2_ET_FUDGE_BLOCK_BITMAP_END -54 +#define EXT2_ET_FUDGE_INODE_BITMAP_END -55 +#define EXT2_ET_BAD_IND_BLOCK -56 +#define EXT2_ET_BAD_DIND_BLOCK -57 +#define EXT2_ET_BAD_TIND_BLOCK -58 +#define EXT2_ET_NEQ_BLOCK_BITMAP -59 +#define EXT2_ET_NEQ_INODE_BITMAP -60 +#define EXT2_ET_BAD_DEVICE_NAME -61 +#define EXT2_ET_MISSING_INODE_TABLE -62 +#define EXT2_ET_CORRUPT_SUPERBLOCK -63 +#define EXT2_ET_BAD_GENERIC_MARK -64 +#define EXT2_ET_BAD_GENERIC_UNMARK -65 +#define EXT2_ET_BAD_GENERIC_TEST -66 +#define EXT2_ET_SYMLINK_LOOP -67 +#define EXT2_ET_CALLBACK_NOTHANDLED -68 +#define EXT2_ET_BAD_BLOCK_IN_INODE_TABLE -69 +#define EXT2_ET_UNSUPP_FEATURE -70 +#define EXT2_ET_RO_UNSUPP_FEATURE -71 +#define EXT2_ET_LLSEEK_FAILED -72 +#define EXT2_ET_NO_MEMORY -73 +#define EXT2_ET_INVALID_ARGUMENT -74 +#define EXT2_ET_BLOCK_ALLOC_FAIL -75 +#define EXT2_ET_INODE_ALLOC_FAIL -76 +#define EXT2_ET_NO_DIRECTORY -77 +#define EXT2_ET_TOO_MANY_REFS -78 +#define EXT2_ET_FILE_NOT_FOUND -79 +#define EXT2_ET_FILE_RO -80 +#define EXT2_ET_DB_NOT_FOUND -81 +#define EXT2_ET_DIR_EXISTS -82 +#define EXT2_ET_UNIMPLEMENTED -83 +#define EXT2_ET_CANCEL_REQUESTED -84 +#define EXT2_ET_FILE_TOO_BIG -85 +#define EXT2_ET_JOURNAL_NOT_BLOCK -86 +#define EXT2_ET_NO_JOURNAL_SB -87 +#define EXT2_ET_JOURNAL_TOO_SMALL -88 +#define EXT2_ET_JOURNAL_UNSUPP_VERSION -89 +#define EXT2_ET_LOAD_EXT_JOURNAL -90 +#define EXT2_ET_NO_JOURNAL -91 +#define EXT2_ET_DIRHASH_UNSUPP -92 +#define EXT2_ET_BAD_EA_BLOCK_NUM -93 +#define EXT2_ET_TOO_MANY_INODES -94 +#define EXT2_ET_NOT_IMAGE_FILE -95 +#define EXT2_ET_RES_GDT_BLOCKS -96 +#define EXT2_ET_RESIZE_INODE_CORRUPT -97 +#define EXT2_ET_SET_BMAP_NO_IND -98 +#define EXT2_ET_TDB_SUCCESS -99 +#define EXT2_ET_TDB_ERR_CORRUPT -100 +#define EXT2_ET_TDB_ERR_IO -101 +#define EXT2_ET_TDB_ERR_LOCK -102 +#define EXT2_ET_TDB_ERR_OOM -103 +#define EXT2_ET_TDB_ERR_EXISTS -104 +#define EXT2_ET_TDB_ERR_NOLOCK -105 +#define EXT2_ET_TDB_ERR_EINVAL -106 +#define EXT2_ET_TDB_ERR_NOEXIST -107 +#define EXT2_ET_TDB_ERR_RDONLY -108 +#define EXT2_ET_DBLIST_EMPTY -109 +#define EXT2_ET_RO_BLOCK_ITERATE -110 +#define EXT2_ET_MAGIC_EXTENT_PATH -111 +#define EXT2_ET_MAGIC_RESERVED_10 -112 +#define EXT2_ET_MAGIC_RESERVED_11 -113 +#define EXT2_ET_MAGIC_RESERVED_12 -114 +#define EXT2_ET_MAGIC_RESERVED_13 -115 +#define EXT2_ET_MAGIC_RESERVED_14 -116 +#define EXT2_ET_MAGIC_RESERVED_15 -117 +#define EXT2_ET_MAGIC_RESERVED_16 -118 +#define EXT2_ET_MAGIC_RESERVED_17 -119 +#define EXT2_ET_MAGIC_RESERVED_18 -120 +#define EXT2_ET_MAGIC_RESERVED_19 -121 +#define EXT2_ET_EXTENT_HEADER_BAD -122 +#define EXT2_ET_EXTENT_INDEX_BAD -123 +#define EXT2_ET_EXTENT_LEAF_BAD -124 +#define EXT2_ET_EXTENT_NO_SPACE -125 +#define EXT2_ET_INODE_NOT_EXTENT -126 +#define EXT2_ET_EXTENT_NO_NEXT -127 +#define EXT2_ET_EXTENT_NO_PREV -128 +#define EXT2_ET_EXTENT_NO_UP -129 +#define EXT2_ET_EXTENT_NO_DOWN -130 +#define EXT2_ET_NO_CURRENT_NODE -131 +#define EXT2_ET_OP_NOT_SUPPORTED -132 +#define EXT2_ET_CANT_INSERT_EXTENT -133 +#define EXT2_ET_CANT_SPLIT_EXTENT -134 +#define EXT2_ET_EXTENT_NOT_FOUND -135 +#define EXT2_ET_EXTENT_NOT_SUPPORTED -136 +#define EXT2_ET_EXTENT_INVALID_LENGTH -137 +#define EXT2_ET_IO_CHANNEL_NO_SUPPORT_64 -138 +#define EXT2_NO_MTAB_FILE -139 +#define EXT2_ET_MAGIC_GENERIC_BITMAP64 -140 +#define EXT2_ET_MAGIC_BLOCK_BITMAP64 -141 +#define EXT2_ET_MAGIC_INODE_BITMAP64 -142 +#define EXT2_ET_CANT_USE_LEGACY_BITMAPS -143 + +#endif diff --git a/source/libs/libext2fs/ext2_ext_attr.h b/source/libs/libext2fs/ext2_ext_attr.h new file mode 100644 index 00000000..ed548d12 --- /dev/null +++ b/source/libs/libext2fs/ext2_ext_attr.h @@ -0,0 +1,71 @@ +/* + File: linux/ext2_ext_attr.h + + On-disk format of extended attributes for the ext2 filesystem. + + (C) 2000 Andreas Gruenbacher, +*/ + +#ifndef _EXT2_EXT_ATTR_H +#define _EXT2_EXT_ATTR_H +/* Magic value in attribute blocks */ +#define EXT2_EXT_ATTR_MAGIC_v1 0xEA010000 +#define EXT2_EXT_ATTR_MAGIC 0xEA020000 + +/* Maximum number of references to one attribute block */ +#define EXT2_EXT_ATTR_REFCOUNT_MAX 1024 + +struct ext2_ext_attr_header { + __u32 h_magic; /* magic number for identification */ + __u32 h_refcount; /* reference count */ + __u32 h_blocks; /* number of disk blocks used */ + __u32 h_hash; /* hash value of all attributes */ + __u32 h_reserved[4]; /* zero right now */ +}; + +struct ext2_ext_attr_entry { + __u8 e_name_len; /* length of name */ + __u8 e_name_index; /* attribute name index */ + __u16 e_value_offs; /* offset in disk block of value */ + __u32 e_value_block; /* disk block attribute is stored on (n/i) */ + __u32 e_value_size; /* size of attribute value */ + __u32 e_hash; /* hash value of name and value */ +#if 0 + char e_name[0]; /* attribute name */ +#endif +}; + +#define EXT2_EXT_ATTR_PAD_BITS 2 +#define EXT2_EXT_ATTR_PAD ((unsigned) 1<e_name_len)) ) +#define EXT2_EXT_ATTR_SIZE(size) \ + (((size) + EXT2_EXT_ATTR_ROUND) & ~EXT2_EXT_ATTR_ROUND) +#define EXT2_EXT_IS_LAST_ENTRY(entry) (*((__u32 *)(entry)) == 0UL) +#define EXT2_EXT_ATTR_NAME(entry) \ + (((char *) (entry)) + sizeof(struct ext2_ext_attr_entry)) +#define EXT2_XATTR_LEN(name_len) \ + (((name_len) + EXT2_EXT_ATTR_ROUND + \ + sizeof(struct ext2_xattr_entry)) & ~EXT2_EXT_ATTR_ROUND) +#define EXT2_XATTR_SIZE(size) \ + (((size) + EXT2_EXT_ATTR_ROUND) & ~EXT2_EXT_ATTR_ROUND) + +#ifdef __KERNEL__ +# ifdef CONFIG_EXT2_FS_EXT_ATTR +extern int ext2_get_ext_attr(struct inode *, const char *, char *, size_t, int); +extern int ext2_set_ext_attr(struct inode *, const char *, char *, size_t, int); +extern void ext2_ext_attr_free_inode(struct inode *inode); +extern void ext2_ext_attr_put_super(struct super_block *sb); +extern int ext2_ext_attr_init(void); +extern void ext2_ext_attr_done(void); +# else +# define ext2_get_ext_attr NULL +# define ext2_set_ext_attr NULL +# endif +#endif /* __KERNEL__ */ +#endif /* _EXT2_EXT_ATTR_H */ diff --git a/source/libs/libext2fs/ext2_frag.c b/source/libs/libext2fs/ext2_frag.c index bf008f7a..e05a4bc7 100644 --- a/source/libs/libext2fs/ext2_frag.c +++ b/source/libs/libext2fs/ext2_frag.c @@ -7,10 +7,10 @@ typedef struct _PrivData void * callback_data; } PrivDataST; -static int block_iter_callback(ext2_filsys fs, blk_t *blocknr, int blockcnt, void *privateData) +static int block_iter_callback(ext2_filsys fs, blk64_t *blocknr, e2_blkcnt_t blockcnt, blk64_t ref_block, int ref_offset, void *privateData) { PrivDataST *priv = (PrivDataST *) privateData; - blk_t block; + blk64_t block; block = *blocknr; return priv->append_fragment(priv->callback_data, blockcnt*fs->io->block_size/512, block*fs->io->block_size/512, fs->io->block_size/512); @@ -47,9 +47,10 @@ int _EXT2_get_fragments(const char *in_path, _ext2_frag_append_t append_fragment priv.callback_data = callback_data; priv.append_fragment = append_fragment; - ext2fs_block_iterate(vd->fs, ni->ino, 0, NULL, block_iter_callback, &priv); + int ret = ext2fs_block_iterate3(vd->fs, ni->ino, BLOCK_FLAG_DATA_ONLY, NULL, block_iter_callback, &priv); - int ret = priv.append_fragment(callback_data, EXT2_I_SIZE(&ni->ni) >> 9, 0, 0); + if(ret == 0) + ret = priv.append_fragment(callback_data, EXT2_I_SIZE(&ni->ni) >> 9, 0, 0); ext2UpdateTimes(vd, ni, EXT2_UPDATE_ATIME); diff --git a/source/libs/libext2fs/ext2_frag.j b/source/libs/libext2fs/ext2_frag.j new file mode 100644 index 00000000..fe4ca658 --- /dev/null +++ b/source/libs/libext2fs/ext2_frag.j @@ -0,0 +1,107 @@ +#include "ext2_internal.h" +#include "ext2_frag.h" +#include "mem_allocate.h" + +typedef struct _DataBlocks +{ + u32 block; + u32 blockcnt; +} DataBlocks; + +typedef struct _PrivData +{ + DataBlocks * blocks; + u32 blocksCnt; +} PrivDataST; + +static int block_iter_callback(ext2_filsys fs, blk_t *blocknr, int blockcnt, void *privateData) +{ + PrivDataST *priv = (PrivDataST *) privateData; + + if(!priv->blocks) + priv->blocks = (DataBlocks *) mem_alloc(sizeof(DataBlocks)); + + priv->blocksCnt++; + + DataBlocks * tmp = (DataBlocks *) mem_realloc(priv->blocks, priv->blocksCnt*sizeof(DataBlocks)); + if(!tmp) + { + free(priv->blocks); + priv->blocks = NULL; + return -1; + } + + priv->blocks = tmp; + + priv->blocks[priv->blocksCnt-1].block = *blocknr; + priv->blocks[priv->blocksCnt-1].blockcnt = blockcnt; + return 0; +} + +int _EXT2_get_fragments(const char *in_path, _ext2_frag_append_t append_fragment, void *callback_data) +{ + ext2_inode_t *ni = NULL; + ext2_vd *vd; + + vd = ext2GetVolume(in_path); + + if(!vd) + { + errno = EXDEV; + return -1; + } + + // Get the actual path of the entry + const char * path = ext2RealPath(in_path); + if (!path) { + errno = EINVAL; + return -1; + } + + // Find the entry + ni = ext2OpenEntry(vd, path); + if (!ni) { + errno = ENOENT; + return -1; + } + + PrivDataST priv; + priv.blocks = NULL; + priv.blocksCnt = 0; + + int ret = ext2fs_block_iterate(vd->fs, ni->ino, BLOCK_FLAG_DATA_ONLY, NULL, block_iter_callback, &priv); + if(ret == 0 && priv.blocksCnt > 0) + { + int i = 0; + u32 size = 1; + u32 block_size = vd->fs->io->block_size/512; + int printfs = 30; + + for(i = 0; i < priv.blocksCnt-1; ++i) + { + //size = priv.blocks[i+1].blockcnt-priv.blocks[i].blockcnt; + ret = append_fragment(callback_data, priv.blocks[i].blockcnt*block_size, priv.blocks[i].block*block_size, size*block_size); + if(ret) + break; + if(printfs > 0) + { + printfs--; + } + } + + if(ret == 0) + ret = append_fragment(callback_data, priv.blocks[i].blockcnt*block_size, priv.blocks[i].block*block_size, block_size); + } + + if(ret == 0) + ret = append_fragment(callback_data, EXT2_I_SIZE(&ni->ni) >> 9, 0, 0); + + if(priv.blocks) + mem_free(priv.blocks); + + ext2UpdateTimes(vd, ni, EXT2_UPDATE_ATIME); + + ext2CloseEntry(vd, ni); + + return ret; +} diff --git a/source/libs/libext2fs/ext2_io.h b/source/libs/libext2fs/ext2_io.h new file mode 100644 index 00000000..25aec665 --- /dev/null +++ b/source/libs/libext2fs/ext2_io.h @@ -0,0 +1,136 @@ +/* + * io.h --- the I/O manager abstraction + * + * Copyright (C) 1993, 1994, 1995, 1996 Theodore Ts'o. + * + * %Begin-Header% + * This file may be redistributed under the terms of the GNU Library + * General Public License, version 2. + * %End-Header% + */ + +#ifndef _EXT2FS_EXT2_IO_H +#define _EXT2FS_EXT2_IO_H + +#include "ext2fs.h" + +/* + * ext2_loff_t is defined here since unix_io.c needs it. + */ +typedef long long ext2_loff_t; + +/* llseek.c */ +ext2_loff_t ext2fs_llseek (int, ext2_loff_t, int); + +typedef struct struct_io_manager *io_manager; +typedef struct struct_io_channel *io_channel; +typedef struct struct_io_stats *io_stats; + +#define CHANNEL_FLAGS_WRITETHROUGH 0x01 + +struct struct_io_channel { + errcode_t magic; + io_manager manager; + char *name; + int block_size; + errcode_t (*read_error)(io_channel channel, + unsigned long block, + int count, + void *data, + size_t size, + int actual_bytes_read, + errcode_t error); + errcode_t (*write_error)(io_channel channel, + unsigned long block, + int count, + const void *data, + size_t size, + int actual_bytes_written, + errcode_t error); + int refcount; + int flags; + long reserved[14]; + void *private_data; + void *app_data; +}; + +struct struct_io_stats { + int num_fields; + int reserved; + unsigned long long bytes_read; + unsigned long long bytes_written; +}; + +struct struct_io_manager { + errcode_t magic; + const char *name; + errcode_t (*open)(const char *name, int flags, io_channel *channel); + errcode_t (*close)(io_channel channel); + errcode_t (*set_blksize)(io_channel channel, int blksize); + errcode_t (*read_blk)(io_channel channel, unsigned long block, + int count, void *data); + errcode_t (*write_blk)(io_channel channel, unsigned long block, + int count, const void *data); + errcode_t (*flush)(io_channel channel); + errcode_t (*write_byte)(io_channel channel, unsigned long offset, + int count, const void *data); + errcode_t (*set_option)(io_channel channel, const char *option, + const char *arg); + errcode_t (*get_stats)(io_channel channel, io_stats *io_stats); + errcode_t (*read_blk64)(io_channel channel, unsigned long long block, + int count, void *data); + errcode_t (*write_blk64)(io_channel channel, unsigned long long block, + int count, const void *data); + long reserved[16]; +}; + +#define IO_FLAG_RW 0x0001 +#define IO_FLAG_EXCLUSIVE 0x0002 +#define IO_FLAG_DIRECT_IO 0x0004 + +/* + * Convenience functions.... + */ +#define io_channel_close(c) ((c)->manager->close((c))) +#define io_channel_set_blksize(c,s) ((c)->manager->set_blksize((c),s)) +#define io_channel_read_blk(c,b,n,d) ((c)->manager->read_blk((c),b,n,d)) +#define io_channel_write_blk(c,b,n,d) ((c)->manager->write_blk((c),b,n,d)) +#define io_channel_flush(c) ((c)->manager->flush((c))) +#define io_channel_bumpcount(c) ((c)->refcount++) + +/* io_manager.c */ +extern errcode_t io_channel_set_options(io_channel channel, + const char *options); +extern errcode_t io_channel_write_byte(io_channel channel, + unsigned long offset, + int count, const void *data); +extern errcode_t io_channel_read_blk64(io_channel channel, + unsigned long long block, + int count, void *data); +extern errcode_t io_channel_write_blk64(io_channel channel, + unsigned long long block, + int count, const void *data); + +/* unix_io.c */ +extern io_manager unix_io_manager; + +/* undo_io.c */ +extern io_manager undo_io_manager; +extern errcode_t set_undo_io_backing_manager(io_manager manager); +extern errcode_t set_undo_io_backup_file(char *file_name); + +/* test_io.c */ +extern io_manager test_io_manager, test_io_backing_manager; +extern void (*test_io_cb_read_blk) + (unsigned long block, int count, errcode_t err); +extern void (*test_io_cb_write_blk) + (unsigned long block, int count, errcode_t err); +extern void (*test_io_cb_read_blk64) + (unsigned long long block, int count, errcode_t err); +extern void (*test_io_cb_write_blk64) + (unsigned long long block, int count, errcode_t err); +extern void (*test_io_cb_set_blksize) + (int blksize, errcode_t err); + +#endif /* _EXT2FS_EXT2_IO_H */ + diff --git a/source/libs/libext2fs/ext2_types.h b/source/libs/libext2fs/ext2_types.h new file mode 100644 index 00000000..5f5f7a57 --- /dev/null +++ b/source/libs/libext2fs/ext2_types.h @@ -0,0 +1,18 @@ +/* + * If linux/types.h is already been included, assume it has defined + * everything we need. (cross fingers) Other header files may have + * also defined the types that we need. + */ +#ifndef _EXT2_TYPES_H +#define _EXT2_TYPES_H + +typedef unsigned char __u8; +typedef signed char __s8; +typedef unsigned short __u16; +typedef short __s16; +typedef unsigned int __u32; +typedef int __s32; +typedef unsigned long long __u64; +typedef signed long long __s64; + +#endif /* _EXT2_TYPES_H */ diff --git a/source/libs/libext2fs/ext2fs.h b/source/libs/libext2fs/ext2fs.h index b55b2179..ce3b88de 100644 --- a/source/libs/libext2fs/ext2fs.h +++ b/source/libs/libext2fs/ext2fs.h @@ -1356,6 +1356,7 @@ extern __u64 ext2fs_div64_ceil(__u64 a, __u64 b); #ifndef EXT2_CUSTOM_MEMORY_ROUTINES #include +#include "mem_allocate.h" /* * Allocate memory */ @@ -1363,7 +1364,7 @@ _INLINE_ errcode_t ext2fs_get_mem(unsigned long size, void *ptr) { void *pp; - pp = malloc(size); + pp = mem_alloc(size); if (!pp) return EXT2_ET_NO_MEMORY; memcpy(ptr, &pp, sizeof (pp)); @@ -1376,9 +1377,9 @@ _INLINE_ errcode_t ext2fs_get_memalign(unsigned long size, void *pp; #ifdef HWRVL - pp = memalign(32, size); + pp = mem_align(32, size); #else - pp = malloc(size); + pp = mem_alloc(size); #endif if (!pp) return EXT2_ET_NO_MEMORY; @@ -1402,7 +1403,7 @@ _INLINE_ errcode_t ext2fs_free_mem(void *ptr) void *p; memcpy(&p, ptr, sizeof(p)); - free(p); + mem_free(p); p = 0; memcpy(ptr, &p, sizeof(p)); return 0; @@ -1419,7 +1420,7 @@ _INLINE_ errcode_t ext2fs_resize_mem(unsigned long EXT2FS_ATTR((unused)) old_siz /* Use "memcpy" for pointer assignments here to avoid problems * with C99 strict type aliasing rules. */ memcpy(&p, ptr, sizeof(p)); - p = realloc(p, size); + p = mem_realloc(p, size); if (!p) return EXT2_ET_NO_MEMORY; memcpy(ptr, &p, sizeof(p)); diff --git a/source/libs/libext2fs/ext3_extents.h b/source/libs/libext2fs/ext3_extents.h new file mode 100644 index 00000000..88fabc9d --- /dev/null +++ b/source/libs/libext2fs/ext3_extents.h @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2003,2004 Cluster File Systems, Inc, info@clusterfs.com + * Written by Alex Tomas + * + * %Begin-Header% + * This file may be redistributed under the terms of the GNU Library + * General Public License, version 2. + * %End-Header% + */ + +#ifndef _LINUX_EXT3_EXTENTS +#define _LINUX_EXT3_EXTENTS + +/* + * ext3_inode has i_block array (total 60 bytes) + * first 4 bytes are used to store: + * - tree depth (0 mean there is no tree yet. all extents in the inode) + * - number of alive extents in the inode + */ + +/* + * this is extent on-disk structure + * it's used at the bottom of the tree + */ +struct ext3_extent { + __u32 ee_block; /* first logical block extent covers */ + __u16 ee_len; /* number of blocks covered by extent */ + __u16 ee_start_hi; /* high 16 bits of physical block */ + __u32 ee_start; /* low 32 bigs of physical block */ +}; + +/* + * this is index on-disk structure + * it's used at all the levels, but the bottom + */ +struct ext3_extent_idx { + __u32 ei_block; /* index covers logical blocks from 'block' */ + __u32 ei_leaf; /* pointer to the physical block of the next * + * level. leaf or next index could bet here */ + __u16 ei_leaf_hi; /* high 16 bits of physical block */ + __u16 ei_unused; +}; + +/* + * each block (leaves and indexes), even inode-stored has header + */ +struct ext3_extent_header { + __u16 eh_magic; /* probably will support different formats */ + __u16 eh_entries; /* number of valid entries */ + __u16 eh_max; /* capacity of store in entries */ + __u16 eh_depth; /* has tree real underlaying blocks? */ + __u32 eh_generation; /* generation of the tree */ +}; + +#define EXT3_EXT_MAGIC 0xf30a + +/* + * array of ext3_ext_path contains path to some extent + * creation/lookup routines use it for traversal/splitting/etc + * truncate uses it to simulate recursive walking + */ +struct ext3_ext_path { + __u32 p_block; + __u16 p_depth; + struct ext3_extent *p_ext; + struct ext3_extent_idx *p_idx; + struct ext3_extent_header *p_hdr; + struct buffer_head *p_bh; +}; + +/* + * EXT_INIT_MAX_LEN is the maximum number of blocks we can have in an + * initialized extent. This is 2^15 and not (2^16 - 1), since we use the + * MSB of ee_len field in the extent datastructure to signify if this + * particular extent is an initialized extent or an uninitialized (i.e. + * preallocated). + * EXT_UNINIT_MAX_LEN is the maximum number of blocks we can have in an + * uninitialized extent. + * If ee_len is <= 0x8000, it is an initialized extent. Otherwise, it is an + * uninitialized one. In other words, if MSB of ee_len is set, it is an + * uninitialized extent with only one special scenario when ee_len = 0x8000. + * In this case we can not have an uninitialized extent of zero length and + * thus we make it as a special case of initialized extent with 0x8000 length. + * This way we get better extent-to-group alignment for initialized extents. + * Hence, the maximum number of blocks we can have in an *initialized* + * extent is 2^15 (32768) and in an *uninitialized* extent is 2^15-1 (32767). + */ +#define EXT_INIT_MAX_LEN (1UL << 15) +#define EXT_UNINIT_MAX_LEN (EXT_INIT_MAX_LEN - 1) + +#define EXT_FIRST_EXTENT(__hdr__) \ + ((struct ext3_extent *) (((char *) (__hdr__)) + \ + sizeof(struct ext3_extent_header))) +#define EXT_FIRST_INDEX(__hdr__) \ + ((struct ext3_extent_idx *) (((char *) (__hdr__)) + \ + sizeof(struct ext3_extent_header))) +#define EXT_HAS_FREE_INDEX(__path__) \ + ((__path__)->p_hdr->eh_entries < (__path__)->p_hdr->eh_max) +#define EXT_LAST_EXTENT(__hdr__) \ + (EXT_FIRST_EXTENT((__hdr__)) + (__hdr__)->eh_entries - 1) +#define EXT_LAST_INDEX(__hdr__) \ + (EXT_FIRST_INDEX((__hdr__)) + (__hdr__)->eh_entries - 1) +#define EXT_MAX_EXTENT(__hdr__) \ + (EXT_FIRST_EXTENT((__hdr__)) + (__hdr__)->eh_max - 1) +#define EXT_MAX_INDEX(__hdr__) \ + (EXT_FIRST_INDEX((__hdr__)) + (__hdr__)->eh_max - 1) + +#endif /* _LINUX_EXT3_EXTENTS */ + diff --git a/source/libs/libext2fs/libcustomext2fs.a b/source/libs/libext2fs/libcustomext2fs.a new file mode 100644 index 0000000000000000000000000000000000000000..a53a84966c6c09cb6f7875957f50e89aceb76efb GIT binary patch literal 398524 zcmeFa4SZckbuT*m=-58C1supBh*$~7SP&VjwrmR{Sq6?96BHtX9#O!6xsoi&wy-P< zNe;*49G@dg(0usv{M8T=$CdK|PQ#C;m+%PS1gA;CA!)B$@>~OHu$#0sg!`Iaav`^M ztoQ%Vo;7FoK3ld!4Q=1=%}-lr)~q#a)~xwnGqd;H6{mkF3yoUcrd6{RG_ksTs{d8QT zytUhvw_$(jx&BJ!{ac=0H!JUpe^&n7vqX7O&z~Uu@4V;ypT9<4el(!G=MX3S{I4%4 z@89sm>ffqf)$^e%RqR~Py0t1c)iX3*#m@IR_z@NRO`bjl?V9!<4RYm(O|M}R>s)EnjHqla#qXXz_4Ccos<=FVcB_j2)sTuGU+6z4E>ZEHe?0P;7CWY2`~TYW z%8P1xyiQF|+~_~A+t8aGS+Z`pW4L#uqpQDvb9cvD{M*>k4Pb3o_eN##>w#Z4)Z6Q$ zhnGwdF2Mu6pYbUzp~E~XtSq7%&^NHTr&j`odWU<5uJ7#_-ZI!b)X_E2)3J7ak06;1 zKLdVx!y{cI!)2K%qp%W{VT7?3!DvV`wNc725=BeUHPYL$erWTS!H$uxwf!~|7NjB9v>pdbF&=KD~>w^gX@(Q;<6tOWilpI|ON`h!Mit zSlyeq3|OITXz!=DbVZ~c2)4wAbw_V0%c0ywP?W`9+q=GR;OxS81ZXUWt{$uEP`VC= z)ZLp0x0a_69jZ&Qd#KmZs7=rWhZ1u$8I4lW!6sWFq^=R6FyLtO*wdu^*A+HVxSNDqiQG8h@bWl%lrN8B zgWVWw*Siy~P@zQNqT*_aLfR9)E-n;z%W!W`M-OURS*jsSC?2XY<~AK$21sT#xxOP1 z9*VQBziYjn_fR&%9iQzQbmIGA?%c)_x;0WF>&E9q@7~bcy>WQUridU{n00-Sy{o(5 zZxlit40Y-Ke#{KlONBlVYMW>v)RLn0mnZ-TV$){KYyE~NL2HM4`#U!EZqofkM{s1; z`RfSO>h&EPx-gmN)L1xd@yG9;tpi<~`no%YdaoBuU7V<@6O~Ma49j z6K36ag#$T{VD}gf?-|-Ws1cHIfVBj=oI_#4I21g*dC2yYCN_h@$(yP(MX>Nh_Z5-d zK&X&XoB^npO;^J75a|mcL45;#(4f|r1Q{u*RwI>Q$aAQ-yQ9C?&Z?=UP|)De=I-9% z;gX;d-QifuXL%~08A7t9*tRu=!i8%n*mA}^+fkO~5)2k5!BEQs5~J;GP~BZI~z1<_5p>Ll?2eow#jr4W(`xqC|+BY)N-}}CSp1!Vuk975K z5k?dxDiXub7AKfC)@{SRAEhRvc%gq78QMZwjYQp>2W*I0-S=R9x&ce+(gL+NJIJLq zl%mykCDx;w`A8pP>!A1dj(lWu|CUX?*K}?2yN7GbLarOwWaktgv_8aK)qDMi2HU&V zYEB>S?dosq8u2@v>vVV3-nXgOPv%;z;5F5?TL=76`U>_(?;98y@_U944fYO{pz8+u z`v!cg#j0Lbcwa`%;i@3$i_zEZ3vaWdNn3@<6(|a`DE@FS`)5clQC9Z!I1qI;0DX4& z8Y4(kg@tJ~xE_`kgYMn{0s)9Kex18jM(t#xyI&y$ycziwaMMPI2{SH;pl|6oU-vpJ(Z&ps-wqAn2&9F-662{>Vuvd_a!%!Rjf@O& zjM{(&gp?pqT|J-Lf?mA03mwe5z&zAXN}?{&j1eIiETL>SHW^D>&fKB`5rhj8gK!-i zzzi0q;2>mh>rt+K1M4=2q73y8_IH^I^}QQ6Ztm#Y+_9-^pldzmZe;-`lCuUasZFol*Y^%!wgmI7 zzhHKZXa#0^Ae zZ8;l0B7Vp|V2mn3CX!u$jUJ7QNZQe41QxwzsWlo+N3+&ijz(#HMWe*z6phu@FdDU~ zYa=Yrfl6T&KIzq)6&^z&g>QWXvfDP)_ z=_9A8q*kah%{y_!1?`}M#q1zL)y~0`WpAn~hd3R93g=tiY*`WS#0|FsCrQ0JaN|kc z&=sImIh-iLy5=A#{vf7roN)*nhWR~a$KZyo++OM)aR&ege>RjmI=E4s@ud&8GTNa+ z>t-E1yk%`^`l2#ik>gh{i_k_qeS#UgwYhIPrR3GW+-4qw+h(ruU0hSn}8 zoT0#oAzb~Hz6mVVNj)1q8)?T#k3Xr#2-CL-V~Gq1?(i5u1V&OH<1g~dWBB0_5&WT` zJc1t{h@b(?olJpAei^qsloNO?sGQCGhJ&- zb_+tK4vtWXQa5m46PSFDSo4Gq@5U->eaQx<` zr%p3M_m=nBBA+duPT6l4Q6iVnk#bKRv8)1EN!`4@2Ep|2P4(_a9 z0STOezpU;BCJkjV16VD4Sv3%eN?12-!A=>iET0m?)u)@&D120k5j97mMpPU@mC9$z zG|Q@h#4W2e0YsFHdhv=en|4JZ=D6gi9X@E|hYojl4ftCk5<|vK_9*MN^xN*)59fIs z9W#Plg3J&bW>5+iLbI>X2U{;DKz4w$^~M?teEUvGVqri^Z3^>IuDC&zL@2T7SPzqj zU$OOQA{5%lR3cNp*I6-}sgw=x8^C#%lJz4Lt`L*s@&I;Md=0MM3hRp#s?~zIB?f*c z)X;{5S)7{(OSVx?zRtOEqfMh7gPS3#TJLZ6MJe zD9n0#*L7{_AL;ni<}E`5UHyRxE+@Em0V93b8smPT4ML4aW_?j5khM$COZx0|hD8$! z8tV0n5f!aO$8EHszCl!Y)2+JuVFAODYcq<9CBk4wMq6aCN3tH1n&A$ACvHk~z+P1r znNwkjItY`kT~qiKHFP>h0Z!I+ldZX((KH>tJ*g#tN#i(#)$5+ zoA5eo1trwK8N1_lmdp^g5ucr#ls3t`D|C|5o)8XW^uXRd39;M20|4c0+4?qhWnl{_ z8D|-R;Sdc+_8=Z=GrLY#9Ht`p!J)qEWe*0O1*2m_0~HXq3Tzhy8C#6YO^E#|K@>*U zx+v{R)NncyezrKADnuma24M{98}MZ=%Zh_5i^Algg>VWZFntYoX>H=r>p*wu04TK< z=wKKy)a&+Tr4XKTb(8GPVvF52I?@ex4Gm+n zUOT^F7&3tU7R@?Xu7YsI(hAa=2$xO?6V{N$xQsN9sFJkQku7i7H4jnxu0d=k1oYt+ zNMM>xa!!##`A1zJ7~y)Cy`3v!&z4Pt;bL)_vnZfBH;SGz^=89CE-Z#9y%`Zs(q#{0 z=%&*6yM=Mu3m z@0~k&boWVBng8gu*`1zh*t1eq<(FTbW&Ax|syaXCiY)o;c~sTzIjQP$XPUFQ!kp~x zM^$2vr;?4Gz|B>uJ)Li4^}zqlqAw!-N7V7$#L}%Rx2t6C zp#|C8kCtXzluC}iS0$Sv{@8q#DjfdF*35QQnR^8IpDfKTx*dG>t3-1~d4-Rh87vl5 zvhc|tX16`_b;k7;-#Iy%&v{ShI_G5btw&P%1&^k-J@=h#VW!Fy-v7gF;U=W}C6$CM zRfU_=narJ`^rk(QExi3n&1=z^ma%Gdu4-)TMBZ@+anF1eM>^@HO-R4W+grHpMaVOm zD}3oVe@BqFZxo@k?a)OoQSs&N(Bl|%G6sE&L62k5-x%~V2EB|ye`C;J<6Kqm=>B-_ ziKW@x&zrN*ZB6d;^H>IT`L|q=Z3Lg(!3EjI6G}Bspv*j#V4hjN)DhB6?R<+;_^kuq z8t|>93=Z#!d{Mm}W!Rd#L-XxH8Lp;oN9U;|(p$rFEY4ItyGK?1;7pa=eLyv!TpLjz zR-kM%DA!e}4=pI$Hk57qu2EID@-FY?+&z$MLd7VLuQ%^`mSf?$f6W#i|7EuEfJ!tz zin?)9RW-3}XQD3rOr=RrI;7b-I9nxA7b>^k=TXPWyY5qeS$vC1Z~I0pmAmX)#}>X( zscjFQ8C-r?se<~mRN+mJp`5%{hON`D%*{)QneEM3}v6hv) z)vCfx4`f!}saD{Z^p%C1A0k}0?c4Wfw|(jEZ2tDPRDSDKslqLq?s5G3bUQTNgWy?( zG^+CpD#$ZcxV6Q{vp(-vdnLcjS7FS={bHK9>{)PYLO9B_#>OAlX}7vGW8YP^g+pfs z^Q%s!^7BrnOuqO_dD6@m>ULG3`zP6LfByCCwtx7JuG5e!6%JeSYvpY_=ItFtTgo>+ z)K;90_&2G{%6(@JN}5u(0yBTmL(eG6U)OWgm+h!4`Qm6Ab-xkyeg*1%2K9aw>V3-? z>Ky8Q8|r;K>iufe&o!u@olf06f;yMTr>7kxvH9dgYI)ib)VCaJ8k-$ z1F91BQ};QjqbbzQH0pN^>Si74c75g%uXWKM_^5~_t(m)2Eos9z>fhyC zcpv(-bw9}##{6{H_E7%GJ?-eLMs#1*%KR<80rm0Y-d>&0ildpr*irU_)u62`j2|!M zGXwehkf+GFo&QO-$}a|-2Lg>tS&Ij2$1H7Ms=lye=* zxgO=*fO2kRIb&Qo!tsUWf-z$&`jYD0w-#hsX1O0P&7x1K%~xN+ey@T3kgf-&EZHwm ze~>?2>{hAf&dF~wFU)Ul+nj7JKPQVe_Ehn^ko__AH$_eBq5s&i2!7zwg||JKEnEqG zL5Jvv61kb|8{>1qrxA4Zq=PXrIF58a-i zZgXGJ{jh=#t0`yhrx;88F{Fm+I%7qp87pc~M%5@IjQ##tfpWTFyv%&!ILbJg`$cs8rspk(}dj3#_c8oge?OgPEzih^Sit(~@^7x|tx(#O+ zjVsmcmv2h9&GE@ej3u>&@rqjsH+8DnXrr|VYc1@XdyHk=yia+k4~fw})n3@QI+NL_ zQaZe-W;1;3Ce;plRoI6<@L?}mxbwNJ=6&hpB;wQ-IzMr1{)UeoD->6wZKxYT+rzOE zeMyexT-bDrqk;EiLNgaxA0}Z{+M(dbh;0tPBK4tDm^B^--@<0+q8?s*nQB$ zohR7NtE2cJkCl7At=m%qx_=OLvkq-u_XDV(m8hG^F_ahDeHGe$HQId|bxO}a*zVQ) zuef4)x)!FnjeR3+ZC9jWP3*-f&-9YT^V1Cr8x}5AE1{Z;)(>n^oXF0OdkL@7QwxW; zZo*-F{EiIyzZ=9ig4KpvNK=?vxORA0Eo8t#V}am$+~4~5E!fs7y$}g^1xU34z`Y52 zP7>u%_!dq-ku3w-sO4adG|uhOa-<{X5|^`y>!2gBmh%)i-*U5%%N=ggNkX1a;uuP#dQiKCl~hkndRwVR6Wa$pm9&P7)TnsB-d6Bjq0kK)&* z>jan+BK!*7haEq>Z`_N2Rp!AeNYho~_p^8$e%>>H*WeK+{I(!K{P4cXIh-=7XU*Y$D_{ooa;buLEfAh50|3@4iuWj?>yE?kqB_uRK$tk;C$Rk5@VJ^}Sy=~W7RNxq zjvN|x($lc3U(&O^SqGTy#X7*0nGalSADA1z9|Anccv~EI;c2 zV|7__fG-AAZ9?ksS|Q56!iT*aV9L+BuN{>PXLV}e8~tFl2K3C|9~oE~JnM;e2L8(s z{0|}cOc3_0%zk`tVF-U!2<`~M?B}#I@yA2(7kt<|1^JMmccWB(7*Q=A^hKpauAN$GV|q$%@5(18n_kdfi`xf1EYLn90%ZHao{g9hPG}MF;1Urs$lSC^8*vE z$NbRE!m@J#{uv3oj}zi0#zA`vknttZKayqM2NAf<=Fc|FVH(&GC5CUfoGRSE)98@v zo&TsaljfvB6v|2(xSJStEv}I)&p>nBoaTz1!hxWvVT1x9H6L5LWCF+$Yw&X{Z*SPRbHw<#q%785SzsAyl_n zy6Pz}fiB(nRfAG*5I_2ci^YGNQg0IaK@2D2-+``M{0Eh~MEp;c{2Zs|nD7|J)oSst zQtDFiw<&d*@hh}xkxd;{>Mas}0#h*K_b?`=#a~;Z@fsbP7Ny=QH2n@wq*Wt4k(alL z|Eo&9UHp)LuK0hU)aAxcUDb*o>CP9L8VsL~-^M*%(xI0w<=sO+EP3~O9GOQPnNdc* z{C?>UuN4#gx$N(Ym+>8SbmwD#k0Bj6lssH5dd&pZ(+?QCM+L7Pt{{RO#6EyY+5T|AIYE)%Iu|M^L=~i-Sd5WX`v~W zg3Tcbdqax$b=rn$U*I~9>pSu&da8PKF6{cg9dj?&i4!x`UoI;8wvr<3A%)_L)*e#0 z=LKuuZO-UPP%GoZhEYxXQlYvnwe4T8N|AS=;vv|V9#Txp*xJ*D@x%Vw^8oCpkHV($ zy%VY2y+88lZ$F|6Yhai8#F@e7kL&gBLCBv5U5(x!xT_>Lw9yu@I61zb#c&RuYvYx#7Pv#kVY4N-=b>M-IHgwL+829 zsy67RJ=gtK+O_Jn?FD5phB6pK8DNc@!5ViJ*0?QL+X(soTz{Z7`nWvf>lbclF+ z(1lp={d=wV7NgB@Ug@kez2^aoLkVhEhyUV-cN%Fr@o6iK(Hu*oWZTBoKauj=#=)IF5cuoxsCBErEyfCGk*Rhu<{H zyAzK%;U}>C+VJ1Pyj*mz(}HlEw^EndQD`{Mjp4lKG0$RNWL_ro+7D_p{u%mpAvhO+ zZHL@lK3|Bg<1&47Uz-(}CQUiNiJrs+=5vs(6-6cE56WY<_@9C*#QzISd5zzzF454e zC-h#YLo+VplF2UT9(o8m*Z8xven}$+AGq@wf8u^wHE0djsyC?Don!xZr`iAAc@6q8 zvHikETg81{j60RN@4!Ys3j6Idu+blYUG^mUZ{I$zZOXL8(*BNdpdNcpsRC@0h0pu@ z5l}|bg*lFh4U_)dBUNnz!)6-OHcf;hp6B{=kEo*@XL4W0KJdL~28l<%y%Xa>f@4YOP3g7=_R_y#m4|@~L5AEs55Bl*G`td5Ue>4BIpVM9rS@c5R*so9M z{2yAd6=QS_b<_MfY{A?!B|q#-7h$udZa8*RKZR#2Zq<9K-Ks7#s#4@fzLc9fabb=} zq67MKhe|qGbO-I+*t-bR-2HcUpF-ysc<>}|nIH7%{nWeEYQc}eb}jg3><3Zi{Cm7( zg&RJAJ;CE`g*&kibO?I^kNCRJ-3uJ$dAPQX@mv|8ciMa_!9(j2w(>UWa?eeGp<9$q zq7(fD_81ac@6d_6$Iy7#*YCfFZP;HdIIXbbEEeK2;wU?98Bv5q)?c7GsYWp>BT^S) zG{=HLq5SYj-|qJg2ry2@levKDmoaH7y30Y6I1joy!_Q5ZVd6M;(0vk*D_^G%5~ZEc ztp+51cxOG2f1P+Z%((X3?SLJA?1yD2g0I9Q@A%=Jy$b)>f07@^J*GwY%XnOVg8(Uu zIFac90>lsR>^A(%;vqkon~>j=cpQGQBY>$-al+$!2oOKKvq>lN%{Dl~KgUCU^?2a4 z4RD_C*Z+y*^UKgY=a&deX$t=zY3M@poC@f|lR81X(DB!q=S+VFs25Fq%0<~F?@s*0 zQ;25f5TGdW(}43&(gCA?7yF|X1;SI`)&YjStKfn+8O+9A^5=%{B#IrJ*6nj&PV zjKYP454|Ey(nHJ;CKNC5k~Ak)Al!{pmIJ?n)T24gGIgaD%}V@hP&3890o|1N(Z^al z+l`KGYOiC9I|viM(4%jXxw~p}_;)(|`%88?h4qTq<+wf*yPTRR+2Yg#PP#`O+f>4_ zO`)%~wn6lbz75bXSZ$)!3j(_yfYqs9&-?xVavrpyY1yk-56paA>#;%quSE}q`L90X z`4Hx=4b8|g=CrMt-!}3b#b`I?vmgo>^W5Fo@8_8;*sN;vm*EW0Tvd0|0&k>nLkrggmAOkV8!SBR?WH|u@p~pG zb2I-rSvdS+8_xA)a+mz%)|~p$vBK?ou3MjPy*8V_`pjUVu0BO$Bo|Zo}ED9@vz|!T&RJvXCK>i&yA*b~9ur z-L}8~PByo7PPQ=pF&$pG{K;(Y#(CMMH0HWDKbK{`kxzX_gXbxV2Yj0v))+~iN8|Z4 z@M$dk0Q2`J&J5k@PvI6t!4Av;CFn?~jrpR+Ty8I62ah4N$Z$SC2f!-UD-YS$w z3(BuG_b}FMkE*uZe!U)PXBq7pRW-YD#%lKgRk!<5ZChM{^3^s)>Wg}E=lHZ4=Jp}{ z2I%h*oQwIcs^`2PbAFuFj46~|Z$+c<*?5+K`&oYnQhM= zY2#VM+?y+?gCy;T%MarmP8vFWi)z#HA5lAbzLk1ox#%)kk9FjY&-vx?$1h}&PygIi zC(mU~i;s5TT+bh=wo#O4{;D&BqpXYj=N{Yk$DOHdH+?LX{=abu;6ZPvYirD}I*9X< z2U3MQS~9!ls^qSfDupwC)qrVBtSszn<5{>$=rswQrg+{MdCU3djnH1UAz$W<56hEh z^>FT|n&)#EuEVg-%k|Eozp`-x6$E)@y=_uB&-cXFvrW_!d0=ft`kj!U@J`6jI-z+O zy}NX|jrv^RORR^>4`@58UIP|FdP4b{Iy?Cdo`Xid>d0p*y$U^PSr(Z`DrkSL;#oA< zV5=z)VftNpv~C_z&r3LIwCt!anhrW4tj{jp?dwhR!aBb3@Z@CUgx_9;7P^XQdg{i+ z1zdR{%Yg0iKSvqFYFv8$?HO0U!mKbwkxgtZ>p2_ zD{Z%ubU$nA^r|2FbsE2o;W~}_%zAC>FlpR6ZQ?G)`NP5u-d^aUHs5rjP3&X5o4_`Q z^L{y9_DEZotLZ0nK8(K+eMzpOB8zck%_#bHjvw36w{J(^Zq8uWZ^zhxF{KgtT!Aqq zgM6;Sn9?$a@nH;O1ICngj47*~G3B`KuTJ3X@S`f-{HWfOs$)NeF{QeB0`r3kRgF1- zKC{Vu;?XuhoV%@eZF|i)b7;<**6K3HxkU2TdB8bD@Vtb2qPB$NBseNA~!RL4P){r)_5=^XGN{$?Z6c70L;ZW5@9h0~W`1 zK3yFi@xz?t#8kNXN9apXnEU&o$OSq(6aFxnPoJhUZM;4$vCD?m3S5PpT96QsR1`~uli zC<~l-7(zRG)xt?#(G(Dt`n3+Qti^N~VCL^KAux>J6M|QV;E;Vnp$GMyiND8(rnkf1 zKzaVeptTa=|9%KQ5rR(#Vej=J`1eBa2Sf0uLU1tz-w}ep9)kaS2>yp49Fy|ghx|dm zdVf=s`1y|+`;%X3fVXW-;{yxNZWZkLjA7!Or<(NlV4T+>SrdfcKbBsgR6@YQa}$_{*mg54Na+h(XTiazUG8_JO9^*#t)H4meyOWS`2!-4U8=s(0J z#clX*(5qg?1|TBA!_idy#iz$wuVubNo-i94qObDDmMqBsQg3O^GMl zjqr~RmTXP2@siDl=efnU6Z>k(*2MEba_%dJbmiPv?3t2%DR!!4U#h4q*_SHPjvsj! znJb*US3o~vkE%FWlC$Et<43;4J{CtmA?L^9;4d=Ap>wg1#WN+D<49Lzj(3)1j`x>j zj_)klyW;ma{^v_F$6qe#c^dL4=hmjJD9Jf(O-asagC*If6-%;BLt3KGX%i*crae%S zZ5nhg_PS}vyPOT<5Fp_^p=Hm)K?XVh#=U=QV}x$~vuA7N6IJHW*tu+U%NDz65SF0AOx*`Td+=+Sx>!cl{^Kd^5BOB}xMcC(XKT0Xs<`isO>Vvq~#_0fSy&ivQB7&!uy5RgIoZn3M2YE}N~wuJ>0XJNc8^TFFyI-P4xe+oRuT2ukDV6J`$cYh|YDO&r}%dp4jdu~Pi=DMq1Zts5G z8LTJty&%$ouQIl(7qMojG-n1<$XlFt2JCCE28~`PtSqY5rf#hHAjfqZlgrz?lgojt z!uqf>H*596rj06|oAu^}jom7auz2Gv*b^Xc(|rGa6!w|p)C==MIU!RDYluq7ljNF0 z3HPVi2N~4 zhHDsp{{BwVfb2}m==Wvnjpbp|X1&Q2A(zQpL-B53KM0E#KBw2;HN`$v*?wCJR!NiT!3J0jdmz)HPLtHh&YAk&DbE;|$M3em( z`zG4rKAw3%*o&}7NV{!hJ=X0Mrn}rMwXmRGRA`e&@S9nAo2p`7n);N7dbgqp^$YPE za333Suqih`xxDb?RSQ|i5xzG+E3>eWcu^H@MBLleIP8^G^=L=$+=zZ4kzAhHK6xUa zzB*edq8~utkne11yAI)KLz)-wH22RcszoZPH8Sex6y_l$bo7`}tK1o90iR zCO^szey7?YH|u)g2i`*Fi*gxx*dDlkpHlbsOwmdI+z{wfDEFE@T_|^)oq^4odk+5D znMYwK#`_46PYmRf-^}Ia@SgqN#v;mlLh19Oi*SnqxL0;oqaNeFX7dR(3-II~d~Y+S z{`J;9r&VG>QB}a^T>H`I{PIFSM?O`wUm;#)@sLWOzE&Zf8o4{o^Z?h=HovVl%n6=NMSY9IexmETv6&=CQO8jSlc?9p zv*|Xs4rhobP`}4;X33XPMTPyY&)Jk-AkU9KmRnIQUf+5s$J_DN`6OgHmF2>3K$fFJ zOf->uQPf74&&34phK6EC(pV1uXCBH$umt|+BFhO%sZ2#-Sr`fQi!;y0NWWa{?8Id} z{jW)$H`l4iEnlvB&dDuAq~G!`93o;9#dm#2ph{XiCxOFdhQEotgdgoyOpEYe;c@xx0NjH|oXGS~2yp3M1RO!{4zamC>9 zi>(3NA3?XM6o=S1RpFoHBWZAe_4yx{-w}huk9Lx78z9LOyl<+(Kj8;cl<39#4E!#? zrvR_OBTo1YA;9HV4_Nr6436?)^mh4GP$y12@q5@|5!pP zTaDlmC-Qv{0Zuw^Y5^?#s7v9;`s?y58XSJK6Mn1*F28ob!Vf!A!Y?)tewW`kz%0VV z86L6A5a9Cb1T6fj4GwVZ_u+T=#ZMa?ezX&Q?*`=Z>jy0SBrWn|`*rxS3!p8=I^nk# zAud1WfjVTnOyePr{EGN>`H|NeJmQ4k4G3`g9R@7&z185z53@Cw-}Kc6hac^P->raL zeop}wel-S1euv<9B(1yZiyS8uub36wx0wDF5V+}*j*j+jtjfeq{|-RbPjN!W-4-d)&YKp1>ga^06%j~822ey7f?U6s|8H`zt6zDw@v+b z8h8g_>VL$*#8dxYFmMlG=H<%{O#MG@V4gFj{(o%Xe!$fKiw2g$__cw_AAg>d;R*mK z56|YwFFdcop-1_6A2IL<=utkN$ZPm}1&1Ex<=ySWUKaEyFOU6&c80&mPkB&&-m@Y6 z--qB|7?}6)QGVWO12aC#FNPoOQt+VsVw?}q5w0zLG99OIgOhNx6<}w@>$sW=2f7#6 zOA~QD&vsFk3D;q=nImRZf0^fCEVZn=qGN=xHdf%Xdp6WxV&VRH_a^(A@sh+oHk>z3ya{zls9Q5|?IQkTO7aZYoN1Xje-7Ewcw?O=@ zut16*xP{_JJGJznSuEj2C;T2Kt%sCaA~Z)F`nuBo1Cw4VG-$4}XTqlL`|$}I{k^S` z@Ls{v=<~cw8s4=mt=;+D?~6fpIKKy~#S$mw+GC;6GP~=4cKq+cc2zq6bCxFU7&M}( zT!TV1g=x=Ia|+wTLTo}NlMt4>&u5WAtR5HQjbQ$m&Ux8%T_2@J8UQ~sXPayMmYB|?7=_bM;!>it?;}2MgXVrh!Y+R7eBl+2k}q%Q4hlJ0Q@e$y@1nr#0igm2oOKK zGjsSS{McU!zr*mm{2m0H#v@L6V6GqFcOzio$6w*cxrxi~X~1bb;)LIi5FmbdXEGnc zkMk|z_X_+jzn1`~@rV;1FC#$w@XnmTKjDYISonEwhM)ZE@xXa0{F|q}{y*aIcyA4^ ziM)3qoV4OdM;BTXc~>Lu5+9}i3mt!*HPLj=3lAfV^LfcHIw9p_~AFTr{XW}0=An}y{X#~N) z6C&1wSTwapg~-jI79GJLb-AESl zYvF#W$8+eZM#KZ1-UlTPd*ON?*3e}5&SgWBZa(1OJy~%AY5XJhi*be>IInR+#Tt=r z;ou9rm!!{(`|nrwc>cbI?>WF;?n{gIQAWJ8fOo#kdmuF3UFtY_GCuhlo}T6@XY_IJ zq}XNdzWDs^ad_WmWjWx#2f4JBQlEMMbNxBcBE0bg-dAy{ zU+0L&9({6W9`A~PY=~1s8qEvzq&2$HXK;321|Da*H(>N~f@ce$1AX2g-+Xm;>>jig zoH@uHT9D-(H`aNyoof9a@jt>odMD&~L_Jm9=HC-s0A1nCM9P%?!NT|{zRPN26nLD4 z;8`rZcc1Ue$GgT+e{qImuy}{6EY88bu40;JNLJwt$*kfHDzOvcWoJkbPMwW58-z zsH2*(bDUH7-LA1rXYHRE?T~)dUAgF6;P{HJe|Q&P9qV?n=KHuI`~_In%z@fGJTm|B zdtU??M;zT;JoKZ+YBv?#zhO-iOBvq$k$G;N59dy#;e+u>U5m%b2b+?e zzW`C$n`5@C{?G1_06jv4q z0bB4CG|o4>^qW!j3{{Qvl|Ezpi7bZJdWloe)KCg{Gb#5H8g2yAO8)0)^)n4 zoHfBqsKtg4*M12@?;$K<=-G$L8p5kBts%TtENLZfPiZ~jK^|FKcwa@=B{WD^))^kw z`*NP$J5}pc6r-qp}Zy7YOiU1lMDIKOwPRn4mLLfN2m-(RZFIp-$uo;J)q`7NBr;^ePe&`B0O zedgDmSC%xVi1Vwn#ld`0uLY*!c`p1EX zGHpYz*MxjGBhupcu=Ki+wgS|bGmxhy2U)beU{qCMU3=)=omgYM8|U~jJJ@+C-UBla z>m_{Sifx7ASgTbxo&ZgsN*6E1_qu9VUz~6G*s+n>cy}Y-)lq*0?{@i$_jLaA_>Nld zRjI|RaQ=Lr_cYdZwY=L7xreb%@pg5o#I8|%SLRWi{XXgQM;a@*-o{$He$g%Zw>E#} zwb~9)_}p{Z{2z2@`JJW0&tX&O^xHh*@V>{Vp}RWVZLiX6Wvqj-P7d55H~Ki0y9Mue z$!Ob2HTA%}voAs3Zyc?_H-WBD$t^QfY;+9oN1ml>S0JynH;jG&`gjid*s<~$-uKZ! zy94qv#Jo@+P0&wM8uvqxr=3`{B7aHfTA8^KwnGbjM?=dM0(_w}t6=o0R7#Wi-zz5-(>NL8y15hs?{sE?!tbdqTN6GI~y6mPn zpC8RKLO^>R_Z&L0bZ+7i{B(WNA1ue0j`1l5e6lvG><70_T{B9zn$JNK6y*XKWYmAU zedg-NA#)`j3<-Ko9XIeN@JsuEtV7!2Pva3sIy$bo#Sd>a*T}+;afRRK;CK0r0QP6x z@W2U=qT`3R`WgHaehGskj5Sh#-$B4p{O&Vx@IzO93jc&3*C-<2-@xz6$8^(p#EE== zjR5h(Tm2IL2|xZCeja(b{7wT-;}Iu37%qNzFC||1(at0M7QpZD)Aq55{CaOUaqvTT zDR~J$njM5+JNz!cHo#H*K4jwHhwjoU{1bjK!&rWK_+5VEfa~yxGkMhK!Hu7&OKb2? z_@&?{4zPC*eqDYK0FL5^*{F_#AG%BH@lW`1?^^iLmgDkc`DXBlBORRgJ^V9%!k4bV zKjFu`3%~yfzr!z94LE~GobdY}2yppf>SX!xEUe)dlYM{F-ePNjizp9mXLb3p97R6L zApG77zboI)DflfnaqvTTX(#>(KkQgoe!cL!{2m9K#v{(i6zfEQD_=ig;g>czz_FX* zclkXJn0Rr*kNt+rFAG@sz185z?@!=&_*F1Y4IXjA?~f7S@*4*%{76q6`TYpLF27p9 zt$4&49V514}8v)F^Do*&lf&iD_KET3{G7v|8q5h!a9F~QO1z7UC(BPQg3HV)pI{~Nhh%-DY?m&RcFAZ4uQBINX5%^tx4**W% z5hwhBOP66&tW?DdgAPV#0edLSyzp_Ckz#Q+b15CYJ2bklnb%2>q>i~1SvktJU zXY%KGV;x|Q7uErG^-X%{tmFW*zqJl<+5+$ZW`AcL;2I0S1DI{yI>78NtOLyUZXMt{ z3%~=I?aeyCrtbMcfLY(I1I+qr9pGgafCn(oq|G*AJcq=(V`VVPZE^4{zx4)g06oi( z{l9jGUg{X}EYHUb+MI(@Y=_$U^tQUmIjFZ7G~17|>w^7mdau;Cw*I!Zk1Lrlt)@}NG%Lh{5uZsHS<`Vre=VCE+c z`2P&?=X{rrc<_#ierf=tzQjWMK`HsJ6?oL23aNwjfKh)cRtSNg--?MImSypTf z;lB`q?+U?(LNMpubcetX^|9h5AJp=rKE`dE^wW<^9cBLNfnRCpjeg^zFXEQ~KODmE zaQHVU*;uew5~ecbIHneN2g(0vqU<9@8)EDxQ8aHivSsZrfVFAJ#k&jEVA9cM7@IWF zmN|C5$|IMv4n%fW_vMi->j=4-bUAa$l~{3HiZIS{ced;#o-3Eci!}L|0yMZNmXRi) zV6?NOW;tpVghYwV9lk0)6foLIB;PP(8M?XFaiX|I+iPqQ`e>J>w)>deO<@%ZVBM^j z$F-dO3gB$(TDy(Ea)^pI_p#D)J#$KO)sM-AOPSlWI*=l=8JW$$_? zHlN|n>yA{T&ZR$_s>ML|n)bd^XPP>(#}aS(T6_15ZTaphoMFTsXGK+GzUQj1T~k!) zXqu`ZO(*!I$w&Eo=7A4*Fuvx|eJb8wJas15S)t!spX&wPIMS<0*XR1Mch{Y6%)ia^ z(>p6|dP-XIBVS|^a)2**GVR~RK8^eO9Mj-c;H^2v2H%HQC%d%zqzDQ<82Xv6p#f?5 z0dm87SwoQCG7lq!J;N`A)p-u;4=1|Pb^`NqgJTt&Yy2|ln~Dx=Lp}FC7hRp<=cbFc zZJo4V&e2@?Rs)WrW4KF~1C0K`I^j2f5SQ*Yz=9*O`2Qe8w+}F77AJK35#aJW0yv89 zn;|;RRcr8w6MkF+kRRr!bY2zy&C_20A8~w+2hR(7%?L~RB>F#T=t66E??VVXr7`|L zq2q6?6dr#F$)NAlcgi`BrhG{}p|$&TuCvDQh!cJS%dZXpEv((ANh173#gjUvg8|P7 z;VH9qz%x(Q0iI<6cmT^fR0jh_pKocnHll9ctdS^Fz?A152CfE7c`(Lk7Y9svK4@UB z4JprmabU{BbEtIWH;Zcx4kC7`Asv#;A^iCuIvo=ry@bGS_hU#(9Z#4Ex|R?dgv`Q6 zrZ72K*3hxGEBGx>j8^_-5C6Y>yXT$D>R-({D!)JR|JSOwskbgd3&gpSQy9xsQxWf@ z!}$rEPw;q#LVr{Gr}}+*37mPaEIx*BPd_c{{Z5Qs6Q|C!-#cSlVFK?G{akH*?nd>s+~;rx=%DwthJVCaj!%7p z;~KuBJozBbTO@ENp%P~;lDLzQ;+X}GL;pT9*1jqk<;+B5QQx_!gig}XS55IboN=ju ze(>GSd`o>YfBF36b?-ZMrnph5>*k+|=ii32H}~3m2!Z!o3eWa?p~vrG4)EorysI*U z=Q7&={?wV#dEi-bMYebo-q$z2M4t^Q0@sMLgzn1Dtwr(4$FIl=FW%?Kb)N^H=TGsj zP$j?ZgmW#a+*9?*-2L;D%;Vr;HKY9?)NDuKE- zqwojyncR`3S=<3hHm%1QpHny!wlS7!yis|L3i3~2E^<@Fms`*e;N6kAdsf%~ zzM6a~-`)1L+_cqAneA$vd~kPSJfCQ6Tl@j#<>z~QuZy2Lb6sM_wnaDUb5QL~8}J>C zQ_5R(3x2^HhH$(o!|K3)J>4zq*b+OT=T2Sb$?jS z;UuYR$f)m+Xx&HXUF!;Eh4zxdI~tR@apUkxy`U=4@=nt@ z;#U`nD4%^Qi#t*2!cTD4>d*^W+;OQX?8p5Ue%lu#J7^p64KS8teQpl=i4|A#eVsM9 z7nH=iEK@~{lDY8{(AkfYOZVYDy*GGI1JCbrRTb3nOrdyOt$b+mY4AxR3~8RotUNUN zIMPYuj!RA9OZr<(RfXGe=Lj@=zKeYPRNoQ0u{eo3{1%nU-`JMSufHmpZ#jxK`b6@& zJ5Yz#;MsU8uG{GiKY?7&W%-@kW`1wwjuSj%*I3M=-y45Uzh9L1*Kh`l@0D#R>^q*> zS%thIkGb!hXv=l}Sl?-*+_%*C=2Tl>OkEX^smpGLH}dW`xtb~Gic}&%g&#n z&wi2p1Ii=8dq&_9N10Tj{B+$!nTRay#WT>uWqAKE?-%VyURyKC{DP+BbypyN?1SbZ zKHil~+031(6y8J2`#x&V8GW}*e@}{d<`1$)zMIwbSEo3JP$tMy&G(3+Zs_sDe9JgB zhHrb37iG-crB)R2UTMgfgp8@;vyd}i>MM(w5uT;L)ZdTdxM9xem5m)nrWdsw)D_+l z9M+S_z`mR5i!9LB`SjWPn^_pMd>K#%=zH~hf+cN9Z|pf$XU=A_ZY$pZLLJig_1G`* zZWZsQQ8!x0h8Odu*JB6=*{gT&zv7DJ>Dr#&>o@j|w6$H4#>**syM}wyOBT;hH!N&e zxKynK(~H&*Y|#nKj(Z8O(o+kEw{F5K{P8<7I1 zuO{&1eg`Oe2V{K)jQKKV0O!6Xqr)u5Xq$1)6CtLy%95pTZ4Dyz1Zyg!o}iWZTA2dr z`m?z5WF3J+0@+N4!o{pv&daxs4G#5P&#zGUdJ72Qo2<$s>WdHM!M@e16i$u{&2+Lf zg~V4fhlaZFe$xxFgjI7;M_B)4-tW&MOSMtz=3GOEDZF-5(OnK~0?)bVqSmnY_^kDR zt_$d{#N*0$9B>rf`XHT`1Kf^BobX$V0P(|{+JJvtlgz_I9S}#jh{s9SI|>+0*gD~H z146_PZ)ybpgdg=F{O*L`;TOXw63Op269+$ZsUrRfKd!BW-?!m+`E>%UN0>N~=^F?T zKfI|O_$U1MEBt;6zr(L$Ct!A8;)KVK5g>keQpKP(3&zutWKU4G!@J%})IhKE;!0GHn(zzk!3Nf{jF zy8?cP-?U!<-it?^@Pmys!0!ZL;m3V!(ve>eejR?(i-4o}bs*gEhEKhb{wh3_kH5l? z?ZM$UgR(PBoZ+G0#p?2_27&Oq1b*SS2Y#0y>q{FRal-El2ypo|02Y4aE&T3>pZqHD zz|A;;e~oy=3BNBRz~$Epcpo0-_cDW{{(b;I`PJirOGuhN=;MI*ei*a`C7MA%-H0O( zx{xg>0b7vwoR8A~g^s_DE$DTp0iHlujd>`063_RH#`G=x6o&t@Do^mZTJPU z1-;HNz6U}(dey?w7DK(#5g%nM!m>-dcHm_U(E-RD`@i@5Xw?EdVe5crfA%pGKs;gV zfJZqhtkmeddf*9L2R!?m&zXQm;0ap?JoUWW1Q1WyI^fwK954aI6SfX`)`PG40p5ea zyY+&F$M*WLiLe)V!qx%LI`=~pKs;gVfMTL(PryLEum z7JvuvT>SiR3G*{=tB+BJHzS0%G8p>05dOU(xGe;KG6Zi3!9xaaM1#6am1Z?vFwjNK zG^6L32rW$j880-OL`Y}~iI6Ggje^lPQvtX$M1ZAfApmzS2ryy-h|tok4}hKO!C#u+ zMZRtkfgOFr9iQzT+8kj-H1j}rbHfCctdW5mu+D8_?Pco1x1@KOO|n=r=%%C%);sT6 zbo?A&?YkJ!r`i2Y`0e`_;kWN)e6SSmtt#z-di_pXsMq!#jqQ$q1ls{359*=4&x*MA z9gv7?!`C=GYn`|lM=YN>&Q3}rK!5ZW@grYz#E+`~Ch?=qzft^XzZZ!g>Aqh4X>^U^ zN8V?MA2Pg7{E+`O;)gzGi@yOwf%cj}JTW};-v(%%l5>#v8eDZ=&un^#jBaq#{3 z(W_y98266ld(_4G&vj?>J)eMG7C=Bv(6FM!<=@tNL%8Z|=P zXk2X|Z>DW*joQ}BuS!G+{%G56(p1(XRBg<0q*6t)~E6d=BIXDq2lDT z3u(E0AWI@7OZybEXgVWHyUWAKVs$$@&(l24B1^)^65s<_DnqisKpd$TO=o0T9U)7l zqZiHNEV5J@Su`Kk)AqY-8*)9Dq$XynGYg99y{!-99KgNxOL9H$NHHzaK=(BV`hdSh zy|?|A+J=1R$5XHqR<_?#zl46&Z@;WD%M0Xb0qSxnPv^sL=aZ;6;7MLO-}n1x3(hC5 zBTKN}El@STp)B!`EH%G@UV`;*fvWutWl4l&seLuFOyGNN)M=yg+v3D*RoAYHm*pzv z*goWZ%KCx(eLgIk_ItP;hWHgZ$cYRe;}247;X3_v|;!s`qUfFmzMSCftlw|KLOg@ z-Kz0?`D^-nE3yyV_bStvR{QGW^r_3vS0>1!Y0+ERP??P8GlOz2rdF{pc219y{_|(E%1w6jSrj2}TyO@Np?3`D_{P?dj<08=8ts z2p`DsxKBTWG?G!}?m^<8=9rAk39f zc=RLOr8@|?h)0~z(O&A%d020&P9egt(A^KeOLrq+$|z3gzK;Nx?jgX;n>e96i2#@G zdB9adgkPbX4AGqi+)_^GT^gi|tpXg8u18y|lWuGfa74NuZK^IE^Ba}!))3uMz)|Vm z7NTQ5qSF0Nkgg&HI4a#|Lv*m)X!|&Rv@`nieg(+MM@12Eo2Kyp89IG8+ofYZRz%P( zLzqJsuLK;$uRTOZ`J(t;AEKk4qWFdOO5&%c;P+sV-?SRQ5&DZA3(@rh&fpOzdO3{% zC%@Ca3OItFzI*1d~JxXX9~JPh;Ap~N<893zB>@$%C`@26rHqlql?5r(9IKO zh6nh>9}n%V!D12ELt$EU;k~t=BJR^ZO8*x+{>Dn-Z-nlqWdJY2L)|hTNj#ywwM#}Y z)O{P_;)I{T@@vB{(B7Kx0Ow>i~!M##raA13qN|cmVVJDb@kL*aGkXep3i`#}ne;9Kv4`f;lI$ z4)oO)fCn(gRO*Ed$p)Uf=v?dH( z1(@~mAp^GnW_>(rVA8Wb{)2%@kNRkv8|hIWJtF~_>G9`nGI*Zz zM}4&4&uasWyxTkD{5~J*qxW?~Pdw_Q{;n&7h(~?&{?WmsK6+;iOg!qNepd{Gm_B5U zz0=^SU)0Cgbp|FL^)dEo2aoy~+vVU#SPOdvIyD^ znjuVh&hcNFyPV3b9m1>(;qog-I>I^D5jPvIU1W-IHwj;@{_S6F3o&uR;pK6x zi9@pDN3p?f46#JG1t8I)a8YqJd$CYR&R_??PPTuy-QYrTL$(Vi)et5WFJQ57Vgo{d`jES zr8~CEqW7JbH7#C}*6w`n*uLQ@omzuQ^Np}^<9s{cd7GbcMK)iH?~t6td2)PD1N+c5 zqwi4hVqC>@HM6sO<0?_aD3hDXbJFp-oCKTiR3z{lFM=NTiK=lfJ1u9aWluZz=S#E2 zCsdq!+eM6A!UJ)l?&3VO`%&R)i6?`u)&c0`w598eYNwq46 zyHmSyet$R4@8eEI9qv-p@4+`-_KadL8@+0AI?mD0RH;FXu{eX?!o1)eypzmN;|bs~ z+1PgE>v~Tb_ZawXoyu)L`%V_|;*E!~hi&ppS@n5)j2yWCkiy0Vf+N|Y*h0sdl6}ja&Hs)DU2)L`A9aZ$s^D|zyDK(Z~9c@*W;OY+%2fW z_fRUkpXK*qVwIG6tf08p0(n(+b6Tn944xt`^zk{s@0oZ>9Y$OrTy^H=99;-K^X>|H z#VHSUgESNPmPzF(^g{iyZVYy+81+@yhr8Ny{%Rr8+dGQm>&Mby}_)rjYCQ!wND}mK^nG%Dj5Gh_JhGw@FRz?%uDa z8~q;~zDbAcdj~A5vhvuk5-5-9P$B zZDrm^jFcW1Xf_I1sVX)WK2b1)`7wynam6}(@QTK)~-j;VOz z4-YG(cbii;tA|dM+R)lFr8YG5v$8f6)X{mgA=VMLp#tm1rGYl2?^IrZHq@@$5bH79 z&?wpu>M`0;E!q+9nAM{lHJ}|eq8+V3JIbIPtwK9$K|5+iJJM%-{PFS3k$h3TefI&c zGWUlZ^Sl*%Jg+Ku9AhTNraf~#^wpDR^!wgddg(n~UJdUG?s?R!&wU4N>!jDfy1sj* zr*f0c+1*`UeD|oA*!`%N+P&I{-!jZjJ}7vn&a>;^bNaK zs#cE8Xu}(}KdVw~Tj(R!AidfZ>bmPX@f2>woy3O|Rn^z43d-T%g-axMcBwV`?%aD+ z3TN0_kT&mUt;wkmq`23Qw%&;}dNPlw>~Nooqh1dJzt_mv1AK~OJHl46Z2qtY{T}*G z_6g`aPqWOMjNF9}{19hH>^P+Fshcjh6Dfy%PQnt(^qk3o_{cXV&!FAbZ~NP?vuqAB?a?meeH3jTdd9Z`(r8mSSEcI_>#Ejk`^v|4eEEmx?bq)CvD|hSfE~cm>jO|J4r+7fM6dzTs)Q>3(&IwaH z!7sDD;^?9;s@bFHGf*b2xa%8V{%hqez8UkvKFkZd(3gy=*3ACNam11KSnZc*SeF%~ zIr5QXn0rGu$Ww{_f$g@ou}d9cxi?N=-h_UMdCV35H9P!*ia~}}z}4G+@O9mG@|Ad> z!V6cWcAiAqo@xcpr!2ot%kL?}?=`|t=j~_Y7ds7pwcC#U=`oaN3(B&Uyth5!%ppv^ z!277>t^1hR;nBIOo&5yLBlGF`YWi5Wo&#l2UuvXZV}FKzEsg%{6AC2^akh(iLiU&SEw5Q5;oAN6XhM-!pBX3U#E1Wg_hl?WD3Bbpd_GS1CK%VGsHS zZ`A4WoK^w;!$jpU~VJ-wY3b*1O{l3WwT{g4z8nSvggZd@wi8Z#5I5>Qj z4zCeimg$Rgp?z3SKv#kF1j;mnwJ!9W#@3d5Xb$VAv_Mh_y+JpHMdT9 zaNkD!@V@y0{9A#C{1SMCALVxV%>dm@@U%{N+=3AC!~5o6;2-Ud z1-KE9IN|YC1c)ErOCG|%8a(93d=kgszsBS8qn?-#al+#-5FmbdFL?(4gdg{1h2Q^x zpZx0az`cG4{>{@~{~vLDeihtTfBl~zEaj8v|D>UNJszy+#J&D8M3*|jK%wKWv#)+J zc*T+kBTsDoX!!_ZhUW6CLLNM~JcJ*}0?vkCpnY}9LAM4%J9^c^O+z>=4BGL|C}HcM z4Ca5XA5d`+cvm0H9P8gwgP-cos*lEh(6b&`2ROXXPQ6(NJj>)t2{6cyhv2~w{0BZf za{~&4^%*lM-e)ywQ&w8nEy3ZiIZ$hj*=^ z=f3G{u}_F^bYhz@Fm5;_Mxcw>aT0^)+F*bt>tZ5V>_43Lfem?CqJ(zKRnya_aKLlZ+8T0iQd#8p`|E#ZSS ze$b|D-6_W0>!#Gl4!l%P8GV|=0 zcRc^hJ5Gbe%Mgf z?0EtMVJB_6UR$vnYleI94aN!BPUfjN_kLua&iOUy>$rdL(QI-#)(~yQH^T-3dh8j* z3s?Ry+dlKk_q5MG{M!7+tKolqq5f6Be;Ik@JF!l>g|-DS9@gCZ%wEIZMR!2Z;*q>HF2CN%tYan0hawqfx|B5l_ zo9ha!Ik0ZP_a;$Bu=8Nu0J|;9XY3@t6FJwv_ha@ikFfl7S&-Ja;Q>pbffg!9V{NlsWk0oxlIWy3sTj_jIvuNt-U;`9}LR^sCoLDEr#N9Vd@r zZI|G;HVcpA{cY19%jT7 z&x50Lv7hUyy24El@x6LI_|@y#Lh&%+cHrxC>Tp}3*g|*}^Gw^`s0SO)Ed6e2mA^TY z%J(&;c6}ClxgG1@{n)qhRKp;?#Y#EYemjvb>Sz?YD<;6f zhkXIMvohWlPf~WBcdT=nN3Qdo{Nr746~A!xXyb0LC_?_!ZltN(4$2gARqjOkuzx>9 zdr>p=$TC~>hbYTK6|En+JF!B?&r^pLD+=F&E%}R}*{=>QxJ}K54jyE=G*;%r24s zF17vr&TF1|&cEk-zUTkjW?6h^Hb`4I9c@ccP zhlG#Hn0F0(Ys>gPN&l~rjzjTnx30R+&&LbG$y<_t+r!V!qaL?@X>Vfdj-848XNOb| zx%}RTgvVy^xVa1u+fMNRoLTm3@JLnQaq}2F9(p9igE1_jGUYi;dR>w9I#vGk`C8Sr z<;A6#$M&1U#61WOH=h{?Bi?+pEV_ilHujFTo_eT5WzvdUyj|7n)~|l$GdB%P{DtLh zPo!T@Gqqd6F|6y)!*l)b@Lvy@T342N;`P1#@eY0O^5C}%%NI+iz58w4Bz)ZMSP_@q zjalMHDGl{4@ha)FcI=tG)3)_R>Kmk)B+oUoKVie0bKGm4f9aRm+=Hh#C~bYOcf~j- z|M)!1_cE_-o&M?UHpW)V_hOvg#u&SeF?JhcEWFU8+Zen18Mm3cp6h4K?q|$q?mEHT z^^<6Zq?n=OjFM+h&6~Rc$3vpe};Dp6#92!kxMG)A%=%c0Fk~2zRCbM)1GJu&>s! zyeR4Gv+OaSD%YZAOb}%M+*>zU?{Rrm7ScI5Fm@5eti^z%U404?kH9EQW*U#|P<7Uv zDIT(+c3u2>@#YY(B3?8 z;o*rV`RGn}V%oN+L^@o;vm=Rd&TNm+Q}JPzJg>=AfcYnaVE z&Nvub@Njmli9P(e{AwNH;0cOS|CuB{ z!ovy(j9|&=4J*W%nqznk;Y#p`7a;s(7vIIT0jzJ%5^o|FXB<4|cJI*t9Pxit2N>@- zNJq-mBB%OhH^rJK&cNRZf^B@ej&mMlF4`WHS><2t-x?JHh7nxmJjq21m-kyIe?j=~ zR=97ka1T_tp__P;C`$k{7{AaZz|j;D%`&e+?&A{efV0mqHN3ODY#*(a@Y#S zDqq8u4Ro9eeIN25BAk=pi-5N=9=qfW%#qvHZw?h+1z(G?65+&*(O(rri!xAFBabfe zYj@f{Kqtyq3B2rxO_6vRs@K*3&F}!6eS5_IINjd)zeEiOc8{w04QH<}@h3#CIR1q9 zlM;OKQ(gS3h7!!GRV7}9x|YL7`Zt|j{F2b#2_GUzH?}Y0Pg>4@0`Xm5CUlhe856on z{F@2Dcl?_PLkyQLk7@d~wcm34`a4%fm>YBEw#;q1GJWNHu1t-4XTjWbb2??s+3+?d z#L28XCD#C#a0=^3=5ov1c*^ROhWgB7i?(e)WY#*mEr5OV0oHedTYyG_XTseA zv3H3UT|FaXaxrvbp-Zc8#;!Sk*5;BW1Hy&kCfm-GcFQN!bLa< zUu1v2L0KiC-A-JUf~M|(!w+=ZM; zTs{gt{JghE`OR0K%;ft|n)Z8;31WXZKX6Lx=LCG5MC&j(y&@gTAOqf`U1M#mh0#~+%@hSrQ?_P=m6=*>>BxE;QDK14HUMmY7IWvN4hCf zh2KHN6%6E?lailgJsrkHzUkQRpZnpvzsGu!aHYw&HV(3flDDp+Z8f!ZQGcux&;f6@ zzD&8qzn#s$mpZ@o2ig2z(H4L7%j}XT=WG)md{-N^!6wpQqV)Bx;OF1ZHxd33_|^#D zo)#ndnr5w4SSQrjc0ir7R!GtoYH15~w1pIHp`NzTKwD^}Ei|buaIRziJMU;r*?FaB z-RAl4T)VcnF~$EKzqvsFj6iRIdh-%FAIuCI^4$Cp*{j~LaedFqO%U#yGTDV*ZxwT+ zHGR&kIsaeZQ~rNRvrlHu(|&-Zmtws2h<5rd9?^TE!!V-RwI>i7#gkdgMt%juNDH@DxWhcFP%ta}R~TRQXiX5ly~6#)3ilHg z?*Crlex<@aTJHATUU5LXd$TLTuPk%>L{X0^9}&hGJpwOL!ND!8n|iv}MQPd~hCR#H zd&}C@rNd#X*R9^XqTEaBZP)RI56e;F{^`3_-J4e2*}ZmkCFSc=^r7%fke*e7JKhDD zHoDtdUA=xq&#LZq>sGEsY!P|uFW)j49H2F3qKiB{I#Ya#s|FVWK;G_l(s^ca)EIG-x*-+8+t`*+Jq zG`i9a_c!U2j&|32-`Pd$yFEd#twck6T_qaYqus`X{^K!LSltew@9izo*50t&8@+{@ z2gSl6bsf^y?>Pf)-O>WpEpt}1b&7;bwDnt|Yo=S;?a$b|is>BJ2kvK&V6}Om;nEO%CuQKujT9&@vmpT9`Aem?F{>ERc=yhR&K|oNzo7=*iZc4 z0A{_3?OX{QVDEgV4=W97gVlbxh23NI&&H9#kBLW~-(fO+*P4zN?tQ9z#neET)d()M zm-Kdu&gm$^M;AXkcO*RvdAgd}pS1LI^Umq;66=l5*v0E;Tzw5y$-Y%)R*}3Y?>osW z_!#hEkHN}SXRla1ItpENPr$+0bcI{DZ4SC6yuWsvMDztpSE7tyPuo=XUSa5x^U-L%i5{fYYB53;rzftF`4kMDF&G7e2&W6zKjk=fn{ zE&qZq*Dt(VGvK++oJtqS-;ht&JKXZWfDR7sGSYoa#5>BFrkM6FsYeg^{(i?+8}?Xp z9rrP@_Tw=;G45ol;T!e{wO*?J4Ei0Xu#a)~B}35b?12hK05?0RGGPxzc*uW#3VfLP z^d`+j#IAh==U*GK*G259h`nC+-TT4kmwp`ruYoiY`D^@jq1IOg%C4WXvSmzpK|?2? zp>;P?EoE-cyQ<9J2m;w>Xy4wwV#6Iyu^P-1DO(Q|pUJg}`)HV$5c7<9YO;zrMOa6i zy6Y&e?6@Rc?$@IdlH!FIWkM!v|V3YrclH<&nk`WyxGml5~pQFn* zV-M*k>@FTns4U(v?tpy4R*Lr_>`{0}aqm-vz&LnoaYy2La<6icc)NIaRm6J+ciTAe zc9zGpvV{ZV#Jd|m2OI0;4g59nh>ty)M`1NQj4V<7s`lVi**N214B_GISSRE5l2`;! za2&k9#IF1*Ele!V-*{_>qZMn1nZy%3X9Pn=@FAC-iCu;5xO4G#@$`zz*$0zw;m)^hpJ##I&e^&Iq9j{9CevO$F?7ts`zFHFS$~)n=HbKWH;G;I{e6P;5 zLyxt=d(G^EUx$2E9r9J>=i}Q=8h-0S=(t5XBfp3N3ZA$T?UuXiBINN#PwUKRTLE67 z_}>H2H3tGYDSO_xYEkQurK4&Jfj{5ZN$yVZ^Y^1ygR@YaPkQO{=itqM!+WN+3;r|k z;NKoEUWE*R)p1{CGRRukZ`{3{q@UY6-G>wS5x-6{agu#YPXgXPyKYEA+gh6T^27Lj z!F#3*&c}hX2RQc~g|_Fo-hD^4)~LzvP077BfA0ysdwKi*drrzNetKN|RGsHix%j+Z zudUMm*Q8ZjkyboN%ao^OPFBJU`1r@nD%5pD-xYg16i;zj+vzOYVcoTA+rd88Q~OTW0jria`7&?# z;G_S@TW7O=sQf9N0_V*vpP6Z z-W=joq+4BQA^U&9xM+1*Iy)ipwfu>u(O4;eJ(^FibAD6qmuuT2*y$j32OPvg9hp`>ctuD2vT61KAh-f-s2$5^4U+KL z!DrIz7Ak3T8L^z_XzI4~=u49=&4Ozq&BV2nk7HLGkSWl_U7WpiRcAjQ;o-ho;^At| z8$y!S6trIl(Ob*_^nf30vXpE8qhTP7RfNeZ)#v}^x(ava@EtH?MqF2Hs8O<(#-!GuMO zBY|Hk@S7;VIn$++6xpcFRfffAm3jf$oDr$rehcR6n>)dbPgZ~ z9cF30i6%kW)ogpk6OT6W`B%(eLo1}V{!5j;lRIDU%f_~(P^LvW!z(oDVO!n_x4%u8 zhi)PE>dDs>(*-ZK_M;O`0l4v@DdseGrIA8)ktwd>toP)OroP41&*m<;@iY0tGU++1 zS6Nbb%lc+~Jvrwh_=CUj_Ox^%vs$q9Y)8)g_Otoak&c=77!O`zq6I#3{+7B+|#BmE+aiUv>-~Y=2{Az{yjMgQM^kgWT_an^w)>A$W}FPjk8w27d+5_+s49 zvEWj(Glv^}1(I9G9p6a?smo@yC1{|3)gFAXM%cbHR@;ZE_4a==O;j@uLsan|Xzp=~_C&w4npx@h{_M&!9^%9KTw5v~78^ ziF00Rn6nnqHXVodP9bNWDk@E-7vtQ-5bgN5Uk0t%=e2V{p&K0(MdY^_10-^*-qA+wRM%O$B-4PA%3>+mN5X-KVQ&kGP82#I*Z@Isb+cl_-iJA#OJ#Q=N(p2cJU2U;!0-^ z>%0VMBy$g2_>CJTS7|J)QTnV6q*pLzawvqG4NM8+jcQ*Je9k}_j8mj=ZYff zh2Plo0f)>n;vMY#WV|gmb?&Ub*15BC&(CFDXX`)L`T+C9{Z;0sN8)XL3zjES7gu?G zcX3zUH_=~X?EYHnz!b)%HKytS6nM)FQT` z7nY;o&AylONwkTt%%E#97P>tXH#SNp&B9_F3(hrU>{^lWZ5v}4>%~Q^7niVJ>|m_y zWWBhI_2SL_jA8wZVXPNd^)rU`GlnrYZf0*Q8=04nGd9)*b6q_$V5h;=%-%5y|HG>* zRGYSz6l3!=UtUgQRoIT$ucBX^67GdbUamO9%l5syT79oRQilye`$(WaCGNg03Z7qY zg9T*LC==?sRo@mEJL25wDE%m#HP?0i=uZxPbYk3e#t*)w@Lfb0C*PPYJmPT%^G^=- zorkWWA6}b8Pi1QG$6j{l6fXx(4U~B@{iN}Pd#54Z`>H>aJ3`z)Kra#B4gyE@vVpx* z;@5PsuWjo_e(cwhww;qz?%F>iPC|W1ZrYNibr@^vDbF%Jti={C24PJXW*aY zypHX!fxAvRJzcv~{&em$n8TY@&*VMDo^uytSM5g^mBy`>RLu0vSk^@SKAZn$^=Gs{ zDIN!9+>q))|Ch?6tF{A}OL9HmN%nU$$7!#XJkmbL)s6W^Ffi;spk0t`T)&=uy)g_8 z6go=`#jc5heZF8(a>oXQhfw2Ix82G^FN@*5z(p)Qml96ecr`NA_wtFlUN)w!D=_U{t0Xg-HvxroAHGD%=Gd z;{UmLZ8)7B>stk@UKSqh-6%{vm=E$q(>;M(xH#ir6!3_|)0)pa>>}}Y@$QP)vA%T~ zf3>pk#Ccr0m3w^0K&ydpXB@mCJe(ctTUk?jf+KiZTRM2(#2&#&%ajVgNCBgaIf;+UMKmXJiR+A!iyE|PY3ar z5TEk)9w-ZUjGG=)ntg(arEJPM^JEi*jF}9=6HI4j+4&RB=GC_c8d)q`(6CLajnM$^ z*c%x(eXM)KijsGjj`jB^$lzOU&se#UIT2yf+u$m0Lb!8vs8420pg)nmjtu6Qul&hz ztl;JrWN60h5c`n>?Cd5oS9{#PzBh8U$Cz?-1yLqGN*ywexHCv56R~$j?6f5(w`mFt zH?BW!X83V-+Pjmzlq_gy|4C`TSwoCF%jD7K-2Sn6@u9w&Wu^UN$z-~HXw6YhFO7Gc zE*+#>l_}|^5l_+SsHu9cWUr2ubjwsPETvVwq?A_mW2N{kZ9@GsvF)Y!F>vtp$uOin zQ?h&YOcMb|IfwKJ3<#!b>bf65gicc5q^ol%~a@2)l1mIIRv|d=OVaw z=zosr0tZ(_N+lhjx^;9zjCm$zTnFiKHZ!?rW6zu`!yc0=>2gY^#y#&i=ZdE0v+pz2 zeqFdegN(-f6l>B4S$jh<9ySI3uonesV&N~_Cz!t&Ib4iop7Lsj-&FXo?dO~SHuBfS zH)kfB?~Hu6I3@E}-lXAp;Yj;2uXgx?!uQ%QGCvske(}Q0RP+4E-xn{*{15Nq;kv?e z?Md^@$bT=sE%SHYJBHt0c((m%?=8b`E&Of!ZZ?R|I3>-JiG8u?Z0XM=g3crjhUCc`r&sLe%StQ^YX|)7T=Y* z)cnK9i^b`g7rbf1slxI0A+Kw=yKtbr$9!Sr^Tk^-x0)}G{6X=y%!A&_;oian?Q6}W zBY#-DJ@d!j`r&njKWhJy_mSZ>g-6;~n}3(Z_)6zg&pnJnNN>=s<=3Fz4^~0zhC^V%zyGeFubI2cl$y!F!G7w zdo#c1y?^+9g->z}_3Ghk3jOWvrZ`e4W-@QYdVlO1Tb+Y7wtw=?c9j)&L-Cx9!v9`t z>N$)H8i%4|zs6T*+!)-5hqGgyaD=~F9?iA#*8|-l**FW&jhk!BhR~8@Sr9K6)2oO# z?wDR7uTb^-#5;>Iz3L0Z`zVhyZmiYY;f6K#Dt`xgG&Z`tj5DTBc!2Ord7N?ZoZG!a z|9^uqU3H|n2UDd&c6DZb81u(l>$$a=^ineB+X0>tU+O~EsZ3hW8w7ED1;-z`?`xsQsK^)-2LA`uV25F*{jz#K^c2CpMkqT9Neq6 zKL5(I+rDKQxBlu+lH8Z0IBGvuetc5j@$AN06W$J7lx^}2rQrk^^6xBlz&F`l6A zYP8ot-PfhbC-t9nZHhWg6la*;kIrO|7oGGrAGBxn*Rbw}FU;mxF?E{nZIv7bIMvaH z{r!5rrwu1*!?kL|V;Bo7H2Ro#Zkm@`y>{)&+q&1LHd#^P6`NLnd}YHsKi)foaq8dW zw0w!l;iEW~HD3|K-aa@smej)B*1P#^f!qnx+x`QtTm7FSIZ-K z`qshQf;|fFFwRr>Ipbh##>3gM)(|hmFCK&mzr8#Wc-2qf*0;_$7`yRscC2se(p zUkLHj_ktJDJTcK*@8EI9!FU=E#hdE~#NN+)s&BXd3e)pK@D?0QY$bowt=0c?@qSdk z78kGQZ0NSwKH~kN0-l_L8=>3c)U9_mw<*?P2_;`yk<4d`b&@;C^34 z_y;Q7s%LA0_!|S~GAcm%`A>n{!F#}Wd#4Cj{vNLg|89l*#R~V&%H5vwV2z)?H@(8$ zR^h&(!o4nV`})5uF&j$6Rt(Wx=B#@?+;Cccg1;2Ef(w2op0`g|k3XYDudaocZ>4pa z=%U_b6GH$c5;bH!-^S_F?pxNbTye)bUGN+6A9Fiz<;}sBaihtfQ34knEZ`NDH}#gG z5d~E$IXla(2<9;Al3uY$d%#U z$mS;z`)eh;_G%rUS#wFqx2Ii&{Pqnc9=jW`6 zD_NmkiApo;eOBkJ-bC48NEy>$W}1cq15R%BMOmG}XKnK{L zZNRs{U6sga)^J~&!Cqs(>-XhdB!6;!!K8q%FoV7{BflkwtX~qpWEcnCR}P}Q0>=4aWeG~@3QrPJ(-U;h4nD_C3Id<{=$0@nNFLAs|Vz=W)}?2p`sop zmg+(AgEi#w+{3nQgm+%6Jc|pFP3ondidMEsvZH2aH}byizARYbLFvx0cdh9zw3^(M z(;HahNMCk6_d3HbsQzNH8+qWX{5zlVGuT!4p}v41{bQ_Q8jJO&M(Gw_wCQqjHTrj1 zf6Pzeri_c#-~v3YcZAE}3&8eBSN9OMQ`X%k8Q>$GUg+)fWyom@_|r~;@{g81aBN$k zO(b)ZKRBi>&;~}4nX0R!!_TLj`z}Lw$7C~$?~?e}v{1n4&oDddd9F1v>ciH9WVga~ zKW$y>GVs=YzKOPB+R>9%&NHdJ$vwEk_d`~!j`eFT@|{**ly>A%rnQvm7}@yTC#P>Y zLmD+Mjeiw9WZ$GSV>fjyeHh?d50Aj=#8BC>-c0HYV=$i7GM2FJw0&VS;Z|3h`fR!o z$P1IN*5lURP~h(F{0{Cz>@zW^^DZ|~W$SB0myzD=#^QXFs3WiWl|SIlVRYf`Ko{QE zMvnk9K^U^4=)?Qw=;P{J!Fsj6U${yZ4Ln)9j?qUEl+TIWj_KJJ#zNb6$cyrj8=9$c zFx3XWIv*;2)Xr(PeffGj)-Wc~*7|xrnAJMiwWk2)@!jq8gI~1zX_UIA8)Yv0F58uagQ>(MPe?a@8oX$G0 zem@(A4_D85Qk`*FNFEy0mV)-vlzZ-SwV%`Er=@R`R5a~jf>zvS$Ld1 zF*83ivtZsqxiz7Ws5bWn#+U<^e(>P=)&{z6lH#55opfO8e6-Hs3ioE|vRC>%;TYrO zVRwJrjx+Jy=s;E86(`^0-!DSFEYvw&+M%5j;IY;BQ-+KgO^g}M&?9N)q&E6^CORi- zd<(|ydSra#wjb}Go@G9XF+SIDu0yiRVc%j5OR7xhx3xPLkO$^w(yj--9Xq1)p2k^? zBh-OCCuGM`($E?h>JbsY0&FQ4#_@TWU*Ke@F&F-;{R&lgV_BYM5yk;v_5HCJrjRy8gKzI%gDkbLEpRNO+N z<`vv*wsFg>E9W+oPx+}(!~nP)_qkB9^dCyc(m_))P>t5mosIZkZr%M7_6{53|G9V{ z!WoIDwQCtK%Eil8#LM7jJsTPqPiM-b@b1Q)31gM`W{*|GdkXiSapL{A@_1EUxC=ba zxO9JvM1YY$*+;JXf0(jn3JfiVb zCTm?J-Y(t+CA&f|7~-#3ET>I#^LuI9#Q<1e+TcvAPjevU`62B?fqx)bH>4Y4UZ_i0o+Pg`Bfb% zOz={?qws*`4dLfZ0Hf+6JOaCdF5JhT%0=+hh8?{3V2{9?v>A6Vk24P5Ts)%iPU3d? zO$A}XZz=XDykodG@Hpe(sZB=VDgO@Mr9qhBiRY_+$O=qmvf6>-Ipg4M!=o}@1inkF zY8UZ@Uy~2O!kg~f?Z3i!s_rY_`Om5>Eu)I|leH@|}f4lrhGo1EA6W9SsFo7$$$*QFwAk(zA|exhZf0 zpG^*6cJQ&>p&{JOIo1!iZR9QjZq-X@a4V0Y!7bPtFJ%hAcWGGKU7~yh!tL4A1hgK(X{pg!DPy!Jc>_2I1!!fmI)eP`gVB|i1zeL8Rp9`)mC-mxY~-{r@B zf4Cz2yA|%IE8NcoZsjip{C^7E8*pE0e9{(uEoG~Nxn|5lqAc7*$>IvCHbT&jzhD}7 zRaEZjRvO`1j$nyUS_zE@+HEZbk?ne`!p{M&@V4ugkJ|roMC4V8M7T~Vj~aM8$Yl$T zx&F})G^wuTtmU{-oM+iWBuIhnFKx5g#fiU+jOsNH)CdO0WX7H`iL6lqc+rK4Z4I>P zOVqby=3!UAleroWyYv4Y?9P9A#Lk!z%I`5g`0{&v%QzUqoJCi2aOOtfUx~kixe$)N z8&A&!vndj139K6zAN<2TJ<%FXW*{_>&GgP2h2I z7fXSbS2zrB7b?N#XM#x<9$?R8z~=?RyXU@U|C~B}=47r1d9t4GZ3Txh`xS2l4{D5z zc&Xu7Wzbejb172qEtX5AixbWXXF+s2Q+P;2HDiw&g~?3gk)4)g&6(n9u8;G)Uc5QP zsZ94J3)%mp7OkN_S$ZLGPIwFpeKK4-D_#u`<5(1)SBsl|9~uYmxAAdytP@W1r|(76 zX)JT_R$&)@^lce$JAc!y)&EnNo{yH(>E0vwCH*M&UvXqA=ydN}_!Vu4|L5ZAT~+dz z>Lz<CQnGGQA<^t;ha+Pkii_j3R zJUCkRCFmCAEo@iHB<3pre-qgyen|}bX2MDi1vwemGVhlRF9k3Bbs~5BZUOP zn7P;8S`rdZ0S>g8P@mh!A!A+sKZ)J7xxF+uH*Y)&>FVqm=1gmk;ARCdUT@yGe9qkF zv!6H4yV>IEmvRG?@A*S96I+X}4`c*JHRjJQ812v06sql5pXi(vo7ZXj_e*z?9aFn} z*#d>@4h-bxyXL3Rv7@~}?$X|{!&I}cuw>={`fcv#j_?5subxip1$N0Gj2;Z`j`%Y7 zSWRwVwaCh9-*neIo{+wt*1Op6 z=wttUe^tZ0VF<9}#@zDk=xD1U3^#J>hl>|;E@075lSABNoi7|Tlz*MdpLf!hdtLwj z{J!h7hZNU5o~!#Q`>Sb{bN$SHW+LTV$KBN`@8phoD8ythKVM*<@S9f7<2mkEW4`tt zD$vVpz3w-O!o?=Gfjd9gQ!C{6p3LB`VUHW38T8PwKPa7DDo6IOeLZkb{tQ`=*fi~V zujw+?b5h8$-{tM$`=$uqe!HRl^xqR{Hv#_h{>6A3(1X#_WP^0?0o6n~dCIL!Hr|H1y!k49f5 zyyL(s!lxWGvp>zZ_p;x-GB$7Nn*RO3iTACZnVmVwOw5_ZN#x9{ZCQP7^kC-mqmS-b zWhNq56wgng9e-_fAMkBi_nn9Q#I-k~*K714;_D8-g7C;c58gi~&VK4+-|4jKRClN& z_us%io6-Iqdu_26>bvkOpY~9@@Y@7?jr-{rl$U4`!Q*Z3f!jtK6b-bEc8GlaS=|E{ zwC%@f+l|t_Lt9=#`)z8?jGm^Sn%&*de#l1zd(P5D-DdRyjc`ZI#n)(`cA@0#bH1F_ zAozHknUEf$0nu)JUjytoWmrR8(QkF!gOUWk-J{iBA9c6P(u2oK^q_PMa<7c`ZR2Um zr^SOdEVAFt-YGbiXhY6t&=yLx;k~wO;_QElHe4bdRqTN_TH26&^^+fH#c}ocuupkH z<&m2)CA*WcLFw#yh0R{!1ulIJwm<3IjbwU48HqQ7){E{pYDKtlWzPyJi7(q%)CORA zKz6NE|7bfYx`!3aR%0ilu^U>EIc3~^xX5&PE_SOfGPEBaH~)omI({;a2ALMvX+74Q zDc;%Al#KzrXu6_{oN;sTd+~_kw-)yX7m2rv_u-0o&*5$xC*J1rc%nV4j*k;>J$?>0 zRt71bw5si2J~Y{Ksq z8{+@DczQ=@<4KJqGl-wQ7ac0xg=+^4xV$ncj$kPXk!OgggO*R$>3HS zJwNc#JsYmgS}(%Y9zug#c?u0~)kkP>kH>>{w6%Y3vn0PS9-;8b_yDSo<5qgV>$^i* zdqahLyYKeIvlTx3D#E`~;XYL1ex}0xeBc&-Q!J}8pt&L5BV%4L&_xH#z$-dbo^dz~ z0_^>JA;o^VW6b#%@Qw8^8!`hBfhO$LjLw_aZ`=~))&((qHPAsWE+4BICIU6c`zo5R zrTb~x0}*-i4!TOai-1>Mjb&?{|{McY~QX$WMVBqMgJa7b&C7qhKJpWfuYH$^e;K&>Z!S*e?>~~UGJQH5{D~K{-0yHRG*-;%Voo1t{dB_D z2?_4unaF~8XVu@%7AXr$A5o5y7wan&Q_xQh{oTJtZtM?OOMMdgts$SEMqW)$en&3% zWf}>ye!l$Qk)Y0+a;L2fX`66@9`w)fB4bAVG^&22Z5&{B*Ll0Byf~^c3kmRG_6ESYXaOK>j-?Q|9sEH!q#Pa8_TOa-D%L z-N}b%<-d6yWqM;)l&>LB+DYgS-=88}}#6qGk`NyF*c>tfCM$ob|h;AH*28z;blLv6C%f2=6S3J>d zojehE-Z1VYk24P5Z{gwWSSK@=*zW~TxHx!sVvoXm2KRXIJ{o+(OJ?#h{)CU<#d#dO zd$330oxpiBe$F_Y_Tb^{SSP>4UoDT|Y5sHYzJWaguX-Ww@$mbz;2T~tlV9V{;itEQ z_Z;>pyk)q@gZFpAH@sv}=3Rp4XjH-dIgj8q@nEXg@;BXD{Xd2Acva;zboKA!A5B;B zWJCi)20Byy1-^x>3XO}WcZ7x(dX|P3Owo|aZ-S?ShMqKt-_LlQaqyhmy+i+h0~*@( z1)CO`74o6M?dTuthg;Rp5&^6U!tl@;!5E8I6$ zxIYrOlfYMgiV?T+qke$#ZYEs$IcS~y1?fK-xb?koRlAgt`^}=EePS-$jjkAc1DbSP z6^s$SLy6@*R^?&zuIdWtXCSJ>t@iRU`tqm}MjPZ`k3BBI?m(A=m}~RiLDpT}uZo=O z9H7*k|Dz>3+sl;bY@LyG^tXyQT(F-6hSL%B1doPCq$1ir%%DzP)0`=;+c#6A#U%1?vvzX2RMFrq0GA4)79o z@4&a$w!DjP(U-10hs+a}H|XgbzJ2ccLdfeMY@~-ke|7cMSw8>fHgns1yUcVCIy^ZmTaS3H`Sy%{V|=asPDn7jx$=n&tTDlw%BC zawo}Kec?Rrs(v4x`BoDvzKe4W?L6>IcTOYU>?_agHxt_Lj~$s0oX(!aJiY~9?X14k z;$+_pyJwLK>Z7)`OA~nYG5>7_l=l3t_dL>O-tvX{#@yaIs&X@?d(DZTcbU__*&V<1 z|Kwk({$l=Nt4}CH9VT{s2)dd(22}1l7?D)xeTyeaiyR91;0q#ieYpzOm z4lG-c`$R)J_j^}oa}N@ZuJ_!-mnAzN+`Az62kCU~;Y+i*mkE1uUJ|*3#?F^(7vx@9 zl*^{`MHI87V(`^I9TSL4w@z$*J<8363mBMLWGWQ_g%-EG|`#8C$}!XI=l7##cN6Ef8(24z-)idM<;B^nYJo>STWf(w zdVc;X&t;VV;(5udT7akeCf}_sz^T%$vhhAM=|vyrx&cqxREaS-xLnecXn|8RQ-nir@{-| z*}&LP^i2KyHT&Pw8ROXfnk`@Jtp48CJm(s71GKxIxygJz?Rwxs%IDJL(&?!ym)4^z zsRx_~z_ph!+K$3==F%kn{qZ8>6lH1iKz}}&n^L8ItZ}Qx&&Oydd5Du2<-?w{;|${i zT36$))7iI9_~LS>!H@ALzO&63zS+Euao6r;G4|50GxYU^j01}pAC@pSbkMgu`x$Th z8E@Io>FQ@(?`JIUXZ&V;yg_pT!wYnd7w3T<6M5$TY!hNW3}s} zCM=38p0vVbX9lzIg0;#-txsxsoN+Lg;o2bnyB@#(soAiWGdEM6MOLcPd3E=bMf?!thXkoa1Zlnt>yMqpdBmMTa%CD z_bwi196aZC@6i7ot+(91!ZRQpDObC=RQ-ge+TSyXx}h{nhH%lw@9=%j)1JWutxqg* z+@pK3!(LUD_d8eKQeWx7{ZruC>z!wMMk|pdDDd zB2(tp&RC-Ql|6Q%clD;86+PYX`F--;@xs${#;4t{NM8w6FLO4ud(BUjaL5avW~K(b z@MA5=!-zJAuB~I-ZG;Z3DNaW=@(au*(0b6MiQV1sr62im7J9h0RdGk4o47w3TDM+2 z^#19{R&)jQJ@T9_DNFxl3)E;|{)5>ZcLdKSo%R9KSokq?yJ1eiFY|z@6J3fv36tg? zB+lp>&c$o2KZ$%o6ZF2|ik7Sc7U$NX@ei3=?41A4NDiZ>h`n$5jm+7`Lx!SO>j5j@ zxova+7@4{Y(UI`0s^kvNqANehNHi81337eDUJA}8$8X@fe%v1HuQw^G@ zoZJERlAu1eP>;H^QL?a-nb2BdmEgkX)&RAr_+fOgT=t{nc5qgilHZ2nR?6ffCuUK$ z$-=`tJ4!N5woLXTTQZe)F!ZD3efL8rOf~UKzD54gSE_XZJm^Q6gRN`>cv?9UaIFE? zGTn&adQxo#XrV_~`&?&Yy5sC(&U~}3J4Shqk*{^_U+uj$MSW1dcE5-6mEI29 z#(f)%&L7u z(_|$-a|L%*lDDBicjn&yo7rQ!_mt$X(#TJl{EDL;ZhwHbnanTz+id>(Cp+?^Pls)t zy`@Bcx%X`TuBVfQI`lr=tiE}wBcI{hdr#W7Ztrh|CX;MdAqN~_~>pm8}4xZ}B;(;y%yH~+Jh466wjPM#?4(ascYVT@0XWQO`x;x(Y?z!5pi|hU| z+EG1qSfhJL3)PHSMfw8e#GQE=>av#hR+oF8d&v%f1Nt!9zsdbv56sja6Bn)7J-jxH zukv{b`CuO`f9=r@_mZDdpFKO>9khLTB30_M;EYZf zU+x`!4q52eI>KVS>v?;EOMA+YMq}qdY(eLaKVNXqG&2czUFQz=rar}f)Taj)+|zC* z-P3I*6E^i*w*>d39n(x)cVgmh*g@IhH+kve%&Z;V@-Iv!d`e%2 zerDKPoiY4odv_+d2QW(Y4K5ac+7@GRN@KArU)vUS51!haKc3WDeI#m!{<#6GF9;lZ zl@D}!ZP7V|404L9cl^5OFVe+ApQPUwj(6nu(Z890@~{0eTTq{T?NkTjH1di6z*>;L z_yiAnf&|a@?S1Oo|6tdIwhzKbL56UT+O2J`uT%amFJV8s*UI<#{fu^Vmi?^PwU?lu zb%L86+nFa5`7YWEeJpoTWGtco*?y-nOYKN~QSIm)^uKWa8KIx}bEVZU%^akD=4qbf zUE|K1Xr8wu#S1d$P1@@ z+2K}$UhMw?{ji*Qa=wY}`jv?n?qZBZemA%Ef@klW@1LvD{397t*6_8I&r#Adl+iu6*yh-qqdfey4lw9pj{=-HF!$r6^|! z>5M3^+}OQoq#R%fU{$L+Yovyv zDHrbv{G4$xHsRsySl{+4e-0iqm<^NrGdvM^v6HyRgSRvIhL_CS^;gRy{8&+j@V<^c z0&jxyTi|iV;q<3?I6Kz23zoyr?K{iOT0aW!yhhxD>5PNHNLU819=F5q{2&Z?o_H1! z{LVXu`!OD80(gp22Cogb@KJun>rp(xYvdh)H}P)VPw_b8;HjMkb_Km%ZOY*%Sp^60 zTI>;c@nyK5;c>>nTZl&#UKj3q9^t3^ITR-RHu8?ZlZ@~g2qjUuW zW8+Qt?ey|^XsMvZn7etoE7}KDdf?6dYpKIYdg0e_7-4Obzo2Ns1pd+1dsZZ z8-uVWdx19(i!*{Vo(cWW5x*{wY4Dx`>1a6$IXC87JaB7V2@P)LAvCzvuS0`d{W3JT z)vrQ>TV)y=+-ldM!R_viv3|G%UZ5WZx7tN$aBHrp3p`>Jl-!{q+=W>`+)%KgUXDlM zFDk!I9%DOh<@fzIGGiug<#)O7_A3#4ci>jI^8fL`UBIpUe>QLnzViRaf%`Gs%Kvu* z_fxo)e~n8r&)`=6e`#I(snO6zT-%Ziw%TA=W>58^9O?83{q?Pj&p7U6t)n`&rJpS1 zN9UX#08(DdG1tjKJu(l3ak7y(DVn#7(;SI25Q!6oznLM)#orT&LmzRtiMF}a#o^n~ z-WjoPU>b38_D1XnBXOWj{5ZXLY`Aq(DA`iF+wV;L@j35lPN%Fn8~%9J5nD#&9@9W? zWQ}6=`<@UVwH4i>;?;M284L@NC_u1Eq4=mmx?*zO{xjT94c^Y||coxCiNLXFmKA$|ndepAr z(mj?3Wo3%FXij=%YYNEHD7|!7Oax^RW=;{7NDsvf;W|fG8GelL&LF%~;e|_(smQYr zP+;A;UwRJE*FB^9Gx;60(zE+euE%@U!iRUk`gyPT-uh4PMZy+E!kP$M5(!%ph9N`0`&S{aJE8gzAJpPO z9f~Iw4F+uKWMr+UJxyRbbpW#`qAW8O}@M9_G#3xn$&m|=MjE#3tvV9XC@3{>vt~R4qn8|T0{SHM2m&+LB`E9)(^L65#fok_n8Ry zkiJnSFz@nTj#hZx`&L>j;$L6k?yYcttjz5X=Aob{PS^Y+^JYL7z$nl;RbG)hyRDkk zTUKwry?cX`&b*}?4Gimh)@(wbQR#AT8_`$I;3C>vv4u_>#p33l4yxAKAAlTl_D3Ue zhG~+{|479Dc;wp?C4W`1gXuLy{1-+1Z!XDwN{^(I0rmEjb zFkrB$9n6WZw_iNB`HHz`KOa^<4)Ue_Vq`so`EVKY-cZ1&d=#GM1KJa?^Wg!rPiMS2 zr*axz;?W{|$k>0xS$7ZKg74a$K1*9YMFKXiQ|$I z_d@6%4xLe|7q7K%RrMCiu|YiHz7KO&h`o&#MmpxumCQEkJOBKF^`#9f! z2U*ad47Be;xixE_n|-WAWBYq;k{l#oygs|g2{h_&7ykzP{-?OhZ z`c>fTo4C>?PgU4EkcIT&07Ks^{lRb9JbHuZEC|y9x8ef!KDZ~NkNcC;=#9wrEb9O! zcTT?J3DG^Yh30;hx4(y!qJHX`&l{*4-D%OJx-l~U9#`x69aI{VqWsU2?+Ra!lDMBz z)V%@$^jTM2+0uM&D1eK|wFV$J7xg6egqjO6fMq0V$w()2-G2Q<$DYIo(mMHFeUDV*eFKrh@LMR(THE5dY7` z(>p?UOgKR@L->gw;L0X}UGurC3#=2j6HjIDjDzRg?j8D{Bf2Bt(|G$p+O;*C7RXh) zRki_-!Nfttm9>knJcWkuHP6lTJ-j-25~{=bE`kaHqc&qr;QmO3J6GY}UE%&>h1;L^ z@C@Mn*NX6$D%}56;r{1xw-=O;gXh6_@r{LFn#4s5X+ke)SSueCf`vjUlA~rS4~7R3 zEh*#_O@$}U?Fp9E>(=+Kbf2$g*jXXXl0NO^y#2#9Wii*S{FompJW?YchBx20{L7Me zIYGy%`RK_TKN5-8D4}uL!l1-31?QMyGe9GBzywl3kkRPP({M+zBP2ogh4uf>v3&_ zRh2|8uYzO*U7@W zJ^j|>y6d`X)sPoEueHl~!fSS6>6hU34C`(!$yB9>s!YD~Z!N9a+U@=IyaQEl-hR>O zYsFT@H4~Q3eBXkl^M>D?UydxvOwNw$J>%-B`Q_J1-X}GaIPB&7a(Mf_W#IEF-Az?A z&0GJ)Pv5>tf9t0Qw4A5i=7vMYm2X6z`i--o^R2eY<^vm-lCzY zCfzv+*&}3VBpZ`66Psrj{^>?=Zj>yb%JHU`67y`?UNSl=`m@s{=85)&M^&@+MQ_&Z zduSK?N5vmfdr71}j&4lw7S7Q+BE5ybCcTEr^a2@^htj00H1i+wX0;-#kiYLC(mTD1 z^fue{?mA<7|CjkgcC&~4-Dj>MT~G2h_ACQDx!sT3cAIeROzq3HwF3Q4YmaU8J<+q< z=zrVjf7|GP{q)U#`d~kOu%ABIPoM3lANJD^`{{@2X)$}A-_qbd-}02!P1HxUU)nwv ztQ}l`d#m~q{Yd>OQAF1&axV#J>uiDVp`k4<*B7|+uOIr}hkcT@OWED*)X{k3fK5X( zFZ9jv(#yeHv}*zS-}x=Hb=5m~)QLx0Tw@YCS0owFy;Dr~>J0LHQy2Y_UHk1HJ+3&k z7rSmOOd&4k*??pAPBK~etg!<6=(?amkgxUE8!j#SF?kzTR;Mg~$ThP*lMXL`J!JX0 zCgbW$bp@^-d9Y)Udy}^AbzByNsa);-=+=FPbdeGA$Knyrmoe6{PHb!)V$H>xw67K& zY13Ha{2ZB~cGjBTM`oy-btLjvtd$xhhYgPQK6}2iGQW{=*^QZR_s2|ckh)$ZTvRXg z#f-|3wW9Ug{W;Q9xx&ZZy#kn5nao$dMZ5i$UxsP}gN%FBcYW~P9>F4hm)=3R+MP=` z7^}UGAij+^KLwMl$T}Q-Bh-^=NsazO=XM6`{IV=gqug^QPC3Q}lY6<)+ZZ$4k(Q)B zYp7>?pHqIqx3jys3sSHNOQeT+zhaiLCKd0XriJ$F@B*i&z%ym@?#p`)%T8N}3lH%I z(2o+sT_Zgyq*2A&>WNc&7LP-w)Ae1xEvSxI&(`=j25H@I*WooTp4Pi+mq8p`E^ZAh zf2X&jpSrf|Sn9f;dhVx=DWh@qb|_uf{;nGxExhsT+xM+r=L;KcUX3VE`2u(I-1o2C z{5$K{-f{cN>$`6+lT;FsbK|cIT)OUd$pBRX{DALy4p`$CQRE`V+}gyai0}xETOUos zEjy#5HD`+Vf3YsEekOpem!mfuBX+Fk-_74JkJgWhqetsN@wX%Sh{bW=%;SuMw-^s+ z$C_BeUpm!XIwnJBkTJqr*N_cKpSoezXWy>>=Afx zru@8i{G4&{oZG!a|8umycW{M_>oe95w=Fam0e7&b@qKWsyhDTg&7lJe?(=yCFsdc9 zpt@22v_^%1neM-68NTJR3U}BqgYedh@M{9MbXo}ir4`{lfm=GDh07fk;r$ivyDQxL z0(X}0mH&q-!X-;&O@QBbD%^ip;eOF~S7m^w^823^;j|au1n@@7-FA=4dimiM{08II zSH!=(%xxE;{t>>B!d*4K9u^#Nwz*z_{q9`B!1vB)qT!Qi$V98A# zD?V@s$6c4OdEy*+b!>o}9R%`*mA9|IbLGO7cdqX7nHdXL>Jkcn-f_%` zp0(>Yg{%&{@1sxs*<>tZ;_Oe^FFREPpG}O zH^9R$%#H|uVnf6}7_rk%LcJl6Mf{IM{FxuZ{UF+AXlG1w{0uJ@v6HUjZB+F#BnADk z3OLSQy)a@gl)kN|T|1Z>-&|S-_#vO8G2-74u{THJWFr2{BD|0%O1uzrxWo&QTw(|x znBiR(O%b`3G{ZuW7X$oIR%J;9=gx?oc`(ci_AoEhg}bX>{Gm%6%m*U=;2HXZXBeL{ z4B`AF66dGJq};f88hgxG*(a2PglcyE`0A?e|T0arQASJNv;>-aXob%Zqm` zVh0CTCf=*1GO41h{P=3kG(?Ao;3w8ta55J64*BoaNJ5oaFWi_6+AN?2U_rZhU-iSPEh;;k?G>n`Wt z)We;+Jr^YMqqXS*--v!@pGa$5d-uBVE`$BK>Dr@<=Qsms)7WM@bWce;{Ewp6$*e0k zuqQ>@Y2l`{Hx1+7#(o!T%}sx0q*Gk>1pcwWZr3h*FEIncfxRlbzIJ#BhhPnA*YD_~ z^w+MeNuq1cX2cek<=}z{_)M^(xC7Fyeuk zr`#Paj?@sI_oYe}I8F>mkQ73|srA2t_q z-gNDkSK!C_6vZjd=bSD3wu6_jUK%pqm#+%;Ca0PLx)`g9*P3MEw5bEmn~4*{ueLCi z^S=ww4>6UqpOTXrHErCj-LP|oNfR%z^D2M6=hk9sOTl`pj=e%(28eQ@{F9V#ZO{h% za>GyU%at2#z{-D7j|uS?wC7A7U0GQ^O6!mwyvIp(sW|gtdI#PBG+oz(}oN{ZY ze8e*lzY963g5n6jy@Weng7{_FP0-%z9AC_>{b)mV${X#-wqfO|A}{_~TeUOs6=?6l zSyr97bv&DfAZ?q6Gqp>_*-pC+a8DwC70dsSee}=yxJPhGYCWws9qg6I)yMcg}yaxa5me;(y+vBXWm)d>6tKa>C*GRrj*>h6+ z%}LsZKYn4!$rrQtt)`s*fIW7~i+Z;F1n~mcv+rOZUH!W( zEz(G`ray@u*_u|uTe~>K;o~9v#p4=nN%_1o;te<$^chp|yk^}|(NCH9d*U8@;vReA z9(&?mV|tor_r$}oLG8vr183Vdb&{+Y6Y6sPwmd3%>;XT?tYYljP97{jiEk_TK4uAc zZPz%VI8Mi`>?(s?FZy@$ra-=QzRtEM7e@a`xHi>#TzR9dYs@|nwyVm1+hNDM5#$p6 zJUs@#Z13)FvkyMm5aZwje&xXB(2FhY~{{9!$#@so*+BAG(xz+ynUPQUj@2#F5`jL%So~|92kqvpy z@~wh<-gV{=+}wC%<8Vg;W4HIj5bdYaFfJGDxV%T{sJt1|#GCSX*R)Z_!F>rveL6kt z%ip;A$n5u?p$_a_8}Q?f6pHjI`YrX;CRp6PW#^KhZ8sd4W-ddwvB!DUnih02d>OZk zr*B<;dDk4c%3PS9#Jwz+m^vV>U#*(G7o^C9eYSueu7)L4?kpn zgm?P5-`*@PhdkSE6i;sOU8L`oUyIKW@%7EiMdy@OQ zp8Vcc!HVFS5ga!b3KrvaLO2w;r>2EED9$joEphbDO)`_=b&mGMV@)k_zs^;Mu79*< zZ2BAgdZYbI=ULDOW>@eP19_hs$+HR{7mqr6%-&f+ySHNieE>e<5dG!>=81F8X)`tAYmqowkeIb6f4Y_{L+-KVfc^a2i8V}b<9|-m~?3|oZT8u?0;h6@mD|59k z3;%`6xn^{g#uL6NC@y2ip4J!a`SU@>7pr@jextEvJ7de;f*Z)L<%R!M!+u+8Q@ZpM z`Eh@Y9S2*{OVWQR^os>`o6@;xwf$VIT6=?Gf0CVhXP7fapK2Yl`0lgwK55%JCVlF5 zkh@dk&(94lqZ4 zlf8!#XjT8bawGc`ap}=uytTSwD3jXuayrT8g|S9-W^cv#YUeClexIvV|8#T6Tl_tX zDoal&T=)1nT28WWc0W;jPnu6lw3t8M`eWZQ*Ov6w{A1xTKR~yKvV!uX?H_iq&pdv6 zOK1zTEe!6cA&<4}TiUVvzVG|^5SDO#(vIWmU!?8Qjr5~n95<&dZm&Czn`5npz3~)J z#+aVkg6U})GCj+O&CpcplCe*8BjXO2fXCjY@i12yHnUkW&n~1);d$oSPnt!Ig)WVc zRp=IJ%bO#zSJS?lW)~8&$B0v(Gf!u+Pi!)*nT(epuEw(o#EW-MoS0KyX7`VNk22T! z06X^jexk8PH#4q$5BKA$7w+=OQl|q7r~cjE{l0LFldNV?K9yry<(TK<(O(CvapV=VR#PBj+_FXwOVk@})d^zNB%Nu=y`{Cjd*)^d*0CQY2E|SrH?|F9^5_RJzmilYJ;-y*9=`6 z6DIgH2X;$yY@2X!_9rd9x;gjl%Wd1q`+dXpqqhKKK=KEIC3=T6k{TOY3x4|mrro1+ zWv247adozWaUj4Uq)q&}XTo-UANB+Fx8OV5-_ZR}oxA=S&_5GmVH%w8w`u79rV=d@ zrU6b3K^@o97EFHsi`gzSWb&W2c|{jL`X2oG(C=egY`*H!TT1ki`qbVF>^Pcm^Oo&r z>fdGM5qrY6&1%k`kSE%1qEM}NZpR8cudF+co}t1Jk+iEkxu@9HfBZ&vuxQf26YnGmjTGxNU*8Ijjks&w+SZmy@SWgqeeoN% zP1$q~P=}O@{FO%g{;I>f@hddu~`e|GZB*=z6ptiATy|JPc3KS}$j$aYD%I{H}m%}L_aZYAG= z7mcvowWn==@kd3~Gh=Gw7nj6uW6aHeaZUXCFV2Zu2%}xc;Xb-cZNPp1j(JRDk@}0H zIqB26a`DMxIs4Ugp3ypjc(=FKn$5(7ye8RB5h%5*sOv zZ}*&-@5ko$O4FouXtU#`Ut?*Fs`X9jf^X^mB&~fKSo6P@wXJNO9$;=hGzuMVUWN|# z9s5|D?jL`qg~QJY(_d zCmR-hIqKI~ZF88lhmP^&o~3sb*ymjW4-lH~z7n~!huL3t0M`d_7P!G+(o3G0H~1ZW zQ3Tv*Fg7xR-F=3_&t7IFaKYj=z5zEIjK3xDw+8;Uz~3JDy8?fA;9nZ}mj(Xifxjp4 z_jXcd&YecwCl{?KG+Z$>JDOkK(WCLR(aXsi%0GCdv~d(>mdJ&y|je&Dg{Q zb=~w*cl}+lATrlvo`1#fD}Uz~e!c^RCMv)8Z0TKdqrV~Owp#`^-m=Lb>Zo2Ol&C7# z4D_rS+)!)PvSN$w4C>u@^SU!EXq+yz=1VkQ5n2;^9hT9xh_90ZwIB@ znGs&wTNAN-ioCBvK|T3?rle*9C2|dxs#bTtzgih}@WS~EJsCc%f89qmZ`rz9$X=C$ zJLl6sVjj~eCK|SCr%{~T93J`W1mMn=?%!aaG|7G=n`BdaZfE|3gg5fYjzDSjp!;-p zUxel8CTtatIm7os0>X4-z*D7rKjHQc-ucJ*WBJbTamtr_6DHw%9(X&CIm7W`0?dzh z{we%!|^8sm>=%~y~}X!$}2k@!}p)?2lz5C06)%S&T#w{0p`cM zpqD>gJmQ~hp$y-5@dxDdE((;uMAPemWId5Eu#_u>j+!lyCC=v$9Jz&BI%dq0mkqi+oX z0euUP1FMdOj}>5wZv=mUZ`NVpRXpYl-w*)-zDt{d^$6cZK2G&9hCjeJTkjm>G3Rl_ zNDL<76Hoehgl`Uy(h1)m^BdxO6nHBB9r5q*BX_CF(aa-!b9oHkU*iw()su$}!NjCA z#b2-b6@2OAyr#MozBlt2zVF}<@Vyp%(@TVzQ#xGy_x$mG!R<}h4c?DO_%y~FKDGM* z-?=-0)mF_JzMl{f;Jf@W-~k@tWA$qIGI{&~zBl#(o+8Yg$C0ry#E1V%JM?t}2;V#& zPhX}5zwoL3;~JOoCuE@FcrsndZexEwx)o)V=tbUg|VD+2S0snFe z-~m?qUg5*~X$XQ-M|@if-~kqI*7&e`>`T@5KI~!H$ErTJdDt~d{2%x5cH&jPzf%*B zgd}ll#JI!BPtvIIKbXL=zO$_Qe55A+>oxFk59>}d)%Uk*;-9U7|JlR4NKbo+bCct% z-yuxsi&LI@xWlKH{W0|)UtRP5zpH`QCUD&{($hZTTWaEOtARD|Ip_1+T?5}+13z2? z|7{IiQ~ub>uRG#spP5;c(`V8)p5&iN+n|Rp_vuytwC9ZPA69>v>wNq%;%VO*Yd^ky zWH#62_nS3vO?%2%dlLWVf^Tn4de4tK8N@?trlvh*9;iwGwFI7CB0c>n^EWl|->ZRZ z&Sz)-WpaGoYieLDdQ?&no?mtAYT#RI;2M6_ z-B}a=do}QVHSm9|fos}Ro!0Hn`SP5ofou3x_uS<8ti}xIlJ~Re80=x{bW*(W%a=dv z`Q_V}w#`)|)wNM5L{VI767FRmQ;92-E|gJ(J95Q^q8h>P#Zui#V|1g?hFcTE@<0+Z zh&-lheeNij$`;+pT~e#~bvNr|yU;t?i#+SMuAbr)eR3_L;sb$9)tcVFn4I1Zj=q}> z`Yjx&+US6)>?JT{_pjF+^Y_viZ_Un6T5f36Nqzs(`1D|ZQVo`;y9I#znYONW*Id`! z6fo(cfyu7~^rxt|+;+>_4KCRvX;8|LrCgVi0#|S3LbR0mOLd|2=G$F#ATCPd73LzV z5+m0Z2G`uUdSK($L7DU4qC2Gc9o)Rh-6(Z)V%^Uh!NGymvh-h_(BWiBo~=%%<^44m zF?jKkk97P`Zl~JnD1y(rEFrm1f$Vjml~0>qt6%|1qp2qM>2BUcO}R8@oP4NCsz7a* zWUY2*AABi%OHAHh?a1@~t?SlpvPA23%Yp%+Uj?^t-$niFYd5I^cI^N zS$n5`_8Bb}&JcD<;D4L>Tez;q{G?C)t2pvw;R7tsykBdOx0)ZE>78M1!MnY|yG7&^ zhGz%MHuE$0rSFC`EDzq@5WKsEZI!*dGkBM>UuNNtvh^^3A)p7^-fZDv8GE?a*1{=o zTK2(ed7}zTFH18PMZaSH`vZDdXQl7<1$n`@G#orBKjA~C;n^3YIl>nSEc{rIhI#Dm z7XD0-{)K9|>c#Rxoe@o^eaLCeH{G|BcqP^o9#6czS{B{GW_1*U-`Y(4d^J4NfXK?f zn<;Qrjro}aU+446knih!UYTW4wAj+XhbzthKooVG{}{`9^FPHB-u%y2c`F&6)q5Sd z>wTKK?rQp|sakf)a8o{0FTd*3OTKfJ`770Yb%(s+lHje6O}NZ9zC? zU*`D`E#+!QOLHwtPYZuHe$SuieWW)(^>VGH-;Q?F{Pl>M&3|DO{kq|~7{9#>pRL}b z4SWK|(hmmVlre4p`vU*{L7GPcz8$Z&E6E$IUZT@Mo1|VW-#A}ww{dedjbydf&LwxW zHjD{Z_1%FWyjTsFZ00?_ERw7Am>)crZ)QW4whZrDJIU+_{M2c^y?e4cc4eNewt>v^ zRXl1ZhF`Mv<;G9&q~YULnsweQ<7 z(Z+|EGN!zRp45M&N}JA9z1PzppRVFjU$(l)kk@s_pPqo{{Q=J_LI2%VZSxuOwXq^| z3=yi~c`EQfSM3Yxzc$|1(PyoX)Iq}v|88BWI-b{UuhwJTz9@R1rFo({&Vw?gKMT(5 zeVQydt<6Z*WaBoU8%ptH9}Mt3Q^hk4q}KMPfz$9z>#p))8aQoEoVKdUhiUt(_@{y2 z#}SZ8&rywWrqxDwvih0ewsuOx#>$FY%M9Q*Ak zy1~Y`J@{3zat9F4S@@^%Tlg3Fl&OXPA$|)#8bu$p@UP&v@UI2D`s*lKZE5}%zoq%F zQPgMQ-@$L;{~ghih5sXd3xAR8b$z(*pTE(E$CP`mg}(;Bg})IouZ5q7-@-4BqIDMj z7W@`IKZ@2{_@($Q{0goru<*tBE&S>z+F;?=;ocqEy&hCI|s9Z#Ng;gH5w4|Ns?wjdz=MYuTR5M_iZ+8yr$;q zMevle!Qb#qX2R1t_>u6mO=mtGy%*6AD1+z}ZKBc2q2G>#zB9fRN*g-mY`}e;>pYn1 zUFYTOEUn&`9X7No|2HIe2)R0aNNs>H(RoDa0-Ll}!NZHA?C>SfgB>j8(RU1+_?2D0 zesy-5`*d?^2iQ$F=$HGD3i{>zR@R-nRb5i1NO*=<^NXGB_)KitIP22c7ftZnLRdX% z3i#_eBby~Zovq6AtMjvsm6>rLzs;ga^uFS=vH@RQKk)W^;*W62PES0+rmsbCXmja# zmY&ffo$g(-y6eR@mIY^Wc5Mmg4Z?TLW|DVwX7X|B)7cEdH+RRg^1==;_51pL`Ln+& z&%^U>$Br`RzH_YdaOTJQIOTZ8pD}%^=4>GKLfu0%c~`nB^cQR;)h|U$VzV4I1>uwX zqxvZC&_0(bz3Yz`xN&RH%Ia(zz1^ulr&3Vb3hiBKeBQKW*Y>()f39%7m(p<5_ehf zV`ig!N8M+|cfLy)brxLStu{U;JWkG}cz&(iF^lrfzUB+Ec^q1OZJzJ@M%X?+t2`7= zU#<6L$d5CQ?>!pTA4%@HZXBA∨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%0D@Jmm*OwM?Lx5{|OS}%t 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 +#include "memory/mem2.h" -static inline void* mem_alloc (size_t size) { - return malloc(size); +extern __inline__ void* mem_alloc (size_t size) { + return MEM2_alloc(size); } -static inline void* mem_realloc (void *p, size_t size) { - return realloc(p, size); +extern __inline__ void* mem_realloc (void *p, size_t size) { + return MEM2_realloc(p, size); } -static inline void* mem_align (size_t size) { - #ifdef __wii__ - return memalign(32, size); - #else - return malloc(size); - #endif +extern __inline__ void* mem_align (size_t a, size_t size) { + return MEM2_alloc(size); } -static inline void mem_free (void* mem) { - free(mem); +extern __inline__ void mem_free (void* mem) { + MEM2_free(mem); } #endif /* _MEM_ALLOCATE_H */ diff --git a/source/libs/libwbfs/rijndael.c b/source/libs/libwbfs/rijndael.c index 09790080..473023d9 100644 --- a/source/libs/libwbfs/rijndael.c +++ b/source/libs/libwbfs/rijndael.c @@ -1,432 +1,432 @@ -/* Rijndael Block Cipher - rijndael.c - - Written by Mike Scott 21st April 1999 - mike@compapp.dcu.ie - - Permission for free direct or derivative use is granted subject - to compliance with any conditions that the originators of the - algorithm place on its exploitation. - - */ - -#include -#include - -#define u8 unsigned char /* 8 bits */ -#define u32 unsigned long /* 32 bits */ -#define u64 unsigned long long - -/* rotates x one bit to the left */ - -#define ROTL(x) (((x)>>7)|((x)<<1)) - -/* Rotates 32-bit word left by 1, 2 or 3 byte */ - -#define ROTL8(x) (((x)<<8)|((x)>>24)) -#define ROTL16(x) (((x)<<16)|((x)>>16)) -#define ROTL24(x) (((x)<<24)|((x)>>8)) - -/* Fixed Data */ - -static u8 InCo[4] = { 0xB, 0xD, 0x9, 0xE }; /* Inverse Coefficients */ - -static u8 fbsub[256]; -static u8 rbsub[256]; -static u8 ptab[256], ltab[256]; -static u32 ftable[256]; -static u32 rtable[256]; -static u32 rco[30]; - -/* Parameter-dependent data */ - -int Nk, Nb, Nr; -u8 fi[24], ri[24]; -u32 fkey[120]; -u32 rkey[120]; - -static u32 pack(u8 *b) -{ /* pack bytes into a 32-bit Word */ - return ((u32 ) b[3] << 24) | ((u32 ) b[2] << 16) | ((u32 ) b[1] << 8) | (u32 ) b[0]; -} - -static void unpack(u32 a, u8 *b) -{ /* unpack bytes from a word */ - b[0] = (u8 ) a; - b[1] = (u8 ) (a >> 8); - b[2] = (u8 ) (a >> 16); - b[3] = (u8 ) (a >> 24); -} - -static u8 xtime(u8 a) -{ - u8 b; - if (a & 0x80) - b = 0x1B; - else b = 0; - a <<= 1; - a ^= b; - return a; -} - -static u8 bmul(u8 x, u8 y) -{ /* x.y= AntiLog(Log(x) + Log(y)) */ - if (x && y) - return ptab[(ltab[x] + ltab[y]) % 255]; - else return 0; -} - -static u32 SubByte(u32 a) -{ - u8 b[4]; - unpack(a, b); - b[0] = fbsub[b[0]]; - b[1] = fbsub[b[1]]; - b[2] = fbsub[b[2]]; - b[3] = fbsub[b[3]]; - return pack(b); -} - -static u8 product(u32 x, u32 y) -{ /* dot product of two 4-byte arrays */ - u8 xb[4], yb[4]; - unpack(x, xb); - unpack(y, yb); - return bmul(xb[0], yb[0]) ^ bmul(xb[1], yb[1]) ^ bmul(xb[2], yb[2]) ^ bmul(xb[3], yb[3]); -} - -static u32 InvMixCol(u32 x) -{ /* matrix Multiplication */ - u32 y, m; - u8 b[4]; - - m = pack(InCo); - b[3] = product(m, x); - m = ROTL24( m ); - b[2] = product(m, x); - m = ROTL24( m ); - b[1] = product(m, x); - m = ROTL24( m ); - b[0] = product(m, x); - y = pack(b); - return y; -} - -u8 ByteSub(u8 x) -{ - u8 y = ptab[255 - ltab[x]]; /* multiplicative inverse */ - x = y; - x = ROTL( x ); - y ^= x; - x = ROTL( x ); - y ^= x; - x = ROTL( x ); - y ^= x; - x = ROTL( x ); - y ^= x; - y ^= 0x63; - return y; -} - -void gentables(void) -{ /* generate tables */ - int i; - u8 y, b[4]; - - /* use 3 as primitive root to generate power and log tables */ - - ltab[0] = 0; - ptab[0] = 1; - ltab[1] = 0; - ptab[1] = 3; - ltab[3] = 1; - for (i = 2; i < 256; i++) - { - ptab[i] = ptab[i - 1] ^ xtime(ptab[i - 1]); - ltab[ptab[i]] = i; - } - - /* affine transformation:- each bit is xored with itself shifted one bit */ - - fbsub[0] = 0x63; - rbsub[0x63] = 0; - for (i = 1; i < 256; i++) - { - y = ByteSub((u8 ) i); - fbsub[i] = y; - rbsub[y] = i; - } - - for (i = 0, y = 1; i < 30; i++) - { - rco[i] = y; - y = xtime(y); - } - - /* calculate forward and reverse tables */ - for (i = 0; i < 256; i++) - { - y = fbsub[i]; - b[3] = y ^ xtime(y); - b[2] = y; - b[1] = y; - b[0] = xtime(y); - ftable[i] = pack(b); - - y = rbsub[i]; - b[3] = bmul(InCo[0], y); - b[2] = bmul(InCo[1], y); - b[1] = bmul(InCo[2], y); - b[0] = bmul(InCo[3], y); - rtable[i] = pack(b); - } -} - -void gkey(int nb, int nk, char *key) -{ /* blocksize=32*nb bits. Key=32*nk bits */ - /* currently nb,bk = 4, 6 or 8 */ - /* key comes as 4*Nk bytes */ - /* Key Scheduler. Create expanded encryption key */ - int i, j, k, m, N; - int C1, C2, C3; - u32 CipherKey[8]; - - Nb = nb; - Nk = nk; - - /* Nr is number of rounds */ - if (Nb >= Nk) - Nr = 6 + Nb; - else Nr = 6 + Nk; - - C1 = 1; - if (Nb < 8) - { - C2 = 2; - C3 = 3; - } - else - { - C2 = 3; - C3 = 4; - } - - /* pre-calculate forward and reverse increments */ - for (m = j = 0; j < nb; j++, m += 3) - { - fi[m] = (j + C1) % nb; - fi[m + 1] = (j + C2) % nb; - fi[m + 2] = (j + C3) % nb; - ri[m] = (nb + j - C1) % nb; - ri[m + 1] = (nb + j - C2) % nb; - ri[m + 2] = (nb + j - C3) % nb; - } - - N = Nb * (Nr + 1); - - for (i = j = 0; i < Nk; i++, j += 4) - { - CipherKey[i] = pack((u8 *) &key[j]); - } - for (i = 0; i < Nk; i++) - fkey[i] = CipherKey[i]; - for (j = Nk, k = 0; j < N; j += Nk, k++) - { - fkey[j] = fkey[j - Nk] ^ SubByte(ROTL24( fkey[j-1] )) ^ rco[k]; - if (Nk <= 6) - { - for (i = 1; i < Nk && (i + j) < N; i++) - fkey[i + j] = fkey[i + j - Nk] ^ fkey[i + j - 1]; - } - else - { - for (i = 1; i < 4 && (i + j) < N; i++) - fkey[i + j] = fkey[i + j - Nk] ^ fkey[i + j - 1]; - if ((j + 4) < N) fkey[j + 4] = fkey[j + 4 - Nk] ^ SubByte(fkey[j + 3]); - for (i = 5; i < Nk && (i + j) < N; i++) - fkey[i + j] = fkey[i + j - Nk] ^ fkey[i + j - 1]; - } - - } - - /* now for the expanded decrypt key in reverse order */ - - for (j = 0; j < Nb; j++) - rkey[j + N - Nb] = fkey[j]; - for (i = Nb; i < N - Nb; i += Nb) - { - k = N - Nb - i; - for (j = 0; j < Nb; j++) - rkey[k + j] = InvMixCol(fkey[i + j]); - } - for (j = N - Nb; j < N; j++) - rkey[j - N + Nb] = fkey[j]; -} - -/* There is an obvious time/space trade-off possible here. * - * Instead of just one ftable[], I could have 4, the other * - * 3 pre-rotated to save the ROTL8, ROTL16 and ROTL24 overhead */ - -void encrypt(char *buff) -{ - int i, j, k, m; - u32 a[8], b[8], *x, *y, *t; - - for (i = j = 0; i < Nb; i++, j += 4) - { - a[i] = pack((u8 *) &buff[j]); - a[i] ^= fkey[i]; - } - k = Nb; - x = a; - y = b; - - /* State alternates between a and b */ - for (i = 1; i < Nr; i++) - { /* Nr is number of rounds. May be odd. */ - - /* if Nb is fixed - unroll this next - loop and hard-code in the values of fi[] */ - - for (m = j = 0; j < Nb; j++, m += 3) - { /* deal with each 32-bit element of the State */ - /* This is the time-critical bit */ - y[j] = fkey[k++] ^ ftable[(u8 ) x[j]] ^ ROTL8( ftable[( u8 )( x[fi[m]] >> 8 )] ) - ^ ROTL16( ftable[( u8 )( x[fi[m+1]] >> 16 )] ) ^ ROTL24( ftable[x[fi[m+2]] >> 24] ); - } - t = x; - x = y; - y = t; /* swap pointers */ - } - - /* Last Round - unroll if possible */ - for (m = j = 0; j < Nb; j++, m += 3) - { - y[j] = fkey[k++] ^ (u32 ) fbsub[(u8 ) x[j]] ^ ROTL8( ( u32 )fbsub[( u8 )( x[fi[m]] >> 8 )] ) - ^ ROTL16( ( u32 )fbsub[( u8 )( x[fi[m+1]] >> 16 )] ) ^ ROTL24( ( u32 )fbsub[x[fi[m+2]] >> 24] ); - } - for (i = j = 0; i < Nb; i++, j += 4) - { - unpack(y[i], (u8 *) &buff[j]); - x[i] = y[i] = 0; /* clean up stack */ - } - return; -} - -void decrypt(char *buff) -{ - int i, j, k, m; - u32 a[8], b[8], *x, *y, *t; - - for (i = j = 0; i < Nb; i++, j += 4) - { - a[i] = pack((u8 *) &buff[j]); - a[i] ^= rkey[i]; - } - k = Nb; - x = a; - y = b; - - /* State alternates between a and b */ - for (i = 1; i < Nr; i++) - { /* Nr is number of rounds. May be odd. */ - - /* if Nb is fixed - unroll this next - loop and hard-code in the values of ri[] */ - - for (m = j = 0; j < Nb; j++, m += 3) - { /* This is the time-critical bit */ - y[j] = rkey[k++] ^ rtable[(u8 ) x[j]] ^ ROTL8( rtable[( u8 )( x[ri[m]] >> 8 )] ) - ^ ROTL16( rtable[( u8 )( x[ri[m+1]] >> 16 )] ) ^ ROTL24( rtable[x[ri[m+2]] >> 24] ); - } - t = x; - x = y; - y = t; /* swap pointers */ - } - - /* Last Round - unroll if possible */ - for (m = j = 0; j < Nb; j++, m += 3) - { - y[j] = rkey[k++] ^ (u32 ) rbsub[(u8 ) x[j]] ^ ROTL8( ( u32 )rbsub[( u8 )( x[ri[m]] >> 8 )] ) - ^ ROTL16( ( u32 )rbsub[( u8 )( x[ri[m+1]] >> 16 )] ) ^ ROTL24( ( u32 )rbsub[x[ri[m+2]] >> 24] ); - } - for (i = j = 0; i < Nb; i++, j += 4) - { - unpack(y[i], (u8 *) &buff[j]); - x[i] = y[i] = 0; /* clean up stack */ - } - return; -} - -void aes_set_key(u8 *key) -{ - gentables(); - gkey(4, 4, (char*) key); -} - -// CBC mode decryption -void aes_decrypt(u8 *iv, u8 *inbuf, u8 *outbuf, unsigned long long len) -{ - u8 block[16]; - unsigned int blockno = 0, i; - - //printf("aes_decrypt(%p, %p, %p, %lld)\n", iv, inbuf, outbuf, len); - - for (blockno = 0; blockno <= (len / sizeof(block)); blockno++) - { - unsigned int fraction; - if (blockno == (len / sizeof(block))) // last block - { - fraction = len % sizeof(block); - if (fraction == 0) break; - memset(block, 0, sizeof(block)); - } - else fraction = 16; - - // debug_printf("block %d: fraction = %d\n", blockno, fraction); - memcpy(block, inbuf + blockno * sizeof(block), fraction); - decrypt((char*) block); - u8 *ctext_ptr; - if (blockno == 0) - ctext_ptr = iv; - else ctext_ptr = inbuf + (blockno - 1) * sizeof(block); - - for (i = 0; i < fraction; i++) - outbuf[blockno * sizeof(block) + i] = ctext_ptr[i] ^ block[i]; - // debug_printf("Block %d output: ", blockno); - // hexdump(outbuf + blockno*sizeof(block), 16); - } -} - -// CBC mode encryption -void aes_encrypt(u8 *iv, u8 *inbuf, u8 *outbuf, unsigned long long len) -{ - u8 block[16]; - unsigned int blockno = 0, i; - - // debug_printf("aes_decrypt(%p, %p, %p, %lld)\n", iv, inbuf, outbuf, len); - - for (blockno = 0; blockno <= (len / sizeof(block)); blockno++) - { - unsigned int fraction; - if (blockno == (len / sizeof(block))) // last block - { - fraction = len % sizeof(block); - if (fraction == 0) break; - memset(block, 0, sizeof(block)); - } - else fraction = 16; - - // debug_printf("block %d: fraction = %d\n", blockno, fraction); - memcpy(block, inbuf + blockno * sizeof(block), fraction); - - for (i = 0; i < fraction; i++) - block[i] = inbuf[blockno * sizeof(block) + i] ^ iv[i]; - - encrypt((char*) block); - memcpy(iv, block, sizeof(block)); - memcpy(outbuf + blockno * sizeof(block), block, sizeof(block)); - // debug_printf("Block %d output: ", blockno); - // hexdump(outbuf + blockno*sizeof(block), 16); - } -} - +/* Rijndael Block Cipher - rijndael.c + + Written by Mike Scott 21st April 1999 + mike@compapp.dcu.ie + + Permission for free direct or derivative use is granted subject + to compliance with any conditions that the originators of the + algorithm place on its exploitation. + + */ + +#include +#include + +#define u8 unsigned char /* 8 bits */ +#define u32 unsigned long /* 32 bits */ +#define u64 unsigned long long + +/* rotates x one bit to the left */ + +#define ROTL(x) (((x)>>7)|((x)<<1)) + +/* Rotates 32-bit word left by 1, 2 or 3 byte */ + +#define ROTL8(x) (((x)<<8)|((x)>>24)) +#define ROTL16(x) (((x)<<16)|((x)>>16)) +#define ROTL24(x) (((x)<<24)|((x)>>8)) + +/* Fixed Data */ + +static u8 InCo[4] = { 0xB, 0xD, 0x9, 0xE }; /* Inverse Coefficients */ + +static u8 fbsub[256]; +static u8 rbsub[256]; +static u8 ptab[256], ltab[256]; +static u32 ftable[256]; +static u32 rtable[256]; +static u32 rco[30]; + +/* Parameter-dependent data */ + +int Nk, Nb, Nr; +u8 fi[24], ri[24]; +u32 fkey[120]; +u32 rkey[120]; + +static u32 pack(u8 *b) +{ /* pack bytes into a 32-bit Word */ + return ((u32 ) b[3] << 24) | ((u32 ) b[2] << 16) | ((u32 ) b[1] << 8) | (u32 ) b[0]; +} + +static void unpack(u32 a, u8 *b) +{ /* unpack bytes from a word */ + b[0] = (u8 ) a; + b[1] = (u8 ) (a >> 8); + b[2] = (u8 ) (a >> 16); + b[3] = (u8 ) (a >> 24); +} + +static u8 xtime(u8 a) +{ + u8 b; + if (a & 0x80) + b = 0x1B; + else b = 0; + a <<= 1; + a ^= b; + return a; +} + +static u8 bmul(u8 x, u8 y) +{ /* x.y= AntiLog(Log(x) + Log(y)) */ + if (x && y) + return ptab[(ltab[x] + ltab[y]) % 255]; + else return 0; +} + +static u32 SubByte(u32 a) +{ + u8 b[4]; + unpack(a, b); + b[0] = fbsub[b[0]]; + b[1] = fbsub[b[1]]; + b[2] = fbsub[b[2]]; + b[3] = fbsub[b[3]]; + return pack(b); +} + +static u8 product(u32 x, u32 y) +{ /* dot product of two 4-byte arrays */ + u8 xb[4], yb[4]; + unpack(x, xb); + unpack(y, yb); + return bmul(xb[0], yb[0]) ^ bmul(xb[1], yb[1]) ^ bmul(xb[2], yb[2]) ^ bmul(xb[3], yb[3]); +} + +static u32 InvMixCol(u32 x) +{ /* matrix Multiplication */ + u32 y, m; + u8 b[4]; + + m = pack(InCo); + b[3] = product(m, x); + m = ROTL24( m ); + b[2] = product(m, x); + m = ROTL24( m ); + b[1] = product(m, x); + m = ROTL24( m ); + b[0] = product(m, x); + y = pack(b); + return y; +} + +u8 ByteSub(u8 x) +{ + u8 y = ptab[255 - ltab[x]]; /* multiplicative inverse */ + x = y; + x = ROTL( x ); + y ^= x; + x = ROTL( x ); + y ^= x; + x = ROTL( x ); + y ^= x; + x = ROTL( x ); + y ^= x; + y ^= 0x63; + return y; +} + +void gentables(void) +{ /* generate tables */ + int i; + u8 y, b[4]; + + /* use 3 as primitive root to generate power and log tables */ + + ltab[0] = 0; + ptab[0] = 1; + ltab[1] = 0; + ptab[1] = 3; + ltab[3] = 1; + for (i = 2; i < 256; i++) + { + ptab[i] = ptab[i - 1] ^ xtime(ptab[i - 1]); + ltab[ptab[i]] = i; + } + + /* affine transformation:- each bit is xored with itself shifted one bit */ + + fbsub[0] = 0x63; + rbsub[0x63] = 0; + for (i = 1; i < 256; i++) + { + y = ByteSub((u8 ) i); + fbsub[i] = y; + rbsub[y] = i; + } + + for (i = 0, y = 1; i < 30; i++) + { + rco[i] = y; + y = xtime(y); + } + + /* calculate forward and reverse tables */ + for (i = 0; i < 256; i++) + { + y = fbsub[i]; + b[3] = y ^ xtime(y); + b[2] = y; + b[1] = y; + b[0] = xtime(y); + ftable[i] = pack(b); + + y = rbsub[i]; + b[3] = bmul(InCo[0], y); + b[2] = bmul(InCo[1], y); + b[1] = bmul(InCo[2], y); + b[0] = bmul(InCo[3], y); + rtable[i] = pack(b); + } +} + +void gkey(int nb, int nk, char *key) +{ /* blocksize=32*nb bits. Key=32*nk bits */ + /* currently nb,bk = 4, 6 or 8 */ + /* key comes as 4*Nk bytes */ + /* Key Scheduler. Create expanded encryption key */ + int i, j, k, m, N; + int C1, C2, C3; + u32 CipherKey[8]; + + Nb = nb; + Nk = nk; + + /* Nr is number of rounds */ + if (Nb >= Nk) + Nr = 6 + Nb; + else Nr = 6 + Nk; + + C1 = 1; + if (Nb < 8) + { + C2 = 2; + C3 = 3; + } + else + { + C2 = 3; + C3 = 4; + } + + /* pre-calculate forward and reverse increments */ + for (m = j = 0; j < nb; j++, m += 3) + { + fi[m] = (j + C1) % nb; + fi[m + 1] = (j + C2) % nb; + fi[m + 2] = (j + C3) % nb; + ri[m] = (nb + j - C1) % nb; + ri[m + 1] = (nb + j - C2) % nb; + ri[m + 2] = (nb + j - C3) % nb; + } + + N = Nb * (Nr + 1); + + for (i = j = 0; i < Nk; i++, j += 4) + { + CipherKey[i] = pack((u8 *) &key[j]); + } + for (i = 0; i < Nk; i++) + fkey[i] = CipherKey[i]; + for (j = Nk, k = 0; j < N; j += Nk, k++) + { + fkey[j] = fkey[j - Nk] ^ SubByte(ROTL24( fkey[j-1] )) ^ rco[k]; + if (Nk <= 6) + { + for (i = 1; i < Nk && (i + j) < N; i++) + fkey[i + j] = fkey[i + j - Nk] ^ fkey[i + j - 1]; + } + else + { + for (i = 1; i < 4 && (i + j) < N; i++) + fkey[i + j] = fkey[i + j - Nk] ^ fkey[i + j - 1]; + if ((j + 4) < N) fkey[j + 4] = fkey[j + 4 - Nk] ^ SubByte(fkey[j + 3]); + for (i = 5; i < Nk && (i + j) < N; i++) + fkey[i + j] = fkey[i + j - Nk] ^ fkey[i + j - 1]; + } + + } + + /* now for the expanded decrypt key in reverse order */ + + for (j = 0; j < Nb; j++) + rkey[j + N - Nb] = fkey[j]; + for (i = Nb; i < N - Nb; i += Nb) + { + k = N - Nb - i; + for (j = 0; j < Nb; j++) + rkey[k + j] = InvMixCol(fkey[i + j]); + } + for (j = N - Nb; j < N; j++) + rkey[j - N + Nb] = fkey[j]; +} + +/* There is an obvious time/space trade-off possible here. * + * Instead of just one ftable[], I could have 4, the other * + * 3 pre-rotated to save the ROTL8, ROTL16 and ROTL24 overhead */ + +void encrypt(char *buff) +{ + int i, j, k, m; + u32 a[8], b[8], *x, *y, *t; + + for (i = j = 0; i < Nb; i++, j += 4) + { + a[i] = pack((u8 *) &buff[j]); + a[i] ^= fkey[i]; + } + k = Nb; + x = a; + y = b; + + /* State alternates between a and b */ + for (i = 1; i < Nr; i++) + { /* Nr is number of rounds. May be odd. */ + + /* if Nb is fixed - unroll this next + loop and hard-code in the values of fi[] */ + + for (m = j = 0; j < Nb; j++, m += 3) + { /* deal with each 32-bit element of the State */ + /* This is the time-critical bit */ + y[j] = fkey[k++] ^ ftable[(u8 ) x[j]] ^ ROTL8( ftable[( u8 )( x[fi[m]] >> 8 )] ) + ^ ROTL16( ftable[( u8 )( x[fi[m+1]] >> 16 )] ) ^ ROTL24( ftable[x[fi[m+2]] >> 24] ); + } + t = x; + x = y; + y = t; /* swap pointers */ + } + + /* Last Round - unroll if possible */ + for (m = j = 0; j < Nb; j++, m += 3) + { + y[j] = fkey[k++] ^ (u32 ) fbsub[(u8 ) x[j]] ^ ROTL8( ( u32 )fbsub[( u8 )( x[fi[m]] >> 8 )] ) + ^ ROTL16( ( u32 )fbsub[( u8 )( x[fi[m+1]] >> 16 )] ) ^ ROTL24( ( u32 )fbsub[x[fi[m+2]] >> 24] ); + } + for (i = j = 0; i < Nb; i++, j += 4) + { + unpack(y[i], (u8 *) &buff[j]); + x[i] = y[i] = 0; /* clean up stack */ + } + return; +} + +void decrypt(char *buff) +{ + int i, j, k, m; + u32 a[8], b[8], *x, *y, *t; + + for (i = j = 0; i < Nb; i++, j += 4) + { + a[i] = pack((u8 *) &buff[j]); + a[i] ^= rkey[i]; + } + k = Nb; + x = a; + y = b; + + /* State alternates between a and b */ + for (i = 1; i < Nr; i++) + { /* Nr is number of rounds. May be odd. */ + + /* if Nb is fixed - unroll this next + loop and hard-code in the values of ri[] */ + + for (m = j = 0; j < Nb; j++, m += 3) + { /* This is the time-critical bit */ + y[j] = rkey[k++] ^ rtable[(u8 ) x[j]] ^ ROTL8( rtable[( u8 )( x[ri[m]] >> 8 )] ) + ^ ROTL16( rtable[( u8 )( x[ri[m+1]] >> 16 )] ) ^ ROTL24( rtable[x[ri[m+2]] >> 24] ); + } + t = x; + x = y; + y = t; /* swap pointers */ + } + + /* Last Round - unroll if possible */ + for (m = j = 0; j < Nb; j++, m += 3) + { + y[j] = rkey[k++] ^ (u32 ) rbsub[(u8 ) x[j]] ^ ROTL8( ( u32 )rbsub[( u8 )( x[ri[m]] >> 8 )] ) + ^ ROTL16( ( u32 )rbsub[( u8 )( x[ri[m+1]] >> 16 )] ) ^ ROTL24( ( u32 )rbsub[x[ri[m+2]] >> 24] ); + } + for (i = j = 0; i < Nb; i++, j += 4) + { + unpack(y[i], (u8 *) &buff[j]); + x[i] = y[i] = 0; /* clean up stack */ + } + return; +} + +void aes_set_key(u8 *key) +{ + gentables(); + gkey(4, 4, (char*) key); +} + +// CBC mode decryption +void aes_decrypt(u8 *iv, u8 *inbuf, u8 *outbuf, unsigned long long len) +{ + u8 block[16]; + unsigned int blockno = 0, i; + + //printf("aes_decrypt(%p, %p, %p, %lld)\n", iv, inbuf, outbuf, len); + + for (blockno = 0; blockno <= (len / sizeof(block)); blockno++) + { + unsigned int fraction; + if (blockno == (len / sizeof(block))) // last block + { + fraction = len % sizeof(block); + if (fraction == 0) break; + memset(block, 0, sizeof(block)); + } + else fraction = 16; + + // debug_printf("block %d: fraction = %d\n", blockno, fraction); + memcpy(block, inbuf + blockno * sizeof(block), fraction); + decrypt((char*) block); + u8 *ctext_ptr; + if (blockno == 0) + ctext_ptr = iv; + else ctext_ptr = inbuf + (blockno - 1) * sizeof(block); + + for (i = 0; i < fraction; i++) + outbuf[blockno * sizeof(block) + i] = ctext_ptr[i] ^ block[i]; + // debug_printf("Block %d output: ", blockno); + // hexdump(outbuf + blockno*sizeof(block), 16); + } +} + +// CBC mode encryption +void aes_encrypt(u8 *iv, u8 *inbuf, u8 *outbuf, unsigned long long len) +{ + u8 block[16]; + unsigned int blockno = 0, i; + + // debug_printf("aes_decrypt(%p, %p, %p, %lld)\n", iv, inbuf, outbuf, len); + + for (blockno = 0; blockno <= (len / sizeof(block)); blockno++) + { + unsigned int fraction; + if (blockno == (len / sizeof(block))) // last block + { + fraction = len % sizeof(block); + if (fraction == 0) break; + memset(block, 0, sizeof(block)); + } + else fraction = 16; + + // debug_printf("block %d: fraction = %d\n", blockno, fraction); + memcpy(block, inbuf + blockno * sizeof(block), fraction); + + for (i = 0; i < fraction; i++) + block[i] = inbuf[blockno * sizeof(block) + i] ^ iv[i]; + + encrypt((char*) block); + memcpy(iv, block, sizeof(block)); + memcpy(outbuf + blockno * sizeof(block), block, sizeof(block)); + // debug_printf("Block %d output: ", blockno); + // hexdump(outbuf + blockno*sizeof(block), 16); + } +} + diff --git a/source/libs/libwbfs/wiidisc.h b/source/libs/libwbfs/wiidisc.h index 3cd6bcc0..c2bb0636 100644 --- a/source/libs/libwbfs/wiidisc.h +++ b/source/libs/libwbfs/wiidisc.h @@ -1,68 +1,68 @@ -#ifndef WIIDISC_H -#define WIIDISC_H -#include -#include "libwbfs_os.h" // this file is provided by the project wanting to compile libwbfs and wiidisc -#ifdef __cplusplus -extern "C" -{ -#endif /* __cplusplus */ -#if 0 //removes extra automatic indentation by editors -} -#endif - // callback definition. Return 1 on fatal error (callback is supposed to make retries until no hopes..) - // offset points 32bit words, count counts bytes - typedef int (*read_wiidisc_callback_t)(void*fp, u32 offset, u32 count, void*iobuf); - - typedef enum - { - UPDATE_PARTITION_TYPE = 0, GAME_PARTITION_TYPE, OTHER_PARTITION_TYPE, - // value in between selects partition types of that value - ALL_PARTITIONS = 0xffffffff - 3, - REMOVE_UPDATE_PARTITION, // keeps game + channel installers - ONLY_GAME_PARTITION, - } partition_selector_t; - - typedef struct wiidisc_s - { - read_wiidisc_callback_t read; - void *fp; - u8 *sector_usage_table; - - // everything points 32bit words. - u32 disc_raw_offset; - u32 partition_raw_offset; - u32 partition_data_offset; - u32 partition_data_size; - u32 partition_block; - - u8 *tmp_buffer; - u8 *tmp_buffer2; - u8 disc_key[16]; - int dont_decrypt; - - partition_selector_t part_sel; - - char *extract_pathname; - u8 *extracted_buffer; - int extracted_size; - } wiidisc_t; - - wiidisc_t *wd_open_disc(read_wiidisc_callback_t read, void*fp); - void wd_close_disc(wiidisc_t *); - // returns a buffer allocated with wbfs_ioalloc() or NULL if not found of alloc error - u8 * wd_extract_file(wiidisc_t *d, partition_selector_t partition_type, char *pathname); - - void wd_build_disc_usage(wiidisc_t *d, partition_selector_t selector, u8* usage_table); - - // effectively remove not copied partition from the partition table. - void wd_fix_partition_table(wiidisc_t *d, partition_selector_t selector, u8* partition_table); - u8 * wd_get_fst(wiidisc_t *d, partition_selector_t partition_type); - -#if 0 -{ -#endif -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif +#ifndef WIIDISC_H +#define WIIDISC_H +#include +#include "libwbfs_os.h" // this file is provided by the project wanting to compile libwbfs and wiidisc +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ +#if 0 //removes extra automatic indentation by editors +} +#endif + // callback definition. Return 1 on fatal error (callback is supposed to make retries until no hopes..) + // offset points 32bit words, count counts bytes + typedef int (*read_wiidisc_callback_t)(void*fp, u32 offset, u32 count, void*iobuf); + + typedef enum + { + UPDATE_PARTITION_TYPE = 0, GAME_PARTITION_TYPE, OTHER_PARTITION_TYPE, + // value in between selects partition types of that value + ALL_PARTITIONS = 0xffffffff - 3, + REMOVE_UPDATE_PARTITION, // keeps game + channel installers + ONLY_GAME_PARTITION, + } partition_selector_t; + + typedef struct wiidisc_s + { + read_wiidisc_callback_t read; + void *fp; + u8 *sector_usage_table; + + // everything points 32bit words. + u32 disc_raw_offset; + u32 partition_raw_offset; + u32 partition_data_offset; + u32 partition_data_size; + u32 partition_block; + + u8 *tmp_buffer; + u8 *tmp_buffer2; + u8 disc_key[16]; + int dont_decrypt; + + partition_selector_t part_sel; + + char *extract_pathname; + u8 *extracted_buffer; + int extracted_size; + } wiidisc_t; + + wiidisc_t *wd_open_disc(read_wiidisc_callback_t read, void*fp); + void wd_close_disc(wiidisc_t *); + // returns a buffer allocated with wbfs_ioalloc() or NULL if not found of alloc error + u8 * wd_extract_file(wiidisc_t *d, partition_selector_t partition_type, char *pathname); + + void wd_build_disc_usage(wiidisc_t *d, partition_selector_t selector, u8* usage_table); + + // effectively remove not copied partition from the partition table. + void wd_fix_partition_table(wiidisc_t *d, partition_selector_t selector, u8* partition_table); + u8 * wd_get_fst(wiidisc_t *d, partition_selector_t partition_type); + +#if 0 +{ +#endif +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif diff --git a/source/libwiigui/gui.h b/source/libwiigui/gui.h index 340d5bb2..a7ab4ec2 100644 --- a/source/libwiigui/gui.h +++ b/source/libwiigui/gui.h @@ -968,8 +968,6 @@ class GuiNumpad: public GuiWindow GuiImageData * keyTextbox; GuiImageData * keyMedium; GuiImageData * keyMediumOver; - GuiSound * keySoundOver; - GuiSound * keySoundClick; GuiTrigger * trigA; GuiTrigger * trigB; }; @@ -1026,8 +1024,6 @@ class GuiOptionBrowser: public GuiElement GuiImageData * scrollbarBox; GuiImageData * scrollbarBoxOver; - GuiSound * btnSoundOver; - GuiSound * btnSoundClick; GuiTrigger * trigA; GuiTrigger * trigB; GuiTrigger * trigHeldA; @@ -1088,8 +1084,6 @@ class GuiFileBrowser: public GuiElement GuiImageData * arrowUp; GuiImageData * scrollbarBox; - GuiSound * btnSoundOver; - GuiSound * btnSoundClick; GuiTrigger * trigA; GuiTrigger * trigHeldA; }; diff --git a/source/libwiigui/gui_element.cpp b/source/libwiigui/gui_element.cpp index f91337fb..8c31bc6b 100644 --- a/source/libwiigui/gui_element.cpp +++ b/source/libwiigui/gui_element.cpp @@ -1,820 +1,820 @@ -/**************************************************************************** - * libwiigui - * - * Tantric 2009 - * - * gui_element.cpp - * - * GUI class definitions - ***************************************************************************/ - -#include "gui.h" - -/** - * Constructor for the Object class. - */ -//mutex_t GuiElement::mutex = LWP_MUTEX_NULL; -mutex_t GuiElement::_lock_mutex = LWP_MUTEX_NULL; -GuiElement::GuiElement() -{ - xoffset = 0; - yoffset = 0; - zoffset = 0; - xmin = 0; - xmax = 0; - ymin = 0; - ymax = 0; - width = 0; - height = 0; - alpha = 255; - scale = 1; - state = STATE_DEFAULT; - stateChan = -1; - trigger[0] = NULL; - trigger[1] = NULL; - trigger[2] = NULL; - trigger[3] = NULL; - trigger[4] = NULL; - trigger[5] = NULL; - parentElement = NULL; - rumble = true; - selectable = false; - clickable = false; - holdable = false; - visible = true; - focus = -1; // cannot be focused - updateCB = NULL; - yoffsetDyn = 0; - xoffsetDyn = 0; - yoffsetDynFloat = 0; - alphaDyn = -1; - scaleDyn = 1; - effects = 0; - effectAmount = 0; - effectTarget = 0; - effectsOver = 0; - effectAmountOver = 0; - effectTargetOver = 0; - frequency = 0.0f; - changervar = 0; - degree = -90.0f; - circleamount = 360.0f; - Radius = 150; - angleDyn = 0.0f; - anglespeed = 0.0f; - - // default alignment - align to top left - alignmentVert = ALIGN_TOP; - alignmentHor = ALIGN_LEFT; - // if(mutex == LWP_MUTEX_NULL) LWP_MutexInit(&mutex, true); - if (_lock_mutex == LWP_MUTEX_NULL) LWP_MutexInit(&_lock_mutex, true); - _lock_thread = LWP_THREAD_NULL; - _lock_count = 0; - _lock_queue = LWP_TQUEUE_NULL; - -} - -/** - * Destructor for the GuiElement class. - */ -GuiElement::~GuiElement() -{ - // LWP_MutexDestroy(mutex); -} - -void GuiElement::SetParent(GuiElement * e) -{ - LOCK( this ); - parentElement = e; -} - -GuiElement * GuiElement::GetParent() -{ - return parentElement; -} -/** - * Get the left position of the GuiElement. - * @see SetLeft() - * @return Left position in pixel. - */ -int GuiElement::GetLeft() -{ - int x = 0; - int pWidth = 0; - int pLeft = 0; - - if (parentElement) - { - pWidth = parentElement->GetWidth(); - pLeft = parentElement->GetLeft(); - } - - if (effects & (EFFECT_SLIDE_IN | EFFECT_SLIDE_OUT | EFFECT_GOROUND | EFFECT_ROCK_VERTICLE)) pLeft += xoffsetDyn; - - switch (alignmentHor) - { - case ALIGN_LEFT: - x = pLeft; - break; - case ALIGN_CENTRE: - x = pLeft + (pWidth / 2) - (width / 2); - break; - case ALIGN_RIGHT: - x = pLeft + pWidth - width; - break; - } - return x + xoffset; -} - -/** - * Get the top position of the GuiElement. - * @see SetTop() - * @return Top position in pixel. - */ -int GuiElement::GetTop() -{ - int y = 0; - int pHeight = 0; - int pTop = 0; - - if (parentElement) - { - pHeight = parentElement->GetHeight(); - pTop = parentElement->GetTop(); - } - - if (effects & (EFFECT_SLIDE_IN | EFFECT_SLIDE_OUT | EFFECT_GOROUND | EFFECT_ROCK_VERTICLE)) pTop += yoffsetDyn; - - switch (alignmentVert) - { - case ALIGN_TOP: - y = pTop; - break; - case ALIGN_MIDDLE: - y = pTop + (pHeight / 2) - (height / 2); - break; - case ALIGN_BOTTOM: - y = pTop + pHeight - height; - break; - } - return y + yoffset; -} - -void GuiElement::SetMinX(int x) -{ - LOCK( this ); - xmin = x; -} - -int GuiElement::GetMinX() -{ - return xmin; -} - -void GuiElement::SetMaxX(int x) -{ - LOCK( this ); - xmax = x; -} - -int GuiElement::GetMaxX() -{ - return xmax; -} - -void GuiElement::SetMinY(int y) -{ - LOCK( this ); - ymin = y; -} - -int GuiElement::GetMinY() -{ - return ymin; -} - -void GuiElement::SetMaxY(int y) -{ - LOCK( this ); - ymax = y; -} - -int GuiElement::GetMaxY() -{ - return ymax; -} - -/** - * Get the width of the GuiElement. - * @see SetWidth() - * @return Width of the GuiElement. - */ -int GuiElement::GetWidth() -{ - return width; -} - -/** - * Get the height of the GuiElement. - * @see SetHeight() - * @return Height of the GuiElement. - */ -int GuiElement::GetHeight() -{ - return height; -} - -/** - * Set the width and height of the GuiElement. - * @param[in] Width Width in pixel. - * @param[in] Height Height in pixel. - * @see SetWidth() - * @see SetHeight() - */ -void GuiElement::SetSize(int w, int h) -{ - LOCK( this ); - - width = w; - height = h; -} - -/** - * Get visible. - * @see SetVisible() - * @return true if visible, false otherwise. - */ -bool GuiElement::IsVisible() -{ - return visible; -} - -/** - * Set visible. - * @param[in] Visible Set to true to show GuiElement. - * @see IsVisible() - */ -void GuiElement::SetVisible(bool v) -{ - LOCK( this ); - visible = v; -} - -void GuiElement::SetAlpha(int a) -{ - LOCK( this ); - alpha = a; -} - -int GuiElement::GetAlpha() -{ - int a; - - if (alphaDyn >= 0) - a = alphaDyn; - else a = alpha; - - if (parentElement) a *= parentElement->GetAlpha() / 255.0; - - return a; -} - -float GuiElement::GetAngleDyn() -{ - float a = 0.0; - - if (angleDyn) a = angleDyn; - - if (parentElement && !angleDyn) a = parentElement->GetAngleDyn(); - - return a; -} - -void GuiElement::SetScale(float s) -{ - LOCK( this ); - scale = s; -} - -float GuiElement::GetScale() -{ - float s = scale * scaleDyn; - - if (parentElement) s *= parentElement->GetScale(); - - return s; -} - -int GuiElement::GetState() -{ - return state; -} - -int GuiElement::GetStateChan() -{ - return stateChan; -} - -void GuiElement::SetState(int s, int c) -{ - LOCK( this ); - state = s; - stateChan = c; -} - -void GuiElement::ResetState() -{ - LOCK( this ); - if (state != STATE_DISABLED) - { - state = STATE_DEFAULT; - stateChan = -1; - } -} - -void GuiElement::SetClickable(bool c) -{ - LOCK( this ); - clickable = c; -} - -void GuiElement::SetSelectable(bool s) -{ - LOCK( this ); - selectable = s; -} - -void GuiElement::SetHoldable(bool d) -{ - LOCK( this ); - holdable = d; -} - -bool GuiElement::IsSelectable() -{ - if (state == STATE_DISABLED || state == STATE_CLICKED) - return false; - else return selectable; -} - -bool GuiElement::IsClickable() -{ - if (state == STATE_DISABLED || state == STATE_CLICKED || state == STATE_HELD) - return false; - else return clickable; -} - -bool GuiElement::IsHoldable() -{ - if (state == STATE_DISABLED) - return false; - else return holdable; -} - -void GuiElement::SetFocus(int f) -{ - LOCK( this ); - focus = f; -} - -int GuiElement::IsFocused() -{ - return focus; -} - -void GuiElement::SetTrigger(GuiTrigger * t) -{ - LOCK( this ); - if (!trigger[0]) - trigger[0] = t; - else if (!trigger[1]) - trigger[1] = t; - else if (!trigger[2]) - trigger[2] = t; - else if (!trigger[3]) - trigger[3] = t; - else if (!trigger[4]) - trigger[4] = t; - else if (!trigger[5]) - trigger[5] = t; - else // both were assigned, so we'll just overwrite the first one - trigger[0] = t; -} - -void GuiElement::SetTrigger(u8 i, GuiTrigger * t) -{ - LOCK( this ); - trigger[i] = t; -} - -void GuiElement::RemoveTrigger(u8 i) -{ - LOCK( this ); - trigger[i] = NULL; -} - -bool GuiElement::Rumble() -{ - return rumble; -} - -void GuiElement::SetRumble(bool r) -{ - LOCK( this ); - rumble = r; -} - -int GuiElement::GetEffect() -{ - LOCK( this ); - return effects; -} - -int GuiElement::GetEffectOnOver() -{ - LOCK( this ); - return effectsOver; -} - -float GuiElement::GetFrequency() -{ - LOCK( this ); - return frequency; -} - -void GuiElement::SetEffect(int eff, int speed, f32 circles, int r, f32 startdegree, f32 anglespeedset, int center_x, - int center_y) -{ - - if (eff & EFFECT_GOROUND) - { - xoffsetDyn = 0; //!position of circle in x - yoffsetDyn = 0; //!position of circle in y - Radius = r; //!radius of the circle - degree = startdegree; //!for example -90 (°) to start at top of circle - circleamount = circles; //!circleamoutn in degrees for example 360 for 1 circle - angleDyn = 0.0f; //!this is used by the code to calc the angle - anglespeed = anglespeedset; //!This is anglespeed depending on circle speed 1 is same speed and 0.5 half speed - temp_xoffset = center_x; //!position of center in x - temp_yoffset = center_y; //!position of center in y - } - effects |= eff; - effectAmount = speed; //!Circlespeed -} - -void GuiElement::SetEffect(int eff, int amount, int target) -{ - LOCK( this ); - if (eff & EFFECT_SLIDE_IN) - { - // these calculations overcompensate a little - if (eff & EFFECT_SLIDE_TOP) - yoffsetDyn = -screenheight; - else if (eff & EFFECT_SLIDE_LEFT) - xoffsetDyn = -screenwidth; - else if (eff & EFFECT_SLIDE_BOTTOM) - yoffsetDyn = screenheight; - else if (eff & EFFECT_SLIDE_RIGHT) xoffsetDyn = screenwidth; - } - - if (eff & EFFECT_FADE && amount > 0) - { - alphaDyn = 0; - } - else if (eff & EFFECT_FADE && amount < 0) - { - alphaDyn = alpha; - - } - else if (eff & EFFECT_ROCK_VERTICLE) - { - changervar = 0; - yoffsetDyn = 0; - yoffsetDynFloat = 0.0; - } - - effects |= eff; - effectAmount = amount; - effectTarget = target; -} - -void GuiElement::SetEffectOnOver(int eff, int amount, int target) -{ - LOCK( this ); - effectsOver |= eff; - effectAmountOver = amount; - effectTargetOver = target; -} - -void GuiElement::SetEffectGrow() -{ - SetEffectOnOver(EFFECT_SCALE, 4, 110); -} - -void GuiElement::StopEffect() -{ - xoffsetDyn = 0; - yoffsetDyn = 0; - effects = 0; - effectsOver = 0; - effectAmount = 0; - effectAmountOver = 0; - effectTarget = 0; - effectTargetOver = 0; - scaleDyn = 1; - frequency = 0.0f; - changervar = 0; - //angleDyn = 0.0f; - anglespeed = 0.0f; -} - -void GuiElement::UpdateEffects() -{ - LOCK( this ); - - if (effects & (EFFECT_SLIDE_IN | EFFECT_SLIDE_OUT | EFFECT_GOROUND)) - { - if (effects & EFFECT_SLIDE_IN) - { - if (effects & EFFECT_SLIDE_LEFT) - { - xoffsetDyn += effectAmount; - - if (xoffsetDyn >= 0) - { - xoffsetDyn = 0; - effects = 0; - } - } - else if (effects & EFFECT_SLIDE_RIGHT) - { - xoffsetDyn -= effectAmount; - - if (xoffsetDyn <= 0) - { - xoffsetDyn = 0; - effects = 0; - } - } - else if (effects & EFFECT_SLIDE_TOP) - { - yoffsetDyn += effectAmount; - - if (yoffsetDyn >= 0) - { - yoffsetDyn = 0; - effects = 0; - } - } - else if (effects & EFFECT_SLIDE_BOTTOM) - { - yoffsetDyn -= effectAmount; - - if (yoffsetDyn <= 0) - { - yoffsetDyn = 0; - effects = 0; - } - } - } - else - { - if (effects & EFFECT_SLIDE_LEFT) - { - xoffsetDyn -= effectAmount; - - if (xoffsetDyn <= -screenwidth) effects = 0; // shut off effect - } - else if (effects & EFFECT_SLIDE_RIGHT) - { - xoffsetDyn += effectAmount; - - if (xoffsetDyn >= screenwidth) effects = 0; // shut off effect - } - else if (effects & EFFECT_SLIDE_TOP) - { - yoffsetDyn -= effectAmount; - - if (yoffsetDyn <= -screenheight) effects = 0; // shut off effect - } - else if (effects & EFFECT_SLIDE_BOTTOM) - { - yoffsetDyn += effectAmount; - - if (yoffsetDyn >= screenheight) effects = 0; // shut off effect - } - } - } - - if (effects & EFFECT_GOROUND) - { - //!< check out gui.h for info - xoffset = temp_xoffset; - yoffset = temp_yoffset; - if (fabs(frequency) < circleamount) - { - angleDyn = (frequency + degree + 90.0f) * anglespeed; - xoffsetDyn = (int) lround(((f32) Radius) * cos((frequency + degree) * PI / 180.0f)); - yoffsetDyn = (int) lround(((f32) Radius) * sin((frequency + degree) * PI / 180.0f)); - frequency += ((f32) effectAmount) * 0.01f; - } - else - { - f32 temp_frequency = ((effectAmount < 0) ? -1.0f : 1.0f) * circleamount; - angleDyn = (temp_frequency + degree + 90.0f) * anglespeed; - xoffsetDyn = (int) lround(((f32) Radius) * cos((temp_frequency + degree) * PI / 180.0f)); - yoffsetDyn = (int) lround(((f32) Radius) * sin((temp_frequency + degree) * PI / 180.0f)); - xoffset += xoffsetDyn; - yoffset += yoffsetDyn; - effects ^= EFFECT_GOROUND; - frequency = 0.0f; - } - } - - if (effects & EFFECT_ROCK_VERTICLE) - { - //move up to 10pixel above 0 - if (changervar == 0 && yoffsetDynFloat < 11.0) - { - yoffsetDynFloat += (effectAmount * 0.01); - } - else if (yoffsetDynFloat > 10.0) - { - changervar = 1; - } - //move down till 10pixel under 0 - if (changervar == 1 && yoffsetDynFloat > -11.0) - { - yoffsetDynFloat -= (effectAmount * 0.01); - } - else if (yoffsetDynFloat < -10.0) - { - changervar = 0; - } - yoffsetDyn = (int) (yoffsetDynFloat); - } - - if (effects & EFFECT_FADE) - { - alphaDyn += effectAmount; - - if (effectAmount < 0 && alphaDyn <= 0) - { - alphaDyn = 0; - effects = 0; // shut off effect - } - else if (effectAmount > 0 && alphaDyn >= alpha) - { - alphaDyn = alpha; - effects = 0; // shut off effect - } - } - if (effects & EFFECT_SCALE) - { - scaleDyn += effectAmount / 100.0; - - if ((effectAmount < 0 && scaleDyn <= effectTarget / 100.0) || (effectAmount > 0 && scaleDyn >= effectTarget - / 100.0)) - { - scaleDyn = effectTarget / 100.0; - effects = 0; // shut off effect - } - } - if (effects & EFFECT_PULSE) - { - int percent = 10; //go down from target by this - - if ((scaleDyn <= (effectTarget * 0.01)) && (!changervar)) - { - scaleDyn += (effectAmount * 0.001); - } - else if (scaleDyn > (effectTarget * 0.01)) - { - changervar = 1; - } - if ((scaleDyn >= ((effectTarget - percent) * 0.01)) && (changervar)) - { - scaleDyn -= (effectAmount * 0.001); - } - else if (scaleDyn < ((effectTarget - percent) * 0.01)) - { - changervar = 0; - } - } -} - -void GuiElement::Update(GuiTrigger * t) -{ - LOCK( this ); - if (updateCB) updateCB(this); -} - -void GuiElement::SetUpdateCallback(UpdateCallback u) -{ - LOCK( this ); - updateCB = u; -} - -void GuiElement::SetPosition(int xoff, int yoff, int zoff) -{ - LOCK( this ); - xoffset = xoff; - yoffset = yoff; - zoffset = zoff; -} - -void GuiElement::SetAlignment(int hor, int vert) -{ - LOCK( this ); - alignmentHor = hor; - alignmentVert = vert; -} - -int GuiElement::GetSelected() -{ - return -1; -} - -/** - * Draw an element on screen. - */ -void GuiElement::Draw() -{ -} - -/** - * Draw Tooltips on screen. - */ -void GuiElement::DrawTooltip() -{ -} - -/** - * Check if a position is inside the GuiElement. - * @param[in] x X position in pixel. - * @param[in] y Y position in pixel. - */ -bool GuiElement::IsInside(int x, int y) -{ - if (x > this->GetLeft() && x < (this->GetLeft() + width) && y > this->GetTop() && y < (this->GetTop() + height)) return true; - return false; -} -void GuiElement::Lock() -{ - // LWP_MutexLock(mutex); - for (;;) // loop while element is locked by self - { - LWP_MutexLock(_lock_mutex); - - if (_lock_thread == LWP_THREAD_NULL) // element is not locked - { - _lock_thread = LWP_GetSelf(); // mark as locked - _lock_count = 1; // set count of lock to 1 - LWP_MutexUnlock(_lock_mutex); - return; - } - else if (_lock_thread == LWP_GetSelf()) // thread is locked by my self - { - _lock_count++; // inc count of locks; - LWP_MutexUnlock(_lock_mutex); - return; - } - else // otherwise the element is locked by an other thread - { - if (_lock_queue == LWP_TQUEUE_NULL) // no queue - meens it is the first access to the locked element - LWP_InitQueue(&_lock_queue); // init queue - LWP_MutexUnlock(_lock_mutex); - LWP_ThreadSleep(_lock_queue); // and sleep - // try lock again; - } - } -} -void GuiElement::Unlock() -{ - // LWP_MutexUnlock(mutex); - LWP_MutexLock(_lock_mutex); - // only the thread was locked this element, can call unlock - if (_lock_thread == LWP_GetSelf()) // but we check it here – safe is safe - { - if (--_lock_count == 0) // dec count of locks and check if it last lock; - { - _lock_thread = LWP_THREAD_NULL; // mark as unlocked - if (_lock_queue != LWP_TQUEUE_NULL) // has a queue - { - LWP_CloseQueue(_lock_queue); // close the queue and wake all waited threads - _lock_queue = LWP_TQUEUE_NULL; - } - } - } - LWP_MutexUnlock(_lock_mutex); -} - -SimpleLock::SimpleLock(GuiElement *e) : - element(e) -{ - element->Lock(); -} -SimpleLock::~SimpleLock() -{ - element->Unlock(); -} +/**************************************************************************** + * libwiigui + * + * Tantric 2009 + * + * gui_element.cpp + * + * GUI class definitions + ***************************************************************************/ + +#include "gui.h" + +/** + * Constructor for the Object class. + */ +//mutex_t GuiElement::mutex = LWP_MUTEX_NULL; +mutex_t GuiElement::_lock_mutex = LWP_MUTEX_NULL; +GuiElement::GuiElement() +{ + xoffset = 0; + yoffset = 0; + zoffset = 0; + xmin = 0; + xmax = 0; + ymin = 0; + ymax = 0; + width = 0; + height = 0; + alpha = 255; + scale = 1; + state = STATE_DEFAULT; + stateChan = -1; + trigger[0] = NULL; + trigger[1] = NULL; + trigger[2] = NULL; + trigger[3] = NULL; + trigger[4] = NULL; + trigger[5] = NULL; + parentElement = NULL; + rumble = true; + selectable = false; + clickable = false; + holdable = false; + visible = true; + focus = -1; // cannot be focused + updateCB = NULL; + yoffsetDyn = 0; + xoffsetDyn = 0; + yoffsetDynFloat = 0; + alphaDyn = -1; + scaleDyn = 1; + effects = 0; + effectAmount = 0; + effectTarget = 0; + effectsOver = 0; + effectAmountOver = 0; + effectTargetOver = 0; + frequency = 0.0f; + changervar = 0; + degree = -90.0f; + circleamount = 360.0f; + Radius = 150; + angleDyn = 0.0f; + anglespeed = 0.0f; + + // default alignment - align to top left + alignmentVert = ALIGN_TOP; + alignmentHor = ALIGN_LEFT; + // if(mutex == LWP_MUTEX_NULL) LWP_MutexInit(&mutex, true); + if (_lock_mutex == LWP_MUTEX_NULL) LWP_MutexInit(&_lock_mutex, true); + _lock_thread = LWP_THREAD_NULL; + _lock_count = 0; + _lock_queue = LWP_TQUEUE_NULL; + +} + +/** + * Destructor for the GuiElement class. + */ +GuiElement::~GuiElement() +{ + // LWP_MutexDestroy(mutex); +} + +void GuiElement::SetParent(GuiElement * e) +{ + LOCK( this ); + parentElement = e; +} + +GuiElement * GuiElement::GetParent() +{ + return parentElement; +} +/** + * Get the left position of the GuiElement. + * @see SetLeft() + * @return Left position in pixel. + */ +int GuiElement::GetLeft() +{ + int x = 0; + int pWidth = 0; + int pLeft = 0; + + if (parentElement) + { + pWidth = parentElement->GetWidth(); + pLeft = parentElement->GetLeft(); + } + + if (effects & (EFFECT_SLIDE_IN | EFFECT_SLIDE_OUT | EFFECT_GOROUND | EFFECT_ROCK_VERTICLE)) pLeft += xoffsetDyn; + + switch (alignmentHor) + { + case ALIGN_LEFT: + x = pLeft; + break; + case ALIGN_CENTRE: + x = pLeft + (pWidth / 2) - (width / 2); + break; + case ALIGN_RIGHT: + x = pLeft + pWidth - width; + break; + } + return x + xoffset; +} + +/** + * Get the top position of the GuiElement. + * @see SetTop() + * @return Top position in pixel. + */ +int GuiElement::GetTop() +{ + int y = 0; + int pHeight = 0; + int pTop = 0; + + if (parentElement) + { + pHeight = parentElement->GetHeight(); + pTop = parentElement->GetTop(); + } + + if (effects & (EFFECT_SLIDE_IN | EFFECT_SLIDE_OUT | EFFECT_GOROUND | EFFECT_ROCK_VERTICLE)) pTop += yoffsetDyn; + + switch (alignmentVert) + { + case ALIGN_TOP: + y = pTop; + break; + case ALIGN_MIDDLE: + y = pTop + (pHeight / 2) - (height / 2); + break; + case ALIGN_BOTTOM: + y = pTop + pHeight - height; + break; + } + return y + yoffset; +} + +void GuiElement::SetMinX(int x) +{ + LOCK( this ); + xmin = x; +} + +int GuiElement::GetMinX() +{ + return xmin; +} + +void GuiElement::SetMaxX(int x) +{ + LOCK( this ); + xmax = x; +} + +int GuiElement::GetMaxX() +{ + return xmax; +} + +void GuiElement::SetMinY(int y) +{ + LOCK( this ); + ymin = y; +} + +int GuiElement::GetMinY() +{ + return ymin; +} + +void GuiElement::SetMaxY(int y) +{ + LOCK( this ); + ymax = y; +} + +int GuiElement::GetMaxY() +{ + return ymax; +} + +/** + * Get the width of the GuiElement. + * @see SetWidth() + * @return Width of the GuiElement. + */ +int GuiElement::GetWidth() +{ + return width; +} + +/** + * Get the height of the GuiElement. + * @see SetHeight() + * @return Height of the GuiElement. + */ +int GuiElement::GetHeight() +{ + return height; +} + +/** + * Set the width and height of the GuiElement. + * @param[in] Width Width in pixel. + * @param[in] Height Height in pixel. + * @see SetWidth() + * @see SetHeight() + */ +void GuiElement::SetSize(int w, int h) +{ + LOCK( this ); + + width = w; + height = h; +} + +/** + * Get visible. + * @see SetVisible() + * @return true if visible, false otherwise. + */ +bool GuiElement::IsVisible() +{ + return visible; +} + +/** + * Set visible. + * @param[in] Visible Set to true to show GuiElement. + * @see IsVisible() + */ +void GuiElement::SetVisible(bool v) +{ + LOCK( this ); + visible = v; +} + +void GuiElement::SetAlpha(int a) +{ + LOCK( this ); + alpha = a; +} + +int GuiElement::GetAlpha() +{ + int a; + + if (alphaDyn >= 0) + a = alphaDyn; + else a = alpha; + + if (parentElement) a *= parentElement->GetAlpha() / 255.0; + + return a; +} + +float GuiElement::GetAngleDyn() +{ + float a = 0.0; + + if (angleDyn) a = angleDyn; + + if (parentElement && !angleDyn) a = parentElement->GetAngleDyn(); + + return a; +} + +void GuiElement::SetScale(float s) +{ + LOCK( this ); + scale = s; +} + +float GuiElement::GetScale() +{ + float s = scale * scaleDyn; + + if (parentElement) s *= parentElement->GetScale(); + + return s; +} + +int GuiElement::GetState() +{ + return state; +} + +int GuiElement::GetStateChan() +{ + return stateChan; +} + +void GuiElement::SetState(int s, int c) +{ + LOCK( this ); + state = s; + stateChan = c; +} + +void GuiElement::ResetState() +{ + LOCK( this ); + if (state != STATE_DISABLED) + { + state = STATE_DEFAULT; + stateChan = -1; + } +} + +void GuiElement::SetClickable(bool c) +{ + LOCK( this ); + clickable = c; +} + +void GuiElement::SetSelectable(bool s) +{ + LOCK( this ); + selectable = s; +} + +void GuiElement::SetHoldable(bool d) +{ + LOCK( this ); + holdable = d; +} + +bool GuiElement::IsSelectable() +{ + if (state == STATE_DISABLED || state == STATE_CLICKED) + return false; + else return selectable; +} + +bool GuiElement::IsClickable() +{ + if (state == STATE_DISABLED || state == STATE_CLICKED || state == STATE_HELD) + return false; + else return clickable; +} + +bool GuiElement::IsHoldable() +{ + if (state == STATE_DISABLED) + return false; + else return holdable; +} + +void GuiElement::SetFocus(int f) +{ + LOCK( this ); + focus = f; +} + +int GuiElement::IsFocused() +{ + return focus; +} + +void GuiElement::SetTrigger(GuiTrigger * t) +{ + LOCK( this ); + if (!trigger[0]) + trigger[0] = t; + else if (!trigger[1]) + trigger[1] = t; + else if (!trigger[2]) + trigger[2] = t; + else if (!trigger[3]) + trigger[3] = t; + else if (!trigger[4]) + trigger[4] = t; + else if (!trigger[5]) + trigger[5] = t; + else // both were assigned, so we'll just overwrite the first one + trigger[0] = t; +} + +void GuiElement::SetTrigger(u8 i, GuiTrigger * t) +{ + LOCK( this ); + trigger[i] = t; +} + +void GuiElement::RemoveTrigger(u8 i) +{ + LOCK( this ); + trigger[i] = NULL; +} + +bool GuiElement::Rumble() +{ + return rumble; +} + +void GuiElement::SetRumble(bool r) +{ + LOCK( this ); + rumble = r; +} + +int GuiElement::GetEffect() +{ + LOCK( this ); + return effects; +} + +int GuiElement::GetEffectOnOver() +{ + LOCK( this ); + return effectsOver; +} + +float GuiElement::GetFrequency() +{ + LOCK( this ); + return frequency; +} + +void GuiElement::SetEffect(int eff, int speed, f32 circles, int r, f32 startdegree, f32 anglespeedset, int center_x, + int center_y) +{ + + if (eff & EFFECT_GOROUND) + { + xoffsetDyn = 0; //!position of circle in x + yoffsetDyn = 0; //!position of circle in y + Radius = r; //!radius of the circle + degree = startdegree; //!for example -90 (°) to start at top of circle + circleamount = circles; //!circleamoutn in degrees for example 360 for 1 circle + angleDyn = 0.0f; //!this is used by the code to calc the angle + anglespeed = anglespeedset; //!This is anglespeed depending on circle speed 1 is same speed and 0.5 half speed + temp_xoffset = center_x; //!position of center in x + temp_yoffset = center_y; //!position of center in y + } + effects |= eff; + effectAmount = speed; //!Circlespeed +} + +void GuiElement::SetEffect(int eff, int amount, int target) +{ + LOCK( this ); + if (eff & EFFECT_SLIDE_IN) + { + // these calculations overcompensate a little + if (eff & EFFECT_SLIDE_TOP) + yoffsetDyn = -screenheight; + else if (eff & EFFECT_SLIDE_LEFT) + xoffsetDyn = -screenwidth; + else if (eff & EFFECT_SLIDE_BOTTOM) + yoffsetDyn = screenheight; + else if (eff & EFFECT_SLIDE_RIGHT) xoffsetDyn = screenwidth; + } + + if (eff & EFFECT_FADE && amount > 0) + { + alphaDyn = 0; + } + else if (eff & EFFECT_FADE && amount < 0) + { + alphaDyn = alpha; + + } + else if (eff & EFFECT_ROCK_VERTICLE) + { + changervar = 0; + yoffsetDyn = 0; + yoffsetDynFloat = 0.0; + } + + effects |= eff; + effectAmount = amount; + effectTarget = target; +} + +void GuiElement::SetEffectOnOver(int eff, int amount, int target) +{ + LOCK( this ); + effectsOver |= eff; + effectAmountOver = amount; + effectTargetOver = target; +} + +void GuiElement::SetEffectGrow() +{ + SetEffectOnOver(EFFECT_SCALE, 4, 110); +} + +void GuiElement::StopEffect() +{ + xoffsetDyn = 0; + yoffsetDyn = 0; + effects = 0; + effectsOver = 0; + effectAmount = 0; + effectAmountOver = 0; + effectTarget = 0; + effectTargetOver = 0; + scaleDyn = 1; + frequency = 0.0f; + changervar = 0; + //angleDyn = 0.0f; + anglespeed = 0.0f; +} + +void GuiElement::UpdateEffects() +{ + LOCK( this ); + + if (effects & (EFFECT_SLIDE_IN | EFFECT_SLIDE_OUT | EFFECT_GOROUND)) + { + if (effects & EFFECT_SLIDE_IN) + { + if (effects & EFFECT_SLIDE_LEFT) + { + xoffsetDyn += effectAmount; + + if (xoffsetDyn >= 0) + { + xoffsetDyn = 0; + effects = 0; + } + } + else if (effects & EFFECT_SLIDE_RIGHT) + { + xoffsetDyn -= effectAmount; + + if (xoffsetDyn <= 0) + { + xoffsetDyn = 0; + effects = 0; + } + } + else if (effects & EFFECT_SLIDE_TOP) + { + yoffsetDyn += effectAmount; + + if (yoffsetDyn >= 0) + { + yoffsetDyn = 0; + effects = 0; + } + } + else if (effects & EFFECT_SLIDE_BOTTOM) + { + yoffsetDyn -= effectAmount; + + if (yoffsetDyn <= 0) + { + yoffsetDyn = 0; + effects = 0; + } + } + } + else + { + if (effects & EFFECT_SLIDE_LEFT) + { + xoffsetDyn -= effectAmount; + + if (xoffsetDyn <= -screenwidth) effects = 0; // shut off effect + } + else if (effects & EFFECT_SLIDE_RIGHT) + { + xoffsetDyn += effectAmount; + + if (xoffsetDyn >= screenwidth) effects = 0; // shut off effect + } + else if (effects & EFFECT_SLIDE_TOP) + { + yoffsetDyn -= effectAmount; + + if (yoffsetDyn <= -screenheight) effects = 0; // shut off effect + } + else if (effects & EFFECT_SLIDE_BOTTOM) + { + yoffsetDyn += effectAmount; + + if (yoffsetDyn >= screenheight) effects = 0; // shut off effect + } + } + } + + if (effects & EFFECT_GOROUND) + { + //!< check out gui.h for info + xoffset = temp_xoffset; + yoffset = temp_yoffset; + if (fabs(frequency) < circleamount) + { + angleDyn = (frequency + degree + 90.0f) * anglespeed; + xoffsetDyn = (int) lround(((f32) Radius) * cos((frequency + degree) * PI / 180.0f)); + yoffsetDyn = (int) lround(((f32) Radius) * sin((frequency + degree) * PI / 180.0f)); + frequency += ((f32) effectAmount) * 0.01f; + } + else + { + f32 temp_frequency = ((effectAmount < 0) ? -1.0f : 1.0f) * circleamount; + angleDyn = (temp_frequency + degree + 90.0f) * anglespeed; + xoffsetDyn = (int) lround(((f32) Radius) * cos((temp_frequency + degree) * PI / 180.0f)); + yoffsetDyn = (int) lround(((f32) Radius) * sin((temp_frequency + degree) * PI / 180.0f)); + xoffset += xoffsetDyn; + yoffset += yoffsetDyn; + effects ^= EFFECT_GOROUND; + frequency = 0.0f; + } + } + + if (effects & EFFECT_ROCK_VERTICLE) + { + //move up to 10pixel above 0 + if (changervar == 0 && yoffsetDynFloat < 11.0) + { + yoffsetDynFloat += (effectAmount * 0.01); + } + else if (yoffsetDynFloat > 10.0) + { + changervar = 1; + } + //move down till 10pixel under 0 + if (changervar == 1 && yoffsetDynFloat > -11.0) + { + yoffsetDynFloat -= (effectAmount * 0.01); + } + else if (yoffsetDynFloat < -10.0) + { + changervar = 0; + } + yoffsetDyn = (int) (yoffsetDynFloat); + } + + if (effects & EFFECT_FADE) + { + alphaDyn += effectAmount; + + if (effectAmount < 0 && alphaDyn <= 0) + { + alphaDyn = 0; + effects = 0; // shut off effect + } + else if (effectAmount > 0 && alphaDyn >= alpha) + { + alphaDyn = alpha; + effects = 0; // shut off effect + } + } + if (effects & EFFECT_SCALE) + { + scaleDyn += effectAmount / 100.0; + + if ((effectAmount < 0 && scaleDyn <= effectTarget / 100.0) || (effectAmount > 0 && scaleDyn >= effectTarget + / 100.0)) + { + scaleDyn = effectTarget / 100.0; + effects = 0; // shut off effect + } + } + if (effects & EFFECT_PULSE) + { + int percent = 10; //go down from target by this + + if ((scaleDyn <= (effectTarget * 0.01)) && (!changervar)) + { + scaleDyn += (effectAmount * 0.001); + } + else if (scaleDyn > (effectTarget * 0.01)) + { + changervar = 1; + } + if ((scaleDyn >= ((effectTarget - percent) * 0.01)) && (changervar)) + { + scaleDyn -= (effectAmount * 0.001); + } + else if (scaleDyn < ((effectTarget - percent) * 0.01)) + { + changervar = 0; + } + } +} + +void GuiElement::Update(GuiTrigger * t) +{ + LOCK( this ); + if (updateCB) updateCB(this); +} + +void GuiElement::SetUpdateCallback(UpdateCallback u) +{ + LOCK( this ); + updateCB = u; +} + +void GuiElement::SetPosition(int xoff, int yoff, int zoff) +{ + LOCK( this ); + xoffset = xoff; + yoffset = yoff; + zoffset = zoff; +} + +void GuiElement::SetAlignment(int hor, int vert) +{ + LOCK( this ); + alignmentHor = hor; + alignmentVert = vert; +} + +int GuiElement::GetSelected() +{ + return -1; +} + +/** + * Draw an element on screen. + */ +void GuiElement::Draw() +{ +} + +/** + * Draw Tooltips on screen. + */ +void GuiElement::DrawTooltip() +{ +} + +/** + * Check if a position is inside the GuiElement. + * @param[in] x X position in pixel. + * @param[in] y Y position in pixel. + */ +bool GuiElement::IsInside(int x, int y) +{ + if (x > this->GetLeft() && x < (this->GetLeft() + width) && y > this->GetTop() && y < (this->GetTop() + height)) return true; + return false; +} +void GuiElement::Lock() +{ + // LWP_MutexLock(mutex); + for (;;) // loop while element is locked by self + { + LWP_MutexLock(_lock_mutex); + + if (_lock_thread == LWP_THREAD_NULL) // element is not locked + { + _lock_thread = LWP_GetSelf(); // mark as locked + _lock_count = 1; // set count of lock to 1 + LWP_MutexUnlock(_lock_mutex); + return; + } + else if (_lock_thread == LWP_GetSelf()) // thread is locked by my self + { + _lock_count++; // inc count of locks; + LWP_MutexUnlock(_lock_mutex); + return; + } + else // otherwise the element is locked by an other thread + { + if (_lock_queue == LWP_TQUEUE_NULL) // no queue - meens it is the first access to the locked element + LWP_InitQueue(&_lock_queue); // init queue + LWP_MutexUnlock(_lock_mutex); + LWP_ThreadSleep(_lock_queue); // and sleep + // try lock again; + } + } +} +void GuiElement::Unlock() +{ + // LWP_MutexUnlock(mutex); + LWP_MutexLock(_lock_mutex); + // only the thread was locked this element, can call unlock + if (_lock_thread == LWP_GetSelf()) // but we check it here – safe is safe + { + if (--_lock_count == 0) // dec count of locks and check if it last lock; + { + _lock_thread = LWP_THREAD_NULL; // mark as unlocked + if (_lock_queue != LWP_TQUEUE_NULL) // has a queue + { + LWP_CloseQueue(_lock_queue); // close the queue and wake all waited threads + _lock_queue = LWP_TQUEUE_NULL; + } + } + } + LWP_MutexUnlock(_lock_mutex); +} + +SimpleLock::SimpleLock(GuiElement *e) : + element(e) +{ + element->Lock(); +} +SimpleLock::~SimpleLock() +{ + element->Unlock(); +} diff --git a/source/libwiigui/gui_gamebrowser.cpp b/source/libwiigui/gui_gamebrowser.cpp index f6320859..b8cb48cd 100644 --- a/source/libwiigui/gui_gamebrowser.cpp +++ b/source/libwiigui/gui_gamebrowser.cpp @@ -27,15 +27,15 @@ int txtscroll = 0; /** * Constructor for the GuiGameBrowser class. */ -GuiGameBrowser::GuiGameBrowser(int w, int h, int selected, int offset) +GuiGameBrowser::GuiGameBrowser(int w, int h, int selectedGame) { width = w; height = h; pagesize = Theme.pagesize; scrollbaron = (gameList.size() > pagesize) ? 1 : 0; selectable = true; - listOffset = MAX( 0, MIN( offset, ( gameList.size() - pagesize ) ) ); - selectedItem = selected - offset; + listOffset = selectedGame - (selectedGame % pagesize); + selectedItem = selectedGame - listOffset; focus = 1; // allow focus trigA = new GuiTrigger; diff --git a/source/libwiigui/gui_gamebrowser.h b/source/libwiigui/gui_gamebrowser.h index 3918f239..f685033a 100644 --- a/source/libwiigui/gui_gamebrowser.h +++ b/source/libwiigui/gui_gamebrowser.h @@ -7,7 +7,7 @@ class GuiGameBrowser: public GuiElement { public: - GuiGameBrowser(int w, int h, int selected = 0, int offset = 0); + GuiGameBrowser(int w, int h, int selectedGame = 0); ~GuiGameBrowser(); int FindMenuItem(int c, int d); int GetClickedOption(); diff --git a/source/libwiigui/gui_gamecarousel.cpp b/source/libwiigui/gui_gamecarousel.cpp index 2c2db0cc..bd8e5ca8 100644 --- a/source/libwiigui/gui_gamecarousel.cpp +++ b/source/libwiigui/gui_gamecarousel.cpp @@ -45,13 +45,13 @@ static GuiImageData *GameCarouselLoadCoverImage(void * Arg) /** * Constructor for the GuiGameCarousel class. */ -GuiGameCarousel::GuiGameCarousel(int w, int h, const char *themePath, const u8 *imagebg, int imagebgsize, int selected, int offset) : +GuiGameCarousel::GuiGameCarousel(int w, int h, const char *themePath, const u8 *imagebg, int imagebgsize, int selectedGame) : noCover(nocover_png, nocover_png_size) { width = w; height = h; pagesize = (gameList.size() < 11) ? gameList.size() : 11; - listOffset = 0; + listOffset = (selectedGame >= 0 && selectedGame < gameList.size()) ? selectedGame : 0; selectable = true; selectedItem = -1; focus = 1; // allow focus diff --git a/source/libwiigui/gui_gamecarousel.h b/source/libwiigui/gui_gamecarousel.h index ae654ac5..8f8320e3 100644 --- a/source/libwiigui/gui_gamecarousel.h +++ b/source/libwiigui/gui_gamecarousel.h @@ -7,7 +7,7 @@ class GuiImageAsync; class GuiGameCarousel: public GuiElement { public: - GuiGameCarousel(int w, int h, const char *themePath, const u8 *imagebg, int imagebgsize, int selected = 0, int offset = 0); + GuiGameCarousel(int w, int h, const char *themePath, const u8 *imagebg, int imagebgsize, int selectedGame = 0); ~GuiGameCarousel(); int FindMenuItem(int c, int d); int GetClickedOption(); diff --git a/source/libwiigui/gui_gamegrid.cpp b/source/libwiigui/gui_gamegrid.cpp index c4c33f2c..b85dbeda 100644 --- a/source/libwiigui/gui_gamegrid.cpp +++ b/source/libwiigui/gui_gamegrid.cpp @@ -201,7 +201,7 @@ static GuiImageData *GameGridLoadCoverImage(void * Arg) /** * Constructor for the GuiGamegrid class. */ -GuiGameGrid::GuiGameGrid(int w, int h, const char *themePath, const u8 *imagebg, int selected, int offset) : +GuiGameGrid::GuiGameGrid(int w, int h, const char *themePath, const u8 *imagebg, int selectedGame) : noCover(nocoverFlat_png, nocoverFlat_png_size) { width = w; diff --git a/source/libwiigui/gui_gamegrid.h b/source/libwiigui/gui_gamegrid.h index 86a0cc9b..4279a0bc 100644 --- a/source/libwiigui/gui_gamegrid.h +++ b/source/libwiigui/gui_gamegrid.h @@ -7,7 +7,7 @@ class GuiImageAsync; class GuiGameGrid: public GuiElement { public: - GuiGameGrid(int w, int h, const char *themePath, const u8 *imagebg, int selected = 0, int offset = 0); + GuiGameGrid(int w, int h, const char *themePath, const u8 *imagebg, int selectedGame = 0); ~GuiGameGrid(); int FindMenuItem(int c, int d); int GetClickedOption(); diff --git a/source/libwiigui/gui_numpad.cpp b/source/libwiigui/gui_numpad.cpp index a6596376..5e770305 100644 --- a/source/libwiigui/gui_numpad.cpp +++ b/source/libwiigui/gui_numpad.cpp @@ -61,8 +61,7 @@ GuiNumpad::GuiNumpad(char * t, u32 max) keyBackText = new GuiText("Back", 20, ( GXColor ) { 0, 0, 0, 0xff}); - keyBack = new GuiButton(keyBackImg, keyBackOverImg, ALIGN_CENTRE, ALIGN_MIDDLE, 90, 80, trigA, keySoundOver, - keySoundClick, 1); + keyBack = new GuiButton(keyBackImg, keyBackOverImg, ALIGN_CENTRE, ALIGN_MIDDLE, 90, 80, trigA, btnSoundOver, btnSoundClick, 1); keyBack->SetLabel(keyBackText); keyBack->SetTrigger(trigB); this->Append(keyBack); @@ -71,8 +70,7 @@ GuiNumpad::GuiNumpad(char * t, u32 max) keyClearOverImg = new GuiImage(keyMediumOver); keyClearText = new GuiText("Clear", 20, ( GXColor ) { 0, 0, 0, 0xff}); - keyClear = new GuiButton(keyClearImg, keyClearOverImg, ALIGN_CENTRE, ALIGN_MIDDLE, -90, 80, trigA, keySoundOver, - keySoundClick, 1); + keyClear = new GuiButton(keyClearImg, keyClearOverImg, ALIGN_CENTRE, ALIGN_MIDDLE, -90, 80, trigA, btnSoundOver, btnSoundClick, 1); keyClear->SetLabel(keyClearText); this->Append(keyClear); @@ -92,7 +90,7 @@ GuiNumpad::GuiNumpad(char * t, u32 max) keyTxt[i]->SetAlignment(ALIGN_CENTRE, ALIGN_BOTTOM); keyTxt[i]->SetPosition(0, -10); keyBtn[i] = new GuiButton(keyImg[i], keyImgOver[i], ALIGN_CENTRE, ALIGN_MIDDLE, -90 + 90 * col, -70 + 50 - * row, trigA, keySoundOver, keySoundClick, 1); + * row, trigA, btnSoundOver, btnSoundClick, 1); keyBtn[i]->SetLabel(keyTxt[i]); this->Append(keyBtn[i]); diff --git a/source/libwiigui/gui_searchbar.h b/source/libwiigui/gui_searchbar.h index 23bbb82e..32d953f8 100644 --- a/source/libwiigui/gui_searchbar.h +++ b/source/libwiigui/gui_searchbar.h @@ -1,3 +1,5 @@ +#ifndef GUI_SEARCHBAR_H_ +#define GUI_SEARCHBAR_H_ #include "gui.h" class cSearchButton; @@ -32,3 +34,5 @@ class GuiSearchBar: public GuiWindow GuiTrigger trig; }; + +#endif \ No newline at end of file diff --git a/source/lstub.cpp b/source/lstub.cpp index 1b65b417..5047e27f 100644 --- a/source/lstub.cpp +++ b/source/lstub.cpp @@ -1,100 +1,100 @@ -//functions for manipulating the HBC stub by giantpune - -#include -#include -#include -#include - -#include "lstub.h" -#include "filelist.h" -#include "gecko.h" - -#include "wad/nandtitle.h" - -static char* determineStubTIDLocation() -{ - u32 *stubID = (u32*) 0x80001818; - - //HBC stub 1.0.6 and lower, and stub.bin - if (stubID[0] == 0x480004c1 && stubID[1] == 0x480004f5) - return (char *) 0x800024C6; - - //HBC stub changed @ version 1.0.7. this file was last updated for HBC 1.0.8 - else if (stubID[0] == 0x48000859 && stubID[1] == 0x4800088d) return (char *) 0x8000286A; - - //hexdump( stubID, 0x20 ); - return NULL; - -} - -s32 Set_Stub(u64 reqID) -{ - if (NandTitles.IndexOf(reqID) < 0) return WII_EINSTALL; - - char *stub = determineStubTIDLocation(); - if (!stub) return -68; - - stub[0] = TITLE_7( reqID ); - stub[1] = TITLE_6( reqID ); - stub[8] = TITLE_5( reqID ); - stub[9] = TITLE_4( reqID ); - stub[4] = TITLE_3( reqID ); - stub[5] = TITLE_2( reqID ); - stub[12] = TITLE_1( reqID ); - stub[13] = ((u8) (reqID)); - - DCFlushRange(stub, 0x10); - - return 1; - -} - -s32 Set_Stub_Split(u32 type, const char* reqID) -{ - char tmp[4]; - u32 lower; - sprintf(tmp, "%c%c%c%c", reqID[0], reqID[1], reqID[2], reqID[3]); - memcpy(&lower, tmp, 4); - u64 reqID64 = TITLE_ID( type, lower ); - return Set_Stub(reqID64); - -} - -void loadStub() -{ - char *stubLoc = (char *) 0x80001800; - memcpy(stubLoc, stub_bin, stub_bin_size); - DCFlushRange(stubLoc, stub_bin_size); -} - -u64 getStubDest() -{ - if (!hbcStubAvailable()) return 0; - - char ret[8]; - u64 retu = 0; - - char *stub = determineStubTIDLocation(); - if (!stub) return 0; - - ret[0] = stub[0]; - ret[1] = stub[1]; - ret[2] = stub[8]; - ret[3] = stub[9]; - ret[4] = stub[4]; - ret[5] = stub[5]; - ret[6] = stub[12]; - ret[7] = stub[13]; - - memcpy(&retu, ret, 8); - - return retu; -} - -u8 hbcStubAvailable() -{ - char * sig = (char *) 0x80001804; - return (sig[0] == 'S' && sig[1] == 'T' && sig[2] == 'U' && sig[3] == 'B' && sig[4] == 'H' && sig[5] == 'A' - && sig[6] == 'X' && sig[7] == 'X') ? 1 : 0; -} - +//functions for manipulating the HBC stub by giantpune + +#include +#include +#include +#include + +#include "lstub.h" +#include "filelist.h" +#include "gecko.h" + +#include "wad/nandtitle.h" + +static char* determineStubTIDLocation() +{ + u32 *stubID = (u32*) 0x80001818; + + //HBC stub 1.0.6 and lower, and stub.bin + if (stubID[0] == 0x480004c1 && stubID[1] == 0x480004f5) + return (char *) 0x800024C6; + + //HBC stub changed @ version 1.0.7. this file was last updated for HBC 1.0.8 + else if (stubID[0] == 0x48000859 && stubID[1] == 0x4800088d) return (char *) 0x8000286A; + + //hexdump( stubID, 0x20 ); + return NULL; + +} + +s32 Set_Stub(u64 reqID) +{ + if (NandTitles.IndexOf(reqID) < 0) return WII_EINSTALL; + + char *stub = determineStubTIDLocation(); + if (!stub) return -68; + + stub[0] = TITLE_7( reqID ); + stub[1] = TITLE_6( reqID ); + stub[8] = TITLE_5( reqID ); + stub[9] = TITLE_4( reqID ); + stub[4] = TITLE_3( reqID ); + stub[5] = TITLE_2( reqID ); + stub[12] = TITLE_1( reqID ); + stub[13] = ((u8) (reqID)); + + DCFlushRange(stub, 0x10); + + return 1; + +} + +s32 Set_Stub_Split(u32 type, const char* reqID) +{ + char tmp[4]; + u32 lower; + sprintf(tmp, "%c%c%c%c", reqID[0], reqID[1], reqID[2], reqID[3]); + memcpy(&lower, tmp, 4); + u64 reqID64 = TITLE_ID( type, lower ); + return Set_Stub(reqID64); + +} + +void loadStub() +{ + char *stubLoc = (char *) 0x80001800; + memcpy(stubLoc, stub_bin, stub_bin_size); + DCFlushRange(stubLoc, stub_bin_size); +} + +u64 getStubDest() +{ + if (!hbcStubAvailable()) return 0; + + char ret[8]; + u64 retu = 0; + + char *stub = determineStubTIDLocation(); + if (!stub) return 0; + + ret[0] = stub[0]; + ret[1] = stub[1]; + ret[2] = stub[8]; + ret[3] = stub[9]; + ret[4] = stub[4]; + ret[5] = stub[5]; + ret[6] = stub[12]; + ret[7] = stub[13]; + + memcpy(&retu, ret, 8); + + return retu; +} + +u8 hbcStubAvailable() +{ + char * sig = (char *) 0x80001804; + return (sig[0] == 'S' && sig[1] == 'T' && sig[2] == 'U' && sig[3] == 'B' && sig[4] == 'H' && sig[5] == 'A' + && sig[6] == 'X' && sig[7] == 'X') ? 1 : 0; +} + diff --git a/source/memory/memory.h b/source/memory/memory.h index f86f16cf..84250b91 100644 --- a/source/memory/memory.h +++ b/source/memory/memory.h @@ -1,36 +1,36 @@ -#ifndef __MEMORY_H_ -#define __MEMORY_H_ - -#ifdef __cplusplus -extern "C" -{ -#endif - -#define Disc_ID ((u32*) 0x80000000) -#define Disc_Region ((u32*) 0x80000003) -#define Disc_Magic ((u32*) 0x80000018) -#define Sys_Magic ((u32*) 0x80000020) -#define Version ((u32*) 0x80000024) -#define Mem_Size ((u32*) 0x80000028) -#define Board_Model ((u32*) 0x8000002C) -#define Arena_L ((u32*) 0x80000030) -#define Arena_H ((u32*) 0x80000034) -#define FST ((u32*) 0x80000038) -#define Max_FST ((u32*) 0x8000003C) -#define Assembler ((u32*) 0x80000060) -#define Video_Mode ((u32*) 0x800000CC) -#define Dev_Debugger ((u32*) 0x800000EC) -#define Simulated_Mem ((u32*) 0x800000F0) -#define BI2 ((u32*) 0x800000F4) -#define Bus_Speed ((u32*) 0x800000F8) -#define CPU_Speed ((u32*) 0x800000FC) -#define Online_Check ((u32*) 0x80003180) -#define GameID_Address ((u32*) 0x80003184) - -#define allocate_memory(size) memalign(32, (size+31)&(~31)) - -#ifdef __cplusplus -} -#endif - -#endif +#ifndef __MEMORY_H_ +#define __MEMORY_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif + +#define Disc_ID ((u32*) 0x80000000) +#define Disc_Region ((u32*) 0x80000003) +#define Disc_Magic ((u32*) 0x80000018) +#define Sys_Magic ((u32*) 0x80000020) +#define Version ((u32*) 0x80000024) +#define Mem_Size ((u32*) 0x80000028) +#define Board_Model ((u32*) 0x8000002C) +#define Arena_L ((u32*) 0x80000030) +#define Arena_H ((u32*) 0x80000034) +#define FST ((u32*) 0x80000038) +#define Max_FST ((u32*) 0x8000003C) +#define Assembler ((u32*) 0x80000060) +#define Video_Mode ((u32*) 0x800000CC) +#define Dev_Debugger ((u32*) 0x800000EC) +#define Simulated_Mem ((u32*) 0x800000F0) +#define BI2 ((u32*) 0x800000F4) +#define Bus_Speed ((u32*) 0x800000F8) +#define CPU_Speed ((u32*) 0x800000FC) +#define Online_Check ((u32*) 0x80003180) +#define GameID_Address ((u32*) 0x80003184) + +#define allocate_memory(size) memalign(32, (size+31)&(~31)) + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/source/menu/GameBrowseMenu.cpp b/source/menu/GameBrowseMenu.cpp new file mode 100644 index 00000000..bf1fd71a --- /dev/null +++ b/source/menu/GameBrowseMenu.cpp @@ -0,0 +1,1341 @@ +#include +#include "GameBrowseMenu.hpp" +#include "prompts/PromptWindows.h" +#include "prompts/gameinfo.h" +#include "prompts/DiscBrowser.h" +#include "themes/CTheme.h" +#include "language/gettext.h" +#include "usbloader/wbfs.h" +#include "usbloader/wdvd.h" +#include "usbloader/GameList.h" +#include "network/networkops.h" +#include "FileOperations/fileops.h" +#include "settings/Settings.h" +#include "settings/CSettings.h" +#include "settings/CGameStatistics.h" +#include "settings/CGameSettings.h" +#include "settings/GameTitles.h" +#include "utils/StringTools.h" +#include "GameBootProcess.h" +#include "utils/rockout.h" +#include "utils/tools.h" +#include "fatmounter.h" +#include "gecko.h" +#include "menus.h" +#include "wpad.h" +#include "sys.h" + +extern int load_from_fs; +extern u8 mountMethod; +extern bool updateavailable; +extern struct discHdr *dvdheader; +extern int cntMissFiles; + +static int lastSelectedGame = 0; + +GameBrowseMenu::GameBrowseMenu() + : GuiWindow(screenwidth, screenheight) +{ + float freespace = 0.0, used = 0.0; + gameSelectedOld = -1; + show_searchwindow = false; + gameBrowser = NULL; + gameGrid = NULL; + gameCarousel = NULL; + searchBar = NULL; + gameCover = NULL; + gameCoverImg = NULL; + ScreensaverTimer = 0; + memset(theTime, 0, sizeof(theTime)); + wString oldFilter(gameList.GetCurrentFilter()); + gameList.FilterList(oldFilter.c_str()); + + if (mountMethod != 3 && WBFS_ShowFreeSpace()) + WBFS_DiskSpace(&used, &freespace); + + btnInstall = Resources::GetImageData("button_install.png"); + btnInstallOver = Resources::GetImageData("button_install_over.png"); + btnSettings = Resources::GetImageData("settings_button.png"); + btnSettingsOver = Resources::GetImageData("settings_button_over.png"); + btnpwroff = Resources::GetImageData("wiimote_poweroff.png"); + btnpwroffOver = Resources::GetImageData("wiimote_poweroff_over.png"); + btnhome = Resources::GetImageData("menu_button.png"); + btnhomeOver = Resources::GetImageData("menu_button_over.png"); + btnsdcardOver = Resources::GetImageData("sdcard_over.png"); + btnsdcard = Resources::GetImageData("sdcard.png"); + + imgfavIcon = Resources::GetImageData("favIcon.png"); + imgfavIcon_gray = Resources::GetImageData("favIcon_gray.png"); + imgsearchIcon = Resources::GetImageData("searchIcon.png"); + imgsearchIcon_gray = Resources::GetImageData("searchIcon_gray.png"); + imgabcIcon = Resources::GetImageData("abcIcon.png"); + imgrankIcon = Resources::GetImageData("rankIcon.png"); + imgplayCountIcon = Resources::GetImageData("playCountIcon.png"); + imgarrangeGrid = Resources::GetImageData("arrangeGrid.png"); + imgarrangeGrid_gray = Resources::GetImageData("arrangeGrid_gray.png"); + imgarrangeList = Resources::GetImageData("arrangeList.png"); + imgarrangeList_gray = Resources::GetImageData("arrangeList_gray.png"); + imgarrangeCarousel = Resources::GetImageData("arrangeCarousel.png"); + imgarrangeCarousel_gray = Resources::GetImageData("arrangeCarousel_gray.png"); + imgdvd = Resources::GetImageData("dvd.png"); + imgdvd_gray = Resources::GetImageData("dvd_gray.png"); + imgLock = Resources::GetImageData("lock.png"); + imgLock_gray = Resources::GetImageData("lock_gray.png"); + imgUnlock = Resources::GetImageData("lock_gray.png"); + imgUnlock_gray = Resources::GetImageData("unlock_gray.png"); + + homebrewImgData = Resources::GetImageData("browser.png"); + homebrewImgDataOver = Resources::GetImageData("browser_over.png"); + + trigA = new GuiTrigger; + trigA->SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A); + trigHome = new GuiTrigger; + trigHome->SetButtonOnlyTrigger(-1, WPAD_BUTTON_HOME | WPAD_CLASSIC_BUTTON_HOME, PAD_BUTTON_START); + trig2 = new GuiTrigger; + trig2->SetButtonOnlyTrigger(-1, WPAD_BUTTON_2 | WPAD_CLASSIC_BUTTON_X, 0); + trig1 = new GuiTrigger; + trig1->SetButtonOnlyTrigger(-1, WPAD_BUTTON_1 | WPAD_CLASSIC_BUTTON_Y, 0); + + char spaceinfo[30]; + if (load_from_fs == PART_FS_FAT || mountMethod == 3) + { + memset(spaceinfo, 0, 30); + } + else + { + if (strcmp(Settings.db_language, "JA") == 0) + { + // needs to be "total...used" for Japanese + sprintf(spaceinfo, "%.2fGB %s %.2fGB %s", (freespace + used), tr( "of" ), freespace, tr( "free" )); + } + else + { + sprintf(spaceinfo, "%.2fGB %s %.2fGB %s", freespace, tr( "of" ), (freespace + used), tr( "free" )); + } + } + usedSpaceTxt = new GuiText(spaceinfo, 18, Theme.info); + usedSpaceTxt->SetAlignment(Theme.hddinfo_align, ALIGN_TOP); + usedSpaceTxt->SetPosition(Theme.hddinfo_x, Theme.hddinfo_y); + + gamecntTxt = new GuiText((char *) NULL, 18, Theme.info); + gamecntBtn = new GuiButton(100, 18); + gamecntBtn->SetAlignment(Theme.gamecount_align, ALIGN_TOP); + gamecntBtn->SetPosition(Theme.gamecount_x, Theme.gamecount_y); + gamecntBtn->SetLabel(gamecntTxt); + gamecntBtn->SetEffectGrow(); + gamecntBtn->SetTrigger(trigA); + + installBtnTT = new GuiTooltip(tr( "Install a game" )); + if (Settings.wsprompt) installBtnTT->SetWidescreen(Settings.widescreen); + installBtnTT->SetAlpha(Theme.tooltipAlpha); + installBtnImg = new GuiImage(btnInstall); + installBtnImgOver = new GuiImage(btnInstallOver); + installBtnImg->SetWidescreen(Settings.widescreen); + installBtnImgOver->SetWidescreen(Settings.widescreen); + + installBtn = new GuiButton(installBtnImg, installBtnImgOver, ALIGN_LEFT, ALIGN_TOP, Theme.install_x, Theme.install_y, + trigA, btnSoundOver, btnSoundClick2, 1, installBtnTT, 24, -30, 0, 5); + + settingsBtnTT = new GuiTooltip(tr( "Settings" )); + if (Settings.wsprompt) settingsBtnTT->SetWidescreen(Settings.widescreen); + settingsBtnTT->SetAlpha(Theme.tooltipAlpha); + settingsBtnImg = new GuiImage(btnSettings); + settingsBtnImg->SetWidescreen(Settings.widescreen); + settingsBtnImgOver = new GuiImage(btnSettingsOver); + settingsBtnImgOver->SetWidescreen(Settings.widescreen); + settingsBtn = new GuiButton(settingsBtnImg, settingsBtnImgOver, 0, 3, Theme.setting_x, Theme.setting_y, trigA, + btnSoundOver, btnSoundClick2, 1, settingsBtnTT, 65, -30, 0, 5); + + homeBtnTT = new GuiTooltip(tr( "Back to HBC or Wii Menu" )); + if (Settings.wsprompt) homeBtnTT->SetWidescreen(Settings.widescreen); + settingsBtnTT->SetAlpha(Theme.tooltipAlpha); + homeBtnImg = new GuiImage(btnhome); + homeBtnImg->SetWidescreen(Settings.widescreen); + homeBtnImgOver = new GuiImage(btnhomeOver); + homeBtnImgOver->SetWidescreen(Settings.widescreen); + homeBtn = new GuiButton(homeBtnImg, homeBtnImgOver, 0, 3, Theme.home_x, Theme.home_y, trigA, btnSoundOver, btnSoundClick2, + 1, homeBtnTT, 15, -30, 1, 5); + homeBtn->RemoveSoundClick(); + homeBtn->SetTrigger(trigHome); + + poweroffBtnTT = new GuiTooltip(tr( "Power off the Wii" )); + if (Settings.wsprompt) poweroffBtnTT->SetWidescreen(Settings.widescreen); + poweroffBtnTT->SetAlpha(Theme.tooltipAlpha); + poweroffBtnImg = new GuiImage(btnpwroff); + poweroffBtnImgOver = new GuiImage(btnpwroffOver); + poweroffBtnImg->SetWidescreen(Settings.widescreen); + poweroffBtnImgOver->SetWidescreen(Settings.widescreen); + poweroffBtn = new GuiButton(poweroffBtnImg, poweroffBtnImgOver, 0, 3, Theme.power_x, Theme.power_y, trigA, + btnSoundOver, btnSoundClick2, 1, poweroffBtnTT, -10, -30, 1, 5); + + sdcardBtnTT = new GuiTooltip(tr( "Reload SD" )); + if (Settings.wsprompt) sdcardBtnTT->SetWidescreen(Settings.widescreen); + sdcardBtnTT->SetAlpha(Theme.tooltipAlpha); + sdcardImg = new GuiImage(btnsdcard); + sdcardImgOver = new GuiImage(btnsdcardOver); + sdcardImg->SetWidescreen(Settings.widescreen); + sdcardImgOver->SetWidescreen(Settings.widescreen); + sdcardBtn = new GuiButton(sdcardImg, sdcardImgOver, 0, 3, Theme.sdcard_x, Theme.sdcard_y, trigA, btnSoundOver, + btnSoundClick2, 1, sdcardBtnTT, 15, -30, 0, 5); + + gameInfo = new GuiButton(0, 0); + gameInfo->SetTrigger(trig2); + gameInfo->SetSoundClick(btnSoundClick2); + + favoriteBtnTT = new GuiTooltip(tr( "Display favorites only" )); + if (Settings.wsprompt) favoriteBtnTT->SetWidescreen(Settings.widescreen); + favoriteBtnTT->SetAlpha(Theme.tooltipAlpha); + favoriteBtnImg = new GuiImage(imgfavIcon); + favoriteBtnImg->SetWidescreen(Settings.widescreen); + favoriteBtnImg_g = new GuiImage(imgfavIcon_gray); + favoriteBtnImg_g->SetWidescreen(Settings.widescreen); + favoriteBtn = new GuiButton(favoriteBtnImg_g, favoriteBtnImg_g, ALIGN_LEFT, ALIGN_TOP, Theme.gamelist_favorite_x, + Theme.gamelist_favorite_y, trigA, btnSoundOver, btnSoundClick2, 1, favoriteBtnTT, -15, 52, 0, 3); + + searchBtnTT = new GuiTooltip(tr( "Set Search-Filter" )); + if (Settings.wsprompt) searchBtnTT->SetWidescreen(Settings.widescreen); + searchBtnTT->SetAlpha(Theme.tooltipAlpha); + searchBtnImg = new GuiImage(imgsearchIcon); + searchBtnImg->SetWidescreen(Settings.widescreen); + searchBtnImg_g = new GuiImage(imgsearchIcon_gray); + searchBtnImg_g->SetWidescreen(Settings.widescreen); + searchBtn = new GuiButton(searchBtnImg_g, searchBtnImg_g, ALIGN_LEFT, ALIGN_TOP, Theme.gamelist_search_x, + Theme.gamelist_search_y, trigA, btnSoundOver, btnSoundClick2, 1, searchBtnTT, -15, 52, 0, 3); + + sortBtnTT = new GuiTooltip(" "); + if (Settings.wsprompt) sortBtnTT->SetWidescreen(Settings.widescreen); + sortBtnTT->SetAlpha(Theme.tooltipAlpha); + + sortBtnImg = new GuiImage(imgabcIcon); + sortBtnImg->SetWidescreen(Settings.widescreen); + sortBtn = new GuiButton(sortBtnImg, sortBtnImg, ALIGN_LEFT, ALIGN_TOP, Theme.gamelist_abc_x, Theme.gamelist_abc_y, trigA, btnSoundOver, btnSoundClick2, 1, sortBtnTT, -15, 52, 0, 3); + + listBtnTT = new GuiTooltip(tr( "Display as a list" )); + if (Settings.wsprompt) listBtnTT->SetWidescreen(Settings.widescreen); + listBtnTT->SetAlpha(Theme.tooltipAlpha); + listBtnImg = new GuiImage(imgarrangeList); + listBtnImg->SetWidescreen(Settings.widescreen); + listBtnImg_g = new GuiImage(imgarrangeList_gray); + listBtnImg_g->SetWidescreen(Settings.widescreen); + listBtn = new GuiButton(listBtnImg_g, listBtnImg_g, ALIGN_LEFT, ALIGN_TOP, Theme.gamelist_list_x, + Theme.gamelist_list_y, trigA, btnSoundOver, btnSoundClick2, 1, listBtnTT, 15, 52, 1, 3); + + gridBtnTT = new GuiTooltip(tr( "Display as a grid" )); + if (Settings.wsprompt) gridBtnTT->SetWidescreen(Settings.widescreen); + gridBtnTT->SetAlpha(Theme.tooltipAlpha); + gridBtnImg = new GuiImage(imgarrangeGrid); + gridBtnImg->SetWidescreen(Settings.widescreen); + gridBtnImg_g = new GuiImage(imgarrangeGrid_gray); + gridBtnImg_g->SetWidescreen(Settings.widescreen); + gridBtn = new GuiButton(gridBtnImg_g, gridBtnImg_g, ALIGN_LEFT, ALIGN_TOP, Theme.gamelist_grid_x, + Theme.gamelist_grid_y, trigA, btnSoundOver, btnSoundClick2, 1, gridBtnTT, 15, 52, 1, 3); + + carouselBtnTT = new GuiTooltip(tr( "Display as a carousel" )); + if (Settings.wsprompt) carouselBtnTT->SetWidescreen(Settings.widescreen); + carouselBtnTT->SetAlpha(Theme.tooltipAlpha); + carouselBtnImg = new GuiImage(imgarrangeCarousel); + carouselBtnImg->SetWidescreen(Settings.widescreen); + carouselBtnImg_g = new GuiImage(imgarrangeCarousel_gray); + carouselBtnImg_g->SetWidescreen(Settings.widescreen); + carouselBtn = new GuiButton(carouselBtnImg_g, carouselBtnImg_g, ALIGN_LEFT, ALIGN_TOP, Theme.gamelist_carousel_x, + Theme.gamelist_carousel_y, trigA, btnSoundOver, btnSoundClick2, 1, carouselBtnTT, 15, 52, 1, 3); + + lockBtnTT = new GuiTooltip(NULL); + if (Settings.wsprompt) lockBtnTT->SetWidescreen(Settings.widescreen); + lockBtnTT->SetAlpha(Theme.tooltipAlpha); + lockBtnImg = new GuiImage(imgLock); + lockBtnImg->SetWidescreen(Settings.widescreen); + lockBtnImg_g = new GuiImage(imgLock_gray); + lockBtnImg_g->SetWidescreen(Settings.widescreen); + lockBtn = new GuiButton(lockBtnImg_g, lockBtnImg_g, ALIGN_LEFT, ALIGN_TOP, Theme.gamelist_lock_x, + Theme.gamelist_lock_y, trigA, btnSoundOver, btnSoundClick2, 1, lockBtnTT, 15, 52, 1, 3); + + unlockBtnImg = new GuiImage(imgUnlock); + unlockBtnImg->SetWidescreen(Settings.widescreen); + unlockBtnImg_g = new GuiImage(imgUnlock_gray); + unlockBtnImg_g->SetWidescreen(Settings.widescreen); + + dvdBtnTT = new GuiTooltip(tr( "Mount DVD drive" )); + if (Settings.wsprompt) dvdBtnTT->SetWidescreen(Settings.widescreen); + dvdBtnTT->SetAlpha(Theme.tooltipAlpha); + dvdBtnImg = new GuiImage(imgdvd); + dvdBtnImg->SetWidescreen(Settings.widescreen); + dvdBtnImg_g = new GuiImage(dvdBtnImg); + dvdBtnImg_g->SetWidescreen(Settings.widescreen); + dvdBtn = new GuiButton(dvdBtnImg_g, dvdBtnImg_g, ALIGN_LEFT, ALIGN_TOP, Theme.gamelist_dvd_x, Theme.gamelist_dvd_y, + trigA, btnSoundOver, btnSoundClick2, 1, dvdBtnTT, 15, 52, 1, 3); + + homebrewBtnTT = new GuiTooltip(tr( "Homebrew Launcher" )); + if (Settings.wsprompt) homebrewBtnTT->SetWidescreen(Settings.widescreen); + homebrewBtnTT->SetAlpha(Theme.tooltipAlpha); + homebrewImg = new GuiImage(homebrewImgData); + homebrewImgOver = new GuiImage(homebrewImgDataOver); + homebrewImg->SetWidescreen(Settings.widescreen); + homebrewImgOver->SetWidescreen(Settings.widescreen); + homebrewBtn = new GuiButton(homebrewImg, homebrewImgOver, ALIGN_LEFT, ALIGN_TOP, Theme.homebrew_x, Theme.homebrew_y, + trigA, btnSoundOver, btnSoundClick2, 1, homebrewBtnTT, 15, -30, 1, 5); + //Downloading Covers + DownloadBtnTT = new GuiTooltip(tr( "Click to Download Covers" )); + if (Settings.wsprompt) DownloadBtnTT->SetWidescreen(Settings.widescreen); + DownloadBtnTT->SetAlpha(Theme.tooltipAlpha); + DownloadBtn = new GuiButton (0, 0); + DownloadBtn->SetAlignment(ALIGN_LEFT, ALIGN_TOP); + DownloadBtn->SetPosition(Theme.covers_x, Theme.covers_y); + + IDBtnTT = new GuiTooltip(tr( "Click to change game ID" )); + if (Settings.wsprompt) IDBtnTT->SetWidescreen(Settings.widescreen); + IDBtnTT->SetAlpha(Theme.tooltipAlpha); + idBtn = new GuiButton(60, 23); + idBtn->SetAlignment(ALIGN_LEFT, ALIGN_TOP); + idBtn->SetPosition(Theme.id_x, Theme.id_y); + + clockTimeBack = new GuiText("88:88", 40, (GXColor) {Theme.clock.r, Theme.clock.g, Theme.clock.b, Theme.clock.a / 6}); + clockTimeBack->SetAlignment(Theme.clock_align, ALIGN_TOP); + clockTimeBack->SetPosition(Theme.clock_x, Theme.clock_y); + clockTimeBack->SetFont(clock_ttf, clock_ttf_size); + + clockTime = new GuiText(theTime, 40, Theme.clock); + clockTime->SetAlignment(Theme.clock_align, ALIGN_TOP); + clockTime->SetPosition(Theme.clock_x, Theme.clock_y); + clockTime->SetFont(clock_ttf, clock_ttf_size); + + ToolBar.push_back(favoriteBtn); + ToolBar.push_back(searchBtn); + ToolBar.push_back(sortBtn); + ToolBar.push_back(listBtn); + ToolBar.push_back(gridBtn); + ToolBar.push_back(carouselBtn); + ToolBar.push_back(lockBtn); + ToolBar.push_back(dvdBtn); + SetUpdateCallback(UpdateCallback); + + ReloadBrowser(); +} + +GameBrowseMenu::~GameBrowseMenu() +{ + ResumeGui(); + + SetEffect(EFFECT_FADE, -20); + while(parentElement && this->GetEffect() > 0) usleep(100); + + HaltGui(); + if(parentElement) + ((GuiWindow *) parentElement)->Remove(this); + + RemoveAll(); + + delete btnInstall; + delete btnInstallOver; + delete btnSettings; + delete btnSettingsOver; + delete btnpwroff; + delete btnpwroffOver; + delete btnhome; + delete btnhomeOver; + delete btnsdcardOver; + delete btnsdcard; + delete imgfavIcon; + delete imgfavIcon_gray; + delete imgsearchIcon; + delete imgsearchIcon_gray; + delete imgabcIcon; + delete imgrankIcon; + delete imgplayCountIcon; + delete imgarrangeGrid; + delete imgarrangeGrid_gray; + delete imgarrangeCarousel; + delete imgarrangeCarousel_gray; + delete imgarrangeList; + delete imgarrangeList_gray; + delete imgdvd; + delete imgdvd_gray; + delete imgLock; + delete imgLock_gray; + delete imgUnlock; + delete imgUnlock_gray; + delete homebrewImgData; + delete homebrewImgDataOver; + delete gameCover; + + delete trigA; + delete trigHome; + delete trig1; + delete trig2; + + delete installBtnImg; + delete installBtnImgOver; + delete settingsBtnImg; + delete settingsBtnImgOver; + delete homeBtnImg; + delete homeBtnImgOver; + delete poweroffBtnImg; + delete poweroffBtnImgOver; + delete sdcardImg; + delete sdcardImgOver; + delete favoriteBtnImg; + delete favoriteBtnImg_g; + delete searchBtnImg; + delete searchBtnImg_g; + delete sortBtnImg; + delete listBtnImg; + delete listBtnImg_g; + delete gridBtnImg; + delete gridBtnImg_g; + delete carouselBtnImg; + delete carouselBtnImg_g; + delete lockBtnImg; + delete lockBtnImg_g; + delete unlockBtnImg; + delete unlockBtnImg_g; + delete dvdBtnImg; + delete dvdBtnImg_g; + delete homebrewImg; + delete homebrewImgOver; + delete gameCoverImg; + + delete usedSpaceTxt; + delete gamecntTxt; + delete clockTimeBack; + delete clockTime; + + delete gamecntBtn; + delete installBtn; + delete settingsBtn; + delete homeBtn; + delete poweroffBtn; + delete sdcardBtn; + delete gameInfo; + delete favoriteBtn; + delete searchBtn; + delete sortBtn; + delete listBtn; + delete gridBtn; + delete carouselBtn; + delete lockBtn; + delete dvdBtn; + delete homebrewBtn; + delete DownloadBtn; + delete idBtn; + + delete installBtnTT; + delete settingsBtnTT; + delete homeBtnTT; + delete poweroffBtnTT; + delete sdcardBtnTT; + delete favoriteBtnTT; + delete searchBtnTT; + delete sortBtnTT; + delete listBtnTT; + delete gridBtnTT; + delete carouselBtnTT; + delete lockBtnTT; + delete dvdBtnTT; + delete homebrewBtnTT; + delete DownloadBtnTT; + delete IDBtnTT; + + lastSelectedGame = cut_bounds(GetSelectedGame(), 0, gameList.size()-1); + + delete gameBrowser; + delete gameGrid; + delete gameCarousel; + mainWindow->Remove(searchBar); + delete searchBar; + + ResumeGui(); +} + +void GameBrowseMenu::ReloadBrowser() +{ + ResumeGui(); + + SetEffect(EFFECT_FADE, -40); + while(parentElement && this->GetEffect() > 0) usleep(100); + + HaltGui(); + RemoveAll(); + mainWindow->Remove(searchBar); + + gamecntTxt->SetText(fmt("%s: %i", (mountMethod != 3 ? tr( "Games" ) : tr( "Channels" )), gameList.size())); + + const char * sortTTText = NULL; + GuiImageData * sortImgData = NULL; + + if(Settings.GameSort & SORT_RANKING) + { + sortTTText = tr( "Sort by rank" ); + sortImgData = imgrankIcon; + } + else if(Settings.GameSort & SORT_PLAYCOUNT) + { + sortTTText = tr( "Sort order by most played"); + sortImgData = imgplayCountIcon; + } + else + { + sortTTText = tr("Sort alphabetically"); + sortImgData = imgabcIcon; + } + + sortBtnTT->SetText(sortTTText); + sortBtnImg->SetImage(sortImgData); + + if (Settings.GameSort & SORT_FAVORITE) + { + favoriteBtn->SetImage(favoriteBtnImg); + favoriteBtn->SetImageOver(favoriteBtnImg); + } + else + { + favoriteBtn->SetImage(favoriteBtnImg_g); + favoriteBtn->SetImageOver(favoriteBtnImg_g); + } + + if (*gameList.GetCurrentFilter()) + { + if (!show_searchwindow) searchBtn->SetEffect(EFFECT_PULSE, 10, 105); + searchBtn->SetImage(searchBtnImg); + searchBtn->SetImageOver(searchBtnImg); + } + else if(!show_searchwindow) + { + searchBtn->SetImage(searchBtnImg_g); + searchBtn->SetImageOver(searchBtnImg_g); + } + + if (Settings.godmode == 1 && mountMethod != 3) //only make the button have trigger & tooltip if in godmode + { + DownloadBtn->SetSoundOver(btnSoundOver); + DownloadBtn->SetTrigger(0, trigA); + DownloadBtn->SetTrigger(1, trig1); + DownloadBtn->SetToolTip(DownloadBtnTT, 205, -30); + idBtn->SetSoundOver(btnSoundOver); + idBtn->SetTrigger(0, trigA); + idBtn->SetToolTip(IDBtnTT, 205, -30); + } + else + { + DownloadBtn->SetToolTip(NULL, 0, 0); + DownloadBtn->SetSoundOver(NULL); + DownloadBtn->SetTrigger(0, NULL); + DownloadBtn->SetTrigger(1, NULL); + idBtn->SetSoundOver(NULL); + idBtn->SetTrigger(0, NULL); + idBtn->SetToolTip(NULL, 0, 0); + } + + if ((Settings.parentalcontrol == 0 && Settings.Parental.enabled == 1) && Settings.godmode) + { + lockBtn->SetImage(unlockBtnImg_g); + lockBtn->SetImageOver(unlockBtnImg_g); + lockBtnTT->SetText(tr( "Unlock Parental Control" )); + } + else + { + lockBtn->SetImage(lockBtnImg_g); + lockBtn->SetImageOver(lockBtnImg_g); + lockBtnTT->SetText(tr( "Parental Control disabled" )); + } + + if(GetSelectedGame() >= 0) + lastSelectedGame = cut_bounds(GetSelectedGame(), 0, gameList.size()-1); + else + lastSelectedGame = cut_bounds(lastSelectedGame, 0, gameList.size()-1); + + delete gameBrowser; + delete gameGrid; + delete gameCarousel; + delete searchBar; + gameBrowser = NULL; + gameGrid = NULL; + gameCarousel = NULL; + searchBar = NULL; + + if (Settings.gameDisplay == LIST_MODE) + { + DownloadBtn->SetSize(160, 224); + listBtn->SetImage(listBtnImg); + listBtn->SetImageOver(listBtnImg); + gridBtn->SetImage(gridBtnImg_g); + gridBtn->SetImageOver(gridBtnImg_g); + carouselBtn->SetImage(carouselBtnImg_g); + carouselBtn->SetImageOver(carouselBtnImg_g); + + favoriteBtn->SetPosition(Theme.gamelist_favorite_x, Theme.gamelist_favorite_y); + searchBtn->SetPosition(Theme.gamelist_search_x, Theme.gamelist_search_y); + sortBtn->SetPosition(Theme.gamelist_abc_x, Theme.gamelist_abc_y); + listBtn->SetPosition(Theme.gamelist_list_x, Theme.gamelist_list_y); + gridBtn->SetPosition(Theme.gamelist_grid_x, Theme.gamelist_grid_y); + carouselBtn->SetPosition(Theme.gamelist_carousel_x, Theme.gamelist_carousel_y); + lockBtn->SetPosition(Theme.gamelist_lock_x, Theme.gamelist_lock_y); + dvdBtn->SetPosition(Theme.gamelist_dvd_x, Theme.gamelist_dvd_y); + + gameBrowser = new GuiGameBrowser(Theme.gamelist_w, Theme.gamelist_h, lastSelectedGame); + gameBrowser->SetPosition(Theme.gamelist_x, Theme.gamelist_y); + gameBrowser->SetAlignment(ALIGN_LEFT, ALIGN_CENTRE); + } + else if (Settings.gameDisplay == GRID_MODE) + { + DownloadBtn->SetImage(NULL); + DownloadBtn->SetSize(0, 0); + gridBtn->SetImage(gridBtnImg); + gridBtn->SetImageOver(gridBtnImg); + listBtn->SetImage(listBtnImg_g); + listBtn->SetImageOver(listBtnImg_g); + carouselBtn->SetImage(carouselBtnImg_g); + carouselBtn->SetImageOver(carouselBtnImg_g); + + favoriteBtn->SetPosition(Theme.gamegrid_favorite_x, Theme.gamegrid_favorite_y); + searchBtn->SetPosition(Theme.gamegrid_search_x, Theme.gamegrid_search_y); + sortBtn->SetPosition(Theme.gamegrid_abc_x, Theme.gamegrid_abc_y); + listBtn->SetPosition(Theme.gamegrid_list_x, Theme.gamegrid_list_y); + gridBtn->SetPosition(Theme.gamegrid_grid_x, Theme.gamegrid_grid_y); + carouselBtn->SetPosition(Theme.gamegrid_carousel_x, Theme.gamegrid_carousel_y); + lockBtn->SetPosition(Theme.gamegrid_lock_x, Theme.gamegrid_lock_y); + dvdBtn->SetPosition(Theme.gamegrid_dvd_x, Theme.gamegrid_dvd_y); + + gameGrid = new GuiGameGrid(Theme.gamegrid_w, Theme.gamegrid_h, Settings.theme_path, bg_options_png, lastSelectedGame); + gameGrid->SetPosition(Theme.gamegrid_x, Theme.gamegrid_y); + gameGrid->SetAlignment(ALIGN_LEFT, ALIGN_CENTRE); + } + else if (Settings.gameDisplay == CAROUSEL_MODE) + { + DownloadBtn->SetImage(NULL); + DownloadBtn->SetSize(0, 0); + carouselBtn->SetImage(carouselBtnImg); + carouselBtn->SetImageOver(carouselBtnImg); + listBtn->SetImage(listBtnImg_g); + listBtn->SetImageOver(listBtnImg_g); + gridBtn->SetImage(gridBtnImg_g); + gridBtn->SetImageOver(gridBtnImg_g); + + favoriteBtn->SetPosition(Theme.gamecarousel_favorite_x, Theme.gamecarousel_favorite_y); + searchBtn->SetPosition(Theme.gamecarousel_search_x, Theme.gamecarousel_favorite_y); + sortBtn->SetPosition(Theme.gamecarousel_abc_x, Theme.gamecarousel_abc_y); + listBtn->SetPosition(Theme.gamecarousel_list_x, Theme.gamecarousel_list_y); + gridBtn->SetPosition(Theme.gamecarousel_grid_x, Theme.gamecarousel_grid_y); + carouselBtn->SetPosition(Theme.gamecarousel_carousel_x, Theme.gamecarousel_carousel_y); + lockBtn->SetPosition(Theme.gamecarousel_lock_x, Theme.gamecarousel_lock_y); + dvdBtn->SetPosition(Theme.gamecarousel_dvd_x, Theme.gamecarousel_dvd_y); + + gameCarousel = new GuiGameCarousel(640, 400, Settings.theme_path, bg_options_png, lastSelectedGame); + gameCarousel->SetPosition(Theme.gamecarousel_x, Theme.gamecarousel_y); + gameCarousel->SetAlignment(ALIGN_LEFT, ALIGN_CENTRE); + } + + + if (Theme.show_hddinfo == -1 || Theme.show_hddinfo == 1) //force show hdd info + Append(usedSpaceTxt); + if (Theme.show_gamecount == -1 || Theme.show_gamecount == 1) //force show game cnt info + Append(gamecntBtn); + Append(sdcardBtn); + Append(poweroffBtn); + Append(gameInfo); + if (Settings.godmode) Append(installBtn); + Append(homeBtn); + Append(settingsBtn); + Append(DownloadBtn); + Append(idBtn); + Append(homebrewBtn); + + Append(favoriteBtn); + Append(searchBtn); + Append(sortBtn); + Append(listBtn); + Append(gridBtn); + Append(carouselBtn); + Append(lockBtn); + Append(dvdBtn); + + if ((Settings.hddinfo == CLOCK_HR12) || (Settings.hddinfo == CLOCK_HR24)) + { + Append(clockTimeBack); + Append(clockTime); + } + + if (gameBrowser) + Append(gameBrowser); + + else if (gameGrid) + Append(gameGrid); + + else if (gameCarousel) + Append(gameCarousel); + + if (show_searchwindow) + { + searchBar = new GuiSearchBar(gameList.GetAvailableSearchChars()); + mainWindow->Append(searchBar); + } + + SetEffect(EFFECT_FADE, 40); + ResumeGui(); + + while(parentElement && this->GetEffect() > 0) usleep(100); +} + +int GameBrowseMenu::Show() +{ + int menu = MENU_NONE; + + while(menu == MENU_NONE) + { + usleep(100); + + if (shutdown) + Sys_Shutdown(); + if (reset) + Sys_Reboot(); + + menu = MainLoop(); + } + + return menu; +} + + +int GameBrowseMenu::MainLoop() +{ + WDVD_GetCoverStatus(&DiscDriveCover);//for detecting if i disc has been inserted + + //CLOCK + if (Settings.hddinfo == CLOCK_HR12 || Settings.hddinfo == CLOCK_HR24) + { + time_t rawtime = time(0); + if(rawtime != lastrawtime) + { + lastrawtime = rawtime; + struct tm * timeinfo = localtime(&rawtime); + if (Settings.hddinfo == CLOCK_HR12) + { + if (rawtime & 1) + strftime(theTime, sizeof(theTime), "%I:%M", timeinfo); + else + strftime(theTime, sizeof(theTime), "%I %M", timeinfo); + } + if (Settings.hddinfo == CLOCK_HR24) + { + if (rawtime & 1) + strftime(theTime, sizeof(theTime), "%H:%M", timeinfo); + else + strftime(theTime, sizeof(theTime), "%H %M", timeinfo); + } + clockTime->SetText(theTime); + } + } + + if (updateavailable == true) + { + gprintf("\tUpdate Available\n"); + SetState(STATE_DISABLED); + ProgressUpdateWindow(); + updateavailable = false; + SetState(STATE_DEFAULT); + } + + else if (poweroffBtn->GetState() == STATE_CLICKED) + { + gprintf("\tpoweroffBtn clicked\n"); + int choice = WindowPrompt(tr( "How to Shutdown?" ), 0, tr( "Full Shutdown" ), tr( "Shutdown to Idle" ), tr( "Cancel" )); + if (choice == 2) + Sys_ShutdownToIdle(); + else if (choice == 1) + Sys_ShutdownToStandby(); + + poweroffBtn->ResetState(); + } + else if (gamecntBtn->GetState() == STATE_CLICKED) + { + gprintf("\tgameCntBtn clicked\n"); + gamecntBtn->ResetState(); + if(mountMethod == 3) + return MENU_NONE; + + int choice = WindowPrompt(0, fmt("%s %sGameList ?", tr( "Save Game List to" ), Settings.update_path), "TXT", "CSV", tr( "Back" )); + if (choice) + { + if (save_gamelist(choice - 1)) + WindowPrompt(0, tr( "Saved" ), tr( "OK" )); + else + WindowPrompt(tr( "Error" ), tr( "Could not save." ), tr( "OK" )); + } + } + else if (homeBtn->GetState() == STATE_CLICKED) + { + gprintf("\thomeBtn clicked\n"); + bgMusic->Pause(); + int choice = WindowExitPrompt(); + bgMusic->Resume(); + + if (choice == 3) + Sys_LoadMenu(); // Back to System Menu + else if (choice == 2) + Sys_BackToLoader(); + + homeBtn->ResetState(); + } + else if (installBtn->GetState() == STATE_CLICKED) + { + int choice = WindowPrompt(tr( "Install a game" ), 0, tr( "Yes" ), tr( "No" )); + if (choice == 1) + return MENU_INSTALL; + + installBtn->ResetState(); + } + else if ((DiscDriveCover & 0x02) && (DiscDriveCover != DiscDriveCoverOld)) + { + gprintf("\tNew Disc Detected\n"); + int choice = WindowPrompt(tr( "New Disc Detected" ), 0, tr( "Install" ), tr( "Mount DVD drive" ), tr( "Cancel" )); + if (choice == 1) + return MENU_INSTALL; + else if (choice == 2) + dvdBtn->SetState(STATE_CLICKED); + } + + else if (sdcardBtn->GetState() == STATE_CLICKED) + { + gprintf("\tsdCardBtn Clicked\n"); + HaltGui(); + bgMusic->Pause(); + SDCard_Init(); + Settings.Load(); + bgMusic->Resume(); + ReloadBrowser(); + ResumeGui(); + sdcardBtn->ResetState(); + } + + else if (DownloadBtn->GetState() == STATE_CLICKED) + { + gprintf("\tDownloadBtn Clicked\n"); + CoverDownload(); + ReloadBrowser(); + DownloadBtn->ResetState(); + } + + else if (settingsBtn->GetState() == STATE_CLICKED) + { + return MENU_SETTINGS; + } + + else if (favoriteBtn->GetState() == STATE_CLICKED) + { + favoriteBtn->ResetState(); + gprintf("\tfavoriteBtn Clicked\n"); + + if(Settings.GameSort & SORT_FAVORITE) + Settings.GameSort &= ~SORT_FAVORITE; + else + Settings.GameSort |= SORT_FAVORITE; + Settings.Save(); + wString oldFilter(gameList.GetCurrentFilter()); + gameList.FilterList(oldFilter.c_str()); + ReloadBrowser(); + } + + else if (searchBtn->GetState() == STATE_CLICKED && mountMethod != 3) + { + gprintf("\tsearchBtn Clicked\n"); + show_searchwindow = !show_searchwindow; + wString oldFilter(gameList.GetCurrentFilter()); + gameList.FilterList(oldFilter.c_str()); + ReloadBrowser(); + searchBtn->ResetState(); + } + + else if (searchBar && (searchChar = searchBar->GetClicked())) + { + if (searchChar > 27) + { + int len = gameList.GetCurrentFilter() ? wcslen(gameList.GetCurrentFilter()) : 0; + wchar_t newFilter[len + 2]; + if (gameList.GetCurrentFilter()) wcscpy(newFilter, gameList.GetCurrentFilter()); + newFilter[len] = searchChar; + newFilter[len + 1] = 0; + + gameList.FilterList(newFilter); + } + else if (searchChar == 7) // Close + { + show_searchwindow = false; + searchBtn->StopEffect(); + } + else if (searchChar == 8) // Backspace + { + int len = wcslen(gameList.GetCurrentFilter()); + wchar_t newFilter[len + 1]; + if (gameList.GetCurrentFilter()) wcscpy(newFilter, gameList.GetCurrentFilter()); + newFilter[len > 0 ? len - 1 : 0] = 0; + gameList.FilterList(newFilter); + } + ReloadBrowser(); + return MENU_NONE; + } + + else if (sortBtn->GetState() == STATE_CLICKED) + { + sortBtn->ResetState(); + gprintf("\tsortBtn clicked\n"); + if(Settings.GameSort & SORT_ABC) + { + Settings.GameSort &= ~SORT_ABC; + Settings.GameSort |= SORT_RANKING; + } + else if(Settings.GameSort & SORT_RANKING) + { + Settings.GameSort &= ~SORT_RANKING; + Settings.GameSort |= SORT_PLAYCOUNT; + } + else if(Settings.GameSort & SORT_PLAYCOUNT) + { + Settings.GameSort &= ~SORT_PLAYCOUNT; + Settings.GameSort |= SORT_ABC; + } + Settings.Save(); + wString oldFilter(gameList.GetCurrentFilter()); + gameList.FilterList(oldFilter.c_str()); + ReloadBrowser(); + } + + else if (listBtn->GetState() == STATE_CLICKED) + { + gprintf("\tlistBtn Clicked\n"); + if (Settings.gameDisplay != LIST_MODE) + { + Settings.gameDisplay = LIST_MODE; + Settings.Save(); + ReloadBrowser(); + } + listBtn->ResetState(); + } + + else if (gridBtn->GetState() == STATE_CLICKED) + { + gprintf("\tgridBtn Clicked\n"); + if (Settings.gameDisplay != GRID_MODE) + { + Settings.gameDisplay = GRID_MODE; + Settings.Save(); + ReloadBrowser(); + } + gridBtn->ResetState(); + } + + else if (carouselBtn->GetState() == STATE_CLICKED) + { + gprintf("\tcarouselBtn Clicked\n"); + if (Settings.gameDisplay != CAROUSEL_MODE) + { + Settings.gameDisplay = CAROUSEL_MODE; + Settings.Save(); + ReloadBrowser(); + } + carouselBtn->ResetState(); + } + + else if (homebrewBtn->GetState() == STATE_CLICKED) + { + gprintf("\thomebrewBtn Clicked\n"); + return MENU_HOMEBREWBROWSE; + } + + else if (gameInfo->GetState() == STATE_CLICKED && mountMethod != 3) + { + gprintf("\tgameinfo Clicked\n"); + int SelectedGame = GetSelectedGame(); + gameInfo->ResetState(); + if (SelectedGame >= 0 && SelectedGame < (s32) gameList.size()) + { + rockout(SelectedGame); + struct discHdr *header = gameList[SelectedGame]; + char IDfull[7]; + snprintf(IDfull, sizeof(IDfull), "%s", (char *) header->id); + SetState(STATE_DISABLED); + int choice = showGameInfo(IDfull); + SetState(STATE_DEFAULT); + rockout(SelectedGame, 2); + if (choice == 2) + homeBtn->SetState(STATE_CLICKED); + } + } + else if (lockBtn->GetState() == STATE_CLICKED) + { + gprintf("\tlockBtn clicked\n"); + lockBtn->ResetState(); + if (!(Settings.parentalcontrol == 0 && Settings.Parental.enabled == 1)) + { + WindowPrompt(tr( "Parental Control" ), tr( "You don't have Parental Control enabled. If you wish to use Parental Control, enable it in the Wii Settings." ), tr( "OK" )); + return MENU_NONE; + } + + if (Settings.godmode && WindowPrompt(tr( "Parental Control" ), tr( "Are you sure you want to enable Parent Control?" ), tr( "Yes" ), tr( "No" )) == 1) + { + Settings.godmode = 0; + wString oldFilter(gameList.GetCurrentFilter()); + gameList.FilterList(oldFilter.c_str()); + ReloadBrowser(); + } + else + { + // Require the user to enter the PIN code + char pin[5]; + memset(&pin, 0, 5); + int ret = OnScreenNumpad((char *) &pin, 5); + + if (ret <= 0) + return MENU_NONE; + + if (memcmp(pin, Settings.Parental.pin, 4) == 0) + { + Settings.godmode = 1; + wString oldFilter(gameList.GetCurrentFilter()); + gameList.FilterList(oldFilter.c_str()); + ReloadBrowser(); + } + else + WindowPrompt(tr( "Parental Control" ), tr( "Invalid PIN code" ), tr( "OK" )); + } + } + else if (dvdBtn->GetState() == STATE_CLICKED) + { + gprintf("\tdvdBtn Clicked\n"); + mountMethod = DiscMount(dvdheader); + dvdBtn->ResetState(); + + rockout(GetSelectedGame()); + } + + else if (Settings.gameDisplay == LIST_MODE && idBtn->GetState() == STATE_CLICKED && mountMethod != 3) + { + gprintf("\tidBtn Clicked\n"); + struct discHdr * header = gameList[GetSelectedGame()]; + //enter new game ID + char entered[7]; + snprintf(entered, sizeof(entered), "%s", (char *) header->id); + int result = OnScreenKeyboard(entered, sizeof(entered), 0); + if (result == 1) + { + WBFS_ReIDGame(header->id, entered); + wString oldFilter(gameList.GetCurrentFilter()); + gameList.ReadGameList(); + gameList.FilterList(oldFilter.c_str()); + ReloadBrowser(); + } + idBtn->ResetState(); + } + + if (Settings.gameDisplay == LIST_MODE && GetSelectedGame() != gameSelectedOld) + { + gameSelectedOld = GetSelectedGame(); + int gameSelected = gameSelectedOld; + if(gameSelected >= 0 && gameSelected < (s32) gameList.size()) + { + struct discHdr *header = gameList[gameSelected]; + LoadCover(header); + UpdateGameInfoText(header->id); + } + } + + gameClicked = GetClickedGame(); + if ((gameClicked >= 0 && gameClicked < (s32) gameList.size()) || mountMethod == 1 || mountMethod == 2) + { + OpenClickedGame(); + } + + if (!IsWpadConnected() && Settings.screensaver != 0) + { + if(ScreensaverTimer == 0) + ScreensaverTimer = time(0); + //30s delay to not start screensaver on startup + if(time(0)-ScreensaverTimer > 30) + WindowScreensaver(); + } + else + ScreensaverTimer = 0; + + DiscDriveCoverOld = DiscDriveCover; + + return MENU_NONE; +} + +int GameBrowseMenu::GetSelectedGame() +{ + if(gameBrowser) + return gameBrowser->GetSelectedOption(); + + else if(gameCarousel) + return gameCarousel->GetSelectedOption(); + + else if(gameGrid) + return gameGrid->GetSelectedOption(); + + return -1; +} + +int GameBrowseMenu::GetClickedGame() +{ + if(gameBrowser) + return gameBrowser->GetClickedOption(); + + else if(gameCarousel) + return gameCarousel->GetClickedOption(); + + else if(gameGrid) + return gameGrid->GetClickedOption(); + + return -1; +} + +void GameBrowseMenu::UpdateGameInfoText(const u8 * gameId) +{ + char gameregion[10]; + char IDfull[7]; + memset(IDfull, 0, sizeof(IDfull)); + snprintf(IDfull, sizeof(IDfull), (char *) gameId); + + switch (IDfull[3]) + { + case 'E': + sprintf(gameregion, "NTSC U"); + break; + case 'J': + sprintf(gameregion, "NTSC J"); + break; + case 'W': + sprintf(gameregion, "NTSC T"); + break; + default: + case 'K': + sprintf(gameregion, "NTSC K"); + break; + case 'P': + case 'D': + case 'F': + case 'I': + case 'S': + case 'H': + case 'U': + case 'X': + case 'Y': + case 'Z': + sprintf(gameregion, " PAL "); + break; + } + + HaltGui(); + if ((Settings.sinfo == GAMEINFO_ID) || (Settings.sinfo == GAMEINFO_BOTH)) + { + Remove(GameIDTxt); + delete GameIDTxt; + GameIDTxt = new GuiText(IDfull, 22, Theme.info); + GameIDTxt->SetAlignment(ALIGN_LEFT, ALIGN_TOP); + idBtn->SetEffect(EFFECT_FADE, 20); + idBtn->SetLabel(GameIDTxt); + Append(idBtn); + } + //don't try to show region for channels because all the custom channels wont follow the rules + if (((Settings.sinfo == GAMEINFO_REGION) || (Settings.sinfo == GAMEINFO_BOTH)) && mountMethod != 3) + { + Remove(GameRegionTxt); + delete GameRegionTxt; + GameRegionTxt = new GuiText(gameregion, 22, Theme.info); + GameRegionTxt->SetAlignment(ALIGN_LEFT, ALIGN_TOP); + GameRegionTxt->SetPosition(Theme.region_x, Theme.region_y); + GameRegionTxt->SetEffect(EFFECT_FADE, 20); + Append(GameRegionTxt); + } + ResumeGui(); +} + +int GameBrowseMenu::OpenClickedGame() +{ + int gameSelected = GetSelectedGame(); + if(gameSelected < 0 || gameSelected >= gameList.size()) + return -1; + + if (searchBar) + { + HaltGui(); + mainWindow->Remove(searchBar); + ResumeGui(); + } + + float size = 0.0; + rockout(gameSelected); + + struct discHdr *header = (mountMethod == 1 || mountMethod == 2 ? dvdheader : gameList[gameSelected]); + if (!mountMethod)//only get this stuff if we are booting a game from USB + WBFS_GameSize(header->id, &size); + + char IDfull[7]; + snprintf(IDfull, sizeof(IDfull), "%s", (char *) header->id); + + u8 alternatedol = OFF; + u8 ocarinaChoice = Settings.ocarina; + + GameCFG* game_cfg = GameSettings.GetGameCFG(header->id); + if (game_cfg) + { + alternatedol = game_cfg->loadalternatedol; + ocarinaChoice = game_cfg->ocarina; + } + + bool returnHere = true;// prompt to start game + int choice = -1; + + while (returnHere) + { + returnHere = false; + + if (Settings.wiilight == ON) + wiilight(1); + + if (Settings.quickboot) //quickboot game + choice = 1; + else + { + SetState(STATE_DISABLED); + choice = GameWindowPrompt(gameSelected); + SetState(STATE_DEFAULT); + } + + if (choice == 1) + { + if (alternatedol == 2) + CheckAlternativeDOL(IDfull); + + if (ocarinaChoice != OFF) + CheckOcarina(IDfull); + + wiilight(0); + GameStatistics.SetPlayCount(header->id, GameStatistics.GetPlayCount(header->id)+1); + GameStatistics.Save(); + + //Just calling that shuts down everything and starts game + BootGame(IDfull); + } + else if (choice == 2) + { + wiilight(0); + + header = (mountMethod == 1 || mountMethod == 2 ? dvdheader : gameList[gameSelected]); + SetState(STATE_DISABLED); + int settret = MenuGameSettings(header); + SetState(STATE_DEFAULT); + if (settret != MENU_DISCLIST) + returnHere = true; + else + ReloadBrowser(); + + rockout(2, GetSelectedGame()); + } + else if(choice == 3) + returnHere = true; + } + + if (searchBar) + { + HaltGui(); + mainWindow->Append(searchBar); + ResumeGui(); + } + + return 0; +} + +void GameBrowseMenu::LoadCover(struct discHdr *header) +{ + DownloadBtn->SetImage(NULL); + if(gameCover) + delete gameCover; + + gameCover = LoadCoverImage(header); + + if (gameCoverImg) + delete gameCoverImg; + + gameCoverImg = new GuiImage(gameCover); + gameCoverImg->SetWidescreen(Settings.widescreen); + + DownloadBtn->SetImage(gameCoverImg);// put the new image on the download button +} + +void GameBrowseMenu::CheckOcarina(const char * IDfull) +{ + char filepath[200]; + snprintf(filepath, sizeof(filepath), "%s%s.gct", Settings.Cheatcodespath, IDfull); + if (CheckFile(filepath) == false) + { + gprintf("\ttried to load missing gct.\n"); + sprintf(filepath, "%s %s", filepath, tr( "does not exist! Loading game without cheats." )); + WindowPrompt(tr( "Error" ), filepath, NULL, NULL, NULL, NULL, 170); + } +} + +void GameBrowseMenu::CheckAlternativeDOL(const char * IDfull) +{ + char filepath[200]; + snprintf(filepath, sizeof(filepath), "%s%s.dol", Settings.dolpath, IDfull); + if (CheckFile(filepath) == false) + { + sprintf(filepath, "%s %s", filepath, tr( "does not exist!" )); + WindowPrompt(tr( "Error" ), filepath, tr( "OK" )); + } +} + +void GameBrowseMenu::CoverDownload() +{ + int choice = WindowPrompt(tr( "Cover Download" ), 0, tr( "Normal Covers" ), tr( "3D Covers" ), + tr( "Disc Images" ), tr( "Back" )); // ask for download choice + if (choice == 0) + return; + + int choice2 = choice; + bool missing; + missing = SearchMissingImages(choice2); + if (IsNetworkInit() == false && missing == true) + { + WindowPrompt(tr( "Network init error" ), 0, tr( "OK" )); + return; + } + + if (cntMissFiles > 0) + { + char tempCnt[40]; + sprintf(tempCnt, "%i %s", cntMissFiles, tr( "Missing files" )); + if (choice != 3) + choice = WindowPrompt(tr( "Download Boxart image?" ), tempCnt, tr( "Yes" ), tr( "No" )); + else if (choice == 3) + choice = WindowPrompt(tr( "Download Discart image?" ), tempCnt, tr( "Yes" ), tr( "No" )); + if (choice == 1) + { + int ret = ProgressDownloadWindow(choice2); + if (ret == 0) + { + WindowPrompt(tr( "Download finished" ), 0, tr( "OK" )); + } + else + { + sprintf(tempCnt, "%i %s", ret, tr( "files not found on the server!" )); + WindowPrompt(tr( "Download finished" ), tempCnt, tr( "OK" )); + } + } + } +} + +void GameBrowseMenu::UpdateCallback(void * e) +{ + //! Draw the selected Icon allways on top + GameBrowseMenu * w = (GameBrowseMenu *) e; + + for(u32 i = 0; i < w->ToolBar.size(); ++i) + { + if(w->ToolBar[i]->GetState() == STATE_SELECTED) + { + w->Remove(w->ToolBar[i]); + w->Append(w->ToolBar[i]); + break; + } + } +} diff --git a/source/menu/GameBrowseMenu.hpp b/source/menu/GameBrowseMenu.hpp new file mode 100644 index 00000000..2d513465 --- /dev/null +++ b/source/menu/GameBrowseMenu.hpp @@ -0,0 +1,155 @@ +#ifndef GAMEBROWSEMENU_HPP_ +#define GAMEBROWSEMENU_HPP_ + +#include "libwiigui/gui.h" +#include "libwiigui/gui_gamebrowser.h" +#include "libwiigui/gui_gamegrid.h" +#include "libwiigui/gui_gamecarousel.h" +#include "libwiigui/gui_searchbar.h" + +class GameBrowseMenu : public GuiWindow +{ + public: + GameBrowseMenu(); + ~GameBrowseMenu(); + int Show(); + protected: + int MainLoop(); + void ReloadBrowser(); + int OpenClickedGame(); + int GetSelectedGame(); + int GetClickedGame(); + void UpdateGameInfoText(const u8 * gameId); + void LoadCover(struct discHdr *header); + void CheckAlternativeDOL(const char * IDfull); + void CheckOcarina(const char * IDfull); + void CoverDownload(); + static void UpdateCallback(void * e); + + GuiImageData * btnInstall; + GuiImageData * btnInstallOver; + GuiImageData * btnSettings; + GuiImageData * btnSettingsOver; + GuiImageData * btnpwroff; + GuiImageData * btnpwroffOver; + GuiImageData * btnhome; + GuiImageData * btnhomeOver; + GuiImageData * btnsdcardOver; + GuiImageData * btnsdcard; + GuiImageData * imgfavIcon; + GuiImageData * imgfavIcon_gray; + GuiImageData * imgsearchIcon; + GuiImageData * imgsearchIcon_gray; + GuiImageData * imgabcIcon; + GuiImageData * imgrankIcon; + GuiImageData * imgplayCountIcon; + GuiImageData * imgarrangeGrid; + GuiImageData * imgarrangeGrid_gray; + GuiImageData * imgarrangeCarousel; + GuiImageData * imgarrangeCarousel_gray; + GuiImageData * imgarrangeList; + GuiImageData * imgarrangeList_gray; + GuiImageData * imgdvd; + GuiImageData * imgdvd_gray; + GuiImageData * imgLock; + GuiImageData * imgLock_gray; + GuiImageData * imgUnlock; + GuiImageData * imgUnlock_gray; + GuiImageData * homebrewImgData; + GuiImageData * homebrewImgDataOver; + GuiImageData * gameCover; + + GuiTrigger * trigA; + GuiTrigger * trigHome; + GuiTrigger * trig1; + GuiTrigger * trig2; + + GuiImage * installBtnImg; + GuiImage * installBtnImgOver; + GuiImage * settingsBtnImg; + GuiImage * settingsBtnImgOver; + GuiImage * homeBtnImg; + GuiImage * homeBtnImgOver; + GuiImage * poweroffBtnImg; + GuiImage * poweroffBtnImgOver; + GuiImage * sdcardImg; + GuiImage * sdcardImgOver; + GuiImage * favoriteBtnImg; + GuiImage * favoriteBtnImg_g; + GuiImage * searchBtnImg; + GuiImage * searchBtnImg_g; + GuiImage * sortBtnImg; + GuiImage * listBtnImg; + GuiImage * listBtnImg_g; + GuiImage * gridBtnImg; + GuiImage * gridBtnImg_g; + GuiImage * carouselBtnImg; + GuiImage * carouselBtnImg_g; + GuiImage * lockBtnImg; + GuiImage * lockBtnImg_g; + GuiImage * unlockBtnImg; + GuiImage * unlockBtnImg_g; + GuiImage * dvdBtnImg; + GuiImage * dvdBtnImg_g; + GuiImage * homebrewImg; + GuiImage * homebrewImgOver; + GuiImage * gameCoverImg; + + GuiText * usedSpaceTxt; + GuiText * gamecntTxt; + GuiText * clockTimeBack; + GuiText * clockTime; + + GuiButton * gamecntBtn; + GuiButton * installBtn; + GuiButton * settingsBtn; + GuiButton * homeBtn; + GuiButton * poweroffBtn; + GuiButton * sdcardBtn; + GuiButton * gameInfo; + GuiButton * favoriteBtn; + GuiButton * searchBtn; + GuiButton * sortBtn; + GuiButton * listBtn; + GuiButton * gridBtn; + GuiButton * carouselBtn; + GuiButton * lockBtn; + GuiButton * dvdBtn; + GuiButton * homebrewBtn; + GuiButton * DownloadBtn; + GuiButton * idBtn; + + GuiTooltip * installBtnTT; + GuiTooltip * settingsBtnTT; + GuiTooltip * homeBtnTT; + GuiTooltip * poweroffBtnTT; + GuiTooltip * sdcardBtnTT; + GuiTooltip * favoriteBtnTT; + GuiTooltip * searchBtnTT; + GuiTooltip * sortBtnTT; + GuiTooltip * listBtnTT; + GuiTooltip * gridBtnTT; + GuiTooltip * carouselBtnTT; + GuiTooltip * lockBtnTT; + GuiTooltip * dvdBtnTT; + GuiTooltip * homebrewBtnTT; + GuiTooltip * DownloadBtnTT; + GuiTooltip * IDBtnTT; + + GuiGameBrowser * gameBrowser; + GuiGameGrid * gameGrid; + GuiGameCarousel * gameCarousel; + GuiSearchBar * searchBar; + char theTime[50]; + u32 DiscDriveCover; + u32 DiscDriveCoverOld; + int gameSelectedOld; + int gameClicked; + time_t lastrawtime; + time_t ScreensaverTimer; + bool show_searchwindow; + wchar_t searchChar; + std::vector ToolBar; +}; + +#endif diff --git a/source/menu/menu_disclist.cpp b/source/menu/menu_disclist.cpp index 3453401c..4060b7a6 100644 --- a/source/menu/menu_disclist.cpp +++ b/source/menu/menu_disclist.cpp @@ -1,1642 +1,19 @@ +#include "GameBrowseMenu.hpp" #include "menus.h" -#include "fatmounter.h" -#include "usbloader/wdvd.h" -#include "usbloader/GameList.h" -#include "usbloader/wbfs.h" -#include "patches/fst.h" -#include "network/networkops.h" -#include "prompts/gameinfo.h" -#include "prompts/DiscBrowser.h" -#include "prompts/TitleBrowser.h" -#include "settings/Settings.h" -#include "settings/CGameSettings.h" -#include "settings/CGameStatistics.h" -#include "settings/GameTitles.h" -#include "themes/CTheme.h" -#include "GameBootProcess.h" -#include "wpad.h" -#include "sys.h" - -#include "libwiigui/gui_gamebrowser.h" -#include "libwiigui/gui_gamegrid.h" -#include "libwiigui/gui_gamecarousel.h" -#include "libwiigui/gui_searchbar.h" - -extern u8 * gameScreenTex; -extern struct discHdr *dvdheader; -extern u8 mountMethod; -extern int load_from_fs; -extern s32 gameSelected; -extern GuiText * GameIDTxt; -extern GuiText * GameRegionTxt; -extern const u8 data1; -extern FreeTypeGX *fontClock; -extern bool updateavailable; -extern int cntMissFiles; -extern GuiImageData * cover; -extern GuiImage * coverImg; -extern GuiImageData * pointer[4]; -extern bool altdoldefault; -extern GuiImage * bgImg; - -GuiButton *Toolbar[9]; -int idiotFlag = -1; -char idiotChar[50]; - -void DiscListWinUpdateCallback(void * e); -void rockout(int f = 0); - -static u32 startat = 0; /**************************************************************************** * MenuDiscList ***************************************************************************/ int MenuDiscList() { - gprintf("MenuDiscList()\n"); - gameList.FilterList(); - int offset = MIN( ( int )startat, gameList.size() - 1 ); - startat = offset; - int datagB = 0; - int dataed = -1; - int selectImg1 = 0; - char ID[4]; - char IDfull[7]; - u32 covert = 0; - if (!dvdheader) dvdheader = new struct discHdr; - u8 mountMethodOLD = 0; + int retMenu = MENU_NONE; - WDVD_GetCoverStatus(&covert); - u32 covertOld = covert; + GameBrowseMenu * Menu = new GameBrowseMenu(); + mainWindow->Append(Menu); - f32 freespace, used, size = 0.0; - wchar_t searchChar; - //SCREENSAVER - int check = 0; //to skip the first cycle when wiimote isn't completely connected + retMenu = Menu->Show(); - datagB = 0; - int menu = MENU_NONE; + delete Menu; - u32 nolist; - int choice = 0, selectedold = 100; - s32 ret; - - //CLOCK - struct tm * timeinfo; - char theTime[80] = ""; - time_t lastrawtime = 0; - - if (mountMethod != 3 && WBFS_ShowFreeSpace()) - { - WBFS_DiskSpace(&used, &freespace); - } - - if (!gameList.size()) //if there is no list of games to display - { - nolist = 1; - } - - GuiImageData btnInstall(Resources::GetFile("button_install.png"), Resources::GetFileSize("button_install.png")); - GuiImageData btnInstallOver(Resources::GetFile("button_install_over.png"), Resources::GetFileSize("button_install_over.png")); - - GuiImageData btnSettings(Resources::GetFile("settings_button.png"), Resources::GetFileSize("settings_button.png")); - GuiImageData btnSettingsOver(Resources::GetFile("settings_button_over.png"), Resources::GetFileSize("settings_button_over.png")); - - GuiImageData btnpwroff(Resources::GetFile("wiimote_poweroff.png"), Resources::GetFileSize("wiimote_poweroff.png")); - GuiImageData btnpwroffOver(Resources::GetFile("wiimote_poweroff_over.png"), Resources::GetFileSize("wiimote_poweroff_over.png")); - GuiImageData btnhome(Resources::GetFile("menu_button.png"), Resources::GetFileSize("menu_button.png")); - GuiImageData btnhomeOver(Resources::GetFile("menu_button_over.png"), Resources::GetFileSize("menu_button_over.png")); - GuiImageData btnsdcardOver(Resources::GetFile("sdcard_over.png"), Resources::GetFileSize("sdcard_over.png")); - GuiImageData btnsdcard(Resources::GetFile("sdcard.png"), Resources::GetFileSize("sdcard.png")); - - GuiImageData imgfavIcon(Resources::GetFile("favIcon.png"), Resources::GetFileSize("favIcon.png")); - GuiImageData imgfavIcon_gray(Resources::GetFile("favIcon_gray.png"), Resources::GetFileSize("favIcon_gray.png")); - GuiImageData imgsearchIcon(Resources::GetFile("searchIcon.png"), Resources::GetFileSize("searchIcon.png")); - GuiImageData imgsearchIcon_gray(Resources::GetFile("searchIcon_gray.png"), Resources::GetFileSize("searchIcon_gray.png")); - GuiImageData imgabcIcon(Resources::GetFile("abcIcon.png"), Resources::GetFileSize("abcIcon.png")); - GuiImageData imgrankIcon(Resources::GetFile("rankIcon.png"), Resources::GetFileSize("rankIcon.png")); - GuiImageData imgplayCountIcon(Resources::GetFile("playCountIcon.png"), Resources::GetFileSize("playCountIcon.png")); - GuiImageData imgarrangeGrid(Resources::GetFile("arrangeGrid.png"), Resources::GetFileSize("arrangeGrid.png")); - GuiImageData imgarrangeGrid_gray(Resources::GetFile("arrangeGrid_gray.png"), Resources::GetFileSize("arrangeGrid_gray.png")); - GuiImageData imgarrangeList(Resources::GetFile("arrangeList.png"), Resources::GetFileSize("arrangeList.png")); - GuiImageData imgarrangeList_gray(Resources::GetFile("arrangeList_gray.png"), Resources::GetFileSize("arrangeList_gray.png")); - GuiImageData imgarrangeCarousel(Resources::GetFile("arrangeCarousel.png"), Resources::GetFileSize("arrangeCarousel.png")); - GuiImageData imgarrangeCarousel_gray(Resources::GetFile("arrangeCarousel_gray.png"), Resources::GetFileSize("arrangeCarousel_gray.png")); - - GuiImageData imgLock(Resources::GetFile("lock.png"), Resources::GetFileSize("lock.png")); - GuiImageData imgLock_gray(Resources::GetFile("lock_gray.png"), Resources::GetFileSize("lock_gray.png")); - GuiImageData imgUnlock(Resources::GetFile("lock_gray.png"), Resources::GetFileSize("lock_gray.png")); - GuiImageData imgUnlock_gray(Resources::GetFile("unlock_gray.png"), Resources::GetFileSize("unlock_gray.png")); - - GuiImageData imgdvd(Resources::GetFile("dvd.png"), Resources::GetFileSize("dvd.png")); - GuiImageData imgdvd_gray(Resources::GetFile("dvd_gray.png"), Resources::GetFileSize("dvd_gray.png")); - - GuiImageData homebrewImgData(Resources::GetFile("browser.png"), Resources::GetFileSize("browser.png")); - GuiImageData homebrewImgDataOver(Resources::GetFile("browser_over.png"), Resources::GetFileSize("browser_over.png")); - - GuiTrigger trigA; - trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A); - GuiTrigger trigHome; - trigHome.SetButtonOnlyTrigger(-1, WPAD_BUTTON_HOME | WPAD_CLASSIC_BUTTON_HOME, PAD_BUTTON_START); - GuiTrigger trig2; - trig2.SetButtonOnlyTrigger(-1, WPAD_BUTTON_2 | WPAD_CLASSIC_BUTTON_X, 0); - GuiTrigger trig1; - trig1.SetButtonOnlyTrigger(-1, WPAD_BUTTON_1 | WPAD_CLASSIC_BUTTON_Y, 0); - GuiTrigger trigZ; - trigZ.SetButtonOnlyTrigger(-1, WPAD_NUNCHUK_BUTTON_Z | WPAD_CLASSIC_BUTTON_ZL, PAD_TRIGGER_Z); - - GuiButton screenShotBtn(0, 0); - screenShotBtn.SetPosition(0, 0); - screenShotBtn.SetTrigger(&trigZ); - - char spaceinfo[30]; - if (load_from_fs == PART_FS_FAT) - { - memset(spaceinfo, 0, 30); - } - else - { - if (!strcmp(Settings.db_language, "JA")) - { - // needs to be "total...used" for Japanese - sprintf(spaceinfo, (mountMethod != 3 ? "%.2fGB %s %.2fGB %s" : " "), (freespace + used), tr( "of" ), - freespace, tr( "free" )); - } - else - { - sprintf(spaceinfo, (mountMethod != 3 ? "%.2fGB %s %.2fGB %s" : " "), freespace, tr( "of" ), (freespace - + used), tr( "free" )); - } - } - GuiText usedSpaceTxt(spaceinfo, 18, Theme.info); - usedSpaceTxt.SetAlignment(Theme.hddinfo_align, ALIGN_TOP); - usedSpaceTxt.SetPosition(Theme.hddinfo_x, Theme.hddinfo_y); - - char GamesCnt[15]; - sprintf(GamesCnt, "%s: %i", (mountMethod != 3 ? tr( "Games" ) : tr( "Channels" )), gameList.size()); - GuiText gamecntTxt(GamesCnt, 18, Theme.info); - - GuiButton gamecntBtn(100, 18); - gamecntBtn.SetAlignment(Theme.gamecount_align, ALIGN_TOP); - gamecntBtn.SetPosition(Theme.gamecount_x, Theme.gamecount_y); - gamecntBtn.SetLabel(&gamecntTxt); - gamecntBtn.SetEffectGrow(); - gamecntBtn.SetTrigger(&trigA); - - GuiTooltip installBtnTT(tr( "Install a game" )); - if (Settings.wsprompt) installBtnTT.SetWidescreen(Settings.widescreen); - installBtnTT.SetAlpha(Theme.tooltipAlpha); - GuiImage installBtnImg(&btnInstall); - GuiImage installBtnImgOver(&btnInstallOver); - installBtnImg.SetWidescreen(Settings.widescreen); - installBtnImgOver.SetWidescreen(Settings.widescreen); - - GuiButton installBtn(&installBtnImg, &installBtnImgOver, ALIGN_LEFT, ALIGN_TOP, Theme.install_x, Theme.install_y, - &trigA, btnSoundOver, btnSoundClick2, 1, &installBtnTT, 24, -30, 0, 5); - - GuiTooltip settingsBtnTT(tr( "Settings" )); - if (Settings.wsprompt) settingsBtnTT.SetWidescreen(Settings.widescreen); - settingsBtnTT.SetAlpha(Theme.tooltipAlpha); - GuiImage settingsBtnImg(&btnSettings); - settingsBtnImg.SetWidescreen(Settings.widescreen); - GuiImage settingsBtnImgOver(&btnSettingsOver); - settingsBtnImgOver.SetWidescreen(Settings.widescreen); - GuiButton settingsBtn(&settingsBtnImg, &settingsBtnImgOver, 0, 3, Theme.setting_x, Theme.setting_y, &trigA, - btnSoundOver, btnSoundClick2, 1, &settingsBtnTT, 65, -30, 0, 5); - - GuiTooltip homeBtnTT(tr( "Back to HBC or Wii Menu" )); - if (Settings.wsprompt) homeBtnTT.SetWidescreen(Settings.widescreen); - settingsBtnTT.SetAlpha(Theme.tooltipAlpha); - GuiImage homeBtnImg(&btnhome); - homeBtnImg.SetWidescreen(Settings.widescreen); - GuiImage homeBtnImgOver(&btnhomeOver); - homeBtnImgOver.SetWidescreen(Settings.widescreen); - GuiButton homeBtn(&homeBtnImg, &homeBtnImgOver, 0, 3, Theme.home_x, Theme.home_y, &trigA, btnSoundOver, btnSoundClick2, - 1, &homeBtnTT, 15, -30, 1, 5); - homeBtn.RemoveSoundClick(); - homeBtn.SetTrigger(&trigHome); - - GuiTooltip poweroffBtnTT(tr( "Power off the Wii" )); - if (Settings.wsprompt) poweroffBtnTT.SetWidescreen(Settings.widescreen); - poweroffBtnTT.SetAlpha(Theme.tooltipAlpha); - GuiImage poweroffBtnImg(&btnpwroff); - GuiImage poweroffBtnImgOver(&btnpwroffOver); - poweroffBtnImg.SetWidescreen(Settings.widescreen); - poweroffBtnImgOver.SetWidescreen(Settings.widescreen); - GuiButton poweroffBtn(&poweroffBtnImg, &poweroffBtnImgOver, 0, 3, Theme.power_x, Theme.power_y, &trigA, - btnSoundOver, btnSoundClick2, 1, &poweroffBtnTT, -10, -30, 1, 5); - - GuiTooltip sdcardBtnTT(tr( "Reload SD" )); - if (Settings.wsprompt) sdcardBtnTT.SetWidescreen(Settings.widescreen); - sdcardBtnTT.SetAlpha(Theme.tooltipAlpha); - GuiImage sdcardImg(&btnsdcard); - GuiImage sdcardImgOver(&btnsdcardOver); - sdcardImg.SetWidescreen(Settings.widescreen); - sdcardImgOver.SetWidescreen(Settings.widescreen); - GuiButton sdcardBtn(&sdcardImg, &sdcardImgOver, 0, 3, Theme.sdcard_x, Theme.sdcard_y, &trigA, btnSoundOver, - btnSoundClick2, 1, &sdcardBtnTT, 15, -30, 0, 5); - - GuiButton gameInfo(0, 0); - gameInfo.SetTrigger(&trig2); - gameInfo.SetSoundClick(btnSoundClick2); - - GuiTooltip favoriteBtnTT(tr( "Display favorites only" )); - if (Settings.wsprompt) favoriteBtnTT.SetWidescreen(Settings.widescreen); - favoriteBtnTT.SetAlpha(Theme.tooltipAlpha); - GuiImage favoriteBtnImg(&imgfavIcon); - favoriteBtnImg.SetWidescreen(Settings.widescreen); - GuiImage favoriteBtnImg_g(&imgfavIcon_gray); - favoriteBtnImg_g.SetWidescreen(Settings.widescreen); - GuiButton favoriteBtn(&favoriteBtnImg_g, &favoriteBtnImg_g, ALIGN_LEFT, ALIGN_TOP, Theme.gamelist_favorite_x, - Theme.gamelist_favorite_y, &trigA, btnSoundOver, btnSoundClick2, 1, &favoriteBtnTT, -15, 52, 0, 3); - favoriteBtn.SetAlpha(180); - - GuiTooltip searchBtnTT(tr( "Set Search-Filter" )); - if (Settings.wsprompt) searchBtnTT.SetWidescreen(Settings.widescreen); - searchBtnTT.SetAlpha(Theme.tooltipAlpha); - GuiImage searchBtnImg(&imgsearchIcon); - searchBtnImg.SetWidescreen(Settings.widescreen); - GuiImage searchBtnImg_g(&imgsearchIcon_gray); - searchBtnImg_g.SetWidescreen(Settings.widescreen); - GuiButton searchBtn(&searchBtnImg_g, &searchBtnImg_g, ALIGN_LEFT, ALIGN_TOP, Theme.gamelist_search_x, - Theme.gamelist_search_y, &trigA, btnSoundOver, btnSoundClick2, 1, &searchBtnTT, -15, 52, 0, 3); - searchBtn.SetAlpha(180); - - const char * sortTTText = NULL; - GuiImageData * sortImgData = NULL; - - if(Settings.GameSort & SORT_RANKING) - { - sortTTText = tr( "Sort by rank" ); - sortImgData = &imgrankIcon; - } - else if(Settings.GameSort & SORT_PLAYCOUNT) - { - sortTTText = tr( "Sort order by most played"); - sortImgData = &imgplayCountIcon; - } - else - { - sortTTText = tr("Sort alphabetically"); - sortImgData = &imgabcIcon; - } - - GuiTooltip sortBtnTT(sortTTText); - if (Settings.wsprompt) sortBtnTT.SetWidescreen(Settings.widescreen); - sortBtnTT.SetAlpha(Theme.tooltipAlpha); - - GuiImage sortBtnImg(sortImgData); - sortBtnImg.SetWidescreen(Settings.widescreen); - GuiButton sortBtn(&sortBtnImg, &sortBtnImg, ALIGN_LEFT, ALIGN_TOP, Theme.gamelist_abc_x, Theme.gamelist_abc_y, &trigA, btnSoundOver, btnSoundClick2, 1, &sortBtnTT, -15, 52, 0, 3); - - GuiTooltip listBtnTT(tr( "Display as a list" )); - if (Settings.wsprompt) listBtnTT.SetWidescreen(Settings.widescreen); - listBtnTT.SetAlpha(Theme.tooltipAlpha); - GuiImage listBtnImg(&imgarrangeList); - listBtnImg.SetWidescreen(Settings.widescreen); - GuiImage listBtnImg_g(&imgarrangeList_gray); - listBtnImg_g.SetWidescreen(Settings.widescreen); - GuiButton listBtn(&listBtnImg_g, &listBtnImg_g, ALIGN_LEFT, ALIGN_TOP, Theme.gamelist_list_x, - Theme.gamelist_list_y, &trigA, btnSoundOver, btnSoundClick2, 1, &listBtnTT, 15, 52, 1, 3); - listBtn.SetAlpha(180); - - GuiTooltip gridBtnTT(tr( "Display as a grid" )); - if (Settings.wsprompt) gridBtnTT.SetWidescreen(Settings.widescreen); - gridBtnTT.SetAlpha(Theme.tooltipAlpha); - GuiImage gridBtnImg(&imgarrangeGrid); - gridBtnImg.SetWidescreen(Settings.widescreen); - GuiImage gridBtnImg_g(&imgarrangeGrid_gray); - gridBtnImg_g.SetWidescreen(Settings.widescreen); - GuiButton gridBtn(&gridBtnImg_g, &gridBtnImg_g, ALIGN_LEFT, ALIGN_TOP, Theme.gamelist_grid_x, - Theme.gamelist_grid_y, &trigA, btnSoundOver, btnSoundClick2, 1, &gridBtnTT, 15, 52, 1, 3); - gridBtn.SetAlpha(180); - - GuiTooltip carouselBtnTT(tr( "Display as a carousel" )); - if (Settings.wsprompt) carouselBtnTT.SetWidescreen(Settings.widescreen); - carouselBtnTT.SetAlpha(Theme.tooltipAlpha); - GuiImage carouselBtnImg(&imgarrangeCarousel); - carouselBtnImg.SetWidescreen(Settings.widescreen); - GuiImage carouselBtnImg_g(&imgarrangeCarousel_gray); - carouselBtnImg_g.SetWidescreen(Settings.widescreen); - GuiButton carouselBtn(&carouselBtnImg_g, &carouselBtnImg_g, ALIGN_LEFT, ALIGN_TOP, Theme.gamelist_carousel_x, - Theme.gamelist_carousel_y, &trigA, btnSoundOver, btnSoundClick2, 1, &carouselBtnTT, 15, 52, 1, 3); - carouselBtn.SetAlpha(180); - - bool canUnlock = (Settings.parentalcontrol == 0 && Settings.Parental.enabled == 1); - - GuiTooltip lockBtnTT(canUnlock ? tr( "Unlock Parental Control" ) : tr( "Parental Control disabled" )); - if (Settings.wsprompt) lockBtnTT.SetWidescreen(Settings.widescreen); - lockBtnTT.SetAlpha(Theme.tooltipAlpha); - GuiImage lockBtnImg(&imgLock); - lockBtnImg.SetWidescreen(Settings.widescreen); - GuiImage lockBtnImg_g(&imgLock_gray); - lockBtnImg_g.SetWidescreen(Settings.widescreen); - GuiButton lockBtn(&lockBtnImg_g, &lockBtnImg_g, ALIGN_LEFT, ALIGN_TOP, Theme.gamelist_lock_x, - Theme.gamelist_lock_y, &trigA, btnSoundOver, btnSoundClick2, 1, &lockBtnTT, 15, 52, 1, 3); - lockBtn.SetAlpha(180); - - GuiTooltip unlockBtnTT(tr( "Enable Parental Control" )); - if (Settings.wsprompt) unlockBtnTT.SetWidescreen(Settings.widescreen); - unlockBtnTT.SetAlpha(Theme.tooltipAlpha); - GuiImage unlockBtnImg(&imgUnlock); - unlockBtnImg.SetWidescreen(Settings.widescreen); - GuiImage unlockBtnImg_g(&imgUnlock_gray); - unlockBtnImg_g.SetWidescreen(Settings.widescreen); - - if (canUnlock && Settings.godmode) - { - lockBtn.SetImage(&unlockBtnImg_g); - lockBtn.SetImageOver(&unlockBtnImg_g); - lockBtn.SetToolTip(&unlockBtnTT, 15, 52, 1, 3); - } - - GuiTooltip dvdBtnTT(tr( "Mount DVD drive" )); - if (Settings.wsprompt) dvdBtnTT.SetWidescreen(Settings.widescreen); - dvdBtnTT.SetAlpha(Theme.tooltipAlpha); - GuiImage dvdBtnImg(&imgdvd); - dvdBtnImg.SetWidescreen(Settings.widescreen); - GuiImage dvdBtnImg_g(dvdBtnImg); - dvdBtnImg_g.SetWidescreen(Settings.widescreen); - GuiButton dvdBtn(&dvdBtnImg_g, &dvdBtnImg_g, ALIGN_LEFT, ALIGN_TOP, Theme.gamelist_dvd_x, Theme.gamelist_dvd_y, - &trigA, btnSoundOver, btnSoundClick2, 1, &dvdBtnTT, 15, 52, 1, 3); - dvdBtn.SetAlpha(180); - - GuiTooltip homebrewBtnTT(tr( "Homebrew Launcher" )); - if (Settings.wsprompt) homebrewBtnTT.SetWidescreen(Settings.widescreen); - homebrewBtnTT.SetAlpha(Theme.tooltipAlpha); - GuiImage homebrewImg(&homebrewImgData); - GuiImage homebrewImgOver(&homebrewImgDataOver); - homebrewImg.SetWidescreen(Settings.widescreen); - homebrewImgOver.SetWidescreen(Settings.widescreen); - GuiButton homebrewBtn(&homebrewImg, &homebrewImgOver, ALIGN_LEFT, ALIGN_TOP, Theme.homebrew_x, Theme.homebrew_y, - &trigA, btnSoundOver, btnSoundClick2, 1, &homebrewBtnTT, 15, -30, 1, 5); - - if (Settings.GameSort & SORT_FAVORITE) - { - favoriteBtn.SetImage(&favoriteBtnImg); - favoriteBtn.SetImageOver(&favoriteBtnImg); - favoriteBtn.SetAlpha(255); - } - static bool show_searchwindow = false; - if (*gameList.GetCurrentFilter()) - { - if (show_searchwindow && gameList.size() == 1) show_searchwindow = false; - if (!show_searchwindow) searchBtn.SetEffect(EFFECT_PULSE, 10, 105); - searchBtn.SetImage(&searchBtnImg); - searchBtn.SetImageOver(&searchBtnImg); - searchBtn.SetAlpha(255); - } - if (Settings.gameDisplay == LIST_MODE) - { - listBtn.SetImage(&listBtnImg); - listBtn.SetImageOver(&listBtnImg); - listBtn.SetAlpha(255); - } - else if (Settings.gameDisplay == GRID_MODE) - { - gridBtn.SetImage(&gridBtnImg); - gridBtn.SetImageOver(&gridBtnImg); - gridBtn.SetAlpha(255); - } - else if (Settings.gameDisplay == CAROUSEL_MODE) - { - carouselBtn.SetImage(&carouselBtnImg); - carouselBtn.SetImageOver(&carouselBtnImg); - carouselBtn.SetAlpha(255); - } - - if (Settings.gameDisplay == LIST_MODE) - { - favoriteBtn.SetPosition(Theme.gamelist_favorite_x, Theme.gamelist_favorite_y); - searchBtn.SetPosition(Theme.gamelist_search_x, Theme.gamelist_search_y); - sortBtn.SetPosition(Theme.gamelist_abc_x, Theme.gamelist_abc_y); - listBtn.SetPosition(Theme.gamelist_list_x, Theme.gamelist_list_y); - gridBtn.SetPosition(Theme.gamelist_grid_x, Theme.gamelist_grid_y); - carouselBtn.SetPosition(Theme.gamelist_carousel_x, Theme.gamelist_carousel_y); - lockBtn.SetPosition(Theme.gamelist_lock_x, Theme.gamelist_lock_y); - dvdBtn.SetPosition(Theme.gamelist_dvd_x, Theme.gamelist_dvd_y); - } - else if (Settings.gameDisplay == GRID_MODE) - { - favoriteBtn.SetPosition(Theme.gamegrid_favorite_x, Theme.gamegrid_favorite_y); - searchBtn.SetPosition(Theme.gamegrid_search_x, Theme.gamegrid_search_y); - sortBtn.SetPosition(Theme.gamegrid_abc_x, Theme.gamegrid_abc_y); - listBtn.SetPosition(Theme.gamegrid_list_x, Theme.gamegrid_list_y); - gridBtn.SetPosition(Theme.gamegrid_grid_x, Theme.gamegrid_grid_y); - carouselBtn.SetPosition(Theme.gamegrid_carousel_x, Theme.gamegrid_carousel_y); - lockBtn.SetPosition(Theme.gamegrid_lock_x, Theme.gamegrid_lock_y); - dvdBtn.SetPosition(Theme.gamegrid_dvd_x, Theme.gamegrid_dvd_y); - } - else if (Settings.gameDisplay == CAROUSEL_MODE) - { - favoriteBtn.SetPosition(Theme.gamecarousel_favorite_x, Theme.gamecarousel_favorite_y); - searchBtn.SetPosition(Theme.gamecarousel_search_x, Theme.gamecarousel_favorite_y); - sortBtn.SetPosition(Theme.gamecarousel_abc_x, Theme.gamecarousel_abc_y); - listBtn.SetPosition(Theme.gamecarousel_list_x, Theme.gamecarousel_list_y); - gridBtn.SetPosition(Theme.gamecarousel_grid_x, Theme.gamecarousel_grid_y); - carouselBtn.SetPosition(Theme.gamecarousel_carousel_x, Theme.gamecarousel_carousel_y); - lockBtn.SetPosition(Theme.gamecarousel_lock_x, Theme.gamecarousel_lock_y); - dvdBtn.SetPosition(Theme.gamecarousel_dvd_x, Theme.gamecarousel_dvd_y); - } - - //Downloading Covers - GuiTooltip DownloadBtnTT(tr( "Click to Download Covers" )); - if (Settings.wsprompt) DownloadBtnTT.SetWidescreen(Settings.widescreen); - DownloadBtnTT.SetAlpha(Theme.tooltipAlpha); - GuiButton DownloadBtn(0, 0); - DownloadBtn.SetAlignment(ALIGN_LEFT, ALIGN_TOP); - DownloadBtn.SetPosition(Theme.covers_x, Theme.covers_y); - - GuiTooltip IDBtnTT(tr( "Click to change game ID" )); - if (Settings.wsprompt) IDBtnTT.SetWidescreen(Settings.widescreen); - IDBtnTT.SetAlpha(Theme.tooltipAlpha); - GuiButton idBtn(0, 0); - idBtn.SetAlignment(ALIGN_LEFT, ALIGN_TOP); - idBtn.SetPosition(Theme.id_x, Theme.id_y); - - if (Settings.godmode == 1 && mountMethod != 3) //only make the button have trigger & tooltip if in godmode - { - DownloadBtn.SetSoundOver(btnSoundOver); - DownloadBtn.SetTrigger(&trigA); - DownloadBtn.SetTrigger(&trig1); - DownloadBtn.SetToolTip(&DownloadBtnTT, 205, -30); - - idBtn.SetSoundOver(btnSoundOver); - idBtn.SetTrigger(&trigA); - idBtn.SetToolTip(&IDBtnTT, 205, -30); - - } - else - { - DownloadBtn.SetRumble(false); - idBtn.SetRumble(false); - } - - GuiGameBrowser * gameBrowser = NULL; - GuiGameGrid * gameGrid = NULL; - GuiGameCarousel * gameCarousel = NULL; - if (Settings.gameDisplay == LIST_MODE) - { - gameBrowser = new GuiGameBrowser(Theme.gamelist_w, Theme.gamelist_h, startat, offset); - gameBrowser->SetPosition(Theme.gamelist_x, Theme.gamelist_y); - gameBrowser->SetAlignment(ALIGN_LEFT, ALIGN_CENTRE); - } - else if (Settings.gameDisplay == GRID_MODE) - { - gameGrid = new GuiGameGrid(Theme.gamegrid_w, Theme.gamegrid_h, Settings.theme_path, bg_options_png, 0, 0); - gameGrid->SetPosition(Theme.gamegrid_x, Theme.gamegrid_y); - gameGrid->SetAlignment(ALIGN_LEFT, ALIGN_CENTRE); - } - else if (Settings.gameDisplay == CAROUSEL_MODE) - { - //GuiGameCarousel gameCarousel(Theme.gamecarousel_w, Theme.gamecarousel_h, gameList, gameList.size(), Settings.theme_path, bg_options_png, startat, offset); - gameCarousel = new GuiGameCarousel(640, 400, Settings.theme_path, bg_options_png, startat, offset); - gameCarousel->SetPosition(Theme.gamecarousel_x, Theme.gamecarousel_y); - gameCarousel->SetAlignment(ALIGN_LEFT, ALIGN_CENTRE); - } - - GuiText clockTimeBack("88:88", 40, (GXColor) {Theme.clock.r, Theme.clock.g, Theme.clock.b, Theme.clock.a / 6}); - clockTimeBack.SetAlignment(Theme.clock_align, ALIGN_TOP); - clockTimeBack.SetPosition(Theme.clock_x, Theme.clock_y); - clockTimeBack.SetFont(clock_ttf, clock_ttf_size); - GuiText clockTime(theTime, 40, Theme.clock); - clockTime.SetAlignment(Theme.clock_align, ALIGN_TOP); - clockTime.SetPosition(Theme.clock_x, Theme.clock_y); - clockTime.SetFont(clock_ttf, clock_ttf_size); - - HaltGui(); - GuiWindow w(screenwidth, screenheight); - - if (Theme.show_hddinfo == -1 || Theme.show_hddinfo == 1) //force show hdd info - { - w.Append(&usedSpaceTxt); - } - if (Theme.show_gamecount == -1 || Theme.show_gamecount == 1) //force show game cnt info - { - w.Append(&gamecntBtn); - } - w.Append(&sdcardBtn); - w.Append(&poweroffBtn); - w.Append(&gameInfo); - if (Settings.godmode) w.Append(&installBtn); - w.Append(&homeBtn); - w.Append(&settingsBtn); - w.Append(&DownloadBtn); - w.Append(&idBtn); - w.Append(&screenShotBtn); - - // Begin Toolbar - w.Append(&favoriteBtn); - Toolbar[0] = &favoriteBtn; - w.Append(&searchBtn); - Toolbar[1] = &searchBtn; - w.Append(&sortBtn); - Toolbar[2] = &sortBtn; - w.Append(&listBtn); - Toolbar[3] = &listBtn; - w.Append(&gridBtn); - Toolbar[4] = &gridBtn; - w.Append(&carouselBtn); - Toolbar[5] = &carouselBtn; - w.Append(&lockBtn); - Toolbar[6] = &lockBtn; - w.Append(&dvdBtn); - Toolbar[7] = &dvdBtn; - w.SetUpdateCallback(DiscListWinUpdateCallback); - // End Toolbar - - if (Settings.godmode == 1) w.Append(&homebrewBtn); - - if ((Settings.hddinfo == CLOCK_HR12) || (Settings.hddinfo == CLOCK_HR24)) - { - w.Append(&clockTimeBack); - w.Append(&clockTime); - } - - if (Settings.gameDisplay == LIST_MODE) - { - mainWindow->Append(gameBrowser); - } - if (Settings.gameDisplay == GRID_MODE) - { - mainWindow->Append(gameGrid); - } - if (Settings.gameDisplay == CAROUSEL_MODE) - { - mainWindow->Append(gameCarousel); - } - mainWindow->Append(&w); - - GuiSearchBar *searchBar = NULL; - if (show_searchwindow) - { - searchBar = new GuiSearchBar(gameList.GetAvailableSearchChars()); - if (searchBar) mainWindow->Append(searchBar); - } - - ResumeGui(); - - // ShowMemInfo(); - - while (menu == MENU_NONE) - { - - if (idiotFlag == 1) - { - gprintf("\tIdiot flag\n"); - char idiotBuffer[200]; - snprintf(idiotBuffer, sizeof(idiotBuffer), "%s (%s). %s", tr( "You have attempted to load a bad image" ), - idiotChar, tr( "Most likely it has dimensions that are not evenly divisible by 4." )); - - int deleteImg = WindowPrompt(0, idiotBuffer, tr( "OK" ), tr( "Delete" )); - if (deleteImg == 0) - { - snprintf(idiotBuffer, sizeof(idiotBuffer), "%s %s.", tr( "You are about to delete " ), idiotChar); - deleteImg = WindowPrompt(tr( "Confirm" ), idiotBuffer, tr( "Delete" ), tr( "Cancel" )); - if (deleteImg == 1) - { - remove(idiotChar); - } - } - idiotFlag = -1; - } - - WDVD_GetCoverStatus(&covert);//for detecting if i disc has been inserted - - //CLOCK - time_t rawtime = time(0); - if (((Settings.hddinfo == CLOCK_HR12) || (Settings.hddinfo == CLOCK_HR24)) && rawtime != lastrawtime) - { - lastrawtime = rawtime; - timeinfo = localtime(&rawtime); - if (dataed < 1) - { - if (Settings.hddinfo == CLOCK_HR12) - { - if (rawtime & 1) - strftime(theTime, sizeof(theTime), "%I:%M", timeinfo); - else strftime(theTime, sizeof(theTime), "%I %M", timeinfo); - } - if (Settings.hddinfo == CLOCK_HR24) - { - if (rawtime & 1) - strftime(theTime, sizeof(theTime), "%H:%M", timeinfo); - else strftime(theTime, sizeof(theTime), "%H %M", timeinfo); - } - clockTime.SetText(theTime); - - } - else if (dataed > 0) - { - - clockTime.SetTextf("%i", (dataed - 1)); - } - - } - - // respond to button presses - if (shutdown == 1) - { - gprintf("\n\tshutdown"); - Sys_Shutdown(); - } - if (reset == 1) Sys_Reboot(); - - if (updateavailable == true) - { - gprintf("\tUpdate Available\n"); - HaltGui(); - GuiWindow ww(640, 480); - w.SetState(STATE_DISABLED); - mainWindow->Append(&ww); - ResumeGui(); - ProgressUpdateWindow(); - updateavailable = false; - mainWindow->Remove(&ww); - w.SetState(STATE_DEFAULT); - menu = MENU_DISCLIST; - } - - if (poweroffBtn.GetState() == STATE_CLICKED) - { - - gprintf("\tpoweroffBtn clicked\n"); - choice = WindowPrompt(tr( "How to Shutdown?" ), 0, tr( "Full Shutdown" ), tr( "Shutdown to Idle" ), - tr( "Cancel" )); - if (choice == 2) - { - Sys_ShutdownToIdel(); - } - else if (choice == 1) - { - Sys_ShutdownToStandby(); - } - else - { - poweroffBtn.ResetState(); - if (Settings.gameDisplay == LIST_MODE) - { - gameBrowser->SetFocus(1); - } - else if (Settings.gameDisplay == GRID_MODE) - { - gameGrid->SetFocus(1); - } - else if (Settings.gameDisplay == CAROUSEL_MODE) - { - gameCarousel->SetFocus(1); - } - } - - } - else if (gamecntBtn.GetState() == STATE_CLICKED && mountMethod != 3) - { - gprintf("\tgameCntBtn clicked\n"); - gamecntBtn.ResetState(); - char linebuf[150]; - snprintf(linebuf, sizeof(linebuf), "%s %sGameList ?", tr( "Save Game List to" ), Settings.update_path); - choice = WindowPrompt(0, linebuf, "TXT", "CSV", tr( "Back" )); - if (choice) - { - if (save_gamelist(choice - 1)) - WindowPrompt(0, tr( "Saved" ), tr( "OK" )); - else WindowPrompt(tr( "Error" ), tr( "Could not save." ), tr( "OK" )); - } - menu = MENU_DISCLIST; - break; - - } - else if (screenShotBtn.GetState() == STATE_CLICKED) - { - gprintf("\tscreenShotBtn clicked\n"); - screenShotBtn.ResetState(); - ScreenShot(); - } - else if (homeBtn.GetState() == STATE_CLICKED) - { - gprintf("\thomeBtn clicked\n"); - bgMusic->Pause(); - choice = WindowExitPrompt(); - bgMusic->Resume(); - - if (choice == 3) - { - Sys_LoadMenu(); // Back to System Menu - } - else if (choice == 2) - { - Sys_BackToLoader(); - } - else - { - homeBtn.ResetState(); - if (Settings.gameDisplay == LIST_MODE) - { - gameBrowser->SetFocus(1); - } - else if (Settings.gameDisplay == GRID_MODE) - { - gameGrid->SetFocus(1); - } - else if (Settings.gameDisplay == CAROUSEL_MODE) - { - gameCarousel->SetFocus(1); - } - } - - } - else if (installBtn.GetState() == STATE_CLICKED) - { - choice = WindowPrompt(tr( "Install a game" ), 0, tr( "Yes" ), tr( "No" )); - if (choice == 1) - { - menu = MENU_INSTALL; - break; - } - else - { - installBtn.ResetState(); - if (Settings.gameDisplay == LIST_MODE) - { - gameBrowser->SetFocus(1); - } - else if (Settings.gameDisplay == GRID_MODE) - { - gameGrid->SetFocus(1); - } - else if (Settings.gameDisplay == CAROUSEL_MODE) - { - gameCarousel->SetFocus(1); - } - } - } - else if ((covert & 0x2) && (covert != covertOld)) - { - gprintf("\tNew Disc Detected\n"); - choice - = WindowPrompt(tr( "New Disc Detected" ), 0, tr( "Install" ), tr( "Mount DVD drive" ), - tr( "Cancel" )); - if (choice == 1) - { - menu = MENU_INSTALL; - break; - } - else if (choice == 2) - { - dvdBtn.SetState(STATE_CLICKED); - } - else - { - if (Settings.gameDisplay == LIST_MODE) - { - gameBrowser->SetFocus(1); - } - else if (Settings.gameDisplay == GRID_MODE) - { - gameGrid->SetFocus(1); - } - else if (Settings.gameDisplay == CAROUSEL_MODE) - { - gameCarousel->SetFocus(1); - } - } - } - - else if (sdcardBtn.GetState() == STATE_CLICKED) - { - gprintf("\tsdCardBtn Clicked\n"); - SDCard_deInit(); - SDCard_Init(); - if (Settings.gameDisplay == LIST_MODE) - { - startat = gameBrowser->GetSelectedOption(); - offset = gameBrowser->GetOffset(); - } - else if (Settings.gameDisplay == GRID_MODE) - { - startat = gameGrid->GetSelectedOption(); - offset = gameGrid->GetOffset(); - } - else if (Settings.gameDisplay == CAROUSEL_MODE) - { - startat = gameCarousel->GetSelectedOption(); - offset = gameCarousel->GetOffset(); - } - if (isInserted(Settings.BootDevice)) - { - HaltGui(); // to fix endless rumble when clicking on the SD icon when rumble is disabled because rumble is set to on in Global_Default() - Settings.Load(); - ResumeGui(); - } - sdcardBtn.ResetState(); - menu = MENU_DISCLIST; - break; - } - - else if (DownloadBtn.GetState() == STATE_CLICKED) - { - gprintf("\tDownloadBtn Clicked\n"); - if (isInserted(Settings.BootDevice)) - { - choice = WindowPrompt(tr( "Cover Download" ), 0, tr( "Normal Covers" ), tr( "3D Covers" ), - tr( "Disc Images" ), tr( "Back" )); // ask for download choice - if (choice != 0) - { - int choice2 = choice; - bool missing; - missing = SearchMissingImages(choice2); - if (IsNetworkInit() == false && missing == true) - { - WindowPrompt(tr( "Network init error" ), 0, tr( "OK" )); - } - else - { - if (GetMissingFiles() != NULL && cntMissFiles > 0) - { - char tempCnt[40]; - sprintf(tempCnt, "%i %s", cntMissFiles, tr( "Missing files" )); - if (choice != 3) - choice = WindowPrompt(tr( "Download Boxart image?" ), tempCnt, tr( "Yes" ), tr( "No" )); - else if (choice == 3) choice = WindowPrompt(tr( "Download Discart image?" ), tempCnt, - tr( "Yes" ), tr( "No" )); - if (choice == 1) - { - ret = ProgressDownloadWindow(choice2); - if (ret == 0) - { - WindowPrompt(tr( "Download finished" ), 0, tr( "OK" )); - } - else - { - sprintf(tempCnt, "%i %s", ret, tr( "files not found on the server!" )); - WindowPrompt(tr( "Download finished" ), tempCnt, tr( "OK" )); - } - } - } - } - } - } - else - { - WindowPrompt(tr( "No SD-Card inserted!" ), tr( "Insert an SD-Card to download images." ), tr( "OK" )); - } - menu = MENU_DISCLIST; - DownloadBtn.ResetState(); - if (Settings.gameDisplay == LIST_MODE) - { - gameBrowser->SetFocus(1); - } - else if (Settings.gameDisplay == GRID_MODE) - { - gameGrid->SetFocus(1); - } - else if (Settings.gameDisplay == CAROUSEL_MODE) - { - gameCarousel->SetFocus(1); - } - }//end download - - else if (settingsBtn.GetState() == STATE_CLICKED) - { - gprintf("\tsettingsBtn Clicked\n"); - if (Settings.gameDisplay == LIST_MODE) - { - startat = gameBrowser->GetSelectedOption(); - offset = gameBrowser->GetOffset(); - } - else if (Settings.gameDisplay == GRID_MODE) - { - startat = gameGrid->GetSelectedOption(); - offset = gameGrid->GetOffset(); - } - else if (Settings.gameDisplay == CAROUSEL_MODE) - { - startat = gameCarousel->GetSelectedOption(); - offset = gameCarousel->GetOffset(); - } - menu = MENU_SETTINGS; - break; - - } - - else if (favoriteBtn.GetState() == STATE_CLICKED) - { - favoriteBtn.ResetState(); - gprintf("\tfavoriteBtn Clicked\n"); - - if(Settings.GameSort & SORT_FAVORITE) - Settings.GameSort &= ~SORT_FAVORITE; - else - Settings.GameSort |= SORT_FAVORITE; - Settings.Save(); - menu = MENU_DISCLIST; - break; - } - - else if (searchBtn.GetState() == STATE_CLICKED && mountMethod != 3) - { - - gprintf("\tsearchBtn Clicked\n"); - show_searchwindow = !show_searchwindow; - HaltGui(); - if (searchBar) - { - mainWindow->Remove(searchBar); - delete searchBar; - searchBar = NULL; - } - if (show_searchwindow) - { - if (*gameList.GetCurrentFilter()) - { - searchBtn.StopEffect(); - searchBtn.SetEffectGrow(); - } - searchBar = new GuiSearchBar(gameList.GetAvailableSearchChars()); - if (searchBar) mainWindow->Append(searchBar); - } - else - { - if (*gameList.GetCurrentFilter()) searchBtn.SetEffect(EFFECT_PULSE, 10, 105); - } - searchBtn.ResetState(); - ResumeGui(); - } - - else if (searchBar && (searchChar = searchBar->GetClicked())) - { - if (searchChar > 27) - { - int len = gameList.GetCurrentFilter() ? wcslen(gameList.GetCurrentFilter()) : 0; - wchar_t newFilter[len + 2]; - if (gameList.GetCurrentFilter()) wcscpy(newFilter, gameList.GetCurrentFilter()); - newFilter[len] = searchChar; - newFilter[len + 1] = 0; - - gameList.FilterList(newFilter); - menu = MENU_DISCLIST; - break; - } - else if (searchChar == 7) // Close - { - show_searchwindow = false; - HaltGui(); - if (searchBar) - { - mainWindow->Remove(searchBar); - delete searchBar; - searchBar = NULL; - } - if (*gameList.GetCurrentFilter()) - { - searchBtn.SetEffect(EFFECT_PULSE, 10, 105); - searchBtn.SetImage(&searchBtnImg); - searchBtn.SetImageOver(&searchBtnImg); - searchBtn.SetAlpha(255); - } - else - { - searchBtn.StopEffect(); - searchBtn.SetEffectGrow(); - searchBtn.SetImage(&searchBtnImg_g); - searchBtn.SetImageOver(&searchBtnImg_g); - searchBtn.SetAlpha(180); - } - - ResumeGui(); - } - else if (searchChar == 8) // Backspace - { - int len = wcslen(gameList.GetCurrentFilter()); - wchar_t newFilter[len + 1]; - if (gameList.GetCurrentFilter()) wcscpy(newFilter, gameList.GetCurrentFilter()); - newFilter[len > 0 ? len - 1 : 0] = 0; - gameList.FilterList(newFilter); - menu = MENU_DISCLIST; - break; - } - - } - - else if (sortBtn.GetState() == STATE_CLICKED) - { - sortBtn.ResetState(); - gprintf("\tsortBtn clicked\n"); - if(Settings.GameSort & SORT_ABC) - { - Settings.GameSort &= ~SORT_ABC; - Settings.GameSort |= SORT_RANKING; - } - else if(Settings.GameSort & SORT_RANKING) - { - Settings.GameSort &= ~SORT_RANKING; - Settings.GameSort |= SORT_PLAYCOUNT; - } - else if(Settings.GameSort & SORT_PLAYCOUNT) - { - Settings.GameSort &= ~SORT_PLAYCOUNT; - Settings.GameSort |= SORT_ABC; - } - Settings.Save(); - menu = MENU_DISCLIST; - break; - } - - else if (listBtn.GetState() == STATE_CLICKED) - { - gprintf("\tlistBtn Clicked\n"); - if (Settings.gameDisplay != LIST_MODE) - { - Settings.gameDisplay = LIST_MODE; - menu = MENU_DISCLIST; - if (isInserted(Settings.BootDevice)) - { - Settings.Save(); - } - listBtn.ResetState(); - break; - } - else - { - listBtn.ResetState(); - } - } - - else if (gridBtn.GetState() == STATE_CLICKED) - { - gprintf("\tgridBtn Clicked\n"); - if (Settings.gameDisplay != GRID_MODE) - { - - Settings.gameDisplay = GRID_MODE; - menu = MENU_DISCLIST; - if (isInserted(Settings.BootDevice)) - { - Settings.Save(); - } - gridBtn.ResetState(); - break; - } - else - { - gridBtn.ResetState(); - } - } - - else if (carouselBtn.GetState() == STATE_CLICKED) - { - gprintf("\tcarouselBtn Clicked\n"); - if (Settings.gameDisplay != CAROUSEL_MODE) - { - Settings.gameDisplay = CAROUSEL_MODE; - menu = MENU_DISCLIST; - if (isInserted(Settings.BootDevice)) - { - Settings.Save(); - } - carouselBtn.ResetState(); - break; - } - else - { - carouselBtn.ResetState(); - } - } - - else if (homebrewBtn.GetState() == STATE_CLICKED) - { - gprintf("\thomebrewBtn Clicked\n"); - menu = MENU_HOMEBREWBROWSE; - break; - } - - else if (gameInfo.GetState() == STATE_CLICKED && mountMethod != 3) - { - gprintf("\tgameinfo Clicked\n"); - gameInfo.ResetState(); - if (selectImg1 >= 0 && selectImg1 < (s32) gameList.size()) - { - gameSelected = selectImg1; - rockout(); - struct discHdr *header = gameList[selectImg1]; - snprintf(IDfull, sizeof(IDfull), "%c%c%c%c%c%c", header->id[0], header->id[1], header->id[2], - header->id[3], header->id[4], header->id[5]); - choice = showGameInfo(IDfull); - rockout(2); - if (choice == 2) homeBtn.SetState(STATE_CLICKED); - if (choice == 3) - { - menu = MENU_DISCLIST; - break; - } - } - } - else if (lockBtn.GetState() == STATE_CLICKED) - { - gprintf("\tlockBtn clicked\n"); - lockBtn.ResetState(); - if (!canUnlock) - { - WindowPrompt( - tr( "Parental Control" ), - tr( "You don't have Parental Control enabled. If you wish to use Parental Control, enable it in the Wii Settings." ), - tr( "OK" )); - } - else - { - if (Settings.godmode) - { - if (WindowPrompt(tr( "Parental Control" ), tr( "Are you sure you want to enable Parent Control?" ), - tr( "Yes" ), tr( "No" )) == 1) - { - Settings.godmode = 0; - lockBtn.SetImage(&lockBtnImg_g); - lockBtn.SetImageOver(&lockBtnImg_g); - lockBtn.SetToolTip(&lockBtnTT, 15, 52, 1, 3); - - // Retrieve the gamelist again - menu = MENU_DISCLIST; - break; - } - } - else - { - // Require the user to enter the PIN code - char pin[5]; - memset(&pin, 0, 5); - int ret = OnScreenNumpad((char *) &pin, 5); - - if (ret == 1) - { - if (memcmp(pin, Settings.Parental.pin, 4) == 0) - { - Settings.godmode = 1; - lockBtn.SetImage(&unlockBtnImg_g); - lockBtn.SetImageOver(&unlockBtnImg_g); - lockBtn.SetToolTip(&unlockBtnTT, 15, 52, 1, 3); - - // Retrieve the gamelist again - menu = MENU_DISCLIST; - break; - } - else - { - WindowPrompt(tr( "Parental Control" ), tr( "Invalid PIN code" ), tr( "OK" )); - } - } - } - } - } - else if (dvdBtn.GetState() == STATE_CLICKED) - { - gprintf("\tdvdBtn Clicked\n"); - mountMethodOLD = (mountMethod == 3 ? mountMethod : 0); - - mountMethod = DiscMount(dvdheader); - dvdBtn.ResetState(); - - rockout(); - //break; - } - if (Settings.gameDisplay == GRID_MODE) - { - int selectimg; - DownloadBtn.SetSize(0, 0); - selectimg = gameGrid->GetSelectedOption(); - gameSelected = gameGrid->GetClickedOption(); - selectImg1 = selectimg; - } - - if (Settings.gameDisplay == CAROUSEL_MODE) - { - int selectimg; - DownloadBtn.SetSize(0, 0); - selectimg = gameCarousel->GetSelectedOption(); - gameSelected = gameCarousel->GetClickedOption(); - selectImg1 = selectimg; - } - if (Settings.gameDisplay == LIST_MODE) - { - //Get selected game under cursor - int selectimg; - DownloadBtn.SetSize(160, 224); - idBtn.SetSize(100, 40); - - selectimg = gameBrowser->GetSelectedOption(); - gameSelected = gameBrowser->GetClickedOption(); - selectImg1 = selectimg; - - if (gameSelected > 0) //if click occured - selectimg = gameSelected; - - char gameregion[7]; - if ((selectimg >= 0) && (selectimg < (s32) gameList.size())) - { - if (selectimg != selectedold) - { - selectedold = selectimg;//update displayed cover, game ID, and region if the selected game changes - struct discHdr *header = gameList[selectimg]; - snprintf(ID, sizeof(ID), "%c%c%c", header->id[0], header->id[1], header->id[2]); - snprintf(IDfull, sizeof(IDfull), "%s%c%c%c", ID, header->id[3], header->id[4], header->id[5]); - w.Remove(&DownloadBtn); - - if (GameIDTxt) - { - w.Remove(&idBtn); - delete GameIDTxt; - GameIDTxt = NULL; - } - if (GameRegionTxt) - { - w.Remove(GameRegionTxt); - delete GameRegionTxt; - GameRegionTxt = NULL; - } - - switch (header->id[3]) - { - case 'E': - sprintf(gameregion, "NTSC U"); - break; - case 'J': - sprintf(gameregion, "NTSC J"); - break; - case 'W': - sprintf(gameregion, "NTSC T"); - break; - default: - case 'K': - sprintf(gameregion, "NTSC K"); - break; - case 'P': - case 'D': - case 'F': - case 'I': - case 'S': - case 'H': - case 'U': - case 'X': - case 'Y': - case 'Z': - sprintf(gameregion, " PAL "); - break; - } - - //load game cover - if (cover) - { - delete cover; - cover = NULL; - } - - cover = LoadCoverImage(header); - - if (coverImg) - { - delete coverImg; - coverImg = NULL; - } - coverImg = new GuiImage(cover); - coverImg->SetWidescreen(Settings.widescreen); - - DownloadBtn.SetImage(coverImg);// put the new image on the download button - w.Append(&DownloadBtn); - - if ((Settings.sinfo == GAMEINFO_ID) || (Settings.sinfo == GAMEINFO_BOTH)) - { - GameIDTxt = new GuiText(IDfull, 22, Theme.info); - GameIDTxt->SetAlignment(ALIGN_LEFT, ALIGN_TOP); - //GameIDTxt->SetPosition(Theme.id_x,Theme.id_y); - idBtn.SetEffect(EFFECT_FADE, 20); - idBtn.SetLabel(GameIDTxt); - w.Append(&idBtn); - } - //don't try to show region for channels because all the custom channels wont follow the rules - if (((Settings.sinfo == GAMEINFO_REGION) || (Settings.sinfo == GAMEINFO_BOTH)) && mountMethod != 3) - { - GameRegionTxt = new GuiText(gameregion, 22, Theme.info); - GameRegionTxt->SetAlignment(ALIGN_LEFT, ALIGN_TOP); - GameRegionTxt->SetPosition(Theme.region_x, Theme.region_y); - GameRegionTxt->SetEffect(EFFECT_FADE, 20); - w.Append(GameRegionTxt); - } - } - } - - if (idBtn.GetState() == STATE_CLICKED && mountMethod != 3) - { - gprintf("\tidBtn Clicked\n"); - struct discHdr * header = gameList[gameBrowser->GetSelectedOption()]; - //enter new game ID - char entered[10]; - snprintf(entered, sizeof(entered), "%s", IDfull); - //entered[9] = '\0'; - int result = OnScreenKeyboard(entered, 7, 0); - if (result == 1) - { - WBFS_ReIDGame(header->id, entered); - //__Menu_GetEntries(); - menu = MENU_DISCLIST; - } - - idBtn.ResetState(); - } - startat = gameBrowser->GetOffset(), offset = startat; - } - - if (((gameSelected >= 0) && (gameSelected < (s32) gameList.size())) || mountMethod == 1 || mountMethod == 2) - { - if (searchBar) - { - HaltGui(); - mainWindow->Remove(searchBar); - ResumeGui(); - } - rockout(); - struct discHdr *header = (mountMethod == 1 || mountMethod == 2 ? dvdheader : gameList[gameSelected]); - // struct discHdr *header = dvdheader:gameList[gameSelected]); - if (!mountMethod)//only get this stuff it we are booting a game from USB - { - WBFS_GameSize(header->id, &size); - } - - //check if alt Dol and gct file is present - FILE *exeFile = NULL; - char nipple[100]; - header = (mountMethod == 1 || mountMethod == 2 ? dvdheader : gameList[gameSelected]); //reset header - snprintf(IDfull, sizeof(IDfull), "%c%c%c%c%c%c", header->id[0], header->id[1], header->id[2], - header->id[3], header->id[4], header->id[5]); - GameCFG* game_cfg = GameSettings.GetGameCFG(header->id); - u8 alternatedol; - u8 ocarinaChoice; - - if (game_cfg) - { - alternatedol = game_cfg->loadalternatedol; - ocarinaChoice = game_cfg->ocarina; - } - else - { - alternatedol = OFF; - ocarinaChoice = Settings.ocarina; - } - - if (Settings.quickboot == ON) //quickboot game - { - if (alternatedol == 2) - { - /* Open dol File and check exist */ - sprintf(nipple, "%s%s.dol", Settings.dolpath, IDfull); - exeFile = fopen(nipple, "rb"); - if (exeFile == NULL) - { - sprintf(nipple, "%s %s", nipple, tr( "does not exist!" )); - WindowPrompt(tr( "Error" ), nipple, tr( "OK" )); - menu = MENU_DISCLIST; - wiilight(0); - break; - } - else - { - fclose(exeFile); - } - } - if (ocarinaChoice != OFF) - { - /* Open gct File and check exist */ - sprintf(nipple, "%s%s.gct", Settings.Cheatcodespath, IDfull); - exeFile = fopen(nipple, "rb"); - if (exeFile == NULL) - { - gprintf("\ttried to load missing gct.\n"); - sprintf(nipple, "%s %s", nipple, tr( "does not exist! Loading game without cheats." )); - WindowPrompt(tr( "Error" ), nipple, NULL, NULL, NULL, NULL, 170); - } - else - { - fclose(exeFile); - } - - } - - wiilight(0); - if (isInserted(Settings.BootDevice)) - { - //////////save game play count//////////////// - GameStatistics.SetPlayCount(header->id, GameStatistics.GetPlayCount(header->id)+1); - GameStatistics.Save(); - - gprintf("\tplaycount for %c%c%c%c%c%c raised to %i\n", header->id[0], header->id[1], header->id[2], - header->id[3], header->id[4], header->id[5], GameStatistics.GetPlayCount(header->id)); - - } - //Just calling that shuts down everything and starts game - BootGame((const char *) header->id); - } - bool returnHere = true;// prompt to start game - while (returnHere) - { - returnHere = false; - if (Settings.wiilight != WIILIGHT_INSTALL) wiilight(1); - choice = GameWindowPrompt(); - // header = gameList[gameSelected]; //reset header - - if (choice == 1) - { - if (alternatedol == 2) - { - /* Open dol File and check exist */ - sprintf(nipple, "%s%s.dol", Settings.dolpath, IDfull); - exeFile = fopen(nipple, "rb"); - if (exeFile == NULL) - { - gprintf("\n\tTried to load alt dol that isn't there"); - sprintf(nipple, "%s %s", nipple, tr( "does not exist! You messed something up." )); - WindowPrompt(tr( "Error" ), nipple, tr( "OK" )); - menu = MENU_DISCLIST; - wiilight(0); - break; - } - else - { - fclose(exeFile); - } - } - if (ocarinaChoice != OFF) - { - /* Open gct File and check exist */ - sprintf(nipple, "%s%s.gct", Settings.Cheatcodespath, IDfull); - exeFile = fopen(nipple, "rb"); - if (exeFile == NULL) - { - gprintf("\ttried to load gct file that isn't there\n"); - sprintf(nipple, "%s %s", nipple, tr( "does not exist! Loading game without cheats." )); - WindowPrompt(tr( "Error" ), nipple, NULL, NULL, NULL, NULL, 170); - } - else - { - fclose(exeFile); - } - - } - wiilight(0); - returnHere = false; - //Just calling that shuts down everything and starts game - BootGame((const char *) gameList[gameSelected]->id); - } - else if (choice == 2) - { - wiilight(0); - HaltGui(); - if (Settings.gameDisplay == LIST_MODE) - mainWindow->Remove(gameBrowser); - else if (Settings.gameDisplay == GRID_MODE) - mainWindow->Remove(gameGrid); - else if (Settings.gameDisplay == CAROUSEL_MODE) mainWindow->Remove(gameCarousel); - mainWindow->Remove(&w); - ResumeGui(); - - //re-evaluate header now in case they changed games while on the game prompt - header = (mountMethod == 1 || mountMethod == 2 ? dvdheader : gameList[gameSelected]); - int settret = MenuGameSettings(header); - /* unneeded for now, kept in case database gets a separate language setting - //menu = MENU_DISCLIST; // refresh titles (needed if the language setting has changed) - */ - HaltGui(); - if (Settings.gameDisplay == LIST_MODE) - mainWindow->Append(gameBrowser); - else if (Settings.gameDisplay == GRID_MODE) - mainWindow->Append(gameGrid); - else if (Settings.gameDisplay == CAROUSEL_MODE) mainWindow->Append(gameCarousel); - mainWindow->Append(&w); - ResumeGui(); - if (settret == MENU_DISCLIST) //if deleted - { - menu = MENU_DISCLIST; - break; - } - returnHere = true; - rockout(2); - } - - else if (choice == 3 && !mountMethod) //WBFS renaming - { - wiilight(0); - //re-evaluate header now in case they changed games while on the game prompt - header = gameList[gameSelected]; - - //enter new game title - char entered[60]; - snprintf(entered, sizeof(entered), "%s", GameTitles.GetTitle(header)); - entered[59] = '\0'; - int result = OnScreenKeyboard(entered, 60, 0); - if (result == 1) - { - WBFS_RenameGame(header->id, entered); - gameList.ReadGameList(); - gameList.FilterList(); - menu = MENU_DISCLIST; - } - } - else if (choice == 0) - { - rockout(2); - if (mountMethod == 1 || mountMethod == 2) mountMethod = mountMethodOLD; - if (Settings.gameDisplay == LIST_MODE) - { - gameBrowser->SetFocus(1); - } - else if (Settings.gameDisplay == GRID_MODE) - { - gameGrid->SetFocus(1); - } - else if (Settings.gameDisplay == CAROUSEL_MODE) - { - gameCarousel->SetFocus(1); - } - } - - } - if (searchBar) - { - HaltGui(); - mainWindow->Append(searchBar); - ResumeGui(); - } - } - // to skip the first call of windowScreensaver at startup when wiimote is not connected - if (IsWpadConnected()) - { - check = 1; - } - - // screensaver is called when wiimote shuts down, depending on the wiimotet idletime - if (!IsWpadConnected() && check != 0 && Settings.screensaver != 0) - { - check++; - int screensaverIsOn = 0; - if (check == 11500) //to allow time for the wii to turn off and not show the screensaver - { - screensaverIsOn = WindowScreensaver(); - } - if (screensaverIsOn == 1) check = 0; - } - covertOld = covert; - } - - HaltGui(); - mainWindow->RemoveAll(); - mainWindow->Append(bgImg); - delete searchBar; - searchBar = NULL; - delete gameBrowser; - gameBrowser = NULL; - delete gameGrid; - gameGrid = NULL; - delete gameCarousel; - gameCarousel = NULL; - ResumeGui(); - return menu; -} - -void DiscListWinUpdateCallback(void * e) -{ - GuiWindow *w = (GuiWindow *) e; - for (int i = 0; i < 8; ++i) - { - if (Toolbar[i]->GetState() == STATE_SELECTED) - { - w->Remove(Toolbar[i]); - w->Append(Toolbar[i]); // draw the selected Icon allways on top - break; - } - } -} - -void rockout(int f) -{ - HaltGui(); - - if (gameSelected >= 0 && gameSelected < gameList.size() && (strcasestr(GameTitles.GetTitle(gameList[gameSelected]), "guitar") - || strcasestr(GameTitles.GetTitle(gameList[gameSelected]), "band") || strcasestr(GameTitles.GetTitle(gameList[gameSelected]), - "rock"))) - { - for (int i = 0; i < 4; i++) - delete pointer[i]; - pointer[0] = Resources::GetImageData("rplayer1_point.png"); - pointer[1] = Resources::GetImageData("rplayer2_point.png"); - pointer[2] = Resources::GetImageData("rplayer3_point.png"); - pointer[3] = Resources::GetImageData("rplayer4_point.png"); - } - else - { - - for (int i = 0; i < 4; i++) - delete pointer[i]; - pointer[0] = Resources::GetImageData("player1_point.png"); - pointer[1] = Resources::GetImageData("player2_point.png"); - pointer[2] = Resources::GetImageData("player3_point.png"); - pointer[3] = Resources::GetImageData("player4_point.png"); - } - ResumeGui(); + return retMenu; } diff --git a/source/mload/modules/ehcmodule_5.c b/source/mload/modules/ehcmodule_5.c index 206e0eeb..03f9c66e 100644 --- a/source/mload/modules/ehcmodule_5.c +++ b/source/mload/modules/ehcmodule_5.c @@ -1,1585 +1,1585 @@ -#define size_ehcmodule_5 25287 - -unsigned char ehcmodule_5[25287] __attribute__((aligned (32)))={ - 0x7f, 0x45, 0x4c, 0x46, 0x01, 0x02, 0x01, 0x61, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x28, 0x00, 0x00, 0x00, 0x01, 0x13, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x34, 0x00, 0x20, 0x00, 0x05, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0xa0, 0x00, 0xf0, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xd4, 0x00, 0x00, 0x00, 0xa0, - 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x34, 0x00, 0xf0, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd4, 0x00, 0x00, 0x00, 0xd4, 0x00, 0xf0, 0x00, 0x00, - 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x08, 0x13, 0x70, 0x00, 0x00, - 0x13, 0x70, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x94, 0x00, 0x00, 0x5a, 0x94, 0x00, 0xf0, 0x00, 0x05, - 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x5b, 0x9c, 0x13, 0x70, 0x60, 0x00, - 0x13, 0x70, 0x60, 0x00, 0x00, 0x00, 0x07, 0x2b, 0x00, 0x02, 0x95, 0xa8, 0x00, 0xf0, 0x00, 0x06, - 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x06, - 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x09, 0x13, 0x70, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x7d, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x7f, 0x13, 0x72, 0xf3, 0xa8, 0xe3, 0xa0, 0x00, 0x00, 0xe3, 0xa0, 0x10, 0x00, - 0xe5, 0x9f, 0x31, 0x00, 0xe1, 0x2f, 0xff, 0x13, 0xe5, 0x9f, 0xc0, 0xfc, 0xe5, 0x9c, 0xc0, 0x00, - 0xe1, 0xa0, 0x00, 0x00, 0xe7, 0x9c, 0xc1, 0x0b, 0xe1, 0xa0, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x1c, - 0xe1, 0xa0, 0x00, 0x00, 0xe1, 0xa0, 0x00, 0x00, 0xe3, 0xa0, 0xb0, 0x3f, 0xea, 0xff, 0xff, 0xf5, - 0xe1, 0xa0, 0x00, 0x00, 0xe1, 0xa0, 0x00, 0x00, 0xe3, 0xa0, 0xb0, 0x40, 0xea, 0xff, 0xff, 0xf1, - 0xe3, 0xa0, 0x00, 0x00, 0xee, 0x07, 0x0f, 0x15, 0xe1, 0x2f, 0xff, 0x1e, 0xe1, 0xa0, 0x00, 0x00, - 0xe1, 0xa0, 0x00, 0x00, 0xe1, 0xa0, 0x00, 0x00, 0xe3, 0x18, 0x00, 0x10, 0x0a, 0x00, 0x00, 0x12, - 0xe3, 0xc8, 0x80, 0x10, 0xe3, 0xa0, 0x20, 0x10, 0xe5, 0x87, 0x20, 0x00, 0xe1, 0xa0, 0x00, 0x00, - 0xe1, 0xa0, 0x20, 0x0d, 0xe1, 0xa0, 0x00, 0x00, 0xe5, 0x9f, 0xd0, 0x90, 0xe1, 0xa0, 0x00, 0x00, - 0xe9, 0x2d, 0x5f, 0xfe, 0xe1, 0xa0, 0x00, 0x00, 0xeb, 0x00, 0x00, 0x0f, 0xe8, 0xbd, 0x5f, 0xfe, - 0xe1, 0xa0, 0x00, 0x00, 0xe1, 0xa0, 0xd0, 0x02, 0xe3, 0x10, 0x00, 0x01, 0x0a, 0x00, 0x00, 0x02, - 0xe1, 0xa0, 0x00, 0x00, 0xe3, 0xa0, 0x00, 0x04, 0xeb, 0x00, 0x00, 0x05, 0xe3, 0x18, 0x00, 0x01, - 0x0a, 0x00, 0x00, 0x01, 0xe5, 0x9f, 0xf0, 0x58, 0xe1, 0xa0, 0x00, 0x00, 0xe5, 0x9f, 0xf0, 0x54, - 0xe1, 0xa0, 0x00, 0x00, 0xe5, 0x9f, 0xf0, 0x50, 0xe1, 0xa0, 0x00, 0x00, 0xe5, 0x9f, 0x20, 0x4c, - 0xe1, 0x2f, 0xff, 0x12, 0xe1, 0xa0, 0x00, 0x00, 0xee, 0x13, 0x0f, 0x10, 0xe1, 0x2f, 0xff, 0x1e, - 0xe1, 0xa0, 0x00, 0x00, 0xe1, 0xa0, 0x00, 0x00, 0xee, 0x03, 0x0f, 0x10, 0xe1, 0x2f, 0xff, 0x1e, - 0xe1, 0xa0, 0x00, 0x00, 0xe1, 0xa0, 0x00, 0x00, 0x45, 0x48, 0x43, 0x5f, 0x43, 0x46, 0x47, 0x00, - 0x12, 0x34, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x13, 0x70, 0x0e, 0x2d, 0x13, 0x72, 0xc0, 0x00, - 0x13, 0x72, 0xf5, 0xa8, 0xff, 0xff, 0x1e, 0x80, 0xff, 0xff, 0x1e, 0x9c, 0xff, 0xff, 0x1d, 0x44, - 0x13, 0x70, 0x0c, 0x59, 0xe1, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x15, 0x11, - 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x14, 0xf5, 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x15, 0x07, - 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x15, 0x07, 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x14, 0xff, - 0x46, 0xc0, 0x47, 0x78, 0xea, 0xff, 0xff, 0xb5, 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x15, 0x0d, - 0x46, 0xc0, 0x47, 0x78, 0xea, 0xff, 0xff, 0xd2, 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x15, 0x2d, - 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x15, 0x29, 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x15, 0x2f, - 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x14, 0xeb, 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x14, 0xd3, - 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x15, 0x1f, 0x46, 0xc0, 0x47, 0x78, 0xea, 0xff, 0xff, 0xa1, - 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x14, 0xe7, 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x15, 0x1f, - 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x14, 0xe7, 0x46, 0xc0, 0x47, 0x78, 0xea, 0xff, 0xff, 0xc5, - 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x14, 0xef, 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x14, 0xd1, - 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x14, 0xed, 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x14, 0xef, - 0x46, 0xc0, 0x47, 0x78, 0xea, 0xff, 0xff, 0xb7, 0x46, 0xc0, 0x47, 0x78, 0xea, 0xff, 0xff, 0x89, - 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x14, 0xd1, 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x14, 0xad, - 0xb5, 0x00, 0x28, 0x02, 0xd0, 0x11, 0x28, 0x02, 0xd8, 0x04, 0x28, 0x00, 0xd0, 0x08, 0x28, 0x01, - 0xd1, 0x04, 0xe0, 0x08, 0x28, 0x10, 0xd0, 0x0d, 0x28, 0x11, 0xd0, 0x0d, 0x48, 0x08, 0xe0, 0x0c, - 0x4b, 0x08, 0x68, 0x18, 0xe0, 0x09, 0x48, 0x08, 0xe0, 0x07, 0x4a, 0x08, 0x23, 0x01, 0x60, 0x13, - 0x20, 0x00, 0xe0, 0x02, 0x48, 0x06, 0xe0, 0x00, 0x48, 0x06, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, - 0xff, 0xff, 0xfd, 0x66, 0x13, 0x70, 0x60, 0x28, 0x13, 0x70, 0x4a, 0xd5, 0x13, 0x70, 0x67, 0x40, - 0x13, 0x70, 0x43, 0xb1, 0x13, 0x70, 0x42, 0xe5, 0xb5, 0x30, 0xb0, 0x81, 0x1c, 0x0c, 0xf7, 0xff, - 0xff, 0x8f, 0x1c, 0x05, 0x28, 0x00, 0xd1, 0x27, 0x2c, 0x00, 0xd0, 0x25, 0x68, 0x24, 0x2c, 0x00, - 0xd0, 0x22, 0x78, 0x22, 0x78, 0x63, 0x06, 0x12, 0x04, 0x1b, 0x43, 0x13, 0x78, 0xa2, 0x02, 0x12, - 0x43, 0x1a, 0x78, 0xe3, 0x43, 0x13, 0x2b, 0x06, 0xd1, 0x16, 0x7b, 0x23, 0x7b, 0x62, 0x06, 0x1b, - 0x04, 0x12, 0x43, 0x1a, 0x7b, 0xa3, 0x02, 0x1b, 0x43, 0x13, 0x7b, 0xe2, 0x43, 0x1a, 0x2a, 0x7a, - 0xd0, 0x02, 0x2a, 0x88, 0xd1, 0x08, 0xe0, 0x02, 0x48, 0x06, 0x21, 0x15, 0xe0, 0x01, 0x48, 0x05, - 0x21, 0x14, 0x1c, 0x22, 0xf0, 0x04, 0xfc, 0x82, 0xb0, 0x01, 0x1c, 0x28, 0xbc, 0x30, 0xbc, 0x02, - 0x47, 0x08, 0x46, 0xc0, 0x13, 0x70, 0x02, 0xe1, 0xb5, 0x70, 0x1c, 0x0c, 0x1c, 0x05, 0xf7, 0xff, - 0xff, 0x87, 0x1c, 0x06, 0x20, 0x01, 0x42, 0x40, 0xf7, 0xff, 0xff, 0x6e, 0x0e, 0x2b, 0x73, 0x23, - 0x0c, 0x2b, 0x73, 0x63, 0x0a, 0x2b, 0x73, 0xa3, 0x7c, 0x62, 0x7c, 0x23, 0x04, 0x12, 0x06, 0x1b, - 0x43, 0x1a, 0x7c, 0xa3, 0x73, 0xe5, 0x02, 0x1b, 0x43, 0x13, 0x7c, 0xe2, 0x06, 0x2d, 0x43, 0x1a, - 0x1c, 0x20, 0x60, 0x15, 0x30, 0x0c, 0x21, 0x04, 0xf7, 0xff, 0xff, 0x46, 0x7c, 0x23, 0x7c, 0x62, - 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, 0x7c, 0xa3, 0x7c, 0xe0, 0x02, 0x1b, 0x43, 0x13, 0x43, 0x18, - 0x21, 0x04, 0xf7, 0xff, 0xff, 0x39, 0x1c, 0x30, 0xf7, 0xff, 0xff, 0x46, 0x20, 0x00, 0xbc, 0x70, - 0xbc, 0x02, 0x47, 0x08, 0xb5, 0xf0, 0xb0, 0x8f, 0x90, 0x08, 0x91, 0x07, 0x1c, 0x08, 0x1c, 0x11, - 0x92, 0x06, 0x92, 0x09, 0xf7, 0xff, 0xff, 0x30, 0x4c, 0x7f, 0x68, 0x23, 0x2b, 0x00, 0xd1, 0x00, - 0xe0, 0xec, 0xa8, 0x0d, 0xf0, 0x01, 0xf9, 0x0e, 0x4b, 0x7c, 0x60, 0x18, 0x28, 0x00, 0xd0, 0x04, - 0x23, 0x80, 0x9a, 0x0d, 0x01, 0x1b, 0x42, 0x9a, 0xd0, 0x04, 0x4a, 0x79, 0x23, 0x01, 0x42, 0x5b, - 0x60, 0x13, 0xe0, 0xdb, 0x4d, 0x77, 0x68, 0x2a, 0x2a, 0x00, 0xdb, 0x63, 0x4b, 0x76, 0x42, 0x9a, - 0xd0, 0x60, 0x4a, 0x73, 0x68, 0x13, 0x1c, 0x58, 0xd1, 0x5c, 0x1c, 0x2e, 0x4a, 0x6e, 0x49, 0x71, - 0x68, 0x13, 0x68, 0x08, 0x33, 0x1f, 0x21, 0x1f, 0x1c, 0x1c, 0x43, 0x8c, 0x1c, 0x07, 0x21, 0x10, - 0x1c, 0x22, 0x37, 0x10, 0xf0, 0x03, 0xff, 0xf8, 0x28, 0x00, 0xd1, 0x00, 0xe0, 0xbe, 0x78, 0x23, - 0x2b, 0x43, 0xd1, 0x0a, 0x78, 0x63, 0x2b, 0x49, 0xd1, 0x07, 0x78, 0xa3, 0x2b, 0x53, 0xd1, 0x04, - 0x78, 0xe3, 0x2b, 0x4f, 0xd1, 0x01, 0x4b, 0x64, 0xe0, 0x07, 0x68, 0x33, 0x2b, 0x00, 0xd0, 0x02, - 0x23, 0x00, 0x60, 0x33, 0xe7, 0xda, 0x23, 0x01, 0x42, 0x5b, 0x60, 0x2b, 0x79, 0x62, 0x79, 0xa3, - 0x02, 0x12, 0x04, 0x1b, 0x18, 0xd2, 0x79, 0x23, 0x4e, 0x5c, 0x18, 0xd2, 0x79, 0xe3, 0x4d, 0x5c, - 0x06, 0x1b, 0x18, 0xd2, 0x0a, 0xd2, 0x60, 0x32, 0x22, 0x80, 0x01, 0x12, 0x1c, 0x28, 0x21, 0x00, - 0xf0, 0x05, 0xfa, 0x68, 0x4b, 0x53, 0x68, 0x1a, 0x4b, 0x53, 0x42, 0x9a, 0xd1, 0x1a, 0x68, 0x36, - 0x20, 0x00, 0x46, 0xb4, 0x4e, 0x53, 0x22, 0x07, 0x40, 0x02, 0xd1, 0x02, 0x10, 0xc3, 0x00, 0x9b, - 0x51, 0x9f, 0x18, 0x23, 0x7a, 0x1b, 0x2b, 0x00, 0xd0, 0x07, 0x21, 0x01, 0x10, 0xc3, 0x40, 0x91, - 0x1c, 0x0a, 0x5c, 0xe9, 0x44, 0x67, 0x43, 0x0a, 0x54, 0xea, 0x23, 0x80, 0x30, 0x01, 0x01, 0xdb, - 0x42, 0x98, 0xd1, 0xe8, 0x4b, 0x40, 0x22, 0x1f, 0x68, 0x1b, 0x33, 0x1f, 0x43, 0x93, 0x93, 0x0b, - 0x9a, 0x07, 0x23, 0x80, 0x02, 0x1b, 0x92, 0x0a, 0x93, 0x05, 0xe0, 0x63, 0x98, 0x08, 0x4a, 0x3c, - 0x0a, 0x43, 0x1c, 0x1d, 0x21, 0x0f, 0x68, 0x13, 0x43, 0x8d, 0x42, 0x9d, 0xd0, 0x3a, 0x4b, 0x39, - 0x60, 0x15, 0x68, 0x1a, 0x4b, 0x38, 0x42, 0x9a, 0xd1, 0x1e, 0x4b, 0x38, 0x1c, 0x28, 0x68, 0x1c, - 0x27, 0x07, 0x1c, 0x21, 0xf0, 0x05, 0xf8, 0xe8, 0x4a, 0x36, 0x08, 0xc6, 0x00, 0xb3, 0x58, 0x99, - 0x4b, 0x33, 0x40, 0x07, 0x20, 0x01, 0x22, 0x00, 0x93, 0x01, 0x46, 0x84, 0xe0, 0x07, 0x98, 0x01, - 0x5d, 0x83, 0x46, 0x60, 0x41, 0x13, 0x42, 0x03, 0xd0, 0x00, 0x19, 0x09, 0x32, 0x01, 0x42, 0xba, - 0xd3, 0xf5, 0x1e, 0x63, 0x40, 0x2b, 0x18, 0xcd, 0x4b, 0x24, 0x68, 0x1b, 0x1b, 0x5c, 0x2c, 0x10, - 0xdc, 0x3a, 0x2c, 0x10, 0xd0, 0x07, 0x22, 0x80, 0x98, 0x0b, 0x21, 0x00, 0x02, 0x12, 0xf0, 0x05, - 0xfa, 0x01, 0x2c, 0x00, 0xdd, 0x06, 0x1c, 0x28, 0x1c, 0x21, 0x9a, 0x0b, 0xf0, 0x03, 0xff, 0x5c, - 0x28, 0x00, 0xd0, 0x23, 0x99, 0x08, 0x4b, 0x20, 0x9a, 0x05, 0x40, 0x0b, 0x00, 0x9b, 0x98, 0x06, - 0x1a, 0xd1, 0x42, 0x81, 0xd8, 0x01, 0x1c, 0x0c, 0xe0, 0x00, 0x9c, 0x06, 0x9a, 0x0b, 0x98, 0x0a, - 0x18, 0xd1, 0x1c, 0x22, 0xf0, 0x05, 0xf9, 0xa2, 0x98, 0x0a, 0x1c, 0x21, 0xf7, 0xff, 0xfe, 0x4c, - 0x9b, 0x0a, 0x98, 0x06, 0x19, 0x1b, 0x99, 0x08, 0x93, 0x0a, 0x10, 0xa3, 0x1b, 0x00, 0x18, 0xc9, - 0x90, 0x06, 0x91, 0x08, 0x9a, 0x06, 0x2a, 0x00, 0xd1, 0x98, 0xe0, 0x07, 0x20, 0x80, 0x02, 0x00, - 0xb0, 0x0f, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x24, 0x10, 0xe7, 0xcc, 0x98, 0x07, 0x99, 0x09, - 0xf7, 0xff, 0xfe, 0x12, 0x20, 0x00, 0xe7, 0xf3, 0x13, 0x70, 0x67, 0xd0, 0x13, 0x70, 0x67, 0x4c, - 0x13, 0x70, 0x60, 0x10, 0x13, 0x70, 0x60, 0x14, 0x7f, 0xff, 0xff, 0xff, 0x13, 0x70, 0x67, 0x50, - 0x13, 0x70, 0x78, 0x00, 0x13, 0x70, 0x80, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xb5, 0xf0, 0x4b, 0xc9, - 0xb0, 0x93, 0x68, 0x18, 0x21, 0x80, 0xf7, 0xff, 0xfe, 0x23, 0x21, 0x20, 0xf7, 0xff, 0xfe, 0x24, - 0x90, 0x0a, 0xf0, 0x00, 0xfc, 0x0d, 0xf7, 0xff, 0xfd, 0xff, 0x21, 0x78, 0xf7, 0xff, 0xfd, 0xd0, - 0x99, 0x0a, 0x48, 0xc1, 0xf7, 0xff, 0xfe, 0x20, 0x48, 0xc0, 0x9a, 0x0a, 0x23, 0x00, 0x1c, 0x01, - 0xf7, 0xff, 0xfd, 0xd2, 0x49, 0xbe, 0x90, 0x08, 0x20, 0xcd, 0xf0, 0x04, 0xfb, 0x71, 0x22, 0x00, - 0x92, 0x09, 0x92, 0x0b, 0x92, 0x0c, 0x92, 0x0d, 0x4b, 0xba, 0x4a, 0xbb, 0x26, 0x01, 0x93, 0x05, - 0x92, 0x04, 0xe0, 0x00, 0x26, 0x00, 0x98, 0x0a, 0xa9, 0x11, 0x22, 0x00, 0xf7, 0xff, 0xfd, 0xd8, - 0x90, 0x10, 0x9b, 0x10, 0x2b, 0x00, 0xd1, 0xf6, 0x2e, 0x00, 0xd0, 0x02, 0x98, 0x08, 0xf7, 0xff, - 0xfd, 0xab, 0x9a, 0x05, 0x9c, 0x11, 0x23, 0x00, 0x60, 0x13, 0x2c, 0x00, 0xd1, 0x54, 0x4b, 0xaf, - 0x68, 0x1b, 0x2b, 0x00, 0xd0, 0x05, 0x4b, 0xae, 0x68, 0x1a, 0x2a, 0x00, 0xd1, 0x01, 0x4b, 0xaa, - 0x60, 0x1a, 0x9b, 0x09, 0x2b, 0x00, 0xd0, 0xdd, 0x4b, 0xa7, 0x68, 0x1b, 0x2b, 0x00, 0xd0, 0xd9, - 0x4b, 0xa7, 0x68, 0x1b, 0x2b, 0x00, 0xd1, 0xd5, 0x4b, 0xa6, 0x68, 0x1b, 0x2b, 0x00, 0xd0, 0x09, - 0xf0, 0x03, 0xfd, 0x96, 0x28, 0x00, 0xd0, 0x05, 0xf0, 0x03, 0xfd, 0x92, 0x28, 0x00, 0xd0, 0x01, - 0xf0, 0x03, 0xfd, 0x8e, 0x4b, 0x9f, 0x68, 0x1e, 0x2e, 0x00, 0xd1, 0x23, 0x4f, 0x9e, 0x4a, 0x9f, - 0x68, 0x3b, 0x3b, 0x01, 0x42, 0x93, 0xd8, 0x1d, 0x4c, 0x96, 0x4d, 0x9d, 0x23, 0x01, 0x60, 0x23, - 0x68, 0x28, 0x4a, 0x9c, 0x21, 0x01, 0xf0, 0x03, 0xfe, 0x9f, 0x60, 0x26, 0x28, 0x00, 0xd0, 0x09, - 0x23, 0x80, 0x68, 0x3a, 0x00, 0x9b, 0x42, 0x9a, 0xd1, 0x04, 0x68, 0x2b, 0x22, 0x80, 0x02, 0x12, - 0x18, 0x9b, 0x60, 0x2b, 0x49, 0x92, 0x4b, 0x94, 0x68, 0x0a, 0x68, 0x1b, 0x42, 0x9a, 0xd3, 0x01, - 0x23, 0x00, 0x60, 0x0b, 0x4b, 0x8a, 0x68, 0x1b, 0x2b, 0x00, 0xd1, 0x9b, 0x98, 0x08, 0x49, 0x83, - 0xf7, 0xff, 0xfd, 0x8e, 0x26, 0x01, 0xe7, 0x96, 0x78, 0x23, 0x78, 0x62, 0x06, 0x1b, 0x04, 0x12, - 0x43, 0x1a, 0x78, 0xa3, 0x02, 0x1b, 0x43, 0x13, 0x78, 0xe2, 0x1c, 0x16, 0x43, 0x1e, 0x2e, 0x02, - 0xd0, 0x59, 0x2e, 0x02, 0xd8, 0x02, 0x2e, 0x01, 0xd1, 0x04, 0xe0, 0x07, 0x2e, 0x06, 0xd0, 0x03, - 0x2e, 0x07, 0xd0, 0x67, 0x25, 0x01, 0xe0, 0x30, 0x25, 0x01, 0xe2, 0x4f, 0x7b, 0x23, 0x7b, 0x62, - 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, 0x7b, 0xa3, 0x49, 0x6f, 0x02, 0x1b, 0x43, 0x13, 0x7b, 0xe2, - 0x1c, 0x15, 0x43, 0x1d, 0x1c, 0x28, 0xf0, 0x05, 0xf9, 0x4d, 0x28, 0x00, 0xd1, 0x16, 0x7d, 0x23, - 0x7d, 0x62, 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, 0x7d, 0xa3, 0x02, 0x1b, 0x43, 0x13, 0x7d, 0xe2, - 0x1c, 0x15, 0x43, 0x1d, 0x9b, 0x0c, 0x2b, 0x00, 0xd0, 0x00, 0xe2, 0x2d, 0x4b, 0x68, 0x68, 0x1b, - 0x2b, 0x00, 0xd0, 0x00, 0xe2, 0x28, 0xf0, 0x04, 0xf8, 0x2b, 0xe2, 0x25, 0x49, 0x6b, 0x1c, 0x28, - 0xf0, 0x05, 0xf9, 0x30, 0x28, 0x00, 0xd0, 0x02, 0x25, 0x06, 0x42, 0x6d, 0xe2, 0x1e, 0x7d, 0x23, - 0x7d, 0x62, 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, 0x7d, 0xa3, 0x02, 0x1b, 0x43, 0x13, 0x7d, 0xe2, - 0x1c, 0x15, 0x43, 0x1d, 0x4b, 0x5a, 0x60, 0x1e, 0x4b, 0x57, 0x60, 0x18, 0x48, 0x60, 0xf0, 0x00, - 0xfa, 0x6d, 0x4b, 0x60, 0x68, 0x1b, 0x68, 0x9a, 0x23, 0x04, 0x60, 0x93, 0xf0, 0x00, 0xfd, 0xe2, - 0x23, 0x00, 0x93, 0x09, 0xe2, 0x02, 0x7a, 0x23, 0x7a, 0x62, 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, - 0x7a, 0xa3, 0x02, 0x1b, 0x43, 0x13, 0x7a, 0xe2, 0x1c, 0x10, 0x9a, 0x0b, 0x43, 0x18, 0x42, 0x82, - 0xd1, 0x02, 0x23, 0x00, 0x93, 0x0b, 0xe0, 0x03, 0xf0, 0x00, 0xfd, 0xee, 0xf0, 0x00, 0xfd, 0xe2, - 0x25, 0x00, 0xe1, 0xeb, 0x7e, 0x23, 0x7e, 0x62, 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, 0x7e, 0xa3, - 0x02, 0x1b, 0x43, 0x13, 0x7e, 0xe2, 0x1c, 0x16, 0x43, 0x1e, 0x7c, 0x62, 0x7c, 0x23, 0x04, 0x12, - 0x06, 0x1b, 0x43, 0x1a, 0x7c, 0xa3, 0x02, 0x1b, 0x43, 0x13, 0x7c, 0xe2, 0x43, 0x1a, 0x92, 0x06, - 0x7d, 0x23, 0x7d, 0x62, 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, 0x7d, 0xa3, 0x02, 0x1b, 0x43, 0x13, - 0x7d, 0xe2, 0x1c, 0x15, 0x43, 0x1d, 0x7b, 0x23, 0x2b, 0x00, 0xd1, 0x02, 0x9a, 0x0b, 0x2a, 0x00, - 0xd0, 0x01, 0x27, 0x00, 0xe0, 0x0c, 0x7a, 0x23, 0x7a, 0x62, 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, - 0x7a, 0xa3, 0x7a, 0xe0, 0x02, 0x1b, 0x43, 0x13, 0x43, 0x18, 0xf0, 0x00, 0xfd, 0xb5, 0x1c, 0x07, - 0x9b, 0x06, 0x1c, 0x30, 0x18, 0xed, 0x00, 0xe9, 0x95, 0x07, 0x1c, 0x34, 0xf7, 0xff, 0xfc, 0xac, - 0x25, 0x00, 0xe0, 0x05, 0x68, 0x20, 0x68, 0x61, 0xf7, 0xff, 0xfc, 0xa6, 0x35, 0x01, 0x34, 0x08, - 0x9a, 0x07, 0x42, 0x95, 0xdb, 0xf6, 0x4c, 0x22, 0x68, 0x20, 0x28, 0x00, 0xd0, 0x00, 0xe1, 0x87, - 0x99, 0x11, 0x7b, 0x0b, 0x7b, 0x4a, 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, 0x7b, 0x8b, 0x02, 0x1b, - 0x43, 0x13, 0x7b, 0xca, 0x43, 0x1a, 0x4b, 0x24, 0x42, 0x9a, 0xd1, 0x00, 0xe0, 0xf6, 0x42, 0x9a, - 0xd8, 0x46, 0x2a, 0x06, 0xd8, 0x0b, 0x2a, 0x05, 0xd3, 0x00, 0xe0, 0xd0, 0x2a, 0x01, 0xd1, 0x00, - 0xe0, 0x92, 0x2a, 0x00, 0xd0, 0x6c, 0x2a, 0x02, 0xd0, 0x00, 0xe1, 0x01, 0xe0, 0xc7, 0x2a, 0x1b, - 0xd8, 0x06, 0x2a, 0x1a, 0xd3, 0x00, 0xe0, 0x9f, 0x2a, 0x0c, 0xd0, 0x00, 0xe0, 0xf8, 0xe0, 0x8f, - 0x4b, 0x16, 0x42, 0x9a, 0xd1, 0x00, 0xe0, 0x9a, 0x33, 0x01, 0x42, 0x9a, 0xd0, 0x00, 0xe0, 0xef, - 0xe0, 0xc7, 0x46, 0xc0, 0x13, 0x70, 0x60, 0x28, 0x13, 0x70, 0x60, 0x50, 0x00, 0x98, 0x96, 0x80, - 0x13, 0x70, 0x02, 0x19, 0x13, 0x70, 0x67, 0xc0, 0x13, 0x70, 0x60, 0x0c, 0x13, 0x70, 0x67, 0x48, - 0x13, 0x70, 0x67, 0x40, 0x13, 0x70, 0x67, 0x6c, 0x13, 0x72, 0xc3, 0xa0, 0x00, 0x00, 0x0f, 0xfe, - 0x13, 0x70, 0x67, 0x54, 0x13, 0x70, 0x68, 0x00, 0x13, 0x72, 0xc3, 0xa4, 0x13, 0x70, 0x60, 0x5c, - 0x13, 0x70, 0x12, 0x99, 0x13, 0x70, 0x60, 0x34, 0x55, 0x4d, 0x53, 0x03, 0x55, 0x4d, 0x53, 0x01, - 0x4b, 0xac, 0x42, 0x9a, 0xd1, 0x00, 0xe0, 0x86, 0x42, 0x9a, 0xd8, 0x12, 0x3b, 0x7b, 0x42, 0x9a, - 0xd1, 0x00, 0xe0, 0xb4, 0x42, 0x9a, 0xd8, 0x04, 0x3b, 0x02, 0x42, 0x9a, 0xd0, 0x00, 0xe0, 0xb7, - 0xe0, 0xa5, 0x4b, 0xa5, 0x42, 0x9a, 0xd0, 0x72, 0x33, 0x70, 0x42, 0x9a, 0xd0, 0x00, 0xe0, 0xaf, - 0xe0, 0xaa, 0x4b, 0xa2, 0x42, 0x9a, 0xd1, 0x00, 0xe1, 0x06, 0x42, 0x9a, 0xd8, 0x07, 0x4b, 0xa0, - 0x42, 0x9a, 0xd0, 0x6e, 0x4b, 0x9f, 0x42, 0x9a, 0xd0, 0x00, 0xe0, 0xa1, 0xe0, 0xa2, 0x4b, 0x9e, - 0x42, 0x9a, 0xd1, 0x00, 0xe0, 0xed, 0x33, 0x01, 0x42, 0x9a, 0xd0, 0x00, 0xe0, 0x98, 0xe0, 0xde, - 0x2f, 0x00, 0xd1, 0x00, 0xe0, 0xfe, 0x69, 0x33, 0x88, 0x18, 0x69, 0xb3, 0x88, 0x1c, 0x6a, 0x33, - 0x88, 0x1d, 0x68, 0x33, 0x78, 0x19, 0x68, 0xb3, 0x78, 0x1a, 0x02, 0x03, 0x0a, 0x00, 0x43, 0x03, - 0x02, 0x20, 0x0a, 0x24, 0x43, 0x20, 0x04, 0x00, 0x0c, 0x00, 0x90, 0x00, 0x02, 0x28, 0x0a, 0x2d, - 0x43, 0x28, 0x04, 0x00, 0x0c, 0x00, 0x90, 0x01, 0x6b, 0x30, 0x04, 0x1b, 0x90, 0x02, 0x0c, 0x1b, - 0x1c, 0x38, 0xf0, 0x01, 0xfe, 0x95, 0xe0, 0x60, 0x2f, 0x00, 0xd1, 0x00, 0xe0, 0xda, 0x68, 0x33, - 0x1c, 0x38, 0x78, 0x19, 0x68, 0xb3, 0x88, 0x1a, 0x69, 0x33, 0xf0, 0x01, 0xfd, 0x87, 0xe0, 0x54, - 0x2f, 0x00, 0xd0, 0x00, 0xe0, 0xce, 0x68, 0x33, 0x69, 0x32, 0x78, 0x18, 0x68, 0xb3, 0x78, 0x19, - 0x69, 0xb3, 0xf0, 0x00, 0xfc, 0xed, 0xe0, 0x48, 0x25, 0x01, 0x24, 0x00, 0xe0, 0xc5, 0xf0, 0x03, - 0xfd, 0xef, 0x1c, 0x05, 0x28, 0x00, 0xda, 0x01, 0x23, 0x00, 0xe0, 0x02, 0x4a, 0x77, 0x23, 0x01, - 0x60, 0x13, 0x99, 0x11, 0x93, 0x09, 0x7a, 0x0b, 0x7a, 0x4a, 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, - 0x7a, 0x8b, 0x02, 0x1b, 0x43, 0x13, 0x7a, 0xca, 0x43, 0x1a, 0x92, 0x0b, 0xe0, 0xac, 0x4b, 0x6f, - 0x22, 0x00, 0x60, 0x18, 0xe0, 0x6a, 0x68, 0x32, 0x4b, 0x6d, 0x68, 0x12, 0x60, 0x1a, 0x25, 0x00, - 0xe0, 0xa2, 0x23, 0x01, 0x60, 0x23, 0x4b, 0x69, 0x60, 0x18, 0x48, 0x6a, 0xf0, 0x00, 0xf9, 0x0e, - 0x4b, 0x69, 0x68, 0x1b, 0x68, 0x9a, 0x23, 0x04, 0x60, 0x93, 0xf0, 0x00, 0xfc, 0x83, 0x23, 0x00, - 0x93, 0x09, 0x4c, 0x66, 0x1c, 0x20, 0xf0, 0x00, 0xfd, 0xa5, 0x4b, 0x65, 0x1c, 0x05, 0x60, 0x18, - 0x68, 0x32, 0x2a, 0x00, 0xd1, 0x00, 0xe0, 0x87, 0x68, 0x23, 0xe0, 0x68, 0x68, 0x33, 0x69, 0x32, - 0x68, 0x18, 0x68, 0xb3, 0x68, 0x19, 0xf0, 0x03, 0xfc, 0xa7, 0x1c, 0x05, 0xe0, 0x7c, 0x68, 0x33, - 0x69, 0x32, 0x68, 0x18, 0x68, 0xb3, 0x68, 0x19, 0xf0, 0x03, 0xfc, 0x38, 0xe7, 0xf5, 0x4b, 0x59, - 0x68, 0x1a, 0x42, 0x51, 0x41, 0x4a, 0xe7, 0xc9, 0x68, 0x32, 0x4b, 0x50, 0x68, 0x12, 0x60, 0x1a, - 0x25, 0x01, 0xe0, 0x69, 0x7a, 0x0b, 0x7a, 0x4a, 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, 0x7a, 0x8b, - 0x02, 0x1b, 0x43, 0x13, 0x7a, 0xca, 0x21, 0x00, 0x43, 0x1a, 0x92, 0x0b, 0x91, 0x0f, 0x68, 0x34, - 0x78, 0x23, 0x2b, 0x5f, 0xd1, 0x1c, 0x78, 0x63, 0x2b, 0x44, 0xd1, 0x19, 0x78, 0xa3, 0x2b, 0x56, - 0xd1, 0x16, 0x78, 0xe3, 0x2b, 0x44, 0xd1, 0x13, 0x4b, 0x40, 0x4c, 0x47, 0x22, 0x01, 0x60, 0x1a, - 0x60, 0x21, 0x68, 0xf3, 0x2b, 0x04, 0xd1, 0x06, 0x68, 0xb1, 0xa8, 0x0f, 0x22, 0x04, 0xf0, 0x04, - 0xfe, 0xc5, 0x9b, 0x0f, 0x60, 0x23, 0xf0, 0x04, 0xf8, 0x1f, 0x22, 0x01, 0x92, 0x09, 0xe7, 0x96, - 0x68, 0xf3, 0x2b, 0x04, 0xd1, 0x04, 0x68, 0xb1, 0xa8, 0x0f, 0x22, 0x04, 0xf0, 0x04, 0xfe, 0xb6, - 0x99, 0x0f, 0x1c, 0x20, 0xf0, 0x03, 0xff, 0x8c, 0x90, 0x0d, 0x28, 0x00, 0xd1, 0x02, 0x23, 0x01, - 0x93, 0x09, 0xe0, 0x25, 0x4a, 0x2d, 0x23, 0x01, 0x60, 0x13, 0x93, 0x09, 0xe7, 0x7f, 0xf0, 0x03, - 0xfd, 0x01, 0x1c, 0x05, 0x28, 0x00, 0xd1, 0x1f, 0x23, 0x01, 0x4a, 0x30, 0x42, 0x5b, 0x60, 0x13, - 0xe0, 0x1a, 0x4a, 0x26, 0x23, 0x01, 0x60, 0x13, 0x68, 0x33, 0x69, 0x31, 0x68, 0x18, 0x68, 0xb3, - 0x68, 0x1a, 0xf7, 0xff, 0xfc, 0x07, 0xe7, 0x90, 0x9a, 0x0d, 0x2a, 0x00, 0xd0, 0x08, 0x68, 0x33, - 0x69, 0x32, 0x68, 0x19, 0x68, 0xb3, 0x98, 0x0d, 0x68, 0x1b, 0xf0, 0x04, 0xf8, 0xb5, 0xe7, 0x5e, - 0x25, 0x01, 0xe0, 0x00, 0x25, 0x06, 0x42, 0x6d, 0x24, 0x01, 0x9a, 0x06, 0x00, 0xd3, 0x18, 0xf6, - 0x1c, 0x17, 0xe0, 0x05, 0x68, 0x30, 0x68, 0x71, 0xf7, 0xff, 0xfb, 0x26, 0x37, 0x01, 0x36, 0x08, - 0x9b, 0x07, 0x42, 0x9f, 0xdb, 0xf6, 0xe0, 0x02, 0x22, 0x01, 0x92, 0x0c, 0x24, 0x01, 0x9a, 0x04, - 0x68, 0x13, 0x2b, 0x00, 0xd1, 0x01, 0x26, 0x00, 0xe0, 0x04, 0x98, 0x08, 0x49, 0x14, 0xf7, 0xff, - 0xfb, 0x17, 0x26, 0x01, 0x2c, 0x00, 0xd1, 0x00, 0xe5, 0x1d, 0x98, 0x11, 0x1c, 0x29, 0xf7, 0xff, - 0xfa, 0xff, 0xe5, 0x18, 0x55, 0x4d, 0x53, 0x81, 0x55, 0x4d, 0x53, 0x10, 0x57, 0x46, 0x53, 0x02, - 0x55, 0x4d, 0x53, 0x82, 0x57, 0x46, 0x53, 0x01, 0x57, 0x46, 0x53, 0x03, 0x13, 0x70, 0x60, 0x0c, - 0x13, 0x70, 0x67, 0x48, 0x13, 0x70, 0x12, 0x99, 0x13, 0x70, 0x60, 0x34, 0x13, 0x72, 0xc3, 0xa0, - 0x13, 0x72, 0xc3, 0xa4, 0x13, 0x70, 0x67, 0x44, 0x13, 0x70, 0x60, 0x14, 0x13, 0x70, 0x60, 0x10, - 0x00, 0x98, 0x96, 0x80, 0xb5, 0x00, 0x4b, 0x04, 0xb0, 0x81, 0x1c, 0x01, 0x68, 0x18, 0xf7, 0xff, - 0xfa, 0xbb, 0xb0, 0x01, 0xbc, 0x01, 0x47, 0x00, 0x13, 0x70, 0x60, 0x28, 0xb5, 0x00, 0x4b, 0x0d, - 0x1c, 0x01, 0xb0, 0x81, 0x68, 0x18, 0x22, 0x20, 0xf7, 0xff, 0xfa, 0xea, 0x28, 0x00, 0xd1, 0x0d, - 0x48, 0x09, 0xf7, 0xff, 0xfa, 0xb9, 0xf0, 0x03, 0xff, 0xcd, 0x20, 0xc8, 0xf0, 0x00, 0xfa, 0x7c, - 0xf0, 0x03, 0xff, 0xbc, 0x20, 0xc8, 0xf0, 0x00, 0xfa, 0x77, 0xe7, 0xf4, 0xb0, 0x01, 0xbc, 0x02, - 0x47, 0x08, 0x46, 0xc0, 0x13, 0x70, 0x60, 0x28, 0x13, 0x70, 0x60, 0x6c, 0x4b, 0x02, 0x4a, 0x03, - 0x60, 0x18, 0x23, 0x00, 0x60, 0x13, 0x47, 0x70, 0x13, 0x70, 0x67, 0x60, 0x13, 0x70, 0x67, 0x58, - 0xb5, 0xf0, 0x4f, 0x1d, 0x21, 0x10, 0x68, 0x3b, 0x4d, 0x1c, 0x43, 0x8b, 0x60, 0x3b, 0x68, 0x2b, - 0x4e, 0x1b, 0x68, 0x9a, 0x68, 0x33, 0xb0, 0x81, 0x68, 0x54, 0x2b, 0x00, 0xd0, 0x11, 0x1c, 0x20, - 0xf0, 0x00, 0xf8, 0x36, 0x28, 0x00, 0xdc, 0x13, 0x23, 0x00, 0x60, 0x33, 0x4b, 0x15, 0x60, 0x18, - 0x20, 0x04, 0xf7, 0xff, 0xfa, 0x75, 0x68, 0x2b, 0x68, 0x9a, 0x23, 0x37, 0x40, 0x23, 0x60, 0x53, - 0xe0, 0x14, 0x4b, 0x11, 0x68, 0x1b, 0x2b, 0x00, 0xd0, 0x04, 0x1c, 0x20, 0xf0, 0x00, 0xf8, 0x20, - 0x68, 0x2b, 0x68, 0x9a, 0x23, 0x37, 0x40, 0x23, 0x60, 0x53, 0x68, 0x3b, 0x22, 0x10, 0x43, 0x13, - 0x4a, 0x0a, 0x60, 0x3b, 0x68, 0x13, 0x21, 0x10, 0x43, 0x0b, 0x60, 0x13, 0xb0, 0x01, 0x20, 0x00, - 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, 0x0d, 0x80, 0x00, 0x3c, 0x13, 0x70, 0x60, 0x34, - 0x13, 0x70, 0x67, 0x58, 0x13, 0x70, 0x67, 0x5c, 0x13, 0x70, 0x67, 0x60, 0x0d, 0x80, 0x00, 0x38, - 0x47, 0x18, 0x46, 0xc0, 0xb5, 0x70, 0x4d, 0x15, 0x4b, 0x15, 0x26, 0x02, 0x42, 0x76, 0x1c, 0x29, - 0x68, 0x18, 0x22, 0x00, 0x60, 0x2e, 0xf7, 0xff, 0xfa, 0x4b, 0x4b, 0x12, 0x22, 0x00, 0x68, 0x1b, - 0x4c, 0x11, 0x68, 0x9b, 0x60, 0x9a, 0x4b, 0x11, 0x68, 0x20, 0x60, 0x1a, 0xf7, 0xff, 0xfa, 0x1c, - 0x68, 0x20, 0xf7, 0xff, 0xfa, 0x1d, 0x23, 0x01, 0x42, 0x5b, 0x60, 0x23, 0x68, 0x2b, 0x2b, 0x00, - 0xd1, 0x03, 0x4b, 0x0b, 0x68, 0x1b, 0x60, 0x2b, 0xe0, 0x00, 0x60, 0x2e, 0x20, 0x04, 0xf7, 0xff, - 0xfa, 0x27, 0x4b, 0x02, 0x68, 0x18, 0xbc, 0x70, 0xbc, 0x02, 0x47, 0x08, 0x13, 0x70, 0x67, 0x64, - 0x13, 0x70, 0x60, 0x18, 0x13, 0x70, 0x60, 0x34, 0x13, 0x70, 0x60, 0x1c, 0x13, 0x70, 0x67, 0x58, - 0x13, 0x70, 0x67, 0x5c, 0xb5, 0x10, 0x4b, 0x0f, 0x1c, 0x04, 0x68, 0x1a, 0x1c, 0x08, 0x23, 0x01, - 0x49, 0x0d, 0xf7, 0xff, 0xf9, 0xf9, 0x4b, 0x0d, 0x21, 0x10, 0x60, 0x18, 0x48, 0x0c, 0xf0, 0x03, - 0xff, 0x47, 0x21, 0x10, 0x48, 0x0b, 0xf0, 0x03, 0xff, 0x37, 0x4b, 0x0b, 0x20, 0x04, 0x60, 0x1c, - 0x4b, 0x0a, 0x68, 0x1b, 0x68, 0x9a, 0x23, 0x37, 0x60, 0x93, 0xf7, 0xff, 0xf9, 0xf9, 0xbc, 0x10, - 0xbc, 0x01, 0x47, 0x00, 0x13, 0x70, 0x60, 0x18, 0x05, 0xf5, 0xe1, 0x00, 0x13, 0x70, 0x60, 0x1c, - 0x0d, 0x80, 0x00, 0x38, 0x0d, 0x80, 0x00, 0x3c, 0x13, 0x70, 0x67, 0x58, 0x13, 0x70, 0x60, 0x34, - 0xb5, 0x30, 0x4d, 0x11, 0x4a, 0x11, 0x68, 0x2b, 0xb0, 0x81, 0x40, 0x13, 0x60, 0x2b, 0x20, 0x80, - 0xf0, 0x03, 0xfd, 0xc0, 0x21, 0x20, 0xf7, 0xff, 0xfa, 0x07, 0x4c, 0x0d, 0x60, 0x20, 0x20, 0x04, - 0xf7, 0xff, 0xf9, 0xee, 0x68, 0x21, 0x22, 0x00, 0x20, 0x04, 0xf7, 0xff, 0xfa, 0x11, 0x68, 0x2a, - 0x23, 0x80, 0x02, 0x1b, 0x43, 0x1a, 0x60, 0x2a, 0x20, 0x04, 0xf7, 0xff, 0xf9, 0xc9, 0xb0, 0x01, - 0xbc, 0x30, 0xbc, 0x01, 0x47, 0x00, 0x46, 0xc0, 0x0d, 0x04, 0x00, 0xcc, 0xff, 0xff, 0x7f, 0xff, - 0x13, 0x70, 0x60, 0x18, 0xb5, 0x00, 0x4b, 0x06, 0x02, 0xc0, 0x68, 0x1a, 0x1c, 0x19, 0x68, 0x0b, - 0x1a, 0x9b, 0xd5, 0x00, 0x68, 0x0a, 0x42, 0x83, 0xd9, 0xf9, 0xbc, 0x01, 0x47, 0x00, 0x46, 0xc0, - 0x0d, 0x80, 0x00, 0x10, 0xb5, 0x00, 0x4b, 0x19, 0x4a, 0x19, 0x78, 0x1b, 0xb0, 0x81, 0x1e, 0x59, - 0x41, 0x8b, 0x60, 0x13, 0xf0, 0x03, 0xff, 0x1c, 0x1c, 0x03, 0x48, 0x16, 0x21, 0x04, 0x60, 0x03, - 0xf7, 0xff, 0xf9, 0xba, 0xf0, 0x03, 0xff, 0x08, 0x22, 0x00, 0x1c, 0x01, 0x48, 0x12, 0xf0, 0x03, - 0xfe, 0xbd, 0x21, 0xa0, 0x02, 0x49, 0x48, 0x11, 0xf7, 0xff, 0xf9, 0x6e, 0x4b, 0x10, 0x21, 0x80, - 0x60, 0x18, 0xf7, 0xff, 0xf9, 0xb5, 0x21, 0x20, 0xf7, 0xff, 0xf9, 0xb6, 0x4b, 0x0d, 0x60, 0x18, - 0xf0, 0x00, 0xfd, 0x7c, 0x28, 0x00, 0xda, 0x02, 0x20, 0x01, 0x42, 0x40, 0xe0, 0x02, 0xf7, 0xff, - 0xfb, 0x7d, 0x20, 0x00, 0xb0, 0x01, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, 0x13, 0x70, 0x01, 0x0c, - 0x13, 0x70, 0x67, 0x78, 0x13, 0x72, 0xc0, 0x00, 0x13, 0x70, 0x0f, 0x21, 0x13, 0x71, 0x80, 0x00, - 0x13, 0x70, 0x60, 0x28, 0x13, 0x70, 0x60, 0x20, 0xb5, 0x70, 0x1c, 0x0c, 0x1c, 0x05, 0xf7, 0xff, - 0xf9, 0x9f, 0x1c, 0x06, 0x20, 0x01, 0x42, 0x40, 0xf7, 0xff, 0xf9, 0x86, 0x68, 0x22, 0x4b, 0x11, - 0x42, 0x9a, 0xd1, 0x18, 0x4b, 0x10, 0x49, 0x11, 0x22, 0x01, 0x43, 0x13, 0x60, 0x4b, 0x22, 0x08, - 0x1c, 0x20, 0xf0, 0x04, 0xfc, 0xc3, 0x1c, 0x20, 0x21, 0x08, 0xf7, 0xff, 0xf9, 0x65, 0x1b, 0x63, - 0x4a, 0x0b, 0x08, 0x9b, 0x3b, 0x02, 0x40, 0x13, 0x4a, 0x0a, 0x1c, 0x28, 0x43, 0x13, 0x60, 0x2b, - 0x21, 0x04, 0xf7, 0xff, 0xf9, 0x59, 0x1c, 0x30, 0xf7, 0xff, 0xf9, 0x66, 0xbc, 0x70, 0xbc, 0x01, - 0x47, 0x00, 0x46, 0xc0, 0xe6, 0x00, 0x01, 0x70, 0x13, 0x70, 0x02, 0x71, 0x13, 0x70, 0x60, 0x2c, - 0x00, 0xff, 0xff, 0xff, 0xea, 0x00, 0x00, 0x00, 0xb5, 0x30, 0x1c, 0x04, 0xb0, 0x81, 0xf7, 0xff, - 0xf9, 0x1f, 0x2c, 0x26, 0xd0, 0x42, 0x2c, 0x26, 0xd8, 0x05, 0x2c, 0x24, 0xd0, 0x09, 0x2c, 0x25, - 0xd0, 0x00, 0xe0, 0x97, 0xe0, 0x0e, 0x2c, 0x39, 0xd0, 0x64, 0x2c, 0x3c, 0xd0, 0x00, 0xe0, 0x91, - 0xe0, 0x62, 0x49, 0x4b, 0x4b, 0x4b, 0x48, 0x4c, 0x60, 0x4b, 0x22, 0x08, 0xf0, 0x04, 0xfc, 0x86, - 0x48, 0x49, 0xe0, 0x84, 0x49, 0x49, 0x48, 0x4a, 0xf7, 0xff, 0xff, 0xa6, 0x4c, 0x44, 0x48, 0x49, - 0x4b, 0x49, 0x1c, 0x22, 0x60, 0x63, 0x1c, 0x03, 0xca, 0x22, 0xc3, 0x22, 0x21, 0x08, 0xf7, 0xff, - 0xf9, 0x1b, 0x48, 0x46, 0x4b, 0x46, 0x1c, 0x22, 0x60, 0x63, 0x1c, 0x03, 0xca, 0x22, 0xc3, 0x22, - 0x21, 0x08, 0xf7, 0xff, 0xf9, 0x11, 0x48, 0x43, 0x4b, 0x43, 0x1c, 0x22, 0x60, 0x63, 0x1c, 0x03, - 0xca, 0x22, 0xc3, 0x22, 0x21, 0x08, 0xf7, 0xff, 0xf9, 0x07, 0x4b, 0x36, 0x48, 0x3f, 0x60, 0x63, - 0x1c, 0x21, 0x22, 0x08, 0xf0, 0x04, 0xfc, 0x5a, 0x48, 0x3c, 0xe0, 0x58, 0x49, 0x3c, 0x48, 0x3d, - 0xf7, 0xff, 0xff, 0x7a, 0x4c, 0x2e, 0x48, 0x33, 0x4b, 0x3b, 0x1c, 0x22, 0x60, 0x63, 0x1c, 0x03, - 0xca, 0x22, 0xc3, 0x22, 0x21, 0x08, 0xf7, 0xff, 0xf8, 0xef, 0x48, 0x30, 0x4b, 0x37, 0x1c, 0x22, - 0x60, 0x63, 0x1c, 0x03, 0xca, 0x22, 0xc3, 0x22, 0x21, 0x08, 0xf7, 0xff, 0xf8, 0xe5, 0x48, 0x2d, - 0x4b, 0x33, 0x1c, 0x22, 0x60, 0x63, 0x1c, 0x03, 0xca, 0x22, 0xc3, 0x22, 0x21, 0x08, 0xf7, 0xff, - 0xf8, 0xdb, 0x4b, 0x20, 0x48, 0x2f, 0x60, 0x63, 0x1c, 0x21, 0x22, 0x08, 0xf0, 0x04, 0xfc, 0x2e, - 0x48, 0x2c, 0xe0, 0x2c, 0x48, 0x2c, 0xe0, 0x00, 0x48, 0x2c, 0x49, 0x2d, 0xf7, 0xff, 0xff, 0x4c, - 0x4c, 0x17, 0x48, 0x1c, 0x4b, 0x2b, 0x1c, 0x22, 0x60, 0x63, 0x1c, 0x03, 0xca, 0x22, 0xc3, 0x22, - 0x21, 0x08, 0xf7, 0xff, 0xf8, 0xc1, 0x48, 0x19, 0x4b, 0x27, 0x1c, 0x22, 0x60, 0x63, 0x1c, 0x03, - 0xca, 0x22, 0xc3, 0x22, 0x21, 0x08, 0xf7, 0xff, 0xf8, 0xb7, 0x48, 0x16, 0x4b, 0x23, 0x1c, 0x22, - 0x60, 0x63, 0x1c, 0x03, 0xca, 0x22, 0xc3, 0x22, 0x21, 0x08, 0xf7, 0xff, 0xf8, 0xad, 0x4b, 0x09, - 0x48, 0x1f, 0x60, 0x63, 0x1c, 0x21, 0x22, 0x08, 0xf0, 0x04, 0xfc, 0x00, 0x48, 0x1c, 0x21, 0x08, - 0xf7, 0xff, 0xf8, 0xa2, 0xb0, 0x01, 0x20, 0x00, 0xbc, 0x30, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, - 0x13, 0x70, 0x60, 0x2c, 0x13, 0x70, 0x00, 0x60, 0xff, 0xff, 0x1e, 0x78, 0x20, 0x20, 0x40, 0x8c, - 0x20, 0x20, 0x5d, 0xe8, 0x13, 0x70, 0x00, 0xbc, 0xff, 0xff, 0x1f, 0x70, 0x13, 0x70, 0x00, 0xc4, - 0xff, 0xff, 0x1f, 0x8c, 0x13, 0x70, 0x00, 0xcc, 0xff, 0xff, 0x1e, 0x34, 0xff, 0xff, 0x1f, 0x68, - 0x20, 0x20, 0x3e, 0x6c, 0x20, 0x20, 0x5b, 0x14, 0xff, 0xff, 0x1e, 0xb0, 0xff, 0xff, 0x1e, 0xcc, - 0xff, 0xff, 0x1d, 0x74, 0xff, 0xff, 0x1e, 0xa8, 0x20, 0x20, 0x5e, 0x84, 0x20, 0x20, 0x5d, 0x94, - 0x20, 0x20, 0x3f, 0x60, 0xff, 0xff, 0x21, 0x30, 0xff, 0xff, 0x21, 0x4c, 0xff, 0xff, 0x1f, 0xf4, - 0xff, 0xff, 0x21, 0x28, 0xb5, 0x30, 0x4d, 0x0c, 0xb0, 0x81, 0x23, 0x00, 0x68, 0x2a, 0x49, 0x0b, - 0xf7, 0xff, 0xf8, 0x3a, 0x4c, 0x0a, 0x49, 0x0b, 0x22, 0x00, 0x60, 0x20, 0x68, 0x28, 0xf7, 0xff, - 0xf8, 0x4f, 0x68, 0x20, 0xf7, 0xff, 0xf8, 0x28, 0x68, 0x20, 0xf7, 0xff, 0xf8, 0x29, 0xb0, 0x01, - 0xbc, 0x30, 0xbc, 0x01, 0x47, 0x00, 0x46, 0xc0, 0x13, 0x70, 0x60, 0x20, 0x00, 0x98, 0x96, 0x80, - 0x13, 0x70, 0x60, 0x24, 0x13, 0x70, 0x67, 0x68, 0xb5, 0x00, 0x1c, 0x03, 0x01, 0x40, 0x1a, 0xc0, - 0x00, 0x80, 0x18, 0xc0, 0xb0, 0x81, 0x00, 0xc0, 0xf7, 0xff, 0xff, 0xd4, 0xb0, 0x01, 0xbc, 0x01, - 0x47, 0x00, 0x46, 0xc0, 0xb5, 0xf0, 0xb0, 0x83, 0x93, 0x00, 0x46, 0x94, 0x06, 0x0b, 0x0e, 0x0a, - 0x26, 0xff, 0x43, 0x1a, 0x02, 0x36, 0x1c, 0x0b, 0x40, 0x33, 0x02, 0x1b, 0x25, 0xff, 0x43, 0x1a, - 0x04, 0x2d, 0x1c, 0x0b, 0x40, 0x2b, 0x0a, 0x1b, 0x43, 0x1a, 0x90, 0x01, 0x60, 0xc2, 0x9a, 0x01, - 0x23, 0x00, 0x62, 0x13, 0x4b, 0x2a, 0x1c, 0x0a, 0x40, 0x1a, 0x23, 0x80, 0x01, 0x5b, 0x1a, 0x98, - 0x45, 0x84, 0xd2, 0x01, 0x46, 0x64, 0xe0, 0x2f, 0x23, 0x80, 0x01, 0x5b, 0x18, 0xca, 0x4b, 0x25, - 0x1c, 0x11, 0x1c, 0x04, 0x1c, 0x2e, 0x40, 0x19, 0x98, 0x01, 0x27, 0x01, 0x25, 0x00, 0xe0, 0x18, - 0x06, 0x0b, 0x0e, 0x0a, 0x43, 0x1a, 0x23, 0xff, 0x02, 0x1b, 0x40, 0x0b, 0x02, 0x1b, 0x43, 0x1a, - 0x1c, 0x0b, 0x40, 0x33, 0x0a, 0x1b, 0x43, 0x1a, 0x61, 0x02, 0x22, 0x80, 0x01, 0x52, 0x18, 0xa4, - 0x62, 0x45, 0x45, 0x64, 0xd3, 0x00, 0x46, 0x64, 0x23, 0x80, 0x01, 0x5b, 0x18, 0xc9, 0x37, 0x01, - 0x30, 0x04, 0x45, 0x64, 0xd2, 0x01, 0x2f, 0x04, 0xdd, 0xe2, 0x45, 0x64, 0xd0, 0x04, 0x1c, 0x20, - 0x99, 0x08, 0xf0, 0x04, 0xfa, 0xd9, 0x1a, 0x64, 0x9b, 0x00, 0x04, 0x22, 0x43, 0x1a, 0x06, 0x13, - 0x0e, 0x11, 0x43, 0x19, 0x23, 0xff, 0x02, 0x1b, 0x40, 0x13, 0x02, 0x1b, 0x43, 0x19, 0x23, 0xff, - 0x04, 0x1b, 0x40, 0x1a, 0x0a, 0x12, 0x43, 0x11, 0x23, 0x80, 0x9a, 0x01, 0x04, 0x5b, 0xb0, 0x03, - 0x1c, 0x20, 0x60, 0x91, 0x64, 0x14, 0x60, 0x13, 0x60, 0x53, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, - 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xf0, 0x00, 0xb5, 0xf0, 0x26, 0xff, 0x25, 0xff, 0x22, 0x03, - 0x02, 0x36, 0x04, 0x2d, 0x46, 0x94, 0x4f, 0x18, 0xe0, 0x1e, 0x68, 0x82, 0x06, 0x13, 0x0e, 0x11, - 0x43, 0x19, 0x1c, 0x13, 0x40, 0x33, 0x02, 0x1b, 0x43, 0x19, 0x40, 0x2a, 0x0a, 0x12, 0x1c, 0x0c, - 0x43, 0x14, 0x0a, 0x23, 0x46, 0x62, 0x40, 0x13, 0x2b, 0x02, 0xd0, 0x07, 0x6b, 0xc1, 0x6c, 0x03, - 0x69, 0x4a, 0x18, 0xd2, 0x0c, 0x23, 0x40, 0x3b, 0x1a, 0xd2, 0x61, 0x4a, 0x6c, 0x03, 0x2b, 0x00, - 0xd0, 0x01, 0x06, 0x63, 0xd4, 0x03, 0x6b, 0x80, 0x28, 0x00, 0xd1, 0xde, 0xe0, 0x04, 0x6b, 0xc2, - 0x23, 0x01, 0x42, 0x5b, 0x61, 0x53, 0x1c, 0x18, 0x4b, 0x04, 0x68, 0x1a, 0x23, 0x00, 0x64, 0x13, - 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, 0x00, 0x00, 0x7f, 0xff, 0x13, 0x70, 0x60, 0x34, - 0xb5, 0x00, 0x07, 0x43, 0xd5, 0x15, 0x4b, 0x0c, 0x4a, 0x0c, 0x68, 0x1b, 0x68, 0x99, 0x6c, 0x4b, - 0x40, 0x13, 0x2b, 0x03, 0xd1, 0x02, 0x23, 0x80, 0x01, 0x9b, 0x64, 0x4b, 0x4b, 0x06, 0x4a, 0x07, - 0x68, 0x1b, 0x68, 0x99, 0x6c, 0x8b, 0x40, 0x13, 0x2b, 0x03, 0xd1, 0x02, 0x23, 0x80, 0x01, 0x9b, - 0x64, 0x8b, 0xbc, 0x01, 0x47, 0x00, 0x46, 0xc0, 0x13, 0x70, 0x60, 0x34, 0x00, 0x00, 0x20, 0x03, - 0xb5, 0xf0, 0x07, 0x43, 0xd5, 0x21, 0x24, 0x80, 0x4e, 0x11, 0x4d, 0x12, 0x4f, 0x12, 0x20, 0x00, - 0x01, 0xa4, 0x68, 0x33, 0x00, 0x82, 0x68, 0x9b, 0x33, 0x44, 0x18, 0x99, 0x68, 0x2b, 0x68, 0x0a, - 0x42, 0x98, 0xd1, 0x0a, 0x07, 0xd3, 0xd4, 0x0d, 0x4a, 0x0c, 0x23, 0x02, 0x49, 0x0c, 0x60, 0x13, - 0x68, 0x0b, 0x22, 0x20, 0x43, 0x93, 0x60, 0x0b, 0xe0, 0x04, 0x1c, 0x13, 0x40, 0x3b, 0x2b, 0x03, - 0xd1, 0x00, 0x60, 0x0c, 0x30, 0x01, 0x28, 0x04, 0xd1, 0xe3, 0xbc, 0xf0, 0xbc, 0x01, 0x47, 0x00, - 0x13, 0x70, 0x60, 0x34, 0x13, 0x70, 0x67, 0x78, 0x00, 0x00, 0x20, 0x03, 0x13, 0x70, 0x67, 0x6c, - 0x0d, 0x80, 0x00, 0xc0, 0xb5, 0x00, 0x4b, 0x0a, 0x22, 0x80, 0x68, 0x1b, 0x01, 0x92, 0x68, 0x99, - 0x6c, 0x4b, 0x42, 0x13, 0xd1, 0x00, 0x64, 0x4a, 0x4b, 0x05, 0x22, 0x80, 0x68, 0x1b, 0x01, 0x92, - 0x68, 0x99, 0x6c, 0x8b, 0x42, 0x13, 0xd1, 0x00, 0x64, 0x8a, 0x20, 0x00, 0xbc, 0x02, 0x47, 0x08, - 0x13, 0x70, 0x60, 0x34, 0xb5, 0x00, 0x28, 0x00, 0xd0, 0x02, 0x23, 0x01, 0x42, 0x5b, 0x62, 0x03, - 0x20, 0x00, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, 0x4b, 0x06, 0x49, 0x07, 0x78, 0x1a, 0x68, 0x08, - 0x1e, 0x53, 0x41, 0x9a, 0x4b, 0x05, 0x60, 0x1a, 0x00, 0x93, 0x18, 0x9b, 0x00, 0xdb, 0x33, 0x58, - 0x18, 0xc0, 0x47, 0x70, 0x13, 0x70, 0x01, 0x0c, 0x13, 0x70, 0x60, 0x34, 0x13, 0x70, 0x67, 0x78, - 0xb5, 0x10, 0x1c, 0x18, 0x4b, 0x12, 0x1c, 0x14, 0x78, 0x1a, 0x1e, 0x53, 0x41, 0x9a, 0x4b, 0x11, - 0x60, 0x1a, 0x4b, 0x11, 0x68, 0x19, 0x00, 0x93, 0x18, 0x9b, 0x00, 0xdb, 0x18, 0xc9, 0x6f, 0x0b, - 0x2b, 0x00, 0xd0, 0x10, 0x23, 0x00, 0x80, 0x03, 0x80, 0x43, 0x31, 0x60, 0x88, 0x0b, 0x04, 0x1b, - 0x0a, 0x1a, 0x0e, 0x1b, 0x43, 0x1a, 0x80, 0x82, 0x88, 0x4b, 0x04, 0x1b, 0x0a, 0x1a, 0x0e, 0x1b, - 0x43, 0x1a, 0x80, 0xc2, 0x23, 0x01, 0x20, 0x00, 0x70, 0x23, 0xbc, 0x10, 0xbc, 0x02, 0x47, 0x08, - 0x13, 0x70, 0x01, 0x0c, 0x13, 0x70, 0x67, 0x78, 0x13, 0x70, 0x60, 0x34, 0xb5, 0xf0, 0xb0, 0x81, - 0x1c, 0x07, 0x28, 0x00, 0xd1, 0x04, 0x4a, 0x20, 0x23, 0x30, 0x70, 0x13, 0x70, 0x50, 0xe0, 0x36, - 0x4d, 0x1e, 0x1c, 0x06, 0x1c, 0x30, 0x21, 0x0a, 0xf0, 0x04, 0xf9, 0xb6, 0x1c, 0x30, 0x1c, 0x0c, - 0x21, 0x0a, 0xf0, 0x04, 0xf9, 0x67, 0x17, 0xe3, 0x18, 0xe4, 0x40, 0x5c, 0x34, 0x30, 0x4b, 0x18, - 0x70, 0x2c, 0x3d, 0x01, 0x1c, 0x06, 0x42, 0x9d, 0xd1, 0xec, 0x1c, 0x2a, 0x3a, 0x0f, 0x23, 0x00, - 0x76, 0x93, 0x2f, 0x00, 0xdb, 0x01, 0x20, 0x00, 0xe0, 0x02, 0x23, 0x2d, 0x70, 0x13, 0x20, 0x01, - 0x22, 0x10, 0x49, 0x0d, 0xe0, 0x00, 0x32, 0x01, 0x5c, 0x8b, 0x2b, 0x30, 0xd0, 0xfb, 0x2b, 0x00, - 0xd1, 0x00, 0x3a, 0x01, 0x4b, 0x08, 0x18, 0x99, 0x18, 0x1b, 0xe0, 0x02, 0x70, 0x1a, 0x30, 0x01, - 0x33, 0x01, 0x78, 0x0a, 0x31, 0x01, 0x2a, 0x00, 0xd1, 0xf8, 0x4b, 0x03, 0x54, 0x1a, 0xb0, 0x01, - 0xbc, 0xf0, 0xbc, 0x01, 0x47, 0x00, 0x46, 0xc0, 0x13, 0x72, 0xc1, 0xe0, 0x13, 0x72, 0xc1, 0xf9, - 0x13, 0x72, 0xc1, 0xef, 0xb5, 0xf0, 0xb0, 0x81, 0x1c, 0x06, 0x28, 0x00, 0xd1, 0x04, 0x4a, 0x1a, - 0x23, 0x30, 0x70, 0x13, 0x70, 0x50, 0xe0, 0x2a, 0x4d, 0x18, 0x1c, 0x2f, 0x3f, 0x0a, 0x1c, 0x30, - 0x21, 0x0a, 0xf0, 0x04, 0xf9, 0x17, 0x1c, 0x30, 0x1c, 0x0c, 0x21, 0x0a, 0xf0, 0x04, 0xf8, 0xd4, - 0x34, 0x30, 0x70, 0x2c, 0x3d, 0x01, 0x1c, 0x06, 0x42, 0xbd, 0xd1, 0xf0, 0x1c, 0x2a, 0x23, 0x00, - 0x3a, 0x0f, 0x76, 0x93, 0x23, 0x10, 0xe0, 0x00, 0x33, 0x01, 0x5c, 0xd1, 0x29, 0x30, 0xd0, 0xfb, - 0x29, 0x00, 0xd1, 0x00, 0x3b, 0x01, 0x48, 0x08, 0x22, 0x00, 0x18, 0xc1, 0x1c, 0x04, 0xe0, 0x01, - 0x54, 0xa3, 0x32, 0x01, 0x78, 0x0b, 0x31, 0x01, 0x2b, 0x00, 0xd1, 0xf9, 0x54, 0x83, 0xb0, 0x01, - 0xbc, 0xf0, 0xbc, 0x01, 0x47, 0x00, 0x46, 0xc0, 0x13, 0x72, 0xc1, 0xe0, 0x13, 0x72, 0xc1, 0xf9, - 0xb5, 0x10, 0x28, 0x00, 0xd1, 0x04, 0x4a, 0x19, 0x23, 0x30, 0x70, 0x13, 0x70, 0x50, 0xe0, 0x2a, - 0x4a, 0x17, 0x24, 0x0f, 0x1c, 0x11, 0x39, 0x08, 0x1c, 0x03, 0x40, 0x23, 0x09, 0x00, 0x2b, 0x09, - 0xdd, 0x00, 0x33, 0x07, 0x33, 0x30, 0x70, 0x13, 0x3a, 0x01, 0x42, 0x8a, 0xd1, 0xf4, 0x3a, 0x0f, - 0x23, 0x00, 0x76, 0x13, 0x23, 0x30, 0x70, 0x13, 0x23, 0x78, 0x70, 0x53, 0x23, 0x10, 0xe0, 0x00, - 0x33, 0x01, 0x5c, 0xd1, 0x29, 0x30, 0xd0, 0xfb, 0x29, 0x00, 0xd1, 0x00, 0x3b, 0x01, 0x48, 0x07, - 0x22, 0x02, 0x18, 0xc1, 0x1c, 0x04, 0xe0, 0x01, 0x54, 0xa3, 0x32, 0x01, 0x78, 0x0b, 0x31, 0x01, - 0x2b, 0x00, 0xd1, 0xf9, 0x54, 0x83, 0xbc, 0x10, 0xbc, 0x01, 0x47, 0x00, 0x13, 0x72, 0xc1, 0xe0, - 0x13, 0x72, 0xc1, 0xf7, 0xb5, 0x00, 0x28, 0x00, 0xd0, 0x01, 0x23, 0x00, 0x60, 0x03, 0x4b, 0x0c, - 0x78, 0x1b, 0x2b, 0x01, 0xd1, 0x11, 0x4b, 0x0b, 0x78, 0x1a, 0x2a, 0x10, 0xd0, 0x0d, 0x28, 0x00, - 0xd0, 0x04, 0x4b, 0x09, 0x32, 0x04, 0x00, 0x92, 0x58, 0xd3, 0x60, 0x03, 0x4b, 0x05, 0x4a, 0x06, - 0x78, 0x1b, 0x33, 0x14, 0x00, 0x9b, 0x58, 0x98, 0xe0, 0x00, 0x20, 0x00, 0xbc, 0x02, 0x47, 0x08, - 0x13, 0x70, 0x67, 0x9c, 0x13, 0x70, 0x60, 0x3c, 0x13, 0x72, 0xc2, 0x00, 0xb5, 0xf0, 0x4a, 0x67, - 0xb0, 0x8b, 0x68, 0x13, 0x2b, 0x00, 0xd1, 0x06, 0x4b, 0x65, 0x68, 0x19, 0x69, 0x8b, 0x60, 0x13, - 0x6a, 0x0b, 0x4a, 0x64, 0x60, 0x13, 0x4b, 0x63, 0x4f, 0x61, 0x68, 0x1d, 0x26, 0x00, 0x1c, 0x34, - 0x68, 0x3b, 0x34, 0x08, 0x00, 0xa4, 0x50, 0xe5, 0x68, 0x3b, 0x21, 0x00, 0x58, 0xe0, 0x22, 0x60, - 0xf0, 0x04, 0xf9, 0x70, 0x68, 0x3b, 0x21, 0x60, 0x58, 0xe0, 0xf0, 0x03, 0xf9, 0xd3, 0x1c, 0x2b, - 0x33, 0x7f, 0x1c, 0x1d, 0x21, 0x1f, 0x36, 0x01, 0x43, 0x8d, 0x2e, 0x08, 0xd1, 0xe7, 0x24, 0x00, - 0x26, 0x1f, 0x1c, 0x28, 0x21, 0x00, 0x22, 0x60, 0xf0, 0x04, 0xf9, 0x5c, 0x1c, 0x28, 0x21, 0x60, - 0xf0, 0x03, 0xf9, 0xc0, 0x1c, 0x2b, 0x33, 0x7f, 0x1c, 0x1d, 0x34, 0x01, 0x43, 0xb5, 0x2c, 0x08, - 0xd1, 0xef, 0x4b, 0x4d, 0x4a, 0x4d, 0x60, 0x1d, 0x4b, 0x48, 0x92, 0x06, 0x21, 0x80, 0x22, 0xff, - 0x68, 0x1f, 0x05, 0xc9, 0x23, 0x00, 0x02, 0x12, 0x93, 0x08, 0x91, 0x02, 0x92, 0x01, 0x9b, 0x06, - 0x21, 0x00, 0x60, 0x1f, 0x22, 0x60, 0x1c, 0x38, 0xf0, 0x04, 0xf9, 0x3c, 0x1c, 0x38, 0xf0, 0x03, - 0xf9, 0x5b, 0x64, 0x78, 0x99, 0x06, 0x9b, 0x08, 0x68, 0x0a, 0x2b, 0x00, 0xd0, 0x01, 0x23, 0x80, - 0x04, 0x1b, 0x60, 0x53, 0x99, 0x06, 0x23, 0x00, 0x68, 0x0a, 0x60, 0x93, 0x68, 0x0b, 0x9a, 0x02, - 0x21, 0x1f, 0x61, 0x9a, 0x1c, 0x3b, 0x33, 0x7f, 0x9a, 0x06, 0x1c, 0x1f, 0x43, 0x8f, 0x68, 0x12, - 0x1c, 0x38, 0x92, 0x07, 0xf0, 0x03, 0xf9, 0x40, 0x1c, 0x06, 0x1c, 0x38, 0xf0, 0x03, 0xf9, 0x3c, - 0x1c, 0x04, 0x1c, 0x38, 0xf0, 0x03, 0xf9, 0x38, 0x1c, 0x05, 0x1c, 0x38, 0xf0, 0x03, 0xf9, 0x34, - 0x99, 0x01, 0x23, 0xff, 0x22, 0xff, 0x04, 0x12, 0x02, 0x1b, 0x93, 0x05, 0x40, 0x0c, 0x40, 0x15, - 0x23, 0xe0, 0x40, 0x1e, 0x21, 0x02, 0x02, 0x24, 0x0a, 0x2d, 0x0e, 0x00, 0x43, 0x0e, 0x43, 0x2c, - 0x92, 0x04, 0x43, 0x04, 0x9a, 0x07, 0x06, 0x36, 0x43, 0x34, 0x60, 0x14, 0x9b, 0x06, 0x68, 0x1a, - 0x23, 0x80, 0x04, 0x5b, 0x61, 0x13, 0x99, 0x06, 0x68, 0x0a, 0x61, 0x53, 0xc9, 0x01, 0x91, 0x06, - 0x21, 0x60, 0xf0, 0x03, 0xf9, 0x57, 0x9a, 0x08, 0x32, 0x01, 0x92, 0x08, 0x2a, 0x06, 0xd1, 0xa6, - 0x4b, 0x1a, 0x4f, 0x16, 0x93, 0x03, 0x69, 0x59, 0x68, 0x38, 0x91, 0x09, 0xf0, 0x03, 0xf9, 0x04, - 0x1c, 0x06, 0x68, 0x38, 0xf0, 0x03, 0xf9, 0x00, 0x1c, 0x04, 0x68, 0x38, 0xf0, 0x03, 0xf8, 0xfc, - 0x1c, 0x05, 0x68, 0x38, 0xf0, 0x03, 0xf8, 0xf8, 0x9a, 0x05, 0x9b, 0x04, 0x40, 0x14, 0x40, 0x1d, - 0x21, 0xe0, 0x0a, 0x2d, 0x22, 0x02, 0x40, 0x0e, 0x02, 0x24, 0x43, 0x2c, 0x43, 0x16, 0x0e, 0x00, - 0x9b, 0x09, 0x06, 0x36, 0x43, 0x04, 0x43, 0x34, 0x60, 0x1c, 0x99, 0x03, 0x69, 0x48, 0x21, 0x60, - 0xf0, 0x03, 0xf9, 0x28, 0xb0, 0x0b, 0xbc, 0xf0, 0xbc, 0x01, 0x47, 0x00, 0x13, 0x70, 0x67, 0xcc, - 0x13, 0x70, 0x60, 0x34, 0x13, 0x70, 0x67, 0xc8, 0x13, 0x70, 0x67, 0xc4, 0x13, 0x72, 0xc0, 0x20, - 0xb5, 0x30, 0xb0, 0x81, 0x1c, 0x04, 0xf0, 0x03, 0xf8, 0xcf, 0x21, 0x00, 0x1c, 0x05, 0x22, 0x60, - 0x1c, 0x20, 0xf0, 0x04, 0xf8, 0xa7, 0x23, 0x40, 0x60, 0xa3, 0x23, 0x80, 0x04, 0x5b, 0xb0, 0x01, - 0x63, 0x65, 0x60, 0x23, 0x60, 0x63, 0xbc, 0x30, 0xbc, 0x01, 0x47, 0x00, 0xb5, 0xf0, 0x4b, 0x1a, - 0xb0, 0x83, 0x68, 0x1d, 0x23, 0x00, 0x93, 0x01, 0x23, 0xff, 0x02, 0x1b, 0x27, 0xff, 0x26, 0x80, - 0x93, 0x00, 0x04, 0x3f, 0x04, 0x76, 0x1c, 0x28, 0xf7, 0xff, 0xff, 0xda, 0x9b, 0x01, 0x2b, 0x03, - 0xd0, 0x19, 0x1c, 0x2c, 0x23, 0x1f, 0x34, 0x7f, 0x43, 0x9c, 0x6b, 0x62, 0x1c, 0x28, 0x06, 0x13, - 0x0e, 0x11, 0x43, 0x19, 0x9b, 0x00, 0x60, 0x6e, 0x40, 0x13, 0x02, 0x1b, 0x40, 0x3a, 0x43, 0x19, - 0x0a, 0x12, 0x43, 0x11, 0x60, 0x29, 0x21, 0x60, 0xf0, 0x03, 0xf8, 0xdc, 0x9b, 0x01, 0x1c, 0x25, - 0x33, 0x01, 0x93, 0x01, 0xe7, 0xdf, 0x1c, 0x28, 0x21, 0x60, 0xf0, 0x03, 0xf8, 0xd3, 0xb0, 0x03, - 0xbc, 0xf0, 0xbc, 0x01, 0x47, 0x00, 0x46, 0xc0, 0x13, 0x70, 0x67, 0xc4, 0xb5, 0xf0, 0xb0, 0x83, - 0xf7, 0xff, 0xfe, 0xd4, 0xf7, 0xff, 0xff, 0xc2, 0x4d, 0x4b, 0x49, 0x4c, 0x68, 0x2a, 0x68, 0x0b, - 0x4f, 0x4b, 0x61, 0x93, 0x68, 0x2a, 0x68, 0x4b, 0x4e, 0x4a, 0x61, 0xd3, 0x68, 0x8b, 0x4a, 0x4a, - 0x60, 0x3b, 0x92, 0x01, 0x68, 0xcb, 0x60, 0x13, 0x69, 0x0b, 0x21, 0x60, 0x60, 0x33, 0x68, 0x2b, - 0x69, 0x98, 0xf0, 0x03, 0xf8, 0x97, 0x68, 0x2a, 0x69, 0x93, 0x64, 0xda, 0x68, 0x2b, 0x22, 0x00, - 0x69, 0x9b, 0x64, 0x9a, 0x68, 0x2b, 0x69, 0x9c, 0x1c, 0x20, 0xf0, 0x03, 0xf8, 0x5d, 0x64, 0x60, - 0x68, 0x33, 0x6c, 0x59, 0x68, 0x2b, 0x1c, 0x0a, 0x69, 0x98, 0x23, 0xff, 0x02, 0x1b, 0x40, 0x1a, - 0x23, 0xff, 0x04, 0x1b, 0x40, 0x0b, 0x0a, 0x1b, 0x02, 0x12, 0x43, 0x1a, 0x0e, 0x0b, 0x43, 0x1a, - 0x23, 0xe0, 0x40, 0x19, 0x23, 0x02, 0x43, 0x19, 0x06, 0x09, 0x43, 0x0a, 0x60, 0x02, 0x68, 0x2b, - 0x21, 0x60, 0x69, 0x9a, 0x23, 0x80, 0x04, 0x1b, 0x60, 0x53, 0x68, 0x2b, 0x22, 0x00, 0x69, 0x9b, - 0x60, 0x9a, 0x68, 0x2b, 0x69, 0x9a, 0x23, 0x80, 0x05, 0xdb, 0x61, 0x93, 0x68, 0x2b, 0x69, 0x9a, - 0x23, 0x80, 0x04, 0x5b, 0x61, 0x13, 0x68, 0x2a, 0x69, 0x92, 0x61, 0x53, 0x68, 0x2b, 0x69, 0x98, - 0xf0, 0x03, 0xf8, 0x70, 0x68, 0x2b, 0x21, 0x60, 0x69, 0xd8, 0xf0, 0x03, 0xf8, 0x53, 0x68, 0x2a, - 0x69, 0xd3, 0x64, 0xda, 0x68, 0x2b, 0x22, 0x00, 0x69, 0xdb, 0x64, 0x9a, 0x68, 0x2b, 0x69, 0xdc, - 0x1c, 0x20, 0xf0, 0x03, 0xf8, 0x19, 0x64, 0x60, 0x68, 0x38, 0x21, 0x60, 0xf0, 0x03, 0xf8, 0x42, - 0x68, 0x3a, 0x68, 0x2b, 0x64, 0xd3, 0x68, 0x3b, 0x22, 0x00, 0x64, 0x9a, 0x68, 0x3c, 0x1c, 0x20, - 0xf0, 0x03, 0xf8, 0x0a, 0x64, 0x60, 0x68, 0x38, 0x21, 0x60, 0xf0, 0x03, 0xf8, 0x4b, 0x9b, 0x01, - 0x21, 0x60, 0x68, 0x18, 0xf0, 0x03, 0xf8, 0x2e, 0x9b, 0x01, 0x68, 0x1a, 0x68, 0x2b, 0x64, 0xd3, - 0x9a, 0x01, 0x68, 0x13, 0x22, 0x00, 0x64, 0x9a, 0x9b, 0x01, 0x68, 0x1c, 0x1c, 0x20, 0xf0, 0x02, - 0xff, 0xf3, 0x64, 0x60, 0x9a, 0x01, 0x21, 0x60, 0x68, 0x10, 0xf0, 0x03, 0xf8, 0x33, 0xb0, 0x03, - 0xbc, 0xf0, 0xbc, 0x01, 0x47, 0x00, 0x46, 0xc0, 0x13, 0x70, 0x60, 0x34, 0x13, 0x72, 0xc0, 0x20, - 0x13, 0x70, 0x67, 0x7c, 0x13, 0x70, 0x67, 0x84, 0x13, 0x70, 0x67, 0x80, 0xb5, 0xf0, 0x4c, 0x23, - 0x4b, 0x23, 0xb0, 0x81, 0x60, 0x23, 0xf0, 0x03, 0xf8, 0x35, 0x28, 0x00, 0xda, 0x02, 0x20, 0x01, - 0x42, 0x40, 0xe0, 0x37, 0xf0, 0x03, 0xf9, 0x80, 0x60, 0x20, 0x68, 0x82, 0x4b, 0x1d, 0x21, 0x01, - 0x60, 0x13, 0x68, 0x20, 0x68, 0x82, 0x68, 0x13, 0x42, 0x0b, 0xd1, 0xfc, 0x21, 0xfc, 0xf0, 0x03, - 0xf8, 0x09, 0x27, 0x80, 0x26, 0x80, 0x4c, 0x15, 0x25, 0x00, 0x04, 0x7f, 0x01, 0x76, 0x68, 0x23, - 0x21, 0x04, 0x6c, 0xdb, 0x51, 0x5f, 0x68, 0x23, 0x6c, 0xdb, 0x59, 0x58, 0x35, 0x04, 0xf0, 0x02, - 0xff, 0xf9, 0x42, 0xb5, 0xd1, 0xf3, 0xf7, 0xff, 0xff, 0x29, 0x68, 0x23, 0x22, 0x01, 0x33, 0x54, - 0x70, 0x1a, 0x68, 0x23, 0x20, 0x00, 0x68, 0x9a, 0x69, 0x9b, 0x6c, 0x5b, 0x61, 0x93, 0x68, 0x23, - 0x68, 0x9a, 0x23, 0x04, 0x60, 0x93, 0x68, 0x23, 0x68, 0x9a, 0x4b, 0x07, 0x60, 0x13, 0x68, 0x23, - 0x68, 0x9b, 0x68, 0x1b, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x13, 0x70, 0x60, 0x34, - 0x13, 0x72, 0xc2, 0xa4, 0x00, 0x01, 0x00, 0x20, 0x00, 0x01, 0x00, 0x21, 0xb5, 0x10, 0x4b, 0x0c, - 0x68, 0x18, 0x6c, 0x01, 0x29, 0x07, 0xdd, 0x01, 0x24, 0x00, 0xe0, 0x0d, 0x4b, 0x09, 0x68, 0x1b, - 0x00, 0xdb, 0x18, 0x5b, 0x00, 0x5a, 0x18, 0xd2, 0x6a, 0x03, 0x01, 0x52, 0x18, 0x9c, 0x1c, 0x4b, - 0x64, 0x03, 0x1c, 0x20, 0xf7, 0xff, 0xfe, 0xa4, 0x1c, 0x20, 0xbc, 0x10, 0xbc, 0x02, 0x47, 0x08, - 0x13, 0x70, 0x60, 0x34, 0x13, 0x70, 0x67, 0x70, 0xb5, 0xf0, 0xb0, 0x8d, 0x1c, 0x05, 0xf7, 0xff, - 0xff, 0xdd, 0x90, 0x08, 0x28, 0x00, 0xd1, 0x00, 0xe0, 0xad, 0x63, 0xc5, 0x23, 0x00, 0x61, 0x6b, - 0x7e, 0x6b, 0x69, 0x2a, 0x93, 0x07, 0x7e, 0x2b, 0x92, 0x0a, 0x2b, 0x00, 0xd0, 0x02, 0x9c, 0x08, - 0x26, 0x80, 0xe0, 0x26, 0x23, 0x08, 0x93, 0x00, 0x23, 0xa0, 0x68, 0x69, 0x22, 0x08, 0x00, 0x9b, - 0x98, 0x08, 0xf7, 0xff, 0xfb, 0x57, 0xf7, 0xff, 0xff, 0xc1, 0x1c, 0x04, 0x28, 0x00, 0xd1, 0x00, - 0xe0, 0x91, 0x6b, 0x42, 0x63, 0xc5, 0x06, 0x13, 0x0e, 0x11, 0x43, 0x19, 0x23, 0xff, 0x02, 0x1b, - 0x40, 0x13, 0x02, 0x1b, 0x43, 0x19, 0x23, 0xff, 0x04, 0x1b, 0x40, 0x1a, 0x0a, 0x12, 0x43, 0x11, - 0x9a, 0x08, 0x60, 0x11, 0x63, 0x90, 0x9b, 0x0a, 0x2b, 0x00, 0xd1, 0x01, 0x4e, 0x40, 0xe0, 0x00, - 0x4e, 0x40, 0x68, 0xea, 0x9b, 0x07, 0x92, 0x09, 0x2b, 0x00, 0xd0, 0x02, 0x23, 0x80, 0x00, 0x5b, - 0x43, 0x1e, 0x69, 0xea, 0x4b, 0x3c, 0x27, 0xff, 0x40, 0x13, 0x93, 0x0b, 0x3b, 0x01, 0x22, 0x80, - 0x93, 0x04, 0x23, 0xff, 0x04, 0x52, 0x02, 0x1b, 0x92, 0x05, 0x93, 0x03, 0x04, 0x3f, 0x9a, 0x0b, - 0x1c, 0x33, 0x92, 0x00, 0x1c, 0x20, 0x9a, 0x0a, 0x99, 0x09, 0xf7, 0xff, 0xfb, 0x1b, 0x9b, 0x0a, - 0x9a, 0x09, 0x1a, 0x1b, 0x93, 0x0a, 0x9b, 0x07, 0x18, 0x12, 0x92, 0x09, 0x2b, 0x00, 0xd0, 0x01, - 0x9a, 0x05, 0x60, 0x62, 0x9a, 0x04, 0x18, 0x13, 0x9a, 0x0b, 0x42, 0x13, 0xd1, 0x01, 0x4b, 0x2b, - 0x18, 0xf6, 0x9a, 0x0a, 0x2a, 0x00, 0xdd, 0x13, 0xf7, 0xff, 0xff, 0x70, 0x28, 0x00, 0xd0, 0x42, - 0x6b, 0x42, 0x63, 0xc5, 0x06, 0x13, 0x0e, 0x11, 0x43, 0x19, 0x9b, 0x03, 0x63, 0xa0, 0x40, 0x13, - 0x02, 0x1b, 0x40, 0x3a, 0x43, 0x19, 0x0a, 0x12, 0x43, 0x11, 0x60, 0x21, 0x1c, 0x04, 0xe7, 0xce, - 0x23, 0x80, 0x04, 0x5b, 0x60, 0x63, 0x69, 0x2b, 0x1c, 0x27, 0x2b, 0x00, 0xd0, 0x24, 0x7e, 0x2b, - 0x93, 0x06, 0x2b, 0x00, 0xd1, 0x20, 0xf7, 0xff, 0xff, 0x51, 0x1c, 0x04, 0x28, 0x00, 0xd0, 0x22, - 0x6b, 0x42, 0x63, 0xc5, 0x06, 0x13, 0x0e, 0x11, 0x43, 0x19, 0x23, 0xff, 0x02, 0x1b, 0x40, 0x13, - 0x02, 0x1b, 0x43, 0x19, 0x23, 0xff, 0x04, 0x1b, 0x40, 0x1a, 0x0a, 0x12, 0x23, 0x80, 0x43, 0x11, - 0x00, 0x5b, 0x4a, 0x0e, 0x60, 0x39, 0x63, 0xb8, 0x40, 0x73, 0x43, 0x13, 0x9a, 0x06, 0x21, 0x00, - 0x92, 0x00, 0x22, 0x00, 0xf7, 0xff, 0xfa, 0xc6, 0x68, 0xa3, 0x22, 0x80, 0x04, 0x12, 0x43, 0x13, - 0x60, 0xa3, 0x98, 0x08, 0xe0, 0x00, 0x20, 0x00, 0xb0, 0x0d, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, - 0x80, 0x00, 0x01, 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x07, 0xff, 0x80, 0x00, 0x00, 0x00, - 0xb5, 0xf0, 0x7c, 0x83, 0x7c, 0xc2, 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, 0x7d, 0x03, 0xb0, 0x85, - 0x02, 0x1b, 0x43, 0x13, 0x7d, 0x42, 0x1c, 0x06, 0x43, 0x1a, 0xd0, 0x67, 0x22, 0x00, 0x92, 0x01, - 0xe0, 0x53, 0x06, 0x0b, 0x04, 0x12, 0x43, 0x1a, 0x02, 0x23, 0x43, 0x13, 0x9a, 0x03, 0x43, 0x03, - 0x18, 0x9d, 0x7a, 0x6b, 0x7a, 0xaa, 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, 0x7a, 0xeb, 0x02, 0x1b, - 0x43, 0x13, 0x7b, 0x2a, 0x43, 0x1a, 0xd0, 0x3b, 0x23, 0x00, 0x93, 0x02, 0x27, 0x00, 0xe0, 0x26, - 0x06, 0x0b, 0x04, 0x12, 0x43, 0x1a, 0x02, 0x23, 0x43, 0x13, 0x43, 0x03, 0x19, 0xdc, 0x7b, 0xa3, - 0x7b, 0xe2, 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, 0x7c, 0x23, 0x02, 0x1b, 0x43, 0x13, 0x7c, 0x62, - 0x1c, 0x10, 0x43, 0x18, 0xd0, 0x01, 0xf0, 0x02, 0xfe, 0x71, 0x7a, 0x63, 0x7a, 0xa2, 0x06, 0x1b, - 0x04, 0x12, 0x43, 0x1a, 0x7a, 0xe3, 0x02, 0x1b, 0x43, 0x13, 0x7b, 0x22, 0x1c, 0x10, 0x43, 0x18, - 0xd0, 0x01, 0xf0, 0x02, 0xfe, 0x63, 0x9a, 0x02, 0x37, 0x12, 0x32, 0x01, 0x92, 0x02, 0x79, 0x2b, - 0x7a, 0x69, 0x46, 0x9c, 0x9b, 0x02, 0x7a, 0xaa, 0x7a, 0xec, 0x7b, 0x28, 0x45, 0x63, 0xdb, 0xcf, - 0x06, 0x0b, 0x04, 0x12, 0x43, 0x1a, 0x02, 0x23, 0x43, 0x13, 0x43, 0x18, 0xf0, 0x02, 0xfe, 0x4e, - 0x9d, 0x01, 0x9a, 0x03, 0x35, 0x01, 0x95, 0x01, 0x32, 0x0d, 0x7c, 0x73, 0x9d, 0x01, 0x92, 0x03, - 0x7c, 0xb1, 0x7c, 0xf2, 0x7d, 0x34, 0x7d, 0x70, 0x42, 0x9d, 0xdb, 0xa2, 0x06, 0x0b, 0x04, 0x12, - 0x43, 0x1a, 0x02, 0x23, 0x43, 0x13, 0x43, 0x18, 0xf0, 0x02, 0xfe, 0x38, 0xb0, 0x05, 0xbc, 0xf0, - 0xbc, 0x01, 0x47, 0x00, 0xb4, 0x0f, 0xb5, 0xf0, 0xb0, 0x83, 0x46, 0x6a, 0x23, 0x80, 0xad, 0x08, - 0x32, 0x06, 0x01, 0x9b, 0xcd, 0x10, 0x80, 0x13, 0x4e, 0x1d, 0xe0, 0x30, 0x1c, 0x67, 0x2b, 0x25, - 0xd0, 0x07, 0x46, 0x6a, 0x46, 0x68, 0x71, 0x93, 0x30, 0x06, 0x1c, 0x3c, 0xf7, 0xfe, 0xfa, 0x4c, - 0xe0, 0x25, 0x78, 0x63, 0x2b, 0x73, 0xd0, 0x1c, 0x2b, 0x73, 0xd8, 0x04, 0x2b, 0x64, 0xd0, 0x07, - 0x2b, 0x69, 0xd1, 0x1b, 0xe0, 0x04, 0x2b, 0x75, 0xd0, 0x07, 0x2b, 0x78, 0xd1, 0x16, 0xe0, 0x0a, - 0x68, 0x28, 0x1d, 0x2c, 0xf7, 0xff, 0xfb, 0x72, 0xe0, 0x09, 0x68, 0x28, 0xf7, 0xff, 0xfb, 0xba, - 0x1d, 0x2c, 0x1c, 0x30, 0xe0, 0x07, 0x68, 0x28, 0x1d, 0x2c, 0xf7, 0xff, 0xfb, 0xf1, 0x48, 0x08, - 0xe0, 0x01, 0x68, 0x28, 0x1d, 0x2c, 0xf7, 0xfe, 0xfa, 0x27, 0x1c, 0x25, 0x1c, 0x7c, 0x78, 0x23, - 0x2b, 0x00, 0xd1, 0xcb, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0xb0, 0x04, 0x47, 0x18, 0x46, 0xc0, - 0x13, 0x72, 0xc1, 0xe0, 0xb5, 0xf0, 0x4b, 0x32, 0xb0, 0x8f, 0x68, 0x1b, 0x1c, 0x01, 0x68, 0x9a, - 0x4b, 0x30, 0x68, 0x54, 0x68, 0x1b, 0x32, 0x44, 0x00, 0x9b, 0x18, 0xd2, 0x68, 0x12, 0x48, 0x2e, - 0x92, 0x0d, 0xf7, 0xff, 0xff, 0xa7, 0x04, 0x20, 0xd4, 0x02, 0x49, 0x2c, 0x91, 0x0a, 0xe0, 0x01, - 0x4b, 0x2b, 0x93, 0x0a, 0x04, 0x60, 0xd4, 0x02, 0x49, 0x28, 0x91, 0x0b, 0xe0, 0x01, 0x4b, 0x29, - 0x93, 0x0b, 0x04, 0xa0, 0xd4, 0x02, 0x49, 0x25, 0x91, 0x0c, 0xe0, 0x01, 0x4b, 0x26, 0x93, 0x0c, - 0x04, 0xe0, 0xd4, 0x02, 0x49, 0x21, 0x46, 0x8c, 0xe0, 0x01, 0x4b, 0x24, 0x46, 0x9c, 0x06, 0xa0, - 0xd4, 0x01, 0x4f, 0x1e, 0xe0, 0x00, 0x4f, 0x22, 0x06, 0xe1, 0xd4, 0x01, 0x4e, 0x1b, 0xe0, 0x00, - 0x4e, 0x20, 0x07, 0x23, 0xd4, 0x01, 0x4d, 0x19, 0xe0, 0x00, 0x4d, 0x1f, 0x07, 0x60, 0xd4, 0x01, - 0x4a, 0x16, 0xe0, 0x00, 0x4a, 0x1d, 0x07, 0xa1, 0xd4, 0x01, 0x4b, 0x14, 0xe0, 0x00, 0x4b, 0x1c, - 0x07, 0xe0, 0xd4, 0x01, 0x49, 0x11, 0xe0, 0x00, 0x49, 0x1a, 0x48, 0x1b, 0x92, 0x05, 0x90, 0x09, - 0x98, 0x0c, 0x9a, 0x0a, 0x90, 0x00, 0x46, 0x60, 0x90, 0x01, 0x93, 0x06, 0x91, 0x07, 0x9b, 0x0b, - 0x98, 0x09, 0x1c, 0x21, 0x97, 0x02, 0x96, 0x03, 0x95, 0x04, 0xf7, 0xff, 0xff, 0x5b, 0x99, 0x0d, - 0x48, 0x12, 0xf7, 0xff, 0xff, 0x57, 0xb0, 0x0f, 0xbc, 0xf0, 0xbc, 0x01, 0x47, 0x00, 0x46, 0xc0, - 0x13, 0x70, 0x60, 0x34, 0x13, 0x70, 0x67, 0x78, 0x13, 0x70, 0x60, 0x85, 0x13, 0x70, 0x66, 0x42, - 0x13, 0x70, 0x60, 0x9b, 0x13, 0x70, 0x60, 0xa2, 0x13, 0x70, 0x60, 0xac, 0x13, 0x70, 0x60, 0xb2, - 0x13, 0x70, 0x60, 0xb8, 0x13, 0x70, 0x60, 0xbd, 0x13, 0x70, 0x60, 0xc4, 0x13, 0x70, 0x60, 0xc9, - 0x13, 0x70, 0x60, 0xce, 0x13, 0x70, 0x60, 0xd3, 0x13, 0x70, 0x60, 0xd8, 0x13, 0x70, 0x60, 0xfd, - 0xb5, 0x30, 0x4b, 0x0b, 0xb0, 0x81, 0x68, 0x1a, 0x25, 0x20, 0x68, 0x92, 0x1c, 0x1c, 0x68, 0x12, - 0x68, 0x23, 0x43, 0x2a, 0x68, 0x9b, 0x20, 0x0a, 0x60, 0x1a, 0xf7, 0xff, 0xf9, 0x2b, 0x68, 0x23, - 0x68, 0x9b, 0x68, 0x1a, 0x42, 0x2a, 0xd0, 0xf3, 0xb0, 0x01, 0xbc, 0x30, 0xbc, 0x01, 0x47, 0x00, - 0x13, 0x70, 0x60, 0x34, 0xb5, 0x30, 0x4b, 0x0b, 0xb0, 0x81, 0x68, 0x1a, 0x25, 0x20, 0x68, 0x92, - 0x1c, 0x1c, 0x68, 0x12, 0x68, 0x23, 0x43, 0xaa, 0x68, 0x9b, 0x20, 0x0a, 0x60, 0x1a, 0xf7, 0xff, - 0xf9, 0x11, 0x68, 0x23, 0x68, 0x9b, 0x68, 0x1a, 0x42, 0x2a, 0xd1, 0xf3, 0xb0, 0x01, 0xbc, 0x30, - 0xbc, 0x01, 0x47, 0x00, 0x13, 0x70, 0x60, 0x34, 0xb5, 0xf0, 0xb0, 0x81, 0x1c, 0x0e, 0x28, 0x00, - 0xd1, 0x18, 0x4e, 0x18, 0x4d, 0x18, 0x4f, 0x19, 0x24, 0x00, 0x68, 0x33, 0x68, 0x9b, 0x69, 0x9a, - 0x69, 0x2b, 0x6c, 0x5b, 0x42, 0x9a, 0xd3, 0x06, 0x69, 0x6b, 0x6c, 0x5b, 0x42, 0x9a, 0xd8, 0x02, - 0xf7, 0xff, 0xff, 0xd0, 0xe0, 0x18, 0x20, 0x0a, 0x34, 0x01, 0xf7, 0xff, 0xf8, 0xeb, 0x42, 0xbc, - 0xd1, 0xeb, 0xe0, 0x11, 0x28, 0x01, 0xd1, 0x0f, 0x24, 0x00, 0x4d, 0x0a, 0x4f, 0x0b, 0xe0, 0x05, - 0x20, 0x0a, 0x34, 0x01, 0xf7, 0xff, 0xf8, 0xde, 0x42, 0xbc, 0xd0, 0x05, 0x68, 0x2b, 0x68, 0x9b, - 0x69, 0x9a, 0x6c, 0x73, 0x42, 0x9a, 0xd0, 0xf3, 0xb0, 0x01, 0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x02, - 0x47, 0x08, 0x46, 0xc0, 0x13, 0x70, 0x60, 0x34, 0x13, 0x72, 0xc0, 0x20, 0x00, 0x00, 0x13, 0x88, - 0xb5, 0xf0, 0xb0, 0x83, 0x1c, 0x1f, 0x4b, 0x0f, 0x92, 0x00, 0x91, 0x01, 0x9a, 0x08, 0x68, 0x1c, - 0x00, 0x55, 0x1c, 0x1e, 0x20, 0x0a, 0xf7, 0xff, 0xf8, 0xbd, 0x9a, 0x01, 0x68, 0x13, 0x9a, 0x00, - 0x40, 0x13, 0x42, 0xbb, 0xd1, 0x01, 0x20, 0x00, 0xe0, 0x07, 0x68, 0x33, 0x1b, 0x1b, 0xd5, 0x00, - 0x68, 0x34, 0x42, 0xab, 0xd3, 0xee, 0x20, 0x02, 0x42, 0x40, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x02, - 0x47, 0x08, 0x46, 0xc0, 0x0d, 0x80, 0x00, 0x10, 0xb5, 0x10, 0x4b, 0x13, 0x30, 0x10, 0x68, 0x1b, - 0x00, 0x80, 0x68, 0x9b, 0x18, 0x1c, 0x68, 0x62, 0x23, 0x80, 0x01, 0x9b, 0x42, 0x1a, 0xd1, 0x00, - 0x40, 0x5a, 0x23, 0x2e, 0x43, 0x9a, 0x60, 0x62, 0x20, 0x05, 0xf7, 0xfe, 0xff, 0x2b, 0x23, 0x80, - 0x68, 0x62, 0x01, 0x9b, 0x42, 0x1a, 0xd0, 0x00, 0x40, 0x5a, 0x23, 0x2e, 0x43, 0x9a, 0x60, 0x62, - 0x20, 0x05, 0xf7, 0xfe, 0xff, 0x1f, 0x4b, 0x05, 0x20, 0x05, 0x60, 0x63, 0xf7, 0xfe, 0xff, 0x1a, - 0xbc, 0x10, 0xbc, 0x01, 0x47, 0x00, 0x46, 0xc0, 0x13, 0x70, 0x60, 0x34, 0x00, 0x00, 0x18, 0x01, - 0xb5, 0xf0, 0x4b, 0x29, 0xb0, 0x85, 0x68, 0x1a, 0x1c, 0x03, 0x68, 0x92, 0x33, 0x10, 0x00, 0x9b, - 0x18, 0xd2, 0x92, 0x03, 0x1c, 0x15, 0x4b, 0x25, 0x68, 0x52, 0x35, 0x04, 0x40, 0x13, 0x2b, 0x01, - 0xd0, 0x06, 0x04, 0x91, 0xd5, 0x01, 0xf7, 0xff, 0xff, 0xbf, 0x24, 0x01, 0x42, 0x64, 0xe0, 0x36, - 0x26, 0x88, 0x27, 0x00, 0x01, 0x76, 0x21, 0x04, 0x1c, 0x13, 0x43, 0x8b, 0x43, 0x33, 0x60, 0x2b, - 0x20, 0x3c, 0xf7, 0xff, 0xf8, 0x79, 0x68, 0x2b, 0x4a, 0x19, 0x20, 0x32, 0x40, 0x13, 0x60, 0x2b, - 0xf7, 0xff, 0xf8, 0x72, 0x4b, 0x17, 0x22, 0x80, 0x93, 0x00, 0x1c, 0x28, 0x1c, 0x29, 0x00, 0x52, - 0x23, 0x00, 0xf7, 0xff, 0xff, 0x7d, 0x1c, 0x04, 0x28, 0x00, 0xd0, 0x03, 0x9b, 0x03, 0x4c, 0x12, - 0x68, 0x5a, 0xe0, 0x14, 0x68, 0x2a, 0x21, 0x04, 0x42, 0x0a, 0xd1, 0x02, 0x37, 0x01, 0x2f, 0x04, - 0xd1, 0xd9, 0x07, 0x53, 0xd4, 0x0b, 0x23, 0x80, 0x01, 0x9b, 0x43, 0x13, 0x99, 0x03, 0x22, 0x2a, - 0x43, 0x93, 0x60, 0x4b, 0x20, 0x0a, 0xf7, 0xff, 0xf8, 0x4f, 0x9b, 0x03, 0x68, 0x5a, 0xb0, 0x05, - 0x1c, 0x20, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x13, 0x70, 0x60, 0x34, 0x00, 0x00, 0x20, 0x01, - 0xff, 0xff, 0xfe, 0xd5, 0x00, 0x00, 0x13, 0x88, 0xff, 0xff, 0xf8, 0x30, 0xb5, 0xf0, 0xb0, 0x85, - 0x90, 0x01, 0x1c, 0x0f, 0x20, 0x00, 0x21, 0x00, 0xf7, 0xff, 0xff, 0x0e, 0x7e, 0x3a, 0x2a, 0x00, - 0xd1, 0x06, 0x4b, 0xc2, 0x21, 0x08, 0x60, 0x1a, 0x68, 0x38, 0xf0, 0x02, 0xfc, 0x8b, 0x60, 0x78, - 0x69, 0x39, 0x29, 0x00, 0xd0, 0x09, 0x7e, 0x7b, 0x68, 0xb8, 0x2b, 0x00, 0xd0, 0x02, 0xf0, 0x02, - 0xfc, 0x81, 0xe0, 0x01, 0xf0, 0x02, 0xfc, 0x76, 0x60, 0xf8, 0x7e, 0x3b, 0x2b, 0x00, 0xd1, 0x03, - 0x4b, 0xb7, 0x68, 0x1b, 0x69, 0xdb, 0xe0, 0x06, 0x7e, 0x7b, 0x2b, 0x00, 0xd0, 0x01, 0x4b, 0xb5, - 0xe0, 0x00, 0x4b, 0xb5, 0x68, 0x1b, 0x93, 0x02, 0x4c, 0xb4, 0x4b, 0xb5, 0x98, 0x02, 0x99, 0x02, - 0x60, 0x18, 0x22, 0x60, 0x1c, 0x20, 0xf0, 0x02, 0xfd, 0x87, 0x21, 0x00, 0x22, 0x30, 0x98, 0x02, - 0xf0, 0x03, 0xfb, 0xe8, 0x4b, 0xaa, 0x49, 0xaf, 0x68, 0x1a, 0x23, 0x00, 0x64, 0x13, 0x68, 0x0b, - 0x22, 0x01, 0x40, 0x53, 0x60, 0x0b, 0x1c, 0x38, 0xf7, 0xff, 0xfc, 0x8e, 0x4b, 0xaa, 0x64, 0xa0, - 0x60, 0x18, 0x1c, 0x06, 0x98, 0x01, 0x22, 0x80, 0x69, 0x83, 0x7e, 0x39, 0x01, 0x92, 0x43, 0x1a, - 0x23, 0x0f, 0x40, 0x0b, 0x02, 0x1b, 0x1c, 0x10, 0x69, 0xfc, 0x43, 0x18, 0x29, 0x00, 0xd1, 0x03, - 0x4b, 0xa2, 0x1c, 0x01, 0x43, 0x19, 0xe0, 0x08, 0x4b, 0xa1, 0x1c, 0x22, 0x40, 0x1a, 0x23, 0x80, - 0x04, 0x12, 0x05, 0xdb, 0x43, 0x1a, 0x1c, 0x11, 0x43, 0x01, 0x06, 0x0b, 0x0e, 0x0a, 0x24, 0xff, - 0x02, 0x24, 0x43, 0x1a, 0x1c, 0x0b, 0x40, 0x23, 0x02, 0x1b, 0x20, 0xff, 0x04, 0x00, 0x43, 0x1a, - 0x1c, 0x0b, 0x40, 0x03, 0x4d, 0x91, 0x0a, 0x1b, 0x43, 0x1a, 0x23, 0x40, 0x60, 0xab, 0x4b, 0x95, - 0x60, 0x6a, 0x68, 0x1b, 0x6c, 0x5a, 0x1c, 0x11, 0x1c, 0x13, 0x40, 0x21, 0x40, 0x03, 0x0a, 0x1b, - 0x02, 0x09, 0x43, 0x19, 0x0e, 0x13, 0x43, 0x19, 0x23, 0xe0, 0x40, 0x1a, 0x23, 0x02, 0x43, 0x1a, - 0x06, 0x12, 0x43, 0x11, 0x60, 0x29, 0x6b, 0x72, 0x06, 0x13, 0x0e, 0x11, 0x43, 0x19, 0x1c, 0x13, - 0x40, 0x23, 0x02, 0x1b, 0x40, 0x02, 0x43, 0x19, 0x0a, 0x12, 0x23, 0x80, 0x43, 0x11, 0x04, 0x5b, - 0x61, 0x29, 0x61, 0x6b, 0x7e, 0x3a, 0x2a, 0x00, 0xd0, 0x17, 0x9b, 0x01, 0x6a, 0x58, 0x06, 0x13, - 0x2b, 0x00, 0xdb, 0x01, 0x21, 0x00, 0xe0, 0x00, 0x21, 0x10, 0x23, 0x0f, 0x40, 0x13, 0x18, 0xcb, - 0x40, 0xd8, 0x1c, 0x03, 0x49, 0x75, 0x07, 0xd8, 0xd5, 0x03, 0x69, 0x8b, 0x22, 0x80, 0x43, 0x13, - 0xe0, 0x02, 0x69, 0x8b, 0x22, 0x80, 0x43, 0x93, 0x61, 0x8b, 0x4b, 0x70, 0x49, 0x76, 0x69, 0x9a, - 0x6c, 0x9e, 0x40, 0x0a, 0x61, 0x9a, 0xe0, 0x04, 0x1c, 0x30, 0x21, 0x60, 0xf0, 0x02, 0xfb, 0xca, - 0x6b, 0xb6, 0x2e, 0x00, 0xd1, 0xf8, 0x4d, 0x69, 0x98, 0x02, 0x1c, 0x29, 0x22, 0x60, 0xf0, 0x02, - 0xfd, 0x03, 0x4a, 0x6e, 0x23, 0x01, 0x92, 0x00, 0x60, 0x13, 0x4b, 0x6d, 0x48, 0x6d, 0x68, 0x19, - 0xf7, 0xfe, 0xfd, 0x88, 0x4c, 0x5e, 0x21, 0x20, 0x68, 0x23, 0x69, 0x98, 0xf0, 0x02, 0xfb, 0x9a, - 0x68, 0x23, 0x6c, 0x69, 0x69, 0x98, 0x23, 0xff, 0x02, 0x1b, 0x1c, 0x0a, 0x40, 0x1a, 0x23, 0xff, - 0x04, 0x1b, 0x40, 0x0b, 0x0a, 0x1b, 0x02, 0x12, 0x43, 0x1a, 0x0e, 0x0b, 0x43, 0x1a, 0x23, 0xe0, - 0x40, 0x19, 0x23, 0x02, 0x43, 0x19, 0x06, 0x09, 0x43, 0x0a, 0x60, 0x02, 0x68, 0x23, 0x21, 0x20, - 0x69, 0x98, 0xf0, 0x02, 0xfb, 0x97, 0xf7, 0xff, 0xfd, 0xeb, 0xf7, 0xfe, 0xfd, 0x2b, 0x9b, 0x00, - 0x90, 0x03, 0x60, 0x1e, 0x28, 0x00, 0xd1, 0x03, 0x4b, 0x48, 0x68, 0x1b, 0x2b, 0x00, 0xd0, 0x0f, - 0x4b, 0x47, 0x68, 0x1b, 0x68, 0x9a, 0x4b, 0x54, 0x32, 0x44, 0x68, 0x1b, 0x00, 0x9b, 0x18, 0xd2, - 0x68, 0x13, 0x22, 0x05, 0x40, 0x13, 0x2b, 0x05, 0xd0, 0x02, 0x4a, 0x40, 0x23, 0x01, 0x60, 0x13, - 0x98, 0x03, 0x42, 0x46, 0x41, 0x46, 0x2e, 0x00, 0xd1, 0x01, 0x30, 0x05, 0xd1, 0x4f, 0xf7, 0xff, - 0xfd, 0xe1, 0x4c, 0x3b, 0x21, 0x20, 0x68, 0x23, 0x69, 0x98, 0xf7, 0xfd, 0xff, 0x4d, 0x68, 0x23, - 0x21, 0x20, 0x69, 0x98, 0xf0, 0x02, 0xfb, 0x1e, 0x4b, 0x3e, 0x68, 0x1b, 0x6c, 0x59, 0x68, 0x23, - 0x1c, 0x0a, 0x69, 0x98, 0x23, 0xff, 0x02, 0x1b, 0x40, 0x1a, 0x23, 0xff, 0x04, 0x1b, 0x40, 0x0b, - 0x0a, 0x1b, 0x02, 0x12, 0x43, 0x1a, 0x0e, 0x0b, 0x43, 0x1a, 0x23, 0xe0, 0x40, 0x19, 0x23, 0x02, - 0x43, 0x19, 0x06, 0x09, 0x43, 0x0a, 0x60, 0x02, 0x68, 0x23, 0x21, 0x20, 0x69, 0x98, 0xf7, 0xfd, - 0xff, 0x4b, 0xf7, 0xff, 0xfd, 0x9d, 0x7e, 0x3a, 0x2a, 0x00, 0xd1, 0x00, 0xe0, 0x9f, 0x9b, 0x01, - 0x1c, 0x14, 0x6a, 0x5d, 0x23, 0x0f, 0x40, 0x1c, 0x06, 0x13, 0x2b, 0x00, 0xdb, 0x01, 0x20, 0x00, - 0xe0, 0x00, 0x20, 0x10, 0x4b, 0x2d, 0x68, 0x19, 0x06, 0x13, 0x2b, 0x00, 0xdb, 0x01, 0x22, 0x00, - 0xe0, 0x00, 0x22, 0x10, 0x09, 0xcb, 0x21, 0x01, 0x40, 0x0b, 0x19, 0x12, 0x40, 0x93, 0x19, 0x02, - 0x40, 0x91, 0x1c, 0x2a, 0x43, 0x8a, 0x98, 0x01, 0x43, 0x13, 0x62, 0x43, 0xe0, 0x7f, 0xf7, 0xff, - 0xfd, 0x91, 0x4b, 0x16, 0x6c, 0x9c, 0xe0, 0x04, 0x6b, 0x60, 0x21, 0x60, 0xf0, 0x02, 0xfb, 0x02, - 0x6b, 0xa4, 0x2c, 0x00, 0xd1, 0xf8, 0x22, 0x20, 0x48, 0x10, 0x99, 0x02, 0xf0, 0x02, 0xfc, 0x44, - 0x7e, 0x3a, 0x2a, 0x00, 0xd0, 0x41, 0x9b, 0x01, 0x1c, 0x14, 0x6a, 0x5d, 0x23, 0x0f, 0x40, 0x1c, - 0x06, 0x13, 0x2b, 0x00, 0xdb, 0x01, 0x20, 0x00, 0xe0, 0x00, 0x20, 0x10, 0x4b, 0x07, 0x69, 0x99, - 0x06, 0x13, 0x2b, 0x00, 0xdb, 0x24, 0x22, 0x00, 0xe0, 0x23, 0x46, 0xc0, 0x13, 0x70, 0x67, 0x6c, - 0x13, 0x70, 0x60, 0x34, 0x13, 0x70, 0x67, 0x7c, 0x13, 0x70, 0x67, 0x80, 0x13, 0x72, 0xc1, 0x80, - 0x13, 0x70, 0x67, 0x8c, 0x13, 0x70, 0x67, 0x70, 0x13, 0x70, 0x67, 0x88, 0x40, 0x40, 0x40, 0x00, - 0x00, 0x00, 0x07, 0xff, 0x13, 0x70, 0x67, 0x84, 0x01, 0x00, 0x00, 0x80, 0x13, 0x70, 0x67, 0x74, - 0x13, 0x70, 0x60, 0x38, 0x13, 0x70, 0x48, 0x25, 0x13, 0x70, 0x67, 0x78, 0x13, 0x70, 0x67, 0x90, - 0x22, 0x10, 0x09, 0xcb, 0x21, 0x01, 0x40, 0x0b, 0x19, 0x12, 0x40, 0x93, 0x19, 0x02, 0x40, 0x91, - 0x1c, 0x2a, 0x43, 0x8a, 0x98, 0x01, 0x43, 0x13, 0x62, 0x43, 0x4c, 0x25, 0x21, 0x20, 0x68, 0x23, - 0x69, 0x98, 0xf7, 0xfd, 0xfe, 0xa9, 0x68, 0x23, 0x21, 0x20, 0x69, 0x98, 0xf0, 0x02, 0xfa, 0x7a, - 0x4b, 0x20, 0x68, 0x1b, 0x6c, 0x59, 0x68, 0x23, 0x1c, 0x0a, 0x69, 0x98, 0x23, 0xff, 0x02, 0x1b, - 0x40, 0x1a, 0x23, 0xff, 0x04, 0x1b, 0x40, 0x0b, 0x0a, 0x1b, 0x02, 0x12, 0x43, 0x1a, 0x0e, 0x0b, - 0x43, 0x1a, 0x23, 0xe0, 0x40, 0x19, 0x23, 0x02, 0x43, 0x19, 0x06, 0x09, 0x43, 0x0a, 0x60, 0x02, - 0x68, 0x23, 0x21, 0x20, 0x69, 0x98, 0xf7, 0xfd, 0xfe, 0xa7, 0xf7, 0xff, 0xfc, 0xf9, 0x49, 0x12, - 0x20, 0x01, 0xf7, 0xff, 0xfd, 0x29, 0x69, 0x39, 0x29, 0x00, 0xd0, 0x08, 0x7e, 0x7b, 0x68, 0xf8, - 0x2b, 0x00, 0xd0, 0x02, 0xf0, 0x02, 0xfa, 0x8e, 0xe0, 0x01, 0xf0, 0x02, 0xfa, 0x83, 0x7e, 0x3b, - 0x2b, 0x00, 0xd1, 0x03, 0x68, 0x78, 0x21, 0x08, 0xf0, 0x02, 0xfa, 0x84, 0x2e, 0x00, 0xd0, 0x01, - 0x69, 0x7f, 0x97, 0x03, 0x98, 0x03, 0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, - 0x13, 0x70, 0x60, 0x34, 0x13, 0x70, 0x67, 0x84, 0x13, 0x72, 0xc1, 0x80, 0xb5, 0x30, 0xb0, 0x89, - 0x46, 0x6d, 0x76, 0x29, 0x09, 0xc9, 0x76, 0x69, 0x21, 0x80, 0x00, 0x89, 0x91, 0x07, 0x24, 0x00, - 0x46, 0x69, 0x94, 0x00, 0x92, 0x04, 0x93, 0x02, 0xf7, 0xff, 0xfd, 0xe0, 0xb0, 0x09, 0xbc, 0x30, - 0xbc, 0x02, 0x47, 0x08, 0xb5, 0xf0, 0xb0, 0x83, 0x1c, 0x04, 0x91, 0x01, 0x92, 0x00, 0x34, 0xa0, - 0x1c, 0x07, 0x21, 0xff, 0x22, 0x0d, 0x68, 0x20, 0xf0, 0x03, 0xf9, 0xf4, 0x1c, 0x3b, 0x33, 0x90, - 0x68, 0x18, 0x7b, 0x39, 0x68, 0x23, 0x22, 0x0d, 0xf7, 0xff, 0xff, 0xd8, 0x28, 0x00, 0xdb, 0x4e, - 0x28, 0x0d, 0xd0, 0x01, 0x48, 0x28, 0xe0, 0x4a, 0x68, 0x23, 0x24, 0xff, 0x68, 0x19, 0x68, 0x5e, - 0x68, 0x9d, 0x7b, 0x1b, 0x0e, 0x0a, 0x46, 0x9c, 0x06, 0x0b, 0x43, 0x1a, 0x02, 0x24, 0x1c, 0x0b, - 0x20, 0xff, 0x40, 0x23, 0x04, 0x00, 0x02, 0x1b, 0x40, 0x01, 0x43, 0x1a, 0x0a, 0x09, 0x4b, 0x1f, - 0x43, 0x0a, 0x42, 0x9a, 0xd0, 0x01, 0x48, 0x1e, 0xe0, 0x31, 0x9a, 0x00, 0x2a, 0x00, 0xd0, 0x0c, - 0x06, 0x2b, 0x0e, 0x2a, 0x43, 0x1a, 0x1c, 0x2b, 0x40, 0x23, 0x02, 0x1b, 0x43, 0x1a, 0x1c, 0x2b, - 0x40, 0x03, 0x0a, 0x1b, 0x43, 0x1a, 0x9b, 0x00, 0x60, 0x1a, 0x9a, 0x01, 0x2a, 0x00, 0xd0, 0x01, - 0x46, 0x63, 0x70, 0x13, 0x06, 0x33, 0x0e, 0x32, 0x43, 0x1a, 0x23, 0xff, 0x02, 0x1b, 0x40, 0x33, - 0x02, 0x1b, 0x43, 0x1a, 0x23, 0xff, 0x04, 0x1b, 0x40, 0x33, 0x1c, 0x38, 0x0a, 0x1b, 0x1c, 0x11, - 0x30, 0x98, 0x43, 0x19, 0x68, 0x03, 0x42, 0x99, 0xd0, 0x01, 0x48, 0x0a, 0xe0, 0x07, 0x4a, 0x0a, - 0x1c, 0x8b, 0x40, 0x13, 0x4a, 0x09, 0x40, 0x0a, 0x43, 0x13, 0x60, 0x03, 0x20, 0x00, 0xb0, 0x03, - 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, 0xff, 0xff, 0xd8, 0xed, 0x53, 0x42, 0x53, 0x55, - 0xff, 0xff, 0xd8, 0xec, 0xff, 0xff, 0xd8, 0xeb, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, - 0xb5, 0xf0, 0xb0, 0x85, 0x93, 0x02, 0x46, 0x6b, 0x33, 0x2f, 0x78, 0x1b, 0x1c, 0x05, 0x93, 0x01, - 0x3b, 0x01, 0x06, 0x1b, 0x0e, 0x1b, 0x91, 0x03, 0x1c, 0x17, 0x2b, 0x0f, 0xd8, 0x5e, 0x1c, 0x06, - 0x36, 0xa0, 0x68, 0x30, 0x28, 0x00, 0xd0, 0x59, 0x21, 0x00, 0x22, 0x1f, 0xf0, 0x03, 0xf9, 0x72, - 0x68, 0x32, 0x4b, 0x2d, 0x24, 0xff, 0x60, 0x13, 0x1c, 0x2b, 0x33, 0x98, 0x68, 0x1a, 0x68, 0x31, - 0x06, 0x13, 0x46, 0x8c, 0x0e, 0x11, 0x43, 0x19, 0x02, 0x24, 0x1c, 0x13, 0x20, 0xff, 0x04, 0x00, - 0x40, 0x23, 0x02, 0x1b, 0x40, 0x02, 0x43, 0x19, 0x0a, 0x12, 0x43, 0x11, 0x46, 0x62, 0x60, 0x51, - 0x06, 0x3b, 0x0e, 0x3a, 0x43, 0x1a, 0x1c, 0x3b, 0x40, 0x23, 0x02, 0x1b, 0x43, 0x1a, 0x1c, 0x3b, - 0x40, 0x03, 0x68, 0x31, 0x0a, 0x1b, 0x43, 0x1a, 0x60, 0x8a, 0x22, 0x0b, 0x46, 0x69, 0x5c, 0x51, - 0x68, 0x33, 0x46, 0x6a, 0x73, 0x19, 0x21, 0x0f, 0x68, 0x33, 0x5c, 0x8a, 0x73, 0x5a, 0x1c, 0x2b, - 0x33, 0x9c, 0x78, 0x1b, 0x68, 0x31, 0x2b, 0x00, 0xd0, 0x01, 0x23, 0x0c, 0xe0, 0x05, 0x9b, 0x01, - 0x2b, 0x06, 0xd8, 0x01, 0x23, 0x06, 0xe0, 0x00, 0x23, 0x10, 0x1c, 0x2c, 0x73, 0x8b, 0x34, 0xa0, - 0x68, 0x20, 0x99, 0x0a, 0x9a, 0x01, 0x30, 0x0f, 0xf0, 0x03, 0xf8, 0xe8, 0x1c, 0x2b, 0x33, 0x90, - 0x68, 0x18, 0x7b, 0x69, 0x68, 0x23, 0x22, 0x1f, 0xf7, 0xff, 0xff, 0x10, 0x28, 0x1f, 0xd1, 0x01, - 0x20, 0x00, 0xe0, 0x05, 0x28, 0x00, 0xdb, 0x03, 0x48, 0x04, 0xe0, 0x01, 0x20, 0x03, 0x42, 0x40, - 0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x55, 0x53, 0x42, 0x43, 0xff, 0xff, 0xd8, 0xee, - 0xb5, 0xf0, 0xb0, 0x8b, 0x90, 0x01, 0x46, 0x68, 0x30, 0x42, 0x88, 0x04, 0x30, 0x04, 0x88, 0x05, - 0x48, 0x27, 0x9f, 0x12, 0x68, 0x00, 0x04, 0x24, 0x30, 0xf8, 0x68, 0x00, 0x04, 0x2d, 0x70, 0x42, - 0x02, 0x1a, 0x0a, 0x1b, 0x43, 0x1a, 0x04, 0x12, 0x0c, 0x13, 0x70, 0xc3, 0x0a, 0x23, 0x0e, 0x24, - 0x43, 0x23, 0x0e, 0x12, 0x04, 0x1b, 0x70, 0x82, 0x0c, 0x2e, 0x0c, 0x1a, 0x0e, 0x1b, 0x71, 0x03, - 0x0e, 0x2d, 0x02, 0x33, 0x43, 0x2b, 0x04, 0x1b, 0x71, 0x42, 0x0e, 0x1a, 0x0c, 0x1b, 0x71, 0xc3, - 0xac, 0x02, 0x23, 0x00, 0x70, 0x01, 0x71, 0x82, 0x76, 0x23, 0x23, 0x40, 0x61, 0xe3, 0x4b, 0x15, - 0x09, 0xc9, 0x90, 0x02, 0x76, 0x61, 0x61, 0x26, 0x42, 0x9f, 0xd9, 0x15, 0x1c, 0x30, 0xf0, 0x02, - 0xf9, 0x09, 0x1c, 0x32, 0x1c, 0x39, 0x60, 0xa0, 0xf0, 0x03, 0xf8, 0x90, 0x1c, 0x21, 0x98, 0x01, - 0xf7, 0xff, 0xfc, 0xac, 0x68, 0xa1, 0x1c, 0x05, 0x1c, 0x32, 0x1c, 0x38, 0xf0, 0x03, 0xf8, 0x86, - 0x68, 0xa0, 0xf0, 0x02, 0xf8, 0xeb, 0xe0, 0x05, 0x60, 0xa7, 0x98, 0x01, 0x1c, 0x21, 0xf7, 0xff, - 0xfc, 0x9d, 0x1c, 0x05, 0xb0, 0x0b, 0x1c, 0x28, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, - 0x13, 0x70, 0x60, 0x34, 0x13, 0x88, 0x00, 0x00, 0xb5, 0x00, 0xb0, 0x85, 0x91, 0x00, 0x23, 0x00, - 0x21, 0x02, 0x22, 0x01, 0x93, 0x01, 0x93, 0x02, 0xf7, 0xff, 0xff, 0x9a, 0xb0, 0x05, 0xbc, 0x02, - 0x47, 0x08, 0x46, 0xc0, 0xb5, 0x00, 0xb0, 0x85, 0x2a, 0x00, 0xd1, 0x02, 0x20, 0x03, 0x42, 0x40, - 0xe0, 0x08, 0x1c, 0x13, 0x22, 0x00, 0x91, 0x00, 0x92, 0x01, 0x92, 0x02, 0x21, 0x01, 0x22, 0x0b, - 0xf7, 0xff, 0xff, 0x86, 0xb0, 0x05, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, 0xb5, 0x00, 0xb0, 0x85, - 0x22, 0x00, 0x92, 0x00, 0x92, 0x01, 0x92, 0x02, 0x1c, 0x0b, 0x22, 0x09, 0x21, 0x00, 0xf7, 0xff, - 0xff, 0x77, 0xb0, 0x05, 0xbc, 0x02, 0x47, 0x08, 0xb5, 0x70, 0xb0, 0x84, 0x1c, 0x04, 0x20, 0x01, - 0x1c, 0x0e, 0xf0, 0x02, 0xf8, 0xaf, 0x1c, 0x05, 0x28, 0x00, 0xd1, 0x02, 0x24, 0x04, 0x42, 0x64, - 0xe0, 0x12, 0x23, 0x00, 0x93, 0x00, 0x23, 0x01, 0x93, 0x01, 0x90, 0x02, 0x21, 0x80, 0x1c, 0x20, - 0x22, 0x08, 0x23, 0x00, 0xf7, 0xff, 0xff, 0x5c, 0x1c, 0x04, 0x28, 0x00, 0xdb, 0x01, 0x78, 0x2b, - 0x70, 0x33, 0x1c, 0x28, 0xf0, 0x02, 0xf8, 0x8a, 0xb0, 0x04, 0x1c, 0x20, 0xbc, 0x70, 0xbc, 0x02, - 0x47, 0x08, 0x46, 0xc0, 0xb5, 0xf0, 0x4b, 0x4c, 0x4a, 0x4c, 0x78, 0x19, 0xb0, 0x87, 0x1c, 0x06, - 0x68, 0x17, 0x29, 0x00, 0xd0, 0x01, 0x4b, 0x4a, 0xe0, 0x00, 0x4b, 0x4a, 0x60, 0x13, 0x4b, 0x4a, - 0x68, 0x1b, 0x68, 0x9a, 0x1c, 0x33, 0x33, 0x90, 0x68, 0x1b, 0x32, 0x44, 0x69, 0xdb, 0x00, 0x9b, - 0x18, 0xd2, 0x68, 0x13, 0x22, 0x01, 0x42, 0x13, 0xd1, 0x06, 0x4b, 0x44, 0x24, 0x01, 0x60, 0x1a, - 0x4b, 0x3e, 0x42, 0x64, 0x60, 0x1f, 0xe0, 0x72, 0x4a, 0x3c, 0x29, 0x00, 0xd0, 0x01, 0x4b, 0x3c, - 0xe0, 0x00, 0x4b, 0x3c, 0x60, 0x13, 0x4b, 0x3e, 0x1c, 0x35, 0x78, 0x1b, 0x35, 0x90, 0x2b, 0x00, - 0xd0, 0x12, 0x88, 0xf3, 0x68, 0x28, 0x22, 0xff, 0x93, 0x00, 0x21, 0x21, 0x23, 0x00, 0x93, 0x01, - 0x93, 0x02, 0xf7, 0xff, 0xff, 0x15, 0x1c, 0x04, 0x1c, 0x21, 0x48, 0x36, 0xf7, 0xff, 0xfa, 0x12, - 0x20, 0x3c, 0xf7, 0xfe, 0xfc, 0x39, 0xe0, 0x07, 0x21, 0x00, 0x68, 0x28, 0xf7, 0xff, 0xff, 0x64, - 0x20, 0x05, 0xf7, 0xfe, 0xfc, 0x31, 0x24, 0x00, 0x4b, 0x27, 0x4a, 0x28, 0x78, 0x1b, 0x2b, 0x00, - 0xd0, 0x01, 0x4b, 0x27, 0xe0, 0x00, 0x4b, 0x27, 0x1c, 0x35, 0x60, 0x13, 0x35, 0x90, 0x2c, 0x00, - 0xda, 0x0a, 0x20, 0x32, 0xf7, 0xfe, 0xfc, 0x20, 0x68, 0x28, 0x21, 0x00, 0xf7, 0xff, 0xff, 0x4c, - 0x20, 0x05, 0xf7, 0xfe, 0xfc, 0x19, 0xe0, 0x2d, 0x7b, 0x31, 0x68, 0x28, 0xf7, 0xff, 0xff, 0x44, - 0x1c, 0x04, 0x20, 0x05, 0xf7, 0xfe, 0xfc, 0x10, 0x48, 0x1f, 0x1c, 0x21, 0xf7, 0xff, 0xf9, 0xe2, - 0x2c, 0x00, 0xdb, 0x1f, 0x7b, 0x71, 0x68, 0x28, 0xf7, 0xff, 0xff, 0x36, 0x1c, 0x04, 0x20, 0x05, - 0xf7, 0xfe, 0xfc, 0x02, 0x48, 0x19, 0x1c, 0x21, 0xf7, 0xff, 0xf9, 0xd4, 0x2c, 0x00, 0xdb, 0x11, - 0x20, 0x0a, 0xf7, 0xfe, 0xfb, 0xf9, 0x46, 0x69, 0x31, 0x17, 0x68, 0x28, 0xf7, 0xff, 0xff, 0x54, - 0x1c, 0x04, 0x1c, 0x21, 0x48, 0x12, 0xf7, 0xff, 0xf9, 0xc5, 0x2c, 0x00, 0xdb, 0x02, 0x4b, 0x07, - 0x60, 0x1f, 0xe0, 0x04, 0x4b, 0x05, 0x4a, 0x09, 0x60, 0x1f, 0x23, 0x01, 0x60, 0x13, 0xb0, 0x07, - 0x1c, 0x20, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x13, 0x70, 0x01, 0x0f, 0x13, 0x70, 0x60, 0x38, - 0x00, 0x0f, 0x42, 0x40, 0x00, 0x03, 0x0d, 0x40, 0x13, 0x70, 0x60, 0x34, 0x13, 0x70, 0x67, 0x6c, - 0x13, 0x70, 0x01, 0x0d, 0x13, 0x70, 0x61, 0x12, 0x13, 0x70, 0x61, 0x33, 0x13, 0x70, 0x61, 0x5a, - 0x13, 0x70, 0x61, 0x82, 0xb5, 0x00, 0xb0, 0x81, 0x21, 0x00, 0xf7, 0xff, 0xff, 0x4b, 0xb0, 0x01, - 0xbc, 0x02, 0x47, 0x08, 0xb5, 0xf0, 0xb0, 0x8d, 0x1c, 0x1e, 0x46, 0x6b, 0x33, 0x5f, 0x92, 0x07, - 0x78, 0x1a, 0x3b, 0x10, 0x78, 0x1b, 0x06, 0x12, 0x93, 0x06, 0x46, 0x6b, 0x33, 0x53, 0x78, 0x1b, - 0x16, 0x12, 0x93, 0x05, 0x46, 0x6b, 0x92, 0x04, 0x33, 0x2f, 0x22, 0x00, 0x91, 0x08, 0x70, 0x1a, - 0x4b, 0x99, 0x92, 0x0a, 0x60, 0x1a, 0x4a, 0x99, 0x4b, 0x99, 0x24, 0x00, 0x1c, 0x05, 0x94, 0x09, - 0x92, 0x03, 0x93, 0x02, 0x1c, 0xa3, 0x2b, 0x01, 0xd8, 0x00, 0xe1, 0x08, 0x2c, 0x00, 0xd0, 0x22, - 0x1c, 0x28, 0x21, 0x00, 0xf7, 0xff, 0xff, 0x1e, 0x1c, 0x04, 0x28, 0x00, 0xdb, 0x01, 0x20, 0x05, - 0xe0, 0x00, 0x20, 0x3c, 0xf7, 0xfe, 0xfb, 0x90, 0x4b, 0x8e, 0x68, 0x1b, 0x68, 0x9a, 0x4b, 0x8e, - 0x32, 0x44, 0x68, 0x1b, 0x00, 0x9b, 0x18, 0xd2, 0x68, 0x12, 0x2c, 0x00, 0xda, 0x09, 0x9a, 0x09, - 0x32, 0x01, 0x92, 0x09, 0x2a, 0x02, 0xdd, 0x00, 0xe0, 0xeb, 0x20, 0x0a, 0xf7, 0xfe, 0xfb, 0x7c, - 0xe0, 0xdf, 0x23, 0x00, 0x93, 0x09, 0x9b, 0x04, 0x9a, 0x05, 0x3b, 0x01, 0x06, 0x1b, 0x16, 0x1b, - 0x93, 0x04, 0x2a, 0x00, 0xd0, 0x31, 0x9b, 0x03, 0x9a, 0x02, 0x68, 0x1f, 0x78, 0x13, 0x2b, 0x00, - 0xd0, 0x01, 0x4b, 0x7e, 0xe0, 0x00, 0x4b, 0x7e, 0x9a, 0x03, 0x1c, 0x28, 0x60, 0x13, 0x9b, 0x12, - 0x9a, 0x06, 0x93, 0x00, 0x92, 0x01, 0x23, 0x00, 0x99, 0x08, 0x1c, 0x32, 0xf7, 0xff, 0xfd, 0xb8, - 0x4b, 0x72, 0x1c, 0x04, 0x60, 0x1f, 0x1c, 0x83, 0x2b, 0x01, 0xd8, 0x00, 0xe0, 0xbf, 0x28, 0x00, - 0xda, 0x0d, 0xe0, 0xb8, 0x1c, 0x2b, 0x33, 0x90, 0x68, 0x18, 0x7b, 0x69, 0x9b, 0x07, 0x1c, 0x32, - 0xf7, 0xff, 0xfd, 0x1c, 0x1c, 0x83, 0x1c, 0x04, 0x2b, 0x01, 0xd8, 0x43, 0xe0, 0x02, 0x2e, 0x00, - 0xd1, 0xf0, 0xe0, 0x49, 0x28, 0x00, 0xda, 0x47, 0xe0, 0xa3, 0x9b, 0x03, 0x9a, 0x02, 0x68, 0x1f, - 0x78, 0x13, 0x2b, 0x00, 0xd0, 0x01, 0x4b, 0x65, 0xe0, 0x00, 0x4b, 0x65, 0x9a, 0x03, 0x1c, 0x28, - 0x60, 0x13, 0x9b, 0x12, 0x9a, 0x06, 0x93, 0x00, 0x92, 0x01, 0x23, 0x80, 0x99, 0x08, 0x1c, 0x32, - 0xf7, 0xff, 0xfd, 0x86, 0x4b, 0x59, 0x1c, 0x04, 0x60, 0x1f, 0x28, 0x00, 0xda, 0x06, 0x48, 0x5d, - 0x1c, 0x21, 0xf7, 0xff, 0xf8, 0xf7, 0x48, 0x5c, 0xf7, 0xff, 0xf9, 0x3c, 0x1c, 0xa3, 0x2b, 0x01, - 0xd8, 0x00, 0xe0, 0x84, 0x2c, 0x00, 0xda, 0x1a, 0xe0, 0x7d, 0x1c, 0x2b, 0x33, 0x90, 0x68, 0x18, - 0x7b, 0x29, 0x1c, 0x32, 0x9b, 0x07, 0xf7, 0xff, 0xfc, 0xe1, 0x1c, 0x04, 0x28, 0x00, 0xda, 0x06, - 0x48, 0x52, 0x1c, 0x21, 0xf7, 0xff, 0xf8, 0xde, 0x48, 0x51, 0xf7, 0xff, 0xf9, 0x23, 0x1c, 0xa3, - 0x2b, 0x01, 0xd9, 0x07, 0x2c, 0x00, 0xdb, 0x62, 0x42, 0xb4, 0xd0, 0x05, 0xe0, 0x5f, 0x2e, 0x00, - 0xd1, 0xe3, 0xe0, 0x01, 0x2c, 0x00, 0xdb, 0x5e, 0x4b, 0x41, 0x4a, 0x40, 0x78, 0x1b, 0x68, 0x17, - 0x2b, 0x00, 0xd0, 0x01, 0x4b, 0x41, 0xe0, 0x00, 0x4b, 0x41, 0x46, 0x69, 0x60, 0x13, 0x1c, 0x28, - 0x31, 0x2f, 0xaa, 0x0a, 0xf7, 0xff, 0xfc, 0xce, 0x1c, 0x04, 0x28, 0x00, 0xda, 0x28, 0x48, 0x41, - 0x1c, 0x21, 0xf7, 0xff, 0xf8, 0xb7, 0x48, 0x40, 0xf7, 0xff, 0xf8, 0xfc, 0x1c, 0x63, 0xd1, 0x02, - 0x4b, 0x32, 0x60, 0x1f, 0xe0, 0x45, 0x1c, 0x2c, 0x34, 0x90, 0x68, 0x20, 0x7b, 0x29, 0xf7, 0xff, - 0xfe, 0x03, 0x7b, 0x2a, 0x68, 0x24, 0x06, 0x13, 0x6a, 0x60, 0x2b, 0x00, 0xdb, 0x01, 0x21, 0x00, - 0xe0, 0x00, 0x21, 0x10, 0x23, 0x0f, 0x40, 0x1a, 0x18, 0x8a, 0x23, 0x01, 0x40, 0x93, 0x43, 0x98, - 0x46, 0x69, 0x62, 0x60, 0x31, 0x2f, 0x1c, 0x28, 0xaa, 0x0a, 0xf7, 0xff, 0xfc, 0xa3, 0x1c, 0x04, - 0x4b, 0x22, 0x60, 0x1f, 0x1c, 0xa3, 0x2b, 0x01, 0xd9, 0x21, 0x9b, 0x0a, 0x2b, 0x00, 0xd0, 0x07, - 0x4b, 0x2a, 0x68, 0x1b, 0x2b, 0x00, 0xd0, 0x03, 0x46, 0x6b, 0x22, 0x01, 0x33, 0x2f, 0x70, 0x1a, - 0x2c, 0x00, 0xdb, 0x10, 0x4b, 0x25, 0x68, 0x1b, 0x2b, 0x00, 0xd0, 0x06, 0x46, 0x6b, 0x33, 0x2f, - 0x78, 0x1b, 0x2b, 0x00, 0xd0, 0x01, 0x4c, 0x22, 0xe0, 0x05, 0x24, 0x00, 0xe0, 0x0e, 0x4c, 0x21, - 0xe0, 0x01, 0x2c, 0x00, 0xda, 0x0a, 0x9a, 0x04, 0x2a, 0x00, 0xdd, 0x00, 0xe6, 0xf2, 0x2c, 0x00, - 0xda, 0x04, 0x4a, 0x0d, 0x23, 0x01, 0x60, 0x13, 0x2c, 0x00, 0xdb, 0x02, 0x4a, 0x0a, 0x23, 0x00, - 0x60, 0x13, 0x9b, 0x15, 0x2b, 0x00, 0xd0, 0x04, 0x46, 0x6b, 0x33, 0x2f, 0x78, 0x1b, 0x9a, 0x15, - 0x70, 0x13, 0x9b, 0x16, 0x2b, 0x00, 0xd0, 0x02, 0x9b, 0x0a, 0x9a, 0x16, 0x60, 0x13, 0xb0, 0x0d, - 0x1c, 0x20, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x13, 0x70, 0x67, 0x6c, 0x13, 0x70, 0x60, 0x38, - 0x13, 0x70, 0x01, 0x0f, 0x13, 0x70, 0x60, 0x34, 0x13, 0x70, 0x67, 0x78, 0x00, 0x0f, 0x42, 0x40, - 0x00, 0x03, 0x0d, 0x40, 0x13, 0x70, 0x61, 0xb1, 0x13, 0x70, 0x61, 0xc4, 0x13, 0x70, 0x61, 0xce, - 0x13, 0x70, 0x61, 0xe6, 0x13, 0x70, 0x61, 0xfa, 0x13, 0x70, 0x62, 0x09, 0x13, 0x70, 0x67, 0xa4, - 0xff, 0xff, 0xd8, 0xea, 0xff, 0xff, 0xd8, 0xe9, 0xb5, 0xf0, 0xb0, 0x8b, 0x1c, 0x0f, 0x21, 0x27, - 0x1c, 0x1d, 0x1c, 0x06, 0x23, 0x00, 0x44, 0x69, 0x46, 0x68, 0x30, 0x1d, 0x70, 0x0b, 0x23, 0x2a, - 0x70, 0x03, 0x21, 0x08, 0x01, 0x7b, 0x43, 0x0b, 0x70, 0x43, 0x0e, 0x13, 0x70, 0x83, 0x0c, 0x13, - 0x70, 0xc3, 0x0a, 0x13, 0x71, 0x03, 0x21, 0x00, 0x0a, 0x2b, 0x71, 0x42, 0x71, 0x81, 0x71, 0xc3, - 0x72, 0x05, 0x72, 0x41, 0x7b, 0xb3, 0x42, 0xbb, 0xd9, 0x24, 0x1d, 0x3b, 0x00, 0x9a, 0x59, 0x93, - 0x2b, 0x00, 0xd0, 0x1f, 0x4c, 0x12, 0x21, 0x01, 0x60, 0x21, 0x59, 0x93, 0x22, 0x0a, 0x92, 0x01, - 0x22, 0x27, 0x44, 0x6a, 0x91, 0x02, 0x92, 0x03, 0x21, 0x00, 0x22, 0x06, 0x90, 0x00, 0x91, 0x04, - 0x92, 0x05, 0x43, 0x6b, 0x9a, 0x10, 0x1c, 0x30, 0x1c, 0x39, 0xf7, 0xff, 0xfe, 0x5b, 0x22, 0x00, - 0x60, 0x22, 0x28, 0x00, 0xdd, 0x08, 0x21, 0x27, 0x44, 0x69, 0x78, 0x0b, 0x2b, 0x00, 0xd0, 0x03, - 0x48, 0x04, 0xe0, 0x01, 0x20, 0x03, 0x42, 0x40, 0xb0, 0x0b, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, - 0x13, 0x70, 0x67, 0xa4, 0xff, 0xff, 0xd8, 0xea, 0xb5, 0xf0, 0x1c, 0x1c, 0x1c, 0x1f, 0x1c, 0x0b, - 0xb0, 0x87, 0x33, 0x04, 0x90, 0x05, 0x00, 0x9b, 0x91, 0x04, 0x92, 0x03, 0x58, 0x19, 0x20, 0x80, - 0x1c, 0x0b, 0x43, 0x63, 0x02, 0x40, 0x42, 0x83, 0xd9, 0x02, 0xf0, 0x02, 0xfc, 0x9d, 0x1c, 0x07, - 0x9b, 0x04, 0x20, 0x01, 0x33, 0x04, 0x00, 0x9b, 0x42, 0x40, 0x93, 0x02, 0xe0, 0x1c, 0x1c, 0x25, - 0x42, 0xbc, 0xd9, 0x00, 0x1c, 0x3d, 0x04, 0x2b, 0x99, 0x0c, 0x0c, 0x1e, 0x91, 0x00, 0x98, 0x05, - 0x99, 0x04, 0x9a, 0x03, 0x1c, 0x33, 0xf7, 0xff, 0xff, 0x87, 0x28, 0x00, 0xdb, 0x0e, 0x9a, 0x03, - 0x1b, 0xa3, 0x19, 0x52, 0x92, 0x03, 0x99, 0x02, 0x9a, 0x05, 0x04, 0x1b, 0x0c, 0x1c, 0x58, 0x8b, - 0x99, 0x0c, 0x43, 0x6b, 0x18, 0xc9, 0x91, 0x0c, 0x2c, 0x00, 0xd1, 0xe0, 0xb0, 0x07, 0xbc, 0xf0, - 0xbc, 0x02, 0x47, 0x08, 0xb5, 0xf0, 0xb0, 0x8b, 0x1c, 0x05, 0x1c, 0x18, 0x23, 0x27, 0x27, 0x00, - 0x1c, 0x0e, 0x44, 0x6b, 0x46, 0x69, 0x31, 0x1d, 0x70, 0x1f, 0x23, 0x28, 0x70, 0x0b, 0x01, 0x73, - 0x70, 0x4b, 0x0e, 0x13, 0x70, 0x8b, 0x0c, 0x13, 0x70, 0xcb, 0x0a, 0x13, 0x71, 0x0b, 0x0a, 0x03, - 0x71, 0x4a, 0x71, 0x8f, 0x71, 0xcb, 0x72, 0x08, 0x72, 0x4f, 0x7b, 0xab, 0x42, 0xb3, 0xd9, 0x22, - 0x1d, 0x33, 0x00, 0x9a, 0x59, 0x53, 0x2b, 0x00, 0xd0, 0x1d, 0x4c, 0x12, 0x23, 0x01, 0x60, 0x23, - 0x59, 0x53, 0x22, 0x0a, 0x92, 0x01, 0x22, 0x27, 0x44, 0x6a, 0x92, 0x03, 0x22, 0x06, 0x43, 0x43, - 0x91, 0x00, 0x92, 0x05, 0x1c, 0x28, 0x1c, 0x31, 0x9a, 0x10, 0x97, 0x02, 0x97, 0x04, 0xf7, 0xff, - 0xfd, 0xd1, 0x60, 0x27, 0x28, 0x00, 0xdd, 0x08, 0x22, 0x27, 0x44, 0x6a, 0x78, 0x13, 0x2b, 0x00, - 0xd0, 0x03, 0x48, 0x05, 0xe0, 0x01, 0x20, 0x03, 0x42, 0x40, 0xb0, 0x0b, 0xbc, 0xf0, 0xbc, 0x02, - 0x47, 0x08, 0x46, 0xc0, 0x13, 0x70, 0x67, 0xa4, 0xff, 0xff, 0xd8, 0xea, 0xb5, 0xf0, 0x1c, 0x1c, - 0x1c, 0x1f, 0x1c, 0x0b, 0xb0, 0x87, 0x33, 0x04, 0x90, 0x05, 0x00, 0x9b, 0x91, 0x04, 0x92, 0x03, - 0x58, 0x19, 0x20, 0x80, 0x1c, 0x0b, 0x43, 0x63, 0x02, 0x40, 0x42, 0x83, 0xd9, 0x02, 0xf0, 0x02, - 0xfc, 0x13, 0x1c, 0x07, 0x9b, 0x04, 0x20, 0x01, 0x33, 0x04, 0x00, 0x9b, 0x42, 0x40, 0x93, 0x02, - 0xe0, 0x1c, 0x1c, 0x25, 0x42, 0xbc, 0xd9, 0x00, 0x1c, 0x3d, 0x04, 0x2b, 0x99, 0x0c, 0x0c, 0x1e, - 0x91, 0x00, 0x98, 0x05, 0x99, 0x04, 0x9a, 0x03, 0x1c, 0x33, 0xf7, 0xff, 0xff, 0x8b, 0x28, 0x00, - 0xdb, 0x0e, 0x9a, 0x03, 0x1b, 0xa3, 0x19, 0x52, 0x92, 0x03, 0x99, 0x02, 0x9a, 0x05, 0x04, 0x1b, - 0x0c, 0x1c, 0x58, 0x8b, 0x99, 0x0c, 0x43, 0x6b, 0x18, 0xc9, 0x91, 0x0c, 0x2c, 0x00, 0xd1, 0xe0, - 0xb0, 0x07, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0xb5, 0x70, 0x1c, 0x1d, 0x1c, 0x03, 0x33, 0xa0, - 0x1c, 0x16, 0x68, 0x1b, 0x22, 0x80, 0x01, 0x12, 0x18, 0x9c, 0xb0, 0x88, 0x2c, 0x00, 0xd1, 0x02, - 0x20, 0x04, 0x42, 0x40, 0xe0, 0x27, 0x46, 0x6a, 0x32, 0x1e, 0x01, 0x4b, 0x70, 0x53, 0x23, 0x25, - 0x70, 0x13, 0x23, 0x02, 0x93, 0x01, 0x23, 0x00, 0x93, 0x02, 0x93, 0x03, 0x93, 0x04, 0x23, 0x0a, - 0x92, 0x00, 0x93, 0x05, 0x1c, 0x22, 0x23, 0x08, 0xf7, 0xff, 0xfd, 0x5c, 0x28, 0x00, 0xdb, 0x12, - 0xa8, 0x06, 0x1c, 0x21, 0x22, 0x04, 0xf0, 0x02, 0xfc, 0xb9, 0x2d, 0x00, 0xd0, 0x01, 0x9b, 0x06, - 0x60, 0x2b, 0x1d, 0x21, 0xa8, 0x06, 0x22, 0x04, 0xf0, 0x02, 0xfc, 0xb0, 0x2e, 0x00, 0xd0, 0x01, - 0x9b, 0x06, 0x60, 0x33, 0x20, 0x00, 0xb0, 0x08, 0xbc, 0x70, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, - 0xb5, 0xf0, 0xb0, 0x8b, 0x1c, 0x0f, 0x46, 0x69, 0x31, 0x22, 0x23, 0x12, 0x90, 0x07, 0x70, 0x0b, - 0x01, 0x7b, 0x22, 0x00, 0x70, 0x4b, 0x23, 0x24, 0x70, 0x8a, 0x70, 0xca, 0x71, 0x4a, 0x71, 0x0b, - 0x9b, 0x07, 0x22, 0x80, 0x33, 0xa0, 0x68, 0x1b, 0x01, 0x12, 0x18, 0x9c, 0x2c, 0x00, 0xd1, 0x02, - 0x21, 0x04, 0x42, 0x49, 0xe0, 0x2c, 0x25, 0x00, 0x21, 0x00, 0x22, 0x24, 0x1c, 0x20, 0xf0, 0x02, - 0xfc, 0xc9, 0x23, 0x22, 0x44, 0x6b, 0x93, 0x00, 0x22, 0x06, 0x23, 0x0a, 0x26, 0x00, 0x92, 0x01, - 0x93, 0x05, 0x1c, 0x39, 0x98, 0x07, 0x1c, 0x22, 0x23, 0x24, 0x96, 0x02, 0x96, 0x03, 0x96, 0x04, - 0xf7, 0xff, 0xfd, 0x10, 0x1c, 0x01, 0x28, 0x00, 0xdb, 0x08, 0x78, 0x22, 0x23, 0x1f, 0x1c, 0x10, - 0x40, 0x18, 0x28, 0x05, 0xd0, 0x06, 0x28, 0x07, 0xd1, 0x08, 0xe0, 0x03, 0x35, 0x01, 0x2d, 0x02, - 0xd0, 0x06, 0xe7, 0xd9, 0x4a, 0x05, 0x23, 0x01, 0x60, 0x13, 0xe0, 0x01, 0x4b, 0x03, 0x60, 0x1e, - 0xb0, 0x0b, 0x1c, 0x08, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, 0x13, 0x70, 0x67, 0x94, - 0xb5, 0xf0, 0xb0, 0x8f, 0x1c, 0x03, 0x90, 0x07, 0x91, 0x06, 0x33, 0xa0, 0x68, 0x1b, 0x21, 0x80, - 0x46, 0x6f, 0x46, 0x6c, 0x01, 0x09, 0x37, 0x37, 0x25, 0x00, 0x34, 0x27, 0x18, 0x5e, 0x70, 0x3d, - 0x1c, 0x20, 0x21, 0x00, 0x22, 0x10, 0xf0, 0x02, 0xfc, 0x85, 0x2e, 0x00, 0xd1, 0x02, 0x25, 0x04, - 0x42, 0x6d, 0xe0, 0x5a, 0x23, 0x06, 0x70, 0x25, 0x93, 0x01, 0x23, 0x01, 0x93, 0x02, 0x23, 0x0a, - 0x93, 0x05, 0x99, 0x06, 0x22, 0x00, 0x98, 0x07, 0x23, 0x00, 0x95, 0x04, 0x94, 0x00, 0x97, 0x03, - 0xf7, 0xff, 0xfc, 0xc8, 0x1c, 0x05, 0x1c, 0x29, 0x48, 0x26, 0xf7, 0xfe, 0xfe, 0x5b, 0x1c, 0x6a, - 0xd0, 0x43, 0x78, 0x3b, 0x2b, 0x00, 0xd1, 0x01, 0x2d, 0x00, 0xda, 0x3e, 0x46, 0x6a, 0x32, 0x27, - 0x23, 0x03, 0x70, 0x13, 0x99, 0x06, 0x1c, 0x30, 0x01, 0x4b, 0x70, 0x53, 0x23, 0x12, 0x71, 0x13, - 0x23, 0x00, 0x71, 0x53, 0x21, 0x00, 0x22, 0x12, 0xf0, 0x02, 0xfc, 0x54, 0x4a, 0x1a, 0x35, 0x02, - 0xd1, 0x01, 0x4b, 0x1a, 0xe0, 0x00, 0x4b, 0x1a, 0x60, 0x13, 0x46, 0x6b, 0x33, 0x27, 0x93, 0x00, - 0x23, 0x06, 0x93, 0x01, 0x23, 0x00, 0x93, 0x02, 0x93, 0x03, 0x93, 0x04, 0x23, 0x0a, 0x93, 0x05, - 0x99, 0x06, 0x98, 0x07, 0x1c, 0x32, 0x23, 0x12, 0xf7, 0xff, 0xfc, 0x94, 0x1c, 0x05, 0x1c, 0x29, - 0x48, 0x10, 0xf7, 0xfe, 0xfe, 0x27, 0x2d, 0x00, 0xdb, 0x0f, 0x78, 0xb1, 0x23, 0x0f, 0x46, 0x6c, - 0x40, 0x19, 0x34, 0x37, 0x48, 0x0c, 0x70, 0x21, 0xf7, 0xfe, 0xfe, 0x1c, 0x78, 0x23, 0x3b, 0x02, - 0x06, 0x1b, 0x0e, 0x1b, 0x2b, 0x02, 0xd8, 0x00, 0x4d, 0x08, 0xb0, 0x0f, 0x1c, 0x28, 0xbc, 0xf0, - 0xbc, 0x02, 0x47, 0x08, 0x13, 0x70, 0x62, 0x14, 0x13, 0x70, 0x60, 0x38, 0x00, 0x26, 0x25, 0xa0, - 0x00, 0x98, 0x96, 0x80, 0x13, 0x70, 0x62, 0x35, 0x13, 0x70, 0x62, 0x54, 0xff, 0xff, 0xd8, 0xef, - 0xb5, 0xf0, 0x7b, 0x83, 0x1c, 0x0f, 0xb0, 0x81, 0x1c, 0x06, 0x42, 0xbb, 0xd8, 0x02, 0x24, 0x03, - 0x42, 0x64, 0xe0, 0x3a, 0x4d, 0x1f, 0x4b, 0x20, 0x48, 0x20, 0x60, 0x2b, 0x21, 0x00, 0xf7, 0xfe, - 0xfd, 0xf1, 0x4b, 0x1f, 0x1c, 0x30, 0x60, 0x2b, 0x1c, 0x39, 0xf7, 0xff, 0xff, 0x61, 0x1c, 0x04, - 0x28, 0x00, 0xdb, 0x27, 0x4b, 0x18, 0x1c, 0x39, 0x60, 0x2b, 0x1c, 0x30, 0xf7, 0xff, 0xff, 0x08, - 0x1c, 0x04, 0x1c, 0x21, 0x48, 0x17, 0xf7, 0xfe, 0xfd, 0xdd, 0x2c, 0x00, 0xdb, 0x1a, 0x1c, 0x33, - 0x33, 0xa0, 0x68, 0x1a, 0x23, 0x80, 0x01, 0x1b, 0x5c, 0xd1, 0x23, 0x1f, 0x40, 0x19, 0x48, 0x12, - 0xf7, 0xfe, 0xfd, 0xd0, 0x1c, 0x3b, 0x1d, 0x3a, 0x33, 0x14, 0x00, 0x92, 0x00, 0x9b, 0x1c, 0x39, - 0x18, 0xb2, 0x18, 0xf3, 0x1c, 0x30, 0xf7, 0xff, 0xfe, 0xaf, 0x1c, 0x04, 0x1c, 0x21, 0x48, 0x0b, - 0xf7, 0xfe, 0xfd, 0xc0, 0x4a, 0x03, 0x4b, 0x04, 0x60, 0x13, 0xb0, 0x01, 0x1c, 0x20, 0xbc, 0xf0, - 0xbc, 0x02, 0x47, 0x08, 0x13, 0x70, 0x60, 0x38, 0x00, 0x0f, 0x42, 0x40, 0x13, 0x70, 0x62, 0x76, - 0x01, 0x31, 0x2d, 0x00, 0x13, 0x70, 0x62, 0x91, 0x13, 0x70, 0x62, 0xa5, 0x13, 0x70, 0x62, 0xba, - 0xb5, 0x10, 0xb0, 0x84, 0x1c, 0x14, 0x46, 0x6a, 0x32, 0x1b, 0x78, 0x12, 0x02, 0x24, 0x43, 0x1c, - 0x23, 0x00, 0x93, 0x00, 0x92, 0x01, 0x91, 0x02, 0x22, 0x06, 0x21, 0x80, 0x1c, 0x23, 0xf7, 0xff, - 0xfa, 0x97, 0xb0, 0x04, 0xbc, 0x10, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, 0xb5, 0xf0, 0xb0, 0x8f, - 0x90, 0x03, 0x20, 0x16, 0x1c, 0x0f, 0xf0, 0x01, 0xfb, 0xcd, 0x90, 0x05, 0x28, 0x00, 0xd1, 0x00, - 0xe1, 0x7e, 0x23, 0x12, 0x93, 0x00, 0x98, 0x03, 0x99, 0x05, 0x22, 0x01, 0x23, 0x00, 0xf7, 0xff, - 0xff, 0xd7, 0x1c, 0x04, 0x28, 0x00, 0xda, 0x00, 0xe1, 0x65, 0x99, 0x05, 0x22, 0x12, 0x1c, 0x38, - 0xf0, 0x02, 0xfb, 0x44, 0x98, 0x05, 0xf0, 0x01, 0xfb, 0xa9, 0x78, 0xba, 0x78, 0xfb, 0x02, 0x12, - 0x43, 0x13, 0x04, 0x1b, 0x0a, 0x1a, 0x0e, 0x1b, 0x43, 0x1a, 0x04, 0x12, 0x0c, 0x13, 0x0e, 0x12, - 0x70, 0xba, 0x7a, 0x3a, 0x70, 0xfb, 0x7a, 0x7b, 0x02, 0x12, 0x43, 0x13, 0x04, 0x1b, 0x0a, 0x1a, - 0x0e, 0x1b, 0x43, 0x1a, 0x04, 0x12, 0x0c, 0x13, 0x0e, 0x12, 0x72, 0x3a, 0x7a, 0xba, 0x72, 0x7b, - 0x7a, 0xfb, 0x02, 0x12, 0x43, 0x13, 0x04, 0x1b, 0x0a, 0x1a, 0x0e, 0x1b, 0x43, 0x1a, 0x04, 0x12, - 0x0c, 0x13, 0x0e, 0x12, 0x72, 0xba, 0x7b, 0x3a, 0x72, 0xfb, 0x7b, 0x7b, 0x02, 0x12, 0x43, 0x13, - 0x04, 0x1b, 0x0a, 0x1a, 0x0e, 0x1b, 0x43, 0x1a, 0x04, 0x12, 0x0c, 0x13, 0x73, 0x7b, 0x7c, 0x7b, - 0x0e, 0x12, 0x00, 0x58, 0x18, 0xc0, 0x00, 0x80, 0x18, 0xc0, 0x73, 0x3a, 0xf0, 0x01, 0xfb, 0x7a, - 0x0e, 0x03, 0x74, 0xbb, 0x0c, 0x03, 0x74, 0xfb, 0x0a, 0x03, 0x75, 0x3b, 0x75, 0x78, 0x28, 0x00, - 0xd1, 0x00, 0xe1, 0x28, 0x7c, 0x7b, 0x21, 0x00, 0x00, 0x5a, 0x18, 0xd2, 0x00, 0x92, 0x18, 0xd2, - 0xf0, 0x02, 0xfb, 0x38, 0x22, 0x00, 0x92, 0x08, 0x92, 0x0d, 0xe1, 0x01, 0x20, 0x09, 0xf0, 0x01, - 0xfb, 0x61, 0x1c, 0x04, 0x28, 0x00, 0xd1, 0x00, 0xe1, 0x12, 0x9a, 0x08, 0x1c, 0x21, 0x06, 0x13, - 0x0e, 0x1b, 0x93, 0x04, 0x23, 0x09, 0x93, 0x00, 0x22, 0x02, 0x9b, 0x04, 0x98, 0x03, 0xf7, 0xff, - 0xff, 0x67, 0x7c, 0xba, 0x7c, 0xfb, 0x06, 0x12, 0x04, 0x1b, 0x43, 0x13, 0x7d, 0x3a, 0x1c, 0x21, - 0x02, 0x12, 0x43, 0x1a, 0x7d, 0x7b, 0x43, 0x13, 0x9a, 0x0d, 0x18, 0x9e, 0x1c, 0x30, 0x22, 0x09, - 0xf0, 0x02, 0xfa, 0xcc, 0x1c, 0x20, 0xf0, 0x01, 0xfb, 0x31, 0x78, 0xb2, 0x78, 0xf3, 0x02, 0x12, - 0x43, 0x13, 0x04, 0x1b, 0x0a, 0x1a, 0x0e, 0x1b, 0x43, 0x1a, 0x04, 0x12, 0x0c, 0x15, 0x0e, 0x12, - 0x70, 0xb2, 0x70, 0xf5, 0x1c, 0x28, 0xf0, 0x01, 0xfb, 0x2d, 0x90, 0x05, 0x28, 0x00, 0xd1, 0x00, - 0xe0, 0xde, 0x78, 0xf3, 0x98, 0x03, 0x93, 0x00, 0x99, 0x05, 0x22, 0x02, 0x9b, 0x04, 0xf7, 0xff, - 0xff, 0x37, 0x1c, 0x04, 0x28, 0x00, 0xda, 0x00, 0xe0, 0xc5, 0x79, 0x33, 0x78, 0x34, 0x00, 0xd8, - 0x18, 0xc0, 0x00, 0x40, 0xf0, 0x01, 0xfb, 0x16, 0x0e, 0x03, 0x72, 0x73, 0x0c, 0x03, 0x72, 0xb3, - 0x0a, 0x03, 0x72, 0xf3, 0x73, 0x30, 0x28, 0x00, 0xd1, 0x00, 0xe0, 0xc4, 0x9b, 0x05, 0x1b, 0x2d, - 0x19, 0x1b, 0x93, 0x06, 0x95, 0x07, 0x79, 0x33, 0x21, 0x00, 0x00, 0xda, 0x18, 0xd2, 0x00, 0x52, - 0xf0, 0x02, 0xfa, 0xd0, 0x22, 0x00, 0x92, 0x09, 0xe0, 0x89, 0x7a, 0x72, 0x7a, 0xb3, 0x06, 0x12, - 0x04, 0x1b, 0x43, 0x13, 0x7a, 0xf2, 0x99, 0x06, 0x02, 0x12, 0x43, 0x1a, 0x7b, 0x33, 0x43, 0x13, - 0x9a, 0x0c, 0x18, 0x9d, 0x1c, 0x28, 0x22, 0x09, 0xf0, 0x02, 0xfa, 0x78, 0x79, 0x2b, 0x78, 0x2c, - 0x00, 0xd8, 0x1a, 0xc0, 0xf0, 0x01, 0xfa, 0xe6, 0x0e, 0x03, 0x73, 0xab, 0x0c, 0x03, 0x73, 0xeb, - 0x0a, 0x03, 0x74, 0x2b, 0x74, 0x68, 0x28, 0x00, 0xd1, 0x00, 0xe0, 0x94, 0x9b, 0x06, 0x9a, 0x07, - 0x19, 0x1b, 0x1b, 0x12, 0x92, 0x07, 0x93, 0x06, 0x79, 0x2b, 0x21, 0x00, 0x00, 0xda, 0x1a, 0xd2, - 0xf0, 0x02, 0xfa, 0xa0, 0x9a, 0x07, 0x98, 0x06, 0xe0, 0x08, 0x78, 0x43, 0x3b, 0x04, 0x06, 0x1b, - 0x0e, 0x1b, 0x2b, 0x01, 0xd9, 0x04, 0x78, 0x03, 0x1a, 0xd2, 0x18, 0xc0, 0x2a, 0x00, 0xd1, 0xf4, - 0x9b, 0x06, 0x1a, 0xc4, 0x73, 0x6c, 0x2c, 0x00, 0xd0, 0x15, 0x1c, 0x20, 0xf0, 0x01, 0xfa, 0xba, - 0x0e, 0x03, 0x72, 0x6b, 0x0c, 0x03, 0x72, 0xab, 0x0a, 0x03, 0x72, 0xeb, 0x73, 0x28, 0x28, 0x00, - 0xd0, 0x69, 0x1c, 0x22, 0x99, 0x06, 0xf0, 0x02, 0xfa, 0x39, 0x9a, 0x06, 0x9b, 0x07, 0x19, 0x12, - 0x1b, 0x1b, 0x92, 0x06, 0x93, 0x07, 0x22, 0x00, 0x92, 0x0a, 0xe0, 0x26, 0x7b, 0xab, 0x7b, 0xea, - 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, 0x7c, 0x2b, 0x7c, 0x6c, 0x02, 0x1b, 0x43, 0x13, 0x43, 0x1c, - 0x9b, 0x0b, 0x22, 0x07, 0x18, 0xe4, 0x1c, 0x20, 0x99, 0x06, 0xf0, 0x02, 0xfa, 0x1f, 0x78, 0x23, - 0x9a, 0x06, 0x18, 0xd2, 0x92, 0x06, 0x79, 0x22, 0x79, 0x63, 0x02, 0x12, 0x43, 0x13, 0x04, 0x1b, - 0x0a, 0x1a, 0x0e, 0x1b, 0x43, 0x1a, 0x04, 0x12, 0x0c, 0x13, 0x0e, 0x12, 0x71, 0x22, 0x71, 0x63, - 0x9b, 0x0a, 0x9a, 0x0b, 0x33, 0x01, 0x93, 0x0a, 0x32, 0x07, 0x92, 0x0b, 0x79, 0x2b, 0x9a, 0x0a, - 0x42, 0x9a, 0xd3, 0xd3, 0x9b, 0x09, 0x9a, 0x0c, 0x33, 0x01, 0x93, 0x09, 0x32, 0x12, 0x92, 0x0c, - 0x79, 0x33, 0x9a, 0x09, 0x42, 0x9a, 0xd2, 0x00, 0xe7, 0x6f, 0x98, 0x05, 0xf0, 0x01, 0xfa, 0x5e, - 0x9b, 0x08, 0x9a, 0x0d, 0x33, 0x01, 0x93, 0x08, 0x32, 0x0d, 0x23, 0x00, 0x92, 0x0d, 0x93, 0x05, - 0x7c, 0x7b, 0x9a, 0x08, 0x42, 0x9a, 0xd2, 0x00, 0xe6, 0xf8, 0x9b, 0x05, 0x2b, 0x00, 0xd1, 0x01, - 0x24, 0x00, 0xe0, 0x08, 0x24, 0x00, 0x98, 0x05, 0xf0, 0x01, 0xfa, 0x48, 0x2c, 0x00, 0xd0, 0x02, - 0x1c, 0x38, 0xf7, 0xfe, 0xfb, 0x95, 0xb0, 0x0f, 0x1c, 0x20, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, - 0x24, 0x04, 0x42, 0x64, 0xe7, 0xf4, 0x24, 0x04, 0x42, 0x64, 0xe7, 0xec, 0xb5, 0xf0, 0xb0, 0x8f, - 0x46, 0x6b, 0x1c, 0x06, 0x4a, 0xc7, 0x20, 0x00, 0x33, 0x37, 0x70, 0x18, 0x23, 0x10, 0x70, 0x13, - 0x4b, 0xc5, 0x1c, 0x32, 0x32, 0x98, 0x60, 0x13, 0x46, 0x6d, 0x1c, 0x33, 0x35, 0x21, 0x33, 0x90, - 0x60, 0x19, 0x74, 0xa8, 0x74, 0xe8, 0x75, 0x28, 0x75, 0x68, 0x1c, 0x08, 0x1c, 0x29, 0xf7, 0xff, - 0xfe, 0x55, 0x1c, 0x04, 0x1c, 0x21, 0x48, 0xbd, 0xf7, 0xfe, 0xfb, 0xe4, 0x48, 0xbc, 0xf7, 0xfe, - 0xfc, 0x29, 0x2c, 0x00, 0xda, 0x00, 0xe1, 0xf0, 0x4b, 0xba, 0x68, 0x1b, 0x2b, 0x00, 0xd0, 0x32, - 0x4c, 0xb9, 0x79, 0x2b, 0x79, 0xa2, 0x42, 0x9a, 0xd1, 0x23, 0x79, 0xe2, 0x79, 0x6b, 0x42, 0x9a, - 0xd1, 0x1f, 0x7a, 0x21, 0x7a, 0x2a, 0x7a, 0x60, 0x7a, 0x6b, 0x02, 0x09, 0x02, 0x12, 0x43, 0x08, - 0x43, 0x13, 0x42, 0x98, 0xd1, 0x15, 0x7a, 0xa1, 0x7a, 0xaa, 0x7a, 0xe0, 0x7a, 0xeb, 0x02, 0x09, - 0x02, 0x12, 0x43, 0x08, 0x43, 0x13, 0x42, 0x98, 0xd1, 0x0b, 0x7b, 0x22, 0x7b, 0xab, 0x42, 0x9a, - 0xd1, 0x07, 0x7b, 0x62, 0x7b, 0xeb, 0x42, 0x9a, 0xd1, 0x03, 0x7b, 0xa2, 0x7c, 0x2b, 0x42, 0x9a, - 0xd0, 0x09, 0x46, 0x68, 0x30, 0x21, 0xf7, 0xfe, 0xfb, 0x33, 0x24, 0x01, 0x48, 0xa3, 0xf7, 0xfe, - 0xfb, 0xa9, 0x42, 0x64, 0xe1, 0xc8, 0x46, 0x68, 0x30, 0x21, 0x79, 0x03, 0x49, 0x9e, 0x71, 0x8b, - 0x79, 0x43, 0x71, 0xcb, 0x7a, 0x02, 0x7a, 0x43, 0x02, 0x12, 0x43, 0x13, 0x04, 0x1b, 0x0c, 0x1a, - 0x0e, 0x1b, 0x72, 0x0b, 0x72, 0x4a, 0x7a, 0x82, 0x7a, 0xc3, 0x02, 0x12, 0x43, 0x13, 0x04, 0x1b, - 0x0e, 0x1a, 0x0c, 0x1b, 0x72, 0x8a, 0x72, 0xcb, 0x7b, 0x83, 0x4a, 0x95, 0x73, 0x0b, 0x7b, 0xc3, - 0x73, 0x4b, 0x7c, 0x03, 0x73, 0x8b, 0x23, 0x80, 0x42, 0x5b, 0x60, 0x13, 0x4a, 0x91, 0x21, 0x00, - 0x91, 0x03, 0x91, 0x07, 0x92, 0x01, 0xe0, 0xfc, 0x23, 0x33, 0x44, 0x6b, 0xa9, 0x0d, 0x78, 0x1a, - 0x78, 0x0b, 0x21, 0x35, 0x06, 0x12, 0x44, 0x69, 0x04, 0x1b, 0x43, 0x13, 0x78, 0x0a, 0x21, 0x36, - 0x44, 0x69, 0x02, 0x12, 0x43, 0x1a, 0x78, 0x0b, 0x48, 0x87, 0x43, 0x13, 0x9a, 0x07, 0x99, 0x03, - 0x18, 0x9b, 0x93, 0x05, 0x7a, 0x1a, 0x00, 0x52, 0xf7, 0xfe, 0xfb, 0x64, 0x49, 0x83, 0x23, 0x00, - 0x93, 0x04, 0x93, 0x06, 0x91, 0x02, 0xe0, 0xd0, 0x9b, 0x05, 0x99, 0x05, 0x7a, 0x5a, 0x7a, 0x9b, - 0x06, 0x12, 0x04, 0x1b, 0x43, 0x13, 0x7a, 0xca, 0x02, 0x12, 0x43, 0x1a, 0x7b, 0x0b, 0x43, 0x13, - 0x9a, 0x06, 0x18, 0x9c, 0x79, 0x63, 0x2b, 0x08, 0xd1, 0x7f, 0x79, 0xa3, 0x2b, 0x06, 0xd0, 0x09, - 0x2b, 0x01, 0xd0, 0x07, 0x2b, 0x02, 0xd0, 0x05, 0x2b, 0x03, 0xd0, 0x03, 0x2b, 0x04, 0xd0, 0x01, - 0x2b, 0x05, 0xd1, 0x72, 0x79, 0xe3, 0x2b, 0x50, 0xd1, 0x6f, 0x79, 0x23, 0x2b, 0x01, 0xd9, 0x6c, - 0x1c, 0x32, 0x23, 0x01, 0x32, 0x9c, 0x70, 0x13, 0x48, 0x6d, 0x79, 0xa1, 0x22, 0x01, 0xf7, 0xfe, - 0xfb, 0x31, 0x23, 0x00, 0x73, 0x73, 0x73, 0x33, 0x27, 0x00, 0x25, 0x00, 0xe0, 0x2c, 0x7b, 0xa2, - 0x7b, 0xe3, 0x06, 0x12, 0x04, 0x1b, 0x43, 0x13, 0x7c, 0x22, 0x02, 0x12, 0x43, 0x1a, 0x7c, 0x63, - 0x43, 0x13, 0x19, 0x59, 0x78, 0xcb, 0x2b, 0x02, 0xd1, 0x1c, 0x78, 0x8a, 0x06, 0x13, 0x2b, 0x00, - 0xda, 0x0b, 0x7b, 0x33, 0x2b, 0x00, 0xd1, 0x08, 0x2a, 0x00, 0xd0, 0x06, 0x73, 0x32, 0x79, 0x0b, - 0x79, 0x49, 0x02, 0x1b, 0x43, 0x19, 0x98, 0x02, 0xe0, 0x0a, 0x7b, 0x73, 0x2b, 0x00, 0xd1, 0x09, - 0x2a, 0x00, 0xd0, 0x07, 0x73, 0x72, 0x79, 0x0b, 0x79, 0x49, 0x02, 0x1b, 0x98, 0x01, 0x43, 0x19, - 0xf7, 0xfe, 0xfb, 0x00, 0x37, 0x01, 0x35, 0x07, 0x79, 0x23, 0x42, 0x9f, 0xd3, 0xcf, 0x7b, 0x31, - 0x29, 0x00, 0xd0, 0x64, 0x7b, 0x72, 0x2a, 0x00, 0xd0, 0x61, 0x48, 0x4e, 0xf7, 0xfe, 0xfa, 0xf2, - 0x4a, 0x45, 0x7b, 0x33, 0x99, 0x05, 0x74, 0x13, 0x7b, 0x73, 0x46, 0x68, 0x74, 0x53, 0x79, 0x4b, - 0x30, 0x21, 0x70, 0x33, 0x78, 0xa3, 0x46, 0x6d, 0x60, 0x73, 0x73, 0xd3, 0x78, 0xe3, 0x35, 0x37, - 0x60, 0xb3, 0xf7, 0xfe, 0xfa, 0x65, 0x4b, 0x44, 0x4c, 0x3d, 0x48, 0x44, 0x60, 0x23, 0x78, 0x31, - 0x68, 0xb2, 0xf7, 0xfe, 0xfa, 0xd7, 0x1c, 0x33, 0x33, 0x90, 0x68, 0x18, 0x1c, 0x29, 0xf7, 0xff, - 0xf8, 0x5b, 0x28, 0x00, 0xdb, 0x00, 0xe0, 0x81, 0xe0, 0xde, 0x7b, 0xa3, 0x7b, 0xe2, 0x06, 0x1b, - 0x04, 0x12, 0x43, 0x1a, 0x7c, 0x23, 0x02, 0x1b, 0x43, 0x13, 0x7c, 0x62, 0x1c, 0x10, 0x43, 0x18, - 0xd0, 0x01, 0xf0, 0x01, 0xf8, 0xf3, 0x23, 0x00, 0x73, 0xa3, 0x73, 0xe3, 0x74, 0x23, 0x74, 0x63, - 0x7a, 0xa2, 0x7a, 0x63, 0x04, 0x12, 0x06, 0x1b, 0x43, 0x1a, 0x7a, 0xe3, 0x02, 0x1b, 0x43, 0x13, - 0x7b, 0x22, 0x1c, 0x10, 0x43, 0x18, 0xd0, 0x01, 0xf0, 0x01, 0xf8, 0xe0, 0x23, 0x00, 0x72, 0x63, - 0x72, 0xa3, 0x72, 0xe3, 0x73, 0x23, 0x79, 0x63, 0x2b, 0x09, 0xd1, 0x03, 0x4a, 0x20, 0x4b, 0x28, - 0x60, 0x13, 0xe0, 0x28, 0x2b, 0x08, 0xd1, 0x0a, 0x79, 0xe3, 0x2b, 0x50, 0xd1, 0x07, 0x79, 0x23, - 0x2b, 0x01, 0xd9, 0x04, 0x79, 0xa2, 0x4b, 0x23, 0x49, 0x19, 0x1a, 0x9b, 0x60, 0x0b, 0x9a, 0x04, - 0x9b, 0x06, 0x32, 0x01, 0x33, 0x12, 0x92, 0x04, 0x93, 0x06, 0x99, 0x05, 0x9a, 0x04, 0x79, 0x0b, - 0x42, 0x9a, 0xd2, 0x00, 0xe7, 0x28, 0x9b, 0x03, 0x99, 0x07, 0x33, 0x01, 0x31, 0x0d, 0x93, 0x03, - 0x91, 0x07, 0x22, 0x32, 0x44, 0x6a, 0x78, 0x13, 0x99, 0x03, 0x42, 0x99, 0xd2, 0x00, 0xe6, 0xfb, - 0x48, 0x15, 0xf7, 0xfe, 0xfa, 0x77, 0x46, 0x68, 0x30, 0x21, 0xf7, 0xfe, 0xf9, 0xf9, 0x4c, 0x11, - 0xe0, 0x83, 0x46, 0xc0, 0x13, 0x70, 0x60, 0x3c, 0x2c, 0x0d, 0xe0, 0x01, 0x13, 0x70, 0x62, 0xd3, - 0x13, 0x70, 0x62, 0xfd, 0x13, 0x70, 0x67, 0x98, 0x13, 0x70, 0x67, 0xac, 0x13, 0x70, 0x63, 0x16, - 0x13, 0x70, 0x67, 0xa8, 0x13, 0x70, 0x63, 0xa8, 0x13, 0x70, 0x63, 0x3c, 0x13, 0x70, 0x63, 0x9a, - 0x13, 0x70, 0x63, 0x63, 0x13, 0x70, 0x63, 0xb7, 0xff, 0xff, 0xfb, 0x4f, 0x13, 0x70, 0x63, 0xfc, - 0xff, 0xff, 0xb1, 0xe0, 0xff, 0xff, 0xd8, 0xf0, 0x13, 0x70, 0x63, 0xcb, 0x4b, 0x39, 0x48, 0x3a, - 0x60, 0x23, 0xf7, 0xfe, 0xfa, 0x8f, 0x78, 0x29, 0x78, 0x33, 0x42, 0x8b, 0xd0, 0x02, 0x48, 0x37, - 0xf7, 0xfe, 0xfa, 0x40, 0x4b, 0x36, 0x4a, 0x37, 0x60, 0x13, 0x46, 0x6b, 0x33, 0x37, 0x78, 0x31, - 0x78, 0x1b, 0x42, 0x8b, 0xd1, 0x03, 0x4b, 0x34, 0x78, 0x1b, 0x07, 0x9a, 0xd5, 0x06, 0x1c, 0x33, - 0x33, 0x90, 0x68, 0x18, 0xf7, 0xfe, 0xff, 0xaa, 0x28, 0x00, 0xdb, 0x3d, 0x4a, 0x2f, 0x4b, 0x30, - 0x60, 0x13, 0x68, 0xb2, 0x2a, 0x00, 0xd0, 0x09, 0x1c, 0x33, 0x33, 0x90, 0x06, 0x12, 0x68, 0x18, - 0x79, 0xf1, 0x0e, 0x12, 0xf7, 0xfe, 0xff, 0x86, 0x28, 0x00, 0xdb, 0x2d, 0x4a, 0x25, 0x4b, 0x29, - 0x48, 0x29, 0x60, 0x13, 0x4a, 0x25, 0x4b, 0x29, 0x60, 0x13, 0xf7, 0xfe, 0xfa, 0x5b, 0x1c, 0x30, - 0xf7, 0xff, 0xf8, 0x70, 0x1c, 0x04, 0x48, 0x26, 0xf7, 0xfe, 0xfa, 0x54, 0x2c, 0x00, 0xdb, 0x1c, - 0x1c, 0x34, 0x23, 0x08, 0x34, 0xa0, 0x73, 0xb3, 0x68, 0x23, 0x2b, 0x00, 0xd1, 0x07, 0x20, 0x81, - 0x01, 0x40, 0xf0, 0x01, 0xf8, 0x3f, 0x23, 0x1f, 0x30, 0x1f, 0x43, 0x98, 0x60, 0x20, 0x1c, 0x33, - 0x33, 0xa0, 0x68, 0x1b, 0x2b, 0x00, 0xd0, 0x01, 0x24, 0x00, 0xe0, 0x06, 0x4a, 0x13, 0x4b, 0x19, - 0x24, 0x04, 0x60, 0x13, 0x42, 0x64, 0xe0, 0x00, 0x4c, 0x17, 0x4a, 0x0e, 0x4b, 0x11, 0x60, 0x13, - 0x2c, 0x00, 0xda, 0x05, 0x4b, 0x0d, 0x48, 0x15, 0x68, 0x19, 0xf7, 0xfe, 0xf9, 0xe3, 0xe0, 0x03, - 0x48, 0x13, 0xf7, 0xfe, 0xf9, 0xdf, 0x24, 0x00, 0xb0, 0x0f, 0x1c, 0x20, 0xbc, 0xf0, 0xbc, 0x02, - 0x47, 0x08, 0x46, 0xc0, 0xff, 0xff, 0xfb, 0x4e, 0x13, 0x70, 0x64, 0x2a, 0x13, 0x70, 0x64, 0x45, - 0x00, 0x98, 0x96, 0x80, 0x13, 0x70, 0x60, 0x38, 0x13, 0x70, 0x01, 0x0e, 0x13, 0x70, 0x67, 0xa8, - 0xff, 0xff, 0xfb, 0x4d, 0x00, 0x0f, 0x42, 0x40, 0x13, 0x70, 0x64, 0x6f, 0xff, 0xff, 0xfb, 0x4c, - 0x13, 0x70, 0x64, 0x87, 0xff, 0xff, 0xfb, 0x4b, 0xff, 0xff, 0xd8, 0xe7, 0x13, 0x70, 0x64, 0x9e, - 0x13, 0x70, 0x64, 0xc0, 0xb5, 0xf0, 0x4b, 0x78, 0xb0, 0x8b, 0x68, 0x1b, 0x2b, 0x00, 0xd0, 0x4f, - 0x46, 0x6b, 0x22, 0x00, 0x33, 0x27, 0x70, 0x1a, 0xf0, 0x01, 0xf9, 0x24, 0x4a, 0x73, 0x23, 0x10, - 0x70, 0x13, 0x4b, 0x73, 0x4a, 0x73, 0x78, 0x1b, 0x2b, 0x00, 0xd0, 0x01, 0x4b, 0x72, 0xe0, 0x00, - 0x4b, 0x72, 0x4e, 0x73, 0x46, 0x6d, 0x60, 0x13, 0x35, 0x11, 0x23, 0x00, 0x1c, 0x37, 0x74, 0xab, - 0x74, 0xeb, 0x75, 0x2b, 0x75, 0x6b, 0x37, 0x90, 0x68, 0x38, 0x1c, 0x29, 0xf7, 0xff, 0xfb, 0xfe, - 0x4c, 0x6c, 0x79, 0x2b, 0x79, 0xa2, 0x42, 0x9a, 0xd1, 0x23, 0x79, 0xe2, 0x79, 0x6b, 0x42, 0x9a, - 0xd1, 0x1f, 0x7a, 0x21, 0x7a, 0x2a, 0x7a, 0x60, 0x7a, 0x6b, 0x02, 0x09, 0x02, 0x12, 0x43, 0x08, - 0x43, 0x13, 0x42, 0x98, 0xd1, 0x15, 0x7a, 0xa1, 0x7a, 0xaa, 0x7a, 0xe0, 0x7a, 0xeb, 0x02, 0x09, - 0x02, 0x12, 0x43, 0x08, 0x43, 0x13, 0x42, 0x98, 0xd1, 0x0b, 0x7b, 0x22, 0x7b, 0xab, 0x42, 0x9a, - 0xd1, 0x07, 0x7b, 0x62, 0x7b, 0xeb, 0x42, 0x9a, 0xd1, 0x03, 0x7b, 0xa2, 0x7c, 0x2b, 0x42, 0x9a, - 0xd0, 0x08, 0x46, 0x68, 0x30, 0x11, 0xf7, 0xfe, 0xf8, 0xeb, 0x48, 0x57, 0xf7, 0xfe, 0xf9, 0x62, - 0x4c, 0x56, 0xe0, 0x93, 0x46, 0x6c, 0x1c, 0x28, 0x34, 0x27, 0xf7, 0xfe, 0xf8, 0xe1, 0x68, 0x38, - 0x1c, 0x21, 0xf7, 0xfe, 0xfe, 0xe1, 0x28, 0x00, 0xda, 0x01, 0x4c, 0x51, 0xe0, 0x86, 0x4b, 0x49, - 0x4a, 0x50, 0x60, 0x1a, 0x78, 0x31, 0x78, 0x23, 0x42, 0x8b, 0xd1, 0x03, 0x4b, 0x4e, 0x78, 0x1b, - 0x07, 0x9a, 0xd5, 0x08, 0x4b, 0x46, 0x33, 0x90, 0x68, 0x18, 0xf7, 0xfe, 0xfe, 0xbf, 0x28, 0x00, - 0xda, 0x01, 0x4c, 0x4a, 0xe0, 0x72, 0x49, 0x42, 0x68, 0x8a, 0x2a, 0x00, 0xd0, 0x0b, 0x1c, 0x0b, - 0x33, 0x90, 0x06, 0x12, 0x68, 0x18, 0x79, 0xc9, 0x0e, 0x12, 0xf7, 0xfe, 0xfe, 0x9b, 0x28, 0x00, - 0xda, 0x01, 0x4c, 0x43, 0xe0, 0x62, 0x4b, 0x36, 0x4a, 0x36, 0x78, 0x1b, 0x2b, 0x00, 0xd0, 0x01, - 0x4b, 0x35, 0xe0, 0x00, 0x4b, 0x35, 0x60, 0x13, 0x48, 0x35, 0x21, 0x00, 0xf7, 0xfe, 0xfe, 0xd2, - 0x28, 0x00, 0xda, 0x01, 0x4c, 0x3b, 0xe0, 0x51, 0x4b, 0x32, 0x79, 0x5b, 0x2b, 0x00, 0xd1, 0x03, - 0x4b, 0x35, 0x78, 0x1b, 0x07, 0xda, 0xd5, 0x22, 0x4d, 0x2d, 0x23, 0x00, 0x73, 0xab, 0x4c, 0x29, - 0x4b, 0x30, 0x26, 0x01, 0x60, 0x23, 0x1c, 0x2b, 0x33, 0x90, 0x68, 0x18, 0x88, 0xeb, 0x21, 0xa1, - 0x93, 0x00, 0x1c, 0x2b, 0x33, 0x0e, 0x93, 0x02, 0x22, 0xfe, 0x23, 0x00, 0x96, 0x01, 0xf7, 0xfe, - 0xfd, 0xff, 0x4b, 0x21, 0x60, 0x23, 0x28, 0x00, 0xda, 0x06, 0x73, 0xae, 0x1c, 0x28, 0x21, 0x00, - 0xf7, 0xfe, 0xfe, 0xa8, 0x4c, 0x28, 0xe0, 0x29, 0x7b, 0xab, 0x33, 0x01, 0x73, 0xab, 0x4b, 0x27, - 0x4d, 0x18, 0x4f, 0x1b, 0x4e, 0x1b, 0x60, 0x2b, 0x79, 0x31, 0x1c, 0x38, 0xf7, 0xff, 0xfa, 0x60, - 0x1c, 0x04, 0x1c, 0x21, 0x48, 0x22, 0xf7, 0xfe, 0xf8, 0xe5, 0x4b, 0x13, 0x60, 0x2b, 0x2c, 0x00, - 0xda, 0x01, 0x4c, 0x20, 0xe0, 0x12, 0x79, 0x31, 0x1c, 0x38, 0xf7, 0xff, 0xfa, 0x01, 0x1c, 0x04, - 0x1c, 0x21, 0x48, 0x1d, 0xf7, 0xfe, 0xf8, 0xd6, 0x2c, 0x00, 0xda, 0x01, 0x4c, 0x1b, 0xe0, 0x05, - 0x79, 0x33, 0x4a, 0x06, 0x70, 0x13, 0x4a, 0x1a, 0x23, 0x01, 0x70, 0x13, 0xb0, 0x0b, 0x1c, 0x20, - 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, 0x13, 0x70, 0x67, 0x98, 0x13, 0x70, 0x60, 0x3c, - 0x13, 0x70, 0x01, 0x0f, 0x13, 0x70, 0x60, 0x38, 0x00, 0x0f, 0x42, 0x40, 0x00, 0x03, 0x0d, 0x40, - 0x13, 0x72, 0xc2, 0x00, 0x13, 0x70, 0x67, 0xac, 0x13, 0x70, 0x63, 0x16, 0xff, 0xff, 0xfc, 0x0f, - 0xff, 0xff, 0xfc, 0x18, 0x00, 0x98, 0x96, 0x80, 0x13, 0x70, 0x01, 0x0e, 0xff, 0xff, 0xfc, 0x17, - 0xff, 0xff, 0xfc, 0x16, 0xff, 0xff, 0xfc, 0x15, 0xff, 0xff, 0xfc, 0x14, 0x01, 0x31, 0x2d, 0x00, - 0x13, 0x70, 0x64, 0xdd, 0xff, 0xff, 0xfc, 0x13, 0x13, 0x70, 0x62, 0x91, 0xff, 0xff, 0xfc, 0x12, - 0x13, 0x70, 0x67, 0x9c, 0xb5, 0xf0, 0x4b, 0x8e, 0x22, 0x00, 0x80, 0x1a, 0x4b, 0x8d, 0x25, 0x00, - 0x80, 0x1a, 0x4b, 0x8d, 0x4a, 0x8d, 0x70, 0x1d, 0x4b, 0x8d, 0xb0, 0x8b, 0x70, 0x1d, 0x23, 0x78, - 0x42, 0x5b, 0x60, 0x13, 0x90, 0x08, 0xf0, 0x00, 0xff, 0xfd, 0x4c, 0x8a, 0x99, 0x08, 0x1c, 0x20, - 0xf7, 0xff, 0xfc, 0x7c, 0x28, 0x00, 0xda, 0x00, 0xe0, 0xfc, 0x49, 0x87, 0x20, 0x01, 0x73, 0xa0, - 0x78, 0x0b, 0x78, 0x4a, 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, 0x78, 0x8b, 0x02, 0x1b, 0x43, 0x13, - 0x78, 0xca, 0x43, 0x1a, 0xd0, 0x48, 0x79, 0x4b, 0x2b, 0x00, 0xd1, 0x03, 0x4b, 0x7f, 0x78, 0x1b, - 0x42, 0x03, 0xd0, 0x1d, 0x4d, 0x7b, 0x23, 0x00, 0x73, 0xab, 0x4c, 0x7d, 0x4b, 0x7d, 0x26, 0x01, - 0x60, 0x23, 0x1c, 0x2b, 0x33, 0x90, 0x68, 0x18, 0x88, 0xeb, 0x21, 0xa1, 0x93, 0x00, 0x1c, 0x2b, - 0x33, 0x0e, 0x93, 0x02, 0x22, 0xfe, 0x23, 0x00, 0x96, 0x01, 0xf7, 0xfe, 0xfd, 0x51, 0x4b, 0x76, - 0x60, 0x23, 0x28, 0x00, 0xda, 0x01, 0x73, 0xae, 0xe0, 0xbf, 0x7b, 0xab, 0x33, 0x01, 0x73, 0xab, - 0x4b, 0x6d, 0x48, 0x72, 0x79, 0x1d, 0x1c, 0x29, 0xf7, 0xfe, 0xf8, 0x44, 0x4e, 0x69, 0x1c, 0x29, - 0x1c, 0x30, 0xf7, 0xff, 0xfa, 0x3d, 0x1c, 0x04, 0x1c, 0x21, 0x48, 0x6d, 0xf7, 0xfe, 0xf8, 0x3a, - 0x1c, 0xa3, 0x2b, 0x01, 0xd8, 0x01, 0x1c, 0x30, 0xe0, 0x3c, 0x2c, 0x00, 0xda, 0x00, 0xe0, 0xa4, - 0x4a, 0x5d, 0x23, 0x01, 0x70, 0x13, 0x4b, 0x5e, 0x4a, 0x61, 0x70, 0x1d, 0x4b, 0x62, 0x60, 0x13, - 0x4a, 0x5a, 0x23, 0x00, 0x60, 0x13, 0xe0, 0x94, 0x4a, 0x5c, 0x71, 0x4d, 0x27, 0x01, 0x26, 0x00, - 0x25, 0x01, 0x92, 0x05, 0x1c, 0x32, 0x1e, 0x53, 0x41, 0x9a, 0x92, 0x09, 0x9a, 0x05, 0x78, 0x13, - 0x22, 0x01, 0x42, 0x13, 0xd0, 0x04, 0x9b, 0x09, 0x2b, 0x00, 0xd1, 0x01, 0x2d, 0x00, 0xd1, 0x27, - 0x48, 0x58, 0x1c, 0x31, 0xf7, 0xfe, 0xf8, 0x0e, 0x4a, 0x4e, 0x06, 0x31, 0x0e, 0x09, 0x1c, 0x10, - 0x92, 0x07, 0xf7, 0xff, 0xfa, 0x05, 0x1c, 0x04, 0x1c, 0x21, 0x48, 0x51, 0xf7, 0xfe, 0xf8, 0x02, - 0x1c, 0xa3, 0x2b, 0x01, 0xd8, 0x10, 0x9b, 0x09, 0x2b, 0x00, 0xd0, 0x0d, 0x4a, 0x48, 0x4b, 0x4a, - 0x60, 0x13, 0x98, 0x07, 0xf7, 0xfe, 0xfe, 0x56, 0x4a, 0x40, 0x23, 0x79, 0x42, 0x5b, 0x60, 0x13, - 0x4a, 0x3d, 0x23, 0x00, 0x70, 0x13, 0xe0, 0x6d, 0x2c, 0x00, 0xda, 0x40, 0x2d, 0x00, 0xd0, 0x38, - 0x4d, 0x45, 0x4c, 0x3f, 0x4b, 0x3f, 0x95, 0x06, 0x4a, 0x3a, 0x60, 0x23, 0x4b, 0x43, 0x27, 0x00, - 0x68, 0x18, 0x88, 0xd3, 0x60, 0x2f, 0x73, 0x97, 0x93, 0x00, 0x1c, 0x13, 0x33, 0x0e, 0x25, 0x01, - 0x93, 0x02, 0x21, 0xa1, 0x23, 0x00, 0x22, 0xfe, 0x95, 0x01, 0xf7, 0xfe, 0xfc, 0xd1, 0x4b, 0x36, - 0x1c, 0x05, 0x60, 0x23, 0x28, 0x00, 0xda, 0x05, 0x4a, 0x2e, 0x23, 0x01, 0x73, 0x93, 0x9a, 0x06, - 0x60, 0x17, 0xe0, 0x06, 0x4a, 0x2b, 0x7b, 0x93, 0x33, 0x01, 0x73, 0x93, 0x4b, 0x2a, 0x22, 0x01, - 0x71, 0x5a, 0x4b, 0x28, 0x48, 0x32, 0x7b, 0x9f, 0x1c, 0x29, 0x1c, 0x3a, 0xf7, 0xfd, 0xff, 0xba, - 0x4b, 0x26, 0x22, 0x01, 0x78, 0x1b, 0x42, 0x13, 0xd0, 0x05, 0x2d, 0x00, 0xda, 0x03, 0x25, 0x01, - 0xe0, 0x02, 0x36, 0x01, 0xe0, 0x00, 0x25, 0x00, 0x42, 0xbe, 0xdb, 0x8b, 0xe0, 0x1d, 0x4b, 0x1e, - 0x20, 0x00, 0x24, 0x01, 0x70, 0x18, 0x70, 0x58, 0x70, 0x98, 0x70, 0xdc, 0x06, 0x31, 0x0e, 0x09, - 0x9d, 0x08, 0x71, 0x19, 0x89, 0x2b, 0x4a, 0x12, 0x80, 0x13, 0x89, 0x6b, 0x4a, 0x11, 0x80, 0x13, - 0x4b, 0x11, 0x4a, 0x17, 0x70, 0x1c, 0x4b, 0x12, 0x70, 0x19, 0x4b, 0x17, 0x60, 0x13, 0x4b, 0x0f, - 0x60, 0x18, 0xf0, 0x00, 0xfe, 0xfb, 0x20, 0x00, 0xe0, 0x0e, 0x4a, 0x0c, 0x23, 0x7a, 0x42, 0x5b, - 0x60, 0x13, 0x48, 0x0c, 0xf7, 0xfe, 0xfd, 0xe6, 0x4a, 0x07, 0x23, 0x00, 0x70, 0x13, 0x48, 0x15, - 0xf7, 0xfd, 0xff, 0x80, 0x20, 0x03, 0x42, 0x40, 0xb0, 0x0b, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, - 0x13, 0x70, 0x67, 0x9e, 0x13, 0x70, 0x67, 0xa0, 0x13, 0x70, 0x67, 0x9c, 0x13, 0x70, 0x67, 0xa8, - 0x13, 0x70, 0x60, 0x3c, 0x13, 0x72, 0xc2, 0x00, 0x13, 0x70, 0x67, 0xac, 0x13, 0x70, 0x01, 0x0e, - 0x13, 0x70, 0x60, 0x38, 0x00, 0x98, 0x96, 0x80, 0x00, 0x0f, 0x42, 0x40, 0x13, 0x70, 0x64, 0xf2, - 0x13, 0x70, 0x65, 0x10, 0x13, 0x70, 0x64, 0xf7, 0x13, 0x70, 0x67, 0x6c, 0x13, 0x72, 0xc2, 0x90, - 0x13, 0x70, 0x65, 0x2d, 0x13, 0x70, 0x65, 0x56, 0xb5, 0xf0, 0x4b, 0x51, 0xb0, 0x89, 0x68, 0x1f, - 0x00, 0x83, 0x18, 0x1b, 0x00, 0xdb, 0x1c, 0x1a, 0x32, 0x58, 0x18, 0xfb, 0x18, 0xbe, 0x22, 0x00, - 0x1c, 0x05, 0x67, 0x1a, 0x20, 0x32, 0xf7, 0xfd, 0xf9, 0x6f, 0x24, 0x00, 0x23, 0x16, 0x22, 0x00, - 0x93, 0x01, 0x23, 0x80, 0x92, 0x00, 0x1c, 0x30, 0x21, 0x80, 0x22, 0x06, 0x00, 0x5b, 0x96, 0x02, - 0xf7, 0xfe, 0xfc, 0x36, 0x28, 0x00, 0xda, 0x3d, 0x20, 0x64, 0x34, 0x01, 0xf7, 0xfd, 0xf9, 0x5c, - 0x2c, 0x03, 0xd1, 0xeb, 0x24, 0x00, 0x1c, 0x28, 0xf7, 0xfe, 0xf8, 0xba, 0x20, 0x64, 0xf7, 0xfd, - 0xf9, 0x53, 0x23, 0x16, 0x22, 0x00, 0x93, 0x01, 0x23, 0x80, 0x92, 0x00, 0x1c, 0x30, 0x21, 0x80, - 0x22, 0x06, 0x00, 0x5b, 0x96, 0x02, 0xf7, 0xfe, 0xfc, 0x1b, 0x28, 0x00, 0xda, 0x22, 0x34, 0x01, - 0x2c, 0x03, 0xd1, 0xe8, 0x24, 0x00, 0x1c, 0x28, 0xf7, 0xfe, 0xf8, 0x76, 0x20, 0x64, 0xf7, 0xfd, - 0xf9, 0x3b, 0x1c, 0x28, 0xf7, 0xfe, 0xf8, 0x9c, 0x20, 0x64, 0xf7, 0xfd, 0xf9, 0x35, 0x23, 0x16, - 0x22, 0x00, 0x93, 0x01, 0x23, 0x80, 0x92, 0x00, 0x1c, 0x30, 0x21, 0x80, 0x22, 0x06, 0x00, 0x5b, - 0x96, 0x02, 0xf7, 0xfe, 0xfb, 0xfd, 0x28, 0x00, 0xda, 0x04, 0x34, 0x01, 0x2c, 0x03, 0xd1, 0xe2, - 0x48, 0x24, 0xe0, 0x40, 0x1c, 0x6a, 0x04, 0x13, 0x0c, 0x1b, 0x93, 0x06, 0x00, 0xab, 0x19, 0x5b, - 0x00, 0xdb, 0x18, 0xff, 0x1c, 0x3b, 0x33, 0x7c, 0x24, 0x00, 0x92, 0x07, 0x93, 0x05, 0x20, 0x32, - 0xf7, 0xfd, 0xf9, 0x12, 0x23, 0x00, 0x93, 0x00, 0x93, 0x01, 0x93, 0x02, 0x1c, 0x30, 0x21, 0x00, - 0x22, 0x05, 0x9b, 0x06, 0xf7, 0xfe, 0xfb, 0xdc, 0x28, 0x00, 0xda, 0x02, 0x4b, 0x16, 0x1b, 0x18, - 0x34, 0x01, 0x9a, 0x05, 0x25, 0x00, 0x60, 0x15, 0x9b, 0x07, 0x67, 0x3b, 0x28, 0x00, 0xda, 0x1a, - 0x21, 0x00, 0x1c, 0x30, 0xf7, 0xfe, 0xfc, 0x28, 0x20, 0x32, 0xf7, 0xfd, 0xf8, 0xf5, 0x23, 0x16, - 0x93, 0x01, 0x23, 0x80, 0x1c, 0x30, 0x21, 0x80, 0x22, 0x06, 0x00, 0x5b, 0x95, 0x00, 0x96, 0x02, - 0xf7, 0xfe, 0xfb, 0xbe, 0x28, 0x00, 0xdb, 0x02, 0x20, 0x01, 0x42, 0x40, 0xe0, 0x01, 0x48, 0x07, - 0x67, 0x3d, 0x2c, 0x04, 0xdd, 0xcb, 0xb0, 0x09, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, - 0x13, 0x70, 0x60, 0x34, 0xff, 0xff, 0xf7, 0x67, 0xff, 0xff, 0xe0, 0xc0, 0xff, 0xff, 0xf7, 0x3e, - 0xb5, 0x10, 0x4b, 0x0a, 0x1c, 0x04, 0x68, 0x1b, 0x68, 0x9a, 0x23, 0x01, 0x60, 0x93, 0xf7, 0xfe, - 0xf8, 0x2f, 0x28, 0x00, 0xdb, 0x02, 0x1c, 0x20, 0xf7, 0xff, 0xff, 0x46, 0x4b, 0x03, 0x68, 0x1b, - 0x68, 0x9a, 0x23, 0x04, 0x60, 0x93, 0xbc, 0x10, 0xbc, 0x02, 0x47, 0x08, 0x13, 0x70, 0x60, 0x34, - 0xb5, 0xf0, 0x1c, 0x06, 0x48, 0x44, 0xb0, 0x8b, 0x68, 0x02, 0x1c, 0x33, 0x92, 0x06, 0x68, 0x91, - 0x33, 0x10, 0x00, 0x9b, 0x18, 0xc9, 0x00, 0xb3, 0x19, 0x9b, 0x00, 0xdb, 0x9c, 0x06, 0x1c, 0x1a, - 0x32, 0x58, 0x18, 0xa2, 0x92, 0x08, 0x18, 0xe3, 0x22, 0x00, 0x67, 0x1a, 0x68, 0x03, 0x4a, 0x3b, - 0x68, 0x9b, 0x1d, 0x0f, 0x68, 0x5b, 0x68, 0x4b, 0x40, 0x13, 0x2b, 0x01, 0xd0, 0x02, 0x24, 0x01, - 0x42, 0x64, 0xe0, 0x64, 0x1c, 0x73, 0x04, 0x1b, 0x22, 0x00, 0x0c, 0x1b, 0x92, 0x09, 0x93, 0x05, - 0x4b, 0x33, 0x20, 0x0a, 0x60, 0x3b, 0xf7, 0xfd, 0xf8, 0x8f, 0x4b, 0x32, 0x20, 0x64, 0x60, 0x3b, - 0xf7, 0xfd, 0xf8, 0x8a, 0x4b, 0x30, 0x22, 0x80, 0x60, 0x3b, 0x23, 0xfa, 0x00, 0xdb, 0x93, 0x00, - 0x00, 0x52, 0x23, 0x00, 0x1c, 0x38, 0x1c, 0x39, 0xf7, 0xfd, 0xff, 0x92, 0x68, 0x3a, 0x4b, 0x2b, - 0x1c, 0x04, 0x40, 0x13, 0x2b, 0x05, 0xd1, 0x30, 0x23, 0xc0, 0x01, 0x1b, 0x40, 0x1a, 0x23, 0x80, - 0x00, 0xdb, 0x42, 0x9a, 0xd0, 0x29, 0x28, 0x00, 0xd1, 0x29, 0x20, 0x64, 0xf7, 0xfd, 0xf8, 0x6c, - 0x4b, 0x23, 0x21, 0x80, 0x68, 0x1a, 0x25, 0x00, 0x92, 0x07, 0x4a, 0x22, 0x60, 0x1a, 0x23, 0x16, - 0x93, 0x01, 0x9b, 0x08, 0x22, 0x06, 0x93, 0x02, 0x1c, 0x18, 0x23, 0x80, 0x00, 0x5b, 0x94, 0x00, - 0xf7, 0xfe, 0xfb, 0x2e, 0x1c, 0x04, 0x28, 0x00, 0xdb, 0x09, 0x98, 0x08, 0x21, 0x00, 0x22, 0x05, - 0x9b, 0x05, 0x95, 0x00, 0x95, 0x01, 0x95, 0x02, 0xf7, 0xfe, 0xfb, 0x22, 0x1c, 0x04, 0x4b, 0x14, - 0x9a, 0x07, 0x60, 0x1a, 0x2c, 0x00, 0xdb, 0x02, 0xe0, 0x08, 0x24, 0x01, 0x42, 0x64, 0x9b, 0x09, - 0x33, 0x01, 0x93, 0x09, 0x2b, 0x04, 0xd1, 0xab, 0x2c, 0x00, 0xdb, 0x08, 0x00, 0xb3, 0x9a, 0x06, - 0x19, 0x9b, 0x00, 0xdb, 0x18, 0xd3, 0x22, 0x00, 0x67, 0xda, 0x1c, 0x72, 0x67, 0x1a, 0xb0, 0x0b, - 0x1c, 0x20, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x13, 0x70, 0x60, 0x34, 0x00, 0x00, 0x20, 0x01, - 0x00, 0x00, 0x18, 0x03, 0x00, 0x00, 0x19, 0x03, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x20, 0x05, - 0x13, 0x70, 0x60, 0x38, 0x00, 0x03, 0x0d, 0x40, 0xb5, 0xf0, 0x4c, 0x1d, 0xb0, 0x81, 0x68, 0x23, - 0x1c, 0x06, 0x68, 0x9d, 0x23, 0x01, 0x60, 0xab, 0xf7, 0xff, 0xff, 0x5a, 0x1c, 0x07, 0x28, 0x00, - 0xda, 0x1b, 0x68, 0x23, 0x22, 0x37, 0x68, 0x99, 0x20, 0x0a, 0x68, 0x4b, 0x40, 0x13, 0x60, 0x4b, - 0x68, 0x23, 0x1c, 0x34, 0x68, 0x9b, 0x34, 0x10, 0x68, 0x1b, 0x00, 0xa4, 0xf7, 0xfd, 0xf8, 0x04, - 0x4b, 0x10, 0x19, 0x2c, 0x60, 0x63, 0x20, 0x32, 0xf7, 0xfc, 0xff, 0xfe, 0x4b, 0x0e, 0x20, 0x64, - 0x60, 0x63, 0xf7, 0xfc, 0xff, 0xf9, 0x4b, 0x0d, 0x60, 0x63, 0x48, 0x09, 0x22, 0x37, 0x68, 0x03, - 0xb0, 0x01, 0x68, 0x99, 0x68, 0x4b, 0x40, 0x13, 0x60, 0x4b, 0x68, 0x03, 0x68, 0x9a, 0x23, 0x04, - 0x60, 0x93, 0x68, 0x03, 0x1c, 0x38, 0x68, 0x9b, 0x68, 0x1b, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, - 0x13, 0x70, 0x60, 0x34, 0x00, 0x00, 0x18, 0x03, 0x00, 0x00, 0x19, 0x03, 0x00, 0x00, 0x10, 0x01, - 0xb5, 0xf0, 0x4b, 0x51, 0x4c, 0x51, 0x78, 0x1b, 0xb0, 0x83, 0x1c, 0x1a, 0x4b, 0x50, 0x1e, 0x51, - 0x41, 0x8a, 0x68, 0x1b, 0x60, 0x22, 0x2b, 0x00, 0xd0, 0x2b, 0x4b, 0x4e, 0x00, 0x92, 0x68, 0x1b, - 0x68, 0x99, 0x1c, 0x0b, 0x33, 0x44, 0x18, 0x9b, 0x68, 0x1b, 0x07, 0xda, 0xd4, 0x23, 0xf0, 0x00, - 0xfd, 0x11, 0x20, 0x64, 0xf7, 0xfc, 0xff, 0xc0, 0xf0, 0x00, 0xfd, 0x00, 0x20, 0x64, 0xf7, 0xfc, - 0xff, 0xbb, 0xf0, 0x00, 0xfd, 0x07, 0x20, 0x64, 0xf7, 0xfc, 0xff, 0xb6, 0xf0, 0x00, 0xfc, 0xf6, - 0x20, 0x64, 0xf7, 0xfc, 0xff, 0xb1, 0xf0, 0x00, 0xfc, 0xfd, 0x20, 0x64, 0xf7, 0xfc, 0xff, 0xac, - 0xf0, 0x00, 0xfc, 0xec, 0x20, 0x64, 0xf7, 0xfc, 0xff, 0xa7, 0x20, 0xfa, 0x00, 0x40, 0xf7, 0xfc, - 0xff, 0xa3, 0x24, 0x01, 0xe0, 0x62, 0x23, 0x00, 0x60, 0x8b, 0x20, 0x00, 0xf7, 0xfc, 0xfd, 0x2e, - 0x68, 0x20, 0xf7, 0xff, 0xff, 0x79, 0x1c, 0x06, 0x28, 0x00, 0xda, 0x03, 0x68, 0x20, 0xf7, 0xff, - 0xff, 0x73, 0x1c, 0x06, 0x20, 0x3c, 0xf7, 0xfc, 0xff, 0x8f, 0x4b, 0x2e, 0x48, 0x2e, 0x93, 0x01, - 0x68, 0x1b, 0x1c, 0x31, 0x68, 0x9a, 0x4b, 0x29, 0x32, 0x44, 0x68, 0x1b, 0x00, 0x9b, 0x18, 0xd2, - 0x68, 0x15, 0x1c, 0x2a, 0xf7, 0xfd, 0xfd, 0x56, 0x4c, 0x25, 0x22, 0x01, 0x60, 0x22, 0x2e, 0x00, - 0xdb, 0x38, 0x4b, 0x26, 0x1c, 0x2a, 0x40, 0x1a, 0x4b, 0x25, 0x42, 0x9a, 0xd1, 0x32, 0x4d, 0x25, - 0x27, 0x00, 0x70, 0x2f, 0x60, 0x27, 0xf7, 0xff, 0xfb, 0x8d, 0x4b, 0x23, 0x4a, 0x23, 0x60, 0x13, - 0x4b, 0x23, 0x93, 0x00, 0x28, 0x00, 0xdb, 0x11, 0x48, 0x22, 0xf7, 0xfd, 0xfd, 0x3b, 0xf0, 0x00, - 0xfc, 0xa5, 0x22, 0x01, 0x60, 0x27, 0x70, 0x2a, 0x98, 0x00, 0xf7, 0xfc, 0xfc, 0xef, 0x9a, 0x01, - 0x24, 0x00, 0x68, 0x13, 0x68, 0x9a, 0x23, 0x04, 0x60, 0x93, 0xe0, 0x14, 0x23, 0x01, 0x60, 0x23, - 0x1c, 0x31, 0x48, 0x19, 0xf7, 0xfd, 0xfd, 0x26, 0x70, 0x2f, 0xf0, 0x00, 0xfc, 0x8f, 0x20, 0x64, - 0xf7, 0xfc, 0xff, 0x4a, 0x98, 0x00, 0xf7, 0xfc, 0xfc, 0xd9, 0x9a, 0x01, 0x68, 0x13, 0x68, 0x9a, - 0x23, 0x04, 0x60, 0x93, 0x24, 0x01, 0x20, 0x64, 0xf7, 0xfc, 0xff, 0x3e, 0xb0, 0x03, 0x1c, 0x20, - 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, 0x13, 0x70, 0x01, 0x0c, 0x13, 0x70, 0x67, 0x78, - 0x13, 0x70, 0x67, 0x6c, 0x13, 0x70, 0x60, 0x34, 0x13, 0x70, 0x65, 0x73, 0x00, 0x00, 0x31, 0x05, - 0x00, 0x00, 0x10, 0x05, 0x13, 0x70, 0x67, 0x9c, 0x00, 0x0f, 0x42, 0x40, 0x13, 0x70, 0x60, 0x38, - 0x13, 0x70, 0x12, 0xd9, 0x13, 0x70, 0x65, 0x9d, 0x13, 0x70, 0x65, 0xae, 0xb5, 0xf0, 0x4b, 0x28, - 0xb0, 0x85, 0x68, 0x1b, 0x90, 0x03, 0x92, 0x02, 0x2b, 0x00, 0xd0, 0x01, 0x20, 0x00, 0xe0, 0x43, - 0x04, 0x0b, 0x4f, 0x24, 0x25, 0x00, 0x0c, 0x1e, 0xf7, 0xff, 0xff, 0x32, 0x28, 0x00, 0xd1, 0x01, - 0x25, 0x00, 0xe0, 0x01, 0x2d, 0x00, 0xdb, 0x02, 0x78, 0x3b, 0x2b, 0x01, 0xd0, 0x04, 0x4a, 0x1e, - 0x23, 0x01, 0x25, 0x01, 0x60, 0x13, 0x42, 0x6d, 0x4b, 0x1b, 0x68, 0x19, 0x29, 0x00, 0xd1, 0xeb, - 0x4a, 0x1a, 0x4b, 0x1b, 0x60, 0x13, 0x1c, 0x6b, 0xd0, 0x17, 0x4c, 0x1a, 0x20, 0x00, 0x68, 0x23, - 0x68, 0x9b, 0x60, 0x99, 0xf7, 0xfc, 0xfc, 0x82, 0x4b, 0x17, 0x9a, 0x03, 0x78, 0x19, 0x9b, 0x02, - 0x48, 0x16, 0x93, 0x00, 0x1c, 0x33, 0xf7, 0xfe, 0xfc, 0xdf, 0x1c, 0x05, 0x48, 0x14, 0xf7, 0xfc, - 0xfc, 0x75, 0x68, 0x23, 0x68, 0x9a, 0x23, 0x04, 0x60, 0x93, 0x4a, 0x0c, 0x4b, 0x11, 0x60, 0x13, - 0x2d, 0x00, 0xda, 0x02, 0x4a, 0x08, 0x23, 0x01, 0x60, 0x13, 0x4b, 0x07, 0x68, 0x1b, 0x2b, 0x00, - 0xd1, 0xc2, 0x2d, 0x00, 0xdb, 0xc0, 0x20, 0x01, 0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, - 0x13, 0x70, 0x67, 0x94, 0x13, 0x70, 0x67, 0x9c, 0x13, 0x70, 0x67, 0x6c, 0x13, 0x70, 0x60, 0x38, - 0x00, 0x2d, 0xc6, 0xc0, 0x13, 0x70, 0x60, 0x34, 0x13, 0x70, 0x60, 0x3c, 0x13, 0x72, 0xc2, 0x00, - 0x13, 0x70, 0x12, 0xd9, 0x00, 0x0f, 0x42, 0x40, 0xb5, 0xf0, 0x4b, 0x4b, 0xb0, 0x87, 0x68, 0x1b, - 0x1c, 0x07, 0x92, 0x05, 0x2b, 0x00, 0xd1, 0x07, 0x4b, 0x48, 0x68, 0x1b, 0x2b, 0x00, 0xd0, 0x03, - 0x4a, 0x47, 0x4b, 0x48, 0x40, 0x02, 0x60, 0x1a, 0x4b, 0x47, 0x68, 0x1b, 0x2b, 0x00, 0xd0, 0x06, - 0x4a, 0x46, 0x68, 0x13, 0x2b, 0x01, 0xdd, 0x02, 0x23, 0x01, 0x60, 0x13, 0xe0, 0x61, 0x4b, 0x3f, - 0x4a, 0x3d, 0x93, 0x03, 0x04, 0x0b, 0x0c, 0x1b, 0x25, 0x00, 0x26, 0x00, 0x92, 0x04, 0x93, 0x02, - 0x9a, 0x04, 0x68, 0x13, 0x2b, 0x00, 0xd1, 0x04, 0x9a, 0x03, 0x68, 0x13, 0x2b, 0x00, 0xd1, 0x00, - 0x26, 0x00, 0xf7, 0xff, 0xfe, 0xad, 0x28, 0x00, 0xd1, 0x00, 0x25, 0x00, 0x4b, 0x36, 0x68, 0x1b, - 0x2b, 0x00, 0xd0, 0x03, 0x4b, 0x35, 0x68, 0x1b, 0x2b, 0x03, 0xd0, 0x53, 0x2d, 0x00, 0xdb, 0x03, - 0x4b, 0x33, 0x78, 0x1b, 0x2b, 0x01, 0xd0, 0x04, 0x4a, 0x30, 0x23, 0x01, 0x25, 0x01, 0x60, 0x13, - 0x42, 0x6d, 0x4b, 0x2e, 0x68, 0x1b, 0x2b, 0x00, 0xd1, 0x41, 0x4b, 0x28, 0x4a, 0x2d, 0x68, 0x1b, - 0x2b, 0x00, 0xd0, 0x01, 0x4b, 0x2c, 0xe0, 0x00, 0x4b, 0x2c, 0x60, 0x13, 0x1c, 0x6b, 0xd0, 0x18, - 0x4c, 0x2b, 0x20, 0x00, 0x68, 0x23, 0x68, 0x9a, 0x23, 0x00, 0x60, 0x93, 0xf7, 0xfc, 0xfb, 0xee, - 0x4b, 0x28, 0x9a, 0x05, 0x78, 0x19, 0x48, 0x28, 0x9b, 0x02, 0x92, 0x00, 0x1c, 0x3a, 0xf7, 0xfe, - 0xfc, 0xd5, 0x1c, 0x05, 0x48, 0x25, 0xf7, 0xfc, 0xfb, 0xe1, 0x68, 0x23, 0x68, 0x9a, 0x23, 0x04, - 0x60, 0x93, 0x4a, 0x1c, 0x4b, 0x22, 0x60, 0x13, 0x2d, 0x00, 0xda, 0x02, 0x4a, 0x17, 0x23, 0x01, - 0x60, 0x13, 0x4b, 0x15, 0x68, 0x1b, 0x2b, 0x00, 0xd0, 0x05, 0x4b, 0x14, 0x68, 0x1b, 0x2b, 0x00, - 0xd0, 0x01, 0x20, 0x00, 0xe0, 0x13, 0x4b, 0x11, 0x68, 0x1b, 0x2b, 0x00, 0xd1, 0x07, 0x4b, 0x10, - 0x78, 0x1b, 0x2b, 0x01, 0xd1, 0x03, 0x2d, 0x00, 0xdb, 0x01, 0x20, 0x01, 0xe0, 0x07, 0x36, 0x01, - 0x2e, 0x03, 0xdd, 0x95, 0x0f, 0xeb, 0x22, 0x01, 0x40, 0x53, 0x06, 0x1b, 0x0e, 0x18, 0xb0, 0x07, - 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, 0x13, 0x70, 0x67, 0xc0, 0x13, 0x70, 0x67, 0x94, - 0x7f, 0xff, 0xff, 0xff, 0x13, 0x70, 0x67, 0x54, 0x13, 0x70, 0x67, 0x48, 0x13, 0x70, 0x67, 0x6c, - 0x13, 0x70, 0x67, 0x9c, 0x13, 0x70, 0x60, 0x38, 0x00, 0x98, 0x96, 0x80, 0x00, 0x2d, 0xc6, 0xc0, - 0x13, 0x70, 0x60, 0x34, 0x13, 0x70, 0x60, 0x3c, 0x13, 0x72, 0xc2, 0x00, 0x13, 0x70, 0x12, 0xd9, - 0x00, 0x0f, 0x42, 0x40, 0xb5, 0xf0, 0x4b, 0x1e, 0xb0, 0x81, 0x68, 0x1b, 0x2b, 0x00, 0xd0, 0x31, - 0xf7, 0xff, 0xfe, 0x1e, 0x4b, 0x1b, 0x68, 0x1b, 0x2b, 0x00, 0xd1, 0x2b, 0x4b, 0x1a, 0x78, 0x1b, - 0x2b, 0x00, 0xd0, 0x27, 0x4e, 0x19, 0x4f, 0x1a, 0x4c, 0x1a, 0x4d, 0x1b, 0x60, 0x37, 0x79, 0x29, - 0x1c, 0x20, 0xf7, 0xfe, 0xfc, 0xe5, 0x28, 0x00, 0xdb, 0x1c, 0x60, 0x37, 0x79, 0x29, 0x1c, 0x22, - 0x1c, 0x23, 0x00, 0x88, 0x32, 0x10, 0x33, 0x50, 0x18, 0x12, 0x18, 0x1b, 0x1c, 0x20, 0xf7, 0xfe, - 0xfc, 0x9b, 0x28, 0x00, 0xdb, 0x0e, 0x4b, 0x11, 0x68, 0x18, 0x28, 0x00, 0xd0, 0x07, 0x79, 0x2b, - 0x22, 0x80, 0x33, 0x04, 0x00, 0x9b, 0x59, 0x1b, 0x01, 0x12, 0x42, 0x93, 0xd1, 0x02, 0x1e, 0x43, - 0x41, 0x98, 0xe0, 0x00, 0x20, 0x00, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, - 0x13, 0x70, 0x67, 0x98, 0x13, 0x70, 0x67, 0x6c, 0x13, 0x70, 0x67, 0x9c, 0x13, 0x70, 0x60, 0x38, - 0x00, 0x0f, 0x42, 0x40, 0x13, 0x72, 0xc2, 0x00, 0x13, 0x70, 0x67, 0xac, 0x13, 0x70, 0x67, 0x94, - 0xb5, 0xf0, 0x4b, 0x65, 0xb0, 0x83, 0x68, 0x1c, 0x2c, 0x00, 0xd0, 0x01, 0x20, 0x00, 0xe0, 0xbf, - 0x4a, 0x62, 0x20, 0x00, 0x92, 0x00, 0x68, 0x13, 0x68, 0x9b, 0x60, 0x9c, 0xf7, 0xfc, 0xfb, 0x36, - 0x4a, 0x5f, 0x23, 0x01, 0x42, 0x5b, 0x60, 0x13, 0x4a, 0x5e, 0x23, 0x01, 0x60, 0x13, 0x4b, 0x5e, - 0x48, 0x5e, 0x70, 0x1c, 0xf7, 0xfd, 0xfb, 0x6e, 0x49, 0x5d, 0x4a, 0x5e, 0x78, 0x0b, 0x1e, 0x58, - 0x41, 0x83, 0x60, 0x13, 0x1c, 0x1d, 0x00, 0x9f, 0xe0, 0x8e, 0x4b, 0x54, 0x68, 0x1b, 0x93, 0x01, - 0x00, 0xab, 0x9a, 0x01, 0x19, 0x5b, 0x00, 0xdb, 0x18, 0xd3, 0x4a, 0x56, 0x67, 0x5d, 0x60, 0x15, - 0x6f, 0x1b, 0x4a, 0x50, 0x2b, 0x00, 0xd0, 0x4d, 0x23, 0x01, 0x60, 0x13, 0x1c, 0x28, 0xf7, 0xff, - 0xfc, 0xa7, 0x1c, 0x04, 0x20, 0x14, 0xf7, 0xfc, 0xfd, 0x77, 0x4a, 0x48, 0x68, 0x13, 0x68, 0x9b, - 0x33, 0x44, 0x19, 0xdb, 0x68, 0x19, 0x2c, 0x00, 0xdb, 0x05, 0x4b, 0x4b, 0x1c, 0x0a, 0x40, 0x1a, - 0x4b, 0x4a, 0x42, 0x9a, 0xd0, 0x0c, 0x1c, 0x28, 0xf7, 0xff, 0xfd, 0x46, 0x1c, 0x04, 0x20, 0x14, - 0xf7, 0xfc, 0xfd, 0x62, 0x4b, 0x3d, 0x68, 0x1b, 0x68, 0x9b, 0x33, 0x44, 0x19, 0xdb, 0x68, 0x19, - 0x4e, 0x3c, 0x23, 0x01, 0x60, 0x33, 0x2c, 0x00, 0xdb, 0x54, 0x4b, 0x3f, 0x1c, 0x0a, 0x40, 0x1a, - 0x4b, 0x3e, 0x42, 0x9a, 0xd1, 0x4e, 0x00, 0xa8, 0x19, 0x40, 0x00, 0xc0, 0x9a, 0x01, 0x30, 0x58, - 0x18, 0x10, 0xf7, 0xff, 0xfa, 0x87, 0x28, 0x00, 0xd1, 0x44, 0x4b, 0x2f, 0x22, 0x01, 0x60, 0x1a, - 0x60, 0x30, 0x48, 0x37, 0xf7, 0xfc, 0xfa, 0xd2, 0x4b, 0x2c, 0x48, 0x36, 0x68, 0x1b, 0x68, 0x9a, - 0x23, 0x04, 0x60, 0x93, 0xf7, 0xfd, 0xfb, 0x0e, 0x4b, 0x33, 0x68, 0x1b, 0x1c, 0x18, 0x1e, 0x42, - 0x41, 0x90, 0xe0, 0x45, 0x23, 0x01, 0x60, 0x13, 0x4a, 0x24, 0x48, 0x30, 0x68, 0x13, 0x68, 0x9b, - 0x33, 0x44, 0x19, 0xdb, 0x68, 0x1c, 0x1c, 0x21, 0xf7, 0xfd, 0xfa, 0xfc, 0x23, 0x01, 0x42, 0x1c, - 0xd0, 0x19, 0x1c, 0x28, 0xf7, 0xff, 0xfd, 0x00, 0x1c, 0x04, 0x20, 0x14, 0xf7, 0xfc, 0xfd, 0x1c, - 0x4a, 0x1a, 0x68, 0x13, 0x68, 0x9b, 0x33, 0x44, 0x19, 0xdb, 0x68, 0x1a, 0x2c, 0x00, 0xdb, 0x04, - 0x4b, 0x1d, 0x40, 0x1a, 0x4b, 0x1d, 0x42, 0x9a, 0xd0, 0x02, 0x1c, 0x28, 0xf7, 0xff, 0xfc, 0x38, - 0x4a, 0x13, 0x23, 0x65, 0xe0, 0x04, 0x4a, 0x12, 0x68, 0x13, 0x33, 0x01, 0xd1, 0x02, 0x23, 0x64, - 0x42, 0x5b, 0x60, 0x13, 0x35, 0x01, 0x37, 0x04, 0x4a, 0x11, 0x78, 0x13, 0x2b, 0x00, 0xd1, 0x01, - 0x23, 0x01, 0xe0, 0x00, 0x23, 0x02, 0x42, 0x9d, 0xda, 0x00, 0xe7, 0x66, 0x48, 0x10, 0xf7, 0xfc, - 0xfa, 0x85, 0x9a, 0x00, 0x68, 0x13, 0x68, 0x9a, 0x23, 0x04, 0x60, 0x93, 0x4b, 0x04, 0x68, 0x18, - 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x13, 0x70, 0x67, 0x98, 0x13, 0x70, 0x60, 0x34, - 0x13, 0x70, 0x67, 0xa8, 0x13, 0x70, 0x67, 0x6c, 0x13, 0x70, 0x67, 0x9c, 0x13, 0x70, 0x65, 0xc6, - 0x13, 0x70, 0x01, 0x0c, 0x13, 0x70, 0x67, 0x78, 0x00, 0x00, 0x31, 0x05, 0x00, 0x00, 0x10, 0x05, - 0x13, 0x70, 0x12, 0xd9, 0x13, 0x70, 0x66, 0x43, 0x13, 0x70, 0x67, 0x94, 0x13, 0x70, 0x66, 0x59, - 0xb5, 0xf0, 0x4b, 0x21, 0x49, 0x21, 0x78, 0x1a, 0xb0, 0x81, 0x1e, 0x50, 0x41, 0x82, 0x60, 0x0a, - 0x1c, 0x15, 0x00, 0x96, 0x1c, 0x18, 0x21, 0x01, 0x4f, 0x1d, 0xe0, 0x28, 0x00, 0xab, 0x68, 0x3a, - 0x19, 0x5b, 0x00, 0xdb, 0x18, 0xd2, 0x67, 0x55, 0x68, 0x3b, 0x1d, 0x32, 0x68, 0x9b, 0x33, 0x44, - 0x19, 0x9b, 0x68, 0x1b, 0x42, 0x0b, 0xd0, 0x18, 0x1c, 0x28, 0xf7, 0xff, 0xfc, 0x8d, 0x1c, 0x04, - 0x20, 0x14, 0xf7, 0xfc, 0xfc, 0xa9, 0x68, 0x3b, 0x68, 0x9b, 0x33, 0x44, 0x19, 0x9b, 0x68, 0x1a, - 0x2c, 0x00, 0xdb, 0x04, 0x4b, 0x0f, 0x40, 0x1a, 0x4b, 0x0f, 0x42, 0x9a, 0xd0, 0x02, 0x1c, 0x28, - 0xf7, 0xff, 0xfb, 0xc6, 0x20, 0x65, 0x42, 0x40, 0xe0, 0x0a, 0x35, 0x01, 0x1c, 0x16, 0x78, 0x03, - 0x2b, 0x00, 0xd1, 0x01, 0x23, 0x01, 0xe0, 0x00, 0x23, 0x02, 0x42, 0x9d, 0xdb, 0xce, 0x20, 0x00, - 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x13, 0x70, 0x01, 0x0c, 0x13, 0x70, 0x67, 0x78, - 0x13, 0x70, 0x60, 0x34, 0x00, 0x00, 0x39, 0x05, 0x00, 0x00, 0x10, 0x05, 0xb5, 0xf0, 0xb0, 0x81, - 0x1c, 0x06, 0x07, 0xc2, 0xd4, 0x01, 0x20, 0x01, 0xe0, 0x38, 0x4b, 0x35, 0x68, 0x1c, 0x2c, 0x00, - 0xd0, 0x09, 0x6b, 0x60, 0x21, 0x60, 0xf7, 0xfb, 0xfc, 0xdf, 0x6b, 0x60, 0x21, 0x60, 0xf0, 0x00, - 0xf8, 0x71, 0x6b, 0xa4, 0xe7, 0xf3, 0x4c, 0x2f, 0x68, 0x23, 0x2b, 0x00, 0xd0, 0x1a, 0x6c, 0x58, - 0x21, 0x20, 0xf7, 0xfb, 0xfc, 0xd1, 0x68, 0x23, 0x21, 0x20, 0x6c, 0x58, 0xf0, 0x00, 0xf8, 0x62, - 0x68, 0x22, 0x23, 0x80, 0x04, 0x5b, 0x61, 0x13, 0x4b, 0x27, 0x68, 0x22, 0x68, 0x1b, 0x21, 0x20, - 0x6b, 0x5b, 0x61, 0x53, 0x68, 0x23, 0x6c, 0x58, 0xf7, 0xfb, 0xfc, 0x96, 0x68, 0x23, 0x4a, 0x23, - 0x69, 0x9b, 0x60, 0x13, 0x4b, 0x1e, 0x68, 0x18, 0xf7, 0xfc, 0xfc, 0xc6, 0x28, 0x00, 0xd0, 0x05, - 0x4b, 0x1f, 0x20, 0x05, 0x68, 0x1a, 0x23, 0x00, 0x64, 0x13, 0x42, 0x40, 0x07, 0x73, 0xd5, 0x24, - 0x4a, 0x1b, 0x25, 0x80, 0x4f, 0x1b, 0x24, 0x00, 0x46, 0x94, 0x01, 0xad, 0x46, 0x62, 0x68, 0x13, - 0x00, 0xa2, 0x68, 0x9b, 0x33, 0x44, 0x18, 0x99, 0x68, 0x3b, 0x68, 0x0a, 0x42, 0x9c, 0xd1, 0x0c, - 0x21, 0x01, 0x42, 0x0a, 0xd1, 0x0e, 0x4b, 0x14, 0x22, 0x20, 0x60, 0x19, 0x49, 0x13, 0x20, 0x01, - 0x68, 0x0b, 0x42, 0x40, 0x43, 0x93, 0x60, 0x0b, 0xe0, 0x04, 0x4b, 0x11, 0x40, 0x13, 0x2b, 0x03, - 0xd1, 0x00, 0x60, 0x0d, 0x34, 0x01, 0x2c, 0x04, 0xd1, 0xe0, 0x28, 0x00, 0xd0, 0x04, 0x23, 0x12, - 0x42, 0x1e, 0xd0, 0x01, 0x20, 0x06, 0x42, 0x40, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, - 0x13, 0x70, 0x67, 0x88, 0x13, 0x70, 0x67, 0x8c, 0x13, 0x70, 0x67, 0xc4, 0x13, 0x70, 0x67, 0x90, - 0x13, 0x70, 0x60, 0x34, 0x13, 0x70, 0x67, 0x78, 0x13, 0x70, 0x67, 0x6c, 0x0d, 0x80, 0x00, 0xc0, - 0x00, 0x00, 0x20, 0x03, 0x47, 0x70, 0x46, 0xc0, 0x47, 0x70, 0x46, 0xc0, 0xb5, 0x00, 0x4b, 0x04, - 0xb0, 0x81, 0x1c, 0x01, 0x68, 0x18, 0xf7, 0xfb, 0xfc, 0x17, 0xb0, 0x01, 0xbc, 0x01, 0x47, 0x00, - 0x13, 0x70, 0x60, 0x40, 0xb5, 0x00, 0x4b, 0x0d, 0x1c, 0x01, 0xb0, 0x81, 0x68, 0x18, 0x22, 0x20, - 0xf7, 0xfb, 0xfc, 0x46, 0x28, 0x00, 0xd1, 0x0d, 0x48, 0x09, 0xf7, 0xfb, 0xfc, 0x15, 0xf0, 0x00, - 0xf9, 0x29, 0x20, 0xc8, 0xf7, 0xfc, 0xfb, 0xd8, 0xf0, 0x00, 0xf9, 0x18, 0x20, 0xc8, 0xf7, 0xfc, - 0xfb, 0xd3, 0xe7, 0xf4, 0xb0, 0x01, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, 0x13, 0x70, 0x60, 0x40, - 0x13, 0x70, 0x66, 0x76, 0xb5, 0x00, 0xb0, 0x81, 0xf7, 0xfb, 0xfb, 0xf6, 0xb0, 0x01, 0xbc, 0x01, - 0x47, 0x00, 0x46, 0xc0, 0xb5, 0x00, 0xb0, 0x81, 0xf7, 0xfb, 0xfb, 0xee, 0xb0, 0x01, 0xbc, 0x01, - 0x47, 0x00, 0x46, 0xc0, 0xb5, 0x00, 0xb0, 0x81, 0xf7, 0xfb, 0xfb, 0xe6, 0xb0, 0x01, 0xbc, 0x01, - 0x47, 0x00, 0x46, 0xc0, 0xb5, 0x10, 0x1c, 0x04, 0xf7, 0xfb, 0xfb, 0xfe, 0x1c, 0x20, 0xbc, 0x10, - 0xbc, 0x02, 0x47, 0x08, 0xb5, 0x10, 0x1c, 0x04, 0xf7, 0xfb, 0xfb, 0xf6, 0x1c, 0x20, 0xbc, 0x10, - 0xbc, 0x02, 0x47, 0x08, 0xb5, 0x10, 0x1c, 0x04, 0xf7, 0xfb, 0xfb, 0xee, 0x1c, 0x20, 0xbc, 0x10, - 0xbc, 0x02, 0x47, 0x08, 0xb5, 0x00, 0x21, 0xe0, 0xb0, 0x81, 0x48, 0x07, 0x02, 0x09, 0xf7, 0xfb, - 0xfb, 0xa3, 0x4b, 0x06, 0x60, 0x18, 0x28, 0x00, 0xdb, 0x01, 0x20, 0x00, 0xe0, 0x01, 0x20, 0x01, - 0x42, 0x40, 0xb0, 0x01, 0xbc, 0x02, 0x47, 0x08, 0x13, 0x70, 0xa0, 0x00, 0x13, 0x70, 0x60, 0x40, - 0xb5, 0xf0, 0x4b, 0x27, 0x1c, 0x06, 0x68, 0x18, 0xb0, 0x87, 0x91, 0x05, 0x28, 0x00, 0xd0, 0x01, - 0xf7, 0xfc, 0xf8, 0xe0, 0x4f, 0x23, 0x4a, 0x22, 0x68, 0x3d, 0x23, 0x00, 0x60, 0x13, 0x2d, 0x00, - 0xd1, 0x17, 0xf7, 0xff, 0xfd, 0xbd, 0x4c, 0x20, 0x1c, 0x20, 0xf7, 0xfc, 0xfd, 0xa3, 0x4b, 0x1f, - 0x1c, 0x02, 0x60, 0x18, 0x28, 0x00, 0xd0, 0x2d, 0x68, 0x23, 0x92, 0x00, 0x9a, 0x05, 0x48, 0x1c, - 0x92, 0x01, 0x21, 0x00, 0x22, 0x00, 0x95, 0x02, 0xf0, 0x00, 0xfb, 0xfc, 0x60, 0x38, 0x28, 0x00, - 0xd0, 0x20, 0x4d, 0x18, 0x68, 0x2c, 0x2c, 0x00, 0xd0, 0x0b, 0x48, 0x17, 0x1c, 0x31, 0x22, 0x06, - 0xf0, 0x00, 0xfe, 0xc8, 0x28, 0x00, 0xd0, 0x16, 0x1c, 0x20, 0xf0, 0x00, 0xfa, 0x0b, 0x23, 0x00, - 0x60, 0x2b, 0x4b, 0x0c, 0x1c, 0x31, 0x68, 0x18, 0xf0, 0x00, 0xfa, 0x14, 0x4b, 0x0d, 0x60, 0x18, - 0x28, 0x00, 0xd0, 0x04, 0x48, 0x0c, 0x1c, 0x31, 0x22, 0x06, 0xf0, 0x00, 0xfe, 0xdf, 0x4b, 0x09, - 0x68, 0x1c, 0xe0, 0x00, 0x24, 0x00, 0xb0, 0x07, 0x1c, 0x20, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, - 0x13, 0x70, 0x67, 0xd0, 0x13, 0x70, 0x67, 0xd4, 0x13, 0x72, 0xc3, 0xa0, 0x13, 0x72, 0xc3, 0xa4, - 0x13, 0x70, 0x4b, 0x61, 0x13, 0x70, 0x67, 0xd8, 0x13, 0x70, 0x60, 0x44, 0xb5, 0x30, 0x4b, 0x0f, - 0xb0, 0x81, 0x68, 0x18, 0x28, 0x00, 0xd0, 0x01, 0xf7, 0xfc, 0xf8, 0x84, 0x4c, 0x0c, 0x4b, 0x0b, - 0x68, 0x20, 0x25, 0x00, 0x60, 0x1d, 0x28, 0x00, 0xd0, 0x02, 0xf0, 0x00, 0xf9, 0xd3, 0x60, 0x25, - 0x4b, 0x08, 0x68, 0x18, 0x28, 0x00, 0xd0, 0x01, 0xf0, 0x00, 0xfa, 0x50, 0x4a, 0x05, 0x23, 0x00, - 0xb0, 0x01, 0x60, 0x13, 0xbc, 0x30, 0xbc, 0x01, 0x47, 0x00, 0x46, 0xc0, 0x13, 0x70, 0x67, 0xd0, - 0x13, 0x70, 0x67, 0xd8, 0x13, 0x70, 0x67, 0xd4, 0xb5, 0x10, 0x4c, 0x0b, 0x68, 0x20, 0x28, 0x00, - 0xd0, 0x03, 0xf0, 0x00, 0xf9, 0xb7, 0x23, 0x00, 0x60, 0x23, 0x4c, 0x08, 0x68, 0x23, 0x2b, 0x00, - 0xd1, 0x03, 0x48, 0x07, 0xf7, 0xfc, 0xf8, 0x62, 0x60, 0x20, 0x4a, 0x06, 0x23, 0x01, 0x42, 0x5b, - 0x60, 0x13, 0xbc, 0x10, 0xbc, 0x01, 0x47, 0x00, 0x13, 0x70, 0x67, 0xd8, 0x13, 0x70, 0x67, 0xd0, - 0x00, 0x00, 0x80, 0x20, 0x13, 0x70, 0x60, 0x10, 0xb5, 0xf0, 0x4f, 0x0f, 0x1c, 0x1e, 0x68, 0x3b, - 0x1c, 0x15, 0x1c, 0x0c, 0x1c, 0x30, 0x1c, 0x19, 0x43, 0x51, 0xb0, 0x81, 0xf7, 0xfb, 0xfb, 0x24, - 0x1c, 0x20, 0x1c, 0x29, 0x1c, 0x32, 0xf7, 0xff, 0xfc, 0x17, 0x28, 0x00, 0xd1, 0x01, 0x20, 0x01, - 0xe0, 0x06, 0x68, 0x3b, 0x1c, 0x30, 0x1c, 0x19, 0x43, 0x69, 0xf7, 0xfb, 0xfa, 0xf5, 0x20, 0x00, - 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x13, 0x72, 0xc3, 0xa0, 0xb5, 0x00, 0xb0, 0x81, - 0x20, 0x81, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0xf7, 0xfb, 0xfb, 0x2e, 0xb0, 0x01, 0xbc, 0x01, - 0x47, 0x00, 0x46, 0xc0, 0xb5, 0x00, 0xb0, 0x81, 0x20, 0x80, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, - 0xf7, 0xfb, 0xfb, 0x22, 0xb0, 0x01, 0xbc, 0x01, 0x47, 0x00, 0x46, 0xc0, 0xb5, 0x30, 0x1c, 0x0d, - 0x1c, 0x04, 0x1c, 0x13, 0xb0, 0x81, 0x1c, 0x2a, 0x1c, 0x21, 0x20, 0x10, 0xf7, 0xfb, 0xfb, 0x14, - 0xb0, 0x01, 0xbc, 0x30, 0xbc, 0x02, 0x47, 0x08, 0xb5, 0x00, 0x1c, 0x03, 0xb0, 0x81, 0x1c, 0x0a, - 0x20, 0x06, 0x1c, 0x19, 0x23, 0x00, 0xf7, 0xfb, 0xfb, 0x07, 0xb0, 0x01, 0xbc, 0x01, 0x47, 0x00, - 0xb5, 0x00, 0x1c, 0x03, 0xb0, 0x81, 0x1c, 0x0a, 0x20, 0x05, 0x1c, 0x19, 0x23, 0x00, 0xf7, 0xfb, - 0xfa, 0xfb, 0xb0, 0x01, 0xbc, 0x01, 0x47, 0x00, 0xb5, 0x30, 0xb0, 0x81, 0x1c, 0x04, 0x1c, 0x0d, - 0x1c, 0x13, 0x2a, 0x00, 0xdd, 0x04, 0x20, 0x09, 0x1c, 0x21, 0x1c, 0x2a, 0xf7, 0xfb, 0xfa, 0xec, - 0xb0, 0x01, 0xbc, 0x30, 0xbc, 0x01, 0x47, 0x00, 0xb5, 0x30, 0xb0, 0x81, 0x1c, 0x04, 0x1c, 0x0d, - 0x1c, 0x13, 0x2a, 0x00, 0xdd, 0x04, 0x20, 0x02, 0x1c, 0x21, 0x1c, 0x2a, 0xf7, 0xfb, 0xfa, 0xdc, - 0xb0, 0x01, 0xbc, 0x30, 0xbc, 0x01, 0x47, 0x00, 0xb5, 0x00, 0xb0, 0x81, 0x20, 0x12, 0x21, 0x00, - 0x22, 0x00, 0x23, 0x00, 0xf7, 0xfb, 0xfa, 0xd0, 0xb0, 0x01, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, - 0xb5, 0x00, 0xb0, 0x81, 0x20, 0x11, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0xf7, 0xfb, 0xfa, 0xc4, - 0xb0, 0x01, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, 0xb5, 0x00, 0xb0, 0x81, 0x20, 0x01, 0x21, 0x00, - 0x22, 0x00, 0x23, 0x00, 0xf7, 0xfb, 0xfa, 0xb8, 0xb0, 0x01, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, - 0xb5, 0x00, 0x1c, 0x03, 0xb0, 0x81, 0x1c, 0x0a, 0x20, 0x00, 0x1c, 0x19, 0x23, 0x00, 0xf7, 0xfb, - 0xfa, 0xab, 0xb0, 0x01, 0xbc, 0x01, 0x47, 0x00, 0xb5, 0xf0, 0xb0, 0x8d, 0x90, 0x04, 0x92, 0x03, - 0x93, 0x02, 0x68, 0x05, 0x1c, 0x0a, 0x6a, 0x6e, 0x1e, 0xb3, 0x40, 0xda, 0x04, 0x13, 0x0c, 0x1b, - 0x93, 0x06, 0x9b, 0x04, 0x7a, 0x28, 0x68, 0x5a, 0x9b, 0x06, 0x6a, 0x2c, 0x33, 0x80, 0x00, 0x5b, - 0x5a, 0xd3, 0x68, 0x6f, 0x93, 0x0a, 0x2b, 0x00, 0xd1, 0x00, 0xe0, 0xc5, 0x1e, 0x63, 0x40, 0xc3, - 0x1a, 0x36, 0x93, 0x08, 0x96, 0x07, 0x1e, 0x83, 0x1c, 0x0a, 0x9e, 0x08, 0x40, 0xda, 0x08, 0xbb, - 0x40, 0x16, 0x3b, 0x01, 0x1c, 0x0a, 0x40, 0x1a, 0x92, 0x09, 0xd1, 0x02, 0x9b, 0x03, 0x93, 0x0b, - 0xe0, 0x89, 0x9b, 0x07, 0x9a, 0x0a, 0x40, 0x9a, 0x92, 0x05, 0x6a, 0xeb, 0x18, 0xf3, 0x18, 0x99, - 0x4a, 0x58, 0x92, 0x01, 0x68, 0x13, 0x6c, 0xef, 0x42, 0x8b, 0xd1, 0x05, 0x4a, 0x56, 0x4b, 0x57, - 0x68, 0x12, 0x68, 0x19, 0x1c, 0x38, 0xe0, 0x14, 0x6b, 0x2c, 0x6b, 0xa8, 0x22, 0x01, 0x1c, 0x3b, - 0xf0, 0x00, 0xf8, 0xa6, 0x1c, 0x04, 0x28, 0x00, 0xd0, 0x00, 0xe0, 0x96, 0x6a, 0xeb, 0x9a, 0x05, - 0x18, 0xf3, 0x18, 0x9b, 0x9a, 0x01, 0x60, 0x13, 0x4b, 0x4c, 0x6c, 0xe9, 0x68, 0x18, 0x4b, 0x4a, - 0x68, 0x1a, 0xf0, 0x00, 0xfd, 0x7b, 0x9b, 0x09, 0x00, 0x9a, 0x68, 0x6b, 0x1a, 0x9c, 0x9b, 0x02, - 0x42, 0x9c, 0xd9, 0x00, 0x1c, 0x1c, 0x6c, 0xe9, 0x98, 0x03, 0x18, 0x89, 0x1c, 0x22, 0xf0, 0x00, - 0xfd, 0x6d, 0x9a, 0x02, 0x9b, 0x03, 0x1b, 0x12, 0x92, 0x02, 0x9a, 0x08, 0x19, 0x1c, 0x36, 0x01, - 0x94, 0x0b, 0x42, 0x96, 0xd9, 0x47, 0x9b, 0x02, 0x2b, 0x00, 0xd0, 0x44, 0x9b, 0x06, 0x33, 0x01, - 0x04, 0x1b, 0x0c, 0x1b, 0x93, 0x06, 0x9b, 0x04, 0x68, 0x5a, 0x9b, 0x06, 0x33, 0x80, 0x00, 0x5b, - 0x5a, 0xd3, 0x93, 0x0a, 0x2b, 0x00, 0xd0, 0x5f, 0x26, 0x00, 0xe0, 0x34, 0x7a, 0x2b, 0x9f, 0x02, - 0x6a, 0x2a, 0x40, 0xdf, 0x19, 0xbb, 0x42, 0x93, 0xd9, 0x00, 0x1b, 0x97, 0x9a, 0x07, 0x6a, 0xe9, - 0x9b, 0x0a, 0x18, 0x71, 0x40, 0x93, 0x18, 0xc9, 0x6b, 0x2c, 0x6b, 0xa8, 0x1c, 0x3a, 0x9b, 0x0b, - 0xf0, 0x00, 0xf8, 0x56, 0x1c, 0x04, 0x28, 0x00, 0xd1, 0x47, 0x7a, 0x2b, 0x1c, 0x39, 0x40, 0x99, - 0x9b, 0x02, 0x9a, 0x08, 0x1a, 0x5b, 0x19, 0xf6, 0x93, 0x02, 0x42, 0x96, 0xd9, 0x10, 0x2b, 0x00, - 0xd0, 0x0e, 0x9b, 0x06, 0x33, 0x01, 0x04, 0x1b, 0x0c, 0x1b, 0x93, 0x06, 0x9b, 0x04, 0x68, 0x5a, - 0x9b, 0x06, 0x33, 0x80, 0x00, 0x5b, 0x5a, 0xd3, 0x93, 0x0a, 0x2b, 0x00, 0xd0, 0x2c, 0x26, 0x00, - 0x9a, 0x0b, 0x18, 0x52, 0x92, 0x0b, 0x68, 0x6b, 0x9a, 0x02, 0x42, 0x9a, 0xd2, 0xc6, 0x2a, 0x00, - 0xd1, 0x01, 0x24, 0x00, 0xe0, 0x21, 0x9b, 0x07, 0x9f, 0x0a, 0x6a, 0xe9, 0x40, 0x9f, 0x18, 0x71, - 0x6b, 0x2c, 0x6b, 0xa8, 0x19, 0xc9, 0x6c, 0xeb, 0x22, 0x01, 0xf0, 0x00, 0xf8, 0x21, 0x1c, 0x04, - 0x28, 0x00, 0xd1, 0x12, 0x6a, 0xeb, 0x4a, 0x0b, 0x18, 0xf3, 0x19, 0xdb, 0x60, 0x13, 0x4b, 0x0b, - 0x6c, 0xe9, 0x68, 0x18, 0x4b, 0x08, 0x68, 0x1a, 0xf0, 0x00, 0xfc, 0xf8, 0x6c, 0xe9, 0x98, 0x0b, - 0x9a, 0x02, 0xf0, 0x00, 0xfc, 0xf3, 0xe0, 0x00, 0x24, 0x01, 0xb0, 0x0d, 0x1c, 0x20, 0xbc, 0xf0, - 0xbc, 0x02, 0x47, 0x08, 0x13, 0x70, 0x60, 0x4c, 0x13, 0x70, 0x67, 0xe0, 0x13, 0x70, 0x67, 0xdc, - 0x47, 0x20, 0x46, 0xc0, 0xb5, 0x10, 0x68, 0x02, 0x1c, 0x04, 0x6d, 0x13, 0x3b, 0x01, 0x65, 0x13, - 0x68, 0x40, 0xf7, 0xfb, 0xfe, 0x9f, 0x1c, 0x20, 0xf7, 0xfb, 0xfe, 0x9c, 0xbc, 0x10, 0xbc, 0x01, - 0x47, 0x00, 0x46, 0xc0, 0xb5, 0xf0, 0x1c, 0x03, 0x33, 0x48, 0x88, 0x1a, 0x7a, 0x03, 0xb0, 0x83, - 0x41, 0x1a, 0x92, 0x01, 0x23, 0x01, 0x4a, 0x30, 0x42, 0x5b, 0x27, 0x00, 0x1c, 0x05, 0x1c, 0x0e, - 0x60, 0x13, 0x97, 0x00, 0xe0, 0x4f, 0x68, 0x2b, 0x19, 0xdb, 0x7b, 0x1b, 0x2b, 0x00, 0xd0, 0x45, - 0x6a, 0xe9, 0x9a, 0x00, 0x31, 0x01, 0x18, 0x89, 0x6b, 0xa8, 0x22, 0x01, 0x6c, 0xeb, 0x6b, 0x2c, - 0xf0, 0x00, 0xf8, 0x52, 0x6c, 0xe9, 0x1c, 0x30, 0x22, 0x06, 0xf0, 0x00, 0xfc, 0x83, 0x28, 0x00, - 0xd1, 0x34, 0x20, 0x0c, 0xf7, 0xfb, 0xfe, 0x7a, 0x1c, 0x06, 0x28, 0x00, 0xd1, 0x09, 0x48, 0x1f, - 0xf7, 0xfb, 0xf9, 0x3a, 0x48, 0x1e, 0xf7, 0xfb, 0xf9, 0x37, 0x48, 0x1e, 0xf7, 0xfb, 0xf9, 0x34, - 0xe0, 0x2d, 0x1c, 0x2b, 0x33, 0x48, 0x60, 0x05, 0x60, 0x87, 0x88, 0x18, 0xf7, 0xfb, 0xfe, 0x66, - 0x1c, 0x03, 0x60, 0x70, 0x28, 0x00, 0xd1, 0x0c, 0x48, 0x14, 0xf7, 0xfb, 0xf9, 0x25, 0x48, 0x14, - 0xf7, 0xfb, 0xf9, 0x22, 0x48, 0x13, 0xf7, 0xfb, 0xf9, 0x1f, 0x1c, 0x30, 0xf7, 0xfb, 0xfe, 0x4a, - 0xe0, 0x14, 0x6a, 0xe9, 0x9a, 0x00, 0x31, 0x01, 0x18, 0x89, 0x6b, 0xa8, 0x6b, 0x2c, 0x9a, 0x01, - 0xf0, 0x00, 0xf8, 0x1a, 0x6d, 0x2b, 0x33, 0x01, 0x65, 0x2b, 0xe0, 0x08, 0x9b, 0x00, 0x9a, 0x01, - 0x37, 0x01, 0x18, 0x9b, 0x93, 0x00, 0x8f, 0xab, 0x42, 0x9f, 0xd3, 0xac, 0x26, 0x00, 0xb0, 0x03, - 0x1c, 0x30, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x13, 0x70, 0x60, 0x4c, 0x13, 0x70, 0x66, 0x95, - 0x13, 0x70, 0x66, 0xa1, 0x13, 0x70, 0x66, 0x41, 0x47, 0x20, 0x46, 0xc0, 0xb5, 0x10, 0x6d, 0x03, - 0x1c, 0x04, 0x2b, 0x00, 0xd0, 0x09, 0x48, 0x0d, 0xf7, 0xfb, 0xf8, 0xee, 0x48, 0x0c, 0xf7, 0xfb, - 0xf8, 0xeb, 0x48, 0x0c, 0xf7, 0xfb, 0xf8, 0xe8, 0xe0, 0x0d, 0x68, 0x00, 0xf7, 0xfb, 0xfe, 0x12, - 0x6c, 0xe0, 0xf7, 0xfb, 0xfe, 0x0f, 0x6c, 0x60, 0x28, 0x00, 0xd0, 0x01, 0xf7, 0xfb, 0xfe, 0x0a, - 0x1c, 0x20, 0xf7, 0xfb, 0xfe, 0x07, 0xbc, 0x10, 0xbc, 0x01, 0x47, 0x00, 0x13, 0x70, 0x66, 0x95, - 0x13, 0x70, 0x66, 0xb3, 0x13, 0x70, 0x66, 0x41, 0xb5, 0xf0, 0xb0, 0x85, 0x90, 0x03, 0x20, 0x54, - 0x91, 0x02, 0x92, 0x01, 0x1c, 0x1f, 0xf7, 0xfb, 0xfe, 0x01, 0x1c, 0x05, 0x2f, 0x00, 0xd1, 0x02, - 0x20, 0x80, 0x00, 0x80, 0xe0, 0x00, 0x1c, 0x38, 0xf7, 0xfb, 0xfd, 0xf8, 0x23, 0x80, 0x02, 0x1b, - 0x61, 0x2b, 0x1c, 0x06, 0x23, 0x00, 0x33, 0x01, 0x06, 0x1b, 0x0e, 0x1b, 0x2b, 0x10, 0xd1, 0xfa, - 0x23, 0x0f, 0x75, 0x2b, 0x4b, 0x81, 0x60, 0x2e, 0x61, 0xeb, 0x9a, 0x0b, 0x4b, 0x80, 0x62, 0xea, - 0x60, 0x1f, 0x9b, 0x0a, 0x20, 0x00, 0x0b, 0xd9, 0x17, 0xfa, 0x1c, 0x3b, 0xf0, 0x00, 0xfb, 0xae, - 0x61, 0xa9, 0x9c, 0x0c, 0x2c, 0x00, 0xd0, 0x32, 0x1c, 0x30, 0x21, 0x00, 0x1c, 0x3a, 0xf0, 0x00, - 0xfc, 0x49, 0x23, 0x57, 0x70, 0x33, 0x23, 0x42, 0x70, 0x73, 0x23, 0x46, 0x70, 0xb3, 0x23, 0x53, - 0x70, 0xf3, 0x1c, 0x3c, 0x23, 0x00, 0xe0, 0x03, 0x33, 0x01, 0x06, 0x1b, 0x0e, 0x1b, 0x08, 0x64, - 0x2c, 0x00, 0xd1, 0xf9, 0x3b, 0x01, 0x72, 0x33, 0x9a, 0x0a, 0x21, 0x80, 0x0e, 0x13, 0x71, 0x33, - 0x0c, 0x13, 0x71, 0x73, 0x0a, 0x13, 0x71, 0xf2, 0x71, 0xb3, 0x69, 0xac, 0x22, 0x06, 0x20, 0x06, - 0x02, 0x49, 0x1c, 0x0b, 0x40, 0x83, 0x42, 0x9c, 0xd3, 0x05, 0x1c, 0x53, 0x06, 0x1b, 0x0e, 0x1a, - 0x30, 0x01, 0x2a, 0x0b, 0xd1, 0xf5, 0x7d, 0x2b, 0x18, 0xd3, 0x72, 0x73, 0xe0, 0x06, 0x6a, 0xe9, - 0x98, 0x01, 0x22, 0x01, 0x1c, 0x33, 0x9c, 0x03, 0xf0, 0x00, 0xf8, 0xca, 0x78, 0x33, 0x78, 0x72, - 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, 0x78, 0xb3, 0x02, 0x1b, 0x43, 0x13, 0x78, 0xf2, 0x43, 0x1a, - 0x4b, 0x58, 0x42, 0x9a, 0xd0, 0x04, 0x48, 0x58, 0xf7, 0xfb, 0xf8, 0x56, 0x48, 0x57, 0xe0, 0x2f, - 0x4b, 0x57, 0x68, 0x1b, 0x42, 0x59, 0x41, 0x59, 0x29, 0x00, 0xd0, 0x36, 0x2f, 0x00, 0xd0, 0x11, - 0x7a, 0x30, 0x1c, 0x3a, 0x33, 0x01, 0x06, 0x1b, 0x08, 0x52, 0x0e, 0x1b, 0x2a, 0x00, 0xd1, 0xf9, - 0x3b, 0x01, 0x06, 0x1b, 0x0e, 0x1b, 0x42, 0x98, 0xd0, 0x04, 0x48, 0x4b, 0xf7, 0xfb, 0xf8, 0x3c, - 0x48, 0x4c, 0xe0, 0x15, 0x29, 0x00, 0xd0, 0x20, 0x9a, 0x0a, 0x2a, 0x00, 0xd0, 0x1d, 0x79, 0x32, - 0x79, 0x73, 0x06, 0x12, 0x04, 0x1b, 0x43, 0x13, 0x79, 0xb2, 0x9c, 0x0a, 0x02, 0x12, 0x43, 0x1a, - 0x79, 0xf3, 0x43, 0x13, 0x42, 0xa3, 0xd0, 0x10, 0x48, 0x3f, 0xf7, 0xfb, 0xf8, 0x25, 0x48, 0x42, - 0xf7, 0xfb, 0xf8, 0x22, 0x48, 0x41, 0xf7, 0xfb, 0xf8, 0x1f, 0x1c, 0x28, 0xf7, 0xfb, 0xfd, 0x4a, - 0x1c, 0x30, 0xf7, 0xfb, 0xfd, 0x47, 0x25, 0x00, 0xe0, 0x63, 0x7a, 0x33, 0x24, 0x01, 0x1c, 0x27, - 0x40, 0x9f, 0x60, 0x6f, 0x7a, 0x33, 0x69, 0x29, 0x72, 0x2b, 0x79, 0x33, 0x79, 0x72, 0x06, 0x1b, - 0x04, 0x12, 0x43, 0x1a, 0x79, 0xb3, 0x79, 0xf0, 0x02, 0x1b, 0x43, 0x13, 0x43, 0x18, 0x60, 0xe8, - 0xf0, 0x00, 0xfa, 0x72, 0x1c, 0x39, 0x43, 0x41, 0x61, 0xa9, 0x7a, 0x72, 0x7d, 0x2b, 0x62, 0x6a, - 0x40, 0x94, 0x1a, 0xd2, 0x69, 0xeb, 0x40, 0xd1, 0x40, 0xd3, 0x04, 0x1b, 0x0c, 0x1b, 0x04, 0x3a, - 0x85, 0x6b, 0x0c, 0x12, 0x33, 0x80, 0x85, 0x29, 0x00, 0x5b, 0x1e, 0x51, 0x18, 0xc9, 0x42, 0x52, - 0x1c, 0x2b, 0x40, 0x11, 0x33, 0x48, 0x80, 0x19, 0x62, 0x2c, 0x9a, 0x03, 0x63, 0x2a, 0x9b, 0x02, - 0x63, 0x6b, 0x9a, 0x01, 0x8d, 0x2b, 0x63, 0xaa, 0x08, 0xda, 0x7a, 0x2b, 0x1a, 0xa4, 0x40, 0xdc, - 0x64, 0x2c, 0x9b, 0x0c, 0x2b, 0x00, 0xd1, 0x01, 0x64, 0x6b, 0xe0, 0x0b, 0x1e, 0x78, 0x18, 0x80, - 0x42, 0x7b, 0x40, 0x18, 0xf7, 0xfb, 0xfd, 0x0a, 0x8d, 0x2a, 0x64, 0x68, 0x08, 0xd2, 0x21, 0xff, - 0xf0, 0x00, 0xfb, 0x78, 0x1c, 0x2b, 0x33, 0x48, 0x88, 0x19, 0x6c, 0x28, 0x7a, 0x2b, 0x38, 0x01, - 0x41, 0x19, 0xf0, 0x00, 0xfa, 0x31, 0x68, 0x6b, 0x04, 0x00, 0x0c, 0x00, 0x3b, 0x0c, 0x87, 0xa8, - 0x42, 0x98, 0xd9, 0x00, 0x87, 0xab, 0x68, 0x68, 0xf7, 0xfb, 0xfc, 0xf0, 0x23, 0x00, 0x64, 0xe8, - 0x65, 0x2b, 0xb0, 0x05, 0x1c, 0x28, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x00, 0x04, 0x60, 0x90, - 0x13, 0x70, 0x67, 0xe0, 0x57, 0x42, 0x46, 0x53, 0x13, 0x70, 0x66, 0x95, 0x13, 0x70, 0x66, 0xdf, - 0x13, 0x70, 0x67, 0xe4, 0x13, 0x70, 0x66, 0xe9, 0x13, 0x70, 0x67, 0x06, 0x13, 0x70, 0x66, 0x41, - 0x47, 0x20, 0x46, 0xc0, 0xb5, 0xf0, 0xb0, 0xa5, 0x90, 0x0c, 0x1c, 0x18, 0x92, 0x0a, 0x93, 0x09, - 0x91, 0x0b, 0xf7, 0xfb, 0xfc, 0xcb, 0x4b, 0x8c, 0x22, 0x01, 0x4c, 0x8c, 0x42, 0x52, 0x60, 0x1a, - 0x68, 0x23, 0x1c, 0x05, 0x2b, 0x00, 0xd1, 0x03, 0x98, 0x09, 0xf7, 0xfb, 0xfc, 0xbf, 0x60, 0x20, - 0x4b, 0x87, 0x99, 0x09, 0x98, 0x0a, 0x60, 0x19, 0x22, 0x01, 0x21, 0x00, 0x1c, 0x2b, 0x9c, 0x0c, - 0xf0, 0x00, 0xf9, 0x18, 0x28, 0x00, 0xd0, 0x00, 0xe0, 0xf4, 0x23, 0xff, 0x00, 0x5b, 0x5c, 0xeb, - 0x2b, 0x55, 0xd1, 0x1b, 0x4b, 0x7f, 0x5c, 0xeb, 0x2b, 0xaa, 0xd1, 0x17, 0x1c, 0xe8, 0x49, 0x7e, - 0x22, 0x04, 0xf0, 0x00, 0xfb, 0x9d, 0x28, 0x00, 0xd0, 0x10, 0x4c, 0x7c, 0x1c, 0x28, 0x30, 0x36, - 0x1c, 0x21, 0x22, 0x03, 0xf0, 0x00, 0xfb, 0x94, 0x28, 0x00, 0xd0, 0x07, 0x1c, 0x28, 0x30, 0x52, - 0x1c, 0x21, 0x22, 0x03, 0xf0, 0x00, 0xfb, 0x8c, 0x28, 0x00, 0xd1, 0x05, 0xa8, 0x14, 0x21, 0x00, - 0x22, 0x40, 0xf0, 0x00, 0xfa, 0xff, 0xe0, 0x06, 0x22, 0xdf, 0x00, 0x52, 0x18, 0xa9, 0xa8, 0x14, - 0x22, 0x40, 0xf0, 0x00, 0xfa, 0xb3, 0x23, 0x01, 0x21, 0xe4, 0x42, 0x5b, 0x24, 0x00, 0x00, 0x49, - 0xae, 0x14, 0x93, 0x11, 0x94, 0x12, 0x91, 0x07, 0x78, 0x2b, 0x78, 0x6a, 0x06, 0x1b, 0x04, 0x12, - 0x43, 0x1a, 0x78, 0xab, 0x7a, 0x37, 0x02, 0x1b, 0x43, 0x13, 0x78, 0xea, 0x7a, 0x70, 0x43, 0x1a, - 0x4b, 0x63, 0x7a, 0xb1, 0x7a, 0xf4, 0x42, 0x9a, 0xd0, 0x03, 0x79, 0x33, 0x2b, 0x00, 0xd1, 0x00, - 0xe0, 0xa3, 0x04, 0x0a, 0x02, 0x03, 0x43, 0x13, 0x43, 0x3b, 0x1c, 0x1f, 0x79, 0x33, 0x06, 0x22, - 0x43, 0x17, 0x2b, 0x0f, 0xd1, 0x69, 0x22, 0xe3, 0x21, 0x00, 0x00, 0x52, 0x91, 0x13, 0x92, 0x08, - 0x19, 0xc9, 0x91, 0x05, 0x98, 0x0a, 0x22, 0x01, 0x1c, 0x2b, 0x9c, 0x0c, 0xf0, 0x00, 0xf8, 0xb2, - 0x28, 0x00, 0xd0, 0x00, 0xe0, 0x8e, 0x49, 0x53, 0x9c, 0x07, 0x5c, 0x6a, 0x5d, 0x2b, 0x99, 0x08, - 0x04, 0x1b, 0x02, 0x12, 0x43, 0x1a, 0x4c, 0x50, 0x5c, 0x6b, 0x99, 0x05, 0x43, 0x1a, 0x5d, 0x2b, - 0x98, 0x0a, 0x06, 0x1b, 0x43, 0x1a, 0x18, 0x8a, 0x23, 0xeb, 0x92, 0x05, 0x00, 0x5b, 0x5c, 0xeb, - 0x1c, 0x11, 0x93, 0x0d, 0x4b, 0x49, 0x22, 0x01, 0x5c, 0xeb, 0x9c, 0x0c, 0x93, 0x0e, 0x23, 0xec, - 0x00, 0x5b, 0x5c, 0xeb, 0x93, 0x0f, 0x4b, 0x46, 0x5c, 0xeb, 0x93, 0x10, 0x1c, 0x2b, 0xf0, 0x00, - 0xf8, 0x89, 0x28, 0x00, 0xd1, 0x66, 0x78, 0x2b, 0x78, 0x6a, 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, - 0x78, 0xab, 0x02, 0x1b, 0x43, 0x13, 0x78, 0xea, 0x43, 0x1a, 0x4b, 0x39, 0x42, 0x9a, 0xd1, 0x12, - 0x99, 0x12, 0x9a, 0x2b, 0x42, 0x91, 0xd1, 0x05, 0x9b, 0x05, 0x9c, 0x2c, 0x90, 0x00, 0x93, 0x01, - 0x94, 0x02, 0xe0, 0x38, 0x99, 0x05, 0x9a, 0x11, 0x42, 0x91, 0xd0, 0x04, 0x9b, 0x12, 0x9c, 0x05, - 0x33, 0x01, 0x93, 0x12, 0x94, 0x11, 0x99, 0x0e, 0x9c, 0x0f, 0x02, 0x0b, 0x04, 0x22, 0x99, 0x0d, - 0x43, 0x13, 0x9c, 0x10, 0x43, 0x0b, 0x06, 0x22, 0x1c, 0x19, 0x43, 0x11, 0xd0, 0x35, 0x9a, 0x13, - 0x32, 0x01, 0x92, 0x13, 0x2a, 0x08, 0xd1, 0x9b, 0xe0, 0x2f, 0x98, 0x0a, 0x1c, 0x39, 0x22, 0x01, - 0x1c, 0x2b, 0x9c, 0x0c, 0xf0, 0x00, 0xf8, 0x4e, 0x28, 0x00, 0xd1, 0x2b, 0x78, 0x2b, 0x78, 0x6a, - 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, 0x78, 0xab, 0x02, 0x1b, 0x43, 0x13, 0x78, 0xea, 0x43, 0x1a, - 0x4b, 0x1b, 0x42, 0x9a, 0xd1, 0x19, 0x99, 0x12, 0x9a, 0x2b, 0x42, 0x91, 0xd1, 0x0e, 0x9b, 0x2c, - 0x90, 0x00, 0x97, 0x01, 0x93, 0x02, 0x98, 0x0c, 0x99, 0x0b, 0x9a, 0x0a, 0x9b, 0x09, 0xf7, 0xff, - 0xfd, 0xc3, 0x1c, 0x04, 0x1c, 0x28, 0xf7, 0xfb, 0xfb, 0xbd, 0xe0, 0x0f, 0x9c, 0x11, 0x42, 0xa7, - 0xd0, 0x03, 0x99, 0x12, 0x97, 0x11, 0x31, 0x01, 0x91, 0x12, 0xab, 0x20, 0x42, 0x9e, 0xd0, 0x01, - 0x36, 0x10, 0xe7, 0x41, 0x1c, 0x28, 0xf7, 0xfb, 0xfb, 0xad, 0x24, 0x00, 0xb0, 0x25, 0x1c, 0x20, - 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, 0x13, 0x70, 0x60, 0x4c, 0x13, 0x70, 0x67, 0xdc, - 0x13, 0x70, 0x67, 0xe0, 0x00, 0x00, 0x01, 0xff, 0x13, 0x70, 0x67, 0x22, 0x13, 0x70, 0x67, 0x27, - 0x57, 0x42, 0x46, 0x53, 0x00, 0x00, 0x01, 0xc7, 0x00, 0x00, 0x01, 0xc9, 0x00, 0x00, 0x01, 0xd7, - 0x00, 0x00, 0x01, 0xd9, 0x47, 0x20, 0x46, 0xc0, 0xef, 0x00, 0x00, 0xcc, 0xe1, 0x2f, 0xff, 0x1e, - 0xe1, 0xa0, 0x00, 0x00, 0xe1, 0xa0, 0x00, 0x00, 0xe6, 0x00, 0x00, 0x10, 0xe1, 0x2f, 0xff, 0x1e, - 0xe6, 0x00, 0x00, 0x30, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x00, 0x50, 0xe1, 0x2f, 0xff, 0x1e, - 0xe6, 0x00, 0x00, 0x70, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x00, 0x90, 0xe1, 0x2f, 0xff, 0x1e, - 0xe6, 0x00, 0x00, 0xb0, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x00, 0xd0, 0xe1, 0x2f, 0xff, 0x1e, - 0xe6, 0x00, 0x00, 0xf0, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x01, 0x10, 0xe1, 0x2f, 0xff, 0x1e, - 0xe6, 0x00, 0x01, 0x30, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x01, 0x50, 0xe1, 0x2f, 0xff, 0x1e, - 0xe6, 0x00, 0x01, 0x70, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x01, 0x90, 0xe1, 0x2f, 0xff, 0x1e, - 0xe6, 0x00, 0x01, 0xb0, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x01, 0xd0, 0xe1, 0x2f, 0xff, 0x1e, - 0xe6, 0x00, 0x01, 0xf0, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x02, 0x10, 0xe1, 0x2f, 0xff, 0x1e, - 0xe6, 0x00, 0x02, 0x30, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x02, 0x50, 0xe1, 0x2f, 0xff, 0x1e, - 0xe6, 0x00, 0x02, 0x70, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x02, 0x90, 0xe1, 0x2f, 0xff, 0x1e, - 0xe6, 0x00, 0x02, 0xb0, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x02, 0xd0, 0xe1, 0x2f, 0xff, 0x1e, - 0xe6, 0x00, 0x02, 0xf0, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x03, 0x10, 0xe1, 0x2f, 0xff, 0x1e, - 0xe6, 0x00, 0x03, 0x30, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x03, 0x50, 0xe1, 0x2f, 0xff, 0x1e, - 0xe6, 0x00, 0x03, 0x70, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x03, 0x90, 0xe1, 0x2f, 0xff, 0x1e, - 0xe6, 0x00, 0x03, 0xb0, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x03, 0xd0, 0xe1, 0x2f, 0xff, 0x1e, - 0xe6, 0x00, 0x03, 0xf0, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x04, 0x10, 0xe1, 0x2f, 0xff, 0x1e, - 0xe6, 0x00, 0x04, 0x30, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x04, 0x50, 0xe1, 0x2f, 0xff, 0x1e, - 0xe6, 0x00, 0x04, 0x70, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x04, 0x90, 0xe1, 0x2f, 0xff, 0x1e, - 0xe6, 0x00, 0x04, 0xb0, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x04, 0xd0, 0xe1, 0x2f, 0xff, 0x1e, - 0xe6, 0x00, 0x04, 0xf0, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x05, 0x10, 0xe1, 0x2f, 0xff, 0x1e, - 0xe6, 0x00, 0x05, 0x30, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x05, 0x50, 0xe1, 0x2f, 0xff, 0x1e, - 0xe6, 0x00, 0x06, 0x90, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x07, 0xf0, 0xe1, 0x2f, 0xff, 0x1e, - 0xe6, 0x00, 0x08, 0x10, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x0a, 0x10, 0xe1, 0x2f, 0xff, 0x1e, - 0xe2, 0x90, 0x10, 0x00, 0xe3, 0xb0, 0x00, 0x04, 0xef, 0x00, 0x00, 0xab, 0xe1, 0x2f, 0xff, 0x1e, - 0xe1, 0xa0, 0x00, 0x00, 0xe1, 0xa0, 0x00, 0x00, 0x29, 0x00, 0xd0, 0x34, 0x23, 0x01, 0x22, 0x00, - 0xb4, 0x10, 0x42, 0x88, 0xd3, 0x2c, 0x24, 0x01, 0x07, 0x24, 0x42, 0xa1, 0xd2, 0x04, 0x42, 0x81, - 0xd2, 0x02, 0x01, 0x09, 0x01, 0x1b, 0xe7, 0xf8, 0x00, 0xe4, 0x42, 0xa1, 0xd2, 0x04, 0x42, 0x81, - 0xd2, 0x02, 0x00, 0x49, 0x00, 0x5b, 0xe7, 0xf8, 0x42, 0x88, 0xd3, 0x01, 0x1a, 0x40, 0x43, 0x1a, - 0x08, 0x4c, 0x42, 0xa0, 0xd3, 0x02, 0x1b, 0x00, 0x08, 0x5c, 0x43, 0x22, 0x08, 0x8c, 0x42, 0xa0, - 0xd3, 0x02, 0x1b, 0x00, 0x08, 0x9c, 0x43, 0x22, 0x08, 0xcc, 0x42, 0xa0, 0xd3, 0x02, 0x1b, 0x00, - 0x08, 0xdc, 0x43, 0x22, 0x28, 0x00, 0xd0, 0x03, 0x09, 0x1b, 0xd0, 0x01, 0x09, 0x09, 0xe7, 0xe3, - 0x1c, 0x10, 0xbc, 0x10, 0x47, 0x70, 0xb5, 0x02, 0xf0, 0x00, 0xf8, 0x5e, 0x20, 0x00, 0xbc, 0x06, - 0x47, 0x10, 0x46, 0xc0, 0xb5, 0x03, 0xf7, 0xff, 0xff, 0xbf, 0xbc, 0x0e, 0x43, 0x42, 0x1a, 0x89, - 0x47, 0x18, 0x46, 0xc0, 0x29, 0x00, 0xd0, 0x41, 0xb4, 0x10, 0x1c, 0x04, 0x40, 0x4c, 0x46, 0xa4, - 0x23, 0x01, 0x22, 0x00, 0x29, 0x00, 0xd5, 0x00, 0x42, 0x49, 0x28, 0x00, 0xd5, 0x00, 0x42, 0x40, - 0x42, 0x88, 0xd3, 0x2c, 0x24, 0x01, 0x07, 0x24, 0x42, 0xa1, 0xd2, 0x04, 0x42, 0x81, 0xd2, 0x02, - 0x01, 0x09, 0x01, 0x1b, 0xe7, 0xf8, 0x00, 0xe4, 0x42, 0xa1, 0xd2, 0x04, 0x42, 0x81, 0xd2, 0x02, - 0x00, 0x49, 0x00, 0x5b, 0xe7, 0xf8, 0x42, 0x88, 0xd3, 0x01, 0x1a, 0x40, 0x43, 0x1a, 0x08, 0x4c, - 0x42, 0xa0, 0xd3, 0x02, 0x1b, 0x00, 0x08, 0x5c, 0x43, 0x22, 0x08, 0x8c, 0x42, 0xa0, 0xd3, 0x02, - 0x1b, 0x00, 0x08, 0x9c, 0x43, 0x22, 0x08, 0xcc, 0x42, 0xa0, 0xd3, 0x02, 0x1b, 0x00, 0x08, 0xdc, - 0x43, 0x22, 0x28, 0x00, 0xd0, 0x03, 0x09, 0x1b, 0xd0, 0x01, 0x09, 0x09, 0xe7, 0xe3, 0x1c, 0x10, - 0x46, 0x64, 0x2c, 0x00, 0xd5, 0x00, 0x42, 0x40, 0xbc, 0x10, 0x47, 0x70, 0xb5, 0x02, 0xf0, 0x00, - 0xf8, 0x0b, 0x20, 0x00, 0xbc, 0x06, 0x47, 0x10, 0xb5, 0x03, 0xf7, 0xff, 0xff, 0xb3, 0xbc, 0x0e, - 0x43, 0x42, 0x1a, 0x89, 0x47, 0x18, 0x46, 0xc0, 0x47, 0x70, 0x46, 0xc0, 0xb5, 0xf0, 0x46, 0x57, - 0x46, 0x46, 0xb4, 0xc0, 0x1c, 0x1e, 0x4b, 0x16, 0x46, 0x90, 0x1c, 0x0a, 0x40, 0x1a, 0x40, 0x33, - 0x46, 0x82, 0x1c, 0x10, 0x43, 0x58, 0x0c, 0x0c, 0x1c, 0x0f, 0x0c, 0x31, 0x46, 0x84, 0x43, 0x4a, - 0x1c, 0x20, 0x43, 0x58, 0x1c, 0x25, 0x43, 0x4d, 0x46, 0x61, 0x18, 0x82, 0x0c, 0x0b, 0x18, 0xd2, - 0x42, 0x90, 0xd9, 0x02, 0x23, 0x80, 0x02, 0x5b, 0x18, 0xed, 0x4b, 0x09, 0x46, 0x61, 0x04, 0x14, - 0x0c, 0x10, 0x40, 0x0b, 0x18, 0x2a, 0x18, 0xe1, 0x46, 0x40, 0x43, 0x78, 0x46, 0x53, 0x43, 0x73, - 0x18, 0xc0, 0x18, 0x80, 0xbc, 0x0c, 0x46, 0x90, 0x46, 0x9a, 0xbc, 0xf0, 0xbc, 0x04, 0x47, 0x10, - 0x00, 0x00, 0xff, 0xff, 0xb5, 0x70, 0x1c, 0x0e, 0x1c, 0x15, 0x1c, 0x04, 0x2a, 0x03, 0xd9, 0x20, - 0x1c, 0x33, 0x43, 0x03, 0x07, 0x9a, 0xd0, 0x12, 0x78, 0x23, 0x78, 0x08, 0x42, 0x83, 0xd1, 0x1b, - 0x1e, 0x6a, 0xe0, 0x06, 0x34, 0x01, 0x31, 0x01, 0x78, 0x23, 0x78, 0x08, 0x3a, 0x01, 0x42, 0x83, - 0xd1, 0x12, 0x2a, 0x00, 0xd1, 0xf6, 0x20, 0x00, 0xbc, 0x70, 0xbc, 0x02, 0x47, 0x08, 0x68, 0x02, - 0x68, 0x0b, 0x42, 0x9a, 0xd1, 0x04, 0x3d, 0x04, 0x30, 0x04, 0x31, 0x04, 0x2d, 0x03, 0xd8, 0xf6, - 0x1c, 0x04, 0x2d, 0x00, 0xd1, 0xe0, 0xe7, 0xee, 0x1a, 0x18, 0xe7, 0xed, 0xb5, 0xf0, 0x1c, 0x07, - 0x1c, 0x0e, 0x1c, 0x04, 0x1c, 0x15, 0x1c, 0x08, 0x1c, 0x11, 0x2a, 0x0f, 0xd9, 0x03, 0x1c, 0x33, - 0x43, 0x3b, 0x07, 0x9a, 0xd0, 0x0b, 0x29, 0x00, 0xd0, 0x05, 0x22, 0x00, 0x5c, 0x83, 0x54, 0xa3, - 0x32, 0x01, 0x42, 0x8a, 0xd1, 0xfa, 0x1c, 0x38, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x1c, 0x3a, - 0x1c, 0x31, 0x1c, 0x28, 0x68, 0x0b, 0x60, 0x13, 0x68, 0x4b, 0x60, 0x53, 0x68, 0x8b, 0x60, 0x93, - 0x68, 0xcb, 0x38, 0x10, 0x60, 0xd3, 0x31, 0x10, 0x32, 0x10, 0x28, 0x0f, 0xd8, 0xf2, 0x1c, 0x2b, - 0x3b, 0x10, 0x09, 0x1a, 0x01, 0x11, 0x32, 0x01, 0x01, 0x12, 0x1a, 0x59, 0x18, 0xb0, 0x18, 0xbc, - 0x29, 0x03, 0xd9, 0xd8, 0x22, 0x00, 0x58, 0x83, 0x50, 0xa3, 0x32, 0x04, 0x1a, 0x8b, 0x2b, 0x03, - 0xd8, 0xf9, 0x1f, 0x0b, 0x08, 0x9a, 0x00, 0x91, 0x32, 0x01, 0x00, 0x92, 0x1a, 0x59, 0x18, 0x80, - 0x18, 0xa4, 0xe7, 0xc8, 0xb5, 0xf0, 0x1c, 0x07, 0x46, 0x8c, 0x1c, 0x10, 0x1c, 0x39, 0x07, 0xba, - 0xd0, 0x0e, 0x28, 0x00, 0xd0, 0x49, 0x46, 0x62, 0x06, 0x13, 0x38, 0x01, 0x0e, 0x1b, 0x22, 0x03, - 0xe0, 0x02, 0x28, 0x00, 0xd0, 0x41, 0x38, 0x01, 0x70, 0x0b, 0x31, 0x01, 0x42, 0x11, 0xd1, 0xf8, - 0x1c, 0x05, 0x1c, 0x0a, 0x28, 0x03, 0xd9, 0x2e, 0x23, 0xff, 0x46, 0x62, 0x40, 0x1a, 0x02, 0x13, - 0x43, 0x13, 0x04, 0x1a, 0x1c, 0x14, 0x1c, 0x0e, 0x43, 0x1c, 0x28, 0x0f, 0xd9, 0x12, 0x1c, 0x02, - 0x1c, 0x0b, 0x3a, 0x10, 0x60, 0x1c, 0x60, 0x5c, 0x60, 0x9c, 0x60, 0xdc, 0x33, 0x10, 0x2a, 0x0f, - 0xd8, 0xf7, 0x1c, 0x03, 0x3b, 0x10, 0x1c, 0x1d, 0x09, 0x1b, 0x33, 0x01, 0x22, 0x0f, 0x01, 0x1b, - 0x40, 0x15, 0x18, 0xce, 0x2d, 0x03, 0xd9, 0x0d, 0x22, 0x00, 0x50, 0xb4, 0x32, 0x04, 0x1a, 0xab, - 0x2b, 0x03, 0xd8, 0xfa, 0x1f, 0x2b, 0x1c, 0x1d, 0x08, 0x9b, 0x33, 0x01, 0x22, 0x03, 0x00, 0x9b, - 0x40, 0x15, 0x18, 0xf6, 0x1c, 0x32, 0x2d, 0x00, 0xd0, 0x07, 0x46, 0x61, 0x06, 0x0b, 0x0e, 0x19, - 0x23, 0x00, 0x54, 0xd1, 0x33, 0x01, 0x42, 0x9d, 0xd1, 0xfb, 0x1c, 0x38, 0xbc, 0xf0, 0xbc, 0x02, - 0x47, 0x08, 0x46, 0xc0, 0xb5, 0x30, 0x1c, 0x0b, 0x43, 0x03, 0x07, 0x9a, 0xd1, 0x1c, 0x68, 0x02, - 0x68, 0x0b, 0x42, 0x9a, 0xd1, 0x18, 0x4c, 0x10, 0x19, 0x13, 0x43, 0x93, 0x4a, 0x0f, 0x42, 0x13, - 0xd1, 0x0b, 0x1c, 0x14, 0x30, 0x04, 0x31, 0x04, 0x68, 0x02, 0x68, 0x0b, 0x42, 0x9a, 0xd1, 0x0b, - 0x4d, 0x09, 0x19, 0x53, 0x43, 0x93, 0x42, 0x23, 0xd0, 0xf4, 0x20, 0x00, 0xe0, 0x09, 0x78, 0x0a, - 0x42, 0x9a, 0xd1, 0x05, 0x30, 0x01, 0x31, 0x01, 0x78, 0x03, 0x2b, 0x00, 0xd1, 0xf7, 0x78, 0x0a, - 0x1a, 0x98, 0xbc, 0x30, 0xbc, 0x02, 0x47, 0x08, 0xfe, 0xfe, 0xfe, 0xff, 0x80, 0x80, 0x80, 0x80, - 0xb5, 0x70, 0x1c, 0x04, 0x2a, 0x00, 0xd0, 0x41, 0x1c, 0x0b, 0x43, 0x03, 0x07, 0x98, 0xd1, 0x2c, - 0x1c, 0x20, 0x1c, 0x0d, 0x2a, 0x03, 0xd9, 0x26, 0x68, 0x24, 0x68, 0x0b, 0x42, 0x9c, 0xd1, 0x22, - 0x3a, 0x04, 0x2a, 0x00, 0xd0, 0x32, 0x49, 0x1b, 0x18, 0x63, 0x49, 0x1b, 0x43, 0xa3, 0x42, 0x0b, - 0xd1, 0x2c, 0x1c, 0x0c, 0xe0, 0x0b, 0x68, 0x01, 0x68, 0x2b, 0x42, 0x99, 0xd1, 0x13, 0x3a, 0x04, - 0x2a, 0x00, 0xd0, 0x23, 0x4e, 0x13, 0x19, 0x8b, 0x43, 0x8b, 0x42, 0x23, 0xd1, 0x1e, 0x30, 0x04, - 0x35, 0x04, 0x2a, 0x03, 0xd8, 0xef, 0x1c, 0x04, 0x1c, 0x29, 0x2a, 0x00, 0xd1, 0x05, 0x78, 0x03, - 0x78, 0x28, 0x1a, 0x18, 0xe0, 0x13, 0x1c, 0x04, 0x1c, 0x29, 0x78, 0x23, 0x78, 0x08, 0x3a, 0x01, - 0x42, 0x98, 0xd0, 0x09, 0xe7, 0xf5, 0x28, 0x00, 0xd0, 0x08, 0x34, 0x01, 0x31, 0x01, 0x78, 0x23, - 0x78, 0x08, 0x42, 0x98, 0xd1, 0xed, 0x3a, 0x01, 0x2a, 0x00, 0xd1, 0xf4, 0x20, 0x00, 0xbc, 0x70, - 0xbc, 0x02, 0x47, 0x08, 0xfe, 0xfe, 0xfe, 0xff, 0x80, 0x80, 0x80, 0x80, 0x49, 0x4f, 0x53, 0x20, - 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x1f, 0xf0, 0x04, 0x00, 0x00, 0x00, 0x00, - 0x13, 0x72, 0xc2, 0xa4, 0x00, 0x0f, 0x42, 0x40, 0x10, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x2f, 0x64, 0x65, 0x76, - 0x2f, 0x75, 0x73, 0x62, 0x31, 0x32, 0x33, 0x00, 0x2f, 0x64, 0x65, 0x76, 0x2f, 0x75, 0x73, 0x62, - 0x31, 0x32, 0x33, 0x2f, 0x4f, 0x46, 0x46, 0x00, 0x57, 0x42, 0x46, 0x53, 0x20, 0x6e, 0x6f, 0x74, - 0x20, 0x65, 0x6e, 0x6f, 0x75, 0x67, 0x68, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x21, 0x0a, - 0x00, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x67, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, - 0x20, 0x28, 0x25, 0x73, 0x29, 0x0a, 0x00, 0x20, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x00, 0x20, 0x50, - 0x65, 0x72, 0x69, 0x6f, 0x64, 0x69, 0x63, 0x00, 0x20, 0x52, 0x65, 0x63, 0x6c, 0x00, 0x20, 0x48, - 0x61, 0x6c, 0x74, 0x00, 0x20, 0x49, 0x41, 0x41, 0x00, 0x20, 0x46, 0x41, 0x54, 0x41, 0x4c, 0x00, - 0x20, 0x46, 0x4c, 0x52, 0x00, 0x20, 0x50, 0x43, 0x44, 0x00, 0x20, 0x45, 0x52, 0x52, 0x00, 0x20, - 0x49, 0x4e, 0x54, 0x00, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3a, 0x20, - 0x25, 0x78, 0x20, 0x25, 0x73, 0x25, 0x73, 0x25, 0x73, 0x25, 0x73, 0x25, 0x73, 0x25, 0x73, 0x25, - 0x73, 0x25, 0x73, 0x25, 0x73, 0x25, 0x73, 0x0a, 0x00, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x3a, 0x20, 0x25, 0x78, 0x0a, 0x00, 0x75, 0x73, - 0x62, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x72, 0x65, 0x73, 0x65, 0x74, 0x3a, 0x20, - 0x42, 0x55, 0x4c, 0x4b, 0x20, 0x52, 0x45, 0x53, 0x45, 0x54, 0x20, 0x25, 0x69, 0x0a, 0x00, 0x75, - 0x73, 0x62, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x72, 0x65, 0x73, 0x65, 0x74, 0x3a, - 0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x68, 0x61, 0x6c, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x72, 0x65, - 0x74, 0x20, 0x25, 0x69, 0x0a, 0x00, 0x75, 0x73, 0x62, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, - 0x20, 0x72, 0x65, 0x73, 0x65, 0x74, 0x3a, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x68, 0x61, 0x6c, - 0x74, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x72, 0x65, 0x74, 0x20, 0x25, 0x69, 0x0a, 0x00, 0x75, 0x73, - 0x62, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x72, 0x65, 0x73, 0x65, 0x74, 0x3a, 0x20, - 0x55, 0x53, 0x42, 0x5f, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x20, 0x25, 0x69, 0x0a, 0x00, 0x5f, 0x5f, 0x73, - 0x65, 0x6e, 0x64, 0x5f, 0x63, 0x62, 0x77, 0x20, 0x72, 0x65, 0x74, 0x20, 0x25, 0x69, 0x0a, 0x00, - 0x5f, 0x73, 0x65, 0x6e, 0x64, 0x5f, 0x63, 0x62, 0x77, 0x00, 0x5f, 0x5f, 0x55, 0x53, 0x42, 0x5f, - 0x42, 0x6c, 0x6b, 0x4d, 0x73, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x20, 0x25, 0x69, - 0x0a, 0x00, 0x5f, 0x5f, 0x55, 0x53, 0x42, 0x5f, 0x42, 0x6c, 0x6b, 0x4d, 0x73, 0x67, 0x54, 0x69, - 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x00, 0x5f, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x63, 0x73, 0x77, - 0x20, 0x25, 0x69, 0x0a, 0x00, 0x5f, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x63, 0x73, 0x77, 0x00, - 0x20, 0x20, 0x20, 0x20, 0x53, 0x43, 0x53, 0x49, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x5f, 0x55, 0x4e, - 0x49, 0x54, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x59, 0x20, 0x72, 0x65, 0x74, 0x20, 0x25, 0x69, 0x0a, - 0x00, 0x20, 0x20, 0x20, 0x20, 0x53, 0x43, 0x53, 0x49, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, - 0x54, 0x5f, 0x53, 0x45, 0x4e, 0x53, 0x45, 0x20, 0x72, 0x65, 0x74, 0x20, 0x25, 0x69, 0x0a, 0x00, - 0x20, 0x20, 0x20, 0x20, 0x53, 0x43, 0x53, 0x49, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, - 0x5f, 0x53, 0x45, 0x4e, 0x53, 0x45, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x25, 0x78, - 0x0a, 0x00, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x73, 0x74, 0x6f, 0x70, - 0x20, 0x63, 0x6d, 0x64, 0x20, 0x72, 0x65, 0x74, 0x20, 0x25, 0x69, 0x0a, 0x00, 0x20, 0x20, 0x20, - 0x20, 0x49, 0x6e, 0x71, 0x75, 0x69, 0x72, 0x79, 0x20, 0x72, 0x65, 0x74, 0x20, 0x25, 0x69, 0x0a, - 0x00, 0x20, 0x20, 0x20, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x20, 0x54, 0x79, 0x70, 0x65, - 0x3a, 0x20, 0x25, 0x78, 0x0a, 0x00, 0x20, 0x20, 0x20, 0x20, 0x52, 0x65, 0x61, 0x64, 0x43, 0x61, - 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x20, 0x72, 0x65, 0x74, 0x20, 0x25, 0x69, 0x0a, 0x00, 0x55, - 0x53, 0x42, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x4f, 0x70, 0x65, 0x6e, 0x28, 0x29, - 0x3a, 0x20, 0x55, 0x53, 0x42, 0x5f, 0x47, 0x65, 0x74, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x6f, 0x72, 0x73, 0x20, 0x25, 0x69, 0x0a, 0x00, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, 0x55, - 0x53, 0x42, 0x5f, 0x47, 0x65, 0x74, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, - 0x73, 0x00, 0x55, 0x53, 0x42, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x4f, 0x70, 0x65, - 0x6e, 0x28, 0x29, 0x3a, 0x20, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x20, 0x63, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x64, 0x21, 0x21, 0x21, 0x0a, 0x00, 0x55, 0x53, 0x42, 0x53, 0x74, 0x6f, 0x72, 0x61, - 0x67, 0x65, 0x5f, 0x4f, 0x70, 0x65, 0x6e, 0x28, 0x29, 0x3a, 0x20, 0x75, 0x63, 0x64, 0x20, 0x25, - 0x69, 0x20, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x20, 0x25, 0x69, 0x20, 0x6d, 0x41, 0x0a, 0x00, 0x55, - 0x53, 0x42, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x4f, 0x70, 0x65, 0x6e, 0x28, 0x29, - 0x3a, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x20, 0x73, 0x75, 0x62, 0x63, - 0x6c, 0x61, 0x73, 0x73, 0x20, 0x25, 0x69, 0x20, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x72, 0x6f, 0x74, - 0x20, 0x25, 0x69, 0x20, 0x0a, 0x00, 0x49, 0x6e, 0x20, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x3a, 0x20, - 0x25, 0x69, 0x0a, 0x00, 0x4f, 0x75, 0x74, 0x20, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x3a, 0x20, 0x25, - 0x69, 0x0a, 0x00, 0x65, 0x70, 0x5f, 0x69, 0x6e, 0x20, 0x25, 0x78, 0x20, 0x65, 0x70, 0x5f, 0x6f, - 0x75, 0x74, 0x20, 0x25, 0x78, 0x0a, 0x00, 0x55, 0x53, 0x42, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, - 0x65, 0x5f, 0x4f, 0x70, 0x65, 0x6e, 0x28, 0x29, 0x3a, 0x20, 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, - 0x20, 0x66, 0x69, 0x6e, 0x64, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, - 0x61, 0x63, 0x65, 0x21, 0x21, 0x21, 0x0a, 0x00, 0x55, 0x53, 0x42, 0x53, 0x74, 0x6f, 0x72, 0x61, - 0x67, 0x65, 0x5f, 0x4f, 0x70, 0x65, 0x6e, 0x28, 0x29, 0x3a, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x3a, - 0x20, 0x25, 0x78, 0x20, 0x61, 0x6c, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, - 0x3a, 0x20, 0x25, 0x78, 0x0a, 0x00, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, 0x55, 0x53, 0x42, 0x5f, - 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x00, 0x55, 0x53, 0x42, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x4f, 0x70, 0x65, 0x6e, - 0x28, 0x29, 0x3a, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x6e, - 0x66, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x25, 0x78, 0x0a, 0x00, 0x42, 0x65, 0x66, 0x6f, 0x72, - 0x65, 0x20, 0x55, 0x53, 0x42, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x52, 0x65, 0x73, - 0x65, 0x74, 0x00, 0x41, 0x66, 0x74, 0x65, 0x72, 0x20, 0x55, 0x53, 0x42, 0x53, 0x74, 0x6f, 0x72, - 0x61, 0x67, 0x65, 0x5f, 0x52, 0x65, 0x73, 0x65, 0x74, 0x00, 0x55, 0x53, 0x42, 0x53, 0x74, 0x6f, - 0x72, 0x61, 0x67, 0x65, 0x5f, 0x4f, 0x70, 0x65, 0x6e, 0x28, 0x29, 0x3a, 0x20, 0x74, 0x72, 0x79, - 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x25, 0x69, 0x0a, 0x00, 0x55, 0x53, 0x42, 0x53, - 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x4f, 0x70, 0x65, 0x6e, 0x28, 0x29, 0x3a, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x30, 0x0a, 0x00, 0x20, 0x43, 0x6c, 0x65, 0x61, 0x72, 0x20, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x72, 0x65, 0x74, 0x20, 0x25, 0x69, 0x0a, 0x00, 0x46, 0x61, - 0x73, 0x74, 0x20, 0x55, 0x53, 0x42, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x4d, 0x6f, - 0x75, 0x6e, 0x74, 0x4c, 0x55, 0x4e, 0x20, 0x25, 0x69, 0x23, 0x0a, 0x00, 0x55, 0x53, 0x42, 0x53, - 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x4c, 0x55, 0x4e, 0x3a, - 0x20, 0x72, 0x65, 0x74, 0x20, 0x25, 0x69, 0x0a, 0x00, 0x55, 0x53, 0x42, 0x53, 0x54, 0x4f, 0x52, - 0x41, 0x47, 0x45, 0x5f, 0x47, 0x45, 0x54, 0x5f, 0x4d, 0x41, 0x58, 0x5f, 0x4c, 0x55, 0x4e, 0x20, - 0x72, 0x65, 0x74, 0x20, 0x25, 0x69, 0x20, 0x6d, 0x61, 0x78, 0x6c, 0x75, 0x6e, 0x20, 0x25, 0x69, - 0x0a, 0x00, 0x55, 0x53, 0x42, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x4d, 0x6f, 0x75, - 0x6e, 0x74, 0x4c, 0x55, 0x4e, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x21, 0x21, 0x21, 0x0a, 0x00, 0x55, - 0x6e, 0x70, 0x6c, 0x75, 0x67, 0x3a, 0x20, 0x72, 0x65, 0x73, 0x65, 0x74, 0x5f, 0x70, 0x6f, 0x72, - 0x74, 0x20, 0x72, 0x65, 0x74, 0x20, 0x25, 0x69, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x20, 0x25, 0x78, 0x0a, 0x00, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x72, 0x65, - 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x4f, 0x4b, 0x0a, 0x00, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x72, - 0x65, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x4b, 0x4f, 0x20, 0x72, 0x65, 0x74, 0x20, 0x25, 0x69, - 0x0a, 0x00, 0x0a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, - 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, - 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, - 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x0a, 0x55, 0x53, 0x42, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, - 0x65, 0x5f, 0x49, 0x6e, 0x69, 0x74, 0x28, 0x29, 0x0a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, - 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, - 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, - 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x0a, 0x0a, 0x00, 0x55, - 0x53, 0x42, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x49, 0x6e, 0x69, 0x74, 0x28, 0x29, - 0x20, 0x4f, 0x6b, 0x0a, 0x00, 0x55, 0x53, 0x42, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, - 0x49, 0x6e, 0x69, 0x74, 0x28, 0x29, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x25, 0x78, - 0x0a, 0x00, 0x55, 0x53, 0x42, 0x20, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x3a, 0x20, 0x6e, 0x6f, 0x74, - 0x20, 0x65, 0x6e, 0x6f, 0x75, 0x67, 0x68, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x21, 0x0a, - 0x00, 0x77, 0x62, 0x66, 0x73, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x00, 0x61, 0x6c, 0x6c, - 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x00, 0x74, - 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x20, 0x77, - 0x62, 0x66, 0x73, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x64, 0x69, 0x73, 0x63, 0x73, 0x20, - 0x73, 0x74, 0x69, 0x6c, 0x6c, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x00, 0x62, 0x61, 0x64, 0x20, 0x6d, - 0x61, 0x67, 0x69, 0x63, 0x00, 0x68, 0x64, 0x20, 0x73, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x73, - 0x69, 0x7a, 0x65, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, - 0x68, 0x00, 0x68, 0x64, 0x20, 0x6e, 0x75, 0x6d, 0x20, 0x73, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, - 0x64, 0x6f, 0x65, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x00, 0x4e, 0x54, - 0x46, 0x53, 0x00, 0x46, 0x41, 0x54, 0x00 -}; +#define size_ehcmodule_5 25287 + +unsigned char ehcmodule_5[25287] __attribute__((aligned (32)))={ + 0x7f, 0x45, 0x4c, 0x46, 0x01, 0x02, 0x01, 0x61, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x28, 0x00, 0x00, 0x00, 0x01, 0x13, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x34, 0x00, 0x20, 0x00, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0xa0, 0x00, 0xf0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xd4, 0x00, 0x00, 0x00, 0xa0, + 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x34, 0x00, 0xf0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd4, 0x00, 0x00, 0x00, 0xd4, 0x00, 0xf0, 0x00, 0x00, + 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x08, 0x13, 0x70, 0x00, 0x00, + 0x13, 0x70, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x94, 0x00, 0x00, 0x5a, 0x94, 0x00, 0xf0, 0x00, 0x05, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x5b, 0x9c, 0x13, 0x70, 0x60, 0x00, + 0x13, 0x70, 0x60, 0x00, 0x00, 0x00, 0x07, 0x2b, 0x00, 0x02, 0x95, 0xa8, 0x00, 0xf0, 0x00, 0x06, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x06, + 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x09, 0x13, 0x70, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x7d, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x7f, 0x13, 0x72, 0xf3, 0xa8, 0xe3, 0xa0, 0x00, 0x00, 0xe3, 0xa0, 0x10, 0x00, + 0xe5, 0x9f, 0x31, 0x00, 0xe1, 0x2f, 0xff, 0x13, 0xe5, 0x9f, 0xc0, 0xfc, 0xe5, 0x9c, 0xc0, 0x00, + 0xe1, 0xa0, 0x00, 0x00, 0xe7, 0x9c, 0xc1, 0x0b, 0xe1, 0xa0, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x1c, + 0xe1, 0xa0, 0x00, 0x00, 0xe1, 0xa0, 0x00, 0x00, 0xe3, 0xa0, 0xb0, 0x3f, 0xea, 0xff, 0xff, 0xf5, + 0xe1, 0xa0, 0x00, 0x00, 0xe1, 0xa0, 0x00, 0x00, 0xe3, 0xa0, 0xb0, 0x40, 0xea, 0xff, 0xff, 0xf1, + 0xe3, 0xa0, 0x00, 0x00, 0xee, 0x07, 0x0f, 0x15, 0xe1, 0x2f, 0xff, 0x1e, 0xe1, 0xa0, 0x00, 0x00, + 0xe1, 0xa0, 0x00, 0x00, 0xe1, 0xa0, 0x00, 0x00, 0xe3, 0x18, 0x00, 0x10, 0x0a, 0x00, 0x00, 0x12, + 0xe3, 0xc8, 0x80, 0x10, 0xe3, 0xa0, 0x20, 0x10, 0xe5, 0x87, 0x20, 0x00, 0xe1, 0xa0, 0x00, 0x00, + 0xe1, 0xa0, 0x20, 0x0d, 0xe1, 0xa0, 0x00, 0x00, 0xe5, 0x9f, 0xd0, 0x90, 0xe1, 0xa0, 0x00, 0x00, + 0xe9, 0x2d, 0x5f, 0xfe, 0xe1, 0xa0, 0x00, 0x00, 0xeb, 0x00, 0x00, 0x0f, 0xe8, 0xbd, 0x5f, 0xfe, + 0xe1, 0xa0, 0x00, 0x00, 0xe1, 0xa0, 0xd0, 0x02, 0xe3, 0x10, 0x00, 0x01, 0x0a, 0x00, 0x00, 0x02, + 0xe1, 0xa0, 0x00, 0x00, 0xe3, 0xa0, 0x00, 0x04, 0xeb, 0x00, 0x00, 0x05, 0xe3, 0x18, 0x00, 0x01, + 0x0a, 0x00, 0x00, 0x01, 0xe5, 0x9f, 0xf0, 0x58, 0xe1, 0xa0, 0x00, 0x00, 0xe5, 0x9f, 0xf0, 0x54, + 0xe1, 0xa0, 0x00, 0x00, 0xe5, 0x9f, 0xf0, 0x50, 0xe1, 0xa0, 0x00, 0x00, 0xe5, 0x9f, 0x20, 0x4c, + 0xe1, 0x2f, 0xff, 0x12, 0xe1, 0xa0, 0x00, 0x00, 0xee, 0x13, 0x0f, 0x10, 0xe1, 0x2f, 0xff, 0x1e, + 0xe1, 0xa0, 0x00, 0x00, 0xe1, 0xa0, 0x00, 0x00, 0xee, 0x03, 0x0f, 0x10, 0xe1, 0x2f, 0xff, 0x1e, + 0xe1, 0xa0, 0x00, 0x00, 0xe1, 0xa0, 0x00, 0x00, 0x45, 0x48, 0x43, 0x5f, 0x43, 0x46, 0x47, 0x00, + 0x12, 0x34, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x13, 0x70, 0x0e, 0x2d, 0x13, 0x72, 0xc0, 0x00, + 0x13, 0x72, 0xf5, 0xa8, 0xff, 0xff, 0x1e, 0x80, 0xff, 0xff, 0x1e, 0x9c, 0xff, 0xff, 0x1d, 0x44, + 0x13, 0x70, 0x0c, 0x59, 0xe1, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x15, 0x11, + 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x14, 0xf5, 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x15, 0x07, + 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x15, 0x07, 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x14, 0xff, + 0x46, 0xc0, 0x47, 0x78, 0xea, 0xff, 0xff, 0xb5, 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x15, 0x0d, + 0x46, 0xc0, 0x47, 0x78, 0xea, 0xff, 0xff, 0xd2, 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x15, 0x2d, + 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x15, 0x29, 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x15, 0x2f, + 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x14, 0xeb, 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x14, 0xd3, + 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x15, 0x1f, 0x46, 0xc0, 0x47, 0x78, 0xea, 0xff, 0xff, 0xa1, + 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x14, 0xe7, 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x15, 0x1f, + 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x14, 0xe7, 0x46, 0xc0, 0x47, 0x78, 0xea, 0xff, 0xff, 0xc5, + 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x14, 0xef, 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x14, 0xd1, + 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x14, 0xed, 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x14, 0xef, + 0x46, 0xc0, 0x47, 0x78, 0xea, 0xff, 0xff, 0xb7, 0x46, 0xc0, 0x47, 0x78, 0xea, 0xff, 0xff, 0x89, + 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x14, 0xd1, 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x14, 0xad, + 0xb5, 0x00, 0x28, 0x02, 0xd0, 0x11, 0x28, 0x02, 0xd8, 0x04, 0x28, 0x00, 0xd0, 0x08, 0x28, 0x01, + 0xd1, 0x04, 0xe0, 0x08, 0x28, 0x10, 0xd0, 0x0d, 0x28, 0x11, 0xd0, 0x0d, 0x48, 0x08, 0xe0, 0x0c, + 0x4b, 0x08, 0x68, 0x18, 0xe0, 0x09, 0x48, 0x08, 0xe0, 0x07, 0x4a, 0x08, 0x23, 0x01, 0x60, 0x13, + 0x20, 0x00, 0xe0, 0x02, 0x48, 0x06, 0xe0, 0x00, 0x48, 0x06, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, + 0xff, 0xff, 0xfd, 0x66, 0x13, 0x70, 0x60, 0x28, 0x13, 0x70, 0x4a, 0xd5, 0x13, 0x70, 0x67, 0x40, + 0x13, 0x70, 0x43, 0xb1, 0x13, 0x70, 0x42, 0xe5, 0xb5, 0x30, 0xb0, 0x81, 0x1c, 0x0c, 0xf7, 0xff, + 0xff, 0x8f, 0x1c, 0x05, 0x28, 0x00, 0xd1, 0x27, 0x2c, 0x00, 0xd0, 0x25, 0x68, 0x24, 0x2c, 0x00, + 0xd0, 0x22, 0x78, 0x22, 0x78, 0x63, 0x06, 0x12, 0x04, 0x1b, 0x43, 0x13, 0x78, 0xa2, 0x02, 0x12, + 0x43, 0x1a, 0x78, 0xe3, 0x43, 0x13, 0x2b, 0x06, 0xd1, 0x16, 0x7b, 0x23, 0x7b, 0x62, 0x06, 0x1b, + 0x04, 0x12, 0x43, 0x1a, 0x7b, 0xa3, 0x02, 0x1b, 0x43, 0x13, 0x7b, 0xe2, 0x43, 0x1a, 0x2a, 0x7a, + 0xd0, 0x02, 0x2a, 0x88, 0xd1, 0x08, 0xe0, 0x02, 0x48, 0x06, 0x21, 0x15, 0xe0, 0x01, 0x48, 0x05, + 0x21, 0x14, 0x1c, 0x22, 0xf0, 0x04, 0xfc, 0x82, 0xb0, 0x01, 0x1c, 0x28, 0xbc, 0x30, 0xbc, 0x02, + 0x47, 0x08, 0x46, 0xc0, 0x13, 0x70, 0x02, 0xe1, 0xb5, 0x70, 0x1c, 0x0c, 0x1c, 0x05, 0xf7, 0xff, + 0xff, 0x87, 0x1c, 0x06, 0x20, 0x01, 0x42, 0x40, 0xf7, 0xff, 0xff, 0x6e, 0x0e, 0x2b, 0x73, 0x23, + 0x0c, 0x2b, 0x73, 0x63, 0x0a, 0x2b, 0x73, 0xa3, 0x7c, 0x62, 0x7c, 0x23, 0x04, 0x12, 0x06, 0x1b, + 0x43, 0x1a, 0x7c, 0xa3, 0x73, 0xe5, 0x02, 0x1b, 0x43, 0x13, 0x7c, 0xe2, 0x06, 0x2d, 0x43, 0x1a, + 0x1c, 0x20, 0x60, 0x15, 0x30, 0x0c, 0x21, 0x04, 0xf7, 0xff, 0xff, 0x46, 0x7c, 0x23, 0x7c, 0x62, + 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, 0x7c, 0xa3, 0x7c, 0xe0, 0x02, 0x1b, 0x43, 0x13, 0x43, 0x18, + 0x21, 0x04, 0xf7, 0xff, 0xff, 0x39, 0x1c, 0x30, 0xf7, 0xff, 0xff, 0x46, 0x20, 0x00, 0xbc, 0x70, + 0xbc, 0x02, 0x47, 0x08, 0xb5, 0xf0, 0xb0, 0x8f, 0x90, 0x08, 0x91, 0x07, 0x1c, 0x08, 0x1c, 0x11, + 0x92, 0x06, 0x92, 0x09, 0xf7, 0xff, 0xff, 0x30, 0x4c, 0x7f, 0x68, 0x23, 0x2b, 0x00, 0xd1, 0x00, + 0xe0, 0xec, 0xa8, 0x0d, 0xf0, 0x01, 0xf9, 0x0e, 0x4b, 0x7c, 0x60, 0x18, 0x28, 0x00, 0xd0, 0x04, + 0x23, 0x80, 0x9a, 0x0d, 0x01, 0x1b, 0x42, 0x9a, 0xd0, 0x04, 0x4a, 0x79, 0x23, 0x01, 0x42, 0x5b, + 0x60, 0x13, 0xe0, 0xdb, 0x4d, 0x77, 0x68, 0x2a, 0x2a, 0x00, 0xdb, 0x63, 0x4b, 0x76, 0x42, 0x9a, + 0xd0, 0x60, 0x4a, 0x73, 0x68, 0x13, 0x1c, 0x58, 0xd1, 0x5c, 0x1c, 0x2e, 0x4a, 0x6e, 0x49, 0x71, + 0x68, 0x13, 0x68, 0x08, 0x33, 0x1f, 0x21, 0x1f, 0x1c, 0x1c, 0x43, 0x8c, 0x1c, 0x07, 0x21, 0x10, + 0x1c, 0x22, 0x37, 0x10, 0xf0, 0x03, 0xff, 0xf8, 0x28, 0x00, 0xd1, 0x00, 0xe0, 0xbe, 0x78, 0x23, + 0x2b, 0x43, 0xd1, 0x0a, 0x78, 0x63, 0x2b, 0x49, 0xd1, 0x07, 0x78, 0xa3, 0x2b, 0x53, 0xd1, 0x04, + 0x78, 0xe3, 0x2b, 0x4f, 0xd1, 0x01, 0x4b, 0x64, 0xe0, 0x07, 0x68, 0x33, 0x2b, 0x00, 0xd0, 0x02, + 0x23, 0x00, 0x60, 0x33, 0xe7, 0xda, 0x23, 0x01, 0x42, 0x5b, 0x60, 0x2b, 0x79, 0x62, 0x79, 0xa3, + 0x02, 0x12, 0x04, 0x1b, 0x18, 0xd2, 0x79, 0x23, 0x4e, 0x5c, 0x18, 0xd2, 0x79, 0xe3, 0x4d, 0x5c, + 0x06, 0x1b, 0x18, 0xd2, 0x0a, 0xd2, 0x60, 0x32, 0x22, 0x80, 0x01, 0x12, 0x1c, 0x28, 0x21, 0x00, + 0xf0, 0x05, 0xfa, 0x68, 0x4b, 0x53, 0x68, 0x1a, 0x4b, 0x53, 0x42, 0x9a, 0xd1, 0x1a, 0x68, 0x36, + 0x20, 0x00, 0x46, 0xb4, 0x4e, 0x53, 0x22, 0x07, 0x40, 0x02, 0xd1, 0x02, 0x10, 0xc3, 0x00, 0x9b, + 0x51, 0x9f, 0x18, 0x23, 0x7a, 0x1b, 0x2b, 0x00, 0xd0, 0x07, 0x21, 0x01, 0x10, 0xc3, 0x40, 0x91, + 0x1c, 0x0a, 0x5c, 0xe9, 0x44, 0x67, 0x43, 0x0a, 0x54, 0xea, 0x23, 0x80, 0x30, 0x01, 0x01, 0xdb, + 0x42, 0x98, 0xd1, 0xe8, 0x4b, 0x40, 0x22, 0x1f, 0x68, 0x1b, 0x33, 0x1f, 0x43, 0x93, 0x93, 0x0b, + 0x9a, 0x07, 0x23, 0x80, 0x02, 0x1b, 0x92, 0x0a, 0x93, 0x05, 0xe0, 0x63, 0x98, 0x08, 0x4a, 0x3c, + 0x0a, 0x43, 0x1c, 0x1d, 0x21, 0x0f, 0x68, 0x13, 0x43, 0x8d, 0x42, 0x9d, 0xd0, 0x3a, 0x4b, 0x39, + 0x60, 0x15, 0x68, 0x1a, 0x4b, 0x38, 0x42, 0x9a, 0xd1, 0x1e, 0x4b, 0x38, 0x1c, 0x28, 0x68, 0x1c, + 0x27, 0x07, 0x1c, 0x21, 0xf0, 0x05, 0xf8, 0xe8, 0x4a, 0x36, 0x08, 0xc6, 0x00, 0xb3, 0x58, 0x99, + 0x4b, 0x33, 0x40, 0x07, 0x20, 0x01, 0x22, 0x00, 0x93, 0x01, 0x46, 0x84, 0xe0, 0x07, 0x98, 0x01, + 0x5d, 0x83, 0x46, 0x60, 0x41, 0x13, 0x42, 0x03, 0xd0, 0x00, 0x19, 0x09, 0x32, 0x01, 0x42, 0xba, + 0xd3, 0xf5, 0x1e, 0x63, 0x40, 0x2b, 0x18, 0xcd, 0x4b, 0x24, 0x68, 0x1b, 0x1b, 0x5c, 0x2c, 0x10, + 0xdc, 0x3a, 0x2c, 0x10, 0xd0, 0x07, 0x22, 0x80, 0x98, 0x0b, 0x21, 0x00, 0x02, 0x12, 0xf0, 0x05, + 0xfa, 0x01, 0x2c, 0x00, 0xdd, 0x06, 0x1c, 0x28, 0x1c, 0x21, 0x9a, 0x0b, 0xf0, 0x03, 0xff, 0x5c, + 0x28, 0x00, 0xd0, 0x23, 0x99, 0x08, 0x4b, 0x20, 0x9a, 0x05, 0x40, 0x0b, 0x00, 0x9b, 0x98, 0x06, + 0x1a, 0xd1, 0x42, 0x81, 0xd8, 0x01, 0x1c, 0x0c, 0xe0, 0x00, 0x9c, 0x06, 0x9a, 0x0b, 0x98, 0x0a, + 0x18, 0xd1, 0x1c, 0x22, 0xf0, 0x05, 0xf9, 0xa2, 0x98, 0x0a, 0x1c, 0x21, 0xf7, 0xff, 0xfe, 0x4c, + 0x9b, 0x0a, 0x98, 0x06, 0x19, 0x1b, 0x99, 0x08, 0x93, 0x0a, 0x10, 0xa3, 0x1b, 0x00, 0x18, 0xc9, + 0x90, 0x06, 0x91, 0x08, 0x9a, 0x06, 0x2a, 0x00, 0xd1, 0x98, 0xe0, 0x07, 0x20, 0x80, 0x02, 0x00, + 0xb0, 0x0f, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x24, 0x10, 0xe7, 0xcc, 0x98, 0x07, 0x99, 0x09, + 0xf7, 0xff, 0xfe, 0x12, 0x20, 0x00, 0xe7, 0xf3, 0x13, 0x70, 0x67, 0xd0, 0x13, 0x70, 0x67, 0x4c, + 0x13, 0x70, 0x60, 0x10, 0x13, 0x70, 0x60, 0x14, 0x7f, 0xff, 0xff, 0xff, 0x13, 0x70, 0x67, 0x50, + 0x13, 0x70, 0x78, 0x00, 0x13, 0x70, 0x80, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xb5, 0xf0, 0x4b, 0xc9, + 0xb0, 0x93, 0x68, 0x18, 0x21, 0x80, 0xf7, 0xff, 0xfe, 0x23, 0x21, 0x20, 0xf7, 0xff, 0xfe, 0x24, + 0x90, 0x0a, 0xf0, 0x00, 0xfc, 0x0d, 0xf7, 0xff, 0xfd, 0xff, 0x21, 0x78, 0xf7, 0xff, 0xfd, 0xd0, + 0x99, 0x0a, 0x48, 0xc1, 0xf7, 0xff, 0xfe, 0x20, 0x48, 0xc0, 0x9a, 0x0a, 0x23, 0x00, 0x1c, 0x01, + 0xf7, 0xff, 0xfd, 0xd2, 0x49, 0xbe, 0x90, 0x08, 0x20, 0xcd, 0xf0, 0x04, 0xfb, 0x71, 0x22, 0x00, + 0x92, 0x09, 0x92, 0x0b, 0x92, 0x0c, 0x92, 0x0d, 0x4b, 0xba, 0x4a, 0xbb, 0x26, 0x01, 0x93, 0x05, + 0x92, 0x04, 0xe0, 0x00, 0x26, 0x00, 0x98, 0x0a, 0xa9, 0x11, 0x22, 0x00, 0xf7, 0xff, 0xfd, 0xd8, + 0x90, 0x10, 0x9b, 0x10, 0x2b, 0x00, 0xd1, 0xf6, 0x2e, 0x00, 0xd0, 0x02, 0x98, 0x08, 0xf7, 0xff, + 0xfd, 0xab, 0x9a, 0x05, 0x9c, 0x11, 0x23, 0x00, 0x60, 0x13, 0x2c, 0x00, 0xd1, 0x54, 0x4b, 0xaf, + 0x68, 0x1b, 0x2b, 0x00, 0xd0, 0x05, 0x4b, 0xae, 0x68, 0x1a, 0x2a, 0x00, 0xd1, 0x01, 0x4b, 0xaa, + 0x60, 0x1a, 0x9b, 0x09, 0x2b, 0x00, 0xd0, 0xdd, 0x4b, 0xa7, 0x68, 0x1b, 0x2b, 0x00, 0xd0, 0xd9, + 0x4b, 0xa7, 0x68, 0x1b, 0x2b, 0x00, 0xd1, 0xd5, 0x4b, 0xa6, 0x68, 0x1b, 0x2b, 0x00, 0xd0, 0x09, + 0xf0, 0x03, 0xfd, 0x96, 0x28, 0x00, 0xd0, 0x05, 0xf0, 0x03, 0xfd, 0x92, 0x28, 0x00, 0xd0, 0x01, + 0xf0, 0x03, 0xfd, 0x8e, 0x4b, 0x9f, 0x68, 0x1e, 0x2e, 0x00, 0xd1, 0x23, 0x4f, 0x9e, 0x4a, 0x9f, + 0x68, 0x3b, 0x3b, 0x01, 0x42, 0x93, 0xd8, 0x1d, 0x4c, 0x96, 0x4d, 0x9d, 0x23, 0x01, 0x60, 0x23, + 0x68, 0x28, 0x4a, 0x9c, 0x21, 0x01, 0xf0, 0x03, 0xfe, 0x9f, 0x60, 0x26, 0x28, 0x00, 0xd0, 0x09, + 0x23, 0x80, 0x68, 0x3a, 0x00, 0x9b, 0x42, 0x9a, 0xd1, 0x04, 0x68, 0x2b, 0x22, 0x80, 0x02, 0x12, + 0x18, 0x9b, 0x60, 0x2b, 0x49, 0x92, 0x4b, 0x94, 0x68, 0x0a, 0x68, 0x1b, 0x42, 0x9a, 0xd3, 0x01, + 0x23, 0x00, 0x60, 0x0b, 0x4b, 0x8a, 0x68, 0x1b, 0x2b, 0x00, 0xd1, 0x9b, 0x98, 0x08, 0x49, 0x83, + 0xf7, 0xff, 0xfd, 0x8e, 0x26, 0x01, 0xe7, 0x96, 0x78, 0x23, 0x78, 0x62, 0x06, 0x1b, 0x04, 0x12, + 0x43, 0x1a, 0x78, 0xa3, 0x02, 0x1b, 0x43, 0x13, 0x78, 0xe2, 0x1c, 0x16, 0x43, 0x1e, 0x2e, 0x02, + 0xd0, 0x59, 0x2e, 0x02, 0xd8, 0x02, 0x2e, 0x01, 0xd1, 0x04, 0xe0, 0x07, 0x2e, 0x06, 0xd0, 0x03, + 0x2e, 0x07, 0xd0, 0x67, 0x25, 0x01, 0xe0, 0x30, 0x25, 0x01, 0xe2, 0x4f, 0x7b, 0x23, 0x7b, 0x62, + 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, 0x7b, 0xa3, 0x49, 0x6f, 0x02, 0x1b, 0x43, 0x13, 0x7b, 0xe2, + 0x1c, 0x15, 0x43, 0x1d, 0x1c, 0x28, 0xf0, 0x05, 0xf9, 0x4d, 0x28, 0x00, 0xd1, 0x16, 0x7d, 0x23, + 0x7d, 0x62, 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, 0x7d, 0xa3, 0x02, 0x1b, 0x43, 0x13, 0x7d, 0xe2, + 0x1c, 0x15, 0x43, 0x1d, 0x9b, 0x0c, 0x2b, 0x00, 0xd0, 0x00, 0xe2, 0x2d, 0x4b, 0x68, 0x68, 0x1b, + 0x2b, 0x00, 0xd0, 0x00, 0xe2, 0x28, 0xf0, 0x04, 0xf8, 0x2b, 0xe2, 0x25, 0x49, 0x6b, 0x1c, 0x28, + 0xf0, 0x05, 0xf9, 0x30, 0x28, 0x00, 0xd0, 0x02, 0x25, 0x06, 0x42, 0x6d, 0xe2, 0x1e, 0x7d, 0x23, + 0x7d, 0x62, 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, 0x7d, 0xa3, 0x02, 0x1b, 0x43, 0x13, 0x7d, 0xe2, + 0x1c, 0x15, 0x43, 0x1d, 0x4b, 0x5a, 0x60, 0x1e, 0x4b, 0x57, 0x60, 0x18, 0x48, 0x60, 0xf0, 0x00, + 0xfa, 0x6d, 0x4b, 0x60, 0x68, 0x1b, 0x68, 0x9a, 0x23, 0x04, 0x60, 0x93, 0xf0, 0x00, 0xfd, 0xe2, + 0x23, 0x00, 0x93, 0x09, 0xe2, 0x02, 0x7a, 0x23, 0x7a, 0x62, 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, + 0x7a, 0xa3, 0x02, 0x1b, 0x43, 0x13, 0x7a, 0xe2, 0x1c, 0x10, 0x9a, 0x0b, 0x43, 0x18, 0x42, 0x82, + 0xd1, 0x02, 0x23, 0x00, 0x93, 0x0b, 0xe0, 0x03, 0xf0, 0x00, 0xfd, 0xee, 0xf0, 0x00, 0xfd, 0xe2, + 0x25, 0x00, 0xe1, 0xeb, 0x7e, 0x23, 0x7e, 0x62, 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, 0x7e, 0xa3, + 0x02, 0x1b, 0x43, 0x13, 0x7e, 0xe2, 0x1c, 0x16, 0x43, 0x1e, 0x7c, 0x62, 0x7c, 0x23, 0x04, 0x12, + 0x06, 0x1b, 0x43, 0x1a, 0x7c, 0xa3, 0x02, 0x1b, 0x43, 0x13, 0x7c, 0xe2, 0x43, 0x1a, 0x92, 0x06, + 0x7d, 0x23, 0x7d, 0x62, 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, 0x7d, 0xa3, 0x02, 0x1b, 0x43, 0x13, + 0x7d, 0xe2, 0x1c, 0x15, 0x43, 0x1d, 0x7b, 0x23, 0x2b, 0x00, 0xd1, 0x02, 0x9a, 0x0b, 0x2a, 0x00, + 0xd0, 0x01, 0x27, 0x00, 0xe0, 0x0c, 0x7a, 0x23, 0x7a, 0x62, 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, + 0x7a, 0xa3, 0x7a, 0xe0, 0x02, 0x1b, 0x43, 0x13, 0x43, 0x18, 0xf0, 0x00, 0xfd, 0xb5, 0x1c, 0x07, + 0x9b, 0x06, 0x1c, 0x30, 0x18, 0xed, 0x00, 0xe9, 0x95, 0x07, 0x1c, 0x34, 0xf7, 0xff, 0xfc, 0xac, + 0x25, 0x00, 0xe0, 0x05, 0x68, 0x20, 0x68, 0x61, 0xf7, 0xff, 0xfc, 0xa6, 0x35, 0x01, 0x34, 0x08, + 0x9a, 0x07, 0x42, 0x95, 0xdb, 0xf6, 0x4c, 0x22, 0x68, 0x20, 0x28, 0x00, 0xd0, 0x00, 0xe1, 0x87, + 0x99, 0x11, 0x7b, 0x0b, 0x7b, 0x4a, 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, 0x7b, 0x8b, 0x02, 0x1b, + 0x43, 0x13, 0x7b, 0xca, 0x43, 0x1a, 0x4b, 0x24, 0x42, 0x9a, 0xd1, 0x00, 0xe0, 0xf6, 0x42, 0x9a, + 0xd8, 0x46, 0x2a, 0x06, 0xd8, 0x0b, 0x2a, 0x05, 0xd3, 0x00, 0xe0, 0xd0, 0x2a, 0x01, 0xd1, 0x00, + 0xe0, 0x92, 0x2a, 0x00, 0xd0, 0x6c, 0x2a, 0x02, 0xd0, 0x00, 0xe1, 0x01, 0xe0, 0xc7, 0x2a, 0x1b, + 0xd8, 0x06, 0x2a, 0x1a, 0xd3, 0x00, 0xe0, 0x9f, 0x2a, 0x0c, 0xd0, 0x00, 0xe0, 0xf8, 0xe0, 0x8f, + 0x4b, 0x16, 0x42, 0x9a, 0xd1, 0x00, 0xe0, 0x9a, 0x33, 0x01, 0x42, 0x9a, 0xd0, 0x00, 0xe0, 0xef, + 0xe0, 0xc7, 0x46, 0xc0, 0x13, 0x70, 0x60, 0x28, 0x13, 0x70, 0x60, 0x50, 0x00, 0x98, 0x96, 0x80, + 0x13, 0x70, 0x02, 0x19, 0x13, 0x70, 0x67, 0xc0, 0x13, 0x70, 0x60, 0x0c, 0x13, 0x70, 0x67, 0x48, + 0x13, 0x70, 0x67, 0x40, 0x13, 0x70, 0x67, 0x6c, 0x13, 0x72, 0xc3, 0xa0, 0x00, 0x00, 0x0f, 0xfe, + 0x13, 0x70, 0x67, 0x54, 0x13, 0x70, 0x68, 0x00, 0x13, 0x72, 0xc3, 0xa4, 0x13, 0x70, 0x60, 0x5c, + 0x13, 0x70, 0x12, 0x99, 0x13, 0x70, 0x60, 0x34, 0x55, 0x4d, 0x53, 0x03, 0x55, 0x4d, 0x53, 0x01, + 0x4b, 0xac, 0x42, 0x9a, 0xd1, 0x00, 0xe0, 0x86, 0x42, 0x9a, 0xd8, 0x12, 0x3b, 0x7b, 0x42, 0x9a, + 0xd1, 0x00, 0xe0, 0xb4, 0x42, 0x9a, 0xd8, 0x04, 0x3b, 0x02, 0x42, 0x9a, 0xd0, 0x00, 0xe0, 0xb7, + 0xe0, 0xa5, 0x4b, 0xa5, 0x42, 0x9a, 0xd0, 0x72, 0x33, 0x70, 0x42, 0x9a, 0xd0, 0x00, 0xe0, 0xaf, + 0xe0, 0xaa, 0x4b, 0xa2, 0x42, 0x9a, 0xd1, 0x00, 0xe1, 0x06, 0x42, 0x9a, 0xd8, 0x07, 0x4b, 0xa0, + 0x42, 0x9a, 0xd0, 0x6e, 0x4b, 0x9f, 0x42, 0x9a, 0xd0, 0x00, 0xe0, 0xa1, 0xe0, 0xa2, 0x4b, 0x9e, + 0x42, 0x9a, 0xd1, 0x00, 0xe0, 0xed, 0x33, 0x01, 0x42, 0x9a, 0xd0, 0x00, 0xe0, 0x98, 0xe0, 0xde, + 0x2f, 0x00, 0xd1, 0x00, 0xe0, 0xfe, 0x69, 0x33, 0x88, 0x18, 0x69, 0xb3, 0x88, 0x1c, 0x6a, 0x33, + 0x88, 0x1d, 0x68, 0x33, 0x78, 0x19, 0x68, 0xb3, 0x78, 0x1a, 0x02, 0x03, 0x0a, 0x00, 0x43, 0x03, + 0x02, 0x20, 0x0a, 0x24, 0x43, 0x20, 0x04, 0x00, 0x0c, 0x00, 0x90, 0x00, 0x02, 0x28, 0x0a, 0x2d, + 0x43, 0x28, 0x04, 0x00, 0x0c, 0x00, 0x90, 0x01, 0x6b, 0x30, 0x04, 0x1b, 0x90, 0x02, 0x0c, 0x1b, + 0x1c, 0x38, 0xf0, 0x01, 0xfe, 0x95, 0xe0, 0x60, 0x2f, 0x00, 0xd1, 0x00, 0xe0, 0xda, 0x68, 0x33, + 0x1c, 0x38, 0x78, 0x19, 0x68, 0xb3, 0x88, 0x1a, 0x69, 0x33, 0xf0, 0x01, 0xfd, 0x87, 0xe0, 0x54, + 0x2f, 0x00, 0xd0, 0x00, 0xe0, 0xce, 0x68, 0x33, 0x69, 0x32, 0x78, 0x18, 0x68, 0xb3, 0x78, 0x19, + 0x69, 0xb3, 0xf0, 0x00, 0xfc, 0xed, 0xe0, 0x48, 0x25, 0x01, 0x24, 0x00, 0xe0, 0xc5, 0xf0, 0x03, + 0xfd, 0xef, 0x1c, 0x05, 0x28, 0x00, 0xda, 0x01, 0x23, 0x00, 0xe0, 0x02, 0x4a, 0x77, 0x23, 0x01, + 0x60, 0x13, 0x99, 0x11, 0x93, 0x09, 0x7a, 0x0b, 0x7a, 0x4a, 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, + 0x7a, 0x8b, 0x02, 0x1b, 0x43, 0x13, 0x7a, 0xca, 0x43, 0x1a, 0x92, 0x0b, 0xe0, 0xac, 0x4b, 0x6f, + 0x22, 0x00, 0x60, 0x18, 0xe0, 0x6a, 0x68, 0x32, 0x4b, 0x6d, 0x68, 0x12, 0x60, 0x1a, 0x25, 0x00, + 0xe0, 0xa2, 0x23, 0x01, 0x60, 0x23, 0x4b, 0x69, 0x60, 0x18, 0x48, 0x6a, 0xf0, 0x00, 0xf9, 0x0e, + 0x4b, 0x69, 0x68, 0x1b, 0x68, 0x9a, 0x23, 0x04, 0x60, 0x93, 0xf0, 0x00, 0xfc, 0x83, 0x23, 0x00, + 0x93, 0x09, 0x4c, 0x66, 0x1c, 0x20, 0xf0, 0x00, 0xfd, 0xa5, 0x4b, 0x65, 0x1c, 0x05, 0x60, 0x18, + 0x68, 0x32, 0x2a, 0x00, 0xd1, 0x00, 0xe0, 0x87, 0x68, 0x23, 0xe0, 0x68, 0x68, 0x33, 0x69, 0x32, + 0x68, 0x18, 0x68, 0xb3, 0x68, 0x19, 0xf0, 0x03, 0xfc, 0xa7, 0x1c, 0x05, 0xe0, 0x7c, 0x68, 0x33, + 0x69, 0x32, 0x68, 0x18, 0x68, 0xb3, 0x68, 0x19, 0xf0, 0x03, 0xfc, 0x38, 0xe7, 0xf5, 0x4b, 0x59, + 0x68, 0x1a, 0x42, 0x51, 0x41, 0x4a, 0xe7, 0xc9, 0x68, 0x32, 0x4b, 0x50, 0x68, 0x12, 0x60, 0x1a, + 0x25, 0x01, 0xe0, 0x69, 0x7a, 0x0b, 0x7a, 0x4a, 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, 0x7a, 0x8b, + 0x02, 0x1b, 0x43, 0x13, 0x7a, 0xca, 0x21, 0x00, 0x43, 0x1a, 0x92, 0x0b, 0x91, 0x0f, 0x68, 0x34, + 0x78, 0x23, 0x2b, 0x5f, 0xd1, 0x1c, 0x78, 0x63, 0x2b, 0x44, 0xd1, 0x19, 0x78, 0xa3, 0x2b, 0x56, + 0xd1, 0x16, 0x78, 0xe3, 0x2b, 0x44, 0xd1, 0x13, 0x4b, 0x40, 0x4c, 0x47, 0x22, 0x01, 0x60, 0x1a, + 0x60, 0x21, 0x68, 0xf3, 0x2b, 0x04, 0xd1, 0x06, 0x68, 0xb1, 0xa8, 0x0f, 0x22, 0x04, 0xf0, 0x04, + 0xfe, 0xc5, 0x9b, 0x0f, 0x60, 0x23, 0xf0, 0x04, 0xf8, 0x1f, 0x22, 0x01, 0x92, 0x09, 0xe7, 0x96, + 0x68, 0xf3, 0x2b, 0x04, 0xd1, 0x04, 0x68, 0xb1, 0xa8, 0x0f, 0x22, 0x04, 0xf0, 0x04, 0xfe, 0xb6, + 0x99, 0x0f, 0x1c, 0x20, 0xf0, 0x03, 0xff, 0x8c, 0x90, 0x0d, 0x28, 0x00, 0xd1, 0x02, 0x23, 0x01, + 0x93, 0x09, 0xe0, 0x25, 0x4a, 0x2d, 0x23, 0x01, 0x60, 0x13, 0x93, 0x09, 0xe7, 0x7f, 0xf0, 0x03, + 0xfd, 0x01, 0x1c, 0x05, 0x28, 0x00, 0xd1, 0x1f, 0x23, 0x01, 0x4a, 0x30, 0x42, 0x5b, 0x60, 0x13, + 0xe0, 0x1a, 0x4a, 0x26, 0x23, 0x01, 0x60, 0x13, 0x68, 0x33, 0x69, 0x31, 0x68, 0x18, 0x68, 0xb3, + 0x68, 0x1a, 0xf7, 0xff, 0xfc, 0x07, 0xe7, 0x90, 0x9a, 0x0d, 0x2a, 0x00, 0xd0, 0x08, 0x68, 0x33, + 0x69, 0x32, 0x68, 0x19, 0x68, 0xb3, 0x98, 0x0d, 0x68, 0x1b, 0xf0, 0x04, 0xf8, 0xb5, 0xe7, 0x5e, + 0x25, 0x01, 0xe0, 0x00, 0x25, 0x06, 0x42, 0x6d, 0x24, 0x01, 0x9a, 0x06, 0x00, 0xd3, 0x18, 0xf6, + 0x1c, 0x17, 0xe0, 0x05, 0x68, 0x30, 0x68, 0x71, 0xf7, 0xff, 0xfb, 0x26, 0x37, 0x01, 0x36, 0x08, + 0x9b, 0x07, 0x42, 0x9f, 0xdb, 0xf6, 0xe0, 0x02, 0x22, 0x01, 0x92, 0x0c, 0x24, 0x01, 0x9a, 0x04, + 0x68, 0x13, 0x2b, 0x00, 0xd1, 0x01, 0x26, 0x00, 0xe0, 0x04, 0x98, 0x08, 0x49, 0x14, 0xf7, 0xff, + 0xfb, 0x17, 0x26, 0x01, 0x2c, 0x00, 0xd1, 0x00, 0xe5, 0x1d, 0x98, 0x11, 0x1c, 0x29, 0xf7, 0xff, + 0xfa, 0xff, 0xe5, 0x18, 0x55, 0x4d, 0x53, 0x81, 0x55, 0x4d, 0x53, 0x10, 0x57, 0x46, 0x53, 0x02, + 0x55, 0x4d, 0x53, 0x82, 0x57, 0x46, 0x53, 0x01, 0x57, 0x46, 0x53, 0x03, 0x13, 0x70, 0x60, 0x0c, + 0x13, 0x70, 0x67, 0x48, 0x13, 0x70, 0x12, 0x99, 0x13, 0x70, 0x60, 0x34, 0x13, 0x72, 0xc3, 0xa0, + 0x13, 0x72, 0xc3, 0xa4, 0x13, 0x70, 0x67, 0x44, 0x13, 0x70, 0x60, 0x14, 0x13, 0x70, 0x60, 0x10, + 0x00, 0x98, 0x96, 0x80, 0xb5, 0x00, 0x4b, 0x04, 0xb0, 0x81, 0x1c, 0x01, 0x68, 0x18, 0xf7, 0xff, + 0xfa, 0xbb, 0xb0, 0x01, 0xbc, 0x01, 0x47, 0x00, 0x13, 0x70, 0x60, 0x28, 0xb5, 0x00, 0x4b, 0x0d, + 0x1c, 0x01, 0xb0, 0x81, 0x68, 0x18, 0x22, 0x20, 0xf7, 0xff, 0xfa, 0xea, 0x28, 0x00, 0xd1, 0x0d, + 0x48, 0x09, 0xf7, 0xff, 0xfa, 0xb9, 0xf0, 0x03, 0xff, 0xcd, 0x20, 0xc8, 0xf0, 0x00, 0xfa, 0x7c, + 0xf0, 0x03, 0xff, 0xbc, 0x20, 0xc8, 0xf0, 0x00, 0xfa, 0x77, 0xe7, 0xf4, 0xb0, 0x01, 0xbc, 0x02, + 0x47, 0x08, 0x46, 0xc0, 0x13, 0x70, 0x60, 0x28, 0x13, 0x70, 0x60, 0x6c, 0x4b, 0x02, 0x4a, 0x03, + 0x60, 0x18, 0x23, 0x00, 0x60, 0x13, 0x47, 0x70, 0x13, 0x70, 0x67, 0x60, 0x13, 0x70, 0x67, 0x58, + 0xb5, 0xf0, 0x4f, 0x1d, 0x21, 0x10, 0x68, 0x3b, 0x4d, 0x1c, 0x43, 0x8b, 0x60, 0x3b, 0x68, 0x2b, + 0x4e, 0x1b, 0x68, 0x9a, 0x68, 0x33, 0xb0, 0x81, 0x68, 0x54, 0x2b, 0x00, 0xd0, 0x11, 0x1c, 0x20, + 0xf0, 0x00, 0xf8, 0x36, 0x28, 0x00, 0xdc, 0x13, 0x23, 0x00, 0x60, 0x33, 0x4b, 0x15, 0x60, 0x18, + 0x20, 0x04, 0xf7, 0xff, 0xfa, 0x75, 0x68, 0x2b, 0x68, 0x9a, 0x23, 0x37, 0x40, 0x23, 0x60, 0x53, + 0xe0, 0x14, 0x4b, 0x11, 0x68, 0x1b, 0x2b, 0x00, 0xd0, 0x04, 0x1c, 0x20, 0xf0, 0x00, 0xf8, 0x20, + 0x68, 0x2b, 0x68, 0x9a, 0x23, 0x37, 0x40, 0x23, 0x60, 0x53, 0x68, 0x3b, 0x22, 0x10, 0x43, 0x13, + 0x4a, 0x0a, 0x60, 0x3b, 0x68, 0x13, 0x21, 0x10, 0x43, 0x0b, 0x60, 0x13, 0xb0, 0x01, 0x20, 0x00, + 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, 0x0d, 0x80, 0x00, 0x3c, 0x13, 0x70, 0x60, 0x34, + 0x13, 0x70, 0x67, 0x58, 0x13, 0x70, 0x67, 0x5c, 0x13, 0x70, 0x67, 0x60, 0x0d, 0x80, 0x00, 0x38, + 0x47, 0x18, 0x46, 0xc0, 0xb5, 0x70, 0x4d, 0x15, 0x4b, 0x15, 0x26, 0x02, 0x42, 0x76, 0x1c, 0x29, + 0x68, 0x18, 0x22, 0x00, 0x60, 0x2e, 0xf7, 0xff, 0xfa, 0x4b, 0x4b, 0x12, 0x22, 0x00, 0x68, 0x1b, + 0x4c, 0x11, 0x68, 0x9b, 0x60, 0x9a, 0x4b, 0x11, 0x68, 0x20, 0x60, 0x1a, 0xf7, 0xff, 0xfa, 0x1c, + 0x68, 0x20, 0xf7, 0xff, 0xfa, 0x1d, 0x23, 0x01, 0x42, 0x5b, 0x60, 0x23, 0x68, 0x2b, 0x2b, 0x00, + 0xd1, 0x03, 0x4b, 0x0b, 0x68, 0x1b, 0x60, 0x2b, 0xe0, 0x00, 0x60, 0x2e, 0x20, 0x04, 0xf7, 0xff, + 0xfa, 0x27, 0x4b, 0x02, 0x68, 0x18, 0xbc, 0x70, 0xbc, 0x02, 0x47, 0x08, 0x13, 0x70, 0x67, 0x64, + 0x13, 0x70, 0x60, 0x18, 0x13, 0x70, 0x60, 0x34, 0x13, 0x70, 0x60, 0x1c, 0x13, 0x70, 0x67, 0x58, + 0x13, 0x70, 0x67, 0x5c, 0xb5, 0x10, 0x4b, 0x0f, 0x1c, 0x04, 0x68, 0x1a, 0x1c, 0x08, 0x23, 0x01, + 0x49, 0x0d, 0xf7, 0xff, 0xf9, 0xf9, 0x4b, 0x0d, 0x21, 0x10, 0x60, 0x18, 0x48, 0x0c, 0xf0, 0x03, + 0xff, 0x47, 0x21, 0x10, 0x48, 0x0b, 0xf0, 0x03, 0xff, 0x37, 0x4b, 0x0b, 0x20, 0x04, 0x60, 0x1c, + 0x4b, 0x0a, 0x68, 0x1b, 0x68, 0x9a, 0x23, 0x37, 0x60, 0x93, 0xf7, 0xff, 0xf9, 0xf9, 0xbc, 0x10, + 0xbc, 0x01, 0x47, 0x00, 0x13, 0x70, 0x60, 0x18, 0x05, 0xf5, 0xe1, 0x00, 0x13, 0x70, 0x60, 0x1c, + 0x0d, 0x80, 0x00, 0x38, 0x0d, 0x80, 0x00, 0x3c, 0x13, 0x70, 0x67, 0x58, 0x13, 0x70, 0x60, 0x34, + 0xb5, 0x30, 0x4d, 0x11, 0x4a, 0x11, 0x68, 0x2b, 0xb0, 0x81, 0x40, 0x13, 0x60, 0x2b, 0x20, 0x80, + 0xf0, 0x03, 0xfd, 0xc0, 0x21, 0x20, 0xf7, 0xff, 0xfa, 0x07, 0x4c, 0x0d, 0x60, 0x20, 0x20, 0x04, + 0xf7, 0xff, 0xf9, 0xee, 0x68, 0x21, 0x22, 0x00, 0x20, 0x04, 0xf7, 0xff, 0xfa, 0x11, 0x68, 0x2a, + 0x23, 0x80, 0x02, 0x1b, 0x43, 0x1a, 0x60, 0x2a, 0x20, 0x04, 0xf7, 0xff, 0xf9, 0xc9, 0xb0, 0x01, + 0xbc, 0x30, 0xbc, 0x01, 0x47, 0x00, 0x46, 0xc0, 0x0d, 0x04, 0x00, 0xcc, 0xff, 0xff, 0x7f, 0xff, + 0x13, 0x70, 0x60, 0x18, 0xb5, 0x00, 0x4b, 0x06, 0x02, 0xc0, 0x68, 0x1a, 0x1c, 0x19, 0x68, 0x0b, + 0x1a, 0x9b, 0xd5, 0x00, 0x68, 0x0a, 0x42, 0x83, 0xd9, 0xf9, 0xbc, 0x01, 0x47, 0x00, 0x46, 0xc0, + 0x0d, 0x80, 0x00, 0x10, 0xb5, 0x00, 0x4b, 0x19, 0x4a, 0x19, 0x78, 0x1b, 0xb0, 0x81, 0x1e, 0x59, + 0x41, 0x8b, 0x60, 0x13, 0xf0, 0x03, 0xff, 0x1c, 0x1c, 0x03, 0x48, 0x16, 0x21, 0x04, 0x60, 0x03, + 0xf7, 0xff, 0xf9, 0xba, 0xf0, 0x03, 0xff, 0x08, 0x22, 0x00, 0x1c, 0x01, 0x48, 0x12, 0xf0, 0x03, + 0xfe, 0xbd, 0x21, 0xa0, 0x02, 0x49, 0x48, 0x11, 0xf7, 0xff, 0xf9, 0x6e, 0x4b, 0x10, 0x21, 0x80, + 0x60, 0x18, 0xf7, 0xff, 0xf9, 0xb5, 0x21, 0x20, 0xf7, 0xff, 0xf9, 0xb6, 0x4b, 0x0d, 0x60, 0x18, + 0xf0, 0x00, 0xfd, 0x7c, 0x28, 0x00, 0xda, 0x02, 0x20, 0x01, 0x42, 0x40, 0xe0, 0x02, 0xf7, 0xff, + 0xfb, 0x7d, 0x20, 0x00, 0xb0, 0x01, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, 0x13, 0x70, 0x01, 0x0c, + 0x13, 0x70, 0x67, 0x78, 0x13, 0x72, 0xc0, 0x00, 0x13, 0x70, 0x0f, 0x21, 0x13, 0x71, 0x80, 0x00, + 0x13, 0x70, 0x60, 0x28, 0x13, 0x70, 0x60, 0x20, 0xb5, 0x70, 0x1c, 0x0c, 0x1c, 0x05, 0xf7, 0xff, + 0xf9, 0x9f, 0x1c, 0x06, 0x20, 0x01, 0x42, 0x40, 0xf7, 0xff, 0xf9, 0x86, 0x68, 0x22, 0x4b, 0x11, + 0x42, 0x9a, 0xd1, 0x18, 0x4b, 0x10, 0x49, 0x11, 0x22, 0x01, 0x43, 0x13, 0x60, 0x4b, 0x22, 0x08, + 0x1c, 0x20, 0xf0, 0x04, 0xfc, 0xc3, 0x1c, 0x20, 0x21, 0x08, 0xf7, 0xff, 0xf9, 0x65, 0x1b, 0x63, + 0x4a, 0x0b, 0x08, 0x9b, 0x3b, 0x02, 0x40, 0x13, 0x4a, 0x0a, 0x1c, 0x28, 0x43, 0x13, 0x60, 0x2b, + 0x21, 0x04, 0xf7, 0xff, 0xf9, 0x59, 0x1c, 0x30, 0xf7, 0xff, 0xf9, 0x66, 0xbc, 0x70, 0xbc, 0x01, + 0x47, 0x00, 0x46, 0xc0, 0xe6, 0x00, 0x01, 0x70, 0x13, 0x70, 0x02, 0x71, 0x13, 0x70, 0x60, 0x2c, + 0x00, 0xff, 0xff, 0xff, 0xea, 0x00, 0x00, 0x00, 0xb5, 0x30, 0x1c, 0x04, 0xb0, 0x81, 0xf7, 0xff, + 0xf9, 0x1f, 0x2c, 0x26, 0xd0, 0x42, 0x2c, 0x26, 0xd8, 0x05, 0x2c, 0x24, 0xd0, 0x09, 0x2c, 0x25, + 0xd0, 0x00, 0xe0, 0x97, 0xe0, 0x0e, 0x2c, 0x39, 0xd0, 0x64, 0x2c, 0x3c, 0xd0, 0x00, 0xe0, 0x91, + 0xe0, 0x62, 0x49, 0x4b, 0x4b, 0x4b, 0x48, 0x4c, 0x60, 0x4b, 0x22, 0x08, 0xf0, 0x04, 0xfc, 0x86, + 0x48, 0x49, 0xe0, 0x84, 0x49, 0x49, 0x48, 0x4a, 0xf7, 0xff, 0xff, 0xa6, 0x4c, 0x44, 0x48, 0x49, + 0x4b, 0x49, 0x1c, 0x22, 0x60, 0x63, 0x1c, 0x03, 0xca, 0x22, 0xc3, 0x22, 0x21, 0x08, 0xf7, 0xff, + 0xf9, 0x1b, 0x48, 0x46, 0x4b, 0x46, 0x1c, 0x22, 0x60, 0x63, 0x1c, 0x03, 0xca, 0x22, 0xc3, 0x22, + 0x21, 0x08, 0xf7, 0xff, 0xf9, 0x11, 0x48, 0x43, 0x4b, 0x43, 0x1c, 0x22, 0x60, 0x63, 0x1c, 0x03, + 0xca, 0x22, 0xc3, 0x22, 0x21, 0x08, 0xf7, 0xff, 0xf9, 0x07, 0x4b, 0x36, 0x48, 0x3f, 0x60, 0x63, + 0x1c, 0x21, 0x22, 0x08, 0xf0, 0x04, 0xfc, 0x5a, 0x48, 0x3c, 0xe0, 0x58, 0x49, 0x3c, 0x48, 0x3d, + 0xf7, 0xff, 0xff, 0x7a, 0x4c, 0x2e, 0x48, 0x33, 0x4b, 0x3b, 0x1c, 0x22, 0x60, 0x63, 0x1c, 0x03, + 0xca, 0x22, 0xc3, 0x22, 0x21, 0x08, 0xf7, 0xff, 0xf8, 0xef, 0x48, 0x30, 0x4b, 0x37, 0x1c, 0x22, + 0x60, 0x63, 0x1c, 0x03, 0xca, 0x22, 0xc3, 0x22, 0x21, 0x08, 0xf7, 0xff, 0xf8, 0xe5, 0x48, 0x2d, + 0x4b, 0x33, 0x1c, 0x22, 0x60, 0x63, 0x1c, 0x03, 0xca, 0x22, 0xc3, 0x22, 0x21, 0x08, 0xf7, 0xff, + 0xf8, 0xdb, 0x4b, 0x20, 0x48, 0x2f, 0x60, 0x63, 0x1c, 0x21, 0x22, 0x08, 0xf0, 0x04, 0xfc, 0x2e, + 0x48, 0x2c, 0xe0, 0x2c, 0x48, 0x2c, 0xe0, 0x00, 0x48, 0x2c, 0x49, 0x2d, 0xf7, 0xff, 0xff, 0x4c, + 0x4c, 0x17, 0x48, 0x1c, 0x4b, 0x2b, 0x1c, 0x22, 0x60, 0x63, 0x1c, 0x03, 0xca, 0x22, 0xc3, 0x22, + 0x21, 0x08, 0xf7, 0xff, 0xf8, 0xc1, 0x48, 0x19, 0x4b, 0x27, 0x1c, 0x22, 0x60, 0x63, 0x1c, 0x03, + 0xca, 0x22, 0xc3, 0x22, 0x21, 0x08, 0xf7, 0xff, 0xf8, 0xb7, 0x48, 0x16, 0x4b, 0x23, 0x1c, 0x22, + 0x60, 0x63, 0x1c, 0x03, 0xca, 0x22, 0xc3, 0x22, 0x21, 0x08, 0xf7, 0xff, 0xf8, 0xad, 0x4b, 0x09, + 0x48, 0x1f, 0x60, 0x63, 0x1c, 0x21, 0x22, 0x08, 0xf0, 0x04, 0xfc, 0x00, 0x48, 0x1c, 0x21, 0x08, + 0xf7, 0xff, 0xf8, 0xa2, 0xb0, 0x01, 0x20, 0x00, 0xbc, 0x30, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, + 0x13, 0x70, 0x60, 0x2c, 0x13, 0x70, 0x00, 0x60, 0xff, 0xff, 0x1e, 0x78, 0x20, 0x20, 0x40, 0x8c, + 0x20, 0x20, 0x5d, 0xe8, 0x13, 0x70, 0x00, 0xbc, 0xff, 0xff, 0x1f, 0x70, 0x13, 0x70, 0x00, 0xc4, + 0xff, 0xff, 0x1f, 0x8c, 0x13, 0x70, 0x00, 0xcc, 0xff, 0xff, 0x1e, 0x34, 0xff, 0xff, 0x1f, 0x68, + 0x20, 0x20, 0x3e, 0x6c, 0x20, 0x20, 0x5b, 0x14, 0xff, 0xff, 0x1e, 0xb0, 0xff, 0xff, 0x1e, 0xcc, + 0xff, 0xff, 0x1d, 0x74, 0xff, 0xff, 0x1e, 0xa8, 0x20, 0x20, 0x5e, 0x84, 0x20, 0x20, 0x5d, 0x94, + 0x20, 0x20, 0x3f, 0x60, 0xff, 0xff, 0x21, 0x30, 0xff, 0xff, 0x21, 0x4c, 0xff, 0xff, 0x1f, 0xf4, + 0xff, 0xff, 0x21, 0x28, 0xb5, 0x30, 0x4d, 0x0c, 0xb0, 0x81, 0x23, 0x00, 0x68, 0x2a, 0x49, 0x0b, + 0xf7, 0xff, 0xf8, 0x3a, 0x4c, 0x0a, 0x49, 0x0b, 0x22, 0x00, 0x60, 0x20, 0x68, 0x28, 0xf7, 0xff, + 0xf8, 0x4f, 0x68, 0x20, 0xf7, 0xff, 0xf8, 0x28, 0x68, 0x20, 0xf7, 0xff, 0xf8, 0x29, 0xb0, 0x01, + 0xbc, 0x30, 0xbc, 0x01, 0x47, 0x00, 0x46, 0xc0, 0x13, 0x70, 0x60, 0x20, 0x00, 0x98, 0x96, 0x80, + 0x13, 0x70, 0x60, 0x24, 0x13, 0x70, 0x67, 0x68, 0xb5, 0x00, 0x1c, 0x03, 0x01, 0x40, 0x1a, 0xc0, + 0x00, 0x80, 0x18, 0xc0, 0xb0, 0x81, 0x00, 0xc0, 0xf7, 0xff, 0xff, 0xd4, 0xb0, 0x01, 0xbc, 0x01, + 0x47, 0x00, 0x46, 0xc0, 0xb5, 0xf0, 0xb0, 0x83, 0x93, 0x00, 0x46, 0x94, 0x06, 0x0b, 0x0e, 0x0a, + 0x26, 0xff, 0x43, 0x1a, 0x02, 0x36, 0x1c, 0x0b, 0x40, 0x33, 0x02, 0x1b, 0x25, 0xff, 0x43, 0x1a, + 0x04, 0x2d, 0x1c, 0x0b, 0x40, 0x2b, 0x0a, 0x1b, 0x43, 0x1a, 0x90, 0x01, 0x60, 0xc2, 0x9a, 0x01, + 0x23, 0x00, 0x62, 0x13, 0x4b, 0x2a, 0x1c, 0x0a, 0x40, 0x1a, 0x23, 0x80, 0x01, 0x5b, 0x1a, 0x98, + 0x45, 0x84, 0xd2, 0x01, 0x46, 0x64, 0xe0, 0x2f, 0x23, 0x80, 0x01, 0x5b, 0x18, 0xca, 0x4b, 0x25, + 0x1c, 0x11, 0x1c, 0x04, 0x1c, 0x2e, 0x40, 0x19, 0x98, 0x01, 0x27, 0x01, 0x25, 0x00, 0xe0, 0x18, + 0x06, 0x0b, 0x0e, 0x0a, 0x43, 0x1a, 0x23, 0xff, 0x02, 0x1b, 0x40, 0x0b, 0x02, 0x1b, 0x43, 0x1a, + 0x1c, 0x0b, 0x40, 0x33, 0x0a, 0x1b, 0x43, 0x1a, 0x61, 0x02, 0x22, 0x80, 0x01, 0x52, 0x18, 0xa4, + 0x62, 0x45, 0x45, 0x64, 0xd3, 0x00, 0x46, 0x64, 0x23, 0x80, 0x01, 0x5b, 0x18, 0xc9, 0x37, 0x01, + 0x30, 0x04, 0x45, 0x64, 0xd2, 0x01, 0x2f, 0x04, 0xdd, 0xe2, 0x45, 0x64, 0xd0, 0x04, 0x1c, 0x20, + 0x99, 0x08, 0xf0, 0x04, 0xfa, 0xd9, 0x1a, 0x64, 0x9b, 0x00, 0x04, 0x22, 0x43, 0x1a, 0x06, 0x13, + 0x0e, 0x11, 0x43, 0x19, 0x23, 0xff, 0x02, 0x1b, 0x40, 0x13, 0x02, 0x1b, 0x43, 0x19, 0x23, 0xff, + 0x04, 0x1b, 0x40, 0x1a, 0x0a, 0x12, 0x43, 0x11, 0x23, 0x80, 0x9a, 0x01, 0x04, 0x5b, 0xb0, 0x03, + 0x1c, 0x20, 0x60, 0x91, 0x64, 0x14, 0x60, 0x13, 0x60, 0x53, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, + 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xf0, 0x00, 0xb5, 0xf0, 0x26, 0xff, 0x25, 0xff, 0x22, 0x03, + 0x02, 0x36, 0x04, 0x2d, 0x46, 0x94, 0x4f, 0x18, 0xe0, 0x1e, 0x68, 0x82, 0x06, 0x13, 0x0e, 0x11, + 0x43, 0x19, 0x1c, 0x13, 0x40, 0x33, 0x02, 0x1b, 0x43, 0x19, 0x40, 0x2a, 0x0a, 0x12, 0x1c, 0x0c, + 0x43, 0x14, 0x0a, 0x23, 0x46, 0x62, 0x40, 0x13, 0x2b, 0x02, 0xd0, 0x07, 0x6b, 0xc1, 0x6c, 0x03, + 0x69, 0x4a, 0x18, 0xd2, 0x0c, 0x23, 0x40, 0x3b, 0x1a, 0xd2, 0x61, 0x4a, 0x6c, 0x03, 0x2b, 0x00, + 0xd0, 0x01, 0x06, 0x63, 0xd4, 0x03, 0x6b, 0x80, 0x28, 0x00, 0xd1, 0xde, 0xe0, 0x04, 0x6b, 0xc2, + 0x23, 0x01, 0x42, 0x5b, 0x61, 0x53, 0x1c, 0x18, 0x4b, 0x04, 0x68, 0x1a, 0x23, 0x00, 0x64, 0x13, + 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, 0x00, 0x00, 0x7f, 0xff, 0x13, 0x70, 0x60, 0x34, + 0xb5, 0x00, 0x07, 0x43, 0xd5, 0x15, 0x4b, 0x0c, 0x4a, 0x0c, 0x68, 0x1b, 0x68, 0x99, 0x6c, 0x4b, + 0x40, 0x13, 0x2b, 0x03, 0xd1, 0x02, 0x23, 0x80, 0x01, 0x9b, 0x64, 0x4b, 0x4b, 0x06, 0x4a, 0x07, + 0x68, 0x1b, 0x68, 0x99, 0x6c, 0x8b, 0x40, 0x13, 0x2b, 0x03, 0xd1, 0x02, 0x23, 0x80, 0x01, 0x9b, + 0x64, 0x8b, 0xbc, 0x01, 0x47, 0x00, 0x46, 0xc0, 0x13, 0x70, 0x60, 0x34, 0x00, 0x00, 0x20, 0x03, + 0xb5, 0xf0, 0x07, 0x43, 0xd5, 0x21, 0x24, 0x80, 0x4e, 0x11, 0x4d, 0x12, 0x4f, 0x12, 0x20, 0x00, + 0x01, 0xa4, 0x68, 0x33, 0x00, 0x82, 0x68, 0x9b, 0x33, 0x44, 0x18, 0x99, 0x68, 0x2b, 0x68, 0x0a, + 0x42, 0x98, 0xd1, 0x0a, 0x07, 0xd3, 0xd4, 0x0d, 0x4a, 0x0c, 0x23, 0x02, 0x49, 0x0c, 0x60, 0x13, + 0x68, 0x0b, 0x22, 0x20, 0x43, 0x93, 0x60, 0x0b, 0xe0, 0x04, 0x1c, 0x13, 0x40, 0x3b, 0x2b, 0x03, + 0xd1, 0x00, 0x60, 0x0c, 0x30, 0x01, 0x28, 0x04, 0xd1, 0xe3, 0xbc, 0xf0, 0xbc, 0x01, 0x47, 0x00, + 0x13, 0x70, 0x60, 0x34, 0x13, 0x70, 0x67, 0x78, 0x00, 0x00, 0x20, 0x03, 0x13, 0x70, 0x67, 0x6c, + 0x0d, 0x80, 0x00, 0xc0, 0xb5, 0x00, 0x4b, 0x0a, 0x22, 0x80, 0x68, 0x1b, 0x01, 0x92, 0x68, 0x99, + 0x6c, 0x4b, 0x42, 0x13, 0xd1, 0x00, 0x64, 0x4a, 0x4b, 0x05, 0x22, 0x80, 0x68, 0x1b, 0x01, 0x92, + 0x68, 0x99, 0x6c, 0x8b, 0x42, 0x13, 0xd1, 0x00, 0x64, 0x8a, 0x20, 0x00, 0xbc, 0x02, 0x47, 0x08, + 0x13, 0x70, 0x60, 0x34, 0xb5, 0x00, 0x28, 0x00, 0xd0, 0x02, 0x23, 0x01, 0x42, 0x5b, 0x62, 0x03, + 0x20, 0x00, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, 0x4b, 0x06, 0x49, 0x07, 0x78, 0x1a, 0x68, 0x08, + 0x1e, 0x53, 0x41, 0x9a, 0x4b, 0x05, 0x60, 0x1a, 0x00, 0x93, 0x18, 0x9b, 0x00, 0xdb, 0x33, 0x58, + 0x18, 0xc0, 0x47, 0x70, 0x13, 0x70, 0x01, 0x0c, 0x13, 0x70, 0x60, 0x34, 0x13, 0x70, 0x67, 0x78, + 0xb5, 0x10, 0x1c, 0x18, 0x4b, 0x12, 0x1c, 0x14, 0x78, 0x1a, 0x1e, 0x53, 0x41, 0x9a, 0x4b, 0x11, + 0x60, 0x1a, 0x4b, 0x11, 0x68, 0x19, 0x00, 0x93, 0x18, 0x9b, 0x00, 0xdb, 0x18, 0xc9, 0x6f, 0x0b, + 0x2b, 0x00, 0xd0, 0x10, 0x23, 0x00, 0x80, 0x03, 0x80, 0x43, 0x31, 0x60, 0x88, 0x0b, 0x04, 0x1b, + 0x0a, 0x1a, 0x0e, 0x1b, 0x43, 0x1a, 0x80, 0x82, 0x88, 0x4b, 0x04, 0x1b, 0x0a, 0x1a, 0x0e, 0x1b, + 0x43, 0x1a, 0x80, 0xc2, 0x23, 0x01, 0x20, 0x00, 0x70, 0x23, 0xbc, 0x10, 0xbc, 0x02, 0x47, 0x08, + 0x13, 0x70, 0x01, 0x0c, 0x13, 0x70, 0x67, 0x78, 0x13, 0x70, 0x60, 0x34, 0xb5, 0xf0, 0xb0, 0x81, + 0x1c, 0x07, 0x28, 0x00, 0xd1, 0x04, 0x4a, 0x20, 0x23, 0x30, 0x70, 0x13, 0x70, 0x50, 0xe0, 0x36, + 0x4d, 0x1e, 0x1c, 0x06, 0x1c, 0x30, 0x21, 0x0a, 0xf0, 0x04, 0xf9, 0xb6, 0x1c, 0x30, 0x1c, 0x0c, + 0x21, 0x0a, 0xf0, 0x04, 0xf9, 0x67, 0x17, 0xe3, 0x18, 0xe4, 0x40, 0x5c, 0x34, 0x30, 0x4b, 0x18, + 0x70, 0x2c, 0x3d, 0x01, 0x1c, 0x06, 0x42, 0x9d, 0xd1, 0xec, 0x1c, 0x2a, 0x3a, 0x0f, 0x23, 0x00, + 0x76, 0x93, 0x2f, 0x00, 0xdb, 0x01, 0x20, 0x00, 0xe0, 0x02, 0x23, 0x2d, 0x70, 0x13, 0x20, 0x01, + 0x22, 0x10, 0x49, 0x0d, 0xe0, 0x00, 0x32, 0x01, 0x5c, 0x8b, 0x2b, 0x30, 0xd0, 0xfb, 0x2b, 0x00, + 0xd1, 0x00, 0x3a, 0x01, 0x4b, 0x08, 0x18, 0x99, 0x18, 0x1b, 0xe0, 0x02, 0x70, 0x1a, 0x30, 0x01, + 0x33, 0x01, 0x78, 0x0a, 0x31, 0x01, 0x2a, 0x00, 0xd1, 0xf8, 0x4b, 0x03, 0x54, 0x1a, 0xb0, 0x01, + 0xbc, 0xf0, 0xbc, 0x01, 0x47, 0x00, 0x46, 0xc0, 0x13, 0x72, 0xc1, 0xe0, 0x13, 0x72, 0xc1, 0xf9, + 0x13, 0x72, 0xc1, 0xef, 0xb5, 0xf0, 0xb0, 0x81, 0x1c, 0x06, 0x28, 0x00, 0xd1, 0x04, 0x4a, 0x1a, + 0x23, 0x30, 0x70, 0x13, 0x70, 0x50, 0xe0, 0x2a, 0x4d, 0x18, 0x1c, 0x2f, 0x3f, 0x0a, 0x1c, 0x30, + 0x21, 0x0a, 0xf0, 0x04, 0xf9, 0x17, 0x1c, 0x30, 0x1c, 0x0c, 0x21, 0x0a, 0xf0, 0x04, 0xf8, 0xd4, + 0x34, 0x30, 0x70, 0x2c, 0x3d, 0x01, 0x1c, 0x06, 0x42, 0xbd, 0xd1, 0xf0, 0x1c, 0x2a, 0x23, 0x00, + 0x3a, 0x0f, 0x76, 0x93, 0x23, 0x10, 0xe0, 0x00, 0x33, 0x01, 0x5c, 0xd1, 0x29, 0x30, 0xd0, 0xfb, + 0x29, 0x00, 0xd1, 0x00, 0x3b, 0x01, 0x48, 0x08, 0x22, 0x00, 0x18, 0xc1, 0x1c, 0x04, 0xe0, 0x01, + 0x54, 0xa3, 0x32, 0x01, 0x78, 0x0b, 0x31, 0x01, 0x2b, 0x00, 0xd1, 0xf9, 0x54, 0x83, 0xb0, 0x01, + 0xbc, 0xf0, 0xbc, 0x01, 0x47, 0x00, 0x46, 0xc0, 0x13, 0x72, 0xc1, 0xe0, 0x13, 0x72, 0xc1, 0xf9, + 0xb5, 0x10, 0x28, 0x00, 0xd1, 0x04, 0x4a, 0x19, 0x23, 0x30, 0x70, 0x13, 0x70, 0x50, 0xe0, 0x2a, + 0x4a, 0x17, 0x24, 0x0f, 0x1c, 0x11, 0x39, 0x08, 0x1c, 0x03, 0x40, 0x23, 0x09, 0x00, 0x2b, 0x09, + 0xdd, 0x00, 0x33, 0x07, 0x33, 0x30, 0x70, 0x13, 0x3a, 0x01, 0x42, 0x8a, 0xd1, 0xf4, 0x3a, 0x0f, + 0x23, 0x00, 0x76, 0x13, 0x23, 0x30, 0x70, 0x13, 0x23, 0x78, 0x70, 0x53, 0x23, 0x10, 0xe0, 0x00, + 0x33, 0x01, 0x5c, 0xd1, 0x29, 0x30, 0xd0, 0xfb, 0x29, 0x00, 0xd1, 0x00, 0x3b, 0x01, 0x48, 0x07, + 0x22, 0x02, 0x18, 0xc1, 0x1c, 0x04, 0xe0, 0x01, 0x54, 0xa3, 0x32, 0x01, 0x78, 0x0b, 0x31, 0x01, + 0x2b, 0x00, 0xd1, 0xf9, 0x54, 0x83, 0xbc, 0x10, 0xbc, 0x01, 0x47, 0x00, 0x13, 0x72, 0xc1, 0xe0, + 0x13, 0x72, 0xc1, 0xf7, 0xb5, 0x00, 0x28, 0x00, 0xd0, 0x01, 0x23, 0x00, 0x60, 0x03, 0x4b, 0x0c, + 0x78, 0x1b, 0x2b, 0x01, 0xd1, 0x11, 0x4b, 0x0b, 0x78, 0x1a, 0x2a, 0x10, 0xd0, 0x0d, 0x28, 0x00, + 0xd0, 0x04, 0x4b, 0x09, 0x32, 0x04, 0x00, 0x92, 0x58, 0xd3, 0x60, 0x03, 0x4b, 0x05, 0x4a, 0x06, + 0x78, 0x1b, 0x33, 0x14, 0x00, 0x9b, 0x58, 0x98, 0xe0, 0x00, 0x20, 0x00, 0xbc, 0x02, 0x47, 0x08, + 0x13, 0x70, 0x67, 0x9c, 0x13, 0x70, 0x60, 0x3c, 0x13, 0x72, 0xc2, 0x00, 0xb5, 0xf0, 0x4a, 0x67, + 0xb0, 0x8b, 0x68, 0x13, 0x2b, 0x00, 0xd1, 0x06, 0x4b, 0x65, 0x68, 0x19, 0x69, 0x8b, 0x60, 0x13, + 0x6a, 0x0b, 0x4a, 0x64, 0x60, 0x13, 0x4b, 0x63, 0x4f, 0x61, 0x68, 0x1d, 0x26, 0x00, 0x1c, 0x34, + 0x68, 0x3b, 0x34, 0x08, 0x00, 0xa4, 0x50, 0xe5, 0x68, 0x3b, 0x21, 0x00, 0x58, 0xe0, 0x22, 0x60, + 0xf0, 0x04, 0xf9, 0x70, 0x68, 0x3b, 0x21, 0x60, 0x58, 0xe0, 0xf0, 0x03, 0xf9, 0xd3, 0x1c, 0x2b, + 0x33, 0x7f, 0x1c, 0x1d, 0x21, 0x1f, 0x36, 0x01, 0x43, 0x8d, 0x2e, 0x08, 0xd1, 0xe7, 0x24, 0x00, + 0x26, 0x1f, 0x1c, 0x28, 0x21, 0x00, 0x22, 0x60, 0xf0, 0x04, 0xf9, 0x5c, 0x1c, 0x28, 0x21, 0x60, + 0xf0, 0x03, 0xf9, 0xc0, 0x1c, 0x2b, 0x33, 0x7f, 0x1c, 0x1d, 0x34, 0x01, 0x43, 0xb5, 0x2c, 0x08, + 0xd1, 0xef, 0x4b, 0x4d, 0x4a, 0x4d, 0x60, 0x1d, 0x4b, 0x48, 0x92, 0x06, 0x21, 0x80, 0x22, 0xff, + 0x68, 0x1f, 0x05, 0xc9, 0x23, 0x00, 0x02, 0x12, 0x93, 0x08, 0x91, 0x02, 0x92, 0x01, 0x9b, 0x06, + 0x21, 0x00, 0x60, 0x1f, 0x22, 0x60, 0x1c, 0x38, 0xf0, 0x04, 0xf9, 0x3c, 0x1c, 0x38, 0xf0, 0x03, + 0xf9, 0x5b, 0x64, 0x78, 0x99, 0x06, 0x9b, 0x08, 0x68, 0x0a, 0x2b, 0x00, 0xd0, 0x01, 0x23, 0x80, + 0x04, 0x1b, 0x60, 0x53, 0x99, 0x06, 0x23, 0x00, 0x68, 0x0a, 0x60, 0x93, 0x68, 0x0b, 0x9a, 0x02, + 0x21, 0x1f, 0x61, 0x9a, 0x1c, 0x3b, 0x33, 0x7f, 0x9a, 0x06, 0x1c, 0x1f, 0x43, 0x8f, 0x68, 0x12, + 0x1c, 0x38, 0x92, 0x07, 0xf0, 0x03, 0xf9, 0x40, 0x1c, 0x06, 0x1c, 0x38, 0xf0, 0x03, 0xf9, 0x3c, + 0x1c, 0x04, 0x1c, 0x38, 0xf0, 0x03, 0xf9, 0x38, 0x1c, 0x05, 0x1c, 0x38, 0xf0, 0x03, 0xf9, 0x34, + 0x99, 0x01, 0x23, 0xff, 0x22, 0xff, 0x04, 0x12, 0x02, 0x1b, 0x93, 0x05, 0x40, 0x0c, 0x40, 0x15, + 0x23, 0xe0, 0x40, 0x1e, 0x21, 0x02, 0x02, 0x24, 0x0a, 0x2d, 0x0e, 0x00, 0x43, 0x0e, 0x43, 0x2c, + 0x92, 0x04, 0x43, 0x04, 0x9a, 0x07, 0x06, 0x36, 0x43, 0x34, 0x60, 0x14, 0x9b, 0x06, 0x68, 0x1a, + 0x23, 0x80, 0x04, 0x5b, 0x61, 0x13, 0x99, 0x06, 0x68, 0x0a, 0x61, 0x53, 0xc9, 0x01, 0x91, 0x06, + 0x21, 0x60, 0xf0, 0x03, 0xf9, 0x57, 0x9a, 0x08, 0x32, 0x01, 0x92, 0x08, 0x2a, 0x06, 0xd1, 0xa6, + 0x4b, 0x1a, 0x4f, 0x16, 0x93, 0x03, 0x69, 0x59, 0x68, 0x38, 0x91, 0x09, 0xf0, 0x03, 0xf9, 0x04, + 0x1c, 0x06, 0x68, 0x38, 0xf0, 0x03, 0xf9, 0x00, 0x1c, 0x04, 0x68, 0x38, 0xf0, 0x03, 0xf8, 0xfc, + 0x1c, 0x05, 0x68, 0x38, 0xf0, 0x03, 0xf8, 0xf8, 0x9a, 0x05, 0x9b, 0x04, 0x40, 0x14, 0x40, 0x1d, + 0x21, 0xe0, 0x0a, 0x2d, 0x22, 0x02, 0x40, 0x0e, 0x02, 0x24, 0x43, 0x2c, 0x43, 0x16, 0x0e, 0x00, + 0x9b, 0x09, 0x06, 0x36, 0x43, 0x04, 0x43, 0x34, 0x60, 0x1c, 0x99, 0x03, 0x69, 0x48, 0x21, 0x60, + 0xf0, 0x03, 0xf9, 0x28, 0xb0, 0x0b, 0xbc, 0xf0, 0xbc, 0x01, 0x47, 0x00, 0x13, 0x70, 0x67, 0xcc, + 0x13, 0x70, 0x60, 0x34, 0x13, 0x70, 0x67, 0xc8, 0x13, 0x70, 0x67, 0xc4, 0x13, 0x72, 0xc0, 0x20, + 0xb5, 0x30, 0xb0, 0x81, 0x1c, 0x04, 0xf0, 0x03, 0xf8, 0xcf, 0x21, 0x00, 0x1c, 0x05, 0x22, 0x60, + 0x1c, 0x20, 0xf0, 0x04, 0xf8, 0xa7, 0x23, 0x40, 0x60, 0xa3, 0x23, 0x80, 0x04, 0x5b, 0xb0, 0x01, + 0x63, 0x65, 0x60, 0x23, 0x60, 0x63, 0xbc, 0x30, 0xbc, 0x01, 0x47, 0x00, 0xb5, 0xf0, 0x4b, 0x1a, + 0xb0, 0x83, 0x68, 0x1d, 0x23, 0x00, 0x93, 0x01, 0x23, 0xff, 0x02, 0x1b, 0x27, 0xff, 0x26, 0x80, + 0x93, 0x00, 0x04, 0x3f, 0x04, 0x76, 0x1c, 0x28, 0xf7, 0xff, 0xff, 0xda, 0x9b, 0x01, 0x2b, 0x03, + 0xd0, 0x19, 0x1c, 0x2c, 0x23, 0x1f, 0x34, 0x7f, 0x43, 0x9c, 0x6b, 0x62, 0x1c, 0x28, 0x06, 0x13, + 0x0e, 0x11, 0x43, 0x19, 0x9b, 0x00, 0x60, 0x6e, 0x40, 0x13, 0x02, 0x1b, 0x40, 0x3a, 0x43, 0x19, + 0x0a, 0x12, 0x43, 0x11, 0x60, 0x29, 0x21, 0x60, 0xf0, 0x03, 0xf8, 0xdc, 0x9b, 0x01, 0x1c, 0x25, + 0x33, 0x01, 0x93, 0x01, 0xe7, 0xdf, 0x1c, 0x28, 0x21, 0x60, 0xf0, 0x03, 0xf8, 0xd3, 0xb0, 0x03, + 0xbc, 0xf0, 0xbc, 0x01, 0x47, 0x00, 0x46, 0xc0, 0x13, 0x70, 0x67, 0xc4, 0xb5, 0xf0, 0xb0, 0x83, + 0xf7, 0xff, 0xfe, 0xd4, 0xf7, 0xff, 0xff, 0xc2, 0x4d, 0x4b, 0x49, 0x4c, 0x68, 0x2a, 0x68, 0x0b, + 0x4f, 0x4b, 0x61, 0x93, 0x68, 0x2a, 0x68, 0x4b, 0x4e, 0x4a, 0x61, 0xd3, 0x68, 0x8b, 0x4a, 0x4a, + 0x60, 0x3b, 0x92, 0x01, 0x68, 0xcb, 0x60, 0x13, 0x69, 0x0b, 0x21, 0x60, 0x60, 0x33, 0x68, 0x2b, + 0x69, 0x98, 0xf0, 0x03, 0xf8, 0x97, 0x68, 0x2a, 0x69, 0x93, 0x64, 0xda, 0x68, 0x2b, 0x22, 0x00, + 0x69, 0x9b, 0x64, 0x9a, 0x68, 0x2b, 0x69, 0x9c, 0x1c, 0x20, 0xf0, 0x03, 0xf8, 0x5d, 0x64, 0x60, + 0x68, 0x33, 0x6c, 0x59, 0x68, 0x2b, 0x1c, 0x0a, 0x69, 0x98, 0x23, 0xff, 0x02, 0x1b, 0x40, 0x1a, + 0x23, 0xff, 0x04, 0x1b, 0x40, 0x0b, 0x0a, 0x1b, 0x02, 0x12, 0x43, 0x1a, 0x0e, 0x0b, 0x43, 0x1a, + 0x23, 0xe0, 0x40, 0x19, 0x23, 0x02, 0x43, 0x19, 0x06, 0x09, 0x43, 0x0a, 0x60, 0x02, 0x68, 0x2b, + 0x21, 0x60, 0x69, 0x9a, 0x23, 0x80, 0x04, 0x1b, 0x60, 0x53, 0x68, 0x2b, 0x22, 0x00, 0x69, 0x9b, + 0x60, 0x9a, 0x68, 0x2b, 0x69, 0x9a, 0x23, 0x80, 0x05, 0xdb, 0x61, 0x93, 0x68, 0x2b, 0x69, 0x9a, + 0x23, 0x80, 0x04, 0x5b, 0x61, 0x13, 0x68, 0x2a, 0x69, 0x92, 0x61, 0x53, 0x68, 0x2b, 0x69, 0x98, + 0xf0, 0x03, 0xf8, 0x70, 0x68, 0x2b, 0x21, 0x60, 0x69, 0xd8, 0xf0, 0x03, 0xf8, 0x53, 0x68, 0x2a, + 0x69, 0xd3, 0x64, 0xda, 0x68, 0x2b, 0x22, 0x00, 0x69, 0xdb, 0x64, 0x9a, 0x68, 0x2b, 0x69, 0xdc, + 0x1c, 0x20, 0xf0, 0x03, 0xf8, 0x19, 0x64, 0x60, 0x68, 0x38, 0x21, 0x60, 0xf0, 0x03, 0xf8, 0x42, + 0x68, 0x3a, 0x68, 0x2b, 0x64, 0xd3, 0x68, 0x3b, 0x22, 0x00, 0x64, 0x9a, 0x68, 0x3c, 0x1c, 0x20, + 0xf0, 0x03, 0xf8, 0x0a, 0x64, 0x60, 0x68, 0x38, 0x21, 0x60, 0xf0, 0x03, 0xf8, 0x4b, 0x9b, 0x01, + 0x21, 0x60, 0x68, 0x18, 0xf0, 0x03, 0xf8, 0x2e, 0x9b, 0x01, 0x68, 0x1a, 0x68, 0x2b, 0x64, 0xd3, + 0x9a, 0x01, 0x68, 0x13, 0x22, 0x00, 0x64, 0x9a, 0x9b, 0x01, 0x68, 0x1c, 0x1c, 0x20, 0xf0, 0x02, + 0xff, 0xf3, 0x64, 0x60, 0x9a, 0x01, 0x21, 0x60, 0x68, 0x10, 0xf0, 0x03, 0xf8, 0x33, 0xb0, 0x03, + 0xbc, 0xf0, 0xbc, 0x01, 0x47, 0x00, 0x46, 0xc0, 0x13, 0x70, 0x60, 0x34, 0x13, 0x72, 0xc0, 0x20, + 0x13, 0x70, 0x67, 0x7c, 0x13, 0x70, 0x67, 0x84, 0x13, 0x70, 0x67, 0x80, 0xb5, 0xf0, 0x4c, 0x23, + 0x4b, 0x23, 0xb0, 0x81, 0x60, 0x23, 0xf0, 0x03, 0xf8, 0x35, 0x28, 0x00, 0xda, 0x02, 0x20, 0x01, + 0x42, 0x40, 0xe0, 0x37, 0xf0, 0x03, 0xf9, 0x80, 0x60, 0x20, 0x68, 0x82, 0x4b, 0x1d, 0x21, 0x01, + 0x60, 0x13, 0x68, 0x20, 0x68, 0x82, 0x68, 0x13, 0x42, 0x0b, 0xd1, 0xfc, 0x21, 0xfc, 0xf0, 0x03, + 0xf8, 0x09, 0x27, 0x80, 0x26, 0x80, 0x4c, 0x15, 0x25, 0x00, 0x04, 0x7f, 0x01, 0x76, 0x68, 0x23, + 0x21, 0x04, 0x6c, 0xdb, 0x51, 0x5f, 0x68, 0x23, 0x6c, 0xdb, 0x59, 0x58, 0x35, 0x04, 0xf0, 0x02, + 0xff, 0xf9, 0x42, 0xb5, 0xd1, 0xf3, 0xf7, 0xff, 0xff, 0x29, 0x68, 0x23, 0x22, 0x01, 0x33, 0x54, + 0x70, 0x1a, 0x68, 0x23, 0x20, 0x00, 0x68, 0x9a, 0x69, 0x9b, 0x6c, 0x5b, 0x61, 0x93, 0x68, 0x23, + 0x68, 0x9a, 0x23, 0x04, 0x60, 0x93, 0x68, 0x23, 0x68, 0x9a, 0x4b, 0x07, 0x60, 0x13, 0x68, 0x23, + 0x68, 0x9b, 0x68, 0x1b, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x13, 0x70, 0x60, 0x34, + 0x13, 0x72, 0xc2, 0xa4, 0x00, 0x01, 0x00, 0x20, 0x00, 0x01, 0x00, 0x21, 0xb5, 0x10, 0x4b, 0x0c, + 0x68, 0x18, 0x6c, 0x01, 0x29, 0x07, 0xdd, 0x01, 0x24, 0x00, 0xe0, 0x0d, 0x4b, 0x09, 0x68, 0x1b, + 0x00, 0xdb, 0x18, 0x5b, 0x00, 0x5a, 0x18, 0xd2, 0x6a, 0x03, 0x01, 0x52, 0x18, 0x9c, 0x1c, 0x4b, + 0x64, 0x03, 0x1c, 0x20, 0xf7, 0xff, 0xfe, 0xa4, 0x1c, 0x20, 0xbc, 0x10, 0xbc, 0x02, 0x47, 0x08, + 0x13, 0x70, 0x60, 0x34, 0x13, 0x70, 0x67, 0x70, 0xb5, 0xf0, 0xb0, 0x8d, 0x1c, 0x05, 0xf7, 0xff, + 0xff, 0xdd, 0x90, 0x08, 0x28, 0x00, 0xd1, 0x00, 0xe0, 0xad, 0x63, 0xc5, 0x23, 0x00, 0x61, 0x6b, + 0x7e, 0x6b, 0x69, 0x2a, 0x93, 0x07, 0x7e, 0x2b, 0x92, 0x0a, 0x2b, 0x00, 0xd0, 0x02, 0x9c, 0x08, + 0x26, 0x80, 0xe0, 0x26, 0x23, 0x08, 0x93, 0x00, 0x23, 0xa0, 0x68, 0x69, 0x22, 0x08, 0x00, 0x9b, + 0x98, 0x08, 0xf7, 0xff, 0xfb, 0x57, 0xf7, 0xff, 0xff, 0xc1, 0x1c, 0x04, 0x28, 0x00, 0xd1, 0x00, + 0xe0, 0x91, 0x6b, 0x42, 0x63, 0xc5, 0x06, 0x13, 0x0e, 0x11, 0x43, 0x19, 0x23, 0xff, 0x02, 0x1b, + 0x40, 0x13, 0x02, 0x1b, 0x43, 0x19, 0x23, 0xff, 0x04, 0x1b, 0x40, 0x1a, 0x0a, 0x12, 0x43, 0x11, + 0x9a, 0x08, 0x60, 0x11, 0x63, 0x90, 0x9b, 0x0a, 0x2b, 0x00, 0xd1, 0x01, 0x4e, 0x40, 0xe0, 0x00, + 0x4e, 0x40, 0x68, 0xea, 0x9b, 0x07, 0x92, 0x09, 0x2b, 0x00, 0xd0, 0x02, 0x23, 0x80, 0x00, 0x5b, + 0x43, 0x1e, 0x69, 0xea, 0x4b, 0x3c, 0x27, 0xff, 0x40, 0x13, 0x93, 0x0b, 0x3b, 0x01, 0x22, 0x80, + 0x93, 0x04, 0x23, 0xff, 0x04, 0x52, 0x02, 0x1b, 0x92, 0x05, 0x93, 0x03, 0x04, 0x3f, 0x9a, 0x0b, + 0x1c, 0x33, 0x92, 0x00, 0x1c, 0x20, 0x9a, 0x0a, 0x99, 0x09, 0xf7, 0xff, 0xfb, 0x1b, 0x9b, 0x0a, + 0x9a, 0x09, 0x1a, 0x1b, 0x93, 0x0a, 0x9b, 0x07, 0x18, 0x12, 0x92, 0x09, 0x2b, 0x00, 0xd0, 0x01, + 0x9a, 0x05, 0x60, 0x62, 0x9a, 0x04, 0x18, 0x13, 0x9a, 0x0b, 0x42, 0x13, 0xd1, 0x01, 0x4b, 0x2b, + 0x18, 0xf6, 0x9a, 0x0a, 0x2a, 0x00, 0xdd, 0x13, 0xf7, 0xff, 0xff, 0x70, 0x28, 0x00, 0xd0, 0x42, + 0x6b, 0x42, 0x63, 0xc5, 0x06, 0x13, 0x0e, 0x11, 0x43, 0x19, 0x9b, 0x03, 0x63, 0xa0, 0x40, 0x13, + 0x02, 0x1b, 0x40, 0x3a, 0x43, 0x19, 0x0a, 0x12, 0x43, 0x11, 0x60, 0x21, 0x1c, 0x04, 0xe7, 0xce, + 0x23, 0x80, 0x04, 0x5b, 0x60, 0x63, 0x69, 0x2b, 0x1c, 0x27, 0x2b, 0x00, 0xd0, 0x24, 0x7e, 0x2b, + 0x93, 0x06, 0x2b, 0x00, 0xd1, 0x20, 0xf7, 0xff, 0xff, 0x51, 0x1c, 0x04, 0x28, 0x00, 0xd0, 0x22, + 0x6b, 0x42, 0x63, 0xc5, 0x06, 0x13, 0x0e, 0x11, 0x43, 0x19, 0x23, 0xff, 0x02, 0x1b, 0x40, 0x13, + 0x02, 0x1b, 0x43, 0x19, 0x23, 0xff, 0x04, 0x1b, 0x40, 0x1a, 0x0a, 0x12, 0x23, 0x80, 0x43, 0x11, + 0x00, 0x5b, 0x4a, 0x0e, 0x60, 0x39, 0x63, 0xb8, 0x40, 0x73, 0x43, 0x13, 0x9a, 0x06, 0x21, 0x00, + 0x92, 0x00, 0x22, 0x00, 0xf7, 0xff, 0xfa, 0xc6, 0x68, 0xa3, 0x22, 0x80, 0x04, 0x12, 0x43, 0x13, + 0x60, 0xa3, 0x98, 0x08, 0xe0, 0x00, 0x20, 0x00, 0xb0, 0x0d, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, + 0x80, 0x00, 0x01, 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x07, 0xff, 0x80, 0x00, 0x00, 0x00, + 0xb5, 0xf0, 0x7c, 0x83, 0x7c, 0xc2, 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, 0x7d, 0x03, 0xb0, 0x85, + 0x02, 0x1b, 0x43, 0x13, 0x7d, 0x42, 0x1c, 0x06, 0x43, 0x1a, 0xd0, 0x67, 0x22, 0x00, 0x92, 0x01, + 0xe0, 0x53, 0x06, 0x0b, 0x04, 0x12, 0x43, 0x1a, 0x02, 0x23, 0x43, 0x13, 0x9a, 0x03, 0x43, 0x03, + 0x18, 0x9d, 0x7a, 0x6b, 0x7a, 0xaa, 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, 0x7a, 0xeb, 0x02, 0x1b, + 0x43, 0x13, 0x7b, 0x2a, 0x43, 0x1a, 0xd0, 0x3b, 0x23, 0x00, 0x93, 0x02, 0x27, 0x00, 0xe0, 0x26, + 0x06, 0x0b, 0x04, 0x12, 0x43, 0x1a, 0x02, 0x23, 0x43, 0x13, 0x43, 0x03, 0x19, 0xdc, 0x7b, 0xa3, + 0x7b, 0xe2, 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, 0x7c, 0x23, 0x02, 0x1b, 0x43, 0x13, 0x7c, 0x62, + 0x1c, 0x10, 0x43, 0x18, 0xd0, 0x01, 0xf0, 0x02, 0xfe, 0x71, 0x7a, 0x63, 0x7a, 0xa2, 0x06, 0x1b, + 0x04, 0x12, 0x43, 0x1a, 0x7a, 0xe3, 0x02, 0x1b, 0x43, 0x13, 0x7b, 0x22, 0x1c, 0x10, 0x43, 0x18, + 0xd0, 0x01, 0xf0, 0x02, 0xfe, 0x63, 0x9a, 0x02, 0x37, 0x12, 0x32, 0x01, 0x92, 0x02, 0x79, 0x2b, + 0x7a, 0x69, 0x46, 0x9c, 0x9b, 0x02, 0x7a, 0xaa, 0x7a, 0xec, 0x7b, 0x28, 0x45, 0x63, 0xdb, 0xcf, + 0x06, 0x0b, 0x04, 0x12, 0x43, 0x1a, 0x02, 0x23, 0x43, 0x13, 0x43, 0x18, 0xf0, 0x02, 0xfe, 0x4e, + 0x9d, 0x01, 0x9a, 0x03, 0x35, 0x01, 0x95, 0x01, 0x32, 0x0d, 0x7c, 0x73, 0x9d, 0x01, 0x92, 0x03, + 0x7c, 0xb1, 0x7c, 0xf2, 0x7d, 0x34, 0x7d, 0x70, 0x42, 0x9d, 0xdb, 0xa2, 0x06, 0x0b, 0x04, 0x12, + 0x43, 0x1a, 0x02, 0x23, 0x43, 0x13, 0x43, 0x18, 0xf0, 0x02, 0xfe, 0x38, 0xb0, 0x05, 0xbc, 0xf0, + 0xbc, 0x01, 0x47, 0x00, 0xb4, 0x0f, 0xb5, 0xf0, 0xb0, 0x83, 0x46, 0x6a, 0x23, 0x80, 0xad, 0x08, + 0x32, 0x06, 0x01, 0x9b, 0xcd, 0x10, 0x80, 0x13, 0x4e, 0x1d, 0xe0, 0x30, 0x1c, 0x67, 0x2b, 0x25, + 0xd0, 0x07, 0x46, 0x6a, 0x46, 0x68, 0x71, 0x93, 0x30, 0x06, 0x1c, 0x3c, 0xf7, 0xfe, 0xfa, 0x4c, + 0xe0, 0x25, 0x78, 0x63, 0x2b, 0x73, 0xd0, 0x1c, 0x2b, 0x73, 0xd8, 0x04, 0x2b, 0x64, 0xd0, 0x07, + 0x2b, 0x69, 0xd1, 0x1b, 0xe0, 0x04, 0x2b, 0x75, 0xd0, 0x07, 0x2b, 0x78, 0xd1, 0x16, 0xe0, 0x0a, + 0x68, 0x28, 0x1d, 0x2c, 0xf7, 0xff, 0xfb, 0x72, 0xe0, 0x09, 0x68, 0x28, 0xf7, 0xff, 0xfb, 0xba, + 0x1d, 0x2c, 0x1c, 0x30, 0xe0, 0x07, 0x68, 0x28, 0x1d, 0x2c, 0xf7, 0xff, 0xfb, 0xf1, 0x48, 0x08, + 0xe0, 0x01, 0x68, 0x28, 0x1d, 0x2c, 0xf7, 0xfe, 0xfa, 0x27, 0x1c, 0x25, 0x1c, 0x7c, 0x78, 0x23, + 0x2b, 0x00, 0xd1, 0xcb, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0xb0, 0x04, 0x47, 0x18, 0x46, 0xc0, + 0x13, 0x72, 0xc1, 0xe0, 0xb5, 0xf0, 0x4b, 0x32, 0xb0, 0x8f, 0x68, 0x1b, 0x1c, 0x01, 0x68, 0x9a, + 0x4b, 0x30, 0x68, 0x54, 0x68, 0x1b, 0x32, 0x44, 0x00, 0x9b, 0x18, 0xd2, 0x68, 0x12, 0x48, 0x2e, + 0x92, 0x0d, 0xf7, 0xff, 0xff, 0xa7, 0x04, 0x20, 0xd4, 0x02, 0x49, 0x2c, 0x91, 0x0a, 0xe0, 0x01, + 0x4b, 0x2b, 0x93, 0x0a, 0x04, 0x60, 0xd4, 0x02, 0x49, 0x28, 0x91, 0x0b, 0xe0, 0x01, 0x4b, 0x29, + 0x93, 0x0b, 0x04, 0xa0, 0xd4, 0x02, 0x49, 0x25, 0x91, 0x0c, 0xe0, 0x01, 0x4b, 0x26, 0x93, 0x0c, + 0x04, 0xe0, 0xd4, 0x02, 0x49, 0x21, 0x46, 0x8c, 0xe0, 0x01, 0x4b, 0x24, 0x46, 0x9c, 0x06, 0xa0, + 0xd4, 0x01, 0x4f, 0x1e, 0xe0, 0x00, 0x4f, 0x22, 0x06, 0xe1, 0xd4, 0x01, 0x4e, 0x1b, 0xe0, 0x00, + 0x4e, 0x20, 0x07, 0x23, 0xd4, 0x01, 0x4d, 0x19, 0xe0, 0x00, 0x4d, 0x1f, 0x07, 0x60, 0xd4, 0x01, + 0x4a, 0x16, 0xe0, 0x00, 0x4a, 0x1d, 0x07, 0xa1, 0xd4, 0x01, 0x4b, 0x14, 0xe0, 0x00, 0x4b, 0x1c, + 0x07, 0xe0, 0xd4, 0x01, 0x49, 0x11, 0xe0, 0x00, 0x49, 0x1a, 0x48, 0x1b, 0x92, 0x05, 0x90, 0x09, + 0x98, 0x0c, 0x9a, 0x0a, 0x90, 0x00, 0x46, 0x60, 0x90, 0x01, 0x93, 0x06, 0x91, 0x07, 0x9b, 0x0b, + 0x98, 0x09, 0x1c, 0x21, 0x97, 0x02, 0x96, 0x03, 0x95, 0x04, 0xf7, 0xff, 0xff, 0x5b, 0x99, 0x0d, + 0x48, 0x12, 0xf7, 0xff, 0xff, 0x57, 0xb0, 0x0f, 0xbc, 0xf0, 0xbc, 0x01, 0x47, 0x00, 0x46, 0xc0, + 0x13, 0x70, 0x60, 0x34, 0x13, 0x70, 0x67, 0x78, 0x13, 0x70, 0x60, 0x85, 0x13, 0x70, 0x66, 0x42, + 0x13, 0x70, 0x60, 0x9b, 0x13, 0x70, 0x60, 0xa2, 0x13, 0x70, 0x60, 0xac, 0x13, 0x70, 0x60, 0xb2, + 0x13, 0x70, 0x60, 0xb8, 0x13, 0x70, 0x60, 0xbd, 0x13, 0x70, 0x60, 0xc4, 0x13, 0x70, 0x60, 0xc9, + 0x13, 0x70, 0x60, 0xce, 0x13, 0x70, 0x60, 0xd3, 0x13, 0x70, 0x60, 0xd8, 0x13, 0x70, 0x60, 0xfd, + 0xb5, 0x30, 0x4b, 0x0b, 0xb0, 0x81, 0x68, 0x1a, 0x25, 0x20, 0x68, 0x92, 0x1c, 0x1c, 0x68, 0x12, + 0x68, 0x23, 0x43, 0x2a, 0x68, 0x9b, 0x20, 0x0a, 0x60, 0x1a, 0xf7, 0xff, 0xf9, 0x2b, 0x68, 0x23, + 0x68, 0x9b, 0x68, 0x1a, 0x42, 0x2a, 0xd0, 0xf3, 0xb0, 0x01, 0xbc, 0x30, 0xbc, 0x01, 0x47, 0x00, + 0x13, 0x70, 0x60, 0x34, 0xb5, 0x30, 0x4b, 0x0b, 0xb0, 0x81, 0x68, 0x1a, 0x25, 0x20, 0x68, 0x92, + 0x1c, 0x1c, 0x68, 0x12, 0x68, 0x23, 0x43, 0xaa, 0x68, 0x9b, 0x20, 0x0a, 0x60, 0x1a, 0xf7, 0xff, + 0xf9, 0x11, 0x68, 0x23, 0x68, 0x9b, 0x68, 0x1a, 0x42, 0x2a, 0xd1, 0xf3, 0xb0, 0x01, 0xbc, 0x30, + 0xbc, 0x01, 0x47, 0x00, 0x13, 0x70, 0x60, 0x34, 0xb5, 0xf0, 0xb0, 0x81, 0x1c, 0x0e, 0x28, 0x00, + 0xd1, 0x18, 0x4e, 0x18, 0x4d, 0x18, 0x4f, 0x19, 0x24, 0x00, 0x68, 0x33, 0x68, 0x9b, 0x69, 0x9a, + 0x69, 0x2b, 0x6c, 0x5b, 0x42, 0x9a, 0xd3, 0x06, 0x69, 0x6b, 0x6c, 0x5b, 0x42, 0x9a, 0xd8, 0x02, + 0xf7, 0xff, 0xff, 0xd0, 0xe0, 0x18, 0x20, 0x0a, 0x34, 0x01, 0xf7, 0xff, 0xf8, 0xeb, 0x42, 0xbc, + 0xd1, 0xeb, 0xe0, 0x11, 0x28, 0x01, 0xd1, 0x0f, 0x24, 0x00, 0x4d, 0x0a, 0x4f, 0x0b, 0xe0, 0x05, + 0x20, 0x0a, 0x34, 0x01, 0xf7, 0xff, 0xf8, 0xde, 0x42, 0xbc, 0xd0, 0x05, 0x68, 0x2b, 0x68, 0x9b, + 0x69, 0x9a, 0x6c, 0x73, 0x42, 0x9a, 0xd0, 0xf3, 0xb0, 0x01, 0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x02, + 0x47, 0x08, 0x46, 0xc0, 0x13, 0x70, 0x60, 0x34, 0x13, 0x72, 0xc0, 0x20, 0x00, 0x00, 0x13, 0x88, + 0xb5, 0xf0, 0xb0, 0x83, 0x1c, 0x1f, 0x4b, 0x0f, 0x92, 0x00, 0x91, 0x01, 0x9a, 0x08, 0x68, 0x1c, + 0x00, 0x55, 0x1c, 0x1e, 0x20, 0x0a, 0xf7, 0xff, 0xf8, 0xbd, 0x9a, 0x01, 0x68, 0x13, 0x9a, 0x00, + 0x40, 0x13, 0x42, 0xbb, 0xd1, 0x01, 0x20, 0x00, 0xe0, 0x07, 0x68, 0x33, 0x1b, 0x1b, 0xd5, 0x00, + 0x68, 0x34, 0x42, 0xab, 0xd3, 0xee, 0x20, 0x02, 0x42, 0x40, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x02, + 0x47, 0x08, 0x46, 0xc0, 0x0d, 0x80, 0x00, 0x10, 0xb5, 0x10, 0x4b, 0x13, 0x30, 0x10, 0x68, 0x1b, + 0x00, 0x80, 0x68, 0x9b, 0x18, 0x1c, 0x68, 0x62, 0x23, 0x80, 0x01, 0x9b, 0x42, 0x1a, 0xd1, 0x00, + 0x40, 0x5a, 0x23, 0x2e, 0x43, 0x9a, 0x60, 0x62, 0x20, 0x05, 0xf7, 0xfe, 0xff, 0x2b, 0x23, 0x80, + 0x68, 0x62, 0x01, 0x9b, 0x42, 0x1a, 0xd0, 0x00, 0x40, 0x5a, 0x23, 0x2e, 0x43, 0x9a, 0x60, 0x62, + 0x20, 0x05, 0xf7, 0xfe, 0xff, 0x1f, 0x4b, 0x05, 0x20, 0x05, 0x60, 0x63, 0xf7, 0xfe, 0xff, 0x1a, + 0xbc, 0x10, 0xbc, 0x01, 0x47, 0x00, 0x46, 0xc0, 0x13, 0x70, 0x60, 0x34, 0x00, 0x00, 0x18, 0x01, + 0xb5, 0xf0, 0x4b, 0x29, 0xb0, 0x85, 0x68, 0x1a, 0x1c, 0x03, 0x68, 0x92, 0x33, 0x10, 0x00, 0x9b, + 0x18, 0xd2, 0x92, 0x03, 0x1c, 0x15, 0x4b, 0x25, 0x68, 0x52, 0x35, 0x04, 0x40, 0x13, 0x2b, 0x01, + 0xd0, 0x06, 0x04, 0x91, 0xd5, 0x01, 0xf7, 0xff, 0xff, 0xbf, 0x24, 0x01, 0x42, 0x64, 0xe0, 0x36, + 0x26, 0x88, 0x27, 0x00, 0x01, 0x76, 0x21, 0x04, 0x1c, 0x13, 0x43, 0x8b, 0x43, 0x33, 0x60, 0x2b, + 0x20, 0x3c, 0xf7, 0xff, 0xf8, 0x79, 0x68, 0x2b, 0x4a, 0x19, 0x20, 0x32, 0x40, 0x13, 0x60, 0x2b, + 0xf7, 0xff, 0xf8, 0x72, 0x4b, 0x17, 0x22, 0x80, 0x93, 0x00, 0x1c, 0x28, 0x1c, 0x29, 0x00, 0x52, + 0x23, 0x00, 0xf7, 0xff, 0xff, 0x7d, 0x1c, 0x04, 0x28, 0x00, 0xd0, 0x03, 0x9b, 0x03, 0x4c, 0x12, + 0x68, 0x5a, 0xe0, 0x14, 0x68, 0x2a, 0x21, 0x04, 0x42, 0x0a, 0xd1, 0x02, 0x37, 0x01, 0x2f, 0x04, + 0xd1, 0xd9, 0x07, 0x53, 0xd4, 0x0b, 0x23, 0x80, 0x01, 0x9b, 0x43, 0x13, 0x99, 0x03, 0x22, 0x2a, + 0x43, 0x93, 0x60, 0x4b, 0x20, 0x0a, 0xf7, 0xff, 0xf8, 0x4f, 0x9b, 0x03, 0x68, 0x5a, 0xb0, 0x05, + 0x1c, 0x20, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x13, 0x70, 0x60, 0x34, 0x00, 0x00, 0x20, 0x01, + 0xff, 0xff, 0xfe, 0xd5, 0x00, 0x00, 0x13, 0x88, 0xff, 0xff, 0xf8, 0x30, 0xb5, 0xf0, 0xb0, 0x85, + 0x90, 0x01, 0x1c, 0x0f, 0x20, 0x00, 0x21, 0x00, 0xf7, 0xff, 0xff, 0x0e, 0x7e, 0x3a, 0x2a, 0x00, + 0xd1, 0x06, 0x4b, 0xc2, 0x21, 0x08, 0x60, 0x1a, 0x68, 0x38, 0xf0, 0x02, 0xfc, 0x8b, 0x60, 0x78, + 0x69, 0x39, 0x29, 0x00, 0xd0, 0x09, 0x7e, 0x7b, 0x68, 0xb8, 0x2b, 0x00, 0xd0, 0x02, 0xf0, 0x02, + 0xfc, 0x81, 0xe0, 0x01, 0xf0, 0x02, 0xfc, 0x76, 0x60, 0xf8, 0x7e, 0x3b, 0x2b, 0x00, 0xd1, 0x03, + 0x4b, 0xb7, 0x68, 0x1b, 0x69, 0xdb, 0xe0, 0x06, 0x7e, 0x7b, 0x2b, 0x00, 0xd0, 0x01, 0x4b, 0xb5, + 0xe0, 0x00, 0x4b, 0xb5, 0x68, 0x1b, 0x93, 0x02, 0x4c, 0xb4, 0x4b, 0xb5, 0x98, 0x02, 0x99, 0x02, + 0x60, 0x18, 0x22, 0x60, 0x1c, 0x20, 0xf0, 0x02, 0xfd, 0x87, 0x21, 0x00, 0x22, 0x30, 0x98, 0x02, + 0xf0, 0x03, 0xfb, 0xe8, 0x4b, 0xaa, 0x49, 0xaf, 0x68, 0x1a, 0x23, 0x00, 0x64, 0x13, 0x68, 0x0b, + 0x22, 0x01, 0x40, 0x53, 0x60, 0x0b, 0x1c, 0x38, 0xf7, 0xff, 0xfc, 0x8e, 0x4b, 0xaa, 0x64, 0xa0, + 0x60, 0x18, 0x1c, 0x06, 0x98, 0x01, 0x22, 0x80, 0x69, 0x83, 0x7e, 0x39, 0x01, 0x92, 0x43, 0x1a, + 0x23, 0x0f, 0x40, 0x0b, 0x02, 0x1b, 0x1c, 0x10, 0x69, 0xfc, 0x43, 0x18, 0x29, 0x00, 0xd1, 0x03, + 0x4b, 0xa2, 0x1c, 0x01, 0x43, 0x19, 0xe0, 0x08, 0x4b, 0xa1, 0x1c, 0x22, 0x40, 0x1a, 0x23, 0x80, + 0x04, 0x12, 0x05, 0xdb, 0x43, 0x1a, 0x1c, 0x11, 0x43, 0x01, 0x06, 0x0b, 0x0e, 0x0a, 0x24, 0xff, + 0x02, 0x24, 0x43, 0x1a, 0x1c, 0x0b, 0x40, 0x23, 0x02, 0x1b, 0x20, 0xff, 0x04, 0x00, 0x43, 0x1a, + 0x1c, 0x0b, 0x40, 0x03, 0x4d, 0x91, 0x0a, 0x1b, 0x43, 0x1a, 0x23, 0x40, 0x60, 0xab, 0x4b, 0x95, + 0x60, 0x6a, 0x68, 0x1b, 0x6c, 0x5a, 0x1c, 0x11, 0x1c, 0x13, 0x40, 0x21, 0x40, 0x03, 0x0a, 0x1b, + 0x02, 0x09, 0x43, 0x19, 0x0e, 0x13, 0x43, 0x19, 0x23, 0xe0, 0x40, 0x1a, 0x23, 0x02, 0x43, 0x1a, + 0x06, 0x12, 0x43, 0x11, 0x60, 0x29, 0x6b, 0x72, 0x06, 0x13, 0x0e, 0x11, 0x43, 0x19, 0x1c, 0x13, + 0x40, 0x23, 0x02, 0x1b, 0x40, 0x02, 0x43, 0x19, 0x0a, 0x12, 0x23, 0x80, 0x43, 0x11, 0x04, 0x5b, + 0x61, 0x29, 0x61, 0x6b, 0x7e, 0x3a, 0x2a, 0x00, 0xd0, 0x17, 0x9b, 0x01, 0x6a, 0x58, 0x06, 0x13, + 0x2b, 0x00, 0xdb, 0x01, 0x21, 0x00, 0xe0, 0x00, 0x21, 0x10, 0x23, 0x0f, 0x40, 0x13, 0x18, 0xcb, + 0x40, 0xd8, 0x1c, 0x03, 0x49, 0x75, 0x07, 0xd8, 0xd5, 0x03, 0x69, 0x8b, 0x22, 0x80, 0x43, 0x13, + 0xe0, 0x02, 0x69, 0x8b, 0x22, 0x80, 0x43, 0x93, 0x61, 0x8b, 0x4b, 0x70, 0x49, 0x76, 0x69, 0x9a, + 0x6c, 0x9e, 0x40, 0x0a, 0x61, 0x9a, 0xe0, 0x04, 0x1c, 0x30, 0x21, 0x60, 0xf0, 0x02, 0xfb, 0xca, + 0x6b, 0xb6, 0x2e, 0x00, 0xd1, 0xf8, 0x4d, 0x69, 0x98, 0x02, 0x1c, 0x29, 0x22, 0x60, 0xf0, 0x02, + 0xfd, 0x03, 0x4a, 0x6e, 0x23, 0x01, 0x92, 0x00, 0x60, 0x13, 0x4b, 0x6d, 0x48, 0x6d, 0x68, 0x19, + 0xf7, 0xfe, 0xfd, 0x88, 0x4c, 0x5e, 0x21, 0x20, 0x68, 0x23, 0x69, 0x98, 0xf0, 0x02, 0xfb, 0x9a, + 0x68, 0x23, 0x6c, 0x69, 0x69, 0x98, 0x23, 0xff, 0x02, 0x1b, 0x1c, 0x0a, 0x40, 0x1a, 0x23, 0xff, + 0x04, 0x1b, 0x40, 0x0b, 0x0a, 0x1b, 0x02, 0x12, 0x43, 0x1a, 0x0e, 0x0b, 0x43, 0x1a, 0x23, 0xe0, + 0x40, 0x19, 0x23, 0x02, 0x43, 0x19, 0x06, 0x09, 0x43, 0x0a, 0x60, 0x02, 0x68, 0x23, 0x21, 0x20, + 0x69, 0x98, 0xf0, 0x02, 0xfb, 0x97, 0xf7, 0xff, 0xfd, 0xeb, 0xf7, 0xfe, 0xfd, 0x2b, 0x9b, 0x00, + 0x90, 0x03, 0x60, 0x1e, 0x28, 0x00, 0xd1, 0x03, 0x4b, 0x48, 0x68, 0x1b, 0x2b, 0x00, 0xd0, 0x0f, + 0x4b, 0x47, 0x68, 0x1b, 0x68, 0x9a, 0x4b, 0x54, 0x32, 0x44, 0x68, 0x1b, 0x00, 0x9b, 0x18, 0xd2, + 0x68, 0x13, 0x22, 0x05, 0x40, 0x13, 0x2b, 0x05, 0xd0, 0x02, 0x4a, 0x40, 0x23, 0x01, 0x60, 0x13, + 0x98, 0x03, 0x42, 0x46, 0x41, 0x46, 0x2e, 0x00, 0xd1, 0x01, 0x30, 0x05, 0xd1, 0x4f, 0xf7, 0xff, + 0xfd, 0xe1, 0x4c, 0x3b, 0x21, 0x20, 0x68, 0x23, 0x69, 0x98, 0xf7, 0xfd, 0xff, 0x4d, 0x68, 0x23, + 0x21, 0x20, 0x69, 0x98, 0xf0, 0x02, 0xfb, 0x1e, 0x4b, 0x3e, 0x68, 0x1b, 0x6c, 0x59, 0x68, 0x23, + 0x1c, 0x0a, 0x69, 0x98, 0x23, 0xff, 0x02, 0x1b, 0x40, 0x1a, 0x23, 0xff, 0x04, 0x1b, 0x40, 0x0b, + 0x0a, 0x1b, 0x02, 0x12, 0x43, 0x1a, 0x0e, 0x0b, 0x43, 0x1a, 0x23, 0xe0, 0x40, 0x19, 0x23, 0x02, + 0x43, 0x19, 0x06, 0x09, 0x43, 0x0a, 0x60, 0x02, 0x68, 0x23, 0x21, 0x20, 0x69, 0x98, 0xf7, 0xfd, + 0xff, 0x4b, 0xf7, 0xff, 0xfd, 0x9d, 0x7e, 0x3a, 0x2a, 0x00, 0xd1, 0x00, 0xe0, 0x9f, 0x9b, 0x01, + 0x1c, 0x14, 0x6a, 0x5d, 0x23, 0x0f, 0x40, 0x1c, 0x06, 0x13, 0x2b, 0x00, 0xdb, 0x01, 0x20, 0x00, + 0xe0, 0x00, 0x20, 0x10, 0x4b, 0x2d, 0x68, 0x19, 0x06, 0x13, 0x2b, 0x00, 0xdb, 0x01, 0x22, 0x00, + 0xe0, 0x00, 0x22, 0x10, 0x09, 0xcb, 0x21, 0x01, 0x40, 0x0b, 0x19, 0x12, 0x40, 0x93, 0x19, 0x02, + 0x40, 0x91, 0x1c, 0x2a, 0x43, 0x8a, 0x98, 0x01, 0x43, 0x13, 0x62, 0x43, 0xe0, 0x7f, 0xf7, 0xff, + 0xfd, 0x91, 0x4b, 0x16, 0x6c, 0x9c, 0xe0, 0x04, 0x6b, 0x60, 0x21, 0x60, 0xf0, 0x02, 0xfb, 0x02, + 0x6b, 0xa4, 0x2c, 0x00, 0xd1, 0xf8, 0x22, 0x20, 0x48, 0x10, 0x99, 0x02, 0xf0, 0x02, 0xfc, 0x44, + 0x7e, 0x3a, 0x2a, 0x00, 0xd0, 0x41, 0x9b, 0x01, 0x1c, 0x14, 0x6a, 0x5d, 0x23, 0x0f, 0x40, 0x1c, + 0x06, 0x13, 0x2b, 0x00, 0xdb, 0x01, 0x20, 0x00, 0xe0, 0x00, 0x20, 0x10, 0x4b, 0x07, 0x69, 0x99, + 0x06, 0x13, 0x2b, 0x00, 0xdb, 0x24, 0x22, 0x00, 0xe0, 0x23, 0x46, 0xc0, 0x13, 0x70, 0x67, 0x6c, + 0x13, 0x70, 0x60, 0x34, 0x13, 0x70, 0x67, 0x7c, 0x13, 0x70, 0x67, 0x80, 0x13, 0x72, 0xc1, 0x80, + 0x13, 0x70, 0x67, 0x8c, 0x13, 0x70, 0x67, 0x70, 0x13, 0x70, 0x67, 0x88, 0x40, 0x40, 0x40, 0x00, + 0x00, 0x00, 0x07, 0xff, 0x13, 0x70, 0x67, 0x84, 0x01, 0x00, 0x00, 0x80, 0x13, 0x70, 0x67, 0x74, + 0x13, 0x70, 0x60, 0x38, 0x13, 0x70, 0x48, 0x25, 0x13, 0x70, 0x67, 0x78, 0x13, 0x70, 0x67, 0x90, + 0x22, 0x10, 0x09, 0xcb, 0x21, 0x01, 0x40, 0x0b, 0x19, 0x12, 0x40, 0x93, 0x19, 0x02, 0x40, 0x91, + 0x1c, 0x2a, 0x43, 0x8a, 0x98, 0x01, 0x43, 0x13, 0x62, 0x43, 0x4c, 0x25, 0x21, 0x20, 0x68, 0x23, + 0x69, 0x98, 0xf7, 0xfd, 0xfe, 0xa9, 0x68, 0x23, 0x21, 0x20, 0x69, 0x98, 0xf0, 0x02, 0xfa, 0x7a, + 0x4b, 0x20, 0x68, 0x1b, 0x6c, 0x59, 0x68, 0x23, 0x1c, 0x0a, 0x69, 0x98, 0x23, 0xff, 0x02, 0x1b, + 0x40, 0x1a, 0x23, 0xff, 0x04, 0x1b, 0x40, 0x0b, 0x0a, 0x1b, 0x02, 0x12, 0x43, 0x1a, 0x0e, 0x0b, + 0x43, 0x1a, 0x23, 0xe0, 0x40, 0x19, 0x23, 0x02, 0x43, 0x19, 0x06, 0x09, 0x43, 0x0a, 0x60, 0x02, + 0x68, 0x23, 0x21, 0x20, 0x69, 0x98, 0xf7, 0xfd, 0xfe, 0xa7, 0xf7, 0xff, 0xfc, 0xf9, 0x49, 0x12, + 0x20, 0x01, 0xf7, 0xff, 0xfd, 0x29, 0x69, 0x39, 0x29, 0x00, 0xd0, 0x08, 0x7e, 0x7b, 0x68, 0xf8, + 0x2b, 0x00, 0xd0, 0x02, 0xf0, 0x02, 0xfa, 0x8e, 0xe0, 0x01, 0xf0, 0x02, 0xfa, 0x83, 0x7e, 0x3b, + 0x2b, 0x00, 0xd1, 0x03, 0x68, 0x78, 0x21, 0x08, 0xf0, 0x02, 0xfa, 0x84, 0x2e, 0x00, 0xd0, 0x01, + 0x69, 0x7f, 0x97, 0x03, 0x98, 0x03, 0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, + 0x13, 0x70, 0x60, 0x34, 0x13, 0x70, 0x67, 0x84, 0x13, 0x72, 0xc1, 0x80, 0xb5, 0x30, 0xb0, 0x89, + 0x46, 0x6d, 0x76, 0x29, 0x09, 0xc9, 0x76, 0x69, 0x21, 0x80, 0x00, 0x89, 0x91, 0x07, 0x24, 0x00, + 0x46, 0x69, 0x94, 0x00, 0x92, 0x04, 0x93, 0x02, 0xf7, 0xff, 0xfd, 0xe0, 0xb0, 0x09, 0xbc, 0x30, + 0xbc, 0x02, 0x47, 0x08, 0xb5, 0xf0, 0xb0, 0x83, 0x1c, 0x04, 0x91, 0x01, 0x92, 0x00, 0x34, 0xa0, + 0x1c, 0x07, 0x21, 0xff, 0x22, 0x0d, 0x68, 0x20, 0xf0, 0x03, 0xf9, 0xf4, 0x1c, 0x3b, 0x33, 0x90, + 0x68, 0x18, 0x7b, 0x39, 0x68, 0x23, 0x22, 0x0d, 0xf7, 0xff, 0xff, 0xd8, 0x28, 0x00, 0xdb, 0x4e, + 0x28, 0x0d, 0xd0, 0x01, 0x48, 0x28, 0xe0, 0x4a, 0x68, 0x23, 0x24, 0xff, 0x68, 0x19, 0x68, 0x5e, + 0x68, 0x9d, 0x7b, 0x1b, 0x0e, 0x0a, 0x46, 0x9c, 0x06, 0x0b, 0x43, 0x1a, 0x02, 0x24, 0x1c, 0x0b, + 0x20, 0xff, 0x40, 0x23, 0x04, 0x00, 0x02, 0x1b, 0x40, 0x01, 0x43, 0x1a, 0x0a, 0x09, 0x4b, 0x1f, + 0x43, 0x0a, 0x42, 0x9a, 0xd0, 0x01, 0x48, 0x1e, 0xe0, 0x31, 0x9a, 0x00, 0x2a, 0x00, 0xd0, 0x0c, + 0x06, 0x2b, 0x0e, 0x2a, 0x43, 0x1a, 0x1c, 0x2b, 0x40, 0x23, 0x02, 0x1b, 0x43, 0x1a, 0x1c, 0x2b, + 0x40, 0x03, 0x0a, 0x1b, 0x43, 0x1a, 0x9b, 0x00, 0x60, 0x1a, 0x9a, 0x01, 0x2a, 0x00, 0xd0, 0x01, + 0x46, 0x63, 0x70, 0x13, 0x06, 0x33, 0x0e, 0x32, 0x43, 0x1a, 0x23, 0xff, 0x02, 0x1b, 0x40, 0x33, + 0x02, 0x1b, 0x43, 0x1a, 0x23, 0xff, 0x04, 0x1b, 0x40, 0x33, 0x1c, 0x38, 0x0a, 0x1b, 0x1c, 0x11, + 0x30, 0x98, 0x43, 0x19, 0x68, 0x03, 0x42, 0x99, 0xd0, 0x01, 0x48, 0x0a, 0xe0, 0x07, 0x4a, 0x0a, + 0x1c, 0x8b, 0x40, 0x13, 0x4a, 0x09, 0x40, 0x0a, 0x43, 0x13, 0x60, 0x03, 0x20, 0x00, 0xb0, 0x03, + 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, 0xff, 0xff, 0xd8, 0xed, 0x53, 0x42, 0x53, 0x55, + 0xff, 0xff, 0xd8, 0xec, 0xff, 0xff, 0xd8, 0xeb, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0xb5, 0xf0, 0xb0, 0x85, 0x93, 0x02, 0x46, 0x6b, 0x33, 0x2f, 0x78, 0x1b, 0x1c, 0x05, 0x93, 0x01, + 0x3b, 0x01, 0x06, 0x1b, 0x0e, 0x1b, 0x91, 0x03, 0x1c, 0x17, 0x2b, 0x0f, 0xd8, 0x5e, 0x1c, 0x06, + 0x36, 0xa0, 0x68, 0x30, 0x28, 0x00, 0xd0, 0x59, 0x21, 0x00, 0x22, 0x1f, 0xf0, 0x03, 0xf9, 0x72, + 0x68, 0x32, 0x4b, 0x2d, 0x24, 0xff, 0x60, 0x13, 0x1c, 0x2b, 0x33, 0x98, 0x68, 0x1a, 0x68, 0x31, + 0x06, 0x13, 0x46, 0x8c, 0x0e, 0x11, 0x43, 0x19, 0x02, 0x24, 0x1c, 0x13, 0x20, 0xff, 0x04, 0x00, + 0x40, 0x23, 0x02, 0x1b, 0x40, 0x02, 0x43, 0x19, 0x0a, 0x12, 0x43, 0x11, 0x46, 0x62, 0x60, 0x51, + 0x06, 0x3b, 0x0e, 0x3a, 0x43, 0x1a, 0x1c, 0x3b, 0x40, 0x23, 0x02, 0x1b, 0x43, 0x1a, 0x1c, 0x3b, + 0x40, 0x03, 0x68, 0x31, 0x0a, 0x1b, 0x43, 0x1a, 0x60, 0x8a, 0x22, 0x0b, 0x46, 0x69, 0x5c, 0x51, + 0x68, 0x33, 0x46, 0x6a, 0x73, 0x19, 0x21, 0x0f, 0x68, 0x33, 0x5c, 0x8a, 0x73, 0x5a, 0x1c, 0x2b, + 0x33, 0x9c, 0x78, 0x1b, 0x68, 0x31, 0x2b, 0x00, 0xd0, 0x01, 0x23, 0x0c, 0xe0, 0x05, 0x9b, 0x01, + 0x2b, 0x06, 0xd8, 0x01, 0x23, 0x06, 0xe0, 0x00, 0x23, 0x10, 0x1c, 0x2c, 0x73, 0x8b, 0x34, 0xa0, + 0x68, 0x20, 0x99, 0x0a, 0x9a, 0x01, 0x30, 0x0f, 0xf0, 0x03, 0xf8, 0xe8, 0x1c, 0x2b, 0x33, 0x90, + 0x68, 0x18, 0x7b, 0x69, 0x68, 0x23, 0x22, 0x1f, 0xf7, 0xff, 0xff, 0x10, 0x28, 0x1f, 0xd1, 0x01, + 0x20, 0x00, 0xe0, 0x05, 0x28, 0x00, 0xdb, 0x03, 0x48, 0x04, 0xe0, 0x01, 0x20, 0x03, 0x42, 0x40, + 0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x55, 0x53, 0x42, 0x43, 0xff, 0xff, 0xd8, 0xee, + 0xb5, 0xf0, 0xb0, 0x8b, 0x90, 0x01, 0x46, 0x68, 0x30, 0x42, 0x88, 0x04, 0x30, 0x04, 0x88, 0x05, + 0x48, 0x27, 0x9f, 0x12, 0x68, 0x00, 0x04, 0x24, 0x30, 0xf8, 0x68, 0x00, 0x04, 0x2d, 0x70, 0x42, + 0x02, 0x1a, 0x0a, 0x1b, 0x43, 0x1a, 0x04, 0x12, 0x0c, 0x13, 0x70, 0xc3, 0x0a, 0x23, 0x0e, 0x24, + 0x43, 0x23, 0x0e, 0x12, 0x04, 0x1b, 0x70, 0x82, 0x0c, 0x2e, 0x0c, 0x1a, 0x0e, 0x1b, 0x71, 0x03, + 0x0e, 0x2d, 0x02, 0x33, 0x43, 0x2b, 0x04, 0x1b, 0x71, 0x42, 0x0e, 0x1a, 0x0c, 0x1b, 0x71, 0xc3, + 0xac, 0x02, 0x23, 0x00, 0x70, 0x01, 0x71, 0x82, 0x76, 0x23, 0x23, 0x40, 0x61, 0xe3, 0x4b, 0x15, + 0x09, 0xc9, 0x90, 0x02, 0x76, 0x61, 0x61, 0x26, 0x42, 0x9f, 0xd9, 0x15, 0x1c, 0x30, 0xf0, 0x02, + 0xf9, 0x09, 0x1c, 0x32, 0x1c, 0x39, 0x60, 0xa0, 0xf0, 0x03, 0xf8, 0x90, 0x1c, 0x21, 0x98, 0x01, + 0xf7, 0xff, 0xfc, 0xac, 0x68, 0xa1, 0x1c, 0x05, 0x1c, 0x32, 0x1c, 0x38, 0xf0, 0x03, 0xf8, 0x86, + 0x68, 0xa0, 0xf0, 0x02, 0xf8, 0xeb, 0xe0, 0x05, 0x60, 0xa7, 0x98, 0x01, 0x1c, 0x21, 0xf7, 0xff, + 0xfc, 0x9d, 0x1c, 0x05, 0xb0, 0x0b, 0x1c, 0x28, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, + 0x13, 0x70, 0x60, 0x34, 0x13, 0x88, 0x00, 0x00, 0xb5, 0x00, 0xb0, 0x85, 0x91, 0x00, 0x23, 0x00, + 0x21, 0x02, 0x22, 0x01, 0x93, 0x01, 0x93, 0x02, 0xf7, 0xff, 0xff, 0x9a, 0xb0, 0x05, 0xbc, 0x02, + 0x47, 0x08, 0x46, 0xc0, 0xb5, 0x00, 0xb0, 0x85, 0x2a, 0x00, 0xd1, 0x02, 0x20, 0x03, 0x42, 0x40, + 0xe0, 0x08, 0x1c, 0x13, 0x22, 0x00, 0x91, 0x00, 0x92, 0x01, 0x92, 0x02, 0x21, 0x01, 0x22, 0x0b, + 0xf7, 0xff, 0xff, 0x86, 0xb0, 0x05, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, 0xb5, 0x00, 0xb0, 0x85, + 0x22, 0x00, 0x92, 0x00, 0x92, 0x01, 0x92, 0x02, 0x1c, 0x0b, 0x22, 0x09, 0x21, 0x00, 0xf7, 0xff, + 0xff, 0x77, 0xb0, 0x05, 0xbc, 0x02, 0x47, 0x08, 0xb5, 0x70, 0xb0, 0x84, 0x1c, 0x04, 0x20, 0x01, + 0x1c, 0x0e, 0xf0, 0x02, 0xf8, 0xaf, 0x1c, 0x05, 0x28, 0x00, 0xd1, 0x02, 0x24, 0x04, 0x42, 0x64, + 0xe0, 0x12, 0x23, 0x00, 0x93, 0x00, 0x23, 0x01, 0x93, 0x01, 0x90, 0x02, 0x21, 0x80, 0x1c, 0x20, + 0x22, 0x08, 0x23, 0x00, 0xf7, 0xff, 0xff, 0x5c, 0x1c, 0x04, 0x28, 0x00, 0xdb, 0x01, 0x78, 0x2b, + 0x70, 0x33, 0x1c, 0x28, 0xf0, 0x02, 0xf8, 0x8a, 0xb0, 0x04, 0x1c, 0x20, 0xbc, 0x70, 0xbc, 0x02, + 0x47, 0x08, 0x46, 0xc0, 0xb5, 0xf0, 0x4b, 0x4c, 0x4a, 0x4c, 0x78, 0x19, 0xb0, 0x87, 0x1c, 0x06, + 0x68, 0x17, 0x29, 0x00, 0xd0, 0x01, 0x4b, 0x4a, 0xe0, 0x00, 0x4b, 0x4a, 0x60, 0x13, 0x4b, 0x4a, + 0x68, 0x1b, 0x68, 0x9a, 0x1c, 0x33, 0x33, 0x90, 0x68, 0x1b, 0x32, 0x44, 0x69, 0xdb, 0x00, 0x9b, + 0x18, 0xd2, 0x68, 0x13, 0x22, 0x01, 0x42, 0x13, 0xd1, 0x06, 0x4b, 0x44, 0x24, 0x01, 0x60, 0x1a, + 0x4b, 0x3e, 0x42, 0x64, 0x60, 0x1f, 0xe0, 0x72, 0x4a, 0x3c, 0x29, 0x00, 0xd0, 0x01, 0x4b, 0x3c, + 0xe0, 0x00, 0x4b, 0x3c, 0x60, 0x13, 0x4b, 0x3e, 0x1c, 0x35, 0x78, 0x1b, 0x35, 0x90, 0x2b, 0x00, + 0xd0, 0x12, 0x88, 0xf3, 0x68, 0x28, 0x22, 0xff, 0x93, 0x00, 0x21, 0x21, 0x23, 0x00, 0x93, 0x01, + 0x93, 0x02, 0xf7, 0xff, 0xff, 0x15, 0x1c, 0x04, 0x1c, 0x21, 0x48, 0x36, 0xf7, 0xff, 0xfa, 0x12, + 0x20, 0x3c, 0xf7, 0xfe, 0xfc, 0x39, 0xe0, 0x07, 0x21, 0x00, 0x68, 0x28, 0xf7, 0xff, 0xff, 0x64, + 0x20, 0x05, 0xf7, 0xfe, 0xfc, 0x31, 0x24, 0x00, 0x4b, 0x27, 0x4a, 0x28, 0x78, 0x1b, 0x2b, 0x00, + 0xd0, 0x01, 0x4b, 0x27, 0xe0, 0x00, 0x4b, 0x27, 0x1c, 0x35, 0x60, 0x13, 0x35, 0x90, 0x2c, 0x00, + 0xda, 0x0a, 0x20, 0x32, 0xf7, 0xfe, 0xfc, 0x20, 0x68, 0x28, 0x21, 0x00, 0xf7, 0xff, 0xff, 0x4c, + 0x20, 0x05, 0xf7, 0xfe, 0xfc, 0x19, 0xe0, 0x2d, 0x7b, 0x31, 0x68, 0x28, 0xf7, 0xff, 0xff, 0x44, + 0x1c, 0x04, 0x20, 0x05, 0xf7, 0xfe, 0xfc, 0x10, 0x48, 0x1f, 0x1c, 0x21, 0xf7, 0xff, 0xf9, 0xe2, + 0x2c, 0x00, 0xdb, 0x1f, 0x7b, 0x71, 0x68, 0x28, 0xf7, 0xff, 0xff, 0x36, 0x1c, 0x04, 0x20, 0x05, + 0xf7, 0xfe, 0xfc, 0x02, 0x48, 0x19, 0x1c, 0x21, 0xf7, 0xff, 0xf9, 0xd4, 0x2c, 0x00, 0xdb, 0x11, + 0x20, 0x0a, 0xf7, 0xfe, 0xfb, 0xf9, 0x46, 0x69, 0x31, 0x17, 0x68, 0x28, 0xf7, 0xff, 0xff, 0x54, + 0x1c, 0x04, 0x1c, 0x21, 0x48, 0x12, 0xf7, 0xff, 0xf9, 0xc5, 0x2c, 0x00, 0xdb, 0x02, 0x4b, 0x07, + 0x60, 0x1f, 0xe0, 0x04, 0x4b, 0x05, 0x4a, 0x09, 0x60, 0x1f, 0x23, 0x01, 0x60, 0x13, 0xb0, 0x07, + 0x1c, 0x20, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x13, 0x70, 0x01, 0x0f, 0x13, 0x70, 0x60, 0x38, + 0x00, 0x0f, 0x42, 0x40, 0x00, 0x03, 0x0d, 0x40, 0x13, 0x70, 0x60, 0x34, 0x13, 0x70, 0x67, 0x6c, + 0x13, 0x70, 0x01, 0x0d, 0x13, 0x70, 0x61, 0x12, 0x13, 0x70, 0x61, 0x33, 0x13, 0x70, 0x61, 0x5a, + 0x13, 0x70, 0x61, 0x82, 0xb5, 0x00, 0xb0, 0x81, 0x21, 0x00, 0xf7, 0xff, 0xff, 0x4b, 0xb0, 0x01, + 0xbc, 0x02, 0x47, 0x08, 0xb5, 0xf0, 0xb0, 0x8d, 0x1c, 0x1e, 0x46, 0x6b, 0x33, 0x5f, 0x92, 0x07, + 0x78, 0x1a, 0x3b, 0x10, 0x78, 0x1b, 0x06, 0x12, 0x93, 0x06, 0x46, 0x6b, 0x33, 0x53, 0x78, 0x1b, + 0x16, 0x12, 0x93, 0x05, 0x46, 0x6b, 0x92, 0x04, 0x33, 0x2f, 0x22, 0x00, 0x91, 0x08, 0x70, 0x1a, + 0x4b, 0x99, 0x92, 0x0a, 0x60, 0x1a, 0x4a, 0x99, 0x4b, 0x99, 0x24, 0x00, 0x1c, 0x05, 0x94, 0x09, + 0x92, 0x03, 0x93, 0x02, 0x1c, 0xa3, 0x2b, 0x01, 0xd8, 0x00, 0xe1, 0x08, 0x2c, 0x00, 0xd0, 0x22, + 0x1c, 0x28, 0x21, 0x00, 0xf7, 0xff, 0xff, 0x1e, 0x1c, 0x04, 0x28, 0x00, 0xdb, 0x01, 0x20, 0x05, + 0xe0, 0x00, 0x20, 0x3c, 0xf7, 0xfe, 0xfb, 0x90, 0x4b, 0x8e, 0x68, 0x1b, 0x68, 0x9a, 0x4b, 0x8e, + 0x32, 0x44, 0x68, 0x1b, 0x00, 0x9b, 0x18, 0xd2, 0x68, 0x12, 0x2c, 0x00, 0xda, 0x09, 0x9a, 0x09, + 0x32, 0x01, 0x92, 0x09, 0x2a, 0x02, 0xdd, 0x00, 0xe0, 0xeb, 0x20, 0x0a, 0xf7, 0xfe, 0xfb, 0x7c, + 0xe0, 0xdf, 0x23, 0x00, 0x93, 0x09, 0x9b, 0x04, 0x9a, 0x05, 0x3b, 0x01, 0x06, 0x1b, 0x16, 0x1b, + 0x93, 0x04, 0x2a, 0x00, 0xd0, 0x31, 0x9b, 0x03, 0x9a, 0x02, 0x68, 0x1f, 0x78, 0x13, 0x2b, 0x00, + 0xd0, 0x01, 0x4b, 0x7e, 0xe0, 0x00, 0x4b, 0x7e, 0x9a, 0x03, 0x1c, 0x28, 0x60, 0x13, 0x9b, 0x12, + 0x9a, 0x06, 0x93, 0x00, 0x92, 0x01, 0x23, 0x00, 0x99, 0x08, 0x1c, 0x32, 0xf7, 0xff, 0xfd, 0xb8, + 0x4b, 0x72, 0x1c, 0x04, 0x60, 0x1f, 0x1c, 0x83, 0x2b, 0x01, 0xd8, 0x00, 0xe0, 0xbf, 0x28, 0x00, + 0xda, 0x0d, 0xe0, 0xb8, 0x1c, 0x2b, 0x33, 0x90, 0x68, 0x18, 0x7b, 0x69, 0x9b, 0x07, 0x1c, 0x32, + 0xf7, 0xff, 0xfd, 0x1c, 0x1c, 0x83, 0x1c, 0x04, 0x2b, 0x01, 0xd8, 0x43, 0xe0, 0x02, 0x2e, 0x00, + 0xd1, 0xf0, 0xe0, 0x49, 0x28, 0x00, 0xda, 0x47, 0xe0, 0xa3, 0x9b, 0x03, 0x9a, 0x02, 0x68, 0x1f, + 0x78, 0x13, 0x2b, 0x00, 0xd0, 0x01, 0x4b, 0x65, 0xe0, 0x00, 0x4b, 0x65, 0x9a, 0x03, 0x1c, 0x28, + 0x60, 0x13, 0x9b, 0x12, 0x9a, 0x06, 0x93, 0x00, 0x92, 0x01, 0x23, 0x80, 0x99, 0x08, 0x1c, 0x32, + 0xf7, 0xff, 0xfd, 0x86, 0x4b, 0x59, 0x1c, 0x04, 0x60, 0x1f, 0x28, 0x00, 0xda, 0x06, 0x48, 0x5d, + 0x1c, 0x21, 0xf7, 0xff, 0xf8, 0xf7, 0x48, 0x5c, 0xf7, 0xff, 0xf9, 0x3c, 0x1c, 0xa3, 0x2b, 0x01, + 0xd8, 0x00, 0xe0, 0x84, 0x2c, 0x00, 0xda, 0x1a, 0xe0, 0x7d, 0x1c, 0x2b, 0x33, 0x90, 0x68, 0x18, + 0x7b, 0x29, 0x1c, 0x32, 0x9b, 0x07, 0xf7, 0xff, 0xfc, 0xe1, 0x1c, 0x04, 0x28, 0x00, 0xda, 0x06, + 0x48, 0x52, 0x1c, 0x21, 0xf7, 0xff, 0xf8, 0xde, 0x48, 0x51, 0xf7, 0xff, 0xf9, 0x23, 0x1c, 0xa3, + 0x2b, 0x01, 0xd9, 0x07, 0x2c, 0x00, 0xdb, 0x62, 0x42, 0xb4, 0xd0, 0x05, 0xe0, 0x5f, 0x2e, 0x00, + 0xd1, 0xe3, 0xe0, 0x01, 0x2c, 0x00, 0xdb, 0x5e, 0x4b, 0x41, 0x4a, 0x40, 0x78, 0x1b, 0x68, 0x17, + 0x2b, 0x00, 0xd0, 0x01, 0x4b, 0x41, 0xe0, 0x00, 0x4b, 0x41, 0x46, 0x69, 0x60, 0x13, 0x1c, 0x28, + 0x31, 0x2f, 0xaa, 0x0a, 0xf7, 0xff, 0xfc, 0xce, 0x1c, 0x04, 0x28, 0x00, 0xda, 0x28, 0x48, 0x41, + 0x1c, 0x21, 0xf7, 0xff, 0xf8, 0xb7, 0x48, 0x40, 0xf7, 0xff, 0xf8, 0xfc, 0x1c, 0x63, 0xd1, 0x02, + 0x4b, 0x32, 0x60, 0x1f, 0xe0, 0x45, 0x1c, 0x2c, 0x34, 0x90, 0x68, 0x20, 0x7b, 0x29, 0xf7, 0xff, + 0xfe, 0x03, 0x7b, 0x2a, 0x68, 0x24, 0x06, 0x13, 0x6a, 0x60, 0x2b, 0x00, 0xdb, 0x01, 0x21, 0x00, + 0xe0, 0x00, 0x21, 0x10, 0x23, 0x0f, 0x40, 0x1a, 0x18, 0x8a, 0x23, 0x01, 0x40, 0x93, 0x43, 0x98, + 0x46, 0x69, 0x62, 0x60, 0x31, 0x2f, 0x1c, 0x28, 0xaa, 0x0a, 0xf7, 0xff, 0xfc, 0xa3, 0x1c, 0x04, + 0x4b, 0x22, 0x60, 0x1f, 0x1c, 0xa3, 0x2b, 0x01, 0xd9, 0x21, 0x9b, 0x0a, 0x2b, 0x00, 0xd0, 0x07, + 0x4b, 0x2a, 0x68, 0x1b, 0x2b, 0x00, 0xd0, 0x03, 0x46, 0x6b, 0x22, 0x01, 0x33, 0x2f, 0x70, 0x1a, + 0x2c, 0x00, 0xdb, 0x10, 0x4b, 0x25, 0x68, 0x1b, 0x2b, 0x00, 0xd0, 0x06, 0x46, 0x6b, 0x33, 0x2f, + 0x78, 0x1b, 0x2b, 0x00, 0xd0, 0x01, 0x4c, 0x22, 0xe0, 0x05, 0x24, 0x00, 0xe0, 0x0e, 0x4c, 0x21, + 0xe0, 0x01, 0x2c, 0x00, 0xda, 0x0a, 0x9a, 0x04, 0x2a, 0x00, 0xdd, 0x00, 0xe6, 0xf2, 0x2c, 0x00, + 0xda, 0x04, 0x4a, 0x0d, 0x23, 0x01, 0x60, 0x13, 0x2c, 0x00, 0xdb, 0x02, 0x4a, 0x0a, 0x23, 0x00, + 0x60, 0x13, 0x9b, 0x15, 0x2b, 0x00, 0xd0, 0x04, 0x46, 0x6b, 0x33, 0x2f, 0x78, 0x1b, 0x9a, 0x15, + 0x70, 0x13, 0x9b, 0x16, 0x2b, 0x00, 0xd0, 0x02, 0x9b, 0x0a, 0x9a, 0x16, 0x60, 0x13, 0xb0, 0x0d, + 0x1c, 0x20, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x13, 0x70, 0x67, 0x6c, 0x13, 0x70, 0x60, 0x38, + 0x13, 0x70, 0x01, 0x0f, 0x13, 0x70, 0x60, 0x34, 0x13, 0x70, 0x67, 0x78, 0x00, 0x0f, 0x42, 0x40, + 0x00, 0x03, 0x0d, 0x40, 0x13, 0x70, 0x61, 0xb1, 0x13, 0x70, 0x61, 0xc4, 0x13, 0x70, 0x61, 0xce, + 0x13, 0x70, 0x61, 0xe6, 0x13, 0x70, 0x61, 0xfa, 0x13, 0x70, 0x62, 0x09, 0x13, 0x70, 0x67, 0xa4, + 0xff, 0xff, 0xd8, 0xea, 0xff, 0xff, 0xd8, 0xe9, 0xb5, 0xf0, 0xb0, 0x8b, 0x1c, 0x0f, 0x21, 0x27, + 0x1c, 0x1d, 0x1c, 0x06, 0x23, 0x00, 0x44, 0x69, 0x46, 0x68, 0x30, 0x1d, 0x70, 0x0b, 0x23, 0x2a, + 0x70, 0x03, 0x21, 0x08, 0x01, 0x7b, 0x43, 0x0b, 0x70, 0x43, 0x0e, 0x13, 0x70, 0x83, 0x0c, 0x13, + 0x70, 0xc3, 0x0a, 0x13, 0x71, 0x03, 0x21, 0x00, 0x0a, 0x2b, 0x71, 0x42, 0x71, 0x81, 0x71, 0xc3, + 0x72, 0x05, 0x72, 0x41, 0x7b, 0xb3, 0x42, 0xbb, 0xd9, 0x24, 0x1d, 0x3b, 0x00, 0x9a, 0x59, 0x93, + 0x2b, 0x00, 0xd0, 0x1f, 0x4c, 0x12, 0x21, 0x01, 0x60, 0x21, 0x59, 0x93, 0x22, 0x0a, 0x92, 0x01, + 0x22, 0x27, 0x44, 0x6a, 0x91, 0x02, 0x92, 0x03, 0x21, 0x00, 0x22, 0x06, 0x90, 0x00, 0x91, 0x04, + 0x92, 0x05, 0x43, 0x6b, 0x9a, 0x10, 0x1c, 0x30, 0x1c, 0x39, 0xf7, 0xff, 0xfe, 0x5b, 0x22, 0x00, + 0x60, 0x22, 0x28, 0x00, 0xdd, 0x08, 0x21, 0x27, 0x44, 0x69, 0x78, 0x0b, 0x2b, 0x00, 0xd0, 0x03, + 0x48, 0x04, 0xe0, 0x01, 0x20, 0x03, 0x42, 0x40, 0xb0, 0x0b, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, + 0x13, 0x70, 0x67, 0xa4, 0xff, 0xff, 0xd8, 0xea, 0xb5, 0xf0, 0x1c, 0x1c, 0x1c, 0x1f, 0x1c, 0x0b, + 0xb0, 0x87, 0x33, 0x04, 0x90, 0x05, 0x00, 0x9b, 0x91, 0x04, 0x92, 0x03, 0x58, 0x19, 0x20, 0x80, + 0x1c, 0x0b, 0x43, 0x63, 0x02, 0x40, 0x42, 0x83, 0xd9, 0x02, 0xf0, 0x02, 0xfc, 0x9d, 0x1c, 0x07, + 0x9b, 0x04, 0x20, 0x01, 0x33, 0x04, 0x00, 0x9b, 0x42, 0x40, 0x93, 0x02, 0xe0, 0x1c, 0x1c, 0x25, + 0x42, 0xbc, 0xd9, 0x00, 0x1c, 0x3d, 0x04, 0x2b, 0x99, 0x0c, 0x0c, 0x1e, 0x91, 0x00, 0x98, 0x05, + 0x99, 0x04, 0x9a, 0x03, 0x1c, 0x33, 0xf7, 0xff, 0xff, 0x87, 0x28, 0x00, 0xdb, 0x0e, 0x9a, 0x03, + 0x1b, 0xa3, 0x19, 0x52, 0x92, 0x03, 0x99, 0x02, 0x9a, 0x05, 0x04, 0x1b, 0x0c, 0x1c, 0x58, 0x8b, + 0x99, 0x0c, 0x43, 0x6b, 0x18, 0xc9, 0x91, 0x0c, 0x2c, 0x00, 0xd1, 0xe0, 0xb0, 0x07, 0xbc, 0xf0, + 0xbc, 0x02, 0x47, 0x08, 0xb5, 0xf0, 0xb0, 0x8b, 0x1c, 0x05, 0x1c, 0x18, 0x23, 0x27, 0x27, 0x00, + 0x1c, 0x0e, 0x44, 0x6b, 0x46, 0x69, 0x31, 0x1d, 0x70, 0x1f, 0x23, 0x28, 0x70, 0x0b, 0x01, 0x73, + 0x70, 0x4b, 0x0e, 0x13, 0x70, 0x8b, 0x0c, 0x13, 0x70, 0xcb, 0x0a, 0x13, 0x71, 0x0b, 0x0a, 0x03, + 0x71, 0x4a, 0x71, 0x8f, 0x71, 0xcb, 0x72, 0x08, 0x72, 0x4f, 0x7b, 0xab, 0x42, 0xb3, 0xd9, 0x22, + 0x1d, 0x33, 0x00, 0x9a, 0x59, 0x53, 0x2b, 0x00, 0xd0, 0x1d, 0x4c, 0x12, 0x23, 0x01, 0x60, 0x23, + 0x59, 0x53, 0x22, 0x0a, 0x92, 0x01, 0x22, 0x27, 0x44, 0x6a, 0x92, 0x03, 0x22, 0x06, 0x43, 0x43, + 0x91, 0x00, 0x92, 0x05, 0x1c, 0x28, 0x1c, 0x31, 0x9a, 0x10, 0x97, 0x02, 0x97, 0x04, 0xf7, 0xff, + 0xfd, 0xd1, 0x60, 0x27, 0x28, 0x00, 0xdd, 0x08, 0x22, 0x27, 0x44, 0x6a, 0x78, 0x13, 0x2b, 0x00, + 0xd0, 0x03, 0x48, 0x05, 0xe0, 0x01, 0x20, 0x03, 0x42, 0x40, 0xb0, 0x0b, 0xbc, 0xf0, 0xbc, 0x02, + 0x47, 0x08, 0x46, 0xc0, 0x13, 0x70, 0x67, 0xa4, 0xff, 0xff, 0xd8, 0xea, 0xb5, 0xf0, 0x1c, 0x1c, + 0x1c, 0x1f, 0x1c, 0x0b, 0xb0, 0x87, 0x33, 0x04, 0x90, 0x05, 0x00, 0x9b, 0x91, 0x04, 0x92, 0x03, + 0x58, 0x19, 0x20, 0x80, 0x1c, 0x0b, 0x43, 0x63, 0x02, 0x40, 0x42, 0x83, 0xd9, 0x02, 0xf0, 0x02, + 0xfc, 0x13, 0x1c, 0x07, 0x9b, 0x04, 0x20, 0x01, 0x33, 0x04, 0x00, 0x9b, 0x42, 0x40, 0x93, 0x02, + 0xe0, 0x1c, 0x1c, 0x25, 0x42, 0xbc, 0xd9, 0x00, 0x1c, 0x3d, 0x04, 0x2b, 0x99, 0x0c, 0x0c, 0x1e, + 0x91, 0x00, 0x98, 0x05, 0x99, 0x04, 0x9a, 0x03, 0x1c, 0x33, 0xf7, 0xff, 0xff, 0x8b, 0x28, 0x00, + 0xdb, 0x0e, 0x9a, 0x03, 0x1b, 0xa3, 0x19, 0x52, 0x92, 0x03, 0x99, 0x02, 0x9a, 0x05, 0x04, 0x1b, + 0x0c, 0x1c, 0x58, 0x8b, 0x99, 0x0c, 0x43, 0x6b, 0x18, 0xc9, 0x91, 0x0c, 0x2c, 0x00, 0xd1, 0xe0, + 0xb0, 0x07, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0xb5, 0x70, 0x1c, 0x1d, 0x1c, 0x03, 0x33, 0xa0, + 0x1c, 0x16, 0x68, 0x1b, 0x22, 0x80, 0x01, 0x12, 0x18, 0x9c, 0xb0, 0x88, 0x2c, 0x00, 0xd1, 0x02, + 0x20, 0x04, 0x42, 0x40, 0xe0, 0x27, 0x46, 0x6a, 0x32, 0x1e, 0x01, 0x4b, 0x70, 0x53, 0x23, 0x25, + 0x70, 0x13, 0x23, 0x02, 0x93, 0x01, 0x23, 0x00, 0x93, 0x02, 0x93, 0x03, 0x93, 0x04, 0x23, 0x0a, + 0x92, 0x00, 0x93, 0x05, 0x1c, 0x22, 0x23, 0x08, 0xf7, 0xff, 0xfd, 0x5c, 0x28, 0x00, 0xdb, 0x12, + 0xa8, 0x06, 0x1c, 0x21, 0x22, 0x04, 0xf0, 0x02, 0xfc, 0xb9, 0x2d, 0x00, 0xd0, 0x01, 0x9b, 0x06, + 0x60, 0x2b, 0x1d, 0x21, 0xa8, 0x06, 0x22, 0x04, 0xf0, 0x02, 0xfc, 0xb0, 0x2e, 0x00, 0xd0, 0x01, + 0x9b, 0x06, 0x60, 0x33, 0x20, 0x00, 0xb0, 0x08, 0xbc, 0x70, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, + 0xb5, 0xf0, 0xb0, 0x8b, 0x1c, 0x0f, 0x46, 0x69, 0x31, 0x22, 0x23, 0x12, 0x90, 0x07, 0x70, 0x0b, + 0x01, 0x7b, 0x22, 0x00, 0x70, 0x4b, 0x23, 0x24, 0x70, 0x8a, 0x70, 0xca, 0x71, 0x4a, 0x71, 0x0b, + 0x9b, 0x07, 0x22, 0x80, 0x33, 0xa0, 0x68, 0x1b, 0x01, 0x12, 0x18, 0x9c, 0x2c, 0x00, 0xd1, 0x02, + 0x21, 0x04, 0x42, 0x49, 0xe0, 0x2c, 0x25, 0x00, 0x21, 0x00, 0x22, 0x24, 0x1c, 0x20, 0xf0, 0x02, + 0xfc, 0xc9, 0x23, 0x22, 0x44, 0x6b, 0x93, 0x00, 0x22, 0x06, 0x23, 0x0a, 0x26, 0x00, 0x92, 0x01, + 0x93, 0x05, 0x1c, 0x39, 0x98, 0x07, 0x1c, 0x22, 0x23, 0x24, 0x96, 0x02, 0x96, 0x03, 0x96, 0x04, + 0xf7, 0xff, 0xfd, 0x10, 0x1c, 0x01, 0x28, 0x00, 0xdb, 0x08, 0x78, 0x22, 0x23, 0x1f, 0x1c, 0x10, + 0x40, 0x18, 0x28, 0x05, 0xd0, 0x06, 0x28, 0x07, 0xd1, 0x08, 0xe0, 0x03, 0x35, 0x01, 0x2d, 0x02, + 0xd0, 0x06, 0xe7, 0xd9, 0x4a, 0x05, 0x23, 0x01, 0x60, 0x13, 0xe0, 0x01, 0x4b, 0x03, 0x60, 0x1e, + 0xb0, 0x0b, 0x1c, 0x08, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, 0x13, 0x70, 0x67, 0x94, + 0xb5, 0xf0, 0xb0, 0x8f, 0x1c, 0x03, 0x90, 0x07, 0x91, 0x06, 0x33, 0xa0, 0x68, 0x1b, 0x21, 0x80, + 0x46, 0x6f, 0x46, 0x6c, 0x01, 0x09, 0x37, 0x37, 0x25, 0x00, 0x34, 0x27, 0x18, 0x5e, 0x70, 0x3d, + 0x1c, 0x20, 0x21, 0x00, 0x22, 0x10, 0xf0, 0x02, 0xfc, 0x85, 0x2e, 0x00, 0xd1, 0x02, 0x25, 0x04, + 0x42, 0x6d, 0xe0, 0x5a, 0x23, 0x06, 0x70, 0x25, 0x93, 0x01, 0x23, 0x01, 0x93, 0x02, 0x23, 0x0a, + 0x93, 0x05, 0x99, 0x06, 0x22, 0x00, 0x98, 0x07, 0x23, 0x00, 0x95, 0x04, 0x94, 0x00, 0x97, 0x03, + 0xf7, 0xff, 0xfc, 0xc8, 0x1c, 0x05, 0x1c, 0x29, 0x48, 0x26, 0xf7, 0xfe, 0xfe, 0x5b, 0x1c, 0x6a, + 0xd0, 0x43, 0x78, 0x3b, 0x2b, 0x00, 0xd1, 0x01, 0x2d, 0x00, 0xda, 0x3e, 0x46, 0x6a, 0x32, 0x27, + 0x23, 0x03, 0x70, 0x13, 0x99, 0x06, 0x1c, 0x30, 0x01, 0x4b, 0x70, 0x53, 0x23, 0x12, 0x71, 0x13, + 0x23, 0x00, 0x71, 0x53, 0x21, 0x00, 0x22, 0x12, 0xf0, 0x02, 0xfc, 0x54, 0x4a, 0x1a, 0x35, 0x02, + 0xd1, 0x01, 0x4b, 0x1a, 0xe0, 0x00, 0x4b, 0x1a, 0x60, 0x13, 0x46, 0x6b, 0x33, 0x27, 0x93, 0x00, + 0x23, 0x06, 0x93, 0x01, 0x23, 0x00, 0x93, 0x02, 0x93, 0x03, 0x93, 0x04, 0x23, 0x0a, 0x93, 0x05, + 0x99, 0x06, 0x98, 0x07, 0x1c, 0x32, 0x23, 0x12, 0xf7, 0xff, 0xfc, 0x94, 0x1c, 0x05, 0x1c, 0x29, + 0x48, 0x10, 0xf7, 0xfe, 0xfe, 0x27, 0x2d, 0x00, 0xdb, 0x0f, 0x78, 0xb1, 0x23, 0x0f, 0x46, 0x6c, + 0x40, 0x19, 0x34, 0x37, 0x48, 0x0c, 0x70, 0x21, 0xf7, 0xfe, 0xfe, 0x1c, 0x78, 0x23, 0x3b, 0x02, + 0x06, 0x1b, 0x0e, 0x1b, 0x2b, 0x02, 0xd8, 0x00, 0x4d, 0x08, 0xb0, 0x0f, 0x1c, 0x28, 0xbc, 0xf0, + 0xbc, 0x02, 0x47, 0x08, 0x13, 0x70, 0x62, 0x14, 0x13, 0x70, 0x60, 0x38, 0x00, 0x26, 0x25, 0xa0, + 0x00, 0x98, 0x96, 0x80, 0x13, 0x70, 0x62, 0x35, 0x13, 0x70, 0x62, 0x54, 0xff, 0xff, 0xd8, 0xef, + 0xb5, 0xf0, 0x7b, 0x83, 0x1c, 0x0f, 0xb0, 0x81, 0x1c, 0x06, 0x42, 0xbb, 0xd8, 0x02, 0x24, 0x03, + 0x42, 0x64, 0xe0, 0x3a, 0x4d, 0x1f, 0x4b, 0x20, 0x48, 0x20, 0x60, 0x2b, 0x21, 0x00, 0xf7, 0xfe, + 0xfd, 0xf1, 0x4b, 0x1f, 0x1c, 0x30, 0x60, 0x2b, 0x1c, 0x39, 0xf7, 0xff, 0xff, 0x61, 0x1c, 0x04, + 0x28, 0x00, 0xdb, 0x27, 0x4b, 0x18, 0x1c, 0x39, 0x60, 0x2b, 0x1c, 0x30, 0xf7, 0xff, 0xff, 0x08, + 0x1c, 0x04, 0x1c, 0x21, 0x48, 0x17, 0xf7, 0xfe, 0xfd, 0xdd, 0x2c, 0x00, 0xdb, 0x1a, 0x1c, 0x33, + 0x33, 0xa0, 0x68, 0x1a, 0x23, 0x80, 0x01, 0x1b, 0x5c, 0xd1, 0x23, 0x1f, 0x40, 0x19, 0x48, 0x12, + 0xf7, 0xfe, 0xfd, 0xd0, 0x1c, 0x3b, 0x1d, 0x3a, 0x33, 0x14, 0x00, 0x92, 0x00, 0x9b, 0x1c, 0x39, + 0x18, 0xb2, 0x18, 0xf3, 0x1c, 0x30, 0xf7, 0xff, 0xfe, 0xaf, 0x1c, 0x04, 0x1c, 0x21, 0x48, 0x0b, + 0xf7, 0xfe, 0xfd, 0xc0, 0x4a, 0x03, 0x4b, 0x04, 0x60, 0x13, 0xb0, 0x01, 0x1c, 0x20, 0xbc, 0xf0, + 0xbc, 0x02, 0x47, 0x08, 0x13, 0x70, 0x60, 0x38, 0x00, 0x0f, 0x42, 0x40, 0x13, 0x70, 0x62, 0x76, + 0x01, 0x31, 0x2d, 0x00, 0x13, 0x70, 0x62, 0x91, 0x13, 0x70, 0x62, 0xa5, 0x13, 0x70, 0x62, 0xba, + 0xb5, 0x10, 0xb0, 0x84, 0x1c, 0x14, 0x46, 0x6a, 0x32, 0x1b, 0x78, 0x12, 0x02, 0x24, 0x43, 0x1c, + 0x23, 0x00, 0x93, 0x00, 0x92, 0x01, 0x91, 0x02, 0x22, 0x06, 0x21, 0x80, 0x1c, 0x23, 0xf7, 0xff, + 0xfa, 0x97, 0xb0, 0x04, 0xbc, 0x10, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, 0xb5, 0xf0, 0xb0, 0x8f, + 0x90, 0x03, 0x20, 0x16, 0x1c, 0x0f, 0xf0, 0x01, 0xfb, 0xcd, 0x90, 0x05, 0x28, 0x00, 0xd1, 0x00, + 0xe1, 0x7e, 0x23, 0x12, 0x93, 0x00, 0x98, 0x03, 0x99, 0x05, 0x22, 0x01, 0x23, 0x00, 0xf7, 0xff, + 0xff, 0xd7, 0x1c, 0x04, 0x28, 0x00, 0xda, 0x00, 0xe1, 0x65, 0x99, 0x05, 0x22, 0x12, 0x1c, 0x38, + 0xf0, 0x02, 0xfb, 0x44, 0x98, 0x05, 0xf0, 0x01, 0xfb, 0xa9, 0x78, 0xba, 0x78, 0xfb, 0x02, 0x12, + 0x43, 0x13, 0x04, 0x1b, 0x0a, 0x1a, 0x0e, 0x1b, 0x43, 0x1a, 0x04, 0x12, 0x0c, 0x13, 0x0e, 0x12, + 0x70, 0xba, 0x7a, 0x3a, 0x70, 0xfb, 0x7a, 0x7b, 0x02, 0x12, 0x43, 0x13, 0x04, 0x1b, 0x0a, 0x1a, + 0x0e, 0x1b, 0x43, 0x1a, 0x04, 0x12, 0x0c, 0x13, 0x0e, 0x12, 0x72, 0x3a, 0x7a, 0xba, 0x72, 0x7b, + 0x7a, 0xfb, 0x02, 0x12, 0x43, 0x13, 0x04, 0x1b, 0x0a, 0x1a, 0x0e, 0x1b, 0x43, 0x1a, 0x04, 0x12, + 0x0c, 0x13, 0x0e, 0x12, 0x72, 0xba, 0x7b, 0x3a, 0x72, 0xfb, 0x7b, 0x7b, 0x02, 0x12, 0x43, 0x13, + 0x04, 0x1b, 0x0a, 0x1a, 0x0e, 0x1b, 0x43, 0x1a, 0x04, 0x12, 0x0c, 0x13, 0x73, 0x7b, 0x7c, 0x7b, + 0x0e, 0x12, 0x00, 0x58, 0x18, 0xc0, 0x00, 0x80, 0x18, 0xc0, 0x73, 0x3a, 0xf0, 0x01, 0xfb, 0x7a, + 0x0e, 0x03, 0x74, 0xbb, 0x0c, 0x03, 0x74, 0xfb, 0x0a, 0x03, 0x75, 0x3b, 0x75, 0x78, 0x28, 0x00, + 0xd1, 0x00, 0xe1, 0x28, 0x7c, 0x7b, 0x21, 0x00, 0x00, 0x5a, 0x18, 0xd2, 0x00, 0x92, 0x18, 0xd2, + 0xf0, 0x02, 0xfb, 0x38, 0x22, 0x00, 0x92, 0x08, 0x92, 0x0d, 0xe1, 0x01, 0x20, 0x09, 0xf0, 0x01, + 0xfb, 0x61, 0x1c, 0x04, 0x28, 0x00, 0xd1, 0x00, 0xe1, 0x12, 0x9a, 0x08, 0x1c, 0x21, 0x06, 0x13, + 0x0e, 0x1b, 0x93, 0x04, 0x23, 0x09, 0x93, 0x00, 0x22, 0x02, 0x9b, 0x04, 0x98, 0x03, 0xf7, 0xff, + 0xff, 0x67, 0x7c, 0xba, 0x7c, 0xfb, 0x06, 0x12, 0x04, 0x1b, 0x43, 0x13, 0x7d, 0x3a, 0x1c, 0x21, + 0x02, 0x12, 0x43, 0x1a, 0x7d, 0x7b, 0x43, 0x13, 0x9a, 0x0d, 0x18, 0x9e, 0x1c, 0x30, 0x22, 0x09, + 0xf0, 0x02, 0xfa, 0xcc, 0x1c, 0x20, 0xf0, 0x01, 0xfb, 0x31, 0x78, 0xb2, 0x78, 0xf3, 0x02, 0x12, + 0x43, 0x13, 0x04, 0x1b, 0x0a, 0x1a, 0x0e, 0x1b, 0x43, 0x1a, 0x04, 0x12, 0x0c, 0x15, 0x0e, 0x12, + 0x70, 0xb2, 0x70, 0xf5, 0x1c, 0x28, 0xf0, 0x01, 0xfb, 0x2d, 0x90, 0x05, 0x28, 0x00, 0xd1, 0x00, + 0xe0, 0xde, 0x78, 0xf3, 0x98, 0x03, 0x93, 0x00, 0x99, 0x05, 0x22, 0x02, 0x9b, 0x04, 0xf7, 0xff, + 0xff, 0x37, 0x1c, 0x04, 0x28, 0x00, 0xda, 0x00, 0xe0, 0xc5, 0x79, 0x33, 0x78, 0x34, 0x00, 0xd8, + 0x18, 0xc0, 0x00, 0x40, 0xf0, 0x01, 0xfb, 0x16, 0x0e, 0x03, 0x72, 0x73, 0x0c, 0x03, 0x72, 0xb3, + 0x0a, 0x03, 0x72, 0xf3, 0x73, 0x30, 0x28, 0x00, 0xd1, 0x00, 0xe0, 0xc4, 0x9b, 0x05, 0x1b, 0x2d, + 0x19, 0x1b, 0x93, 0x06, 0x95, 0x07, 0x79, 0x33, 0x21, 0x00, 0x00, 0xda, 0x18, 0xd2, 0x00, 0x52, + 0xf0, 0x02, 0xfa, 0xd0, 0x22, 0x00, 0x92, 0x09, 0xe0, 0x89, 0x7a, 0x72, 0x7a, 0xb3, 0x06, 0x12, + 0x04, 0x1b, 0x43, 0x13, 0x7a, 0xf2, 0x99, 0x06, 0x02, 0x12, 0x43, 0x1a, 0x7b, 0x33, 0x43, 0x13, + 0x9a, 0x0c, 0x18, 0x9d, 0x1c, 0x28, 0x22, 0x09, 0xf0, 0x02, 0xfa, 0x78, 0x79, 0x2b, 0x78, 0x2c, + 0x00, 0xd8, 0x1a, 0xc0, 0xf0, 0x01, 0xfa, 0xe6, 0x0e, 0x03, 0x73, 0xab, 0x0c, 0x03, 0x73, 0xeb, + 0x0a, 0x03, 0x74, 0x2b, 0x74, 0x68, 0x28, 0x00, 0xd1, 0x00, 0xe0, 0x94, 0x9b, 0x06, 0x9a, 0x07, + 0x19, 0x1b, 0x1b, 0x12, 0x92, 0x07, 0x93, 0x06, 0x79, 0x2b, 0x21, 0x00, 0x00, 0xda, 0x1a, 0xd2, + 0xf0, 0x02, 0xfa, 0xa0, 0x9a, 0x07, 0x98, 0x06, 0xe0, 0x08, 0x78, 0x43, 0x3b, 0x04, 0x06, 0x1b, + 0x0e, 0x1b, 0x2b, 0x01, 0xd9, 0x04, 0x78, 0x03, 0x1a, 0xd2, 0x18, 0xc0, 0x2a, 0x00, 0xd1, 0xf4, + 0x9b, 0x06, 0x1a, 0xc4, 0x73, 0x6c, 0x2c, 0x00, 0xd0, 0x15, 0x1c, 0x20, 0xf0, 0x01, 0xfa, 0xba, + 0x0e, 0x03, 0x72, 0x6b, 0x0c, 0x03, 0x72, 0xab, 0x0a, 0x03, 0x72, 0xeb, 0x73, 0x28, 0x28, 0x00, + 0xd0, 0x69, 0x1c, 0x22, 0x99, 0x06, 0xf0, 0x02, 0xfa, 0x39, 0x9a, 0x06, 0x9b, 0x07, 0x19, 0x12, + 0x1b, 0x1b, 0x92, 0x06, 0x93, 0x07, 0x22, 0x00, 0x92, 0x0a, 0xe0, 0x26, 0x7b, 0xab, 0x7b, 0xea, + 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, 0x7c, 0x2b, 0x7c, 0x6c, 0x02, 0x1b, 0x43, 0x13, 0x43, 0x1c, + 0x9b, 0x0b, 0x22, 0x07, 0x18, 0xe4, 0x1c, 0x20, 0x99, 0x06, 0xf0, 0x02, 0xfa, 0x1f, 0x78, 0x23, + 0x9a, 0x06, 0x18, 0xd2, 0x92, 0x06, 0x79, 0x22, 0x79, 0x63, 0x02, 0x12, 0x43, 0x13, 0x04, 0x1b, + 0x0a, 0x1a, 0x0e, 0x1b, 0x43, 0x1a, 0x04, 0x12, 0x0c, 0x13, 0x0e, 0x12, 0x71, 0x22, 0x71, 0x63, + 0x9b, 0x0a, 0x9a, 0x0b, 0x33, 0x01, 0x93, 0x0a, 0x32, 0x07, 0x92, 0x0b, 0x79, 0x2b, 0x9a, 0x0a, + 0x42, 0x9a, 0xd3, 0xd3, 0x9b, 0x09, 0x9a, 0x0c, 0x33, 0x01, 0x93, 0x09, 0x32, 0x12, 0x92, 0x0c, + 0x79, 0x33, 0x9a, 0x09, 0x42, 0x9a, 0xd2, 0x00, 0xe7, 0x6f, 0x98, 0x05, 0xf0, 0x01, 0xfa, 0x5e, + 0x9b, 0x08, 0x9a, 0x0d, 0x33, 0x01, 0x93, 0x08, 0x32, 0x0d, 0x23, 0x00, 0x92, 0x0d, 0x93, 0x05, + 0x7c, 0x7b, 0x9a, 0x08, 0x42, 0x9a, 0xd2, 0x00, 0xe6, 0xf8, 0x9b, 0x05, 0x2b, 0x00, 0xd1, 0x01, + 0x24, 0x00, 0xe0, 0x08, 0x24, 0x00, 0x98, 0x05, 0xf0, 0x01, 0xfa, 0x48, 0x2c, 0x00, 0xd0, 0x02, + 0x1c, 0x38, 0xf7, 0xfe, 0xfb, 0x95, 0xb0, 0x0f, 0x1c, 0x20, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, + 0x24, 0x04, 0x42, 0x64, 0xe7, 0xf4, 0x24, 0x04, 0x42, 0x64, 0xe7, 0xec, 0xb5, 0xf0, 0xb0, 0x8f, + 0x46, 0x6b, 0x1c, 0x06, 0x4a, 0xc7, 0x20, 0x00, 0x33, 0x37, 0x70, 0x18, 0x23, 0x10, 0x70, 0x13, + 0x4b, 0xc5, 0x1c, 0x32, 0x32, 0x98, 0x60, 0x13, 0x46, 0x6d, 0x1c, 0x33, 0x35, 0x21, 0x33, 0x90, + 0x60, 0x19, 0x74, 0xa8, 0x74, 0xe8, 0x75, 0x28, 0x75, 0x68, 0x1c, 0x08, 0x1c, 0x29, 0xf7, 0xff, + 0xfe, 0x55, 0x1c, 0x04, 0x1c, 0x21, 0x48, 0xbd, 0xf7, 0xfe, 0xfb, 0xe4, 0x48, 0xbc, 0xf7, 0xfe, + 0xfc, 0x29, 0x2c, 0x00, 0xda, 0x00, 0xe1, 0xf0, 0x4b, 0xba, 0x68, 0x1b, 0x2b, 0x00, 0xd0, 0x32, + 0x4c, 0xb9, 0x79, 0x2b, 0x79, 0xa2, 0x42, 0x9a, 0xd1, 0x23, 0x79, 0xe2, 0x79, 0x6b, 0x42, 0x9a, + 0xd1, 0x1f, 0x7a, 0x21, 0x7a, 0x2a, 0x7a, 0x60, 0x7a, 0x6b, 0x02, 0x09, 0x02, 0x12, 0x43, 0x08, + 0x43, 0x13, 0x42, 0x98, 0xd1, 0x15, 0x7a, 0xa1, 0x7a, 0xaa, 0x7a, 0xe0, 0x7a, 0xeb, 0x02, 0x09, + 0x02, 0x12, 0x43, 0x08, 0x43, 0x13, 0x42, 0x98, 0xd1, 0x0b, 0x7b, 0x22, 0x7b, 0xab, 0x42, 0x9a, + 0xd1, 0x07, 0x7b, 0x62, 0x7b, 0xeb, 0x42, 0x9a, 0xd1, 0x03, 0x7b, 0xa2, 0x7c, 0x2b, 0x42, 0x9a, + 0xd0, 0x09, 0x46, 0x68, 0x30, 0x21, 0xf7, 0xfe, 0xfb, 0x33, 0x24, 0x01, 0x48, 0xa3, 0xf7, 0xfe, + 0xfb, 0xa9, 0x42, 0x64, 0xe1, 0xc8, 0x46, 0x68, 0x30, 0x21, 0x79, 0x03, 0x49, 0x9e, 0x71, 0x8b, + 0x79, 0x43, 0x71, 0xcb, 0x7a, 0x02, 0x7a, 0x43, 0x02, 0x12, 0x43, 0x13, 0x04, 0x1b, 0x0c, 0x1a, + 0x0e, 0x1b, 0x72, 0x0b, 0x72, 0x4a, 0x7a, 0x82, 0x7a, 0xc3, 0x02, 0x12, 0x43, 0x13, 0x04, 0x1b, + 0x0e, 0x1a, 0x0c, 0x1b, 0x72, 0x8a, 0x72, 0xcb, 0x7b, 0x83, 0x4a, 0x95, 0x73, 0x0b, 0x7b, 0xc3, + 0x73, 0x4b, 0x7c, 0x03, 0x73, 0x8b, 0x23, 0x80, 0x42, 0x5b, 0x60, 0x13, 0x4a, 0x91, 0x21, 0x00, + 0x91, 0x03, 0x91, 0x07, 0x92, 0x01, 0xe0, 0xfc, 0x23, 0x33, 0x44, 0x6b, 0xa9, 0x0d, 0x78, 0x1a, + 0x78, 0x0b, 0x21, 0x35, 0x06, 0x12, 0x44, 0x69, 0x04, 0x1b, 0x43, 0x13, 0x78, 0x0a, 0x21, 0x36, + 0x44, 0x69, 0x02, 0x12, 0x43, 0x1a, 0x78, 0x0b, 0x48, 0x87, 0x43, 0x13, 0x9a, 0x07, 0x99, 0x03, + 0x18, 0x9b, 0x93, 0x05, 0x7a, 0x1a, 0x00, 0x52, 0xf7, 0xfe, 0xfb, 0x64, 0x49, 0x83, 0x23, 0x00, + 0x93, 0x04, 0x93, 0x06, 0x91, 0x02, 0xe0, 0xd0, 0x9b, 0x05, 0x99, 0x05, 0x7a, 0x5a, 0x7a, 0x9b, + 0x06, 0x12, 0x04, 0x1b, 0x43, 0x13, 0x7a, 0xca, 0x02, 0x12, 0x43, 0x1a, 0x7b, 0x0b, 0x43, 0x13, + 0x9a, 0x06, 0x18, 0x9c, 0x79, 0x63, 0x2b, 0x08, 0xd1, 0x7f, 0x79, 0xa3, 0x2b, 0x06, 0xd0, 0x09, + 0x2b, 0x01, 0xd0, 0x07, 0x2b, 0x02, 0xd0, 0x05, 0x2b, 0x03, 0xd0, 0x03, 0x2b, 0x04, 0xd0, 0x01, + 0x2b, 0x05, 0xd1, 0x72, 0x79, 0xe3, 0x2b, 0x50, 0xd1, 0x6f, 0x79, 0x23, 0x2b, 0x01, 0xd9, 0x6c, + 0x1c, 0x32, 0x23, 0x01, 0x32, 0x9c, 0x70, 0x13, 0x48, 0x6d, 0x79, 0xa1, 0x22, 0x01, 0xf7, 0xfe, + 0xfb, 0x31, 0x23, 0x00, 0x73, 0x73, 0x73, 0x33, 0x27, 0x00, 0x25, 0x00, 0xe0, 0x2c, 0x7b, 0xa2, + 0x7b, 0xe3, 0x06, 0x12, 0x04, 0x1b, 0x43, 0x13, 0x7c, 0x22, 0x02, 0x12, 0x43, 0x1a, 0x7c, 0x63, + 0x43, 0x13, 0x19, 0x59, 0x78, 0xcb, 0x2b, 0x02, 0xd1, 0x1c, 0x78, 0x8a, 0x06, 0x13, 0x2b, 0x00, + 0xda, 0x0b, 0x7b, 0x33, 0x2b, 0x00, 0xd1, 0x08, 0x2a, 0x00, 0xd0, 0x06, 0x73, 0x32, 0x79, 0x0b, + 0x79, 0x49, 0x02, 0x1b, 0x43, 0x19, 0x98, 0x02, 0xe0, 0x0a, 0x7b, 0x73, 0x2b, 0x00, 0xd1, 0x09, + 0x2a, 0x00, 0xd0, 0x07, 0x73, 0x72, 0x79, 0x0b, 0x79, 0x49, 0x02, 0x1b, 0x98, 0x01, 0x43, 0x19, + 0xf7, 0xfe, 0xfb, 0x00, 0x37, 0x01, 0x35, 0x07, 0x79, 0x23, 0x42, 0x9f, 0xd3, 0xcf, 0x7b, 0x31, + 0x29, 0x00, 0xd0, 0x64, 0x7b, 0x72, 0x2a, 0x00, 0xd0, 0x61, 0x48, 0x4e, 0xf7, 0xfe, 0xfa, 0xf2, + 0x4a, 0x45, 0x7b, 0x33, 0x99, 0x05, 0x74, 0x13, 0x7b, 0x73, 0x46, 0x68, 0x74, 0x53, 0x79, 0x4b, + 0x30, 0x21, 0x70, 0x33, 0x78, 0xa3, 0x46, 0x6d, 0x60, 0x73, 0x73, 0xd3, 0x78, 0xe3, 0x35, 0x37, + 0x60, 0xb3, 0xf7, 0xfe, 0xfa, 0x65, 0x4b, 0x44, 0x4c, 0x3d, 0x48, 0x44, 0x60, 0x23, 0x78, 0x31, + 0x68, 0xb2, 0xf7, 0xfe, 0xfa, 0xd7, 0x1c, 0x33, 0x33, 0x90, 0x68, 0x18, 0x1c, 0x29, 0xf7, 0xff, + 0xf8, 0x5b, 0x28, 0x00, 0xdb, 0x00, 0xe0, 0x81, 0xe0, 0xde, 0x7b, 0xa3, 0x7b, 0xe2, 0x06, 0x1b, + 0x04, 0x12, 0x43, 0x1a, 0x7c, 0x23, 0x02, 0x1b, 0x43, 0x13, 0x7c, 0x62, 0x1c, 0x10, 0x43, 0x18, + 0xd0, 0x01, 0xf0, 0x01, 0xf8, 0xf3, 0x23, 0x00, 0x73, 0xa3, 0x73, 0xe3, 0x74, 0x23, 0x74, 0x63, + 0x7a, 0xa2, 0x7a, 0x63, 0x04, 0x12, 0x06, 0x1b, 0x43, 0x1a, 0x7a, 0xe3, 0x02, 0x1b, 0x43, 0x13, + 0x7b, 0x22, 0x1c, 0x10, 0x43, 0x18, 0xd0, 0x01, 0xf0, 0x01, 0xf8, 0xe0, 0x23, 0x00, 0x72, 0x63, + 0x72, 0xa3, 0x72, 0xe3, 0x73, 0x23, 0x79, 0x63, 0x2b, 0x09, 0xd1, 0x03, 0x4a, 0x20, 0x4b, 0x28, + 0x60, 0x13, 0xe0, 0x28, 0x2b, 0x08, 0xd1, 0x0a, 0x79, 0xe3, 0x2b, 0x50, 0xd1, 0x07, 0x79, 0x23, + 0x2b, 0x01, 0xd9, 0x04, 0x79, 0xa2, 0x4b, 0x23, 0x49, 0x19, 0x1a, 0x9b, 0x60, 0x0b, 0x9a, 0x04, + 0x9b, 0x06, 0x32, 0x01, 0x33, 0x12, 0x92, 0x04, 0x93, 0x06, 0x99, 0x05, 0x9a, 0x04, 0x79, 0x0b, + 0x42, 0x9a, 0xd2, 0x00, 0xe7, 0x28, 0x9b, 0x03, 0x99, 0x07, 0x33, 0x01, 0x31, 0x0d, 0x93, 0x03, + 0x91, 0x07, 0x22, 0x32, 0x44, 0x6a, 0x78, 0x13, 0x99, 0x03, 0x42, 0x99, 0xd2, 0x00, 0xe6, 0xfb, + 0x48, 0x15, 0xf7, 0xfe, 0xfa, 0x77, 0x46, 0x68, 0x30, 0x21, 0xf7, 0xfe, 0xf9, 0xf9, 0x4c, 0x11, + 0xe0, 0x83, 0x46, 0xc0, 0x13, 0x70, 0x60, 0x3c, 0x2c, 0x0d, 0xe0, 0x01, 0x13, 0x70, 0x62, 0xd3, + 0x13, 0x70, 0x62, 0xfd, 0x13, 0x70, 0x67, 0x98, 0x13, 0x70, 0x67, 0xac, 0x13, 0x70, 0x63, 0x16, + 0x13, 0x70, 0x67, 0xa8, 0x13, 0x70, 0x63, 0xa8, 0x13, 0x70, 0x63, 0x3c, 0x13, 0x70, 0x63, 0x9a, + 0x13, 0x70, 0x63, 0x63, 0x13, 0x70, 0x63, 0xb7, 0xff, 0xff, 0xfb, 0x4f, 0x13, 0x70, 0x63, 0xfc, + 0xff, 0xff, 0xb1, 0xe0, 0xff, 0xff, 0xd8, 0xf0, 0x13, 0x70, 0x63, 0xcb, 0x4b, 0x39, 0x48, 0x3a, + 0x60, 0x23, 0xf7, 0xfe, 0xfa, 0x8f, 0x78, 0x29, 0x78, 0x33, 0x42, 0x8b, 0xd0, 0x02, 0x48, 0x37, + 0xf7, 0xfe, 0xfa, 0x40, 0x4b, 0x36, 0x4a, 0x37, 0x60, 0x13, 0x46, 0x6b, 0x33, 0x37, 0x78, 0x31, + 0x78, 0x1b, 0x42, 0x8b, 0xd1, 0x03, 0x4b, 0x34, 0x78, 0x1b, 0x07, 0x9a, 0xd5, 0x06, 0x1c, 0x33, + 0x33, 0x90, 0x68, 0x18, 0xf7, 0xfe, 0xff, 0xaa, 0x28, 0x00, 0xdb, 0x3d, 0x4a, 0x2f, 0x4b, 0x30, + 0x60, 0x13, 0x68, 0xb2, 0x2a, 0x00, 0xd0, 0x09, 0x1c, 0x33, 0x33, 0x90, 0x06, 0x12, 0x68, 0x18, + 0x79, 0xf1, 0x0e, 0x12, 0xf7, 0xfe, 0xff, 0x86, 0x28, 0x00, 0xdb, 0x2d, 0x4a, 0x25, 0x4b, 0x29, + 0x48, 0x29, 0x60, 0x13, 0x4a, 0x25, 0x4b, 0x29, 0x60, 0x13, 0xf7, 0xfe, 0xfa, 0x5b, 0x1c, 0x30, + 0xf7, 0xff, 0xf8, 0x70, 0x1c, 0x04, 0x48, 0x26, 0xf7, 0xfe, 0xfa, 0x54, 0x2c, 0x00, 0xdb, 0x1c, + 0x1c, 0x34, 0x23, 0x08, 0x34, 0xa0, 0x73, 0xb3, 0x68, 0x23, 0x2b, 0x00, 0xd1, 0x07, 0x20, 0x81, + 0x01, 0x40, 0xf0, 0x01, 0xf8, 0x3f, 0x23, 0x1f, 0x30, 0x1f, 0x43, 0x98, 0x60, 0x20, 0x1c, 0x33, + 0x33, 0xa0, 0x68, 0x1b, 0x2b, 0x00, 0xd0, 0x01, 0x24, 0x00, 0xe0, 0x06, 0x4a, 0x13, 0x4b, 0x19, + 0x24, 0x04, 0x60, 0x13, 0x42, 0x64, 0xe0, 0x00, 0x4c, 0x17, 0x4a, 0x0e, 0x4b, 0x11, 0x60, 0x13, + 0x2c, 0x00, 0xda, 0x05, 0x4b, 0x0d, 0x48, 0x15, 0x68, 0x19, 0xf7, 0xfe, 0xf9, 0xe3, 0xe0, 0x03, + 0x48, 0x13, 0xf7, 0xfe, 0xf9, 0xdf, 0x24, 0x00, 0xb0, 0x0f, 0x1c, 0x20, 0xbc, 0xf0, 0xbc, 0x02, + 0x47, 0x08, 0x46, 0xc0, 0xff, 0xff, 0xfb, 0x4e, 0x13, 0x70, 0x64, 0x2a, 0x13, 0x70, 0x64, 0x45, + 0x00, 0x98, 0x96, 0x80, 0x13, 0x70, 0x60, 0x38, 0x13, 0x70, 0x01, 0x0e, 0x13, 0x70, 0x67, 0xa8, + 0xff, 0xff, 0xfb, 0x4d, 0x00, 0x0f, 0x42, 0x40, 0x13, 0x70, 0x64, 0x6f, 0xff, 0xff, 0xfb, 0x4c, + 0x13, 0x70, 0x64, 0x87, 0xff, 0xff, 0xfb, 0x4b, 0xff, 0xff, 0xd8, 0xe7, 0x13, 0x70, 0x64, 0x9e, + 0x13, 0x70, 0x64, 0xc0, 0xb5, 0xf0, 0x4b, 0x78, 0xb0, 0x8b, 0x68, 0x1b, 0x2b, 0x00, 0xd0, 0x4f, + 0x46, 0x6b, 0x22, 0x00, 0x33, 0x27, 0x70, 0x1a, 0xf0, 0x01, 0xf9, 0x24, 0x4a, 0x73, 0x23, 0x10, + 0x70, 0x13, 0x4b, 0x73, 0x4a, 0x73, 0x78, 0x1b, 0x2b, 0x00, 0xd0, 0x01, 0x4b, 0x72, 0xe0, 0x00, + 0x4b, 0x72, 0x4e, 0x73, 0x46, 0x6d, 0x60, 0x13, 0x35, 0x11, 0x23, 0x00, 0x1c, 0x37, 0x74, 0xab, + 0x74, 0xeb, 0x75, 0x2b, 0x75, 0x6b, 0x37, 0x90, 0x68, 0x38, 0x1c, 0x29, 0xf7, 0xff, 0xfb, 0xfe, + 0x4c, 0x6c, 0x79, 0x2b, 0x79, 0xa2, 0x42, 0x9a, 0xd1, 0x23, 0x79, 0xe2, 0x79, 0x6b, 0x42, 0x9a, + 0xd1, 0x1f, 0x7a, 0x21, 0x7a, 0x2a, 0x7a, 0x60, 0x7a, 0x6b, 0x02, 0x09, 0x02, 0x12, 0x43, 0x08, + 0x43, 0x13, 0x42, 0x98, 0xd1, 0x15, 0x7a, 0xa1, 0x7a, 0xaa, 0x7a, 0xe0, 0x7a, 0xeb, 0x02, 0x09, + 0x02, 0x12, 0x43, 0x08, 0x43, 0x13, 0x42, 0x98, 0xd1, 0x0b, 0x7b, 0x22, 0x7b, 0xab, 0x42, 0x9a, + 0xd1, 0x07, 0x7b, 0x62, 0x7b, 0xeb, 0x42, 0x9a, 0xd1, 0x03, 0x7b, 0xa2, 0x7c, 0x2b, 0x42, 0x9a, + 0xd0, 0x08, 0x46, 0x68, 0x30, 0x11, 0xf7, 0xfe, 0xf8, 0xeb, 0x48, 0x57, 0xf7, 0xfe, 0xf9, 0x62, + 0x4c, 0x56, 0xe0, 0x93, 0x46, 0x6c, 0x1c, 0x28, 0x34, 0x27, 0xf7, 0xfe, 0xf8, 0xe1, 0x68, 0x38, + 0x1c, 0x21, 0xf7, 0xfe, 0xfe, 0xe1, 0x28, 0x00, 0xda, 0x01, 0x4c, 0x51, 0xe0, 0x86, 0x4b, 0x49, + 0x4a, 0x50, 0x60, 0x1a, 0x78, 0x31, 0x78, 0x23, 0x42, 0x8b, 0xd1, 0x03, 0x4b, 0x4e, 0x78, 0x1b, + 0x07, 0x9a, 0xd5, 0x08, 0x4b, 0x46, 0x33, 0x90, 0x68, 0x18, 0xf7, 0xfe, 0xfe, 0xbf, 0x28, 0x00, + 0xda, 0x01, 0x4c, 0x4a, 0xe0, 0x72, 0x49, 0x42, 0x68, 0x8a, 0x2a, 0x00, 0xd0, 0x0b, 0x1c, 0x0b, + 0x33, 0x90, 0x06, 0x12, 0x68, 0x18, 0x79, 0xc9, 0x0e, 0x12, 0xf7, 0xfe, 0xfe, 0x9b, 0x28, 0x00, + 0xda, 0x01, 0x4c, 0x43, 0xe0, 0x62, 0x4b, 0x36, 0x4a, 0x36, 0x78, 0x1b, 0x2b, 0x00, 0xd0, 0x01, + 0x4b, 0x35, 0xe0, 0x00, 0x4b, 0x35, 0x60, 0x13, 0x48, 0x35, 0x21, 0x00, 0xf7, 0xfe, 0xfe, 0xd2, + 0x28, 0x00, 0xda, 0x01, 0x4c, 0x3b, 0xe0, 0x51, 0x4b, 0x32, 0x79, 0x5b, 0x2b, 0x00, 0xd1, 0x03, + 0x4b, 0x35, 0x78, 0x1b, 0x07, 0xda, 0xd5, 0x22, 0x4d, 0x2d, 0x23, 0x00, 0x73, 0xab, 0x4c, 0x29, + 0x4b, 0x30, 0x26, 0x01, 0x60, 0x23, 0x1c, 0x2b, 0x33, 0x90, 0x68, 0x18, 0x88, 0xeb, 0x21, 0xa1, + 0x93, 0x00, 0x1c, 0x2b, 0x33, 0x0e, 0x93, 0x02, 0x22, 0xfe, 0x23, 0x00, 0x96, 0x01, 0xf7, 0xfe, + 0xfd, 0xff, 0x4b, 0x21, 0x60, 0x23, 0x28, 0x00, 0xda, 0x06, 0x73, 0xae, 0x1c, 0x28, 0x21, 0x00, + 0xf7, 0xfe, 0xfe, 0xa8, 0x4c, 0x28, 0xe0, 0x29, 0x7b, 0xab, 0x33, 0x01, 0x73, 0xab, 0x4b, 0x27, + 0x4d, 0x18, 0x4f, 0x1b, 0x4e, 0x1b, 0x60, 0x2b, 0x79, 0x31, 0x1c, 0x38, 0xf7, 0xff, 0xfa, 0x60, + 0x1c, 0x04, 0x1c, 0x21, 0x48, 0x22, 0xf7, 0xfe, 0xf8, 0xe5, 0x4b, 0x13, 0x60, 0x2b, 0x2c, 0x00, + 0xda, 0x01, 0x4c, 0x20, 0xe0, 0x12, 0x79, 0x31, 0x1c, 0x38, 0xf7, 0xff, 0xfa, 0x01, 0x1c, 0x04, + 0x1c, 0x21, 0x48, 0x1d, 0xf7, 0xfe, 0xf8, 0xd6, 0x2c, 0x00, 0xda, 0x01, 0x4c, 0x1b, 0xe0, 0x05, + 0x79, 0x33, 0x4a, 0x06, 0x70, 0x13, 0x4a, 0x1a, 0x23, 0x01, 0x70, 0x13, 0xb0, 0x0b, 0x1c, 0x20, + 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, 0x13, 0x70, 0x67, 0x98, 0x13, 0x70, 0x60, 0x3c, + 0x13, 0x70, 0x01, 0x0f, 0x13, 0x70, 0x60, 0x38, 0x00, 0x0f, 0x42, 0x40, 0x00, 0x03, 0x0d, 0x40, + 0x13, 0x72, 0xc2, 0x00, 0x13, 0x70, 0x67, 0xac, 0x13, 0x70, 0x63, 0x16, 0xff, 0xff, 0xfc, 0x0f, + 0xff, 0xff, 0xfc, 0x18, 0x00, 0x98, 0x96, 0x80, 0x13, 0x70, 0x01, 0x0e, 0xff, 0xff, 0xfc, 0x17, + 0xff, 0xff, 0xfc, 0x16, 0xff, 0xff, 0xfc, 0x15, 0xff, 0xff, 0xfc, 0x14, 0x01, 0x31, 0x2d, 0x00, + 0x13, 0x70, 0x64, 0xdd, 0xff, 0xff, 0xfc, 0x13, 0x13, 0x70, 0x62, 0x91, 0xff, 0xff, 0xfc, 0x12, + 0x13, 0x70, 0x67, 0x9c, 0xb5, 0xf0, 0x4b, 0x8e, 0x22, 0x00, 0x80, 0x1a, 0x4b, 0x8d, 0x25, 0x00, + 0x80, 0x1a, 0x4b, 0x8d, 0x4a, 0x8d, 0x70, 0x1d, 0x4b, 0x8d, 0xb0, 0x8b, 0x70, 0x1d, 0x23, 0x78, + 0x42, 0x5b, 0x60, 0x13, 0x90, 0x08, 0xf0, 0x00, 0xff, 0xfd, 0x4c, 0x8a, 0x99, 0x08, 0x1c, 0x20, + 0xf7, 0xff, 0xfc, 0x7c, 0x28, 0x00, 0xda, 0x00, 0xe0, 0xfc, 0x49, 0x87, 0x20, 0x01, 0x73, 0xa0, + 0x78, 0x0b, 0x78, 0x4a, 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, 0x78, 0x8b, 0x02, 0x1b, 0x43, 0x13, + 0x78, 0xca, 0x43, 0x1a, 0xd0, 0x48, 0x79, 0x4b, 0x2b, 0x00, 0xd1, 0x03, 0x4b, 0x7f, 0x78, 0x1b, + 0x42, 0x03, 0xd0, 0x1d, 0x4d, 0x7b, 0x23, 0x00, 0x73, 0xab, 0x4c, 0x7d, 0x4b, 0x7d, 0x26, 0x01, + 0x60, 0x23, 0x1c, 0x2b, 0x33, 0x90, 0x68, 0x18, 0x88, 0xeb, 0x21, 0xa1, 0x93, 0x00, 0x1c, 0x2b, + 0x33, 0x0e, 0x93, 0x02, 0x22, 0xfe, 0x23, 0x00, 0x96, 0x01, 0xf7, 0xfe, 0xfd, 0x51, 0x4b, 0x76, + 0x60, 0x23, 0x28, 0x00, 0xda, 0x01, 0x73, 0xae, 0xe0, 0xbf, 0x7b, 0xab, 0x33, 0x01, 0x73, 0xab, + 0x4b, 0x6d, 0x48, 0x72, 0x79, 0x1d, 0x1c, 0x29, 0xf7, 0xfe, 0xf8, 0x44, 0x4e, 0x69, 0x1c, 0x29, + 0x1c, 0x30, 0xf7, 0xff, 0xfa, 0x3d, 0x1c, 0x04, 0x1c, 0x21, 0x48, 0x6d, 0xf7, 0xfe, 0xf8, 0x3a, + 0x1c, 0xa3, 0x2b, 0x01, 0xd8, 0x01, 0x1c, 0x30, 0xe0, 0x3c, 0x2c, 0x00, 0xda, 0x00, 0xe0, 0xa4, + 0x4a, 0x5d, 0x23, 0x01, 0x70, 0x13, 0x4b, 0x5e, 0x4a, 0x61, 0x70, 0x1d, 0x4b, 0x62, 0x60, 0x13, + 0x4a, 0x5a, 0x23, 0x00, 0x60, 0x13, 0xe0, 0x94, 0x4a, 0x5c, 0x71, 0x4d, 0x27, 0x01, 0x26, 0x00, + 0x25, 0x01, 0x92, 0x05, 0x1c, 0x32, 0x1e, 0x53, 0x41, 0x9a, 0x92, 0x09, 0x9a, 0x05, 0x78, 0x13, + 0x22, 0x01, 0x42, 0x13, 0xd0, 0x04, 0x9b, 0x09, 0x2b, 0x00, 0xd1, 0x01, 0x2d, 0x00, 0xd1, 0x27, + 0x48, 0x58, 0x1c, 0x31, 0xf7, 0xfe, 0xf8, 0x0e, 0x4a, 0x4e, 0x06, 0x31, 0x0e, 0x09, 0x1c, 0x10, + 0x92, 0x07, 0xf7, 0xff, 0xfa, 0x05, 0x1c, 0x04, 0x1c, 0x21, 0x48, 0x51, 0xf7, 0xfe, 0xf8, 0x02, + 0x1c, 0xa3, 0x2b, 0x01, 0xd8, 0x10, 0x9b, 0x09, 0x2b, 0x00, 0xd0, 0x0d, 0x4a, 0x48, 0x4b, 0x4a, + 0x60, 0x13, 0x98, 0x07, 0xf7, 0xfe, 0xfe, 0x56, 0x4a, 0x40, 0x23, 0x79, 0x42, 0x5b, 0x60, 0x13, + 0x4a, 0x3d, 0x23, 0x00, 0x70, 0x13, 0xe0, 0x6d, 0x2c, 0x00, 0xda, 0x40, 0x2d, 0x00, 0xd0, 0x38, + 0x4d, 0x45, 0x4c, 0x3f, 0x4b, 0x3f, 0x95, 0x06, 0x4a, 0x3a, 0x60, 0x23, 0x4b, 0x43, 0x27, 0x00, + 0x68, 0x18, 0x88, 0xd3, 0x60, 0x2f, 0x73, 0x97, 0x93, 0x00, 0x1c, 0x13, 0x33, 0x0e, 0x25, 0x01, + 0x93, 0x02, 0x21, 0xa1, 0x23, 0x00, 0x22, 0xfe, 0x95, 0x01, 0xf7, 0xfe, 0xfc, 0xd1, 0x4b, 0x36, + 0x1c, 0x05, 0x60, 0x23, 0x28, 0x00, 0xda, 0x05, 0x4a, 0x2e, 0x23, 0x01, 0x73, 0x93, 0x9a, 0x06, + 0x60, 0x17, 0xe0, 0x06, 0x4a, 0x2b, 0x7b, 0x93, 0x33, 0x01, 0x73, 0x93, 0x4b, 0x2a, 0x22, 0x01, + 0x71, 0x5a, 0x4b, 0x28, 0x48, 0x32, 0x7b, 0x9f, 0x1c, 0x29, 0x1c, 0x3a, 0xf7, 0xfd, 0xff, 0xba, + 0x4b, 0x26, 0x22, 0x01, 0x78, 0x1b, 0x42, 0x13, 0xd0, 0x05, 0x2d, 0x00, 0xda, 0x03, 0x25, 0x01, + 0xe0, 0x02, 0x36, 0x01, 0xe0, 0x00, 0x25, 0x00, 0x42, 0xbe, 0xdb, 0x8b, 0xe0, 0x1d, 0x4b, 0x1e, + 0x20, 0x00, 0x24, 0x01, 0x70, 0x18, 0x70, 0x58, 0x70, 0x98, 0x70, 0xdc, 0x06, 0x31, 0x0e, 0x09, + 0x9d, 0x08, 0x71, 0x19, 0x89, 0x2b, 0x4a, 0x12, 0x80, 0x13, 0x89, 0x6b, 0x4a, 0x11, 0x80, 0x13, + 0x4b, 0x11, 0x4a, 0x17, 0x70, 0x1c, 0x4b, 0x12, 0x70, 0x19, 0x4b, 0x17, 0x60, 0x13, 0x4b, 0x0f, + 0x60, 0x18, 0xf0, 0x00, 0xfe, 0xfb, 0x20, 0x00, 0xe0, 0x0e, 0x4a, 0x0c, 0x23, 0x7a, 0x42, 0x5b, + 0x60, 0x13, 0x48, 0x0c, 0xf7, 0xfe, 0xfd, 0xe6, 0x4a, 0x07, 0x23, 0x00, 0x70, 0x13, 0x48, 0x15, + 0xf7, 0xfd, 0xff, 0x80, 0x20, 0x03, 0x42, 0x40, 0xb0, 0x0b, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, + 0x13, 0x70, 0x67, 0x9e, 0x13, 0x70, 0x67, 0xa0, 0x13, 0x70, 0x67, 0x9c, 0x13, 0x70, 0x67, 0xa8, + 0x13, 0x70, 0x60, 0x3c, 0x13, 0x72, 0xc2, 0x00, 0x13, 0x70, 0x67, 0xac, 0x13, 0x70, 0x01, 0x0e, + 0x13, 0x70, 0x60, 0x38, 0x00, 0x98, 0x96, 0x80, 0x00, 0x0f, 0x42, 0x40, 0x13, 0x70, 0x64, 0xf2, + 0x13, 0x70, 0x65, 0x10, 0x13, 0x70, 0x64, 0xf7, 0x13, 0x70, 0x67, 0x6c, 0x13, 0x72, 0xc2, 0x90, + 0x13, 0x70, 0x65, 0x2d, 0x13, 0x70, 0x65, 0x56, 0xb5, 0xf0, 0x4b, 0x51, 0xb0, 0x89, 0x68, 0x1f, + 0x00, 0x83, 0x18, 0x1b, 0x00, 0xdb, 0x1c, 0x1a, 0x32, 0x58, 0x18, 0xfb, 0x18, 0xbe, 0x22, 0x00, + 0x1c, 0x05, 0x67, 0x1a, 0x20, 0x32, 0xf7, 0xfd, 0xf9, 0x6f, 0x24, 0x00, 0x23, 0x16, 0x22, 0x00, + 0x93, 0x01, 0x23, 0x80, 0x92, 0x00, 0x1c, 0x30, 0x21, 0x80, 0x22, 0x06, 0x00, 0x5b, 0x96, 0x02, + 0xf7, 0xfe, 0xfc, 0x36, 0x28, 0x00, 0xda, 0x3d, 0x20, 0x64, 0x34, 0x01, 0xf7, 0xfd, 0xf9, 0x5c, + 0x2c, 0x03, 0xd1, 0xeb, 0x24, 0x00, 0x1c, 0x28, 0xf7, 0xfe, 0xf8, 0xba, 0x20, 0x64, 0xf7, 0xfd, + 0xf9, 0x53, 0x23, 0x16, 0x22, 0x00, 0x93, 0x01, 0x23, 0x80, 0x92, 0x00, 0x1c, 0x30, 0x21, 0x80, + 0x22, 0x06, 0x00, 0x5b, 0x96, 0x02, 0xf7, 0xfe, 0xfc, 0x1b, 0x28, 0x00, 0xda, 0x22, 0x34, 0x01, + 0x2c, 0x03, 0xd1, 0xe8, 0x24, 0x00, 0x1c, 0x28, 0xf7, 0xfe, 0xf8, 0x76, 0x20, 0x64, 0xf7, 0xfd, + 0xf9, 0x3b, 0x1c, 0x28, 0xf7, 0xfe, 0xf8, 0x9c, 0x20, 0x64, 0xf7, 0xfd, 0xf9, 0x35, 0x23, 0x16, + 0x22, 0x00, 0x93, 0x01, 0x23, 0x80, 0x92, 0x00, 0x1c, 0x30, 0x21, 0x80, 0x22, 0x06, 0x00, 0x5b, + 0x96, 0x02, 0xf7, 0xfe, 0xfb, 0xfd, 0x28, 0x00, 0xda, 0x04, 0x34, 0x01, 0x2c, 0x03, 0xd1, 0xe2, + 0x48, 0x24, 0xe0, 0x40, 0x1c, 0x6a, 0x04, 0x13, 0x0c, 0x1b, 0x93, 0x06, 0x00, 0xab, 0x19, 0x5b, + 0x00, 0xdb, 0x18, 0xff, 0x1c, 0x3b, 0x33, 0x7c, 0x24, 0x00, 0x92, 0x07, 0x93, 0x05, 0x20, 0x32, + 0xf7, 0xfd, 0xf9, 0x12, 0x23, 0x00, 0x93, 0x00, 0x93, 0x01, 0x93, 0x02, 0x1c, 0x30, 0x21, 0x00, + 0x22, 0x05, 0x9b, 0x06, 0xf7, 0xfe, 0xfb, 0xdc, 0x28, 0x00, 0xda, 0x02, 0x4b, 0x16, 0x1b, 0x18, + 0x34, 0x01, 0x9a, 0x05, 0x25, 0x00, 0x60, 0x15, 0x9b, 0x07, 0x67, 0x3b, 0x28, 0x00, 0xda, 0x1a, + 0x21, 0x00, 0x1c, 0x30, 0xf7, 0xfe, 0xfc, 0x28, 0x20, 0x32, 0xf7, 0xfd, 0xf8, 0xf5, 0x23, 0x16, + 0x93, 0x01, 0x23, 0x80, 0x1c, 0x30, 0x21, 0x80, 0x22, 0x06, 0x00, 0x5b, 0x95, 0x00, 0x96, 0x02, + 0xf7, 0xfe, 0xfb, 0xbe, 0x28, 0x00, 0xdb, 0x02, 0x20, 0x01, 0x42, 0x40, 0xe0, 0x01, 0x48, 0x07, + 0x67, 0x3d, 0x2c, 0x04, 0xdd, 0xcb, 0xb0, 0x09, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, + 0x13, 0x70, 0x60, 0x34, 0xff, 0xff, 0xf7, 0x67, 0xff, 0xff, 0xe0, 0xc0, 0xff, 0xff, 0xf7, 0x3e, + 0xb5, 0x10, 0x4b, 0x0a, 0x1c, 0x04, 0x68, 0x1b, 0x68, 0x9a, 0x23, 0x01, 0x60, 0x93, 0xf7, 0xfe, + 0xf8, 0x2f, 0x28, 0x00, 0xdb, 0x02, 0x1c, 0x20, 0xf7, 0xff, 0xff, 0x46, 0x4b, 0x03, 0x68, 0x1b, + 0x68, 0x9a, 0x23, 0x04, 0x60, 0x93, 0xbc, 0x10, 0xbc, 0x02, 0x47, 0x08, 0x13, 0x70, 0x60, 0x34, + 0xb5, 0xf0, 0x1c, 0x06, 0x48, 0x44, 0xb0, 0x8b, 0x68, 0x02, 0x1c, 0x33, 0x92, 0x06, 0x68, 0x91, + 0x33, 0x10, 0x00, 0x9b, 0x18, 0xc9, 0x00, 0xb3, 0x19, 0x9b, 0x00, 0xdb, 0x9c, 0x06, 0x1c, 0x1a, + 0x32, 0x58, 0x18, 0xa2, 0x92, 0x08, 0x18, 0xe3, 0x22, 0x00, 0x67, 0x1a, 0x68, 0x03, 0x4a, 0x3b, + 0x68, 0x9b, 0x1d, 0x0f, 0x68, 0x5b, 0x68, 0x4b, 0x40, 0x13, 0x2b, 0x01, 0xd0, 0x02, 0x24, 0x01, + 0x42, 0x64, 0xe0, 0x64, 0x1c, 0x73, 0x04, 0x1b, 0x22, 0x00, 0x0c, 0x1b, 0x92, 0x09, 0x93, 0x05, + 0x4b, 0x33, 0x20, 0x0a, 0x60, 0x3b, 0xf7, 0xfd, 0xf8, 0x8f, 0x4b, 0x32, 0x20, 0x64, 0x60, 0x3b, + 0xf7, 0xfd, 0xf8, 0x8a, 0x4b, 0x30, 0x22, 0x80, 0x60, 0x3b, 0x23, 0xfa, 0x00, 0xdb, 0x93, 0x00, + 0x00, 0x52, 0x23, 0x00, 0x1c, 0x38, 0x1c, 0x39, 0xf7, 0xfd, 0xff, 0x92, 0x68, 0x3a, 0x4b, 0x2b, + 0x1c, 0x04, 0x40, 0x13, 0x2b, 0x05, 0xd1, 0x30, 0x23, 0xc0, 0x01, 0x1b, 0x40, 0x1a, 0x23, 0x80, + 0x00, 0xdb, 0x42, 0x9a, 0xd0, 0x29, 0x28, 0x00, 0xd1, 0x29, 0x20, 0x64, 0xf7, 0xfd, 0xf8, 0x6c, + 0x4b, 0x23, 0x21, 0x80, 0x68, 0x1a, 0x25, 0x00, 0x92, 0x07, 0x4a, 0x22, 0x60, 0x1a, 0x23, 0x16, + 0x93, 0x01, 0x9b, 0x08, 0x22, 0x06, 0x93, 0x02, 0x1c, 0x18, 0x23, 0x80, 0x00, 0x5b, 0x94, 0x00, + 0xf7, 0xfe, 0xfb, 0x2e, 0x1c, 0x04, 0x28, 0x00, 0xdb, 0x09, 0x98, 0x08, 0x21, 0x00, 0x22, 0x05, + 0x9b, 0x05, 0x95, 0x00, 0x95, 0x01, 0x95, 0x02, 0xf7, 0xfe, 0xfb, 0x22, 0x1c, 0x04, 0x4b, 0x14, + 0x9a, 0x07, 0x60, 0x1a, 0x2c, 0x00, 0xdb, 0x02, 0xe0, 0x08, 0x24, 0x01, 0x42, 0x64, 0x9b, 0x09, + 0x33, 0x01, 0x93, 0x09, 0x2b, 0x04, 0xd1, 0xab, 0x2c, 0x00, 0xdb, 0x08, 0x00, 0xb3, 0x9a, 0x06, + 0x19, 0x9b, 0x00, 0xdb, 0x18, 0xd3, 0x22, 0x00, 0x67, 0xda, 0x1c, 0x72, 0x67, 0x1a, 0xb0, 0x0b, + 0x1c, 0x20, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x13, 0x70, 0x60, 0x34, 0x00, 0x00, 0x20, 0x01, + 0x00, 0x00, 0x18, 0x03, 0x00, 0x00, 0x19, 0x03, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x20, 0x05, + 0x13, 0x70, 0x60, 0x38, 0x00, 0x03, 0x0d, 0x40, 0xb5, 0xf0, 0x4c, 0x1d, 0xb0, 0x81, 0x68, 0x23, + 0x1c, 0x06, 0x68, 0x9d, 0x23, 0x01, 0x60, 0xab, 0xf7, 0xff, 0xff, 0x5a, 0x1c, 0x07, 0x28, 0x00, + 0xda, 0x1b, 0x68, 0x23, 0x22, 0x37, 0x68, 0x99, 0x20, 0x0a, 0x68, 0x4b, 0x40, 0x13, 0x60, 0x4b, + 0x68, 0x23, 0x1c, 0x34, 0x68, 0x9b, 0x34, 0x10, 0x68, 0x1b, 0x00, 0xa4, 0xf7, 0xfd, 0xf8, 0x04, + 0x4b, 0x10, 0x19, 0x2c, 0x60, 0x63, 0x20, 0x32, 0xf7, 0xfc, 0xff, 0xfe, 0x4b, 0x0e, 0x20, 0x64, + 0x60, 0x63, 0xf7, 0xfc, 0xff, 0xf9, 0x4b, 0x0d, 0x60, 0x63, 0x48, 0x09, 0x22, 0x37, 0x68, 0x03, + 0xb0, 0x01, 0x68, 0x99, 0x68, 0x4b, 0x40, 0x13, 0x60, 0x4b, 0x68, 0x03, 0x68, 0x9a, 0x23, 0x04, + 0x60, 0x93, 0x68, 0x03, 0x1c, 0x38, 0x68, 0x9b, 0x68, 0x1b, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, + 0x13, 0x70, 0x60, 0x34, 0x00, 0x00, 0x18, 0x03, 0x00, 0x00, 0x19, 0x03, 0x00, 0x00, 0x10, 0x01, + 0xb5, 0xf0, 0x4b, 0x51, 0x4c, 0x51, 0x78, 0x1b, 0xb0, 0x83, 0x1c, 0x1a, 0x4b, 0x50, 0x1e, 0x51, + 0x41, 0x8a, 0x68, 0x1b, 0x60, 0x22, 0x2b, 0x00, 0xd0, 0x2b, 0x4b, 0x4e, 0x00, 0x92, 0x68, 0x1b, + 0x68, 0x99, 0x1c, 0x0b, 0x33, 0x44, 0x18, 0x9b, 0x68, 0x1b, 0x07, 0xda, 0xd4, 0x23, 0xf0, 0x00, + 0xfd, 0x11, 0x20, 0x64, 0xf7, 0xfc, 0xff, 0xc0, 0xf0, 0x00, 0xfd, 0x00, 0x20, 0x64, 0xf7, 0xfc, + 0xff, 0xbb, 0xf0, 0x00, 0xfd, 0x07, 0x20, 0x64, 0xf7, 0xfc, 0xff, 0xb6, 0xf0, 0x00, 0xfc, 0xf6, + 0x20, 0x64, 0xf7, 0xfc, 0xff, 0xb1, 0xf0, 0x00, 0xfc, 0xfd, 0x20, 0x64, 0xf7, 0xfc, 0xff, 0xac, + 0xf0, 0x00, 0xfc, 0xec, 0x20, 0x64, 0xf7, 0xfc, 0xff, 0xa7, 0x20, 0xfa, 0x00, 0x40, 0xf7, 0xfc, + 0xff, 0xa3, 0x24, 0x01, 0xe0, 0x62, 0x23, 0x00, 0x60, 0x8b, 0x20, 0x00, 0xf7, 0xfc, 0xfd, 0x2e, + 0x68, 0x20, 0xf7, 0xff, 0xff, 0x79, 0x1c, 0x06, 0x28, 0x00, 0xda, 0x03, 0x68, 0x20, 0xf7, 0xff, + 0xff, 0x73, 0x1c, 0x06, 0x20, 0x3c, 0xf7, 0xfc, 0xff, 0x8f, 0x4b, 0x2e, 0x48, 0x2e, 0x93, 0x01, + 0x68, 0x1b, 0x1c, 0x31, 0x68, 0x9a, 0x4b, 0x29, 0x32, 0x44, 0x68, 0x1b, 0x00, 0x9b, 0x18, 0xd2, + 0x68, 0x15, 0x1c, 0x2a, 0xf7, 0xfd, 0xfd, 0x56, 0x4c, 0x25, 0x22, 0x01, 0x60, 0x22, 0x2e, 0x00, + 0xdb, 0x38, 0x4b, 0x26, 0x1c, 0x2a, 0x40, 0x1a, 0x4b, 0x25, 0x42, 0x9a, 0xd1, 0x32, 0x4d, 0x25, + 0x27, 0x00, 0x70, 0x2f, 0x60, 0x27, 0xf7, 0xff, 0xfb, 0x8d, 0x4b, 0x23, 0x4a, 0x23, 0x60, 0x13, + 0x4b, 0x23, 0x93, 0x00, 0x28, 0x00, 0xdb, 0x11, 0x48, 0x22, 0xf7, 0xfd, 0xfd, 0x3b, 0xf0, 0x00, + 0xfc, 0xa5, 0x22, 0x01, 0x60, 0x27, 0x70, 0x2a, 0x98, 0x00, 0xf7, 0xfc, 0xfc, 0xef, 0x9a, 0x01, + 0x24, 0x00, 0x68, 0x13, 0x68, 0x9a, 0x23, 0x04, 0x60, 0x93, 0xe0, 0x14, 0x23, 0x01, 0x60, 0x23, + 0x1c, 0x31, 0x48, 0x19, 0xf7, 0xfd, 0xfd, 0x26, 0x70, 0x2f, 0xf0, 0x00, 0xfc, 0x8f, 0x20, 0x64, + 0xf7, 0xfc, 0xff, 0x4a, 0x98, 0x00, 0xf7, 0xfc, 0xfc, 0xd9, 0x9a, 0x01, 0x68, 0x13, 0x68, 0x9a, + 0x23, 0x04, 0x60, 0x93, 0x24, 0x01, 0x20, 0x64, 0xf7, 0xfc, 0xff, 0x3e, 0xb0, 0x03, 0x1c, 0x20, + 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, 0x13, 0x70, 0x01, 0x0c, 0x13, 0x70, 0x67, 0x78, + 0x13, 0x70, 0x67, 0x6c, 0x13, 0x70, 0x60, 0x34, 0x13, 0x70, 0x65, 0x73, 0x00, 0x00, 0x31, 0x05, + 0x00, 0x00, 0x10, 0x05, 0x13, 0x70, 0x67, 0x9c, 0x00, 0x0f, 0x42, 0x40, 0x13, 0x70, 0x60, 0x38, + 0x13, 0x70, 0x12, 0xd9, 0x13, 0x70, 0x65, 0x9d, 0x13, 0x70, 0x65, 0xae, 0xb5, 0xf0, 0x4b, 0x28, + 0xb0, 0x85, 0x68, 0x1b, 0x90, 0x03, 0x92, 0x02, 0x2b, 0x00, 0xd0, 0x01, 0x20, 0x00, 0xe0, 0x43, + 0x04, 0x0b, 0x4f, 0x24, 0x25, 0x00, 0x0c, 0x1e, 0xf7, 0xff, 0xff, 0x32, 0x28, 0x00, 0xd1, 0x01, + 0x25, 0x00, 0xe0, 0x01, 0x2d, 0x00, 0xdb, 0x02, 0x78, 0x3b, 0x2b, 0x01, 0xd0, 0x04, 0x4a, 0x1e, + 0x23, 0x01, 0x25, 0x01, 0x60, 0x13, 0x42, 0x6d, 0x4b, 0x1b, 0x68, 0x19, 0x29, 0x00, 0xd1, 0xeb, + 0x4a, 0x1a, 0x4b, 0x1b, 0x60, 0x13, 0x1c, 0x6b, 0xd0, 0x17, 0x4c, 0x1a, 0x20, 0x00, 0x68, 0x23, + 0x68, 0x9b, 0x60, 0x99, 0xf7, 0xfc, 0xfc, 0x82, 0x4b, 0x17, 0x9a, 0x03, 0x78, 0x19, 0x9b, 0x02, + 0x48, 0x16, 0x93, 0x00, 0x1c, 0x33, 0xf7, 0xfe, 0xfc, 0xdf, 0x1c, 0x05, 0x48, 0x14, 0xf7, 0xfc, + 0xfc, 0x75, 0x68, 0x23, 0x68, 0x9a, 0x23, 0x04, 0x60, 0x93, 0x4a, 0x0c, 0x4b, 0x11, 0x60, 0x13, + 0x2d, 0x00, 0xda, 0x02, 0x4a, 0x08, 0x23, 0x01, 0x60, 0x13, 0x4b, 0x07, 0x68, 0x1b, 0x2b, 0x00, + 0xd1, 0xc2, 0x2d, 0x00, 0xdb, 0xc0, 0x20, 0x01, 0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, + 0x13, 0x70, 0x67, 0x94, 0x13, 0x70, 0x67, 0x9c, 0x13, 0x70, 0x67, 0x6c, 0x13, 0x70, 0x60, 0x38, + 0x00, 0x2d, 0xc6, 0xc0, 0x13, 0x70, 0x60, 0x34, 0x13, 0x70, 0x60, 0x3c, 0x13, 0x72, 0xc2, 0x00, + 0x13, 0x70, 0x12, 0xd9, 0x00, 0x0f, 0x42, 0x40, 0xb5, 0xf0, 0x4b, 0x4b, 0xb0, 0x87, 0x68, 0x1b, + 0x1c, 0x07, 0x92, 0x05, 0x2b, 0x00, 0xd1, 0x07, 0x4b, 0x48, 0x68, 0x1b, 0x2b, 0x00, 0xd0, 0x03, + 0x4a, 0x47, 0x4b, 0x48, 0x40, 0x02, 0x60, 0x1a, 0x4b, 0x47, 0x68, 0x1b, 0x2b, 0x00, 0xd0, 0x06, + 0x4a, 0x46, 0x68, 0x13, 0x2b, 0x01, 0xdd, 0x02, 0x23, 0x01, 0x60, 0x13, 0xe0, 0x61, 0x4b, 0x3f, + 0x4a, 0x3d, 0x93, 0x03, 0x04, 0x0b, 0x0c, 0x1b, 0x25, 0x00, 0x26, 0x00, 0x92, 0x04, 0x93, 0x02, + 0x9a, 0x04, 0x68, 0x13, 0x2b, 0x00, 0xd1, 0x04, 0x9a, 0x03, 0x68, 0x13, 0x2b, 0x00, 0xd1, 0x00, + 0x26, 0x00, 0xf7, 0xff, 0xfe, 0xad, 0x28, 0x00, 0xd1, 0x00, 0x25, 0x00, 0x4b, 0x36, 0x68, 0x1b, + 0x2b, 0x00, 0xd0, 0x03, 0x4b, 0x35, 0x68, 0x1b, 0x2b, 0x03, 0xd0, 0x53, 0x2d, 0x00, 0xdb, 0x03, + 0x4b, 0x33, 0x78, 0x1b, 0x2b, 0x01, 0xd0, 0x04, 0x4a, 0x30, 0x23, 0x01, 0x25, 0x01, 0x60, 0x13, + 0x42, 0x6d, 0x4b, 0x2e, 0x68, 0x1b, 0x2b, 0x00, 0xd1, 0x41, 0x4b, 0x28, 0x4a, 0x2d, 0x68, 0x1b, + 0x2b, 0x00, 0xd0, 0x01, 0x4b, 0x2c, 0xe0, 0x00, 0x4b, 0x2c, 0x60, 0x13, 0x1c, 0x6b, 0xd0, 0x18, + 0x4c, 0x2b, 0x20, 0x00, 0x68, 0x23, 0x68, 0x9a, 0x23, 0x00, 0x60, 0x93, 0xf7, 0xfc, 0xfb, 0xee, + 0x4b, 0x28, 0x9a, 0x05, 0x78, 0x19, 0x48, 0x28, 0x9b, 0x02, 0x92, 0x00, 0x1c, 0x3a, 0xf7, 0xfe, + 0xfc, 0xd5, 0x1c, 0x05, 0x48, 0x25, 0xf7, 0xfc, 0xfb, 0xe1, 0x68, 0x23, 0x68, 0x9a, 0x23, 0x04, + 0x60, 0x93, 0x4a, 0x1c, 0x4b, 0x22, 0x60, 0x13, 0x2d, 0x00, 0xda, 0x02, 0x4a, 0x17, 0x23, 0x01, + 0x60, 0x13, 0x4b, 0x15, 0x68, 0x1b, 0x2b, 0x00, 0xd0, 0x05, 0x4b, 0x14, 0x68, 0x1b, 0x2b, 0x00, + 0xd0, 0x01, 0x20, 0x00, 0xe0, 0x13, 0x4b, 0x11, 0x68, 0x1b, 0x2b, 0x00, 0xd1, 0x07, 0x4b, 0x10, + 0x78, 0x1b, 0x2b, 0x01, 0xd1, 0x03, 0x2d, 0x00, 0xdb, 0x01, 0x20, 0x01, 0xe0, 0x07, 0x36, 0x01, + 0x2e, 0x03, 0xdd, 0x95, 0x0f, 0xeb, 0x22, 0x01, 0x40, 0x53, 0x06, 0x1b, 0x0e, 0x18, 0xb0, 0x07, + 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, 0x13, 0x70, 0x67, 0xc0, 0x13, 0x70, 0x67, 0x94, + 0x7f, 0xff, 0xff, 0xff, 0x13, 0x70, 0x67, 0x54, 0x13, 0x70, 0x67, 0x48, 0x13, 0x70, 0x67, 0x6c, + 0x13, 0x70, 0x67, 0x9c, 0x13, 0x70, 0x60, 0x38, 0x00, 0x98, 0x96, 0x80, 0x00, 0x2d, 0xc6, 0xc0, + 0x13, 0x70, 0x60, 0x34, 0x13, 0x70, 0x60, 0x3c, 0x13, 0x72, 0xc2, 0x00, 0x13, 0x70, 0x12, 0xd9, + 0x00, 0x0f, 0x42, 0x40, 0xb5, 0xf0, 0x4b, 0x1e, 0xb0, 0x81, 0x68, 0x1b, 0x2b, 0x00, 0xd0, 0x31, + 0xf7, 0xff, 0xfe, 0x1e, 0x4b, 0x1b, 0x68, 0x1b, 0x2b, 0x00, 0xd1, 0x2b, 0x4b, 0x1a, 0x78, 0x1b, + 0x2b, 0x00, 0xd0, 0x27, 0x4e, 0x19, 0x4f, 0x1a, 0x4c, 0x1a, 0x4d, 0x1b, 0x60, 0x37, 0x79, 0x29, + 0x1c, 0x20, 0xf7, 0xfe, 0xfc, 0xe5, 0x28, 0x00, 0xdb, 0x1c, 0x60, 0x37, 0x79, 0x29, 0x1c, 0x22, + 0x1c, 0x23, 0x00, 0x88, 0x32, 0x10, 0x33, 0x50, 0x18, 0x12, 0x18, 0x1b, 0x1c, 0x20, 0xf7, 0xfe, + 0xfc, 0x9b, 0x28, 0x00, 0xdb, 0x0e, 0x4b, 0x11, 0x68, 0x18, 0x28, 0x00, 0xd0, 0x07, 0x79, 0x2b, + 0x22, 0x80, 0x33, 0x04, 0x00, 0x9b, 0x59, 0x1b, 0x01, 0x12, 0x42, 0x93, 0xd1, 0x02, 0x1e, 0x43, + 0x41, 0x98, 0xe0, 0x00, 0x20, 0x00, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, + 0x13, 0x70, 0x67, 0x98, 0x13, 0x70, 0x67, 0x6c, 0x13, 0x70, 0x67, 0x9c, 0x13, 0x70, 0x60, 0x38, + 0x00, 0x0f, 0x42, 0x40, 0x13, 0x72, 0xc2, 0x00, 0x13, 0x70, 0x67, 0xac, 0x13, 0x70, 0x67, 0x94, + 0xb5, 0xf0, 0x4b, 0x65, 0xb0, 0x83, 0x68, 0x1c, 0x2c, 0x00, 0xd0, 0x01, 0x20, 0x00, 0xe0, 0xbf, + 0x4a, 0x62, 0x20, 0x00, 0x92, 0x00, 0x68, 0x13, 0x68, 0x9b, 0x60, 0x9c, 0xf7, 0xfc, 0xfb, 0x36, + 0x4a, 0x5f, 0x23, 0x01, 0x42, 0x5b, 0x60, 0x13, 0x4a, 0x5e, 0x23, 0x01, 0x60, 0x13, 0x4b, 0x5e, + 0x48, 0x5e, 0x70, 0x1c, 0xf7, 0xfd, 0xfb, 0x6e, 0x49, 0x5d, 0x4a, 0x5e, 0x78, 0x0b, 0x1e, 0x58, + 0x41, 0x83, 0x60, 0x13, 0x1c, 0x1d, 0x00, 0x9f, 0xe0, 0x8e, 0x4b, 0x54, 0x68, 0x1b, 0x93, 0x01, + 0x00, 0xab, 0x9a, 0x01, 0x19, 0x5b, 0x00, 0xdb, 0x18, 0xd3, 0x4a, 0x56, 0x67, 0x5d, 0x60, 0x15, + 0x6f, 0x1b, 0x4a, 0x50, 0x2b, 0x00, 0xd0, 0x4d, 0x23, 0x01, 0x60, 0x13, 0x1c, 0x28, 0xf7, 0xff, + 0xfc, 0xa7, 0x1c, 0x04, 0x20, 0x14, 0xf7, 0xfc, 0xfd, 0x77, 0x4a, 0x48, 0x68, 0x13, 0x68, 0x9b, + 0x33, 0x44, 0x19, 0xdb, 0x68, 0x19, 0x2c, 0x00, 0xdb, 0x05, 0x4b, 0x4b, 0x1c, 0x0a, 0x40, 0x1a, + 0x4b, 0x4a, 0x42, 0x9a, 0xd0, 0x0c, 0x1c, 0x28, 0xf7, 0xff, 0xfd, 0x46, 0x1c, 0x04, 0x20, 0x14, + 0xf7, 0xfc, 0xfd, 0x62, 0x4b, 0x3d, 0x68, 0x1b, 0x68, 0x9b, 0x33, 0x44, 0x19, 0xdb, 0x68, 0x19, + 0x4e, 0x3c, 0x23, 0x01, 0x60, 0x33, 0x2c, 0x00, 0xdb, 0x54, 0x4b, 0x3f, 0x1c, 0x0a, 0x40, 0x1a, + 0x4b, 0x3e, 0x42, 0x9a, 0xd1, 0x4e, 0x00, 0xa8, 0x19, 0x40, 0x00, 0xc0, 0x9a, 0x01, 0x30, 0x58, + 0x18, 0x10, 0xf7, 0xff, 0xfa, 0x87, 0x28, 0x00, 0xd1, 0x44, 0x4b, 0x2f, 0x22, 0x01, 0x60, 0x1a, + 0x60, 0x30, 0x48, 0x37, 0xf7, 0xfc, 0xfa, 0xd2, 0x4b, 0x2c, 0x48, 0x36, 0x68, 0x1b, 0x68, 0x9a, + 0x23, 0x04, 0x60, 0x93, 0xf7, 0xfd, 0xfb, 0x0e, 0x4b, 0x33, 0x68, 0x1b, 0x1c, 0x18, 0x1e, 0x42, + 0x41, 0x90, 0xe0, 0x45, 0x23, 0x01, 0x60, 0x13, 0x4a, 0x24, 0x48, 0x30, 0x68, 0x13, 0x68, 0x9b, + 0x33, 0x44, 0x19, 0xdb, 0x68, 0x1c, 0x1c, 0x21, 0xf7, 0xfd, 0xfa, 0xfc, 0x23, 0x01, 0x42, 0x1c, + 0xd0, 0x19, 0x1c, 0x28, 0xf7, 0xff, 0xfd, 0x00, 0x1c, 0x04, 0x20, 0x14, 0xf7, 0xfc, 0xfd, 0x1c, + 0x4a, 0x1a, 0x68, 0x13, 0x68, 0x9b, 0x33, 0x44, 0x19, 0xdb, 0x68, 0x1a, 0x2c, 0x00, 0xdb, 0x04, + 0x4b, 0x1d, 0x40, 0x1a, 0x4b, 0x1d, 0x42, 0x9a, 0xd0, 0x02, 0x1c, 0x28, 0xf7, 0xff, 0xfc, 0x38, + 0x4a, 0x13, 0x23, 0x65, 0xe0, 0x04, 0x4a, 0x12, 0x68, 0x13, 0x33, 0x01, 0xd1, 0x02, 0x23, 0x64, + 0x42, 0x5b, 0x60, 0x13, 0x35, 0x01, 0x37, 0x04, 0x4a, 0x11, 0x78, 0x13, 0x2b, 0x00, 0xd1, 0x01, + 0x23, 0x01, 0xe0, 0x00, 0x23, 0x02, 0x42, 0x9d, 0xda, 0x00, 0xe7, 0x66, 0x48, 0x10, 0xf7, 0xfc, + 0xfa, 0x85, 0x9a, 0x00, 0x68, 0x13, 0x68, 0x9a, 0x23, 0x04, 0x60, 0x93, 0x4b, 0x04, 0x68, 0x18, + 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x13, 0x70, 0x67, 0x98, 0x13, 0x70, 0x60, 0x34, + 0x13, 0x70, 0x67, 0xa8, 0x13, 0x70, 0x67, 0x6c, 0x13, 0x70, 0x67, 0x9c, 0x13, 0x70, 0x65, 0xc6, + 0x13, 0x70, 0x01, 0x0c, 0x13, 0x70, 0x67, 0x78, 0x00, 0x00, 0x31, 0x05, 0x00, 0x00, 0x10, 0x05, + 0x13, 0x70, 0x12, 0xd9, 0x13, 0x70, 0x66, 0x43, 0x13, 0x70, 0x67, 0x94, 0x13, 0x70, 0x66, 0x59, + 0xb5, 0xf0, 0x4b, 0x21, 0x49, 0x21, 0x78, 0x1a, 0xb0, 0x81, 0x1e, 0x50, 0x41, 0x82, 0x60, 0x0a, + 0x1c, 0x15, 0x00, 0x96, 0x1c, 0x18, 0x21, 0x01, 0x4f, 0x1d, 0xe0, 0x28, 0x00, 0xab, 0x68, 0x3a, + 0x19, 0x5b, 0x00, 0xdb, 0x18, 0xd2, 0x67, 0x55, 0x68, 0x3b, 0x1d, 0x32, 0x68, 0x9b, 0x33, 0x44, + 0x19, 0x9b, 0x68, 0x1b, 0x42, 0x0b, 0xd0, 0x18, 0x1c, 0x28, 0xf7, 0xff, 0xfc, 0x8d, 0x1c, 0x04, + 0x20, 0x14, 0xf7, 0xfc, 0xfc, 0xa9, 0x68, 0x3b, 0x68, 0x9b, 0x33, 0x44, 0x19, 0x9b, 0x68, 0x1a, + 0x2c, 0x00, 0xdb, 0x04, 0x4b, 0x0f, 0x40, 0x1a, 0x4b, 0x0f, 0x42, 0x9a, 0xd0, 0x02, 0x1c, 0x28, + 0xf7, 0xff, 0xfb, 0xc6, 0x20, 0x65, 0x42, 0x40, 0xe0, 0x0a, 0x35, 0x01, 0x1c, 0x16, 0x78, 0x03, + 0x2b, 0x00, 0xd1, 0x01, 0x23, 0x01, 0xe0, 0x00, 0x23, 0x02, 0x42, 0x9d, 0xdb, 0xce, 0x20, 0x00, + 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x13, 0x70, 0x01, 0x0c, 0x13, 0x70, 0x67, 0x78, + 0x13, 0x70, 0x60, 0x34, 0x00, 0x00, 0x39, 0x05, 0x00, 0x00, 0x10, 0x05, 0xb5, 0xf0, 0xb0, 0x81, + 0x1c, 0x06, 0x07, 0xc2, 0xd4, 0x01, 0x20, 0x01, 0xe0, 0x38, 0x4b, 0x35, 0x68, 0x1c, 0x2c, 0x00, + 0xd0, 0x09, 0x6b, 0x60, 0x21, 0x60, 0xf7, 0xfb, 0xfc, 0xdf, 0x6b, 0x60, 0x21, 0x60, 0xf0, 0x00, + 0xf8, 0x71, 0x6b, 0xa4, 0xe7, 0xf3, 0x4c, 0x2f, 0x68, 0x23, 0x2b, 0x00, 0xd0, 0x1a, 0x6c, 0x58, + 0x21, 0x20, 0xf7, 0xfb, 0xfc, 0xd1, 0x68, 0x23, 0x21, 0x20, 0x6c, 0x58, 0xf0, 0x00, 0xf8, 0x62, + 0x68, 0x22, 0x23, 0x80, 0x04, 0x5b, 0x61, 0x13, 0x4b, 0x27, 0x68, 0x22, 0x68, 0x1b, 0x21, 0x20, + 0x6b, 0x5b, 0x61, 0x53, 0x68, 0x23, 0x6c, 0x58, 0xf7, 0xfb, 0xfc, 0x96, 0x68, 0x23, 0x4a, 0x23, + 0x69, 0x9b, 0x60, 0x13, 0x4b, 0x1e, 0x68, 0x18, 0xf7, 0xfc, 0xfc, 0xc6, 0x28, 0x00, 0xd0, 0x05, + 0x4b, 0x1f, 0x20, 0x05, 0x68, 0x1a, 0x23, 0x00, 0x64, 0x13, 0x42, 0x40, 0x07, 0x73, 0xd5, 0x24, + 0x4a, 0x1b, 0x25, 0x80, 0x4f, 0x1b, 0x24, 0x00, 0x46, 0x94, 0x01, 0xad, 0x46, 0x62, 0x68, 0x13, + 0x00, 0xa2, 0x68, 0x9b, 0x33, 0x44, 0x18, 0x99, 0x68, 0x3b, 0x68, 0x0a, 0x42, 0x9c, 0xd1, 0x0c, + 0x21, 0x01, 0x42, 0x0a, 0xd1, 0x0e, 0x4b, 0x14, 0x22, 0x20, 0x60, 0x19, 0x49, 0x13, 0x20, 0x01, + 0x68, 0x0b, 0x42, 0x40, 0x43, 0x93, 0x60, 0x0b, 0xe0, 0x04, 0x4b, 0x11, 0x40, 0x13, 0x2b, 0x03, + 0xd1, 0x00, 0x60, 0x0d, 0x34, 0x01, 0x2c, 0x04, 0xd1, 0xe0, 0x28, 0x00, 0xd0, 0x04, 0x23, 0x12, + 0x42, 0x1e, 0xd0, 0x01, 0x20, 0x06, 0x42, 0x40, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, + 0x13, 0x70, 0x67, 0x88, 0x13, 0x70, 0x67, 0x8c, 0x13, 0x70, 0x67, 0xc4, 0x13, 0x70, 0x67, 0x90, + 0x13, 0x70, 0x60, 0x34, 0x13, 0x70, 0x67, 0x78, 0x13, 0x70, 0x67, 0x6c, 0x0d, 0x80, 0x00, 0xc0, + 0x00, 0x00, 0x20, 0x03, 0x47, 0x70, 0x46, 0xc0, 0x47, 0x70, 0x46, 0xc0, 0xb5, 0x00, 0x4b, 0x04, + 0xb0, 0x81, 0x1c, 0x01, 0x68, 0x18, 0xf7, 0xfb, 0xfc, 0x17, 0xb0, 0x01, 0xbc, 0x01, 0x47, 0x00, + 0x13, 0x70, 0x60, 0x40, 0xb5, 0x00, 0x4b, 0x0d, 0x1c, 0x01, 0xb0, 0x81, 0x68, 0x18, 0x22, 0x20, + 0xf7, 0xfb, 0xfc, 0x46, 0x28, 0x00, 0xd1, 0x0d, 0x48, 0x09, 0xf7, 0xfb, 0xfc, 0x15, 0xf0, 0x00, + 0xf9, 0x29, 0x20, 0xc8, 0xf7, 0xfc, 0xfb, 0xd8, 0xf0, 0x00, 0xf9, 0x18, 0x20, 0xc8, 0xf7, 0xfc, + 0xfb, 0xd3, 0xe7, 0xf4, 0xb0, 0x01, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, 0x13, 0x70, 0x60, 0x40, + 0x13, 0x70, 0x66, 0x76, 0xb5, 0x00, 0xb0, 0x81, 0xf7, 0xfb, 0xfb, 0xf6, 0xb0, 0x01, 0xbc, 0x01, + 0x47, 0x00, 0x46, 0xc0, 0xb5, 0x00, 0xb0, 0x81, 0xf7, 0xfb, 0xfb, 0xee, 0xb0, 0x01, 0xbc, 0x01, + 0x47, 0x00, 0x46, 0xc0, 0xb5, 0x00, 0xb0, 0x81, 0xf7, 0xfb, 0xfb, 0xe6, 0xb0, 0x01, 0xbc, 0x01, + 0x47, 0x00, 0x46, 0xc0, 0xb5, 0x10, 0x1c, 0x04, 0xf7, 0xfb, 0xfb, 0xfe, 0x1c, 0x20, 0xbc, 0x10, + 0xbc, 0x02, 0x47, 0x08, 0xb5, 0x10, 0x1c, 0x04, 0xf7, 0xfb, 0xfb, 0xf6, 0x1c, 0x20, 0xbc, 0x10, + 0xbc, 0x02, 0x47, 0x08, 0xb5, 0x10, 0x1c, 0x04, 0xf7, 0xfb, 0xfb, 0xee, 0x1c, 0x20, 0xbc, 0x10, + 0xbc, 0x02, 0x47, 0x08, 0xb5, 0x00, 0x21, 0xe0, 0xb0, 0x81, 0x48, 0x07, 0x02, 0x09, 0xf7, 0xfb, + 0xfb, 0xa3, 0x4b, 0x06, 0x60, 0x18, 0x28, 0x00, 0xdb, 0x01, 0x20, 0x00, 0xe0, 0x01, 0x20, 0x01, + 0x42, 0x40, 0xb0, 0x01, 0xbc, 0x02, 0x47, 0x08, 0x13, 0x70, 0xa0, 0x00, 0x13, 0x70, 0x60, 0x40, + 0xb5, 0xf0, 0x4b, 0x27, 0x1c, 0x06, 0x68, 0x18, 0xb0, 0x87, 0x91, 0x05, 0x28, 0x00, 0xd0, 0x01, + 0xf7, 0xfc, 0xf8, 0xe0, 0x4f, 0x23, 0x4a, 0x22, 0x68, 0x3d, 0x23, 0x00, 0x60, 0x13, 0x2d, 0x00, + 0xd1, 0x17, 0xf7, 0xff, 0xfd, 0xbd, 0x4c, 0x20, 0x1c, 0x20, 0xf7, 0xfc, 0xfd, 0xa3, 0x4b, 0x1f, + 0x1c, 0x02, 0x60, 0x18, 0x28, 0x00, 0xd0, 0x2d, 0x68, 0x23, 0x92, 0x00, 0x9a, 0x05, 0x48, 0x1c, + 0x92, 0x01, 0x21, 0x00, 0x22, 0x00, 0x95, 0x02, 0xf0, 0x00, 0xfb, 0xfc, 0x60, 0x38, 0x28, 0x00, + 0xd0, 0x20, 0x4d, 0x18, 0x68, 0x2c, 0x2c, 0x00, 0xd0, 0x0b, 0x48, 0x17, 0x1c, 0x31, 0x22, 0x06, + 0xf0, 0x00, 0xfe, 0xc8, 0x28, 0x00, 0xd0, 0x16, 0x1c, 0x20, 0xf0, 0x00, 0xfa, 0x0b, 0x23, 0x00, + 0x60, 0x2b, 0x4b, 0x0c, 0x1c, 0x31, 0x68, 0x18, 0xf0, 0x00, 0xfa, 0x14, 0x4b, 0x0d, 0x60, 0x18, + 0x28, 0x00, 0xd0, 0x04, 0x48, 0x0c, 0x1c, 0x31, 0x22, 0x06, 0xf0, 0x00, 0xfe, 0xdf, 0x4b, 0x09, + 0x68, 0x1c, 0xe0, 0x00, 0x24, 0x00, 0xb0, 0x07, 0x1c, 0x20, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, + 0x13, 0x70, 0x67, 0xd0, 0x13, 0x70, 0x67, 0xd4, 0x13, 0x72, 0xc3, 0xa0, 0x13, 0x72, 0xc3, 0xa4, + 0x13, 0x70, 0x4b, 0x61, 0x13, 0x70, 0x67, 0xd8, 0x13, 0x70, 0x60, 0x44, 0xb5, 0x30, 0x4b, 0x0f, + 0xb0, 0x81, 0x68, 0x18, 0x28, 0x00, 0xd0, 0x01, 0xf7, 0xfc, 0xf8, 0x84, 0x4c, 0x0c, 0x4b, 0x0b, + 0x68, 0x20, 0x25, 0x00, 0x60, 0x1d, 0x28, 0x00, 0xd0, 0x02, 0xf0, 0x00, 0xf9, 0xd3, 0x60, 0x25, + 0x4b, 0x08, 0x68, 0x18, 0x28, 0x00, 0xd0, 0x01, 0xf0, 0x00, 0xfa, 0x50, 0x4a, 0x05, 0x23, 0x00, + 0xb0, 0x01, 0x60, 0x13, 0xbc, 0x30, 0xbc, 0x01, 0x47, 0x00, 0x46, 0xc0, 0x13, 0x70, 0x67, 0xd0, + 0x13, 0x70, 0x67, 0xd8, 0x13, 0x70, 0x67, 0xd4, 0xb5, 0x10, 0x4c, 0x0b, 0x68, 0x20, 0x28, 0x00, + 0xd0, 0x03, 0xf0, 0x00, 0xf9, 0xb7, 0x23, 0x00, 0x60, 0x23, 0x4c, 0x08, 0x68, 0x23, 0x2b, 0x00, + 0xd1, 0x03, 0x48, 0x07, 0xf7, 0xfc, 0xf8, 0x62, 0x60, 0x20, 0x4a, 0x06, 0x23, 0x01, 0x42, 0x5b, + 0x60, 0x13, 0xbc, 0x10, 0xbc, 0x01, 0x47, 0x00, 0x13, 0x70, 0x67, 0xd8, 0x13, 0x70, 0x67, 0xd0, + 0x00, 0x00, 0x80, 0x20, 0x13, 0x70, 0x60, 0x10, 0xb5, 0xf0, 0x4f, 0x0f, 0x1c, 0x1e, 0x68, 0x3b, + 0x1c, 0x15, 0x1c, 0x0c, 0x1c, 0x30, 0x1c, 0x19, 0x43, 0x51, 0xb0, 0x81, 0xf7, 0xfb, 0xfb, 0x24, + 0x1c, 0x20, 0x1c, 0x29, 0x1c, 0x32, 0xf7, 0xff, 0xfc, 0x17, 0x28, 0x00, 0xd1, 0x01, 0x20, 0x01, + 0xe0, 0x06, 0x68, 0x3b, 0x1c, 0x30, 0x1c, 0x19, 0x43, 0x69, 0xf7, 0xfb, 0xfa, 0xf5, 0x20, 0x00, + 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x13, 0x72, 0xc3, 0xa0, 0xb5, 0x00, 0xb0, 0x81, + 0x20, 0x81, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0xf7, 0xfb, 0xfb, 0x2e, 0xb0, 0x01, 0xbc, 0x01, + 0x47, 0x00, 0x46, 0xc0, 0xb5, 0x00, 0xb0, 0x81, 0x20, 0x80, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, + 0xf7, 0xfb, 0xfb, 0x22, 0xb0, 0x01, 0xbc, 0x01, 0x47, 0x00, 0x46, 0xc0, 0xb5, 0x30, 0x1c, 0x0d, + 0x1c, 0x04, 0x1c, 0x13, 0xb0, 0x81, 0x1c, 0x2a, 0x1c, 0x21, 0x20, 0x10, 0xf7, 0xfb, 0xfb, 0x14, + 0xb0, 0x01, 0xbc, 0x30, 0xbc, 0x02, 0x47, 0x08, 0xb5, 0x00, 0x1c, 0x03, 0xb0, 0x81, 0x1c, 0x0a, + 0x20, 0x06, 0x1c, 0x19, 0x23, 0x00, 0xf7, 0xfb, 0xfb, 0x07, 0xb0, 0x01, 0xbc, 0x01, 0x47, 0x00, + 0xb5, 0x00, 0x1c, 0x03, 0xb0, 0x81, 0x1c, 0x0a, 0x20, 0x05, 0x1c, 0x19, 0x23, 0x00, 0xf7, 0xfb, + 0xfa, 0xfb, 0xb0, 0x01, 0xbc, 0x01, 0x47, 0x00, 0xb5, 0x30, 0xb0, 0x81, 0x1c, 0x04, 0x1c, 0x0d, + 0x1c, 0x13, 0x2a, 0x00, 0xdd, 0x04, 0x20, 0x09, 0x1c, 0x21, 0x1c, 0x2a, 0xf7, 0xfb, 0xfa, 0xec, + 0xb0, 0x01, 0xbc, 0x30, 0xbc, 0x01, 0x47, 0x00, 0xb5, 0x30, 0xb0, 0x81, 0x1c, 0x04, 0x1c, 0x0d, + 0x1c, 0x13, 0x2a, 0x00, 0xdd, 0x04, 0x20, 0x02, 0x1c, 0x21, 0x1c, 0x2a, 0xf7, 0xfb, 0xfa, 0xdc, + 0xb0, 0x01, 0xbc, 0x30, 0xbc, 0x01, 0x47, 0x00, 0xb5, 0x00, 0xb0, 0x81, 0x20, 0x12, 0x21, 0x00, + 0x22, 0x00, 0x23, 0x00, 0xf7, 0xfb, 0xfa, 0xd0, 0xb0, 0x01, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, + 0xb5, 0x00, 0xb0, 0x81, 0x20, 0x11, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0xf7, 0xfb, 0xfa, 0xc4, + 0xb0, 0x01, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, 0xb5, 0x00, 0xb0, 0x81, 0x20, 0x01, 0x21, 0x00, + 0x22, 0x00, 0x23, 0x00, 0xf7, 0xfb, 0xfa, 0xb8, 0xb0, 0x01, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, + 0xb5, 0x00, 0x1c, 0x03, 0xb0, 0x81, 0x1c, 0x0a, 0x20, 0x00, 0x1c, 0x19, 0x23, 0x00, 0xf7, 0xfb, + 0xfa, 0xab, 0xb0, 0x01, 0xbc, 0x01, 0x47, 0x00, 0xb5, 0xf0, 0xb0, 0x8d, 0x90, 0x04, 0x92, 0x03, + 0x93, 0x02, 0x68, 0x05, 0x1c, 0x0a, 0x6a, 0x6e, 0x1e, 0xb3, 0x40, 0xda, 0x04, 0x13, 0x0c, 0x1b, + 0x93, 0x06, 0x9b, 0x04, 0x7a, 0x28, 0x68, 0x5a, 0x9b, 0x06, 0x6a, 0x2c, 0x33, 0x80, 0x00, 0x5b, + 0x5a, 0xd3, 0x68, 0x6f, 0x93, 0x0a, 0x2b, 0x00, 0xd1, 0x00, 0xe0, 0xc5, 0x1e, 0x63, 0x40, 0xc3, + 0x1a, 0x36, 0x93, 0x08, 0x96, 0x07, 0x1e, 0x83, 0x1c, 0x0a, 0x9e, 0x08, 0x40, 0xda, 0x08, 0xbb, + 0x40, 0x16, 0x3b, 0x01, 0x1c, 0x0a, 0x40, 0x1a, 0x92, 0x09, 0xd1, 0x02, 0x9b, 0x03, 0x93, 0x0b, + 0xe0, 0x89, 0x9b, 0x07, 0x9a, 0x0a, 0x40, 0x9a, 0x92, 0x05, 0x6a, 0xeb, 0x18, 0xf3, 0x18, 0x99, + 0x4a, 0x58, 0x92, 0x01, 0x68, 0x13, 0x6c, 0xef, 0x42, 0x8b, 0xd1, 0x05, 0x4a, 0x56, 0x4b, 0x57, + 0x68, 0x12, 0x68, 0x19, 0x1c, 0x38, 0xe0, 0x14, 0x6b, 0x2c, 0x6b, 0xa8, 0x22, 0x01, 0x1c, 0x3b, + 0xf0, 0x00, 0xf8, 0xa6, 0x1c, 0x04, 0x28, 0x00, 0xd0, 0x00, 0xe0, 0x96, 0x6a, 0xeb, 0x9a, 0x05, + 0x18, 0xf3, 0x18, 0x9b, 0x9a, 0x01, 0x60, 0x13, 0x4b, 0x4c, 0x6c, 0xe9, 0x68, 0x18, 0x4b, 0x4a, + 0x68, 0x1a, 0xf0, 0x00, 0xfd, 0x7b, 0x9b, 0x09, 0x00, 0x9a, 0x68, 0x6b, 0x1a, 0x9c, 0x9b, 0x02, + 0x42, 0x9c, 0xd9, 0x00, 0x1c, 0x1c, 0x6c, 0xe9, 0x98, 0x03, 0x18, 0x89, 0x1c, 0x22, 0xf0, 0x00, + 0xfd, 0x6d, 0x9a, 0x02, 0x9b, 0x03, 0x1b, 0x12, 0x92, 0x02, 0x9a, 0x08, 0x19, 0x1c, 0x36, 0x01, + 0x94, 0x0b, 0x42, 0x96, 0xd9, 0x47, 0x9b, 0x02, 0x2b, 0x00, 0xd0, 0x44, 0x9b, 0x06, 0x33, 0x01, + 0x04, 0x1b, 0x0c, 0x1b, 0x93, 0x06, 0x9b, 0x04, 0x68, 0x5a, 0x9b, 0x06, 0x33, 0x80, 0x00, 0x5b, + 0x5a, 0xd3, 0x93, 0x0a, 0x2b, 0x00, 0xd0, 0x5f, 0x26, 0x00, 0xe0, 0x34, 0x7a, 0x2b, 0x9f, 0x02, + 0x6a, 0x2a, 0x40, 0xdf, 0x19, 0xbb, 0x42, 0x93, 0xd9, 0x00, 0x1b, 0x97, 0x9a, 0x07, 0x6a, 0xe9, + 0x9b, 0x0a, 0x18, 0x71, 0x40, 0x93, 0x18, 0xc9, 0x6b, 0x2c, 0x6b, 0xa8, 0x1c, 0x3a, 0x9b, 0x0b, + 0xf0, 0x00, 0xf8, 0x56, 0x1c, 0x04, 0x28, 0x00, 0xd1, 0x47, 0x7a, 0x2b, 0x1c, 0x39, 0x40, 0x99, + 0x9b, 0x02, 0x9a, 0x08, 0x1a, 0x5b, 0x19, 0xf6, 0x93, 0x02, 0x42, 0x96, 0xd9, 0x10, 0x2b, 0x00, + 0xd0, 0x0e, 0x9b, 0x06, 0x33, 0x01, 0x04, 0x1b, 0x0c, 0x1b, 0x93, 0x06, 0x9b, 0x04, 0x68, 0x5a, + 0x9b, 0x06, 0x33, 0x80, 0x00, 0x5b, 0x5a, 0xd3, 0x93, 0x0a, 0x2b, 0x00, 0xd0, 0x2c, 0x26, 0x00, + 0x9a, 0x0b, 0x18, 0x52, 0x92, 0x0b, 0x68, 0x6b, 0x9a, 0x02, 0x42, 0x9a, 0xd2, 0xc6, 0x2a, 0x00, + 0xd1, 0x01, 0x24, 0x00, 0xe0, 0x21, 0x9b, 0x07, 0x9f, 0x0a, 0x6a, 0xe9, 0x40, 0x9f, 0x18, 0x71, + 0x6b, 0x2c, 0x6b, 0xa8, 0x19, 0xc9, 0x6c, 0xeb, 0x22, 0x01, 0xf0, 0x00, 0xf8, 0x21, 0x1c, 0x04, + 0x28, 0x00, 0xd1, 0x12, 0x6a, 0xeb, 0x4a, 0x0b, 0x18, 0xf3, 0x19, 0xdb, 0x60, 0x13, 0x4b, 0x0b, + 0x6c, 0xe9, 0x68, 0x18, 0x4b, 0x08, 0x68, 0x1a, 0xf0, 0x00, 0xfc, 0xf8, 0x6c, 0xe9, 0x98, 0x0b, + 0x9a, 0x02, 0xf0, 0x00, 0xfc, 0xf3, 0xe0, 0x00, 0x24, 0x01, 0xb0, 0x0d, 0x1c, 0x20, 0xbc, 0xf0, + 0xbc, 0x02, 0x47, 0x08, 0x13, 0x70, 0x60, 0x4c, 0x13, 0x70, 0x67, 0xe0, 0x13, 0x70, 0x67, 0xdc, + 0x47, 0x20, 0x46, 0xc0, 0xb5, 0x10, 0x68, 0x02, 0x1c, 0x04, 0x6d, 0x13, 0x3b, 0x01, 0x65, 0x13, + 0x68, 0x40, 0xf7, 0xfb, 0xfe, 0x9f, 0x1c, 0x20, 0xf7, 0xfb, 0xfe, 0x9c, 0xbc, 0x10, 0xbc, 0x01, + 0x47, 0x00, 0x46, 0xc0, 0xb5, 0xf0, 0x1c, 0x03, 0x33, 0x48, 0x88, 0x1a, 0x7a, 0x03, 0xb0, 0x83, + 0x41, 0x1a, 0x92, 0x01, 0x23, 0x01, 0x4a, 0x30, 0x42, 0x5b, 0x27, 0x00, 0x1c, 0x05, 0x1c, 0x0e, + 0x60, 0x13, 0x97, 0x00, 0xe0, 0x4f, 0x68, 0x2b, 0x19, 0xdb, 0x7b, 0x1b, 0x2b, 0x00, 0xd0, 0x45, + 0x6a, 0xe9, 0x9a, 0x00, 0x31, 0x01, 0x18, 0x89, 0x6b, 0xa8, 0x22, 0x01, 0x6c, 0xeb, 0x6b, 0x2c, + 0xf0, 0x00, 0xf8, 0x52, 0x6c, 0xe9, 0x1c, 0x30, 0x22, 0x06, 0xf0, 0x00, 0xfc, 0x83, 0x28, 0x00, + 0xd1, 0x34, 0x20, 0x0c, 0xf7, 0xfb, 0xfe, 0x7a, 0x1c, 0x06, 0x28, 0x00, 0xd1, 0x09, 0x48, 0x1f, + 0xf7, 0xfb, 0xf9, 0x3a, 0x48, 0x1e, 0xf7, 0xfb, 0xf9, 0x37, 0x48, 0x1e, 0xf7, 0xfb, 0xf9, 0x34, + 0xe0, 0x2d, 0x1c, 0x2b, 0x33, 0x48, 0x60, 0x05, 0x60, 0x87, 0x88, 0x18, 0xf7, 0xfb, 0xfe, 0x66, + 0x1c, 0x03, 0x60, 0x70, 0x28, 0x00, 0xd1, 0x0c, 0x48, 0x14, 0xf7, 0xfb, 0xf9, 0x25, 0x48, 0x14, + 0xf7, 0xfb, 0xf9, 0x22, 0x48, 0x13, 0xf7, 0xfb, 0xf9, 0x1f, 0x1c, 0x30, 0xf7, 0xfb, 0xfe, 0x4a, + 0xe0, 0x14, 0x6a, 0xe9, 0x9a, 0x00, 0x31, 0x01, 0x18, 0x89, 0x6b, 0xa8, 0x6b, 0x2c, 0x9a, 0x01, + 0xf0, 0x00, 0xf8, 0x1a, 0x6d, 0x2b, 0x33, 0x01, 0x65, 0x2b, 0xe0, 0x08, 0x9b, 0x00, 0x9a, 0x01, + 0x37, 0x01, 0x18, 0x9b, 0x93, 0x00, 0x8f, 0xab, 0x42, 0x9f, 0xd3, 0xac, 0x26, 0x00, 0xb0, 0x03, + 0x1c, 0x30, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x13, 0x70, 0x60, 0x4c, 0x13, 0x70, 0x66, 0x95, + 0x13, 0x70, 0x66, 0xa1, 0x13, 0x70, 0x66, 0x41, 0x47, 0x20, 0x46, 0xc0, 0xb5, 0x10, 0x6d, 0x03, + 0x1c, 0x04, 0x2b, 0x00, 0xd0, 0x09, 0x48, 0x0d, 0xf7, 0xfb, 0xf8, 0xee, 0x48, 0x0c, 0xf7, 0xfb, + 0xf8, 0xeb, 0x48, 0x0c, 0xf7, 0xfb, 0xf8, 0xe8, 0xe0, 0x0d, 0x68, 0x00, 0xf7, 0xfb, 0xfe, 0x12, + 0x6c, 0xe0, 0xf7, 0xfb, 0xfe, 0x0f, 0x6c, 0x60, 0x28, 0x00, 0xd0, 0x01, 0xf7, 0xfb, 0xfe, 0x0a, + 0x1c, 0x20, 0xf7, 0xfb, 0xfe, 0x07, 0xbc, 0x10, 0xbc, 0x01, 0x47, 0x00, 0x13, 0x70, 0x66, 0x95, + 0x13, 0x70, 0x66, 0xb3, 0x13, 0x70, 0x66, 0x41, 0xb5, 0xf0, 0xb0, 0x85, 0x90, 0x03, 0x20, 0x54, + 0x91, 0x02, 0x92, 0x01, 0x1c, 0x1f, 0xf7, 0xfb, 0xfe, 0x01, 0x1c, 0x05, 0x2f, 0x00, 0xd1, 0x02, + 0x20, 0x80, 0x00, 0x80, 0xe0, 0x00, 0x1c, 0x38, 0xf7, 0xfb, 0xfd, 0xf8, 0x23, 0x80, 0x02, 0x1b, + 0x61, 0x2b, 0x1c, 0x06, 0x23, 0x00, 0x33, 0x01, 0x06, 0x1b, 0x0e, 0x1b, 0x2b, 0x10, 0xd1, 0xfa, + 0x23, 0x0f, 0x75, 0x2b, 0x4b, 0x81, 0x60, 0x2e, 0x61, 0xeb, 0x9a, 0x0b, 0x4b, 0x80, 0x62, 0xea, + 0x60, 0x1f, 0x9b, 0x0a, 0x20, 0x00, 0x0b, 0xd9, 0x17, 0xfa, 0x1c, 0x3b, 0xf0, 0x00, 0xfb, 0xae, + 0x61, 0xa9, 0x9c, 0x0c, 0x2c, 0x00, 0xd0, 0x32, 0x1c, 0x30, 0x21, 0x00, 0x1c, 0x3a, 0xf0, 0x00, + 0xfc, 0x49, 0x23, 0x57, 0x70, 0x33, 0x23, 0x42, 0x70, 0x73, 0x23, 0x46, 0x70, 0xb3, 0x23, 0x53, + 0x70, 0xf3, 0x1c, 0x3c, 0x23, 0x00, 0xe0, 0x03, 0x33, 0x01, 0x06, 0x1b, 0x0e, 0x1b, 0x08, 0x64, + 0x2c, 0x00, 0xd1, 0xf9, 0x3b, 0x01, 0x72, 0x33, 0x9a, 0x0a, 0x21, 0x80, 0x0e, 0x13, 0x71, 0x33, + 0x0c, 0x13, 0x71, 0x73, 0x0a, 0x13, 0x71, 0xf2, 0x71, 0xb3, 0x69, 0xac, 0x22, 0x06, 0x20, 0x06, + 0x02, 0x49, 0x1c, 0x0b, 0x40, 0x83, 0x42, 0x9c, 0xd3, 0x05, 0x1c, 0x53, 0x06, 0x1b, 0x0e, 0x1a, + 0x30, 0x01, 0x2a, 0x0b, 0xd1, 0xf5, 0x7d, 0x2b, 0x18, 0xd3, 0x72, 0x73, 0xe0, 0x06, 0x6a, 0xe9, + 0x98, 0x01, 0x22, 0x01, 0x1c, 0x33, 0x9c, 0x03, 0xf0, 0x00, 0xf8, 0xca, 0x78, 0x33, 0x78, 0x72, + 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, 0x78, 0xb3, 0x02, 0x1b, 0x43, 0x13, 0x78, 0xf2, 0x43, 0x1a, + 0x4b, 0x58, 0x42, 0x9a, 0xd0, 0x04, 0x48, 0x58, 0xf7, 0xfb, 0xf8, 0x56, 0x48, 0x57, 0xe0, 0x2f, + 0x4b, 0x57, 0x68, 0x1b, 0x42, 0x59, 0x41, 0x59, 0x29, 0x00, 0xd0, 0x36, 0x2f, 0x00, 0xd0, 0x11, + 0x7a, 0x30, 0x1c, 0x3a, 0x33, 0x01, 0x06, 0x1b, 0x08, 0x52, 0x0e, 0x1b, 0x2a, 0x00, 0xd1, 0xf9, + 0x3b, 0x01, 0x06, 0x1b, 0x0e, 0x1b, 0x42, 0x98, 0xd0, 0x04, 0x48, 0x4b, 0xf7, 0xfb, 0xf8, 0x3c, + 0x48, 0x4c, 0xe0, 0x15, 0x29, 0x00, 0xd0, 0x20, 0x9a, 0x0a, 0x2a, 0x00, 0xd0, 0x1d, 0x79, 0x32, + 0x79, 0x73, 0x06, 0x12, 0x04, 0x1b, 0x43, 0x13, 0x79, 0xb2, 0x9c, 0x0a, 0x02, 0x12, 0x43, 0x1a, + 0x79, 0xf3, 0x43, 0x13, 0x42, 0xa3, 0xd0, 0x10, 0x48, 0x3f, 0xf7, 0xfb, 0xf8, 0x25, 0x48, 0x42, + 0xf7, 0xfb, 0xf8, 0x22, 0x48, 0x41, 0xf7, 0xfb, 0xf8, 0x1f, 0x1c, 0x28, 0xf7, 0xfb, 0xfd, 0x4a, + 0x1c, 0x30, 0xf7, 0xfb, 0xfd, 0x47, 0x25, 0x00, 0xe0, 0x63, 0x7a, 0x33, 0x24, 0x01, 0x1c, 0x27, + 0x40, 0x9f, 0x60, 0x6f, 0x7a, 0x33, 0x69, 0x29, 0x72, 0x2b, 0x79, 0x33, 0x79, 0x72, 0x06, 0x1b, + 0x04, 0x12, 0x43, 0x1a, 0x79, 0xb3, 0x79, 0xf0, 0x02, 0x1b, 0x43, 0x13, 0x43, 0x18, 0x60, 0xe8, + 0xf0, 0x00, 0xfa, 0x72, 0x1c, 0x39, 0x43, 0x41, 0x61, 0xa9, 0x7a, 0x72, 0x7d, 0x2b, 0x62, 0x6a, + 0x40, 0x94, 0x1a, 0xd2, 0x69, 0xeb, 0x40, 0xd1, 0x40, 0xd3, 0x04, 0x1b, 0x0c, 0x1b, 0x04, 0x3a, + 0x85, 0x6b, 0x0c, 0x12, 0x33, 0x80, 0x85, 0x29, 0x00, 0x5b, 0x1e, 0x51, 0x18, 0xc9, 0x42, 0x52, + 0x1c, 0x2b, 0x40, 0x11, 0x33, 0x48, 0x80, 0x19, 0x62, 0x2c, 0x9a, 0x03, 0x63, 0x2a, 0x9b, 0x02, + 0x63, 0x6b, 0x9a, 0x01, 0x8d, 0x2b, 0x63, 0xaa, 0x08, 0xda, 0x7a, 0x2b, 0x1a, 0xa4, 0x40, 0xdc, + 0x64, 0x2c, 0x9b, 0x0c, 0x2b, 0x00, 0xd1, 0x01, 0x64, 0x6b, 0xe0, 0x0b, 0x1e, 0x78, 0x18, 0x80, + 0x42, 0x7b, 0x40, 0x18, 0xf7, 0xfb, 0xfd, 0x0a, 0x8d, 0x2a, 0x64, 0x68, 0x08, 0xd2, 0x21, 0xff, + 0xf0, 0x00, 0xfb, 0x78, 0x1c, 0x2b, 0x33, 0x48, 0x88, 0x19, 0x6c, 0x28, 0x7a, 0x2b, 0x38, 0x01, + 0x41, 0x19, 0xf0, 0x00, 0xfa, 0x31, 0x68, 0x6b, 0x04, 0x00, 0x0c, 0x00, 0x3b, 0x0c, 0x87, 0xa8, + 0x42, 0x98, 0xd9, 0x00, 0x87, 0xab, 0x68, 0x68, 0xf7, 0xfb, 0xfc, 0xf0, 0x23, 0x00, 0x64, 0xe8, + 0x65, 0x2b, 0xb0, 0x05, 0x1c, 0x28, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x00, 0x04, 0x60, 0x90, + 0x13, 0x70, 0x67, 0xe0, 0x57, 0x42, 0x46, 0x53, 0x13, 0x70, 0x66, 0x95, 0x13, 0x70, 0x66, 0xdf, + 0x13, 0x70, 0x67, 0xe4, 0x13, 0x70, 0x66, 0xe9, 0x13, 0x70, 0x67, 0x06, 0x13, 0x70, 0x66, 0x41, + 0x47, 0x20, 0x46, 0xc0, 0xb5, 0xf0, 0xb0, 0xa5, 0x90, 0x0c, 0x1c, 0x18, 0x92, 0x0a, 0x93, 0x09, + 0x91, 0x0b, 0xf7, 0xfb, 0xfc, 0xcb, 0x4b, 0x8c, 0x22, 0x01, 0x4c, 0x8c, 0x42, 0x52, 0x60, 0x1a, + 0x68, 0x23, 0x1c, 0x05, 0x2b, 0x00, 0xd1, 0x03, 0x98, 0x09, 0xf7, 0xfb, 0xfc, 0xbf, 0x60, 0x20, + 0x4b, 0x87, 0x99, 0x09, 0x98, 0x0a, 0x60, 0x19, 0x22, 0x01, 0x21, 0x00, 0x1c, 0x2b, 0x9c, 0x0c, + 0xf0, 0x00, 0xf9, 0x18, 0x28, 0x00, 0xd0, 0x00, 0xe0, 0xf4, 0x23, 0xff, 0x00, 0x5b, 0x5c, 0xeb, + 0x2b, 0x55, 0xd1, 0x1b, 0x4b, 0x7f, 0x5c, 0xeb, 0x2b, 0xaa, 0xd1, 0x17, 0x1c, 0xe8, 0x49, 0x7e, + 0x22, 0x04, 0xf0, 0x00, 0xfb, 0x9d, 0x28, 0x00, 0xd0, 0x10, 0x4c, 0x7c, 0x1c, 0x28, 0x30, 0x36, + 0x1c, 0x21, 0x22, 0x03, 0xf0, 0x00, 0xfb, 0x94, 0x28, 0x00, 0xd0, 0x07, 0x1c, 0x28, 0x30, 0x52, + 0x1c, 0x21, 0x22, 0x03, 0xf0, 0x00, 0xfb, 0x8c, 0x28, 0x00, 0xd1, 0x05, 0xa8, 0x14, 0x21, 0x00, + 0x22, 0x40, 0xf0, 0x00, 0xfa, 0xff, 0xe0, 0x06, 0x22, 0xdf, 0x00, 0x52, 0x18, 0xa9, 0xa8, 0x14, + 0x22, 0x40, 0xf0, 0x00, 0xfa, 0xb3, 0x23, 0x01, 0x21, 0xe4, 0x42, 0x5b, 0x24, 0x00, 0x00, 0x49, + 0xae, 0x14, 0x93, 0x11, 0x94, 0x12, 0x91, 0x07, 0x78, 0x2b, 0x78, 0x6a, 0x06, 0x1b, 0x04, 0x12, + 0x43, 0x1a, 0x78, 0xab, 0x7a, 0x37, 0x02, 0x1b, 0x43, 0x13, 0x78, 0xea, 0x7a, 0x70, 0x43, 0x1a, + 0x4b, 0x63, 0x7a, 0xb1, 0x7a, 0xf4, 0x42, 0x9a, 0xd0, 0x03, 0x79, 0x33, 0x2b, 0x00, 0xd1, 0x00, + 0xe0, 0xa3, 0x04, 0x0a, 0x02, 0x03, 0x43, 0x13, 0x43, 0x3b, 0x1c, 0x1f, 0x79, 0x33, 0x06, 0x22, + 0x43, 0x17, 0x2b, 0x0f, 0xd1, 0x69, 0x22, 0xe3, 0x21, 0x00, 0x00, 0x52, 0x91, 0x13, 0x92, 0x08, + 0x19, 0xc9, 0x91, 0x05, 0x98, 0x0a, 0x22, 0x01, 0x1c, 0x2b, 0x9c, 0x0c, 0xf0, 0x00, 0xf8, 0xb2, + 0x28, 0x00, 0xd0, 0x00, 0xe0, 0x8e, 0x49, 0x53, 0x9c, 0x07, 0x5c, 0x6a, 0x5d, 0x2b, 0x99, 0x08, + 0x04, 0x1b, 0x02, 0x12, 0x43, 0x1a, 0x4c, 0x50, 0x5c, 0x6b, 0x99, 0x05, 0x43, 0x1a, 0x5d, 0x2b, + 0x98, 0x0a, 0x06, 0x1b, 0x43, 0x1a, 0x18, 0x8a, 0x23, 0xeb, 0x92, 0x05, 0x00, 0x5b, 0x5c, 0xeb, + 0x1c, 0x11, 0x93, 0x0d, 0x4b, 0x49, 0x22, 0x01, 0x5c, 0xeb, 0x9c, 0x0c, 0x93, 0x0e, 0x23, 0xec, + 0x00, 0x5b, 0x5c, 0xeb, 0x93, 0x0f, 0x4b, 0x46, 0x5c, 0xeb, 0x93, 0x10, 0x1c, 0x2b, 0xf0, 0x00, + 0xf8, 0x89, 0x28, 0x00, 0xd1, 0x66, 0x78, 0x2b, 0x78, 0x6a, 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, + 0x78, 0xab, 0x02, 0x1b, 0x43, 0x13, 0x78, 0xea, 0x43, 0x1a, 0x4b, 0x39, 0x42, 0x9a, 0xd1, 0x12, + 0x99, 0x12, 0x9a, 0x2b, 0x42, 0x91, 0xd1, 0x05, 0x9b, 0x05, 0x9c, 0x2c, 0x90, 0x00, 0x93, 0x01, + 0x94, 0x02, 0xe0, 0x38, 0x99, 0x05, 0x9a, 0x11, 0x42, 0x91, 0xd0, 0x04, 0x9b, 0x12, 0x9c, 0x05, + 0x33, 0x01, 0x93, 0x12, 0x94, 0x11, 0x99, 0x0e, 0x9c, 0x0f, 0x02, 0x0b, 0x04, 0x22, 0x99, 0x0d, + 0x43, 0x13, 0x9c, 0x10, 0x43, 0x0b, 0x06, 0x22, 0x1c, 0x19, 0x43, 0x11, 0xd0, 0x35, 0x9a, 0x13, + 0x32, 0x01, 0x92, 0x13, 0x2a, 0x08, 0xd1, 0x9b, 0xe0, 0x2f, 0x98, 0x0a, 0x1c, 0x39, 0x22, 0x01, + 0x1c, 0x2b, 0x9c, 0x0c, 0xf0, 0x00, 0xf8, 0x4e, 0x28, 0x00, 0xd1, 0x2b, 0x78, 0x2b, 0x78, 0x6a, + 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, 0x78, 0xab, 0x02, 0x1b, 0x43, 0x13, 0x78, 0xea, 0x43, 0x1a, + 0x4b, 0x1b, 0x42, 0x9a, 0xd1, 0x19, 0x99, 0x12, 0x9a, 0x2b, 0x42, 0x91, 0xd1, 0x0e, 0x9b, 0x2c, + 0x90, 0x00, 0x97, 0x01, 0x93, 0x02, 0x98, 0x0c, 0x99, 0x0b, 0x9a, 0x0a, 0x9b, 0x09, 0xf7, 0xff, + 0xfd, 0xc3, 0x1c, 0x04, 0x1c, 0x28, 0xf7, 0xfb, 0xfb, 0xbd, 0xe0, 0x0f, 0x9c, 0x11, 0x42, 0xa7, + 0xd0, 0x03, 0x99, 0x12, 0x97, 0x11, 0x31, 0x01, 0x91, 0x12, 0xab, 0x20, 0x42, 0x9e, 0xd0, 0x01, + 0x36, 0x10, 0xe7, 0x41, 0x1c, 0x28, 0xf7, 0xfb, 0xfb, 0xad, 0x24, 0x00, 0xb0, 0x25, 0x1c, 0x20, + 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, 0x13, 0x70, 0x60, 0x4c, 0x13, 0x70, 0x67, 0xdc, + 0x13, 0x70, 0x67, 0xe0, 0x00, 0x00, 0x01, 0xff, 0x13, 0x70, 0x67, 0x22, 0x13, 0x70, 0x67, 0x27, + 0x57, 0x42, 0x46, 0x53, 0x00, 0x00, 0x01, 0xc7, 0x00, 0x00, 0x01, 0xc9, 0x00, 0x00, 0x01, 0xd7, + 0x00, 0x00, 0x01, 0xd9, 0x47, 0x20, 0x46, 0xc0, 0xef, 0x00, 0x00, 0xcc, 0xe1, 0x2f, 0xff, 0x1e, + 0xe1, 0xa0, 0x00, 0x00, 0xe1, 0xa0, 0x00, 0x00, 0xe6, 0x00, 0x00, 0x10, 0xe1, 0x2f, 0xff, 0x1e, + 0xe6, 0x00, 0x00, 0x30, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x00, 0x50, 0xe1, 0x2f, 0xff, 0x1e, + 0xe6, 0x00, 0x00, 0x70, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x00, 0x90, 0xe1, 0x2f, 0xff, 0x1e, + 0xe6, 0x00, 0x00, 0xb0, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x00, 0xd0, 0xe1, 0x2f, 0xff, 0x1e, + 0xe6, 0x00, 0x00, 0xf0, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x01, 0x10, 0xe1, 0x2f, 0xff, 0x1e, + 0xe6, 0x00, 0x01, 0x30, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x01, 0x50, 0xe1, 0x2f, 0xff, 0x1e, + 0xe6, 0x00, 0x01, 0x70, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x01, 0x90, 0xe1, 0x2f, 0xff, 0x1e, + 0xe6, 0x00, 0x01, 0xb0, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x01, 0xd0, 0xe1, 0x2f, 0xff, 0x1e, + 0xe6, 0x00, 0x01, 0xf0, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x02, 0x10, 0xe1, 0x2f, 0xff, 0x1e, + 0xe6, 0x00, 0x02, 0x30, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x02, 0x50, 0xe1, 0x2f, 0xff, 0x1e, + 0xe6, 0x00, 0x02, 0x70, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x02, 0x90, 0xe1, 0x2f, 0xff, 0x1e, + 0xe6, 0x00, 0x02, 0xb0, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x02, 0xd0, 0xe1, 0x2f, 0xff, 0x1e, + 0xe6, 0x00, 0x02, 0xf0, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x03, 0x10, 0xe1, 0x2f, 0xff, 0x1e, + 0xe6, 0x00, 0x03, 0x30, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x03, 0x50, 0xe1, 0x2f, 0xff, 0x1e, + 0xe6, 0x00, 0x03, 0x70, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x03, 0x90, 0xe1, 0x2f, 0xff, 0x1e, + 0xe6, 0x00, 0x03, 0xb0, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x03, 0xd0, 0xe1, 0x2f, 0xff, 0x1e, + 0xe6, 0x00, 0x03, 0xf0, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x04, 0x10, 0xe1, 0x2f, 0xff, 0x1e, + 0xe6, 0x00, 0x04, 0x30, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x04, 0x50, 0xe1, 0x2f, 0xff, 0x1e, + 0xe6, 0x00, 0x04, 0x70, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x04, 0x90, 0xe1, 0x2f, 0xff, 0x1e, + 0xe6, 0x00, 0x04, 0xb0, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x04, 0xd0, 0xe1, 0x2f, 0xff, 0x1e, + 0xe6, 0x00, 0x04, 0xf0, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x05, 0x10, 0xe1, 0x2f, 0xff, 0x1e, + 0xe6, 0x00, 0x05, 0x30, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x05, 0x50, 0xe1, 0x2f, 0xff, 0x1e, + 0xe6, 0x00, 0x06, 0x90, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x07, 0xf0, 0xe1, 0x2f, 0xff, 0x1e, + 0xe6, 0x00, 0x08, 0x10, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x0a, 0x10, 0xe1, 0x2f, 0xff, 0x1e, + 0xe2, 0x90, 0x10, 0x00, 0xe3, 0xb0, 0x00, 0x04, 0xef, 0x00, 0x00, 0xab, 0xe1, 0x2f, 0xff, 0x1e, + 0xe1, 0xa0, 0x00, 0x00, 0xe1, 0xa0, 0x00, 0x00, 0x29, 0x00, 0xd0, 0x34, 0x23, 0x01, 0x22, 0x00, + 0xb4, 0x10, 0x42, 0x88, 0xd3, 0x2c, 0x24, 0x01, 0x07, 0x24, 0x42, 0xa1, 0xd2, 0x04, 0x42, 0x81, + 0xd2, 0x02, 0x01, 0x09, 0x01, 0x1b, 0xe7, 0xf8, 0x00, 0xe4, 0x42, 0xa1, 0xd2, 0x04, 0x42, 0x81, + 0xd2, 0x02, 0x00, 0x49, 0x00, 0x5b, 0xe7, 0xf8, 0x42, 0x88, 0xd3, 0x01, 0x1a, 0x40, 0x43, 0x1a, + 0x08, 0x4c, 0x42, 0xa0, 0xd3, 0x02, 0x1b, 0x00, 0x08, 0x5c, 0x43, 0x22, 0x08, 0x8c, 0x42, 0xa0, + 0xd3, 0x02, 0x1b, 0x00, 0x08, 0x9c, 0x43, 0x22, 0x08, 0xcc, 0x42, 0xa0, 0xd3, 0x02, 0x1b, 0x00, + 0x08, 0xdc, 0x43, 0x22, 0x28, 0x00, 0xd0, 0x03, 0x09, 0x1b, 0xd0, 0x01, 0x09, 0x09, 0xe7, 0xe3, + 0x1c, 0x10, 0xbc, 0x10, 0x47, 0x70, 0xb5, 0x02, 0xf0, 0x00, 0xf8, 0x5e, 0x20, 0x00, 0xbc, 0x06, + 0x47, 0x10, 0x46, 0xc0, 0xb5, 0x03, 0xf7, 0xff, 0xff, 0xbf, 0xbc, 0x0e, 0x43, 0x42, 0x1a, 0x89, + 0x47, 0x18, 0x46, 0xc0, 0x29, 0x00, 0xd0, 0x41, 0xb4, 0x10, 0x1c, 0x04, 0x40, 0x4c, 0x46, 0xa4, + 0x23, 0x01, 0x22, 0x00, 0x29, 0x00, 0xd5, 0x00, 0x42, 0x49, 0x28, 0x00, 0xd5, 0x00, 0x42, 0x40, + 0x42, 0x88, 0xd3, 0x2c, 0x24, 0x01, 0x07, 0x24, 0x42, 0xa1, 0xd2, 0x04, 0x42, 0x81, 0xd2, 0x02, + 0x01, 0x09, 0x01, 0x1b, 0xe7, 0xf8, 0x00, 0xe4, 0x42, 0xa1, 0xd2, 0x04, 0x42, 0x81, 0xd2, 0x02, + 0x00, 0x49, 0x00, 0x5b, 0xe7, 0xf8, 0x42, 0x88, 0xd3, 0x01, 0x1a, 0x40, 0x43, 0x1a, 0x08, 0x4c, + 0x42, 0xa0, 0xd3, 0x02, 0x1b, 0x00, 0x08, 0x5c, 0x43, 0x22, 0x08, 0x8c, 0x42, 0xa0, 0xd3, 0x02, + 0x1b, 0x00, 0x08, 0x9c, 0x43, 0x22, 0x08, 0xcc, 0x42, 0xa0, 0xd3, 0x02, 0x1b, 0x00, 0x08, 0xdc, + 0x43, 0x22, 0x28, 0x00, 0xd0, 0x03, 0x09, 0x1b, 0xd0, 0x01, 0x09, 0x09, 0xe7, 0xe3, 0x1c, 0x10, + 0x46, 0x64, 0x2c, 0x00, 0xd5, 0x00, 0x42, 0x40, 0xbc, 0x10, 0x47, 0x70, 0xb5, 0x02, 0xf0, 0x00, + 0xf8, 0x0b, 0x20, 0x00, 0xbc, 0x06, 0x47, 0x10, 0xb5, 0x03, 0xf7, 0xff, 0xff, 0xb3, 0xbc, 0x0e, + 0x43, 0x42, 0x1a, 0x89, 0x47, 0x18, 0x46, 0xc0, 0x47, 0x70, 0x46, 0xc0, 0xb5, 0xf0, 0x46, 0x57, + 0x46, 0x46, 0xb4, 0xc0, 0x1c, 0x1e, 0x4b, 0x16, 0x46, 0x90, 0x1c, 0x0a, 0x40, 0x1a, 0x40, 0x33, + 0x46, 0x82, 0x1c, 0x10, 0x43, 0x58, 0x0c, 0x0c, 0x1c, 0x0f, 0x0c, 0x31, 0x46, 0x84, 0x43, 0x4a, + 0x1c, 0x20, 0x43, 0x58, 0x1c, 0x25, 0x43, 0x4d, 0x46, 0x61, 0x18, 0x82, 0x0c, 0x0b, 0x18, 0xd2, + 0x42, 0x90, 0xd9, 0x02, 0x23, 0x80, 0x02, 0x5b, 0x18, 0xed, 0x4b, 0x09, 0x46, 0x61, 0x04, 0x14, + 0x0c, 0x10, 0x40, 0x0b, 0x18, 0x2a, 0x18, 0xe1, 0x46, 0x40, 0x43, 0x78, 0x46, 0x53, 0x43, 0x73, + 0x18, 0xc0, 0x18, 0x80, 0xbc, 0x0c, 0x46, 0x90, 0x46, 0x9a, 0xbc, 0xf0, 0xbc, 0x04, 0x47, 0x10, + 0x00, 0x00, 0xff, 0xff, 0xb5, 0x70, 0x1c, 0x0e, 0x1c, 0x15, 0x1c, 0x04, 0x2a, 0x03, 0xd9, 0x20, + 0x1c, 0x33, 0x43, 0x03, 0x07, 0x9a, 0xd0, 0x12, 0x78, 0x23, 0x78, 0x08, 0x42, 0x83, 0xd1, 0x1b, + 0x1e, 0x6a, 0xe0, 0x06, 0x34, 0x01, 0x31, 0x01, 0x78, 0x23, 0x78, 0x08, 0x3a, 0x01, 0x42, 0x83, + 0xd1, 0x12, 0x2a, 0x00, 0xd1, 0xf6, 0x20, 0x00, 0xbc, 0x70, 0xbc, 0x02, 0x47, 0x08, 0x68, 0x02, + 0x68, 0x0b, 0x42, 0x9a, 0xd1, 0x04, 0x3d, 0x04, 0x30, 0x04, 0x31, 0x04, 0x2d, 0x03, 0xd8, 0xf6, + 0x1c, 0x04, 0x2d, 0x00, 0xd1, 0xe0, 0xe7, 0xee, 0x1a, 0x18, 0xe7, 0xed, 0xb5, 0xf0, 0x1c, 0x07, + 0x1c, 0x0e, 0x1c, 0x04, 0x1c, 0x15, 0x1c, 0x08, 0x1c, 0x11, 0x2a, 0x0f, 0xd9, 0x03, 0x1c, 0x33, + 0x43, 0x3b, 0x07, 0x9a, 0xd0, 0x0b, 0x29, 0x00, 0xd0, 0x05, 0x22, 0x00, 0x5c, 0x83, 0x54, 0xa3, + 0x32, 0x01, 0x42, 0x8a, 0xd1, 0xfa, 0x1c, 0x38, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x1c, 0x3a, + 0x1c, 0x31, 0x1c, 0x28, 0x68, 0x0b, 0x60, 0x13, 0x68, 0x4b, 0x60, 0x53, 0x68, 0x8b, 0x60, 0x93, + 0x68, 0xcb, 0x38, 0x10, 0x60, 0xd3, 0x31, 0x10, 0x32, 0x10, 0x28, 0x0f, 0xd8, 0xf2, 0x1c, 0x2b, + 0x3b, 0x10, 0x09, 0x1a, 0x01, 0x11, 0x32, 0x01, 0x01, 0x12, 0x1a, 0x59, 0x18, 0xb0, 0x18, 0xbc, + 0x29, 0x03, 0xd9, 0xd8, 0x22, 0x00, 0x58, 0x83, 0x50, 0xa3, 0x32, 0x04, 0x1a, 0x8b, 0x2b, 0x03, + 0xd8, 0xf9, 0x1f, 0x0b, 0x08, 0x9a, 0x00, 0x91, 0x32, 0x01, 0x00, 0x92, 0x1a, 0x59, 0x18, 0x80, + 0x18, 0xa4, 0xe7, 0xc8, 0xb5, 0xf0, 0x1c, 0x07, 0x46, 0x8c, 0x1c, 0x10, 0x1c, 0x39, 0x07, 0xba, + 0xd0, 0x0e, 0x28, 0x00, 0xd0, 0x49, 0x46, 0x62, 0x06, 0x13, 0x38, 0x01, 0x0e, 0x1b, 0x22, 0x03, + 0xe0, 0x02, 0x28, 0x00, 0xd0, 0x41, 0x38, 0x01, 0x70, 0x0b, 0x31, 0x01, 0x42, 0x11, 0xd1, 0xf8, + 0x1c, 0x05, 0x1c, 0x0a, 0x28, 0x03, 0xd9, 0x2e, 0x23, 0xff, 0x46, 0x62, 0x40, 0x1a, 0x02, 0x13, + 0x43, 0x13, 0x04, 0x1a, 0x1c, 0x14, 0x1c, 0x0e, 0x43, 0x1c, 0x28, 0x0f, 0xd9, 0x12, 0x1c, 0x02, + 0x1c, 0x0b, 0x3a, 0x10, 0x60, 0x1c, 0x60, 0x5c, 0x60, 0x9c, 0x60, 0xdc, 0x33, 0x10, 0x2a, 0x0f, + 0xd8, 0xf7, 0x1c, 0x03, 0x3b, 0x10, 0x1c, 0x1d, 0x09, 0x1b, 0x33, 0x01, 0x22, 0x0f, 0x01, 0x1b, + 0x40, 0x15, 0x18, 0xce, 0x2d, 0x03, 0xd9, 0x0d, 0x22, 0x00, 0x50, 0xb4, 0x32, 0x04, 0x1a, 0xab, + 0x2b, 0x03, 0xd8, 0xfa, 0x1f, 0x2b, 0x1c, 0x1d, 0x08, 0x9b, 0x33, 0x01, 0x22, 0x03, 0x00, 0x9b, + 0x40, 0x15, 0x18, 0xf6, 0x1c, 0x32, 0x2d, 0x00, 0xd0, 0x07, 0x46, 0x61, 0x06, 0x0b, 0x0e, 0x19, + 0x23, 0x00, 0x54, 0xd1, 0x33, 0x01, 0x42, 0x9d, 0xd1, 0xfb, 0x1c, 0x38, 0xbc, 0xf0, 0xbc, 0x02, + 0x47, 0x08, 0x46, 0xc0, 0xb5, 0x30, 0x1c, 0x0b, 0x43, 0x03, 0x07, 0x9a, 0xd1, 0x1c, 0x68, 0x02, + 0x68, 0x0b, 0x42, 0x9a, 0xd1, 0x18, 0x4c, 0x10, 0x19, 0x13, 0x43, 0x93, 0x4a, 0x0f, 0x42, 0x13, + 0xd1, 0x0b, 0x1c, 0x14, 0x30, 0x04, 0x31, 0x04, 0x68, 0x02, 0x68, 0x0b, 0x42, 0x9a, 0xd1, 0x0b, + 0x4d, 0x09, 0x19, 0x53, 0x43, 0x93, 0x42, 0x23, 0xd0, 0xf4, 0x20, 0x00, 0xe0, 0x09, 0x78, 0x0a, + 0x42, 0x9a, 0xd1, 0x05, 0x30, 0x01, 0x31, 0x01, 0x78, 0x03, 0x2b, 0x00, 0xd1, 0xf7, 0x78, 0x0a, + 0x1a, 0x98, 0xbc, 0x30, 0xbc, 0x02, 0x47, 0x08, 0xfe, 0xfe, 0xfe, 0xff, 0x80, 0x80, 0x80, 0x80, + 0xb5, 0x70, 0x1c, 0x04, 0x2a, 0x00, 0xd0, 0x41, 0x1c, 0x0b, 0x43, 0x03, 0x07, 0x98, 0xd1, 0x2c, + 0x1c, 0x20, 0x1c, 0x0d, 0x2a, 0x03, 0xd9, 0x26, 0x68, 0x24, 0x68, 0x0b, 0x42, 0x9c, 0xd1, 0x22, + 0x3a, 0x04, 0x2a, 0x00, 0xd0, 0x32, 0x49, 0x1b, 0x18, 0x63, 0x49, 0x1b, 0x43, 0xa3, 0x42, 0x0b, + 0xd1, 0x2c, 0x1c, 0x0c, 0xe0, 0x0b, 0x68, 0x01, 0x68, 0x2b, 0x42, 0x99, 0xd1, 0x13, 0x3a, 0x04, + 0x2a, 0x00, 0xd0, 0x23, 0x4e, 0x13, 0x19, 0x8b, 0x43, 0x8b, 0x42, 0x23, 0xd1, 0x1e, 0x30, 0x04, + 0x35, 0x04, 0x2a, 0x03, 0xd8, 0xef, 0x1c, 0x04, 0x1c, 0x29, 0x2a, 0x00, 0xd1, 0x05, 0x78, 0x03, + 0x78, 0x28, 0x1a, 0x18, 0xe0, 0x13, 0x1c, 0x04, 0x1c, 0x29, 0x78, 0x23, 0x78, 0x08, 0x3a, 0x01, + 0x42, 0x98, 0xd0, 0x09, 0xe7, 0xf5, 0x28, 0x00, 0xd0, 0x08, 0x34, 0x01, 0x31, 0x01, 0x78, 0x23, + 0x78, 0x08, 0x42, 0x98, 0xd1, 0xed, 0x3a, 0x01, 0x2a, 0x00, 0xd1, 0xf4, 0x20, 0x00, 0xbc, 0x70, + 0xbc, 0x02, 0x47, 0x08, 0xfe, 0xfe, 0xfe, 0xff, 0x80, 0x80, 0x80, 0x80, 0x49, 0x4f, 0x53, 0x20, + 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x1f, 0xf0, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x13, 0x72, 0xc2, 0xa4, 0x00, 0x0f, 0x42, 0x40, 0x10, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x2f, 0x64, 0x65, 0x76, + 0x2f, 0x75, 0x73, 0x62, 0x31, 0x32, 0x33, 0x00, 0x2f, 0x64, 0x65, 0x76, 0x2f, 0x75, 0x73, 0x62, + 0x31, 0x32, 0x33, 0x2f, 0x4f, 0x46, 0x46, 0x00, 0x57, 0x42, 0x46, 0x53, 0x20, 0x6e, 0x6f, 0x74, + 0x20, 0x65, 0x6e, 0x6f, 0x75, 0x67, 0x68, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x21, 0x0a, + 0x00, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x67, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, + 0x20, 0x28, 0x25, 0x73, 0x29, 0x0a, 0x00, 0x20, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x00, 0x20, 0x50, + 0x65, 0x72, 0x69, 0x6f, 0x64, 0x69, 0x63, 0x00, 0x20, 0x52, 0x65, 0x63, 0x6c, 0x00, 0x20, 0x48, + 0x61, 0x6c, 0x74, 0x00, 0x20, 0x49, 0x41, 0x41, 0x00, 0x20, 0x46, 0x41, 0x54, 0x41, 0x4c, 0x00, + 0x20, 0x46, 0x4c, 0x52, 0x00, 0x20, 0x50, 0x43, 0x44, 0x00, 0x20, 0x45, 0x52, 0x52, 0x00, 0x20, + 0x49, 0x4e, 0x54, 0x00, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3a, 0x20, + 0x25, 0x78, 0x20, 0x25, 0x73, 0x25, 0x73, 0x25, 0x73, 0x25, 0x73, 0x25, 0x73, 0x25, 0x73, 0x25, + 0x73, 0x25, 0x73, 0x25, 0x73, 0x25, 0x73, 0x0a, 0x00, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x3a, 0x20, 0x25, 0x78, 0x0a, 0x00, 0x75, 0x73, + 0x62, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x72, 0x65, 0x73, 0x65, 0x74, 0x3a, 0x20, + 0x42, 0x55, 0x4c, 0x4b, 0x20, 0x52, 0x45, 0x53, 0x45, 0x54, 0x20, 0x25, 0x69, 0x0a, 0x00, 0x75, + 0x73, 0x62, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x72, 0x65, 0x73, 0x65, 0x74, 0x3a, + 0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x68, 0x61, 0x6c, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x72, 0x65, + 0x74, 0x20, 0x25, 0x69, 0x0a, 0x00, 0x75, 0x73, 0x62, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, + 0x20, 0x72, 0x65, 0x73, 0x65, 0x74, 0x3a, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x68, 0x61, 0x6c, + 0x74, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x72, 0x65, 0x74, 0x20, 0x25, 0x69, 0x0a, 0x00, 0x75, 0x73, + 0x62, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x72, 0x65, 0x73, 0x65, 0x74, 0x3a, 0x20, + 0x55, 0x53, 0x42, 0x5f, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x20, 0x25, 0x69, 0x0a, 0x00, 0x5f, 0x5f, 0x73, + 0x65, 0x6e, 0x64, 0x5f, 0x63, 0x62, 0x77, 0x20, 0x72, 0x65, 0x74, 0x20, 0x25, 0x69, 0x0a, 0x00, + 0x5f, 0x73, 0x65, 0x6e, 0x64, 0x5f, 0x63, 0x62, 0x77, 0x00, 0x5f, 0x5f, 0x55, 0x53, 0x42, 0x5f, + 0x42, 0x6c, 0x6b, 0x4d, 0x73, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x20, 0x25, 0x69, + 0x0a, 0x00, 0x5f, 0x5f, 0x55, 0x53, 0x42, 0x5f, 0x42, 0x6c, 0x6b, 0x4d, 0x73, 0x67, 0x54, 0x69, + 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x00, 0x5f, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x63, 0x73, 0x77, + 0x20, 0x25, 0x69, 0x0a, 0x00, 0x5f, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x63, 0x73, 0x77, 0x00, + 0x20, 0x20, 0x20, 0x20, 0x53, 0x43, 0x53, 0x49, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x5f, 0x55, 0x4e, + 0x49, 0x54, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x59, 0x20, 0x72, 0x65, 0x74, 0x20, 0x25, 0x69, 0x0a, + 0x00, 0x20, 0x20, 0x20, 0x20, 0x53, 0x43, 0x53, 0x49, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, + 0x54, 0x5f, 0x53, 0x45, 0x4e, 0x53, 0x45, 0x20, 0x72, 0x65, 0x74, 0x20, 0x25, 0x69, 0x0a, 0x00, + 0x20, 0x20, 0x20, 0x20, 0x53, 0x43, 0x53, 0x49, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, + 0x5f, 0x53, 0x45, 0x4e, 0x53, 0x45, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x25, 0x78, + 0x0a, 0x00, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x73, 0x74, 0x6f, 0x70, + 0x20, 0x63, 0x6d, 0x64, 0x20, 0x72, 0x65, 0x74, 0x20, 0x25, 0x69, 0x0a, 0x00, 0x20, 0x20, 0x20, + 0x20, 0x49, 0x6e, 0x71, 0x75, 0x69, 0x72, 0x79, 0x20, 0x72, 0x65, 0x74, 0x20, 0x25, 0x69, 0x0a, + 0x00, 0x20, 0x20, 0x20, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x20, 0x54, 0x79, 0x70, 0x65, + 0x3a, 0x20, 0x25, 0x78, 0x0a, 0x00, 0x20, 0x20, 0x20, 0x20, 0x52, 0x65, 0x61, 0x64, 0x43, 0x61, + 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x20, 0x72, 0x65, 0x74, 0x20, 0x25, 0x69, 0x0a, 0x00, 0x55, + 0x53, 0x42, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x4f, 0x70, 0x65, 0x6e, 0x28, 0x29, + 0x3a, 0x20, 0x55, 0x53, 0x42, 0x5f, 0x47, 0x65, 0x74, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x6f, 0x72, 0x73, 0x20, 0x25, 0x69, 0x0a, 0x00, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, 0x55, + 0x53, 0x42, 0x5f, 0x47, 0x65, 0x74, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, + 0x73, 0x00, 0x55, 0x53, 0x42, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x4f, 0x70, 0x65, + 0x6e, 0x28, 0x29, 0x3a, 0x20, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x20, 0x63, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x64, 0x21, 0x21, 0x21, 0x0a, 0x00, 0x55, 0x53, 0x42, 0x53, 0x74, 0x6f, 0x72, 0x61, + 0x67, 0x65, 0x5f, 0x4f, 0x70, 0x65, 0x6e, 0x28, 0x29, 0x3a, 0x20, 0x75, 0x63, 0x64, 0x20, 0x25, + 0x69, 0x20, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x20, 0x25, 0x69, 0x20, 0x6d, 0x41, 0x0a, 0x00, 0x55, + 0x53, 0x42, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x4f, 0x70, 0x65, 0x6e, 0x28, 0x29, + 0x3a, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x20, 0x73, 0x75, 0x62, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x20, 0x25, 0x69, 0x20, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x72, 0x6f, 0x74, + 0x20, 0x25, 0x69, 0x20, 0x0a, 0x00, 0x49, 0x6e, 0x20, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x3a, 0x20, + 0x25, 0x69, 0x0a, 0x00, 0x4f, 0x75, 0x74, 0x20, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x3a, 0x20, 0x25, + 0x69, 0x0a, 0x00, 0x65, 0x70, 0x5f, 0x69, 0x6e, 0x20, 0x25, 0x78, 0x20, 0x65, 0x70, 0x5f, 0x6f, + 0x75, 0x74, 0x20, 0x25, 0x78, 0x0a, 0x00, 0x55, 0x53, 0x42, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, + 0x65, 0x5f, 0x4f, 0x70, 0x65, 0x6e, 0x28, 0x29, 0x3a, 0x20, 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, + 0x20, 0x66, 0x69, 0x6e, 0x64, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, + 0x61, 0x63, 0x65, 0x21, 0x21, 0x21, 0x0a, 0x00, 0x55, 0x53, 0x42, 0x53, 0x74, 0x6f, 0x72, 0x61, + 0x67, 0x65, 0x5f, 0x4f, 0x70, 0x65, 0x6e, 0x28, 0x29, 0x3a, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x3a, + 0x20, 0x25, 0x78, 0x20, 0x61, 0x6c, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, + 0x3a, 0x20, 0x25, 0x78, 0x0a, 0x00, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, 0x55, 0x53, 0x42, 0x5f, + 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x00, 0x55, 0x53, 0x42, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x4f, 0x70, 0x65, 0x6e, + 0x28, 0x29, 0x3a, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x6e, + 0x66, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x25, 0x78, 0x0a, 0x00, 0x42, 0x65, 0x66, 0x6f, 0x72, + 0x65, 0x20, 0x55, 0x53, 0x42, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x52, 0x65, 0x73, + 0x65, 0x74, 0x00, 0x41, 0x66, 0x74, 0x65, 0x72, 0x20, 0x55, 0x53, 0x42, 0x53, 0x74, 0x6f, 0x72, + 0x61, 0x67, 0x65, 0x5f, 0x52, 0x65, 0x73, 0x65, 0x74, 0x00, 0x55, 0x53, 0x42, 0x53, 0x74, 0x6f, + 0x72, 0x61, 0x67, 0x65, 0x5f, 0x4f, 0x70, 0x65, 0x6e, 0x28, 0x29, 0x3a, 0x20, 0x74, 0x72, 0x79, + 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x25, 0x69, 0x0a, 0x00, 0x55, 0x53, 0x42, 0x53, + 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x4f, 0x70, 0x65, 0x6e, 0x28, 0x29, 0x3a, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x30, 0x0a, 0x00, 0x20, 0x43, 0x6c, 0x65, 0x61, 0x72, 0x20, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x72, 0x65, 0x74, 0x20, 0x25, 0x69, 0x0a, 0x00, 0x46, 0x61, + 0x73, 0x74, 0x20, 0x55, 0x53, 0x42, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x4d, 0x6f, + 0x75, 0x6e, 0x74, 0x4c, 0x55, 0x4e, 0x20, 0x25, 0x69, 0x23, 0x0a, 0x00, 0x55, 0x53, 0x42, 0x53, + 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x4c, 0x55, 0x4e, 0x3a, + 0x20, 0x72, 0x65, 0x74, 0x20, 0x25, 0x69, 0x0a, 0x00, 0x55, 0x53, 0x42, 0x53, 0x54, 0x4f, 0x52, + 0x41, 0x47, 0x45, 0x5f, 0x47, 0x45, 0x54, 0x5f, 0x4d, 0x41, 0x58, 0x5f, 0x4c, 0x55, 0x4e, 0x20, + 0x72, 0x65, 0x74, 0x20, 0x25, 0x69, 0x20, 0x6d, 0x61, 0x78, 0x6c, 0x75, 0x6e, 0x20, 0x25, 0x69, + 0x0a, 0x00, 0x55, 0x53, 0x42, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x4d, 0x6f, 0x75, + 0x6e, 0x74, 0x4c, 0x55, 0x4e, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x21, 0x21, 0x21, 0x0a, 0x00, 0x55, + 0x6e, 0x70, 0x6c, 0x75, 0x67, 0x3a, 0x20, 0x72, 0x65, 0x73, 0x65, 0x74, 0x5f, 0x70, 0x6f, 0x72, + 0x74, 0x20, 0x72, 0x65, 0x74, 0x20, 0x25, 0x69, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x20, 0x25, 0x78, 0x0a, 0x00, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x72, 0x65, + 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x4f, 0x4b, 0x0a, 0x00, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x72, + 0x65, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x4b, 0x4f, 0x20, 0x72, 0x65, 0x74, 0x20, 0x25, 0x69, + 0x0a, 0x00, 0x0a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, + 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, + 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, + 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x0a, 0x55, 0x53, 0x42, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, + 0x65, 0x5f, 0x49, 0x6e, 0x69, 0x74, 0x28, 0x29, 0x0a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, + 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, + 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, + 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x0a, 0x0a, 0x00, 0x55, + 0x53, 0x42, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x49, 0x6e, 0x69, 0x74, 0x28, 0x29, + 0x20, 0x4f, 0x6b, 0x0a, 0x00, 0x55, 0x53, 0x42, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, + 0x49, 0x6e, 0x69, 0x74, 0x28, 0x29, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x25, 0x78, + 0x0a, 0x00, 0x55, 0x53, 0x42, 0x20, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x3a, 0x20, 0x6e, 0x6f, 0x74, + 0x20, 0x65, 0x6e, 0x6f, 0x75, 0x67, 0x68, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x21, 0x0a, + 0x00, 0x77, 0x62, 0x66, 0x73, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x00, 0x61, 0x6c, 0x6c, + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x00, 0x74, + 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x20, 0x77, + 0x62, 0x66, 0x73, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x64, 0x69, 0x73, 0x63, 0x73, 0x20, + 0x73, 0x74, 0x69, 0x6c, 0x6c, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x00, 0x62, 0x61, 0x64, 0x20, 0x6d, + 0x61, 0x67, 0x69, 0x63, 0x00, 0x68, 0x64, 0x20, 0x73, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x73, + 0x69, 0x7a, 0x65, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, + 0x68, 0x00, 0x68, 0x64, 0x20, 0x6e, 0x75, 0x6d, 0x20, 0x73, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, + 0x64, 0x6f, 0x65, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x00, 0x4e, 0x54, + 0x46, 0x53, 0x00, 0x46, 0x41, 0x54, 0x00 +}; diff --git a/source/network/http.c b/source/network/http.c index b624ef7d..85dea150 100644 --- a/source/network/http.c +++ b/source/network/http.c @@ -1,261 +1,261 @@ -#include "http.h" -#include "../svnrev.h" - -extern char incommingIP[50]; - -/** - * Emptyblock is a statically defined variable for functions to return if they are unable - * to complete a request - */ -const struct block emptyblock = { 0, NULL }; - -//The maximum amount of bytes to send per net_write() call -//#define NET_BUFFER_SIZE 1024 -#define NET_BUFFER_SIZE 3600 - -// Write our message to the server -static s32 send_message(s32 server, char *msg) -{ - s32 bytes_transferred = 0; - s32 remaining = strlen(msg); - while (remaining) - { - if ((bytes_transferred = net_write(server, msg, remaining > NET_BUFFER_SIZE ? NET_BUFFER_SIZE : remaining)) > 0) - { - remaining -= bytes_transferred; - usleep(20 * 1000); - } - else if (bytes_transferred < 0) - { - return bytes_transferred; - } - else - { - return -ENODATA; - } - } - return 0; -} - -/** - * Connect to a remote server via TCP on a specified port - * - * @param u32 ip address of the server to connect to - * @param u32 the port to connect to on the server - * @return s32 The connection to the server (negative number if connection could not be established) - */ -static s32 server_connect(u32 ipaddress, u32 socket_port) -{ - //Initialize socket - s32 connection = net_socket(AF_INET, SOCK_STREAM, IPPROTO_IP); - if (connection < 0) return connection; - - struct sockaddr_in connect_addr; - memset(&connect_addr, 0, sizeof(connect_addr)); - connect_addr.sin_family = AF_INET; - connect_addr.sin_port = socket_port; - connect_addr.sin_addr.s_addr = ipaddress; - - sprintf(incommingIP, "%s", inet_ntoa(connect_addr.sin_addr)); - - //Attemt to open the socket - if (net_connect(connection, (struct sockaddr*) &connect_addr, sizeof(connect_addr)) == -1) - { - net_close(connection); - return -1; - } - return connection; -} - -//The amount of memory in bytes reserved initially to store the HTTP response in -//Be careful in increasing this number, reading from a socket on the Wii -//will fail if you request more than 20k or so -#define HTTP_BUFFER_SIZE 1024 * 5 - -//The amount of memory the buffer should expanded with if the buffer is full -#define HTTP_BUFFER_GROWTH 1024 * 5 - -/** - * This function reads all the data from a connection into a buffer which it returns. - * It will return an empty buffer if something doesn't go as planned - * - * @param s32 connection The connection identifier to suck the response out of - * @return block A 'block' struct (see http.h) in which the buffer is located - */ -struct block read_message(s32 connection) -{ - //Create a block of memory to put in the response - struct block buffer; - buffer.data = malloc(HTTP_BUFFER_SIZE); - buffer.size = HTTP_BUFFER_SIZE; - - if (buffer.data == NULL) - { - return emptyblock; - } - - //The offset variable always points to the first byte of memory that is free in the buffer - u32 offset = 0; - - while (1) - { - //Fill the buffer with a new batch of bytes from the connection, - //starting from where we left of in the buffer till the end of the buffer - s32 bytes_read = net_read(connection, buffer.data + offset, buffer.size - offset); - - //Anything below 0 is an error in the connection - if (bytes_read < 0) - { - //printf("Connection error from net_read() Errorcode: %i\n", bytes_read); - return emptyblock; - } - - //No more bytes were read into the buffer, - //we assume this means the HTTP response is done - if (bytes_read == 0) - { - break; - } - - offset += bytes_read; - - //Check if we have enough buffer left over, - //if not expand it with an additional HTTP_BUFFER_GROWTH worth of bytes - if (offset >= buffer.size) - { - buffer.size += HTTP_BUFFER_GROWTH; - buffer.data = realloc(buffer.data, buffer.size); - - if (buffer.data == NULL) - { - return emptyblock; - } - } - } - - //At the end of above loop offset should be precisely the amount of bytes that were read from the connection - buffer.size = offset; - - //Shrink the size of the buffer so the data fits exactly in it - buffer.data = realloc(buffer.data, buffer.size); - - return buffer; -} - -/** - * Downloads the contents of a URL to memory - * This method is not threadsafe (because networking is not threadsafe on the Wii) - */ -struct block downloadfile(const char *url) -{ - //Check if the url starts with "http://", if not it is not considered a valid url - if (strncmp(url, "http://", strlen("http://")) != 0) - { - //printf("URL '%s' doesn't start with 'http://'\n", url); - return emptyblock; - } - - //Locate the path part of the url by searching for '/' past "http://" - char *path = strchr(url + strlen("http://"), '/'); - - //At the very least the url has to end with '/', ending with just a domain is invalid - if (path == NULL) - { - //printf("URL '%s' has no PATH part\n", url); - return emptyblock; - } - - //Extract the domain part out of the url - int domainlength = path - url - strlen("http://"); - - if (domainlength == 0) - { - //printf("No domain part in URL '%s'\n", url); - return emptyblock; - } - - char domain[domainlength + 1]; - strlcpy(domain, url + strlen("http://"), domainlength + 1); - - //Parsing of the URL is done, start making an actual connection - u32 ipaddress = getipbynamecached(domain); - - if (ipaddress == 0) - { - //printf("\ndomain %s could not be resolved", domain); - return emptyblock; - } - - s32 connection = server_connect(ipaddress, 80); - - if (connection < 0) - { - //printf("Error establishing connection"); - return emptyblock; - } - - //Form a nice request header to send to the webserver - char* headerformat = "GET %s HTTP/1.0\r\nHost: %s\r\nReferer: %s\r\nUser-Agent: USBLoaderGX r%s\r\n\r\n"; - ; - char header[strlen(headerformat) + strlen(path) + strlen(domain) + strlen(domain)]; - sprintf(header, headerformat, path, domain, domain, GetRev()); - - //Do the request and get the response - send_message(connection, header); - struct block response = read_message(connection); - net_close(connection); - - //Search for the 4-character sequence \r\n\r\n in the response which signals the start of the http payload (file) - unsigned char *filestart = NULL; - u32 filesize = 0; - int i; - for (i = 3; i < response.size; i++) - { - if (response.data[i] == '\n' && response.data[i - 1] == '\r' && response.data[i - 2] == '\n' && response.data[i - - 3] == '\r') - { - filestart = response.data + i + 1; - filesize = response.size - i - 1; - break; - } - } - - if (filestart == NULL) - { - //printf("HTTP Response was without a file\n"); - free(response.data); - return emptyblock; - } - - //Copy the file part of the response into a new memoryblock to return - struct block file; - file.data = malloc(filesize); - file.size = filesize; - - if (file.data == NULL) - { - //printf("No more memory to copy file from HTTP response\n"); - free(response.data); - return emptyblock; - } - - memcpy(file.data, filestart, filesize); - - //Dispose of the original response - free(response.data); - - return file; -} - -s32 GetConnection(char * domain) -{ - - u32 ipaddress = getipbynamecached(domain); - if (ipaddress == 0) - { - return -1; - } - s32 connection = server_connect(ipaddress, 80); - return connection; - -} +#include "http.h" +#include "../svnrev.h" + +extern char incommingIP[50]; + +/** + * Emptyblock is a statically defined variable for functions to return if they are unable + * to complete a request + */ +const struct block emptyblock = { 0, NULL }; + +//The maximum amount of bytes to send per net_write() call +//#define NET_BUFFER_SIZE 1024 +#define NET_BUFFER_SIZE 3600 + +// Write our message to the server +static s32 send_message(s32 server, char *msg) +{ + s32 bytes_transferred = 0; + s32 remaining = strlen(msg); + while (remaining) + { + if ((bytes_transferred = net_write(server, msg, remaining > NET_BUFFER_SIZE ? NET_BUFFER_SIZE : remaining)) > 0) + { + remaining -= bytes_transferred; + usleep(20 * 1000); + } + else if (bytes_transferred < 0) + { + return bytes_transferred; + } + else + { + return -ENODATA; + } + } + return 0; +} + +/** + * Connect to a remote server via TCP on a specified port + * + * @param u32 ip address of the server to connect to + * @param u32 the port to connect to on the server + * @return s32 The connection to the server (negative number if connection could not be established) + */ +static s32 server_connect(u32 ipaddress, u32 socket_port) +{ + //Initialize socket + s32 connection = net_socket(AF_INET, SOCK_STREAM, IPPROTO_IP); + if (connection < 0) return connection; + + struct sockaddr_in connect_addr; + memset(&connect_addr, 0, sizeof(connect_addr)); + connect_addr.sin_family = AF_INET; + connect_addr.sin_port = socket_port; + connect_addr.sin_addr.s_addr = ipaddress; + + sprintf(incommingIP, "%s", inet_ntoa(connect_addr.sin_addr)); + + //Attemt to open the socket + if (net_connect(connection, (struct sockaddr*) &connect_addr, sizeof(connect_addr)) == -1) + { + net_close(connection); + return -1; + } + return connection; +} + +//The amount of memory in bytes reserved initially to store the HTTP response in +//Be careful in increasing this number, reading from a socket on the Wii +//will fail if you request more than 20k or so +#define HTTP_BUFFER_SIZE 1024 * 5 + +//The amount of memory the buffer should expanded with if the buffer is full +#define HTTP_BUFFER_GROWTH 1024 * 5 + +/** + * This function reads all the data from a connection into a buffer which it returns. + * It will return an empty buffer if something doesn't go as planned + * + * @param s32 connection The connection identifier to suck the response out of + * @return block A 'block' struct (see http.h) in which the buffer is located + */ +struct block read_message(s32 connection) +{ + //Create a block of memory to put in the response + struct block buffer; + buffer.data = malloc(HTTP_BUFFER_SIZE); + buffer.size = HTTP_BUFFER_SIZE; + + if (buffer.data == NULL) + { + return emptyblock; + } + + //The offset variable always points to the first byte of memory that is free in the buffer + u32 offset = 0; + + while (1) + { + //Fill the buffer with a new batch of bytes from the connection, + //starting from where we left of in the buffer till the end of the buffer + s32 bytes_read = net_read(connection, buffer.data + offset, buffer.size - offset); + + //Anything below 0 is an error in the connection + if (bytes_read < 0) + { + //printf("Connection error from net_read() Errorcode: %i\n", bytes_read); + return emptyblock; + } + + //No more bytes were read into the buffer, + //we assume this means the HTTP response is done + if (bytes_read == 0) + { + break; + } + + offset += bytes_read; + + //Check if we have enough buffer left over, + //if not expand it with an additional HTTP_BUFFER_GROWTH worth of bytes + if (offset >= buffer.size) + { + buffer.size += HTTP_BUFFER_GROWTH; + buffer.data = realloc(buffer.data, buffer.size); + + if (buffer.data == NULL) + { + return emptyblock; + } + } + } + + //At the end of above loop offset should be precisely the amount of bytes that were read from the connection + buffer.size = offset; + + //Shrink the size of the buffer so the data fits exactly in it + buffer.data = realloc(buffer.data, buffer.size); + + return buffer; +} + +/** + * Downloads the contents of a URL to memory + * This method is not threadsafe (because networking is not threadsafe on the Wii) + */ +struct block downloadfile(const char *url) +{ + //Check if the url starts with "http://", if not it is not considered a valid url + if (strncmp(url, "http://", strlen("http://")) != 0) + { + //printf("URL '%s' doesn't start with 'http://'\n", url); + return emptyblock; + } + + //Locate the path part of the url by searching for '/' past "http://" + char *path = strchr(url + strlen("http://"), '/'); + + //At the very least the url has to end with '/', ending with just a domain is invalid + if (path == NULL) + { + //printf("URL '%s' has no PATH part\n", url); + return emptyblock; + } + + //Extract the domain part out of the url + int domainlength = path - url - strlen("http://"); + + if (domainlength == 0) + { + //printf("No domain part in URL '%s'\n", url); + return emptyblock; + } + + char domain[domainlength + 1]; + strlcpy(domain, url + strlen("http://"), domainlength + 1); + + //Parsing of the URL is done, start making an actual connection + u32 ipaddress = getipbynamecached(domain); + + if (ipaddress == 0) + { + //printf("\ndomain %s could not be resolved", domain); + return emptyblock; + } + + s32 connection = server_connect(ipaddress, 80); + + if (connection < 0) + { + //printf("Error establishing connection"); + return emptyblock; + } + + //Form a nice request header to send to the webserver + char* headerformat = "GET %s HTTP/1.0\r\nHost: %s\r\nReferer: %s\r\nUser-Agent: USBLoaderGX r%s\r\n\r\n"; + ; + char header[strlen(headerformat) + strlen(path) + strlen(domain) + strlen(domain)]; + sprintf(header, headerformat, path, domain, domain, GetRev()); + + //Do the request and get the response + send_message(connection, header); + struct block response = read_message(connection); + net_close(connection); + + //Search for the 4-character sequence \r\n\r\n in the response which signals the start of the http payload (file) + unsigned char *filestart = NULL; + u32 filesize = 0; + int i; + for (i = 3; i < response.size; i++) + { + if (response.data[i] == '\n' && response.data[i - 1] == '\r' && response.data[i - 2] == '\n' && response.data[i + - 3] == '\r') + { + filestart = response.data + i + 1; + filesize = response.size - i - 1; + break; + } + } + + if (filestart == NULL) + { + //printf("HTTP Response was without a file\n"); + free(response.data); + return emptyblock; + } + + //Copy the file part of the response into a new memoryblock to return + struct block file; + file.data = malloc(filesize); + file.size = filesize; + + if (file.data == NULL) + { + //printf("No more memory to copy file from HTTP response\n"); + free(response.data); + return emptyblock; + } + + memcpy(file.data, filestart, filesize); + + //Dispose of the original response + free(response.data); + + return file; +} + +s32 GetConnection(char * domain) +{ + + u32 ipaddress = getipbynamecached(domain); + if (ipaddress == 0) + { + return -1; + } + s32 connection = server_connect(ipaddress, 80); + return connection; + +} diff --git a/source/prompts/PromptWindows.cpp b/source/prompts/PromptWindows.cpp index 7c6e6b38..109f6cd9 100644 --- a/source/prompts/PromptWindows.cpp +++ b/source/prompts/PromptWindows.cpp @@ -52,7 +52,7 @@ int cntMissFiles = 0; static char missingFiles[500][12]; /*** Extern variables ***/ -s32 gameSelected = 0, gameStart = 0; +s32 gameStart = 0; extern float gamesize; extern u8 shutdown; extern u8 reset; @@ -445,7 +445,6 @@ void WindowCredits() int WindowScreensaver() { gprintf("WindowScreenSaver()\n"); - int i = 0; bool exit = false; /* initialize random seed: */ @@ -473,18 +472,15 @@ int WindowScreensaver() while (!exit) { - i++; if (IsWpadConnected()) { exit = true; + break; } - /* Set position only every 400000th loop */ - if ((i % 8000000) == 0) - { /* Set random position */ - GXlogoImg.SetPosition((rand() % 345), (rand() % 305)); - } + GXlogoImg.SetPosition((rand() % 345), (rand() % 305)); + sleep(4); } HaltGui(); @@ -1127,7 +1123,7 @@ void SetFavoriteImages(const u8 * gameid, GuiImage *b1, GuiImage *b2, GuiImage * * Displays a prompt window to user, with information, an error message, or * presenting a user with a choice ***************************************************************************/ -int GameWindowPrompt() +int GameWindowPrompt(int gameSelected) { int choice = -1, angle = 0; f32 size = 0.0; @@ -1531,8 +1527,32 @@ int GameWindowPrompt() else if (nameBtn.GetState() == STATE_CLICKED) //rename { + nameBtn.ResetState(); + if(mountMethod == 3) + { + WindowPrompt(tr("ERROR:"), tr("You can't rename this game"), tr("OK")); + continue; + } + choice = 3; promptWindow.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 50); + while(promptWindow.GetEffect() > 0) usleep(100); + + wiilight(0); + //re-evaluate header now in case they changed games while on the game prompt + struct discHdr *header = gameList[gameSelected]; + + //enter new game title + char entered[60]; + snprintf(entered, sizeof(entered), "%s", GameTitles.GetTitle(header)); + int result = OnScreenKeyboard(entered, 60, 0); + if (result == 1) + { + WBFS_RenameGame(header->id, entered); + wString oldFilter(gameList.GetCurrentFilter()); + gameList.ReadGameList(); + gameList.FilterList(oldFilter.c_str()); + } } else if (btnFavorite1.GetState() == STATE_CLICKED) //switch favorite { diff --git a/source/prompts/PromptWindows.h b/source/prompts/PromptWindows.h index 9067132e..74c9090e 100644 --- a/source/prompts/PromptWindows.h +++ b/source/prompts/PromptWindows.h @@ -18,7 +18,7 @@ void WindowCredits(); int OnScreenKeyboard(char * var, u32 maxlen, int min); int OnScreenNumpad(char * var, u32 maxlen); int WindowExitPrompt(); -int GameWindowPrompt(); +int GameWindowPrompt(int gameSelected); int DiscWait(const char *title, const char *msg, const char *btn1Label, const char *btn2Label, int IsDeviceWait); int FormatingPartition(const char *title, partitionEntry *entry); bool SearchMissingImages(int choice2); diff --git a/source/settings/menus/FlyingButtonsMenu.cpp b/source/settings/menus/FlyingButtonsMenu.cpp index 136e719d..46b8c53e 100644 --- a/source/settings/menus/FlyingButtonsMenu.cpp +++ b/source/settings/menus/FlyingButtonsMenu.cpp @@ -101,7 +101,7 @@ FlyingButtonsMenu::~FlyingButtonsMenu() ResumeGui(); SetEffect(EFFECT_FADE, -FADE_SPEED); - while(this->GetEffect() > 0) usleep(100); + while(parentElement && this->GetEffect() > 0) usleep(100); HaltGui(); if(parentElement) @@ -321,9 +321,8 @@ void FlyingButtonsMenu::AddMainButtons() void FlyingButtonsMenu::ShowButtonsEffects(int effect, int effect_speed) { int FirstItem = currentPage*DISPLAY_BUTTONS; - - if(FirstItem >= (int) MainButton.size()) - return; + if(FirstItem < 0) + FirstItem = 0; HaltGui(); @@ -335,11 +334,14 @@ void FlyingButtonsMenu::ShowButtonsEffects(int effect, int effect_speed) ResumeGui(); + if(FirstItem < 0 || FirstItem >= (int) MainButton.size()) + return; + //! Don't lock on fade in for initiation purpose if(effect & EFFECT_FADE && effect_speed > 0) return; - while (MainButton[FirstItem]->GetEffect() > 0) + while (parentElement && MainButton[FirstItem]->GetEffect() > 0) usleep(100); } diff --git a/source/settings/menus/GUISettingsMenu.cpp b/source/settings/menus/GUISettingsMenu.cpp index e5798f4f..fabc063d 100644 --- a/source/settings/menus/GUISettingsMenu.cpp +++ b/source/settings/menus/GUISettingsMenu.cpp @@ -225,7 +225,11 @@ int GuiSettingsMenu::GetMenuInternal() returnhere = MenuLanguageSelect(); if (returnhere == 2) + { + //! Language changed. Reload game titles with new lang code. + GameTitles.LoadTitlesFromWiiTDB(Settings.titlestxt_path); return MENU_SETTINGS; + } HaltGui(); if(parentElement) diff --git a/source/settings/menus/UninstallSM.cpp b/source/settings/menus/UninstallSM.cpp index c3326712..73b7c809 100644 --- a/source/settings/menus/UninstallSM.cpp +++ b/source/settings/menus/UninstallSM.cpp @@ -31,6 +31,8 @@ #include "prompts/PromptWindows.h" #include "language/gettext.h" #include "usbloader/wbfs.h" +#include "usbloader/GameList.h" +#include "wstring.hpp" extern int mountMethod; @@ -97,6 +99,14 @@ int UninstallSM::GetMenuInternal() int ret = 0; if(!mountMethod) ret = WBFS_RemoveGame(DiscHeader->id); + + if(ret >= 0) + { + wString oldFilter(gameList.GetCurrentFilter()); + gameList.ReadGameList(); + gameList.FilterList(oldFilter.c_str()); + } + if (ret < 0) WindowPrompt(tr( "Can't delete:" ), Title.c_str(), tr( "OK" )); else diff --git a/source/settings/newtitles.h b/source/settings/newtitles.h index 3cc0915a..af30b2c7 100644 --- a/source/settings/newtitles.h +++ b/source/settings/newtitles.h @@ -1,36 +1,36 @@ -#ifndef _NEWTITLES_H -#define _NEWTITLES_H - -#include - -class NewTitles -{ - public: - static NewTitles *Instance(); - static void DestroyInstance(); - - void Save(); - void CheckGame(u8 *titleid); - bool IsNew(u8 *titleid); - void Remove(u8 *titleid); - private: - NewTitles(); - ~NewTitles(); - - static NewTitles *instance; - - class Title - { - public: - u8 titleId[6]; - time_t timestamp; - void *next; - }; - - Title *firstTitle; - Title *lastTitle; - bool isDirty; - bool isNewFile; -}; - -#endif //_NEWTITLES_H +#ifndef _NEWTITLES_H +#define _NEWTITLES_H + +#include + +class NewTitles +{ + public: + static NewTitles *Instance(); + static void DestroyInstance(); + + void Save(); + void CheckGame(u8 *titleid); + bool IsNew(u8 *titleid); + void Remove(u8 *titleid); + private: + NewTitles(); + ~NewTitles(); + + static NewTitles *instance; + + class Title + { + public: + u8 titleId[6]; + time_t timestamp; + void *next; + }; + + Title *firstTitle; + Title *lastTitle; + bool isDirty; + bool isNewFile; +}; + +#endif //_NEWTITLES_H diff --git a/source/sys.cpp b/source/sys.cpp index 1a604d8a..6567a8c3 100644 --- a/source/sys.cpp +++ b/source/sys.cpp @@ -142,7 +142,7 @@ void Sys_Shutdown(void) _Sys_Shutdown(ShutdownToDefault); } -void Sys_ShutdownToIdel(void) +void Sys_ShutdownToIdle(void) { _Sys_Shutdown(ShutdownToIdle); } diff --git a/source/sys.h b/source/sys.h index 3c6beca1..572c22ae 100644 --- a/source/sys.h +++ b/source/sys.h @@ -9,7 +9,7 @@ void ExitApp(void); //! Like AppCleanUp() and additional device unmount void Sys_Init(void); void Sys_Reboot(void); void Sys_Shutdown(void); -void Sys_ShutdownToIdel(void); +void Sys_ShutdownToIdle(void); void Sys_ShutdownToStandby(void); void Sys_LoadMenu(void); void Sys_BackToLoader(void); diff --git a/source/themes/Theme_Downloader.h b/source/themes/Theme_Downloader.h index 95603755..99d867d7 100644 --- a/source/themes/Theme_Downloader.h +++ b/source/themes/Theme_Downloader.h @@ -1,15 +1,15 @@ -/**************************************************************************** - * Theme_Downloader - * USB Loader GX 2009 - * - * Theme downloader for USB Loader GX - * - * Theme_Downloader.h - ***************************************************************************/ - -#ifndef _THEME_DOWNLOADER_H_ -#define _THEME_DOWNLOADER_H_ - -int Theme_Downloader(); - -#endif +/**************************************************************************** + * Theme_Downloader + * USB Loader GX 2009 + * + * Theme downloader for USB Loader GX + * + * Theme_Downloader.h + ***************************************************************************/ + +#ifndef _THEME_DOWNLOADER_H_ +#define _THEME_DOWNLOADER_H_ + +int Theme_Downloader(); + +#endif diff --git a/source/usbloader/frag.c b/source/usbloader/frag.c index 2dbeacd3..a92b3f31 100644 --- a/source/usbloader/frag.c +++ b/source/usbloader/frag.c @@ -257,6 +257,7 @@ out: SAFE_FREE(fs); SAFE_FREE(fa); SAFE_FREE(fw); + return ret_val; } diff --git a/source/usbloader/splits.c b/source/usbloader/splits.c index 89ba2874..d75a80bf 100644 --- a/source/usbloader/splits.c +++ b/source/usbloader/splits.c @@ -1,348 +1,348 @@ -// by oggzee - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "splits.h" - -#define off64_t off_t -#define FMT_llu "%llu" -#define FMT_lld "%lld" - -#define split_error(x) do { printf("\nsplit error: %s\n\n",x); } while(0) - -// 1 cluster less than 4gb -u64 OPT_split_size = (u64) 4LL * 1024 * 1024 * 1024 - 32 * 1024; -// 1 cluster less than 2gb -//u64 OPT_split_size = (u64)2LL * 1024 * 1024 * 1024 - 32 * 1024; - -//split_info_t split; - -void split_get_fname(split_info_t *s, int idx, char *fname) -{ - strcpy(fname, s->fname); - if (idx == 0 && s->create_mode) - { - strcat(fname, ".tmp"); - } - else if (idx > 0) - { - char *c = fname + strlen(fname) - 1; - *c = '0' + idx; - } -} - -int split_open_file(split_info_t *s, int idx) -{ - int fd = s->fd[idx]; - if (fd >= 0) return fd; - char fname[1024]; - split_get_fname(s, idx, fname); - //char *mode = s->create_mode ? "wb+" : "rb+"; - int mode = s->create_mode ? (O_CREAT | O_RDWR) : O_RDWR; - //printf("SPLIT OPEN %s %s %d\n", fname, mode, idx); //Wpad_WaitButtons(); - //f = fopen(fname, mode); - fd = open(fname, mode); - if (fd < 0) return -1; - if (idx > 0 && s->create_mode) - { - printf("%s Split: %d %s \n", s->create_mode ? "Create" : "Read", idx, fname); - } - s->fd[idx] = fd; - return fd; -} - -// faster as it uses larger chunks than ftruncate internally -int write_zero(int fd, off_t size) -{ - int buf[0x4000]; //64kb - int chunk; - int ret; - memset(buf, 0, sizeof(buf)); - while (size) - { - chunk = size; - if (chunk > sizeof(buf)) chunk = sizeof(buf); - ret = write(fd, buf, chunk); - //printf("WZ %d %d / %lld \n", ret, chunk, size); - size -= chunk; - if (ret < 0) return ret; - } - return 0; -} - -int split_fill(split_info_t *s, int idx, u64 size) -{ - int fd = split_open_file(s, idx); - off64_t fsize = lseek(fd, 0, SEEK_END); - if (fsize < size) - { - //printf("TRUNC %d "FMT_lld"\n", idx, size); Wpad_WaitButtons(); - //ftruncate(fd, size); - write_zero(fd, size - fsize); - return 1; - } - return 0; -} - -int split_get_file(split_info_t *s, u32 lba, u32 *sec_count, int fill) -{ - int fd; - if (lba >= s->total_sec) - { - fprintf(stderr, "SPLIT: invalid sector %u / %u\n", lba, (u32) s->total_sec); - return -1; - } - int idx; - idx = lba / s->split_sec; - if (idx >= s->max_split) - { - fprintf(stderr, "SPLIT: invalid split %d / %d\n", idx, s->max_split - 1); - return -1; - } - fd = s->fd[idx]; - if (fd < 0) - { - // opening new, make sure all previous are full - int i; - for (i = 0; i < idx; i++) - { - if (split_fill(s, i, s->split_size)) - { - printf("FILL %d\n", i); - } - } - fd = split_open_file(s, idx); - } - if (fd < 0) - { - fprintf(stderr, "SPLIT %d: no file\n", idx); - return -1; - } - u32 sec = lba % s->split_sec; // inside file - off64_t off = (off64_t ) sec * 512; - // num sectors till end of file - u32 to_end = s->split_sec - sec; - if (*sec_count > to_end) *sec_count = to_end; - if (s->create_mode) - { - if (fill) - { - // extend, so that read will be succesfull - split_fill(s, idx, off + 512 * (*sec_count)); - } - else - { - // fill up so that write continues from end of file - // shouldn't be necessary, but libfat looks buggy - // and this is faster - split_fill(s, idx, off); - } - } - lseek(fd, off, SEEK_SET); - return fd; -} - -int split_read_sector(void *_fp, u32 lba, u32 count, void*buf) -{ - split_info_t *s = _fp; - int fd; - u64 off = lba; - off *= 512ULL; - int i; - u32 chunk; - size_t ret; - //fprintf(stderr,"READ %d %d\n", lba, count); - for (i = 0; i < (int) count; i += chunk) - { - chunk = count - i; - fd = split_get_file(s, lba + i, &chunk, 1); - if (fd < 0) - { - fprintf(stderr, "\n\n"FMT_lld" %d %p\n", off, count, _fp); - split_error( "error seeking in disc partition" ); - return 1; - } - void *ptr = ((u8 *) buf) + (i * 512); - ret = read(fd, ptr, chunk * 512); - if (ret != chunk * 512) - { - fprintf(stderr, "error reading %u %u [%u] %u = %u\n", lba, count, i, chunk, ret); - split_error( "error reading disc" ); - return 1; - } - } - return 0; -} - -int split_write_sector(void *_fp, u32 lba, u32 count, void*buf) -{ - split_info_t *s = _fp; - int fd; - u64 off = lba; - off *= 512ULL; - int i; - u32 chunk; - size_t ret; - //printf("WRITE %d %d %p \n", lba, count, buf); - for (i = 0; i < (int) count; i += chunk) - { - chunk = count - i; - fd = split_get_file(s, lba + i, &chunk, 0); - //if (chunk != count) - // fprintf(stderr, "WRITE CHUNK %d %d/%d\n", lba+i, chunk, count); - if (fd < 0 || !chunk) - { - fprintf(stderr, "\n\n"FMT_lld" %d %p\n", off, count, _fp); - split_error( "error seeking in disc partition" ); - return 1; - } - //if (fwrite(buf+i*512, 512ULL, chunk, f) != chunk) { - //printf("write %d %p %d \n", fd, buf+i*512, chunk * 512); - void *ptr = ((u8 *) buf) + (i * 512); - ret = write(fd, ptr, chunk * 512); - //printf("write ret = %d \n", ret); - if (ret != chunk * 512) - { - split_error( "error writing disc" ); - return 1; - } - } - return 0; -} - -void split_init(split_info_t *s, char *fname) -{ - int i; - char *p; - //fprintf(stderr, "SPLIT_INIT %s\n", fname); - memset(s, 0, sizeof(*s)); - for (i = 0; i < MAX_SPLIT; i++) - { - s->fd[i] = -1; - } - strcpy(s->fname, fname); - s->max_split = 1; - p = strrchr(fname, '.'); - if (p && (strcasecmp(p, ".wbfs") == 0)) - { - s->max_split = MAX_SPLIT; - } -} - -void split_set_size(split_info_t *s, u64 split_size, u64 total_size) -{ - s->total_size = total_size; - s->split_size = split_size; - s->total_sec = total_size / 512; - s->split_sec = split_size / 512; -} - -void split_close(split_info_t *s) -{ - int i; - char fname[1024]; - char tmpname[1024]; - for (i = 0; i < s->max_split; i++) - { - if (s->fd[i] >= 0) - { - close(s->fd[i]); - } - } - if (s->create_mode) - { - split_get_fname(s, -1, fname); - split_get_fname(s, 0, tmpname); - rename(tmpname, fname); - } - memset(s, 0, sizeof(*s)); -} - -int split_create(split_info_t *s, char *fname, u64 split_size, u64 total_size, bool overwrite) -{ - int i; - int fd; - char sname[1024]; - int error = 0; - split_init(s, fname); - s->create_mode = 1; - // check if any file already exists - for (i = -1; i < s->max_split; i++) - { - split_get_fname(s, i, sname); - if (overwrite) - { - remove(sname); - } - else - { - fd = open(sname, O_RDONLY); - if (fd >= 0) - { - fprintf(stderr, "Error: file already exists: %s\n", sname); - close(fd); - error = 1; - } - } - } - if (error) - { - split_init(s, ""); - return -1; - } - split_set_size(s, split_size, total_size); - return 0; -} - -int split_open(split_info_t *s, char *fname) -{ - int i; - u64 size = 0; - u64 total_size = 0; - u64 split_size = 0; - int fd; - split_init(s, fname); - for (i = 0; i < s->max_split; i++) - { - fd = split_open_file(s, i); - if (fd < 0) - { - if (i == 0) goto err; - break; - } - // check previous size - all splits except last must be same size - if (i > 0 && size != split_size) - { - fprintf(stderr, "split %d: invalid size "FMT_lld"", i, size); - goto err; - } - // get size - //fseeko(f, 0, SEEK_END); - //size = ftello(f); - size = lseek(fd, 0, SEEK_END); - // check sector alignment - if (size % 512) - { - fprintf(stderr, "split %d: size ("FMT_lld") not sector (512) aligned!", i, size); - } - // first sets split size - if (i == 0) - { - split_size = size; - } - total_size += size; - } - split_set_size(s, split_size, total_size); - return 0; - err: split_close(s); - return -1; -} - +// by oggzee + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "splits.h" + +#define off64_t off_t +#define FMT_llu "%llu" +#define FMT_lld "%lld" + +#define split_error(x) do { printf("\nsplit error: %s\n\n",x); } while(0) + +// 1 cluster less than 4gb +u64 OPT_split_size = (u64) 4LL * 1024 * 1024 * 1024 - 32 * 1024; +// 1 cluster less than 2gb +//u64 OPT_split_size = (u64)2LL * 1024 * 1024 * 1024 - 32 * 1024; + +//split_info_t split; + +void split_get_fname(split_info_t *s, int idx, char *fname) +{ + strcpy(fname, s->fname); + if (idx == 0 && s->create_mode) + { + strcat(fname, ".tmp"); + } + else if (idx > 0) + { + char *c = fname + strlen(fname) - 1; + *c = '0' + idx; + } +} + +int split_open_file(split_info_t *s, int idx) +{ + int fd = s->fd[idx]; + if (fd >= 0) return fd; + char fname[1024]; + split_get_fname(s, idx, fname); + //char *mode = s->create_mode ? "wb+" : "rb+"; + int mode = s->create_mode ? (O_CREAT | O_RDWR) : O_RDWR; + //printf("SPLIT OPEN %s %s %d\n", fname, mode, idx); //Wpad_WaitButtons(); + //f = fopen(fname, mode); + fd = open(fname, mode); + if (fd < 0) return -1; + if (idx > 0 && s->create_mode) + { + printf("%s Split: %d %s \n", s->create_mode ? "Create" : "Read", idx, fname); + } + s->fd[idx] = fd; + return fd; +} + +// faster as it uses larger chunks than ftruncate internally +int write_zero(int fd, off_t size) +{ + int buf[0x4000]; //64kb + int chunk; + int ret; + memset(buf, 0, sizeof(buf)); + while (size) + { + chunk = size; + if (chunk > sizeof(buf)) chunk = sizeof(buf); + ret = write(fd, buf, chunk); + //printf("WZ %d %d / %lld \n", ret, chunk, size); + size -= chunk; + if (ret < 0) return ret; + } + return 0; +} + +int split_fill(split_info_t *s, int idx, u64 size) +{ + int fd = split_open_file(s, idx); + off64_t fsize = lseek(fd, 0, SEEK_END); + if (fsize < size) + { + //printf("TRUNC %d "FMT_lld"\n", idx, size); Wpad_WaitButtons(); + //ftruncate(fd, size); + write_zero(fd, size - fsize); + return 1; + } + return 0; +} + +int split_get_file(split_info_t *s, u32 lba, u32 *sec_count, int fill) +{ + int fd; + if (lba >= s->total_sec) + { + fprintf(stderr, "SPLIT: invalid sector %u / %u\n", lba, (u32) s->total_sec); + return -1; + } + int idx; + idx = lba / s->split_sec; + if (idx >= s->max_split) + { + fprintf(stderr, "SPLIT: invalid split %d / %d\n", idx, s->max_split - 1); + return -1; + } + fd = s->fd[idx]; + if (fd < 0) + { + // opening new, make sure all previous are full + int i; + for (i = 0; i < idx; i++) + { + if (split_fill(s, i, s->split_size)) + { + printf("FILL %d\n", i); + } + } + fd = split_open_file(s, idx); + } + if (fd < 0) + { + fprintf(stderr, "SPLIT %d: no file\n", idx); + return -1; + } + u32 sec = lba % s->split_sec; // inside file + off64_t off = (off64_t ) sec * 512; + // num sectors till end of file + u32 to_end = s->split_sec - sec; + if (*sec_count > to_end) *sec_count = to_end; + if (s->create_mode) + { + if (fill) + { + // extend, so that read will be succesfull + split_fill(s, idx, off + 512 * (*sec_count)); + } + else + { + // fill up so that write continues from end of file + // shouldn't be necessary, but libfat looks buggy + // and this is faster + split_fill(s, idx, off); + } + } + lseek(fd, off, SEEK_SET); + return fd; +} + +int split_read_sector(void *_fp, u32 lba, u32 count, void*buf) +{ + split_info_t *s = _fp; + int fd; + u64 off = lba; + off *= 512ULL; + int i; + u32 chunk; + size_t ret; + //fprintf(stderr,"READ %d %d\n", lba, count); + for (i = 0; i < (int) count; i += chunk) + { + chunk = count - i; + fd = split_get_file(s, lba + i, &chunk, 1); + if (fd < 0) + { + fprintf(stderr, "\n\n"FMT_lld" %d %p\n", off, count, _fp); + split_error( "error seeking in disc partition" ); + return 1; + } + void *ptr = ((u8 *) buf) + (i * 512); + ret = read(fd, ptr, chunk * 512); + if (ret != chunk * 512) + { + fprintf(stderr, "error reading %u %u [%u] %u = %u\n", lba, count, i, chunk, ret); + split_error( "error reading disc" ); + return 1; + } + } + return 0; +} + +int split_write_sector(void *_fp, u32 lba, u32 count, void*buf) +{ + split_info_t *s = _fp; + int fd; + u64 off = lba; + off *= 512ULL; + int i; + u32 chunk; + size_t ret; + //printf("WRITE %d %d %p \n", lba, count, buf); + for (i = 0; i < (int) count; i += chunk) + { + chunk = count - i; + fd = split_get_file(s, lba + i, &chunk, 0); + //if (chunk != count) + // fprintf(stderr, "WRITE CHUNK %d %d/%d\n", lba+i, chunk, count); + if (fd < 0 || !chunk) + { + fprintf(stderr, "\n\n"FMT_lld" %d %p\n", off, count, _fp); + split_error( "error seeking in disc partition" ); + return 1; + } + //if (fwrite(buf+i*512, 512ULL, chunk, f) != chunk) { + //printf("write %d %p %d \n", fd, buf+i*512, chunk * 512); + void *ptr = ((u8 *) buf) + (i * 512); + ret = write(fd, ptr, chunk * 512); + //printf("write ret = %d \n", ret); + if (ret != chunk * 512) + { + split_error( "error writing disc" ); + return 1; + } + } + return 0; +} + +void split_init(split_info_t *s, char *fname) +{ + int i; + char *p; + //fprintf(stderr, "SPLIT_INIT %s\n", fname); + memset(s, 0, sizeof(*s)); + for (i = 0; i < MAX_SPLIT; i++) + { + s->fd[i] = -1; + } + strcpy(s->fname, fname); + s->max_split = 1; + p = strrchr(fname, '.'); + if (p && (strcasecmp(p, ".wbfs") == 0)) + { + s->max_split = MAX_SPLIT; + } +} + +void split_set_size(split_info_t *s, u64 split_size, u64 total_size) +{ + s->total_size = total_size; + s->split_size = split_size; + s->total_sec = total_size / 512; + s->split_sec = split_size / 512; +} + +void split_close(split_info_t *s) +{ + int i; + char fname[1024]; + char tmpname[1024]; + for (i = 0; i < s->max_split; i++) + { + if (s->fd[i] >= 0) + { + close(s->fd[i]); + } + } + if (s->create_mode) + { + split_get_fname(s, -1, fname); + split_get_fname(s, 0, tmpname); + rename(tmpname, fname); + } + memset(s, 0, sizeof(*s)); +} + +int split_create(split_info_t *s, char *fname, u64 split_size, u64 total_size, bool overwrite) +{ + int i; + int fd; + char sname[1024]; + int error = 0; + split_init(s, fname); + s->create_mode = 1; + // check if any file already exists + for (i = -1; i < s->max_split; i++) + { + split_get_fname(s, i, sname); + if (overwrite) + { + remove(sname); + } + else + { + fd = open(sname, O_RDONLY); + if (fd >= 0) + { + fprintf(stderr, "Error: file already exists: %s\n", sname); + close(fd); + error = 1; + } + } + } + if (error) + { + split_init(s, ""); + return -1; + } + split_set_size(s, split_size, total_size); + return 0; +} + +int split_open(split_info_t *s, char *fname) +{ + int i; + u64 size = 0; + u64 total_size = 0; + u64 split_size = 0; + int fd; + split_init(s, fname); + for (i = 0; i < s->max_split; i++) + { + fd = split_open_file(s, i); + if (fd < 0) + { + if (i == 0) goto err; + break; + } + // check previous size - all splits except last must be same size + if (i > 0 && size != split_size) + { + fprintf(stderr, "split %d: invalid size "FMT_lld"", i, size); + goto err; + } + // get size + //fseeko(f, 0, SEEK_END); + //size = ftello(f); + size = lseek(fd, 0, SEEK_END); + // check sector alignment + if (size % 512) + { + fprintf(stderr, "split %d: size ("FMT_lld") not sector (512) aligned!", i, size); + } + // first sets split size + if (i == 0) + { + split_size = size; + } + total_size += size; + } + split_set_size(s, split_size, total_size); + return 0; + err: split_close(s); + return -1; +} + diff --git a/source/usbloader/splits.h b/source/usbloader/splits.h index a5b02378..7969cf4e 100644 --- a/source/usbloader/splits.h +++ b/source/usbloader/splits.h @@ -1,46 +1,46 @@ -#ifndef _SPLITS_H -#define _SPLITS_H - -#ifdef __cplusplus -extern "C" -{ -#endif - -#define MAX_SPLIT 10 - - typedef struct split_info - { - char fname[1024]; - //FILE *f[MAX_SPLIT]; - int fd[MAX_SPLIT]; - //u64 fsize[MAX_SPLIT]; - u32 split_sec; - u32 total_sec; - u64 split_size; - u64 total_size; - int create_mode; - int max_split; - } split_info_t; - - // 1 sector less than 4gb - extern u64 OPT_split_size; - - void split_get_fname(split_info_t *s, int idx, char *fname); - //FILE *split_open_file(split_info_t *s, int idx); - //FILE *split_get_file(split_info_t *s, u32 lba, u32 *sec_count, int fill); - int split_open_file(split_info_t *s, int idx); - int split_get_file(split_info_t *s, u32 lba, u32 *sec_count, int fill); - int split_fill(split_info_t *s, int idx, u64 size); - int split_read_sector(void *_fp, u32 lba, u32 count, void*buf); - int split_write_sector(void *_fp, u32 lba, u32 count, void*buf); - void split_init(split_info_t *s, char *fname); - void split_set_size(split_info_t *s, u64 split_size, u64 total_size); - void split_close(split_info_t *s); - int split_open(split_info_t *s, char *fname); - int split_create(split_info_t *s, char *fname, u64 split_size, u64 total_size, bool overwrite); - -#ifdef __cplusplus -} -#endif - -#endif //_SPLITS_H +#ifndef _SPLITS_H +#define _SPLITS_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +#define MAX_SPLIT 10 + + typedef struct split_info + { + char fname[1024]; + //FILE *f[MAX_SPLIT]; + int fd[MAX_SPLIT]; + //u64 fsize[MAX_SPLIT]; + u32 split_sec; + u32 total_sec; + u64 split_size; + u64 total_size; + int create_mode; + int max_split; + } split_info_t; + + // 1 sector less than 4gb + extern u64 OPT_split_size; + + void split_get_fname(split_info_t *s, int idx, char *fname); + //FILE *split_open_file(split_info_t *s, int idx); + //FILE *split_get_file(split_info_t *s, u32 lba, u32 *sec_count, int fill); + int split_open_file(split_info_t *s, int idx); + int split_get_file(split_info_t *s, u32 lba, u32 *sec_count, int fill); + int split_fill(split_info_t *s, int idx, u64 size); + int split_read_sector(void *_fp, u32 lba, u32 count, void*buf); + int split_write_sector(void *_fp, u32 lba, u32 count, void*buf); + void split_init(split_info_t *s, char *fname); + void split_set_size(split_info_t *s, u64 split_size, u64 total_size); + void split_close(split_info_t *s); + int split_open(split_info_t *s, char *fname); + int split_create(split_info_t *s, char *fname, u64 split_size, u64 total_size, bool overwrite); + +#ifdef __cplusplus +} +#endif + +#endif //_SPLITS_H diff --git a/source/usbloader/wbfs/wbfs_base.cpp b/source/usbloader/wbfs/wbfs_base.cpp index 1cfdc582..af78fa90 100644 --- a/source/usbloader/wbfs/wbfs_base.cpp +++ b/source/usbloader/wbfs/wbfs_base.cpp @@ -1,144 +1,144 @@ -#include -#include -#include -#include -#include - -#include "usbloader/sdhc.h" -#include "usbloader/usbstorage2.h" -#include "fatmounter.h" -#include "wbfs_rw.h" - -#include "wbfs_base.h" - -s32 Wbfs::done = -1; -s32 Wbfs::total = -1; -u32 Wbfs::nb_sectors; - -Wbfs::Wbfs(u32 device, u32 lba, u32 size) : - hdd(NULL) -{ - this->device = device; - this->lba = lba; - this->size = size; -} - -void Wbfs::GetProgressValue(s32 * d, s32 * m) -{ - *d = done; - *m = total; -} - -s32 Wbfs::Init(u32 device) -{ - s32 ret; - - switch (device) - { - case WBFS_DEVICE_USB: - /* Initialize USB storage */ - ret = USBStorage2_Init(); - if (ret >= 0) - { - /* Setup callbacks */ - readCallback = __ReadUSB; - writeCallback = __WriteUSB; - /* Device info */ - /* Get USB capacity */ - nb_sectors = USBStorage2_GetCapacity(§or_size); - if (!nb_sectors) return -1; - } - else return ret; - break; - case WBFS_DEVICE_SDHC: - /* Initialize SDHC */ - ret = SDHC_Init(); - - if (ret) - { - /* Setup callbacks */ - readCallback = __ReadSDHC; - writeCallback = __WriteSDHC; - - /* Device info */ - nb_sectors = 0; - sector_size = SDHC_SECTOR_SIZE; - } - else return -1; - break; - } - - return 0; -} - -void Wbfs::Close() -{ - if (hdd) - { - wbfs_close(hdd); - hdd = NULL; - } - - WBFSDevice_deInit(); -} - -// Default behavior: can't format -s32 Wbfs::Format() -{ - return -1; -} - -s32 Wbfs::CheckGame(u8 *discid) -{ - wbfs_disc_t *disc = NULL; - - /* Try to open game disc */ - disc = OpenDisc(discid); - if (disc) - { - /* Close disc */ - CloseDisc(disc); - - return 1; - } - - return 0; -} - -s32 Wbfs::GameSize(u8 *discid, f32 *size) -{ - wbfs_disc_t *disc = NULL; - - u32 sectors; - - /* Open disc */ - disc = OpenDisc(discid); - if (!disc) return -2; - - /* Get game size in sectors */ - sectors = wbfs_sector_used(disc->p, disc->header); - - /* Copy value */ - *size = (disc->p->wbfs_sec_sz / GB_SIZE) * sectors; - - /* Close disc */ - CloseDisc(disc); - - return 0; -} - -wbfs_t *Wbfs::GetHddInfo() -{ - return hdd; -} - -bool Wbfs::Mounted() -{ - return hdd == NULL; -} - - -bool Wbfs::ShowFreeSpace(void) -{ - return true; -} +#include +#include +#include +#include +#include + +#include "usbloader/sdhc.h" +#include "usbloader/usbstorage2.h" +#include "fatmounter.h" +#include "wbfs_rw.h" + +#include "wbfs_base.h" + +s32 Wbfs::done = -1; +s32 Wbfs::total = -1; +u32 Wbfs::nb_sectors; + +Wbfs::Wbfs(u32 device, u32 lba, u32 size) : + hdd(NULL) +{ + this->device = device; + this->lba = lba; + this->size = size; +} + +void Wbfs::GetProgressValue(s32 * d, s32 * m) +{ + *d = done; + *m = total; +} + +s32 Wbfs::Init(u32 device) +{ + s32 ret; + + switch (device) + { + case WBFS_DEVICE_USB: + /* Initialize USB storage */ + ret = USBStorage2_Init(); + if (ret >= 0) + { + /* Setup callbacks */ + readCallback = __ReadUSB; + writeCallback = __WriteUSB; + /* Device info */ + /* Get USB capacity */ + nb_sectors = USBStorage2_GetCapacity(§or_size); + if (!nb_sectors) return -1; + } + else return ret; + break; + case WBFS_DEVICE_SDHC: + /* Initialize SDHC */ + ret = SDHC_Init(); + + if (ret) + { + /* Setup callbacks */ + readCallback = __ReadSDHC; + writeCallback = __WriteSDHC; + + /* Device info */ + nb_sectors = 0; + sector_size = SDHC_SECTOR_SIZE; + } + else return -1; + break; + } + + return 0; +} + +void Wbfs::Close() +{ + if (hdd) + { + wbfs_close(hdd); + hdd = NULL; + } + + WBFSDevice_deInit(); +} + +// Default behavior: can't format +s32 Wbfs::Format() +{ + return -1; +} + +s32 Wbfs::CheckGame(u8 *discid) +{ + wbfs_disc_t *disc = NULL; + + /* Try to open game disc */ + disc = OpenDisc(discid); + if (disc) + { + /* Close disc */ + CloseDisc(disc); + + return 1; + } + + return 0; +} + +s32 Wbfs::GameSize(u8 *discid, f32 *size) +{ + wbfs_disc_t *disc = NULL; + + u32 sectors; + + /* Open disc */ + disc = OpenDisc(discid); + if (!disc) return -2; + + /* Get game size in sectors */ + sectors = wbfs_sector_used(disc->p, disc->header); + + /* Copy value */ + *size = (disc->p->wbfs_sec_sz / GB_SIZE) * sectors; + + /* Close disc */ + CloseDisc(disc); + + return 0; +} + +wbfs_t *Wbfs::GetHddInfo() +{ + return hdd; +} + +bool Wbfs::Mounted() +{ + return hdd == NULL; +} + + +bool Wbfs::ShowFreeSpace(void) +{ + return true; +} diff --git a/source/usbloader/wbfs/wbfs_rw.c b/source/usbloader/wbfs/wbfs_rw.c index d2aa6f77..28610c60 100644 --- a/source/usbloader/wbfs/wbfs_rw.c +++ b/source/usbloader/wbfs/wbfs_rw.c @@ -1,168 +1,168 @@ -#include -#include -#include - -#include "usbloader/sdhc.h" -#include "usbloader/usbstorage2.h" -#include "usbloader/wdvd.h" -#include "wbfs_rw.h" - -/* Constants */ -#define MAX_NB_SECTORS 32 - -u32 sector_size = 512; -rw_sector_callback_t readCallback = NULL; -rw_sector_callback_t writeCallback = NULL; - -void SetSectorSize(u32 size) -{ - sector_size = size; -} - -s32 __ReadDVD(void *fp, u32 lba, u32 len, void *iobuf) -{ - void *buffer = NULL; - - u64 offset; - u32 mod, size; - s32 ret; - - /* Calculate offset */ - offset = ((u64) lba) << 2; - - /* Calcualte sizes */ - mod = len % 32; - size = len - mod; - - /* Read aligned data */ - if (size) - { - ret = WDVD_UnencryptedRead(iobuf, size, offset); - if (ret < 0) goto out; - } - - /* Read non-aligned data */ - if (mod) - { - /* Allocate memory */ - buffer = memalign(32, 0x20); - if (!buffer) return -1; - - /* Read data */ - ret = WDVD_UnencryptedRead(buffer, 0x20, offset + size); - if (ret < 0) goto out; - - /* Copy data */ - void *ptr = ((u8 *) iobuf) + size; - memcpy(ptr, buffer, mod); - } - - /* Success */ - ret = 0; - - out: - /* Free memory */ - if (buffer) free(buffer); - - return ret; -} - -s32 __ReadUSB(void *fp, u32 lba, u32 count, void *iobuf) -{ - u32 cnt = 0; - s32 ret; - - /* Do reads */ - while (cnt < count) - { - void *ptr = ((u8 *) iobuf) + (cnt * sector_size); - u32 sectors = (count - cnt); - - /* Read sectors is too big */ - if (sectors > MAX_NB_SECTORS) sectors = MAX_NB_SECTORS; - - /* USB read */ - ret = USBStorage2_ReadSectors(lba + cnt, sectors, ptr); - if (ret < 0) return ret; - - /* Increment counter */ - cnt += sectors; - } - - return 0; -} - -s32 __WriteUSB(void *fp, u32 lba, u32 count, void *iobuf) -{ - u32 cnt = 0; - s32 ret; - - /* Do writes */ - while (cnt < count) - { - void *ptr = ((u8 *) iobuf) + (cnt * sector_size); - u32 sectors = (count - cnt); - - /* Write sectors is too big */ - if (sectors > MAX_NB_SECTORS) sectors = MAX_NB_SECTORS; - - /* USB write */ - ret = USBStorage2_WriteSectors(lba + cnt, sectors, ptr); - if (ret < 0) return ret; - - /* Increment counter */ - cnt += sectors; - } - - return 0; -} - -s32 __ReadSDHC(void *fp, u32 lba, u32 count, void *iobuf) -{ - u32 cnt = 0; - s32 ret; - - /* Do reads */ - while (cnt < count) - { - void *ptr = ((u8 *) iobuf) + (cnt * sector_size); - u32 sectors = (count - cnt); - - /* Read sectors is too big */ - if (sectors > MAX_NB_SECTORS) sectors = MAX_NB_SECTORS; - - /* SDHC read */ - ret = SDHC_ReadSectors(lba + cnt, sectors, ptr); - if (!ret) return -1; - - /* Increment counter */ - cnt += sectors; - } - - return 0; -} - -s32 __WriteSDHC(void *fp, u32 lba, u32 count, void *iobuf) -{ - u32 cnt = 0; - s32 ret; - - /* Do writes */ - while (cnt < count) - { - void *ptr = ((u8 *) iobuf) + (cnt * sector_size); - u32 sectors = (count - cnt); - - /* Write sectors is too big */ - if (sectors > MAX_NB_SECTORS) sectors = MAX_NB_SECTORS; - - /* SDHC write */ - ret = SDHC_WriteSectors(lba + cnt, sectors, ptr); - if (!ret) return -1; - - /* Increment counter */ - cnt += sectors; - } - - return 0; -} +#include +#include +#include + +#include "usbloader/sdhc.h" +#include "usbloader/usbstorage2.h" +#include "usbloader/wdvd.h" +#include "wbfs_rw.h" + +/* Constants */ +#define MAX_NB_SECTORS 32 + +u32 sector_size = 512; +rw_sector_callback_t readCallback = NULL; +rw_sector_callback_t writeCallback = NULL; + +void SetSectorSize(u32 size) +{ + sector_size = size; +} + +s32 __ReadDVD(void *fp, u32 lba, u32 len, void *iobuf) +{ + void *buffer = NULL; + + u64 offset; + u32 mod, size; + s32 ret; + + /* Calculate offset */ + offset = ((u64) lba) << 2; + + /* Calcualte sizes */ + mod = len % 32; + size = len - mod; + + /* Read aligned data */ + if (size) + { + ret = WDVD_UnencryptedRead(iobuf, size, offset); + if (ret < 0) goto out; + } + + /* Read non-aligned data */ + if (mod) + { + /* Allocate memory */ + buffer = memalign(32, 0x20); + if (!buffer) return -1; + + /* Read data */ + ret = WDVD_UnencryptedRead(buffer, 0x20, offset + size); + if (ret < 0) goto out; + + /* Copy data */ + void *ptr = ((u8 *) iobuf) + size; + memcpy(ptr, buffer, mod); + } + + /* Success */ + ret = 0; + + out: + /* Free memory */ + if (buffer) free(buffer); + + return ret; +} + +s32 __ReadUSB(void *fp, u32 lba, u32 count, void *iobuf) +{ + u32 cnt = 0; + s32 ret; + + /* Do reads */ + while (cnt < count) + { + void *ptr = ((u8 *) iobuf) + (cnt * sector_size); + u32 sectors = (count - cnt); + + /* Read sectors is too big */ + if (sectors > MAX_NB_SECTORS) sectors = MAX_NB_SECTORS; + + /* USB read */ + ret = USBStorage2_ReadSectors(lba + cnt, sectors, ptr); + if (ret < 0) return ret; + + /* Increment counter */ + cnt += sectors; + } + + return 0; +} + +s32 __WriteUSB(void *fp, u32 lba, u32 count, void *iobuf) +{ + u32 cnt = 0; + s32 ret; + + /* Do writes */ + while (cnt < count) + { + void *ptr = ((u8 *) iobuf) + (cnt * sector_size); + u32 sectors = (count - cnt); + + /* Write sectors is too big */ + if (sectors > MAX_NB_SECTORS) sectors = MAX_NB_SECTORS; + + /* USB write */ + ret = USBStorage2_WriteSectors(lba + cnt, sectors, ptr); + if (ret < 0) return ret; + + /* Increment counter */ + cnt += sectors; + } + + return 0; +} + +s32 __ReadSDHC(void *fp, u32 lba, u32 count, void *iobuf) +{ + u32 cnt = 0; + s32 ret; + + /* Do reads */ + while (cnt < count) + { + void *ptr = ((u8 *) iobuf) + (cnt * sector_size); + u32 sectors = (count - cnt); + + /* Read sectors is too big */ + if (sectors > MAX_NB_SECTORS) sectors = MAX_NB_SECTORS; + + /* SDHC read */ + ret = SDHC_ReadSectors(lba + cnt, sectors, ptr); + if (!ret) return -1; + + /* Increment counter */ + cnt += sectors; + } + + return 0; +} + +s32 __WriteSDHC(void *fp, u32 lba, u32 count, void *iobuf) +{ + u32 cnt = 0; + s32 ret; + + /* Do writes */ + while (cnt < count) + { + void *ptr = ((u8 *) iobuf) + (cnt * sector_size); + u32 sectors = (count - cnt); + + /* Write sectors is too big */ + if (sectors > MAX_NB_SECTORS) sectors = MAX_NB_SECTORS; + + /* SDHC write */ + ret = SDHC_WriteSectors(lba + cnt, sectors, ptr); + if (!ret) return -1; + + /* Increment counter */ + cnt += sectors; + } + + return 0; +} diff --git a/source/usbloader/wbfs/wbfs_rw.h b/source/usbloader/wbfs/wbfs_rw.h index 77d2d6a1..528765b0 100644 --- a/source/usbloader/wbfs/wbfs_rw.h +++ b/source/usbloader/wbfs/wbfs_rw.h @@ -1,25 +1,25 @@ -#ifndef _WBFS_RW_H -#define _WBFS_RW_H - -#ifdef __cplusplus -extern "C" -{ -#endif - -#include "libs/libwbfs/libwbfs.h" - - extern u32 sector_size; - extern rw_sector_callback_t readCallback; - extern rw_sector_callback_t writeCallback; - - s32 __ReadDVD(void *fp, u32 lba, u32 len, void *iobuf); - s32 __ReadUSB(void *fp, u32 lba, u32 count, void *iobuf); - s32 __WriteUSB(void *fp, u32 lba, u32 count, void *iobuf); - s32 __ReadSDHC(void *fp, u32 lba, u32 count, void *iobuf); - s32 __WriteSDHC(void *fp, u32 lba, u32 count, void *iobuf); - -#ifdef __cplusplus -} -#endif - -#endif //_WBFS_RW_H +#ifndef _WBFS_RW_H +#define _WBFS_RW_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include "libs/libwbfs/libwbfs.h" + + extern u32 sector_size; + extern rw_sector_callback_t readCallback; + extern rw_sector_callback_t writeCallback; + + s32 __ReadDVD(void *fp, u32 lba, u32 len, void *iobuf); + s32 __ReadUSB(void *fp, u32 lba, u32 count, void *iobuf); + s32 __WriteUSB(void *fp, u32 lba, u32 count, void *iobuf); + s32 __ReadSDHC(void *fp, u32 lba, u32 count, void *iobuf); + s32 __WriteSDHC(void *fp, u32 lba, u32 count, void *iobuf); + +#ifdef __cplusplus +} +#endif + +#endif //_WBFS_RW_H diff --git a/source/usbloader/wbfs/wbfs_wbfs.h b/source/usbloader/wbfs/wbfs_wbfs.h index 062341f4..7cbee6eb 100644 --- a/source/usbloader/wbfs/wbfs_wbfs.h +++ b/source/usbloader/wbfs/wbfs_wbfs.h @@ -1,34 +1,34 @@ -#ifndef _WBFS_WBFS_H -#define _WBFS_WBFS_H - -#include "wbfs_base.h" -#include "libs/libwbfs/libwbfs.h" - -class Wbfs_Wbfs: public Wbfs -{ - public: - Wbfs_Wbfs(u32 device, u32 lba, u32 size) : - Wbfs(device, lba, size) - { - } - - s32 Open(); - wbfs_disc_t* OpenDisc(u8 *); - void CloseDisc(wbfs_disc_t *); - - s32 Format(); - s32 GetCount(u32 *); - s32 GetHeaders(struct discHdr *, u32, u32); - - s32 AddGame(); - s32 RemoveGame(u8 *); - - s32 DiskSpace(f32 *, f32 *); - - s32 RenameGame(u8 *, const void *); - s32 ReIDGame(u8 *, const void *); - - f32 EstimateGameSize(); -}; - -#endif //_WBFS_WBFS_H +#ifndef _WBFS_WBFS_H +#define _WBFS_WBFS_H + +#include "wbfs_base.h" +#include "libs/libwbfs/libwbfs.h" + +class Wbfs_Wbfs: public Wbfs +{ + public: + Wbfs_Wbfs(u32 device, u32 lba, u32 size) : + Wbfs(device, lba, size) + { + } + + s32 Open(); + wbfs_disc_t* OpenDisc(u8 *); + void CloseDisc(wbfs_disc_t *); + + s32 Format(); + s32 GetCount(u32 *); + s32 GetHeaders(struct discHdr *, u32, u32); + + s32 AddGame(); + s32 RemoveGame(u8 *); + + s32 DiskSpace(f32 *, f32 *); + + s32 RenameGame(u8 *, const void *); + s32 ReIDGame(u8 *, const void *); + + f32 EstimateGameSize(); +}; + +#endif //_WBFS_WBFS_H diff --git a/source/utils/rockout.cpp b/source/utils/rockout.cpp new file mode 100644 index 00000000..1f69025c --- /dev/null +++ b/source/utils/rockout.cpp @@ -0,0 +1,35 @@ +#include "libwiigui/gui.h" +#include "themes/CTheme.h" +#include "usbloader/GameList.h" +#include "settings/GameTitles.h" +#include "menu/menus.h" + +extern GuiImageData * pointer[4]; + +void rockout(int gameSelected, int f) +{ + HaltGui(); + + if (gameSelected >= 0 && gameSelected < gameList.size() && (strcasestr(GameTitles.GetTitle(gameList[gameSelected]), "guitar") + || strcasestr(GameTitles.GetTitle(gameList[gameSelected]), "band") || strcasestr(GameTitles.GetTitle(gameList[gameSelected]), + "rock"))) + { + for (int i = 0; i < 4; i++) + delete pointer[i]; + pointer[0] = Resources::GetImageData("rplayer1_point.png"); + pointer[1] = Resources::GetImageData("rplayer2_point.png"); + pointer[2] = Resources::GetImageData("rplayer3_point.png"); + pointer[3] = Resources::GetImageData("rplayer4_point.png"); + } + else + { + + for (int i = 0; i < 4; i++) + delete pointer[i]; + pointer[0] = Resources::GetImageData("player1_point.png"); + pointer[1] = Resources::GetImageData("player2_point.png"); + pointer[2] = Resources::GetImageData("player3_point.png"); + pointer[3] = Resources::GetImageData("player4_point.png"); + } + ResumeGui(); +} diff --git a/source/utils/rockout.h b/source/utils/rockout.h new file mode 100644 index 00000000..3d4904da --- /dev/null +++ b/source/utils/rockout.h @@ -0,0 +1,6 @@ +#ifndef ROCKOUT_H_ +#define ROCKOUT_H_ + +void rockout(int gameSelected, int f = 0); + +#endif diff --git a/source/utils/tools.h b/source/utils/tools.h new file mode 100644 index 00000000..91c7cb37 --- /dev/null +++ b/source/utils/tools.h @@ -0,0 +1,6 @@ +#ifndef TOOLS_H_ +#define TOOLS_H_ + +#define cut_bounds(x, min, max) ( ((x) < (min)) ? (min) : ((x) > (max)) ? (max) : (x) ) + +#endif diff --git a/source/wad/utils.h b/source/wad/utils.h index a7d4737a..29584b23 100644 --- a/source/wad/utils.h +++ b/source/wad/utils.h @@ -1,23 +1,23 @@ -#ifndef _UTILS_H_ -#define _UTILS_H_ - -#ifdef __cplusplus -extern "C" -{ -#endif - /* Constants */ -#define KB_SIZE 1024.0 -#define MB_SIZE 1048576.0 -#define GB_SIZE 1073741824.0 - - /* Macros */ -#define round_up(x,n) (-(-(x) & -(n))) - - /* Prototypes */ - u32 swap32(u32); - -#ifdef __cplusplus -} -#endif - -#endif +#ifndef _UTILS_H_ +#define _UTILS_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif + /* Constants */ +#define KB_SIZE 1024.0 +#define MB_SIZE 1048576.0 +#define GB_SIZE 1073741824.0 + + /* Macros */ +#define round_up(x,n) (-(-(x) & -(n))) + + /* Prototypes */ + u32 swap32(u32); + +#ifdef __cplusplus +} +#endif + +#endif