The known alt dol is now automatically used when launching a game that requires it, if no dol was selected (setting a dol in game settings will override it). This includes the alt dol prompt that was added a few revisions ago for games that require choosing between different dols. Fixed dol name display in the game settings. Added check to prevent empty .gct file creation. The .gct code files can now be deleted from the Uninstall Menu.

This commit is contained in:
lustar.mii 2009-09-18 08:28:31 +00:00
parent 75a4d33e4f
commit 370a332fcc
18 changed files with 1845 additions and 1741 deletions

View File

@ -105,12 +105,12 @@ $(BUILD):
#--------------------------------------------------------------------------------- #---------------------------------------------------------------------------------
lang: lang:
@[ -d $@ ] || mkdir -p $@ @[ -d build ] || mkdir -p build
@make --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile language @make --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile language
#--------------------------------------------------------------------------------- #---------------------------------------------------------------------------------
all: all:
@[ -d $@ ] || mkdir -p $@ @[ -d build ] || mkdir -p build
@make --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile @make --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile
@make --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile language @make --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile language

File diff suppressed because one or more lines are too long

View File

@ -68,9 +68,8 @@ int CheatMenu(const char * gameID) {
WindowPrompt(tr("Error"),tr("Cheatfile is blank"),tr("OK")); WindowPrompt(tr("Error"),tr("Cheatfile is blank"),tr("OK"));
break; break;
case 0: case 0:
download = WindowPrompt(tr("Error"),tr("No Cheatfile found"),tr("OK"),tr("Download Now")); download = WindowPrompt(tr("Error"),tr("No Cheatfile found"),tr("Download Now"),tr("Cancel"));
if (download==1)
if (download==0)
download = CodeDownload(gameID); download = CodeDownload(gameID);
break; break;
case 1: case 1:
@ -127,14 +126,18 @@ int CheatMenu(const char * gameID) {
selectednrs[x] = i; selectednrs[x] = i;
x++; x++;
} }
} }
subfoldercreate(Settings.Cheatcodespath); if (x == 0) {
string chtpath = Settings.Cheatcodespath; WindowPrompt(tr("Error"),tr("No cheats were selected"),tr("OK"));
string gctfname = chtpath + c.getGameID() + ".gct"; } else {
c.createGCT(selectednrs,x,gctfname.c_str()); subfoldercreate(Settings.Cheatcodespath);
WindowPrompt(tr("GCT File created"),NULL,tr("OK")); string chtpath = Settings.Cheatcodespath;
exit = true; string gctfname = chtpath + c.getGameID() + ".gct";
break; c.createGCT(selectednrs,x,gctfname.c_str());
WindowPrompt(tr("GCT File created"),NULL,tr("OK"));
exit = true;
break;
}
} else WindowPrompt(tr("Error"),tr("Could not create GCT file"),tr("OK")); } else WindowPrompt(tr("Error"),tr("Could not create GCT file"),tr("OK"));
} }

View File

