Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/ClusterM/famicom-dumper.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCluster <clusterrr@clusterrr.com>2020-09-02 22:05:02 +0300
committerCluster <clusterrr@clusterrr.com>2020-09-02 22:05:02 +0300
commit3785b0dd3221f4108ceb4243a298ce163e02eba3 (patch)
treecc03dc9cbe7429273520b877735cc4eb9094d12b
parent163fdc7d320b15ee03e66cbb13a036e857fe9207 (diff)
More correct flash write check
-rw-r--r--comm.h2
-rw-r--r--dumper.c88
-rw-r--r--famicom-dumper.hex310
3 files changed, 219 insertions, 181 deletions
diff --git a/comm.h b/comm.h
index 551a593..44a4d6f 100644
--- a/comm.h
+++ b/comm.h
@@ -35,7 +35,7 @@
//#define COMMAND_TEST_SET 32
//#define COMMAND_TEST_RESULT 33
#define COMMAND_COOLBOY_READ_REQUEST 34
-#define COMMAND_COOLBOY_ERASE_REQUEST 35
+#define COMMAND_COOLBOY_ERASE_SECTOR_REQUEST 35
#define COMMAND_COOLBOY_WRITE_REQUEST 36
#define COMMAND_FLASH_ERASE_SECTOR_REQUEST 37
#define COMMAND_FLASH_WRITE_REQUEST 38
diff --git a/dumper.c b/dumper.c
index 5c8430f..c70d9c4 100644
--- a/dumper.c
+++ b/dumper.c
@@ -464,8 +464,7 @@ static void write_coolboy(unsigned int address, unsigned int len, uint8_t* data)
write_coolboy_flash_command(0x0000, 0x29);
long int timeout = 0;
- uint8_t res;
- int16_t last_res = -1;
+ // waiting for result
while (1)
{
timeout++;
@@ -476,24 +475,32 @@ static void write_coolboy(unsigned int address, unsigned int len, uint8_t* data)
LED_RED_OFF;
return;
}
- res = read_coolboy_byte((address-1) | 0x8000);
- if ((last_res == -1) || ((res != (last_res & 0xFF))))
+ uint8_t read_1 = read_coolboy_byte((address-1) | 0x8000);
+ uint8_t read_2 = read_coolboy_byte((address-1) | 0x8000);
+ uint8_t read_3 = read_coolboy_byte((address-1) | 0x8000);
+ if (((read_1 ^ read_2) & (1 << 6)) && ((read_2 ^ read_3) & (1 << 6)))
{
- // in progress
- last_res = res;
- continue;
- }
- // done
- if (res == *(data-1))
- {
- // ok
- break;
+ if (read_1 & (1 << 1))
+ {
+ comm_start(COMMAND_FLASH_WRITE_ERROR, 3);
+ comm_send_byte(read_1);
+ comm_send_byte(read_2);
+ comm_send_byte(read_3);
+ LED_RED_OFF;
+ return;
+ } else if (read_1 & (1 << 5)) {
+ comm_start(COMMAND_FLASH_WRITE_TIMEOUT, 3);
+ comm_send_byte(read_1);
+ comm_send_byte(read_2);
+ comm_send_byte(read_3);
+ LED_RED_OFF;
+ return;
+ }
} else {
- // error
- comm_start(COMMAND_FLASH_WRITE_ERROR, 1);
- comm_send_byte(res);
- LED_RED_OFF;
- return;
+ read_1 = read_coolboy_byte((address-1) | 0x8000);
+ read_2 = read_coolboy_byte((address-1) | 0x8000);
+ if (read_1 == read_2 && read_2 == *(data-1))
+ break; // ok
}
}
}
@@ -545,8 +552,7 @@ static void write_flash(unsigned int address, unsigned int len, uint8_t* data)
write_prg_flash_command(0x0000, 0x29);
long int timeout = 0;
- uint8_t res;
- int16_t last_res = -1;
+ // waiting for result
while (1)
{
timeout++;
@@ -557,24 +563,32 @@ static void write_flash(unsigned int address, unsigned int len, uint8_t* data)
LED_RED_OFF;
return;
}
- res = read_prg_byte((address-1) | 0x8000);
- if ((last_res == -1) || ((res != (last_res & 0xFF))))
- {
- // in progress
- last_res = res;
- continue;
- }
- // done
- if (res == *(data-1))
+ uint8_t read_1 = read_prg_byte((address-1) | 0x8000);
+ uint8_t read_2 = read_prg_byte((address-1) | 0x8000);
+ uint8_t read_3 = read_prg_byte((address-1) | 0x8000);
+ if (((read_1 ^ read_2) & (1 << 6)) && ((read_2 ^ read_3) & (1 << 6)))
{
- // ok
- break;
+ if (read_1 & (1 << 1))
+ {
+ comm_start(COMMAND_FLASH_WRITE_ERROR, 3);
+ comm_send_byte(read_1);
+ comm_send_byte(read_2);
+ comm_send_byte(read_3);
+ LED_RED_OFF;
+ return;
+ } else if (read_1 & (1 << 5)) {
+ comm_start(COMMAND_FLASH_WRITE_TIMEOUT, 3);
+ comm_send_byte(read_1);
+ comm_send_byte(read_2);
+ comm_send_byte(read_3);
+ LED_RED_OFF;
+ return;
+ }
} else {
- // error
- comm_start(COMMAND_FLASH_WRITE_ERROR, 1);
- comm_send_byte(res);
- LED_RED_OFF;
- return;
+ read_1 = read_prg_byte((address-1) | 0x8000);
+ read_2 = read_prg_byte((address-1) | 0x8000);
+ if (read_1 == read_2 && read_2 == *(data-1))
+ break; // ok
}
}
}
@@ -725,7 +739,7 @@ int main (void)
comm_start(COMMAND_RESET_ACK, 0);
break;
- case COMMAND_COOLBOY_ERASE_REQUEST:
+ case COMMAND_COOLBOY_ERASE_SECTOR_REQUEST:
erase_coolboy_sector();
break;
diff --git a/famicom-dumper.hex b/famicom-dumper.hex
index cc0b890..ffb63be 100644
--- a/famicom-dumper.hex
+++ b/famicom-dumper.hex
@@ -8,7 +8,7 @@
:100070000C9458000C9458000C9458000C945800A0
:100080000C9458000C9458000C94580011241FBE76
:10009000CFEFD0E1DEBFCDBF29E0A0E0B1E001C0ED
-:1000A0001D92A531B207E1F70E9414030C94780762
+:1000A0001D92A531B207E1F70E9414030C943C089D
:1000B0000C9400008BBB95BB95FD06C0809162003F
:1000C0008061809362000895809162008F7E8093AA
:1000D00062000895CF93DF93C2E6D0E028812E7F9F
@@ -96,146 +96,170 @@
:1005F00003011092020181E08093000160E070E04D
:1006000084E00C9439028093000160E070E083E0A4
:100610000E943902E7CF109203011092020110925A
-:100620000B0110920001089578940E94E70187B3AE
-:10063000806C87BB87EB809361008FEF80936200B3
-:1006400012981A9A82BB11BA1BBA15BA909162001D
-:100650009061909362008ABB84BBBC98C498C79891
-:10066000C6980E940B0360E070E080E00E943902AF
-:10067000CEE68C2E912C8FB589628FBD8EB58160B0
-:100680008EBD20E030E0E0E041E050E060E070E06E
-:1006900080910B01811138C08FB589628FBD8EB5F5
-:1006A00081608EBD403187E258076105710508F40D
-:1006B00050C0E11153C0C90101968E3691050CF46A
-:1006C00055C0E1E09C012456310939BD28BD9C018B
-:1006D000C401821B930B853191050CF059C08B30FE
-:1006E00091052CF044E150E0481B590BCA01880FDA
-:1006F000991F909379008093780040E050E0BA0110
-:1007000080910B01882341F210920B011092790025
-:100710001092780019BC18BC1FBC80910C01833169
-:1007200009F4C8C2C8F1853209F4E6C208F457C01A
-:10073000873209F47DC208F4EEC1883209F45DC342
-:100740008E3F09F098CFF89414BEE0E0F8EF0995D9
-:1007500092CF4F5F5F4F6F4F7F4F9ACF215031093C
-:1007600089F4E0E040E050E0BA0192CF8436910590
-:1007700024F02356310939BD28BD9C0140E050E0EA
-:10078000BA0186CF243631050CF4A2CFC9019ACF25
-:1007900040E050E0BA017CCF893009F4D9C008F0BC
-:1007A00059C0863009F41FC1873009F4F5C085307F
-:1007B00009F061CF65E070E080E00E94390282E0DC
-:1007C0000E94610280E00E94610280E80E94610252
-:1007D00080E00E94610288E00E9461024CCF833277
-:1007E00009F4CAC208F005C1823209F044CF009171
-:1007F0000D0180910E0110E0182BC0910F01809126
-:100800001001D0E0D82BC69AC49AC39ABC9ABB9A5E
-:10081000BE0188E00E943902209751F0C8010E9471
-:100820008A000E94610221970F5F1F4F2097B1F746
-:100830001BBA15BA8091620080618093620080913A
-:100840006200826080936200C49AC39ABC98C49884
-:10085000C69811CF8D3071F1813149F18B3009F09B
-:100860000ACF00910D0180910E0110E0182BC0916C
-:100870000F0180911001D0E0D82BC69ABE018CE008
-:100880000E943902209751F0C8010E946A000E941C
-:10089000610221970F5F1F4F2097B1F71BBA15BA5E
-:1008A00080916200806180936200C698E4CE0E94CD
-:1008B0009601E1CE00910D0180910E0110E0182B00
-:1008C000C0910F0180911001D0E0D82BC79A2097DA
-:1008D000C1F181E1E82E81E0F82EF70191917F01CD
-:1008E000809162008E7F80936200809162008260BE
-:1008F00080936200FFEFF1BB92BBC8010E945A00D7
-:10090000809162008B7F8093620022E02A95F1F74C
-:1009100000C0809162008460809362004FEF42BB10
-:1009200011BA1BBA15BA809162008061809362008F
-:10093000809162008160809362000F5F1F4F21975A
-:1009400061F6C79860E070E08EE00E94390293CEB5
-:1009500000910D0180910E0110E0182BC0910F0144
-:1009600080911001D0E0D82BC79A209771F0F1E167
-:10097000EF2EF1E0FF2EF70161917F01C8010E9487
-:10098000E3000F5F1F4F2197B1F7C79860E070E059
-:100990008AE00E9439026FCE00910D0180910E0114
-:1009A00010E0182BC0910F0180911001D0E0D82BDE
-:1009B000C69ABE0188E00E943902209709F46ECFE2
-:1009C000C8010E9438010E94610221970F5F1F4FEA
-:1009D0002097B1F71BBA15BA8091620080618093AD
-:1009E0006200C69848CE60E070E081E00E94390263
-:1009F00042CEA0900D0180910E01B12CB82A009139
-:100A00000F018091100110E0182BC79A01151105F4
-:100A100009F47AC071E1E72E71E0F72E9501207E8E
-:100A20006701F701E501712C06C0CE01807E281711
-:100A3000390709F03DC081918F3F09F073942196E9
-:100A4000015011097F0189F7772009F45DC060EF3B
-:100A500080E090E00E94B0006AEA8AEA9AE00E9490
-:100A6000B00065E585E595E00E94B00065E280E0B4
-:100A700090E00E94B0007A94672D80E090E00E94A0
-:100A8000B000F60161916F016F3F71F0C5010E94E6
-:100A9000B000C5010196772079F05C017A94F601E7
-:100AA00061916F016F3F91F7FFEFAF1ABF0AE9CF76
-:100AB0007110CDCF5E01B2CF69E280E090E00E947C
-:100AC000B0006894B7F8C5010E948A00382E6FE91B
-:100AD000462E66E8562E66246394712CF1E04F1A78
-:100AE00051086108710809F4DBC1C5010E948A0040
-:100AF000831511F0382EF2CFF6013197808138122C
-:100B0000D6C101151105B1F660E070E08AE00E94DF
-:100B10003902C798B0CDE0900D0180910E01F12C03
-:100B2000F82A00910F018091100110E0182BC79A4C
-:100B30000115110549F341E1C42E41E0D42E97017E
-:100B4000207E5601F601E701712C06C0CE01807EA1
-:100B50002817390709F03FC081918F3F09F073943E
-:100B60002196015011096F0189F7772069F260EF32
-:100B700080E090E80E94E3006AEA8AEA9AE80E942C
-:100B8000E30065E585E595E80E94E30065E280E025
-:100B900090E80E94E3007A94672D80E090E80E943C
-:100BA000E300F50161915F016F3F89F017016894DF
-:100BB00037F8C1010E94E300FFEFEF1AFF0A772028
-:100BC00071F07A94F50161915F016F3F79F72FEF32
-:100BD000E21AF20AE6CF7110CACF7E01B0CF69E205
-:100BE00080E090E80E94E300C1010E943801F82EE5
-:100BF0003FE9432E36E8532E66246394712C21E09E
-:100C0000421A51086108710809F44AC1C1010E94E1
-:100C100038018F1511F0F82EF2CFF5013197808150
-:100C2000F8124FC10115110509F46ECF7E0187CF6F
-:100C3000E0900D0180910E01F12CF82A00910F0136
-:100C40008091100110E0182BC69A0115110509F4C6
-:100C500042C1C0E0D0E0C7010E943801C82788E047
-:100C600090E05C2FD695C79550FF04C0E1E0CE27F9
-:100C7000E0EADE270197A9F701501109FFEFEF1A0B
-:100C8000FF0A0115110539F71C2FCD2F1BBA15BA14
-:100C90008091620080618093620062E070E088E091
-:100CA0000E943902812F0E9461028C2F0E946102F2
-:100CB000C698E1CCC79AC69A809162008E7F8093D5
-:100CC000620080916200826080936200FFEF20E703
-:100CD00042E0F15020404040E1F700C00000809128
-:100CE0006200816080936200C798C69860E070E0FF
-:100CF00084E10E943902BFCCC79A60EF80E090E89F
-:100D00000E94E3006AEA8AEA9AE80E94E30065E545
-:100D100085E595E80E94E30060E88AEA9AE80E9487
-:100D2000E3006AEA8AEA9AE80E94E30065E585E55D
-:100D300095E80E94E30060E380E090E80E94E30011
-:100D400080E090E80E943801C82F5FE3C52E52E48E
-:100D5000D52E5FE0E52EF12C21E0C21AD108E10882
-:100D6000F10809F4BEC080E090E80E9438018C17B9
-:100D700009F489C0C82FF0CFC79A60EF80E090E0F7
-:100D80000E94B0006AEA8AEA9AE00E94B00065E533
-:100D900085E595E00E94B00060E88AEA9AE00E944A
-:100DA000B0006AEA8AEA9AE00E94B00065E585E54B
-:100DB00095E00E94B00060E380E090E00E94B00007
-:100DC00080E090E80E948A00C82FEFE3CE2EE2E494
-:100DD000DE2EEFE0EE2EF12C51E0C51AD108E1082D
-:100DE000F10809F47EC080E090E80E948A00D82FC4
-:100DF0008C278474D9F1CD2FEFCFE0900D01809135
-:100E00000E01F12CF82A00910F018091100110E0E1
-:100E1000182BC69A0115110509F460C0C0E0D0E096
-:100E2000C7010E946A00C82788E090E04C2FD69541
-:100E3000C79540FF04C051E0C52750EAD527019768
-:100E4000A9F7015011098FEFE81AF80A01151105E9
-:100E500039F71C2FCD2F1BBA15BA80916200806123
-:100E60008093620062E070E08CE01ACFDF3F09F40B
-:100E70004BCE61E070E08BE20E9439028D2F0E9420
-:100E80006102C798F8CBCF3F09F43ECE61E070E035
-:100E90008BE20E9439028C2F0E946102C798EBCB33
-:100EA00060E070E08AE20E943902C798E4CB61E01A
-:100EB00070E089E20E943902832D0E946102C79886
-:100EC000DACB61E070E089E20E9439028F2D0E9446
-:100ED0006102C798D0CBC0E010E0D8CEC0E010E0EF
-:100EE000BACF60E070E08CE20E943902C798C3CBB1
-:040EF000F894FFCFA4
+:100620000B01109200010895CF93DF9300D000D00A
+:10063000CDB7DEB778940E94E70187B3806C87BBA3
+:1006400087EB809361008FEF8093620012981A9A73
+:1006500082BB11BA1BBA15BA909162009061909357
+:1006600062008ABB84BBBC98C498C798C6980E9495
+:100670000B0360E070E080E00E9439026EE6C62E57
+:10068000D12C22242A948FB589628FBD8EB58160CA
+:100690008EBD20E030E0E0E041E050E060E070E05E
+:1006A00080910B01811138C08FB589628FBD8EB5E5
+:1006B00081608EBD403187E258076105710508F4FD
+:1006C00050C0E11153C0C90101968E3691050CF45A
+:1006D00055C0E1E09C012456310939BD28BD9C017B
+:1006E000C601821B930B853191050CF059C08B30EC
+:1006F00091052CF044E150E0481B590BCA01880FCA
+:10070000991F909379008093780040E050E0BA01FF
+:1007100080910B01882341F210920B011092790015
+:100720001092780019BC18BC1FBC80910C01833159
+:1007300009F4A4C2C8F1853209F4C2C208F457C052
+:10074000873209F40AC408F4FCC2883209F4B1C340
+:100750008E3F09F098CFF89414BEE0E0F8EF0995C9
+:1007600092CF4F5F5F4F6F4F7F4F9ACF215031092C
+:1007700089F4E0E040E050E0BA0192CF8436910580
+:1007800024F02356310939BD28BD9C0140E050E0DA
+:10079000BA0186CF243631050CF4A2CFC9019ACF15
+:1007A00040E050E0BA017CCF893009F4F7C008F08E
+:1007B00064C0863009F453C1873009F41DC1853007
+:1007C00009F061CF65E070E080E00E94390282E0CC
+:1007D0000E94610280E00E94610280E80E94610242
+:1007E00080E00E94610288E00E9461024CCF833267
+:1007F00009F401C208F039C1823209F044CF0091F6
+:100800000D0180910E0110E0182B30910F013983FA
+:1008100080911001432F50E0582B5A834983C69A88
+:10082000C49AC39ABC9ABB9A69817A8188E00E9473
+:10083000390289819A81892B71F0C8010E948A004E
+:100840000E946102E981FA813197FA83E9830F5F9F
+:100850001F4FEF2B91F71BBA15BA80916200806190
+:100860008093620080916200826080936200C49AEB
+:10087000C39ABC98C498C69806CF8D30C9F181310F
+:10088000A1F18B3009F0FFCE00910D0180910E0196
+:1008900010E0182BF0910F01F983809110012F2F98
+:1008A00030E0382B3A832983C69A69817A818CE0BB
+:1008B0000E94390249815A81452B71F0C8010E947A
+:1008C0006A000E94610289819A8101979A838983D3
+:1008D0000F5F1F4F892B91F71BBA15BA80916200E9
+:1008E000806180936200C698CECE0E949601CBCEE6
+:1008F00000910D0180910E0110E0182B30910F0135
+:10090000398380911001432F50E0582B5A8349833B
+:10091000C79A452BE1F181E1E82E81E0F82EF7013D
+:1009200091917F01809162008E7F8093620080911F
+:10093000620082608093620021BA92BBC8010E946B
+:100940005A00809162008B7F80936200F2E0FA95FA
+:10095000F1F700C08091620084608093620022BA47
+:1009600011BA1BBA15BA809162008061809362004F
+:10097000809162008160809362000F5F1F4F298128
+:100980003A81215031093A832983232B41F6C798B4
+:1009900060E070E08EE00E94390275CE00910D019A
+:1009A00080910E0110E0182B30910F013983809156
+:1009B0001001432F50E0582B5A834983C79A452B87
+:1009C000A1F0B1E1EB2EB1E0FB2EF70161917F01C7
+:1009D000C8010E94E3000F5F1F4F29813A81215017
+:1009E00031093A832983232B81F7C79860E070E0AF
+:1009F0008AE00E94390247CE00910D0180910E01DC
+:100A000010E0182B50910F01598380911001E52FB0
+:100A1000F0E0F82BFA83E983C69A69817A8188E04D
+:100A20000E94390229813A81232B09F455CFC8014C
+:100A30000E9438010E94610249815A814150510946
+:100A40005A8349830F5F1F4F452B89F71BBA15BA8D
+:100A500080916200806180936200C69814CE60E04D
+:100A600070E081E00E9439020ECE90910D019983D1
+:100A700080910E01E92FF0E0F82BFA83E9830091D1
+:100A80000F018091100110E0182BC79A0115110574
+:100A900009F4AAC0F1E16F2EF1E07F2E29813A819D
+:100AA000207E2301F301E980FA80B12C06C0C70142
+:100AB000807E2817390709F045C081918F3F09F0E2
+:100AC000B3944FEFE41AF40A015011093F0179F78A
+:100AD000BB2009F489C060EF80E090E00E94B00084
+:100AE0006AEA8AEA9AE00E94B00065E585E595E049
+:100AF0000E94B00065E280E090E00E94B000BA94ED
+:100B00006B2D80E090E00E94B000F20161912F0116
+:100B10006F3F89F089819A810E94B00089819A8112
+:100B20000196BB20A1F09A838983BA94F201619166
+:100B30002F016F3F79F729813A812F5F3F4F3A8329
+:100B40002983E3CFB110C7CFFA82E982A7CF69E248
+:100B500080E090E00E94B00029813A8130683C83B7
+:100B60002B83EFE98E2EE6E89E2EAA24A394B12CC7
+:100B7000A201415051095A8349830BC041FC6BC209
+:100B800045FC59C251E0851A9108A108B10809F441
+:100B90004BC28B819C810E948A00482E8B819C8154
+:100BA0000E948A00582E8B819C810E948A00382ED8
+:100BB000842D852586FF04C0852D832586FDDECF07
+:100BC0008B819C810E948A00582E8B819C810E947F
+:100BD0008A005812D7CFE981FA8180815812D2CF8A
+:100BE0000115110509F0B0CF60E070E08AE00E94C5
+:100BF0003902C79848CDC79A60EF80E090E00E9424
+:100C0000B0006AEA8AEA9AE00E94B00065E585E5EC
+:100C100095E00E94B00060E88AEA9AE00E94B00085
+:100C20006AEA8AEA9AE00E94B00065E585E595E007
+:100C30000E94B00060E380E090E00E94B00080E09D
+:100C400090E80E948A008983AFE38A2EA2E49A2E5C
+:100C5000AFE0AA2EB12C51E0851A9108A108B10885
+:100C600009F403C280E090E80E948A008B834981E6
+:100C70004827447409F4BCC18983EDCFC79AC69A4A
+:100C8000809162008E7F809362008091620082601A
+:100C900080936200FFEF20E732E0F15020403040C7
+:100CA000E1F700C0000080916200816080936200E3
+:100CB000C798C69860E070E084E10E943902E3CCF6
+:100CC000C79A60EF80E090E80E94E3006AEA8AEA4F
+:100CD0009AE80E94E30065E585E595E80E94E30057
+:100CE00060E88AEA9AE80E94E3006AEA8AEA9AE8F7
+:100CF0000E94E30065E585E595E80E94E30060E376
+:100D000080E090E80E94E30080E090E80E943801D3
+:100D100089837FE3872E72E4972E7FE0A72EB12C84
+:100D200021E0821A9108A108B10809F49EC180E06F
+:100D300090E80E943801F9818F1709F467C189830F
+:100D4000EFCFA0900D0180910E01B12CB82A009137
+:100D50000F018091100110E0182BC79A01151105A1
+:100D600009F4A0C061E1662E61E0762E9501207E37
+:100D70002301F3017501912C06C0C701807E28175D
+:100D8000390709F043C081918F3F09F093944FEFE9
+:100D9000E41AF40A015011093F0179F7992009F486
+:100DA00081C060EF80E090E80E94E3006AEA8AEA8E
+:100DB0009AE80E94E30065E585E595E80E94E30076
+:100DC00065E280E090E80E94E3009A94692D80E05B
+:100DD00090E80E94E300F20161912F016F3F91F0D2
+:100DE000950130683C832B83C9010E94E3003FEFEB
+:100DF000A31AB30A992071F09A94F20161912F011C
+:100E00006F3F71F73FEFA31AB30AE5CF9110C9CF37
+:100E10005701ACCF69E280E090E80E94E3005FE90F
+:100E2000852E56E8952EAA24A394B12CA2014150F8
+:100E300051095A8349830BC041FC0DC145FCFBC0DD
+:100E400051E0851A9108A108B10809F4EDC08B8121
+:100E50009C810E943801482E8B819C810E94380120
+:100E6000582E8B819C810E943801382E842D852537
+:100E700086FF04C0852D832586FDDECF8B819C8176
+:100E80000E943801582E8B819C810E943801581293
+:100E9000D7CFE981FA8180815812D2CF011511058F
+:100EA00009F0B6CF60E070E08AE00E943902C7988E
+:100EB000EACBE0900D0180910E01F12CF82A00910F
+:100EC0000F018091100110E0182BC69A0115110531
+:100ED00009F4C5C01A821982C7010E946A00E9811B
+:100EE000FA81E827FA83E98388E090E00CC0298141
+:100EF0003A813695279541E0242740EA34273A8302
+:100F00002983019759F0F981F0FDF1CFE981FA8148
+:100F1000F695E795FA83E9830197A9F7015011093E
+:100F2000FFEFEF1AFF0A01151105B1F619812A81A9
+:100F300029831BBA15BA8091620080618093620098
+:100F400062E070E08CE00E943902812F0E94610211
+:100F500089810E946102C69896CBE0900D01809134
+:100F60000E01F12CF82A00910F018091100110E080
+:100F7000182BC69A0115110509F474C01A8219823A
+:100F8000C7010E943801E981FA81E827FA83E983E1
+:100F900088E090E00CC029813A813695279541E0A0
+:100FA000242740EA34273A832983019759F0F981AD
+:100FB000F0FDF1CFE981FA81F695E795FA83E983AF
+:100FC0000197A9F701501109FFEFEF1AFF0A011568
+:100FD0001105B1F619812A8129831BBA15BA8091AE
+:100FE000620080618093620062E070E088E0ABCFD5
+:100FF0008B818F3F09F4F8CD61E070E08BE20E94B5
+:1010000039028B810E946102C7983DCB39813F3FF5
+:1010100009F4EACD61E070E08BE20E943902898137
+:101020000E946102C7982FCB60E070E08AE20E94C4
+:101030003902C79828CB63E070E08AE20E94390247
+:10104000842D0E946102852D0E946102832D0E94E1
+:101050006102C79818CB63E070E089E2EFCF198294
+:1010600010E067CF198210E0B8CF60E070E08CE24A
+:0C1070000E943902C79807CBF894FFCF0C
:00000001FF