Carrier and specan shellcode for CC1110.
authortravisutk <travisutk@12e2690d-a6be-4b82-a7b7-67c4a43b65c8>
Sun, 24 Apr 2011 23:15:55 +0000 (23:15 +0000)
committertravisutk <travisutk@12e2690d-a6be-4b82-a7b7-67c4a43b65c8>
Sun, 24 Apr 2011 23:15:55 +0000 (23:15 +0000)
git-svn-id: https://svn.code.sf.net/p/goodfet/code/trunk@1014 12e2690d-a6be-4b82-a7b7-67c4a43b65c8

client/GoodFETCC.py
client/goodfet.cc
client/shellcode/chipcon/cc1110/carrier.ihx [new file with mode: 0644]
client/shellcode/chipcon/cc1110/reflex.ihx
client/shellcode/chipcon/cc1110/rxpacket.ihx
client/shellcode/chipcon/cc1110/rxpacketp25.ihx
client/shellcode/chipcon/cc1110/specan.ihx [new file with mode: 0644]

index 9e135c1..bf7e491 100644 (file)
@@ -30,11 +30,15 @@ class GoodFETCC(GoodFET):
         if self.smartrfpath==None:
             self.smartrfpath="/opt/smartrf7";
         
         if self.smartrfpath==None:
             self.smartrfpath="/opt/smartrf7";
         
-        
+    haveloadedsymbols=False;
     def loadsymbols(self):
     def loadsymbols(self):
-        try: self.SRF_loadsymbols();
+        if self.haveloadedsymbols:
+            return;
+        try:
+            self.SRF_loadsymbols();
+            self.haveloadedsymbols=True;
         except:
         except:
-            print "SmartRF not found at %s." % self.smartrfpath;
+            print "SmartRF not found for this chip.";
     def SRF_chipdom(self,chip="cc1110", doc="register_definition.xml"):
         """Loads the chip XML definitions from SmartRF7."""
         fn="%s/config/xml/%s/%s" % (self.smartrfpath,chip,doc);
     def SRF_chipdom(self,chip="cc1110", doc="register_definition.xml"):
         """Loads the chip XML definitions from SmartRF7."""
         fn="%s/config/xml/%s/%s" % (self.smartrfpath,chip,doc);
@@ -716,7 +720,7 @@ class GoodFETCC(GoodFET):
                 print "ERROR: PC changed during CCdebuginstr([NOP])!";
         
         print "Checking pokes to XRAM."
                 print "ERROR: PC changed during CCdebuginstr([NOP])!";
         
         print "Checking pokes to XRAM."
-        for i in range(0xf000,0xf020):
+        for i in range(self.execbuf,self.execbuf+0x20):
             self.CCpokedatabyte(i,0xde);
             if(self.CCpeekdatabyte(i)!=0xde):
                 print "Error in XDATA at 0x%04x" % i;
             self.CCpokedatabyte(i,0xde);
             if(self.CCpeekdatabyte(i)!=0xde):
                 print "Error in XDATA at 0x%04x" % i;
@@ -756,17 +760,18 @@ class GoodFETCC(GoodFET):
                 0x9500:"CC2533",
                 0x8D00:"CC2540",
                 0xFF00:"CCmissing"};
                 0x9500:"CC2533",
                 0x8D00:"CC2540",
                 0xFF00:"CCmissing"};