@ -60,6 +60,10 @@ string GCTCheats::getCheatComment(int nr) {
} }
int GCTCheats::createGCT(int nr,const char * filename) { int GCTCheats::createGCT(int nr,const char * filename) {
if (nr == 0)
return 0;
ofstream filestr; ofstream filestr;
filestr.open(filename); filestr.open(filename);
@ -91,6 +95,7 @@ int GCTCheats::createGCT(int nr,const char * filename) {
} }
int GCTCheats::createGCT(const char * chtbuffer,const char * filename) { int GCTCheats::createGCT(const char * chtbuffer,const char * filename) {
ofstream filestr; ofstream filestr;
filestr.open(filename); filestr.open(filename);
@ -125,6 +130,9 @@ int GCTCheats::createGCT(const char * chtbuffer,const char * filename) {
int GCTCheats::createGCT(int nr[],int cnt,const char * filename) { int GCTCheats::createGCT(int nr[],int cnt,const char * filename) {
if (cnt == 0)
return 0;
ofstream filestr; ofstream filestr;
filestr.open(filename); filestr.open(filename);

View File

@ -30,6 +30,7 @@
#include "prompts/ProgressWindow.h" #include "prompts/ProgressWindow.h"
#include "prompts/TitleBrowser.h" #include "prompts/TitleBrowser.h"
#include "prompts/gameinfo.h" #include "prompts/gameinfo.h"
#include "prompts/DiscBrowser.h"
#include "mload/mload.h" #include "mload/mload.h"
#include "patches/patchcode.h" #include "patches/patchcode.h"
#include "network/networkops.h" #include "network/networkops.h"
@ -72,6 +73,7 @@ static lwp_t guithread = LWP_THREAD_NULL;
static bool guiHalt = true; static bool guiHalt = true;
static int ExitRequested = 0; static int ExitRequested = 0;
static char gameregion[7]; static char gameregion[7];
static bool altdoldefault = true;
/*** Extern variables ***/ /*** Extern variables ***/
extern FreeTypeGX *fontClock; extern FreeTypeGX *fontClock;
@ -717,7 +719,7 @@ int MenuDiscList() {
WDVD_GetCoverStatus(&covert);//for detecting if i disc has been inserted WDVD_GetCoverStatus(&covert);//for detecting if i disc has been inserted
// if the idiot is showing favoorites and don't have any // if the idiot is showing favorites and don't have any
if (Settings.fave && !gameCnt) { if (Settings.fave && !gameCnt) {
WindowPrompt(tr("No Favorites"),tr("You are choosing to display favorites and you do not have any selected."),tr("Back")); WindowPrompt(tr("No Favorites"),tr("You are choosing to display favorites and you do not have any selected."),tr("Back"));
Settings.fave=!Settings.fave; Settings.fave=!Settings.fave;
@ -1214,8 +1216,8 @@ int MenuDiscList() {
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]); 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]);
struct Game_CFG* game_cfg = CFG_get_game_opt(header->id); struct Game_CFG* game_cfg = CFG_get_game_opt(header->id);
if (game_cfg) { if (game_cfg) {
ocarinaChoice = game_cfg->ocarina;
alternatedol = game_cfg->loadalternatedol; alternatedol = game_cfg->loadalternatedol;
ocarinaChoice = game_cfg->ocarina;
} else { } else {
alternatedol = off; alternatedol = off;
ocarinaChoice = Settings.ocarina; ocarinaChoice = Settings.ocarina;
@ -1230,17 +1232,17 @@ int MenuDiscList() {
if (exeFile==NULL) { if (exeFile==NULL) {
sprintf(nipple, "%s %s",nipple,tr("does not exist!")); sprintf(nipple, "%s %s",nipple,tr("does not exist!"));
WindowPrompt(tr("Error"),nipple,tr("OK")); WindowPrompt(tr("Error"),nipple,tr("OK"));
menu = MENU_CHECK; menu = MENU_CHECK;
wiilight(0); wiilight(0);
break; break;
} } else {
fclose(exeFile);
}
} }
if (ocarinaChoice != off) { if (ocarinaChoice != off) {
/* Open gct File and check exist */ /* Open gct File and check exist */
sprintf(nipple, "%s%s.gct",Settings.Cheatcodespath,IDfull); sprintf(nipple, "%s%s.gct",Settings.Cheatcodespath,IDfull);
exeFile = fopen (nipple ,"rb"); exeFile = fopen (nipple ,"rb");
if (exeFile==NULL) { if (exeFile==NULL) {
sprintf(nipple, "%s %s",nipple,tr("does not exist! Loading game without cheats.")); sprintf(nipple, "%s %s",nipple,tr("does not exist! Loading game without cheats."));
WindowPrompt(tr("Error"),nipple,NULL,NULL,NULL,NULL,170); WindowPrompt(tr("Error"),nipple,NULL,NULL,NULL,NULL,170);
@ -1248,6 +1250,7 @@ int MenuDiscList() {
fseek (exeFile, 0, SEEK_END); fseek (exeFile, 0, SEEK_END);
long size=ftell (exeFile); long size=ftell (exeFile);
rewind (exeFile); rewind (exeFile);
fclose(exeFile);
if (size>2056) { if (size>2056) {
sprintf(nipple, "%s %s",nipple,tr("contains over 255 lines of code. It will produce unexpected results.")); sprintf(nipple, "%s %s",nipple,tr("contains over 255 lines of code. It will produce unexpected results."));
WindowPrompt(tr("Error"),nipple,NULL,NULL,NULL,NULL,170); WindowPrompt(tr("Error"),nipple,NULL,NULL,NULL,NULL,170);
@ -1272,7 +1275,6 @@ int MenuDiscList() {
CFG_save_game_num(header->id); CFG_save_game_num(header->id);
} }
SDCard_deInit();
menu = MENU_EXIT; menu = MENU_EXIT;
break; break;
@ -1292,11 +1294,12 @@ int MenuDiscList() {
if (exeFile==NULL) { if (exeFile==NULL) {
sprintf(nipple, "%s %s",nipple,tr("does not exist! You Messed something up, Idiot.")); sprintf(nipple, "%s %s",nipple,tr("does not exist! You Messed something up, Idiot."));
WindowPrompt(tr("Error"),nipple,tr("OK")); WindowPrompt(tr("Error"),nipple,tr("OK"));
menu = MENU_CHECK; menu = MENU_CHECK;
wiilight(0); wiilight(0);
break; break;
} } else {
fclose(exeFile);
}
} }
if (ocarinaChoice != off) { if (ocarinaChoice != off) {
/* Open gct File and check exist */ /* Open gct File and check exist */
@ -1317,12 +1320,10 @@ int MenuDiscList() {
} }
} }
SDCard_deInit();
wiilight(0); wiilight(0);
returnHere = false; returnHere = false;
menu = MENU_EXIT; menu = MENU_EXIT;
} else if (choice == 2) { } else if (choice == 2) {
wiilight(0); wiilight(0);
HaltGui(); HaltGui();
@ -1398,20 +1399,54 @@ int MenuDiscList() {
covertOld=covert; covertOld=covert;
} }
HaltGui(); // set alt dol default
mainWindow->RemoveAll(); if (menu == MENU_EXIT && altdoldefault) {
mainWindow->Append(bgImg); struct discHdr *header = &gameList[gameSelected];
delete gameBrowser; struct Game_CFG* game_cfg = CFG_get_game_opt(header->id);
gameBrowser = NULL; // use default only if no alt dol was selected manually
delete gameGrid; if (game_cfg) {
gameGrid = NULL; if (game_cfg->alternatedolstart != 0)
delete gameCarousel; altdoldefault = false;
gameCarousel = NULL; }
ResumeGui(); if (altdoldefault) {
int autodol = autoSelectDol((char*)header->id);
if (autodol>0) {
alternatedol = 2;
alternatedoloffset = autodol;
char temp[20];
sprintf(temp,"%d",autodol);
} else {
// alt dol menu for games that require more than a single alt dol
int autodol = autoSelectDolMenu((char*)header->id);
if (autodol>0) {
alternatedol = 2;
alternatedoloffset = autodol;
} else if (autodol == 0) { // if Cancel or B is pressed, don't launch game
menu = MENU_DISCLIST;
}
}
}
}
if (menu == MENU_EXIT) {
SDCard_deInit();
}
HaltGui();
mainWindow->RemoveAll();
mainWindow->Append(bgImg);
delete gameBrowser;
gameBrowser = NULL;
delete gameGrid;
gameGrid = NULL;
delete gameCarousel;
gameCarousel = NULL;
ResumeGui();
return menu; return menu;
} }
/**************************************************************************** /****************************************************************************
* MenuInstall * MenuInstall
***************************************************************************/ ***************************************************************************/
@ -1877,7 +1912,7 @@ int MainMenu(int menu) {
break; break;
} }
} }
CloseXMLDatabase(); CloseXMLDatabase();
ExitGUIThreads(); ExitGUIThreads();
bgMusic->Stop(); bgMusic->Stop();
@ -1891,8 +1926,7 @@ int MainMenu(int menu) {
delete GameIDTxt; delete GameIDTxt;
delete cover; delete cover;
delete coverImg; delete coverImg;
ShutdownAudio();
ShutdownAudio();
StopGX(); StopGX();
if (boothomebrew == 1) { if (boothomebrew == 1) {
@ -1914,8 +1948,10 @@ int MainMenu(int menu) {
fix002 = game_cfg->errorfix002; fix002 = game_cfg->errorfix002;
iosChoice = game_cfg->ios; iosChoice = game_cfg->ios;
countrystrings = game_cfg->patchcountrystrings; countrystrings = game_cfg->patchcountrystrings;
alternatedol = game_cfg->loadalternatedol; if (!altdoldefault) {
alternatedoloffset = game_cfg->alternatedolstart; alternatedol = game_cfg->loadalternatedol;
alternatedoloffset = game_cfg->alternatedolstart;
}
reloadblock = game_cfg->iosreloadblock; reloadblock = game_cfg->iosreloadblock;
} else { } else {
videoChoice = Settings.video; videoChoice = Settings.video;
@ -1929,8 +1965,10 @@ int MainMenu(int menu) {
} }
fix002 = Settings.error002; fix002 = Settings.error002;
countrystrings = Settings.patchcountrystrings; countrystrings = Settings.patchcountrystrings;
alternatedol = off; if (!altdoldefault) {
alternatedoloffset = 0; alternatedol = off;
alternatedoloffset = 0;
}
reloadblock = off; reloadblock = off;
} }
int ios2; int ios2;

File diff suppressed because it is too large Load Diff

View File

@ -21,33 +21,33 @@
#ifndef __DVD_BROADWAY_H__ #ifndef __DVD_BROADWAY_H__
#define __DVD_BROADWAY_H__ #define __DVD_BROADWAY_H__
#include <gctypes.h> #include <gctypes.h>
#include <ogc/ipc.h> #include <ogc/ipc.h>
#include <ogc/dvd.h> #include <ogc/dvd.h>
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
typedef void (*dvdcallbacklow)(s32 result);
s32 bwDVD_LowInit();
s32 bwDVD_LowInquiry(dvddrvinfo *info,dvdcallbacklow cb);
s32 bwDVD_LowReadID(dvddiskid *diskID,dvdcallbacklow cb);
s32 bwDVD_LowClosePartition(dvdcallbacklow cb);
s32 bwDVD_LowOpenPartition(u32 offset,void *eticket,u32 certin_len,void *certificate_in,void *certificate_out,dvdcallbacklow cb);
s32 bwDVD_LowUnencryptedRead(void *buf,u32 len,u32 offset,dvdcallbacklow cb);
s32 bwDVD_LowReset(dvdcallbacklow cb);
s32 bwDVD_LowWaitCoverClose(dvdcallbacklow cb);
s32 bwDVD_LowRead(void *buf,u32 len,u32 offset,dvdcallbacklow cb);
s32 bwDVD_EnableVideo(dvdcallbacklow cb);
s32 bwDVD_LowReadVideo(void *buf,u32 len,u32 offset,dvdcallbacklow cb);
s32 bwDVD_SetDecryption(s32 mode, dvdcallbacklow cb);
s32 bwDVD_SetOffset(u32 offset, dvdcallbacklow cb);
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { }
#endif /* __cplusplus */ #endif /* __cplusplus */
typedef void (*dvdcallbacklow)(s32 result);
s32 bwDVD_LowInit();
s32 bwDVD_LowInquiry(dvddrvinfo *info,dvdcallbacklow cb);
s32 bwDVD_LowReadID(dvddiskid *diskID,dvdcallbacklow cb);
s32 bwDVD_LowClosePartition(dvdcallbacklow cb);
s32 bwDVD_LowOpenPartition(u32 offset,void *eticket,u32 certin_len,void *certificate_in,void *certificate_out,dvdcallbacklow cb);
s32 bwDVD_LowUnencryptedRead(void *buf,u32 len,u32 offset,dvdcallbacklow cb);
s32 bwDVD_LowReset(dvdcallbacklow cb);
s32 bwDVD_LowWaitCoverClose(dvdcallbacklow cb);
s32 bwDVD_LowRead(void *buf,u32 len,u32 offset,dvdcallbacklow cb);
s32 bwDVD_EnableVideo(dvdcallbacklow cb);
s32 bwDVD_LowReadVideo(void *buf,u32 len,u32 offset,dvdcallbacklow cb);
s32 bwDVD_SetDecryption(s32 mode, dvdcallbacklow cb);
s32 bwDVD_SetOffset(u32 offset, dvdcallbacklow cb);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif #endif

View File

@ -1,98 +1,99 @@
/* /*
* Copyright (C) 2008 Nuke (wiinuke@gmail.com) * Copyright (C) 2008 Nuke (wiinuke@gmail.com)
* *
* this file is part of GeckoOS for USB Gecko * this file is part of GeckoOS for USB Gecko
* http://www.usbgecko.com * http://www.usbgecko.com
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or * the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <gccore.h> #include <gccore.h>
#include <malloc.h> #include <malloc.h>
#include <sys/unistd.h> #include <sys/unistd.h>
#include <sdcard/wiisd_io.h> #include <sdcard/wiisd_io.h>
#include <ogc/ipc.h> #include <ogc/ipc.h>
#include "settings/cfg.h" #include "settings/cfg.h"
#include "fst.h" #include "fst.h"
#include "dvd_broadway.h" #include "dvd_broadway.h"
#include "wpad.h" #include "wpad.h"
#include "fatmounter.h" #include "fatmounter.h"
extern struct SSettings Settings; extern struct SSettings Settings;
u32 do_sd_code(char *filename) { u32 do_sd_code(char *filename)
FILE *fp; {
u8 *filebuff; FILE *fp;
u32 filesize; u8 *filebuff;
u32 ret; u32 filesize;
char filepath[150]; u32 ret;
char filepath[150];
SDCard_Init();
USBDevice_Init(); SDCard_Init();
USBDevice_Init();
sprintf(filepath, "%s%s", Settings.Cheatcodespath, filename);
filepath[strlen(Settings.Cheatcodespath)+6] = 0x2E; sprintf(filepath, "%s%s", Settings.Cheatcodespath, filename);
filepath[strlen(Settings.Cheatcodespath)+7] = 0x67; filepath[strlen(Settings.Cheatcodespath)+6] = 0x2E;
filepath[strlen(Settings.Cheatcodespath)+8] = 0x63; filepath[strlen(Settings.Cheatcodespath)+7] = 0x67;
filepath[strlen(Settings.Cheatcodespath)+9] = 0x74; filepath[strlen(Settings.Cheatcodespath)+8] = 0x63;
filepath[strlen(Settings.Cheatcodespath)+10] = 0; filepath[strlen(Settings.Cheatcodespath)+9] = 0x74;
filepath[strlen(Settings.Cheatcodespath)+10] = 0;
fp = fopen(filepath, "rb");
if (!fp) { fp = fopen(filepath, "rb");
USBDevice_deInit(); if (!fp) {
SDCard_deInit(); USBDevice_deInit();
return 0; SDCard_deInit();
} return 0;
}
fseek(fp, 0, SEEK_END);
filesize = ftell(fp); fseek(fp, 0, SEEK_END);
fseek(fp, 0, SEEK_SET); filesize = ftell(fp);
fseek(fp, 0, SEEK_SET);
filebuff = (u8*) malloc (filesize);
if (filebuff == 0) { filebuff = (u8*) malloc (filesize);
fclose(fp); if(filebuff == 0){
sleep(2); fclose(fp);
USBDevice_deInit(); sleep(2);
SDCard_deInit(); USBDevice_deInit();
return 0; SDCard_deInit();
} return 0;
}
ret = fread(filebuff, 1, filesize, fp);
if (ret != filesize) { ret = fread(filebuff, 1, filesize, fp);
free(filebuff); if(ret != filesize){
fclose(fp); free(filebuff);
USBDevice_deInit(); fclose(fp);
SDCard_deInit(); USBDevice_deInit();
return 0; SDCard_deInit();
} return 0;
}
memcpy((void*)0x800027E8,filebuff,filesize);
*(vu8*)0x80001807 = 0x01; memcpy((void*)0x800027E8,filebuff,filesize);
*(vu8*)0x80001807 = 0x01;
free(filebuff);
fclose(fp); free(filebuff);
fclose(fp);
USBDevice_deInit();
SDCard_deInit(); USBDevice_deInit();
SDCard_deInit();
return 1;
} return 1;
}

View File

@ -23,11 +23,12 @@
#define __FST_H__ #define __FST_H__
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C"
{
#endif #endif
//u32 do_fst(u32 fstlocation); //u32 do_fst(u32 fstlocation);
u32 do_sd_code(char *filename); u32 do_sd_code(char *filename);
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@ -1,15 +1,15 @@
unsigned char fwrite_patch_bin[] = { unsigned char fwrite_patch_bin[] = {
0x7c, 0x84, 0x29, 0xd6, 0x39, 0x40, 0x00, 0x00, 0x94, 0x21, 0xff, 0xf0, 0x7c, 0x84, 0x29, 0xd6, 0x39, 0x40, 0x00, 0x00, 0x94, 0x21, 0xff, 0xf0,
0x93, 0xe1, 0x00, 0x0c, 0x7f, 0x8a, 0x20, 0x00, 0x40, 0x9c, 0x00, 0x64, 0x93, 0xe1, 0x00, 0x0c, 0x7f, 0x8a, 0x20, 0x00, 0x40, 0x9c, 0x00, 0x64,
0x3d, 0x00, 0xcd, 0x00, 0x3d, 0x60, 0xcd, 0x00, 0x3d, 0x20, 0xcd, 0x00, 0x3d, 0x00, 0xcd, 0x00, 0x3d, 0x60, 0xcd, 0x00, 0x3d, 0x20, 0xcd, 0x00,
0x61, 0x08, 0x68, 0x14, 0x61, 0x6b, 0x68, 0x24, 0x61, 0x29, 0x68, 0x20, 0x61, 0x08, 0x68, 0x14, 0x61, 0x6b, 0x68, 0x24, 0x61, 0x29, 0x68, 0x20,
0x39, 0x80, 0x00, 0xd0, 0x38, 0xc0, 0x00, 0x19, 0x38, 0xe0, 0x00, 0x00, 0x39, 0x80, 0x00, 0xd0, 0x38, 0xc0, 0x00, 0x19, 0x38, 0xe0, 0x00, 0x00,
0x91, 0x88, 0x00, 0x00, 0x7c, 0x03, 0x50, 0xae, 0x54, 0x00, 0xa0, 0x16, 0x91, 0x88, 0x00, 0x00, 0x7c, 0x03, 0x50, 0xae, 0x54, 0x00, 0xa0, 0x16,
0x64, 0x00, 0xb0, 0x00, 0x90, 0x0b, 0x00, 0x00, 0x90, 0xc9, 0x00, 0x00, 0x64, 0x00, 0xb0, 0x00, 0x90, 0x0b, 0x00, 0x00, 0x90, 0xc9, 0x00, 0x00,
0x80, 0x09, 0x00, 0x00, 0x70, 0x1f, 0x00, 0x01, 0x40, 0x82, 0xff, 0xf8, 0x80, 0x09, 0x00, 0x00, 0x70, 0x1f, 0x00, 0x01, 0x40, 0x82, 0xff, 0xf8,
0x80, 0x0b, 0x00, 0x00, 0x90, 0xe8, 0x00, 0x00, 0x54, 0x00, 0x37, 0xfe, 0x80, 0x0b, 0x00, 0x00, 0x90, 0xe8, 0x00, 0x00, 0x54, 0x00, 0x37, 0xfe,
0x7d, 0x4a, 0x02, 0x14, 0x7f, 0x8a, 0x20, 0x00, 0x41, 0x9c, 0xff, 0xc8, 0x7d, 0x4a, 0x02, 0x14, 0x7f, 0x8a, 0x20, 0x00, 0x41, 0x9c, 0xff, 0xc8,
0x7c, 0xa3, 0x2b, 0x78, 0x83, 0xe1, 0x00, 0x0c, 0x38, 0x21, 0x00, 0x10, 0x7c, 0xa3, 0x2b, 0x78, 0x83, 0xe1, 0x00, 0x0c, 0x38, 0x21, 0x00, 0x10,
0x4e, 0x80, 0x00, 0x20 0x4e, 0x80, 0x00, 0x20
}; };
unsigned int fwrite_patch_bin_len = 136; unsigned int fwrite_patch_bin_len = 136;

View File

@ -4,261 +4,261 @@ Visit http://www.devkitpro.org
*/ */
const unsigned char kenobiwii[] = { const unsigned char kenobiwii[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x26, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x26, 0xa0, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0x21, 0xff, 0x58, 0x90, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0x21, 0xff, 0x58, 0x90, 0x01, 0x00, 0x08,
0x7c, 0x08, 0x02, 0xa6, 0x90, 0x01, 0x00, 0xac, 0x7c, 0x00, 0x00, 0x26, 0x90, 0x01, 0x00, 0x0c, 0x7c, 0x08, 0x02, 0xa6, 0x90, 0x01, 0x00, 0xac, 0x7c, 0x00, 0x00, 0x26, 0x90, 0x01, 0x00, 0x0c,
0x7c, 0x09, 0x02, 0xa6, 0x90, 0x01, 0x00, 0x10, 0x7c, 0x01, 0x02, 0xa6, 0x90, 0x01, 0x00, 0x14, 0x7c, 0x09, 0x02, 0xa6, 0x90, 0x01, 0x00, 0x10, 0x7c, 0x01, 0x02, 0xa6, 0x90, 0x01, 0x00, 0x14,
0xbc, 0x61, 0x00, 0x18, 0x7f, 0x20, 0x00, 0xa6, 0x63, 0x3a, 0x20, 0x00, 0x73, 0x5a, 0xf9, 0xff, 0xbc, 0x61, 0x00, 0x18, 0x7f, 0x20, 0x00, 0xa6, 0x63, 0x3a, 0x20, 0x00, 0x73, 0x5a, 0xf9, 0xff,
0x7f, 0x40, 0x01, 0x24, 0xd8, 0x41, 0x00, 0x98, 0xd8, 0x61, 0x00, 0xa0, 0x3f, 0xe0, 0x80, 0x00, 0x7f, 0x40, 0x01, 0x24, 0xd8, 0x41, 0x00, 0x98, 0xd8, 0x61, 0x00, 0xa0, 0x3f, 0xe0, 0x80, 0x00,
0x3e, 0x80, 0xcc, 0x00, 0xa3, 0x94, 0x40, 0x10, 0x63, 0x95, 0x00, 0xff, 0xb2, 0xb4, 0x40, 0x10, 0x3e, 0x80, 0xcc, 0x00, 0xa3, 0x94, 0x40, 0x10, 0x63, 0x95, 0x00, 0xff, 0xb2, 0xb4, 0x40, 0x10,
0x48, 0x00, 0x06, 0xb1, 0x3a, 0xa0, 0x00, 0x00, 0x3a, 0xc0, 0x00, 0x19, 0x3a, 0xe0, 0x00, 0xd0, 0x48, 0x00, 0x06, 0xb1, 0x3a, 0xa0, 0x00, 0x00, 0x3a, 0xc0, 0x00, 0x19, 0x3a, 0xe0, 0x00, 0xd0,
0x3f, 0x00, 0xcd, 0x00, 0x63, 0xf2, 0x26, 0xa0, 0x80, 0x01, 0x00, 0xac, 0x90, 0x12, 0x00, 0x04, 0x3f, 0x00, 0xcd, 0x00, 0x63, 0xf2, 0x26, 0xa0, 0x80, 0x01, 0x00, 0xac, 0x90, 0x12, 0x00, 0x04,
0x92, 0xb8, 0x64, 0x3c, 0x48, 0x00, 0x04, 0x85, 0x41, 0x82, 0x05, 0xfc, 0x2c, 0x1d, 0x00, 0x04, 0x92, 0xb8, 0x64, 0x3c, 0x48, 0x00, 0x04, 0x85, 0x41, 0x82, 0x05, 0xfc, 0x2c, 0x1d, 0x00, 0x04,
0x40, 0x80, 0x00, 0x10, 0x2c, 0x1d, 0x00, 0x01, 0x41, 0x80, 0x05, 0xec, 0x48, 0x00, 0x03, 0xa8, 0x40, 0x80, 0x00, 0x10, 0x2c, 0x1d, 0x00, 0x01, 0x41, 0x80, 0x05, 0xec, 0x48, 0x00, 0x03, 0xa8,
0x41, 0x82, 0x05, 0x48, 0x2c, 0x1d, 0x00, 0x06, 0x41, 0x82, 0x00, 0x8c, 0x2c, 0x1d, 0x00, 0x07, 0x41, 0x82, 0x05, 0x48, 0x2c, 0x1d, 0x00, 0x06, 0x41, 0x82, 0x00, 0x8c, 0x2c, 0x1d, 0x00, 0x07,
0x41, 0x82, 0x03, 0x8c, 0x2c, 0x1d, 0x00, 0x08, 0x41, 0x82, 0x05, 0xd8, 0x2c, 0x1d, 0x00, 0x09, 0x41, 0x82, 0x03, 0x8c, 0x2c, 0x1d, 0x00, 0x08, 0x41, 0x82, 0x05, 0xd8, 0x2c, 0x1d, 0x00, 0x09,
0x41, 0x82, 0x00, 0xa0, 0x2c, 0x1d, 0x00, 0x10, 0x41, 0x82, 0x00, 0x98, 0x2c, 0x1d, 0x00, 0x2f, 0x41, 0x82, 0x00, 0xa0, 0x2c, 0x1d, 0x00, 0x10, 0x41, 0x82, 0x00, 0x98, 0x2c, 0x1d, 0x00, 0x2f,
0x41, 0x82, 0x00, 0x70, 0x2c, 0x1d, 0x00, 0x30, 0x41, 0x82, 0x00, 0x78, 0x2c, 0x1d, 0x00, 0x38, 0x41, 0x82, 0x00, 0x70, 0x2c, 0x1d, 0x00, 0x30, 0x41, 0x82, 0x00, 0x78, 0x2c, 0x1d, 0x00, 0x38,
0x41, 0x82, 0x05, 0x80, 0x2c, 0x1d, 0x00, 0x40, 0x41, 0x82, 0x03, 0x9c, 0x2c, 0x1d, 0x00, 0x41, 0x41, 0x82, 0x05, 0x80, 0x2c, 0x1d, 0x00, 0x40, 0x41, 0x82, 0x03, 0x9c, 0x2c, 0x1d, 0x00, 0x41,
0x41, 0x82, 0x03, 0xb0, 0x2c, 0x1d, 0x00, 0x44, 0x41, 0x82, 0x00, 0x68, 0x2c, 0x1d, 0x00, 0x50, 0x41, 0x82, 0x03, 0xb0, 0x2c, 0x1d, 0x00, 0x44, 0x41, 0x82, 0x00, 0x68, 0x2c, 0x1d, 0x00, 0x50,
0x41, 0x82, 0x00, 0x20, 0x2c, 0x1d, 0x00, 0x60, 0x41, 0x82, 0x00, 0x24, 0x2c, 0x1d, 0x00, 0x89, 0x41, 0x82, 0x00, 0x20, 0x2c, 0x1d, 0x00, 0x60, 0x41, 0x82, 0x00, 0x24, 0x2c, 0x1d, 0x00, 0x89,
0x41, 0x82, 0x00, 0x50, 0x2c, 0x1d, 0x00, 0x99, 0x41, 0x82, 0x05, 0x64, 0x48, 0x00, 0x05, 0x68, 0x41, 0x82, 0x00, 0x50, 0x2c, 0x1d, 0x00, 0x99, 0x41, 0x82, 0x05, 0x64, 0x48, 0x00, 0x05, 0x68,
0x80, 0x72, 0x00, 0x00, 0x48, 0x00, 0x04, 0x81, 0x48, 0x00, 0x05, 0x5c, 0x48, 0x00, 0x05, 0xe5, 0x80, 0x72, 0x00, 0x00, 0x48, 0x00, 0x04, 0x81, 0x48, 0x00, 0x05, 0x5c, 0x48, 0x00, 0x05, 0xe5,
0x48, 0x00, 0x05, 0x54, 0x38, 0x80, 0x00, 0x01, 0x90, 0x92, 0x00, 0x00, 0x48, 0x00, 0x05, 0x48, 0x48, 0x00, 0x05, 0x54, 0x38, 0x80, 0x00, 0x01, 0x90, 0x92, 0x00, 0x00, 0x48, 0x00, 0x05, 0x48,
0x48, 0x00, 0x04, 0x61, 0x3a, 0x00, 0x00, 0xa0, 0x63, 0xec, 0x26, 0xc4, 0x48, 0x00, 0x03, 0x6c, 0x48, 0x00, 0x04, 0x61, 0x3a, 0x00, 0x00, 0xa0, 0x63, 0xec, 0x26, 0xc4, 0x48, 0x00, 0x03, 0x6c,
0x38, 0x60, 0x01, 0x20, 0x63, 0xec, 0x26, 0xc4, 0x48, 0x00, 0x04, 0x21, 0x48, 0x00, 0x05, 0x28, 0x38, 0x60, 0x01, 0x20, 0x63, 0xec, 0x26, 0xc4, 0x48, 0x00, 0x04, 0x21, 0x48, 0x00, 0x05, 0x28,
0x2f, 0x1d, 0x00, 0x10, 0x2e, 0x9d, 0x00, 0x44, 0x63, 0xe4, 0x1a, 0xb4, 0x3c, 0x60, 0x80, 0x00, 0x2f, 0x1d, 0x00, 0x10, 0x2e, 0x9d, 0x00, 0x44, 0x63, 0xe4, 0x1a, 0xb4, 0x3c, 0x60, 0x80, 0x00,
0x60, 0x63, 0x03, 0x00, 0x48, 0x00, 0x05, 0x65, 0x38, 0x63, 0x0a, 0x00, 0x48, 0x00, 0x05, 0x5d, 0x60, 0x63, 0x03, 0x00, 0x48, 0x00, 0x05, 0x65, 0x38, 0x63, 0x0a, 0x00, 0x48, 0x00, 0x05, 0x5d,
0x38, 0x63, 0x06, 0x00, 0x48, 0x00, 0x05, 0x55, 0x63, 0xec, 0x26, 0xb4, 0x92, 0xac, 0x00, 0x00, 0x38, 0x63, 0x06, 0x00, 0x48, 0x00, 0x05, 0x55, 0x63, 0xec, 0x26, 0xb4, 0x92, 0xac, 0x00, 0x00,
0x92, 0xac, 0x00, 0x04, 0x92, 0xac, 0x00, 0x08, 0x63, 0xe4, 0x26, 0xc4, 0x81, 0x24, 0x00, 0x18, 0x92, 0xac, 0x00, 0x04, 0x92, 0xac, 0x00, 0x08, 0x63, 0xe4, 0x26, 0xc4, 0x81, 0x24, 0x00, 0x18,
0x80, 0x72, 0x00, 0x00, 0x2c, 0x03, 0x00, 0x02, 0x40, 0x82, 0x00, 0x0c, 0x41, 0x96, 0x00, 0x0c, 0x80, 0x72, 0x00, 0x00, 0x2c, 0x03, 0x00, 0x02, 0x40, 0x82, 0x00, 0x0c, 0x41, 0x96, 0x00, 0x0c,
0x48, 0x00, 0x00, 0x20, 0x38, 0x60, 0x00, 0x00, 0x90, 0x6c, 0x00, 0x0c, 0x40, 0x82, 0x00, 0x14, 0x48, 0x00, 0x00, 0x20, 0x38, 0x60, 0x00, 0x00, 0x90, 0x6c, 0x00, 0x0c, 0x40, 0x82, 0x00, 0x14,
0x40, 0x96, 0x00, 0x10, 0x61, 0x29, 0x04, 0x00, 0x91, 0x24, 0x00, 0x18, 0x48, 0x00, 0x02, 0x70, 0x40, 0x96, 0x00, 0x10, 0x61, 0x29, 0x04, 0x00, 0x91, 0x24, 0x00, 0x18, 0x48, 0x00, 0x02, 0x70,
0x55, 0x29, 0x05, 0xa8, 0x91, 0x24, 0x00, 0x18, 0x41, 0x96, 0x04, 0xac, 0x41, 0x9a, 0x00, 0x08, 0x55, 0x29, 0x05, 0xa8, 0x91, 0x24, 0x00, 0x18, 0x41, 0x96, 0x04, 0xac, 0x41, 0x9a, 0x00, 0x08,
0x39, 0x8c, 0x00, 0x04, 0x38, 0x60, 0x00, 0x04, 0x48, 0x00, 0x03, 0x61, 0x40, 0x99, 0x00, 0x10, 0x39, 0x8c, 0x00, 0x04, 0x38, 0x60, 0x00, 0x04, 0x48, 0x00, 0x03, 0x61, 0x40, 0x99, 0x00, 0x10,
0x39, 0x8c, 0x00, 0x04, 0x38, 0x60, 0x00, 0x04, 0x48, 0x00, 0x03, 0x51, 0x63, 0xe4, 0x26, 0xb4, 0x39, 0x8c, 0x00, 0x04, 0x38, 0x60, 0x00, 0x04, 0x48, 0x00, 0x03, 0x51, 0x63, 0xe4, 0x26, 0xb4,
0x80, 0x64, 0x00, 0x00, 0x80, 0x84, 0x00, 0x04, 0x7c, 0x72, 0xfb, 0xa6, 0x7c, 0x95, 0xfb, 0xa6, 0x80, 0x64, 0x00, 0x00, 0x80, 0x84, 0x00, 0x04, 0x7c, 0x72, 0xfb, 0xa6, 0x7c, 0x95, 0xfb, 0xa6,
0x48, 0x00, 0x04, 0x74, 0x7c, 0x32, 0x43, 0xa6, 0x7c, 0x3a, 0x02, 0xa6, 0x7c, 0x73, 0x43, 0xa6, 0x48, 0x00, 0x04, 0x74, 0x7c, 0x32, 0x43, 0xa6, 0x7c, 0x3a, 0x02, 0xa6, 0x7c, 0x73, 0x43, 0xa6,
0x7c, 0x7b, 0x02, 0xa6, 0x54, 0x63, 0x05, 0xa8, 0x90, 0x60, 0x26, 0xdc, 0x54, 0x63, 0x06, 0x20, 0x7c, 0x7b, 0x02, 0xa6, 0x54, 0x63, 0x05, 0xa8, 0x90, 0x60, 0x26, 0xdc, 0x54, 0x63, 0x06, 0x20,
0x60, 0x63, 0x20, 0x00, 0x54, 0x63, 0x04, 0x5e, 0x7c, 0x7b, 0x03, 0xa6, 0x3c, 0x60, 0x80, 0x00, 0x60, 0x63, 0x20, 0x00, 0x54, 0x63, 0x04, 0x5e, 0x7c, 0x7b, 0x03, 0xa6, 0x3c, 0x60, 0x80, 0x00,
0x60, 0x63, 0x1a, 0xf4, 0x7c, 0x7a, 0x03, 0xa6, 0x4c, 0x00, 0x01, 0x2c, 0x7c, 0x00, 0x04, 0xac, 0x60, 0x63, 0x1a, 0xf4, 0x7c, 0x7a, 0x03, 0xa6, 0x4c, 0x00, 0x01, 0x2c, 0x7c, 0x00, 0x04, 0xac,
0x4c, 0x00, 0x00, 0x64, 0x3c, 0x60, 0x80, 0x00, 0x60, 0x63, 0x26, 0xc4, 0x90, 0x23, 0x00, 0x14, 0x4c, 0x00, 0x00, 0x64, 0x3c, 0x60, 0x80, 0x00, 0x60, 0x63, 0x26, 0xc4, 0x90, 0x23, 0x00, 0x14,
0x7c, 0x61, 0x1b, 0x78, 0x7c, 0x73, 0x42, 0xa6, 0xbc, 0x41, 0x00, 0x24, 0x7c, 0x24, 0x0b, 0x78, 0x7c, 0x61, 0x1b, 0x78, 0x7c, 0x73, 0x42, 0xa6, 0xbc, 0x41, 0x00, 0x24, 0x7c, 0x24, 0x0b, 0x78,
0x7c, 0x32, 0x42, 0xa6, 0x90, 0x04, 0x00, 0x1c, 0x90, 0x24, 0x00, 0x20, 0x7c, 0x68, 0x02, 0xa6, 0x7c, 0x32, 0x42, 0xa6, 0x90, 0x04, 0x00, 0x1c, 0x90, 0x24, 0x00, 0x20, 0x7c, 0x68, 0x02, 0xa6,
0x90, 0x64, 0x00, 0x9c, 0x7c, 0x60, 0x00, 0x26, 0x90, 0x64, 0x00, 0x00, 0x7c, 0x61, 0x02, 0xa6, 0x90, 0x64, 0x00, 0x9c, 0x7c, 0x60, 0x00, 0x26, 0x90, 0x64, 0x00, 0x00, 0x7c, 0x61, 0x02, 0xa6,
0x90, 0x64, 0x00, 0x04, 0x7c, 0x69, 0x02, 0xa6, 0x90, 0x64, 0x00, 0x08, 0x7c, 0x72, 0x02, 0xa6, 0x90, 0x64, 0x00, 0x04, 0x7c, 0x69, 0x02, 0xa6, 0x90, 0x64, 0x00, 0x08, 0x7c, 0x72, 0x02, 0xa6,
0x90, 0x64, 0x00, 0x0c, 0x7c, 0x73, 0x02, 0xa6, 0x90, 0x64, 0x00, 0x10, 0x39, 0x20, 0x00, 0x00, 0x90, 0x64, 0x00, 0x0c, 0x7c, 0x73, 0x02, 0xa6, 0x90, 0x64, 0x00, 0x10, 0x39, 0x20, 0x00, 0x00,
0x7d, 0x32, 0xfb, 0xa6, 0x7d, 0x35, 0xfb, 0xa6, 0xd0, 0x04, 0x00, 0xa0, 0xd0, 0x24, 0x00, 0xa4, 0x7d, 0x32, 0xfb, 0xa6, 0x7d, 0x35, 0xfb, 0xa6, 0xd0, 0x04, 0x00, 0xa0, 0xd0, 0x24, 0x00, 0xa4,
0xd0, 0x44, 0x00, 0xa8, 0xd0, 0x64, 0x00, 0xac, 0xd0, 0x84, 0x00, 0xb0, 0xd0, 0xa4, 0x00, 0xb4, 0xd0, 0x44, 0x00, 0xa8, 0xd0, 0x64, 0x00, 0xac, 0xd0, 0x84, 0x00, 0xb0, 0xd0, 0xa4, 0x00, 0xb4,
0xd0, 0xc4, 0x00, 0xb8, 0xd0, 0xe4, 0x00, 0xbc, 0xd1, 0x04, 0x00, 0xc0, 0xd1, 0x24, 0x00, 0xc4, 0xd0, 0xc4, 0x00, 0xb8, 0xd0, 0xe4, 0x00, 0xbc, 0xd1, 0x04, 0x00, 0xc0, 0xd1, 0x24, 0x00, 0xc4,
0xd1, 0x44, 0x00, 0xc8, 0xd1, 0x64, 0x00, 0xcc, 0xd1, 0x84, 0x00, 0xd0, 0xd1, 0xa4, 0x00, 0xd4, 0xd1, 0x44, 0x00, 0xc8, 0xd1, 0x64, 0x00, 0xcc, 0xd1, 0x84, 0x00, 0xd0, 0xd1, 0xa4, 0x00, 0xd4,
0xd1, 0xc4, 0x00, 0xd8, 0xd1, 0xe4, 0x00, 0xdc, 0xd2, 0x04, 0x00, 0xe0, 0xd2, 0x24, 0x00, 0xe4, 0xd1, 0xc4, 0x00, 0xd8, 0xd1, 0xe4, 0x00, 0xdc, 0xd2, 0x04, 0x00, 0xe0, 0xd2, 0x24, 0x00, 0xe4,
0xd2, 0x44, 0x00, 0xe8, 0xd2, 0x64, 0x00, 0xec, 0xd2, 0x84, 0x00, 0xf0, 0xd2, 0xa4, 0x00, 0xf4, 0xd2, 0x44, 0x00, 0xe8, 0xd2, 0x64, 0x00, 0xec, 0xd2, 0x84, 0x00, 0xf0, 0xd2, 0xa4, 0x00, 0xf4,
0xd2, 0xc4, 0x00, 0xf8, 0xd2, 0xe4, 0x00, 0xfc, 0xd3, 0x04, 0x01, 0x00, 0xd3, 0x24, 0x01, 0x04, 0xd2, 0xc4, 0x00, 0xf8, 0xd2, 0xe4, 0x00, 0xfc, 0xd3, 0x04, 0x01, 0x00, 0xd3, 0x24, 0x01, 0x04,
0xd3, 0x44, 0x01, 0x08, 0xd3, 0x64, 0x01, 0x0c, 0xd3, 0x84, 0x01, 0x10, 0xd3, 0xa4, 0x01, 0x14, 0xd3, 0x44, 0x01, 0x08, 0xd3, 0x64, 0x01, 0x0c, 0xd3, 0x84, 0x01, 0x10, 0xd3, 0xa4, 0x01, 0x14,
0xd3, 0xc4, 0x01, 0x18, 0xd3, 0xe4, 0x01, 0x1c, 0x3f, 0xe0, 0x80, 0x00, 0x63, 0xe5, 0x26, 0xb4, 0xd3, 0xc4, 0x01, 0x18, 0xd3, 0xe4, 0x01, 0x1c, 0x3f, 0xe0, 0x80, 0x00, 0x63, 0xe5, 0x26, 0xb4,
0x82, 0x05, 0x00, 0x00, 0x82, 0x25, 0x00, 0x04, 0x82, 0x65, 0x00, 0x0c, 0x2c, 0x13, 0x00, 0x00, 0x82, 0x05, 0x00, 0x00, 0x82, 0x25, 0x00, 0x04, 0x82, 0x65, 0x00, 0x0c, 0x2c, 0x13, 0x00, 0x00,
0x41, 0x82, 0x00, 0x74, 0x2c, 0x13, 0x00, 0x02, 0x40, 0x82, 0x00, 0x18, 0x81, 0x24, 0x00, 0x14, 0x41, 0x82, 0x00, 0x74, 0x2c, 0x13, 0x00, 0x02, 0x40, 0x82, 0x00, 0x18, 0x81, 0x24, 0x00, 0x14,
0x39, 0x33, 0x00, 0x03, 0x91, 0x25, 0x00, 0x00, 0x91, 0x25, 0x00, 0x0c, 0x48, 0x00, 0x00, 0x6c, 0x39, 0x33, 0x00, 0x03, 0x91, 0x25, 0x00, 0x00, 0x91, 0x25, 0x00, 0x0c, 0x48, 0x00, 0x00, 0x6c,
0x7c, 0x10, 0x98, 0x00, 0x41, 0x82, 0x00, 0x38, 0x7c, 0x11, 0x98, 0x00, 0x41, 0x82, 0x00, 0x30, 0x7c, 0x10, 0x98, 0x00, 0x41, 0x82, 0x00, 0x38, 0x7c, 0x11, 0x98, 0x00, 0x41, 0x82, 0x00, 0x30,
0x7d, 0x30, 0x8a, 0x14, 0x91, 0x25, 0x00, 0x0c, 0x82, 0x05, 0x00, 0x08, 0x2c, 0x10, 0x00, 0x00, 0x7d, 0x30, 0x8a, 0x14, 0x91, 0x25, 0x00, 0x0c, 0x82, 0x05, 0x00, 0x08, 0x2c, 0x10, 0x00, 0x00,
0x41, 0x82, 0x00, 0x48, 0x80, 0x64, 0x00, 0x10, 0x7c, 0x10, 0x18, 0x00, 0x40, 0x82, 0x00, 0x10, 0x41, 0x82, 0x00, 0x48, 0x80, 0x64, 0x00, 0x10, 0x7c, 0x10, 0x18, 0x00, 0x40, 0x82, 0x00, 0x10,
0x3a, 0x00, 0x00, 0x00, 0x92, 0x05, 0x00, 0x08, 0x48, 0x00, 0x00, 0x30, 0x3a, 0x20, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x92, 0x05, 0x00, 0x08, 0x48, 0x00, 0x00, 0x30, 0x3a, 0x20, 0x00, 0x00,
0x92, 0x25, 0x00, 0x0c, 0x81, 0x24, 0x00, 0x18, 0x61, 0x29, 0x04, 0x00, 0x91, 0x24, 0x00, 0x18, 0x92, 0x25, 0x00, 0x0c, 0x81, 0x24, 0x00, 0x18, 0x61, 0x29, 0x04, 0x00, 0x91, 0x24, 0x00, 0x18,
0x48, 0x00, 0x00, 0x30, 0x7e, 0x12, 0xfb, 0xa6, 0x7e, 0x35, 0xfb, 0xa6, 0x39, 0x20, 0x00, 0x01, 0x48, 0x00, 0x00, 0x30, 0x7e, 0x12, 0xfb, 0xa6, 0x7e, 0x35, 0xfb, 0xa6, 0x39, 0x20, 0x00, 0x01,
0x91, 0x25, 0x00, 0x0c, 0x48, 0x00, 0x00, 0x1c, 0x38, 0xa0, 0x00, 0x02, 0x63, 0xe4, 0x26, 0xa0, 0x91, 0x25, 0x00, 0x0c, 0x48, 0x00, 0x00, 0x1c, 0x38, 0xa0, 0x00, 0x02, 0x63, 0xe4, 0x26, 0xa0,
0x90, 0xa4, 0x00, 0x00, 0x38, 0x60, 0x00, 0x11, 0x48, 0x00, 0x01, 0xbd, 0x4b, 0xff, 0xfc, 0x1d, 0x90, 0xa4, 0x00, 0x00, 0x38, 0x60, 0x00, 0x11, 0x48, 0x00, 0x01, 0xbd, 0x4b, 0xff, 0xfc, 0x1d,
0x7c, 0x20, 0x00, 0xa6, 0x54, 0x21, 0x07, 0xfa, 0x54, 0x21, 0x04, 0x5e, 0x7c, 0x20, 0x01, 0x24, 0x7c, 0x20, 0x00, 0xa6, 0x54, 0x21, 0x07, 0xfa, 0x54, 0x21, 0x04, 0x5e, 0x7c, 0x20, 0x01, 0x24,
0x63, 0xe1, 0x26, 0xc4, 0x80, 0x61, 0x00, 0x00, 0x7c, 0x6f, 0xf1, 0x20, 0x80, 0x61, 0x00, 0x14, 0x63, 0xe1, 0x26, 0xc4, 0x80, 0x61, 0x00, 0x00, 0x7c, 0x6f, 0xf1, 0x20, 0x80, 0x61, 0x00, 0x14,
0x7c, 0x7a, 0x03, 0xa6, 0x80, 0x61, 0x00, 0x18, 0x7c, 0x7b, 0x03, 0xa6, 0x80, 0x61, 0x00, 0x9c, 0x7c, 0x7a, 0x03, 0xa6, 0x80, 0x61, 0x00, 0x18, 0x7c, 0x7b, 0x03, 0xa6, 0x80, 0x61, 0x00, 0x9c,
0x7c, 0x68, 0x03, 0xa6, 0xb8, 0x41, 0x00, 0x24, 0x80, 0x01, 0x00, 0x1c, 0x80, 0x21, 0x00, 0x20, 0x7c, 0x68, 0x03, 0xa6, 0xb8, 0x41, 0x00, 0x24, 0x80, 0x01, 0x00, 0x1c, 0x80, 0x21, 0x00, 0x20,
0x4c, 0x00, 0x01, 0x2c, 0x7c, 0x00, 0x04, 0xac, 0x4c, 0x00, 0x00, 0x64, 0x92, 0xb2, 0x00, 0x00, 0x4c, 0x00, 0x01, 0x2c, 0x7c, 0x00, 0x04, 0xac, 0x4c, 0x00, 0x00, 0x64, 0x92, 0xb2, 0x00, 0x00,
0x48, 0x00, 0x02, 0x50, 0x2e, 0x9d, 0x00, 0x02, 0x38, 0x60, 0x00, 0x08, 0x63, 0xec, 0x26, 0xa8, 0x48, 0x00, 0x02, 0x50, 0x2e, 0x9d, 0x00, 0x02, 0x38, 0x60, 0x00, 0x08, 0x63, 0xec, 0x26, 0xa8,
0x48, 0x00, 0x00, 0xf9, 0x80, 0xac, 0x00, 0x00, 0x80, 0x6c, 0x00, 0x04, 0x98, 0x65, 0x00, 0x00, 0x48, 0x00, 0x00, 0xf9, 0x80, 0xac, 0x00, 0x00, 0x80, 0x6c, 0x00, 0x04, 0x98, 0x65, 0x00, 0x00,
0x41, 0x94, 0x00, 0x10, 0xb0, 0x65, 0x00, 0x00, 0x41, 0x96, 0x00, 0x08, 0x90, 0x65, 0x00, 0x00, 0x41, 0x94, 0x00, 0x10, 0xb0, 0x65, 0x00, 0x00, 0x41, 0x96, 0x00, 0x08, 0x90, 0x65, 0x00, 0x00,
0x7c, 0x00, 0x28, 0xac, 0x7c, 0x00, 0x04, 0xac, 0x7c, 0x00, 0x2f, 0xac, 0x4c, 0x00, 0x01, 0x2c, 0x7c, 0x00, 0x28, 0xac, 0x7c, 0x00, 0x04, 0xac, 0x7c, 0x00, 0x2f, 0xac, 0x4c, 0x00, 0x01, 0x2c,
0x48, 0x00, 0x02, 0x04, 0x48, 0x00, 0x01, 0x1d, 0x38, 0x60, 0x00, 0x04, 0x63, 0xec, 0x26, 0xa8, 0x48, 0x00, 0x02, 0x04, 0x48, 0x00, 0x01, 0x1d, 0x38, 0x60, 0x00, 0x04, 0x63, 0xec, 0x26, 0xa8,
0x48, 0x00, 0x00, 0xb9, 0x82, 0x0c, 0x00, 0x00, 0x63, 0xec, 0x27, 0xe8, 0x48, 0x00, 0x00, 0x1c, 0x48, 0x00, 0x00, 0xb9, 0x82, 0x0c, 0x00, 0x00, 0x63, 0xec, 0x27, 0xe8, 0x48, 0x00, 0x00, 0x1c,
0x48, 0x00, 0x01, 0x01, 0x38, 0x60, 0x00, 0x08, 0x63, 0xec, 0x26, 0xa8, 0x48, 0x00, 0x00, 0x9d, 0x48, 0x00, 0x01, 0x01, 0x38, 0x60, 0x00, 0x08, 0x63, 0xec, 0x26, 0xa8, 0x48, 0x00, 0x00, 0x9d,
0x82, 0x0c, 0x00, 0x04, 0x81, 0x8c, 0x00, 0x00, 0x63, 0xfb, 0x26, 0xb0, 0x3a, 0x20, 0x0f, 0x80, 0x82, 0x0c, 0x00, 0x04, 0x81, 0x8c, 0x00, 0x00, 0x63, 0xfb, 0x26, 0xb0, 0x3a, 0x20, 0x0f, 0x80,
0x48, 0x00, 0x02, 0x3d, 0x41, 0x82, 0x00, 0x20, 0x7e, 0x23, 0x8b, 0x78, 0x48, 0x00, 0x00, 0x7d, 0x48, 0x00, 0x02, 0x3d, 0x41, 0x82, 0x00, 0x20, 0x7e, 0x23, 0x8b, 0x78, 0x48, 0x00, 0x00, 0x7d,
0x48, 0x00, 0x00, 0xd1, 0x41, 0x82, 0xff, 0xfc, 0x7d, 0x8c, 0x72, 0x14, 0x35, 0x6b, 0xff, 0xff, 0x48, 0x00, 0x00, 0xd1, 0x41, 0x82, 0xff, 0xfc, 0x7d, 0x8c, 0x72, 0x14, 0x35, 0x6b, 0xff, 0xff,
0x41, 0x81, 0xff, 0xe8, 0x80, 0x7b, 0x00, 0x00, 0x2c, 0x03, 0x00, 0x00, 0x41, 0x82, 0x00, 0x08, 0x41, 0x81, 0xff, 0xe8, 0x80, 0x7b, 0x00, 0x00, 0x2c, 0x03, 0x00, 0x00, 0x41, 0x82, 0x00, 0x08,
0x48, 0x00, 0x00, 0x59, 0x7c, 0x00, 0x60, 0xac, 0x7c, 0x00, 0x04, 0xac, 0x7c, 0x00, 0x67, 0xac, 0x48, 0x00, 0x00, 0x59, 0x7c, 0x00, 0x60, 0xac, 0x7c, 0x00, 0x04, 0xac, 0x7c, 0x00, 0x67, 0xac,
0x4c, 0x00, 0x01, 0x2c, 0x48, 0x00, 0x01, 0x80, 0x7f, 0xc8, 0x02, 0xa6, 0x3c, 0x60, 0xa0, 0x00, 0x4c, 0x00, 0x01, 0x2c, 0x48, 0x00, 0x01, 0x80, 0x7f, 0xc8, 0x02, 0xa6, 0x3c, 0x60, 0xa0, 0x00,
0x48, 0x00, 0x00, 0x15, 0x76, 0x03, 0x08, 0x00, 0x56, 0x1d, 0x86, 0x3e, 0x7f, 0xc8, 0x03, 0xa6, 0x48, 0x00, 0x00, 0x15, 0x76, 0x03, 0x08, 0x00, 0x56, 0x1d, 0x86, 0x3e, 0x7f, 0xc8, 0x03, 0xa6,
0x4e, 0x80, 0x00, 0x20, 0x92, 0xf8, 0x68, 0x14, 0x90, 0x78, 0x68, 0x24, 0x92, 0xd8, 0x68, 0x20, 0x4e, 0x80, 0x00, 0x20, 0x92, 0xf8, 0x68, 0x14, 0x90, 0x78, 0x68, 0x24, 0x92, 0xd8, 0x68, 0x20,
0x80, 0xb8, 0x68, 0x20, 0x70, 0xa5, 0x00, 0x01, 0x40, 0x82, 0xff, 0xf8, 0x82, 0x18, 0x68, 0x24, 0x80, 0xb8, 0x68, 0x20, 0x70, 0xa5, 0x00, 0x01, 0x40, 0x82, 0xff, 0xf8, 0x82, 0x18, 0x68, 0x24,
0x90, 0xb8, 0x68, 0x14, 0x4e, 0x80, 0x00, 0x20, 0x7d, 0x48, 0x02, 0xa6, 0x7c, 0x69, 0x03, 0xa6, 0x90, 0xb8, 0x68, 0x14, 0x4e, 0x80, 0x00, 0x20, 0x7d, 0x48, 0x02, 0xa6, 0x7c, 0x69, 0x03, 0xa6,
0x39, 0xc0, 0x00, 0x00, 0x48, 0x00, 0x00, 0x79, 0x48, 0x00, 0x00, 0x75, 0x4b, 0xff, 0xff, 0xad, 0x39, 0xc0, 0x00, 0x00, 0x48, 0x00, 0x00, 0x79, 0x48, 0x00, 0x00, 0x75, 0x4b, 0xff, 0xff, 0xad,
0x41, 0x82, 0xff, 0xf4, 0x7f, 0xae, 0x61, 0xae, 0x39, 0xce, 0x00, 0x01, 0x42, 0x00, 0xff, 0xe8, 0x41, 0x82, 0xff, 0xf4, 0x7f, 0xae, 0x61, 0xae, 0x39, 0xce, 0x00, 0x01, 0x42, 0x00, 0xff, 0xe8,
0x7d, 0x48, 0x03, 0xa6, 0x4e, 0x80, 0x00, 0x20, 0x7d, 0x48, 0x02, 0xa6, 0x7c, 0x69, 0x03, 0xa6, 0x7d, 0x48, 0x03, 0xa6, 0x4e, 0x80, 0x00, 0x20, 0x7d, 0x48, 0x02, 0xa6, 0x7c, 0x69, 0x03, 0xa6,
0x39, 0xc0, 0x00, 0x00, 0x7c, 0x6c, 0x70, 0xae, 0x48, 0x00, 0x00, 0x1d, 0x41, 0x82, 0xff, 0xf8, 0x39, 0xc0, 0x00, 0x00, 0x7c, 0x6c, 0x70, 0xae, 0x48, 0x00, 0x00, 0x1d, 0x41, 0x82, 0xff, 0xf8,
0x39, 0xce, 0x00, 0x01, 0x42, 0x00, 0xff, 0xf0, 0x7d, 0x48, 0x03, 0xa6, 0x4e, 0x80, 0x00, 0x20, 0x39, 0xce, 0x00, 0x01, 0x42, 0x00, 0xff, 0xf0, 0x7d, 0x48, 0x03, 0xa6, 0x4e, 0x80, 0x00, 0x20,
0x38, 0x60, 0x00, 0xaa, 0x7f, 0xc8, 0x02, 0xa6, 0x54, 0x63, 0xa0, 0x16, 0x64, 0x63, 0xb0, 0x00, 0x38, 0x60, 0x00, 0xaa, 0x7f, 0xc8, 0x02, 0xa6, 0x54, 0x63, 0xa0, 0x16, 0x64, 0x63, 0xb0, 0x00,
0x3a, 0xc0, 0x00, 0x19, 0x3a, 0xe0, 0x00, 0xd0, 0x3f, 0x00, 0xcd, 0x00, 0x4b, 0xff, 0xff, 0x69, 0x3a, 0xc0, 0x00, 0x19, 0x3a, 0xe0, 0x00, 0xd0, 0x3f, 0x00, 0xcd, 0x00, 0x4b, 0xff, 0xff, 0x69,
0x56, 0x03, 0x37, 0xff, 0x7f, 0xc8, 0x03, 0xa6, 0x4e, 0x80, 0x00, 0x20, 0x7f, 0xc8, 0x02, 0xa6, 0x56, 0x03, 0x37, 0xff, 0x7f, 0xc8, 0x03, 0xa6, 0x4e, 0x80, 0x00, 0x20, 0x7f, 0xc8, 0x02, 0xa6,
0x3c, 0x60, 0xd0, 0x00, 0x4b, 0xff, 0xff, 0x51, 0x56, 0x03, 0x37, 0xff, 0x41, 0x82, 0xff, 0xf4, 0x3c, 0x60, 0xd0, 0x00, 0x4b, 0xff, 0xff, 0x51, 0x56, 0x03, 0x37, 0xff, 0x41, 0x82, 0xff, 0xf4,
0x7f, 0xc8, 0x03, 0xa6, 0x4e, 0x80, 0x00, 0x20, 0x4b, 0xff, 0xff, 0xb9, 0x38, 0x60, 0x00, 0x08, 0x7f, 0xc8, 0x03, 0xa6, 0x4e, 0x80, 0x00, 0x20, 0x4b, 0xff, 0xff, 0xb9, 0x38, 0x60, 0x00, 0x08,
0x63, 0xec, 0x26, 0xa8, 0x4b, 0xff, 0xff, 0x55, 0x80, 0xac, 0x00, 0x04, 0x81, 0x8c, 0x00, 0x00, 0x63, 0xec, 0x26, 0xa8, 0x4b, 0xff, 0xff, 0x55, 0x80, 0xac, 0x00, 0x04, 0x81, 0x8c, 0x00, 0x00,
0x63, 0xfb, 0x26, 0xb0, 0x62, 0xb1, 0xf8, 0x00, 0x7e, 0x0c, 0x28, 0x50, 0x48, 0x00, 0x00, 0xf1, 0x63, 0xfb, 0x26, 0xb0, 0x62, 0xb1, 0xf8, 0x00, 0x7e, 0x0c, 0x28, 0x50, 0x48, 0x00, 0x00, 0xf1,
0x41, 0x81, 0x00, 0x10, 0x82, 0x3b, 0x00, 0x00, 0x2c, 0x11, 0x00, 0x00, 0x41, 0x82, 0x00, 0x68, 0x41, 0x81, 0x00, 0x10, 0x82, 0x3b, 0x00, 0x00, 0x2c, 0x11, 0x00, 0x00, 0x41, 0x82, 0x00, 0x68,
0x7e, 0x23, 0x8b, 0x78, 0x4b, 0xff, 0xff, 0x55, 0x4b, 0xff, 0xff, 0xa5, 0x4b, 0xff, 0xff, 0xa1, 0x7e, 0x23, 0x8b, 0x78, 0x4b, 0xff, 0xff, 0x55, 0x4b, 0xff, 0xff, 0xa5, 0x4b, 0xff, 0xff, 0xa1,
0x4b, 0xff, 0xfe, 0xd9, 0x41, 0x82, 0xff, 0xf4, 0x2c, 0x1d, 0x00, 0xcc, 0x41, 0x82, 0x00, 0x48, 0x4b, 0xff, 0xfe, 0xd9, 0x41, 0x82, 0xff, 0xf4, 0x2c, 0x1d, 0x00, 0xcc, 0x41, 0x82, 0x00, 0x48,
0x2c, 0x1d, 0x00, 0xbb, 0x41, 0x82, 0xff, 0xdc, 0x2c, 0x1d, 0x00, 0xaa, 0x40, 0x82, 0xff, 0xdc, 0x2c, 0x1d, 0x00, 0xbb, 0x41, 0x82, 0xff, 0xdc, 0x2c, 0x1d, 0x00, 0xaa, 0x40, 0x82, 0xff, 0xdc,
0x7d, 0x8c, 0x72, 0x14, 0x35, 0x6b, 0xff, 0xff, 0x41, 0x80, 0x00, 0x2c, 0x4b, 0xff, 0xff, 0xb4, 0x7d, 0x8c, 0x72, 0x14, 0x35, 0x6b, 0xff, 0xff, 0x41, 0x80, 0x00, 0x2c, 0x4b, 0xff, 0xff, 0xb4,
0x7e, 0xb5, 0xfb, 0xa6, 0x7e, 0xb2, 0xfb, 0xa6, 0x63, 0xe4, 0x26, 0xc4, 0x81, 0x24, 0x00, 0x18, 0x7e, 0xb5, 0xfb, 0xa6, 0x7e, 0xb2, 0xfb, 0xa6, 0x63, 0xe4, 0x26, 0xc4, 0x81, 0x24, 0x00, 0x18,
0x55, 0x29, 0x05, 0xa8, 0x91, 0x24, 0x00, 0x18, 0x48, 0x00, 0x00, 0x0c, 0x38, 0x60, 0x00, 0x80, 0x55, 0x29, 0x05, 0xa8, 0x91, 0x24, 0x00, 0x18, 0x48, 0x00, 0x00, 0x0c, 0x38, 0x60, 0x00, 0x80,
0x4b, 0xff, 0xff, 0x25, 0x80, 0x92, 0x00, 0x00, 0x2c, 0x04, 0x00, 0x00, 0x40, 0x82, 0xf9, 0xf8, 0x4b, 0xff, 0xff, 0x25, 0x80, 0x92, 0x00, 0x00, 0x2c, 0x04, 0x00, 0x00, 0x40, 0x82, 0xf9, 0xf8,
0xb3, 0x94, 0x40, 0x10, 0xc8, 0x41, 0x00, 0x98, 0xc8, 0x61, 0x00, 0xa0, 0x7f, 0x20, 0x00, 0xa6, 0xb3, 0x94, 0x40, 0x10, 0xc8, 0x41, 0x00, 0x98, 0xc8, 0x61, 0x00, 0xa0, 0x7f, 0x20, 0x00, 0xa6,
0x80, 0x01, 0x00, 0xac, 0x7c, 0x08, 0x03, 0xa6, 0x80, 0x01, 0x00, 0x0c, 0x7c, 0x0f, 0xf1, 0x20, 0x80, 0x01, 0x00, 0xac, 0x7c, 0x08, 0x03, 0xa6, 0x80, 0x01, 0x00, 0x0c, 0x7c, 0x0f, 0xf1, 0x20,
0x80, 0x01, 0x00, 0x10, 0x7c, 0x09, 0x03, 0xa6, 0x80, 0x01, 0x00, 0x14, 0x7c, 0x01, 0x03, 0xa6, 0x80, 0x01, 0x00, 0x10, 0x7c, 0x09, 0x03, 0xa6, 0x80, 0x01, 0x00, 0x14, 0x7c, 0x01, 0x03, 0xa6,
0xb8, 0x61, 0x00, 0x18, 0x80, 0x01, 0x00, 0x08, 0x38, 0x21, 0x00, 0xa8, 0x4c, 0x00, 0x01, 0x2c, 0xb8, 0x61, 0x00, 0x18, 0x80, 0x01, 0x00, 0x08, 0x38, 0x21, 0x00, 0xa8, 0x4c, 0x00, 0x01, 0x2c,
0x7c, 0x00, 0x04, 0xac, 0x4e, 0x80, 0x00, 0x20, 0x7e, 0x23, 0x20, 0x50, 0x3c, 0xa0, 0x48, 0x00, 0x7c, 0x00, 0x04, 0xac, 0x4e, 0x80, 0x00, 0x20, 0x7e, 0x23, 0x20, 0x50, 0x3c, 0xa0, 0x48, 0x00,
0x52, 0x25, 0x01, 0xba, 0x90, 0xa3, 0x00, 0x00, 0x7c, 0x00, 0x18, 0xac, 0x7c, 0x00, 0x04, 0xac, 0x52, 0x25, 0x01, 0xba, 0x90, 0xa3, 0x00, 0x00, 0x7c, 0x00, 0x18, 0xac, 0x7c, 0x00, 0x04, 0xac,
0x7c, 0x00, 0x1f, 0xac, 0x4c, 0x00, 0x01, 0x2c, 0x4e, 0x80, 0x00, 0x20, 0x7d, 0x70, 0x8b, 0xd7, 0x7c, 0x00, 0x1f, 0xac, 0x4c, 0x00, 0x01, 0x2c, 0x4e, 0x80, 0x00, 0x20, 0x7d, 0x70, 0x8b, 0xd7,
0x7d, 0x4b, 0x89, 0xd6, 0x7d, 0x4a, 0x80, 0x50, 0x91, 0x5b, 0x00, 0x00, 0x4e, 0x80, 0x00, 0x20, 0x7d, 0x4b, 0x89, 0xd6, 0x7d, 0x4a, 0x80, 0x50, 0x91, 0x5b, 0x00, 0x00, 0x4e, 0x80, 0x00, 0x20,
0x7f, 0xa8, 0x02, 0xa6, 0x63, 0xef, 0x27, 0xe8, 0x63, 0xe7, 0x18, 0x08, 0x3c, 0xc0, 0x80, 0x00, 0x7f, 0xa8, 0x02, 0xa6, 0x63, 0xef, 0x27, 0xe8, 0x63, 0xe7, 0x18, 0x08, 0x3c, 0xc0, 0x80, 0x00,
0x7c, 0xd0, 0x33, 0x78, 0x39, 0x00, 0x00, 0x00, 0x3c, 0x60, 0x00, 0xd0, 0x60, 0x63, 0xc0, 0xde, 0x7c, 0xd0, 0x33, 0x78, 0x39, 0x00, 0x00, 0x00, 0x3c, 0x60, 0x00, 0xd0, 0x60, 0x63, 0xc0, 0xde,
0x80, 0x8f, 0x00, 0x00, 0x7c, 0x03, 0x20, 0x00, 0x40, 0x82, 0x00, 0x18, 0x80, 0x8f, 0x00, 0x04, 0x80, 0x8f, 0x00, 0x00, 0x7c, 0x03, 0x20, 0x00, 0x40, 0x82, 0x00, 0x18, 0x80, 0x8f, 0x00, 0x04,
0x7c, 0x03, 0x20, 0x00, 0x40, 0x82, 0x00, 0x0c, 0x39, 0xef, 0x00, 0x08, 0x48, 0x00, 0x00, 0x0c, 0x7c, 0x03, 0x20, 0x00, 0x40, 0x82, 0x00, 0x0c, 0x39, 0xef, 0x00, 0x08, 0x48, 0x00, 0x00, 0x0c,
0x7f, 0xa8, 0x03, 0xa6, 0x4e, 0x80, 0x00, 0x20, 0x80, 0x6f, 0x00, 0x00, 0x80, 0x8f, 0x00, 0x04, 0x7f, 0xa8, 0x03, 0xa6, 0x4e, 0x80, 0x00, 0x20, 0x80, 0x6f, 0x00, 0x00, 0x80, 0x8f, 0x00, 0x04,
0x39, 0xef, 0x00, 0x08, 0x71, 0x09, 0x00, 0x01, 0x2f, 0x89, 0x00, 0x00, 0x39, 0x20, 0x00, 0x00, 0x39, 0xef, 0x00, 0x08, 0x71, 0x09, 0x00, 0x01, 0x2f, 0x89, 0x00, 0x00, 0x39, 0x20, 0x00, 0x00,
0x54, 0x6a, 0x1f, 0x7e, 0x54, 0x65, 0x3f, 0x7e, 0x74, 0x6b, 0x10, 0x00, 0x54, 0x63, 0x01, 0xfe, 0x54, 0x6a, 0x1f, 0x7e, 0x54, 0x65, 0x3f, 0x7e, 0x74, 0x6b, 0x10, 0x00, 0x54, 0x63, 0x01, 0xfe,
0x40, 0x82, 0x00, 0x0c, 0x54, 0xcc, 0x00, 0x0c, 0x48, 0x00, 0x00, 0x08, 0x7e, 0x0c, 0x83, 0x78, 0x40, 0x82, 0x00, 0x0c, 0x54, 0xcc, 0x00, 0x0c, 0x48, 0x00, 0x00, 0x08, 0x7e, 0x0c, 0x83, 0x78,
0x2e, 0x05, 0x00, 0x00, 0x2c, 0x0a, 0x00, 0x01, 0x41, 0xa0, 0x00, 0x2c, 0x41, 0xa2, 0x00, 0xe4, 0x2e, 0x05, 0x00, 0x00, 0x2c, 0x0a, 0x00, 0x01, 0x41, 0xa0, 0x00, 0x2c, 0x41, 0xa2, 0x00, 0xe4,
0x2c, 0x0a, 0x00, 0x03, 0x41, 0xa0, 0x01, 0xb0, 0x41, 0x82, 0x02, 0x54, 0x2c, 0x0a, 0x00, 0x05, 0x2c, 0x0a, 0x00, 0x03, 0x41, 0xa0, 0x01, 0xb0, 0x41, 0x82, 0x02, 0x54, 0x2c, 0x0a, 0x00, 0x05,
0x41, 0x80, 0x02, 0xdc, 0x41, 0xa2, 0x04, 0xe8, 0x2c, 0x0a, 0x00, 0x07, 0x41, 0xa0, 0x05, 0x14, 0x41, 0x80, 0x02, 0xdc, 0x41, 0xa2, 0x04, 0xe8, 0x2c, 0x0a, 0x00, 0x07, 0x41, 0xa0, 0x05, 0x14,
0x48, 0x00, 0x05, 0xf8, 0x7d, 0x8c, 0x1a, 0x14, 0x2c, 0x05, 0x00, 0x03, 0x41, 0x82, 0x00, 0x48, 0x48, 0x00, 0x05, 0xf8, 0x7d, 0x8c, 0x1a, 0x14, 0x2c, 0x05, 0x00, 0x03, 0x41, 0x82, 0x00, 0x48,
0x41, 0x81, 0x00, 0x60, 0x40, 0xbe, 0xff, 0x84, 0x2e, 0x05, 0x00, 0x01, 0x41, 0x91, 0x00, 0x2c, 0x41, 0x81, 0x00, 0x60, 0x40, 0xbe, 0xff, 0x84, 0x2e, 0x05, 0x00, 0x01, 0x41, 0x91, 0x00, 0x2c,
0x54, 0x8a, 0x84, 0x3e, 0x41, 0x92, 0x00, 0x10, 0x7c, 0x89, 0x61, 0xae, 0x39, 0x29, 0x00, 0x01, 0x54, 0x8a, 0x84, 0x3e, 0x41, 0x92, 0x00, 0x10, 0x7c, 0x89, 0x61, 0xae, 0x39, 0x29, 0x00, 0x01,
0x48, 0x00, 0x00, 0x0c, 0x7c, 0x89, 0x63, 0x2e, 0x39, 0x29, 0x00, 0x02, 0x35, 0x4a, 0xff, 0xff, 0x48, 0x00, 0x00, 0x0c, 0x7c, 0x89, 0x63, 0x2e, 0x39, 0x29, 0x00, 0x02, 0x35, 0x4a, 0xff, 0xff,
0x40, 0xa0, 0xff, 0xe4, 0x4b, 0xff, 0xff, 0x54, 0x55, 0x8c, 0x00, 0x3a, 0x90, 0x8c, 0x00, 0x00, 0x40, 0xa0, 0xff, 0xe4, 0x4b, 0xff, 0xff, 0x54, 0x55, 0x8c, 0x00, 0x3a, 0x90, 0x8c, 0x00, 0x00,
0x4b, 0xff, 0xff, 0x48, 0x7c, 0x89, 0x23, 0x78, 0x40, 0x9e, 0x04, 0xd0, 0x35, 0x29, 0xff, 0xff, 0x4b, 0xff, 0xff, 0x48, 0x7c, 0x89, 0x23, 0x78, 0x40, 0x9e, 0x04, 0xd0, 0x35, 0x29, 0xff, 0xff,
0x41, 0x80, 0x04, 0xc8, 0x7c, 0xa9, 0x78, 0xae, 0x7c, 0xa9, 0x61, 0xae, 0x4b, 0xff, 0xff, 0xf0, 0x41, 0x80, 0x04, 0xc8, 0x7c, 0xa9, 0x78, 0xae, 0x7c, 0xa9, 0x61, 0xae, 0x4b, 0xff, 0xff, 0xf0,
0x39, 0xef, 0x00, 0x08, 0x40, 0xbe, 0xff, 0x24, 0x80, 0xaf, 0xff, 0xf8, 0x81, 0x6f, 0xff, 0xfc, 0x39, 0xef, 0x00, 0x08, 0x40, 0xbe, 0xff, 0x24, 0x80, 0xaf, 0xff, 0xf8, 0x81, 0x6f, 0xff, 0xfc,
0x54, 0xb1, 0x04, 0x3e, 0x54, 0xaa, 0x85, 0x3e, 0x54, 0xa5, 0x27, 0x3e, 0x2e, 0x85, 0x00, 0x01, 0x54, 0xb1, 0x04, 0x3e, 0x54, 0xaa, 0x85, 0x3e, 0x54, 0xa5, 0x27, 0x3e, 0x2e, 0x85, 0x00, 0x01,
0x41, 0x96, 0x00, 0x10, 0x41, 0xb5, 0x00, 0x14, 0x7c, 0x89, 0x61, 0xae, 0x48, 0x00, 0x00, 0x10, 0x41, 0x96, 0x00, 0x10, 0x41, 0xb5, 0x00, 0x14, 0x7c, 0x89, 0x61, 0xae, 0x48, 0x00, 0x00, 0x10,
0x7c, 0x89, 0x63, 0x2e, 0x48, 0x00, 0x00, 0x08, 0x7c, 0x89, 0x61, 0x2e, 0x7c, 0x84, 0x5a, 0x14, 0x7c, 0x89, 0x63, 0x2e, 0x48, 0x00, 0x00, 0x08, 0x7c, 0x89, 0x61, 0x2e, 0x7c, 0x84, 0x5a, 0x14,
0x7d, 0x29, 0x8a, 0x14, 0x35, 0x4a, 0xff, 0xff, 0x40, 0x80, 0xff, 0xd4, 0x4b, 0xff, 0xfe, 0xdc, 0x7d, 0x29, 0x8a, 0x14, 0x35, 0x4a, 0xff, 0xff, 0x40, 0x80, 0xff, 0xd4, 0x4b, 0xff, 0xfe, 0xdc,
0x54, 0x69, 0x07, 0xff, 0x41, 0x82, 0x00, 0x10, 0x55, 0x08, 0xf8, 0x7e, 0x71, 0x09, 0x00, 0x01, 0x54, 0x69, 0x07, 0xff, 0x41, 0x82, 0x00, 0x10, 0x55, 0x08, 0xf8, 0x7e, 0x71, 0x09, 0x00, 0x01,
0x2f, 0x89, 0x00, 0x00, 0x2e, 0x85, 0x00, 0x04, 0x2d, 0x8a, 0x00, 0x05, 0x7d, 0x13, 0x43, 0x78, 0x2f, 0x89, 0x00, 0x00, 0x2e, 0x85, 0x00, 0x04, 0x2d, 0x8a, 0x00, 0x05, 0x7d, 0x13, 0x43, 0x78,
0x52, 0x68, 0x08, 0x3c, 0x40, 0x9e, 0x00, 0x78, 0x41, 0x8d, 0x04, 0xbc, 0x7d, 0x8c, 0x1a, 0x14, 0x52, 0x68, 0x08, 0x3c, 0x40, 0x9e, 0x00, 0x78, 0x41, 0x8d, 0x04, 0xbc, 0x7d, 0x8c, 0x1a, 0x14,
0x41, 0x8c, 0x00, 0x0c, 0x41, 0x94, 0x00, 0x30, 0x48, 0x00, 0x00, 0x1c, 0x40, 0x94, 0x00, 0x10, 0x41, 0x8c, 0x00, 0x0c, 0x41, 0x94, 0x00, 0x30, 0x48, 0x00, 0x00, 0x1c, 0x40, 0x94, 0x00, 0x10,
0x55, 0x8c, 0x00, 0x3a, 0x81, 0x6c, 0x00, 0x00, 0x48, 0x00, 0x00, 0x1c, 0x55, 0x8c, 0x00, 0x3c, 0x55, 0x8c, 0x00, 0x3a, 0x81, 0x6c, 0x00, 0x00, 0x48, 0x00, 0x00, 0x1c, 0x55, 0x8c, 0x00, 0x3c,
0xa1, 0x6c, 0x00, 0x00, 0x7c, 0x89, 0x20, 0xf8, 0x55, 0x29, 0x84, 0x3e, 0x7d, 0x6b, 0x48, 0x38, 0xa1, 0x6c, 0x00, 0x00, 0x7c, 0x89, 0x20, 0xf8, 0x55, 0x29, 0x84, 0x3e, 0x7d, 0x6b, 0x48, 0x38,
0x54, 0x84, 0x04, 0x3e, 0x7f, 0x0b, 0x20, 0x40, 0x70, 0xa9, 0x00, 0x03, 0x41, 0x82, 0x00, 0x18, 0x54, 0x84, 0x04, 0x3e, 0x7f, 0x0b, 0x20, 0x40, 0x70, 0xa9, 0x00, 0x03, 0x41, 0x82, 0x00, 0x18,
0x2c, 0x09, 0x00, 0x02, 0x41, 0x82, 0x00, 0x18, 0x41, 0x81, 0x00, 0x1c, 0x40, 0x9a, 0x00, 0x20, 0x2c, 0x09, 0x00, 0x02, 0x41, 0x82, 0x00, 0x18, 0x41, 0x81, 0x00, 0x1c, 0x40, 0x9a, 0x00, 0x20,
0x48, 0x00, 0x00, 0x18, 0x41, 0x9a, 0x00, 0x18, 0x48, 0x00, 0x00, 0x10, 0x41, 0x99, 0x00, 0x10, 0x48, 0x00, 0x00, 0x18, 0x41, 0x9a, 0x00, 0x18, 0x48, 0x00, 0x00, 0x10, 0x41, 0x99, 0x00, 0x10,
0x48, 0x00, 0x00, 0x08, 0x41, 0x98, 0x00, 0x08, 0x61, 0x08, 0x00, 0x01, 0x40, 0x8e, 0xfe, 0x3c, 0x48, 0x00, 0x00, 0x08, 0x41, 0x98, 0x00, 0x08, 0x61, 0x08, 0x00, 0x01, 0x40, 0x8e, 0xfe, 0x3c,
0x41, 0x94, 0xfe, 0x38, 0x81, 0x6f, 0xff, 0xf8, 0x40, 0x9e, 0x00, 0x20, 0x70, 0x6c, 0x00, 0x08, 0x41, 0x94, 0xfe, 0x38, 0x81, 0x6f, 0xff, 0xf8, 0x40, 0x9e, 0x00, 0x20, 0x70, 0x6c, 0x00, 0x08,
0x41, 0x82, 0x00, 0x0c, 0x71, 0x0c, 0x00, 0x01, 0x41, 0x82, 0x00, 0x10, 0x39, 0x8b, 0x00, 0x10, 0x41, 0x82, 0x00, 0x0c, 0x71, 0x0c, 0x00, 0x01, 0x41, 0x82, 0x00, 0x10, 0x39, 0x8b, 0x00, 0x10,
0x51, 0x8b, 0x03, 0x36, 0x48, 0x00, 0x00, 0x08, 0x55, 0x6b, 0x07, 0x16, 0x91, 0x6f, 0xff, 0xf8, 0x51, 0x8b, 0x03, 0x36, 0x48, 0x00, 0x00, 0x08, 0x55, 0x6b, 0x07, 0x16, 0x91, 0x6f, 0xff, 0xf8,
0x4b, 0xff, 0xfe, 0x08, 0x40, 0xbe, 0xfe, 0x04, 0x54, 0x69, 0x16, 0xba, 0x54, 0x6e, 0x87, 0xfe, 0x4b, 0xff, 0xfe, 0x08, 0x40, 0xbe, 0xfe, 0x04, 0x54, 0x69, 0x16, 0xba, 0x54, 0x6e, 0x87, 0xfe,
0x2d, 0x8e, 0x00, 0x00, 0x2e, 0x05, 0x00, 0x04, 0x70, 0xae, 0x00, 0x03, 0x2e, 0x8e, 0x00, 0x02, 0x2d, 0x8e, 0x00, 0x00, 0x2e, 0x05, 0x00, 0x04, 0x70, 0xae, 0x00, 0x03, 0x2e, 0x8e, 0x00, 0x02,
0x41, 0x94, 0x00, 0x14, 0x41, 0x96, 0x00, 0x50, 0x7c, 0x64, 0x07, 0x34, 0x7c, 0x84, 0x7a, 0x14, 0x41, 0x94, 0x00, 0x14, 0x41, 0x96, 0x00, 0x50, 0x7c, 0x64, 0x07, 0x34, 0x7c, 0x84, 0x7a, 0x14,
0x48, 0x00, 0x00, 0x68, 0x54, 0x65, 0xa7, 0xff, 0x41, 0x82, 0x00, 0x0c, 0x7d, 0x27, 0x48, 0x2e, 0x48, 0x00, 0x00, 0x68, 0x54, 0x65, 0xa7, 0xff, 0x41, 0x82, 0x00, 0x0c, 0x7d, 0x27, 0x48, 0x2e,
0x7c, 0x84, 0x4a, 0x14, 0x41, 0x8e, 0x00, 0x08, 0x7c, 0x8c, 0x22, 0x14, 0x2e, 0x8e, 0x00, 0x01, 0x7c, 0x84, 0x4a, 0x14, 0x41, 0x8e, 0x00, 0x08, 0x7c, 0x8c, 0x22, 0x14, 0x2e, 0x8e, 0x00, 0x01,
0x41, 0x96, 0x00, 0x08, 0x80, 0x84, 0x00, 0x00, 0x54, 0x63, 0x67, 0xff, 0x41, 0x82, 0x00, 0x3c, 0x41, 0x96, 0x00, 0x08, 0x80, 0x84, 0x00, 0x00, 0x54, 0x63, 0x67, 0xff, 0x41, 0x82, 0x00, 0x3c,
0x40, 0x90, 0x00, 0x0c, 0x7c, 0x84, 0x32, 0x14, 0x48, 0x00, 0x00, 0x30, 0x7c, 0x84, 0x82, 0x14, 0x40, 0x90, 0x00, 0x0c, 0x7c, 0x84, 0x32, 0x14, 0x48, 0x00, 0x00, 0x30, 0x7c, 0x84, 0x82, 0x14,
0x48, 0x00, 0x00, 0x28, 0x54, 0x65, 0xa7, 0xff, 0x41, 0x82, 0x00, 0x0c, 0x7d, 0x27, 0x48, 0x2e, 0x48, 0x00, 0x00, 0x28, 0x54, 0x65, 0xa7, 0xff, 0x41, 0x82, 0x00, 0x0c, 0x7d, 0x27, 0x48, 0x2e,
0x7c, 0x84, 0x4a, 0x14, 0x40, 0x90, 0x00, 0x0c, 0x7c, 0xcc, 0x21, 0x2e, 0x4b, 0xff, 0xfd, 0x7c, 0x7c, 0x84, 0x4a, 0x14, 0x40, 0x90, 0x00, 0x0c, 0x7c, 0xcc, 0x21, 0x2e, 0x4b, 0xff, 0xfd, 0x7c,
0x7e, 0x0c, 0x21, 0x2e, 0x4b, 0xff, 0xfd, 0x74, 0x40, 0x90, 0x00, 0x0c, 0x7c, 0x86, 0x23, 0x78, 0x7e, 0x0c, 0x21, 0x2e, 0x4b, 0xff, 0xfd, 0x74, 0x40, 0x90, 0x00, 0x0c, 0x7c, 0x86, 0x23, 0x78,
0x4b, 0xff, 0xfd, 0x68, 0x7c, 0x90, 0x23, 0x78, 0x4b, 0xff, 0xfd, 0x60, 0x54, 0x89, 0x1e, 0x78, 0x4b, 0xff, 0xfd, 0x68, 0x7c, 0x90, 0x23, 0x78, 0x4b, 0xff, 0xfd, 0x60, 0x54, 0x89, 0x1e, 0x78,
0x39, 0x29, 0x00, 0x40, 0x2c, 0x05, 0x00, 0x02, 0x41, 0x80, 0x00, 0x4c, 0x54, 0x6b, 0x67, 0xbf, 0x39, 0x29, 0x00, 0x40, 0x2c, 0x05, 0x00, 0x02, 0x41, 0x80, 0x00, 0x4c, 0x54, 0x6b, 0x67, 0xbf,
0x2c, 0x0b, 0x00, 0x01, 0x41, 0x80, 0x00, 0x14, 0x41, 0x82, 0x00, 0x08, 0x48, 0x00, 0x00, 0x10, 0x2c, 0x0b, 0x00, 0x01, 0x41, 0x80, 0x00, 0x14, 0x41, 0x82, 0x00, 0x08, 0x48, 0x00, 0x00, 0x10,
0x41, 0xbe, 0xfd, 0x38, 0x48, 0x00, 0x00, 0x08, 0x40, 0xbe, 0xfd, 0x30, 0x2c, 0x05, 0x00, 0x03, 0x41, 0xbe, 0xfd, 0x38, 0x48, 0x00, 0x00, 0x08, 0x40, 0xbe, 0xfd, 0x30, 0x2c, 0x05, 0x00, 0x03,
0x41, 0x81, 0x00, 0x10, 0x41, 0xa2, 0x00, 0x10, 0x7d, 0xe7, 0x48, 0x2e, 0x4b, 0xff, 0xfd, 0x1c, 0x41, 0x81, 0x00, 0x10, 0x41, 0xa2, 0x00, 0x10, 0x7d, 0xe7, 0x48, 0x2e, 0x4b, 0xff, 0xfd, 0x1c,
0x7d, 0xe7, 0x49, 0x2e, 0x7c, 0x64, 0x07, 0x34, 0x54, 0x84, 0x1a, 0x78, 0x7d, 0xef, 0x22, 0x14, 0x7d, 0xe7, 0x49, 0x2e, 0x7c, 0x64, 0x07, 0x34, 0x54, 0x84, 0x1a, 0x78, 0x7d, 0xef, 0x22, 0x14,
0x4b, 0xff, 0xfd, 0x08, 0x40, 0xbe, 0xfd, 0x04, 0x7c, 0xa7, 0x4a, 0x14, 0x40, 0x92, 0x00, 0x14, 0x4b, 0xff, 0xfd, 0x08, 0x40, 0xbe, 0xfd, 0x04, 0x7c, 0xa7, 0x4a, 0x14, 0x40, 0x92, 0x00, 0x14,
0x54, 0x64, 0x04, 0x3e, 0x91, 0xe5, 0x00, 0x00, 0x90, 0x85, 0x00, 0x04, 0x4b, 0xff, 0xfc, 0xec, 0x54, 0x64, 0x04, 0x3e, 0x91, 0xe5, 0x00, 0x00, 0x90, 0x85, 0x00, 0x04, 0x4b, 0xff, 0xfc, 0xec,
0x81, 0x25, 0x00, 0x04, 0x2c, 0x09, 0x00, 0x00, 0x41, 0xa2, 0xfc, 0xe0, 0x39, 0x29, 0xff, 0xff, 0x81, 0x25, 0x00, 0x04, 0x2c, 0x09, 0x00, 0x00, 0x41, 0xa2, 0xfc, 0xe0, 0x39, 0x29, 0xff, 0xff,
0x91, 0x25, 0x00, 0x04, 0x81, 0xe5, 0x00, 0x00, 0x4b, 0xff, 0xfc, 0xd0, 0x40, 0xbe, 0xfc, 0xcc, 0x91, 0x25, 0x00, 0x04, 0x81, 0xe5, 0x00, 0x00, 0x4b, 0xff, 0xfc, 0xd0, 0x40, 0xbe, 0xfc, 0xcc,
0x54, 0x6b, 0x16, 0xba, 0x7f, 0x47, 0x5a, 0x14, 0x81, 0x3a, 0x00, 0x00, 0x54, 0x6e, 0x67, 0xbe, 0x54, 0x6b, 0x16, 0xba, 0x7f, 0x47, 0x5a, 0x14, 0x81, 0x3a, 0x00, 0x00, 0x54, 0x6e, 0x67, 0xbe,
0x41, 0x92, 0x00, 0x84, 0x2e, 0x05, 0x00, 0x05, 0x40, 0x90, 0x01, 0x74, 0x2e, 0x05, 0x00, 0x03, 0x41, 0x92, 0x00, 0x84, 0x2e, 0x05, 0x00, 0x05, 0x40, 0x90, 0x01, 0x74, 0x2e, 0x05, 0x00, 0x03,
0x40, 0x90, 0x00, 0x90, 0x2e, 0x05, 0x00, 0x01, 0x54, 0x65, 0x87, 0xff, 0x41, 0x82, 0x00, 0x08, 0x40, 0x90, 0x00, 0x90, 0x2e, 0x05, 0x00, 0x01, 0x54, 0x65, 0x87, 0xff, 0x41, 0x82, 0x00, 0x08,
0x7c, 0x8c, 0x22, 0x14, 0x2f, 0x0e, 0x00, 0x01, 0x40, 0x92, 0x00, 0x24, 0x41, 0xb9, 0x00, 0x18, 0x7c, 0x8c, 0x22, 0x14, 0x2f, 0x0e, 0x00, 0x01, 0x40, 0x92, 0x00, 0x24, 0x41, 0xb9, 0x00, 0x18,
0x41, 0x9a, 0x00, 0x0c, 0x88, 0x84, 0x00, 0x00, 0x48, 0x00, 0x00, 0xf8, 0xa0, 0x84, 0x00, 0x00, 0x41, 0x9a, 0x00, 0x0c, 0x88, 0x84, 0x00, 0x00, 0x48, 0x00, 0x00, 0xf8, 0xa0, 0x84, 0x00, 0x00,
0x48, 0x00, 0x00, 0xf0, 0x80, 0x84, 0x00, 0x00, 0x48, 0x00, 0x00, 0xe8, 0x54, 0x73, 0xe5, 0x3e, 0x48, 0x00, 0x00, 0xf0, 0x80, 0x84, 0x00, 0x00, 0x48, 0x00, 0x00, 0xe8, 0x54, 0x73, 0xe5, 0x3e,
0x41, 0xb9, 0x00, 0x20, 0x41, 0x9a, 0x00, 0x10, 0x99, 0x24, 0x00, 0x00, 0x38, 0x84, 0x00, 0x01, 0x41, 0xb9, 0x00, 0x20, 0x41, 0x9a, 0x00, 0x10, 0x99, 0x24, 0x00, 0x00, 0x38, 0x84, 0x00, 0x01,
0x48, 0x00, 0x00, 0x18, 0xb1, 0x24, 0x00, 0x00, 0x38, 0x84, 0x00, 0x02, 0x48, 0x00, 0x00, 0x0c, 0x48, 0x00, 0x00, 0x18, 0xb1, 0x24, 0x00, 0x00, 0x38, 0x84, 0x00, 0x02, 0x48, 0x00, 0x00, 0x0c,
0x91, 0x24, 0x00, 0x00, 0x38, 0x84, 0x00, 0x04, 0x36, 0x73, 0xff, 0xff, 0x40, 0x80, 0xff, 0xd4, 0x91, 0x24, 0x00, 0x00, 0x38, 0x84, 0x00, 0x04, 0x36, 0x73, 0xff, 0xff, 0x40, 0x80, 0xff, 0xd4,
0x4b, 0xff, 0xfc, 0x38, 0x54, 0x65, 0x87, 0xff, 0x41, 0x82, 0x00, 0x08, 0x7c, 0x84, 0x62, 0x14, 0x4b, 0xff, 0xfc, 0x38, 0x54, 0x65, 0x87, 0xff, 0x41, 0x82, 0x00, 0x08, 0x7c, 0x84, 0x62, 0x14,
0x71, 0xc5, 0x00, 0x01, 0x41, 0x82, 0x00, 0x9c, 0x7c, 0x84, 0x4a, 0x14, 0x48, 0x00, 0x00, 0x94, 0x71, 0xc5, 0x00, 0x01, 0x41, 0x82, 0x00, 0x9c, 0x7c, 0x84, 0x4a, 0x14, 0x48, 0x00, 0x00, 0x94,
0x54, 0x6a, 0x87, 0xbe, 0x54, 0x8e, 0x16, 0xba, 0x7e, 0x67, 0x72, 0x14, 0x40, 0x92, 0x00, 0x08, 0x54, 0x6a, 0x87, 0xbe, 0x54, 0x8e, 0x16, 0xba, 0x7e, 0x67, 0x72, 0x14, 0x40, 0x92, 0x00, 0x08,
0x3a, 0x6f, 0xff, 0xfc, 0x80, 0x9a, 0x00, 0x00, 0x81, 0x33, 0x00, 0x00, 0x71, 0x4b, 0x00, 0x01, 0x3a, 0x6f, 0xff, 0xfc, 0x80, 0x9a, 0x00, 0x00, 0x81, 0x33, 0x00, 0x00, 0x71, 0x4b, 0x00, 0x01,
0x41, 0x82, 0x00, 0x08, 0x7c, 0x9a, 0x23, 0x78, 0x71, 0x4b, 0x00, 0x02, 0x41, 0x82, 0x00, 0x10, 0x41, 0x82, 0x00, 0x08, 0x7c, 0x9a, 0x23, 0x78, 0x71, 0x4b, 0x00, 0x02, 0x41, 0x82, 0x00, 0x10,
0x7d, 0x33, 0x4b, 0x78, 0x40, 0xb2, 0x00, 0x08, 0x7e, 0x6c, 0x9a, 0x14, 0x54, 0x65, 0x67, 0x3f, 0x7d, 0x33, 0x4b, 0x78, 0x40, 0xb2, 0x00, 0x08, 0x7e, 0x6c, 0x9a, 0x14, 0x54, 0x65, 0x67, 0x3f,
0x2c, 0x05, 0x00, 0x09, 0x40, 0x80, 0x00, 0x54, 0x48, 0x00, 0x00, 0x79, 0x7c, 0x89, 0x22, 0x14, 0x2c, 0x05, 0x00, 0x09, 0x40, 0x80, 0x00, 0x54, 0x48, 0x00, 0x00, 0x79, 0x7c, 0x89, 0x22, 0x14,
0x48, 0x00, 0x00, 0x40, 0x7c, 0x89, 0x21, 0xd6, 0x48, 0x00, 0x00, 0x38, 0x7d, 0x24, 0x23, 0x78, 0x48, 0x00, 0x00, 0x40, 0x7c, 0x89, 0x21, 0xd6, 0x48, 0x00, 0x00, 0x38, 0x7d, 0x24, 0x23, 0x78,
0x48, 0x00, 0x00, 0x30, 0x7d, 0x24, 0x20, 0x38, 0x48, 0x00, 0x00, 0x28, 0x7d, 0x24, 0x22, 0x78, 0x48, 0x00, 0x00, 0x30, 0x7d, 0x24, 0x20, 0x38, 0x48, 0x00, 0x00, 0x28, 0x7d, 0x24, 0x22, 0x78,
0x48, 0x00, 0x00, 0x20, 0x7d, 0x24, 0x20, 0x30, 0x48, 0x00, 0x00, 0x18, 0x7d, 0x24, 0x24, 0x30, 0x48, 0x00, 0x00, 0x20, 0x7d, 0x24, 0x20, 0x30, 0x48, 0x00, 0x00, 0x18, 0x7d, 0x24, 0x24, 0x30,
0x48, 0x00, 0x00, 0x10, 0x5d, 0x24, 0x20, 0x3e, 0x48, 0x00, 0x00, 0x08, 0x7d, 0x24, 0x26, 0x30, 0x48, 0x00, 0x00, 0x10, 0x5d, 0x24, 0x20, 0x3e, 0x48, 0x00, 0x00, 0x08, 0x7d, 0x24, 0x26, 0x30,
0x90, 0x9a, 0x00, 0x00, 0x4b, 0xff, 0xfb, 0x84, 0x2c, 0x05, 0x00, 0x0a, 0x41, 0x81, 0xfb, 0x7c, 0x90, 0x9a, 0x00, 0x00, 0x4b, 0xff, 0xfb, 0x84, 0x2c, 0x05, 0x00, 0x0a, 0x41, 0x81, 0xfb, 0x7c,
0xc0, 0x5a, 0x00, 0x00, 0xc0, 0x73, 0x00, 0x00, 0x41, 0x82, 0x00, 0x0c, 0xec, 0x43, 0x10, 0x2a, 0xc0, 0x5a, 0x00, 0x00, 0xc0, 0x73, 0x00, 0x00, 0x41, 0x82, 0x00, 0x0c, 0xec, 0x43, 0x10, 0x2a,
0x48, 0x00, 0x00, 0x08, 0xec, 0x43, 0x00, 0xb2, 0xd0, 0x5a, 0x00, 0x00, 0x4b, 0xff, 0xfb, 0x5c, 0x48, 0x00, 0x00, 0x08, 0xec, 0x43, 0x00, 0xb2, 0xd0, 0x5a, 0x00, 0x00, 0x4b, 0xff, 0xfb, 0x5c,
0x7d, 0x48, 0x02, 0xa6, 0x54, 0xa5, 0x1e, 0x78, 0x7d, 0x4a, 0x2a, 0x14, 0x80, 0x9a, 0x00, 0x00, 0x7d, 0x48, 0x02, 0xa6, 0x54, 0xa5, 0x1e, 0x78, 0x7d, 0x4a, 0x2a, 0x14, 0x80, 0x9a, 0x00, 0x00,
0x81, 0x33, 0x00, 0x00, 0x7d, 0x48, 0x03, 0xa6, 0x4e, 0x80, 0x00, 0x20, 0x40, 0xbe, 0xfb, 0x3c, 0x81, 0x33, 0x00, 0x00, 0x7d, 0x48, 0x03, 0xa6, 0x4e, 0x80, 0x00, 0x20, 0x40, 0xbe, 0xfb, 0x3c,
0x54, 0x69, 0xc0, 0x3e, 0x7d, 0x8e, 0x63, 0x78, 0x48, 0x00, 0x00, 0x35, 0x41, 0x92, 0x00, 0x0c, 0x54, 0x69, 0xc0, 0x3e, 0x7d, 0x8e, 0x63, 0x78, 0x48, 0x00, 0x00, 0x35, 0x41, 0x92, 0x00, 0x0c,
0x7e, 0x31, 0x22, 0x14, 0x48, 0x00, 0x00, 0x08, 0x7d, 0x29, 0x22, 0x14, 0x54, 0x64, 0xc4, 0x3f, 0x7e, 0x31, 0x22, 0x14, 0x48, 0x00, 0x00, 0x08, 0x7d, 0x29, 0x22, 0x14, 0x54, 0x64, 0xc4, 0x3f,
0x38, 0xa0, 0x00, 0x00, 0x41, 0x82, 0xfb, 0x14, 0x7d, 0x45, 0x88, 0xae, 0x7d, 0x45, 0x49, 0xae, 0x38, 0xa0, 0x00, 0x00, 0x41, 0x82, 0xfb, 0x14, 0x7d, 0x45, 0x88, 0xae, 0x7d, 0x45, 0x49, 0xae,
0x38, 0xa5, 0x00, 0x01, 0x7c, 0x05, 0x20, 0x00, 0x4b, 0xff, 0xff, 0xec, 0x2e, 0x8a, 0x00, 0x04, 0x38, 0xa5, 0x00, 0x01, 0x7c, 0x05, 0x20, 0x00, 0x4b, 0xff, 0xff, 0xec, 0x2e, 0x8a, 0x00, 0x04,
0x55, 0x31, 0x36, 0xba, 0x2c, 0x11, 0x00, 0x3c, 0x7e, 0x27, 0x88, 0x2e, 0x40, 0x82, 0x00, 0x08, 0x55, 0x31, 0x36, 0xba, 0x2c, 0x11, 0x00, 0x3c, 0x7e, 0x27, 0x88, 0x2e, 0x40, 0x82, 0x00, 0x08,
0x7d, 0xd1, 0x73, 0x78, 0x41, 0x96, 0x00, 0x08, 0xa2, 0x31, 0x00, 0x00, 0x55, 0x29, 0x56, 0xba, 0x7d, 0xd1, 0x73, 0x78, 0x41, 0x96, 0x00, 0x08, 0xa2, 0x31, 0x00, 0x00, 0x55, 0x29, 0x56, 0xba,
0x2c, 0x09, 0x00, 0x3c, 0x7d, 0x27, 0x48, 0x2e, 0x40, 0x82, 0x00, 0x08, 0x7d, 0xc9, 0x73, 0x78, 0x2c, 0x09, 0x00, 0x3c, 0x7d, 0x27, 0x48, 0x2e, 0x40, 0x82, 0x00, 0x08, 0x7d, 0xc9, 0x73, 0x78,
0x41, 0x96, 0x00, 0x08, 0xa1, 0x29, 0x00, 0x00, 0x4e, 0x80, 0x00, 0x20, 0x2c, 0x05, 0x00, 0x04, 0x41, 0x96, 0x00, 0x08, 0xa1, 0x29, 0x00, 0x00, 0x4e, 0x80, 0x00, 0x20, 0x2c, 0x05, 0x00, 0x04,
0x40, 0x80, 0x00, 0x28, 0x7c, 0x89, 0x23, 0x78, 0x7d, 0xc3, 0x62, 0x14, 0x55, 0xce, 0x00, 0x3c, 0x40, 0x80, 0x00, 0x28, 0x7c, 0x89, 0x23, 0x78, 0x7d, 0xc3, 0x62, 0x14, 0x55, 0xce, 0x00, 0x3c,
0x4b, 0xff, 0xff, 0xad, 0x7c, 0x84, 0x20, 0xf8, 0x54, 0x84, 0x04, 0x3e, 0x7d, 0x2b, 0x20, 0x38, 0x4b, 0xff, 0xff, 0xad, 0x7c, 0x84, 0x20, 0xf8, 0x54, 0x84, 0x04, 0x3e, 0x7d, 0x2b, 0x20, 0x38,
0x7e, 0x24, 0x20, 0x38, 0x4b, 0xff, 0xfb, 0xbc, 0x54, 0x6b, 0xe4, 0x3e, 0x4b, 0xff, 0xfb, 0xb4, 0x7e, 0x24, 0x20, 0x38, 0x4b, 0xff, 0xfb, 0xbc, 0x54, 0x6b, 0xe4, 0x3e, 0x4b, 0xff, 0xfb, 0xb4,
0x7c, 0x9a, 0x23, 0x78, 0x54, 0x84, 0x18, 0x38, 0x40, 0x92, 0x00, 0x20, 0x40, 0x9e, 0x00, 0x0c, 0x7c, 0x9a, 0x23, 0x78, 0x54, 0x84, 0x18, 0x38, 0x40, 0x92, 0x00, 0x20, 0x40, 0x9e, 0x00, 0x0c,
0x7d, 0xe8, 0x03, 0xa6, 0x4e, 0x80, 0x00, 0x21, 0x7d, 0xe4, 0x7a, 0x14, 0x39, 0xef, 0x00, 0x07, 0x7d, 0xe8, 0x03, 0xa6, 0x4e, 0x80, 0x00, 0x21, 0x7d, 0xe4, 0x7a, 0x14, 0x39, 0xef, 0x00, 0x07,
0x55, 0xef, 0x00, 0x38, 0x4b, 0xff, 0xfa, 0x64, 0x2e, 0x05, 0x00, 0x03, 0x41, 0x91, 0x00, 0x5c, 0x55, 0xef, 0x00, 0x38, 0x4b, 0xff, 0xfa, 0x64, 0x2e, 0x05, 0x00, 0x03, 0x41, 0x91, 0x00, 0x5c,
0x3c, 0xa0, 0x48, 0x00, 0x7d, 0x83, 0x62, 0x14, 0x55, 0x8c, 0x00, 0x3a, 0x40, 0x92, 0x00, 0x20, 0x3c, 0xa0, 0x48, 0x00, 0x7d, 0x83, 0x62, 0x14, 0x55, 0x8c, 0x00, 0x3a, 0x40, 0x92, 0x00, 0x20,
0x40, 0xbe, 0xfa, 0x48, 0x57, 0x44, 0x00, 0x3a, 0x7c, 0x8c, 0x20, 0x50, 0x50, 0x85, 0x01, 0xba, 0x40, 0xbe, 0xfa, 0x48, 0x57, 0x44, 0x00, 0x3a, 0x7c, 0x8c, 0x20, 0x50, 0x50, 0x85, 0x01, 0xba,
0x50, 0x65, 0x07, 0xfe, 0x90, 0xac, 0x00, 0x00, 0x4b, 0xff, 0xfa, 0x30, 0x40, 0xbe, 0xff, 0xbc, 0x50, 0x65, 0x07, 0xfe, 0x90, 0xac, 0x00, 0x00, 0x4b, 0xff, 0xfa, 0x30, 0x40, 0xbe, 0xff, 0xbc,
0x7d, 0x2c, 0x78, 0x50, 0x51, 0x25, 0x01, 0xba, 0x90, 0xac, 0x00, 0x00, 0x39, 0x8c, 0x00, 0x04, 0x7d, 0x2c, 0x78, 0x50, 0x51, 0x25, 0x01, 0xba, 0x90, 0xac, 0x00, 0x00, 0x39, 0x8c, 0x00, 0x04,
0x7d, 0x6f, 0x22, 0x14, 0x39, 0x6b, 0xff, 0xfc, 0x7d, 0x2b, 0x60, 0x50, 0x51, 0x25, 0x01, 0xba, 0x7d, 0x6f, 0x22, 0x14, 0x39, 0x6b, 0xff, 0xfc, 0x7d, 0x2b, 0x60, 0x50, 0x51, 0x25, 0x01, 0xba,
0x90, 0xab, 0x00, 0x00, 0x4b, 0xff, 0xff, 0x94, 0x2e, 0x05, 0x00, 0x06, 0x41, 0x92, 0x00, 0x28, 0x90, 0xab, 0x00, 0x00, 0x4b, 0xff, 0xff, 0x94, 0x2e, 0x05, 0x00, 0x06, 0x41, 0x92, 0x00, 0x28,
0x4b, 0xff, 0xfb, 0x20, 0x55, 0x8c, 0x84, 0x3e, 0x57, 0x44, 0x84, 0x3e, 0x57, 0x5a, 0x04, 0x3e, 0x4b, 0xff, 0xfb, 0x20, 0x55, 0x8c, 0x84, 0x3e, 0x57, 0x44, 0x84, 0x3e, 0x57, 0x5a, 0x04, 0x3e,
0x7c, 0x0c, 0x20, 0x00, 0x41, 0x80, 0xfb, 0xa4, 0x7c, 0x0c, 0xd0, 0x00, 0x40, 0x80, 0xfb, 0x9c, 0x7c, 0x0c, 0x20, 0x00, 0x41, 0x80, 0xfb, 0xa4, 0x7c, 0x0c, 0xd0, 0x00, 0x40, 0x80, 0xfb, 0x9c,
0x4b, 0xff, 0xf9, 0xd8, 0x57, 0x45, 0xff, 0xfe, 0x68, 0xa5, 0x00, 0x01, 0x71, 0x03, 0x00, 0x01, 0x4b, 0xff, 0xf9, 0xd8, 0x57, 0x45, 0xff, 0xfe, 0x68, 0xa5, 0x00, 0x01, 0x71, 0x03, 0x00, 0x01,
0x7c, 0x05, 0x18, 0x00, 0x41, 0x82, 0x00, 0x1c, 0x51, 0x1a, 0x0f, 0xbc, 0x6b, 0x5a, 0x00, 0x02, 0x7c, 0x05, 0x18, 0x00, 0x41, 0x82, 0x00, 0x1c, 0x51, 0x1a, 0x0f, 0xbc, 0x6b, 0x5a, 0x00, 0x02,
0x57, 0x45, 0xff, 0xff, 0x41, 0x82, 0x00, 0x08, 0x6b, 0x5a, 0x00, 0x01, 0x93, 0x4f, 0xff, 0xfc, 0x57, 0x45, 0xff, 0xff, 0x41, 0x82, 0x00, 0x08, 0x6b, 0x5a, 0x00, 0x01, 0x93, 0x4f, 0xff, 0xfc,
0x53, 0x48, 0x07, 0xfe, 0x4b, 0xff, 0xf9, 0xa4, 0x2c, 0x0b, 0x00, 0x00, 0x40, 0x82, 0xf9, 0x94, 0x53, 0x48, 0x07, 0xfe, 0x4b, 0xff, 0xf9, 0xa4, 0x2c, 0x0b, 0x00, 0x00, 0x40, 0x82, 0xf9, 0x94,
0x40, 0x92, 0x00, 0x0c, 0x39, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x14, 0x54, 0x69, 0x06, 0xff, 0x40, 0x92, 0x00, 0x0c, 0x39, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x14, 0x54, 0x69, 0x06, 0xff,
0x40, 0x82, 0x00, 0x08, 0x40, 0x9e, 0x00, 0x10, 0x54, 0x65, 0x67, 0xfe, 0x7d, 0x08, 0x4c, 0x30, 0x40, 0x82, 0x00, 0x08, 0x40, 0x9e, 0x00, 0x10, 0x54, 0x65, 0x67, 0xfe, 0x7d, 0x08, 0x4c, 0x30,
0x7d, 0x08, 0x2a, 0x78, 0x54, 0x85, 0x00, 0x1f, 0x41, 0x82, 0x00, 0x08, 0x7c, 0xa6, 0x2b, 0x78, 0x7d, 0x08, 0x2a, 0x78, 0x54, 0x85, 0x00, 0x1f, 0x41, 0x82, 0x00, 0x08, 0x7c, 0xa6, 0x2b, 0x78,
0x54, 0x85, 0x80, 0x1f, 0x41, 0x82, 0x00, 0x08, 0x7c, 0xb0, 0x2b, 0x78, 0x4b, 0xff, 0xf9, 0x5c, 0x54, 0x85, 0x80, 0x1f, 0x41, 0x82, 0x00, 0x08, 0x7c, 0xb0, 0x2b, 0x78, 0x4b, 0xff, 0xf9, 0x5c,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
}; };
const int kenobiwii_size = sizeof(kenobiwii); const int kenobiwii_size = sizeof(kenobiwii);

View File

@ -58,35 +58,35 @@ extern void vipatch(u32 address, u32 len);
extern u32 regionfreeselect; extern u32 regionfreeselect;
static const u32 viwiihooks[4] = { static const u32 viwiihooks[4] = {
0x7CE33B78,0x38870034,0x38A70038,0x38C7004C 0x7CE33B78,0x38870034,0x38A70038,0x38C7004C
}; };
static const u32 multidolpatch1[2] = { static const u32 multidolpatch1[2] = {
0x3C03FFB4,0x28004F43 0x3C03FFB4,0x28004F43
}; };
static const u32 healthcheckhook[2] = { static const u32 healthcheckhook[2] = {
0x41810010,0x881D007D 0x41810010,0x881D007D
}; };
static const u32 updatecheckhook[3] = { static const u32 updatecheckhook[3] = {
0x80650050,0x80850054,0xA0A50058 0x80650050,0x80850054,0xA0A50058
}; };
static const u32 multidolpatch2[2] = { static const u32 multidolpatch2[2] = {
0x3F608000, 0x807B0018 0x3F608000, 0x807B0018
}; };
static const u32 recoveryhooks[3] = { static const u32 recoveryhooks[3] = {
0xA00100AC,0x5400073E,0x2C00000F 0xA00100AC,0x5400073E,0x2C00000F
}; };
static const u32 nocopyflag1[3] = { static const u32 nocopyflag1[3] = {
0x540007FF, 0x4182001C, 0x80630068 0x540007FF, 0x4182001C, 0x80630068
}; };
static const u32 nocopyflag2[3] = { static const u32 nocopyflag2[3] = {
0x540007FF, 0x41820024, 0x387E12E2 0x540007FF, 0x41820024, 0x387E12E2
}; };
// this one is for the GH3 and VC saves // this one is for the GH3 and VC saves
@ -95,254 +95,265 @@ static const u32 nocopyflag2[3] = {
//}; //};
static const u32 nocopyflag3[5] = { static const u32 nocopyflag3[5] = {
0x2C030000, 0x41820200,0x48000058,0x38610100 0x2C030000, 0x41820200,0x48000058,0x38610100
}; };
// this removes the display warning for no copy VC and GH3 saves // this removes the display warning for no copy VC and GH3 saves
static const u32 nocopyflag4[4] = { static const u32 nocopyflag4[4] = {
0x80010008, 0x2C000000, 0x4182000C, 0x3BE00001 0x80010008, 0x2C000000, 0x4182000C, 0x3BE00001
}; };
static const u32 nocopyflag5[3] = { static const u32 nocopyflag5[3] = {
0x801D0024,0x540007FF,0x41820024 0x801D0024,0x540007FF,0x41820024
}; };
static const u32 movedvdpatch[3] = { static const u32 movedvdpatch[3] = {
0x2C040000, 0x41820120, 0x3C608109 0x2C040000, 0x41820120, 0x3C608109
}; };
static const u32 regionfreehooks[5] = { static const u32 regionfreehooks[5] = {
0x7C600774, 0x2C000001, 0x41820030,0x40800010,0x2C000000 0x7C600774, 0x2C000001, 0x41820030,0x40800010,0x2C000000
}; };
static const u32 fwritepatch[8] = { static const u32 fwritepatch[8] = {
0x9421FFD0,0x7C0802A6,0x90010034,0xBF210014,0x7C9B2378,0x7CDC3378,0x7C7A1B78,0x7CB92B78 // bushing fwrite 0x9421FFD0,0x7C0802A6,0x90010034,0xBF210014,0x7C9B2378,0x7CDC3378,0x7C7A1B78,0x7CB92B78 // bushing fwrite
}; };
static const u32 kpadhooks[4] = { static const u32 kpadhooks[4] = {
0x9A3F005E,0x38AE0080,0x389FFFFC,0x7E0903A6 0x9A3F005E,0x38AE0080,0x389FFFFC,0x7E0903A6
}; };
static const u32 kpadoldhooks[6] = { static const u32 kpadoldhooks[6] = {
0x801D0060, 0x901E0060, 0x801D0064, 0x901E0064, 0x801D0068, 0x901E0068 0x801D0060, 0x901E0060, 0x801D0064, 0x901E0064, 0x801D0068, 0x901E0068
}; };
static const u32 joypadhooks[4] = { static const u32 joypadhooks[4] = {
0x3AB50001, 0x3A73000C, 0x2C150004, 0x3B18000C 0x3AB50001, 0x3A73000C, 0x2C150004, 0x3B18000C
}; };
static const u32 langpatch[3] = { static const u32 langpatch[3] = {
0x7C600775, 0x40820010, 0x38000000 0x7C600775, 0x40820010, 0x38000000
}; };
static const u32 vipatchcode[3] = { static const u32 vipatchcode[3] = {
0x4182000C,0x4180001C,0x48000018 0x4182000C,0x4180001C,0x48000018
}; };
static const u32 wpadlibogc[5] = { static const u32 wpadlibogc[5] = {
// 0x38A00140, 0x7C095878, 0x7D600078, 0x901F0010,0x913F0014 // 0x38A00140, 0x7C095878, 0x7D600078, 0x901F0010,0x913F0014
// 0x7FA00124, 0x8001001C, 0x83810008, 0x83A1000C,0x7C0803A6 // 0x7FA00124, 0x8001001C, 0x83810008, 0x83A1000C,0x7C0803A6
0x90A402E0,0x806502E4,0x908502E4,0x2C030000,0x906402E4 0x90A402E0,0x806502E4,0x908502E4,0x2C030000,0x906402E4
}; };
void dogamehooks(void *addr, u32 len) { void dogamehooks(void *addr, u32 len)
void *addr_start = addr; {
void *addr_end = addr+len; void *addr_start = addr;
void *addr_end = addr+len;
while (addr_start < addr_end) { while(addr_start < addr_end)
{
switch(hooktype)
{
case 0:
break;
case 1:
if(memcmp(addr_start, viwiihooks, sizeof(viwiihooks))==0){
// printf("\n\n\n");
// printf("found at address %x\n", addr_start);
// sleep(2);
patchhook((u32)addr_start, len);
patched = 1;
hooktype = 1;
}
break;
switch (hooktype) { /*
case 2:
if(memcmp(addr_start, kpadhooks, sizeof(kpadhooks))==0){
patchhook((u32)addr_start, len);
patched = 1;
}
case 0: if(memcmp(addr_start, kpadoldhooks, sizeof(kpadoldhooks))==0){
patchhook((u32)addr_start, len);
patched = 1;
}
break;
case 3:
if(memcmp(addr_start, joypadhooks, sizeof(joypadhooks))==0){
patchhook((u32)addr_start, len);
patched = 1;
}
break;
break; case 4:
if(memcmp(addr_start, recoveryhooks, sizeof(recoveryhooks))==0){
patchhook3((u32)addr_start, len);
}
break;
*/
case 2:
case 1: if(memcmp(addr_start, viwiihooks, sizeof(viwiihooks))==0){
if (memcmp(addr_start, viwiihooks, sizeof(viwiihooks))==0) { patchhook2((u32)addr_start, len);
// printf("\n\n\n"); }
// printf("found at address %x\n", addr_start);
// sleep(2); break;
patchhook((u32)addr_start, len);
patched = 1;
hooktype = 1;
}
break;
/* /*
case 2: case 6:
if(memcmp(addr_start, kpadhooks, sizeof(kpadhooks))==0){ // jap region free
patchhook((u32)addr_start, len); if(memcmp(addr_start, regionfreehooks, sizeof(regionfreehooks))==0){
patched = 1; regionfreejap((u32)addr_start, len);
} }
if(memcmp(addr_start, kpadoldhooks, sizeof(kpadoldhooks))==0){ // usa region free
patchhook((u32)addr_start, len); if(memcmp(addr_start, regionfreehooks, sizeof(regionfreehooks))==0){
patched = 1; regionfreeusa((u32)addr_start, len);
} }
break;
case 3: // pal region free
if(memcmp(addr_start, joypadhooks, sizeof(joypadhooks))==0){ if(memcmp(addr_start, regionfreehooks, sizeof(regionfreehooks))==0){
patchhook((u32)addr_start, len); regionfreepal((u32)addr_start, len);
patched = 1; }
}
break;
case 4: // skip disc update
if(memcmp(addr_start, recoveryhooks, sizeof(recoveryhooks))==0){ if(memcmp(addr_start, updatecheckhook, sizeof(updatecheckhook))==0){
patchhook3((u32)addr_start, len); patchupdatecheck((u32)addr_start, len);
} }
break; break;
*/
case 2:
if (memcmp(addr_start, viwiihooks, sizeof(viwiihooks))==0) {
patchhook2((u32)addr_start, len);
}
break;
/*
case 6:
// jap region free
if(memcmp(addr_start, regionfreehooks, sizeof(regionfreehooks))==0){
regionfreejap((u32)addr_start, len);
}
// usa region free
if(memcmp(addr_start, regionfreehooks, sizeof(regionfreehooks))==0){
regionfreeusa((u32)addr_start, len);
}
// pal region free
if(memcmp(addr_start, regionfreehooks, sizeof(regionfreehooks))==0){
regionfreepal((u32)addr_start, len);
}
// skip disc update
if(memcmp(addr_start, updatecheckhook, sizeof(updatecheckhook))==0){
patchupdatecheck((u32)addr_start, len);
}
break;
case 7: case 7:
if(memcmp(addr_start, healthcheckhook, sizeof(healthcheckhook))==0){ if(memcmp(addr_start, healthcheckhook, sizeof(healthcheckhook))==0){
removehealthcheck((u32)addr_start, len); removehealthcheck((u32)addr_start, len);
} }
break; break;
// no copy flags // no copy flags
case 8: case 8:
// Remove the actual flag so can copy back // Remove the actual flag so can copy back
if(memcmp(addr_start, nocopyflag5, sizeof(nocopyflag5))==0){ if(memcmp(addr_start, nocopyflag5, sizeof(nocopyflag5))==0){
copyflagcheck5((u32)addr_start, len); copyflagcheck5((u32)addr_start, len);
} }
if(memcmp(addr_start, nocopyflag1, sizeof(nocopyflag1))==0){
copyflagcheck1((u32)addr_start, len);
}
if(memcmp(addr_start, nocopyflag2, sizeof(nocopyflag2))==0){
copyflagcheck2((u32)addr_start, len);
}
// no VC and GH3 save
if(memcmp(addr_start, nocopyflag3, sizeof(nocopyflag2))==0){
copyflagcheck3((u32)addr_start, len);
}
// no VC and GH3 save display remove
if(memcmp(addr_start, nocopyflag4, sizeof(nocopyflag4))==0){
copyflagcheck4((u32)addr_start, len);
}
break;
if(memcmp(addr_start, nocopyflag1, sizeof(nocopyflag1))==0){ case 9:
copyflagcheck1((u32)addr_start, len); if(memcmp(addr_start, movedvdpatch, sizeof(movedvdpatch))==0){
} movedvdhooks((u32)addr_start, len);
}
break;
*/
// multidol
case 3:
if(memcmp(addr_start, nocopyflag2, sizeof(nocopyflag2))==0){ if(memcmp(addr_start, multidolpatch1, sizeof(multidolpatch1))==0){
copyflagcheck2((u32)addr_start, len); multidolpatchone((u32)addr_start, len);
} }
if(memcmp(addr_start, multidolpatch2, sizeof(multidolpatch2))==0){
// no VC and GH3 save multidolpatchtwo((u32)addr_start, len);
if(memcmp(addr_start, nocopyflag3, sizeof(nocopyflag2))==0){ }
copyflagcheck3((u32)addr_start, len); break;
} }
// no VC and GH3 save display remove addr_start += 4;
if(memcmp(addr_start, nocopyflag4, sizeof(nocopyflag4))==0){
copyflagcheck4((u32)addr_start, len);
}
break;
case 9:
if(memcmp(addr_start, movedvdpatch, sizeof(movedvdpatch))==0){
movedvdhooks((u32)addr_start, len);
}
break;
*/
// multidol
case 3:
if (memcmp(addr_start, multidolpatch1, sizeof(multidolpatch1))==0) {
multidolpatchone((u32)addr_start, len);
}
if (memcmp(addr_start, multidolpatch2, sizeof(multidolpatch2))==0) {
multidolpatchtwo((u32)addr_start, len);
}
break;
} }
addr_start += 4;
}
} }
// Not used yet, for patching DOL once loaded into memory and befor execution // Not used yet, for patching DOL once loaded into memory and befor execution
void patchdol(void *addr, u32 len) { void patchdol(void *addr, u32 len)
{
void *addr_start = addr;
void *addr_end = addr+len;
void *addr_start = addr; while(addr_start < addr_end)
void *addr_end = addr+len; {
if(memcmp(addr_start, wpadlibogc, sizeof(wpadlibogc))==0) {
while (addr_start < addr_end) { // printf("\n\n\n");
if (memcmp(addr_start, wpadlibogc, sizeof(wpadlibogc))==0) { // printf("found at address %x\n", addr_start);
// printf("\n\n\n"); // sleep(10);
// printf("found at address %x\n", addr_start); // patchhookdol((u32)addr_start, len);
// sleep(10); patched = 1;
// patchhookdol((u32)addr_start, len); break;
patched = 1; }
break; addr_start += 4;
} }
addr_start += 4;
}
} }
void langpatcher(void *addr, u32 len) { void langpatcher(void *addr, u32 len)
{
void *addr_start = addr;
void *addr_end = addr+len;
void *addr_start = addr; while(addr_start < addr_end)
void *addr_end = addr+len; {
while (addr_start < addr_end) { if(memcmp(addr_start, langpatch, sizeof(langpatch))==0) {
if(configbytes[0] != 0xCD){
if (memcmp(addr_start, langpatch, sizeof(langpatch))==0) { langvipatch((u32)addr_start, len, configbytes[0]);
if (configbytes[0] != 0xCD) { }
langvipatch((u32)addr_start, len, configbytes[0]); }
} addr_start += 4;
} }
addr_start += 4;
}
} }
void patchdebug(void *addr, u32 len) { void patchdebug(void *addr, u32 len)
{
void *addr_start = addr;
void *addr_end = addr+len;
void *addr_start = addr; while(addr_start < addr_end)
void *addr_end = addr+len; {
if(memcmp(addr_start, fwritepatch, sizeof(fwritepatch))==0) {
while (addr_start < addr_end) { memcpy(addr_start,fwrite_patch_bin,fwrite_patch_bin_len);
// apply patch
if (memcmp(addr_start, fwritepatch, sizeof(fwritepatch))==0) { }
addr_start += 4;
memcpy(addr_start,fwrite_patch_bin,fwrite_patch_bin_len); }
// apply patch
}
addr_start += 4;
}
} }
void vidolpatcher(void *addr, u32 len) { void vidolpatcher(void *addr, u32 len)
{
void *addr_start = addr;
void *addr_end = addr+len;
void *addr_start = addr; while(addr_start < addr_end)
void *addr_end = addr+len; {
if(memcmp(addr_start, vipatchcode, sizeof(vipatchcode))==0) {
while (addr_start < addr_end) { vipatch((u32)addr_start, len);
if (memcmp(addr_start, vipatchcode, sizeof(vipatchcode))==0) { }
vipatch((u32)addr_start, len); addr_start += 4;
} }
addr_start += 4;
}
} }

View File

@ -22,19 +22,20 @@
#ifndef __PATCHCODE_H__ #ifndef __PATCHCODE_H__
#define __PATCHCODE_H__ #define __PATCHCODE_H__
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C"
{
#endif #endif
// Globals // Globals
u32 hooktype; u32 hooktype;
int patched; int patched;
u8 configbytes[2]; u8 configbytes[2];
u32 regionfree; u32 regionfree;
// Function prototypes // Function prototypes
void dogamehooks(void *addr, u32 len); void dogamehooks(void *addr, u32 len);
void langpatcher(void *addr, u32 len); void langpatcher(void *addr, u32 len);
void vidolpatcher(void *addr, u32 len); void vidolpatcher(void *addr, u32 len);
void patchdebug(void *addr, u32 len); void patchdebug(void *addr, u32 len);

View File

@ -1,508 +1,508 @@
# (c) Nuke www.usbgecko.com. Licensed under GPL V2 # (c) Nuke www.usbgecko.com. Licensed under GPL V2
.text .text
#include "ppc.h" #include "ppc.h"
.globl patchhook # r3 address .globl patchhook # r3 address
patchhook: patchhook:
mtctr r4 mtctr r4
lis r6, 0x4E80 lis r6, 0x4E80
ori r6, r6, 0x0020 # blr ori r6, r6, 0x0020 # blr
findblr: findblr:
lwz r5, 0(r3) lwz r5, 0(r3)
cmpw r6, r5 cmpw r6, r5
beq writebranch beq writebranch
addi r3, r3, 4 # next word addi r3, r3, 4 # next word
bdnz findblr # loop length bdnz findblr # loop length
b exit # stop unhooked game hanging b exit # stop unhooked game hanging
writebranch: writebranch:
lis r4, 0x8000 # 800018A0 hook location (source) lis r4, 0x8000 # 800018A0 hook location (source)
ori r4, r4, 0x18A8 ori r4, r4, 0x18A8
subf r4, r3, r4 # subtract r3 from r4 and place in r4 subf r4, r3, r4 # subtract r3 from r4 and place in r4
lis r5, 0x3FF lis r5, 0x3FF
ori r5, r5, 0xFFFF # 0x3FFFFFF ori r5, r5, 0xFFFF # 0x3FFFFFF
and r4, r4, r5 and r4, r4, r5
lis r5, 0x4800 # 0x48000000 lis r5, 0x4800 # 0x48000000
or r4, r4, r5 or r4, r4, r5
stw r4, 0(r3) # result in r3 stw r4, 0(r3) # result in r3
dcbf r0, r3 # data cache block flush dcbf r0, r3 # data cache block flush
icbi r0, r3 icbi r0, r3
exit: exit:
blr # return blr # return
.globl patchhook2 # r3 address .globl patchhook2 # r3 address
patchhook2: patchhook2:
mtctr r4 mtctr r4
lis r6, 0x4E80 lis r6, 0x4E80
ori r6, r6, 0x0020 # blr ori r6, r6, 0x0020 # blr
findblr2: findblr2:
lwz r5, 0(r3) lwz r5, 0(r3)
cmpw r6, r5 cmpw r6, r5
beq writebranch2 beq writebranch2
addi r3, r3, 4 # next word addi r3, r3, 4 # next word
bdnz findblr2 # loop length bdnz findblr2 # loop length
b exit2 # stop unhooked game hanging b exit2 # stop unhooked game hanging
writebranch2: writebranch2:
lis r4, 0x8000 # 81700000 our temp patcher lis r4, 0x8000 # 81700000 our temp patcher
ori r4, r4, 0x18a8 ori r4, r4, 0x18a8
subf r4, r3, r4 # subtract r3 from r4 and place in r4 subf r4, r3, r4 # subtract r3 from r4 and place in r4
lis r5, 0x3FF lis r5, 0x3FF
ori r5, r5, 0xFFFF # 0x3FFFFFF ori r5, r5, 0xFFFF # 0x3FFFFFF
and r4, r4, r5 and r4, r4, r5
lis r5, 0x4800 # 0x48000000 lis r5, 0x4800 # 0x48000000
or r4, r4, r5 or r4, r4, r5
stw r4, 0(r3) # result in r3 stw r4, 0(r3) # result in r3
dcbf r0, r3 # data cache block flush dcbf r0, r3 # data cache block flush
icbi r0, r3 icbi r0, r3
exit2: exit2:
blr # return blr # return
.globl patchhook3 # r3 address .globl patchhook3 # r3 address
patchhook3: patchhook3:
mtctr r4 mtctr r4
lis r6, 0x4BFF lis r6, 0x4BFF
ori r6, r6, 0xE955 # blr ori r6, r6, 0xE955 # blr
findbne: findbne:
lwz r5, 0(r3) lwz r5, 0(r3)
cmpw r6, r5 cmpw r6, r5
beq writebl beq writebl
addi r3, r3, 4 # next word addi r3, r3, 4 # next word
bdnz findbne # loop length bdnz findbne # loop length
b exit3 # stop unhooked game hanging b exit3 # stop unhooked game hanging
writebl: writebl:
lis r4, 0x4BFF # 81700000 our temp patcher lis r4, 0x4BFF # 81700000 our temp patcher
ori r4, r4, 0xEA91 ori r4, r4, 0xEA91
stw r4, 0(r3) # result in r3 stw r4, 0(r3) # result in r3
dcbf r0, r3 # data cache block flush dcbf r0, r3 # data cache block flush
icbi r0, r3 icbi r0, r3
exit3: exit3:
blr # return blr # return
.globl patchhook4 # r3 address .globl patchhook4 # r3 address
patchhook4: patchhook4:
mtctr r4 mtctr r4
lis r6, 0x4082 lis r6, 0x4082
ori r6, r6, 0x001C # blr ori r6, r6, 0x001C # blr
findregion: findregion:
lwz r5, 0(r3) lwz r5, 0(r3)
cmpw r6, r5 cmpw r6, r5
beq writebr beq writebr
addi r3, r3, 4 # next word addi r3, r3, 4 # next word
bdnz findregion # loop length bdnz findregion # loop length
b exit4 # stop unhooked game hanging b exit4 # stop unhooked game hanging
writebr: writebr:
lis r4, 0x4800 lis r4, 0x4800
ori r4, r4, 0x001C ori r4, r4, 0x001C
stw r4, 0(r3) # result in r3 stw r4, 0(r3) # result in r3
dcbf r0, r3 # data cache block flush dcbf r0, r3 # data cache block flush
icbi r0, r3 icbi r0, r3
exit4: exit4:
blr # return blr # return
.globl multidolpatchone # r3 address .globl multidolpatchone # r3 address
multidolpatchone: multidolpatchone:
mtctr r4 mtctr r4
lis r6, 0x3800 lis r6, 0x3800
ori r6, r6, 0x0001 # (li r0,1) ori r6, r6, 0x0001 # (li r0,1)
findmulti: findmulti:
lwz r5, 0(r3) lwz r5, 0(r3)
cmpw r6, r5 cmpw r6, r5
beq writemulti beq writemulti
subi r3, r3, 4 # go back subi r3, r3, 4 # go back
bdnz findmulti # loop length bdnz findmulti # loop length
b exit5 # stop unhooked game hanging b exit5 # stop unhooked game hanging
writemulti: writemulti:
lis r4, 0x8170 # 81700000 lis r4, 0x8170 # 81700000
ori r4, r4, 0x0020 ori r4, r4, 0x0020
subf r18, r3, r4 # subf r18,(source),(dest) subf r18, r3, r4 # subf r18,(source),(dest)
lis r6, 0x4800 lis r6, 0x4800
ori r6,r6,1 ori r6,r6,1
rlwimi r6,r18,0,6,29 rlwimi r6,r18,0,6,29
stw r6,0(r3) stw r6,0(r3)
stw r6,0(r19) stw r6,0(r19)
stw r3,4(r19) stw r3,4(r19)
dcbf r0, r3 dcbf r0, r3
sync sync
icbi r0, r3 icbi r0, r3
isync isync
exit5: exit5:
blr # return blr # return
.globl multidolpatchtwo # r3 address .globl multidolpatchtwo # r3 address
multidolpatchtwo: multidolpatchtwo:
mtctr r4 mtctr r4
lis r6, 0x3F60 lis r6, 0x3F60
ori r6, r6, 0x8000 # (lis r27,-32768) ori r6, r6, 0x8000 # (lis r27,-32768)
findmulti2: findmulti2:
lwz r5, 0(r3) lwz r5, 0(r3)
cmpw r6, r5 cmpw r6, r5
beq writemulti2 beq writemulti2
addi r3, r3, 4 # go forward addi r3, r3, 4 # go forward
bdnz findmulti2 # loop length bdnz findmulti2 # loop length
b exit6 # stop unhooked game hanging b exit6 # stop unhooked game hanging
writemulti2: writemulti2:
lis r4, 0x8170 # 81700020 lis r4, 0x8170 # 81700020
ori r4, r4, 0x0000 ori r4, r4, 0x0000
subf r18, r3, r4 # subf r18,(source),(dest) subf r18, r3, r4 # subf r18,(source),(dest)
lis r6, 0x4800 lis r6, 0x4800
ori r6,r6,1 ori r6,r6,1
rlwimi r6,r18,0,6,29 rlwimi r6,r18,0,6,29
stw r6,0(r3) stw r6,0(r3)
stw r6,0(r19) stw r6,0(r19)
stw r3,4(r19) stw r3,4(r19)
dcbf r0, r3 dcbf r0, r3
sync sync
icbi r0, r3 icbi r0, r3
isync isync
exit6: exit6:
blr # return blr # return
.globl langvipatch # r3 address, r4 len, r5 lang byte .globl langvipatch # r3 address, r4 len, r5 lang byte
langvipatch: langvipatch:
mtctr r4 mtctr r4
lis r6, 0x8861 lis r6, 0x8861
ori r6, r6, 0x0008 # lbz r3, 8(sp) ori r6, r6, 0x0008 # lbz r3, 8(sp)
findlang: findlang:
lwz r7, 0(r3) lwz r7, 0(r3)
cmpw r6, r7 cmpw r6, r7
beq patchlang beq patchlang
addi r3, r3, 4 # next word addi r3, r3, 4 # next word
bdnz findlang # loop length bdnz findlang # loop length
b exitlang # stop unhooked game hanging b exitlang # stop unhooked game hanging
patchlang: patchlang:
lis r4, 0x3860 # 0x38600001 li %r3, 1 # eng
add r4, r4, r5
gofinal:
stw r4, 0(r3) # result in r3
dcbf r0, r3 # data cache block flush
icbi r0, r3
exitlang:
blr # return
lis r4, 0x3860 # 0x38600001 li %r3, 1 # eng .globl vipatch # r3 address
add r4, r4, r5 vipatch:
gofinal: mtctr r4
stw r4, 0(r3) # result in r3 lis r6, 0x5400
dcbf r0, r3 # data cache block flush ori r6, r6, 0xFFFE
icbi r0, r3 findvi:
exitlang: lwz r5, 0(r3)
blr # return cmpw r6, r5
beq patchvi
addi r3, r3, 4 # next word
bdnz findvi # loop length
b exitvi # stop unhooked game hanging
.globl vipatch # r3 address patchvi:
vipatch: lis r4, 0x8000
mtctr r4 ori r4, r4, 0x0003
lis r6, 0x5400 lbz r5, 0(r4)
ori r6, r6, 0xFFFE cmpwi r5, 0x45 # USA
findvi: beq patchusa
lwz r5, 0(r3) cmpwi r5, 0x4A
cmpw r6, r5 beq patchjap2 # JAP
beq patchvi b exitvi
addi r3, r3, 4 # next word patchjap2:
bdnz findvi # loop length lis r4, 0x3800
b exitvi # stop unhooked game hanging ori r4, r4, 0x0001
b gofinal2
patchusa:
lis r4, 0x3800
ori r4, r4, 0x0000
gofinal2:
stw r4, 0(r3) # result in r3
dcbf r0, r3 # data cache block flush
icbi r0, r3
exitvi:
blr # return
patchvi: .globl regionfreejap # r3 address
lis r4, 0x8000 regionfreejap:
ori r4, r4, 0x0003 mtctr r4
lbz r5, 0(r4) lis r6, 0x2C1B
cmpwi r5, 0x45 # USA ori r6, r6, 0x0000 # blr
beq patchusa findjap:
cmpwi r5, 0x4A lwz r5, 0(r3)
beq patchjap2 # JAP cmpw r6, r5
b exitvi beq writenop
patchjap2: addi r3, r3, 4 # next word
lis r4, 0x3800 bdnz findjap # loop length
ori r4, r4, 0x0001 b exitjap # stop unhooked game hanging
b gofinal2
patchusa:
lis r4, 0x3800
ori r4, r4, 0x0000
gofinal2:
stw r4, 0(r3) # result in r3
dcbf r0, r3 # data cache block flush
icbi r0, r3
exitvi:
blr # return
.globl regionfreejap # r3 address writenop:
regionfreejap: addi r3, r3, 4 # next word
mtctr r4 lis r4, 0x6000 # nop
lis r6, 0x2C1B ori r4, r4, 0x0000
ori r6, r6, 0x0000 # blr stw r4, 0(r3) # result in r3
findjap: dcbf r0, r3 # data cache block flush
lwz r5, 0(r3) icbi r0, r3
cmpw r6, r5 exitjap:
beq writenop blr # return
addi r3, r3, 4 # next word
bdnz findjap # loop length
b exitjap # stop unhooked game hanging
writenop: .globl regionfreeusa # r3 address
addi r3, r3, 4 # next word regionfreeusa:
lis r4, 0x6000 # nop mtctr r4
ori r4, r4, 0x0000 lis r6, 0x281B
stw r4, 0(r3) # result in r3 ori r6, r6, 0x0001 # blr
dcbf r0, r3 # data cache block flush findusa:
icbi r0, r3 lwz r5, 0(r3)
exitjap: cmpw r6, r5
blr # return beq writenop1
addi r3, r3, 4 # next word
bdnz findusa # loop length
b exitusa # stop unhooked game hanging
.globl regionfreeusa # r3 address writenop1:
regionfreeusa: addi r3, r3, 4 # next word
mtctr r4 lis r4, 0x6000 # nop
lis r6, 0x281B ori r4, r4, 0x0000
ori r6, r6, 0x0001 # blr stw r4, 0(r3) # result in r3
findusa: dcbf r0, r3 # data cache block flush
lwz r5, 0(r3) icbi r0, r3
cmpw r6, r5 exitusa:
beq writenop1 blr # return
addi r3, r3, 4 # next word
bdnz findusa # loop length
b exitusa # stop unhooked game hanging
writenop1: .globl regionfreepal # r3 address
addi r3, r3, 4 # next word regionfreepal:
lis r4, 0x6000 # nop mtctr r4
ori r4, r4, 0x0000 lis r6, 0x281B
stw r4, 0(r3) # result in r3 ori r6, r6, 0x0002 # blr
dcbf r0, r3 # data cache block flush findpal:
icbi r0, r3 lwz r5, 0(r3)
exitusa: cmpw r6, r5
blr # return beq writenop2
addi r3, r3, 4 # next word
bdnz findpal # loop length
b exitpal # stop unhooked game hanging
.globl regionfreepal # r3 address writenop2:
regionfreepal: addi r3, r3, 4 # next word
mtctr r4 lis r4, 0x6000 # nop
lis r6, 0x281B ori r4, r4, 0x0000
ori r6, r6, 0x0002 # blr stw r4, 0(r3) # result in r3
findpal: dcbf r0, r3 # data cache block flush
lwz r5, 0(r3) icbi r0, r3
cmpw r6, r5
beq writenop2
addi r3, r3, 4 # next word
bdnz findpal # loop length
b exitpal # stop unhooked game hanging
writenop2: lis r6, 0x4082
addi r3, r3, 4 # next word ori r6, r6, 0x001C # bne loc_81377A2C
lis r4, 0x6000 # nop findextra: #this is just the bne to b patch
ori r4, r4, 0x0000 lwz r5, 0(r3)
stw r4, 0(r3) # result in r3 cmpw r6, r5
dcbf r0, r3 # data cache block flush beq writeb
icbi r0, r3 addi r3, r3, 4 # next word
bdnz findextra # loop length
b exitpal # stop unhooked game hanging
lis r6, 0x4082 writeb:
ori r6, r6, 0x001C # bne loc_81377A2C addi r3, r3, 4 # next word
findextra: #this is just the bne to b patch lis r4, 0x4800
lwz r5, 0(r3) ori r4, r4, 0x001c # b loc_81377A2C
cmpw r6, r5 stw r4, 0(r3) # result in r3
beq writeb dcbf r0, r3 # data cache block flush
addi r3, r3, 4 # next word icbi r0, r3
bdnz findextra # loop length exitpal:
b exitpal # stop unhooked game hanging blr # return
writeb: .globl removehealthcheck # r3 address
addi r3, r3, 4 # next word removehealthcheck:
lis r4, 0x4800 mtctr r4
ori r4, r4, 0x001c # b loc_81377A2C lis r6, 0x4182
stw r4, 0(r3) # result in r3 ori r6, r6, 0x004C # blr
dcbf r0, r3 # data cache block flush findhe:
icbi r0, r3 lwz r5, 0(r3)
exitpal: cmpw r6, r5
blr # return beq writebhe
addi r3, r3, 4 # next word
bdnz findhe # loop length
b exithe # stop unhooked game hanging
.globl removehealthcheck # r3 address writebhe:
removehealthcheck: lis r4, 0x6000
mtctr r4 ori r4, r4, 0x0000
lis r6, 0x4182 stw r4, 0(r3) # result in r3
ori r6, r6, 0x004C # blr dcbf r0, r3 # data cache block flush
findhe: icbi r0, r3
lwz r5, 0(r3) exithe:
cmpw r6, r5 blr # return
beq writebhe
addi r3, r3, 4 # next word
bdnz findhe # loop length
b exithe # stop unhooked game hanging
writebhe:
lis r4, 0x6000
ori r4, r4, 0x0000
stw r4, 0(r3) # result in r3
dcbf r0, r3 # data cache block flush
icbi r0, r3
exithe:
blr # return
.globl patchupdatecheck # r3 address
patchupdatecheck:
mtctr r4
lis r6, 0x4082
ori r6, r6, 0x0020 # blr
finduc:
lwz r5, 0(r3)
cmpw r6, r5
beq writenopuc
addi r3, r3, 4 # next word
bdnz finduc # loop length
b exituc # stop unhooked game hanging
writenopuc:
.globl patchupdatecheck # r3 address lis r4, 0x6000
patchupdatecheck: ori r4, r4, 0x0000
mtctr r4 stw r4, 0(r3) # result in r3
lis r6, 0x4082 dcbf r0, r3 # data cache block flush
ori r6, r6, 0x0020 # blr icbi r0, r3
finduc: exituc:
lwz r5, 0(r3) blr # return
cmpw r6, r5
beq writenopuc
addi r3, r3, 4 # next word
bdnz finduc # loop length
b exituc # stop unhooked game hanging
writenopuc:
lis r4, 0x6000
ori r4, r4, 0x0000
stw r4, 0(r3) # result in r3
dcbf r0, r3 # data cache block flush
icbi r0, r3
exituc:
blr # return
.globl copyflagcheck1 # r3 address .globl copyflagcheck1 # r3 address
copyflagcheck1: copyflagcheck1:
mtctr r4 mtctr r4
lis r6, 0x5400 lis r6, 0x5400
ori r6, r6, 0x07FF ori r6, r6, 0x07FF
findncf1: findncf1:
lwz r5, 0(r3) lwz r5, 0(r3)
cmpw r6, r5 cmpw r6, r5
beq writencf1 beq writencf1
subi r3, r3, 4 # next word subi r3, r3, 4 # next word
bdnz findncf1 # loop length bdnz findncf1 # loop length
b exitncf1 # stop unhooked game hanging b exitncf1 # stop unhooked game hanging
writencf1: writencf1:
lis r4, 0x7C00 lis r4, 0x7C00
ori r4, r4, 0x0000 ori r4, r4, 0x0000
stw r4, 0(r3) # result in r3 stw r4, 0(r3) # result in r3
dcbf r0, r3 # data cache block flush dcbf r0, r3 # data cache block flush
icbi r0, r3 icbi r0, r3
exitncf1: exitncf1:
blr # return blr # return
.globl copyflagcheck2 # r3 address .globl copyflagcheck2 # r3 address
copyflagcheck2: copyflagcheck2:
mtctr r4 mtctr r4
lis r6, 0x5400 lis r6, 0x5400
ori r6, r6, 0x07FF ori r6, r6, 0x07FF
findncf2: findncf2:
lwz r5, 0(r3) lwz r5, 0(r3)
cmpw r6, r5 cmpw r6, r5
beq writencf2 beq writencf2
subi r3, r3, 4 # next word subi r3, r3, 4 # next word
bdnz findncf2 # loop length bdnz findncf2 # loop length
b exitncf2 # stop unhooked game hanging b exitncf2 # stop unhooked game hanging
writencf2: writencf2:
lis r4, 0x7C00 lis r4, 0x7C00
ori r4, r4, 0x0000 ori r4, r4, 0x0000
stw r4, 0(r3) # result in r3 stw r4, 0(r3) # result in r3
dcbf r0, r3 # data cache block flush dcbf r0, r3 # data cache block flush
icbi r0, r3 icbi r0, r3
exitncf2: exitncf2:
blr # return blr # return
.globl copyflagcheck3 # r3 address .globl copyflagcheck3 # r3 address
copyflagcheck3: copyflagcheck3:
findncf3: findncf3:
addi r3, r3, 20 # go back one dword (4 bytes) addi r3, r3, 20 # go back one dword (4 bytes)
lwz r5, 0(r3) lwz r5, 0(r3)
writencf3: writencf3:
lis r4, 0x3860 lis r4, 0x3860
ori r4, r4, 0x0001 # li r3,1 ori r4, r4, 0x0001 # li r3,1
stw r4, 0(r3) # result in r3 stw r4, 0(r3) # result in r3
dcbf r0, r3 # data cache block flush dcbf r0, r3 # data cache block flush
icbi r0, r3 icbi r0, r3
exitncf3: exitncf3:
blr # return blr # return
.globl copyflagcheck4 # r3 address .globl copyflagcheck4 # r3 address
copyflagcheck4: copyflagcheck4:
mtctr r4 mtctr r4
lis r6, 0x3BE0 lis r6, 0x3BE0
ori r6, r6, 0x0001 # li r31,1 ori r6, r6, 0x0001 # li r31,1
findncf4: findncf4:
lwz r5, 0(r3) lwz r5, 0(r3)
cmpw r6, r5 cmpw r6, r5
beq writencf4 beq writencf4
addi r3, r3, 4 # next word addi r3, r3, 4 # next word
bdnz findncf4 # loop length bdnz findncf4 # loop length
b exitncf4 # stop unhooked game hanging b exitncf4 # stop unhooked game hanging
writencf4: writencf4:
lis r4, 0x3BE0 lis r4, 0x3BE0
ori r4, r4, 0x0000 # change this to 3BE00000 (li r31,0) ori r4, r4, 0x0000 # change this to 3BE00000 (li r31,0)
stw r4, 0(r3) # result in r3 stw r4, 0(r3) # result in r3
dcbf r0, r3 # data cache block flush dcbf r0, r3 # data cache block flush
icbi r0, r3 icbi r0, r3
exitncf4: exitncf4:
blr # return blr # return
.globl copyflagcheck5 # r3 address .globl copyflagcheck5 # r3 address
copyflagcheck5: copyflagcheck5:
mtctr r4 mtctr r4
lis r6, 0x4182 lis r6, 0x4182
ori r6, r6, 0x0024 # beq loc_8134AA60 ori r6, r6, 0x0024 # beq loc_8134AA60
findncf5: findncf5:
lwz r5, 0(r3) lwz r5, 0(r3)
cmpw r6, r5 cmpw r6, r5
beq writencf5 beq writencf5
addi r3, r3, 4 # next word addi r3, r3, 4 # next word
bdnz findncf5 # loop length bdnz findncf5 # loop length
b exitncf5 # stop unhooked game hanging b exitncf5 # stop unhooked game hanging
writencf5: writencf5:
#addi r3, r3, 8 # skip 2 #addi r3, r3, 8 # skip 2
lis r4, 0x801D
ori r4, r4, 0x0024 # change to 801D0024 (lwz r0,36(r29))
stw r4, 0(r3)
dcbf r0, r3
icbi r0, r3
addi r3, r3, 4 # next word
lis r4, 0x801D lis r4, 0x5400
ori r4, r4, 0x0024 # change to 801D0024 (lwz r0,36(r29)) ori r4, r4, 0x003C # change to 5400003C (rlwinm r0,r0,0,0,30)
stw r4, 0(r3) stw r4, 0(r3)
dcbf r0, r3 dcbf r0, r3
icbi r0, r3 icbi r0, r3
addi r3, r3, 4 # next word addi r3, r3, 4 # next word
lis r4, 0x5400 lis r4, 0x901D
ori r4, r4, 0x003C # change to 5400003C (rlwinm r0,r0,0,0,30) ori r4, r4, 0x0024 # change to 901D0024 (stw r0,36(r29))
stw r4, 0(r3) stw r4, 0(r3)
dcbf r0, r3 dcbf r0, r3
icbi r0, r3 icbi r0, r3
addi r3, r3, 4 # next word addi r3, r3, 4 # next word
lis r4, 0x901D lis r4, 0x4800
ori r4, r4, 0x0024 # change to 901D0024 (stw r0,36(r29)) ori r4, r4, 0x0018 # change to 48000018 (b 0x8134aa60)
stw r4, 0(r3) stw r4, 0(r3)
dcbf r0, r3 dcbf r0, r3
icbi r0, r3 icbi r0, r3
exitncf5:
blr # return
addi r3, r3, 4 # next word .globl movedvdhooks # r3 address
movedvdhooks:
lis r4, 0x4800 lis r6, 0x4182
ori r4, r4, 0x0018 # change to 48000018 (b 0x8134aa60) ori r6, r6, 0x0120 # beq loc_813A7938
stw r4, 0(r3) findmd1:
dcbf r0, r3 addi r3, r3, 4 # next word
icbi r0, r3 lwz r5, 0(r3)
exitncf5: writemd1:
blr # return lis r4, 0x6000
ori r4, r4, 0x0000 # nop
.globl movedvdhooks # r3 address stw r4, 0(r3) # result in r3
movedvdhooks: dcbf r0, r3 # data cache block flush
lis r6, 0x4182 icbi r0, r3
ori r6, r6, 0x0120 # beq loc_813A7938 exitmd1:
findmd1: blr # return
addi r3, r3, 4 # next word
lwz r5, 0(r3)
writemd1:
lis r4, 0x6000
ori r4, r4, 0x0000 # nop
stw r4, 0(r3) # result in r3
dcbf r0, r3 # data cache block flush
icbi r0, r3
exitmd1:
blr # return

View File

@ -205,11 +205,11 @@ int DiscBrowse(struct discHdr * header) {
if (ret > 0) { if (ret > 0) {
char temp[100]; char temp[100];
strncpy(temp, fstfiles(fst, ret), sizeof(temp)); strlcpy(temp, fstfiles(fst, ret), sizeof(temp));
choice = WindowPrompt(temp, tr("Load this dol as alternate dol?"), tr("OK"), tr("Cancel")); choice = WindowPrompt(temp, tr("Load this dol as alternate dol?"), tr("OK"), tr("Cancel"));
if (choice) { if (choice) {
//ret = offsetselect[ret]; //ret = offsetselect[ret];
snprintf(alternatedname, sizeof(alternatedname), "%s", temp); strlcpy(alternatedname, temp, sizeof(alternatedname));
exit = true; exit = true;
} }
} }
@ -232,7 +232,6 @@ int DiscBrowse(struct discHdr * header) {
int autoSelectDol(const char *id) { int autoSelectDol(const char *id) {
//still not done//
//////////ID6///////////////// //////////ID6/////////////////
//Boogie //Boogie
@ -271,38 +270,6 @@ int autoSelectDol(const char *id) {
//Metal Slug Anthology //Metal Slug Anthology
if (strcmp(id,"RMLP7U") == 0) return 56;//from isostar if (strcmp(id,"RMLP7U") == 0) return 56;//from isostar
//Metroid Prime Trilogy
if (strcmp(id,"R3ME01") == 0) {
int choice = WindowPrompt(tr("Select a DOL"), 0, "Metroid Prime", "Metroid Prime 2", "Metroid Prime 3");
switch (choice) {
case 1:
choice = 780;
break;
case 2:
choice = 781;
break;
default:
choice = 782;
break;
}
return choice;
}
if (strcmp(id,"R3MP01") == 0) {
int choice = WindowPrompt(tr("Select a DOL"), 0, "Metroid Prime", "Metroid Prime 2", "Metroid Prime 3");
switch (choice) {
case 1:
choice = 782;
break;
case 2:
choice = 783;
break;
default:
choice = 784;
break;
}
return choice;
}
//Mortal Kombat //Mortal Kombat
if (strcmp(id,"RKMP5D") == 0) return 290;//from isostar if (strcmp(id,"RKMP5D") == 0) return 290;//from isostar
if (strcmp(id,"RKME5D") == 0) return 290;//starstremr if (strcmp(id,"RKME5D") == 0) return 290;//starstremr
@ -342,3 +309,41 @@ int autoSelectDol(const char *id) {
return -1; return -1;
} }
int autoSelectDolMenu(const char *id) {
//Metroid Prime Trilogy
if (strcmp(id,"R3ME01") == 0) {
int choice = WindowPrompt(tr("Select a DOL"), 0, "Metroid Prime", "Metroid Prime 2", "Metroid Prime 3", tr("Cancel"));
switch (choice) {
case 1:
choice = 780;
break;
case 2:
choice = 781;
break;
case 3:
choice = 782;
default: // 0
break;
}
return choice;
}
if (strcmp(id,"R3MP01") == 0) {
int choice = WindowPrompt(tr("Select a DOL"), 0, "Metroid Prime", "Metroid Prime 2", "Metroid Prime 3", tr("Cancel"));
switch (choice) {
case 1:
choice = 782;
break;
case 2:
choice = 783;
break;
case 3:
choice = 784;
default: // 0
break;
}
return choice;
}
return -1;
}

View File

@ -10,5 +10,6 @@
int DiscBrowse(struct discHdr * header); int DiscBrowse(struct discHdr * header);
int autoSelectDol(const char *id); int autoSelectDol(const char *id);
int autoSelectDolMenu(const char *id);
#endif #endif

View File

@ -1957,7 +1957,7 @@ int GameSettings(struct discHdr * header) {
alternatedol = game_cfg->loadalternatedol; alternatedol = game_cfg->loadalternatedol;
alternatedoloffset = game_cfg->alternatedolstart; alternatedoloffset = game_cfg->alternatedolstart;
reloadblock = game_cfg->iosreloadblock; reloadblock = game_cfg->iosreloadblock;
strncpy(alternatedname, game_cfg->alternatedolname, sizeof(alternatedname)); strlcpy(alternatedname, game_cfg->alternatedolname, sizeof(alternatedname));
} else { } else {
videoChoice = Settings.video; videoChoice = Settings.video;
languageChoice = Settings.language; languageChoice = Settings.language;
@ -1974,11 +1974,9 @@ int GameSettings(struct discHdr * header) {
alternatedol = off; alternatedol = off;
alternatedoloffset = 0; alternatedoloffset = 0;
reloadblock = off; reloadblock = off;
sprintf(alternatedname, " "); strcpy(alternatedname, "");
} }
ResumeGui(); ResumeGui();
while (MainButton1.GetEffect() > 0) usleep(50); while (MainButton1.GetEffect() > 0) usleep(50);
@ -2187,31 +2185,36 @@ int GameSettings(struct discHdr * header) {
snprintf(filename,sizeof(filename),"%c%c%c%c%c%c",header->id[0], header->id[1], header->id[2], snprintf(filename,sizeof(filename),"%c%c%c%c%c%c",header->id[0], header->id[1], header->id[2],
header->id[3],header->id[4], header->id[5]); header->id[3],header->id[4], header->id[5]);
int dolchoice = 0; int dolchoice = 0;
//check to see if we already know the offset of the correct dol //alt dol menu for games that require more than a single alt dol
int autodol = autoSelectDol(filename); int autodol = autoSelectDolMenu(filename);
if (autodol>0) {
//if we do know that offset ask if they want to use it alternatedoloffset = autodol;
if (autodol>0) { snprintf(alternatedname, sizeof(alternatedname), "%s <%i>", tr("AUTO"),autodol);
dolchoice = WindowPrompt(0,tr("Do you want to use the alt dol that is known to be correct?"),tr("Yes"),tr("Pick from a list")); } else if (autodol!=0) {
if (dolchoice==1) { //check to see if we already know the offset of the correct dol
alternatedoloffset = autodol; int autodol = autoSelectDol(filename);
snprintf(alternatedname, sizeof(alternatedname), "%s <%i>", tr("AUTO"),autodol); //if we do know that offset ask if they want to use it
} else {//they want to search for the correct dol themselves if (autodol>0) {
int res = DiscBrowse(header); dolchoice = WindowPrompt(0,tr("Do you want to use the alt dol that is known to be correct?"),tr("Yes"),tr("Pick from a list"));
if ((res >= 0)&&(res !=696969)) {//if res==696969 they pressed the back button if (dolchoice==1) {
alternatedoloffset = res; alternatedoloffset = autodol;
snprintf(alternatedname, sizeof(alternatedname), "%s <%i>", tr("AUTO"),autodol);
} else if (dolchoice!=0){//they want to search for the correct dol themselves
int res = DiscBrowse(header);
if ((res >= 0)&&(res !=696969)) {//if res==696969 they pressed the back button
alternatedoloffset = res;
}
} }
} } else {
} else { int res = DiscBrowse(header);
int res = DiscBrowse(header); if ((res >= 0)&&(res !=696969)){
if ((res >= 0)&&(res !=696969)){ alternatedoloffset = res;
alternatedoloffset = res; char tmp[170];
snprintf(tmp,sizeof(tmp),"%s %s - %i",tr("It seems that you have some information that will be helpful to us. Please pass this information along to the DEV team.") ,filename,alternatedoloffset);
char tmp[170]; WindowPrompt(0,tmp,tr("Ok"));
snprintf(tmp,sizeof(tmp),"%s %s - %i",tr("It seems that you have some information that will be helpful to us. Please pass this information along to the DEV team.") ,filename,alternatedoloffset);
WindowPrompt(0,tmp,tr("Ok"));
} }
} }
}
} }
break; break;
case 10: case 10:
@ -2281,6 +2284,7 @@ int GameSettings(struct discHdr * header) {
options2.SetName(2,"%s", tr("Delete Boxart")); options2.SetName(2,"%s", tr("Delete Boxart"));
options2.SetName(3,"%s", tr("Delete Discart")); options2.SetName(3,"%s", tr("Delete Discart"));
options2.SetName(4,"%s", tr("Delete CheatTxt")); options2.SetName(4,"%s", tr("Delete CheatTxt"));
options2.SetName(5,"%s", tr("Delete Cheat GCT"));
for (int i = 0; i <= MAXOPTIONS-1; i++) options2.SetValue(i, NULL); for (int i = 0; i <= MAXOPTIONS-1; i++) options2.SetValue(i, NULL);
w.Append(&optionBrowser2); w.Append(&optionBrowser2);
optionBrowser2.SetClickable(true); optionBrowser2.SetClickable(true);
@ -2399,7 +2403,16 @@ int GameSettings(struct discHdr * header) {
remove(tmp); remove(tmp);
} }
break; break;
case 5:
snprintf(tmp,sizeof(tmp),"%s%c%c%c%c%c%c.gct", Settings.Cheatcodespath, header->id[0], header->id[1], header->id[2],header->id[3], header->id[4], header->id[5]);
choice1 = WindowPrompt(tr("Delete"),tmp,tr("Yes"),tr("No"));
if (choice1==1) {
if (checkfile(tmp))
remove(tmp);
}
break;
} }
} }
optionBrowser2.SetEffect(EFFECT_FADE, -20); optionBrowser2.SetEffect(EFFECT_FADE, -20);
@ -2428,7 +2441,7 @@ int GameSettings(struct discHdr * header) {
iosChoice = i249; iosChoice = i249;
} }
parentalcontrolChoice = 0; parentalcontrolChoice = 0;
sprintf(alternatedname, " "); strcpy(alternatedname, "");
CFG_forget_game_opt(header->id); CFG_forget_game_opt(header->id);
/* commented because the database language now depends on the main language setting, this could be enabled again if there is a separate language setting for the database /* commented because the database language now depends on the main language setting, this could be enabled again if there is a separate language setting for the database
// if default language is different than language from main settings, reload titles // if default language is different than language from main settings, reload titles

View File

@ -1016,7 +1016,7 @@ bool trimsplit(char *line, char *part1, char *part2, char delim, int size) {
} }
void cfg_parseline(char *line, void (*set_func)(char*, char*)) { void cfg_parseline(char *line, void (*set_func)(char*, char*)) {
// split name = value // split name = value
char tmp[200], name[200], val[200]; char tmp[300], name[200], val[200];
strcopy(tmp, line, sizeof(tmp)); strcopy(tmp, line, sizeof(tmp));
char *eq = strchr(tmp, '='); char *eq = strchr(tmp, '=');
if (!eq) return; if (!eq) return;
@ -1054,7 +1054,7 @@ void cfg_parsetitleline(char *line, void (*set_func)(char*, char*, u8)) {
bool cfg_parsefile(char *fname, void (*set_func)(char*, char*)) { bool cfg_parsefile(char *fname, void (*set_func)(char*, char*)) {
FILE *f; FILE *f;
char line[200]; char line[300];
//printf("opening(%s)\n", fname); //printf("opening(%s)\n", fname);
f = fopen(fname, "r"); f = fopen(fname, "r");
@ -1137,8 +1137,12 @@ void cfg_set_game_opt(struct Game_CFG *game, u8 *id) {
game->iosreloadblock = reloadblock; game->iosreloadblock = reloadblock;
game->patchcountrystrings = countrystrings; game->patchcountrystrings = countrystrings;
game->loadalternatedol = alternatedol; game->loadalternatedol = alternatedol;
if (game->loadalternatedol == 0) {
alternatedoloffset = 0;
strcpy(alternatedname, "");
}
game->alternatedolstart = alternatedoloffset; game->alternatedolstart = alternatedoloffset;
strcpy(game->alternatedolname, alternatedname); strlcpy(game->alternatedolname, alternatedname,sizeof(game->alternatedolname));
} }
struct Game_NUM* cfg_get_game_num(u8 *id) { struct Game_NUM* cfg_get_game_num(u8 *id) {
@ -1254,7 +1258,7 @@ void game_set(char *name, char *val) {
// parse val // parse val
// first split options by ; // first split options by ;
char opt[200], *p, *np; char opt[300], *p, *np;
p = val; p = val;
while (p) { while (p) {
@ -1321,18 +1325,7 @@ void game_set(char *name, char *val) {
} }
} }
if (strcmp("alternatedolname", opt_name) == 0) { if (strcmp("alternatedolname", opt_name) == 0) {
char temp3[40]; strlcpy(game->alternatedolname, opt_val, sizeof(game->alternatedolname));
int i = 0;
while (i < 40) {
if (opt_val[i] == ';')
break;
temp3[i] = opt_val[i];
i++;
}
temp3[i] = '\0';
strncpy(game->alternatedolname, temp3, 39);
} }
} }
// next opt // next opt