From bc3d173ef4d2f51a29d1c760bf87c451709a92dd Mon Sep 17 00:00:00 2001
From: dimok321 <15055714+dimok789@users.noreply.github.com>
Date: Thu, 11 Jun 2009 23:02:05 +0000
Subject: [PATCH] *Added support for NEW Hermes cIOS (It still might have some
bugs so please report them to me)
NOTE: When you change Global cIOS boot you need to restart for it to take effect.
NOTE2: Best way of launching games (most compatibility) is avoiding an IOS Reload by not initializing the network and not have different boot IOS than the one set in GameSettings.
NOTE3: Know issue: IOS249 boots slower now at the starts. IOS222 boots fast as always.
---
gui.pnproj | 2 +-
source/PromptWindows.cpp | 9 +-
source/dip_plugin.c | 140 ++++++++
source/dip_plugin.h | 3 +
source/disc.c | 5 +-
source/ehcmodule.c | 661 ++++++++++++++++++++++++++++++++++++
source/ehcmodule.h | 3 +
source/libwbfs/libwbfs.c | 155 +++++++--
source/libwbfs/libwbfs.h | 9 +
source/libwbfs/libwbfs_os.h | 3 +-
source/main.cpp | 3 +-
source/menu.cpp | 294 ++++------------
source/mload.c | 494 +++++++++++++++++++++++++++
source/mload.h | 194 +++++++++++
source/sys.cpp | 17 +-
source/usbstorage.c | 27 +-
source/usbstorage.h | 3 +-
source/wbfs.c | 32 +-
source/wbfs.h | 6 +-
source/wdvd.c | 147 ++++----
source/wdvd.h | 2 +-
21 files changed, 1870 insertions(+), 339 deletions(-)
create mode 100644 source/dip_plugin.c
create mode 100644 source/dip_plugin.h
create mode 100644 source/ehcmodule.c
create mode 100644 source/ehcmodule.h
create mode 100644 source/mload.c
create mode 100644 source/mload.h
diff --git a/gui.pnproj b/gui.pnproj
index 0ca2944a..a3063a94 100644
--- a/gui.pnproj
+++ b/gui.pnproj
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/source/PromptWindows.cpp b/source/PromptWindows.cpp
index a7348dad..1b073a3d 100644
--- a/source/PromptWindows.cpp
+++ b/source/PromptWindows.cpp
@@ -19,6 +19,7 @@
#include "updater.h"
#include "http.h"
#include "partition.h"
+#include "usbstorage.h"
#include "getentries.h"
/*** Variables that are also used extern ***/
@@ -1489,9 +1490,9 @@ DiscWait(const char *title, const char *msg, const char *btn1Label, const char *
timerTxt.SetTextf("%u %s", i,LANGUAGE.secondsleft);
VIDEO_WaitVSync();
if(Settings.cios == ios222) {
- ret = IOS_ReloadIOS(222);
+ ret = Sys_IosReload(222);
} else {
- ret = IOS_ReloadIOS(249);
+ ret = Sys_IosReload(249);
}
sleep(1);
ret = WBFS_Init(WBFS_DEVICE_USB);
@@ -1878,10 +1879,12 @@ ProgressWindow(const char *title, const char *msg)
s32 ret;
- __Disc_SetLowMem();
+ USBStorage_Watchdog(0);
ret = wbfs_add_disc(hdd, __WBFS_ReadDVD, NULL, ShowProgress, ONLY_GAME_PARTITION, 0);
+ USBStorage_Watchdog(1);
+
HaltGui();
mainWindow->Remove(&promptWindow);
mainWindow->SetState(STATE_DEFAULT);
diff --git a/source/dip_plugin.c b/source/dip_plugin.c
new file mode 100644
index 00000000..0c37593d
--- /dev/null
+++ b/source/dip_plugin.c
@@ -0,0 +1,140 @@
+#define size_dip_plugin 3700
+
+unsigned char dip_plugin[3700] __attribute__((aligned (32)))={
+ 19, 119, 230, 81, 18, 52, 0, 1, 32, 34, 205, 172, 32, 32, 13, 57, 32, 32, 8, 197, 32, 32, 8, 153, 32, 32, 91, 129, 32,
+ 32, 0, 73, 32, 32, 40, 117, 32, 32, 54, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 19, 119, 235, 77, 70, 192, 70, 192, 70, 192, 70, 192, 70, 192, 70, 192, 70, 192, 71, 120, 234, 0, 2, 143, 70, 192, 71,
+ 120, 234, 0, 2, 159, 70, 192, 71, 120, 234, 0, 2, 175, 70, 192, 71, 120, 234, 0, 2, 167, 70, 192, 71, 120, 234, 0, 2,
+ 141, 70, 192, 71, 120, 234, 0, 2, 127, 70, 192, 71, 120, 234, 0, 2, 165, 70, 192, 71, 120, 234, 0, 2, 161, 70, 192,
+ 71, 120, 234, 0, 2, 167, 70, 192, 71, 120, 234, 0, 2, 167, 181, 0, 75, 7, 176, 137, 147, 0, 70, 104, 35, 0, 33, 0, 34,
+ 0, 147, 1, 147, 2, 240, 0, 253, 93, 176, 9, 188, 2, 71, 8, 70, 192, 227, 0, 0, 0, 181, 16, 28, 3, 34, 32, 28, 12, 72,
+ 13, 28, 25, 247, 255, 255, 206, 33, 32, 72, 11, 247, 255, 255, 198, 73, 10, 34, 1, 104, 11, 66, 19, 209, 253, 34, 32,
+ 28, 32, 73, 6, 247, 255, 255, 192, 28, 32, 33, 32, 247, 255, 255, 184, 75, 4, 104, 24, 188, 16, 188, 2, 71, 8, 70, 192,
+ 13, 0, 96, 0, 13, 0, 96, 28, 13, 0, 96, 32, 181, 240, 70, 95, 70, 86, 70, 77, 70, 68, 180, 240, 10, 203, 70, 154, 75,
+ 20, 176, 137, 37, 0, 28, 7, 28, 14, 70, 145, 70, 108, 70, 155, 70, 168, 70, 91, 96, 35, 70, 67, 96, 99, 96, 163, 70,
+ 83, 96, 227, 28, 56, 70, 75, 28, 49, 97, 35, 247, 255, 255, 158, 70, 104, 28, 57, 28, 50, 240, 0, 253, 14, 53, 1, 40,
+ 0, 209, 8, 176, 9, 188, 60, 70, 144, 70, 153, 70, 162, 70, 171, 188, 240, 188, 2, 71, 8, 45, 15, 217, 223, 231, 243,
+ 208, 0, 0, 0, 181, 112, 176, 136, 75, 8, 28, 6, 28, 13, 70, 108, 147, 0, 96, 97, 146, 2, 247, 255, 255, 125, 28, 49,
+ 28, 42, 70, 104, 240, 0, 252, 237, 176, 8, 188, 112, 188, 2, 71, 8, 168, 0, 0, 0, 181, 240, 70, 95, 70, 86, 70, 77,
+ 70, 68, 180, 240, 176, 143, 144, 4, 145, 3, 146, 2, 41, 0, 209, 0, 224, 126, 10, 82, 70, 145, 35, 128, 34, 0, 1, 27,
+ 70, 147, 34, 255, 147, 1, 3, 210, 171, 6, 146, 0, 70, 152, 224, 7, 154, 3, 68, 179, 69, 90, 217, 62, 154, 5, 24, 179,
+ 10, 219, 68, 153, 154, 3, 70, 91, 26, 214, 70, 74, 2, 83, 154, 2, 66, 154, 216, 87, 35, 0, 147, 5, 36, 0, 159, 4, 34,
+ 128, 68, 95, 28, 56, 28, 49, 1, 18, 240, 0, 248, 103, 44, 0, 209, 47, 40, 0, 208, 45, 155, 0, 28, 6, 66, 152, 217, 1,
+ 38, 255, 3, 246, 10, 242, 70, 146, 36, 0, 75, 43, 70, 66, 96, 19, 35, 0, 96, 83, 96, 147, 70, 83, 96, 211, 70, 75, 97,
+ 19, 28, 56, 28, 49, 247, 255, 255, 34, 70, 64, 28, 57, 28, 50, 240, 0, 252, 146, 52, 1, 28, 5, 40, 0, 208, 192, 44,
+ 15, 217, 230, 45, 0, 208, 188, 176, 15, 28, 40, 188, 60, 70, 144, 70, 153, 70, 162, 70, 171, 188, 240, 188, 2, 71, 8,
+ 154, 5, 25, 147, 154, 1, 66, 147, 217, 1, 155, 5, 26, 214, 32, 128, 1, 0, 33, 32, 247, 255, 254, 247, 28, 4, 40, 0,
+ 208, 18, 33, 128, 1, 9, 70, 74, 247, 255, 255, 59, 28, 5, 40, 0, 208, 15, 28, 32, 247, 255, 254, 213, 231, 216, 26,
+ 211, 0, 155, 28, 28, 147, 5, 30, 99, 65, 156, 231, 163, 37, 1, 66, 109, 231, 208, 37, 0, 231, 206, 154, 5, 28, 56, 24,
+ 161, 28, 50, 247, 255, 254, 210, 28, 56, 28, 49, 247, 255, 254, 202, 231, 228, 70, 192, 208, 0, 0, 0, 181, 48, 28, 13,
+ 28, 20, 6, 195, 209, 18, 75, 15, 66, 152, 217, 19, 33, 0, 75, 14, 24, 194, 75, 14, 66, 154, 216, 1, 75, 13, 26, 25,
+ 66, 161, 211, 5, 28, 8, 66, 169, 216, 10, 30, 99, 67, 152, 224, 0, 32, 0, 188, 48, 188, 2, 71, 8, 35, 192, 4, 91, 26,
+ 25, 231, 232, 28, 40, 30, 99, 67, 152, 231, 244, 1, 127, 255, 255, 240, 0, 0, 0, 3, 97, 127, 255, 19, 97, 128, 0, 181,
+ 240, 70, 95, 70, 86, 70, 77, 70, 68, 180, 240, 70, 137, 176, 129, 73, 51, 34, 4, 28, 7, 240, 0, 250, 235, 40, 0, 209,
+ 3, 35, 128, 0, 91, 69, 153, 208, 13, 75, 47, 70, 154, 120, 27, 43, 0, 209, 81, 176, 1, 188, 60, 70, 144, 70, 153, 70,
+ 162, 70, 171, 188, 240, 188, 1, 71, 0, 74, 40, 35, 10, 70, 146, 112, 19, 38, 243, 75, 38, 74, 39, 37, 0, 70, 152, 70,
+ 147, 224, 2, 53, 1, 66, 181, 210, 19, 25, 124, 28, 32, 70, 65, 34, 13, 240, 0, 250, 195, 40, 0, 209, 244, 70, 89, 34,
+ 13, 28, 32, 247, 255, 254, 98, 53, 1, 28, 32, 33, 13, 247, 255, 254, 89, 66, 181, 211, 235, 34, 12, 66, 82, 68, 74,
+ 70, 144, 42, 0, 208, 27, 75, 23, 37, 0, 78, 23, 70, 153, 224, 2, 53, 1, 69, 69, 210, 19, 25, 124, 28, 32, 28, 49, 34,
+ 12, 240, 0, 250, 161, 40, 0, 209, 244, 70, 73, 34, 12, 28, 32, 247, 255, 254, 64, 53, 1, 28, 32, 33, 12, 247, 255, 254,
+ 55, 69, 69, 211, 235, 70, 82, 120, 19, 59, 1, 112, 19, 231, 173, 70, 78, 62, 13, 46, 0, 209, 183, 231, 211, 70, 192,
+ 19, 119, 235, 176, 19, 119, 238, 128, 19, 119, 235, 217, 19, 119, 235, 204, 19, 119, 235, 180, 19, 119, 235, 192, 181,
+ 48, 28, 4, 72, 15, 28, 13, 104, 131, 104, 193, 176, 129, 24, 91, 24, 154, 105, 3, 43, 0, 209, 15, 104, 67, 43, 0, 209,
+ 7, 28, 32, 28, 41, 247, 255, 254, 147, 176, 1, 188, 48, 188, 2, 71, 8, 28, 32, 28, 41, 247, 255, 254, 161, 231, 246,
+ 28, 32, 28, 41, 240, 0, 250, 118, 231, 241, 70, 192, 19, 119, 238, 132, 181, 240, 70, 95, 70, 86, 70, 77, 70, 68, 180,
+ 240, 176, 129, 28, 4, 70, 139, 72, 48, 33, 1, 70, 145, 247, 255, 253, 248, 70, 130, 40, 0, 219, 74, 120, 35, 43, 0,
+ 208, 80, 77, 43, 34, 0, 84, 171, 52, 1, 120, 35, 50, 1, 43, 0, 209, 249, 28, 87, 35, 10, 70, 72, 84, 171, 40, 0, 221,
+ 45, 35, 15, 38, 0, 70, 152, 224, 24, 28, 122, 28, 81, 28, 59, 28, 79, 32, 48, 84, 232, 70, 88, 93, 131, 70, 64, 64,
+ 3, 51, 48, 84, 171, 43, 57, 217, 1, 51, 7, 84, 171, 70, 67, 64, 51, 43, 15, 208, 16, 35, 32, 54, 1, 84, 107, 69, 177,
+ 221, 16, 47, 252, 221, 228, 28, 58, 28, 41, 70, 80, 247, 255, 253, 200, 39, 3, 35, 0, 34, 1, 33, 2, 231, 222, 35, 10,
+ 54, 1, 84, 107, 69, 177, 220, 238, 28, 32, 28, 57, 247, 255, 253, 166, 70, 80, 28, 41, 28, 58, 247, 255, 253, 181, 70,
+ 80, 247, 255, 253, 154, 176, 1, 188, 60, 70, 144, 70, 153, 70, 162, 70, 171, 188, 240, 188, 1, 71, 0, 34, 0, 39, 1,
+ 77, 2, 231, 179, 70, 192, 19, 119, 235, 232, 19, 119, 239, 32, 181, 240, 70, 71, 180, 128, 79, 33, 28, 4, 104, 59, 70,
+ 152, 43, 0, 209, 17, 35, 1, 96, 59, 33, 32, 247, 255, 253, 142, 104, 227, 43, 8, 208, 12, 28, 32, 240, 0, 250, 241,
+ 70, 67, 96, 59, 188, 4, 70, 144, 188, 240, 188, 2, 71, 8, 240, 0, 250, 232, 231, 247, 28, 33, 72, 20, 49, 12, 34, 4,
+ 247, 255, 255, 110, 34, 32, 28, 33, 72, 17, 247, 255, 255, 105, 105, 163, 104, 24, 104, 89, 247, 255, 253, 110, 105,
+ 163, 36, 197, 104, 27, 1, 164, 28, 32, 33, 8, 104, 93, 104, 30, 247, 255, 253, 100, 75, 9, 4, 45, 64, 30, 67, 53, 28,
+ 32, 96, 37, 33, 8, 247, 255, 253, 75, 70, 67, 96, 59, 32, 0, 231, 208, 70, 192, 19, 119, 238, 172, 19, 119, 235, 248,
+ 19, 119, 236, 4, 0, 0, 255, 255, 181, 16, 73, 21, 28, 4, 104, 139, 104, 202, 24, 154, 105, 11, 43, 0, 209, 18, 104,
+ 75, 43, 0, 209, 11, 33, 32, 247, 255, 253, 183, 40, 0, 219, 3, 105, 162, 75, 13, 66, 154, 208, 10, 188, 16, 188, 2,
+ 71, 8, 33, 32, 247, 255, 253, 193, 231, 242, 33, 32, 240, 0, 249, 151, 231, 238, 75, 7, 104, 27, 104, 26, 35, 1, 112,
+ 19, 120, 83, 43, 0, 209, 236, 247, 255, 253, 12, 231, 233, 70, 192, 19, 119, 238, 132, 93, 28, 158, 163, 19, 119, 224,
+ 8, 181, 240, 70, 87, 70, 70, 180, 192, 28, 4, 120, 0, 176, 129, 28, 14, 28, 23, 40, 224, 208, 24, 77, 133, 35, 0, 98,
+ 43, 28, 3, 59, 112, 43, 143, 217, 13, 28, 32, 28, 49, 28, 58, 240, 0, 250, 122, 28, 4, 176, 1, 28, 32, 188, 12, 70,
+ 144, 70, 154, 188, 240, 188, 2, 71, 8, 74, 123, 0, 155, 88, 211, 70, 159, 77, 120, 106, 43, 43, 0, 209, 2, 105, 43,
+ 43, 0, 208, 230, 28, 48, 33, 0, 28, 58, 240, 0, 248, 240, 106, 43, 224, 143, 104, 107, 43, 0, 209, 2, 105, 43, 43, 0,
+ 208, 217, 36, 0, 231, 221, 35, 1, 34, 37, 84, 171, 104, 43, 43, 0, 208, 0, 224, 173, 28, 32, 28, 58, 240, 0, 250, 76,
+ 28, 4, 34, 0, 35, 37, 84, 234, 44, 0, 209, 204, 224, 46, 104, 235, 104, 169, 70, 154, 105, 43, 70, 136, 43, 0, 209,
+ 0, 224, 176, 32, 0, 34, 0, 70, 67, 70, 81, 67, 11, 209, 2, 42, 0, 209, 0, 224, 176, 28, 3, 30, 90, 65, 147, 96, 107,
+ 28, 48, 28, 57, 247, 255, 255, 105, 28, 4, 231, 176, 105, 43, 43, 0, 208, 167, 35, 2, 224, 85, 104, 97, 104, 162, 40,
+ 208, 209, 0, 224, 144, 28, 48, 247, 255, 254, 122, 28, 4, 40, 0, 209, 160, 35, 37, 92, 235, 43, 0, 209, 156, 28, 48,
+ 28, 57, 247, 255, 253, 243, 231, 151, 35, 36, 92, 234, 42, 0, 209, 179, 105, 41, 84, 234, 35, 37, 96, 42, 96, 106, 96,
+ 170, 96, 234, 98, 42, 84, 234, 70, 136, 41, 0, 209, 0, 231, 128, 105, 108, 247, 255, 252, 148, 70, 64, 28, 41, 28, 34,
+ 56, 1, 49, 24, 240, 0, 249, 19, 28, 4, 231, 122, 104, 107, 43, 0, 208, 93, 75, 60, 36, 160, 98, 43, 2, 36, 231, 114,
+ 104, 107, 43, 0, 209, 3, 105, 43, 43, 0, 209, 0, 231, 101, 104, 99, 104, 162, 7, 155, 67, 19, 74, 53, 36, 0, 64, 19,
+ 96, 235, 231, 98, 104, 99, 72, 51, 64, 24, 247, 255, 252, 128, 28, 4, 231, 91, 104, 98, 35, 36, 84, 234, 36, 0, 231,
+ 86, 105, 43, 96, 51, 28, 48, 28, 57, 247, 255, 252, 69, 36, 0, 231, 78, 104, 99, 97, 43, 43, 0, 209, 40, 105, 99, 36,
+ 0, 97, 107, 231, 70, 104, 43, 231, 238, 104, 99, 36, 0, 96, 43, 231, 64, 104, 171, 231, 232, 104, 99, 36, 0, 96, 171,
+ 231, 58, 104, 107, 43, 0, 209, 3, 105, 43, 43, 0, 209, 0, 231, 45, 28, 48, 33, 0, 28, 58, 240, 0, 248, 55, 28, 48, 28,
+ 57, 247, 255, 252, 31, 36, 0, 231, 40, 104, 97, 104, 162, 28, 48, 247, 255, 253, 250, 28, 4, 231, 79, 28, 40, 28, 33,
+ 49, 8, 34, 6, 48, 24, 247, 255, 252, 19, 231, 206, 105, 43, 43, 0, 209, 158, 231, 15, 2, 201, 2, 82, 231, 107, 28, 58,
+ 28, 32, 28, 49, 240, 0, 249, 135, 28, 2, 30, 83, 65, 154, 231, 71, 105, 43, 43, 0, 208, 0, 231, 74, 96, 106, 36, 0,
+ 231, 2, 70, 192, 19, 119, 238, 132, 19, 119, 236, 12, 0, 5, 49, 0, 255, 255, 128, 0, 127, 255, 255, 255, 181, 240, 70,
+ 87, 70, 78, 70, 69, 180, 224, 70, 128, 28, 14, 70, 148, 42, 0, 208, 51, 33, 3, 28, 2, 64, 10, 35, 4, 26, 155, 28, 24,
+ 64, 8, 69, 96, 216, 49, 40, 0, 208, 49, 36, 0, 70, 67, 85, 30, 52, 1, 66, 160, 216, 250, 69, 132, 208, 32, 70, 99, 26,
+ 27, 8, 159, 70, 153, 0, 187, 70, 154, 43, 0, 208, 17, 4, 51, 6, 50, 2, 49, 67, 26, 67, 10, 28, 21, 70, 67, 67, 53, 24,
+ 26, 33, 0, 0, 139, 49, 1, 80, 213, 66, 185, 211, 250, 68, 84, 69, 209, 208, 6, 70, 67, 25, 24, 52, 1, 112, 6, 48, 1,
+ 69, 164, 216, 250, 188, 28, 70, 144, 70, 153, 70, 162, 188, 240, 188, 1, 71, 0, 70, 96, 231, 203, 36, 0, 231, 211, 70,
+ 192, 181, 48, 28, 5, 28, 12, 28, 16, 42, 0, 208, 12, 120, 42, 120, 11, 66, 154, 209, 12, 33, 0, 224, 3, 92, 106, 92,
+ 99, 66, 154, 209, 6, 49, 1, 66, 136, 216, 248, 32, 0, 188, 48, 188, 2, 71, 8, 32, 1, 66, 64, 231, 249, 181, 112, 76,
+ 17, 28, 6, 104, 32, 176, 130, 28, 13, 98, 2, 97, 6, 100, 1, 97, 65, 33, 68, 247, 255, 251, 123, 28, 48, 28, 41, 247,
+ 255, 251, 119, 75, 10, 34, 2, 104, 24, 104, 35, 73, 9, 147, 0, 35, 1, 247, 255, 251, 134, 28, 41, 28, 4, 28, 48, 247,
+ 255, 251, 121, 176, 2, 28, 32, 188, 112, 188, 2, 71, 8, 19, 119, 238, 176, 19, 119, 238, 180, 87, 70, 83, 2, 181, 240,
+ 176, 133, 28, 4, 28, 15, 146, 3, 40, 1, 217, 5, 32, 1, 66, 64, 176, 5, 188, 240, 188, 2, 71, 8, 77, 38, 104, 43, 43,
+ 0, 208, 65, 78, 37, 104, 48, 40, 0, 219, 1, 247, 255, 251, 67, 75, 35, 0, 162, 88, 208, 33, 1, 247, 255, 251, 77, 96,
+ 48, 40, 0, 219, 232, 104, 40, 28, 57, 34, 6, 48, 32, 247, 255, 251, 60, 104, 40, 169, 3, 34, 4, 48, 64, 247, 255, 251,
+ 54, 104, 42, 36, 4, 28, 19, 51, 32, 96, 19, 104, 42, 35, 6, 96, 83, 104, 42, 33, 68, 28, 19, 51, 64, 96, 147, 104, 43,
+ 96, 220, 104, 40, 247, 255, 251, 32, 104, 43, 104, 48, 34, 2, 147, 0, 73, 14, 35, 0, 247, 255, 251, 48, 104, 42, 28,
+ 19, 51, 32, 96, 19, 104, 43, 96, 92, 104, 42, 28, 19, 51, 64, 96, 147, 104, 43, 96, 220, 231, 181, 75, 7, 78, 3, 96,
+ 43, 35, 1, 66, 91, 96, 51, 231, 188, 19, 119, 238, 176, 19, 119, 238, 180, 19, 119, 238, 108, 87, 70, 83, 1, 19, 119,
+ 238, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 233, 45, 64, 128, 229, 159, 112, 248, 229, 151, 112, 0, 235, 0, 0, 45,
+ 232, 189, 64, 128, 225, 47, 255, 30, 233, 45, 64, 128, 229, 159, 112, 228, 229, 151, 112, 0, 235, 0, 0, 39, 232, 189,
+ 64, 128, 225, 47, 255, 30, 233, 45, 64, 128, 229, 159, 112, 208, 229, 151, 112, 0, 235, 0, 0, 33, 232, 189, 64, 128,
+ 225, 47, 255, 30, 233, 45, 64, 128, 229, 159, 112, 188, 229, 151, 112, 0, 235, 0, 0, 27, 232, 189, 64, 128, 225, 47,
+ 255, 30, 233, 45, 64, 128, 229, 159, 112, 168, 229, 151, 112, 0, 235, 0, 0, 21, 232, 189, 64, 128, 225, 47, 255, 30,
+ 233, 45, 64, 128, 229, 159, 112, 148, 229, 151, 112, 0, 235, 0, 0, 15, 232, 189, 64, 128, 225, 47, 255, 30, 230, 0,
+ 8, 16, 225, 47, 255, 30, 230, 0, 7, 240, 225, 47, 255, 30, 230, 0, 3, 144, 225, 47, 255, 30, 230, 0, 3, 176, 225, 47,
+ 255, 30, 230, 0, 3, 208, 225, 47, 255, 30, 230, 0, 3, 240, 225, 47, 255, 30, 230, 0, 4, 80, 225, 47, 255, 30, 225, 47,
+ 255, 23, 180, 124, 181, 0, 247, 255, 252, 254, 188, 2, 188, 124, 71, 8, 181, 112, 176, 136, 104, 133, 28, 1, 75, 14,
+ 71, 24, 70, 192, 70, 114, 28, 1, 32, 4, 223, 171, 71, 16, 181, 240, 70, 95, 70, 86, 70, 77, 70, 68, 180, 240, 75, 8,
+ 104, 27, 71, 24, 19, 119, 224, 16, 19, 119, 224, 20, 19, 119, 224, 24, 19, 119, 224, 28, 19, 119, 224, 32, 19, 119,
+ 224, 36, 32, 16, 0, 213, 19, 119, 224, 12, 70, 192, 70, 192, 70, 192, 70, 192, 70, 192, 70, 192, 0, 0, 1, 0, 44, 0,
+ 0, 0, 72, 0, 2, 20, 60, 96, 128, 0, 44, 0, 0, 0, 64, 130, 2, 20, 60, 96, 128, 0, 4, 56, 96, 0, 1, 72, 0, 2, 68, 56,
+ 97, 0, 24, 12, 56, 96, 0, 1, 72, 0, 2, 68, 56, 97, 0, 24, 0, 0, 47, 100, 101, 118, 47, 102, 97, 116, 47, 108, 111, 103,
+ 0, 0, 0, 0, 69, 83, 95, 105, 111, 99, 116, 108, 118, 0, 0, 0, 100, 117, 109, 112, 0, 0, 0, 0, 19, 119, 230, 232, 19,
+ 119, 230, 196, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119,
+ 230, 116, 19, 119, 230, 116, 19, 119, 230, 186, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230,
+ 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116,
+ 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 231, 30, 19, 119, 230, 116, 19,
+ 119, 231, 80, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 231, 40, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119,
+ 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230,
+ 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116,
+ 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19,
+ 119, 230, 116, 19, 119, 231, 138, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 231, 40, 19, 119,
+ 230, 116, 19, 119, 230, 116, 19, 119, 230, 180, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230,
+ 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116,
+ 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19,
+ 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119,
+ 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230,
+ 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116,
+ 19, 119, 230, 116, 19, 119, 231, 40, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19,
+ 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 231, 154, 19, 119, 230, 116, 19, 119,
+ 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 154, 19, 119, 230,
+ 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 232, 10, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116,
+ 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19,
+ 119, 230, 116, 19, 119, 230, 116, 19, 119, 232, 2, 19, 119, 231, 254, 19, 119, 231, 246, 19, 119, 231, 242, 19, 119,
+ 231, 226, 19, 119, 231, 210, 19, 119, 231, 200, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230,
+ 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 231, 186, 47, 100, 101, 118,
+ 47, 117, 115, 98, 47, 101, 104, 99, 0, 0, 0, 0, 47, 100, 101, 118, 47, 115, 100, 105, 111, 47, 115, 100, 104, 99, 0,
+ 0, 19, 119, 238, 76, 19, 119, 238, 92
+};
diff --git a/source/dip_plugin.h b/source/dip_plugin.h
new file mode 100644
index 00000000..748e4642
--- /dev/null
+++ b/source/dip_plugin.h
@@ -0,0 +1,3 @@
+#define size_dip_plugin 3700
+
+extern unsigned char dip_plugin[3700];
diff --git a/source/disc.c b/source/disc.c
index 6f83df56..447d4c05 100644
--- a/source/disc.c
+++ b/source/disc.c
@@ -31,7 +31,10 @@ void __Disc_SetLowMem(void)
*(vu32 *)0x800000EC = 0x81800000;
*(vu32 *)0x800000F4 = 0x817E5480;
*(vu32 *)0x800000F8 = 0x0E7BE2C0;
- *(vu32 *)0x800000FC = 0x2B73A840;
+ *(vu32 *)0x800000FC = 0x2B73A840;
+
+ /** online check **/
+ memcpy((u32*) 0x80003180, (u32*) 0x80000000, 4);
/* Copy disc ID */
memcpy((void *)0x80003180, (void *)0x80000000, 4);
diff --git a/source/ehcmodule.c b/source/ehcmodule.c
new file mode 100644
index 00000000..a5a8dfe1
--- /dev/null
+++ b/source/ehcmodule.c
@@ -0,0 +1,661 @@
+#define size_ehcmodule 18412
+
+unsigned char ehcmodule[18412] __attribute__((aligned (32)))={
+ 127, 69, 76, 70, 1, 2, 1, 97, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 40, 0, 0, 0, 1, 19, 112, 0, 0, 0, 0, 0, 52, 0, 0, 0,
+ 0, 0, 0, 6, 6, 0, 52, 0, 32, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 160,
+ 0, 0, 0, 160, 0, 240, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 212, 0, 0, 0, 160, 0, 0, 0, 160, 0, 0, 0, 52, 0, 0, 0,
+ 52, 0, 240, 0, 0, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 212, 0, 0, 0, 212, 0, 240, 0,
+ 0, 0, 0, 64, 0, 0, 0, 0, 1, 0, 0, 1, 8, 19, 112, 0, 0, 19, 112, 0, 0, 0, 0, 69, 156, 0, 0, 69, 156, 0, 0, 0, 5, 0, 0,
+ 0, 4, 0, 0, 0, 1, 0, 0, 70, 164, 19, 112, 128, 0, 19, 112, 128, 0, 0, 0, 1, 72, 0, 2, 11, 56, 0, 0, 0, 6, 0, 0, 0, 4,
+ 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 6, 0, 0, 0, 11, 0, 0, 0, 4, 0, 0, 0, 9, 19, 112, 0, 0, 0, 0, 0, 125, 0, 0, 0, 72,
+ 0, 0, 0, 126, 0, 0, 64, 0, 0, 0, 0, 127, 19, 114, 139, 56, 227, 160, 0, 0, 227, 160, 16, 0, 229, 159, 48, 0, 225, 47,
+ 255, 19, 19, 112, 8, 13, 225, 160, 0, 0, 225, 160, 0, 0, 225, 160, 0, 0, 70, 192, 71, 120, 234, 0, 16, 74, 70, 192,
+ 71, 120, 234, 0, 16, 118, 70, 192, 71, 120, 234, 0, 16, 94, 70, 192, 71, 120, 234, 0, 16, 78, 70, 192, 71, 120, 234,
+ 0, 16, 106, 70, 192, 71, 120, 234, 0, 16, 58, 70, 192, 71, 120, 234, 0, 16, 38, 70, 192, 71, 120, 234, 0, 16, 78, 70,
+ 192, 71, 120, 234, 0, 16, 62, 70, 192, 71, 120, 234, 0, 16, 100, 70, 192, 71, 120, 234, 0, 16, 62, 70, 192, 71, 120,
+ 234, 0, 16, 66, 70, 192, 71, 120, 234, 0, 16, 62, 70, 192, 71, 120, 234, 0, 16, 28, 70, 192, 71, 120, 234, 0, 16, 38,
+ 70, 192, 71, 120, 234, 0, 16, 34, 70, 192, 71, 120, 234, 0, 16, 26, 181, 240, 28, 15, 120, 1, 28, 6, 28, 10, 58, 48,
+ 6, 19, 14, 27, 36, 0, 28, 69, 43, 9, 216, 11, 1, 35, 28, 28, 67, 20, 28, 40, 120, 1, 28, 69, 28, 10, 58, 48, 6, 19,
+ 14, 27, 43, 9, 217, 243, 28, 11, 59, 97, 6, 27, 14, 27, 43, 5, 216, 6, 1, 34, 28, 11, 59, 87, 28, 20, 67, 28, 28, 40,
+ 231, 234, 28, 11, 59, 65, 6, 27, 14, 27, 43, 5, 217, 6, 28, 115, 66, 157, 208, 10, 96, 60, 188, 240, 188, 2, 71, 8,
+ 1, 34, 28, 11, 59, 55, 28, 20, 67, 28, 28, 40, 231, 214, 32, 0, 231, 243, 70, 192, 181, 240, 70, 71, 180, 128, 28, 13,
+ 28, 6, 240, 4, 250, 7, 70, 128, 70, 65, 28, 48, 247, 255, 255, 120, 45, 0, 208, 33, 28, 40, 240, 4, 249, 253, 28, 7,
+ 28, 57, 28, 40, 247, 255, 255, 110, 72, 13, 33, 1, 247, 255, 255, 150, 28, 4, 40, 0, 219, 13, 28, 49, 70, 66, 247, 255,
+ 255, 123, 45, 0, 208, 4, 28, 32, 28, 41, 28, 58, 247, 255, 255, 116, 28, 32, 247, 255, 255, 129, 188, 4, 70, 144, 188,
+ 240, 188, 1, 71, 0, 39, 0, 231, 227, 19, 112, 128, 36, 181, 0, 75, 4, 176, 129, 28, 1, 104, 24, 247, 255, 255, 109,
+ 176, 1, 188, 1, 71, 0, 19, 112, 128, 24, 181, 0, 75, 9, 28, 1, 176, 129, 104, 24, 247, 255, 255, 89, 40, 0, 208, 2,
+ 176, 1, 188, 2, 71, 8, 72, 4, 33, 0, 247, 255, 255, 176, 32, 100, 240, 0, 251, 131, 231, 251, 19, 112, 128, 24, 19,
+ 112, 128, 52, 181, 240, 70, 95, 70, 86, 70, 77, 70, 68, 180, 240, 176, 149, 72, 198, 33, 0, 247, 255, 255, 157, 75,
+ 197, 33, 64, 104, 24, 247, 255, 255, 56, 33, 16, 247, 255, 255, 45, 70, 129, 72, 193, 70, 73, 144, 6, 247, 255, 255,
+ 27, 72, 192, 70, 74, 75, 192, 28, 1, 247, 255, 255, 69, 75, 191, 76, 191, 70, 130, 72, 191, 34, 0, 146, 13, 146, 14,
+ 146, 15, 146, 16, 146, 17, 147, 5, 148, 4, 144, 11, 74, 187, 75, 188, 76, 188, 72, 189, 146, 10, 147, 9, 148, 8, 144,
+ 7, 34, 0, 169, 19, 70, 72, 247, 255, 255, 47, 70, 80, 247, 255, 255, 0, 156, 19, 74, 183, 66, 148, 208, 243, 75, 173,
+ 66, 156, 209, 0, 224, 230, 120, 35, 120, 98, 6, 27, 4, 18, 67, 26, 120, 163, 2, 27, 67, 19, 120, 226, 67, 26, 42, 2,
+ 209, 0, 224, 198, 42, 2, 216, 17, 42, 1, 209, 0, 224, 154, 39, 1, 66, 127, 38, 1, 154, 5, 104, 19, 43, 0, 208, 0, 224,
+ 141, 46, 0, 208, 211, 152, 19, 28, 57, 247, 255, 254, 212, 231, 206, 42, 6, 209, 0, 224, 172, 42, 7, 209, 235, 126,
+ 35, 126, 98, 6, 27, 4, 18, 67, 26, 126, 163, 2, 27, 67, 19, 126, 226, 67, 26, 70, 147, 124, 35, 124, 98, 6, 27, 4, 18,
+ 67, 26, 124, 163, 2, 27, 67, 19, 124, 226, 67, 26, 146, 12, 125, 35, 125, 98, 6, 27, 4, 18, 67, 26, 125, 163, 2, 27,
+ 67, 19, 125, 226, 28, 21, 67, 29, 123, 35, 43, 0, 208, 0, 224, 196, 154, 15, 42, 0, 208, 0, 224, 192, 122, 35, 122,
+ 98, 6, 27, 4, 18, 67, 26, 122, 163, 122, 224, 2, 27, 67, 19, 67, 24, 240, 0, 251, 73, 28, 6, 155, 12, 70, 88, 25, 91,
+ 70, 152, 0, 217, 70, 68, 247, 255, 254, 164, 44, 0, 221, 9, 70, 92, 37, 0, 104, 32, 104, 97, 53, 1, 247, 255, 254, 155,
+ 52, 8, 69, 168, 220, 247, 153, 19, 72, 124, 123, 11, 123, 74, 6, 27, 4, 18, 67, 26, 123, 139, 2, 27, 67, 19, 123, 202,
+ 67, 26, 66, 130, 209, 0, 225, 172, 66, 130, 217, 0, 224, 157, 42, 6, 217, 0, 224, 187, 42, 5, 211, 0, 225, 41, 42, 1,
+ 209, 0, 225, 207, 42, 0, 209, 0, 225, 117, 42, 2, 209, 0, 225, 32, 39, 1, 38, 1, 154, 12, 69, 66, 219, 0, 231, 125,
+ 0, 211, 70, 88, 24, 196, 28, 21, 104, 32, 104, 97, 53, 1, 247, 255, 254, 72, 52, 8, 69, 168, 220, 247, 154, 5, 104,
+ 19, 43, 0, 209, 0, 231, 113, 70, 80, 73, 86, 247, 255, 254, 112, 231, 108, 123, 35, 123, 98, 6, 27, 4, 18, 67, 26, 123,
+ 163, 153, 6, 2, 27, 67, 19, 123, 226, 28, 21, 67, 29, 28, 40, 240, 4, 248, 136, 40, 0, 209, 90, 125, 35, 125, 98, 6,
+ 27, 4, 18, 67, 26, 125, 163, 2, 27, 67, 19, 125, 226, 156, 16, 28, 23, 67, 31, 44, 0, 209, 0, 224, 217, 32, 1, 144,
+ 16, 38, 1, 231, 67, 39, 1, 38, 1, 231, 64, 122, 35, 122, 98, 6, 27, 4, 18, 67, 26, 122, 163, 2, 27, 67, 19, 122, 226,
+ 156, 15, 28, 16, 67, 24, 66, 132, 209, 47, 32, 0, 144, 15, 39, 0, 38, 1, 231, 45, 156, 14, 44, 0, 209, 0, 231, 4, 152,
+ 5, 104, 3, 43, 0, 209, 0, 230, 255, 168, 18, 240, 0, 251, 37, 154, 18, 75, 59, 28, 4, 66, 154, 221, 0, 230, 246, 154,
+ 4, 33, 1, 152, 13, 240, 2, 254, 14, 73, 43, 70, 80, 247, 255, 254, 26, 32, 128, 4, 64, 153, 18, 240, 3, 255, 33, 154,
+ 13, 24, 18, 146, 13, 66, 148, 219, 0, 230, 226, 35, 0, 147, 13, 230, 223, 38, 0, 231, 73, 240, 0, 250, 144, 240, 0,
+ 250, 134, 39, 0, 38, 1, 230, 251, 155, 15, 43, 0, 208, 83, 39, 6, 66, 127, 38, 1, 230, 244, 75, 38, 66, 154, 209, 0,
+ 224, 136, 66, 154, 217, 0, 224, 141, 59, 3, 66, 154, 209, 0, 224, 198, 66, 154, 210, 0, 225, 37, 51, 1, 66, 154, 209,
+ 0, 225, 21, 51, 1, 66, 154, 208, 0, 231, 90, 70, 92, 104, 35, 105, 34, 104, 24, 104, 163, 38, 1, 104, 25, 240, 1, 253,
+ 159, 28, 7, 231, 81, 42, 12, 209, 0, 224, 184, 42, 12, 210, 0, 231, 73, 28, 19, 59, 26, 43, 1, 217, 0, 231, 68, 39,
+ 1, 38, 0, 231, 67, 70, 192, 19, 112, 128, 76, 19, 112, 128, 24, 19, 112, 128, 92, 0, 152, 150, 128, 0, 0, 6, 102, 19,
+ 112, 128, 12, 19, 112, 129, 128, 19, 112, 128, 108, 19, 112, 128, 124, 19, 112, 129, 72, 19, 112, 128, 136, 19, 112,
+ 128, 148, 0, 0, 5, 85, 85, 77, 83, 1, 0, 0, 7, 255, 85, 77, 83, 6, 28, 40, 153, 11, 34, 13, 240, 3, 255, 7, 40, 0, 209,
+ 164, 125, 35, 125, 98, 6, 27, 4, 18, 67, 26, 28, 47, 125, 163, 55, 13, 28, 57, 2, 27, 67, 19, 125, 226, 120, 12, 28,
+ 22, 28, 34, 58, 48, 67, 30, 6, 19, 14, 27, 37, 0, 28, 72, 43, 9, 216, 11, 1, 43, 28, 29, 67, 21, 28, 1, 120, 12, 28,
+ 72, 28, 34, 58, 48, 6, 19, 14, 27, 43, 9, 217, 243, 28, 35, 59, 97, 6, 27, 14, 27, 43, 5, 216, 40, 1, 42, 28, 35, 59,
+ 87, 28, 21, 67, 29, 28, 1, 231, 234, 240, 1, 249, 209, 34, 1, 146, 16, 38, 1, 230, 103, 152, 9, 104, 3, 66, 90, 65,
+ 83, 96, 3, 39, 0, 38, 1, 230, 221, 76, 143, 66, 162, 208, 51, 66, 162, 217, 0, 224, 180, 75, 141, 66, 154, 208, 0, 230,
+ 209, 156, 5, 35, 0, 96, 35, 240, 0, 251, 92, 32, 0, 144, 14, 39, 0, 38, 1, 230, 201, 28, 35, 59, 65, 6, 27, 14, 27,
+ 43, 5, 216, 0, 224, 152, 28, 123, 66, 152, 209, 0, 231, 71, 41, 0, 209, 0, 231, 68, 44, 47, 208, 0, 231, 65, 169, 18,
+ 247, 255, 253, 75, 40, 0, 209, 0, 231, 59, 120, 3, 43, 0, 208, 0, 231, 55, 28, 50, 153, 18, 28, 40, 240, 0, 249, 127,
+ 38, 1, 28, 7, 230, 40, 70, 90, 104, 19, 156, 5, 104, 27, 96, 35, 230, 158, 70, 92, 104, 35, 105, 34, 104, 24, 104, 163,
+ 38, 1, 104, 25, 240, 2, 253, 17, 28, 7, 230, 149, 46, 0, 209, 0, 224, 198, 39, 6, 66, 127, 38, 1, 230, 142, 46, 0, 208,
+ 249, 70, 88, 105, 3, 70, 90, 136, 24, 105, 147, 136, 28, 106, 19, 136, 29, 104, 19, 120, 25, 104, 147, 120, 26, 2, 3,
+ 10, 0, 67, 3, 2, 32, 10, 36, 67, 32, 4, 0, 12, 0, 144, 0, 2, 40, 10, 45, 67, 40, 4, 0, 12, 0, 144, 1, 70, 92, 107, 32,
+ 4, 27, 144, 2, 12, 27, 28, 48, 240, 0, 255, 99, 38, 1, 28, 7, 230, 102, 240, 2, 251, 6, 28, 7, 40, 0, 219, 116, 154,
+ 5, 153, 19, 32, 1, 96, 16, 122, 11, 122, 74, 6, 27, 4, 18, 67, 26, 122, 139, 152, 10, 2, 27, 67, 19, 122, 202, 67, 26,
+ 146, 15, 33, 0, 247, 255, 253, 32, 35, 1, 147, 14, 38, 1, 230, 74, 70, 88, 104, 3, 70, 90, 104, 24, 104, 147, 105, 18,
+ 104, 25, 240, 2, 251, 133, 38, 1, 28, 7, 230, 62, 70, 90, 104, 16, 240, 0, 249, 192, 38, 1, 28, 7, 230, 55, 46, 0, 208,
+ 162, 70, 88, 104, 3, 120, 25, 104, 131, 136, 26, 105, 3, 28, 48, 240, 0, 255, 18, 38, 1, 28, 7, 230, 41, 1, 42, 28,
+ 35, 59, 55, 28, 21, 67, 29, 28, 1, 231, 33, 75, 51, 66, 154, 208, 21, 51, 1, 66, 154, 208, 0, 230, 25, 156, 17, 44,
+ 0, 208, 63, 70, 80, 247, 255, 252, 123, 70, 88, 104, 3, 105, 2, 104, 25, 104, 131, 152, 17, 104, 27, 240, 2, 254, 112,
+ 39, 0, 38, 1, 230, 9, 122, 11, 122, 74, 6, 27, 4, 18, 67, 26, 122, 139, 70, 88, 2, 27, 67, 19, 122, 202, 28, 20, 67,
+ 28, 35, 0, 147, 18, 104, 195, 43, 4, 208, 38, 70, 90, 104, 16, 153, 18, 240, 2, 254, 17, 144, 17, 40, 0, 208, 27, 39,
+ 0, 148, 15, 152, 8, 231, 154, 153, 19, 152, 7, 122, 11, 122, 74, 6, 27, 4, 18, 67, 26, 122, 139, 38, 1, 2, 27, 67, 19,
+ 122, 202, 33, 0, 67, 26, 146, 15, 247, 255, 252, 173, 35, 0, 147, 14, 229, 216, 39, 1, 66, 127, 38, 1, 229, 212, 39,
+ 1, 66, 127, 231, 225, 104, 129, 34, 4, 168, 18, 240, 3, 253, 226, 231, 210, 70, 90, 104, 19, 70, 92, 120, 24, 104, 147,
+ 105, 18, 120, 25, 105, 163, 240, 0, 248, 247, 38, 1, 28, 7, 229, 190, 85, 77, 83, 128, 85, 77, 83, 16, 87, 70, 83, 1,
+ 181, 0, 33, 128, 176, 129, 2, 73, 72, 18, 247, 255, 252, 3, 75, 18, 33, 64, 96, 24, 247, 255, 252, 30, 33, 16, 247,
+ 255, 252, 19, 75, 15, 33, 250, 28, 2, 96, 24, 0, 137, 75, 13, 72, 14, 247, 255, 252, 46, 75, 13, 96, 24, 247, 255, 252,
+ 2, 240, 0, 249, 64, 40, 0, 219, 5, 247, 255, 252, 192, 32, 0, 176, 1, 188, 2, 71, 8, 32, 1, 66, 64, 231, 249, 70, 192,
+ 19, 113, 73, 128, 19, 112, 128, 24, 19, 112, 128, 16, 0, 0, 6, 102, 0, 15, 66, 64, 19, 112, 128, 20, 181, 240, 77, 17,
+ 176, 131, 28, 4, 73, 16, 34, 0, 104, 40, 247, 255, 251, 255, 79, 15, 28, 33, 104, 56, 247, 255, 251, 254, 76, 11, 174,
+ 1, 104, 40, 28, 49, 34, 0, 247, 255, 251, 255, 155, 1, 66, 163, 209, 247, 28, 49, 104, 40, 34, 0, 247, 255, 251, 247,
+ 104, 56, 247, 255, 251, 200, 176, 3, 188, 240, 188, 1, 71, 0, 19, 112, 128, 16, 0, 0, 5, 85, 19, 112, 128, 20, 181,
+ 240, 77, 19, 28, 4, 176, 131, 73, 18, 34, 0, 104, 40, 247, 255, 251, 213, 1, 97, 27, 9, 79, 16, 0, 137, 25, 9, 104,
+ 56, 0, 201, 247, 255, 251, 208, 76, 11, 174, 1, 104, 40, 28, 49, 34, 0, 247, 255, 251, 209, 155, 1, 66, 163, 209, 247,
+ 28, 49, 104, 40, 34, 0, 247, 255, 251, 201, 104, 56, 247, 255, 251, 154, 176, 3, 188, 240, 188, 1, 71, 0, 19, 112, 128,
+ 16, 0, 0, 5, 85, 19, 112, 128, 20, 181, 240, 75, 24, 28, 5, 104, 31, 35, 84, 92, 252, 70, 140, 28, 22, 44, 0, 208, 32,
+ 28, 57, 49, 96, 32, 0, 224, 3, 48, 1, 49, 40, 66, 132, 221, 24, 105, 139, 43, 0, 209, 248, 136, 10, 2, 19, 10, 18, 67,
+ 19, 4, 27, 12, 27, 66, 171, 209, 240, 136, 74, 2, 19, 10, 18, 67, 19, 4, 27, 12, 27, 69, 99, 209, 232, 0, 131, 24, 27,
+ 0, 219, 24, 251, 103, 158, 224, 1, 38, 6, 66, 118, 28, 48, 188, 240, 188, 2, 71, 8, 70, 192, 19, 112, 128, 28, 181,
+ 0, 40, 0, 208, 1, 35, 0, 98, 3, 32, 0, 188, 2, 71, 8, 181, 112, 75, 16, 28, 6, 104, 28, 35, 84, 92, 229, 45, 0, 208,
+ 18, 111, 163, 66, 179, 208, 19, 28, 33, 49, 160, 34, 0, 224, 8, 0, 147, 24, 155, 0, 219, 51, 88, 24, 224, 104, 11, 49,
+ 40, 66, 179, 208, 3, 50, 1, 66, 170, 219, 243, 32, 0, 188, 112, 188, 2, 71, 8, 28, 32, 48, 88, 231, 249, 19, 112, 128,
+ 28, 181, 240, 70, 95, 70, 86, 70, 77, 70, 68, 180, 240, 70, 147, 74, 35, 28, 31, 104, 20, 35, 84, 92, 227, 70, 128,
+ 70, 148, 43, 0, 208, 59, 40, 0, 208, 57, 37, 0, 35, 84, 38, 0, 70, 169, 70, 154, 224, 1, 69, 69, 218, 36, 0, 179, 25,
+ 155, 0, 219, 24, 228, 111, 35, 43, 0, 208, 22, 0, 232, 28, 3, 70, 74, 51, 2, 82, 58, 52, 96, 83, 218, 136, 34, 28, 1,
+ 4, 18, 10, 19, 14, 18, 67, 19, 49, 4, 83, 203, 136, 99, 24, 56, 4, 27, 10, 26, 14, 27, 67, 26, 128, 194, 53, 1, 70,
+ 99, 104, 28, 70, 82, 92, 163, 54, 1, 66, 179, 220, 216, 6, 43, 14, 24, 70, 91, 112, 24, 32, 0, 188, 60, 70, 144, 70,
+ 153, 70, 162, 70, 171, 188, 240, 188, 2, 71, 8, 32, 0, 231, 242, 19, 112, 128, 28, 181, 0, 75, 12, 28, 1, 120, 27, 43,
+ 1, 208, 2, 32, 0, 188, 2, 71, 8, 40, 0, 208, 11, 74, 8, 72, 8, 120, 19, 51, 4, 0, 155, 88, 195, 96, 11, 120, 19, 51,
+ 20, 0, 155, 88, 192, 231, 239, 72, 3, 74, 1, 231, 247, 19, 112, 129, 85, 19, 112, 129, 84, 19, 114, 73, 152, 181, 48,
+ 76, 18, 75, 18, 176, 131, 96, 35, 240, 2, 252, 95, 40, 0, 218, 5, 32, 1, 66, 64, 176, 3, 188, 48, 188, 2, 71, 8, 72,
+ 13, 33, 1, 247, 255, 250, 201, 28, 5, 40, 0, 219, 242, 35, 0, 73, 10, 34, 0, 147, 0, 247, 255, 250, 152, 96, 32, 28,
+ 40, 247, 255, 250, 184, 104, 33, 34, 1, 35, 84, 84, 202, 32, 0, 231, 228, 19, 112, 128, 28, 19, 114, 74, 60, 19, 112,
+ 128, 160, 77, 76, 68, 160, 181, 240, 70, 95, 70, 86, 70, 77, 70, 68, 180, 240, 124, 130, 124, 199, 125, 6, 6, 19, 70,
+ 148, 125, 68, 4, 58, 67, 26, 2, 51, 67, 19, 28, 33, 176, 129, 70, 128, 67, 25, 208, 121, 124, 67, 70, 154, 43, 0, 208,
+ 114, 34, 0, 70, 147, 70, 145, 70, 75, 24, 205, 122, 107, 122, 170, 6, 27, 4, 18, 67, 26, 122, 235, 2, 27, 67, 19, 123,
+ 42, 28, 16, 67, 24, 208, 82, 121, 43, 43, 0, 208, 58, 39, 0, 38, 0, 224, 10, 122, 107, 122, 170, 6, 27, 4, 18, 67, 26,
+ 122, 235, 2, 27, 67, 19, 123, 42, 28, 16, 67, 24, 25, 132, 123, 163, 123, 226, 6, 27, 4, 18, 67, 26, 124, 35, 2, 27,
+ 67, 19, 124, 98, 28, 16, 67, 24, 208, 1, 240, 2, 251, 154, 122, 99, 122, 162, 6, 27, 4, 18, 67, 26, 122, 227, 2, 27,
+ 67, 19, 123, 34, 28, 16, 67, 24, 208, 1, 240, 2, 251, 140, 121, 43, 55, 1, 54, 18, 66, 187, 220, 210, 122, 107, 122,
+ 170, 6, 27, 4, 18, 67, 26, 122, 235, 2, 27, 67, 19, 123, 42, 28, 16, 67, 24, 240, 2, 251, 122, 70, 66, 124, 82, 70,
+ 67, 70, 146, 70, 66, 124, 155, 124, 215, 70, 156, 4, 58, 6, 27, 67, 26, 70, 67, 125, 30, 2, 51, 67, 19, 70, 66, 125,
+ 84, 28, 33, 67, 25, 35, 1, 34, 13, 68, 155, 68, 145, 69, 218, 221, 8, 70, 98, 6, 19, 4, 58, 67, 26, 2, 51, 67, 19, 28,
+ 33, 67, 25, 231, 143, 28, 8, 240, 2, 251, 85, 176, 1, 188, 60, 70, 144, 70, 153, 70, 162, 70, 171, 188, 240, 188, 1,
+ 71, 0, 181, 48, 75, 15, 176, 129, 104, 25, 108, 10, 28, 19, 51, 8, 0, 155, 88, 92, 50, 1, 100, 10, 28, 32, 240, 2, 251,
+ 60, 33, 0, 28, 5, 34, 96, 28, 32, 240, 3, 251, 218, 35, 64, 96, 163, 35, 128, 4, 91, 176, 1, 99, 101, 28, 32, 96, 35,
+ 96, 99, 188, 48, 188, 2, 71, 8, 19, 112, 128, 28, 181, 48, 77, 16, 176, 129, 104, 43, 43, 0, 209, 3, 176, 1, 188, 48,
+ 188, 1, 71, 0, 76, 12, 35, 160, 88, 224, 40, 0, 208, 1, 240, 2, 251, 25, 34, 164, 33, 0, 28, 32, 240, 3, 251, 182, 72,
+ 7, 33, 0, 247, 255, 250, 42, 74, 6, 35, 0, 112, 19, 74, 6, 96, 43, 96, 19, 231, 228, 70, 192, 19, 112, 129, 80, 19,
+ 114, 73, 152, 19, 112, 128, 172, 19, 112, 129, 85, 19, 112, 129, 76, 181, 240, 70, 95, 70, 86, 70, 77, 70, 68, 180,
+ 240, 74, 204, 176, 137, 146, 3, 104, 17, 70, 129, 108, 10, 28, 19, 51, 8, 0, 155, 88, 91, 50, 1, 100, 10, 28, 24, 70,
+ 152, 240, 2, 250, 230, 34, 96, 28, 4, 33, 0, 70, 64, 240, 3, 251, 132, 70, 67, 99, 92, 70, 66, 35, 64, 96, 147, 35,
+ 128, 4, 91, 96, 19, 96, 83, 70, 75, 99, 211, 70, 74, 35, 0, 97, 83, 105, 19, 147, 4, 126, 82, 70, 75, 146, 6, 126, 24,
+ 40, 0, 209, 0, 224, 176, 34, 128, 35, 192, 70, 70, 70, 147, 0, 91, 70, 74, 104, 215, 154, 6, 42, 0, 208, 0, 70, 155,
+ 70, 75, 105, 218, 75, 176, 37, 255, 64, 19, 147, 5, 34, 255, 59, 1, 147, 2, 2, 19, 34, 128, 1, 82, 70, 154, 4, 45, 146,
+ 1, 155, 4, 14, 58, 70, 156, 6, 59, 67, 26, 70, 83, 64, 59, 2, 27, 67, 26, 28, 59, 64, 43, 10, 27, 67, 26, 96, 242, 34,
+ 0, 98, 50, 75, 163, 154, 1, 64, 59, 26, 208, 155, 4, 66, 131, 211, 0, 224, 213, 34, 0, 28, 28, 146, 4, 70, 91, 4, 34,
+ 67, 26, 6, 19, 14, 17, 67, 25, 70, 83, 64, 19, 2, 27, 64, 42, 67, 25, 10, 18, 67, 17, 70, 98, 96, 177, 100, 50, 155,
+ 6, 43, 0, 208, 4, 154, 3, 104, 19, 105, 219, 105, 91, 96, 115, 154, 2, 25, 19, 154, 5, 66, 19, 209, 1, 75, 144, 68,
+ 155, 154, 4, 42, 0, 221, 0, 224, 230, 39, 128, 4, 127, 150, 7, 70, 74, 96, 119, 105, 19, 43, 0, 208, 65, 126, 19, 70,
+ 154, 43, 0, 209, 61, 154, 3, 35, 128, 104, 17, 0, 91, 70, 93, 108, 10, 64, 93, 75, 131, 67, 29, 28, 19, 51, 8, 0, 155,
+ 88, 94, 50, 1, 100, 10, 28, 48, 240, 2, 250, 83, 33, 0, 28, 4, 34, 96, 28, 48, 240, 3, 250, 241, 70, 75, 99, 243, 14,
+ 34, 6, 35, 32, 255, 67, 26, 2, 0, 28, 35, 33, 255, 4, 9, 64, 3, 99, 116, 96, 55, 2, 27, 96, 119, 64, 12, 67, 26, 10,
+ 36, 155, 7, 67, 34, 96, 26, 70, 82, 99, 158, 96, 242, 6, 43, 98, 50, 14, 42, 67, 26, 28, 43, 64, 3, 2, 27, 64, 13, 67,
+ 26, 10, 45, 67, 42, 70, 83, 96, 178, 100, 51, 104, 179, 34, 128, 4, 18, 67, 19, 176, 9, 70, 64, 96, 179, 188, 60, 70,
+ 144, 70, 153, 70, 162, 70, 171, 188, 240, 188, 2, 71, 8, 70, 75, 104, 89, 37, 255, 6, 11, 14, 10, 67, 26, 2, 45, 28,
+ 11, 64, 43, 2, 27, 36, 255, 67, 26, 4, 36, 28, 11, 64, 35, 10, 27, 67, 26, 70, 67, 96, 218, 98, 24, 75, 85, 28, 10,
+ 64, 26, 35, 128, 1, 91, 26, 155, 43, 8, 216, 0, 224, 132, 75, 83, 70, 66, 96, 147, 35, 8, 100, 19, 155, 3, 104, 25,
+ 108, 10, 28, 19, 51, 8, 0, 155, 88, 94, 50, 1, 100, 10, 28, 48, 240, 2, 249, 234, 34, 96, 28, 4, 33, 0, 28, 48, 240,
+ 3, 250, 136, 35, 64, 96, 179, 35, 128, 4, 91, 70, 74, 96, 51, 96, 115, 99, 242, 6, 35, 14, 34, 67, 26, 35, 255, 2, 27,
+ 64, 35, 2, 27, 67, 26, 35, 255, 4, 27, 99, 116, 64, 28, 10, 36, 67, 34, 70, 67, 96, 26, 99, 158, 154, 4, 42, 0, 209,
+ 2, 75, 58, 70, 155, 231, 0, 74, 58, 75, 56, 70, 147, 230, 252, 28, 4, 66, 163, 217, 92, 35, 128, 1, 91, 24, 250, 75,
+ 54, 28, 17, 34, 1, 64, 25, 28, 48, 70, 148, 6, 11, 14, 10, 67, 26, 70, 83, 64, 11, 2, 27, 67, 26, 28, 11, 64, 43, 10,
+ 27, 67, 26, 35, 0, 97, 2, 98, 67, 34, 128, 1, 82, 155, 4, 24, 164, 24, 137, 66, 163, 216, 5, 28, 28, 155, 4, 70, 164,
+ 27, 27, 147, 4, 231, 5, 34, 1, 68, 148, 70, 99, 48, 4, 43, 4, 221, 222, 28, 32, 153, 5, 240, 3, 249, 186, 154, 4, 26,
+ 100, 27, 18, 70, 164, 146, 4, 230, 245, 68, 103, 247, 255, 254, 61, 107, 66, 70, 75, 14, 17, 99, 195, 6, 19, 67, 25,
+ 70, 83, 64, 19, 2, 27, 64, 42, 67, 25, 10, 18, 67, 17, 96, 49, 99, 176, 28, 6, 230, 198, 43, 8, 209, 0, 231, 119, 34,
+ 128, 1, 82, 75, 17, 24, 137, 64, 25, 28, 10, 28, 11, 64, 42, 64, 35, 10, 27, 2, 18, 67, 26, 14, 9, 70, 67, 67, 10, 97,
+ 26, 98, 88, 231, 101, 154, 4, 66, 162, 209, 201, 231, 189, 70, 192, 19, 112, 128, 28, 0, 0, 7, 255, 0, 0, 15, 255, 128,
+ 0, 0, 0, 128, 2, 8, 0, 128, 0, 1, 128, 128, 0, 0, 128, 255, 255, 240, 0, 181, 240, 70, 95, 70, 86, 70, 77, 70, 68, 180,
+ 240, 176, 133, 144, 3, 145, 2, 126, 11, 43, 0, 209, 0, 226, 33, 154, 2, 105, 17, 41, 0, 208, 8, 126, 83, 43, 0, 209,
+ 0, 226, 19, 104, 144, 240, 2, 249, 130, 155, 2, 96, 216, 72, 227, 34, 0, 104, 3, 70, 129, 105, 219, 70, 154, 195, 4,
+ 51, 4, 70, 81, 96, 74, 195, 4, 195, 4, 195, 4, 195, 4, 195, 4, 195, 4, 195, 4, 195, 4, 195, 4, 96, 26, 152, 2, 247,
+ 255, 254, 31, 70, 82, 100, 144, 155, 2, 158, 3, 126, 25, 105, 220, 34, 128, 105, 179, 1, 146, 67, 26, 35, 15, 64, 11,
+ 28, 5, 2, 27, 28, 16, 67, 24, 41, 0, 208, 0, 225, 205, 75, 207, 28, 1, 67, 25, 6, 11, 14, 10, 36, 255, 2, 36, 67, 26,
+ 28, 11, 64, 35, 2, 27, 32, 255, 4, 0, 67, 26, 28, 11, 64, 3, 10, 27, 70, 81, 67, 26, 96, 74, 108, 74, 35, 64, 96, 139,
+ 28, 17, 28, 19, 64, 3, 64, 33, 10, 27, 2, 9, 67, 25, 14, 19, 67, 25, 35, 224, 64, 26, 35, 2, 67, 26, 6, 18, 67, 17,
+ 70, 82, 96, 17, 107, 106, 70, 86, 6, 19, 14, 17, 67, 25, 28, 19, 64, 35, 2, 27, 64, 2, 67, 25, 10, 18, 67, 17, 70, 83,
+ 97, 25, 35, 128, 4, 91, 97, 115, 152, 2, 126, 2, 42, 0, 208, 0, 225, 125, 70, 81, 105, 138, 75, 176, 70, 78, 64, 19,
+ 70, 82, 97, 147, 104, 51, 70, 80, 105, 155, 108, 89, 35, 255, 2, 27, 28, 10, 64, 26, 35, 255, 4, 27, 64, 11, 10, 27,
+ 2, 18, 67, 26, 14, 11, 67, 26, 35, 224, 64, 25, 35, 2, 67, 25, 6, 9, 67, 10, 96, 2, 33, 96, 240, 2, 248, 231, 70, 81,
+ 108, 140, 44, 0, 208, 6, 28, 32, 33, 96, 240, 2, 248, 223, 107, 164, 44, 0, 209, 248, 70, 78, 104, 51, 70, 82, 108,
+ 81, 105, 152, 35, 255, 2, 27, 28, 10, 64, 26, 35, 255, 4, 27, 64, 11, 10, 27, 2, 18, 67, 26, 14, 11, 67, 26, 35, 224,
+ 64, 25, 35, 2, 67, 25, 6, 9, 67, 10, 96, 2, 104, 51, 33, 96, 105, 152, 240, 2, 248, 191, 104, 51, 152, 3, 104, 154,
+ 75, 140, 33, 2, 104, 28, 105, 195, 29, 23, 51, 16, 0, 155, 24, 211, 51, 4, 70, 152, 70, 139, 32, 100, 247, 255, 251,
+ 56, 70, 73, 104, 14, 70, 67, 104, 26, 104, 179, 104, 56, 29, 29, 104, 91, 33, 55, 64, 25, 75, 129, 64, 26, 42, 1, 208,
+ 0, 225, 84, 70, 91, 66, 25, 208, 0, 225, 93, 7, 195, 213, 0, 225, 99, 60, 100, 44, 0, 220, 227, 96, 41, 70, 73, 104,
+ 11, 104, 155, 104, 27, 75, 120, 96, 26, 34, 1, 66, 83, 70, 155, 70, 78, 104, 51, 33, 96, 105, 155, 108, 88, 240, 2,
+ 248, 108, 70, 81, 108, 72, 33, 96, 240, 2, 248, 103, 70, 82, 108, 148, 44, 0, 208, 6, 107, 96, 33, 96, 240, 2, 248,
+ 95, 107, 164, 44, 0, 209, 248, 70, 78, 104, 51, 105, 152, 35, 255, 108, 65, 2, 27, 28, 10, 64, 26, 35, 255, 4, 27, 64,
+ 11, 10, 27, 2, 18, 67, 26, 14, 11, 67, 26, 35, 224, 64, 25, 35, 2, 67, 25, 6, 9, 67, 10, 96, 2, 104, 51, 33, 96, 105,
+ 152, 240, 2, 248, 88, 104, 51, 33, 96, 105, 155, 108, 88, 240, 2, 248, 58, 152, 2, 126, 2, 42, 0, 208, 23, 153, 3, 35,
+ 15, 106, 72, 28, 17, 64, 25, 6, 19, 43, 0, 218, 0, 224, 248, 34, 1, 28, 19, 64, 139, 28, 4, 70, 86, 67, 156, 105, 179,
+ 9, 219, 28, 24, 64, 16, 28, 3, 64, 139, 152, 3, 67, 35, 98, 67, 70, 89, 41, 0, 209, 53, 70, 74, 104, 19, 158, 3, 104,
+ 154, 105, 155, 28, 23, 108, 91, 55, 24, 70, 154, 105, 243, 36, 0, 51, 16, 0, 155, 24, 211, 51, 4, 70, 152, 32, 100,
+ 247, 255, 250, 170, 70, 73, 104, 14, 70, 64, 104, 179, 104, 2, 29, 29, 104, 56, 104, 91, 33, 55, 64, 25, 75, 58, 64,
+ 26, 42, 1, 208, 0, 224, 228, 35, 2, 66, 25, 208, 0, 224, 234, 69, 130, 209, 0, 224, 240, 52, 1, 44, 200, 209, 227, 96,
+ 41, 70, 78, 104, 51, 104, 155, 104, 27, 75, 49, 96, 26, 32, 1, 66, 65, 70, 139, 70, 74, 104, 19, 105, 219, 108, 156,
+ 44, 0, 208, 59, 35, 255, 72, 44, 39, 255, 4, 27, 38, 3, 33, 64, 37, 0, 2, 63, 147, 1, 70, 176, 70, 132, 70, 138, 104,
+ 162, 70, 70, 6, 19, 14, 17, 67, 25, 28, 19, 64, 59, 2, 27, 67, 25, 155, 1, 28, 8, 64, 26, 10, 18, 67, 16, 10, 3, 64,
+ 51, 43, 2, 208, 8, 107, 225, 108, 34, 105, 75, 70, 102, 24, 210, 12, 3, 64, 51, 26, 210, 97, 74, 108, 35, 43, 0, 209,
+ 3, 35, 255, 64, 3, 43, 64, 208, 4, 70, 81, 66, 8, 208, 1, 37, 1, 66, 109, 107, 164, 44, 0, 209, 213, 45, 0, 208, 3,
+ 107, 226, 35, 1, 66, 91, 97, 83, 70, 75, 104, 26, 35, 0, 100, 19, 158, 2, 105, 49, 41, 0, 208, 6, 126, 115, 43, 0, 208,
+ 65, 104, 240, 240, 1, 255, 165, 158, 2, 126, 51, 43, 0, 208, 66, 224, 13, 19, 112, 128, 28, 64, 64, 64, 0, 1, 0, 0,
+ 128, 19, 112, 128, 32, 0, 0, 32, 1, 19, 112, 129, 76, 0, 0, 127, 255, 70, 88, 40, 0, 209, 2, 153, 2, 105, 73, 70, 139,
+ 176, 5, 70, 88, 188, 60, 70, 144, 70, 153, 70, 162, 70, 171, 188, 240, 188, 2, 71, 8, 155, 3, 106, 88, 6, 19, 43, 0,
+ 219, 54, 33, 0, 35, 15, 64, 19, 24, 203, 64, 216, 7, 198, 213, 41, 70, 80, 105, 130, 35, 128, 67, 26, 97, 130, 230,
+ 113, 75, 50, 28, 34, 64, 26, 35, 128, 4, 18, 5, 219, 67, 26, 28, 17, 67, 1, 230, 42, 154, 2, 104, 208, 240, 1, 255,
+ 90, 158, 2, 126, 51, 43, 0, 209, 203, 104, 112, 33, 8, 240, 1, 255, 90, 231, 198, 158, 2, 104, 176, 240, 1, 255, 101,
+ 96, 240, 229, 234, 104, 8, 33, 8, 240, 1, 255, 103, 153, 2, 96, 72, 229, 214, 70, 81, 105, 138, 35, 128, 67, 154, 97,
+ 138, 230, 71, 33, 16, 231, 199, 49, 16, 231, 4, 74, 28, 35, 1, 96, 19, 104, 179, 70, 78, 96, 89, 104, 51, 32, 1, 104,
+ 155, 66, 65, 104, 27, 70, 139, 230, 177, 96, 41, 70, 78, 104, 51, 32, 2, 104, 155, 66, 65, 104, 27, 70, 139, 230, 168,
+ 96, 41, 70, 78, 104, 51, 32, 0, 104, 155, 70, 131, 104, 27, 230, 160, 74, 13, 35, 1, 96, 19, 104, 179, 70, 78, 96, 89,
+ 104, 51, 104, 155, 104, 27, 231, 33, 96, 41, 70, 78, 104, 51, 32, 2, 104, 155, 66, 65, 104, 27, 70, 139, 231, 27, 96,
+ 41, 70, 74, 104, 19, 104, 155, 104, 27, 231, 21, 70, 192, 0, 0, 7, 255, 19, 112, 129, 76, 181, 48, 176, 137, 70, 109,
+ 118, 41, 9, 201, 118, 105, 33, 128, 0, 137, 145, 7, 36, 0, 70, 105, 148, 0, 146, 4, 147, 2, 247, 255, 253, 116, 176,
+ 9, 188, 48, 188, 2, 71, 8, 181, 240, 70, 71, 180, 128, 176, 136, 70, 128, 70, 104, 48, 58, 136, 5, 48, 4, 136, 6, 72,
+ 40, 4, 45, 104, 4, 32, 248, 88, 32, 4, 54, 112, 66, 2, 26, 10, 27, 67, 26, 4, 18, 12, 19, 112, 195, 10, 43, 14, 45,
+ 67, 43, 14, 18, 4, 27, 112, 130, 12, 55, 12, 26, 14, 27, 113, 3, 14, 54, 2, 59, 67, 51, 4, 27, 113, 66, 14, 26, 12,
+ 27, 112, 1, 113, 195, 70, 108, 35, 0, 9, 201, 113, 130, 118, 35, 118, 97, 35, 64, 144, 0, 147, 7, 152, 16, 75, 20, 151,
+ 4, 66, 152, 216, 12, 96, 160, 70, 105, 70, 64, 247, 255, 253, 51, 28, 5, 176, 8, 28, 40, 188, 4, 70, 144, 188, 240,
+ 188, 2, 71, 8, 28, 56, 240, 1, 254, 130, 28, 58, 153, 16, 144, 2, 240, 2, 254, 207, 70, 105, 70, 64, 247, 255, 253,
+ 31, 153, 2, 28, 5, 28, 58, 152, 16, 240, 2, 254, 197, 152, 2, 240, 1, 254, 100, 231, 226, 70, 192, 19, 112, 128, 28,
+ 19, 136, 0, 0, 181, 0, 176, 133, 42, 0, 209, 4, 32, 3, 66, 64, 176, 5, 188, 2, 71, 8, 28, 19, 34, 0, 145, 0, 146, 1,
+ 146, 2, 33, 1, 34, 11, 247, 255, 255, 142, 231, 242, 70, 192, 181, 0, 176, 133, 34, 0, 146, 0, 146, 1, 146, 2, 28, 11,
+ 34, 9, 33, 0, 247, 255, 255, 129, 176, 5, 188, 2, 71, 8, 181, 16, 176, 132, 28, 20, 70, 106, 50, 27, 120, 18, 2, 36,
+ 67, 28, 35, 0, 147, 0, 146, 1, 145, 2, 34, 6, 33, 128, 28, 35, 247, 255, 255, 109, 176, 4, 188, 16, 188, 2, 71, 8, 70,
+ 192, 181, 240, 70, 95, 70, 86, 70, 77, 70, 68, 180, 240, 176, 137, 144, 6, 72, 160, 155, 6, 104, 1, 51, 16, 145, 7,
+ 104, 138, 0, 155, 24, 213, 154, 6, 70, 128, 152, 6, 0, 146, 104, 105, 24, 19, 146, 5, 154, 7, 0, 219, 24, 211, 34, 0,
+ 103, 26, 75, 151, 64, 25, 70, 155, 41, 1, 208, 0, 224, 227, 75, 149, 32, 100, 96, 107, 247, 255, 248, 239, 75, 148,
+ 32, 100, 96, 107, 247, 255, 248, 234, 75, 146, 32, 100, 96, 107, 247, 255, 248, 187, 70, 64, 104, 4, 104, 106, 104,
+ 163, 104, 105, 29, 31, 104, 91, 32, 55, 70, 129, 64, 24, 70, 91, 64, 26, 42, 1, 208, 0, 224, 203, 34, 2, 70, 146, 66,
+ 16, 208, 0, 224, 184, 38, 128, 0, 118, 66, 49, 209, 0, 224, 205, 32, 100, 247, 255, 248, 159, 70, 67, 104, 28, 104,
+ 106, 104, 163, 104, 105, 29, 31, 104, 91, 70, 72, 64, 24, 70, 91, 64, 26, 42, 1, 208, 0, 224, 176, 70, 82, 66, 16, 208,
+ 0, 224, 158, 66, 49, 209, 0, 224, 181, 32, 100, 247, 255, 248, 135, 70, 67, 104, 28, 104, 106, 104, 163, 104, 105, 29,
+ 31, 104, 91, 70, 72, 64, 24, 70, 91, 64, 26, 42, 1, 208, 0, 224, 152, 70, 82, 66, 16, 208, 0, 224, 134, 66, 49, 209,
+ 0, 224, 157, 32, 100, 247, 255, 248, 111, 70, 67, 104, 28, 104, 106, 104, 163, 104, 105, 29, 31, 104, 91, 32, 55, 70,
+ 131, 64, 24, 75, 98, 64, 26, 70, 153, 42, 1, 208, 0, 224, 126, 34, 2, 66, 16, 209, 109, 38, 128, 0, 118, 66, 49, 209,
+ 0, 224, 130, 32, 100, 247, 255, 248, 84, 70, 67, 104, 28, 104, 106, 104, 163, 104, 105, 29, 31, 104, 91, 70, 88, 64,
+ 24, 70, 75, 64, 26, 42, 1, 209, 102, 70, 82, 66, 16, 209, 85, 66, 49, 208, 109, 32, 100, 247, 255, 248, 63, 70, 67,
+ 104, 28, 104, 106, 104, 163, 104, 105, 29, 31, 104, 91, 70, 88, 64, 24, 70, 75, 64, 26, 42, 1, 209, 81, 70, 82, 66,
+ 16, 209, 64, 66, 49, 208, 88, 32, 100, 247, 255, 248, 42, 70, 67, 104, 28, 104, 106, 104, 163, 104, 105, 29, 31, 104,
+ 91, 70, 88, 64, 24, 70, 75, 64, 26, 42, 1, 209, 60, 34, 2, 66, 16, 209, 43, 38, 128, 0, 118, 66, 49, 208, 65, 32, 100,
+ 247, 255, 248, 19, 70, 67, 104, 28, 104, 105, 104, 163, 104, 109, 104, 90, 29, 31, 28, 16, 35, 55, 64, 24, 70, 75, 64,
+ 25, 41, 1, 209, 36, 70, 82, 66, 16, 209, 19, 66, 53, 208, 43, 96, 56, 70, 64, 104, 3, 32, 1, 104, 155, 66, 64, 104,
+ 27, 75, 48, 96, 25, 176, 9, 188, 60, 70, 144, 70, 153, 70, 162, 70, 171, 188, 240, 188, 2, 71, 8, 96, 56, 70, 64, 104,
+ 3, 32, 2, 104, 155, 66, 64, 104, 27, 231, 238, 35, 128, 1, 155, 32, 1, 96, 107, 66, 64, 231, 232, 74, 35, 35, 1, 96,
+ 19, 104, 163, 96, 88, 70, 64, 104, 3, 32, 1, 104, 155, 66, 64, 104, 27, 231, 220, 153, 5, 154, 6, 37, 0, 24, 139, 0,
+ 219, 153, 7, 70, 66, 96, 56, 70, 154, 51, 88, 24, 204, 104, 19, 32, 100, 104, 155, 104, 27, 247, 254, 255, 237, 35,
+ 22, 147, 1, 35, 128, 28, 32, 33, 128, 34, 6, 0, 91, 149, 0, 148, 2, 247, 255, 254, 52, 40, 0, 219, 190, 158, 6, 28,
+ 32, 54, 1, 4, 51, 12, 27, 33, 0, 34, 5, 149, 0, 149, 1, 149, 2, 247, 255, 254, 38, 40, 0, 219, 176, 155, 7, 68, 83,
+ 103, 221, 103, 30, 231, 171, 70, 192, 19, 112, 128, 28, 0, 0, 32, 1, 0, 0, 24, 3, 0, 0, 25, 3, 0, 0, 16, 1, 19, 112,
+ 129, 76, 181, 112, 77, 12, 35, 84, 104, 42, 92, 211, 43, 0, 208, 14, 36, 0, 38, 84, 0, 163, 25, 27, 0, 219, 24, 211,
+ 103, 92, 28, 32, 247, 255, 254, 153, 104, 42, 52, 1, 93, 147, 66, 163, 220, 242, 32, 0, 188, 112, 188, 2, 71, 8, 19,
+ 112, 128, 28, 181, 240, 70, 95, 70, 86, 70, 77, 70, 68, 180, 240, 75, 81, 39, 0, 34, 144, 176, 133, 28, 4, 70, 146,
+ 70, 185, 70, 155, 224, 98, 70, 82, 88, 162, 32, 1, 70, 144, 240, 1, 252, 171, 28, 6, 40, 0, 208, 83, 70, 75, 147, 0,
+ 35, 1, 147, 1, 144, 2, 33, 128, 70, 64, 34, 8, 35, 0, 247, 255, 253, 211, 40, 0, 219, 108, 120, 50, 28, 48, 70, 144,
+ 240, 1, 252, 138, 120, 35, 69, 67, 208, 11, 70, 82, 88, 160, 70, 74, 146, 0, 146, 1, 146, 2, 33, 0, 34, 9, 247, 255,
+ 253, 191, 40, 0, 219, 50, 104, 163, 43, 0, 209, 89, 70, 83, 88, 224, 136, 227, 70, 74, 147, 0, 146, 1, 146, 2, 33, 33,
+ 34, 255, 35, 0, 247, 255, 253, 174, 28, 5, 40, 0, 219, 67, 32, 10, 247, 254, 255, 86, 70, 83, 88, 224, 123, 35, 70,
+ 74, 147, 0, 146, 1, 146, 2, 33, 2, 34, 1, 35, 0, 247, 255, 253, 156, 28, 5, 40, 0, 219, 14, 70, 83, 88, 224, 123, 99,
+ 70, 74, 147, 0, 146, 1, 146, 2, 33, 2, 34, 1, 35, 0, 247, 255, 253, 141, 28, 5, 40, 0, 218, 24, 47, 20, 208, 22, 32,
+ 100, 247, 254, 255, 51, 55, 1, 47, 0, 208, 199, 70, 82, 88, 163, 105, 216, 247, 255, 254, 21, 28, 5, 32, 10, 247, 254,
+ 255, 39, 28, 107, 208, 5, 45, 0, 218, 141, 69, 93, 208, 139, 47, 20, 209, 232, 176, 5, 28, 40, 188, 60, 70, 144, 70,
+ 153, 70, 162, 70, 171, 188, 240, 188, 2, 71, 8, 69, 88, 209, 218, 231, 184, 28, 48, 240, 1, 252, 31, 231, 213, 6, 27,
+ 70, 82, 14, 27, 88, 160, 104, 98, 43, 0, 208, 206, 6, 18, 14, 18, 146, 0, 70, 74, 146, 1, 146, 2, 33, 1, 34, 11, 247,
+ 255, 253, 79, 40, 0, 218, 146, 231, 193, 255, 255, 228, 164, 181, 0, 176, 129, 33, 0, 247, 255, 255, 79, 176, 1, 188,
+ 2, 71, 8, 181, 240, 70, 95, 70, 86, 70, 77, 70, 68, 180, 240, 176, 143, 28, 30, 70, 107, 51, 103, 120, 27, 145, 2, 147,
+ 1, 70, 107, 51, 107, 120, 27, 33, 128, 147, 0, 155, 1, 37, 0, 59, 1, 6, 27, 28, 7, 70, 146, 14, 27, 32, 11, 0, 138,
+ 147, 4, 70, 131, 149, 5, 149, 3, 70, 145, 45, 0, 209, 54, 70, 91, 59, 1, 6, 27, 152, 0, 14, 27, 70, 155, 40, 0, 208,
+ 61, 153, 4, 41, 15, 217, 79, 37, 3, 66, 109, 70, 88, 6, 4, 152, 5, 34, 1, 70, 128, 44, 0, 221, 1, 42, 0, 209, 26, 44,
+ 0, 220, 0, 225, 211, 28, 169, 208, 1, 42, 0, 209, 49, 155, 27, 43, 0, 208, 1, 70, 64, 112, 24, 153, 28, 41, 0, 208,
+ 1, 154, 3, 96, 10, 176, 15, 28, 40, 188, 60, 70, 144, 70, 153, 70, 162, 70, 171, 188, 240, 188, 2, 71, 8, 28, 107, 208,
+ 35, 70, 64, 144, 5, 45, 0, 208, 200, 70, 88, 6, 4, 22, 35, 15, 217, 34, 9, 37, 0, 66, 154, 65, 105, 28, 56, 247, 255,
+ 254, 232, 28, 5, 40, 0, 219, 201, 231, 185, 153, 4, 41, 15, 216, 0, 224, 177, 37, 3, 66, 109, 70, 90, 6, 20, 231, 191,
+ 28, 56, 33, 0, 247, 255, 254, 215, 28, 130, 209, 199, 28, 5, 231, 197, 74, 209, 35, 1, 96, 19, 231, 203, 34, 160, 88,
+ 184, 70, 144, 40, 0, 208, 170, 33, 0, 34, 31, 240, 2, 252, 28, 70, 67, 88, 250, 75, 202, 70, 64, 96, 19, 35, 152, 88,
+ 250, 36, 255, 6, 19, 14, 17, 88, 61, 67, 25, 2, 36, 28, 19, 32, 255, 4, 0, 64, 35, 2, 27, 64, 2, 67, 25, 10, 18, 67,
+ 17, 96, 105, 70, 66, 88, 185, 6, 51, 14, 50, 67, 26, 28, 51, 64, 35, 2, 27, 67, 26, 28, 51, 64, 3, 10, 27, 67, 26, 96,
+ 138, 70, 69, 89, 123, 32, 0, 115, 24, 70, 105, 34, 11, 89, 123, 92, 81, 115, 89, 35, 156, 92, 251, 43, 0, 209, 0, 224,
+ 236, 89, 122, 35, 12, 115, 147, 36, 160, 89, 56, 153, 24, 154, 1, 48, 15, 240, 2, 251, 155, 33, 144, 88, 120, 89, 59,
+ 123, 121, 34, 31, 247, 255, 252, 100, 28, 5, 40, 31, 208, 0, 225, 18, 46, 0, 209, 0, 224, 234, 4, 51, 12, 27, 172, 6,
+ 70, 152, 123, 123, 37, 144, 89, 120, 118, 35, 9, 219, 33, 0, 118, 99, 70, 74, 70, 67, 70, 85, 96, 33, 96, 165, 97, 226,
+ 97, 35, 28, 33, 247, 255, 249, 204, 28, 5, 28, 104, 209, 0, 224, 206, 45, 0, 218, 0, 224, 193, 66, 181, 208, 0, 224,
+ 189, 68, 178, 28, 51, 70, 180, 45, 0, 218, 0, 225, 16, 38, 0, 34, 160, 70, 144, 88, 184, 33, 255, 34, 13, 240, 2, 251,
+ 164, 123, 59, 70, 69, 33, 144, 89, 122, 88, 120, 118, 35, 9, 219, 37, 0, 118, 99, 70, 73, 35, 13, 96, 37, 97, 225, 97,
+ 35, 96, 162, 28, 33, 247, 255, 249, 162, 28, 5, 40, 0, 218, 0, 231, 89, 40, 13, 209, 0, 224, 166, 155, 5, 77, 131, 70,
+ 152, 70, 91, 34, 1, 6, 28, 231, 21, 34, 160, 88, 184, 70, 144, 40, 0, 209, 0, 231, 71, 33, 0, 34, 31, 240, 2, 251, 122,
+ 70, 67, 88, 250, 75, 121, 70, 64, 96, 19, 35, 152, 88, 250, 36, 255, 6, 19, 14, 17, 88, 61, 67, 25, 2, 36, 28, 19, 32,
+ 255, 4, 0, 64, 35, 2, 27, 64, 2, 67, 25, 10, 18, 67, 17, 96, 105, 70, 66, 88, 185, 6, 51, 14, 50, 67, 26, 28, 51, 64,
+ 35, 2, 27, 67, 26, 28, 51, 64, 3, 10, 27, 67, 26, 96, 138, 70, 67, 88, 250, 35, 128, 66, 91, 115, 19, 70, 69, 70, 104,
+ 33, 11, 89, 123, 92, 8, 115, 88, 35, 156, 92, 251, 43, 0, 208, 65, 89, 122, 35, 12, 115, 147, 36, 160, 89, 56, 153,
+ 24, 154, 1, 37, 144, 48, 15, 240, 2, 250, 247, 89, 120, 123, 121, 89, 59, 34, 31, 247, 255, 251, 193, 28, 5, 40, 31,
+ 209, 68, 46, 0, 208, 73, 172, 6, 224, 4, 37, 1, 28, 30, 66, 109, 46, 0, 208, 27, 123, 59, 33, 144, 88, 120, 118, 35,
+ 9, 219, 118, 99, 70, 75, 97, 227, 4, 51, 34, 0, 12, 27, 70, 85, 96, 165, 96, 34, 97, 35, 28, 33, 247, 255, 249, 39,
+ 28, 5, 40, 0, 219, 232, 26, 51, 68, 130, 66, 174, 209, 225, 28, 30, 46, 0, 209, 227, 45, 0, 219, 0, 231, 94, 152, 5,
+ 70, 89, 15, 234, 70, 128, 6, 12, 230, 149, 155, 1, 70, 65, 88, 122, 43, 6, 216, 55, 35, 6, 115, 147, 231, 184, 157,
+ 1, 70, 67, 88, 250, 45, 6, 216, 50, 35, 6, 115, 147, 231, 13, 77, 57, 46, 0, 208, 0, 231, 34, 28, 43, 70, 172, 231,
+ 61, 40, 0, 218, 0, 230, 118, 77, 53, 70, 89, 6, 12, 230, 116, 172, 6, 231, 56, 70, 69, 89, 123, 36, 255, 104, 26, 104,
+ 152, 104, 93, 123, 27, 14, 17, 70, 152, 6, 19, 67, 25, 70, 132, 28, 19, 2, 36, 32, 255, 64, 35, 4, 0, 2, 27, 64, 2,
+ 67, 25, 10, 18, 75, 41, 67, 17, 66, 153, 208, 16, 153, 5, 77, 39, 70, 136, 231, 62, 35, 16, 115, 147, 231, 128, 35,
+ 16, 115, 147, 230, 218, 40, 0, 218, 0, 230, 137, 70, 91, 77, 31, 6, 28, 230, 72, 6, 43, 14, 42, 67, 26, 28, 43, 64,
+ 35, 2, 27, 67, 26, 28, 43, 64, 3, 10, 27, 28, 17, 67, 25, 70, 99, 14, 26, 6, 27, 67, 26, 70, 99, 64, 35, 2, 27, 67,
+ 26, 70, 99, 64, 3, 10, 27, 67, 26, 146, 3, 34, 152, 88, 187, 66, 153, 208, 18, 77, 18, 231, 18, 15, 218, 155, 5, 70,
+ 88, 70, 101, 70, 152, 38, 0, 6, 4, 230, 36, 42, 0, 209, 0, 230, 40, 74, 4, 35, 1, 37, 1, 96, 19, 66, 109, 230, 48, 28,
+ 75, 80, 187, 37, 0, 230, 34, 19, 112, 129, 76, 85, 83, 66, 67, 255, 255, 216, 237, 255, 255, 216, 233, 255, 255, 216,
+ 238, 83, 66, 83, 85, 255, 255, 216, 236, 255, 255, 216, 235, 181, 240, 70, 87, 70, 78, 70, 69, 180, 224, 176, 140, 70,
+ 129, 32, 18, 70, 136, 240, 1, 249, 213, 70, 109, 34, 47, 68, 106, 38, 0, 53, 31, 28, 7, 70, 146, 112, 22, 28, 40, 33,
+ 0, 34, 16, 240, 2, 250, 94, 47, 0, 208, 32, 35, 1, 112, 46, 147, 1, 147, 2, 70, 83, 147, 3, 70, 72, 70, 65, 34, 0, 35,
+ 0, 149, 0, 150, 4, 247, 255, 253, 172, 28, 4, 40, 0, 219, 3, 70, 82, 120, 19, 43, 0, 209, 14, 28, 56, 240, 1, 249, 162,
+ 176, 12, 28, 32, 188, 28, 70, 144, 70, 153, 70, 162, 188, 240, 188, 2, 71, 8, 36, 4, 66, 100, 231, 243, 35, 3, 70, 66,
+ 112, 43, 1, 83, 112, 107, 33, 0, 35, 18, 34, 18, 28, 56, 113, 43, 113, 110, 240, 2, 250, 43, 35, 6, 147, 1, 70, 72,
+ 70, 65, 28, 58, 35, 18, 149, 0, 150, 2, 150, 3, 150, 4, 247, 255, 253, 125, 28, 4, 40, 0, 219, 212, 120, 187, 34, 15,
+ 64, 19, 70, 82, 112, 19, 59, 2, 6, 27, 14, 27, 43, 2, 216, 202, 76, 0, 231, 200, 255, 255, 216, 239, 181, 240, 70, 95,
+ 70, 86, 70, 77, 70, 68, 180, 240, 176, 149, 144, 11, 72, 91, 145, 10, 144, 8, 120, 3, 146, 9, 43, 1, 208, 9, 32, 0,
+ 176, 21, 188, 60, 70, 144, 70, 153, 70, 162, 70, 171, 188, 240, 188, 2, 71, 8, 4, 11, 12, 27, 147, 15, 74, 82, 75, 83,
+ 33, 0, 145, 14, 146, 7, 70, 153, 152, 7, 70, 74, 120, 0, 28, 7, 55, 4, 0, 187, 144, 12, 88, 209, 152, 15, 28, 11, 67,
+ 67, 32, 128, 2, 0, 66, 131, 216, 111, 153, 15, 70, 139, 28, 10, 42, 0, 208, 216, 152, 12, 153, 9, 7, 67, 14, 27, 70,
+ 108, 0, 191, 157, 11, 147, 13, 28, 22, 70, 138, 52, 69, 151, 6, 28, 55, 69, 94, 217, 0, 70, 95, 4, 58, 12, 19, 32, 79,
+ 70, 152, 68, 104, 35, 0, 112, 3, 32, 40, 35, 55, 112, 32, 68, 107, 120, 27, 33, 0, 112, 99, 14, 43, 112, 163, 12, 43,
+ 112, 227, 14, 18, 10, 43, 70, 64, 113, 161, 114, 97, 113, 35, 113, 101, 113, 226, 114, 32, 70, 73, 123, 139, 154, 12,
+ 66, 147, 217, 168, 155, 6, 72, 46, 88, 26, 42, 0, 208, 163, 32, 79, 33, 10, 68, 104, 70, 67, 67, 83, 34, 0, 145, 1,
+ 146, 2, 144, 3, 146, 4, 72, 39, 153, 12, 70, 82, 148, 0, 247, 255, 252, 241, 40, 0, 221, 40, 33, 79, 68, 105, 120, 11,
+ 43, 0, 208, 0, 231, 139, 70, 65, 26, 115, 4, 27, 153, 6, 12, 30, 70, 75, 88, 90, 46, 0, 208, 4, 28, 19, 67, 123, 25,
+ 237, 68, 154, 231, 176, 40, 0, 218, 0, 231, 122, 155, 11, 152, 10, 154, 14, 24, 27, 147, 11, 35, 128, 50, 1, 0, 155,
+ 146, 14, 66, 154, 209, 130, 32, 1, 231, 110, 240, 2, 248, 97, 154, 15, 70, 131, 231, 141, 40, 0, 218, 218, 28, 130,
+ 209, 230, 154, 8, 35, 0, 112, 19, 70, 73, 35, 160, 88, 200, 40, 0, 208, 1, 240, 1, 248, 184, 33, 0, 34, 164, 70, 72,
+ 240, 2, 249, 85, 72, 6, 33, 0, 247, 253, 255, 201, 32, 0, 231, 80, 70, 192, 19, 112, 129, 85, 19, 112, 129, 84, 19,
+ 114, 73, 152, 19, 112, 128, 172, 181, 240, 70, 95, 70, 86, 70, 77, 70, 68, 180, 240, 176, 141, 144, 5, 32, 22, 70, 137,
+ 240, 1, 248, 164, 28, 4, 144, 11, 40, 0, 209, 0, 226, 13, 35, 0, 147, 0, 35, 18, 147, 1, 35, 128, 144, 2, 33, 128, 152,
+ 5, 34, 6, 0, 91, 247, 255, 249, 201, 144, 6, 40, 0, 219, 0, 224, 142, 152, 11, 240, 1, 248, 128, 70, 74, 70, 73, 124,
+ 137, 124, 215, 6, 11, 4, 58, 67, 26, 70, 75, 70, 140, 125, 30, 70, 73, 125, 76, 2, 51, 67, 19, 28, 33, 67, 25, 209,
+ 0, 225, 222, 70, 74, 124, 82, 70, 144, 42, 0, 209, 0, 225, 230, 35, 0, 70, 155, 70, 154, 70, 82, 24, 141, 122, 107,
+ 122, 170, 6, 27, 4, 18, 67, 26, 122, 235, 2, 27, 67, 19, 123, 42, 28, 16, 67, 24, 208, 82, 121, 43, 43, 0, 208, 58,
+ 39, 0, 38, 0, 224, 10, 122, 107, 122, 170, 6, 27, 4, 18, 67, 26, 122, 235, 2, 27, 67, 19, 123, 42, 28, 16, 67, 24, 25,
+ 132, 123, 163, 123, 226, 6, 27, 4, 18, 67, 26, 124, 35, 2, 27, 67, 19, 124, 98, 28, 16, 67, 24, 208, 1, 240, 1, 248,
+ 55, 122, 99, 122, 162, 6, 27, 4, 18, 67, 26, 122, 227, 2, 27, 67, 19, 123, 34, 28, 16, 67, 24, 208, 1, 240, 1, 248,
+ 41, 121, 43, 55, 1, 54, 18, 66, 159, 219, 210, 122, 107, 122, 170, 6, 27, 4, 18, 67, 26, 122, 235, 2, 27, 67, 19, 123,
+ 42, 28, 16, 67, 24, 240, 1, 248, 23, 70, 74, 70, 75, 70, 73, 124, 137, 124, 91, 124, 215, 70, 152, 4, 58, 6, 11, 67,
+ 26, 70, 75, 70, 140, 125, 30, 70, 73, 125, 76, 2, 51, 67, 19, 28, 33, 67, 25, 34, 1, 35, 13, 68, 147, 68, 154, 69, 195,
+ 219, 0, 225, 123, 70, 97, 6, 11, 4, 58, 67, 26, 2, 51, 67, 19, 28, 33, 67, 25, 231, 142, 28, 33, 34, 18, 70, 72, 240,
+ 2, 248, 77, 28, 32, 240, 0, 255, 236, 70, 73, 120, 138, 120, 203, 2, 18, 67, 19, 4, 27, 10, 26, 14, 27, 67, 26, 4, 18,
+ 12, 19, 14, 18, 112, 138, 122, 10, 112, 203, 122, 75, 2, 18, 67, 19, 4, 27, 10, 26, 14, 27, 67, 26, 4, 18, 12, 19, 14,
+ 18, 114, 10, 122, 138, 114, 75, 122, 203, 2, 18, 67, 19, 4, 27, 10, 26, 14, 27, 67, 26, 4, 18, 12, 19, 14, 18, 114,
+ 138, 123, 10, 114, 203, 123, 75, 2, 18, 67, 19, 4, 27, 10, 26, 14, 27, 67, 26, 4, 18, 12, 19, 115, 75, 124, 75, 14,
+ 18, 0, 88, 24, 192, 0, 128, 115, 10, 24, 192, 240, 0, 255, 188, 70, 74, 14, 3, 116, 147, 12, 3, 116, 211, 10, 3, 117,
+ 19, 117, 80, 40, 0, 209, 0, 225, 47, 124, 83, 33, 0, 0, 90, 24, 210, 0, 146, 24, 210, 240, 2, 248, 63, 70, 73, 124,
+ 75, 43, 0, 209, 0, 225, 59, 34, 0, 146, 7, 146, 10, 32, 9, 240, 0, 255, 158, 28, 4, 40, 0, 209, 0, 225, 8, 153, 7, 34,
+ 2, 6, 11, 14, 29, 35, 9, 28, 33, 147, 0, 152, 5, 28, 43, 247, 255, 249, 71, 70, 75, 124, 154, 124, 219, 70, 73, 6, 18,
+ 4, 27, 67, 19, 125, 10, 2, 18, 67, 26, 125, 75, 28, 33, 67, 19, 154, 10, 24, 210, 70, 146, 28, 16, 34, 9, 240, 1, 255,
+ 205, 28, 32, 240, 0, 255, 108, 70, 83, 120, 154, 120, 219, 2, 18, 67, 19, 4, 27, 10, 26, 14, 27, 67, 26, 4, 18, 12,
+ 20, 70, 81, 14, 18, 112, 138, 112, 204, 28, 32, 240, 0, 255, 102, 144, 11, 40, 0, 209, 0, 224, 208, 70, 82, 120, 211,
+ 152, 5, 147, 0, 153, 11, 34, 2, 28, 43, 247, 255, 249, 17, 144, 6, 40, 0, 218, 0, 230, 197, 70, 83, 120, 29, 121, 27,
+ 0, 216, 24, 192, 0, 64, 240, 0, 255, 77, 70, 81, 14, 3, 114, 75, 12, 3, 114, 139, 10, 3, 114, 203, 115, 8, 40, 0, 209,
+ 0, 224, 192, 121, 11, 33, 0, 0, 218, 24, 210, 0, 82, 240, 1, 255, 209, 70, 82, 121, 19, 43, 0, 209, 0, 224, 138, 155,
+ 11, 33, 0, 25, 91, 27, 100, 70, 152, 70, 163, 145, 8, 145, 9, 70, 83, 122, 90, 122, 155, 70, 81, 6, 18, 4, 27, 67, 19,
+ 122, 202, 2, 18, 67, 26, 123, 11, 70, 65, 67, 19, 154, 9, 24, 157, 28, 40, 34, 9, 240, 1, 255, 109, 121, 43, 120, 44,
+ 0, 216, 26, 192, 240, 0, 255, 21, 14, 3, 115, 171, 12, 3, 115, 235, 10, 3, 116, 43, 116, 104, 40, 0, 209, 0, 224, 137,
+ 70, 91, 27, 27, 70, 155, 121, 43, 33, 0, 0, 218, 26, 210, 240, 1, 255, 152, 70, 89, 68, 160, 41, 0, 209, 0, 224, 120,
+ 70, 66, 120, 83, 59, 4, 6, 27, 14, 27, 43, 1, 216, 0, 224, 112, 70, 64, 70, 90, 224, 5, 120, 67, 59, 4, 6, 27, 14, 27,
+ 43, 1, 217, 98, 120, 3, 26, 210, 24, 192, 42, 0, 209, 244, 70, 65, 26, 68, 6, 35, 14, 27, 115, 107, 44, 0, 209, 98,
+ 121, 43, 43, 0, 208, 37, 39, 0, 38, 0, 123, 171, 123, 234, 6, 27, 4, 18, 67, 26, 124, 43, 124, 108, 2, 27, 67, 19, 67,
+ 28, 25, 164, 70, 65, 34, 7, 28, 32, 240, 1, 255, 29, 120, 35, 121, 34, 68, 152, 121, 99, 2, 18, 67, 19, 4, 27, 10, 26,
+ 14, 27, 67, 26, 4, 18, 12, 19, 14, 18, 113, 34, 113, 99, 121, 43, 55, 1, 54, 7, 66, 187, 216, 219, 155, 8, 153, 9, 51,
+ 1, 49, 18, 147, 8, 145, 9, 70, 82, 121, 19, 153, 8, 66, 139, 217, 0, 231, 124, 152, 11, 240, 0, 254, 156, 154, 7, 155,
+ 10, 50, 1, 51, 13, 146, 7, 147, 10, 70, 73, 124, 75, 66, 147, 217, 0, 230, 251, 34, 0, 146, 6, 152, 6, 176, 13, 188,
+ 60, 70, 144, 70, 153, 70, 162, 70, 171, 188, 240, 188, 2, 71, 8, 34, 4, 66, 82, 146, 6, 230, 0, 28, 8, 240, 0, 254,
+ 126, 231, 237, 70, 67, 26, 196, 6, 35, 14, 27, 231, 160, 35, 0, 115, 107, 231, 160, 35, 4, 66, 91, 147, 6, 229, 237,
+ 28, 32, 240, 0, 254, 122, 14, 3, 114, 107, 12, 3, 114, 171, 10, 3, 114, 235, 115, 40, 40, 0, 208, 239, 70, 65, 28, 34,
+ 240, 1, 254, 191, 70, 90, 27, 18, 68, 160, 70, 147, 231, 135, 28, 32, 240, 0, 254, 89, 35, 0, 147, 6, 231, 198, 181,
+ 240, 70, 95, 70, 86, 70, 77, 70, 68, 180, 240, 176, 141, 70, 130, 32, 1, 28, 12, 240, 0, 254, 86, 144, 5, 40, 0, 209,
+ 0, 225, 239, 33, 0, 34, 164, 70, 80, 240, 1, 254, 227, 70, 81, 35, 1, 34, 152, 80, 139, 35, 144, 80, 204, 70, 105, 28,
+ 32, 49, 26, 247, 255, 253, 146, 28, 4, 40, 0, 218, 0, 225, 194, 75, 178, 104, 27, 43, 0, 208, 0, 224, 211, 72, 177,
+ 70, 105, 49, 26, 34, 22, 240, 1, 254, 133, 33, 43, 68, 105, 120, 15, 47, 0, 209, 0, 226, 30, 70, 108, 141, 163, 141,
+ 226, 33, 0, 4, 27, 28, 20, 67, 28, 70, 139, 70, 137, 38, 0, 70, 74, 24, 165, 121, 41, 41, 0, 208, 68, 35, 0, 70, 152,
+ 39, 0, 122, 106, 122, 171, 6, 18, 4, 27, 67, 19, 122, 234, 2, 18, 67, 26, 123, 43, 67, 19, 25, 220, 121, 99, 43, 8,
+ 209, 0, 224, 189, 123, 163, 123, 226, 6, 27, 4, 18, 67, 26, 124, 35, 2, 27, 67, 19, 124, 98, 28, 16, 67, 24, 208, 1,
+ 240, 0, 253, 242, 122, 99, 122, 162, 6, 27, 4, 18, 67, 26, 122, 227, 115, 166, 2, 27, 67, 19, 123, 34, 115, 230, 28,
+ 16, 116, 38, 116, 102, 67, 24, 208, 1, 240, 0, 253, 224, 114, 102, 114, 166, 114, 230, 115, 38, 121, 41, 36, 1, 68,
+ 160, 55, 18, 69, 65, 216, 198, 70, 106, 141, 147, 33, 43, 141, 210, 68, 105, 4, 27, 28, 20, 120, 15, 67, 28, 35, 1,
+ 33, 13, 68, 155, 68, 137, 69, 95, 216, 175, 44, 0, 209, 0, 225, 83, 47, 0, 209, 0, 225, 77, 34, 0, 70, 145, 70, 144,
+ 70, 67, 24, 229, 122, 107, 122, 170, 6, 27, 4, 18, 67, 26, 122, 235, 2, 27, 67, 19, 123, 42, 28, 16, 67, 24, 208, 72,
+ 121, 43, 43, 0, 208, 58, 39, 0, 38, 0, 224, 10, 122, 107, 122, 170, 6, 27, 4, 18, 67, 26, 122, 235, 2, 27, 67, 19, 123,
+ 42, 28, 16, 67, 24, 25, 132, 123, 163, 123, 226, 6, 27, 4, 18, 67, 26, 124, 35, 2, 27, 67, 19, 124, 98, 28, 16, 67,
+ 24, 208, 1, 240, 0, 253, 144, 122, 99, 122, 162, 6, 27, 4, 18, 67, 26, 122, 227, 2, 27, 67, 19, 123, 34, 28, 16, 67,
+ 24, 208, 1, 240, 0, 253, 130, 121, 43, 55, 1, 54, 18, 66, 159, 219, 210, 122, 107, 122, 170, 6, 27, 4, 18, 67, 26, 122,
+ 235, 2, 27, 67, 19, 123, 42, 28, 16, 67, 24, 240, 0, 253, 112, 70, 105, 36, 43, 141, 139, 141, 202, 68, 108, 120, 39,
+ 4, 27, 28, 20, 67, 28, 34, 1, 35, 13, 68, 145, 68, 152, 69, 185, 219, 0, 224, 236, 70, 108, 141, 163, 141, 226, 4, 27,
+ 28, 20, 67, 28, 231, 154, 33, 0, 72, 70, 224, 3, 49, 1, 41, 18, 209, 0, 231, 37, 36, 26, 68, 108, 92, 66, 92, 99, 66,
+ 154, 208, 245, 152, 5, 240, 0, 253, 73, 70, 104, 48, 26, 36, 1, 247, 254, 249, 96, 66, 100, 224, 225, 121, 162, 42,
+ 6, 208, 4, 42, 2, 208, 2, 42, 5, 208, 0, 231, 57, 121, 227, 43, 80, 208, 0, 231, 53, 121, 35, 43, 1, 216, 0, 231, 86,
+ 42, 6, 208, 3, 35, 1, 70, 81, 34, 156, 84, 139, 70, 81, 115, 78, 115, 14, 121, 34, 70, 148, 42, 0, 209, 0, 231, 71,
+ 32, 0, 33, 0, 224, 3, 48, 1, 49, 7, 69, 132, 217, 26, 123, 162, 123, 227, 6, 18, 4, 27, 67, 19, 124, 34, 2, 18, 67,
+ 26, 124, 99, 67, 19, 24, 90, 120, 211, 43, 2, 209, 237, 120, 146, 6, 19, 43, 0, 218, 0, 224, 145, 70, 83, 115, 90, 121,
+ 34, 48, 1, 70, 148, 49, 7, 69, 132, 216, 228, 70, 81, 123, 11, 43, 0, 209, 0, 231, 32, 70, 82, 123, 83, 43, 0, 209,
+ 0, 231, 27, 121, 107, 70, 81, 112, 11, 120, 163, 70, 106, 96, 75, 120, 227, 96, 139, 141, 147, 141, 210, 4, 27, 28,
+ 17, 67, 25, 209, 0, 224, 152, 35, 43, 68, 107, 120, 28, 44, 0, 209, 0, 224, 143, 34, 0, 70, 145, 70, 144, 70, 67, 24,
+ 205, 122, 107, 122, 170, 6, 27, 4, 18, 67, 26, 122, 235, 2, 27, 67, 19, 123, 42, 28, 16, 67, 24, 208, 76, 121, 43, 43,
+ 0, 208, 62, 39, 0, 38, 0, 224, 14, 19, 112, 129, 80, 19, 114, 73, 128, 122, 107, 122, 170, 6, 27, 4, 18, 67, 26, 122,
+ 235, 2, 27, 67, 19, 123, 42, 28, 16, 67, 24, 25, 132, 123, 163, 123, 226, 6, 27, 4, 18, 67, 26, 124, 35, 2, 27, 67,
+ 19, 124, 98, 28, 16, 67, 24, 208, 1, 240, 0, 252, 174, 122, 99, 122, 162, 6, 27, 4, 18, 67, 26, 122, 227, 2, 27, 67,
+ 19, 123, 34, 28, 16, 67, 24, 208, 1, 240, 0, 252, 160, 121, 43, 55, 1, 54, 18, 66, 159, 219, 210, 122, 107, 122, 170,
+ 6, 27, 4, 18, 67, 26, 122, 235, 2, 27, 67, 19, 123, 42, 28, 16, 67, 24, 240, 0, 252, 142, 70, 106, 141, 147, 33, 43,
+ 141, 210, 68, 105, 120, 12, 4, 27, 28, 17, 67, 25, 35, 1, 34, 13, 68, 153, 68, 144, 69, 161, 218, 43, 70, 105, 141,
+ 139, 141, 202, 4, 27, 28, 17, 67, 25, 231, 151, 70, 83, 115, 26, 121, 34, 70, 148, 231, 81, 28, 32, 240, 0, 252, 112,
+ 76, 59, 152, 5, 240, 0, 252, 108, 35, 160, 70, 81, 88, 200, 40, 0, 208, 1, 240, 0, 252, 101, 70, 80, 33, 0, 34, 164,
+ 240, 1, 253, 2, 176, 13, 28, 32, 188, 60, 70, 144, 70, 153, 70, 162, 70, 171, 188, 240, 188, 2, 71, 8, 36, 4, 66, 100,
+ 231, 242, 28, 8, 240, 0, 252, 80, 70, 82, 38, 144, 32, 1, 89, 148, 240, 0, 252, 86, 28, 5, 40, 0, 208, 61, 35, 0, 147,
+ 0, 35, 1, 147, 1, 144, 2, 33, 128, 28, 32, 34, 8, 35, 0, 247, 254, 253, 126, 40, 0, 219, 50, 28, 40, 120, 44, 240, 0,
+ 252, 54, 70, 83, 120, 25, 66, 161, 208, 5, 70, 84, 89, 160, 247, 254, 253, 228, 40, 0, 219, 34, 70, 81, 104, 138, 42,
+ 0, 208, 8, 35, 144, 6, 18, 88, 200, 14, 18, 121, 201, 247, 254, 253, 195, 40, 0, 219, 21, 70, 80, 247, 255, 248, 20,
+ 28, 4, 40, 0, 219, 169, 35, 16, 70, 82, 115, 147, 72, 15, 240, 0, 252, 31, 70, 84, 35, 160, 80, 224, 40, 0, 208, 18,
+ 152, 5, 240, 0, 252, 11, 36, 0, 231, 168, 76, 10, 231, 151, 28, 40, 240, 0, 252, 4, 76, 7, 231, 146, 70, 106, 141, 147,
+ 141, 210, 4, 27, 28, 20, 67, 28, 230, 51, 36, 4, 66, 100, 231, 136, 255, 255, 216, 240, 0, 0, 128, 16, 255, 255, 216,
+ 231, 181, 240, 70, 95, 70, 86, 70, 77, 70, 68, 180, 240, 73, 98, 176, 141, 144, 6, 70, 136, 28, 8, 153, 6, 247, 255,
+ 253, 142, 40, 0, 218, 0, 224, 165, 70, 67, 123, 154, 146, 7, 42, 0, 209, 0, 224, 140, 73, 91, 35, 38, 38, 0, 68, 107,
+ 70, 139, 70, 154, 70, 177, 224, 6, 155, 7, 54, 1, 66, 158, 219, 0, 224, 127, 70, 65, 123, 138, 6, 51, 14, 29, 66, 149,
+ 210, 244, 73, 82, 70, 90, 96, 17, 72, 79, 28, 41, 247, 255, 249, 237, 28, 4, 40, 0, 219, 90, 75, 77, 70, 89, 96, 11,
+ 7, 107, 70, 82, 14, 31, 35, 18, 70, 73, 112, 19, 35, 36, 112, 87, 112, 145, 112, 209, 113, 19, 113, 81, 32, 36, 240,
+ 0, 251, 184, 28, 4, 40, 0, 208, 16, 70, 74, 70, 81, 35, 6, 145, 0, 147, 1, 146, 2, 146, 3, 146, 4, 72, 61, 28, 41, 28,
+ 34, 35, 36, 247, 254, 255, 155, 28, 32, 240, 0, 251, 152, 70, 81, 35, 37, 112, 79, 112, 11, 32, 8, 240, 0, 251, 157,
+ 28, 7, 40, 0, 208, 186, 35, 2, 70, 82, 147, 1, 70, 75, 146, 0, 147, 2, 147, 3, 147, 4, 72, 47, 28, 41, 28, 58, 35, 8,
+ 247, 254, 255, 128, 28, 4, 40, 0, 219, 22, 172, 11, 28, 32, 28, 57, 34, 4, 240, 1, 251, 213, 28, 43, 154, 11, 73, 39,
+ 51, 20, 0, 155, 80, 90, 28, 32, 29, 57, 34, 4, 240, 1, 251, 202, 29, 43, 154, 11, 73, 33, 0, 155, 80, 90, 36, 0, 28,
+ 56, 240, 0, 251, 99, 28, 162, 208, 48, 44, 0, 219, 139, 153, 6, 74, 30, 137, 11, 32, 0, 128, 19, 137, 75, 74, 29, 128,
+ 19, 74, 29, 35, 1, 112, 19, 75, 28, 70, 90, 112, 29, 75, 23, 96, 19, 224, 20, 75, 24, 34, 0, 112, 26, 35, 160, 70, 66,
+ 88, 208, 40, 0, 208, 1, 240, 0, 251, 68, 33, 0, 70, 64, 34, 164, 240, 1, 251, 225, 72, 19, 33, 0, 247, 253, 250, 85,
+ 32, 3, 66, 64, 176, 13, 188, 60, 70, 144, 70, 153, 70, 162, 70, 171, 188, 240, 188, 2, 71, 8, 75, 9, 34, 0, 112, 26,
+ 70, 65, 35, 160, 88, 200, 40, 0, 209, 225, 231, 226, 70, 192, 19, 114, 73, 152, 19, 112, 128, 32, 0, 15, 66, 64, 19,
+ 112, 129, 86, 19, 112, 129, 88, 19, 112, 129, 85, 19, 112, 129, 84, 19, 112, 128, 172, 181, 240, 70, 95, 70, 86, 70,
+ 77, 70, 68, 180, 240, 74, 73, 176, 129, 104, 19, 70, 146, 43, 0, 208, 9, 32, 0, 176, 1, 188, 60, 70, 144, 70, 153, 70,
+ 162, 70, 171, 188, 240, 188, 2, 71, 8, 75, 66, 104, 29, 70, 153, 35, 84, 92, 235, 43, 0, 208, 121, 38, 0, 224, 53, 32,
+ 250, 0, 128, 247, 253, 253, 227, 70, 64, 247, 255, 254, 254, 40, 0, 208, 103, 25, 187, 0, 219, 24, 235, 70, 74, 111,
+ 92, 104, 19, 28, 32, 104, 155, 70, 155, 247, 254, 252, 189, 48, 1, 208, 68, 32, 250, 0, 128, 247, 253, 253, 205, 70,
+ 64, 247, 255, 254, 232, 40, 0, 208, 81, 25, 187, 0, 219, 24, 235, 111, 92, 70, 74, 104, 19, 28, 32, 104, 157, 247, 254,
+ 252, 168, 48, 1, 208, 58, 32, 250, 0, 128, 247, 253, 253, 184, 70, 75, 104, 29, 34, 84, 92, 171, 54, 1, 66, 179, 221,
+ 65, 0, 183, 25, 187, 0, 219, 28, 26, 24, 236, 50, 88, 111, 35, 25, 82, 70, 144, 43, 0, 208, 237, 28, 16, 247, 255, 254,
+ 193, 40, 0, 208, 42, 70, 74, 104, 19, 111, 100, 104, 155, 28, 32, 70, 155, 247, 254, 252, 131, 48, 1, 209, 175, 32,
+ 250, 0, 64, 247, 253, 253, 147, 28, 35, 51, 16, 0, 155, 74, 19, 68, 91, 96, 90, 231, 164, 32, 250, 0, 64, 247, 253,
+ 253, 136, 28, 35, 51, 16, 0, 155, 74, 14, 68, 91, 96, 90, 231, 175, 32, 250, 0, 64, 247, 253, 253, 125, 28, 35, 51,
+ 16, 0, 155, 74, 8, 24, 235, 96, 90, 231, 185, 35, 1, 70, 82, 96, 19, 74, 6, 35, 0, 96, 19, 231, 116, 32, 1, 66, 64,
+ 231, 114, 19, 112, 129, 80, 19, 112, 128, 28, 0, 0, 16, 1, 19, 112, 129, 76, 181, 240, 70, 95, 70, 86, 70, 77, 70, 68,
+ 180, 240, 75, 142, 176, 151, 120, 27, 144, 11, 146, 10, 43, 1, 208, 9, 32, 0, 176, 23, 188, 60, 70, 144, 70, 153, 70,
+ 162, 70, 171, 188, 240, 188, 2, 71, 8, 4, 11, 33, 0, 70, 138, 74, 133, 73, 134, 12, 27, 147, 14, 146, 9, 35, 0, 145,
+ 8, 224, 137, 74, 131, 35, 144, 88, 208, 70, 147, 40, 0, 209, 0, 224, 208, 75, 129, 105, 196, 104, 27, 28, 32, 104, 157,
+ 247, 254, 252, 30, 28, 67, 209, 0, 224, 188, 40, 0, 208, 0, 224, 195, 35, 160, 70, 89, 88, 200, 40, 0, 208, 1, 240,
+ 0, 250, 55, 35, 160, 70, 90, 33, 0, 80, 209, 35, 144, 88, 208, 247, 255, 254, 61, 40, 0, 208, 0, 224, 177, 155, 9, 34,
+ 0, 96, 26, 32, 100, 247, 253, 253, 22, 75, 111, 153, 8, 96, 11, 75, 111, 70, 89, 120, 27, 154, 14, 28, 30, 54, 4, 147,
+ 12, 0, 179, 88, 203, 32, 128, 70, 153, 70, 75, 67, 83, 2, 0, 146, 15, 66, 131, 217, 4, 70, 73, 240, 1, 249, 167, 154,
+ 14, 144, 15, 42, 0, 209, 0, 224, 181, 155, 10, 153, 12, 147, 13, 7, 75, 14, 27, 70, 108, 0, 182, 157, 11, 147, 16, 28,
+ 23, 52, 77, 150, 7, 154, 15, 28, 62, 66, 151, 217, 0, 28, 22, 4, 50, 12, 19, 33, 87, 70, 152, 68, 105, 35, 0, 112, 11,
+ 33, 42, 35, 67, 112, 33, 68, 107, 120, 27, 14, 18, 112, 99, 14, 43, 112, 163, 12, 43, 112, 227, 33, 0, 113, 226, 10,
+ 43, 70, 66, 113, 161, 114, 97, 113, 35, 113, 101, 114, 34, 70, 89, 123, 139, 154, 12, 66, 147, 216, 38, 33, 3, 66, 74,
+ 70, 146, 75, 71, 153, 8, 96, 11, 154, 9, 104, 19, 43, 0, 209, 2, 70, 83, 43, 0, 218, 117, 155, 17, 51, 1, 43, 15, 220,
+ 99, 147, 17, 43, 12, 221, 1, 34, 12, 146, 17, 153, 9, 104, 11, 43, 0, 208, 0, 231, 107, 70, 82, 50, 2, 208, 70, 75,
+ 58, 154, 8, 96, 19, 70, 83, 51, 2, 208, 222, 73, 53, 70, 139, 231, 142, 70, 75, 43, 0, 208, 213, 70, 65, 34, 10, 70,
+ 75, 67, 75, 146, 1, 33, 1, 34, 87, 145, 2, 68, 106, 33, 0, 146, 3, 145, 4, 72, 44, 153, 12, 154, 13, 148, 0, 247, 254,
+ 253, 157, 70, 130, 40, 0, 221, 63, 34, 87, 68, 106, 120, 19, 43, 0, 209, 55, 70, 65, 26, 123, 4, 27, 12, 31, 155, 7,
+ 70, 90, 88, 210, 70, 145, 47, 0, 208, 180, 70, 75, 67, 115, 153, 13, 25, 173, 24, 201, 145, 13, 231, 133, 32, 250, 0,
+ 64, 247, 253, 252, 112, 28, 35, 51, 16, 0, 155, 74, 29, 24, 235, 96, 90, 32, 100, 247, 253, 252, 103, 70, 82, 50, 2,
+ 209, 184, 155, 17, 43, 0, 221, 181, 73, 19, 28, 8, 70, 139, 33, 1, 247, 254, 252, 183, 70, 130, 40, 0, 219, 172, 75,
+ 16, 154, 8, 96, 19, 231, 64, 70, 81, 15, 203, 34, 1, 64, 83, 6, 27, 14, 24, 230, 246, 75, 14, 70, 154, 231, 131, 70,
+ 83, 43, 0, 218, 193, 231, 127, 32, 1, 230, 237, 34, 1, 66, 83, 70, 154, 231, 121, 19, 112, 129, 85, 19, 112, 129, 76,
+ 19, 112, 128, 32, 19, 114, 73, 152, 19, 112, 128, 28, 0, 15, 66, 64, 19, 112, 129, 84, 0, 0, 16, 1, 255, 255, 216, 234,
+ 181, 240, 70, 95, 70, 86, 70, 77, 70, 68, 180, 240, 75, 144, 176, 151, 120, 27, 144, 12, 146, 11, 43, 1, 208, 9, 32,
+ 0, 176, 23, 188, 60, 70, 144, 70, 153, 70, 162, 70, 171, 188, 240, 188, 2, 71, 8, 74, 137, 4, 11, 33, 0, 70, 136, 146,
+ 10, 73, 135, 74, 136, 12, 27, 147, 14, 145, 8, 35, 0, 146, 7, 224, 141, 154, 8, 35, 144, 88, 208, 40, 0, 209, 0, 224,
+ 187, 75, 130, 105, 196, 104, 27, 28, 32, 104, 157, 247, 254, 250, 231, 28, 67, 209, 0, 224, 167, 40, 0, 208, 0, 224,
+ 174, 153, 8, 35, 160, 88, 200, 40, 0, 208, 2, 240, 0, 249, 0, 153, 8, 35, 160, 34, 0, 80, 202, 35, 144, 88, 200, 247,
+ 255, 253, 6, 40, 0, 208, 0, 224, 156, 154, 10, 96, 16, 32, 100, 247, 253, 251, 224, 35, 0, 70, 152, 153, 10, 104, 11,
+ 43, 0, 209, 89, 75, 110, 154, 7, 70, 65, 96, 19, 49, 2, 208, 116, 75, 108, 73, 104, 120, 27, 154, 14, 28, 30, 54, 4,
+ 147, 13, 0, 179, 88, 203, 32, 128, 70, 153, 70, 75, 67, 83, 2, 0, 146, 15, 66, 131, 217, 4, 70, 73, 240, 1, 248, 104,
+ 154, 14, 144, 15, 42, 0, 209, 0, 224, 167, 155, 11, 153, 13, 70, 155, 7, 75, 14, 27, 70, 108, 0, 182, 157, 12, 147,
+ 16, 28, 23, 52, 77, 150, 9, 154, 15, 28, 62, 66, 151, 217, 0, 28, 22, 4, 50, 12, 19, 33, 87, 70, 154, 68, 105, 35, 0,
+ 112, 11, 33, 40, 35, 67, 112, 33, 68, 107, 120, 27, 33, 0, 112, 99, 14, 43, 112, 163, 14, 18, 12, 43, 112, 227, 113,
+ 161, 113, 226, 114, 97, 10, 43, 70, 82, 73, 71, 113, 35, 113, 101, 114, 34, 123, 139, 154, 13, 66, 147, 216, 69, 35,
+ 3, 66, 89, 70, 136, 75, 69, 153, 7, 96, 11, 154, 10, 104, 19, 43, 0, 208, 115, 155, 17, 51, 1, 43, 15, 220, 34, 147,
+ 17, 43, 12, 221, 1, 35, 12, 147, 17, 153, 10, 104, 11, 43, 0, 208, 0, 231, 103, 70, 65, 49, 2, 209, 144, 154, 17, 42,
+ 0, 221, 141, 72, 52, 33, 1, 247, 254, 251, 196, 70, 128, 40, 0, 219, 1, 75, 54, 70, 152, 32, 10, 247, 253, 251, 96,
+ 231, 128, 154, 7, 96, 19, 155, 17, 51, 1, 43, 15, 221, 220, 70, 65, 15, 203, 34, 1, 64, 83, 6, 27, 14, 24, 231, 49,
+ 32, 250, 0, 64, 247, 253, 251, 78, 28, 35, 51, 16, 0, 155, 74, 42, 24, 235, 96, 90, 32, 100, 247, 253, 251, 69, 231,
+ 209, 70, 75, 43, 0, 208, 182, 34, 10, 70, 81, 146, 1, 34, 87, 70, 75, 67, 75, 68, 106, 33, 0, 145, 2, 146, 3, 145, 4,
+ 72, 25, 153, 13, 70, 90, 148, 0, 247, 254, 252, 64, 70, 128, 40, 0, 221, 7, 33, 87, 68, 105, 120, 11, 43, 0, 208, 5,
+ 74, 25, 70, 144, 231, 157, 70, 66, 42, 0, 219, 154, 70, 81, 26, 123, 4, 27, 12, 31, 74, 13, 155, 9, 88, 210, 70, 145,
+ 47, 0, 208, 144, 70, 75, 67, 115, 25, 173, 68, 155, 231, 99, 75, 11, 153, 7, 34, 1, 96, 11, 66, 83, 70, 152, 231, 139,
+ 70, 67, 43, 0, 219, 136, 32, 1, 230, 230, 70, 192, 19, 112, 129, 85, 19, 112, 129, 76, 19, 114, 73, 152, 19, 112, 128,
+ 32, 19, 112, 128, 28, 0, 15, 66, 64, 19, 112, 129, 84, 255, 255, 253, 102, 0, 0, 16, 1, 255, 255, 216, 234, 71, 112,
+ 70, 192, 181, 0, 75, 4, 176, 129, 28, 1, 104, 24, 247, 252, 254, 187, 176, 1, 188, 1, 71, 0, 19, 112, 129, 92, 181,
+ 0, 75, 9, 28, 1, 176, 129, 104, 24, 247, 252, 254, 167, 40, 0, 208, 2, 176, 1, 188, 2, 71, 8, 72, 4, 33, 0, 247, 252,
+ 254, 254, 32, 100, 247, 253, 250, 209, 231, 251, 19, 112, 129, 92, 19, 112, 128, 192, 181, 0, 176, 129, 247, 252, 254,
+ 150, 176, 1, 188, 1, 71, 0, 70, 192, 181, 0, 176, 129, 247, 252, 254, 142, 176, 1, 188, 1, 71, 0, 70, 192, 181, 0, 176,
+ 129, 247, 252, 254, 134, 176, 1, 188, 1, 71, 0, 70, 192, 181, 16, 28, 4, 247, 252, 254, 94, 28, 32, 188, 16, 188, 2,
+ 71, 8, 181, 16, 28, 4, 247, 252, 254, 86, 28, 32, 188, 16, 188, 2, 71, 8, 181, 16, 28, 4, 247, 252, 254, 78, 28, 32,
+ 188, 16, 188, 2, 71, 8, 181, 0, 33, 192, 176, 129, 72, 5, 2, 9, 247, 252, 254, 63, 75, 4, 176, 1, 96, 24, 32, 0, 188,
+ 2, 71, 8, 70, 192, 19, 112, 137, 128, 19, 112, 129, 92, 181, 112, 176, 132, 28, 13, 28, 6, 247, 255, 252, 126, 76, 14,
+ 28, 32, 247, 253, 251, 94, 75, 13, 28, 2, 96, 24, 40, 0, 209, 4, 32, 0, 176, 4, 188, 112, 188, 2, 71, 8, 104, 35, 72,
+ 9, 146, 0, 33, 0, 34, 0, 149, 1, 146, 2, 240, 0, 250, 227, 40, 0, 208, 239, 28, 49, 240, 0, 249, 32, 231, 236, 70, 192,
+ 19, 112, 129, 100, 19, 112, 129, 96, 19, 112, 52, 13, 181, 48, 28, 20, 28, 8, 176, 129, 28, 17, 28, 26, 28, 29, 247,
+ 255, 254, 41, 40, 0, 209, 4, 32, 1, 176, 1, 188, 48, 188, 2, 71, 8, 75, 4, 28, 40, 104, 27, 28, 25, 67, 97, 247, 252,
+ 254, 23, 32, 0, 231, 242, 70, 192, 19, 112, 129, 100, 181, 240, 70, 95, 70, 86, 70, 77, 70, 68, 180, 240, 176, 133,
+ 144, 1, 104, 6, 28, 21, 106, 112, 70, 152, 28, 10, 30, 131, 64, 218, 4, 19, 12, 27, 147, 2, 122, 50, 26, 128, 144, 3,
+ 106, 51, 104, 116, 59, 1, 64, 211, 70, 155, 58, 2, 28, 11, 64, 211, 70, 95, 64, 31, 155, 1, 8, 162, 104, 88, 155, 2,
+ 58, 1, 51, 128, 0, 91, 90, 195, 70, 153, 64, 17, 208, 0, 224, 114, 70, 170, 69, 160, 211, 53, 122, 49, 70, 69, 64, 205,
+ 106, 50, 25, 235, 66, 147, 216, 60, 70, 74, 42, 0, 208, 61, 154, 3, 106, 241, 70, 75, 64, 147, 24, 121, 24, 201, 107,
+ 52, 107, 176, 28, 42, 70, 83, 240, 0, 248, 183, 28, 4, 40, 0, 209, 32, 122, 51, 28, 42, 64, 154, 28, 19, 70, 66, 26,
+ 210, 25, 127, 70, 144, 68, 154, 69, 187, 210, 14, 42, 0, 208, 12, 155, 2, 39, 0, 51, 1, 4, 27, 12, 27, 147, 2, 155,
+ 1, 104, 90, 155, 2, 51, 128, 0, 91, 90, 211, 70, 153, 104, 116, 69, 160, 210, 201, 70, 66, 42, 0, 209, 31, 36, 0, 176,
+ 5, 28, 32, 188, 60, 70, 144, 70, 153, 70, 162, 70, 171, 188, 240, 188, 2, 71, 8, 27, 213, 70, 74, 42, 0, 209, 193, 28,
+ 42, 64, 138, 70, 80, 33, 0, 240, 0, 255, 122, 122, 51, 28, 42, 64, 154, 28, 19, 70, 66, 26, 210, 70, 144, 68, 154, 25,
+ 127, 104, 116, 231, 164, 70, 75, 43, 0, 208, 55, 154, 3, 106, 241, 64, 147, 24, 121, 24, 201, 107, 52, 107, 176, 108,
+ 243, 34, 1, 240, 0, 248, 102, 28, 4, 40, 0, 209, 207, 108, 241, 70, 80, 70, 66, 240, 0, 255, 21, 231, 201, 0, 137, 70,
+ 138, 43, 0, 208, 71, 154, 3, 106, 241, 64, 147, 24, 121, 24, 201, 107, 52, 107, 176, 108, 243, 34, 1, 240, 0, 248, 78,
+ 28, 4, 40, 0, 209, 183, 104, 115, 70, 82, 26, 156, 69, 160, 210, 19, 108, 241, 28, 40, 68, 81, 70, 66, 240, 0, 254,
+ 247, 68, 69, 35, 0, 70, 170, 55, 1, 70, 152, 104, 116, 231, 105, 70, 80, 33, 0, 70, 66, 240, 0, 255, 47, 36, 0, 231,
+ 158, 108, 241, 28, 40, 68, 81, 28, 34, 240, 0, 254, 227, 70, 67, 27, 27, 25, 45, 55, 1, 70, 152, 70, 170, 69, 95, 216,
+ 0, 231, 136, 43, 0, 209, 0, 231, 133, 155, 2, 39, 0, 51, 1, 4, 27, 12, 27, 147, 2, 155, 1, 104, 116, 104, 90, 155, 2,
+ 51, 128, 0, 91, 90, 211, 70, 153, 231, 65, 26, 100, 69, 68, 217, 0, 70, 68, 28, 40, 28, 34, 33, 0, 240, 0, 255, 3, 70,
+ 67, 27, 27, 25, 45, 70, 152, 70, 170, 55, 1, 104, 116, 231, 48, 71, 32, 181, 240, 70, 87, 70, 70, 180, 192, 35, 72,
+ 90, 194, 122, 3, 176, 129, 65, 26, 70, 144, 143, 130, 28, 6, 70, 138, 42, 0, 208, 32, 37, 0, 39, 0, 224, 3, 53, 1, 68,
+ 71, 66, 170, 217, 25, 104, 51, 25, 91, 123, 27, 43, 0, 208, 246, 106, 241, 34, 1, 49, 1, 24, 121, 107, 176, 108, 243,
+ 107, 52, 240, 0, 248, 72, 108, 241, 70, 80, 34, 6, 240, 0, 254, 97, 40, 0, 208, 14, 143, 178, 53, 1, 68, 71, 66, 170,
+ 216, 229, 34, 0, 70, 146, 176, 1, 70, 80, 188, 12, 70, 144, 70, 154, 188, 240, 188, 2, 71, 8, 32, 12, 247, 252, 253,
+ 117, 70, 130, 40, 0, 208, 33, 70, 82, 96, 22, 96, 149, 35, 72, 90, 240, 247, 252, 253, 107, 70, 82, 28, 3, 96, 80, 40,
+ 0, 208, 11, 106, 241, 107, 176, 49, 1, 25, 201, 107, 52, 70, 66, 240, 0, 248, 24, 109, 51, 51, 1, 101, 51, 231, 217,
+ 72, 7, 73, 8, 247, 252, 253, 22, 70, 80, 247, 252, 253, 71, 35, 0, 70, 154, 231, 207, 72, 2, 73, 3, 247, 252, 253, 12,
+ 231, 202, 70, 192, 19, 112, 128, 224, 19, 112, 128, 236, 71, 32, 70, 192, 181, 240, 70, 95, 70, 86, 70, 77, 70, 68,
+ 180, 240, 176, 129, 70, 139, 153, 10, 70, 130, 32, 84, 70, 145, 28, 31, 70, 136, 247, 252, 253, 52, 28, 5, 47, 0, 209,
+ 85, 32, 128, 0, 128, 247, 252, 253, 45, 35, 128, 2, 27, 97, 43, 70, 66, 35, 15, 117, 43, 23, 211, 12, 91, 68, 67, 19,
+ 219, 67, 123, 97, 171, 75, 137, 96, 40, 97, 235, 155, 11, 28, 6, 98, 235, 153, 12, 41, 0, 208, 62, 33, 0, 28, 58, 240,
+ 0, 254, 92, 35, 87, 112, 51, 35, 66, 112, 115, 35, 70, 112, 179, 35, 83, 28, 60, 112, 243, 47, 0, 209, 0, 224, 232,
+ 35, 0, 51, 1, 6, 27, 8, 100, 14, 27, 44, 0, 209, 249, 59, 1, 6, 27, 14, 27, 70, 66, 114, 51, 14, 19, 113, 51, 12, 19,
+ 113, 115, 10, 19, 113, 179, 113, 242, 105, 170, 75, 115, 66, 154, 216, 0, 224, 215, 75, 114, 66, 154, 216, 0, 224, 213,
+ 75, 113, 66, 154, 216, 0, 224, 211, 75, 112, 66, 154, 216, 0, 224, 209, 75, 111, 66, 154, 216, 0, 224, 207, 34, 11,
+ 125, 43, 24, 211, 114, 115, 224, 7, 28, 56, 231, 169, 70, 72, 153, 11, 34, 1, 28, 51, 240, 0, 248, 221, 120, 51, 120,
+ 114, 6, 27, 4, 18, 67, 26, 120, 179, 2, 27, 67, 19, 120, 242, 67, 26, 75, 99, 66, 154, 208, 0, 224, 167, 75, 98, 104,
+ 27, 66, 92, 65, 92, 44, 0, 208, 24, 47, 0, 208, 0, 224, 116, 44, 0, 208, 19, 70, 65, 41, 0, 208, 16, 121, 50, 121, 115,
+ 6, 18, 4, 27, 67, 19, 121, 178, 2, 18, 67, 26, 121, 243, 67, 19, 69, 67, 208, 4, 72, 86, 73, 86, 247, 252, 252, 103,
+ 224, 112, 122, 51, 36, 1, 28, 39, 64, 159, 96, 111, 122, 51, 105, 41, 114, 43, 121, 51, 121, 114, 6, 27, 4, 18, 67,
+ 26, 121, 179, 121, 240, 2, 27, 67, 19, 67, 24, 96, 232, 240, 0, 252, 207, 28, 57, 67, 65, 97, 169, 122, 114, 125, 43,
+ 64, 148, 98, 106, 26, 210, 105, 235, 64, 209, 64, 211, 4, 27, 12, 27, 4, 58, 133, 107, 12, 18, 51, 128, 133, 41, 0,
+ 91, 30, 81, 24, 201, 66, 82, 64, 17, 35, 72, 82, 233, 70, 91, 99, 107, 141, 43, 70, 82, 99, 42, 8, 219, 122, 42, 98,
+ 44, 26, 228, 70, 73, 64, 212, 99, 169, 100, 44, 153, 12, 41, 0, 209, 58, 100, 105, 35, 72, 90, 233, 108, 40, 65, 17,
+ 56, 1, 240, 0, 252, 158, 104, 106, 4, 0, 28, 19, 12, 0, 59, 12, 135, 168, 66, 152, 217, 0, 135, 171, 28, 16, 247, 252,
+ 252, 84, 35, 0, 100, 232, 101, 43, 176, 1, 28, 40, 188, 60, 70, 144, 70, 153, 70, 162, 70, 171, 188, 240, 188, 2, 71,
+ 8, 122, 51, 28, 58, 70, 156, 33, 0, 28, 75, 6, 27, 8, 82, 28, 8, 14, 25, 42, 0, 209, 248, 69, 96, 209, 0, 231, 124,
+ 72, 29, 73, 30, 247, 252, 251, 245, 28, 40, 247, 252, 252, 38, 28, 48, 247, 252, 252, 35, 37, 0, 231, 219, 30, 120,
+ 24, 192, 66, 123, 64, 24, 247, 252, 252, 39, 141, 42, 100, 104, 8, 210, 33, 255, 240, 0, 253, 105, 122, 42, 231, 183,
+ 35, 255, 231, 30, 72, 15, 73, 17, 247, 252, 251, 217, 231, 226, 34, 6, 231, 54, 34, 7, 231, 52, 34, 8, 231, 50, 34,
+ 9, 231, 48, 34, 10, 231, 46, 0, 4, 96, 144, 0, 63, 255, 255, 0, 127, 255, 255, 0, 255, 255, 255, 1, 255, 255, 255, 3,
+ 255, 255, 255, 87, 66, 70, 83, 19, 112, 129, 104, 19, 112, 128, 224, 19, 112, 129, 44, 19, 112, 129, 12, 19, 112, 129,
+ 0, 71, 80, 70, 192, 181, 240, 70, 95, 70, 86, 70, 77, 70, 68, 180, 240, 176, 177, 144, 14, 28, 24, 145, 13, 146, 12,
+ 147, 11, 247, 252, 251, 230, 28, 5, 33, 0, 152, 12, 34, 1, 28, 43, 156, 14, 240, 0, 251, 94, 40, 0, 208, 0, 226, 173,
+ 38, 223, 172, 32, 0, 118, 25, 169, 28, 32, 34, 64, 240, 0, 252, 215, 32, 1, 66, 64, 33, 0, 145, 17, 144, 16, 35, 227,
+ 120, 42, 0, 91, 24, 235, 120, 110, 120, 232, 70, 163, 70, 148, 120, 172, 73, 217, 147, 10, 34, 228, 75, 216, 0, 82,
+ 24, 105, 24, 170, 24, 235, 145, 9, 146, 8, 147, 7, 33, 235, 74, 213, 35, 236, 0, 73, 0, 91, 24, 105, 24, 170, 24, 235,
+ 145, 6, 146, 5, 147, 4, 70, 90, 122, 82, 70, 89, 122, 9, 70, 91, 70, 144, 70, 98, 70, 137, 122, 159, 122, 217, 6, 19,
+ 4, 50, 67, 26, 2, 35, 70, 138, 67, 19, 73, 201, 67, 3, 66, 139, 209, 0, 226, 159, 70, 91, 121, 25, 41, 0, 209, 0, 226,
+ 97, 70, 68, 4, 58, 2, 35, 67, 19, 70, 78, 70, 80, 67, 51, 6, 2, 67, 19, 70, 152, 41, 15, 208, 0, 226, 104, 28, 25, 152,
+ 12, 34, 1, 28, 43, 156, 14, 240, 0, 251, 1, 40, 0, 208, 0, 226, 80, 158, 7, 152, 9, 120, 50, 120, 3, 153, 10, 2, 27,
+ 6, 18, 67, 26, 156, 8, 120, 11, 152, 6, 67, 26, 120, 0, 120, 35, 153, 5, 144, 18, 4, 27, 67, 26, 120, 9, 70, 70, 75,
+ 175, 24, 183, 154, 4, 145, 19, 24, 235, 120, 18, 147, 15, 120, 28, 70, 146, 152, 12, 28, 57, 34, 1, 28, 43, 158, 14,
+ 70, 161, 240, 0, 250, 218, 40, 0, 208, 0, 226, 40, 120, 40, 120, 110, 120, 172, 6, 3, 4, 50, 67, 26, 70, 132, 2, 35,
+ 120, 232, 67, 19, 73, 159, 67, 3, 66, 139, 209, 0, 226, 91, 153, 19, 70, 82, 4, 19, 2, 10, 67, 19, 154, 18, 70, 73,
+ 67, 19, 6, 10, 28, 25, 67, 17, 209, 0, 226, 6, 70, 66, 24, 140, 152, 12, 28, 33, 34, 1, 28, 43, 158, 14, 240, 0, 250,
+ 178, 40, 0, 208, 0, 226, 0, 152, 9, 153, 8, 120, 2, 120, 11, 158, 10, 4, 27, 2, 18, 67, 26, 152, 7, 120, 51, 153, 6,
+ 67, 26, 120, 3, 120, 9, 6, 27, 67, 26, 24, 167, 155, 4, 154, 5, 156, 15, 145, 20, 120, 18, 120, 27, 120, 36, 70, 145,
+ 70, 154, 148, 21, 152, 12, 28, 57, 34, 1, 28, 43, 158, 14, 240, 0, 250, 141, 40, 0, 208, 0, 225, 219, 120, 40, 120,
+ 110, 120, 172, 6, 3, 4, 50, 67, 26, 70, 132, 2, 35, 120, 232, 67, 19, 73, 121, 67, 3, 66, 139, 209, 0, 226, 26, 70,
+ 82, 70, 73, 4, 19, 2, 10, 67, 19, 154, 20, 153, 21, 67, 19, 6, 10, 28, 25, 67, 17, 209, 0, 225, 185, 70, 66, 24, 140,
+ 152, 12, 28, 33, 34, 1, 28, 43, 158, 14, 240, 0, 250, 101, 40, 0, 208, 0, 225, 179, 152, 9, 153, 8, 120, 2, 120, 11,
+ 158, 10, 4, 27, 2, 18, 67, 26, 152, 7, 120, 51, 153, 6, 67, 26, 120, 3, 120, 9, 6, 27, 67, 26, 24, 167, 155, 4, 154,
+ 5, 156, 15, 145, 22, 120, 18, 120, 27, 120, 36, 70, 145, 70, 154, 148, 23, 152, 12, 28, 57, 34, 1, 28, 43, 158, 14,
+ 240, 0, 250, 64, 40, 0, 208, 0, 225, 142, 120, 40, 120, 110, 120, 172, 6, 3, 4, 50, 67, 26, 70, 132, 2, 35, 120, 232,
+ 67, 19, 73, 82, 67, 3, 66, 139, 209, 0, 225, 217, 70, 82, 70, 73, 4, 19, 2, 10, 67, 19, 154, 22, 153, 23, 67, 19, 6,
+ 10, 28, 25, 67, 17, 209, 0, 225, 108, 70, 66, 24, 140, 152, 12, 28, 33, 34, 1, 28, 43, 158, 14, 240, 0, 250, 24, 40,
+ 0, 208, 0, 225, 102, 152, 9, 153, 8, 120, 2, 120, 11, 158, 10, 4, 27, 2, 18, 67, 26, 152, 7, 120, 51, 153, 6, 67, 26,
+ 120, 3, 120, 9, 6, 27, 67, 26, 24, 167, 155, 4, 154, 5, 156, 15, 145, 24, 120, 18, 120, 27, 120, 36, 70, 145, 70, 154,
+ 148, 25, 152, 12, 28, 57, 34, 1, 28, 43, 158, 14, 240, 0, 249, 243, 40, 0, 208, 0, 225, 65, 120, 40, 120, 110, 120,
+ 172, 6, 3, 4, 50, 67, 26, 70, 132, 2, 35, 120, 232, 67, 19, 73, 44, 67, 3, 66, 139, 209, 0, 225, 152, 70, 82, 70, 73,
+ 4, 19, 2, 10, 67, 19, 154, 24, 153, 25, 67, 19, 6, 10, 28, 25, 67, 17, 209, 0, 225, 31, 70, 66, 24, 140, 152, 12, 28,
+ 33, 34, 1, 28, 43, 158, 14, 240, 0, 249, 203, 40, 0, 208, 0, 225, 25, 152, 9, 153, 8, 120, 2, 120, 11, 158, 10, 4, 27,
+ 2, 18, 67, 26, 152, 7, 120, 51, 153, 6, 67, 26, 120, 3, 120, 9, 6, 27, 67, 26, 24, 167, 155, 4, 154, 5, 156, 15, 145,
+ 26, 120, 18, 120, 27, 120, 36, 70, 145, 70, 154, 148, 27, 152, 12, 28, 57, 34, 1, 28, 43, 158, 14, 240, 0, 249, 166,
+ 40, 0, 208, 0, 224, 244, 120, 40, 120, 110, 120, 172, 6, 3, 4, 50, 67, 26, 70, 132, 2, 35, 120, 232, 67, 19, 73, 5,
+ 67, 3, 66, 139, 209, 0, 225, 27, 224, 9, 0, 0, 1, 199, 0, 0, 1, 201, 0, 0, 1, 215, 87, 66, 70, 83, 0, 0, 1, 217, 70,
+ 82, 70, 73, 4, 19, 2, 10, 67, 19, 154, 26, 153, 27, 67, 19, 6, 10, 28, 25, 67, 17, 209, 0, 224, 199, 70, 66, 24, 140,
+ 152, 12, 28, 33, 34, 1, 28, 43, 158, 14, 240, 0, 249, 115, 40, 0, 208, 0, 224, 193, 152, 9, 153, 8, 120, 2, 120, 11,
+ 158, 10, 4, 27, 2, 18, 67, 26, 152, 7, 120, 51, 153, 6, 67, 26, 120, 3, 120, 9, 6, 27, 67, 26, 24, 167, 155, 4, 154,
+ 5, 156, 15, 145, 28, 120, 18, 120, 27, 120, 36, 70, 145, 70, 154, 148, 29, 152, 12, 28, 57, 34, 1, 28, 43, 158, 14,
+ 240, 0, 249, 78, 40, 0, 208, 0, 224, 156, 120, 40, 120, 110, 120, 172, 6, 3, 4, 50, 67, 26, 70, 132, 2, 35, 120, 232,
+ 67, 19, 73, 158, 67, 3, 66, 139, 209, 0, 224, 255, 70, 82, 70, 73, 4, 19, 2, 10, 67, 19, 154, 28, 153, 29, 67, 19, 6,
+ 10, 28, 25, 67, 17, 208, 123, 70, 66, 24, 140, 152, 12, 28, 33, 34, 1, 28, 43, 158, 14, 240, 0, 249, 39, 40, 0, 209,
+ 118, 152, 9, 153, 8, 120, 2, 120, 11, 158, 10, 4, 27, 2, 18, 67, 26, 152, 7, 120, 51, 153, 6, 67, 26, 120, 3, 120, 9,
+ 6, 27, 67, 26, 24, 167, 155, 4, 154, 5, 156, 15, 145, 30, 120, 18, 120, 27, 120, 36, 70, 145, 70, 154, 148, 31, 152,
+ 12, 28, 57, 34, 1, 28, 43, 158, 14, 240, 0, 249, 3, 40, 0, 209, 82, 120, 40, 120, 110, 120, 172, 6, 3, 4, 50, 67, 26,
+ 70, 132, 2, 35, 120, 232, 67, 19, 73, 121, 67, 3, 66, 139, 209, 0, 224, 193, 70, 82, 70, 73, 4, 19, 2, 10, 67, 19, 154,
+ 30, 153, 31, 67, 19, 6, 10, 28, 25, 67, 17, 208, 49, 70, 66, 24, 84, 152, 12, 28, 33, 34, 1, 28, 43, 158, 14, 240, 0,
+ 248, 221, 40, 0, 209, 44, 152, 9, 153, 8, 120, 2, 120, 11, 158, 10, 4, 27, 2, 18, 67, 26, 152, 7, 120, 51, 67, 26, 120,
+ 3, 152, 12, 6, 27, 67, 26, 24, 167, 28, 57, 34, 1, 28, 43, 156, 14, 240, 0, 248, 196, 40, 0, 209, 20, 120, 46, 120,
+ 172, 6, 51, 70, 180, 120, 110, 120, 232, 4, 50, 67, 26, 2, 35, 67, 19, 73, 90, 67, 3, 66, 139, 209, 0, 224, 143, 171,
+ 44, 69, 155, 208, 2, 33, 16, 68, 139, 229, 125, 28, 40, 247, 252, 249, 30, 36, 0, 176, 49, 28, 32, 188, 60, 70, 144,
+ 70, 153, 70, 162, 70, 171, 188, 240, 188, 2, 71, 8, 28, 25, 152, 12, 34, 1, 28, 43, 156, 14, 240, 0, 248, 152, 28, 1,
+ 40, 0, 209, 231, 120, 46, 120, 172, 6, 51, 70, 180, 120, 110, 120, 232, 4, 50, 67, 26, 2, 35, 67, 19, 74, 68, 67, 3,
+ 66, 147, 209, 211, 155, 17, 154, 59, 66, 147, 208, 124, 153, 16, 69, 136, 208, 204, 154, 17, 70, 67, 50, 1, 146, 17,
+ 147, 16, 231, 198, 70, 90, 121, 17, 229, 97, 154, 59, 155, 17, 66, 154, 208, 92, 153, 16, 66, 185, 209, 0, 230, 230,
+ 51, 1, 147, 17, 151, 16, 230, 226, 154, 59, 155, 17, 66, 154, 208, 80, 153, 16, 66, 185, 209, 0, 229, 155, 51, 1, 147,
+ 17, 151, 16, 229, 151, 154, 59, 155, 17, 66, 154, 208, 68, 153, 16, 66, 185, 209, 0, 229, 220, 51, 1, 147, 17, 151,
+ 16, 229, 216, 154, 59, 155, 17, 66, 154, 208, 56, 153, 16, 66, 185, 209, 0, 230, 29, 51, 1, 147, 17, 151, 16, 230, 25,
+ 154, 59, 155, 17, 66, 154, 208, 44, 153, 16, 66, 185, 209, 0, 230, 94, 51, 1, 147, 17, 151, 16, 230, 90, 154, 59, 155,
+ 17, 66, 154, 208, 32, 153, 16, 66, 185, 209, 0, 230, 247, 51, 1, 147, 17, 151, 16, 230, 243, 154, 59, 155, 17, 66, 154,
+ 208, 20, 153, 16, 66, 185, 209, 0, 231, 53, 51, 1, 147, 17, 151, 16, 231, 49, 154, 59, 155, 17, 66, 154, 208, 8, 153,
+ 16, 66, 143, 209, 0, 231, 103, 154, 17, 151, 16, 50, 1, 146, 17, 231, 98, 35, 0, 147, 0, 151, 1, 156, 60, 152, 14, 153,
+ 13, 154, 12, 155, 11, 148, 2, 247, 255, 251, 71, 28, 4, 28, 40, 247, 252, 248, 123, 231, 92, 70, 67, 145, 0, 147, 1,
+ 231, 238, 87, 66, 70, 83, 71, 32, 71, 48, 230, 0, 0, 16, 225, 47, 255, 30, 230, 0, 0, 48, 225, 47, 255, 30, 230, 0,
+ 0, 80, 225, 47, 255, 30, 230, 0, 0, 112, 225, 47, 255, 30, 230, 0, 0, 144, 225, 47, 255, 30, 230, 0, 0, 176, 225, 47,
+ 255, 30, 230, 0, 0, 208, 225, 47, 255, 30, 230, 0, 0, 240, 225, 47, 255, 30, 230, 0, 1, 16, 225, 47, 255, 30, 230, 0,
+ 1, 48, 225, 47, 255, 30, 230, 0, 1, 80, 225, 47, 255, 30, 230, 0, 1, 112, 225, 47, 255, 30, 230, 0, 1, 144, 225, 47,
+ 255, 30, 230, 0, 1, 176, 225, 47, 255, 30, 230, 0, 1, 208, 225, 47, 255, 30, 230, 0, 1, 240, 225, 47, 255, 30, 230,
+ 0, 2, 16, 225, 47, 255, 30, 230, 0, 2, 48, 225, 47, 255, 30, 230, 0, 2, 80, 225, 47, 255, 30, 230, 0, 2, 112, 225, 47,
+ 255, 30, 230, 0, 2, 144, 225, 47, 255, 30, 230, 0, 2, 176, 225, 47, 255, 30, 230, 0, 2, 208, 225, 47, 255, 30, 230,
+ 0, 2, 240, 225, 47, 255, 30, 230, 0, 3, 16, 225, 47, 255, 30, 230, 0, 3, 48, 225, 47, 255, 30, 230, 0, 3, 80, 225, 47,
+ 255, 30, 230, 0, 3, 112, 225, 47, 255, 30, 230, 0, 3, 144, 225, 47, 255, 30, 230, 0, 3, 176, 225, 47, 255, 30, 230,
+ 0, 3, 208, 225, 47, 255, 30, 230, 0, 3, 240, 225, 47, 255, 30, 230, 0, 4, 16, 225, 47, 255, 30, 230, 0, 4, 48, 225,
+ 47, 255, 30, 230, 0, 4, 80, 225, 47, 255, 30, 230, 0, 4, 112, 225, 47, 255, 30, 230, 0, 4, 144, 225, 47, 255, 30, 230,
+ 0, 4, 176, 225, 47, 255, 30, 230, 0, 4, 208, 225, 47, 255, 30, 230, 0, 4, 240, 225, 47, 255, 30, 230, 0, 5, 16, 225,
+ 47, 255, 30, 230, 0, 5, 48, 225, 47, 255, 30, 230, 0, 5, 80, 225, 47, 255, 30, 230, 0, 6, 144, 225, 47, 255, 30, 230,
+ 0, 7, 240, 225, 47, 255, 30, 230, 0, 8, 16, 225, 47, 255, 30, 230, 0, 10, 16, 225, 47, 255, 30, 41, 0, 208, 52, 35,
+ 1, 34, 0, 180, 16, 66, 136, 211, 44, 36, 1, 7, 36, 66, 161, 210, 4, 66, 129, 210, 2, 1, 9, 1, 27, 231, 248, 0, 228,
+ 66, 161, 210, 4, 66, 129, 210, 2, 0, 73, 0, 91, 231, 248, 66, 136, 211, 1, 26, 64, 67, 26, 8, 76, 66, 160, 211, 2, 27,
+ 0, 8, 92, 67, 34, 8, 140, 66, 160, 211, 2, 27, 0, 8, 156, 67, 34, 8, 204, 66, 160, 211, 2, 27, 0, 8, 220, 67, 34, 40,
+ 0, 208, 3, 9, 27, 208, 1, 9, 9, 231, 227, 28, 16, 188, 16, 71, 112, 181, 2, 240, 0, 248, 94, 32, 0, 188, 6, 71, 16,
+ 70, 192, 181, 3, 247, 255, 255, 191, 188, 14, 67, 66, 26, 137, 71, 24, 70, 192, 41, 0, 208, 65, 180, 16, 28, 4, 64,
+ 76, 70, 164, 35, 1, 34, 0, 41, 0, 213, 0, 66, 73, 40, 0, 213, 0, 66, 64, 66, 136, 211, 44, 36, 1, 7, 36, 66, 161, 210,
+ 4, 66, 129, 210, 2, 1, 9, 1, 27, 231, 248, 0, 228, 66, 161, 210, 4, 66, 129, 210, 2, 0, 73, 0, 91, 231, 248, 66, 136,
+ 211, 1, 26, 64, 67, 26, 8, 76, 66, 160, 211, 2, 27, 0, 8, 92, 67, 34, 8, 140, 66, 160, 211, 2, 27, 0, 8, 156, 67, 34,
+ 8, 204, 66, 160, 211, 2, 27, 0, 8, 220, 67, 34, 40, 0, 208, 3, 9, 27, 208, 1, 9, 9, 231, 227, 28, 16, 70, 100, 44, 0,
+ 213, 0, 66, 64, 188, 16, 71, 112, 181, 2, 240, 0, 248, 11, 32, 0, 188, 6, 71, 16, 181, 3, 247, 255, 255, 179, 188, 14,
+ 67, 66, 26, 137, 71, 24, 70, 192, 71, 112, 70, 192, 181, 112, 28, 14, 28, 21, 28, 4, 42, 3, 217, 32, 28, 51, 67, 3,
+ 7, 154, 208, 18, 120, 35, 120, 8, 66, 131, 209, 27, 30, 106, 224, 6, 52, 1, 49, 1, 120, 35, 120, 8, 58, 1, 66, 131,
+ 209, 18, 42, 0, 209, 246, 32, 0, 188, 112, 188, 2, 71, 8, 104, 2, 104, 11, 66, 154, 209, 4, 61, 4, 48, 4, 49, 4, 45,
+ 3, 216, 246, 28, 4, 45, 0, 209, 224, 231, 238, 26, 24, 231, 237, 181, 240, 28, 7, 28, 14, 28, 4, 28, 21, 28, 8, 28,
+ 17, 42, 15, 217, 3, 28, 51, 67, 59, 7, 154, 208, 11, 41, 0, 208, 5, 34, 0, 92, 131, 84, 163, 50, 1, 66, 138, 209, 250,
+ 28, 56, 188, 240, 188, 2, 71, 8, 28, 58, 28, 49, 28, 40, 104, 11, 96, 19, 104, 75, 96, 83, 104, 139, 96, 147, 104, 203,
+ 56, 16, 96, 211, 49, 16, 50, 16, 40, 15, 216, 242, 28, 43, 59, 16, 9, 26, 1, 17, 50, 1, 1, 18, 26, 89, 24, 176, 24,
+ 188, 41, 3, 217, 216, 34, 0, 88, 131, 80, 163, 50, 4, 26, 139, 43, 3, 216, 249, 31, 11, 8, 154, 0, 145, 50, 1, 0, 146,
+ 26, 89, 24, 128, 24, 164, 231, 200, 181, 240, 28, 7, 70, 140, 28, 16, 28, 57, 7, 186, 208, 14, 40, 0, 208, 73, 70, 98,
+ 6, 19, 56, 1, 14, 27, 34, 3, 224, 2, 40, 0, 208, 65, 56, 1, 112, 11, 49, 1, 66, 17, 209, 248, 28, 5, 28, 10, 40, 3,
+ 217, 46, 35, 255, 70, 98, 64, 26, 2, 19, 67, 19, 4, 26, 28, 20, 28, 14, 67, 28, 40, 15, 217, 18, 28, 2, 28, 11, 58,
+ 16, 96, 28, 96, 92, 96, 156, 96, 220, 51, 16, 42, 15, 216, 247, 28, 3, 59, 16, 28, 29, 9, 27, 51, 1, 34, 15, 1, 27,
+ 64, 21, 24, 206, 45, 3, 217, 13, 34, 0, 80, 180, 50, 4, 26, 171, 43, 3, 216, 250, 31, 43, 28, 29, 8, 155, 51, 1, 34,
+ 3, 0, 155, 64, 21, 24, 246, 28, 50, 45, 0, 208, 7, 70, 97, 6, 11, 14, 25, 35, 0, 84, 209, 51, 1, 66, 157, 209, 251,
+ 28, 56, 188, 240, 188, 2, 71, 8, 70, 192, 181, 48, 28, 11, 67, 3, 7, 154, 209, 28, 104, 2, 104, 11, 66, 154, 209, 24,
+ 76, 16, 25, 19, 67, 147, 74, 15, 66, 19, 209, 11, 28, 20, 48, 4, 49, 4, 104, 2, 104, 11, 66, 154, 209, 11, 77, 9, 25,
+ 83, 67, 147, 66, 35, 208, 244, 32, 0, 224, 9, 120, 10, 66, 154, 209, 5, 48, 1, 49, 1, 120, 3, 43, 0, 209, 247, 120,
+ 10, 26, 152, 188, 48, 188, 2, 71, 8, 254, 254, 254, 255, 128, 128, 128, 128, 181, 48, 28, 4, 7, 129, 208, 10, 120, 3,
+ 43, 0, 208, 33, 34, 3, 224, 2, 120, 3, 43, 0, 208, 24, 48, 1, 66, 16, 209, 249, 104, 2, 77, 13, 25, 83, 67, 147, 74,
+ 13, 66, 19, 209, 11, 28, 17, 48, 4, 104, 2, 77, 9, 25, 83, 67, 147, 66, 11, 208, 248, 120, 3, 43, 0, 208, 3, 48, 1,
+ 120, 3, 43, 0, 209, 251, 27, 0, 188, 48, 188, 2, 71, 8, 32, 0, 231, 250, 70, 192, 254, 254, 254, 255, 128, 128, 128,
+ 128, 73, 79, 83, 32, 109, 111, 100, 117, 108, 101, 0, 0, 0, 0, 0, 1, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 19, 114, 74, 60, 0, 15, 66, 64, 47, 100, 101, 118, 47, 102, 97, 116, 47, 108, 111, 103, 0, 0, 0, 0, 87, 66,
+ 70, 83, 32, 110, 111, 116, 32, 101, 110, 111, 117, 103, 104, 32, 109, 101, 109, 111, 114, 121, 33, 0, 101, 104, 99,
+ 32, 108, 111, 111, 112, 32, 101, 110, 116, 114, 121, 0, 0, 47, 100, 101, 118, 47, 117, 115, 98, 47, 101, 104, 99, 0,
+ 0, 0, 0, 47, 100, 101, 118, 47, 117, 115, 98, 47, 101, 104, 99, 47, 0, 0, 0, 85, 77, 83, 32, 73, 110, 105, 116, 0, 0,
+ 0, 0, 87, 66, 70, 83, 32, 79, 112, 101, 110, 40, 41, 0, 85, 77, 83, 32, 102, 97, 105, 108, 0, 0, 0, 0, 47, 100, 101,
+ 118, 47, 109, 108, 111, 97, 100, 0, 0, 85, 83, 66, 83, 116, 111, 114, 97, 103, 101, 95, 67, 108, 111, 115, 101, 40,
+ 41, 0, 0, 85, 83, 66, 32, 65, 108, 108, 111, 99, 58, 32, 110, 111, 116, 32, 101, 110, 111, 117, 103, 104, 32, 109, 101,
+ 109, 111, 114, 121, 33, 0, 0, 0, 119, 98, 102, 115, 32, 101, 114, 114, 111, 114, 0, 0, 97, 108, 108, 111, 99, 97, 116,
+ 105, 110, 103, 32, 109, 101, 109, 111, 114, 121, 0, 0, 0, 98, 97, 100, 32, 109, 97, 103, 105, 99, 0, 0, 0, 104, 100,
+ 32, 115, 101, 99, 116, 111, 114, 32, 115, 105, 122, 101, 32, 100, 111, 101, 115, 110, 39, 116, 32, 109, 97, 116, 99,
+ 104, 0, 0, 0, 0, 104, 100, 32, 110, 117, 109, 32, 115, 101, 99, 116, 111, 114, 32, 100, 111, 101, 115, 110, 39, 116,
+ 32, 109, 97, 116, 99, 104, 0
+};
diff --git a/source/ehcmodule.h b/source/ehcmodule.h
new file mode 100644
index 00000000..db3b22d5
--- /dev/null
+++ b/source/ehcmodule.h
@@ -0,0 +1,3 @@
+#define size_ehcmodule 18412
+
+extern unsigned char ehcmodule[18412];
diff --git a/source/libwbfs/libwbfs.c b/source/libwbfs/libwbfs.c
index b891c3b5..bc6032c9 100644
--- a/source/libwbfs/libwbfs.c
+++ b/source/libwbfs/libwbfs.c
@@ -25,42 +25,131 @@ static u8 size_to_shift(u32 size)
size>>=1;
}
return ret-1;
-}
+}
+
#define read_le32_unaligned(x) ((x)[0]|((x)[1]<<8)|((x)[2]<<16)|((x)[3]<<24))
-wbfs_t*wbfs_open_hd(rw_sector_callback_t read_hdsector,
- rw_sector_callback_t write_hdsector,
- void *callback_data,
- int hd_sector_size, int num_hd_sector __attribute((unused)), int reset)
-{
- int i=num_hd_sector,ret;
- u8 *ptr,*tmp_buffer = wbfs_ioalloc(hd_sector_size);
- u8 part_table[16*4];
- ret = read_hdsector(callback_data,0,1,tmp_buffer);
- if(ret)
- return 0;
- //find wbfs partition
- wbfs_memcpy(part_table,tmp_buffer+0x1be,16*4);
- ptr = part_table;
- for(i=0;i<4;i++,ptr+=16)
- {
- u32 part_lba = read_le32_unaligned(ptr+0x8);
- wbfs_head_t *head = (wbfs_head_t *)tmp_buffer;
- ret = read_hdsector(callback_data,part_lba,1,tmp_buffer);
- // verify there is the magic.
- if (head->magic == wbfs_htonl(WBFS_MAGIC))
- {
- wbfs_t*p = wbfs_open_partition(read_hdsector,write_hdsector,
- callback_data,hd_sector_size,0,part_lba,reset);
- return p;
- }
- }
- if(reset)// XXX make a empty hd partition..
- {
- }
- return 0;
-}
+u32 WBFS_part_list[4]={0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF};
+
+
+u32 wbfs_get_partition_LBA(int index)
+{
+ return WBFS_part_list[index & 3];
+}
+
+
+wbfs_t*wbfs_open_hd(rw_sector_callback_t read_hdsector,
+ rw_sector_callback_t write_hdsector,
+ void *callback_data,
+ int hd_sector_size, int num_hd_sector __attribute((unused)), int reset)
+{
+ int i=num_hd_sector,ret;
+ u8 *ptr,*tmp_buffer = wbfs_ioalloc(hd_sector_size);
+ u8 part_table[16*4];
+ int l;
+
+ ret = read_hdsector(callback_data,0,1,tmp_buffer);
+ if(ret)
+ {
+ wbfs_iofree(tmp_buffer);
+ return 0;
+ }
+ //find wbfs partition
+ wbfs_memcpy(part_table,tmp_buffer+0x1be,16*4);
+ ptr = part_table;
+
+ for(l=0;l<4;l++) WBFS_part_list[l]=0xFFFFFFFF;
+
+ l=0;
+
+ for(i=0;i<4;i++,ptr+=16)
+ {
+ u32 part_lba = read_le32_unaligned(ptr+0x8);
+ wbfs_head_t *head = (wbfs_head_t *)tmp_buffer;
+
+ #if 1
+ if(head->magic != wbfs_htonl(WBFS_MAGIC))
+ if(ptr[4]==0) continue;
+
+ if(ptr[4]==0xf)
+ {
+ u32 part_lba2=part_lba;
+ u32 next_lba2=0;
+ int n;
+
+ for(n=0;n<8;n++) // max 8 logic partitions (i think it is sufficient!)
+ {
+ ret = read_hdsector(callback_data,part_lba+next_lba2 ,1,tmp_buffer);
+ if(ret)
+ {
+ wbfs_iofree(tmp_buffer);
+ return 0;
+ }
+
+ part_lba2=part_lba+next_lba2+read_le32_unaligned(tmp_buffer+0x1C6);
+ next_lba2=read_le32_unaligned(tmp_buffer+0x1D6);
+
+ ret = read_hdsector(callback_data,part_lba2,1,tmp_buffer);
+ if(ret)
+ {
+ wbfs_iofree(tmp_buffer);
+ return 0;
+ }
+ // verify there is the magic.
+ if (head->magic == wbfs_htonl(WBFS_MAGIC))
+ {
+
+ WBFS_part_list[l]=part_lba2;
+ if(l>0 && WBFS_part_list[l-1]==WBFS_part_list[l]) WBFS_part_list[l]=0xFFFFFFFF;
+ else l++; if(l>=4) break;
+
+ /*wbfs_t*p = wbfs_open_partition(read_hdsector,write_hdsector,
+ callback_data,hd_sector_size,0,part_lba2,reset);
+ return p;*/
+ }
+
+ if(next_lba2==0) break;
+ }
+ }
+ else
+ #endif
+ {
+ ret = read_hdsector(callback_data,part_lba,1,tmp_buffer);
+
+ if(ret)
+ {
+ wbfs_iofree(tmp_buffer);
+ return 0;
+ }
+ // verify there is the magic.
+ if (head->magic == wbfs_htonl(WBFS_MAGIC))
+ {
+ WBFS_part_list[l]=part_lba;
+ if(l>0 && WBFS_part_list[l-1]==WBFS_part_list[l]) WBFS_part_list[l]=0xFFFFFFFF;
+ else l++; if(l>=4) break;
+ /*
+ wbfs_t*p = wbfs_open_partition(read_hdsector,write_hdsector,
+ callback_data,hd_sector_size,0,part_lba,reset);
+ return p;*/
+ }
+ }
+
+ if(l>=4) break;
+ }
+
+ wbfs_iofree(tmp_buffer);
+
+ if(WBFS_part_list[0]==0xFFFFFFFF) return 0;
+
+ // open the first partition finded
+
+ wbfs_t*p = wbfs_open_partition(read_hdsector,write_hdsector,
+ callback_data,hd_sector_size,0,WBFS_part_list[0],reset);
+ return p;
+
+}
+
wbfs_t*wbfs_open_partition(rw_sector_callback_t read_hdsector,
rw_sector_callback_t write_hdsector,
void *callback_data,
diff --git a/source/libwbfs/libwbfs.h b/source/libwbfs/libwbfs.h
index 2f6f1a9f..d5ef15c7 100644
--- a/source/libwbfs/libwbfs.h
+++ b/source/libwbfs/libwbfs.h
@@ -122,6 +122,15 @@ wbfs_t*wbfs_open_hd(rw_sector_callback_t read_hdsector,
rw_sector_callback_t write_hdsector,
void *callback_data,
int hd_sector_size, int num_hd_sector, int reset);
+
+/* call wbfs_open_hd at first time to find the WBFS partition on the HDD (max 4 partitions)
+
+wbfs_get_partition_LBA receive 0 to 3 as partition index (first, second...) and return 0xFFFFFFFF if WBFS partition is not finded
+
+
+*/
+
+u32 wbfs_get_partition_LBA(int index);
/*! @brief open a wbfs partition
@param read_hdsector,write_hdsector: accessors to the partition
diff --git a/source/libwbfs/libwbfs_os.h b/source/libwbfs/libwbfs_os.h
index 7b3efbaa..fe910aae 100644
--- a/source/libwbfs/libwbfs_os.h
+++ b/source/libwbfs/libwbfs_os.h
@@ -14,7 +14,8 @@
#define wbfs_malloc(x) malloc(x)
#define wbfs_free(x) free(x)
-#define wbfs_ioalloc(x) memalign(32, x)
+#define wbfs_ioalloc(x) memalign(32, x)
+#define wbfs_iofree(x) free(x) // XXX should allocate in a ios heap
#define wbfs_iofree(x) free(x)
#define wbfs_be16(x) (*((u16*)(x)))
#define wbfs_be32(x) (*((u32*)(x)))
diff --git a/source/main.cpp b/source/main.cpp
index f8dabcc7..1038f1c7 100644
--- a/source/main.cpp
+++ b/source/main.cpp
@@ -34,6 +34,7 @@
#include "cfg.h"
#include "language.h"
#include "fat.h"
+#include "mload.h"
/* Constants */
@@ -69,7 +70,7 @@ main(int argc, char *argv[])
{
s32 ret2;
-
+
SDCard_Init(); // mount SD for loading cfg's
USBDevice_Init(); // and mount USB:/
bool bootDevice_found=false;
diff --git a/source/menu.cpp b/source/menu.cpp
index 38eaa11e..8a0fb754 100644
--- a/source/menu.cpp
+++ b/source/menu.cpp
@@ -32,6 +32,7 @@
#include "PromptWindows.h"
#include "Settings.h"
#include "gameinfo.h"
+#include "mload.h"
//#include "xml.h" /* XML - Lustar*/
@@ -1216,8 +1217,8 @@ static int MenuDiscList()
if (Settings.qboot == yes)//quickboot game
{
- wiilight(0);
- //////////save game play count////////////////
+ wiilight(0);
+ //////////save game play count////////////////
extern u8 favorite;
extern u16 count;
struct Game_NUM* game_num = CFG_get_game_num(header->id);
@@ -1241,87 +1242,12 @@ static int MenuDiscList()
}
}
////////////end save play count//////////////
-
- struct Game_CFG* game_cfg = CFG_get_game_opt(header->id);
-
- if (game_cfg)//if there are saved settings for this game use them
- {
- iosChoice = game_cfg->ios;
+ menu = MENU_EXIT;
+ break;
}
- else// otherwise use the global settings
- {
- if(Settings.cios == ios222) {
- iosChoice = i222;
- } else {
- iosChoice = i249;
- }
- }
-
- int ios2;
- switch(iosChoice)
- {
- case i249:
- ios2 = 0;
- break;
-
- case i222:
- ios2 = 1;
- break;
-
- default:
- ios2 = 0;
- break;
- }
-
- // if we have used the network or cios222 we need to reload the disklist
- if(networkisinitialized == 1 || ios2 == 1 || Settings.cios == ios222)
- {
- if(ios2 == 1)
- {
- ret = Sys_IosReload(222);
-
- if(ret < 0)
- {
- WindowPrompt(LANGUAGE.YoudonthavecIOS,LANGUAGE.LoadingincIOS,LANGUAGE.ok, 0,0,0);
- Sys_IosReload(249);
- ios2 = 0;
- }
- }
- else
- {
- ret = Sys_IosReload(249);
- }
- }
-
- /* Set USB mode */
- ret = Disc_SetUSB(header->id, ios2);
- if (ret < 0) {
- sprintf(text, "%s %i", LANGUAGE.Error,ret);
- WindowPrompt(
- LANGUAGE.FailedtosetUSB,
- text,
- LANGUAGE.ok,0,0,0);
- }
- else {
- /* Open disc */
- ret = Disc_Open();
- if (ret < 0) {
- sprintf(text, "%s %i",LANGUAGE.Error, ret);
- WindowPrompt(
- LANGUAGE.Failedtoboot,
- text,
- LANGUAGE.ok,0,0,0);
- }
- else {
- menu = MENU_EXIT;
- }
- }
- break;
- }
bool returnHere = true;// prompt to start game
while (returnHere)
{
-
returnHere = false;
if(Settings.wiilight != 2) wiilight(1);
choice = GameWindowPrompt();
@@ -1329,101 +1255,26 @@ static int MenuDiscList()
if(choice == 1)
{
-
wiilight(0);
- struct Game_CFG* game_cfg = CFG_get_game_opt(header->id);
- if (game_cfg)//if there are saved settings for this game use them
- {
- iosChoice = game_cfg->ios;
- }
- else// otherwise use the global settings
- {
- if(Settings.cios == ios222) {
- iosChoice = i222;
- } else {
- iosChoice = i249;
- }
- }
-
-
- int ios2;
- switch(iosChoice)
- {
- case i249:
- ios2 = 0;
- break;
-
- case i222:
- ios2 = 1;
- break;
-
- default:
- ios2 = 0;
- break;
- }
-
- // if we have used the network or cios222 we need to reload the disklist
- if(networkisinitialized == 1 || ios2 == 1 || Settings.cios == ios222)
- {
- if(ios2 == 1)
- {
- ret = Sys_IosReload(222);
- if(ret < 0)
- {
- WindowPrompt(LANGUAGE.YoudonthavecIOS,LANGUAGE.LoadingincIOS,LANGUAGE.ok, 0,0,0);
- Sys_IosReload(249);
- ios2 = 0;
- }
- }
- else
- {
- ret = Sys_IosReload(249);
- }
- }
-
-
-
- /* Set USB mode */
- ret = Disc_SetUSB(header->id, ios2);
- if (ret < 0) {
- sprintf(text, "%s %i", LANGUAGE.Error, ret);
- WindowPrompt(
- LANGUAGE.FailedtosetUSB,
- text,
- LANGUAGE.ok,0,0,0);
- }
- else {
- /* Open disc */
- ret = Disc_Open();
- if (ret < 0) {
- sprintf(text, "%s %i",LANGUAGE.Error, ret);
- WindowPrompt(
- LANGUAGE.Failedtoboot,
- text,
- LANGUAGE.ok,0,0,0);
-
- }
- else {
- menu = MENU_EXIT;
- }
- }
+ returnHere = false;
+ menu = MENU_EXIT;
}
else if (choice == 2)
{
wiilight(0);
HaltGui();
- if (Settings.gameDisplay==list) mainWindow->Remove(gameBrowser);
- else if (Settings.gameDisplay==grid) mainWindow->Remove(gameGrid);
- else if (Settings.gameDisplay==carousel) mainWindow->Remove(gameCarousel);
- mainWindow->Remove(&w);
- ResumeGui();
+ if (Settings.gameDisplay==list) mainWindow->Remove(gameBrowser);
+ else if (Settings.gameDisplay==grid) mainWindow->Remove(gameGrid);
+ else if (Settings.gameDisplay==carousel) mainWindow->Remove(gameCarousel);
+ mainWindow->Remove(&w);
+ ResumeGui();
int settret = GameSettings(header);
HaltGui();
- if (Settings.gameDisplay==list) mainWindow->Append(gameBrowser);
- else if (Settings.gameDisplay==grid) mainWindow->Append(gameGrid);
- else if (Settings.gameDisplay==carousel) mainWindow->Append(gameCarousel);
- mainWindow->Append(&w);
- ResumeGui();
+ if (Settings.gameDisplay==list) mainWindow->Append(gameBrowser);
+ else if (Settings.gameDisplay==grid) mainWindow->Append(gameGrid);
+ else if (Settings.gameDisplay==carousel) mainWindow->Append(gameCarousel);
+ mainWindow->Append(&w);
+ ResumeGui();
if (settret == 1) //if deleted
{
menu = MENU_DISCLIST;
@@ -1446,12 +1297,11 @@ static int MenuDiscList()
menu = MENU_DISCLIST;
}
}
-
-
- else if(choice == 0)
+ else if(choice == 0) {
if (Settings.gameDisplay==list){gameBrowser->SetFocus(1);}
else if (Settings.gameDisplay==grid){gameGrid->SetFocus(1);}
else if (Settings.gameDisplay==carousel){gameCarousel->SetFocus(1);}
+ }
}
}
}
@@ -1479,11 +1329,7 @@ static int MenuInstall()
int menu = MENU_NONE;
static struct discHdr headerdisc ATTRIBUTE_ALIGN(32);
- if(Settings.cios == ios222) {
- Disc_SetUSB(NULL, 1);
- } else {
- Disc_SetUSB(NULL, 0);
- }
+ Disc_SetUSB(NULL, GetPartition());
int ret, choice = 0;
char *name;
@@ -1741,7 +1587,10 @@ static int MenuFormat()
menu = MENU_SETTINGS;
} else {
- WBFS_Open();
+ for(int i = 0; i < 4; i++) {
+ ret = WBFS_Open2(i);
+ if(ret == 0) break;
+ }
sprintf(text, "%s %s", text,LANGUAGE.formated);
WindowPrompt(LANGUAGE.Success,text,LANGUAGE.ok,0,0,0);
menu = MENU_DISCLIST;
@@ -1791,7 +1640,7 @@ static int MenuCheck()
int menu = MENU_NONE;
int i = 0;
int choice;
- s32 ret, ret2;
+ s32 ret2;
OptionList options;
options.length = i;
partitionEntry partitions[MAX_PARTITIONS];
@@ -1810,26 +1659,10 @@ static int MenuCheck()
} else if(ret2 == 2) {
if(Settings.cios != ios222)
{
- //shutdown WiiMote before IOS Reload
- WPAD_Flush(0);
- WPAD_Disconnect(0);
- WPAD_Shutdown();
-
- //shutdown SD and USB before IOS Reload
- SDCard_deInit();
- USBDevice_deInit();
- ret = IOS_ReloadIOS(222);
- if(ret < 0)
- IOS_ReloadIOS(249);
- //reinitialize WiiMote for Prompt
- PAD_Init();
- Wpad_Init();
- WPAD_SetDataFormat(WPAD_CHAN_ALL,WPAD_FMT_BTNS_ACC_IR);
- WPAD_SetVRes(WPAD_CHAN_ALL, screenwidth, screenheight);
- //reinitialize SD and USB
- SDCard_Init();
- USBDevice_Init();
- if(ret < 0)
+ ret2 = Sys_IosReload(222);
+ if(ret2 < 0)
+ Sys_IosReload(249);
+ if(ret2 < 0)
WindowPrompt(LANGUAGE.YoudonthavecIOS,LANGUAGE.LoadingincIOS,LANGUAGE.ok, 0,0,0);
else
Settings.cios = ios222;
@@ -1838,21 +1671,7 @@ static int MenuCheck()
Sys_LoadMenu();
}
- //shutdown WiiMote before IOS Reload
- WPAD_Flush(0);
- WPAD_Disconnect(0);
- WPAD_Shutdown();
-
- //shutdown SD and USB before IOS Reload in DiscWait
- SDCard_deInit();
- USBDevice_deInit();
-
ret2 = DiscWait(LANGUAGE.NoUSBDevice, LANGUAGE.WaitingforUSBDevice, 0, 0, 1);
- //reinitialize WiiMote for Prompt
- PAD_Init();
- Wpad_Init();
- WPAD_SetDataFormat(WPAD_CHAN_ALL,WPAD_FMT_BTNS_ACC_IR);
- WPAD_SetVRes(WPAD_CHAN_ALL, screenwidth, screenheight);
//reinitialize SD and USB
SDCard_Init();
USBDevice_Init();
@@ -1868,7 +1687,10 @@ static int MenuCheck()
Sys_LoadMenu();
}
- ret2 = WBFS_Open();
+ for(i = 0; i < 4; i++) {
+ ret2 = WBFS_Open2(i);
+ if(ret2 == 0) break;
+ }
if (ret2 < 0) {
choice = WindowPrompt(LANGUAGE.NoWBFSpartitionfound,
LANGUAGE.Youneedtoformatapartition,
@@ -1973,8 +1795,8 @@ int MainMenu(int menu)
break;
}
}
- ExitGUIThreads();
+ ExitGUIThreads();
bgMusic->Stop();
delete bgMusic;
@@ -1994,28 +1816,62 @@ int MainMenu(int menu)
StopGX();
ShutdownAudio();
- SDCard_deInit();
- USBDevice_deInit();
-
+ int ret = 0;
struct discHdr *header = &gameList[gameSelected];
+
struct Game_CFG* game_cfg = CFG_get_game_opt(header->id);
if (game_cfg) {
-
videoChoice = game_cfg->video;
languageChoice = game_cfg->language;
ocarinaChoice = game_cfg->ocarina;
viChoice = game_cfg->vipatch;
fix002 = game_cfg->errorfix002;
-
+ iosChoice = game_cfg->ios;
} else {
-
videoChoice = Settings.video;
languageChoice = Settings.language;
ocarinaChoice = Settings.ocarina;
viChoice = Settings.vpatch;
+ if(Settings.cios == ios222) {
+ iosChoice = i222;
+ } else {
+ iosChoice = i249;
+ }
fix002 = off;
}
+ int ios2;
+ switch(iosChoice) {
+ case i249:
+ ios2 = 249;
+ break;
+
+ case i222:
+ ios2 = 222;
+ break;
+
+ default:
+ ios2 = 249;
+ break;
+ }
+
+ if(networkisinitialized == 1 || (iosChoice == i249 && Settings.cios == 1) || (iosChoice == i222 && Settings.cios == 0)) {
+ /*Needed for IOS Reload */
+ ResumeGui();
+ ret = Sys_IosReload(ios2);
+ if(ret < 0) {
+ Sys_IosReload(249);
+ exit(0);
+ }
+ }
+
+ ret = Disc_SetUSB(header->id, GetPartition());
+ if(ret < 0) Sys_BackToLoader();
+ ret = Disc_Open();
+ if(ret < 0) Sys_BackToLoader();
+
+ SDCard_deInit();
+ USBDevice_deInit();
u8 errorfixer002 = 0;
switch(fix002)
@@ -2146,7 +2002,7 @@ int MainMenu(int menu)
break;
}
- int ret = 0;
+ mload_close();
ret = Disc_WiiBoot(videoselected, cheat, vipatch, Settings.patchcountrystrings, errorfixer002);
if (ret < 0) {
Sys_LoadMenu();
diff --git a/source/mload.c b/source/mload.c
new file mode 100644
index 00000000..e8122302
--- /dev/null
+++ b/source/mload.c
@@ -0,0 +1,494 @@
+/* mload.c (for PPC) (c) 2009, Hermes
+
+ 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
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+*/
+
+#include "mload.h"
+#include "ehcmodule.h"
+#include "dip_plugin.h"
+
+static const char mload_fs[] ATTRIBUTE_ALIGN(32) = "/dev/mload";
+static u32 patch_datas[8] ATTRIBUTE_ALIGN(32);
+static s32 mload_fd = -1;
+
+
+/*--------------------------------------------------------------------------------------------------------------*/
+
+// to init/test if the device is running
+
+int mload_init()
+{
+int n;
+
+ if(mload_fd>=0) return 0;
+
+ for(n=0;n<10;n++) // try 2.5 seconds
+ {
+ mload_fd=IOS_Open(mload_fs, 0);
+
+ if(mload_fd>=0) break;
+
+ usleep(250*1000);
+ }
+
+return mload_fd;
+}
+
+/*--------------------------------------------------------------------------------------------------------------*/
+
+// to close the device (remember call it when rebooting the IOS!)
+
+int mload_close()
+{
+int ret;
+
+ if(mload_fd<0) return -1;
+
+ ret=IOS_Close(mload_fd);
+
+ mload_fd=-1;
+
+return ret;
+}
+
+/*--------------------------------------------------------------------------------------------------------------*/
+
+// to get the thread id of mload
+
+int mload_get_thread_id()
+{
+int ret;
+s32 hid = -1;
+
+
+ if(mload_init()<0) return -1;
+
+ hid = iosCreateHeap(0x800);
+
+ if(hid<0) return hid;
+
+ ret= IOS_IoctlvFormat(hid, mload_fd, MLOAD_MLOAD_THREAD_ID, ":");
+
+
+ iosDestroyHeap(hid);
+
+return ret;
+
+}
+
+/*--------------------------------------------------------------------------------------------------------------*/
+
+// get the base and the size of the memory readable/writable to load modules
+
+int mload_get_load_base(u32 *starlet_base, int *size)
+{
+int ret;
+s32 hid = -1;
+
+
+ if(mload_init()<0) return -1;
+
+ hid = iosCreateHeap(0x800);
+
+ if(hid<0) return hid;
+
+ ret= IOS_IoctlvFormat(hid, mload_fd, MLOAD_GET_LOAD_BASE, ":ii",starlet_base, size);
+
+
+ iosDestroyHeap(hid);
+
+return ret;
+
+}
+
+/*--------------------------------------------------------------------------------------------------------------*/
+
+// load and run a module from starlet (it need to allocate MEM2 to send the elf file)
+// the module must be a elf made with stripios
+
+int mload_module(void *addr, int len)
+{
+int ret;
+void *buf=NULL;
+s32 hid = -1;
+
+ if(mload_init()<0) return -1;
+
+ hid = iosCreateHeap(len+0x800);
+
+ if(hid<0) return hid;
+
+ buf= iosAlloc(hid, len);
+
+ if(!buf) {ret= -1;goto out;}
+
+
+ memcpy(buf, addr,len);
+
+ ret = IOS_IoctlvFormat(hid, mload_fd, MLOAD_LOAD_MODULE, ":d", buf, len);
+
+ if(ret<0) goto out;
+
+ ret=IOS_IoctlvFormat(hid, mload_fd, MLOAD_RUN_MODULE, ":");
+
+ if(ret<0) {ret= -666;goto out;}
+
+out:
+
+ iosDestroyHeap(hid);
+
+return ret;
+
+}
+
+/*--------------------------------------------------------------------------------------------------------------*/
+
+// load a module from the PPC
+// the module must be a elf made with stripios
+
+int mload_elf(void *my_elf, data_elf *data_elf)
+{
+int n,m;
+int p;
+u8 *adr;
+u32 elf=(u32) my_elf;
+
+if(elf & 3) return -1; // aligned to 4 please!
+
+elfheader *head=(void *) elf;
+elfphentry *entries;
+
+if(head->ident0!=0x7F454C46) return -1;
+if(head->ident1!=0x01020161) return -1;
+if(head->ident2!=0x01000000) return -1;
+
+p=head->phoff;
+
+data_elf->start=(void *) head->entry;
+
+for(n=0; nphnum; n++)
+ {
+ entries=(void *) (elf+p);
+ p+=sizeof(elfphentry);
+
+ if(entries->type == 4)
+ {
+ adr=(void *) (elf + entries->offset);
+
+ if(getbe32(0)!=0) return -2; // bad info (sure)
+
+ for(m=4; m < entries->memsz; m+=8)
+ {
+ switch(getbe32(m))
+ {
+ case 0x9:
+ data_elf->start= (void *) getbe32(m+4);
+ break;
+ case 0x7D:
+ data_elf->prio= getbe32(m+4);
+ break;
+ case 0x7E:
+ data_elf->size_stack= getbe32(m+4);
+ break;
+ case 0x7F:
+ data_elf->stack= (void *) (getbe32(m+4));
+ break;
+
+ }
+
+ }
+
+ }
+ else
+ if(entries->type == 1 && entries->memsz != 0 && entries->vaddr!=0)
+ {
+
+ if(mload_memset((void *) entries->vaddr, 0, entries->memsz)<0) return -1;
+ if(mload_seek(entries->vaddr, SEEK_SET)<0) return -1;
+ if(mload_write((void *) (elf + entries->offset), entries->filesz)<0) return -1;
+
+ }
+ }
+
+return 0;
+}
+
+/*--------------------------------------------------------------------------------------------------------------*/
+
+// run one thread (you can use to load modules or binary files)
+
+int mload_run_thread(void *starlet_addr, void *starlet_top_stack, int stack_size, int priority)
+{
+int ret;
+s32 hid = -1;
+
+
+ if(mload_init()<0) return -1;
+
+ hid = iosCreateHeap(0x800);
+
+ if(hid<0) return hid;
+
+ ret= IOS_IoctlvFormat(hid, mload_fd, MLOAD_RUN_THREAD, "iiii:", starlet_addr,starlet_top_stack, stack_size, priority);
+
+
+ iosDestroyHeap(hid);
+
+return ret;
+}
+
+/*--------------------------------------------------------------------------------------------------------------*/
+
+// stops one starlet thread
+
+int mload_stop_thread(int id)
+{
+int ret;
+s32 hid = -1;
+
+
+ if(mload_init()<0) return -1;
+
+ hid = iosCreateHeap(0x800);
+
+ if(hid<0) return hid;
+
+ ret= IOS_IoctlvFormat(hid, mload_fd, MLOAD_STOP_THREAD, "i:", id);
+
+
+ iosDestroyHeap(hid);
+
+return ret;
+
+}
+
+/*--------------------------------------------------------------------------------------------------------------*/
+
+// continue one stopped starlet thread
+
+int mload_continue_thread(int id)
+{
+int ret;
+s32 hid = -1;
+
+
+ if(mload_init()<0) return -1;
+
+ hid = iosCreateHeap(0x800);
+
+ if(hid<0) return hid;
+
+ ret= IOS_IoctlvFormat(hid, mload_fd, MLOAD_CONTINUE_THREAD, "i:", id);
+
+
+ iosDestroyHeap(hid);
+
+return ret;
+
+}
+/*--------------------------------------------------------------------------------------------------------------*/
+
+// fix starlet address to read/write (uses SEEK_SET, etc as mode)
+
+int mload_seek(int offset, int mode)
+{
+ if(mload_init()<0) return -1;
+ return IOS_Seek(mload_fd, offset, mode);
+}
+
+/*--------------------------------------------------------------------------------------------------------------*/
+
+// read bytes from starlet (it update the offset)
+
+int mload_read(void* buf, u32 size)
+{
+ if(mload_init()<0) return -1;
+ return IOS_Read(mload_fd, buf, size);
+}
+
+/*--------------------------------------------------------------------------------------------------------------*/
+
+// write bytes from starlet (it update the offset)
+
+int mload_write(const void * buf, u32 size)
+{
+ if(mload_init()<0) return -1;
+ return IOS_Write(mload_fd, buf, size);
+}
+
+/*--------------------------------------------------------------------------------------------------------------*/
+
+// fill a block (similar to memset)
+
+int mload_memset(void *starlet_addr, int set, int len)
+{
+int ret;
+s32 hid = -1;
+
+
+ if(mload_init()<0) return -1;
+
+ hid = iosCreateHeap(0x800);
+
+ if(hid<0) return hid;
+
+ ret= IOS_IoctlvFormat(hid, mload_fd, MLOAD_MEMSET, "iii:", starlet_addr, set, len);
+
+
+ iosDestroyHeap(hid);
+
+return ret;
+}
+
+/*--------------------------------------------------------------------------------------------------------------*/
+
+// get the ehci datas ( ehcmodule.elf uses this address)
+
+void * mload_get_ehci_data()
+{
+int ret;
+s32 hid = -1;
+
+
+ if(mload_init()<0) return NULL;
+
+ hid = iosCreateHeap(0x800);
+
+ if(hid<0) return NULL;
+
+ ret= IOS_IoctlvFormat(hid, mload_fd, MLOAD_GET_EHCI_DATA, ":");
+ if(ret<0) return NULL;
+
+ iosDestroyHeap(hid);
+
+return (void *) ret;
+}
+
+/*--------------------------------------------------------------------------------------------------------------*/
+
+// set the dev/es ioctlv in routine
+
+int mload_set_ES_ioctlv_vector(void *starlet_addr)
+{
+int ret;
+s32 hid = -1;
+
+
+ if(mload_init()<0) return -1;
+
+ hid = iosCreateHeap(0x800);
+
+ if(hid<0) return hid;
+
+ ret= IOS_IoctlvFormat(hid, mload_fd, MLOAD_SET_ES_IOCTLV, "i:", starlet_addr);
+
+
+ iosDestroyHeap(hid);
+
+return ret;
+}
+
+static u32 ios_36[16] ATTRIBUTE_ALIGN(32)=
+{
+ 0, // DI_EmulateCmd
+ 0,
+ 0x2022DDAC, // dvd_read_controlling_data
+ 0x20201010+1, // handle_di_cmd_reentry (thumb)
+ 0x20200b9c+1, // ios_shared_alloc_aligned (thumb)
+ 0x20200b70+1, // ios_shared_free (thumb)
+ 0x20205dc0+1, // ios_memcpy (thumb)
+ 0x20200048+1, // ios_fatal_di_error (thumb)
+ 0x20202b4c+1, // ios_doReadHashEncryptedState (thumb)
+ 0x20203934+1, // ios_printf (thumb)
+};
+
+static u32 ios_38[16] ATTRIBUTE_ALIGN(32)=
+{
+ 0, // DI_EmulateCmd
+ 0,
+ 0x2022cdac, // dvd_read_controlling_data
+ 0x20200d38+1, // handle_di_cmd_reentry (thumb)
+ 0x202008c4+1, // ios_shared_alloc_aligned (thumb)
+ 0x20200898+1, // ios_shared_free (thumb)
+ 0x20205b80+1, // ios_memcpy (thumb)
+ 0x20200048+1, // ios_fatal_di_error (thumb)
+ 0x20202874+1, // ios_doReadHashEncryptedState (thumb)
+ 0x2020365c+1, // ios_printf (thumb)
+};
+
+
+int load_ehc_module() {
+
+ int is_ios=0;
+
+ if(mload_module(ehcmodule, size_ehcmodule)<0) return -1;
+ usleep(350*1000);
+
+
+ // Test for IOS
+
+ mload_seek(0x20207c84, SEEK_SET);
+ mload_read(patch_datas, 4);
+ if(patch_datas[0]==0x6e657665)
+ {
+ is_ios=38;
+ }
+ else
+ {
+ is_ios=36;
+ }
+
+ if(is_ios==36)
+ {
+ // IOS 36
+ memcpy(ios_36, dip_plugin, 4); // copy the entry_point
+ memcpy(dip_plugin, ios_36, 4*10); // copy the adresses from the array
+
+ mload_seek(0x1377E000, SEEK_SET); // copy dip_plugin in the starlet
+ mload_write(dip_plugin,size_dip_plugin);
+
+ // enables DIP plugin
+ mload_seek(0x20209040, SEEK_SET);
+ mload_write(ios_36, 4);
+
+ }
+ if(is_ios==38)
+ {
+ // IOS 38
+
+ memcpy(ios_38, dip_plugin, 4); // copy the entry_point
+ memcpy(dip_plugin, ios_38, 4*10); // copy the adresses from the array
+
+ mload_seek(0x1377E000, SEEK_SET); // copy dip_plugin in the starlet
+ mload_write(dip_plugin,size_dip_plugin);
+
+ // enables DIP plugin
+ mload_seek(0x20208030, SEEK_SET);
+ mload_write(ios_38, 4);
+
+ }
+
+
+ mload_close();
+
+return 0;
+}
+
+int patch_cios_data() {
+
+ patch_datas[0]=*((u32 *) (dip_plugin+16*4));
+ mload_set_ES_ioctlv_vector((void *) patch_datas[0]);
+ return 1;
+}
diff --git a/source/mload.h b/source/mload.h
new file mode 100644
index 00000000..20e1493e
--- /dev/null
+++ b/source/mload.h
@@ -0,0 +1,194 @@
+/* mload.c (for PPC) (c) 2009, Hermes
+
+ 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
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+*/
+
+#ifndef __MLOAD_H__
+#define __MLOAD_H__
+
+
+#include
+#include
+#include
+#include
+#include
+#include "unistd.h"
+
+#define MLOAD_MLOAD_THREAD_ID 0x4D4C4400
+#define MLOAD_LOAD_MODULE 0x4D4C4480
+#define MLOAD_RUN_MODULE 0x4D4C4481
+#define MLOAD_RUN_THREAD 0x4D4C4482
+
+#define MLOAD_STOP_THREAD 0x4D4C4484
+#define MLOAD_CONTINUE_THREAD 0x4D4C4485
+
+#define MLOAD_GET_LOAD_BASE 0x4D4C4490
+#define MLOAD_MEMSET 0x4D4C4491
+
+#define MLOAD_GET_EHCI_DATA 0x4D4C44A0
+
+#define MLOAD_SET_ES_IOCTLV 0x4D4C44B0
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+// from IOS ELF stripper of neimod
+
+#define getbe32(x) ((adr[x]<<24) | (adr[x+1]<<16) | (adr[x+2]<<8) | (adr[x+3]))
+
+typedef struct
+{
+ u32 ident0;
+ u32 ident1;
+ u32 ident2;
+ u32 ident3;
+ u32 machinetype;
+ u32 version;
+ u32 entry;
+ u32 phoff;
+ u32 shoff;
+ u32 flags;
+ u16 ehsize;
+ u16 phentsize;
+ u16 phnum;
+ u16 shentsize;
+ u16 shnum;
+ u16 shtrndx;
+} elfheader;
+
+typedef struct
+{
+ u32 type;
+ u32 offset;
+ u32 vaddr;
+ u32 paddr;
+ u32 filesz;
+ u32 memsz;
+ u32 flags;
+ u32 align;
+} elfphentry;
+
+typedef struct
+{
+ void *start;
+ int prio;
+ void *stack;
+ int size_stack;
+} data_elf;
+
+/*--------------------------------------------------------------------------------------------------------------*/
+
+// to init/test if the device is running
+
+int mload_init();
+
+/*--------------------------------------------------------------------------------------------------------------*/
+
+// to close the device (remember call it when rebooting the IOS!)
+
+int mload_close();
+
+/*--------------------------------------------------------------------------------------------------------------*/
+
+// to get the thread id of mload
+
+int mload_get_thread_id();
+
+/*--------------------------------------------------------------------------------------------------------------*/
+
+// get the base and the size of the memory readable/writable to load modules
+
+int mload_get_load_base(u32 *starlet_base, int *size);
+
+/*--------------------------------------------------------------------------------------------------------------*/
+
+// load and run a module from starlet (it need to allocate MEM2 to send the elf file)
+// the module must be a elf made with stripios
+
+int mload_module(void *addr, int len);
+
+/*--------------------------------------------------------------------------------------------------------------*/
+
+// load a module from the PPC
+// the module must be a elf made with stripios
+
+int mload_elf(void *my_elf, data_elf *data_elf);
+
+/*--------------------------------------------------------------------------------------------------------------*/
+
+// run one thread (you can use to load modules or binary files)
+
+int mload_run_thread(void *starlet_addr, void *starlet_top_stack, int stack_size, int priority);
+
+/*--------------------------------------------------------------------------------------------------------------*/
+
+// stops one starlet thread
+
+int mload_stop_thread(int id);
+
+/*--------------------------------------------------------------------------------------------------------------*/
+
+// continue one stopped starlet thread
+
+int mload_continue_thread(int id);
+
+/*--------------------------------------------------------------------------------------------------------------*/
+
+// fix starlet address to read/write (uses SEEK_SET, etc as mode)
+
+int mload_seek(int offset, int mode);
+
+/*--------------------------------------------------------------------------------------------------------------*/
+
+// read bytes from starlet (it update the offset)
+
+int mload_read(void* buf, u32 size);
+
+/*--------------------------------------------------------------------------------------------------------------*/
+
+// write bytes from starlet (it update the offset)
+
+int mload_write(const void * buf, u32 size);
+
+/*--------------------------------------------------------------------------------------------------------------*/
+
+// fill a block (similar to memset)
+
+int mload_memset(void *starlet_addr, int set, int len);
+
+/*--------------------------------------------------------------------------------------------------------------*/
+
+// get the ehci datas ( ehcmodule.elf uses this address)
+
+void * mload_get_ehci_data();
+
+/*--------------------------------------------------------------------------------------------------------------*/
+
+// set the dev/es ioctlv in routine
+
+int mload_set_ES_ioctlv_vector(void *starlet_addr);
+
+/*--------------------------------------------------------------------------------------------------------------*/
+int load_ehc_module();
+
+
+#ifdef __cplusplus
+ }
+#endif
+
+
+#endif
diff --git a/source/sys.cpp b/source/sys.cpp
index cef37b42..01d42512 100644
--- a/source/sys.cpp
+++ b/source/sys.cpp
@@ -11,6 +11,7 @@
#include "audio.h"
#include "menu.h"
#include "fatmounter.h"
+#include "mload.h"
/* Constants */
#define CERTS_LEN 0x280
@@ -59,6 +60,8 @@ static void _ExitApp()
SDCard_deInit();
USBDevice_deInit();
+ mload_set_ES_ioctlv_vector(NULL);
+ mload_close();
}
@@ -81,12 +84,13 @@ int Sys_IosReload(int IOS)
WPAD_Disconnect(0);
WPAD_Shutdown();
+ USBStorage_Deinit();
WDVD_Close();
- USBStorage_Deinit();
-
ret = IOS_ReloadIOS(IOS);
+ if(IOS == 222) load_ehc_module();
+
PAD_Init();
Wpad_Init();
WPAD_SetDataFormat(WPAD_CHAN_ALL,WPAD_FMT_BTNS_ACC_IR);
@@ -96,13 +100,17 @@ int Sys_IosReload(int IOS)
return ret;
}
- if(IOS == 249 || IOS == 222 || IOS == 223) {
+ if(IOS == 249 || IOS == 222) {
ret = WBFS_Init(WBFS_DEVICE_USB);
if(ret>=0)
{
ret = Disc_Init();
+ int i = 0;
if(ret>=0)
- ret = WBFS_Open();
+ for(i = 0; i < 4; i++) {
+ ret = WBFS_Open2(i);
+ if(ret == 0) break;
+ }
}
}
//reinitialize SD and USB
@@ -110,7 +118,6 @@ int Sys_IosReload(int IOS)
USBDevice_Init();
return ret;
-
}
diff --git a/source/usbstorage.c b/source/usbstorage.c
index 916e6417..855831b7 100644
--- a/source/usbstorage.c
+++ b/source/usbstorage.c
@@ -33,12 +33,14 @@ distribution.
/* IOCTL commands */
#define UMS_BASE (('U'<<24)|('M'<<16)|('S'<<8))
-#define USB_IOCTL_UMS_INIT (UMS_BASE+0x1)
+#define USB_IOCTL_UMS_INIT (UMS_BASE+0x1)
#define USB_IOCTL_UMS_GET_CAPACITY (UMS_BASE+0x2)
#define USB_IOCTL_UMS_READ_SECTORS (UMS_BASE+0x3)
-#define USB_IOCTL_UMS_WRITE_SECTORS (UMS_BASE+0x4)
-#define USB_IOCTL_UMS_READ_STRESS (UMS_BASE+0x5)
-#define USB_IOCTL_UMS_SET_VERBOSE (UMS_BASE+0x6)
+#define USB_IOCTL_UMS_WRITE_SECTORS (UMS_BASE+0x4)
+#define USB_IOCTL_UMS_READ_STRESS (UMS_BASE+0x5)
+#define USB_IOCTL_UMS_SET_VERBOSE (UMS_BASE+0x6)
+#define USB_IOCTL_UMS_UNMOUNT (UMS_BASE+0x10)
+#define USB_IOCTL_UMS_WATCHDOG (UMS_BASE+0x80)
#define UMS_HEAPSIZE 0x10000
@@ -94,7 +96,8 @@ s32 USBStorage_Init(void)
return fd;
/* Initialize USB storage */
- IOS_IoctlvFormat(hid, fd, USB_IOCTL_UMS_INIT, ":");
+ ret = IOS_IoctlvFormat(hid, fd, USB_IOCTL_UMS_INIT, ":");
+ if(ret<0) goto err;
/* Get device capacity */
ret = USBStorage_GetCapacity(NULL);
@@ -120,6 +123,20 @@ void USBStorage_Deinit(void)
IOS_Close(fd);
fd = -1;
}
+}
+
+/** Hermes **/
+s32 USBStorage_Watchdog(u32 on_off)
+{
+ if (fd >= 0) {
+ s32 ret;
+
+ ret = IOS_IoctlvFormat(hid, fd, USB_IOCTL_UMS_WATCHDOG, "i:", on_off);
+
+ return ret;
+ }
+
+ return IPC_ENOENT;
}
s32 USBStorage_ReadSectors(u32 sector, u32 numSectors, void *buffer)
diff --git a/source/usbstorage.h b/source/usbstorage.h
index 9cdb12c8..939e1b05 100644
--- a/source/usbstorage.h
+++ b/source/usbstorage.h
@@ -8,7 +8,8 @@ extern "C"
/* Prototypes */
s32 USBStorage_GetCapacity(u32 *);
s32 USBStorage_Init(void);
-void USBStorage_Deinit(void);
+void USBStorage_Deinit(void);
+s32 USBStorage_Watchdog(u32 on_off);
s32 USBStorage_ReadSectors(u32, u32, void *);
s32 USBStorage_WriteSectors(u32, u32, const void *);
extern const DISC_INTERFACE __io_wiiums;
diff --git a/source/wbfs.c b/source/wbfs.c
index 539d35c7..9214c489 100644
--- a/source/wbfs.c
+++ b/source/wbfs.c
@@ -21,7 +21,8 @@ static wbfs_t *hdd = NULL;
/* WBFS callbacks */
static rw_sector_callback_t readCallback = NULL;
-static rw_sector_callback_t writeCallback = NULL;
+static rw_sector_callback_t writeCallback = NULL;
+static int current_partition = 0;
/* Variables */
@@ -74,6 +75,35 @@ void __WBFS_Spinner(s32 x, s32 max)
wbfs_t *GetHddInfo(void)
{
return hdd;
+}
+
+s32 WBFS_Open2(int index) // index 0-3
+{
+ u32 lba;
+ /* Close hard disk */
+ if (hdd)
+ wbfs_close(hdd);hdd=0;
+
+ lba = wbfs_get_partition_LBA(index);
+
+ current_partition = index & 3;
+
+ if(lba==0xFFFFFFFF)
+ {
+ if((index & 3)==0) return WBFS_Open();
+ return -1;
+ }
+ /* Open hard disk */
+ hdd = wbfs_open_partition(readCallback, writeCallback, NULL, sector_size, 0, lba, 0);
+ if (!hdd)
+ return -1;
+
+ return 0;
+}
+
+s32 GetPartition()
+{
+ return current_partition;
}
s32 __WBFS_ReadDVD(void *fp, u32 lba, u32 len, void *iobuf)
diff --git a/source/wbfs.h b/source/wbfs.h
index b396c00e..aea47eaf 100644
--- a/source/wbfs.h
+++ b/source/wbfs.h
@@ -19,8 +19,10 @@ enum {
/* Prototypes */
-s32 WBFS_Init(u32);
-s32 WBFS_Open(void);
+s32 WBFS_Init(u32);
+s32 WBFS_Open();
+s32 WBFS_Open2(int partition);
+s32 GetPartition();
s32 WBFS_Close(void);
s32 WBFS_Format(u32, u32);
s32 WBFS_GetCount(u32 *);
diff --git a/source/wdvd.c b/source/wdvd.c
index 352ae5ba..dad5ea3e 100644
--- a/source/wdvd.c
+++ b/source/wdvd.c
@@ -16,9 +16,12 @@
#define IOCTL_DI_STOPLASER 0xD2
#define IOCTL_DI_OFFSET 0xD9
#define IOCTL_DI_STOPMOTOR 0xE3
-#define IOCTL_DI_SETUSBMODE 0xF4
-#define IOCTL_DI_SETWBFSMODE 0xfe
+#define IOCTL_DI_SETUSBMODE 0xF4
#define IOCTL_DI_DISABLERESET 0xF6
+
+/** Hermes IOS222 **/
+#define DI_SETWBFSMODE 0xfe
+#define DI_SETOFFSETBASE 0xf1
/* Variables */
static u32 inbuf[8] ATTRIBUTE_ALIGN(32);
@@ -27,7 +30,6 @@ static u32 outbuf[8] ATTRIBUTE_ALIGN(32);
static const char di_fs[] ATTRIBUTE_ALIGN(32) = "/dev/di";
static s32 di_fd = -1;
-
s32 WDVD_Init(void)
{
/* Open "/dev/di" */
@@ -106,6 +108,13 @@ s32 WDVD_Seek(u64 offset)
inbuf[1] = (u32)(offset >> 2);
ret = IOS_Ioctl(di_fd, IOCTL_DI_SEEK, inbuf, sizeof(inbuf), outbuf, sizeof(outbuf));
+ if(ret!=1)
+ {
+ // Try old cIOS 222
+ /* Drive seek */
+ inbuf[0] = DI_SETOFFSETBASE << 24;
+ ret = IOS_Ioctl(di_fd, DI_SETOFFSETBASE, inbuf, sizeof(inbuf), outbuf, sizeof(outbuf));
+ }
if (ret < 0)
return ret;
@@ -163,45 +172,45 @@ s32 WDVD_StopMotor(void)
return (ret == 1) ? 0 : -ret;
}
-
-s32 WDVD_OpenPartition(u64 offset)
-{
- u8 *vector = NULL;
-
- u32 *buffer = NULL;
- s32 ret;
-
- /* Allocate memory */
- buffer = (u32 *)memalign(32, 0x5000);
- if (!buffer)
- return -1;
-
- /* Set vector pointer */
- vector = (u8 *)buffer;
-
- memset(buffer, 0, 0x5000);
-
- /* Open partition */
- buffer[0] = (u32)(buffer + 0x10);
- buffer[1] = 0x20;
- buffer[3] = 0x024A;
- buffer[6] = (u32)(buffer + 0x380);
- buffer[7] = 0x49E4;
- buffer[8] = (u32)(buffer + 0x360);
- buffer[9] = 0x20;
-
- buffer[(0x40 >> 2)] = IOCTL_DI_OPENPART << 24;
- buffer[(0x40 >> 2) + 1] = offset >> 2;
-
- ret = IOS_Ioctlv(di_fd, IOCTL_DI_OPENPART, 3, 2, (ioctlv *)vector);
-
- /* Free memory */
- free(buffer);
-
- if (ret < 0)
- return ret;
-
- return (ret == 1) ? 0 : -ret;
+
+s32 WDVD_OpenPartition(u64 offset)
+{
+ u8 *vector = NULL;
+
+ u32 *buffer = NULL;
+ s32 ret;
+
+ /* Allocate memory */
+ buffer = (u32 *)memalign(32, 0x5000);
+ if (!buffer)
+ return -1;
+
+ /* Set vector pointer */
+ vector = (u8 *)buffer;
+
+ memset(buffer, 0, 0x5000);
+
+ /* Open partition */
+ buffer[0] = (u32)(buffer + 0x10);
+ buffer[1] = 0x20;
+ buffer[3] = 0x024A;
+ buffer[6] = (u32)(buffer + 0x380);
+ buffer[7] = 0x49E4;
+ buffer[8] = (u32)(buffer + 0x360);
+ buffer[9] = 0x20;
+
+ buffer[(0x40 >> 2)] = IOCTL_DI_OPENPART << 24;
+ buffer[(0x40 >> 2) + 1] = offset >> 2;
+
+ ret = IOS_Ioctlv(di_fd, IOCTL_DI_OPENPART, 3, 2, (ioctlv *)vector);
+
+ /* Free memory */
+ free(buffer);
+
+ if (ret < 0)
+ return ret;
+
+ return (ret == 1) ? 0 : -ret;
}
s32 WDVD_ClosePartition(void)
@@ -311,28 +320,36 @@ s32 WDVD_DisableReset(u8 val)
return (ret == 1) ? 0 : -ret;
}
-
-s32 WDVD_SetUSBMode(u8 *id, int ios222)
-{
- s32 ret;
-
- memset(inbuf, 0, sizeof(inbuf));
-
+
+/** Hermes **/
+s32 WDVD_SetUSBMode(u8 *id, s32 partition)
+{
+ s32 ret;
+
+ memset(inbuf, 0, sizeof(inbuf));
+
/* Set USB mode */
- if(ios222 == 1) {
- inbuf[0] = IOCTL_DI_SETWBFSMODE << 24;
- } else {
inbuf[0] = IOCTL_DI_SETUSBMODE << 24;
- }
- inbuf[1] = (id) ? 1 : 0;
-
- /* Copy ID */
- if (id)
- memcpy(&inbuf[2], id, 6);
-
- ret = IOS_Ioctl(di_fd, IOCTL_DI_SETUSBMODE, inbuf, sizeof(inbuf), outbuf, sizeof(outbuf));
- if (ret < 0)
- return ret;
-
- return (ret == 1) ? 0 : -ret;
-}
+ inbuf[1] = (id) ? 1 : 0;
+
+
+ /* Copy ID */
+ if (id)
+ {
+ memcpy(&inbuf[2], id, 6);
+ inbuf[5] = partition;
+ }
+
+ ret = IOS_Ioctl(di_fd, IOCTL_DI_SETUSBMODE, inbuf, sizeof(inbuf), outbuf, sizeof(outbuf));
+ if(ret!=1)
+ { // Try old cIOS 222
+ /* Set USB mode */
+ inbuf[0] = DI_SETWBFSMODE << 24;
+ ret = IOS_Ioctl(di_fd, DI_SETWBFSMODE, inbuf, sizeof(inbuf), outbuf, sizeof(outbuf));
+ }
+
+ if (ret < 0)
+ return ret;
+
+ return (ret == 1) ? 0 : -ret;
+}
diff --git a/source/wdvd.h b/source/wdvd.h
index a36c15b9..e3a41799 100644
--- a/source/wdvd.h
+++ b/source/wdvd.h
@@ -23,7 +23,7 @@ s32 WDVD_Read(void *, u32, u64);
s32 WDVD_WaitForDisc(void);
s32 WDVD_GetCoverStatus(u32 *);
s32 WDVD_DisableReset(u8);
-s32 WDVD_SetUSBMode(u8 *, int ios222);
+s32 WDVD_SetUSBMode(u8 *, s32);
#ifdef __cplusplus
}