+    execbuf=None;
     CCexecbuf= {0x0100:0xF000,
                 0x1100:0xF000,
                 0x8500:0xF000,
                 0x8900:0xF000,
                 0x8100:0xF000,
                 0x9100:0xF000,
     CCexecbuf= {0x0100:0xF000,
                 0x1100:0xF000,
                 0x8500:0xF000,
                 0x8900:0xF000,
                 0x8100:0xF000,
                 0x9100:0xF000,
-                0xA500:0x8000,
+                0xA500:0x0000, #CC2530
                 0xB500:0x8000,
                 0x9500:0x8000,
                 0x8D00:0x8000,
                 0xB500:0x8000,
                 0x9500:0x8000,
                 0x8D00:0x8000,
-                0xFF00:0xF000} #missing
+                0xFF00:None} #missing
     CCpagesizes={0x01: 1024, #"CC1110",
                  0x11: 1024, #"CC1111",
                  0x85: 2048, #"CC2430",
     CCpagesizes={0x01: 1024, #"CC1110",
                  0x11: 1024, #"CC1111",
                  0x85: 2048, #"CC2430",
@@ -777,13 +782,16 @@ class GoodFETCC(GoodFET):
                  0xB5: 2048, #"CC2531",
                  0x95: 2048, #"CC2533",
                  0x8D: 2048, #"CC2540",
                  0xB5: 2048, #"CC2531",
                  0x95: 2048, #"CC2533",
                  0x8D: 2048, #"CC2540",
-                 0xFF: 0    } #"CCmissing"};
+                 0xFF: None}
     def infostring(self):
         return self.CCidentstr();
     def CCidentstr(self):
         ident=self.CCident();
         chip=self.CCversions.get(ident&0xFF00);
     def infostring(self):
         return self.CCidentstr();
     def CCidentstr(self):
         ident=self.CCident();
         chip=self.CCversions.get(ident&0xFF00);
+        execbuf=self.CCexecbuf.get(ident&0xFF00);
         pagesize=self.CCpagesizes.get(ident>0xFF);
         pagesize=self.CCpagesizes.get(ident>0xFF);
+        self.execbuf=execbuf;
+        
         try:
             return "%s/r%0.4x/ps0x%0.4x" % (chip, ident, pagesize); 
         except:
         try:
             return "%s/r%0.4x/ps0x%0.4x" % (chip, ident, pagesize); 
         except:
@@ -911,21 +919,17 @@ class GoodFETCC(GoodFET):
         return str;
     def start(self):
         """Start debugging."""
         return str;
     def start(self):
         """Start debugging."""
+        ident=0x0000;
+        #while ident==0xFFFF or ident==0x0000:
         self.setup();
         self.writecmd(self.APP,0x20,0,self.data);
         self.setup();
         self.writecmd(self.APP,0x20,0,self.data);
-        ident=self.CCident();
-        if ident==0xFFFF or ident==0x0000:
-            self.writecmd(self.APP,0x20,0,self.data);
-            ident=self.CCident();
-        
+        identa=self.CCident();
+        self.CCidentstr();
         
         
-        #print "Target identifies as %s." % ident;
-        #print "Status: %s." % self.status();
-        self.CCreleasecpu();
-        self.CChaltcpu();
+        ident=self.CCident();
         #Get SmartRF Studio regs if they exist.
         self.loadsymbols(); 
         #Get SmartRF Studio regs if they exist.
         self.loadsymbols(); 
-        
+        print "Status: %s" % self.status();
     def stop(self):
         """Stop debugging."""
         self.writecmd(self.APP,0x21,0,self.data);
     def stop(self):
         """Stop debugging."""
         self.writecmd(self.APP,0x21,0,self.data);
index f7574bc..178ca3c 100755 (executable)
@@ -155,9 +155,8 @@ client.serInit()
 client.setup();
 client.start();
 
 client.setup();
 client.start();
 
-#REMOVEME
-client.halt();
-client.pokebyte(0xc7,0x08);
+#client.halt();
+#client.pokebyte(0xc7,0x08);
 
 if(sys.argv[1]=="carrier"):
     if len(sys.argv)>2:
 
 if(sys.argv[1]=="carrier"):
     if len(sys.argv)>2:
