summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorH. Peter Anvin <hpa@linux.intel.com>2013-09-19 14:56:18 (GMT)
committerH. Peter Anvin <hpa@linux.intel.com>2013-09-19 14:56:18 (GMT)
commitb49c09b3748efac361f2f101d5b4bb446f0dfbeb (patch)
tree84f22f9d82b7a041fee7bef44b10e786820b4724
parent3499b648259afd3404300183702bbfa1adfb2219 (diff)
downloadabc80sim-b49c09b3748efac361f2f101d5b4bb446f0dfbeb.zip
abc80sim-b49c09b3748efac361f2f101d5b4bb446f0dfbeb.tar.gz
abc80sim-b49c09b3748efac361f2f101d5b4bb446f0dfbeb.tar.bz2
abc80sim-b49c09b3748efac361f2f101d5b4bb446f0dfbeb.tar.xz
Completely get rid of mandatory external files
Move the abcdev and ufddos binaries internal, thus removing the last files needed in the lib directory.
-rw-r--r--Makefile49
-rw-r--r--abc80.c42
-rw-r--r--abcdev.binbin0 -> 260 bytes
-rw-r--r--abcdev.hex18
-rwxr-xr-xbin2c.pl26
-rw-r--r--rom.h14
-rw-r--r--ufddos.binbin0 -> 4096 bytes
-rw-r--r--ufddos.hex258
8 files changed, 75 insertions, 332 deletions
diff --git a/Makefile b/Makefile
index 0421bfd..4da4fbc 100644
--- a/Makefile
+++ b/Makefile
@@ -16,12 +16,6 @@ BINDIR = /home/hpa/abc80/bin
MANDIR = /home/hpa/abc80/man/man1
MANEXT = 1
-# ABCDIR should be defined to the directory where
-# the optional prom files are stored.
-
-ABCDIR = /home/hpa/abc80/lib
-
-
# DEFINES should contain any other definitions used to
# configure the program.
# Currently available configurations are:
@@ -33,35 +27,46 @@ DEFINES = -DSMALL_ENDIAN -D_REENTRANT
CC = gcc
CFLAGS = -W -Wall -g -O2 $(DEFINES) -I/usr/X11R6/include -I/usr/include/SDL -DABCDIR=\"$(ABCDIR)\"
LDFLAGS = -g -L/usr/X11R6/lib
+LIBS = -lSDL -lX11 -lpthread
PERL = perl
-OBJS = abc80.o clock.o sdlscrn.o z80.o abc80_mem.o io.o abcfont.o disk.o z80dis.o abcrom40.o abcrom80.o
-SRCS = abc80.c clock.c sdlscrn.c z80.c abc80_mem.c io.c abcfont.c disk.c z80dis.c abcrom40.c abcrom80.c
+# For Windows/MinGW use obj and .exe
+O = o
+X =
+
+GENO = abcrom40.$(O) abcrom80.$(O) abcdev.$(O) ufddos.$(O)
+GENC = abcrom40.c abcrom80.c abcdev.c ufddos.c
+
+OBJS = abc80.$(O) clock.$(O) sdlscrn.$(O) z80.$(O) abc80_mem.$(O) io.$(O) abcfont.$(O) disk.$(O) z80dis.$(O) $(GENO)
+SRCS = abc80.c clock.c sdlscrn.c z80.c abc80_mem.c io.c abcfont.c disk.c z80dis.c abcrom40.c abcrom80.c $(GENC)
HDRS = clock.h screen.h z80.h patchlevel.h
+.SUFFIXES: .c .h .$(O) .bin
+
all: abc80
-install: abc80
- -cp abc80 $(BINDIR)
- -cp abcdev.hex $(ABCDIR)
- -cp ufddos.hex $(ABCDIR)
+install: abc80$(X)
+ -cp abc80$(X) $(BINDIR)
-cp abc80.man $(MANDIR)/abc80.$(MANEXT)
-abc80: $(OBJS)
- $(CC) $(LDFLAGS) -o abc80 $(OBJS) -lSDL -lX11 -lpthread
+abc80$(X): $(OBJS)
+ $(CC) $(LDFLAGS) -o abc80$(X) $(OBJS) $(LIBS)
+
+.bin.c:
+ $(PERL) bin2c.pl $< > $@ || ( rm -f $@ ; false )
abcrom40.c: abcrom40.bin bin2c.pl
- $(PERL) bin2c.pl abcrom40 < $< > $@ || ( rm -f $@ ; false )
abcrom80.c: abcrom80.bin bin2c.pl
- $(PERL) bin2c.pl abcrom80 < $< > $@ || ( rm -f $@ ; false )
+abcdev.c: abcdev.bin bin2c.pl
+ufddos.c: ufddos.bin bin2c.pl
-abc80.o: clock.h screen.h z80.h patchlevel.h
-clock.o: clock.h z80.h
-sdlscrn.o: screen.h z80.h
-z80.o: z80.h
+abc80.$(O): clock.h screen.h z80.h patchlevel.h
+clock.$(O): clock.h z80.h
+sdlscrn.$(O): screen.h z80.h
+z80.$(O): z80.h
clean:
- $(RM) abc80 *.o *~ core
-
+ $(RM) abc80$(X) *.$(O) *~ core
+ $(RM) $(GENC)
diff --git a/abc80.c b/abc80.c
index 8d53d42..65008a0 100644
--- a/abc80.c
+++ b/abc80.c
@@ -5,6 +5,7 @@
#include "clock.h"
#include "screen.h"
#include "z80.h"
+#include "rom.h"
#include "patchlevel.h"
static char __version_string[] = VERSION;
@@ -60,25 +61,25 @@ load_sysfile(FILE *sysfile)
}
}
+/*
+ * Load an internal ROM
+ */
+static void load_rom(const struct rom *rom)
+{
+ uchar *memory = mem_rom_address();
+
+ memcpy(memory + rom->offset, rom->data, rom->size);
+}
/*
- * Load the BASIC interpretor into memory
- * This is stored as a raw byte-dump.
+ * Load the BASIC interpretor into memory.
*/
static int no_basic = 0;
-extern const unsigned char abcrom40[16384];
-extern const unsigned char abcrom80[16384];
-
void load_basic(int mode40)
{
- uchar *memory;
- const unsigned char *rom = mode40 ? abcrom40 : abcrom80;
-
- memory = mem_rom_address();
-
if (!no_basic)
- memcpy(memory, rom, 16384);
+ load_rom(mode40 ? &abcrom40 : &abcrom80);
}
/*
@@ -135,23 +136,8 @@ int main(int argc, char **argv)
* we are asked not to.
*/
if (!no_device) {
- sprintf(sysfile_name, "%s/ufddos.hex", ABCDIR);
- if ((sysfile = fopen(sysfile_name, "r")) == NULL) {
- fprintf(stderr, "ABC80: Can't open device file: %s\n",
- sysfile_name);
- exit(1);
- }
- load_sysfile(sysfile);
- fclose(sysfile);
-
- sprintf(sysfile_name, "%s/abcdev.hex", ABCDIR);
- if ((sysfile = fopen(sysfile_name, "r")) == NULL) {
- fprintf(stderr, "ABC80: Can't open device file: %s\n",
- sysfile_name);
- exit(1);
- }
- load_sysfile(sysfile);
- fclose(sysfile);
+ load_rom(&ufddos);
+ load_rom(&abcdev);
}
/*
diff --git a/abcdev.bin b/abcdev.bin
new file mode 100644
index 0000000..062a3e9
--- /dev/null
+++ b/abcdev.bin
Binary files differ
diff --git a/abcdev.hex b/abcdev.hex
deleted file mode 100644
index 3365103..0000000
--- a/abcdev.hex
+++ /dev/null
@@ -1,18 +0,0 @@
-:10404B00C36640C34E415840554E5875405F4020A3
-:10405B002020754000004C4942F5402A0AFE225FA1
-:10406B0040215140220AFEC34365C38A40C3BB4073
-:10407B00C3C040C31500C31B00C3D040C3DE403ECA
-:10408B0000DD4602D3FFDBFFFE002802D79521009F
-:10409B00F52410FDDD360784DD7508DD7409DD754B
-:1040AB000ADD740BDD360DFDDD360E003603A7C9B8
-:1040BB003E01C38C40DDCB0E7EC423003E02DD46A9
-:1040CB0002D3FFA7C9DD6E08DD66093E03DD46029C
-:1040DB00D3FFC9DD6E08DD66093E04DD4602D3FF62
-:1040EB00DD360DFDDDCB0EC6EBC9C30A41C3214145
-:1040FB00C32341C32C41C34D41C34D41C34D413E2D
-:10410B0000DD4602D3FEFE002802D795DD360728D8
-:10411B00DD360600A7C9D7A73E01DD4602D3FEA7B1
-:10412B00C9DD460279A7CA4841DBFE77230DFE03A2
-:10413B00C24041D7A2FE0DC22F41C34B412B360DBE
-:04414B00A7C9C976C1
-:0000000000
diff --git a/bin2c.pl b/bin2c.pl
index eff5075..658b7df 100755
--- a/bin2c.pl
+++ b/bin2c.pl
@@ -20,20 +20,33 @@ eval { use bytes; };
eval { binmode STDIN; };
if ( $#ARGV != 0 ) {
- print STDERR "Usage: $0 table_name < input_file > output_file\n";
+ print STDERR "Usage: $0 input_file [offset] > output_file\n";
exit 1;
}
-($table_name) = @ARGV;
+($input_file, $offset) = @ARGV;
-printf "const unsigned char %s[] = {\n", $table_name;
+$table_name = $input_file;
+$table_name =~ s/\.[^\.]*$//; # Drop extension
+
+unless (defined ($offset)) {
+ $offset = 0x404b if ($table_name eq 'abcdev');
+ $offset = 0x6000 if ($table_name =~ /dos$/);
+}
+
+open(IN, '<', $input_file)
+ or die "$0: unable to open input file $input_file: $!\n";
+
+print "#include \"rom.h\"\n\n";
+
+printf "static const unsigned char data[] = {\n", $table_name;
$pos = 0;
$linelen = 8;
$total_len = 0;
-while ( ($n = read(STDIN, $data, 4096)) > 0 ) {
+while ( ($n = read(IN, $data, 4096)) > 0 ) {
$total_len += $n;
for ( $i = 0 ; $i < $n ; $i++ ) {
$byte = substr($data, $i, 1);
@@ -50,8 +63,9 @@ while ( ($n = read(STDIN, $data, 4096)) > 0 ) {
}
}
-printf "\n};\n";
-
+print "\n};\n\n";
+printf "const struct rom %s = { data, %u, %u };\n",
+ $table_name, $offset, $total_len;
# @st = stat STDIN;
# printf "\nunsigned int %s_len = %u;\n", $table_name, $total_len;
diff --git a/rom.h b/rom.h
new file mode 100644
index 0000000..0de3612
--- /dev/null
+++ b/rom.h
@@ -0,0 +1,14 @@
+#ifndef ROM_H
+#define ROM_H
+
+#include <stddef.h>
+
+struct rom {
+ const unsigned char *data;
+ unsigned int offset;
+ unsigned int size;
+};
+
+extern const struct rom abcrom40, abcrom80, abcdev, ufddos;
+
+#endif /* ROM_H */
diff --git a/ufddos.bin b/ufddos.bin
new file mode 100644
index 0000000..5aeea6c
--- /dev/null
+++ b/ufddos.bin
Binary files differ
diff --git a/ufddos.hex b/ufddos.hex
deleted file mode 100644
index 07b73c6..0000000
--- a/ufddos.hex
+++ /dev/null
@@ -1,258 +0,0 @@
-:10600000C39564C3BD60C37760C31C6FC3116FC306
-:10601000CA60C3D760C37464C37064C36064C36A76
-:1060200064C39164C3CC64C3F164C3BD63C3F3634D
-:10603000C32864C3E162C3F762C30663C31E63C3BC
-:10604000B463C3756FC3A563C3F564C34B40C3E7B3
-:1060500065C3B366C3C167C3DA67C3AB67C3B5675C
-:10606000C3BB61C3D560C3C8608A67C0FFF7FF14B4
-:1060700001E0FF3DFD3FFD5F16000600CD18603ECC
-:1060800000D80600CD2D602A12FD2E037E3C28F29A
-:106090003D20232C4E2C2C562C7E2FBA20182C5E03
-:1060A0002C7E2FAB20102C0C0D280F4786EDA0EA7C
-:1060B000AC60AE2328D63E0637C9EBAFC9CD7760BA
-:1060C000E5D0C70600C518040600C5040E03180B6A
-:1060D0000600C518040600C5040E0CCDE0FFD5E58A
-:1060E0002118FD3603CDBB61280DD3042118FD35E1
-:1060F00020F33E80C3B361D302CB40280523CB7687
-:10610000202BE6C028272604FE402806FEC02802D1
-:1061100026017C3DA36F7CFE20280DCB27CB23CB13
-:106120001230F43E02C3B3613EE0A3B55FCD0A6214
-:10613000CDFE61E60347E5210301CDE26179D3009D
-:10614000CDE26178D300CDE2617AD300CDE2617B0C
-:10615000D300E1DB01CB7F2049E605EE0120F4C549
-:10616000061010FE44CDD06160E6C02802FEC07962
-:106170000F2E00454D3813280DDB010FD27961ED4C
-:10618000A3C279611815EDB31811280DDB010FD2E8
-:106190008C61EDA2C28C611802EDB225C1DB010752
-:1061A00030FBDB00B7280DE52118FD35E12804D3CD
-:1061B000021883373215FDE1D1C1C9CDD061E63F68
-:1061C000323FFDD301E52E8065CDE261E1C07EC99D
-:1061D00021C0FFCDFE61E61C20017E856F300124C9
-:1061E0007EC9C5010000DB013C28103D280DA5AC8F
-:1061F000280AE3E3E3E30B78B120EB3DC1C93A01A0
-:10620000FDE61FFE1EC03AF9FFC9E52A12FD78CB54
-:106210003F0F0F0F84E167C9783214FDCD686F21FD
-:1062200014FD462A02FDED5B04FDB7ED52EB384448
-:106230003A07FDE61F3C6F2600CD936FB72BED525A
-:106240003832D5ED5B02FD3E4BCD65623E4E806F30
-:10625000AF772E0656237EE6E05FEBCD866FD11931
-:10626000EB26FDAFC9806F26FD4E7B2B967A99D821
-:10627000732372C9ED5B08FDCDC360DA1F64211280
-:10628000FD3604ED5B02FD2100003A12FDB72849FE
-:10629000CD0C603C2843CD0C60E61F3CD55F16005A
-:1062A000EBCD936FEB221AFD19D17B957A9C30DAF6
-:1062B0002A1AFD2204FD2112FD3535CD0C602E0673
-:1062C00077CD0C602C773A14FDC6405F16FD210097
-:1062D000FD0E0ECD756FC31F622114FD46AF3FC981
-:1062E00044E5CD0A62E578C64E6F26FD347EE16F47
-:1062F0002DFE037EE1C969E5CD0A6279C6036FDE32
-:10630000024F7EE1C961E5F578E670C64E6F26FD65
-:10631000346ECD0A622DF1777DC601E1C962E56F69
-:10632000CD0A6279C6034D6F71DE024FE1C978E68E
-:1063300070C6426F26FD3423C034C90E00181C0EEF
-:10634000103A15FDE64020130E02210E04180CE150
-:106350000E06210E08210E0A210E0E79C6216F2687
-:10636000FDAF5E772C56777BB2E12830D5C978E651
-:1063700070B8200CC6416F26FD7EFEFFC00E1221B4
-:106380000E1418080E1818050E1A2EE1E13A15FD24
-:10639000E64028020E1079FE1238C0E1EB2A33FDE8
-:1063A000790FC6A3E979FE0930DA87C6216F26FD89
-:1063B000732C72C9CD6E632C5E2C561B1BCD6E6385
-:1063C000133E42806F732C723E4E806F26FD360363
-:1063D000C9806F4E2D7B967A99D24F6313C93E4286
-:1063E000806F5E2C56D53E4A806F5E2C56E1EBB72F
-:1063F000ED52C9CD6E63CDDE63D41862DA5063CD41
-:10640000C560381CCDE1622E00AE4FCDE1622E0298
-:10641000AEB14FCDE1622CAEB1C24B63C32E63E18E
-:10642000E680CA3B63C35963CD6E630707DA5363E3
-:10643000CBEECD1862381F2E007ECD06632E027E75
-:10644000CD06632C7ECD0663CDD260D22E63E6806E
-:10645000CA3F63C359633E04CD0960DA8D6318D225
-:10646000CD7A60D0A737C8C34B63CD7A6038F5E9E1
-:10647000CDA364C9793C20092AF7FF7CB528020E18
-:106480001ECDA364D0C28D633E01CD0960D0C38D03
-:1064900063CDB264C90670CDB26478D6104720F7D8
-:1064A000C3E765CDB6643E03CD096026FDD0C8C301
-:1064B0008C63CDB664C978E670C847C6416F26FDC7
-:1064C0007E3CC83E02CD0960D0C38B63CD6E6307AE
-:1064D000DA566307DA53637A3CCCEE643E4BC4D1A0
-:1064E000633E4A806F732C723E41806FCBEE110089
-:1064F00000C9DD460CD5C5CD6E63E61F4F0600CD45
-:106500007064C13EFF3241FD3803D137C9CD6E639F
-:10651000E61F3201FD2B7E3200FDCD476FCDC360FB
-:1065200038177EE6F0EBE3EB2A12FDC6046F0E0B84
-:10653000EBCD4260D1D5CDD060D1D0E680CA3F63EB
-:10654000C3596321F6FF7EFEA53600280523AF77E9
-:1065500023771135FD01080021E466EDB011C0FF7D
-:10656000218A670E21EDB02A0AFE2235FD2AE46653
-:10657000220AFE2100F5D1F92212FDD52227FE21A3
-:10658000B265CD9A65116C6701FF10CD18603EFFB2
-:10659000D8320FFE3203F6C33D682233FD2141FDA0
-:1065A000067136FF2310FB0E085058CD45600DF8DC
-:1065B00018F9DD5E0C16002141FD1936FFDD720E63
-:1065C000DD7205C31200F5218267010800CD0B00C2
-:1065D000F10E2FE67F0CD60A30FBC63A47C5010202
-:1065E00000606839CD0B0021C665CD9A65117767CB
-:1065F000CD1E60C72151FD0110007E3C2808097D99
-:10660000FEC120F6D7937DD641DD770C47DD6E03C2
-:10661000DD660423234EAFC99FC9CDF465CD186054
-:106620003E00D81806CDF465CD1560DD700C780FEE
-:106630000F0F0FC6F5672E0375DD7508DD7409DDD4
-:10664000750ADD740BDD360784AFDD360DFCDD77B2
-:106650000EC9C9C31A66C32566C37766C31500C3CE
-:106660001B00C38866C39266C36E66C3F264DD46D0
-:106670000C11FFFFCD2460DD7E0EDD460CA7280542
-:10668000C5FC2300C1C32160AFCDA566CD2D60A799
-:106690001808AFCDA566CD306037DD66092E03D072
-:1066A000EB3E0118A5DD460CA7C87AA33CC8C32A57
-:1066B000602A602103F6F5E6F8BE281DD50F0F0FFE
-:1066C000E60F5F16000610AF320FFEE5CD2A60CD53
-:1066D0002D603E01320FFEE1D1F144EDB17EA7F80D
-:1066E000EDA018F9EC662020205366FFF4664452B2
-:1066F00030536600FC6644523153660104674452CD
-:10670000325366020C6755464453661E14674D4665
-:10671000305366081C674D463153660924674D4661
-:106720003253660A2C674D4F3053660C34674D4F19
-:106730003153660D3C6753463053661044675346E9
-:10674000315366114C6753463253661254674844BE
-:10675000305366045C6748443153660564674844B7
-:106760003253660635FD4844335366074241534968
-:1067700043455252535953434D44494E542020539C
-:1067800059530D0A41626F72742008004452240567
-:1067900048446C024D46AD004D4F6E02534600001A
-:1067A0003F3F00003F3F0002524DC9EBCD2B68EB4D
-:1067B000CD3E001806CD2B68CDF967D5CD6E66D1DC
-:1067C000C9CD3B00D8D511D667CD4400D112133EB8
-:1067D000BF37C0C33B00B74153FFCD2B68CDF9672E
-:1067E00013FF7818161140FED5CD4100D1D4F264C4
-:1067F000F5CD7766F1301ED7C0FFAFDDE1E1C1DD39
-:1068000039D5DDE5DD23DD23A720DADD23DD23CD4A
-:106810002D00CD1968E1D1F9C9DD6E03DD66047E76
-:10682000EE532005237EEE66C8D7B4E1DD21F1FFEB
-:10683000DD39DDF9CDA463210F0039F9C9E1E52384
-:106840007EFECDC011F4001AFEE7C0D5237E23667C
-:106850006FCD9B6FFD360E01D12A27FEF9D5114071
-:10686000FED5216D68010C00EDB0E1FBC952554E1B
-:1068700020535441525438300DCD686F2109FD56D4
-:106880002D5ECDC360385E0E04CDFF68FEFF280785
-:10689000CDFF6820F4184B0D2E0E71CD016FCDC3C6
-:1068A000603849CD1169383ACDD060383F2108FDB4
-:1068B0005E2C56CDC360382D2E0E4E2E0646CD08CA
-:1068C000692C46CD0869280806FFCD0869CD0869FE
-:1068D000CDD06038133A1EFDC6416F26FD7EF620EE
-:1068E00077C93E0C013E00013E02181047E6403ECB
-:1068F00010200978E6803E1A28023E0EC33C6AE565
-:106900002A12FD697E0CE1C9E52A12FD69700CE1CD
-:10691000C91E0026FF06800E01E5E5E1E10D79FEC6
-:10692000EF303BE5CDFF686F7DA0280E0F4730F8B4
-:10693000068079FEEF20EDE118247DC516006F7DFD
-:10694000A02011147AFE10280FCB0830F20680CD5B
-:10695000FF6818EA7BBA30C35AE1E3E120BF3EFF8B
-:10696000BC37C8856F47E50E007C073807673E20B7
-:10697000814F18F57B3DB12106FD702C773A1CFD47
-:10698000FE0120086069CD866F2208FDE1544DCDDF
-:10699000FF68470D7AB0471D2806CB0A30F61680EF
-:1069A000CD08697BB720E8CD016FAFC9CDA06C21C0
-:1069B0003EFD36003E16DA3C6AAF3200FDCDC360C4
-:1069C0003828CBC6CDD2603821CBCE06101807C5EB
-:1069D000CDC360C138550E00CDFF683CCA436A3E46
-:1069E0000F814F30F31310E7180AE6C0283D3A1D17
-:1069F000FD3C2037CDFE613A1DFD20053C3E0428BC
-:106A0000073C201D3A01FD3C111000FE1D3201FD26
-:106A100020AB213EFDCB463E0E2821CB4E3E10281A
-:106A20001B3E0C1817E6803E0228113A15FDE6C001
-:106A30003E1A2808E6403E1020023E0E321DFD3E62
-:106A40008187C90D3E1090B13200FDE60FC6EF4FB1
-:106A5000C506010E00CDFF683C2801043E0F814FA2
-:106A600030F360C1CD016FCDFE612005ED5BF7FF16
-:106A70001BCDC3604438B4CD0869CDFE61200DCD77
-:106A8000D06038A7CD016FCDC360389FCD1169DAD2
-:106A9000F469CD5D6F3D20083A07FDE61FCAF46931
-:106AA000CDD060DAEC6816004A2100FD46CD0869B9
-:106AB00042CD08690600CD086905CD08692E064655
-:106AC000CD08692C46CD086906FFCD0869CD086957
-:106AD000ED5B08FDCDD060DA256A0E002E0046CDB4
-:106AE00008690601CD08690600CD086979FE09200C
-:106AF000F80603CD086913CDD060DA256ACD476F5B
-:106B0000CDC360DA2B6AD52E007EE6F04F2A06FD53
-:106B100045CD08693EE0A447CD08690600CD086967
-:106B2000CD08692A1FFD3E0BCD606B06FFCD0869BD
-:106B3000D1CDD060DA2B6A2100002204FD220CFDA9
-:106B400023220AFD2202FD210EFD36032E01CBEE8B
-:106B50003A1EFDC6405F16FD2D0E0FCD756FAFC9F5
-:106B6000815F46CD08692379BB20F7C9CDA06CDAD7
-:106B70000D6C2A1FFD7CB7CA156C7EC601D8D5CD19
-:106B8000016FCDFE61C4C360D1385621C0FD01EF55
-:106B900010CDFF68772310F9AF3200FD21C0FDE66C
-:106BA0000F856F3001247EB7282CCDC3603832AFFB
-:106BB000E6F0C6044FC60B472A1FFDCDFF68BE2076
-:106BC0000C2379B820F5793DE6F04F18682100FDD7
-:106BD0003E10867730DA132100FD347EC6F030BCDB
-:106BE000B73A15FDB72804E6802825CDFE613A1D89
-:106BF000FD20053C3E0428073C200F3A01FD3CFEE9
-:106C00001C3201FD111000C27E6BAF37C93E160168
-:106C10003E1AC33C6A3E018038F33A1FFD2100FD55
-:106C200077CD476FCDC36038B87EE6F04F5FCDFFBC
-:106C300068C601D84BCDFF68572106FD77CDFF68A8
-:106C40005F0F0FE6C02E01B6773EE0A35FEBCD8667
-:106C50006F2208FDCDFF686FCDFF68672B220AFD0C
-:106C6000EB2100002204FD232202FD2108FD5E2C01
-:106C700056CDC360DAE16B2E000E00CDFF68BE205A
-:106C80008F0E05CDFF682E07773E032E0E773A1E36
-:106C9000FDC6405F16FD2100FD0E0FCD756FAFC91B
-:106CA000410C28050D79E61F4F79ED5BF7FFFE1EBD
-:106CB000280B783C7920277AB33E0428217AB33711
-:106CC000C83E1E3201FD1BCDC3603FD0132A12FD0A
-:106CD0002E007E2C2C2C2C2CAE2CAEC837C91110BB
-:106CE000003201FDB7C9CD686F11F3FF1936FF2ED1
-:106CF000017EE620C8002E0A7E2CB6CADB6DCD7C54
-:106D00006FDA196EED5B0AFD0E003EFFCD1E63AF1C
-:106D10002E0C772C77CDF762DAC66D3CCAC66DCDE6
-:106D2000F762E61F3C26006FCD936FE5D5ED5B0C57
-:106D3000FD19220CFDD137ED52E138D9EB2A0CFDBB
-:106D4000B7ED52220CFD0D0D210EFD71CDF7622E17
-:106D50000677CDF7622C772A0AFDED5B0CFDB7EDC7
-:106D600052CD5D6F3D2806CB3CCB1D18F74D21075A
-:106D7000FD7EE61F912859577EE6E0B177E6E05F99
-:106D80002D7E2E10773E20835F3E008E7779D601D0
-:106D90004F30F27AB33D5F7E2E0E4ECD1E637BCD1B
-:106DA0001E63CD426EDA196E2E0E4E2E067ECD1E5D
-:106DB000632C7ECD1E63C5CD246EC1ED5B08FDD472
-:106DC000D2603855AFC92A0CFDCD286E384BAFC9FB
-:106DD0002E0E3434CD426E384018DBCD476FCDC512
-:106DE0006038363A01FDE6C02026CD0A623A00FD41
-:106DF000E6F06F3E1036FF2C3D20FACDD2603819F8
-:106E0000CD7C6F38143E01320EFDCD426E380AC97A
-:106E10003E0A180DE13E141808E6803E0E20023EA0
-:106E20001AC33C6A2A0AFD23CD476FCDC360D83A06
-:106E300000FDE6F0C6024F45CD086944CD0869C3A0
-:106E4000D060CD016F3A0EFD3212FDE1E57DFE0D01
-:106E5000202BCDFE612005ED5BF7FF1BCDC360D875
-:106E60002100FD7EE60FC6EC4FCDF7623D0DCD1E35
-:106E700063CDFE61200BCDD060D8CD016FCDC36056
-:106E8000D8211EFD4678B7288B2112FD4ECDF76222
-:106E9000385C3C2859D6042E1077CDF7622C77E663
-:106EA0001F2E0F772E124E3EFFCD1E633EFFCD1ECE
-:106EB000637106002E117EE6E00707074F167F7903
-:106EC000D601380C4F7A0F5718F5CDFB6E34167F6C
-:106ED0002E104ECDF762A25F2E0F7ED601380977B5
-:106EE0007A0F577B30E418EE7BCDFB6E1893CD0103
-:106EF0006FCDD060211EFD4626FDC92E104EC31E4B
-:106F000063E5CDD061E1110E00E6C0FE80C01E0633
-:106F1000C9E52A12FD7E2C2212FDE1C9ED431DFDBB
-:106F2000ED531FFD321CFDCD366FED4B1DFDED5BAE
-:106F30001FFD3A1CFDC93DCAAC693DCAE66C3DCA9D
-:106F40006C6B3DCA7968C9ED5BF7FFCDFE61280324
-:106F50001110003A00FDE60F835FD014C9E5CDD0D3
-:106F600061237EE6073CE1C978E670C6406F26FDE6
-:106F70001100FD0E0EEDA0AFB120FAC9ED5B08FDCA
-:106F8000CDC560D8AFC9CD5D6FFE06C8CB3CCB1D6B
-:106F90003C18F6CD5D6F3DC82918FBCD3E03E900D6
-:106FA0000000000000000000000000000000002CB5
-:106FB000042D042420250100373EB4DD2A16FDDA15
-:106FC0008966C3936621BE00E56CE539D5CDF06FC7
-:106FD000D17BCD0109DD2216FDDD7E09A7CA296816
-:106FE000E1D1CDEB6F23360323772336FD2372C91E
-:106FF000010251E52128FEC3741018C918BA18BA45
-:040000030000600099
-:00000001FF