summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortzafrir <tzafrir@5390a7c7-147a-4af0-8ec9-7488f05a26cb>2006-05-08 07:51:38 +0000
committertzafrir <tzafrir@5390a7c7-147a-4af0-8ec9-7488f05a26cb>2006-05-08 07:51:38 +0000
commitd89a13a276d0bc8faaba42aabc8e53e8de071b87 (patch)
treeb52e544cb4575706ca17b40840081545f20ec255
parent2dd60aaf18e98b0e9d3c06bd9dce5f1128fa55ad (diff)
xpp driver release 1.1.0 (second part of commit from r1021)
* Please avoid setting the keyword Id on the firmware files (*.hex) to preserve the original versioning comment. git-svn-id: http://svn.digium.com/svn/zaptel/trunk@1023 5390a7c7-147a-4af0-8ec9-7488f05a26cb
-rw-r--r--xpp/utils/FPGA_FXS.hex537
-rw-r--r--xpp/utils/Makefile37
-rw-r--r--xpp/utils/USB_1130.hex309
-rw-r--r--xpp/utils/USB_8613.hex301
-rw-r--r--xpp/utils/fpga_load.872
-rw-r--r--xpp/utils/fpga_load.c710
-rw-r--r--xpp/utils/hexfile.c297
-rw-r--r--xpp/utils/hexfile.h119
-rw-r--r--xpp/utils/test_parse.c34
-rw-r--r--xpp/utils/xpp_fxloader158
-rw-r--r--xpp/utils/xpp_fxloader.usermap2
-rw-r--r--xpp/utils/xpp_modprobe6
12 files changed, 2567 insertions, 15 deletions
diff --git a/xpp/utils/FPGA_FXS.hex b/xpp/utils/FPGA_FXS.hex
new file mode 100644
index 0000000..4970536
--- /dev/null
+++ b/xpp/utils/FPGA_FXS.hex
@@ -0,0 +1,537 @@
+#
+# $Id: FPGA_FXS.hex 1092 2006-04-30 17:12:50Z dima $
+#
+:020000040000FA
+:80000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6AD6FF4000A04A08006AD6FF4000A04A08006AD6FF4000A04A080000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4455544455557475577775577675577775577765566665563625523235D2E37C2B5111155111155111155111F8
+:80008000155111155111155111155111155111155111155111155111155111155111155111155111155111155111155111155111000000000000000000000000000000000000002552222552222552220025522225522200000000001AA1111AA1110025522200000000001AA1110000000000000000000000002552222552222F21F11211
+:80010000122F21F112122552222552222552222552221AA1111AA111001AA1112552222552222F21F112122F21F112122552222552222F21F112122F21F112122F21F11212255222000000002F21F112122F21F1121200002552222552221AA1111AA1112552222F21F1121200001AA1112F21F1121200002F21F112122F21F112121AA102
+:800180001100255222255222000000000025522200001AA1111AA11125522200255222000025522200000000CFC6F66C6C4F42F22424000000000000000000000000001AA1111AA111000000000000000000000000000025522200000000255222255222000025522225522225522225522225522225522225522225522225522200255257
+:800200002200000000004AA4444AA444000000004F44F444445F55F555551F11F111114F44F4444400004AA4444AA4440000004AA4442F24F442422F24F44242000000004F48F884846F69F996962F21F11212000000CAACCC2F2DFDD2D22F21F112124F48F884842F21F11212004F4CFCC4C46F6DFDD6D62F21F1121200006F6DFDD6D6F1
+:800280006F6DFDD6D66F6DFDD6D6000000008AA8882F29F992922F21F112120000004F4CFCC4C46F6DFDD6D62F21F112128AA8882F21F11212004F4CFCC4C46F6DFDD6D62F21F1121200006F6DFDD6D65F53F33535EFEFFFFEFE006F6DFDD6D66F6DFDD6D6000000008AA8882F28F88282255222000000CFCCFCCCCCCFCCFCCCCC008F8C99
+:80030000FCC8C8255222004F48F884844F48F884840000004F48F884844F48F884844F48F8848400000000CFCCFCCCCCCFCCFCCCCC000000008F8CFCC8C8AFACFCCACA255222CFCCFCCCCC0000CFCCFCCCCCEFECFCCECE2552220000EFECFCCECEEFECFCCECEEFECFCCECE00000000CFC8F88C8CCFC8F88C8C000000008F8CFCC8C8AFACC9
+:80038000FCCACA255222CFC8F88C8C0000CFCCFCCCCCEFECFCCECE2552220000EFECFCCECEEFECFCCECEEFECFCCECE00000000CFC8F88C8CCFC8F88C8C000000008F8CFCC8C8AFACFCCACA255222CFC8F88C8C0000CFCCFCCCCCEFECFCCECE2552220000EFECFCCECEEFECFCCECEEFECFCCECE00000000CFC8F88C8CCFCBFBBCBC3AA33321
+:800400000000008F8CFCC8C8AFAFFFFAFA2F23F33232CFC8F88C8C3AA33300CFCCFCCCCCEFEFFFFEFE2F23F3323200009F92F229296F62F2262600EFEFFFFEFEEFEFFFFEFEEFEFFFFEFE000000008AA888BAABBB3AA333000000CFCCFCCCCCEFECFCCECE2552228AA8883AA33300CFCCFCCCCCEFEEFEEEEE2F22F222220000EFEEFEEEEE51
+:80048000EFEEFEEEEEEFEEFEEEEE000000004AA4441F14F44141155111000000CFCCFCCCCCFFFFFFFFFF3F33F333334AA44415511100CFCCFCCCCCFFFFFFFFFF3F33F333330000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000008F84F448489F95F559591F11F11111000000CFCCFCCCCCFFFEFEEFEF3F32F223238F84F448481F11F11189
+:800500001100CFCCFCCCCCFFFEFEEFEF3F32F223230000FFFEFEEFEFFFFEFEEFEFFFFEFEEFEF00000000CFC4F44C4CFFF4F44F4F3553330000008F8CFCC8C8BFBFFFFBFB3F33F33333CFC4F44C4C35533300CFCCFCCCCCFFFFFFFFFF3F33F333330000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000004554444F42F224242AA22200000094
+:800580008F8CFCC8C8BFBFFFFBFB3F33F333334554442AA22200CFCCFCCCCCFFFFFFFFFF3F33F3333300FFF1F11F1F1F1FFFF1F10000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000004AA4446AA6662AA222000000CFCCFCCCCCFFFFFFFFFF3F33F333334AA4442AA22200CFCCFCCCCCFFFFFFFFFF3F33F333330000FFFFFFFFFFFFFFFF8F
+:80060000FFFFFFFFFFFFFF00000000CFC4F44C4CCFC6F66C6C2AA2220000008F8CFCC8C8BFBFFFFBFB3F33F33333CFC4F44C4C2AA22200CFCCFCCCCCFFFFFFFFFF3F33F333330000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000004F48F884846F68F886862552220000008F8CFCC8C8BFBFFFFBFB3F33F333334F48F88484255222008F8A
+:800680008CFCC8C8BFBFFFFBFB3F33F333330000BFBFFFFBFBBFBFFFFBFBBFBFFFFBFB000000004F48F884846F68F886862552220000008F8CFCC8C89F9FFFF9F91F13F331314F48F88484255222008F8CFCC8C89F9FFFF9F91F13F3313100009F9FFFF9F99F9FFFF9F99F9FFFF9F9000000004F48F884846F68F88686255222000000CFEF
+:80070000CCFCCCCCFFFFFFFFFF3F33F333334F48F8848425522200CFCCFCCCCCFFFFFFFFFF3F33F333338F83F33838CFCEFEECEC000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000004F44F444447F74F44747355333000000CFCCFCCCCCDFDFFFFDFD1F13F331314F44F444443F31F1131300CFCCFCCCCCDFDEFEEDED1F12F2212100EA
+:8007800000DFDEFEEDEDDFDEFEEDEDDFDEFEEDED000000004F44F444445F54F44545155111000000CFCCFCCCCCEFEFFFFEFE2F23F332324F44F444441F11F1111100CFCCFCCCCCCFCEFEECEC2AA2220000CFCEFEECECCFCEFEECECCFCEFEECEC000000004F44F444444F47F774743AA333000000CFCCFCCCCCFFFCFCCFCF3553334F44F4FD
+:8008000044441F13F3313100CFCCFCCCCCCFCCFCCCCC000000CFCCFCCCCCCFCCFCCCCCCFCCFCCCCC000000004F44F444444F47F774743AA333000000CFCCFCCCCCDFDDFDDDDD1F11F111114F44F444441F13F3313100CFCCFCCCCCCFCDFDDCDC1AA1110000CFCDFDDCDCCFCDFDDCDCCFCDFDDCDC0000000000000000000000000000000030
+:8008800000009F9CFCC9C9CFC1F11C1C000080010000000000000000000000000000000000000000000000000000D0510F480000000000000000000000000000400100000000000000280000000000004F72060000000000000000000000000000000000000000000000000000000000F04FFE800400180000000000000000000000004034
+:80090000010000000000000028000000000000AFC6060000000000000000000000000000000000000000000000000000000000F04FFE800200400100800414800280041480020000800280040000214840010080041400108204000021BF26050000000000000000000000000000000000000000000000000000000000F04FFE0000000079
+:800980000000000000000000000000000000000000000000000000000000FFE40F481800280000000021000000210014001002400100000080020000882880080088280000F0D136000048180000001200000000000000200100001400000014000000148002000000002F49054818148002800414182810820416012810A21140012810C6
+:800A0000A2414001002B11484001280048408188022148008828108204F05C65808401800200000010020000100240010021001400000000280000808802000088280000F04EFE000000000000000000000000000000000000000000000000000000000000FFE40F00002800000000000000000000000000000000002800000000000000F1
+:800A80000000E09E02000000000000100200001002400140220120010000000000002008000020280200002ED2000000000000000000000000000000000000000000000000000020080000F0CEBE000000000000002100000000000000000000000000000000000000000000F0CEDD000000000000000000000000000000800100000080BA
+:800B0000020000000000000000003FC804000000000000000000000000002400000000000000000000000000000000EFE209000000000000000000400200110000000000000000000000000000000000F0936C000080020000000000000000000080010000000000000000000000000000002FCC0200000000000000000000000000000028
+:800B800000000000000000200800000022000030B1000000002800000000200100000000000000000000000000000000000000001FE6090000000000000000000000000024004002280000140000002008000000000000DFBD0A0000008002000000001800000000000024800200400100000082000000000000F0421D00000000000000B1
+:800C00000000000000000021000000000000000000000000000000F0CE5F0012000000000000001400000000000000000000000000282008000000000000BD2A000000000000000000000000000000000000000000000000000000000000FFE40F000000000000000000000000210000000080010000000000220000000000001E1B0000EA
+:800C800000800400000000000000000000000000000000000000000000000000F064D100000080040000000000000040020000000080010000000000280000000000009A050000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FF01
+:800D0000E40F0000000000000000000000000000000012000000000000000000000000007F41050000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000002001000000000000000000000000F0175400000020080000000000000000000000002200000000000000000000A6
+:800D8000002820028DD6002004000000000000000000000000000000000000000000000000000000F0E7570020020082000000000000000000000000220012000022000000000000000020046B27002002000000000000000000000000000028000000220000000000000080026890DB00000000000000000000000000000000220012004F
+:800E000000000000000000000000008FFE090000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000070
+:800E800000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE00000000000000000000000000000094
+:800F0000000000000000000000000000000014F01E3E0080040000000080020000001002188008000014000048000000000028000040011002FFD406000000000000000000000000000000000000000000000000000000140014F013AE000000000000000000000000000000000000000000000000000000000014F01E3E00000000000070
+:800F8000000000000000000000000000000000000000000000000000FFE40F0000004800000000000000000000000000000000000000000000000000004F160D000088A0444A0400000000000000000000000000000000000000000000400100F08784004A0448004AA44400002A022800004012022B11A098800800150114004A04480023
+:801000000000002A0228000014242110F231380048008800000080020000001002188008000014000048000000000028000000002100BF5703800442000000002820020000104282011A088200400111004820040000008002220000002124D02E0A0000000000000000000000000000000000000000000000000000000000F04FFE000021
+:8010800000000000000000000000000000000000000000000000000000000000FFE40F481B21B01122B411324219B24291212B9419B24219B14229F24291222F1429D212A9421CE922C4812E4216E12264192E4296C1429AC2421B292CB49142B29122B49132421B282394212B8419B24218B14228B24228B2422892822A84E822B42C015F
+:80110000481B61481B21421B212119B64291212B9419B2429B212B94222F1429F24291222D912B422D912E521CE922EC11E82264192E4296C1439E212CB491C2421B692CB49122B49132421B282394212B8419B2429A212B84222B84222B842229B82294822E421F690B2088041002000000280000000021800188000040010080040000F1
+:80118000000080020000005012F0AD29000000000000000000000000000000000000000000000000000000000000FFE40F200800000000000000000000000000000000000000000000000000001041012F260D200C0000000020020000002400122008000011000042000000000022000000400214B0F2030000000000000000000000005B
+:801200000000000000000000000000000000000014002FE7030000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000800200000000000000F0CE33000000000000000000000000000000000000000000200200000000000000F0429E0000000000000000009F
+:80128000000000000000000000000000000000000000000000FFE40F0000000000000014000000000000000000000000000000000000000000003FFE0F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000006D
+:801300000014000000000000000000000000000000000000000000003FFE0F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE00000000A1
+:801380000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE00008F
+:8014000000000000000000000000000000000000000000000000000000000000FFE40F20080000000000000000000000000000000000000000000000000000001470630300488008000000800200000010021880080000140000480000000000280000100110023F2606200820080000000000000000000000000000000000000000000002
+:801480000000110014F06922008200000000000000000000000000000000000000000000000000000040013736000000000000000000000000000000000000000000000000000000000000FFE40F0000820000000000000000000000000000000000000000000000000000004FA101000000000000000000000000000000000000000000B7
+:801500000000000000000000F04FFE004A044888000000A022800200002421B012018A09880050114001A0448004000000A02280020000242110F2F94200480000000000280000000021800188000040010080040000000080020000001002D0FB06800442000000002820020000104282011A08820040011100482004000000800222002A
+:8015800000002124D02E0A0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F481B21B01122B411324219B24291212B9419B24219B14229F24291222F1429D212A9421CE922C4812E4216E12264192E4296C1429AC2421BB9
+:80160000292CB49142B29122B49132421B282394212B8419B24218B14228B24228B2422892822A84E822B42C01481B61481B21421B212394212B1419B24299212BB419B24229F24291222F1429D212B922D412E922C5912EC21E812E4296E12264193CE419C2421B292CB491C6421B29421B2923B481324219B24298212BA419B24228B24E
+:801680004228B2422892822B4229E822F46582008248000000000028000000002180018800004001008004000000008002000000501214FBCA008002000000000000000000000000200100000000000000000000000000005FA90620080088820000000000000000000000000000220028002200800200001C0228004001AF7E01200C0085
+:80170000200800002200000040022001820080011100004280020000800222000000400214D04606002200880000000000000000000000000000200200002200000000C021800200006FFE0F0000002A0100000000000000000000800122A01200800100000000000000000000D90922800918000000180000000000000000000000000043
+:801780001002002002000000000000D03C0E228008002A0100000000000000000000000000000000000000000000000000F071F900200118000000120000000000000000800122A0120080410200002800000000000000AF1907001220010028002412210040820121200100181100221002800200000000222002800400220000EF230D73
+:80180000000000000018200200000028240012000000000000000020020020028800000000F09F3C0000180040020000000000200400002410020000220024180000200228008002000000F096CE00001200000018241800002418100200004001800200220024120000200222008868000000005F7B08001880010023020024000000A0A0
+:80188000248001001225020024002002000080022002000000200200F0B62A000000001800286022100210022120010000000000000028008021020000002200002004F01E6200001824400280012200242C01004002000000808202001200400200000020020000200200705B09000000002001182001000012001200000080210180823F
+:801900002101001A02002222008002000000006FEB072200200200004002002140022400280080020000280021221222002A01008002000028002002284F6D01001220018001800200200112002001000000222082021800002200220000000000000028F01BB2000012000000002200000000000000800100000010020000000000000078
+:80198000000080F265BF8081010018120040C222502200502250220000100220021002282220C2222221180020022280022822808222A64248F0993A20010000000000000080018001008001000028000000000000800200002820022260121497D800A0420020020024188001240080023012800388211002401102808105802202000002
+:801A000080020028000021F07A4880222123410200002E22242011C21200211829A1110028200222800390222C022AE1216122211832002828280020A2222828004AE21284F2B724A01100A0212023011A012B322800002C0122003A018001002342A222001280A2220032282820028002002022022A021C023FE904008001122418002060
+:801A80007122D2224132122532122425022100240021122820A122A012121602282828182200222200222800A022482A0422DB6A800228801282128282011880011880011822200226022602244002244002002100200200000000000000F02B85A0222AA2131AE323EB22A2312B332B111AE122F3123223B1127112F2121223B11221B1C0
+:801B000032032AA3332E2223A2222B2225F232322E222F23F132122F2242F212122B333E3225120280A2222A022AA22200A022222AA2222AA222A044B05B01A0553AA1712424282B3323A1113E322F23B332B112F132122F21B112A1111AA1331E12211AE1237322B28219F222A22F21A1223AF111132542A1333E322B772429A42218384D
+:801B80002AA222A02222280022222AA2222AE22616022B442F5B0D80A4311AA111213E121E323AA333241E122D222B1125F2121225F212122552222B222B111AA1122C928224243A33221AE133A322211AA1331E422D2229B2220212A0222A022828002AA2222AA222284A16A244229F8E0C3AA2511A23A42A2126E221A3233AE322F312EB
+:801C0000322B212B1127212B1127212F217112F212122B22213AE32291221AE822E22AA2112342F222232A1243F2323229C42223A4222AA3312AA2222A0200002AA2222A82A2224AB66266226AF48E37A01220022A0118006022004002002001000021000090120080012B1220022A010000000000004A024A029A0F000018200221280038
+:801C8000210000000012000000200222000028000022000000002220020000F0A65680B411021B21421B212394212B1419B24299212B94112B94222F1429F24291222DB12AC4B12E421CEA22E411E222E419E22265192CA4292CB491C2421B29241B29421B2923B681324219B24298212B84112B84222B84222B842229A842882E42FDC74D
+:801D0000809461481B2146B2112294212B1419B24299212F249B214A29F24293224E93C0B129D412CB521C8BEC119A428E212F2265191CE419924213D922B49186B49132421B2923B6813242112B84112BA4112BA4222B84222B842229B82294822E424F680282824800000000002800000000218001880000400100800400000000000023
+:801D80000000002541F1682300000000280000000000180012120020011818202201320080010022000000000000200222EFCF0FA01A8001000000000020010018000000002001000022002003002220020028800228204421F484B200CA011800800200200200001840822121018A81012001190280024A02128002002220220280022826
+:801E00008042224421F441EB0028000000000000001800800100000012200112200100001280020000000000002220F2796C00000012000000000000002800000080021222200220010020020000000000000080741B08008081012002000000000000200200220000200221000000002022020000000000003F8E040020010028000000B0
+:801E80000000002220020022200212002C0220010080020028000000000000F09D8F000080210100000000000000000000000022220000000000800200000000000048DF8D018001002200000000000000000000002200000000002800800200220000000000F067D5000000210000002200002400000022400200000000002120020080CB
+:801F000082220200000000001FA90700001200000000000000000000000000200200002200800200000000000000F0578C00180030220000000000400200000040022200200200002100000028280000000000005FC10B0000180000000000000000008002000000000000282228802202000000000000009FF902800100000000000000A8
+:801F800000000000000000280000000000222200000000000000F0AEC42002003200000000000000800200280080020000000000000022000022200222200400DE6500000000222828002200000000000000008002000000802202000000200200002002222F120E0000002200002800800200000000000028000000000000000000280019
+:80200000000000002BDB8001000000800200000000000000000000222002002200280000000000288002208222F2C73C0012000000000080020000000000000000000000000080820200000000002200F0C35100A0218001800220022800800200002200200200000020028002800200282280020000008004EF170B1282008220022800ED
+:80208000000028000000000000800200282002000000000000000000002641F15A1B0080040000002002280000000021800188008002140000482002000000800200000010029F2B06200820092A82828282828202000000000000002820220222200280A2220000800200228002006240016FC805328A210118002002202202A022000023
+:802100000000282002002800002800002A0222222280028002000080E21284F2987480218102220022200200002002002820020000A0228002280080020028282800000020022A02208222729C0E28808281020000000000002220022220022200002880022880020000000000002220020048F0863480A2223AA32228282A828282020089
+:80218000002A02002A22A2222A2282A2222A2282A2222A222282A222222A022A0222002828A02200A0222222222A2284A4444AF458CA80A2771A81858302A022282A022220A2222A02A0222612022B13288A092A8882021D212A621228284AA622482AA222A022002AA22228802282A22228E02692422821FFB10C2A81061232222AA222EC
+:802200002A82A222800200A0222A228212021822882082A2222AC22120828282A6222022A2228082022A8202208202282A22944200BF3504221AA7225AA113222A82A222282AA22228002A022AA2222228212E2218221AA822A2282A8262122219022248A0262AA2222AA2222AA2222AA2220022202222026A92424E42F0D93680010000CC
+:802280002220022200008002002880022880022800002220022200200200000000000000005E3900000000000000000080020000000020022200000000280000800200222002220028F0A52AA0421B21221B21621B212394212B1419B24299212B94112B94222F1429F24291222D912AC4912E421CE82264112E4296E12264192CA4292CAF
+:80230000B491C2421B29241B29421B2923B481324219B24298212B84112B84222B84222B84222B842AA4842E427FD80F2AB411A442116213314219B24291212B9419B2429B212B94222F1429F24291222D912B422D912E521CE922EC11E82264192E4296C1439E212CB491C2421B692CB49122B49132421B282394212B8419B2421AB142F7
+:802380002AB24228B24228B24238222B8426F297F5008248000000000028000000002180018800004001200248000000000028000000002541F122AD20088001000000000000002200008082240422000000000028000000000000008002F07CEE00820080012008280000002200000000000000280080020000000022008002000040A106
+:80240000426F2308200C18200100800222000028204202200182200428102102004200000000002200220000242214285FC2040000000082000000000000000022420000000080020028000080020000000000481BB200120000000000000000000000000000008001000000000000000000000000EFC30D0080022A0118000000008002DC
+:8024800000200100008001200200002200800200000000002200002778001280022A011200000000200200000000001800281800002800000000000000000000EDF200000000000000000000008001000000000000000000280000000000200200F0FDCC002002008001000020010000122021010000008001000000000000000000000044
+:8025000000F032D700000000000000000000400220010000000000000000000000000000200400282D4300008002008001200100001800000040022081010000000000000000000000008008FF2A080022200200000012200100000000000000001800000000000000000000000088D0B90200000020011200000000188001180000218043
+:8025800021010000000000000000000000480020B2B80F00000000800100000000000000000020010000002001120000000000000000D04901000000001200120020010000180000001800802121010000000000000000000000F0F1310000000000800100000000000000000000000000181218120000000000000000F08DC80000000085
+:8026000000001200000000000080210100100200000000000000000000000000CF330F0000820000000000000000000080010080010018000000000000000000000014BF5B020000000000000000000000000000000000180000000000000000000000008FC90600000020218101001800200120012001001212200118180000000000008E
+:80268000000000000000F06FF3000000000000000000000000000000000000180000000000000000000000F0873800800400200100002800000000210080881102001421008024011200000080020000001002BEA40000000080812101000080010000000018001212B012011200121812180000000000000040012F1E04000000800112A8
+:80270000A0110000000018001200602118C01220011818001880010000000000000000F01BD800000000121200001820010000120020A111200100182001002001120000000000000000F03D12000000000000001880011880012001000024400200000000000000000000000000F0C96D000000001AA111181812181AA111181AA1111A6A
+:80278000011A010080A1112CB112E121F1121225A2112B111A2101A011121AA1110000000000000000F0E324004A044800A0111AA1111A81A1338082A11100E021110221A099182CB912A1111AF11113F012111AA1114A041AA5111AA1110000A02280020000242110F2178100480000A0111AA1111A218103208101A0119012181880A85E
+:8028000011181E12211AE13181B1120180041AA1111AA111000080020000001002F0163F0048200400181AA1111A81A1311A212281A111A01190122C01A0811AA1191E12211E122F31013B110048A0151A81A11100008002220000002124F01E1D00000000001200000000000000008001180080011800800118000000000000000030DC41
+:802880000000000080011800000000000000000020011200000000180000000000000000145FEF0D481B21B01122B411324219B24291212B941B212B9413B14229F34291322F1429D312A9421CE922C4812E4216E12264192E4296C1429AC2421B292CB49142B29122B49132421B282394212B8419B24218B14228B24228B2422892822A5B
+:8029000084E822F42EE980B41186B41122B411324219B24291212B941B212BB41B212B94322F1429F34291322D912B432D812E521CE922EC11A84296B12264192D419E212D421B292CB491C6421B29421B2923B481324219B24298212BA419B24228B24228B2422892822B4229E82294B3008004000000008002000012002180018800002D
+:8029800040010080040000000080020000001002CFB403120000000000000000001200000000000000000000000000000000000000F07D28000000200112000000002001120000800100180000000080810100000000000000147073061842000012200100220000200116022001821800801101002004001812000020020000002400F088
+:802A00005F17000000000000000000001200000000000000000000000000000000000000F04138000000000000000000000000000000000000000022000000000000000000F0CEEB000000121800001810010000002001000000000000000000000000000000000050D30000001212000000000000008001000000000000008002000000DC
+:802A8000000000000000EF380F000000000020011400000000000000000000000000000000000000000000703108000000000000000000000000000000000000000000000000220000000000DF460E00000000000000000000128021010000000000000000000000220000000000F03DFB000000000000000000000000000000000000224D
+:802B00000000000000000000000000F0C2930000000000000000000020011800000000000022000000000000000000000070E40E0000000000000000000000000000000000000000000000000000000000F04FFE0082002001200112200112200100000000188001188001388001180000000000220000000022CF480D000000200100124E
+:802B80000020011212001212001200000000000000000000000000000000D0CC05200800000000000000000000000000000000000000000000000000000048482F730E0000000000000000002021010000800100001800800180810100000000000000009F6B0F0020080000000000000000000000000000000000000000000000000000B2
+:802C000040F1B545000000000000000000000000000000000000000000000000002200000000F0C89900000000001800800100181880818101000000000000002021010000000000000000F06433008200000000000000000000000000000000000000000000000000220000003F3102828004800100000028000020011002188008800188
+:802C8000181420820148008001000080020000001002DF7A0B200800001212200112200112001A81010000188001188001381818121812121A01000000000000001C84F25D1100820000008001120000A01100121A010000000018200100008001000000200220020000F094630000001A01000000182001A01100A0110018200118000014
+:802D00002200000000000000280000000042ED340000000018800118800118000000000020011220011220011200000000000000000000F0D5F620080082821A2121011A2121011A212181A1111AA1111AA11100A0118081A111121AA1113A23A1111A011AA1111200000000002A0200A0444AF443D8004A044888881A2121A1111A21A1B8
+:802D8000231AA13112121AA1111AE121B112A1112B11A0981AA19118181A711101143A23A144A051A0111A010000288002A0220024214AB442E432048004000018A0118081A2118081A1111AA1111AB112A1111880081A0112121C012AA2231848001AA1111A0100002800002A0200214AA444CB5320880442008001A0111828A01318184F
+:802E00001AA1111A21B112612118A0811A210812121C011B333A8281A4115A011AA1110000002002A02200104202EFE80A0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000802181210100000000000000002001000000000000002044D1E30A581B21B01122B41132421B212B141BBF
+:802E8000212B941B212B9413B14229F34291222F1429D212A9421CE922C4812E4216E12265192E5296C1529AC2521B292CB591C2121B294AB19132421B282394212B8419B24218B14228B24228B2422892822A84E822E46E09481B61481B214219B242B11132421B212B841B212BA41B212B84322F1428F24291222D912B422D912E521C6D
+:802F0000E922CC812E5286E12265183CE518E22235812CB581C6521B284AB19132421B282394212B8419B2421AB1422AB24228B2422892822B4229E822F4D9C700824800000000002800004001100218800A002440010080040000000040080000001002750A12411800000000000000122003000000002A012222224800001200180000E9
+:802F8000100800810000001F280D200922A2822A0128001A04001200006212004800120000002003100884288C04000010044902C1400814F07C2820E14C8101828812800200220000002266022081A418008001112022842304800180010020121804288441400A00BF640C008022022200001A0400122001122001000018200222280024
+:8030000000400884228C040000004004810000F0C1190000000000200200000000210000000041004200004008800100000000008150481008EF8C09230223099242328001000000221881122230184001460C4D1800400848282081822202008100004028044C0400009FB5032820081A082A010022000000001223028C011430447018D2
+:8030800004000042228041280200000000004890440010089FCC4E029012004800180000008022410800000084004100890400002880220110080000840081508400B0464882210222000000442228000044004068C158280022C04400004518224628811208008022C328488100608200A04228DF6F05282100100200C01480420400801B
+:8031000002100418414024040000C0282004400800801804280000000000F08352000041282200400420018008200100200284240000008C02000000849028A081810080111804224800F05DBE602322C024282800100420410482002200814921644281242830440010181422122891280010081A3238204488114884820200F0CF491090
+:803180000200240000808102000041180041812200444800002082020000848120228808810000100842A024221F9A0122800100200244008400000028220041004C010020022001004E2822806484002228844018080068402802FF34010020024902000018440020810100380044C48011040060810040088321024100000000004280F9
+:8032000082042AC4ED00800142000020044312A42144484248424008124418418C052071244808000010048422430400228122004008284C4244FCFDAA10A22124000044410016240100C01412412081410800008141583604490241481852440040342C0044008100800422F0783DA02800802822021004101804444B414148C992240062
+:80328000848484404858848400C48100800184491418182804001008802444C44440F112BC00411084A2480000000041002001400400000000001240084800004800000089041008830210089F960A00250440440412004684812181011004187014080018C01410042810140410C4282042042884818440044528421414C82840F4366CD3
+:80330000002302A0244241002024041004411004410000004008124441004142810045D848020030284008414018044840049B9C508218690461803224412041041A021220044240184A8441C488441044C8189C1104844B124904200222100844C0240044448140042184E7D3A02282631112A6224D24444D144120041084A1111818B070
+:80338000248223518441C78116A41441C4E043A11281108452842A61432A52844AD448046E2C8C124848184C14B444044C044D2142AF8A4252223220A24420B22402A044F01824182A51444AC4444B444F820616D888911884106C8187814147C146781854C44742444745811E448946EC4452481008C02845344C84C12618B864B444527E
+:803400004822411F7B07C0364C41A4224F44040044181AD58471146441124534541664444C111C44444484114C149818C9D284A211890100848C11BC28F42428D0841238281028028481C48C62824F8646DCC8F22EA400690141200222000000120020810244000018440018200200408841088C040084220040444884D4480200F06816A2
+:80348000F024243AF31212244F44FC44A480A211A0554A7418F8181C4F41D144B144A4544E5487863A0112508C418F81F11C188B11A0114B114F410281443E34C1C51C58448324022E288B64105844CFC454C8812A7244E842A2444F465444F0FF65F024242F8FF712162CF444644F4446F424241E1445E445A5448FC1F21C1C4F41514499
+:803500005AA5444F44F5684C1E1629F1141C69518C4B888F81F118988F8151C44F41F135154743455DCC443E74C1CFC1F12C1C47428F84F2682845F42C2CCFC486D2885244CF44544885AC224F4444F4684E6F46F42C2C6B11DD582423E222F7161625F266444B644F4282B21411E441A55438CFC1F114144D144B444F44E544F56C4C4BC4
+:8035800013AD184D144C1184F81C1CCB111E18841E144FD1D14483414CE443578CC741CF41F22C24CFC4D6C456444FC2F2486483D2885244CFC4544481CB224784CFC2A644AF8256CCCD1C2F194AF22222AF2BF7161227246F4EB6C446F424241E1445A4555AB514F11C1C4D144F41E141F554444F45F56C6C4B31AD18AC51C4C5D844782F
+:803600001CBC9CF1181845FC1414CFD2F3343C5FC151C4444F43538CCF41D1CCF32C2CCF84F24C2C45F42C2C8FC4F628288508CF44544CC5FC2C2CCFC4F42C6CCFC6F46A6CC5DECC71EE0222001004004100000040844484D4480200850444100881431288010041844901401804220000000030485048F05FB7002818108616840220241A
+:803680000116482401800100188400C01800441800444100008C2284120881008444848100484A022845F18AFFC0521F41F228121F4132681F41326A1D24AB141D24AB9419B24A3915AB9443F24A9143F3429147822DB14F82C4B14FA2C4814FA264154FA265192E4AD6E5A2E549E2A2F491242CF5912487221FC9B248F1916CA3F4816C8D
+:80370000AB141D64AB961D28AB9451AB9443B24A7924B842F9244829FB24484AF9244A5F44064F82D541F62E52174183F61124A3F61124A3F41124AF44B811F24AB45B21AB8443F34A9143F34A8147812DA16F81D452FB245A1CF924CA4E812E1A86E1A2655C2E1B96E5A27481ECA2F581442E5217C86AF1916C63F68168AB161D442F42F1
+:80378000D9C1B44A9B25A9A9422F4449F84AB4482F44FB26482BB44D1A3FAE0C84824800000000440000000000218004880018001400000000000040040000000010023F8E0800410043020012006081000080216181124810088118006828812081018483014548044181C018448341488442A84244C487442AF454EC60442308C5C242FC
+:8038000000803424482A814484C42422490144E04452488C0262124054821260814244422001001212004008204404584884426214847F1A0F46224C5424482100484149A4122A54484828800160218F4483E18102832A014941283141163848C1525212818C018741004145088313648510840266C84241A0251FEE0A410084C02400A052
+:8038800021002001412841301400858404484008212082020000000016040084005084A0418304442E488744845F6507000045420C842280010000008004001008814183044200002382028441000048800210080000442242F0179B20828212182222B2144206001002844412222100834268248D444D4240825228432142844404C41805
+:80390000288141008312280518185284124382210210ECB90B8082124804404804000000202112022012C8428CD4A4042C044825840242441068812240046086814A0310A81481128081228214F433FE20024002AD24284C83122201100284410042008140180441842284121044228242044181000000208101004902410084DF5D0CA5EA
+:80398000E2420128404448421C4C44824254288110084410144484146882101218D24831421280324684284004408801801208184608182280311422FF490F81488311240424220044281A222101414008100A124100320000008420A421201488120840081A12144404508480846282C127EF8041821202000024400823088004000000E6
+:803A00002821451214084442188140240240240300203318008901504840240280747E47022F622133264241856222C4450A2642E24861A120440844400841100A1E24818425F448142B148C012443022842430340081E288321117C14C81481418361424818188B24C75CA018100800000040880140480481004144E044028D24250200B4
+:803A8000000043028B121044284208120000004284448022D24812F4D5FC0022302210088140884202008902002844AB24200428412C261444182281044244004844488004891408488095448C838121C18442F06A7950846D1241804204100E800224C180448444440885A4214400004844282284202282A24283021088812101188AA121
+:803B000014103884409848608870AC0E820010D8285228282002001044024048080010C2482125082568818B434212403412184480028902441028041024014222224820F455DC402C440428481008C1284C140880144812441204401C04008464006422A302482E4600108801188001380000224230281881BF690E228C2282027024487F
+:803B800004220040042684124822A224224A028C62424D28A02448208421040000904841488084810448425880454C28044648F8229240084012942200260420028C0284000040082E481008008443544A000012008314240446348842208402206542184C019200EFDE0A4602234104005028100225022220C422C044401444240440047A
+:803C000010020000400244002001800820814844083084C3C684C25FC208200921C188200241101208250284A1102884840446A841302885045816C462160A616041102614E8445148422085020081422280015C018793C028858407234894244828484094248916082260A430223022A012218B8220020025054048866442002002851400
+:803C80004824812212046044484418211AF8CD47A062CF8AB52632224B288FC2A822E4C3D2C632222A429C46C48F84B228024849A2628B648B628B128B626B644B224AE2C216F442182FA6A6145E58214684752616044654C852C534448538482084A315C48B25B05494444CE41114F815AF4026E941417628582285B42A82A242284632F1
+:803D0000284052248481E56884E744004E48618C516884A72487C4CD4489A12289628241611A036E44224AD488A254A0448C088AA441484B554F42F1143881446AF288995AFC318C10D462428252424B244588441C480221853A2E224E42266E24A76270267844D44462C4835282C3022C642147414F615422302236042F42568EC9042EB7
+:803D800054128FC1AD111AA5571A21D44418E888E446C4388B97CF89794464883B630000412004622006426044400400004604286044400400422024022200200200888088840888808A840A4A0242CF440A4F66F4242A6F42A222CF46A6664E684B248D6AAD4E2B6628AD488D48812B66AF86F66C6CE5FC6C6C4F42E282F66868CFE6F4FA
+:803E0000244ECF827228F828284F86F648484B114E3287818F87E222E222E2238381A2444B444F46A6158B558B45DAACDDDAA981DABDC4FCCCDCCF44FCBCCCDF88D844F58C984BD9824BF1E066F662662F63B322722CFA222AAFA4746ED6EAF62A4C6E646AD6EAD6CEF44C4C2F82F26A68CFC656CECF82F264662F82F26C6CCFE557ACCF2F
+:803E8000EEFE2A2AAFA2FA6E2AAFE4F412541FB4F31A78AF96F2282A2E223E722A81F248484B44CF46F65C5C8F85A5CDCF4DAD551E741AACCD43F55C5CCFC6F9F4944F5DF81416EF8DFD9C98AB5436084F66F636762F23F22426EF22F222222FA4D226D6AAF246262F62E226D68A62E4E5F6666627A2CFE6F64E4CCFC6D6CCF2266C8FC6F2
+:803F0000F6645EAFE2F42EAA6F22F22622EFA6F44A4849F1487F87835E4225CA222D726D122AE244F6482C4F46A666CB158BDD8FC5A5445A23A9D54B448F84F5CC68CFC77C4CF884DCEF8FFF98D88F8CE5170E4F66F6367667634F62F22E2A2FA6F64A2AEF62D66EF26E246E622E22E57A4EFE4E4E6FE2F22A2A8FA6F64A48CF46F66E6CEA
+:803F80006FC6F6284C4FE6F76E4AEFE6FE2E2E6FAAF26E6AEFE4F414548FF5F73A7C3F26F6222A4D262F61F336124B22CFC4F64C6C4F46F66C7CCF84B554F4D89CCABD44A55D5ABDD4FC5C5CCFCEF77494CFC7F2B4BCEFCFFF189E8F84F49B4D100423024302222002260224004042582880020044003048203424100261100421104418C6
+:80400000240800488044048D2482818200BF710982282C012200400222100A212246028514042A246482E082048428244484812C842242244224C24422488014880400204408484E2443B848036F9F0B2CF4112485F2112483F4112CA3D6C1B26AD141B24A9921AB9451AB944782AF1439242F147924F842914F82C4914FA2E414FA244AE3
+:8040800056F1244A96E1A2645DACE44DE2A2F5D1242E421F4952281F4932681F49324A1F48B24AD141B24A9921AB9459B44A3934AB9443B342FB34482BB44F82A4B44FA2F4229C40FA11648D521B2187221FC17428D281A6121D68AF429961ADB459D66AE982F44891412DB14F82F44A912B422D914F82E514FB26885E85678296F5224A2B
+:80410000C6C55BCE252E5A17CD26F88144AF22F591246217C9A3F4912423F4112CAF44F89124AB245B69A334B4AB144399324F81B4425B862BB44F2AF1A9AD4008480000000044000000000021800188000040014008000000004004000000005012B097051602244121288449341C004008407228440C304828000000492233182C014A4E
+:80418000012218188100A04183C4448024040016982480028442F0A4DD24448A91A8814B124400A84C12880412843280114C28828484322A20110846C82443420800102821614584856441C018121840084248CB411B414E141E641645F891A4241846B888522444228146D4484A14042608208292184181A4684824288A211138248C31D9
+:8042000014130112812035181812428487414E144447814AA14340081618E4C4012CB56CC141F0B5CB50241224842A41048081128804128112A51414084A0220120800A042897224128804220084604180148804000020A442E01344044C41F81892000010020080021008200112000010040025281404180028200184800228221A2604E5
+:8042800000180080012008488FC808400260418382B71202190162210064448C029028E08482628400C0249028A14014442412086D18848514189C880040C88484419442C01400E0450D400210862206C021801408105442220028004148400241408A0180122401844301105848C2420030841014A914408408F013BD0000204168211A92
+:804300000212201202800189014008898642084088162442084144801248129828C428228C03008118840000120042BFB802244800004400850290282D14200400002781602342814240484202A100814210084483045048C3022218803818002041044AF1A7E4504A4824201122524242224484388A2401290140221202C3410224410011
+:8043800000902810AA148C024A130810081247842002004614488C048428EFC30400302800404208838101101802944122004C01004008841228403424001042041AB22401428001838824810480012844D0D4441214028410221244782832188C91184B49832194121518442202418942126824454818181202859424211828214285A4A8
+:804400002544814684028081846981431448AC414C420CE50B002428185024304200400224000022608118452204000012261228020081844B1210A8214098181E4860880042001200A0427FE20A4004C4C02820018412A41285226181A3548400120000000089022825040018C49028188132813220031220C148124446044160819F78A5
+:804480000624002301108404004884004880140A002400124484442042240141800200814004008100414170241828182429018B9600102204400448810000000018818021110830143014121212202181012420010012100C41418608008490181800AF1C054400204448081200486228001284C1480000180040080040648250484816D0
+:8045000004C4005048001812208801C2004028F813F220180A844480442284040048008924040000000045885184280000000000818001801128881888412828044100FFC5070018A04244800118801188011841188001412480018112201224028410041E482372240812C42008820044284334440040880147BF808541D42481A1148C39
+:80458000514824B04241E82144088124304281004100002110026022002628624284B0246142124392148C382888001889AA384B24499334224128E9060000262406004800004A02412921018031141810D8282101238131181832184311044C35120081800888308428C908420084808AE8890F84D02E05A1008481104814A261A141212A
+:8046000044441A04842180512488508200241410442AB4224508000080412481921880228861818210069F510D1286321AA7448744528514B8483442A911F8481823B54892444823D4C201001E12002C711C72149814C41E242847212628014564828F419228448D241884888CC9884B814CF888B8CF82D188B6C8F1C4D8AE4C418AC134A7
+:804680008AF1E47EC044814D161823816681482381248484041068A48D12C3E581048C0181008C5122242321628120D184F114248392224538128484C11E2483483488A0184544A4874C6E42523E9C444781F055154032167014BA2476283C441E1CD08821E1A4B112D2A835121E1AE7414FC1048B141243514423014548941887C18B32E3
+:80470000184F2291324C61422CA134CF6191522E1CCB3112368CF13414813A931843019A98144783814911783488B828F8B56C208441088443821444088C04008C44C448801408440040048504810043020000222042081E28E081021260812892A0418525584882F0A848F054146D16211E1C1A51848FE1558A4E422FA4B41245B212C18A
+:80478000122961A42598122F81D58881D1C8A111008D186B1187A14B113AF21414C7A36B1187834F43F134266F637218A21183B138F12C2CA023BAF288888B2287884F49A888A0297E24CCF834B43A93888D3885F8111CF014144D46C1CFC1B548F458181E5AAD188F24D58AF41C1485F25A3EAF24911A8FA4D1EAF11616EFC1D188815126
+:804800008A1A9112F0888A2B111E9A2B116FC2F23414D5FB1612A7928F83F134366F637638F21818C5F41C14C5F42424CFC1F11C1C8FC8F938288F83F31494CBB845F458588F87EF42FB14942E366F41D944B222F399F7F054564F61E5E1E1C1E1857544ECE5F55E1C5E5A2FA4F4525E27242F25F74A5A2FA4F5561E2F857144FC5A588FDA
+:804880008481F11E1C1A8101CD8CEF8151EC4B113AF33434CFF3F33636AF81F1141C4F62F236668FA3B236F332384F43F32C2CC7C18781C7C98FCB7A18F898384F49F89C844F43F8F8E8FE243EAC8F83ABBBAD88CFC8DB88F91DC5E02565218FC1F1581CCFC5F55C3CCF65F5561C8FA5F55A588FE5F55A52EFA5F51A12AFA5F55E1EEFC55A
+:80490000F51C1AEF85F558581AF11C1C4F6101D0ECF8161C4FE9F1161C6FC3F33414CFF1F33636FFC1F1141C4F61F136328FA3B312F33A38CF41F31C14CF43F33838CFC1F1B8B887818F81F39494CF4BF9B4B48BFF8F4FFF78BC9F81F9B8B8AFC1F998BE8F8ADA6403490161108204848004004800244844000000100881610010044100D8
+:8049800084611064814186089220081648648844802241049F7F0A820012A06100002502401802811008000000100222502400448052241048041064888928084004428092441810081FD8022CF4112485F2112483F61124A3D441B24AD141B24A9921AB9451AB9443F24A914F82F44A9147822D914F82D418F9244A1CF8244A87114FA2B0
+:804A00007498E1A264594D4A9E24ACF491242CF4912485F2912483F49124A3F6912CAB161D2CAB961F81B24A19B54A7934B84A39242B944F82D442F924484CF9244A6E9240DA41D628F4112CC3761118BE1136481FC1D24AF8116CABA45B21AD823E482F54F83448AD914B43AD812B438D956F22D518E922FC18852E5287592E528F59D289
+:804A8000347598E122F5912C2CF5816CAD5217498B1417482B1617C9A37611F4629417C12BA457812BB44789A3B434949A4B4AAD142B4A2D344FAAF53AAA000000000000440000000000218001880000400100000000000000280000000025012D8340028CC128008C264128011248492104830C421281482200424B41453812814181186D
+:804B0000220030289018183014128C01121230481818892491441A328C8C0A4F920542822C0243422801228430284008800281A446444C042284008D24418B412200290100C141411800608820280841C4102821044605AF7E034622B418322810A8161884184189A142C981048140C8124D4A438422018B481885C418814B419902288329
+:804B80000142848504203114004988210A89921483618412412C15E41228F111B70040024302812042082800004A0A4284404804286044244C1214081224002002C9614100181618081882424004811A8462888744B08D08221006008024020000208142080080210284818481002084010018004440144808920020514800120081416F65
+:804C0000F30418204232248061A186068C824168814604C418228D122212260844601212492211C848818400124034182284208108008741002210483848184C86F8677380024C0269021281230281128183014018088428400844008426840140480820014189614284448991888009C901122608848148E0823484AE982041020000524B
+:804C800047288002004624312412221821121A220284262941088189848401001800000000000010042011881104AD5310427414081A821118421804C028444C01008052A48B242212C1281608001884004982011212800200820028202424081800441684F2C88D5028482489628481C8002416CC482881902440820110C21483214408FB
+:804D000010E842042044480842C400001098184598181A22941810140487418484009FFF07008001612A38280080032124402804800100282143240285024C040022002149111C18842282038388081880010000485FE80821502489E284331866382200124E18842164448442298192148B244313B84CC2284784406886218D44488428DC
+:804D8000288091124140181428AA211281428381240850484028016F8E0986429418122444401848148A02458821020010080010222102411200408401C180C12C00221618488829282441341418128141442AF4257600182212890120924449021249C444484880941400C12881840000008C01200110C2148480020041820012411843B9
+:804E00002808202989F291974048146222902C4484200410089014104488C4142A05445084608200204284012285041004008120A212894104100444430884CC16E43C0B820080028141430120222281210228408C14022880024098282880010000000020010080010000004290481FF30E4224244180850289021880012280018410043C
+:804E80001812001244126081001244201504A021810026840120089024801188014A22F872425042414441290441447018842401103434804104301828403414448923120441180049218101C1222A81011200188022080082850440F17D84200222106488848305804204C40041222852286210082228301400120040080032100880084B
+:804F000000814C2801000084006B318045882182B18283018CA42412248321044682410625044004400200004084124402800212444014A428A81004448A81480452884548F8C99C8021C812182200181218200216880122181AA2210000004118004C42044416884114248141043889818101838281010010040049F48E7D508223934407
+:804F80003088644A81840249C2444228460443044224184123312418C0B84130340014004508584100161414A48240848848240141894AA824499482A25722242F2124E821F2242212AF8E52844F84B458B344B514A143232525A4245A83C3342B174CA5434B2385189428188C426842C4C742441AD144D144C1146951444D142E1445E4D2
+:8050000041524C1E94A0823AB814C884209184891894144F81DC147844F89DF8A0148749697112B4823214818B122A248382D38855483AA41125B424343C4443F24A3C0081224F41B218B12491142A83B114912481224F8164412081E2818281B124A2938A5288812A91144D84604885E4840287CB874AABB7C0244D322684F1681C4CF1CD
+:8050800052341654C48D2462C0244D584D144F421464412784C9341241184F420347618372242491282001206121001AD38822B128011628C82412188E1443E141A81286B414E288A84183AC64E82FB40E1002807424820420820400808204480046044400214C0210840228801282021004220082200982200A2281A24420F4CBEEF0864C
+:80510000562F2333123E348F85FC9818874112121AA1733E32AB554F45A5443E522B313E622B234B337AF738381AF128282E284FC2F3343C1E183AB334B334A3314F43A3332E244F41F334363E34448F81A133CFC15144CD1C4F4282A33A85C814824F42F32424AAEA8AA8318F84F6C8FC4F4AE942B247076F43F772782F43E343F71C1EC7
+:805180002F81F118144FC17554F458184F43E723F15A7C4F45F554444F67F516344F21F7362A6D484F23F278584F43F128384FC2F2A4AC4FC3E383FB1C1CCF83F33C389FD1F32424167118FC14344F27F73434188F81E143F3381C47418D1CBE244B322A732CDC44A1214F48F81414AAEA8AF89434CE62AFCEF784B46F8BF36F55F0165633
+:805200002B734F41E343F358DAEFC1F15854C7455AE544E4476626AB75CF81B544F564666B554F65F27E74CF47A333EFC2A233CD1C2E282EAA6F43F12C2C1AB134B23462134F41E341C11C4F63F1146616E443F21C184B11CFC2F22424CFC3F324A4BEB42AABB91E944F48D844A1994B9B4F89FB18988F87FD9EFC4F4BE942FB35ED244F35
+:805280006BF73E762F61F372364FE5F5D67C8F47F77C7CCFC5D5C8E347E524F34A584B554B554F66B746F57416AFA5F74E5C4F47F76E7C4F4253CC4FC2E2A2BA36F2BC2CCFC1F11C2CCF83F33C1D4F41F331241E1C4F23F1147245F43434CFC1F134248FC1F234248FC3F3B4A4BEB4AAFB9C98CFC9F9B4844F48B8B4BBB4E189FB9C9CCF43
+:80530000CFFDFEFC9EB2CF8AFFE32B0010241842B824014148220048444844C024C02400004004002800000041200241124322210220010082441287448281F079F3B026242102809218008C02100800280020240222200222001004004004000000000040240100124604182E415FBB072CF41124A5F21124CB161F41324A1D24AB161D6F
+:8053800024AB9419B24A19B54A3924AF143B242F147924F84A914F82D458F9244A8D854FA264116FA2F498252E4A8759ACE449D2A4F491242CF4912485F29124C3F4912CA3F4812CAB141D2CAB941B21AB9451AB9443B24A3924AB94478229F924484E944FA2F4E228C0481F41F62A421741CF22B11116F811642B161FC1D26AF811648B42
+:80540000A45B21AF2439348DA34B438D934B438F143912ADA52E528D954F22DC18D822F598254F227598E13265584FA27591E8A2F58144AF227591B444F181282B1617C82B141FC8F24A141F49B242F28528AB1482AF443314ABA44399222D482F44FB241A8F6D0C8482480000000044000000000021800188000050120084000000000057
+:8054800044800200000010027FAD0D00217022C224812290448088112491343822182EC8121212440044381A12044508811880010090284488003283914884408888C448122014D4E909248E241A329412803216121A82211108C1402811242184122812428815088B12443812188001188001188003002001A0128484100414882F7D05B4
+:8055000024E68AE26881322684298341140426448491248B122243B148E2212492181E2630881A64822A61421021419818E08401002002821084E3828115081884484648064849F8472800441880012244A061189289018524011220091200004418C018444F82011880011880018941A41200008400892218081800F015AB000028008156
+:80558000122001C08200410000180000248001484400001800000000800100000000180041AF7B0F18328421240040C824800112809158411845080010C248100284404802444821830121000044000000818011084200BF6D0B181A022942022011E842011882001634588041040010C248200184440040840512100200400400004008C3
+:8056000018004810F45B25004008008400000023010041406821001240022120048110022410080000001200000000841200F011FD0000101402291102001002184424204404400220210100201242042002004244800100200400401808007FCC42020000841A4241488801000000008428200242100880410C20C122000081008C018131
+:8056800000891104C01800484448819F510E00100A00000010020020440800184002A41042040000120088182001220000000000420000FD51240050824181121184811224000044460248C1282012228461A1001840024321032200811241162801008141008180944800F066530000400226221102002400120081008001101218024133
+:8057000050842800240082182004221008202104200184102444F81B3B00000040022110022011022100000000000000250200240000000000000000000000F0B5A600004002208121218121011218180000180000000000122301230118301218120000000000000000F044EC0000000023210129011812181821004082011200000050D3
+:8057800022200125020020210100000000000000004FD407200440020021124118221002120040522225A2111A210900001112218118421230120000100422000000400220F1C75F00000000218041021212210000000000000080010000182001000000000000000000F0A93B10C84842482400240044414C228202000010121222812989
+:805800008808001411148C11C84842481218000044414C2282020000502290127F8405848004002118002941448202100200002112188008000014008480040000004004280000000021E06506000000002C0100008021010010021A010000000000001200000000000000000000505C0000002400000000120000000000001002002001FC
+:80588000000000180000000000000000F03BF510182824440220218101414132222412004002241A0112828200001119018189212404000000414122220000002424F062A840488884040000244044849222000000101282A1118888000016410184845848000000404484820200000021211F46010000005022001812000000000000001C
+:80590000000000100200800112000000000000000000CF14080000000010022502000080010000000000000012000000120000000000000000F093B800000024212D1212200127211002218001000000000000120000800180010000000000000000D7EA000040022480012D1221208161211200000000002400002418128021210118002D
+:8059800000000000000000001F8A0A000010021225F2121280012C018001000000000000180012182081011812120000000000000000F07AAD702612A2122B119012C0122582F8121317318A699885E818E484041D4911489518A844874445A4242E24C024805264412A732652222E122B111AB892092C5922881E1317118A689985A84816
+:805A00004E48C048805488814AF44237F02222241812122180512229D832B11191819E98818D414242941581445888484E4441492222420428255444282F2242C212121A388282182592821CB11191818E8881892424440848848588F4842A000000000000000000000000000000000000000000000000000000000000FFE40F00000000C2
+:805A800000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F000048
+:805B0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40FC7
+:805B80000000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FF3A
+:805C0000E40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000000000000000000000000000000000000000000000000000000000C5
+:805C800000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE00000000000000000000000000000000000000000000000000000046
+:805D0000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE00000000000000000000000000000000000000000000000000C5
+:805D80000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000045
+:805E000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000C4
+:805E8000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000000000000000000000000000000000000044
+:805F00000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000000000000000000000000000000000C3
+:805F800000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE00000000000000000000000000000043
+:80600000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE00000000000000000000000000C2
+:806080000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000042
+:8061000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000C1
+:80618000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000000000000041
+:806200000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000000000C0
+:8062800000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE00000040
+:80630000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE00BF
+:806380000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04F3D
+:80640000FE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000FD
+:80648000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000003E
+:806500000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F00000000000000000000000000000000000000000000000000BD
+:8065800000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F00000000000000000000000000000000000000000000003D
+:80660000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F000000000000000000000000000000000000000000BC
+:806680000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F000000000000000000000000000000000000003C
+:8067000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000BB
+:80678000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000003B
+:806800000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F00000000000000000000000000BA
+:8068800000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F00000000000000000000003A
+:80690000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F000000000000000000B9
+:806980000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000039
+:806A000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000B8
+:806A8000000000000000000000000000000000000000000000000000F04FFE00004002002400004002240040020000211810020000200100000000000000000000F04359000000002121240012001002212582012418250250228001000021008001000000000000000000CF7D0C000000400221000000000018210024000000000080016F
+:806B00002001000000000000000000DFDE0500002400214002800140022100002424001002210000240000000000000000000000003FC607000000000000000000100200000012000000000000000000000000000000F08ABA000000000000004002400210028001244002180000000000000000000000000000F09CC100000000000000E2
+:806B80000000000000000000000000000000000020020000000000F06441800200002011240112701A8221010012200100001838180080011841001800000018000080081008006FCA0944414982825228282C04860A0042401802800860823046B042C24241208488044200320048384800A08420044820044AB824044282771100442856
+:806C00002822A48011B4880118248331128502008A01188902613022522F41220182421220110420011A0200A04800002004C88D640070560A430241002082140221004820010000002004420020040042002A018004480020014880048200004282BFD50700410016140426222184140221168801180045880242000041121800D2221603
+:806C8000842101121884000000008182001841003D4F401492228061822D38162801202101160800222C2426C44C40241424314430624E2C2118C012805242185028002A85018183080010E84964C28024B29A0710120212CF22518418162281843112104208202234424614084100604424181821A0842021110620012086014008400825
+:806D0000A0482244007F2A0344C02400801328028004C0181818800122816604484841181024D648061812382524228121415882800110280800888149311C2024F216CE14112F44311121521058184C02C4A021448301430412188483048D42C04452288082044C04260842442021048D148C044280E14225948856088181222822C2FF71
+:806D80005A0C800480420400C01418280022400240222224211268A2482884214400A42004218001003014200280812824082400185F31062122001002000000844820020042002800100400483800800181000010048400000018418C8148046E3F24114C0380020044001212C458B0444282014262202242F8482243840229C4443840BD
+:806E00000218100A42008C14241588A11490989E48481E8844890144242F8B0924C013E02441145881229018001028020012818442AC04492421022608604480021004181260C10000102404004088228AA2485BC4008C01480020012004800100004B1210022004008022124808803118841A044C1488028744200244180081004008F0DA
+:806E800064E40041002C041044820185C412101428614148008031440000C04812448004460810682420840100003088488009448100819FC90E480044203448208502604446044C21044921D4480784C048004484408881452821010041560890448889C8880042890800880080F8195640034C542280412101701865442230181008002E
+:806F0000C048200229C418480080248201848004810090184200828A02288249929481828088B4310E10240150484008A014004100830112432111A4410041004278584084A2144890248082A1614848800240248212088820022A0C5F180C84212C84C148002002848100261C081880028301898491481200200281480084488440048CAF
+:806F800021414C080084208169818180582246F85D990024004440DC4294144C052111181044944C0080041843027014481414C464122012041828184004000080C284A082812210982821F0233C002400001284420042528001004290484088420C80058084A124009014C0144884124100448488C02412282240048242225C0284421C14
+:8070000004450149044D2122C01441280044814480022542A412D0481862452D14001412408884054D182200412008A0281284008128450221186FFD064240C642C50685B418F144151E149335481B5418C743C14D1CCD185E141AA12723849124CD64D048F1544845E441A5211E14325AA4211AC414848CC7424F41A1114E141845B4843D
+:8070800028820886A861288AF38C98C74281848E824AF4BE5A006522311614425B4463E421A426441E481A228441B8182414248614F818485E4466081688E181346A4E5C688594285860842844CD2C284E68124D4C4E888C8228084F439588AA78182CC288A6A8886AE482E82B0B15E2C45112A0448D148C41AC22C0582145761444C8148C
+:807100006041484D24CD184D58702248F244485042424922324C4E7818E04431181E1483A1158F844434285289145888F08484896A8289A1821240362830187F59011110011161112111211914022100000060449028248744248304831434484142000080148204000000008400000042FF354CE125754457121F11F1414215F34949DF7B
+:80718000B1F147565F75F551198FA5F553434F25F51414C5FC4C4C8F84B544A5448D48C7C44E4885FA4248CF84B552F51A1A8785AF86F458588FC3F768248B157AF61414003AF31C1E8FA7F63C3C8F87F7544C4FC4A4AAAAAA884F48F884C42AE68AFBB4BC4F43BA84F8A4ACAAAA848FACFCEC63141F31D15454747F7151AB4E464E46BFA0
+:80720000F1F147464F24E5E4F51B1B2F25C6124D1C85FC545C4F84B54425F2484AEFC4E481F154526FE4B486BC52F4168A5A34724B551F56B318F4585185F854544D4C8F82F23C3CCFE57558FA5C5CCFC1F14C4CCFC81C044F48FA84844FC8AECA8F82F19C9CCF431A5CE4AF8888FC185AAFB6031F35F516563F21B113E11474167418F629
+:807280005F544F54F716345E1EAF85F551716F45F5161CCFC151C44CB144A4664E48AF8444F84C5C4E4AAFC4FC181ACFE5F55C4CA7868F85F57C3DCF47B758E583F25454581AA123CFC4F4666C6F41A111CFC5F44C4C8FC8E888A8A84F48F8D49442AEB84FC1F1A4ACCFC8F8A4A42B22CAF8C8D8BFDE45E125554455F617148F9434161F57
+:8073000055F411166F55B766F651519FB5B552F542446FC1F11C1C4FC5F544544B554F4686F55A181E18CFA6F5464C8FC4ECA1F1C44ECFC5F47A28CFC5F57C3D8F83F659581AF15454CF41B138F32C34CFC4F45E18EFC5F55C5CCFC5F4484C8FC8F888884B888E84CFCF21F48898BEB8BEA8CFC8F884842B88CAFCC8DA9FF609002110C249
+:8073800048418C04001A040012404824D1482221044C020080810200800118901480C148418A0484006088288285042008E0640D58001088A414004C0212184100460418B0480142200490448024A412830480240116280442102C0800824E1480290A908820C4412F62014D421F41522C1F4132481F41324A1D24AB141D24AB9419B64AD4
+:8074000019B54A3924AF1439242F147924F842914F82C4914FA2E414FA244A56F1244A871D4FA274D8D5A4E44DC24A1F49C2421F49522C1F4932481F49364A1F48B64AD141B24A9921AB9451AB9443B24A39242B94478229F924488B944FA2F468C6D024C46CCD521E24C3A42183E44132481E644CC8648BB45B614A3824AF1439242F14DE
+:80748000F924482F147922D858D986F548B12EC88F54F82458871D47A2871D45EB1CE2A27191DCA4B491F62C421329F6914CC3B681344A1D24AF467981B44A1BB54A3B242B9447822B84842DB46D488BB46F82E5AE0384000000000044000000000021800188000040014008000000004004280000000021F07C9B802101418044880412BA
+:8075000052002084082228493448E0420442A0248C24034B258025440418281A228101588304488AA18120044A89A1435281448982FAB3620028261488023883B114820422100820054880810248202401400800004A810220044400832402844B81818800001848461174DD04124A41442C22C4288C850218222644880418224A3244A435
+:807580002246A44148821A24240122112014A44146082A218401588344984430A8884688280D12122C212422F9326B00282200800149A141420000824200A0148002808442884268452005001A22021810048024228931140020A1244881418334249B160000001912062602810082814004008110084A02A04212260200002C280128A030
+:807600004120018220080000840042124284AF6E06441064824B2181602496698423E12288418AD126843248A7444AA2426AA824424038644421444E388A82B28E02423024180048424CB24481A8419088B0884428B524B41464C2482228BF780F0080624215182254924682819812822147242846D88284C4284AC228A024A0242E4412A6
+:8076800026A616207282084E82124422004212200482C088204838184C0449862466826FCC0A44404488811204B2A1812240781802444024828488840481441002848A0243020022182005424CE24821280500890448224C152801F07C3B30622B342480A412322218181A08228881884326243828A4A8C04820AC42488002422028024229
+:8077000000008AA2148AB22881222632481E485881A0184412A0128CF3A1B79018432461811240480150414228481228006041240012298E0883426884480040084281A024220048444388289214000000A02800FFB507008141100400008C22591848004400004304104C084844002AA5214100004440180842000000884210A8428141C6
+:8077800048DFFB03169214128D14482AC1282220319184989CB418842806828903284446B8826244688B24E0840242222843021008432402807418A4282230548B411888A01885048AC214811F11022B42288502184418111800682008224449044181824220441808831424045298000020028B821E482A88068A048480148804A034842D
+:80780000282AF41DE980220C2800428180220481000020480C29022180018C04848044088210048881412022011A94484088448404824004C8845F12014606245048400C8D44902842409C2444410040043014C048000090221008200400822028840944828011C8148021C1484321C144BF1501200B002A04000046881408000000C0A86B
+:807880004800004200208802008004818184008182008132200182128309F0DBBC8042D48212C84244902C28452882022842224C04202292440000842A0822002200800A28202264442082889114890200430281884848283F8E0A211884428C060000200200880022004A024230484885048148881008820028845084122004622011084E
+:80790000004C01850440F17B7DC01480011694286B1228412240E482840A2200001004844288882200262A92244008002002182082290200200C42100C4828F0F2E48004D022018248004008004C148424042A480448000000484440082222442212302428A60422818400C0282AC1848C022A018D14285F3F4E02274A5028C05CC044481A
+:8079800044200848808422121824080081C04830482848000088800240088448802C088026880484A228874A8186F8C7E440082936243A0881C02884465448884C820888498408207822085880082824861868182882208A840882441218432441148822A114826A918400504249F4F9217044E4687518084F81F1F8644D242E24C9D4444B
+:807A00003244839288884E842AD2441CB4283824222742842F843148CA54888B22839428A63C828A32288328A88A229A486888288688E54CA849309484488F84C1C42ABF882153C88F84741459C89F990829A62A2CE285F2886465F8584841CC022A22648641495444008008C28AC2444885A84447886826A844B02888828ADA44042A1282
+:807A8000382489F414245222384A03181AE142AE124422418A3224AE44289F7E446223633122A7622306218D486287828D488E68488D4C28C84AA246828D244D8449B62804800142C04285E286424C0880822284D2487A14BC6889A2718F84F888C881818F84222935544FC1F888884B179E948B144B4EEFF1081004205824844110040069
+:807B0000444004004C024A02830442000021810000008812800448004008000050581008813F5F4AF2F2362B378FA3F33C7E8FC7A65D8D484B268F42A2668F84F448C88F8ECC488ABC64A2CE4F46E68AEA88B86426F8C44C8446F8C8588F84F4646466F8282A6FECBC62F6A4A48D282AF2A4A44F482822F2B4B44FCAFA747C4F44A4AA4F0C
+:807B80004AAA9C8B2E878A1AA1154F41F9F4344F43F394944F49A1494F4FA75D4F46FE42FDF072162FE3F7383A6FE3E34DF34846AB62CF46F2282C6E6CCFC4F448E88F8CFE8CCC4BC84F4EAACE4F44E48AFA242CCEC2237884F452588CD488BC48F464642E488FA6F6E6AE3F9EF8A4AC2E298B224F48F8ACEC2AA2224F4BFBB4B445F42472
+:807C000034BAFB14844FC5FDC8888F48AA118F85F77C644F4DFDF4F44FCBFBBCBD8F2BFCDEDC4F8CF95ADC6F5943F272744B738FA2F23C3C8FC7B654F5686C4B228F46B66CF6484C8F84FCC8E88FC4E44CBC24E24EFEE4E48F8AFAA8A8416F44DCCCF8485846E8842CF464248F86F22828EFEEFA6221CFCAFA88A82E288AF8A4E4AAA8BBDF
+:807C80002AF284844F49F994943AF324348FCCFDE8E88F88FA18188F85F51CD84B5D4F4BFFBCB4CF49E98CFCF6F88F8CFD4454AF790D2F6FF73E368FA1F33E3C8FE7F7CE46AFC6F62C2C8F44F66C648FC2B668FEC8C8CFCCBCC4FCA4A4AEE44F4CFCA8A8CFC2F284846F46DC44F848584E484E488B444F46F628688FA6F6EEEEAF9EFEA453
+:807D0000AC1F8AEA8282F8ACA4AAA8BB2AF2B4B4EAEE4EAF374F4BFBD8DC8F8DB99C19F87858CF86B7F4BFE4EF8BFBBCBC8F4EFCDED84FACFD6C7CEF410661104238A684414841008C04004880942800C02410084210080081004908221044182421220900122049044410084482BF210E22008A2284068C3468002800461424848462884B
+:807D80004C82E444088034484842002A04002200A082848326A814288304202164884A2209360810A84A7F750B4D421F4152281F41324C1F41324E1D2CEB141D24AB9419B24A19F54A9443F24A9543F2429147822F54FB24488F14FB244A4E854FA264114FA264194FA27498D5A4E449C24A1F49C2421F4952281F49B248F89124A3F4817E
+:807E000064EB141D64AB9419B24A5985AB9443B24A3924AB944782AD944F8294984FA2E416054D4A19D62CB511B24C9121EB161D28EB1419F24A941F4892B21F88F64A94A2AF542BFA4295842F54DB86F448B12E524E854FA2ED11E8A2E459F224488F19D236EC19E2A2FC912CACF491648DC21D248B841F48928A1F48961E19F66A94171A
+:807E8000492B345F81B24A3824AB9443BA4A2BFA4A146B49A9F224527F4405208804000000000000000000A1800100000014008400180000004004280000000025011F3C0822328081A14146684490584820140828A041C48CA424A0244A024324240484288004820032A012100880A1124A08422088081280822231848FF60F2008828175
+:807F0000A018004C02188308400489220882C08430281068812001008C0442222082040000822220B8880481832C14B88191842621F433F180A21C8081A114836844C01841122A0CC02420D74868842E82A0861A22624C814A018921120184832824042858000018AA21624242838868884810C8A24968111AF81ACB00282018084A01C031
+:807F80006442104808008400424084140842840000424800282A0122100800A04820280460884A011C21829244DF2604008280080088000000000000000000000000000000000000000010010011400170E705421043941489623242211698148AE41208254298141AB42268285C011AC24842827484892241B88354484B12288842318008
+:80800000D148E27228144628A2681C094098161AA4828A4126A1248CFCAB47A0225239411414C82162401886753841885822413B512642D148488832144C24CE2350881A24348380D148A6843239014514E8526A246184A07216034AD88214A4192B822444D08822F186C60020088800800800000000000000000000000000000000000022
+:808080000000110010011400775E502400004C0410020000108411042004004243C224498482044842181004001800008442824028041810A84144008678960B42184D288128A4478243248194222C84D848011628E28491244A61421A12010029C41849042800A72400C032001880028A05008A5184492CA8848882288A81048F320C0069
+:8081000043022281C146146224289082C160812260421AC464381400222916480422002B14210018212001004A0882E08138484C848868885A68421848E0780F4724188481C0462220018004181024F114480000004841414B412A840448488140042820018002892104004482124200800886B85F0848688118221852414228448100485F
+:8081800082000030484283027014A84250480022002042A84200000030442A08A0840000820086B8E8099044222024C628280044222094282004224442824148438202812E4862232404288302482810242238482006411A24840220220A84A014F0C1B6200290280000001818001800A058628022810881000000800112000080028280B3
+:808200000410889118828142100428F0DE73A0244C92288C22A4348C34244220B118024889858804E24C26E48822B5288C6282848B24228C16022212800184224422284282224820CC4812890828C240043889987200001222A01200280000000018004844400416048314248404222880220200888480044818001A84488802890842F041
+:808280002FC5004C020038D0480444841A0412420000209444004934482002800280044244200200446042186258423800189280818218F48BC90010048444282064842A011004800226A81228832231482240688181848091248C011608813048844220C418420000841881909848892101DFDF026200000022121A22045A82212101490C
+:80830000221124054024041812384818800118C0182081810112008004480000004200F07B9F0048A9942442B048821408222841402C82058B428128122222400400222001000022420084C018800840A882800800881A048AF4EE12200883024881482041B818041A0412E08102A02412102896280062814428422842124A0180818401D9
+:80838000804588A181490182124889C1189018884071460D42004028020022A0412004812023810120044448431428045222421842004800484981041AA4480018A04882688AA48188481A14F84E4500404618A214818480042840149844200400284484504800128B438400004094180081404484186842C0844644048230481018344488
+:808400007508282602430442414942381400202484060048704844440460442042841408810042001614C41C1A024302A04888414841488448813084F0D22250A28066821008184200448042C4184289240480313AC018800800414001402881450880044588084C011A82A118188200C0A42384F8E16D904243F82826858CF46C4845080E
+:808480008914288687C6444CB468B42884811408456481222E2850481284CF45228231248324A1144744188C9114815847414D44CF81A1DD3843A498A249E148E98884A8558B818A6C554DCC7F86064E22508460841AB228B648A2145AC338424B155AB154B114A11146F838387AA13187824C56C841CC9454813A84A4741688C4185812FC
+:80850000E08122E581E4C57158AC2485E844081A8831184D84560883F6D818824AB148810DFFD703222E62214F22168821F4344C16F8244C8B41321054888CA2242E64424CA6465AB72CB144F64844C324E48297382668C168381A04488B118122421084A115AA12A8461ABC44A4358A2CA591D088E888F434284328BC33031002410000EA
+:80858000000048440000004004004400201404000000004100001008850485042018088504F0EFB9242B226A52A829A4265AA1667E74CF4393188F84F568784C11B448F644544E488F86A2666AF168484F4444E8C4E4C4E4C4A4418F87E68666C28F81F57464CFC2A244124F457444BC1811A8454116F46C6C8B76CF48A9FF8F85F4D8D87D
+:80860000CAFCD49C4F89B5DCEC85A1BB9AED8DADC44BA2CFC8FCCC63242F22E28256E86F62F222285E188B667E74CFC737488FC5F748786E344B11CF85F564644E588F87E787E786F7585A6B477AF57A7C6AF2CCDC5AF478E83AF378788F85F57D6DCFC7E715F558484F45F4145C8B338B238F85F55C584F45F43C3C8F87F744D4FEF48FA7
+:8086800088FDC8FC8F88FDC46C4F89F9CCD88BDCEEF88F8DE8ADF952484BB7EFC5D59E0B2B462AF624262B228B666A26A677CFC2F72C7C4E548F84A4714B548F45F52C7C7E788F86B658B758F54858EFC7E687E7C6E784E4C4DC84E486E681E3C6F43C6C7E618F87F658485E584AF414448F81A1118B45CF45F44C4CCFC3B348B54CF558E9
+:808700005C5AA4FDCF8CFCD494CF41B55C65848F83A3D9DED8ABC449FC8C5C790E2F26F628228D2EED26AF86F668688F86A677CFC6F77C343AF778784B754B54CFC5F564446E588F86F678788F87F72878EF87F654568FC6A546CFC5FC5458FE783AF36C6CCFC5F558598F87F659485E585A751CF41818128B55CF45F44C4CCFC3F3585807
+:808780004F44F45858DAFDDCD84F4CFDF4D4CF41F15C588BDDFE788F8DE98DF5DE5C4F69FD8C5C2FC20D22204228C248221E48436281E081040048288C94281A14084C0228504818281881100890140080419814160812608960816081608120292408821F7C08825024004860414100004B414216081A04001A044142002004A01228186A
+:8088000000901800004820A88400484A8884088988142801144F36064D421F41522C1F41324C1F41324A1D24AB141D24AB9419B24A9945AF443924AF1439242F547924D852F924488D954FA2D418F8244A16F5244A871D2E4A96C54A9E24ACF491242CF4912485F2912483F49124A3F48124AB141D2CAB9419B24A19B54A3924AB9443BA44
+:808880004A7924989A4F8284F9244A6F9A0B4D481B61CD421F41324C19B24AD141921A1D64AF465941ABB459F64A9443F24A95222F5459842DB56F82F44A954F22D518F924C25E854FA274D85124DE214D4BDE21ACF4D12CACF491648F22749134481B69A3F481246B161D4CAF4619F14AB411ABB422AB944B4AAB944782A9D982B44AEB18
+:80890000A2F165AF4008800100000000280000000021800188000040014008000000004004280000000021F03B1B0012004880012268382260411848222F4482240212108C242205002818440000208283240180240192200C4242608842A0848CF4424D60248622012002814800184880842204841222481228830200224149648A1818A6
+:808980008002321820830238A08248200480014280C1441444BF7E0E2CA41423014228122024961432624C21250227444228244A81614168A2188012B424F411A84301816084221A8282A72120014B29A083200842486088244C84FC18444F7A08000000402802220000484A221228810260828120040000800122800118002082044880CE
+:808A000024041820044A01002FF30A43022100004421000084000020011228002440280400420000888418804108002004800416082A240400AFA70A00284122491482A5838991221A82811194182D148449028304008A044E28481246846221D0248244022400488410A418829088822019288C14088142685F6C0C222440044604444059
+:808A8000021218830160418426248104000048844A8184C21200210010822164818480880848882014E8812464844884007F76084180022824C052B289818202403418210010888102C27022280444004243820421888400004112008C0880098880022084F67BEE008428842081018422884A42042800800300A0848444122800200481AC
+:808B00008384041812420000121004109498820010481824F28F4EC042CC0400498234244842008D44428B240084002004288081828404848081982800228A0412004044180441680049842484288883F4F33A40018062814008001812001289312442604412284420028440085048280018400818C0480080818128044842800128908871
+:808B800088C60A42803228844C839424844A2281C2484210882224C144122841228C128422C6481078488401684A018B120090480016240182494494D8904412422A48C8982AF85CE2603844001890182004881A04B048214144880280048A043018000080C2880000924A21010010280120044A08421028C82448FFEB0A1088020048A057
+:808C00004232200100002826480418421800841608681024848511048011044925010090241008C908000044F0BAC500212502000012424A014B1242840020240448200200004D18321212416084100412120042422001004C28C1144B41C0182041F4872B2008200282000060812001801104904400480042488904484608200481008124
+:808C80000020010000004242200400125F4C0E400424008002104824A4241241818001001241008C112491142200414088311400000030444200100800004508F0A81C40944400004A22024220344400184301A01428004C1244081024048004000000000048000000004200C44414DF520240880600181A24A621814400000026C82412BA
+:808D0000180028004A0184181A04181800481210888101004004228A8184810100001F9201241022C38881848484104404C01881848C2311088005842001180044200416840110044148901442002816184444441414842111F48C63102408100200188011081280014321048004428100C180022001004212102801421212000090181239
+:808D8000000000F011E25082C0420086282205844846848122120484413044100238A084608420144801428C15880400482004C044B01442048248806441122114EF290D4447282812A918A8421AB32881E581C1484D24582810286343584420B424658200488C711428B358A1111212128120C11C8B11124A84054E44400426A4184B9976
+:808E000046A4549014C015F0FA78008614C222C088288B42523E284AB4182121D488514C12C5D4887124B84484A1114E2428A0158F45B158A4624AD54424B444A15449A5141A01C1F0441418A051A0450089E181E8C4841594448741C92151444F170A65724A682223023058426842C1424A2521A1114D188CA36446A4125A8404C1848D71
+:808E8000484518F448142884484C0446648145840180242165440049321484C5044361414260C141189D9500002216088400000000002810080000810000400444400444400444400480010000000000F029B82444458CD222A611F018188F81F348186E288F8411A84318284D14CD1487428B165AA122A0114F4454C4188F81D4CC7414B3
+:808F0000FC2C482E14C5BC14E144544C4F41711448F41444C57C1C0845D444A1154A21614149F11C3CC5BC140948148F81D1C4F114144741154F52444FC4C4222E228B111AA1464AF248388CF3484C87811AA714D044F118188FC2B328B534F374322B441AF536542E288AB818D44C2C757CB864F149591E545CF4541C5AE1C5E4417114F6
+:808F800054881E144F45F554144F45A5445E44123A9214CFC1F18C1C4F44694448518FA1F1161C4F4151463FE84F52464D442AE223130A8F81F358788F8461848FC4F148585A061AD1CCF11C142E288F86A2152A9642184F4253CC8D8885F8541CC5DC8CD6C8F518494AB544C44C5AA451411E148D18878145E445A4114F41E144818593D1
+:80900000144FC151CCCFCDFD18585A21F41818EFC1F114144D143D9A2465D64CC4222F2313AA118F86A6358F86E782F658488F81A1555AA1114D14CFC1A1228F86F478384B372B554E524F46F52C2C888B514F4DF54C4CCF86F66C18CFD5A5555B444B414F45B41815B414D1CCD188A1454B155AF544445A84859314CFC1F19C1CCFCDFDFD
+:8090800018584AB544F41818EF81F114164524014110022100001A0416081A04160884A0414A22018002421842A024188001188001188021014800004416488444042001F0CE132008800200128112000000002880010000400800200500000000004800004C010000444014F4BAA1C0421F417228F2112483F41124A3D441B24AD141B248
+:809100004A9921AB9451AB9443F24A9143F24AB147822D914F82C4914FA2D418F8244A16F1244A96E1A26459ACE449C24A1F49C2421F4952281F4932481F49324A1F48B24AD141B24A9921AB9451AB9443B24A39242B94478329F92448984FA2F4B1C7C04A1F41F628421524D4C132221D6CAB161D24AD9419F64AB459B24A3924AF1429A3
+:80918000F14AA5222D956F82F442914FA2D118F924C21E814FA27488E1A27598C5439E25ACF4D12CA41F49D628F49124421FC912FA8164A9F11164AD941B61AF441BB54A3BA42B14478229F8244829F822482D944FA3F4FE9C40084800000000440000000000218001880000400140084904200800004480020000005012D0D70882400832
+:8092000010B82871140828008C040044D04841044442440018428942482C04000000100420E441A44890488004C304C2104848046F6E08202A51682880084024011012888101002200480022811843041212181848121212460C480000000020021C02424009EF2703E08432184502201B042614042E480040041618C42241481A04821A7B
+:8092800082A4214C449C4118128381648420210442001849088B4220044C061302AC44581412DF47020040284218688100184002811218400400100400848184800100208101C14400424C2404000081A0840010087F470D10010000000000000000000000000000200800000000440042004800000000008FA30642284004008001210038
+:809300000000000000000085020000000010040000008440042008400400683FC50F601200000018240000000000000000100800800800004100400480041004800810040048FA0B4200440000000000000000000000400200000000000000001008420000000080F26EF400320000428001000000150410082004008041880400000000C2
+:80938000220000122A0800200820082800F09D6B0000000081201402400800004422000010040000580000220000480000004004220000008FC60A0000000000200100180000000000840000000000000000228004000041000000F01B9300280000001200124008124501400C8004008410080048000028200280048006006048412888C8
+:809400008002003B59001200004284801402000000002800004084014800120000000000221288000000000000F0BB7A000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0048000000004480020000001002188008000051
+:809480001400848004000000400428000000002180F1F3B5000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000089
+:8095000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F00000000000000008D
+:80958000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F120081000090EA
+:80960000120000001002008004004100000028200160220000440000818004008200007B1B00802202208141040000248110188C0100602481221014044481000040088003288042081240083028184420021F120412201208001244290100002508251804004880144204414100800212002602800328200280014800201804001F5602D8
+:8096800000800280010000000000811200004088020010140800008400004100844008840089220180028A060000002A213122000000120081002228000000A0242442180010042180012021220120248103811008002F940663024C412861920016C2182001238104D0282112C448122082026604CCC6248140082122A0122843012820C5
+:80970000822484041800608126A441411228849F48092D2420110883228321618120010000842241808282220242D08482C22820240128A0212841200120848405000018444A0100815F8B0E0044804101D02202002412481880518260841800004902424448248124004004290128202281028021842113382850481228F04687100420C4
+:809780002303A021843889014400009024204262C10038B048020048448189210483B128240290284820B12844C848200283815A28248C21049F780C50821008188424000044C4121074180400A40090180000830152100C490148180049011210048002400450281028F21BD10000000000200200841800124184004884441220210281D8
+:809800000080018001000041002100831804200200D0D90A24008C812311A82125880100C1838141C414384122C014425048108821C2188CA44160419014848B122800284843018D42C048801A34148885024088F29C17100480020000288B120000008444104818088122122A04004044085880011800160C8081120840088428228116AD
+:8098800028048F86062811005021400824003115822141322412124C712208282141814E2821482502C0442821802223820284124A02181810080042D0488181A1121FE542012219D18142288141C1112814001001848C01220081808121245148850412488143018001454218A82464411048022021242402428100DE8A002416981412AD
+:80990000288144282183B111220120B2220122004012082E1800202241826422002844702408483044100842002832800120068CB4AE0980614224408421024454811014180410141C0C41A012E08144A4430012006081448C324418411004200200121608226082844018F2F7A4B08291119112901187128121222211145311411428118C
+:809980008211022648021082111A88820418282242C014004189020012830218808134148B4228524114CF8C042800222410028184188001001881124100800228184304A014842240480C2C04800242220020811604830481188022057EF2000025C929261894311921110810021824104808430284240040A4142400CC14148212280281
+:809A0000A024250444108A042440022224428022F4C3B1002828101244042844222800291108282828189024200228285218001228E02201001244441222100820042226044818188004EF1542410848C0218422494152187018041A0200008012180218448881100240011845588449444808289048224004282200288448229022F0A83A
+:809A8000BC14328AD219F2152A2651698584C1228F62D118D18922F116123581522887412843116482C5E2823222CF2281D3A833228995522061848F227232E246F228284D1CCFA2014FC4F228444984820200382B2389051AE184A2438B4226A1348FF10C7011E1C1312813F134297B231D2DAB115D281FC2225211541216E683A1124980
+:809B0000F1282C1841288542028F81B434E441E481222321342C2741494348A6221E24A0426B252E224F42048B118B54701488E14132224F86A64346A8314E1885F27A2724282E1226C211AD2829C118C373211122E1318111C1184D18D082723288F1122CA962C280E241226444CF843146242D5829E641961444414921054FC2028487EB
+:809B80004550882568234A0481624A169818AD34424F2186D44D4E02002100008414000000001008850481001008444004830400844008100221842110528421412141214110046FAE4C93221FB1F212211F31F13938DF7252CEDD2F3B224D24CF93F328285455D79AF12C3C2E282E328D28CFA2712EFE2828C5F83A2A214F62D3CEF35C33
+:809C00001E6554684F64741CFC34748FC2F62C346CF2562C8FE3F22E6885DE8C724AFE1E1EAF81F52226A5FA1A1AA7C42F21F11E3EEFE1F21E1826F25E56EFC2F124184FC1054D46EF2248E121F343694F43F23D559F93F33D3FF5FD3D3F3F3253EEEFC3F328282AF21517AF81F32C3C2E286FE2D246F22C1EEFC2F12A28818FA293224F88
+:809C80006AFB1E7CCFE1FD36743E664F66F65D4D4F43F75C7F4FE3F314162F43761C7E2EFC2C2ECD2CEFC6F2387C8FC1F72226EFC2F238388FC7F71616AF81F11C2CCFA5F56666AFA7F36E2CCF83F73E7CCFC3F37A6AFF8345F111311F33761EF6171755D555721DFD2D2FFFD2D2DFF21B1C9F92F311315D15CD14CF42F3242C45FE2C2C42
+:809D00008D1EA7C3E7C2C7828F8223C282EFC1F7747E4F64B474B77457987AF764646FC3F316226F41F6342EEFC2F22C26CFC2F24E68CFC2F3485E6E2425FC18188FA5A755A5F8182C8FE5B532F358588FE6F65A5CAF85F55C5C8FA6F7E6EB343F33F33B61C763FF77F11F1FFFF3731FFD253B7FD2F3272DBD2D1D291D237F71F13E14CD02
+:809D8000144FC151E6E5DCECF13614CFC2F22C2C8FA2F222222F21F81E7C8FEBF734364F27F67672AF95A5735F67F736366F63B33662E1EF82F23826CF82F26E66EB728FE6E746F22A2EAB23CFA5A75565F6322487C57E32EFC7F3682EAFC7F77C4C8FA5F5687A7FF4022F12012B12E012012E11166812122200126081281228124C020020
+:809E00000028A02449A12449213424B0240141A01230241E48438204120044124CA2418D241AD44822E14402FB31E0180140484118042A210184000028161808442618280240C4188504280084001088120C20010084421281001240282401147DF3C0421F4152281F4132481F41324A1D24AB141D2CAF249921AB9451AF243924AF143968
+:809E800024AF147924D81AF924488D914FA2D418F8244A87114FA264192E4A96E5A2F4D8242D4A1F49C2421F49D228F1912C83F4912CA3F48124AB141D24AB961D28AB9451AB944782AB9443B242792498924F8284F9244AEF970FACF41164CD411B21E7241B2187241D246F24C1288F74F91124AF349B218F7429F24A97228F747924D815
+:809F00001AF92648AD954B528D916F22FC58816F8264192F827498F52243875C2D181FC9D2A2F49164AD521FC97242F2912C87241F48E224D1C1F2689615EC24DB85F2489247824E9247824E924782986F82949A4F22F51B35400848000000004480020000000080018828000014000000000000400428140000001002BF890C64188321AD
+:809F8000931181844528A1212122402811382416066041C18146187824484442924824301416240212850423658284E4528489C1284845082250488024714468C1F024D5242028521825842321410826088150225116183818CB122036144C021038281826828225C2681684312612E3C12843012860224200245028168C9274CD2284389D
+:80A0000014E069480223C4283CC114388C116481386982322880511E4C93182D182224CB2445785844F888144568822981642211436382C343A23416D26821230226223428C324A2428586C22A184C2266A4ACB144C21C122FB2054112188C4241081608100840180281417014C814802102220070220A5890548041140C8364C181C41867
+:80A0800090128400008544C81443021608E0FD01001444450241126116180A14504840040040888214480A84400A22001200214CA212200200000000201102400870DE0F24E0420138ACC1228082829218811612D142C328812283538441815041288584346C2B2183721A42B62C11B21122A1122181C1188941180A80C4188484608483AE
+:80A10000218123E4820CEDE500D041434486D142226142263828849150432614440889111C142814410A8C147C1AC22A8C03002212212644182892188100008901005800184008AF9E03100280434802211821128011981226082228408802C428C4A042220061EF22219111A012211A1224012481004840180881A381819248E2E0D4076F
+:80A18000218C011008002141001604501880D184210285323485860200260810E4A28192181084722844248202901212840081180040240222F0E8B90084833116118313982A8D14188CB3185442451168422D2400814002409814528302C0288420912C184081241108834138288411891188922800848941D284628124CFD3082200280B
+:80A2000040011822002200490181830270240800C028002116880100801212840140188202000000844C2202830120F49527242818816B12C019A42AE142012E1832231174186442A5C438439128848140445884122C42188811889122492211D214B228311422A4002A618194104828426842403C384362824672A50B0018501828401851
+:80A280006A41C048100115880281C024C034A428224284281889129428181222444004842216782842089018001608902812408801CF180A802101492212048184182C03141058484528220180431A28C2286082221812812828000030181283811108801142144212080028004E68C0381028820123C2181880422C014568410000214044
+:80A300002402C40010082001180030282522022224A0120000128430341E22200148BFE30A4128008901188901C028811084511841201102228441002226820181100840220220420812810022840000380049822426F18513C0218180011281288042410410A2122E118302268411440484203114C4182885021002408A0140080000302A
+:80A380001883612112855228121A243114284F84028200840024D082119212182584311250182A812392240080024084017024022445024002000083911812222800108C02000014AFBF0684006082288460128C420884818400446041242A14628118100828240022002881894688011A9228282284810081A40012400825A8422FC80BE5
+:80A40000002A8102181C0220012115521454411850848140241202284400802181B1120200008418100220028C01104242820200005FD8052003121420212202204204602240029016121843027012C438C014288302818C2282061A2282C2282002000010084022820242181BFF4008DC4608400224444084912814142818851402100A29
+:80A480002A1184084428844001800148800100200125041688010040E221042303CFDA09188B29CB11D014C1123AA222288B22112B3119511255E183D21D92246F838172266641857C1898226041364818D88841B41AA1218F2202A3146882A7232A41A8128D281668222890184CF11A12A4A3C22E1E32281A43A114FFF70D2822F028387D
+:80A500002250A5182383F13228504A45B612D141218211C81E184B424B314C6282C72289D344722AA411288F21C22226DA42A13228AC922818123A538224388933281A011602C3C12A226085425AA4212F220C1742182E29128F81A22389711AD8A951C28971283A149D18855C1C2FC17138CC2663238162224312C8244782184B314F2221
+:80A5800022E38241080022B01281D28812B818A213811270286A8185481882B11231226F22054F82A3427FFA0215041504150415041741100184000000810000001008444024524800004018022130221002214110044150844008AF3245D144F2343D8FD1D15DD38D711DF9292DDFD3F3161C9F91F33F398D289D151B1195F5291BBD1DE7
+:80A600002E3A2D223E362F21A1471E1CE7C2222E3227434F433238CD22ED288D28CF41F13C348B133A61828FA2F228788F22E121B138E323D32AC3128F83712AFA1A1A4FE1D1ACF31614EFE1F13C1CCFA3516665F43838CFC3E321F41B2C141D216E7185DDDDD78DF33C388D1EFFD3F33F1FAF83F32A2C9F32F222241F21F11F389FF2F178
+:80A6800023194FA3F312326FE3B316B172F61C18CFC3E182E2AAFA3E28CF43A8134F23F31E28DFF2F23E14CF53E323B312E184F4282A8F83E323E322E322F232322F22E323F11C1C2D222F63F11416CFA1F31A12AF81F12C2C4F23D1AAF24A4AEFC7A5178FA574740C15A173DF81F1193C8FD3A2334D383E34BF93F33C3CAFE1518A9F3189
+:80A70000F31B149F8151B9FF91C1122552EA29F172748F83F32C3C47C22EAE2B234F4222E363D282D2DCF2183AAF23F3263C2AA1628FA2E2A1B12AB12AF1282A2B311AB312F3383E8F82B212B316F11A1E2F21F11A1AEF23F33A3E2F22F32A68AF83F674746AF5855D144F42A262D5F8793C8FD3A3335D133F51F13A2AEFC3F31B1BB5DB42
+:80A78000AEF21F1ABF83F11C1B3F11F134326F22F22E2E6B334B778F83F32C3C4FC2F224AAAF83F2BC2C4B133E36AF81F3282BEFE2F23B3A6F62931289F4282A8FA3B33A933A2E283E322B222B338FE181B216B316F13A1E2D12ED1EEFA3F33216AF81D246F636748F87E726F5B86E302430249014844561814712122216081244124C2244
+:80A80000C126122001800244188D249028188001000018204208162842088424160884850283048B24B07C0882125081E08122021800800144841C01442230248544082608201124112411A42122302828A021801208401822514241A921C314439322324C62122F5C0A2CF4112485F2112487241F41324A1F41B24AD141B24A9921AB94C2
+:80A8800051AB9443F24A9143F24A9147822D954F82C4914FA2C4816FA27418F1244A96F1224A96E5A2E449C24A1F49C2421F49522A1F4932481FC9324A1F48B26AD141B24AB911B24A19B54A3924AB9443B242792498924F8284F9244ABE15C04B1E648D431F417248F21124A7241F416224CCF248974CF248B34D288F3439242F34792494
+:80A90000F84A91222F547926D812F9245A5CF926CA8F11F8264296F1224A96F5224987592D481FC9D2A2F49164A9F4912427241FC97248F29124872615F448941F41B24A9B25AB9443F24A9243A294478229F9264829F92458EF9D098480040000004004280000000000008840040014008480040000004004280000000021F05FFC00007A
+:80A980001260228C4182312C6082124004101841280481288100AC82046042004945022211818430282243923836080026024B210041C02422CFDE0D292249181808C028002B12001022628112122654844F812241881404448351280032274100123012410043612100800181508490142250841609E50228461848188862812221269635
+:80AA000034222E1424412289113811C46C64C283B11822348460C22311081D2424418D5420C5221311480843A1214392348922028110EC4261412224818743121EDA102201120021841884400800001220122801100800834402A0211840020041008C42028112180022210040140422FF2A020029012D12C011100800400884004C0120DB
+:80AA8000022210441404211084028021110423524122C422001200002800224008F08B8F20A22100288721418D121284282041822161818484411E24401414084058424C12A421604240942228619018160847812800169811164414442C2231682042F826DC8082022418892121111288021290128341084D18448002490241100C4C02DA
+:80AB00004C824204A02149021028021E2400808181014084A2218420023F380960211860222451818301004008804108B0240141400841244121411280026C01504223625183514881228011481144644284002A4408815FF101400A00448001832101001818121044444804811008302400104498180016C8241240880189011008302893
+:80AB800080040000F0EE46002518A8120084C01841004C118C02814604262842528464800181002220028128410020031008184508458802C01C8021514280F2622EA0124100A01212840040084048088911084180028012080084811024022143025024480041200210840110C824228C2202EFFD091A52428138303489C118124C210111
+:80AC0000109C18841688144C2C028424C028818400818143128C8212D6841224612146081084312850844438304C814C22D34802F0D3E60010020000818440880120014781205248414C528400004C02280020018081024C0212811608100840081220018022F22C4D2041420A814400008041841188011884848011C418808212040084ED
+:80AC800010342824C90220011A5248800210149818001840240380F4AD32000084004004444028020000120041000044400884188042240144228042044508811018044508208112140C81DF38072484800181844048088100404818048001004008200200410000840080220241202111188451844181100441186F1E010000004484443B
+:80AD0000100810044400C144841285044064828D22101848141808CC02504818844412108881020084188312040020F2954860285028121818000000181880010081508218812002AC02810044C024244185622120C118902800400800604100C01480F2F9CF800100848021018001224C1204000018100281000000008D240040048400F2
+:80AD800010242122229224000012321200F0AB260010022110080084180000102881411404000050484341048001002280322400800281200180218202229048C4AF9A01100420518441100400004004448041048400818116040040084044A212100260422816323820214184410470180483F11844425E99244508480000851448044421
+:80AE000080624160818441448410028C01884006106412008C2282C4242604005084C01C802213140826040021F0914F3014A3088489011241818185588838495144891118480816048D1C10880249322E4048544C8382C234288C624120D1442212D484F128288B114C11E4417218481C54C44F42A123D048846131D02241440212854424
+:80AE800004C4411818224058448C61C14187C149C118508840C42C2C415C481088425C442445742EA622C181814D148F42C2242B118C32388F814108182E342A6381188D181887843FB60A40528A2F21417814588C8D1C414420416441181210F418144951A8474141188487828372280C2781859414844B21263824278218C5B232E34235
+:80AF0000A2138C42383820424894144D14C3311812284574147444B824D6130B000000800118001220011200008112000012200112200112001884188420010000000050180000FF3D43721456E2A5FA1A12EF41F118181A018F81A111846041414B31F014141AF11818CF81A111C5688125084F82B32CE322B334534C4D1CCCF1383CC504
+:80AF8000D84CC1341E2E4D164F42538C4D1485544845742496223AE2C151441A5344B02491148D188D184F41A1554FC3F4B9B7244F61F1424EA5FA1A52EFC151881AE141F118188FC151441A61434371187818781CFC14188F81F11C1C8F61F11E14166C81844F8AFB2C384F62BB14F11C1C8CD191F13C3CCFD1F324342AF3746E4D364F58
+:80B0000062B716D144B338F32C244D244F6252CE3AF3383C4F41B118514CF0242438537138FA16148951CED5427214D66254AAA7A1E5FC141CCF41F11414C55CCC8FC111A83141CF8151CC4F41F114144D1CCF81A111E5E8818101CFC2FA2C2C8FA3F22C22EF41514416F5282CCFC1F3242C16F63266CD1E4F43538C4F417128F4282C4D35
+:80B0800024CD262D343AE3817314FC1818C55C884B224B22CFC3F21C1CEFC1A1554FC2F5E3BA244F61D14A54AAA785CFC151CCCFC151CCCFC151CC8F41B118B114B314F11C18CFC1F11C1CCFC1D1CCF11C1C87C1EFC1E1C1C11885F81CACCFC2F2BC2ECFA353CE8416F93C3CDD244F426221EF63F62C3E8FE7F33E384F43B338F33C3CCF66
+:80B1000041D368F3223C3AF31C38CFC1F11C18C59C144F42A232CFC3F33C1CEFC1F14C52CFC276C80A4901409814844110240184004440044400000090281828491188012A0122200222200243222142081260814416882291284004EFF20282502200120018000000008061811800846082442200008141122001444004004400184024A7
+:80B18000010040041841ADD3C0421F4152281F4132481F41324A1D24AB141D24AB941B21AB9453B14A3934AF147924F8429147822D954F83C4954FA2C4814FA264114FA27498E5A264594FA2E449C24A1F49D224F4912485F2912C8B141FC9B24EF19124AB141D2CAB9419B24A5985AB9443B24A3924AF44792498924F82B448F9244A2F67
+:80B20000BF0CACF411648D421F4132481F41324A1D2C2B141D2CAF44F91124ABA45B212B8447832F147824F84A9122AD952F83D452F8245A1CF924CA1E812E4887592F2264594FB26419ACF4912C4D481B6929F4812C2B141FC8B246F1912827241D2C8F44D941B242DB85B24A3924AB9422AF44392429F92648AB944F22B1560A8480040B
+:80B2800000000040448202280000002180018800004001400848004100004004280000000025013FEF058051482160828428810024200141842041042012080040240228C9126C42C02212004D3881201108808141C414E082841128442411F437BD30128602128118000029911840120841918110484128124818144942481402104224AD
+:80B30000012484004912180428201408161405490140017FCA462221558221841E288422409214837122C4121054488184442480321860884181002419528484E942A41600A118844912181484624342C91214D41884618146021C3114FF1F01004112000081000010081081018111812281001144278244801204002901C02C0018840084
+:80B38000200112184302411004F02A4110022100400240080010088141008D1122818440480400508481414400610010040000000044C024C024128902BF1D0C002E12303A2418811441182212C4448140180822440089062446324844412B24412C02438202388386018741433248220012488184850422818984B848E2DD4902D02202F2
+:80B40000A1008111802182014410184C082E18491208425024480010426422448012A4212212444921C24822000084444598244028018CA43A00200132242C01508400401C1808004001409828844092484441C9164804264402304800814400001248100880624246E88822B2CA08142548120812843018104482110812A1814015682159
+:80B4800011100860210028178180312C448022020000181014086082845800402401F72F90128C0218004100812588418411081218901812241200104808504819245148400281811008181608124180A5251800008044081F5D06408602000000288440048100450800848100514245480600004220011200222022822201000018220015
+:80B50000005A4A7211C22222A30118814048322818218504128410584816889111818110C45A41243058124C21C246B0281128018023A1122822168824B12841A81420024344085FAB0C40040010041884408821114898121648341100810050181018D4480240480C002840081008180012420080010018D0750A1824812121440000001D
+:80B5800000000000001008000020842201008400000030482001004128282A31184008327F3F0700102881111802000000B11014584100001048181141084820414108281041412163848041A1161118008442001800AF72070021124440020000840000002400008400000000200280922222289011000041100841008001005FC703A487
+:80B60000001008000081001008A1002100000000000028004008840000181C02004214221800008001BF220A82402871120810088184004042480840040091001004002021010040010040A8141480220189A2212A21C318608100CF6A041800006081001044440884241004100200C02822848420844401281004240080625200004018D0
+:80B680000400400400DFB50C004008120000000000404104404918024048414108288002441100141932211400C01410210100810080013E650021001024410800008421005024000000800200102102250800242830244158436281841A84018484128446240114F0F627404888144204002508400428000000002508189081508410010D
+:80B70000142210042C24020080424141044814100448110021223F66062423588AA3514816445A8AA1100C0050A98145546C4516020000841548482804181285414448722212A222142AA262681418497211014B228D34224E388D4843011601ADF9008440181234180081008184851202141001845018206212141504141B6428242A0232
+:80B7800095A4221117121419E2517118FC21159941A1114AF418188528C22889F414111883C11118EF590D1A4142C2124F818181010084400825082508100214854A48588889125418814822322A0341008982123124111B14462861816A8451114443A11132008C012A722707000082002400000000404148414801144001000000001001
+:80B80000041400404108120014000012200100DF2D061E12255A282552CAC7C18484215088404C528AB55A9AD55D79A55177955991A558999D2983529CD54D58116AA21316B22A025549F22B2B112245F41115DFD5F13838CB118F81E14451119D29CF83712CBC28A1448791CFC18181A123FFA4061E122F24542A2FA1F51A8C8FC1F118AE
+:80B880001885088558CCE08242D28A52ABA559CCC5563A75558A85F81B1915F18999D01558DD841D411F16A6133E32AB22F041498D2A3D6239A2224F425251DFD1F14C6C8F41F118187E141F14D199F1343CCFC2B228E38454CDCFE11182B122F3593E40D22254AA2F217114F41C1C2C51A200855C888D2885528A955A9A4554E47556DE9C
+:80B900002185D89951888DA89712D559D58417146E213AC1222F8242D4554452AB398252441E345FD7A3338F41F118185AF311519F91F13C3CCFC333287A7158F81C1CAD181818FF170516D222542A2FA57112F4181C8FA151AA218558C885D888522827A2B55A9A5555E47556DE1551A88D1895F9188815718551DD841F14E416A6331E24
+:80B98000322F825244DD458FA2F263223992214F42D251F3557D5F45B718F118184B354E419F91F13C3CCFC1B138F37838CFC5F11C1CA7811E122AF2342C00100249011884000000400840020081100881110020022200200223021460121E4820014814844412281A0400F011A20010080000400810088502508400001001841C528414E4
+:80BA000084802401000000004418441484200184380040648120F2D88DC0421F4152281F4132481F41324A1D24AB141D24AB9419B24A19B54A3924AF1439242F147924D812F924481CF9244A1CF8244A16F1244A96E1A26459ACE449C24A1F49C2431F4952281F4932481F49326A1F48F24A111FC1B24A9921AF1419F54A9143B24A3934F5
+:80BA80002B94478329F92448984FA2F426CAC04A1F41D628F41124A3F4112CA7241D248B141D24AF44D9C1F24AB259B24A3925AB9457822B9453D242B92794924FA2C5914FA2EC11F8244A96F1214A96C54B9E25ACF4912C2D431B693CE4497248F19124A37681F44A111FC1F24A8419F24AB559F24A9143B34A7934B84A383429F826484C
+:80BB000029F9245A5F6A082088040000004004280000000021800188000000000048000000004480020000005012B0310B90142164400841001884404808C418008100814054260040C222228042020014280089011C01808101431484010000F7B110222811024921088D1450280080011810841182044141204444344495440481000011
+:80BB800010141148081C0322188180821159412818264889D2E80230C4212170182418C41CD0A401223018408401502A4230184143D84214420455922122818902230410411108841E2153812242282182518418C0128C4229F3CD2A1022814114020000400884008901441200100400419044814502000000412840880100181200464412
+:80BC00005141220000BE5110022001100820010000000080111418041008200200412042142441010000000018841841004008F0B4940000291202181E2200203118124018841168812628614114422810449414C01443220420221218C428842A140410080049028112441200E0F44302002C0230181221001884001004848426981412B3
+:80BC80004521241218043810040020021618352884224100840018C302C41841188400ED6500002301002820018021018420011218508400001014041826C444804294240000420000000018000000E066014542081281C01418281829013018180000901880110829711128011058418C01442302858444041014480441A014100C444122
+:80BD0000442004B0F9074018044008818C018C024C010015486481810000488C01004810011088018044088100848441504884004028248108F0F1BF00000010080000100200001440684400000020014480024400100400124009108401811218805148B0470F412141180044188C032B12809118001518C418918140442854829112209E
+:80BD800024018C014112448504844181004C414808495184CC01818441128A5184F0836B00001048981884201108248001000018844A010012001018440428230200410044818410018C0400414CA1418004F0F4440012180018001200200118000020011200200510044181001818404404000022280050841048480400F08CE940088105
+:80BE000024811028010000001118841001001181001240694100008480010060111C010014120010040000F0923B0000000000800100000018008400400820810216381420010010081044441408000000000000DFE306100816080000000000000012200112200149114404001C5448148504004485011001144414101808848400301499
+:80BE80004B2E2482800112121200008081011220010000008094481820420112004094448440440444260880418891148141000044AE1700001800800100000000800100000000C01118F0441844C014000000810020C241004110041004008DA80012000000180000004058180081141210189811141484810042419014124044081114ED
+:80BF000014118400008120448401008FE9450200000000200100830112000000000000221D2400121200440044C44004001880211104410000F01B3240084800844008184004280080011212831102189088518412485242C4400C1C04148410882444410D4E21000060844110029FA10B20898101001800008021110118001283A111402B
+:80BF80000846F11549F018284B14CB118991414D1C504418508C10781C7841C4418F92021448301C8481D0840400F0ECEB2400162841284148A81100A0111088311814121B11C0180060818B11D01C515536944156E8440116B41841344454455C41141215144118741101901C444508410041DF4F062189018123C118121220A1110080A6
+:80C000000118878118C0181490118181484C21A1129C024D44478112590147114410588415541441F029211B141889C11C4445784854484C01C0149F7C0900100A81000012002041618114400114400114200410014181100111411100490141000016480444000040F4C1CA00128781E081E181B118410812001A018548511115791141A2
+:80C08000D11151991D111495D9916185DFC49411CFC2F23C5CCF84F41C5C4FC5F5151555F1451D115C545C855C9997511F157441D59DD219F2515517151D194951884B118F85F1444C1E140041B76D24E0857418D88844E88111E881A1111245043E341AD188E21151918CA1111CD1319112182D1195F981891E18CD9C5F41F11D2D5F516D
+:80C10000B654F554541F55F51C144F41F1155D17415C54545555C897D11F557441D5C9D299F2717517141D214B11CB114B114F85F1444C4F61110269F14399001A04A5B812B118B118C118181A41A4111A038F8111E11151881A11E111518A1A9111148CF85119DFC5F5151C5FC2F23C58CFD5F55C5C4FC5F4141C4F41F11544165144D5CE
+:80C1800054CC95D95DF14151575495DD18F25171529D19CD1485F81C1C5E184FC4F4141421D044F17CAA24218B518D1823B412B118B11841A8111A41A4114B311AF138181B118F9151991AB111E111F11B191E121185C9881F95F1DC5C5FC1F1252DDFD3F65C5CCFC5F54D5C47C15751D74147514744D554DDC5DCDCF14555575497929FB9
+:80C2000012F25571529F92F11C1CCFC1F11C1C4FC5F1444C4F41114252447FBA070000188021011200200112200112810000100881188149011880011810040014400114400100004400F08E9C3082120000000000180000001008181008121028425484124014441404400C441415641215080040548418400440F15875D022F41124859D
+:80C28000F2112C83F4112CA3D4C1B24AF11124AB9419B24A3915AB9453F34A9153F2429157822D915F82C4915FA2C4815FA264114FA264192E4A96D5A4E449C24A1F49C2431F49523C1F497248F19124E7141FC9B24ED141B24A9921AB9451AB9443F24A9443F24294478229F92448984FA2B4410D2D4A1F4186F4112423F4112423D44181
+:80C30000B24AF11124AF44D841B24ABB15B24A39352B9457822B94578229F9274829F9255A985FA2AC8517A296F4214AD6D5B4F4D821249E2CBCE449D63CE4497248E1497246F1812CE3D441F64A941D24ABA459B6427824F84A9443F24A944B4229F9264829F9344A3FC20A848004000000400428000000002100800800001400848004B0
+:80C3800000000000800200000010028BA5000000000000901800208182413118818422004140CA44834198184443012C1314084414128002001094148100400400AF3F05448E2410024014C814C01821C01800411004419014421002001045042124420041282313081004898201004C911C850410541844EFB10D444F8402210044811679
+:80C4000004C3013289012021224161E184CC214722480400174115484A341842664A144CC214911830244189A21210048CC114845024413014BD5F00000000004002810040044400000000109846814112401422012082020000000043414448040081D0C509006184211004A901211A048400211120220481004181000021810014441485
+:80C48000402111A421000040080000410000EF6303410010C412104A1402009014D4439228C3111418081185449321101E124B942441274225642241284902106881941922422111A4213038418CC214901822BF56070041244002800100004941C9248D2116044018088554248902C44011424404112654412813224194380011281416C0
+:80C500000812104854841800F046661044028441126481A51412A2414008442110C8248C044001141424242484418342C2242544021004008C518128004084022A012241901822730E444518988C84200140448862C2002D141684518400850238801228044100250CC110C2220084800140581C121094180010082884817F5605800421A2
+:80C580000000002061422181008504002400844144240014114245180941801404848115480441840000838141040058230300200841801102288400100824106441400C43440881849024002130220040280222008001901840480460818901E0230F44105884001810028CC2182410D84A219118614116141888C2488D24C483548241A1
+:80C600004D21242C444CC3224422108C02228144841812D08491188487411881128C4198486FFB0C4044028144200144801208004441810040844104000000850444002C04401868811400151808000010142802F0FA6F400400102802614140022400C1400441400881181008A44002220021100A841281188544044400841008100881D3
+:80C68000F02A5F00442400008C02818100103814000000808401841014110840880200004C110800008C0111800180218201F06968400240084426420C0040022410022502504A4100250C214100401802484121428481100800004531180000222200704E0C008444841008810000000080548421902224112481118414118140020000BF
+:80C700001001000044001008414088A11412F0C43400004400000081100481100810081008914400400800902442810000002001400418410018458801009F4B0D44400444C1444445082184840010048410040080114498210084442810441418041001849011122011210116482803301841DFA545022484240000100800890184107C94
+:80C78000110400133448302146A1244044492444944114C044941524C1141961518181C4004190141004418141816FAB0D2123082140120840840440080090480041442100002518141444180C4442415018414539144119018420410C444400444414D04C0A8485C444844C0844000085148402450800410023448111B9445841222220B9
+:80C8000044210494800410010000449021008440180110066B95502643484204508A65524450824054A2842548088C110241224E48A5FA211485FA244185588C11418D4A4140516441254459D553B11831148100474160C14116140C91444548019F370744865444C147485044848558C84285181808C51254284E45C55244D08414135174
+:80C880001C4D4515D8446212254C58422E283F425445810000895181992191118941C81489C118898151884F83B138A2158D1D842F6C4402255A88254A58CC2A72280441812441188116544841C1C4504A875440618123542826514185D148048D44284A344285744958498B11D444445D188544081711551118449C142849014311F4313D
+:80C90000AC00411004415024000040026C014C81440628101842147248140111831422440121841400481484000000400850181008812DCB1042568A642D8CA4AD22AD2665546CEB448185F21A1AAD22E721A78185F8515BE55A222AF221612F3554337FB27343FA2322AFC2F22C294F4454A4EFE4942E4F54E674744616D645544517110F
+:80C980005F85F55D5D5F11F1151117911AE14151511E1DCFC1E14101457414EC45B44C544445F4455E2425F2464EA5D66A544264AFC2E2C2528CC5FA4244818FC252881A7314741858C81F15554410F241418F1555195F8A5B958F327A2EFC2D2D4FC454D5C55C5C4FD2F244454FC454C45D44C57C15FD554DDFD4F4151D5F51F1181C8118
+:80CA00002A5255DD3DC5FC141C4F4151C44FD1F35456EF445444EF4171BA0425D66254AA65768E5CA8AFA2F22E2EE55C6CAF4414D828F21A1AA5D22E518E4F41F1454BEFA41416F645451FB45533FFF2DAA3F4676EBF52F22C29C5F5444BE5FE4E684D2C55D666548ED5555DD751D791DD1DC5FC1D1517D11AA13155F5151DCFC1F1181482
+:80CA8000C55444C7C33E2CED1845DCCCF1E9C22465D66E546EE764E55CECEFE2F2262EE55CACAB4481CD2AA5FA3A1AED16E5FC1C1CDFB4F44E4E65F424245F56F6495BB5F33FAE7FF4F4EE6F7752DFD252DD4FF4F44E4EFF44D6455264ED46E57C4D55CC57D157D1C7C1DD1DDF51F118188B111A7315F5351DCFC1F11C1CCFC151CCCFC338
+:80CB0000F3242CED1C4FE1D1CCF129171004004184411004400800840000004411819028100881100800000084148400200140410800122001F02EAE001004008502401848088425024484248C4404800461100240011082820421000080018180011812008921230400BFD9034D421F41522C1FC1324C1F41724ED241B24AD141F24A925B
+:80CB800019F24A9251AF243924AF7439242F34F92448AD954F82C4914FA2C4816FA27418F5264A96F1214A87592D4A9E242D4A1F49D222F49124A5F29124A3F49124A3F48124AB141D24AB9419B24A5985AB9443B24A3924AB94478229F92448984FA2F4D282D0A4F41164CD421FC1724CF21124E7261D248F24D141D26A9961AF649B2549
+:80CC00008F2438248F7438212D864F82D458D987B44ABB24C1817F82FC18A43FA2A4293FA2F498242D499E252D4A9E2C6D491B6925E2C9764AF19124AB148E242F14E1C1F24A8519F24AB45D28AB9443B2427924B84A7924989A6B42A9F92452E609848200000000008002000000008001880018000000800400000040042800000000253D
+:80CC8000013F880D40548350811002100A00403814106641008181006422424002430265181404490284848311E1C4411801484008458851484842405C842F8C0C5482444508614D8200444048084125180281C1460841C410424C445A84896281C1002100002264160C431128810144436111C4F0142814264801DF4A041574C41A4C0451
+:80CD000025841802A514042210544240D48441C8425084834162288441848129B22D415842854224840220023143941845012A0581D0483118C466C842509412FF9707001484850161000084811068812502101448084110C4244810160844844400411048981C169C184481120044434111044311618250842FF40B22000000000012815C
+:80CD800000002218000041200220050044002200120000008100000041000000FF89086023008001009018811218818C0110440442A0242084842222041230541A0222109244008004000084302480061240083F5E0D221800800100806181811890180044412004490400200400C0142820428201000040080084404484061810082F81C1
+:80CE000002C0220000000045082A0184002218000038A04248221A82041844488C21024230440020044480020028000000189F5B0D441800302800281008004485244104814064844C04100400180012800200844004480042841028110410084048F4EA6724008143420881009180218101184124202401228424C012164908811002474D
+:80CE800022185081C044004008000020A2418480014604F0B3F900248021511210020000618121809214440041200280921400448484000021124481000000891444044A42080020729C460200328493121802118100105C8243C12612874418414C0426026426C9182041142A8182011002448140082004504816E441C4289018200422BF
+:80CF0000AD221024114AC41200204208122C3114301400440090284D48001218441008404834225018B04C0141200400818C0422801408101418F4C48110040041000028000000000083840400480081840000901400000000000000100800180048CF6F0C1E224420014412100818008331180040080081430200224222404418040000E3
+:80CF8000108421412411084210A81418C01848874483344422EF350C434204004418002849012281180000304848844901480042004100840042004412100485046800120081484100382FE60E8D1A830412440040084554444B223A322800400824003AA11192804298281011485488CD188B444A2404001880514445B424A222838264A5
+:80D00000818001566A8446A4157B6900210010042200001008008100004004418002004200000018408401000010080081000010F4191E10C84842488041080044414C2282020000502290121298828890284011414118C848424800000044414C22820648800150229012DF750A848005210000004481280084000010021828881004323D
+:80D0800040014028810400000040148842280420A4420021F0D4772400200100005044A0220000441200001A1104220000005088A044002001280045042A0200000000A011BF7401800121001828000081100800000000000000200400001800000000000020040000005FD70E21814624240200004544B824022200000024241A912416AE
+:80D10000648882100810115188B0481424041200004544B82402224800004042A2118753405888484800000044444594282A02000000212981A111884C180422404101848588A44410040000444D2489A222000042002129D15D0F122140020000000000124008004044042082222402000000182002180000100881188184480000E028A2
+:80D180000600180000000000004008000000800200000000121280010000000042420000004044F4A764701232121E1224901480020000818140482401000044282A024189A212000020810180A1112200008185E884A41400484A060045F4577A000000C0182200008184800181000050444342440848222848002001441A8152440000FE
+:80D20000100842008B4485080000D0314902408491220000008184001048080010043024B024424408420000181200120000008410880420050041F0CDE27026F212222AB112219112C0122582E8317111B188699985F888414E48D09114815489814F847448F424444B242E24224C02284514E4427226B212A2122B111AB882092C592264
+:80D28000881E1317118B98967948B888E48424C448805488814F84F4F5B9F0262245A2123223118281512229C8111B1119E88938188D41424648591148848588F44844C14B246226448482425444286F2252242A21A38123A818182592821CB11191819E88839148424648888444588848DF260100000000000000000000000000000000C5
+:80D3000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F00000000000000000000000000004F
+:80D38000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F000000000000000000000000CF
+:80D400000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F000000000000000000004E
+:80D4800000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000CE
+:80D50000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000004D
+:80D580000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F00000000CD
+:80D6000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F00004C
+:80D68000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40FCC
+:80D700000000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FF3E
+:80D78000E40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000000000000000000000000000000000000000000000000000000000CA
+:80D8000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000000000000000000000000000000000000000000000000000004A
+:80D88000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE00000000000000000000000000000000000000000000000000CA
+:80D900000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000049
+:80D9800000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000C9
+:80DA0000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000000000000000000000000000000000000048
+:80DA80000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000000000000000000000000000000000C8
+:80DB000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE00000000000000000000000000000047
+:80DB8000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE00000000000000000000000000C7
+:80DC00000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000046
+:80DC800000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000C6
+:80DD0000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000000000000045
+:80DD80000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000000000C5
+:80DE000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE00000044
+:80DE8000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE00C4
+:80DF00000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04F41
+:80DF8000FE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F000000000000000000000000000000000000000000000000000000000002
+:80E00000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F00000000000000000000000000000000000000000000000000000042
+:80E080000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F00000000000000000000000000000000000000000000000000C2
+:80E1000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F000000000000000000000000000000000000000000000041
+:80E18000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F000000000000000000000000000000000000000000C1
+:80E200000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000040
+:80E2800000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000C0
+:80E30000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0084104468820041412218004C82C22481000012444818004981114824A2240040088C6482302448415048844428444C8202608112F0B9582092282941C8184416D44862423832188D24C4490241184CAC
+:80E38000A3211A82219144422A01121648B8489254836484C148461828E4C1446444CC2764422A21824324422C92184CA14338608483F18DC4000000442A010022128140342440342820012044240220412C224134282608842004856482624C02321048480400184240985818BFEC0328893212804118084C92144C0132C100200228804B
+:80E400002111842404188412484100444800B01C24041848400418204248143824000084E7B600008400100400220022100400008001181800008481480042810080140C2A0400442022923480222301F0C4D60040088504448902220041002022C114182800000000301848488004008400440041806242004100200100F0AD1B000000F8
+:80E48000000000000000000000000000000000000000000000000000000000FFE40F800310A81285010081280090241800201184D18404481222188C0483C4142180440244200141812024C2484018441884210241182AF47D3B244542446441108C0281801108200144441222206282008514088422444181424412007048846284221801
+:80E500008902008418C0148140280141844F1D4542C21400812826010018830280218201182218430242508418C0188304466881291404240085A4214841128C22846284301841C301208211341489F628A6108412644160C181100881000041444100008953848014280222444144005800444210881208004008004588410800B0B20F99
+:80E580006110042440022C01188001000010C4140022A0428145022112004112000041100443042001000010082002F0997520420222490100269428240021245084618504008C048121450246D4485684611820424442041800414088046045484084A6C1C9410C8148BFAE0629026160210040942A24000021451A0430143048402252A6
+:80E60000284149B44852A4204184110441000010048001120041A049160440082F6E0C44002844400238800112210000C14100204288144442422411048002100216044144428442004C2404201618482C02486FCB09242011048301A14441002D24448410421462C222444416128C024400A302109828186212806241800100490126881B
+:80E68000C118800110084112AF68021014044141C1404808124C0220212141243114A90212484140084144414129711804464424110C484418814841204208468822C14841450883F16FFD901100001400292181011002000000101808818110020000000022000020012031840010080000224BC240119414413015E481AD148418182190
+:80E700002160211864418F4281C124848146C82C81412145421404184B211826448493244301411212488051488901831428C14884C44183F286F9C012001044080016040041810012004C424844420440089028405482008001812024018420018260812003400400DF5B0D0044004502841004200100440010C4241004A121008C921213
+:80E780005024201244082200810000810084504841004481009FAB0B104208840025048410480864454818044008C4004008A44444448100004100401428118C01260800128112200143019FD303200100400421A100211012080010084002002412411064218440C22424100C410010880100440041440044F05CC90000C421848400D0CC
+:80E8000082514A226D28182121101A1C0200241200A4002428008410020042874141120042441812301820014303E0B60B800222410044000021240024280000F018422042080040584281004884248400444200004422400400850440D1AE0D4424444410440A2544040000416141614D28410041C9810400100200101486240400404897
+:80E88000344800124145084018044240F858EB00448150281012180881100800100821008504502850820010124804004100C10018811884C1800118441881188489012F84021002100241404242024421222001411002008504200484440000804102008110240100C048108842840241005F150A45082D42400400440044800240421829
+:80E900001802C121800188240000144144842448446184000040041A124408100884100A9306641018141C4456E68121A124A54482022901812225DC44422411F21A4A80548A284542425E4E504423151E5282805488C911A81584681AE1C7514418C7828D1C474289D14CC419843FC208412D14848D2425584AA5181852CC164A48584877
+:80E980002761A55CA447826485180441C4C50C0018E14445B82C0140624224465244855C844961411A119818854814DC887114C81443817114886341F04EF7002C52662444244150642410EA2112024542546A655866818485D824442252AAA424E429411442684250A44426140885442454C484101404504800844484C1D0650F100461D9
+:80EA00000000844100008444400485048150480010081004411004004110044184400812000000814004817DC2002F62528A8F8252CCC55E4EC5140241702858CC4D2445A2112A12F2242A214554444B4585F86872214A5488855A428558C8850845F6541685984284855C8885FC5454414B55818782C5FC447CCF81F11C1CCFC353444F69
+:80EA8000C3F31C18CF85A5111277BB006E6A25F42C6EC55864E55E46A55666A51CD2EA52EEE5546EAFA1F12C2EE16FC25222E145F44E56A5FAEAEA218F245CA8855E42955FE8D484646FC155E82552888558C88FC1F1545849E1C4B418F1183CC7C1CFC4F51C1CCFC1F13C3C1E144F43F31C16EF85F514182B115FF806242F6256EAEFE282
+:80EB0000528CC55C4445564265546AA59A22855E4261EB11EF4252864F8212548645F44452C5BA684EE8A454AA255844855BEE254858444F4155A82450C885F81C14CFC5554C8F451588D2CCE1C455CC4FC1F13C3C1E144FC3F31C14EFC5A511189F330A24EF6256EAEFE652ACE55ECEC55AC2C51E5AA8E558CA255CC6EF41F12E24E5FAC6
+:80EB8000262E65548E45FE4C4EE5FC68E2A5FACA4AA558EC6556FEE55CC1455464EF6151EA4556C8855CCCCFC1F15C5CCD148F851518F4181C4E5CCFC1F11C1CCFC3E3C1F1343CC5F44E4C4FE1D188F1CDE30010024150248445022484002440066400400481210081610081211004211042184418240184204144480444504840041FC47F
+:80EC0000018210441808000000405842000045080041000000004400410000008001008100D0482101802101144F780F2CF41124CD121F4132481F41324A1D24EB141F41B24AB911B24A3915AB9443F24A9543F24A9547822D954F82C4B14FA2C4854FA264114FA264194FA2E559F2245A9E242E5A1F49E222F4912487221F4932481F4917
+:80EC8000324E1F48B64AD141B24AD981B24A9945AB9443B24A39242B94478229F924484CFB244A8F99044FA29441CB521741A7241F4132481D24EB141FC1F24A841F41B24ABA15B24A7934F842854782AF545B84ADB569F44AB14F22E154F924888F15FA264296F124588F59F2265B8E254FA27591E8A2F49164CF22F59128C3B49112FEDE
+:80ED000081642B141D6CAF44F9116CABB459969A4B42AB9441ABB443B242DB86D44AFB2452EFA5068480040000000000000000002100800800001400000000180000000000000010026F440B64100416C224212141241822C012009012210000C1404828024240C214A30441611828841008400884001048181458840081F0D2C300430864
+:80ED80000000248141000040088445480A0000105448104818480823024012044400104408100C164404004568821441FF6C0360444420D16202216558244122222C018190188150220087413088C1260C818415121898283044182504410010180C22C190184518445884648484128F5806450200000000180000400225440800000000A4
+:80EE0000484068412D42502400288110084004840010040010280241CFB10D00C0241011042440028D1284890124101804261808404A041004210012401402611608100442000080410822854408F084F924412A41C41264844044041200400412844181C1181242C4428502C189D2845184188D14100226C4212228448014184808C410D7
+:80EE800058841644C8188002F0722D50421A024161A1414445021042024301185048002A0148904864400412206141006042284432004314C8488100008484848C032200EF2F07004138100100800189411808248450484548C81850482484407824181C0E841221644031228444000000C44098144301101C08F094FF244184140026143D
+:80EF0000180200809212812001414508247014481808442120028C430822411012084418D08411121C382184418118102872122C01FB79002548140281400800241E24814100005084A484120041000044444481244004000000124100280044604116480285F453710000000050421840080014502C0022100410048484814508212100CC
+:80EF800000604141100A000041121810080028001FFA08442144213024818542041018921A4114122441850484C44481C4400C8441244C1102240021CC41444208458A1148488401D0480120931840F851DD1002140084240012001810085084008D24008400442481902841895284204214040041122001001181431108701418382418EC
+:80F0000041DFF2034044042410048502A481240024006422006450482901002524120E214121109A142140048100009018000010C21440F84C8C00241004102201102211825242128140082120512840485824188D121824494106E44012488401400400004141C400100418F011FB00240081284124400C602284401404100400222264C0
+:80F08000410041220040420400400C1200608100301849212141483818004F5D048421101244044100008149120400618100240000810041008400814012084084018180010010040000448D2930844018042484001008100400008400101442088400818140040041001004408801430241004044044044F12F5640082012022443114421
+:80F100000600D02802240049424614829218411002104424424804004481008181000028840010482831248418FFCD010064141100248581019414180020110827815084161844321870126C81002100000041188C01414002234144129418812410168811D4760E100400400244000040124406004140080041218450824004000012186B
+:80F18000450800C4000000901C8440088481CF270345188A04100414004054921C824212480600812180038844412800140084614C04001816044042042850284052240010068E1B4066E88124E4243012455A64855221255226282185981265526444411672181A5EA225522421ED1A216125141212161276125C82411614544C85481A96
+:80F20000323250CC85D88C01C1A5D8461144054FFB01416165120647428546149918211295185924506624C4282D1250C428CC92184558424D1C328F82439224854804854498144961C190180080911441122D1412CB115024842E148508FFF20D00441D241110D62551424058881CC21487424761101478285884848163225244874185A2
+:80F280003818444554C818455424644044524889911C16648144188100105442C427E1107818B814711CFCE3A20014000040428841C8118418C012846C0118400444002100000000100400401824110424124440224126410420016DF624255233B5F921215D8765568A1D11EFE1F116162F21D122F11A1B7F71F11E1C4CF11E1C1AF11A9D
+:80F300001AEF62F23636854858A8A5DAEAF11C1CC5FE1E1E6D32ED2AA5FA2222E55A262552A2E5FE1E1EE7C1CFC1F11818188D1881CFA151881A01A4E5FC1C1E2D188951ABAF81F12C244D14C5EC484912F24145F5FF23676D866556CE37117D176556EEAD122F615377ED2C6D14EFC15142A5FA2E2EEFC353CA85F8383EAFA2F28E8ECFAE
+:80F38000E1D16CF81E1EEFA1D1AE52FF2F2252BEE55A226FA454EEEFE1751EFC1C1C1E14455488C5F8181C85E842425488C55CE8E55CACB5FE1A1AEFC37214D446F1CD6B2425D222548A1F12F225256F62528A1D13EFC15126257C13DB8B5357A56861ED1CC55A8EEFE35342E55C8CCD1EE7A28D8EEFC151E82FA1F11436ED2E85FB2A2A2A
+:80F40000C55EE4242D42455EE4C5F818188FC1D144D18851888FC151AA2B315088C5FE1E1C4D16ED1AA5FA1A18EF42D244D188F17C4D2425D66254EE7F56F224242F2252EE3771FD1DEFE151CAB731FD1BFFB1712A7A12D6EEF11E1EE5FC3E3EE55CCCC5F82C3EEFA2D268F81E1EE7E8AFA1F11C1AED2EC5F72A2ED55AE625D66E54A4671C
+:80F48000E4657C1CFC181C4F41F1181CC5EC21F112126B314554ACEFE1F11A18CFE1F11E1AE5FE1E18EB334F6141F8499710046110024150140000400444848110080089024440841118044100104498148449010024000084006410285148F07B86000010042400C481100800A5420841004018088161448444000000400C841880410880
+:80F50000841800C0148418841004415F2E052CF4112485F2112483F4112CA7241D24AB141D2CAB941D28AB9455F84A9243F24A9347822F147924D812F934481CF9244A1CF8244A16F1264A96E1A2E459C25A9E24ACF591242CF4912485F2912483F49124E3F4912CAB141D24AB941B21AB9453B14A3934AB9443F34294478229F9344898BF
+:80F580004FA2F48957C04A1E643CE4C1621417C146D2C132421D2C4E84CCE216D885E2347824F84A8326F8428547821CF832485CF922585CF824DA1E816F8265198CE459E292F59825581FC9D284B49196481F4932481F4932461FC9324E1B21AF64F811248BA41B21AF6438348F2438344E8436D842F8164829FA245AAF2D0D208804001B
+:80F60000000040042800000000000088000040014008480000000000280000000025019F9C070024410040140800000081008302451804844184842100814542481404204104100849618140084092184412C0188110F4BC2C0023480810048A420400814414002440042240042440044518040022120061004084110200004001C10044C9
+:80F680001601BFDC0F24C2851204000010048342942100002224430216446848401C4204914512982C1664843014440044C01443012200C018701408AC114C21D1BC01000040048E24C100000010082145088444002481008444000000240000842C01811008003141000018413746004440140C0000000000000030241004418100002021
+:80F700000100444008000010080010440440081008CF3E0900250482104454844100C04241D08401418185048381160818444518941C108C0400416044844484000010149C28841018548481005DC8004141504810141418040010024781100490248C8104204114041608160800441048144844080000414054484018481848081FC90D79
+:80F78000400244820040040080140400405884004C421844088141411024040044200400008100109C2800401404004F17040044614008000040041024010080421408100C00002284410010584800008410044008140000124508CFFE0A24220000C018831104401404A1100884124484508441241240189824611008188421A012100CB4
+:80F8000000C1004098144440844308F09AA40064002614042100004002000044400800840000000000441004100884440080014041080000F047F940120425C42441901A8444004004C41881402C614244105448C5220181C024004160418181C4381044480800128120518440048100AFE90D80120640088001000025020000401848181A
+:80F8800008000081244C42080024440081844004840040480400381285043F2F0C0010044044444404000000004508000040040040088100410084000041000000848100400481CFDA4302000000000010040010140844008441000040180400008140044481008100810040048100008F8E06100240040000000044100400000044000070
+:80F9000084440000000044404408000010080000418100BF1602000040040000440010040000C400400444410000414100440085144804004481004100100400F025470050221002100441001004004004100C008400814184400C100440040050840000844141101C0884405484AFE108504240041004410000000044405884000000006C
+:80F98000401408404808000081000000008144004100005F360E2100004100000000400400410044001004100841104804000044100410180841840010040081F03E92206828004400000000001004440000000010480400000000000000105884400444400C810070550F848004210000004480420400008410468401884100009400C4EB
+:80FA000044490484840044444004281048081048548465086F670F242748244100504450440000410045048444C54C141C4404101C48584C44105C444044544484455C88C504508844C5184C480C445044504C45C8A6246028214441410000001004454404C1C5041004440045445844418481854804444508818100405488004054485091
+:80FA800088508481C110F854BF1002405242444504450400444004414004C508004058440084850484440041008445145844100450884018145C44C5584884C484B0840D1002210000000040040000810040044400004110040000410000000040040000000044EF1C0750444554444748455444455444450400415044455444455C44C5D3
+:80FB00005CC8451404850800818558888558CC455444450450444554CCC55CCC45140481C50844C55CC8455CD4455444C51CF889C324246FE454444D4645544445544445544444E04202284554444554C44554ECA54CB412018FC849D44458CC855CCC955D88C55DCC45F444444448455444C55CCCC55C4444E0425288284554CC855CC846
+:80FB8000455C6465544CAB1127E324246D46450645044554444544440428450450444554C4C55888E55C444901CD8841504444C54C55CCC55CC4444D4440544C50448558CC4554489028C51C4854C8C55CCC854C1456CCCD1C9F5E4F42D26E546446D2441844544445544400495244474244454454C4C55CCCE554644D14F01C8C45748430
+:80FC0000544444C54C5D44D54458444D44444654CCC5584CC558C8451418982CC57C2C544CC55444C55CD84554C6C5DECCF197CA00100600411004000000444004850444000050484181100810040041844184410084004048048504814004ADDC001044044400000000000040080000401404000040040000001004004008008410044153
+:80FC800040F8EB1CC0421F41522A1F4132481F41324A1D24AB141D24AB9419B24A19B54A3924AF143924AF147924D812F924488D914FA2C4814FA264514FA264194FA26459ACE449C24A1F49C2421F4952281FC932481F49324A1F48B24AD141B24A9921AB9451AB9443B24A39242B94478229F92448984FA2F4546BD0A6F41164A9F41154
+:80FD000024A3F41124A3D441B24AD141F24A941D24ABB419F24A9443F24A9143F24A9143D212F92648AD912E528D954F22EC51F8244A96F1244A96D5B4E419C24A1FC9C24A1F49D624F4912883F49124A3F481242B141D2CAF44D941B24A9B21AF443924AB9443B242792498926F8294922E5A4FD505848248000000000028000000002111
+:80FD8000800188000040010080040000000080024800000025011FA404244002400400000041100441000010040000811008000000100844100400100800100881001F540E20084100400444000000001008450881004008004044080010140881000000121044180844001485F4A71A40220C441004001004224440044140480260C120EF
+:80FE000008844008914410084240140800101404221018144808454812487114F8A2FE0040020040044400000000005084000000000040080000401848040000120000000000FFE2090000004004000000000000000000008440080020010000160400000000000000709D0700838801400800004004000000000084000000000044008183
+:80FE800000221849011284001484112001180087AA000000000000004400000000000000400881000012008400430244201108008100188001F0D6A30030881800814100000000000000001008000000001004000018181200001001110000009FF20D00000000000010080000000000000000000000440080010000000000800100121F9E
+:80FF0000550F4048140200810000000041104208000000180000000000000000000010048181400800F03CCA00000000000000004002000000004024C12400100400000040040000000000200184F0291800000000810000000040028400000040840100000010040010040000100410088C210181F0527D00502400000000008400640094
+:80FF80000000000018302400100400000018000000001008000000DE9900000040080000000081840000000000000000000000000000000000000000F0F65D000040084008000000840000000000000000000000000012002001001200202101003F670B0000000000000000000000000000000000000000000000000000000000F04FFEC1
+:020000040001F9
+:80000000000000000000008400000000000000000000000000000000000000000000F0A63B000000000000000000840000000000000000000000000000000000000000F0D6CF00000000840000840000000000000000000000000000000000001800008001006F2601004028080000818400401808000000000000000000000000001800EE
+:800080000020810130110000DFA10B200800000000000000000000000000000000000000000000000000000014706303848004008400004480020000001002188008000014008480040000004004280000000021F01A38008210880810080000008548480800000000000000000000002001000080A1111800181A0114F0955B0082000026
+:80010000840010180800000000000000000000000000000080011200000060110014F01648000040088184000081810081810000000000000000000000000000000000000000F0C5A200000000004008844008000000000000000000000000001880011880012001120000F03135000085085088850800850840485888850800000000007A
+:800180000000000000002021011A2121011A01A0111A91111A0100BF6B0AE084548848008185085044E04252888912588885084012022B11A09880080015011485084E4880040012121AF11414123E24A03118A0111AA1111E1221B012F1F3DA004850880085588800850C8D288518185888850800218001880000400140084800008001CF
+:800200001A418481A211A0111A01A0111A1102185F7E0290488528045088850850C885D88C0287828558888400104282011A08820040011184904820040018001E141849A21122121A01B011A1112124189B450000840000000000004008000000000000000000000000000020010000120000CF47068200000000000000000000000000A2
+:800280000000000000000020018021010000000000F0C2BFC0421F4152281F4132481FC1324A1D24AB141D24AB9419B24A19B54A3924AF1439242F147924D812F924481CF9244A1CF8244A16F1244A96E1A26459ACE449C24A1F49C2421F4952281F4932481F49324A1F48B24AD141B24A9921AB9451AB9443B24A39242B94478229F924B2
+:8003000048984FA2F4A8B8C04A1F41D628F4112483F4112CA3D4C1B24AD141F242941D2C2BB45D282B944782AF1439242F147924D812F926482D914FA2C5914FA2EC11F8244A96E1A26459BCE459C24A1FC9C24A1F49D628F4912483F49124A3F49124A3F41124AF44F81124ABA45B21AB8443B34A38342B84478229F9264829F9245AAFE7
+:800380007B0C004800000000448002000000100218800800001400848004000000400428000000002501BE4B200800000000000000000000000000000000000000002001000000000000007FFA0B200800000000000000000000000000000000000000000000000000000014706303200400000010042200000040022001820000100110C0
+:8004000008420000001210042200000040021412CFF5040000000000000000000000000000000000000000000000000000000000F04FFE0000000010080000000010040000004100000000000000000000008001000000BE1300000010010000001400000041410000000000000010010020010012001800000000CFE10A000000141008D5
+:80048000000000000040040000000000000010010080010018001818000000F046CD0000000000000040010010044004001004000000000000000000000000000000DF820E00000000000000000000000000000000240000000000000000001800220000DF36090000000021008100188100000000000000000000400800000000000000C0
+:800500000000001FD3084001000000800100001008000000000084000040022100000000100200000000009E6400140000000000001800810000000000100800210021810000000000008001800200F0333D0000000010021884004008000000000000000000002100000000100200000000002F84040000000000000000000000000000E1
+:800580000000220000000082008001008002000000D0FD0E0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000002001000000000000F053FE000000000000000000000000000000000000000000002001000000000000F053FE0000000000000000000078
+:800600000000000000000000000000000000000000000000FFE40F000000810000000000000000000000000000000000000000840000000000F0C4D300001508000000000000001002000010021200400220010081000000000000280000F08CF5000000000000000000000000000000000000000000000000000000180000F01B3E0000CB
+:8006800000000014000000000000000000000000000000000000000000000000F084D3001001000000000000000000000000000000000000000000000000000000F0E984000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04F00
+:80070000FE00401101000014000000000021000000001200000000008400000084000020020000AFB4060040084008000000000000000000100200001002180000000000000000180000D032070000000000000000000000000000000000000000000000000000000000F04FFE0040010000400500004004002100440010021880880221A1
+:800780008001884008000028840000800200002FDB050014000048405588281082044480022100448002214818808802214818448828842148408481421882041E148002211A01445C03000000000048400400800444000000440000000028000080080000002800000000D0A102001400000054000000440010024004002180018828109B
+:80080000021880088400008042080000280000F0B25D000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE001002000000480080022148008002000080028004000080044480022148400400214840040021FBA30000000002
+:800880000000000000000000000000000000000000000000000000000000FFE40F001400000044000000440000004400000000280000000088000028000000000000BF19070000000000000000000000000000000000000000000000000000000000F04FFE004001000040040000400400004004000000800200000000000028000000007B
+:560900000000AF710A000000000000000000000000000000000000000080080000000000000000EF8CF2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3FFFFFFFFFFBE
+:00000001FF
diff --git a/xpp/utils/Makefile b/xpp/utils/Makefile
new file mode 100644
index 0000000..021647c
--- /dev/null
+++ b/xpp/utils/Makefile
@@ -0,0 +1,37 @@
+TEST_CPP = 1
+PEDANTIC = -ansi -pedantic
+
+CC = gcc
+RANLIB = ranlib
+
+ifeq (1,${TEST_CPP})
+CXXFLAGS = $(CFLAGS)
+EXTRA_CFLAGS = -x c++
+EXTRA_LIBS = -lstdc++
+LDLIBS += $(EXTRA_LIBS)
+endif
+
+CFLAGS = -g -Wall $(EXTRA_CFLAGS)
+
+TARGETS = libhexfile.a fpga_load test_parse
+
+all: $(TARGETS)
+
+libhexfile.a: hexfile.o
+ $(AR) cru $@ $^
+ $(RANLIB) $@
+
+fpga_load: fpga_load.o libhexfile.a
+ $(CC) -L. -o $@ $@.o $(EXTRA_LIBS) -lhexfile -lusb
+
+hexfile.o: hexfile.c hexfile.h
+ $(CC) $(CFLAGS) $(PEDANTIC) -c $*.c
+
+test_parse.o: test_parse.c hexfile.h
+ $(CC) $(CFLAGS) $(PEDANTIC) -c $*.c
+
+test_parse: test_parse.o libhexfile.a
+ $(CC) -L. -o $@ $@.o $(EXTRA_LIBS) -lhexfile -lusb
+
+clean:
+ $(RM) *.o $(TARGETS)
diff --git a/xpp/utils/USB_1130.hex b/xpp/utils/USB_1130.hex
new file mode 100644
index 0000000..5f97b5f
--- /dev/null
+++ b/xpp/utils/USB_1130.hex
@@ -0,0 +1,309 @@
+#
+# $Id: USB_1130.hex 1124 2006-05-02 09:42:14Z zohar $
+#
+:100E2800000102030405060708090A0B0C0D0E0F42
+:080E380041001000410011000F
+:1009B80090E600E054E74410F000000090E604746C
+:1009C80080F00000007406F0000000E4F000000071
+:1009D80090E6107420F000000090E611F00000008E
+:1009E80090E61274A2F000000090E61374A0F000E4
+:1009F800000090E61474E2F000000090E61574E040
+:100A0800F000000090E6047480F00000007404F028
+:100A1800000000E4F000000090E6497482F0000055
+:100A280000F000000090E6187410F000000090E656
+:100A38001A740CF000000090E619E054FEF0000073
+:100A48000090E61BE054FEF000000090E6917480F0
+:100A5800F0000000F000000090E695F0000000F0C3
+:070A680000000043AF012272
+:1005A10078007C007D017BFF7A0E79287E007F1028
+:1005B1001204FBC205E5AA30E2030206E2E5AA3015
+:1005C100E7030206E275310075320490F400E0247D
+:1005D100FE700302067524FA700302069124F87076
+:1005E100030206BA240F60030206BE90FC007401E8
+:1005F100F090F401E090FC01F090F402E090FC0234
+:10060100F0D2B690F401E0701AA3E0701630B01386
+:1006110074C0120D44C2B67F08120D4AD2B67F08CB
+:10062100120D4A30B04690E694E0FE90E695E07CEB
+:10063100002400FFEC3ECF24FCCF34FFFE7B017A87
+:10064100F47904120AFB501C90FC0330B4117408B5
+:10065100F07FE87E03120D4C7403120D44806A741E
+:1006610004F0806590FC037402F0805D90FC0374DB
+:1006710001F0805590FC007402F0E4A3F0A3F03087
+:10068100B406A37410F0804190FC037420F080390B
+:1006910075310075321190FC007408F07A007B000E
+:1006A1007D017F50120D9E7F50120BCC7AFC7B0195
+:1006B1007D107F50120D828010D202800C753100A6
+:1006C10075320190FC0074AAF0E53190E69CF000CF
+:1006D1000000E53290E69DF000000090E695748000
+:0106E100F028
+:0106E20022F5
+:0C0D440090E601F07F147E007D007C0032
+:100D50008F368E358D348C33783374FF120583ECE7
+:060D60004D4E4F70F3221E
+:0A0AFB008E338F348B358A3689372D
+:100B0500E4F538F539C3E5399534E538953350338F
+:100B1500AB35AA36A937853982853883120521FF79
+:100B2500E4FEC2B2EF1392B7EFC313FFD2B20EBE0B
+:100B350008F0C2B220B002C3220539E53970C605F6
+:040B45003880C2D35F
+:010B49002289
+:02004100D322C8
+:02004E00D322BB
+:02005000D322B9
+:080E460090E6BAE0F53BD3226F
+:1007EB0090E740E53BF0E490E68AF090E68B04F06E
+:0207FB00D32207
+:080E4E0090E6BAE0F53AD32268
+:100E160090E740E53AF0E490E68AF090E68B04F03D
+:020E2600D322D5
+:0207FD00D32205
+:0208FB00D32206
+:0208FD00D32204
+:100CF70090E6B9E0242F600D04701990E604E0FF38
+:100D0700430780800890E604E0FF53077F00000058
+:070D1700EFF08002D322C3BC
+:010D1E0022B2
+:100DBA00C0E0C083C082D2015391EF90E65D740116
+:080DCA00F0D082D083D0E032AA
+:100DEA00C0E0C083C0825391EF90E65D7404F0D0F6
+:060DFA0082D083D0E0323C
+:100E0000C0E0C083C0825391EF90E65D7402F0D0E1
+:060E100082D083D0E03225
+:100C0400C0E0C083C08285130F85141085108285CF
+:100C14000F83A37402F0850B11850C128512828553
+:100C24001183A37407F05391EF90E65D7410F0D034
+:060C340082D083D0E03203
+:100DD200C0E0C083C082D2045391EF90E65D7408F4
+:080DE200F0D082D083D0E03292
+:1008BE00C0E0C083C08290E680E030E720850B0F59
+:1008CE00850C10851082850F83A37402F085131199
+:1008DE00851412851282851183A37407F05391EF4C
+:0D08EE0090E65D7420F0D082D083D0E0321F
+:01003200329B
+:01004A003283
+:01005200327B
+:0107FF0032C7
+:0108FF0032C6
+:010E5E003261
+:010E5F003260
+:010E6000325F
+:010E6100325E
+:010E6200325D
+:010E6300325C
+:010E6400325B
+:010E6500325A
+:010E66003259
+:010E67003258
+:010E68003257
+:010E69003256
+:010E6A003255
+:010E6B003254
+:010E6C003253
+:010E6D003252
+:010E6E003251
+:010E6F003250
+:010E7000324F
+:010E7100324E
+:010E7200324D
+:010E7300324C
+:010E7400324B
+:010E7500324A
+:010E76003249
+:010E77003248
+:010E78003247
+:010E79003246
+:010E7A003245
+:100B9000C0E0C083C08290E6D1E0900010F090E603
+:100BA000D0E4F000000090E6D17402F000000053A1
+:100BB00091BF00000090E66104F000000090E6990B
+:0C0BC00004F075BB06D082D083D0E03278
+:010E7B003244
+:100D66001201000200000040E4E43211000001021A
+:0C0D760000010001020203030404050553
+:050E40000308FF0D6630
+:10028D00E4F52CF52BF52AF529C204C200C203C2F0
+:10029D0001C202D2B675B5C4D2B61209B8120E5645
+:1002AD007E087F008E0D8F0E751508751612750B55
+:1002BD0008750C1C75130875144A75170875187890
+:1002CD00EE54C07003020398752D00752E808E2F8D
+:1002DD008F30C374BC9FFF74089ECF2402CF3400AF
+:1002ED00FEE48F288E27F526F525F524F523F52236
+:1002FD00F521AF28AE27AD26AC25AB24AA23A92224
+:10030D00A821C31205705031AE23AF24E5302FF56F
+:10031D0082E52F3EF583E0FDE52E2FF582E52D3E9E
+:10032D00F583EDF0EF2401F524E43EF523E43522C9
+:10033D00F522E43521F52180B9852D0D852E0E741C
+:10034D00002480FF740834FFFEC3E5169FF516E503
+:10035D00159EF515C3E5109FF510E50F9EF50FC31E
+:10036D00E5129FF512E5119EF511C3E50C9FF50CF5
+:10037D00E50B9EF50BC3E5149FF514E5139EF513E0
+:10038D00C3E5189FF518E5179EF517D2E843D82059
+:10039D0090E668E0440BF090E65CE0443DF0000030
+:1003AD0000E4F5A2000000D2AF90E680E020E10568
+:1003BD00D20512000390E680E054F7F0538EF8C298
+:1003CD00041205A130022190E680E054FDF0E054C6
+:1003DD00F7F0750D0D750E66D20512000390E680CF
+:1003ED00E04402F0C204C202300105120056C201FF
+:1003FD003004CE12004150C9C204120D1F20001648
+:10040D0090E682E030E704E020E1EF90E682E03014
+:0E041D00E604E020E0E4120CA012004E80A3E2
+:0B00360090E50DE030E402C322D3226D
+:1000560090E6B9E0700302011514700302019224C0
+:10006600FE700302021524FB700302010F147003D5
+:100076000201091470030200FD1470030201032437
+:10008600056003020279120050400302028590E6E1
+:10009600BBE024FE602A14603B24FD601114602A34
+:1000A60024067050E50D90E6B3F0E50E803C120094
+:1000B60036503EE51590E6B3F0E516802D02027443
+:1000C600E50F90E6B3F0E5108020E51190E6B3F079
+:1000D600E512801690E6BAE0FF120CCCAA06A90734
+:1000E600EA49600DEE90E6B3F0EF90E6B4F0020256
+:1000F60085020274020274120E16020285120E4E58
+:10010600020285120E460202851207EB02028512D2
+:1001160007FD400302028590E6B8E0247F601514CF
+:10012600601924027063A200E43325E0FFA203E411
+:10013600334F8041E490E740F0803F90E6BCE054C6
+:100146007EFF7E00E0D394807C0040047D01800227
+:100156007D00EC4EFEED4F2478F582740D3EF5835E
+:10016600E493FF3395E0FEEF24A1FFEE34E68F82A1
+:10017600F583E0540190E740F0E4A3F090E68AF0BE
+:1001860090E68B7402F00202850202741208FB40AC
+:100196000302028590E6B8E024FE6016240260039E
+:1001A60002028590E6BAE0B40105C20002028502A9
+:1001B600027490E6BAE0705590E6BCE0547EFF7E8D
+:1001C60000E0D394807C0040047D0180027D00EC39
+:1001D6004EFEED4F2478F582740D3EF583E493FFD1
+:1001E6003395E0FEEF24A1FFEE34E68F82F583E03F
+:1001F60054FEF090E6BCE05480131313541FFFE046
+:10020600540F2F90E683F0E04420F08072805F1256
+:1002160008FD506B90E6B8E024FE60192402704E8B
+:1002260090E6BAE0B40104D200805490E6BAE064E5
+:1002360002604C803990E6BCE0547EFF7E00E0D33D
+:1002460094807C0040047D0180027D00EC4EFEED32
+:100256004F2478F582740D3EF583E493FF3395E0E1
+:10026600FEEF24A1FFEE34E68F82F583800D90E643
+:10027600A08008120CF7500790E6A0E04401F09029
+:06028600E6A0E04480F058
+:01028C00224F
+:0300330002004682
+:0400460053D8EF326A
+:100CA00090E682E030E004E020E60B90E682E0305F
+:100CB000E119E030E71590E680E04401F07F147E12
+:0C0CC00000120B4A90E680E054FEF02287
+:1000030030050990E680E0440AF0800790E680E03E
+:100013004408F07FDC7E05120B4A90E65D74FFF026
+:0F00230090E65FF05391EF90E680E054F7F02203
+:080E5600E4F51ED2E9D2AF223F
+:100BCC00AD0790E678E020E6F9C2E990E678E044DB
+:100BDC0080F0ED25E090E679F090E678E030E0F9F1
+:100BEC0090E678E04440F090E678E020E6F990E674
+:080BFC0078E030E1D6D2E922D5
+:100C6E00AC0790E678E020E6F9E51E702390E67872
+:100C7E00E04480F0EC25E090E679F08D19AF03A901
+:100C8E0007751A018A1B891CE4F51D751E01D322F6
+:020C9E00C3226F
+:100C3A00AC0790E678E020E6F9E51E702590E678A4
+:100C4A00E04480F0EC25E0440190E679F08D19AF9C
+:100C5A0003A907751A018A1B891CE4F51D751E0371
+:040C6A00D322C322AC
+:03004B000206E3C7
+:1006E300C0E0C083C082C085C084C086758600C058
+:1006F300D075D000C000C001C002C003C006C0074F
+:1007030090E678E030E206751E060207CD90E678A3
+:10071300E020E10CE51E64026006751E070207CDAA
+:10072300E51E24FE605F14603624FE70030207BEDC
+:1007330024FC70030207CA240860030207CDAB1A26
+:10074300AA1BA91CAF1D051D8F82758300120521ED
+:1007530090E679F0E51D65197070751E05806B9044
+:10076300E679E0AB1AAA1BA91CAE1D8E8275830025
+:1007730012054E751E02E5196401704E90E678E08D
+:100783004420F08045E51924FEB51D0790E678E086
+:100793004420F0E51914B51D0A90E678E04440F0D2
+:1007A300751E0090E679E0AB1AAA1BA91CAE1D8E3C
+:1007B3008275830012054E051D800F90E678E04494
+:1007C30040F0751E008003751E005391DFD007D0E3
+:1007D30006D003D002D001D000D0D0D086D084D0B0
+:0807E30085D082D083D0E03202
+:020CCC00A90776
+:100CCE00AE17AF188F828E83A3E064037017AD0149
+:100CDE0019ED7001228F828E83E07C002FFDEC3E99
+:080CEE00FEAF0580DFE4FEFF0C
+:010CF60022DB
+:100D8200120C3AE51E24FA600E146006240770F372
+:0C0D9200D322E4F51ED322E4F51ED32288
+:100D9E00120C6EE51E24FA600E146006240770F322
+:0C0DAE00D322E4F51ED322E4F51ED3226C
+:100D1F0090E682E044C0F090E681F0438701000046
+:040D2F00000000229E
+:100B4A008E318F3290E600E054187012E53224019B
+:100B5A00FFE43531C313F531EF13F532801590E612
+:100B6A0000E05418FFBF100BE53225E0F532E531FD
+:100B7A0033F531E5321532AE31700215314E60056A
+:060B8A00120D3380EE2283
+:100D33007400F58690FDA57C05A3E582458370F9D3
+:010D4300228D
+:100800001201000200000040E4E431110000010286
+:1008100000010A06000200000040010009022E004B
+:1008200001010080320904000004FF0000000705F8
+:10083000020200020007050402000200070586020A
+:100840000002000705880200020009022E000101D3
+:100850000080320904000004FF00000007050202C6
+:100860004000000705040240000007058602400022
+:10087000000705880240000004030904180358001B
+:100880006F00720063006F006D0020004C00740068
+:1008900064002E0028035800500044002800420045
+:1008A000610073006500640020006F006E0020008E
+:0E08B000410058005500500050002900000083
+:03004300020900AF
+:030053000209009F
+:10090000020DBA00020E0000020DEA00020DD20034
+:10091000020C04000208BE000200320002004A007D
+:10092000020052000207FF000208FF00020E5E00F4
+:10093000020E5F00020E6000020E6100020E6200F5
+:10094000020E630002004A00020E6400020E6500FF
+:10095000020E6600020E6700020E6800020E6900B9
+:10096000020E6A0002004A0002004A0002004A0029
+:10097000020E6B00020E6C00020E6D00020E6E0085
+:10098000020E6F00020E7000020E7100020E720065
+:10099000020E7300020E7400020E7500020E760045
+:1009A000020E7700020E7800020E7900020E7A0025
+:0809B000020B9000020E7B0017
+:03000000020A6F82
+:0C0A6F00787FE4F6D8FD75813B020AB6E2
+:10042B00E709F608DFFA8046E709F208DFFA803EB3
+:10043B0088828C83E709F0A3DFFA8032E309F608A0
+:10044B00DFFA8078E309F208DFFA807088828C8308
+:10045B00E309F0A3DFFA806489828A83E0A3F608BC
+:10046B00DFFA805889828A83E0A3F208DFFA804C96
+:10047B0080D280FA80C680D4806980F2803380106D
+:10048B0080A680EA809A80A880DA80E280CA8033D6
+:10049B0089828A83ECFAE493A3C8C582C8CCC5834E
+:1004AB00CCF0A3C8C582C8CCC583CCDFE9DEE7801E
+:1004BB000D89828A83E493A3F608DFF9ECFAA9F09D
+:1004CB00EDFB2289828A83ECFAE0A3C8C582C8CCF3
+:1004DB00C583CCF0A3C8C582C8CCC583CCDFEADE0C
+:1004EB00E880DB89828A83E493A3F208DFF980CC6E
+:1004FB0088F0EF60010E4E60C388F0ED2402B40467
+:10050B000050B9F582EB2402B4040050AF2323450D
+:06051B00822390047B73B3
+:10052100BB010CE58229F582E5833AF583E022508F
+:1005310006E92582F8E622BBFE06E92582F8E222D9
+:0D054100E58229F582E5833AF583E49322F3
+:10054E00F8BB010DE58229F582E5833AF583E8F0E3
+:10055E00225006E92582C8F622BBFE05E92582C88F
+:02056E00F22277
+:10057000EB9FF5F0EA9E42F0E99D42F0E89C45F0E1
+:010580002258
+:100581007401FF3395E0FEFDFC080808E6CF2FF665
+:1005910018E6CE3EF618E6CD3DF618E6CC3CF6223E
+:100A7B0002028DE493A3F8E493A34003F68001F202
+:100A8B0008DFF48029E493A3F85407240CC8C3337C
+:100A9B00C4540F4420C8834004F456800146F6DF4B
+:100AAB00E4800B0102040810204080900E38E47E95
+:100ABB00019360BCA3FF543F30E509541FFEE49340
+:100ACB00A360010ECF54C025E060A840B8E493A307
+:100ADB00FAE493A3F8E493A3C8C582C8CAC583CA32
+:100AEB00F0A3C8C582C8CAC583CADFE9DEE780BEEA
+:010E450000AC
+:00000001FF
+ \ No newline at end of file
diff --git a/xpp/utils/USB_8613.hex b/xpp/utils/USB_8613.hex
new file mode 100644
index 0000000..424c072
--- /dev/null
+++ b/xpp/utils/USB_8613.hex
@@ -0,0 +1,301 @@
+:100E0700000102030405060708090A0B0C0D0E0F63
+:080E1700410010004100110030
+:1009B80090E600E054E74410F000000090E604746C
+:1009C80080F00000007406F0000000E4F000000071
+:1009D80090E6107420F000000090E611F00000008E
+:1009E80090E61274A2F000000090E61374A0F000E4
+:1009F800000090E61474E2F000000090E61574E040
+:100A0800F000000090E6047480F00000007404F028
+:100A1800000000E4F000000090E6497482F0000055
+:100A280000F000000090E6187410F000000090E656
+:100A38001A7408F090E6917480F0000000F000004D
+:100A48000090E695F0000000F000000043AF01229E
+:1005B30078007C007D017BFF7A0E79077E007F1037
+:1005C30012050DC204E5AA30E2030206E9E5AA30EA
+:1005D300E7030206E975310075320490F400E02464
+:1005E300FE700302068024FA700302069C2407604F
+:1005F300030206C590FC007401F090F401E090FC46
+:1006030001F090F402E090FC02F0D2B690F401E025
+:10061300701AA3E0701630B01374C0120D2DC2B659
+:100623007F08120D33D2B67F08120D3330B04690D7
+:10063300E694E0FE90E695E07C002400FFEC3ECFDC
+:1006430024FCCF34FFFE7B017AF47904120AE450D0
+:100653001C90FC0330B4117408F07FE87E03120D84
+:10066300357403120D2D80667404F0806190FC03D1
+:100673007402F0805990FC037401F0805190FC00E7
+:100683007402F0E4A3F0A3F030B406A37410F08076
+:100693003D90FC037420F080357531007532119064
+:1006A300FC007408F07A007B007D017F50120D6B13
+:1006B3007F50120BB57AFC7B017D107F50120D4FDA
+:1006C300800C75310075320190FC0074AAF0E5319D
+:1006D30090E69CF0000000E53290E69DF0000000FB
+:0606E30090E6957480F022
+:0106E90022EE
+:0C0D2D0090E601F07F147E007D007C0049
+:100D39008F368E358D348C33783374FF120595ECEC
+:060D49004D4E4F70F32235
+:0A0AE4008E338F348B358A36893744
+:100AEE00E4F538F539C3E5399534E53895335033A7
+:100AFE00AB35AA36A937853982853883120533FF7F
+:100B0E00E4FEC2B2EF1392B7EFC313FFD2B20EBE22
+:100B1E0008F0C2B220B002C3220539E53970C6050D
+:040B2E003880C2D376
+:010B320022A0
+:02004100D322C8
+:02004E00D322BB
+:02005000D322B9
+:080E200090E6BAE0F51DD322B3
+:100DE30090E740E51DF0E490E68AF090E68B04F08E
+:020DF300D32209
+:080E280090E6BAE0F51CD322AC
+:100DF50090E740E51CF0E490E68AF090E68B04F07D
+:020E0500D322F6
+:0207FC00D32206
+:0207FE00D32204
+:0208FB00D32206
+:100CE00090E6B9E0242F600D04701990E604E0FF4F
+:100CF000430780800890E604E0FF53077F00000070
+:070D0000EFF08002D322C3D3
+:010D070022C9
+:100D8700C0E0C083C082D2015391EF90E65D740149
+:080D9700F0D082D083D0E032DD
+:100DB700C0E0C083C0825391EF90E65D7404F0D029
+:060DC70082D083D0E0326F
+:100DCD00C0E0C083C0825391EF90E65D7402F0D015
+:060DDD0082D083D0E03259
+:100BED00C0E0C083C08285100C85110D850D8285F6
+:100BFD000C83A37402F085080E85090F850F82857D
+:100C0D000E83A37407F05391EF90E65D7410F0D04E
+:060C1D0082D083D0E0321A
+:100D9F00C0E0C083C082D2035391EF90E65D740828
+:080DAF00F0D082D083D0E032C5
+:1008BE00C0E0C083C08290E680E030E72085080C5F
+:1008CE0085090D850D82850C83A37402F085100EAB
+:1008DE0085110F850F82850E83A37407F05391EF58
+:0D08EE0090E65D7420F0D082D083D0E0321F
+:01003200329B
+:01004A003283
+:01005200327B
+:0108FD0032C8
+:0108FE0032C7
+:0108FF0032C6
+:010E38003287
+:010E39003286
+:010E3A003285
+:010E3B003284
+:010E3C003283
+:010E3D003282
+:010E3E003281
+:010E3F003280
+:010E4000327F
+:010E4100327E
+:010E4200327D
+:010E4300327C
+:010E4400327B
+:010E4500327A
+:010E46003279
+:010E47003278
+:010E48003277
+:010E49003276
+:010E4A003275
+:010E4B003274
+:010E4C003273
+:010E4D003272
+:010E4E003271
+:010E4F003270
+:010E5000326F
+:010E5100326E
+:010E5200326D
+:010E5300326C
+:100B7900C0E0C083C08290E6D1E0900010F090E61A
+:100B8900D0E4F000000090E6D17402F000000053B8
+:100B990091BF00000090E66104F000000090E69922
+:0C0BA90004F075BB06D082D083D0E0328F
+:010E5400326B
+:0A07F20000010202030304040505E0
+:10028D00E4F52CF52BF52AF529C203C200C202C2F2
+:10029D0001D2B675B5C4D2B61209B8120E307E08A9
+:1002AD007F008E0A8F0B751208751312750808756D
+:1002BD00091C75100875114A751408751578EE54DA
+:1002CD00C07003020396752D00752E808E2F8F3012
+:1002DD00C374BC9FFF74089ECF2402CF3400FEE48C
+:1002ED008F288E27F526F525F524F523F522F52102
+:1002FD00AF28AE27AD26AC25AB24AA23A922A82171
+:10030D00C31205825031AE23AF24E5302FF582E5BF
+:10031D002F3EF583E0FDE52E2FF582E52D3EF5838D
+:10032D00EDF0EF2401F524E43EF523E43522F5222A
+:10033D00E43521F52180B9852D0A852E0B74002415
+:10034D0080FF740834FFFEC3E5139FF513E5129E7D
+:10035D00F512C3E50D9FF50DE50C9EF50CC3E50FEC
+:10036D009FF50FE50E9EF50EC3E5099FF509E5080E
+:10037D009EF508C3E5119FF511E5109EF510C3E537
+:10038D00159FF515E5149EF514D2E843D82090E697
+:10039D0068E0440BF090E65CE0443DF0000000E4C2
+:1003AD00F5A2000000D2AFD20412000390E680E067
+:1003BD0054F7F0538EF8C20390E6C2E054FBF00000
+:1003CD00000000000090E619E054FEF000000090DF
+:1003DD00E61BE054FEF000000090E6187410F000EB
+:1003ED00000090E61A740CF0000000000000000000
+:1003FD000090E6017403F01205B3300105120056AA
+:10040D00C2013003F212004150EDC203120D08205B
+:10041D00001690E682E030E704E020E1EF90E682FE
+:10042D00E030E604E020E0E4120C8912004E80C7B3
+:0B00360090E50DE030E402C322D3226D
+:1000560090E6B9E0700302011514700302019224C0
+:10006600FE700302021524FB700302010F147003D5
+:100076000201091470030200FD1470030201032437
+:10008600056003020279120050400302028590E6E1
+:10009600BBE024FE602A14603B24FD601114602A34
+:1000A60024067050E50A90E6B3F0E50B803C12009A
+:1000B60036503EE51290E6B3F0E513802D02027449
+:1000C600E50C90E6B3F0E50D8020E50E90E6B3F082
+:1000D600E50F801690E6BAE0FF120CB5AA06A9074E
+:1000E600EA49600DEE90E6B3F0EF90E6B4F0020256
+:1000F60085020274020274120DF5020285120E28A0
+:10010600020285120E20020285120DE302028512FA
+:1001160007FC400302028590E6B8E0247F601514D0
+:10012600601924027063A200E43325E0FFA202E412
+:10013600334F8041E490E740F0803F90E6BCE054C6
+:100146007EFF7E00E0D394807C0040047D01800227
+:100156007D00EC4EFEED4F24F2F58274073EF583EA
+:10016600E493FF3395E0FEEF24A1FFEE34E68F82A1
+:10017600F583E0540190E740F0E4A3F090E68AF0BE
+:1001860090E68B7402F00202850202741207FE40AA
+:100196000302028590E6B8E024FE6016240260039E
+:1001A60002028590E6BAE0B40105C20002028502A9
+:1001B600027490E6BAE0705590E6BCE0547EFF7E8D
+:1001C60000E0D394807C0040047D0180027D00EC39
+:1001D6004EFEED4F24F2F58274073EF583E493FF5D
+:1001E6003395E0FEEF24A1FFEE34E68F82F583E03F
+:1001F60054FEF090E6BCE05480131313541FFFE046
+:10020600540F2F90E683F0E04420F08072805F1256
+:1002160008FB506B90E6B8E024FE60192402704E8D
+:1002260090E6BAE0B40104D200805490E6BAE064E5
+:1002360002604C803990E6BCE0547EFF7E00E0D33D
+:1002460094807C0040047D0180027D00EC4EFEED32
+:100256004F24F2F58274073EF583E493FF3395E06D
+:10026600FEEF24A1FFEE34E68F82F583800D90E643
+:10027600A08008120CE0500790E6A0E04401F09040
+:06028600E6A0E04480F058
+:01028C00224F
+:0300330002004682
+:0400460053D8EF326A
+:100C890090E682E030E004E020E60B90E682E03076
+:100C9900E119E030E71590E680E04401F07F147E29
+:0C0CA90000120B3390E680E054FEF022B5
+:1000030030040990E680E0440AF0800790E680E03F
+:100013004408F07FDC7E05120B3390E65D74FFF03D
+:0F00230090E65FF05391EF90E680E054F7F02203
+:080E3000E4F51BD2E9D2AF2268
+:100BB500AD0790E678E020E6F9C2E990E678E044F2
+:100BC50080F0ED25E090E679F090E678E030E0F908
+:100BD50090E678E04440F090E678E020E6F990E68B
+:080BE50078E030E1D6D2E922EC
+:100C5700AC0790E678E020E6F9E51B702390E6788C
+:100C6700E04480F0EC25E090E679F08D16AF03A91B
+:100C7700077517018A188919E4F51A751B01D3221C
+:020C8700C32286
+:100C2300AC0790E678E020E6F9E51B702590E678BE
+:100C3300E04480F0EC25E0440190E679F08D16AFB6
+:100C430003A9077517018A188919E4F51A751B0397
+:040C5300D322C322C3
+:03004B000206EAC0
+:1006EA00C0E0C083C082C085C084C086758600C051
+:1006FA00D075D000C000C001C002C003C006C00748
+:10070A0090E678E030E206751B060207D490E67898
+:10071A00E020E10CE51B64026006751B070207D4A2
+:10072A00E51B24FE605F14603624FE70030207C5D1
+:10073A0024FC70030207D1240860030207D4AB1714
+:10074A00AA18A919AF1A051A8F82758300120533E0
+:10075A0090E679F0E51A65167070751B05806B9046
+:10076A00E679E0AB17AA18A919AE1A8E827583002A
+:10077A00120560751B02E5166401704E90E678E07A
+:10078A004420F08045E51624FEB51A0790E678E085
+:10079A004420F0E51614B51A0A90E678E04440F0D1
+:1007AA00751B0090E679E0AB17AA18A919AE1A8E44
+:1007BA0082758300120560051A800F90E678E0447E
+:1007CA0040F0751B008003751B005391DFD007D0E2
+:1007DA0006D003D002D001D000D0D0D086D084D0A9
+:0807EA0085D082D083D0E032FB
+:020CB500A9078D
+:100CB700AE14AF158F828E83A3E064037017AD0166
+:100CC70019ED7001228F828E83E07C002FFDEC3EB0
+:080CD700FEAF0580DFE4FEFF23
+:010CDF0022F2
+:100D4F00120C23E51B24FA600E146006240770F3BF
+:0C0D5F00D322E4F51BD322E4F51BD322C1
+:100D6B00120C57E51B24FA600E146006240770F36F
+:0C0D7B00D322E4F51BD322E4F51BD322A5
+:100D080090E682E044C0F090E681F043870100005D
+:040D180000000022B5
+:100B33008E318F3290E600E054187012E5322401B2
+:100B4300FFE43531C313F531EF13F532801590E629
+:100B530000E05418FFBF100BE53225E0F532E53114
+:100B630033F531E5321532AE31700215314E600581
+:060B7300120D1C80EE22B1
+:100D1C007400F58690FDA57C05A3E582458370F9EA
+:010D2C0022A4
+:03004300020900AF
+:030053000209009F
+:10090000020D8700020DCD00020DB700020D9F0001
+:10091000020BED000208BE000200320002004A0095
+:10092000020052000208FD000208FE000208FF005B
+:10093000020E3800020E3900020E3A00020E3B0091
+:10094000020E3C0002004A00020E3D00020E3E0074
+:10095000020E3F00020E4000020E4100020E420055
+:10096000020E430002004A0002004A0002004A0050
+:10097000020E4400020E4500020E4600020E470021
+:10098000020E4800020E4900020E4A00020E4B0001
+:10099000020E4C00020E4D00020E4E00020E4F00E1
+:1009A000020E5000020E5100020E5200020E5300C1
+:0809B000020B7900020E540055
+:100800001201000200000040E4E411220000010295
+:1008100000010A06000200000040010009022E004B
+:1008200001010080320904000004FF0000000705F8
+:10083000020200020007050402000200070586020A
+:100840000002000705880200020009022E000101D3
+:100850000080320904000004FF00000007050202C6
+:100860004000000705040240000007058602400022
+:10087000000705880240000004030904180358001B
+:100880006F00720063006F006D0020004C00740068
+:1008900064002E0028035800500044002800420045
+:1008A000610073006500640020006F006E0020008E
+:0E08B000410058005500500050002900000083
+:03000000020A5899
+:0C0A5800787FE4F6D8FD758139020A9F12
+:10043D00E709F608DFFA8046E709F208DFFA803EA1
+:10044D0088828C83E709F0A3DFFA8032E309F6088E
+:10045D00DFFA8078E309F208DFFA807088828C83F6
+:10046D00E309F0A3DFFA806489828A83E0A3F608AA
+:10047D00DFFA805889828A83E0A3F208DFFA804C84
+:10048D0080D280FA80C680D4806980F2803380105B
+:10049D0080A680EA809A80A880DA80E280CA8033C4
+:1004AD0089828A83ECFAE493A3C8C582C8CCC5833C
+:1004BD00CCF0A3C8C582C8CCC583CCDFE9DEE7800C
+:1004CD000D89828A83E493A3F608DFF9ECFAA9F08B
+:1004DD00EDFB2289828A83ECFAE0A3C8C582C8CCE1
+:1004ED00C583CCF0A3C8C582C8CCC583CCDFEADEFA
+:1004FD00E880DB89828A83E493A3F208DFF980CC5C
+:10050D0088F0EF60010E4E60C388F0ED2402B40454
+:10051D000050B9F582EB2402B4040050AF232345FB
+:06052D00822390048D738F
+:10053300BB010CE58229F582E5833AF583E022507D
+:1005430006E92582F8E622BBFE06E92582F8E222C7
+:0D055300E58229F582E5833AF583E49322E1
+:10056000F8BB010DE58229F582E5833AF583E8F0D1
+:10057000225006E92582C8F622BBFE05E92582C87D
+:02058000F22265
+:10058200EB9FF5F0EA9E42F0E99D42F0E89C45F0CF
+:010592002246
+:100593007401FF3395E0FEFDFC080808E6CF2FF653
+:1005A30018E6CE3EF618E6CD3DF618E6CC3CF6222C
+:100A640002028DE493A3F8E493A34003F68001F219
+:100A740008DFF48029E493A3F85407240CC8C33393
+:100A8400C4540F4420C8834004F456800146F6DF62
+:100A9400E4800B0102040810204080900E17E47ECD
+:100AA400019360BCA3FF543F30E509541FFEE49357
+:100AB400A360010ECF54C025E060A840B8E493A31E
+:100AC400FAE493A3F8E493A3C8C582C8CAC583CA49
+:100AD400F0A3C8C582C8CAC583CADFE9DEE780BE01
+:010E1F0000D2
+:00000001FF
diff --git a/xpp/utils/fpga_load.8 b/xpp/utils/fpga_load.8
new file mode 100644
index 0000000..09dd5aa
--- /dev/null
+++ b/xpp/utils/fpga_load.8
@@ -0,0 +1,72 @@
+.TH "FPGA_LOAD" "8" "16 April 2006" "" ""
+
+.SH NAME
+ztcfg \- reads and loads zaptel.conf
+.SH SYNOPSIS
+
+.B fpga_load
+[\fB-g\fR|\fB-d\fR] [\fB-v\fR] \fB-D\fR/proc/bus/usb/\fIBUS/DEV\fR
+
+.B fpga_load
+[\fB-g\fR] [\fB-v\fR] \fB-D\fR/proc/bus/usb/\fIBUS/DEV\fR \fB-I \fIfirmware.hex\fR [\fB-b \fIdump.bin\fR]
+
+.B fpga_load -h
+
+.SH DESCRIPTION
+.B fpga_load
+loads the FPGA firmware to the Xorcom Astribank device.
+The syntax resembles that of fxload(8).
+
+.SH OPTIONS
+.B -d
+.I dump.bin
+.RS
+Before writing firmware, bump the processed binary file to
+.I dump.bin\fR.
+.RE
+
+.B -d
+.RS
+Print Version number bytes from eeprom (to standard output). Implies -g.
+.RE
+
+.B -D
+.I DEVICE
+.RS
+Required. The device to read from/write to. This is normally
+/proc/bus/usb/\fIbus_num\fR/\fIdevice_num\fR , where \fIbus_num\fR and
+\fIdevice_num\fR are the first two numbers in the output of lsusb(8).
+.RE
+
+.B -g
+.RS
+Dump all eeprom data to standard error.
+.RE
+
+.B -I
+.I fireware_file
+.RS
+The firmware file to write to the device.
+.RE
+
+.B -v
+.RS
+Be verobse.
+.RE
+
+.B -h
+.RS
+Displays usage message.
+.RE
+
+.SH SEE ALSO
+fxload(8), lsusb(8)
+
+.SH AUTHOR
+This manual page was written by Tzafrir Cohen <tzafrir.cohen@xorcom.com> .
+Permission is granted to copy, distribute and/or modify this document under
+the terms of the GNU General Public License, Version 2 any
+later version published by the Free Software Foundation.
+
+On Debian systems, the complete text of the GNU General Public
+License can be found in /usr/share/common-licenses/GPL.
diff --git a/xpp/utils/fpga_load.c b/xpp/utils/fpga_load.c
new file mode 100644
index 0000000..cf20226
--- /dev/null
+++ b/xpp/utils/fpga_load.c
@@ -0,0 +1,710 @@
+#include <stdio.h>
+#include <assert.h>
+#include <string.h>
+#include <stdint.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/param.h>
+#include <usb.h>
+#include "hexfile.h"
+
+#define XORCOM_INTERNAL
+
+static const char rcsid[] = "$Id$";
+
+#define ERR(fmt, arg...) fprintf(stderr, "%s: ERROR: " fmt, progname, ## arg)
+#define INFO(fmt, arg...) fprintf(stderr, "%s: " fmt, progname, ## arg)
+
+static int verbose = LOG_WARNING;
+static char *progname;
+
+#define MAX_HEX_LINES 2000
+#define PACKET_SIZE 512
+#define EEPROM_SIZE 16
+#define SERIAL_SIZE 8
+
+enum fpga_load_packet_types {
+ STATUS_REPLY = 0x01,
+ DATA_PACKET = 0x01,
+#ifdef XORCOM_INTERNAL
+ EEPROM_SET = 0x04,
+#endif
+ EEPROM_GET = 0x08,
+ RENUMERATE = 0x10,
+ BAD_COMMAND = 0xAA
+};
+
+struct myeeprom {
+ uint8_t source;
+ uint16_t vendor;
+ uint16_t product;
+ uint8_t release_major;
+ uint8_t release_minor;
+ uint8_t reserved;
+ uint8_t serial[SERIAL_SIZE];
+} PACKED;
+
+struct fpga_packet_header {
+ struct {
+ uint8_t op;
+ } PACKED header;
+ union {
+ struct {
+ uint16_t seq;
+ uint8_t status;
+ } PACKED status_reply;
+ struct {
+ uint16_t seq;
+ uint8_t reserved;
+ uint8_t data[ZERO_SIZE];
+ } PACKED data_packet;
+ struct {
+ struct myeeprom data;
+ } PACKED eeprom_set;
+ struct {
+ struct myeeprom data;
+ } PACKED eeprom_get;
+ } d;
+} PACKED;
+
+enum fpga_load_status {
+ FW_FAIL_RESET = 1,
+ FW_FAIL_TRANS = 2,
+ FW_TRANS_OK = 4,
+ FW_CONFIG_DONE = 8
+};
+
+int my_usb_device(struct usb_device *dev, usb_dev_handle *handle);
+
+const char *load_status2str(enum fpga_load_status s)
+{
+ switch(s) {
+ case FW_FAIL_RESET: return "FW_FAIL_RESET";
+ case FW_FAIL_TRANS: return "FW_FAIL_TRANS";
+ case FW_TRANS_OK: return "FW_TRANS_OK";
+ case FW_CONFIG_DONE: return "FW_CONFIG_DONE";
+ default: return "UNKNOWN";
+ }
+}
+
+int path_of_dev(char buf[], unsigned int buflen, struct usb_device *dev)
+{
+ return snprintf(buf, buflen, "/proc/bus/usb/%s/%s", dev->bus->dirname, dev->filename);
+}
+
+struct usb_device *dev_of_path(const char *path)
+{
+ struct usb_bus *bus;
+ struct usb_device *dev;
+ char dirname[PATH_MAX];
+ char filename[PATH_MAX];
+ const char prefix[] = "/proc/bus/usb/";
+ const int prefix_len = strlen(prefix);
+ const char *p;
+ int bnum;
+ int dnum;
+ int ret;
+
+ assert(path != NULL);
+ if(strncmp(prefix, path, prefix_len) != 0) {
+ ERR("wrong path: '%s'\n", path);
+ return NULL;
+ }
+ p = path + prefix_len;
+ ret = sscanf(p, "%d/%d", &bnum, &dnum);
+ if(ret != 2) {
+ ERR("wrong path tail: '%s'\n", p);
+ return NULL;
+ }
+ sprintf(dirname, "%03d", bnum);
+ sprintf(filename, "%03d", dnum);
+ for (bus = usb_busses; bus; bus = bus->next) {
+ if(strcmp(bus->dirname, dirname) != 0)
+ continue;
+ for (dev = bus->devices; dev; dev = dev->next) {
+ if(strcmp(dev->filename, filename) == 0)
+ return dev;
+ }
+ }
+ ERR("no usb device match '%s'\n", path);
+ return NULL;
+}
+
+int get_usb_string(char *buf, unsigned int len, uint16_t item, usb_dev_handle *handle)
+{
+ char tmp[BUFSIZ];
+ int ret;
+
+ if (!item)
+ return 0;
+ ret = usb_get_string_simple(handle, item, tmp, BUFSIZ);
+ if (ret <= 0)
+ return ret;
+ return snprintf(buf, len, "%s", tmp);
+}
+
+/* My device parameters */
+#define MY_INTERFACE 0
+#define MY_CONFIG 1
+#define MY_ENDPOINTS 4
+
+#define MY_EP_OUT 0x04
+#define MY_EP_IN 0x88
+
+#define TIMEOUT 5000
+
+static const int my_endpoints[MY_ENDPOINTS] = {
+ 0x02,
+ 0x04,
+ 0x86,
+ 0x88
+};
+
+void usb_cleanup(usb_dev_handle *handle)
+{
+ if(usb_release_interface(handle, MY_INTERFACE) != 0) {
+ ERR("Releasing interface: usb: %s\n", usb_strerror());
+ }
+ if(usb_close(handle) != 0) {
+ ERR("Closing device: usb: %s\n", usb_strerror());
+ }
+}
+
+void print_bcd_ver(const struct myeeprom *eeprom)
+{
+ /* In this case, print only the version. Also note that this
+ * is an output, and sent to stdout
+ */
+ printf("%d.%03d\n", eeprom->release_major, eeprom->release_minor);
+ return;
+}
+
+void dump_eeprom(const struct myeeprom *eeprom)
+{
+ const uint8_t *data = eeprom->serial;
+
+ INFO("Source: 0x%02X\n", eeprom->source);
+ INFO("Vendor: 0x%04X\n", eeprom->vendor);
+ INFO("Product: 0x%04X\n", eeprom->product);
+ INFO("Release: %d.%03d\n", eeprom->release_major, eeprom->release_minor);
+ INFO("Data: 0x[%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X]\n",
+ data[0], data[1], data[2], data[3],
+ data[4], data[5], data[6], data[7]);
+}
+
+void dump_packet(const char *buf, int len)
+{
+ int i;
+
+ for(i = 0; i < len; i++)
+ INFO("dump: %2d> 0x%02X\n", i, (uint8_t)buf[i]);
+}
+
+#ifdef XORCOM_INTERNAL
+int eeprom_set(struct usb_dev_handle *handle, const struct myeeprom *eeprom)
+{
+ int ret;
+ int len;
+ char buf[PACKET_SIZE];
+ struct fpga_packet_header *phead = (struct fpga_packet_header *)buf;
+
+ if(verbose >= LOG_INFO)
+ INFO("%s Start...\n", __FUNCTION__);
+ assert(handle != NULL);
+ phead->header.op = EEPROM_SET;
+ memcpy(&phead->d.eeprom_set.data, eeprom, EEPROM_SIZE);
+ len = sizeof(phead->d.eeprom_set) + sizeof(phead->header.op);
+ if(verbose >= LOG_INFO) {
+ INFO("%s write %d bytes\n", __FUNCTION__, len);
+ dump_packet((char *)phead, len);
+ }
+ ret = usb_bulk_write(handle, MY_EP_OUT, (char *)phead, len, TIMEOUT);
+ if(ret < 0) {
+ ERR("usb: bulk_write failed (%d)\n", ret);
+ return ret;
+ } else if(ret != len) {
+ ERR("usb: bulk_write short write (%d)\n", ret);
+ return -EFAULT;
+ }
+ ret = usb_bulk_read(handle, MY_EP_IN, buf, sizeof(buf), TIMEOUT);
+ if(ret < 0) {
+ ERR("usb: bulk_read failed (%d)\n", ret);
+ return ret;
+ } else if(ret == 0)
+ return 0;
+ phead = (struct fpga_packet_header *)buf;
+ if(phead->header.op == BAD_COMMAND) {
+ ERR("BAD_COMMAND\n");
+ return -EINVAL;
+ } else if(phead->header.op != EEPROM_SET) {
+ ERR("Got unexpected reply op=%d\n", phead->header.op);
+ return -EINVAL;
+ }
+ if(verbose >= LOG_INFO) {
+ INFO("%s read %d bytes\n", __FUNCTION__, ret);
+ dump_packet(buf, ret);
+ }
+ return 0;
+}
+#endif
+
+int eeprom_get(struct usb_dev_handle *handle, struct myeeprom *eeprom)
+{
+ int ret;
+ int len;
+ char buf[PACKET_SIZE];
+ struct fpga_packet_header *phead = (struct fpga_packet_header *)buf;
+
+ assert(handle != NULL);
+ if(verbose >= LOG_INFO)
+ INFO("%s Start...\n", __FUNCTION__);
+ phead->header.op = EEPROM_GET;
+ len = sizeof(phead->header.op); /* warning: sending small packet */
+ if(verbose >= LOG_INFO) {
+ INFO("%s write %d bytes\n", __FUNCTION__, len);
+ dump_packet(buf, len);
+ }
+ ret = usb_bulk_write(handle, MY_EP_OUT, (char *)phead, len, TIMEOUT);
+ if(ret < 0) {
+ ERR("usb: bulk_write failed (%d)\n", ret);
+ return ret;
+ } else if(ret != len) {
+ ERR("usb: bulk_write short write (%d)\n", ret);
+ return -EFAULT;
+ }
+ ret = usb_bulk_read(handle, MY_EP_IN, buf, sizeof(buf), TIMEOUT);
+ if(ret < 0) {
+ ERR("usb: bulk_read failed (%d)\n", ret);
+ return ret;
+ } else if(ret == 0)
+ return 0;
+ phead = (struct fpga_packet_header *)buf;
+ if(phead->header.op == BAD_COMMAND) {
+ ERR("BAD_COMMAND\n");
+ return -EINVAL;
+ } else if(phead->header.op != EEPROM_GET) {
+ ERR("Got unexpected reply op=%d\n", phead->header.op);
+ return -EINVAL;
+ }
+ if(verbose >= LOG_INFO) {
+ INFO("%s read %d bytes\n", __FUNCTION__, ret);
+ dump_packet(buf, ret);
+ }
+ memcpy(eeprom, &phead->d.eeprom_get.data, EEPROM_SIZE);
+ return 0;
+}
+
+int send_hexline(struct usb_dev_handle *handle, struct hexline *hexline, int seq)
+{
+ int ret;
+ int len;
+ uint8_t *data;
+ char buf[PACKET_SIZE];
+ struct fpga_packet_header *phead = (struct fpga_packet_header *)buf;
+ enum fpga_load_status status;
+
+ assert(handle != NULL);
+ assert(hexline != NULL);
+ len = hexline->d.content.header.ll; /* don't send checksum */
+ data = hexline->d.content.tt_data.data;
+ if(hexline->d.content.header.tt != TT_DATA) {
+ ERR("Bad record %d type = %d\n", seq, hexline->d.content.header.tt);
+ return -EINVAL;
+ }
+ phead->header.op = DATA_PACKET;
+ phead->d.data_packet.seq = seq;
+ phead->d.data_packet.reserved = 0x00;
+ memcpy(phead->d.data_packet.data, data, len);
+ len += sizeof(phead);
+ if(verbose >= LOG_INFO)
+ INFO("%04d+\r", seq);
+ ret = usb_bulk_write(handle, MY_EP_OUT, (char *)phead, len, TIMEOUT);
+ if(ret < 0) {
+ ERR("usb: bulk_write failed (%d)\n", ret);
+ return ret;
+ } else if(ret != len) {
+ ERR("usb: bulk_write short write (%d)\n", ret);
+ return -EFAULT;
+ }
+ ret = usb_bulk_read(handle, MY_EP_IN, buf, sizeof(buf), TIMEOUT);
+ if(ret < 0) {
+ ERR("usb: bulk_read failed (%d)\n", ret);
+ return ret;
+ } else if(ret == 0)
+ return 0;
+ if(verbose >= LOG_INFO)
+ INFO("%04d-\r", seq);
+ phead = (struct fpga_packet_header *)buf;
+ if(phead->header.op != STATUS_REPLY) {
+ ERR("Got unexpected reply op=%d\n", phead->header.op);
+ return -EINVAL;
+ }
+ status = (enum fpga_load_status)phead->d.status_reply.status;
+ switch(status) {
+ case FW_TRANS_OK:
+ case FW_CONFIG_DONE:
+ break;
+ case FW_FAIL_RESET:
+ case FW_FAIL_TRANS:
+ ERR("status reply %s (%d)\n", load_status2str(status), status);
+ if(verbose >= LOG_INFO)
+ dump_packet(buf, ret);
+ return -EPROTO;
+ default:
+ ERR("Unknown status reply %d\n", status);
+ if(verbose >= LOG_INFO)
+ dump_packet(buf, ret);
+ return -EPROTO;
+ }
+ return 0;
+}
+
+int my_usb_device(struct usb_device *dev, usb_dev_handle *handle)
+{
+ struct usb_device_descriptor *dev_desc;
+ struct usb_config_descriptor *config_desc;
+ struct usb_interface *interface;
+ struct usb_interface_descriptor *iface_desc;
+ struct usb_endpoint_descriptor *endpoint;
+ char iManufacturer[BUFSIZ];
+ char iProduct[BUFSIZ];
+ int ret;
+ int i;
+
+ assert(dev != NULL);
+ dev_desc = &dev->descriptor;
+ config_desc = dev->config;
+ interface = config_desc->interface;
+ iface_desc = interface->altsetting;
+ if(verbose >= LOG_INFO)
+ INFO("Vendor:Product=%04X:%04X Class=%d (endpoints=%d)\n",
+ dev_desc->idVendor, dev_desc->idProduct, dev_desc->bDeviceClass, iface_desc->bNumEndpoints);
+ if(iface_desc->bInterfaceClass != 0xFF) {
+ ERR("Wrong Interface class %d\n", iface_desc->bInterfaceClass);
+ return -EINVAL;
+ }
+ if(iface_desc->bInterfaceNumber != MY_INTERFACE) {
+ ERR("Wrong Interface number %d\n", iface_desc->bInterfaceNumber);
+ return -EINVAL;
+ }
+ if(iface_desc->bNumEndpoints != MY_ENDPOINTS) {
+ ERR("Wrong number of endpoints: %d\n", iface_desc->bNumEndpoints);
+ return -EINVAL;
+ }
+ endpoint = iface_desc->endpoint;
+ for(i = 0; i < iface_desc->bNumEndpoints; i++, endpoint++) {
+ if(endpoint->bEndpointAddress != my_endpoints[i]) {
+ ERR("Wrong endpoint %d: address = 0x%X\n", i, endpoint->bEndpointAddress);
+ return -EINVAL;
+ }
+ if(endpoint->bEndpointAddress == MY_EP_OUT || endpoint->bEndpointAddress == MY_EP_IN) {
+ if(endpoint->wMaxPacketSize > PACKET_SIZE) {
+ ERR("Endpoint #%d wMaxPacketSize too large (%d)\n", i, endpoint->wMaxPacketSize);
+ return -EINVAL;
+ }
+ }
+ }
+ if(usb_reset(handle) != 0) {
+ ERR("Reseting device: usb: %s\n", usb_strerror());
+ }
+ if(usb_set_configuration(handle, MY_CONFIG) != 0) {
+ ERR("usb: %s\n", usb_strerror());
+ return -EINVAL;
+ }
+ if(usb_claim_interface(handle, MY_INTERFACE) != 0) {
+ ERR("usb: %s\n", usb_strerror());
+ return -EINVAL;
+ }
+ if(usb_resetep(handle, MY_EP_OUT) != 0) {
+ ERR("usb: %s\n", usb_strerror());
+ return -EINVAL;
+ }
+ if(usb_resetep(handle, MY_EP_IN) != 0) {
+ ERR("usb: %s\n", usb_strerror());
+ return -EINVAL;
+ }
+ ret = get_usb_string(iManufacturer, BUFSIZ, dev_desc->iManufacturer, handle);
+ ret = get_usb_string(iProduct, BUFSIZ, dev_desc->iProduct, handle);
+ if(verbose >= LOG_INFO)
+ INFO("iManufacturer=%s iProduct=%s\n", iManufacturer, iProduct);
+ return 0;
+}
+
+int renumerate_device(struct usb_dev_handle *handle)
+{
+ char buf[PACKET_SIZE];
+ struct fpga_packet_header *phead = (struct fpga_packet_header *)buf;
+ int ret;
+
+ assert(handle != NULL);
+ if(verbose >= LOG_INFO)
+ INFO("Renumerating\n");
+ phead->header.op = RENUMERATE;
+ ret = usb_bulk_write(handle, MY_EP_OUT, (char *)phead, 1, TIMEOUT);
+ if(ret < 0) {
+ ERR("usb: bulk_write failed (%d)\n", ret);
+ return ret;
+ } else if(ret != 1) {
+ ERR("usb: bulk_write short write (%d)\n", ret);
+ return -EFAULT;
+ }
+ return 0;
+}
+
+int fpga_load(struct usb_dev_handle *handle, const struct hexdata *hexdata)
+{
+ unsigned int i;
+ int ret;
+ int finished = 0;
+
+ assert(handle != NULL);
+ if(verbose >= LOG_INFO)
+ INFO("Start...\n");
+ for(i = 0; i < hexdata->maxlines; i++) {
+ struct hexline *hexline = hexdata->lines[i];
+
+ if(!hexline)
+ break;
+ if(finished) {
+ ERR("Extra data after End Of Data Record (line %d)\n", i);
+ return 0;
+ }
+ if(hexline->d.content.header.tt == TT_EOF) {
+ INFO("End of data\n");
+ finished = 1;
+ continue;
+ }
+ if((ret = send_hexline(handle, hexline, i)) != 0) {
+ perror("Failed sending hexline");
+ return 0;
+ }
+ }
+ if(verbose >= LOG_INFO)
+ INFO("Finished...\n");
+ return 1;
+}
+
+#include <getopt.h>
+
+void usage()
+{
+ fprintf(stderr, "Usage: %s -D /proc/bus/usb/<bus>/<dev> [options...]\n", progname);
+ fprintf(stderr, "\tOptions:\n");
+ fprintf(stderr, "\t\t[-b <binfile>] # output to <binfile>\n");
+ fprintf(stderr, "\t\t[-d] # Get device version from eeprom\n");
+ fprintf(stderr, "\t\t[-I <hexfile>] # Input from <hexfile>\n");
+ fprintf(stderr, "\t\t[-g] # Get eeprom from device\n");
+ fprintf(stderr, "\t\t[-V vendorid] # Set Vendor id on device\n");
+ fprintf(stderr, "\t\t[-P productid] # Set Product id on device\n");
+ fprintf(stderr, "\t\t[-R release] # Set Release. 2 dot separated decimals\n");
+ fprintf(stderr, "\t\t[-S serial] # Set Serial. 8 comma separated numbers\n");
+ exit(1);
+}
+
+static void parse_report_func(int level, const char *msg, ...)
+{
+ va_list ap;
+
+ va_start(ap, msg);
+ if(level <= verbose)
+ vfprintf(stderr, msg, ap);
+ va_end(ap);
+}
+
+
+int main(int argc, char *argv[])
+{
+ struct usb_device *dev;
+ usb_dev_handle *handle;
+ const char *devpath = NULL;
+ const char *binfile = NULL;
+ const char *hexfile = NULL;
+ struct hexdata *hexdata = NULL;
+ struct myeeprom eeprom_buf;
+ int opt_read_eeprom = 0;
+ int opt_print_bcdver_only = 0;
+#ifdef XORCOM_INTERNAL
+ int opt_write_eeprom = 0;
+ char *vendor = NULL;
+ char *product = NULL;
+ char *release = NULL;
+ char *serial = NULL;
+ uint8_t serial_buf[SERIAL_SIZE];
+ const char options[] = "b:dD:ghI:vV:P:R:S:";
+#else
+ const char options[] = "b:dD:ghI:v";
+#endif
+ int ret = 0;
+
+ progname = argv[0];
+ assert(sizeof(struct fpga_packet_header) <= PACKET_SIZE);
+ assert(sizeof(struct myeeprom) == EEPROM_SIZE);
+ while (1) {
+ int c;
+
+ c = getopt (argc, argv, options);
+ if (c == -1)
+ break;
+
+ switch (c) {
+ case 'D':
+ devpath = optarg;
+ break;
+ case 'b':
+ binfile = optarg;
+ break;
+ case 'd':
+ opt_print_bcdver_only = 1;
+ opt_read_eeprom = 1;
+ break;
+ case 'g':
+ opt_read_eeprom = 1;
+ break;
+ case 'I':
+ hexfile = optarg;
+ break;
+#ifdef XORCOM_INTERNAL
+ case 'V':
+ vendor = optarg;
+ break;
+ case 'P':
+ product = optarg;
+ break;
+ case 'R':
+ release = optarg;
+ break;
+ case 'S':
+ serial = optarg;
+ {
+ int i;
+ char *p;
+ unsigned long val;
+
+ p = strtok(serial, ",");
+ for(i = 0; i < SERIAL_SIZE && p; i++) {
+ val = strtoul(p, NULL, 0);
+ if(val > 0xFF) {
+ ERR("Value #%d for -S option is too large (%lu)\n", i+1, val);
+ usage();
+ }
+ serial_buf[i] = val;
+ p = strtok(NULL, ",");
+ }
+ if(i < SERIAL_SIZE) {
+ ERR("got only %d values for -S option. Need %d\n", i, SERIAL_SIZE);
+ usage();
+ }
+ }
+
+ break;
+#endif
+ case 'v':
+ verbose++;
+ break;
+ case 'h':
+ default:
+ ERR("Unknown option '%c'\n", c);
+ usage();
+ }
+ }
+
+ if (optind != argc) {
+ usage();
+ }
+ if(hexfile) {
+ parse_hexfile_set_reporting(parse_report_func);
+ hexdata = parse_hexfile(hexfile, MAX_HEX_LINES);
+ if(!hexdata) {
+ ERR("Bailing out\n");
+ exit(1);
+ }
+ if(binfile) {
+ dump_binary(hexdata, binfile);
+ return 0;
+ }
+ }
+ if(!devpath) {
+ ERR("Missing device path\n");
+ usage();
+ }
+ if(verbose)
+ INFO("Startup %s\n", devpath);
+
+ usb_init();
+ usb_find_busses();
+ usb_find_devices();
+ dev = dev_of_path(devpath);
+ if(!dev) {
+ ERR("Bailing out\n");
+ exit(1);
+ }
+ handle = usb_open(dev);
+ if(!handle) {
+ ERR("Failed to open usb device '%s/%s': %s\n", dev->bus->dirname, dev->filename, usb_strerror());
+ return -ENODEV;
+ }
+ if(my_usb_device(dev, handle)) {
+ ERR("Foreign usb device '%s/%s'\n", dev->bus->dirname, dev->filename);
+ ret = -ENODEV;
+ goto dev_err;
+ }
+ if(hexdata) {
+ if(!fpga_load(handle, hexdata)) {
+ ERR("FPGA loading failed\n");
+ ret = -ENODEV;
+ goto dev_err;
+ }
+ ret = renumerate_device(handle);
+ if(ret < 0) {
+ ERR("Renumeration failed: errno=%d\n", ret);
+ goto dev_err;
+ }
+ }
+#ifdef XORCOM_INTERNAL
+ if(vendor || product || release || serial)
+ opt_read_eeprom = opt_write_eeprom = 1;
+#endif
+ if(opt_read_eeprom) {
+ ret = eeprom_get(handle, &eeprom_buf);
+ if(ret < 0) {
+ ERR("Failed reading eeprom: %d\n", ret);
+ goto dev_err;
+ }
+ if (opt_print_bcdver_only)
+ print_bcd_ver(&eeprom_buf);
+ else
+ dump_eeprom(&eeprom_buf);
+ }
+#ifdef XORCOM_INTERNAL
+ if(opt_write_eeprom) {
+ // FF: address source is from device. C0: from eeprom
+ eeprom_buf.source = 0xC0;
+ if(vendor)
+ eeprom_buf.vendor = strtoul(vendor, NULL, 0);
+ if(product)
+ eeprom_buf.product = strtoul(product, NULL, 0);
+ if(release) {
+ int release_major = 0;
+ int release_minor = 0;
+
+ sscanf(release, "%d.%d", &release_major, &release_minor);
+ eeprom_buf.release_major = release_major;
+ eeprom_buf.release_minor = release_minor;
+ }
+ if(serial) {
+ memcpy(eeprom_buf.serial, serial_buf, SERIAL_SIZE);
+ }
+ dump_eeprom(&eeprom_buf);
+ ret = eeprom_set(handle, &eeprom_buf);
+ if(ret < 0) {
+ ERR("Failed writing eeprom: %d\n", ret);
+ goto dev_err;
+ }
+ }
+#endif
+ if(verbose)
+ INFO("Exiting\n");
+dev_err:
+ usb_cleanup(handle);
+ return ret;
+}
diff --git a/xpp/utils/hexfile.c b/xpp/utils/hexfile.c
new file mode 100644
index 0000000..e228517
--- /dev/null
+++ b/xpp/utils/hexfile.c
@@ -0,0 +1,297 @@
+/*
+ * Written by Oron Peled <oron@actcom.co.il>
+ * Copyright (C) 2006, Xorcom
+ *
+ * All rights reserved.
+ *
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#include <stdio.h>
+#include <assert.h>
+#include <string.h>
+#include <stdlib.h>
+#include <errno.h>
+#include "hexfile.h"
+
+static const char rcsid[] = "$Id:$";
+
+static parse_hexfile_report_func_t report_func = NULL;
+
+parse_hexfile_report_func_t parse_hexfile_set_reporting(parse_hexfile_report_func_t rf)
+{
+ parse_hexfile_report_func_t old_rf = report_func;
+ report_func = rf;
+ return old_rf;
+}
+
+static void chomp(char buf[])
+{
+ size_t last = strlen(buf) - 1;
+ while(last >= 0 && (buf[last] == '\n' || buf[last] == '\r'))
+ buf[last--] = '\0';
+}
+
+int checksum(struct hexline *hexline)
+{
+ unsigned int i;
+ unsigned int chksm = 0;
+ int ll = hexline->d.content.header.ll;
+
+ for(i = 0; i <= sizeof(hexline->d.content.header) + ll; i++) {
+ chksm += hexline->d.raw[i];
+ }
+ return chksm & 0xFF;
+}
+
+static int update_hexline(struct hexdata *hexdata, char *buf)
+{
+ int ret;
+ unsigned int ll, offset, tt;
+ char *p;
+ struct hexline *hexline;
+ unsigned int i;
+ int allocsize;
+ unsigned int last_line = hexdata->last_line;
+
+ if(hexdata->got_eof) {
+ if(report_func)
+ report_func(LOG_ERR, "Extranous data after EOF record\n");
+ return -EINVAL;
+ }
+ if(last_line >= hexdata->maxlines) {
+ if(report_func)
+ report_func(LOG_ERR, "Hexfile too large (maxline %d)\n", hexdata->maxlines);
+ return -ENOMEM;
+ }
+ ret = sscanf(buf, "%02X%04X%02X", &ll, &offset, &tt);
+ if(ret != 3) {
+ if(report_func)
+ report_func(LOG_ERR, "Bad line header (only %d items out of 3 parsed)\n", ret);
+ return -EINVAL;
+ }
+ switch(tt) {
+ case TT_DATA:
+ break;
+ case TT_EOF:
+ if(ll != 0) {
+ if(report_func)
+ report_func(LOG_ERR, "Bad EOF record len = %d\n", ll);
+ return -EINVAL;
+ }
+ if(offset != 0) {
+ if(report_func)
+ report_func(LOG_ERR, "Bad EOF record offset = %d\n", offset);
+ return -EINVAL;
+ }
+ hexdata->got_eof = 1;
+ break;
+ case TT_EXT_SEG: /* Unimplemented */
+ case TT_START_SEG: /* Unimplemented */
+ case TT_EXT_LIN: /* Unimplemented */
+ case TT_START_LIN: /* Unimplemented */
+ return 1;
+ default:
+ if(report_func)
+ report_func(LOG_ERR, "Unknown record type %d\n", tt);
+ return -EINVAL;
+ }
+ buf += 8; /* Skip header */
+ ll++; /* include the checksum for now */
+ allocsize = sizeof(struct hexline) + ll;
+ if((hexline = (struct hexline *)malloc(allocsize)) == NULL) {
+ if(report_func)
+ report_func(LOG_ERR, "No more memory for hexfile lines\n");
+ return -EINVAL;
+ }
+ memset(hexline, 0, allocsize);
+ hexline->d.content.header.ll = ll;
+ hexline->d.content.header.offset = offset;
+ hexline->d.content.header.tt = tt;
+ hexdata->lines[last_line++] = hexline;
+ p = buf;
+ for(i = 0; i < ll; i++) {
+ unsigned int val;
+
+ if((*p == '\0') || (*(p+1) == '\0')) {
+ if(report_func)
+ report_func(LOG_ERR, "Short data string '%s'\n", buf);
+ return -EINVAL;
+ }
+ ret = sscanf(p, "%02X", &val);
+ if(ret != 1) {
+ if(report_func)
+ report_func(LOG_ERR, "Bad data byte #%d\n", i);
+ return -EINVAL;
+ }
+ hexline->d.content.tt_data.data[i] = val;
+ p += 2;
+ }
+ hexline->d.content.header.ll--; /* Fix the checksum */
+ if(checksum(hexline) != 0) {
+ if(report_func)
+ report_func(LOG_ERR, "Bad checksum\n");
+ return -EINVAL;
+ }
+ if(hexdata->got_eof)
+ return 0;
+ hexdata->last_line++;
+ return 1;
+}
+
+void free_hexdata(struct hexdata *hexdata)
+{
+ if(hexdata) {
+ unsigned int i;
+
+ for(i = 0; i < hexdata->maxlines; i++)
+ if(hexdata->lines[i] != NULL)
+ free(hexdata->lines[i]);
+ free(hexdata);
+ }
+}
+
+int dump_hexfile(struct hexdata *hexdata, FILE *outfile)
+{
+ uint8_t ll;
+ uint16_t offset;
+ uint8_t tt;
+ uint8_t old_chksum;
+ uint8_t new_chksum;
+ uint8_t *data;
+ unsigned int i;
+ unsigned int j;
+
+ for(i = 0; i <= hexdata->last_line; i++) {
+ struct hexline *line = hexdata->lines[i];
+ if(!line) {
+ if(report_func)
+ report_func(LOG_ERR, "Missing line at #%d\n", i);
+ return -EINVAL;
+ }
+ ll = line->d.content.header.ll;
+ offset = line->d.content.header.offset;
+ tt = line->d.content.header.tt;
+ fprintf(outfile, ":%02X%04X%02X", ll, offset, tt);
+ data = line->d.content.tt_data.data;
+ for(j = 0; j < ll; j++) {
+ fprintf(outfile, "%02X", data[j]);
+ }
+ old_chksum = data[ll];
+ data[ll] = 0;
+ new_chksum = 0xFF - checksum(line) + 1;
+ data[ll] = old_chksum;
+ assert(new_chksum == old_chksum);
+ fprintf(outfile, "%02X\n", new_chksum);
+ }
+ return 0;
+}
+
+struct hexdata *parse_hexfile(const char *fname, unsigned int maxlines)
+{
+ FILE *fp;
+ struct hexdata *hexdata = NULL;
+ int datasize;
+ char buf[BUFSIZ];
+ int line;
+ int ret;
+
+ assert(fname != NULL);
+ if(report_func)
+ report_func(LOG_INFO, "Parsing %s\n", fname);
+ datasize = sizeof(struct hexdata) + maxlines * sizeof(char *);
+ hexdata = (struct hexdata *)malloc(datasize);
+ if(!hexdata) {
+ if(report_func)
+ report_func(LOG_ERR, "Failed to allocate %d bytes for hexfile contents\n", datasize);
+ goto err;
+ }
+ memset(hexdata, 0, datasize);
+ hexdata->maxlines = maxlines;
+ if((fp = fopen(fname, "r")) == NULL) {
+ if(report_func)
+ report_func(LOG_ERR, "Failed to open hexfile '%s'\n", fname);
+ goto err;
+ }
+ line = 0;
+ while(fgets(buf, BUFSIZ, fp)) {
+ line++;
+ if(buf[0] == '\0') {
+ if(report_func)
+ report_func(LOG_ERR, "Short line at %s:%d\n", fname, line);
+ goto err;
+ }
+ chomp(buf);
+ if(buf[0] == '#') {
+ if(report_func)
+ report_func(LOG_INFO, "Comment '%s'\n", buf + 1);
+ continue;
+ }
+ if(buf[0] != ':') {
+ if(report_func)
+ report_func(LOG_ERR, "Line begins with 0x%X at %s:%d\n", buf[0], fname, line);
+ goto err;
+ }
+ if((ret = update_hexline(hexdata, buf + 1)) < 0) {
+ if(report_func)
+ report_func(LOG_ERR, "Failed parsing line %s:%d\n", fname, line);
+ goto err;
+ }
+ }
+ fclose(fp);
+ if(report_func)
+ report_func(LOG_INFO, "%s parsed OK\n", fname);
+ return hexdata;
+err:
+ free_hexdata(hexdata);
+ return NULL;
+}
+
+void dump_binary(struct hexdata *hexdata, const char *outfile)
+{
+ FILE *fp;
+ unsigned int i;
+ size_t len;
+
+ if(report_func)
+ report_func(LOG_INFO, "Dumping binary data into '%s'\n", outfile);
+ if((fp = fopen(outfile, "w")) == NULL) {
+ perror(outfile);
+ exit(1);
+ }
+ for(i = 0; i < hexdata->maxlines; i++) {
+ struct hexline *hexline = hexdata->lines[i];
+
+ if(!hexline)
+ break;
+ if(hexline->d.content.header.tt == TT_EOF) {
+ if(report_func)
+ report_func(LOG_INFO, "\ndump: good EOF record");
+ continue;
+ }
+ if(report_func)
+ report_func(LOG_INFO, "dump: %6d\r", i);
+ len = hexline->d.content.header.ll;
+ if(fwrite(hexline->d.content.tt_data.data, 1, len, fp) != len) {
+ perror("write");
+ exit(1);
+ }
+ }
+ if(report_func)
+ report_func(LOG_INFO, "\nDump finished\n");
+ fclose(fp);
+}
+
diff --git a/xpp/utils/hexfile.h b/xpp/utils/hexfile.h
new file mode 100644
index 0000000..4f30a5e
--- /dev/null
+++ b/xpp/utils/hexfile.h
@@ -0,0 +1,119 @@
+/*
+ * Written by Oron Peled <oron@actcom.co.il>
+ * Copyright (C) 2006, Xorcom
+ *
+ * All rights reserved.
+ *
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#ifndef PARSE_HEXFILE_H
+#define PARSE_HEXFILE_H
+
+#include <stdarg.h>
+
+/*
+ * Some portability workarounds
+ */
+#ifdef _WINDOWS
+
+#include <windows.h> /* for UCHAR USHORT */
+typedef UCHAR uint8_t;
+typedef USHORT uint16_t;
+#define PACKED
+#define sscanf sscanf_s
+#define ZERO_SIZE 1
+
+/* From /usr/include/syslog.h */
+#define LOG_EMERG 0 /* system is unusable */
+#define LOG_ALERT 1 /* action must be taken immediately */
+#define LOG_CRIT 2 /* critical conditions */
+#define LOG_ERR 3 /* error conditions */
+#define LOG_WARNING 4 /* warning conditions */
+#define LOG_NOTICE 5 /* normal but significant condition */
+#define LOG_INFO 6 /* informational */
+#define LOG_DEBUG 7 /* debug-level messages */
+
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS
+# define __END_DECLS
+#endif
+
+#elif __GNUC__
+
+#include <stdint.h>
+#include <syslog.h>
+#define PACKED __attribute__((packed))
+#define ZERO_SIZE 1
+
+#else
+
+#error "Cannot compile on this platform"
+
+#endif
+
+/* Record types in hexfile */
+enum {
+ TT_DATA = 0,
+ TT_EOF = 1,
+ TT_EXT_SEG = 2,
+ TT_START_SEG = 3,
+ TT_EXT_LIN = 4,
+ TT_START_LIN = 5,
+ TT_NO_SUCH_TT
+};
+
+#pragma pack(1)
+struct hexline {
+ union {
+ uint8_t raw[ZERO_SIZE];
+ struct content {
+ struct header {
+ uint8_t ll; /* len */
+ uint16_t offset; /* offset */
+ uint8_t tt; /* type */
+ } PACKED header;
+ struct tt_data {
+ uint8_t data[ZERO_SIZE];
+ } tt_data;
+ } PACKED content;
+ } d;
+} PACKED;
+#pragma pack()
+
+struct hexdata {
+ unsigned int maxlines;
+ unsigned int last_line;
+ int got_eof;
+ struct hexline *lines[ZERO_SIZE];
+};
+
+
+__BEGIN_DECLS
+
+typedef void (*parse_hexfile_report_func_t)(int level, const char *msg, ...);
+
+parse_hexfile_report_func_t parse_hexfile_set_reporting(parse_hexfile_report_func_t rf);
+void free_hexdata(struct hexdata *hexdata);
+struct hexdata *parse_hexfile(const char *fname, unsigned int maxlines);
+int dump_hexfile(struct hexdata *hexdata, FILE *outfile);
+void dump_binary(struct hexdata *hexdata, const char *outfile);
+__END_DECLS
+
+#endif
diff --git a/xpp/utils/test_parse.c b/xpp/utils/test_parse.c
new file mode 100644
index 0000000..c97c209
--- /dev/null
+++ b/xpp/utils/test_parse.c
@@ -0,0 +1,34 @@
+#include <stdio.h>
+#include <stdarg.h>
+#include "hexfile.h"
+
+static void default_report_func(int level, const char *msg, ...)
+{
+ va_list ap;
+
+ va_start(ap, msg);
+ vfprintf(stderr, msg, ap);
+ va_end(ap);
+}
+
+int main(int argc, char *argv[])
+{
+ struct hexdata *hd;
+ int i;
+
+ if(argc < 2) {
+ fprintf(stderr, "Usage: program hexfile...\n");
+ return 1;
+ }
+ parse_hexfile_set_reporting(default_report_func);
+ for(i = 1; i < argc; i++) {
+ hd = parse_hexfile(argv[i], 2000);
+ if(!hd) {
+ fprintf(stderr, "Parsing failed\n");
+ return 1;
+ }
+ dump_hexfile(hd, stdout);
+ free_hexdata(hd);
+ }
+ return 0;
+}
diff --git a/xpp/utils/xpp_fxloader b/xpp/utils/xpp_fxloader
index a46c156..6cde8f9 100644
--- a/xpp/utils/xpp_fxloader
+++ b/xpp/utils/xpp_fxloader
@@ -1,24 +1,158 @@
#!/bin/sh
-FIRMWARE="/etc/xortel/FPGA_XPD.hex"
+# xpp_fxload: load XPP firmware
+#
+# This script can be run manually or from hotplug.
+#
+# Firmware files should be located in $FIRMWARE_DIR which defaults:
+# 1. /usr/share/zaptel
+# 2. Can be overidden by setting $FIRMWARE_DIR in the environment
+# 3. Can be overidden by setting $FIRMWARE_DIR in /etc/default/zaptel
+#
+# Manual Run
+# ##########
+#
+# path/to/xpp_fxloader xppdetect
+#
+# Make sure the firmware files are in $FIRMWARE_DIR
+#
+#
+# Hotplg Run
+# ##########
+#
+# 1. Copy this file and the file xpp_fxloader.usermap to /etc/hotplug/usb/
+# 2. tail -f /var/log/messages...
+#
+#
+# Written by Tzafrir Cohen <tzafrir.cohen@xorcom.com>
+# Copyright (C) 2006, Xorcom
+#
+# All rights reserved.
+#
+# 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+set -e
+
me=`basename $0`
+DEFAULTS="/etc/default/zaptel"
+
+if [ -t 2 ]; then
+ LOGGER="logger -i -t '$me' -s"
+else
+ LOGGER="logger -i -t '$me'"
+fi
+
+if [ -r "$DEFAULTS" ]; then
+ . "$DEFAULTS"
+fi
+
+FIRMWARE_DIR="${FIRMWARE_DIR:-/usr/share/zaptel}"
+
+FIRM_FXS=$FIRMWARE_DIR/FPGA_FXS.hex
+REENUM_SLEEP_TIME=3 # only used on manual runs
+
+FPGA_LOAD="/sbin/fpga_load"
+
+find_dev() {
+ v_id=$1
+ p_id=$2
+
+ lsusb | tr -d : | awk "/ ID $v_id$p_id/{printf \"/proc/bus/usb/%s/%s \",\$2,\$4}"
+}
+
+do_fxload() {
+ ( fxload -t fx2 $* 2>&1 1>/dev/null || exit 1 ) | $LOGGER
+}
+
+load_fw() {
+ v_id=$1
+ p_id=$2
+ fw=$3
+
+ devices=`find_dev $v_id $p_id`
+ for dev in $devices
+ do
+ do_fxload -D $dev -I $FIRMWARE_DIR/$fw || exit 1
+ done
+
+ # Allow time for reenumeration: This only matters in the manual case.
+ if [ "$devices" != '' ]; then sleep $REENUM_SLEEP_TIME; fi
+}
+
+hexfile_version() {
+ hexfile=$1
+
+ grep '$Id:' "$hexfile" | sed -e 's/^.*$Id: *[^ ]\+ *//' -e 's/ .*$//'
+}
+
+load_fpga() {
+ dev=$1
+
+ card_ver=`$FPGA_LOAD -d -D $dev`
+ firm_ver=`hexfile_version $FIRM_FXS`
+
+ $LOGGER "considering fpga firmware version '$firm_ver' for $dev with version $card_ver."
+ case "$card_ver" in
+ 1.001)
+ $LOGGER "Loading firmware '$FIRM_FXS' (version $firm_ver) into '$dev'"
+ $FPGA_LOAD -D "$dev" -I "$FIRM_FXS" 2>&1 >/dev/null | $LOGGER
+ status=$PIPESTATUS
+ if [ $status != 0 ]; then
+ echo "fpga_load failed with status $status" | $LOGGER
+ exit 77
+ fi
+ ;;
+ esac
+}
+
+#########################
+##
+## Manual run
+##
# to run manually, pass the parameter 'xppdetect'
-V_ID=04b4
-P_ID=8613
if [ "$1" = 'xppdetect' ]; then
- DEVICES=`lsusb | tr -d : | awk "/ ID $V_ID$P_ID /{printf \"/proc/bus/usb/%s/%s \",\\$2,\\$4}"`
- echo "Loading firmware for $DEVICES"
- for dev in $DEVICES
- do
- fxload -t fx2 -D $dev -I $FIRMWARE
+ load_fw 04b4 8613 USB_8613.hex
+ load_fw e4e4 1130 USB_1130.hex
+ for dev in `find_dev e4e4 2311`; do
+ load_fpga $dev
done
- exit 0
+ exit $?
fi
+#########################
+##
+## Hotplug run
+##
+
if [ "$ACTION" = "add" ] && [ -f "$DEVICE" ]
then
- logger -i -t "$me" "Loading firmware '$FIRMWARE' into '$DEVICE'"
- fxload -t fx2 -D "$DEVICE" -I "$FIRMWARE" || exit 1
+ $LOGGER "Trying to find what to do for product $PRODUCT, device $DEVICE"
+ case "$PRODUCT" in
+ 4b4/8613/*)
+ FIRM_USB=$FIRMWARE_DIR/USB_8613.hex
+ $LOGGER "Loading firmware '$FIRM_USB' into '$DEVICE'"
+ do_fxload -D "$DEVICE" -I "$FIRM_USB"
+ ;;
+ e4e4/1130/*)
+ FIRM_USB=$FIRMWARE_DIR/USB_1130.hex
+ $LOGGER "Loading firmware '$FIRM_USB' into '$DEVICE'"
+ do_fxload -D "$DEVICE" -I "$FIRM_USB"
+ ;;
+ e4e4/1131/*)
+ load_fpga $DEVICE
+ ;;
+ esac
fi
-
diff --git a/xpp/utils/xpp_fxloader.usermap b/xpp/utils/xpp_fxloader.usermap
index 1989af9..bdfa861 100644
--- a/xpp/utils/xpp_fxloader.usermap
+++ b/xpp/utils/xpp_fxloader.usermap
@@ -1,2 +1,4 @@
# module match_flags idVendor idProduct bcdDevice_lo bcdDevice_hi bDeviceClass bDeviceSubClass bDeviceProtocol bInterfaceClass bInterfaceSubClass bInterfaceProtocol driver_info
xpp_fxloader 0x0003 0x04b4 0x8613 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x0
+xpp_fxloader 0x0003 0xe4e4 0x1130 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x0
+xpp_fxloader 0x0003 0xe4e4 0x1131 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x0
diff --git a/xpp/utils/xpp_modprobe b/xpp/utils/xpp_modprobe
index 52d76b2..76c1f7d 100644
--- a/xpp/utils/xpp_modprobe
+++ b/xpp/utils/xpp_modprobe
@@ -2,9 +2,9 @@
#options zaptel debug=1
#options wcfxo debug=1
#options xpp print_dbg=1
+#options xpp_usb print_dbg=1
+#options xpd_fxs print_dbg=1
+#options xpd_fxo print_dbg=1
# For pre-loading of card modules (e.g: xpp_fxs)
#install xpp_usb /sbin/modprobe xpd_fxs && /sbin/modprobe --ignore-install xpp_usb
-
-# For auto loading of card modules
-alias xpd-type-3 xpd_fxs