diff --git a/client/shellcode/chipcon/cc1110/carrier.ihx b/client/shellcode/chipcon/cc1110/carrier.ihx
new file mode 100644 (file)
index 0000000..40e1871
--- /dev/null
@@ -0,0 +1,36 @@
+:03F0000002F00813
+:03F0610002F003B7
+:05F0030012F06480FE24
+:03F0640053BEFB9D
+:08F06700E5BE30E6FB53C6B81C
+:0EF06F00E5C620E6FB43BE0490DF07740AF0FE
+:0EF07D0090DF08E4F090DF0C7486F090DF0D59
+:0EF08B007483F090DF0E7430F090DF0F74226B
+:0DF09900F090DF1074F8F090DF06E4F090C6
+:0EF0A600DF11F090DF1A7456F090DF1B74102B
+:0EF0B400F090DF147414F090DF157416F090D5
+:0EF0C200DF16746CF090DF177403F090DF1807
+:0EF0D0007440F090DF197491F090DF1C74E929
+:0DF0DE00F090DF1D742AF090DF1EE4F0902A
+:0EF0EB00DF1F741FF090DF237488F090DF2485
+:0EF0F9007431F090DF257409F090DF2E745012
+:0EF10700F090DF037404F090DF047422F090A7
+:0EF11500DF05E4F090DF0274FFF090DF00747D
+:0BF12300AAF090DF0174AAF075E10370
+:0BF12E0090DF3BE0FA53021FBA13F51C
+:02F1390080FE56
+:06F03700E478FFF6D8FDAD
+:08F015007900E94400601B7A58
+:05F01D000090F13F78B6
+:03F02200007593E3
+:0AF0250000E493F2A308B80002050E
+:08F02F0093D9F4DAF27593FFA6
+:08F03D007800E84400600A7944
+:03F04500007593C0
+:06F0480000E4F309D8FC0E
+:08F04E007800E84400600C7931
+:0BF0560000900000E4F0A3D8FCD9FA01
+:03F0080075810708
+:0AF00B0012F13BE582600302F003FE
+:04F13B0075820022B7
+:00000001FF
index 45d3258..a422301 100644 (file)
 :0AF16000000A12F12CD00275E10242
 :0EF16A0090DF3BE0FBBB0DF87B00900064C023
 :0AF1780002C00312F12CD003D002F4
 :0AF16000000A12F12CD00275E10242
 :0EF16A0090DF3BE0FBBB0DF87B00900064C023
 :0AF1780002C00312F12CD003D002F4
-:08F18200C3EB9A400302F1A562
-:0EF18A00900001C00212F12CD00290DF3AE09A
-:0DF19800FC74806CFB90FE00F0A502F1827B
-:06F1A50075E10475E103B1
-:0CF1AB0090DF3BE0FA53021FBA13F5A5F9
-:02F1B70080FED8
+:04F18200EBB50200E7
+:05F18600400302F1A6A8
+:0EF18B00900001C00212F12CD00290DF3AE099
+:0DF19900FC74806CFB90FE00F0A502F1827A
+:06F1A60075E10475E103B0
+:0CF1AC0090DF3BE0FA53021FBA13F5A5F8
+:02F1B80080FED7
 :06F03700E478FFF6D8FDAD
 :08F015007900E94400601B7A58
 :06F03700E478FFF6D8FDAD
 :08F015007900E94400601B7A58
-:05F01D000090F1BD7838
+:05F01D000090F1BE7837
 :03F02200007593E3
 :0AF0250000E493F2A308B80002050E
 :08F02F0093D9F4DAF27593FFA6
 :03F02200007593E3
 :0AF0250000E493F2A308B80002050E
 :08F02F0093D9F4DAF27593FFA6
@@ -46,6 +47,6 @@
 :08F04E007800E84400600C7931
 :0BF0560000900000E4F0A3D8FCD9FA01
 :03F0080075810708
 :08F04E007800E84400600C7931
 :0BF0560000900000E4F0A3D8FCD9FA01
 :03F0080075810708
-:0AF00B0012F1B9E582600302F00380
-:04F1B9007582002239
+:0AF00B0012F1BAE582600302F0037F
+:04F1BA007582002238
 :00000001FF
 :00000001FF
index 9251acd..d50f8ab 100644 (file)
 :04F09600E0387B00E3
 :0EF09A008A047D0074032CFCE43DFD8B067F90
 :0EF0A80000C3EE9CEF64808DF063F08095F065
 :04F09600E0387B00E3
 :0EF09A008A047D0074032CFCE43DFD8B067F90
 :0EF0A80000C3EE9CEF64808DF063F08095F065
-:02F0B600503FC9
+:02F0B6005040C8
 :05F0B80010890280FB3D
 :0DF0BD008B040B8C827583FEE5D9FCF0906E
 :06F0CA00FE00E0FA80CA1E
 :0AF0D00090DF02E090FE00F07A01EC
 :05F0B80010890280FB3D
 :0DF0BD008B040B8C827583FEE5D9FCF0906E
 :06F0CA00FE00E0FA80CA1E
 :0AF0D00090DF02E090FE00F07A01EC
-:0AF0DA0090DF02E0FBC3EA9B501335
-:05F0E40010890280FB11
-:0EF0E9008A030A8B827583FEE5D9FBF080E373
-:05F0F70075E104A522F3
+:09F0DA0090DF02E0FBEAB503003F
+:02F0E3005013C8
+:05F0E50010890280FB10
+:0EF0EA008A030A8B827583FEE5D9FBF080E273
+:05F0F80075E104A522F2
 :06F03700E478FFF6D8FDAD
 :08F015007900E94400601B7A58
 :06F03700E478FFF6D8FDAD
 :08F015007900E94400601B7A58
-:05F01D000090F10078F5
+:05F01D000090F10178F4
 :03F02200007593E3
 :0AF0250000E493F2A308B80002050E
 :08F02F0093D9F4DAF27593FFA6
 :03F02200007593E3
 :0AF0250000E493F2A308B80002050E
 :08F02F0093D9F4DAF27593FFA6
@@ -31,6 +32,6 @@
 :08F04E007800E84400600C7931
 :0BF0560000900000E4F0A3D8FCD9FA01
 :03F0080075810708
 :08F04E007800E84400600C7931
 :0BF0560000900000E4F0A3D8FCD9FA01
 :03F0080075810708
-:0AF00B0012F0FCE582600302F0033E
-:04F0FC0075820022F7
+:0AF00B0012F0FDE582600302F0033D
+:04F0FD0075820022F6
 :00000001FF
 :00000001FF
index 1c8fca6..2739b1c 100644 (file)
@@ -8,13 +8,14 @@
 :0BF07B0090DF3BE0FABA01F875E102FB
 :0DF0860090DF3BE0FABA0DF890DF02E09059
 :05F09300FE00F07A010F
 :0BF07B0090DF3BE0FABA01F875E102FB
 :0DF0860090DF3BE0FABA0DF890DF02E09059
 :05F09300FE00F07A010F
-:0AF0980090DF02E0FBC3EA9B501377
-:05F0A20010890280FB53
-:0EF0A7008A030A8B827583FEE5D9FBF080E3B5
-:05F0B50075E104A52235
+:09F0980090DF02E0FBEAB5030081
+:02F0A10050130A
+:05F0A30010890280FB52
+:0EF0A8008A030A8B827583FEE5D9FBF080E2B5
+:05F0B60075E104A52234
 :06F03700E478FFF6D8FDAD
 :08F015007900E94400601B7A58
 :06F03700E478FFF6D8FDAD
 :08F015007900E94400601B7A58
-:05F01D000090F0BE7838
+:05F01D000090F0BF7837
 :03F02200007593E3
 :0AF0250000E493F2A308B80002050E
 :08F02F0093D9F4DAF27593FFA6
 :03F02200007593E3
 :0AF0250000E493F2A308B80002050E
 :08F02F0093D9F4DAF27593FFA6
@@ -24,6 +25,6 @@
 :08F04E007800E84400600C7931
 :0BF0560000900000E4F0A3D8FCD9FA01
 :03F0080075810708
 :08F04E007800E84400600C7931
 :0BF0560000900000E4F0A3D8FCD9FA01
 :03F0080075810708
-:0AF00B0012F0BAE582600302F00380
-:04F0BA007582002239
+:0AF00B0012F0BBE582600302F0037F
+:04F0BB007582002238
 :00000001FF
 :00000001FF
diff --git a/client/shellcode/chipcon/cc1110/specan.ihx b/client/shellcode/chipcon/cc1110/specan.ihx
new file mode 100644 (file)
index 0000000..f9254bc
--- /dev/null
@@ -0,0 +1,370 @@
+:03F0000002F00813
+:03F0610002F003B7
+:05F0030012F7A980FED8
+:04F06400AA82AB834E
+:05F068001ABAFF011BB4
+:0EF06D00C3E49A74808BF063F08095F0500F2E
+:04F07B007CB07D04E4
+:05F07F001CBCFF011D97
+:06F08400EC4D70F780DE88
+:01F08A002263
+:0EF08B0090DF077412F090DF08E4F090DF17BA
+:0EF09900E044C0F090DF1C74EAF090DF1D74BC
+:0EF0A7002AF090DF1EE4F090DF1F741FF0903F
+:0EF0B500DF237488F090DF247431F090DF25A3
+:09F0C3007409F090DF14E4F0225E
+:07F0CC007401B52602800764
+:07F0D3007402B5261080074E
+:07F0DA0090DF0C74ECF02242
+:07F0E10090DF0C740CF0221B
+:07F0E80090DF0C746CF022B4
+:0EF0EF00AA82AB83ACF0FDC002C003C004C017
+:0EF0FD000512F9ADAE82AF83A8F0F9C006C0CF
+:0EF10B0007C000C0019030E975F025743B127A
+:0EF11900F8B3AE82AF83A8F0F9E58124FCF5CF
+:0EF12700818E828F8388F0E912F9C0AE82AF2C
+:0EF1350083A8F0D005D004D003D00290DF09EB
+:0EF14300E8F090DF0AEFF07F0078007900908E
+:0CF15100DF0BEEF0E525700FC3EA9480A0
+:0BF15D00EB944BEC94F4ED9412402274
+:0CF168007401B5250CC3EB94BAEC94457F
+:05F17400ED94194011AB
+:0CF179007402B52513C3EB9474EC948B66
+:05F18500ED943250077B
+:07F18A0090DF1D740AF02262
+:07F1910090DF1D742AF0223B
+:0DF1980012F0EF75E10175E1029000021226
+:0CF1A500F064E52A75F008A4FAABF0EA6B
+:0AF1B1002400FCEB3400FD90DF09A0
+:0CF1BB00E08C828D83F0EA2400FAEB3433
+:0CF1C70000FB74012AFCE43BFD90DF0A11
+:0EF1D300E08C828D83F074022AFCE43BFD90F8
+:0EF1E100DF0BE08C828D83F074032AFCE43B8C
+:0EF1EF00FD90DF1CE08C828D83F074042AFCFE
+:0EF1FD00E43BFD90DF1DE08C828D83F07405F5
+:0EF20B002AFCE43BFD90DF1EE08C828D83F038
+:0EF2190074062AFCE43BFD90DF3AE0FE63063B
+:0EF22700808C828D83EEF074072AF582E43B22
+:08F23500F583E4F075E1042209
+:09F23D0085822B85832C7401B538
+:04F246002602800715
+:07F24A007402B5264F80138A
+:07F25100753A03753B0175DE
+:07F258002E44752FC3E4F5FD
+:05F25F0030F531806F65
+:07F26400753A2A753B147591
+:06F26B002E88752F2B75A3
+:08F27100300A753100740A2512
+:09F279002BF582E4352CF58375B8
+:06F28200081475090012DA
+:07F28800F88A8582088583E6
+:09F28F000990001412F9F98582BE
+:06F298002B85832C80355C
+:07F29E00753A0D753B057583
+:06F2A5002E10752F0D75FF
+:06F2AB00300375310085FF
+:08F2B1002B82852C83A3A375B9
+:06F2B900080575090012B2
+:07F2BF00F88A8582088583AF
+:09F2C6000990000512F9F9858296
+:04F2CF002B85832CDC
+:0AF2D300C37467952B7402952C405C
+:04F2DD000302F42311
+:0AF2E100752D02AC3A7D0074C2C323
+:0CF2EB009CFE74039DFFE53BC313F87903
+:0CF2F700002EF582E93FF583AE3B7F005E
+:0AF303008E088F09C004C005C00683
+:0EF30D00C007C000C00112FAD3AA82AB83D0A1
+:0AF31B0001D000D007D0068E088F45
+:0CF32500098A828B83C006C007C000C0AC
+:09F331000112F9F985823C858383
+:0CF33A003DD001D000D007D006D005D097
+:0CF346000474ED2CF58274023DF5838EFA
+:0AF35200088F09C004C005C006C002
+:0EF35C0007C000C00112FAD3AA82AB83D00111
+:0AF36A00D000D007D0068E088F09EE
+:0DF374008A828B83C006C007C000C0011252
+:07F38100F9F985823E858346
+:0CF388003FD001D000D007D006D005D047
+:0CF394000474192CF58274013DF5838E81
+:0AF3A000088F09C004C005C006C0B4
+:0EF3AA0007C000C00112FAD3AA82AB83D001C3
+:0AF3B800D000D007D0068E088F09A0
+:0DF3C2008A828B83C006C007C000C0011204
+:0EF3CF00F9F9AA82AB83D001D000D007D00696
+:0EF3DD00D005D00474E1C39CFC74019DFDE8D2
+:0AF3EB002CF582E93DF5838E088FB2
+:0CF3F50009C002C003C006C00712FAD312
+:0BF40100AC82AD83D007D0068E088FD0
+:0CF40C00098C828D8312F9F9AC82AD836B
+:0BF41800D003D0027E007F0102F5C28D
+:0AF42300C37471952B7401952C4001
+:04F42D000302F4FBE7
+:05F43100752D01853A74
+:08F436004075410074E1C3952B
+:06F43E0040F54274019547
+:04F4440041F543E566
+:07F448003BC313F888447573
+:05F44F004500E5442525
+:06F4540042F582E545359A
+:05F45A0043F583853B32
+:05F45F00427543008529
+:03F46400420885D6
+:03F4670043091244
+:04F46A00FAD385420A
+:03F46E00088543CB
+:06F471000912F9F9858281
+:07F477003C85833D747A25FA
+:0AF47E0040F58274013541F58385E5
+:03F48800420885B2
+:03F48B0043091220
+:04F48E00FAD38542E6
+:03F49200088543A7
+:06F495000912F9F985825D
+:07F49B003E85833F74ED255F
+:0AF4A20040F58274023541F58385C0
+:03F4AC004208858E
+:03F4AF00430912FC
+:04F4B200FAD38542C2
+:03F4B60008854383
+:0CF4B9000912F9F9AA82AB837469C395AB
+:08F4C50040F874019541F9E5DE
+:0AF4CD004428F582E54539F58385F2
+:03F4D70042088563
+:07F4DA004309C002C0031248
+:04F4E100FAD3854293
+:03F4E50008854354
+:0CF4E8000912F9F9AC82AD83D003D00208
+:07F4F4007E027F0002F5C259
+:05F4FB00752D00853AAB
+:08F50000447545007469C395D0
+:06F5080044F54274019578
+:04F50E0045F543E597
+:07F512003BC313F8884075AC
+:05F519004100E5402562
+:06F51E0042F582E54135D3
+:05F5240043F583853B67
+:05F5290042754300855E
+:03F52E004208850B
+:03F5310043091279
+:04F53400FAD385423F
+:03F5380008854300
+:06F53B000912F9F98582B6
+:07F541003C85833D74192590
+:0AF5480044F58274013545F5838512
+:03F55200420885E7
+:03F5550043091255
+:04F55800FAD385421B
+:03F55C00088543DC
+:06F55F000912F9F9858292
+:07F565003E85833F747A2507
+:0AF56C0044F58274013545F58385EE
+:03F57600420885C3
+:03F5790043091231
+:04F57C00FAD38542F7
+:03F58000088543B8
+:0CF583000912F9F9AA82AB8374C2C39587
+:08F58F0044F874039545F9E509
+:0AF597004028F582E54139F583852F
+:03F5A10042088598
+:07F5A4004309C002C003127D
+:04F5AB00FAD38542C8
+:03F5AF0008854389
+:0CF5B2000912F9F9AC82AD83D003D0023D
+:04F5BE007E017F0249
+:06F5C200C3E53C952BE5BA
+:06F5C8003D952C50138557
+:03F5CE003C2B854E
+:03F5D1003D2CE5E9
+:05F5D40025B52D248E79
+:04F5D9002D8A2B8BC1
+:03F5DD002C801C63
+:06F5E000C3E52B953EE59A
+:06F5E6002C953F50118539
+:03F5EC003E2B852E
+:03F5EF003F2CE5C9
+:05F5F20025B52D068F78
+:04F5F7002D8C2B8D9F
+:01F5FB002CE3
+:05F5FC00852D25E4B59A
+:04F601002502801F3F
+:09F605007401B5253475328075DD
+:06F60E0033D2753487754C
+:06F6140035167536407545
+:06F61A00377A7538AB756C
+:04F62000391C8032DF
+:07F624007532407533B87523
+:06F62B0034BF75351075B7
+:06F63100364075376C75D0
+:07F6370038847539158018B5
+:07F63E007532407533D575EC
+:06F6450034A475352C759C
+:06F64B0036807537F475EE
+:05F6510038567539393F
+:04F65600852B088573
+:03F65A002C097503
+:0AF65D000A00750B0090424075F0A2
+:0EF667000FE412FA16AE82AF83A8F0F98E02FD
+:09F675008F038804890575294200
+:08F67E00C3E5369AE5379BE570
+:0AF68600389CE5399D4047747C254F
+:05F6900029404185291D
+:0CF695002A8A828B838CF0EDC002C00337
+:0DF6A100C004C005C006C007C000C00112B3
+:0EF6AE00F198D001D000D007D006D005D004CE
+:0AF6BC00D003D002E52E2AFAE52F54
+:0AF6C6003BFBE5303CFCE5313DFD67
+:04F6D000052980AADE
+:0AF6D400EEC3952EFAEF952FFBE828
+:08F6DE009530FCE99531FD7542
+:02F6E6002842B8
+:09F6E800C3EA9532EB9533EC9571
+:07F6F10034ED95354036E5CC
+:06F6F80028603215288590
+:0AF6FE00282A8A828B838CF0EDC06D
+:0EF7080002C003C004C00512F198D005D00461
+:0BF71600D003D002EAC3952EFAEB9559
+:08F721002FFBEC9530FCED9587
+:04F7290031FD80BB73
+:04F72D00852B218582
+:03F731002C22C2C5
+:05F7340000852B828519
+:03F739002C8322FC
+:0CF73C00E58275F008A4FAABF0EA2400A6
+:0CF74800F582EB3400F583E090DF09F05F
+:0AF75400EA2400FAEB3400FB8A827D
+:0EF75E008B83A3E090DF0AF08A828B83A3A343
+:0EF76C00E090DF0BF08A828B83A3A3A3E090D2
+:0DF77A00DF1CF08A828B83A3A3A3A3E09081
+:0EF78700DF1DF08A828B83A3A3A3A3A3E090CF
+:04F79500DF1EF02261
+:07F7990085822612F0CC85E9
+:06F7A00021828522830294
+:02F7A600F23D32
+:01F7A800223E
+:07F7A9007521937522037521
+:06F7B0002393752403758C
+:06F7B6002502752600C2C9
+:04F7BC0000C201C2C4
+:05F7C000027527007531
+:06F7C500280075298312E3
+:08F7CB00F08B75820012F79922
+:02F7D300AA2862
+:04F7D500EAB5290068
+:05F7D900400302F86886
+:0EF7DE008A82C00212F73C75E10290000A1206
+:0CF7EC00F064D0027401B526117B5E7C35
+:01F7F800010F
+:09F7F9008B058C061BBBFF011CF3
+:04F80200ED4E70F364
+:0AF80600EA75F008A42400FB74006A
+:0EF8100035F0FC74062BFDE43CFE90DF3AE080
+:0CF81E00FF6307808D828E83EFF03000C6
+:0EF82A002B74072BFFE43CF88D828E83E0F9EF
+:0AF838008F828883E0F546B50100D9
+:0AF8420050088D828E83E0FD8002E5
+:02F84C00AD46C7
+:08F84E008F828883EDF0800B2E
+:0BF8560074072BF582E43CF583E4F01E
+:07F8610075E1040A02F7D56E
+:06F8680012F7A8E521B52E
+:05F86E002308E522B5AE
+:05F87300240302F7D39D
+:07F878008523828524831221
+:07F87F00F23D858223858321
+:04F886002402F7D38E
+:05F88A007A10E4FBFC14
+:0EF88F00E58225E0F582E58333F583EB33FB5C
+:0AF89D00EC33FCEB9508F5F0EC9558
+:09F8A700094006FCABF0438201AC
+:03F8B000DADD227C
+:06F8B30012F956BC00032F
+:03F8B90002FAA5AB
+:08F8BC00EF60FA30D502B2D171
+:08F8C400E583B4FF0302FABB67
+:08F8CC00E582B4FF0302FABB60
+:0BF8D400258340072482400B02FAA5A8
+:08F8DF00248314500302FABB5C
+:0EF8E700F582EA8DF0A4A8F0EA8EF0A428F8CD
+:0EF8F500E435F0F9EB8DF0A428E935F0F9E4E4
+:0EF9030033CA8FF0A429F9EA35F0FAEBF88E3A
+:0EF91100F0A429F9EA35F0FAE433FBEC8DF0AE
+:0EF91F00A429F9EA35F0FAE43BFBE88FF0A4E6
+:0EF92D002AFAEB35F0FBE433CCFD8EF0A42A71
+:0EF93B00FAEB35F0FBE43CFCED8FF0A42BFB67
+:0AF94900EC35F0FC20E70312F9840E
+:03F9530002FA8431
+:0DF95600AA82AB83A2F73392D16002D2F7F0
+:0EF96300F582ACF0E58124F9F8E6FD08E6FE39
+:0EF971000886F008E6A2F73392D56002D2F7BE
+:05F97F00F583AFF0224A
+:06F03700E478FFF6D8FDAD
+:02F98400780405
+:0EF98600EC700DC9CACBFCE58224F8F582D8DE
+:02F99400F1225E
+:02F996007820D7
+:0EF9980020E7111582C3E933F9EA33FAEB33A5
+:06F9A600FBEC33FCD8EC81
+:01F9AC002238
+:08F015007900E94400601B7A58
+:05F01D000090FB527899
+:03F02200207593C3
+:0AF0250004E493F2A308B80002050A
+:08F02F0093D9F4DAF27593FFA6
+:09F9AD00FCABF0AA83A982749E50
+:02F9B600C2D1BC
+:08F9B800F58212F98402FA84C1
+:02F9C0007F9E28
+:09F9C20012F9E730D10302FAA5A5
+:0EF9CB00C3EF9582500974FFF5F0F583F582C5
+:01F9D900220B
+:05F9DA00790012FB0B97
+:08F9DF0089828A838BF0EC227F
+:0DF9E700AA82AB83A2F73392D16002D2F75F
+:05F9F400F582ACF022D9
+:0BF9F900E5828508F0A4C582C0F085FF
+:0AFA040009F0A4D0F025F0C58385B9
+:08FA0E0008F0A42583F5832212
+:0CFA1600AAF0FBE5828508F0A4FCADF02E
+:0CFA2200E5838508F0A42DFDE435F0FE1E
+:0CFA2E00E5828509F0A42DFDE5F03EFE08
+:0CFA3A00E433FFEA8508F0A42EFEE5F09E
+:0CFA46003FFFE5838509F0A42EFEE5F0EB
+:0CFA52003FFFE582850AF0A42EFEE5F0DF
+:0BFA5E003FFFEB8508F0A42FFFEA85B6
+:0AFA690009F0A42FFFE583850AF0E1
+:0CFA7300A42FFFE582850BF0A42F8EF07D
+:05FA7F008D838C822242
+:08F03D007800E84400600A7944
+:03F04500007593C0
+:06F0480000E4F309D8FC0E
+:08F04E007820E84404600C790D
+:0BF0560005900000E4F0A3D8FCD9FAFC
+:06FA8400B98003EA13B390
+:0EFA8A004010EA2401FAE43BFBE43CFC50048B
+:04FA98007C800582E7
+:09FA9C00BC000EBB000BBA00080F
+:08FAA500E4F5F0F583F582227F
+:0EFAAD00A2D1E582138CF092F78B838A82221D
+:0DFABB00E4F583F58275F080F4A2D11322EA
+:0BFAC800E4F583F58275F0C0747F2226
+:03F00800758146C9
+:0AF00B0012FB4EE582600302F003E1
+:0EFAD300C2D5E58330E70DD2D5E4C39582F5A8
+:06FAE10082E49583F58329
+:0AFAE700E50930E70DB2D5E4C39540
+:05FAF10008F508E49592
+:03FAF60009F50906
+:0EFAF90012F88A30D50BE4C39582F582E495AD
+:03FB070083F58300
+:01FB0A0022D8
+:09FB0B006040F82582500274FFED
+:0EFB1400F582E824F8501ECCCBCAF9E4CC24CC
+:0EFB2200F85014CBCAF9E4CB24F8500BCAF902
+:09FB3000E4CA24F8500379002214
+:05FB390024086010F833
+:0EFB3E00C3EC13FCEB13FBEA13FAE913F9D83E
+:01FB4C00F1C7
+:01FB4D002295
+:04FB4E00758200229A
+:00000001FF