From 933ffe7ab4357e3216ab3fc4c6b66aa7fbd46ca1 Mon Sep 17 00:00:00 2001 From: David Given Date: Mon, 27 Jan 2020 21:40:27 +0100 Subject: [PATCH 1/4] Find and attempt to fix a memory corruption error when sampling --- if the next fragment arrives from the sampler before usbbuffer has finished being transmitted via USB, it'll get overwritten. I've disabled DMA USB to make the code easier to understand and made sure that we flush things more rigorously. This may help the weird pipe errors, too. --- .../ARM_GCC_541/Release/FluxEngine.hex | 620 +++++++++--------- FluxEngine.cydsn/FluxEngine.cyprj | 26 +- FluxEngine.cydsn/Sampler/Sampler.v | 2 +- FluxEngine.cydsn/TopDesign/TopDesign.cysch | Bin 251368 -> 251362 bytes FluxEngine.cydsn/main.c | 14 +- 5 files changed, 332 insertions(+), 330 deletions(-) diff --git a/FluxEngine.cydsn/CortexM3/ARM_GCC_541/Release/FluxEngine.hex b/FluxEngine.cydsn/CortexM3/ARM_GCC_541/Release/FluxEngine.hex index 660f5acf..c31b82c5 100644 --- a/FluxEngine.cydsn/CortexM3/ARM_GCC_541/Release/FluxEngine.hex +++ b/FluxEngine.cydsn/CortexM3/ARM_GCC_541/Release/FluxEngine.hex @@ -1,245 +1,245 @@ :4000000000800020110000007910000079100000064A08B5136843F020031360044B1A6803F53F5302331A6001F044F8E8460040FA46004010B5054C237833B9044B13B1D7 -:400040000448AFF300800123237010BD6881FF1F00000000F8380000084B10B51BB108490848AFF300800848036803B910BD074B002BFBD0BDE81040184700BF0000000011 -:400080006C81FF1FF8380000C880FF1F000000000A4A0B4B116801310B40002BBEBF03F1FF3363F00F030133136011685368994202BF024B01221A72704700BF8881FF1FBC -:4000C0000F0000800A4A0B4B516801310B40002BBEBF03F1FF3363F00F030133536051681368994202BF024B01221A72704700BF8881FF1F0F000080024B012200205A7223 -:4001000002F07EB98881FF1F10B5C4B2204601F093F90128FAD110BD08B572B60F4B0F49DA680132DA601A690132C82A08BF00221A615A6918690132A72A08BF00224A6162 -:400140005B69002B0CBF02230023002814BF184643F0010002F0BCFE62B608BD8881FF1F10B504460D4B8278997E91421CBF00225A7702689A610279094B1A718378002B42 -:4001800014BF0220012002F067FEE07802F05EFE2079BDE8104002F095BE00BF8881FF1FA081FF1F70B5C4B220460E4601F04CF9314605460246204601F008FA204601F0EF -:4001C0003BF90128FAD0284670BD000038B50B4CA57F5DB904F11800FFF7C2FF012002F0A5F84FF47A7002F0B7FA6577E36823620123A377BDE8384002F0ECBA8881FF1FB5 -:4002000038B50446C5B2284602F09CF8062002F0B9FA44F00200C0B202F094F8062002F0B1FA284602F08EF8BDE83840062002F093BA10B5642402F07FF820B10120BDE8B3 -:400240001040FFF7DDBF0120FFF7DAFF013CF2D1F4E7000038B5044D0024285D013402F041FA102CF9D138BDAC81FF1F08B502F05BFC002002F064FC02F076FC02F080FCF8 -:4002800080B208BD10B50446012002F073F8642002F062FAFFF7EAFF2080002002F06AF8642002F059FAFFF7E1FF608010BD08B502F066FD002002F06FFD02F081FD02F0B7 -:4002C0008BFD80B208BD10B50446FFF7B2FF322002F042FAFFF7EBFF20800020FFF790FF322002F039FAFFF7E2FF608010BD0FB400B593B014AB53F8042B402102A8019396 -:4003000002F0E2FE02A802F082F802F08CF813B05DF804EB04B0704710B5044601780648FFF7E5FF0420FFF7EFFE62782146BDE81040042001F0D8B80A39000007B5002339 +:400040000448AFF300800123237010BD6081FF1F0000000028360000084B10B51BB108490848AFF300800848036803B910BD074B002BFBD0BDE81040184700BF00000000EB +:400080006481FF1F28360000C880FF1F000000000A4A0B4B116801310B40002BBEBF03F1FF3363F00F030133136011685368994202BF024B01221A72704700BF8081FF1F9E +:4000C0000F0000800A4A0B4B516801310B40002BBEBF03F1FF3363F00F030133536051681368994202BF024B01221A72704700BF8081FF1F0F000080024B012200205A722B +:4001000002F086B88081FF1F10B5C4B2204601F077F90128FAD110BD08B572B60F4B0F49DA680132DA601A690132C82A08BF00221A615A6918690132A72A08BF00224A617F +:400140005B69002B0CBF02230023002814BF184643F0010002F054FD62B608BD8081FF1F10B504460D4B8278997E91421CBF00225A7702689A610279094B1A718378002BB3 +:4001800014BF0220012002F0FFFCE07802F0F6FC2079BDE8104002F02DBD00BF8081FF1F9881FF1F70B5C4B220460E4601F030F9314605460246204601F090F9204601F0D1 +:4001C0001FF90128FAD0284670BD000038B50B4CA57F5DB904F11800FFF7C2FF012001F0ADFF4FF47A7002F04FF96577E36823620123A377BDE8384002F084B98081FF1F9D +:4002000038B50446C5B2284601F0A4FF062002F051F944F00200C0B201F09CFF062002F049F9284601F096FFBDE83840062002F02BB910B5642401F087FF20B10120BDE8B6 +:400240001040FFF7DDBF0120FFF7DAFF013CF2D1F4E7000038B5044D0024285D013402F0D9F8102CF9D138BDA481FF1F08B502F0F3FA002002F0FCFA02F00EFB02F018FB10 +:4002800080B208BD10B50446012001F07BFF642002F0FAF8FFF7EAFF2080002001F072FF642002F0F1F8FFF7E1FF608010BD08B502F0FEFB002002F007FC02F019FC02F0AB +:4002C00023FC80B208BD10B50446FFF7B2FF322002F0DAF8FFF7EBFF20800020FFF790FF322002F0D1F8FFF7E2FF608010BD0FB400B593B014AB53F8042B402102A80193D3 +:4003000002F07AFD02A801F08AFF01F094FF13B05DF804EB04B0704710B5044601780648FFF7E5FF0420FFF7EFFE62782146BDE81040042001F080B83A36000007B50023B1 :40034000ADF804308DF80600032301A88DF80530FFF7E2FF03B05DF804FB0000F8B51D4C0646FFF733FF637F03B156B91A48FFF7BEFFFFF75EFF012000236077636302F048 -:4003800001FA3246616B1548FFF7B1FF114D0027636B9E4216D001F0CFFF00B16F63636B9E4205DD0020FFF72BFF6B6B013305E005DA0120FFF724FF6B6B013B6B6302F0F6 -:4003C00009FAE5E7322002F0C7F9BDE8F8400448FFF78DBF8881FF1F173900001E3900003B3900002DE9F04F9BB062B602F05CFAAF49042002F080FAAE4801F0A9FFAE4870 -:4004000002F04CFDAD4801F0DDFF02F02DFC02F0FFFA002002F020FD01F0F8FF0221002000F0C0FFA64D0321084602F0B3F92E462C4602F0CFF9AB7F73B12A6AEB689B1A23 -:4004400041F28832934207D9002001F06FFF002002F002FD0023AB7700F0DCFF18B99948FFF745FF04E000F0DBFF0028F7D109E000F0D0FF0028FBD09348FFF738FF0320EA -:4004800001F0F8F8032000F0D7FF0128D1D18F48FFF766FE8E490320FFF784FE94F838108C48FFF724FF94F83830023B122B00F2EE83DFE813F01300EC031C00EC03220079 -:4004C000EC034400EC036800EC039F01EC032E03EC034D03EC035303EC035E0303238DF828308DF829300A238DF82A303DE394F83A00FFF733FF784B34E3FFF767FE00239C -:400500006372E068627A02F0FF0132B9EB681B1AB3F57A7FF6DD0B4608E03BB100227272F168627A12B9EB685B1AFAE707228DF8282004228DF82920ADF82A3015E3022012 -:40054000FFF7E2FD4FF000090DF1280A4FF480780027C8EB0903DA1907F80A200137402FF9D10220FFF7D0FD3A465146022000F0BBFFB8F10108EBD109F10109B9F1400F4D -:40058000E4D1564BC0E294F83A0001F0F3FE606BFFF7E4FE02F004FD514BDFF848811A78002742F004021A701A7842F001021A701A7802F0FE021A701A7802F0FE021A70E1 -:4005C00002F0F2FC0220FFF79FFD41F6FF734FF480420121022002F045FC84F8780002F067F808F807000137102FF8D1DFF8F8A000270AF15D081FFA88F90137102F14BFDC -:400600003A4600221AF8010F2244062392F82420402102F081F84A4646F24F419AF8000002F08CF809F14009102F1FFA89F9E4D100237372637A002BFCD0002714223946E3 -:400640000AA8777202F00CFD40230D934FF0FF333760736037723368DFF89090334493F8241096F87800CDF8309001F0D9FF96F8780001F097FF012196F8780001F06AFF32 -:40068000236813B96B7A002BFAD0002794F83BA0676094F808B0BBF1000F6AD102F09AF86B7A43B3BAF1010A85F809B023D160E019010000F900000091000000C500000092 -:4006C0008881FF1F493900005C390000A081FF1FC081FF1F66390000FC380000FE3800009F640040AC81FF1FAB81FF1F0886FF1F2B7A002B3DD1626823689A42F8D04FF07B -:40070000000B63680AA808EB83135B440A93CBF140030B9300F0DCFA0B9B0137C3F140039B440D9B5FFA8BFB9BB9022000F084FE012805D0637AE3B92B7A002BF5D018E0E2 -:400740004022BA49022000F0CFFE4023CDF830900D93BBF13F0FD4D96268B54B01321340002BBEBF03F1FF3363F00F03013363608FE7042194F8780001F05EFF94F878009B -:4007800001F06AFF0028F9D10AA800F0D5FA0220FFF7BAFC337A63B90D9A402A06D0C2F1400292B2A149022000F09EFE0220FFF7ABFC0D9A32F0400203D11146022000F026 -:4007C00093FEFFF747FD237A33B19A48FFF78FFD0220FFF7B3FD06E0974B09A81B88ADF82430FFF799FD627A3946237A9348FFF77EFD4FE29248FFF77AFDE76B17F03F0785 -:4008000001D0032044E2012001F0BAFD95F83A0001F0B0FD02F0C4FB8A4BDFF82C821A7802F0FB021A701A7842F001021A701A7802F0FE021A701A7802F0FE021A7002F0FB -:40084000B3FB686BFFF78AFD01214FF4804341F6FF72084601F09AFD85F8780001F028FF08F807000137102FF8D1DFF8E091002709F15D031FFA83F807930137102F14BF3F -:400880003A46002219F8010F2244052392F82420402101F041FF414646F2445299F8000001F04CFF08F14008102F1FFA88F8E4D10027BB46B946BA46F36B4FF0FF389B09F8 -:4008C000142239460AA837600593C6F80480377202F0C6FB402301200D9300F0CBFECDF8188001F077FF2268514B01321340002BBCBF03F1FF3363F00F036168B8BF0133D2 -:400900008B4200F0A580BAF1000F07D0237A002B40F0B1806B7A002B40F0AD800B9B002B34D1B9F1000F0BD07F2240495A540133402BFAD10A910B9328E0BAF1000F06D130 -:40094000012000F079FD01288046F6D107E0237A002B40F090806B7A002BF1D08BE03349FFF720FC8146314B0B9040460A9300F081FEB9F13F0F07F1010706DD059BDB1BA0 -:40098000D3F1000949EB030900E0C1460B9BDBB12368079A0AA802EB83120D9BC3F1400313440C9300F0D7F90D9B6BB92A68204B01321340002BBEBF03F1FF3363F00F03DA -:4009C0000133236040230D936368013340D12B680F2B3DD14FF00008C5F8048001F004FD85F808806B6895F878002B4493F8241001F016FE95F8780001F0D4FD012195F852 -:400A0000780001F0A7FD85F80980637A002BFCD04FF00008012086F8098001F0F1FC404601F0AEFCCDF8188015E000BF0886FF1F0F00008075390000003900008F39000066 -:400A4000A239000094650040AC81FF1FAB81FF1FBAF1000F05D0237A6BB96B7A5BB94FF0010A6368069A93423FF43BAF6B680BF1010B069335E701F0BDFC012001F080FC15 -:400A8000002001F0BDFC042194F8780001F0D4FD94F8780001F0E0FD0028F9D196F8780001F06EFD737A327A0293012303920193CDF800905B463A4605997A48FFF717FC01 -:400AC000B9F1000F16D1059BBB420ADD012000F0B3FC01288046F6D17349FFF763FB3F2803DC012000F0DAFD04E0404600F0C2FD0137E8E7FFF7AEFB6C48FFF7F8FB237A25 -:400B00000BB10220C4E06A4B1B8809A8ADF824302CE094F83A0001F02DFC606BFFF71EFC6448FFF7E4FB00236372637A002BFCD0012001F065FC00237372637A002BFCD0CE -:400B4000002001F05DFC5C48FFF7D1FB5B4B09E000206077FFF702FC594B03E05948FFF7FFFA594B1B88ADF828300AA8FFF7D4FB90E0A37F3BB1002001F0D8FB002002F0E5 -:400B80006BF90023AB7702F0EDF8002002F090F82A2701F0BBFF002001F05EFF3A4600210AA802F05DFA15238DF828308DF8297001F010FE002001F0B9FB002002F04CF9C7 -:400BC000C82001F0C9FD0DEB0700FFF75BFB0DF13E00FFF778FB01F0FDFD012002F03CF9322001F0B9FD0DF12E00FFF74BFB0DF14200FFF768FB012001F098FB4FF496704B -:400C000001F0AAFD01F0E6FD0DF13600FFF73AFB0DF14A00FFF757FB002001F087FB4FF4967001F099FD01F0D5FD022002F014F9322001F091FD0DF13200FFF723FB0DF1FF -:400C40004600FFF740FB012001F070FB4FF4967001F082FD01F0BEFD0DF13A00FFF712FB0DF14E00FFF72FFB002001F05FFB4FF4967001F071FD01F0ADFD002002F0ECF8D0 -:400C80000023637701F0F0FF01F0C2FE6DE70120FFF754FB032000F0EDFC0C48FFF727FBFFF7C7BBAC3900000886FF1FDC39000002390000EB390000F93900000439000098 -:400CC00006390000C081FF1F08390000063A000010B54268002A2ED0C368002B2BD00368048A591C01601B78013A13F0800F817C42601DBF03F0010242EA8403023108312E -:400D000014BF43F0020343EA0423817414BF03820382837C072BDCD9028A083B42FA03F38268511C81601370C368013BC360837C083B8374CDE710BD07B5827C42B102AA43 -:400D4000002102F8011D026001224260FFF7C0FF03B05DF804FB30B543686BB3C2685AB3827C072A0CD8046890F91050611C01602178013B41EA05210832018243608274B0 -:400D8000827C018AA2F108042141CBB2090608D5C3F3801363F07F03023A03F08103827402E08474002BD7D08268511C81601370C368013BC360CFE730BD00002DE9F0419E -:400DC00072B6884B61221A70A3F5F06301221A801924854A9C7092E803008033062283F8002283E80300522203F580731A707F4B7F4A1B787F4EDBB2137040F618027E4BC3 -:400E000000251A8041F2512223F8022C33784FF4F07003F0010343EA450502F0B9F8013C05F003052ED0032DF0D1744B4FF480721A8007221A70724A00254821157091706B -:400E400002221D705D7103F8032C0422DA716D4A6D4C13786D4E43F00103137012F8013C062743F0030302F8013C2378012243F0800323705B4B1A70654A137843F020033D -:400E8000137000E0FEE707FB056300219A881868013502F0E5F8072DF5D15E485E4E002550F8041F05F1105303F1560221F0FF075733C9B20B4452005B0002329A4206D039 -:400EC00012F802EC12F801CC0EF807C0F5E7B0420D44E5D1514A002313609360136193614F4B504F1A68504BDFF888811A604F4B1A684F4B1A604F4A137843F00203137036 -:400F0000137C43F0020313742378A2F5863243F040032370413A137843F010031370464A464B07CA03C31A80454A2833106843F8250C127903F8212C424A07CA03C31A80F1 -:400F4000414AE83B07CA03C31A80404A083307CA03C31A803E4A3F4BA2F5616203CBC2F8100EC2F8141E1378042043F008031370394B02F5AA521B783D78DBB298F80060F2 -:400F8000EDB203F007010C321B091170F6B2537045F003033B7046F0030388F800302F4B48221A702E4A402313702E49937013729372082382F81F3220220A7048710A72C0 -:400FC000294A0A20137001F0DDFB284B88F8006044223D70264D1A7094E80F0007C52B80BDE8F08100480040F01000480F010049A14600402542004022420040044000406E -:4010000006400040A2430040A04300400B3A0000E8460040FCFFFF47A800004800760040F8100048F846004020760040FC1000482876004003500140B0100048C051004085 -:40104000BC100048C4100048D0100048DC10004832510040E8100048CF0100491D51004001590040235B0040585B004076580040B0430040F946004008B501F0C5FF036832 -:401080000C2B00D1FEE7FEE7084908B50B68084A1844821A802A01DC086005E001F0B4FF0C2303604FF0FF33184608BDCC80FF1F5887FF1F80B51148114B0025C0B1A3F17A -:4010C000100192C922460439161BB74204D051F8046F42F8046BF7E7114653F8046C8C1AA64202D041F8045BF9E701381033E5E701F090FFFFF776F9FEE700BF01000000E2 -:40110000DC3B0000124A134B10B51A60124A134C1368134843F4007313600023032B98BF54F823204FEA830188BF0E4A0133302B4250F3D10C4B1A780C4B1A700C4B084A06 -:401140001A60FFF73BFEBDE8104001F0EDB900BF0004FA050CED00E014ED00E0000000000080FF1F79100000BC760040C080FF1F08ED00E0F8B501F013FF4B4A01271378FA -:40118000022643F001031370137C484C43F001031374474B02F5E3521F700B3203F8946C1378054603F07F031370002001F0EAFA2378404A03F0F90323701378384603F081 -:4011C000DF03137023783B43237001F0DBFA282001F0D8FA384B30461A7802F07F021A701A7802F0BF021A7023783343237001F0C9FA2378314A43F00403237000231370D5 -:4012000053702F4AFF2199540133092BFBD1284601F0CAFE0721172001F0FCFA2949172001F0EAFA0721182001F0F4FA2649182001F0E2FA0721152001F0ECFA23491520BE -:4012400001F0DAFA0721052001F0E4FA2049052001F0D2FA0721062001F0DCFA1D49062001F0CAFA0721084601F0D4FA1A49072001F0C2FA0721082001F0CCFA17490820F1 -:4012800001F0BAFA0021162001F0C4FA1449162001F0B2FA07210C2001F0BCFABDE8F84010490C2001F0A8BAA5430040944300409D60004012600040F851004084600040C8 -:4012C0007D86FF1F431B00007D190000411B0000751A0000A11A0000D11A0000091B0000491B0000BD1B0000214B224A10B5187000231370204A40201370204A0F241370B0 -:401300001F4A13701F4A13701F4A13701F4A13701F4B4FF400021A604FF080721A604FF400121A6020221A601860802018604FF480701860174804704FF480001860164BF4 -:401340001A70933B19B91A7802F0FE0202E01A7842F001021A70114B03221A70802203F8202C012001F014FE0D4B04221A7010BD9886FF1F9E86FF1F9C86FF1F9D86FF1FA0 -:401380009986FF1F8886FF1F9B86FF1F1087FF1F00E100E09E6000409C600040286000401260004070B5074C054623780E461BB9FFF7E0FE0123237031462846BDE87040D0 -:4013C000FFF792BF4886FF1F0A4A002313700A4A13700A4A13700A4A13700A4A13700A4A13700A4A13700A4B03221A70802203F8202C70479E86FF1F9C86FF1F9D86FF1F4F -:401400009986FF1F8886FF1F9B86FF1F1087FF1F28600040014B1878704700BF9D86FF1F044B1A7802F0FF001AB118780022C0B21A7070479C86FF1F024A0C2303FB002019 -:4014400040787047A486FF1F431E072B0CD8074A064B00010344805C5B7800F00F0043EA0020023880B2704700207047FC5F00401A4A38B50C2303FB00231B79090C13F077 -:40148000800F00F1FF35044619BF8AB24FF480438BB24FF48042032D18D8DFE805F002070C110021084601F01BF80DE00021084600F0FAFF08E00021084600F0D9FF03E016 -:4014C0000021084600F0B8FF054B1855EDB2072D03D801F0EDF8034B185538BDA486FF1F7486FF1F7D86FF1F431E072B2DE9F0470446894615465CD82F4F0C2202FB0072C1 -:40150000D388DFF8B8A09BB2C3F500739D424FF00C0303FB007388BFD588DB7884BFC5F50075ADB2254A43EA15230601B354B244EBB28AF80130224B1A5C9846FF2A01D15F -:40154000FFF796FF0C2303FB047200215170B9F1000F28D03DB31B4F385D01F011F811232946FE2218F8040001F0D6F806F5C04278321FFA89F118F8040001F0DFF8124DB6 -:4015800018F80410385D01F04BF80121385D00F0E1FF735D43F002037355735D03F0FD037355BDE8F08703FB04746379DBB28AF80230BDE8F08700BFA486FF1FFC5F0040EF -:4015C0007D86FF1F7486FF1F706000402DE9F047044615468846002940D0431E072B3FD8FFF732FFA84203D22046FFF72DFF05461D4E335DFF2B03D141462046FFF738FF33 -:40160000DFF868A027011AF8040000F0B9FF1223FE222946305D01F07FF807F5C0411FFA88F27831305D01F089F8DFF84490315D1AF8040000F0F4FF01211AF8040000F09A -:4016400089FF17F8093043F0020307F8093017F8093003F0FD0307F8093002E00D4600E000252846BDE8F0877D86FF1F7486FF1F70600040431E072B0AD8064A0C2303FBB8 -:40168000002300225A705A79034BD2B200011A54704700BFA486FF1FFE5F0040431E072B9FBF024B000108221A547047FE5F004030B51A4A1A491B4D0878138803449BB2BE -:4016C0001380194A00231488D8B2A4B27CB1082B0CD050680078C0B2E85450680133013050601088013880B21080ECE718460B780E4C082B0E4A00D040B10E4D2B7883F010 -:4017000080032B700F232370022301E0022323701370094B1870087030BD00BF1487FF1F1087FF1F006000408C86FF1F8986FF1F9E86FF1F9A86FF1F1187FF1F074B02226E -:401740001A70074B80221A70064B0F221A70064A00231370054A0120137070479E86FF1F9A86FF1F8986FF1F1087FF1F1187FF1F30B5164B16491B780A8803F00F03023B91 -:40178000DBB21A4492B20A80124C134A0020118889B279B173B15568215C013BC9B229705168DBB20131516011880130013989B21180ECE7094A1370094A137883F0800373 -:4017C0001370084B0B221A7030BD00BF296000401487FF1F006000408C86FF1F1187FF1F9A86FF1F8986FF1F064A06231370064A01201370054B80221A70054B00221A70D5 -:40180000704700BF9E86FF1F8986FF1F9A86FF1F1187FF1F054B9A683AB19A68044910709A680988518000229A6070478C86FF1F1487FF1F08B5124B1A78D2B21A701B7856 -:40184000DBB21A0602D50F4A137008BD0220FFF7E1FF0D4B1B7803F06003202B05D0402B06D043B900F012FC04E001F0A1FB01E000F046FD10B9034B03221A7008BD00BFE0 -:40188000286000408986FF1F0060004008B5084A084B0120197813880B449BB21380064B00221A70FFF7B6FF044B03221A7008BD1487FF1F1087FF1F9E86FF1F8986FF1F6D -:4018C00008B50C4B1B78DBB2042B07D0062B09D0022B0DD1BDE80840FFF7D8BFBDE80840FFF746BF0320FFF795FF034B03221A7008BD00BF9E86FF1F8986FF1F08B5054B8D -:40190000002201201A70FFF785FF034B03221A7008BD00BF9E86FF1F8986FF1F08B50A4B1A7832B11A78094942F080020A7000221A70074B002201201A70FFF76BFF054B5C -:4019400003221A7008BD00BF8886FF1F086000409E86FF1F8986FF1F074B1B78DBB2042B05D0062B05D0022B05D1FFF7A1BEFFF7C5BFFFF7D3BF70479E86FF1F38B51D4CCC -:401980002378DBB2DD0634D518060AD503F00F03012B2ED1FFF74EFF174B1B78190609D538BD5A0602D5FFF7D7FF03E09D0620D5FFF786FF23781B061BD4104B1A78104BD0 -:4019C0001B7813430F4A13701278934211D10A4A0849154613782078DBB2000605D41378DBB20B700B7803F00F0328788342F1D138BD38BD286000408986FF1F9A86FF1FF3 -:401A00001187FF1F29600040054A00231380054A916819B191680B7092685380704700BF1487FF1F8C86FF1F0E4808B503889BB213B9FFF783FE13E00B4B02221A700B4BF5 -:401A400000221A70FFF7E0FF094AD1799379028843EA012392B2934238BF0380FFF728FE012008BD8C86FF1F9E86FF1F9A86FF1F00600040084B01221A700F3B9B7C074BC9 -:401A80001A7B02F00302012A1EBFDA7B82F08002DA7301225A7370470B600040A486FF1F094B02221A700F3B93F82230074B1A7E02F00302012A1EBFDA7E82F08002DA76B4 -:401AC00001225A76704700BF0B600040A486FF1F0B4B04221A700F3B93F83230094B93F8242002F00302012A1EBF93F8272082F0800283F82720012283F82520704700BF4A -:401B00000B600040A486FF1F0B4B08221A700F3B93F84230094B93F8302002F00302012A1EBF93F8332082F0800283F83320012283F83120704700BF0B600040A486FF1F3B -:401B40007047FFF741BC0000F0B5184B184E19780C27C9B201234FF0000C31B3CA0720D5144A4FEA031E7244947850782040C5070DD507FB03652C79240608D5147804F00F -:401B8000FE0414706D790C4CEDB204F80E50840706D507FB036425792D0658BF84F801C090700133DBB24908D7E7F0BD9F600040A486FF1F70600040FE5F004000F0ACBC6B -:401BC00070B50446184B88B003AA03F11006154618685968083303C5B3422A46F7D11B782B70FCB12223237001AD03232846637000F08AFE002220461146AB5C08AC04EB8F -:401C0000131414F8144C03F00F03847008AC234413F8143C0132082AC1700371417100F10400EAD108B070BD353A00002DE9F0431C4D01222E460C201F274FF0800E4FF01B -:401C4000080C194B00FB02581401234418705F70164998F805902144B9F1000F07D098F8044024064CBF887081F802C001E081F802E000FB0261CC880132E4B29C71CC88F7 -:401C8000092AC4F30724DC71CC88E4B21C71C988C1F307215971D4D1054BFF221A70BDE8F08300BFA486FF1F70600040FC5F00400A600040064B074A1B7802EBC30253689E -:401CC0001A7C824286BF03EBC0035869002070479886FF1F983A00002DE9F84F424B1A78002A7ED01878414D0138C0B2FFF7E2FFA8463F4AC3681478007ADFF800C1E4B284 -:401D000003EBC0000C2600274FF0010E834268D01A78A24263D11CF80420597891425ED19A7893F8039002F07F0206FB02FA05EB0A01CF7093F802B009F0030981F804B053 -:401D400093F803B005F80AB0B3F804A0A1F808A093F902A0BAF1000F0BDAB9F1010F0CBF4FF007094FF00D0981F8059081F801E009E0B9F1010F0CBF4FF005094FF0090974 -:401D800081F805904F704FEA02191A4906FB0282494481F802E0B2F808A0CAF3072A81F800A0B2F808A05FFA8AFA81F801A0B2F806A011495FFA8AFA494481F806A0B2F8B3 -:401DC0000690C9F3072981F80790B2F806905FFA89F981F80490D288C2F307224A71083394E7BDE8F88F00BF9D86FF1FA486FF1F9986FF1FFC5F0040706000408A86FF1FF6 -:401E000008B5064B18780138C0B2FFF753FF20B143681B7900EBC300406908BD9D86FF1F00212DE9F84F0B464E4E0C2707FB01F401313219092933554FF000059370494CFC -:401E4000D3701381937253705371EFD118B1464B1D70464B1D70464B1A78002A7FD0187801250138C0B2FFF725FFA8464368DFF8F8E0DB790C2713F0400F3E4B4FF0000C2E -:401E80001A7814BF42F0010202F0FE021A70027AD20007FB0541C36803EB02094B4531D093F802A00AF07F06AE4229D10E89B3F804B0B6B25E4538BFA1F808B01E7893F8C1 -:401EC00001B01EF80660B3451AD181F804A0DE780E7093F902A0DE78BAF1000F06F0030607DA012E0CBF07260D264E7181F8018006E0012E0CBF052609264E7181F801C07D -:401F00000833CBE70135092DC3D1C1680A328B1C0A440C200833934209D013F8081C13F80A5C01F07F0100FB01418D72F2E7FFF767FF114B0121186000230C2000FB014240 -:401F4000D3801289013113449BB203F00102134409299BB2F2D1BDE8F84FFFF767BEBDE8F88F00BFA486FF1F8A86FF1F1287FF1F9D86FF1F9B86FF1FA086FF1F114B1B793B -:401F800003F07F035A1E072A19D80F490C2202FB031291781B0141F0010191700021D170517841F002015170127912F0800F074A1A4414BF8D2389239370FFF715BC00201D -:401FC000704700BF00600040A486FF1FFC5F004030B4194B1A7902F07F02531E072B27D8164B0C2404FB02339978154D01F0FE0199700021D97029461201505D114400F0E9 -:402000007F0050555A7802F0FD025A701A795B78120605D5012B01D18C7006E00D2303E0012B0CBF082309238B7030BCFFF7DCBB002030BC704700BF00600040A486FF1F78 -:40204000FC5F004010B50D4B0D4C21791878C9B20138C0B2FFF72EFE43681B798B4201D2012909D8074A0848535CDBB24354A3780120DBB2535410BD002010BD9D86FF1F14 -:40208000006000408A86FF1F1287FF1F38B58A4A8A4C13780021DBB221801806517840F18D800A2900F20581DFE811F05D00030103010301030103010B0003017E00030190 -:4020C0008200D3787C49012B09D17D4B1A787D4B03EBC2035B685B686360122310E0CB78022B12D18878FFF7E5FD002800F0E180436863606368DA7863689B7843EA0223A6 -:402100002380BDE83840FFF78FBCCB78032B26D16D4B00228878D5B2854209D3664A91786A4AEE2908BF1346634A917881B106E0187801320028F1D018780344EAE76449BF -:402140009278097C914203D16248FFF739FD614B1A78002A00F0AD801A78228018E0BDE8384000F025BF13F0030313D0022B40F0A0802380504B0C211B7903F07F02564B34 -:4021800001FB02339A78554BD2B21A7000225A706360B6E702222280514A11784F4AC9B2117053706260ACE7012323804D4BEFE70123238013794C4A1344E9E701390A2999 -:4021C00077D8DFE801F037764F76067676760A7620009378454ADBB25AE0937803F0FF0153B9404B1A7891425FD01970404B01201870FFF715FE58E0481EC0B2FFF75AFDB1 -:402200000028EED155E0FFF71DFF002851D02A4A384913791279DBB2D2B20A70364A3249D25CCB5C9A4240D0314B01221A70FFF753FD3AE003F00303012B2BD009D3022BA2 -:4022400037D11D4B9B78002B33D1BDE83840FFF7BFBE194B9B78012B2BD1214A137803F0FD0315E003F00303012B13D008D3022B1FD1114B9B78E3B9BDE83840FFF77EBE45 -:402280000D4B9B78012B14D1154A137843F0020313700AE0084B1A795AB998781B791749DBB2CA5C22EA0002CA54BDE83840FFF79BBA002038BD00BF006000408C86FF1F2B -:4022C0009886FF1F983A0000FC3A0000843A00006F3B00003087FF1FA486FF1F4986FF1F9B86FF1F9D86FF1F8A86FF1F8886FF1F9C86FF1F9986FF1F1287FF1F9F86FF1FD7 -:40230000074B1A78120609D55B78012B06D1054B054A5A6012781A80FFF786BB00207047006000408C86FF1F5C3A0000014B1870704700BF77650040014B1878704700BF44 -:4023400068650040014B1870704700BF7A650040064A0123136002F688321268E0211064034A1170A2F540721360704780E100E000E400E0014B1870704700BF79650040B1 -:40238000014B1870704700BF7565004073B515461E460B4C05230022019200920A4601461846237000F064F932462946207800F01FF90221207800F009F9207802B070BD8C -:4023C000D080FF1F064A0423136002F688321268E0219064034A1170A2F202321360704780E100E002E400E0014B04221A60704700E100E0014B04221A60704780E100E055 -:40240000014B1870704700BF7B650040704738B505460078012428B100F062FD285D0134E4B2F8E738BD08B50D2000F059FDBDE808400A2000F054BDF7B516461F460B4C4E -:4024400000230325019300930A4601462846257000F00EF93A463146207800F0C9F80221207800F0B3F8207803B0F0BDE080FF1FF7B516461F460B4C002302250193009318 -:402480000A4601462846257000F0F2F83A463146207800F0ADF82946207800F097F8207803B0F0BDE180FF1FF7B516461F460B4C00230125019300930A46014628462570B9 -:4024C00000F0D6F83A463146207800F091F80221207800F07BF8207803B0F0BDE280FF1F73B515461E460B4C0023019300930A4601461846237000F0BBF83246294620784E -:4025000000F076F80221207800F060F8207802B070BD00BFE380FF1F024B1878C0F38010704700BF8F450040074A7F23802113705170064A013BDBB202F80839002BF9D1B8 -:40254000034A1370704700BFE480FF1FF87B00400078004017280FD8084B0001C25C11B142F0200201E002F0DF02C254C25C42F00102C254002070470120704710700040D8 -:4025800017280BD8064B0001C25C02F0FE02C254C25C02F0DF02C25400207047012070471070004017280DD8074900010B4603441A7942F004021A71435C43F0010343543B -:4025C00000207047012070471070004017280BD8064A0001835C490003F0F10301F00E011943815400207047012070471070004041F6FF73994208BF4FF400519A4208BFC8 -:402600004FF4005217289FBFC00000F1804000F5EC4081809ABFC280002001207047000017289FBF034B00011954002088BF0120704700BF1970004017289FBF054B000134 -:402640001A5C01F007019DBF1143195400200120704700BF1470004017289FBF034B0001185C00F0070088BFFF20704714700040172810B51AD8C00001F07F0100F180443F -:4026800041EAC21204F5EC44D2B222709DF8082003F00F0343EA0213DBB263709DF80C30002003F00F03A370E07010BD012010BD10B500F075FC0A4A5378182B0AD914786D -:4026C000013B5370E30003F1804303F5F0431B78137000E0FF2400F067FC204610BD00BFE480FF1F030610B5044611D400F058FC084AE300117803F1804303F5F0431970CC -:402700005378147001335370BDE8104000F04CBC10BD00BFE480FF1F30B504060CD411F4704509D1C40004F1804404F5F0442180A270E370284630BD012030BD03065FBFB5 -:40274000C00000F1804000F5F04081805ABFC280002001207047000038B50446084DB4F5004F05D9286800F013FCA4F50044F6E7034B58686043BDE8384000F009BC00BF82 -:40278000EC80FF1F024B1B7A584300F001BC00BFEC80FF1F0E4B00F003001A78490102F0FC02104318701A7801F0600142F080021A701A7802F07F021A701A7802F09F0253 -:4027C0000A431A701A7842F010021A70704700BF83430040014B01221A70704784430040044B00F00F021B6853F8220043F82210704700BF08ED00E0054A00F01F0012689F -:4028000000F1100352F8230042F82310704700BF08ED00E000F01F0000F16040490100F56440C9B2017070470F4B10B50F4900240F205C609C60DC601C615C61FFF7D0FF8C -:402840000B4A136843F0040313600A4B4FF47A72DB68B3FBF2F3084A1360084B4FF400421C60C3F8E82010BD4C86FF1FD528000010E000E0EC80FF1F14E000E018E000E0E5 -:40288000024A136843F002031360704710E000E008B5FFF7F5FF034A136843F00103136008BD00BF10E000E010B5054CA3691BB9FFF7BAFF0123A361BDE81040FFF7E8BF53 -:4028C0004C86FF1F024B1868C0F30040704700BF10E000E038B5FFF7F5FF012808D1054D002455F8243003B198470134052CF8D138BD00BF5086FF1F024B03EB800358680A -:40290000596070474C86FF1F134B144A1B78DBB20360127843EA0223114A0360127843EA0243104A0360127843EA026303600E4B0E4A1B78DBB24360127843EA02230C4A80 -:402940004360127843EA02430A4A4360127843EA02634360704700BF0301004904010049EC460040020100490101004900010049050100490601004910B500F011FB204AD4 -:40298000044613780A2043F002031370137C43F00203137412F80A3C43F0010302F80A3C937943F00103937102F5AB52137843F003031370134B18221A7013F8012C42F03A -:4029C000400203F8012C13F8012C02F0FC0203F8012CCE2203F8062CA3F597530222183B1A70094A137843F008031370FFF7CAFE064B10222046BDE810401A6000F0D4BA4A -:402A0000AB4300400E5900402F5B004080E200E008B500F0C5FA0F4A137803F0FE031370A2F5AA521D3A137803F0FD031370137C03F0FD03137412F80A3C03F0FE0302F8BC -:402A40000A3C937903F0FE039371BDE8084000F0ABBA00BF08590040044A137803F03F0343EA8010C0B21070704700BF08590040082804D00A280CBF8223C22300E04223C6 -:402A800008380E4AC0B20428137098BF0C4B4FF0000298BF33F910100A4B88BF11461A8042F210734B4341F2883103F6C41393FBF1F305490B60054B1A8070470A590040CE -:402AC000463A00001A87FF1F1C87FF1F2087FF1F08B5102000F0A6F907210420FFF79AFE07490420FFF788FE064A0C20137843F006031370FFF7BCFF034B00221A8008BD85 -:402B0000C92B0000095900401887FF1F10B5054C23781BB9FFF7DCFF01232370BDE81040FFF72ABF6886FF1F044B1A7802F0FB021A701A7842F001021A7070470859004052 -:402B400010B5084B1C7814F0010403D10028F9D0002404E02046FFF715FE024B1B78204610BD00BF09590040034A044B1B881088181A00B2704700BF2087FF1FA25B0040BD -:402B80000E4A13881BB223B111880A2309B2594301E00B4B19680B4B1B88C01A42F2107300B203FB00F2022391FBF3F30028D8BF5B42134493FBF1F000B270471A87FF1F9F -:402BC0001C87FF1F1887FF1F7047000010B500F0E7F9214A044613780A2043F001031370137C43F00103137412F80A3C43F0020302F80A3C937943F00203937102F5AA5297 -:402C00001832137843F003031370144B18221A7013F8012C42F0400203F8012C13F8012C02F0FC0203F8012CCE2203F8062CA3F597530222123B1A70094A137843F0080306 -:402C40001370FFF79FFD074B08222046BDE810401A6000F0A9B900BFAB43004006590040275B004080E200E008B500F099F90F4A137803F0FE031370A2F5AA52153A137805 -:402C800003F0FE031370137C03F0FE03137412F80A3C03F0FD0302F80A3C937903F0FD039371BDE8084000F07FB900BF00590040044A137803F03F0343EA8010C0B21070E3 -:402CC000704700BF00590040082804D00A280CBF8223C22300E0422308380E4AC0B20428137098BF0C4B4FF0000298BF33F910100A4B88BF11461A8042F210734B4341F2A5 -:402D0000883103F6C41393FBF1F305490B60054B1A80704702590040503A00002687FF1F2C87FF1F2487FF1F08B5102000F084F807210320FFF76EFD07490320FFF75CFDED -:402D4000064A0C20137843F006031370FFF7BCFF034B00221A8008BD212E0000015900402887FF1F10B5054C23781BB9FFF7DCFF01232370BDE81040FFF728BF6986FF1F6B -:402D8000044B1A7802F0FB021A701A7842F001021A7070470059004010B5084B1C7814F0010403D10028F9D0002404E02046FFF7E9FC024B1B78204610BD00BF01590040E9 -:402DC000034A044B1B881088181A00B2704700BF2487FF1FA05B00400E4A13881BB223B111880A2309B2594301E00B4B19680B4B1B88C01A42F2107300B203FB00F20223E4 -:402E000091FBF3F30028D8BF5B42134493FBF1F000B270472687FF1F2C87FF1F2887FF1F70470000034A00F0F800137803431370704700BF02410040034A00F0F800137833 -:402E400003431370704700BF06410040014B1870704700BF79640040014B1870704700BF7665004073B515461E460B4C04230022019200920A46014618462370FFF7F8FBA3 -:402E8000324629462078FFF7B3FB02212078FFF79DFB207802B070BDFC80FF1F074A0223136002F688321268E0215064044A11706FF440710A441360704700BF80E100E070 -:402EC00001E400E0014B1870704700BF72640040014B1870704700BF7064004000000000FEB5494652465B460EB40746244909688A46244A12682448022100F071F8030044 -:402F000020480068C018204900F06AF8143883460121C9430C460125002600F041F8814651460B7823400B705846013000F030F83800F04028400B78234003430B70584669 -:402F400000F026F80136072EF2D9002001300138013001200B78234003430B705846043000F016F8484600F01FF800BF00BF00BF0EBC894692469B46FEBD00BFAFF30080F9 -:402F8000D480FF1FF880FF1F00C20100000000000230800803D000BF01380046FCD17047EFF3108072B6704780F31088704700BF094A137803F00303012B0AD0022B09D141 -:402FC00013790C2103F07F02044B01FB02339B7A00E013790020704700600040A486FF1F002902D0B0FBF1F0704708B14FF0FF3000F008B80029F8D00246B0FBF1F000FB0F -:4030000011217047704700BF014B1868704700BF6081FF1F0E4B70B51E460E4C0025E41AA410A54204D056F8253098470135F8E700F0BAFD084B094C1E46E41AA410002501 -:40304000A54204D056F8253098470135F8E770BDB43B0000B43B0000B43B0000BC3B000003460244934202D003F8011BFAE7704730B5141E05469BB0184604DA8B232B6006 -:403080004FF0FF301DE04FF40273ADF80C300CBF234604F1FF33029305934FF6FF7300910491ADF80E3002461E9B6946284600F073F8431CBCBF8B232B6014B1009B0022B6 -:4030C0001A701BB030BD000007B5009313460A46014603480068FFF7CBFF03B05DF804FB6081FF1F2DE9F0478E6882469E420C46914698463ED88A8912F4906F3AD025681F -:40310000096902236F1A656905EB450595FBF3F57B1C43449D4238BF1D4653050FD5294600F04AFB064698B13A46216900F0D2FAA38923F4906343F08003A38113E02A46EA -:4031400000F098FB064670B92169504600F0E8FA0C23CAF80030A3894FF0FF3043F04003A381BDE8F08726613E44266046466561ED1BA560464528BF464649463246206879 -:4031800000F0B3FAA36800209B1BA36023681E442660BDE8F08700002DE9F04F9DB003938B8980461C060D4616460DD50B695BB9402100F001FB2860286118B90C23C8F894 -:4031C0000030CDE040236B610023099320238DF82930DFF89CB130238DF82A3037463C4614F8013B1BB9B7EB060910D003E0252BF9D02746F3E74B46324629464046FFF7AA -:4032000071FF013000F0A780099B4B4409933B78002B00F0A08000234FF0FF3204930793059206938DF853301A930126052221784E4800F041FA671C049B38B14B4A3C46A6 -:40324000801A06FA00F018430490EFE7D90644BF20228DF853201A0744BF2B228DF8532022782A2A03D0079A00210A200BE0039A111D12680391002A10DA524243F002002C -:40328000079204900BE027463B780134303B092B03D800FB02320121F5E701B107923B782E2B1ED17B782A2B0AD1039B02371A1D1B680392002BB8BF4FF0FF33059310E0D0 -:4032C000002319460593781C0A2407463A780130303A092A03D804FB01210123F5E703B1059103223978224800F0E6F940B14023CBEB000003FA00F0049B01371843049013 -:40330000397806221B487E1C8DF8281000F0D4F988B1194B33B9039B073323F007030833039314E003AB00932A46144B04A94046AFF3008007E003AB00932A460F4B04A9F6 -:40334000404600F093F8B0F1FF3F824603D0099B5344099342E7AB895B0601D4099801E04FF0FF301DB0BDE8F08F00BF833B0000893B00008D3B000000000000E530000069 -:403380002DE9F04791461F460A698B6806469342B8BF1346C9F8003091F843200C46DDF8208012B10133C9F800302368990642BFD9F800300233C9F80030256815F00605B2 -:4033C00010D104F1190A07E00123524639463046C04701301AD00135E368D9F800209B1A9D42F1DB94F843302268003318BF012392060FD5E118302081F843005A1C94F80E -:4034000045102244023382F8431003E04FF0FF30BDE8F08704F1430239463046C0470130F4D02268D9F80050E36802F00602042A08BF5D1B2269A3680CBF25EAE5750025EB -:403440009342C4BF9B1AED184FF000091A344D4509D00123224639463046C0470130D5D009F10109F3E70020BDE8F0872DE9F04317460A7E85B06E2A984606460C460C9BA3 -:4034800001F1430E00F0AE8011D8632A22D009D8002A00F0BB80582A40F0CA8081F84520834955E0642A1ED0692A1CD0C0E0732A00F0B08009D86F2A2ED0702A40F0B88060 -:4034C0000A6842F020020A603EE0752A24D0782A3AD0ADE01A6801F14205111D1960136884F84230A8E021681A6811F0800F02D0111D196008E011F0400F02F104011960A2 -:4035000002D0B2F9003000E01368002B3CDA2D225B4284F8432037E021681A6811F0800F02D0111D196007E011F0400F02F10401196001D0138800E01368227E5C496F2AFF -:4035400014BF0A2208221BE078225A4984F845202268186812F0800F00F104051D6003D1550601D5038800E00368D00744BF42F0200222601BB9226822F020022260102226 -:40358000002084F8430001E049490A226568002DA56008DB206820F0040020602BB9002D7DD175460CE0002B79D07546B3FBF2F002FB1033CB5C05F8013D03460028F5D1F1 -:4035C000082A0BD12368DA0708D5236962689A42DEBF302305F8013C05F1FF35C5EB0E0323612EE008681A6810F0800F496903D0101D1860136808E010F0400F02F1040047 -:403600001860136801D0198000E0196000232361754616E01A68111D1960156800216268284600F049F808B1401B6060636804E004F1420584F8422001232361002384F868 -:403640004330CDF800803B4603AA21463046FFF797FE013002D14FF0FF3026E023692A4639463046C0470130F5D023689B0710D5002504F1190907E001234A4639463046B8 -:40368000C0470130E7D00135E368039A9B1A9D42F2DBE068039B9842B8BF184605E00B7804F1420584F842308AE705B0BDE8F083353A0000943B000010B5C9B202449042A1 -:4036C000034605D01C7801308C42F8D1184610BD002010BD10B5431E0A44914204D011F8014B03F8014FF8E710BD884210B501EB020301D8421E0BE09842FBD28118D21A01 -:40370000D34204D013F8014D01F8014DF8E710BD994204D011F8014B02F8014FF8E710BD38B50546002944D051F8043C0C1F002BB8BFE41800F0D4F81E4A1368114613B9D1 -:403740006360146030E0A3420DD92268A018834201BF18685B681218226063600C6023E0A24203D813465A68002AF9D118681918A1420BD12168014458188242196013D1B2 -:4037800010685268014419605A600DE002D90C232B6009E021686018824201BF106852680918216062605C602846BDE8384000F098B838BD7086FF1F70B5CD1C25F003051E -:4037C00008350C2D38BF0C25002D064601DBA94202D90C23336046E000F082F8234B1C681A462146A1B10B685B1B0ED40B2B03D90B60CC18CD501EE08C420BBF63684B6856 -:403800001360636018BF0C4615E00C464968E9E7174C23681BB9304600F052F820602946304600F04DF8431C18D0C41C24F00304A0420DD12560304600F053F804F10B001D -:40384000231D20F00700C31A0ED05A42E25070BD211A304600F034F80130EBD10C233360304600F03EF8002070BD00BF7086FF1F6C86FF1FF8B5074615460E4621B9114619 -:40388000BDE8F840FFF798BF1AB9FFF749FF2846F8BD00F027F885420ED929463846FFF78BFF044650B131462A46FFF713FF31463846FFF735FF01E03046F8BD2046F8BD00 -:4038C00038B5064C0023054608462360FDF7DCFB431C02D1236803B12B6038BD5487FF1F7047704751F8040C0028BEBF091851F8043CC018043870470000000005020902A2 -:403900000B020D020F02110213027265706C792030782530327800686F6D696E6700626567696E6E696E67207365656B2066726F6D20256420746F2025640066696E697302 -:40394000686564207365656B0057616974696E6720666F72205553422E2E2E0055534220726561647900636F6D6D616E642030782530327800756E64657272756E20616661 -:40398000746572202564207061636B65747300636F756E743D256420693D256420643D256400636D645F777269746500703D25642063723D25642063773D256420663D2529 -:4039C0006420773D256420696E6465783D256420756E64657272756E3D25640077726974652066696E69736865640073746172742065726173696E670073746F7020657226 -:403A00006173696E670069646C650000510040100040510040300000000140001000140140000800400140000A004C0140000200500140200030313233343536373839416D -:403A40004243444546000001000000040000001000010000000400000010000028000000000104000100000000000000000157494E555342000030303030310000000000D0 -:403A80000000000012034D005300460054003100300030000100000001000000A03A0000010000006F3B0000000000000000000001000000B83A000001000000413B00002F -:403AC00004000000DA3A0000000000000000000000000000D83A0000FF00000001024000FF00000082024000FF00000003034000FF00000084034000FF0002030403090474 -:403B0000160346006C007500780045006E00670069006E0065002A0343006F0077006C00610072006B00200054006500630068006E006F006C006F00670069006500730073 -:403B40000009022E0001010080320904000004FF00000107050102400000070582024000000705030340000A0705840340000A12010002FF0001080912006E0100020180C5 -:403B8000014300232D302B2000686C4C00656667454647003031323334353637383961626364656600000000F8B500BFF8BC08BC9E4670475900000005110000F8B500BF16 -:403BC000F8BC08BC9E46704735000000E03B0000C880FF1FA0000000F005000000000000000000005887FF1FFF000000675000400C00000007000000FFFFFFFF7F80000066 -:403C00003F0000000000007D00FA0000400000000090D003FF0000000000000000000000000000000000000000000000000000000000000000000000813B00000000000070 -:403C400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000081FF1F00000000A5 +:4003800099F83246616B1548FFF7B1FF114D0027636B9E4216D001F0D7FE00B16F63636B9E4205DD0020FFF72BFF6B6B013305E005DA0120FFF724FF6B6B013B6B6302F059 +:4003C000A1F8E5E7322002F05FF8BDE8F8400448FFF78DBF8081FF1F473600004E3600006B3600002DE9F04F9BB062B602F0F4F8B449042002F018F9B34801F0B1FEB34881 +:4004000002F0E4FBB24801F0E5FE02F0C5FA02F097F9002002F0B8FB01F000FF0221002000F0A4FFAB4D0321084602F04BF82E462C46DFF8C4B202F065F8AB7F73B12A6A5C +:40044000EB689B1A41F28832934207D9002001F075FE002002F098FB0023AB7700F0BEFF18B99D48FFF743FF04E000F0BDFF0028F7D109E000F0B2FF0028FBD09748FFF7F7 +:4004800036FF032001F016F8032000F0B9FF0128D1D19348FFF764FE92490320FFF782FE94F838109048FFF722FF94F83830023B122B00F2F583DFE813F01300F3031C001E +:4004C000F3032200F3034400F3036800F303A001F3033503F3035403F3035A03F303650303238DF828308DF829300A238DF82A3044E394F83A00FFF731FF7C4B3BE3FFF7AE +:4005000065FE00236372E068627A02F0FF0132B9EB681B1AB3F57A7FF6DD0B4608E03BB100227272F168627A12B9EB685B1AFAE707228DF8282004228DF82920ADF82A30A6 +:400540001CE30220FFF7E0FD4FF000090DF1280A4FF480780027C8EB0903DA1907F80A200137402FF9D10220FFF7CEFD3A465146022000F061FFB8F10108EBD109F1010983 +:40058000B9F1400FE4D15A4BC7E294F83A0001F0F9FD606BFFF7E2FE02F09AFB554BDFF85C811A78002742F004021A701A7842F001021A701A7802F0FE021A701A7802F0B8 +:4005C000FE021A7002F088FB0220FFF79DFD41F6FF734FF480420121022002F0DBFA84F8780001F0FDFE08F807000137102FF8D1DFF80CA100270AF15D081FFA88F901378D +:40060000102F14BF3A4600221AF8010F2244062392F82420402101F017FF4A4646F242419AF8000001F022FF09F14009102F1FFA89F9E4D100237372637A002BFCD000275B +:40064000142239460AA8777202F0A2FB40230D934FF0FF333760736037723368DFF8A490334493F8241096F87800CDF8309001F06FFE96F8780001F02DFE012196F8780005 +:4006800001F000FECDF81090236813B96B7A002BFAD0002794F83BA0676094F80890B9F1000F08D101F02EFF6B7A83B3BAF1010A85F809902BD1042194F8780001F054FE3D +:4006C0005CE000BF19010000F900000091000000C50000008081FF1F793600008C3600009881FF1FB881FF1F963600002C3600002E360000926400409C640040A481FF1F2D +:40070000A381FF1F0086FF1F2B7A002BD3D1626823689A42F8D04FF0000962680AA808EB82124A440A92C9F140020B9200F0DAFA0B9A0137C2F1400209EB02030D9A5FFAC9 +:4007400083F95AB90220FFF7DFFC4022BC49022000F072FE049B0C9340230D93B9F13F0FDBD96268B74B01321340002BBEBF03F1FF3363F00F03013363608EE794F878002C +:4007800001F002FE0028F9D10AA800F0DFFA0220FFF7BAFC337A63B90D9A402A06D0C2F1400292B2A649022000F046FE0220FFF7ABFC0D9A32F0400206D10220114600F0D5 +:4007C0003BFE0220FFF7A0FCFFF744FD237A33B19D48FFF78CFD0220FFF7B0FD06E09B4B09A81B88ADF82430FFF796FD627A3946237A9748FFF77BFD55E29648FFF777FDC5 +:40080000E76B17F03F0701D003204AE2012001F0BFFC95F83A0001F0B5FC02F059FA9BF80030DFF8348203F0FB038BF800309BF8003043F001038BF800309BF8003003F027 +:40084000FE038BF800309BF8003003F0FE038BF8003002F041FA686BFFF780FD01214FF4804341F6FF72084601F098FC85F8780001F0B6FD08F807000137102FF8D1DFF88D +:40088000DC91002709F15D031FFA83F807930137102F14BF3A46002219F8010F2244052392F82420402101F0CFFD414646F24C4299F8000001F0DAFD08F14008102F1FFA56 +:4008C00088F8E4D10027B946BA46F36B4FF0FF389B09142239460AA837600593C6F80480377202F055FA402301200D9300F0E2FDCDF81880049701F005FE2268514B01322B +:400900001340002BBCBF03F1FF3363F00F036168B8BF01338B4200F0A380BAF1000F07D0237A002B40F0B0806B7A002B40F0AC800B9B002B34D1B9F1000F0BD07F22404926 +:400940005A540133402BFAD10A910B9328E0BAF1000F06D1012000F053FD01288046F6D107E0237A002B40F08F806B7A002BF1D08AE03349FFF716FC8146314B0B90404665 +:400980000A9300F097FDB9F13F0F07F1010706DD059BDB1BD3F1000949EB030900E0C1460B9BDBB12368079A0AA802EB83120D9BC3F1400313440C9300F0D7F90D9B6BB9FE +:4009C0002A68204B01321340002BBEBF03F1FF3363F00F030133236040230D93636801333ED12B680F2B3BD14FF00008C5F8048001F002FC85F808806B6895F878002B44DD +:400A000093F8241001F0A4FC95F8780001F062FC012195F8780001F035FC85F80980637A002BFCD04FF00008012086F8098001F0EFFB404601F0ACFBCDF8188013E000BF78 +:400A40000086FF1F0F000080A536000030360000BF360000D2360000A481FF1FA381FF1FBAF1000F05D0237A73B96B7A63B94FF0010A6368069A93423FF43DAF049B0133AB +:400A800004936B68069336E701F0BCFB012001F07FFB002001F0BCFB042194F8780001F063FC94F8780001F06FFC0028F9D196F8780001F0FDFB737A327A02930123039279 +:400AC0000193CDF80090049B3A4605997A48FFF70EFCB9F1000F16D1059BBB420ADD012000F08EFC01288046F6D17449FFF75AFB3F2803DC012000F017FD04E0404600F04C +:400B0000D9FC0137E8E7FFF7A5FB6D48FFF7EFFB237A0BB10220C4E06A4B1B8809A8ADF824302CE094F83A0001F02CFB606BFFF715FC6548FFF7DBFB00236372637A002B58 +:400B4000FCD0012001F064FB00237372637A002BFCD0002001F05CFB5C48FFF7C8FB5C4B09E000206077FFF7F9FB5A4B03E05A48FFF7F6FA594B1B88ADF828300AA8FFF72A +:400B8000CBFB90E0A37F3BB1002001F0D7FA002001F0FAFF0023AB7701F07CFF002001F01FFF2A2701F04AFE002001F0EDFD3A4600210AA802F0ECF815238DF828308DF8DD +:400BC000297001F09FFC002001F0B8FA002001F0DBFFC82001F058FC0DEB0700FFF752FB0DF13E00FFF76FFB01F08CFC012001F0CBFF322001F048FC0DF12E00FFF742FBDC +:400C00000DF14200FFF75FFB012001F097FA4FF4967001F039FC01F075FC0DF13600FFF731FB0DF14A00FFF74EFB002001F086FA4FF4967001F028FC01F064FC022001F080 +:400C4000A3FF322001F020FC0DF13200FFF71AFB0DF14600FFF737FB012001F06FFA4FF4967001F011FC01F04DFC0DF13A00FFF709FB0DF14E00FFF726FB002001F05EFAD2 +:400C80004FF4967001F000FC01F03CFC002001F07BFF0023637701F07FFE01F051FD6DE70120FFF74BFB032000F004FC0C48FFF71EFBFFF7C0BB00BFDC3600000086FF1F93 +:400CC0000C370000323600001B370000293700003436000036360000B881FF1F383600003637000010B54268002A2ED0C368002B2BD00368048A591C01601B78013A13F007 +:400D0000800F817C42601DBF03F0010242EA84030231083114BF43F0020343EA0423817414BF03820382837C072BDCD9028A083B42FA03F38268511C81601370C368013B5A +:400D4000C360837C083B8374CDE710BD07B5827C42B102AA002102F8011D026001224260FFF7C0FF03B05DF804FB30B543686BB3C2685AB3827C072A0CD8046890F91050D4 +:400D8000611C01602178013B41EA05210832018243608274827C018AA2F108042141CBB2090608D5C3F3801363F07F03023A03F08103827402E08474002BD7D08268511C1C +:400DC00081601370C368013BC360CFE730BD00002DE9F04172B6854B61221A70A3F5F06301221A801924824A9C7092E803008033062283F8002283E80300522203F5807397 +:400E00001A707C4B7C4A1B787C4EDBB2137040F618027B4B00251A8041F2512223F8022C33784FF4F07003F0010343EA450501F047FF013C05F003052ED0032DF0D1714B92 +:400E40004FF480721A8007221A706F4A002548211570917002221D705D7103F8032C0422DA716A4A6A4C13786A4E43F00103137012F8013C062743F0030302F8013C237823 +:400E8000012243F080032370584B1A70624A137843F02003137000E0FEE707FB056300219A881868013501F073FF072DF5D15B485B4E002550F8041F05F1105303F1520287 +:400EC00021F0FF075333C9B20B4452005B0002329A4206D012F802EC12F801CC0EF807C0F5E7B0420D44E5D14E4B00221A604E4B4E4F1A684E4BDFF87C811A604D4A137891 +:400F000043F002031370137C43F0020313742378A2F5863243F040032370413A137843F010031370444A454B07CA03C31A80444A2833106843F8250C127903F8212C414A6C +:400F400007CA03C31A80404AE83B07CA03C31A803E4A083307CA03C31A803D4A3D4BA2F5616203CBC2F8100EC2F8141E1378042043F008031370384B02F5AA521B783D7845 +:400F8000DBB298F80060EDB203F007010C321B091170F6B2537045F003033B7046F0030388F800302D4B48221A702D4A402313702C49937013729372082382F81F322022F7 +:400FC0000A7048710A72284A0A20137001F072FA264B88F8006044223D70254D1A7094E80F0007C52B80BDE8F08100BF00480040840F00480F010049A14600402542004005 +:40100000224200400440004006400040A2430040A04300403B370000E8460040FCFFFF47A0000048007600408C0F0048F84600400876004003500140440F0048C05100405C +:40104000500F0048580F0048640F0048700F0048325100407C0F0048CF0100491D51004001590040235B0040585B004076580040B0430040F946004008B501F05DFE0368BC +:401080000C2B00D1FEE7FEE7084908B50B68084A1844821A802A01DC086005E001F04CFE0C2303604FF0FF33184608BDCC80FF1F4087FF1F80B51148114B0025C0B1A3F1FB +:4010C000100192C922460439161BB74204D051F8046F42F8046BF7E7114653F8046C8C1AA64202D041F8045BF9E701381033E5E701F028FEFFF776F9FEE700BF010000004B +:401100000C390000124A134B10B51A60124A134C1368134843F4007313600023032B98BF54F823204FEA830188BF0E4A0133302B4250F3D10C4B1A780C4B1A700C4B084AD8 +:401140001A60FFF745FEBDE8104001F085B800BF0004FA050CED00E014ED00E0000000000080FF1F79100000BC760040C080FF1F08ED00E0F8B501F0ABFD444A01271378CA +:40118000022643F001031370137C414C43F001031374404B02F5E3521F700B3203F8946C1378054603F07F031370002001F082F92378394A03F0F90323701378384603F0FF +:4011C000DF03137023783B43237001F073F9282001F070F9314B30461A7802F07F021A701A7802F0BF021A7023783343237001F061F923782A4A43F004032370002313701E +:401200002846537001F068FD0721172001F09AF92449172001F088F90721182001F092F92149182001F080F90721152001F08AF91E49152001F078F90721052001F082F9BE +:401240001B49052001F070F90721062001F07AF91849062001F068F90721084601F072F91549072001F060F90721082001F06AF91249082001F058F907210C2001F062F956 +:40128000BDE8F8400E490C2001F04EB9A5430040944300409D60004012600040F851004084600040CF19000009180000CD190000011900002D1900005D1900009519000088 +:4012C000D319000008B51D4B1D4A1870002313701C4A13701C4A13701C4A13701C4A13701C4A13701C4A13701C4B4FF400021A604FF080721A604FF400121A6020221A6076 +:4013000040221A6080221A604FF480721A60144B19B91A7802F0FE0202E01A7842F001021A70104B03221A70802203F8202C012001F0C6FC0C4B04221A7008BD7C86FF1F6B +:401340008286FF1F8086FF1F8186FF1F7D86FF1F6C86FF1F7F86FF1FF486FF1F00E100E009600040286000401260004070B5074C054623780E461BB9FFF7FCFE0123237001 +:4013800031462846BDE87040FFF79CBF4086FF1F0A4A002313700A4A13700A4A13700A4A13700A4A13700A4A13700A4A13700A4B03221A70802203F8202C70478286FF1FF0 +:4013C0008086FF1F8186FF1F7D86FF1F6C86FF1F7F86FF1FF486FF1F28600040014B1878704700BF8186FF1F044B1A7802F0FF001AB118780022C0B21A7070478086FF1F53 +:40140000024A0C2303FB0020407870478886FF1F431E072B0CD8074A064B00010344805C5B7800F00F0043EA0020023880B2704700207047FC5F0040431E072BF0B531D846 +:40144000194B0C2505FB0035EC88184FA4B2C4F50074A2424FF00C0404FB003488BFEA88E67884BFC2F5007292B2104C46EA12260501EE552C44D6B2667041B90C2202FB17 +:401480000030002343704379DBB2A370F0BD0E46074F2F44751AADB2AA42EFD916F8015B3D72F7E7F0BD00BF8886FF1FFC5F004070600040431E072B0AD8064A0C2303FB32 +:4014C000002300225A705A79034BD2B200011A54704700BF8886FF1FFE5F004038B505461446D1B1431E072B19D8FFF791FFA04203D22846FFF78CFF04460A4609482B01AF +:401500001844531A9BB29C4203D9037A02F8013BF7E72846FFF7CEFF02E00C4600E00024204638BD70600040431E072B9FBF024B000108221A547047FE5F004030B51A4A02 +:401540001A491B4D0878138803449BB21380194A00231488D8B2A4B27CB1082B0CD050680078C0B2E85450680133013050601088013880B21080ECE718460B780E4C082BA1 +:401580000E4A00D040B10E4D2B7883F080032B700F232370022301E0022323701370094B1870087030BD00BFF886FF1FF486FF1F006000407086FF1F6D86FF1F8286FF1F5E +:4015C0007E86FF1FF586FF1F074B02221A70074B80221A70064B0F221A70064A00231370054A0120137070478286FF1F7E86FF1F6D86FF1FF486FF1FF586FF1F30B5164B36 +:4016000016491B780A8803F00F03023BDBB21A4492B20A80124C134A0020118889B279B173B15568215C013BC9B229705168DBB20131516011880130013989B21180ECE7D8 +:40164000094A1370094A137883F080031370084B0B221A7030BD00BF29600040F886FF1F006000407086FF1FF586FF1F7E86FF1F6D86FF1F064A06231370064A01201370B2 +:40168000054B80221A70054B00221A70704700BF8286FF1F6D86FF1F7E86FF1FF586FF1F054B9A683AB19A68044910709A680988518000229A6070477086FF1FF886FF1F57 +:4016C00008B5124B1A78D2B21A701B78DBB21A0602D50F4A137008BD0220FFF7E1FF0D4B1B7803F06003202B05D0402B06D043B900F0D4FB04E001F0F3FA01E000F008FD8B +:4017000010B9034B03221A7008BD00BF286000406D86FF1F0060004008B5084A084B0120197813880B449BB21380064B00221A70FFF7B6FF044B03221A7008BDF886FF1F01 +:40174000F486FF1F8286FF1F6D86FF1F08B50C4B1B78DBB2042B07D0062B09D0022B0DD1BDE80840FFF7D8BFBDE80840FFF746BF0320FFF795FF034B03221A7008BD00BFBB +:401780008286FF1F6D86FF1F08B5054B002201201A70FFF785FF034B03221A7008BD00BF8286FF1F6D86FF1F08B50A4B1A7832B11A78094942F080020A7000221A70074B4F +:4017C000002201201A70FFF76BFF054B03221A7008BD00BF6C86FF1F086000408286FF1F6D86FF1F074B1B78DBB2042B05D0062B05D0022B05D1FFF7A1BEFFF7C5BFFFF706 +:40180000D3BF70478286FF1F38B51D4C2378DBB2DD0634D518060AD503F00F03012B2ED1FFF74EFF174B1B78190609D538BD5A0602D5FFF7D7FF03E09D0620D5FFF786FF7F +:4018400023781B061BD4104B1A78104B1B7813430F4A13701278934211D10A4A0849154613782078DBB2000605D41378DBB20B700B7803F00F0328788342F1D138BD38BDB4 +:40188000286000406D86FF1F7E86FF1FF586FF1F29600040054A00231380054A916819B191680B7092685380704700BFF886FF1F7086FF1F0E4808B503889BB213B9FFF7A0 +:4018C00083FE13E00B4B02221A700B4B00221A70FFF7E0FF094AD1799379028843EA012392B2934238BF0380FFF728FE012008BD7086FF1F8286FF1F7E86FF1F0060004084 +:40190000084B01221A700F3B9B7C074B1A7B02F00302012A1EBFDA7B82F08002DA7301225A7370470B6000408886FF1F094B02221A700F3B93F82230074B1A7E02F0030242 +:40194000012A1EBFDA7E82F08002DA7601225A76704700BF0B6000408886FF1F0B4B04221A700F3B93F83230094B93F8242002F00302012A1EBF93F8272082F0800283F8E3 +:401980002720012283F82520704700BF0B6000408886FF1F0B4B08221A700F3B93F84230094B93F8302002F00302012A1EBF93F8332082F0800283F83320012283F83120A2 +:4019C000704700BF0B6000408886FF1F7047FFF7DFBC00F039BC000070B50446184B88B003AA03F11006154618685968083303C5B3422A46F7D11B782B70FCB1222323702D +:401A000001AD03232846637000F016FE002220461146AB5C08AC04EB131414F8144C03F00F03847008AC234413F8143C0132082AC1700371417100F10400EAD108B070BDB1 +:401A4000653700002DE9F0411A4D01222E460C2080274FF0080E184B00FB025C14012344187016499CF805802144B8F1000F07D09CF8044024064CBF887081F802E000E0F1 +:401A80008F7000FB0261CC880132E4B29C71CC88092AC4F30724DC71CC88E4B21C71C988C1F307215971D6D1054BFF221A70BDE8F08100BF8886FF1F70600040FC5F00402D +:401AC0000A600040064B074A1B7802EBC30253681A7C824286BF03EBC0035869002070477C86FF1FC83700002DE9F84F424B1A78002A7ED01878414D0138C0B2FFF7E2FFFF +:401B0000A8463F4AC3681478007ADFF800C1E4B203EBC0000C2600274FF0010E834268D01A78A24263D11CF80420597891425ED19A7893F8039002F07F0206FB02FA05EB38 +:401B40000A01CF7093F802B009F0030981F804B093F803B005F80AB0B3F804A0A1F808A093F902A0BAF1000F0BDAB9F1010F0CBF4FF007094FF00D0981F8059081F801E0C9 +:401B800009E0B9F1010F0CBF4FF005094FF0090981F805904F704FEA02191A4906FB0282494481F802E0B2F808A0CAF3072A81F800A0B2F808A05FFA8AFA81F801A0B2F8DC +:401BC00006A011495FFA8AFA494481F806A0B2F80690C9F3072981F80790B2F806905FFA89F981F80490D288C2F307224A71083394E7BDE8F88F00BF8186FF1F8886FF1F13 +:401C00007D86FF1FFC5F0040706000406E86FF1F08B5064B18780138C0B2FFF753FF20B143681B7900EBC300406908BD8186FF1F00212DE9F84F0B464E4E0C2707FB01F44F +:401C400001313219092933554FF000059370494CD3701381937253705371EFD118B1464B1D70464B1D70464B1A78002A7FD0187801250138C0B2FFF725FFA8464368DFF8A2 +:401C8000F8E0DB790C2713F0400F3E4B4FF0000C1A7814BF42F0010202F0FE021A70027AD20007FB0541C36803EB02094B4531D093F802A00AF07F06AE4229D10E89B3F866 +:401CC00004B0B6B25E4538BFA1F808B01E7893F801B01EF80660B3451AD181F804A0DE780E7093F902A0DE78BAF1000F06F0030607DA012E0CBF07260D264E7181F801808A +:401D000006E0012E0CBF052609264E7181F801C00833CBE70135092DC3D1C1680A328B1C0A440C200833934209D013F8081C13F80A5C01F07F0100FB01418D72F2E7FFF7F8 +:401D400067FF114B0121186000230C2000FB0142D3801289013113449BB203F00102134409299BB2F2D1BDE8F84FFFF76BBEBDE8F88F00BF8886FF1F6E86FF1FF686FF1F59 +:401D80008186FF1F7F86FF1F8486FF1F114B1B7903F07F035A1E072A19D80F490C2202FB031291781B0141F0010191700021D170517841F002015170127912F0800F074A36 +:401DC0001A4414BF8D2389239370FFF753BC0020704700BF006000408886FF1FFC5F004030B4194B1A7902F07F02531E072B27D8164B0C2404FB02339978154D01F0FE0139 +:401E000099700021D97029461201505D114400F07F0050555A7802F0FD025A701A795B78120605D5012B01D18C7006E00D2303E0012B0CBF082309238B7030BCFFF71ABCBE +:401E4000002030BC704700BF006000408886FF1FFC5F004010B50D4B0D4C21791878C9B20138C0B2FFF72EFE43681B798B4201D2012909D8074A0848535CDBB24354A37818 +:401E80000120DBB2535410BD002010BD8186FF1F006000406E86FF1FF686FF1F38B58A4A8A4C13780021DBB221801806517840F18D800A2900F20581DFE811F05D00030138 +:401EC00003010301030103010B0003017E0003018200D3787C49012B09D17D4B1A787D4B03EBC2035B685B686360122310E0CB78022B12D18878FFF7E5FD002800F0E180C2 +:401F0000436863606368DA7863689B7843EA02232380BDE83840FFF7CDBCCB78032B26D16D4B00228878D5B2854209D3664A91786A4AEE2908BF1346634A917881B106E0C9 +:401F4000187801320028F1D018780344EAE764499278097C914203D16248FFF73DFD614B1A78002A00F0AD801A78228018E0BDE8384000F0B5BE13F0030313D0022B40F0D6 +:401F8000A0802380504B0C211B7903F07F02564B01FB02339A78554BD2B21A7000225A706360B6E702222280514A11784F4AC9B2117053706260ACE7012323804D4BEFE7E4 +:401FC0000123238013794C4A1344E9E701390A2977D8DFE801F037764F76067676760A7620009378454ADBB25AE0937803F0FF0153B9404B1A7891425FD01970404B012024 +:402000001870FFF715FE58E0481EC0B2FFF75AFD0028EED155E0FFF71DFF002851D02A4A384913791279DBB2D2B20A70364A3249D25CCB5C9A4240D0314B01221A70FFF749 +:4020400053FD3AE003F00303012B2BD009D3022B37D11D4B9B78002B33D1BDE83840FFF7BFBE194B9B78012B2BD1214A137803F0FD0315E003F00303012B13D008D3022BFE +:402080001FD1114B9B78E3B9BDE83840FFF77EBE0D4B9B78012B14D1154A137843F0020313700AE0084B1A795AB998781B791749DBB2CA5C22EA0002CA54BDE83840FFF7DC +:4020C000D9BA002038BD00BF006000407086FF1F7C86FF1FC83700002C380000B43700009F3800001487FF1F8886FF1F4186FF1F7F86FF1F8186FF1F6E86FF1F6C86FF1F4C +:402100008086FF1F7D86FF1FF686FF1F8386FF1F074B1A78120609D55B78012B06D1054B054A5A6012781A80FFF7C4BB00207047006000407086FF1F8C370000014B1870D5 +:40214000704700BF76650040014B1878704700BF6B650040014B1870704700BF78650040064A0123136002F688321268E0211064034A1170A2F540721360704780E100E0FB +:4021800000E400E0014B1870704700BF7E640040014B1870704700BF7864004073B515461E460B4C01230022019200920A4601461846237000F0F4F832462946207800F00D +:4021C000AFF80221207800F099F8207802B070BDD080FF1F064A0423136002F688321268E0219064034A1170A2F202321360704780E100E002E400E0014B04221A607047A2 +:4022000000E100E0014B04221A60704780E100E0014B1870704700BF77640040704738B505460078012428B100F0F2FC285D0134E4B2F8E738BD08B50D2000F0E9FCBDE8C9 +:4022400008400A2000F0E4BC024B1878C0F38010704700BF8F450040074A7F23802113705170064A013BDBB202F80839002BF9D1034A1370704700BFE080FF1FF87B00401A +:402280000078004017280FD8084B0001C25C11B142F0200201E002F0DF02C254C25C42F00102C25400207047012070471070004017280BD8064B0001C25C02F0FE02C2547C +:4022C000C25C02F0DF02C25400207047012070471070004017280DD8074900010B4603441A7942F004021A71435C43F00103435400207047012070471070004017280BD807 +:40230000064A0001835C490003F0F10301F00E011943815400207047012070471070004041F6FF73994208BF4FF400519A4208BF4FF4005217289FBFC00000F1804000F583 +:40234000EC4081809ABFC280002001207047000017289FBF034B00011954002088BF0120704700BF1970004017289FBF054B00011A5C01F007019DBF1143195400200120C2 +:40238000704700BF1470004017289FBF034B0001185C00F0070088BFFF20704714700040172810B51AD8C00001F07F0100F1804441EAC21204F5EC44D2B222709DF80820D4 +:4023C00003F00F0343EA0213DBB263709DF80C30002003F00F03A370E07010BD012010BD10B500F075FC0A4A5378182B0AD91478013B5370E30003F1804303F5F0431B78D4 +:40240000137000E0FF2400F067FC204610BD00BFE080FF1F030610B5044611D400F058FC084AE300117803F1804303F5F04319705378147001335370BDE8104000F04CBCB6 +:4024400010BD00BFE080FF1F30B504060CD411F4704509D1C40004F1804404F5F0442180A270E370284630BD012030BD03065FBFC00000F1804000F5F04081805ABFC280BD +:40248000002001207047000038B50446084DB4F5004F05D9286800F013FCA4F50044F6E7034B58686043BDE8384000F009BC00BFE880FF1F024B1B7A584300F001BC00BFC8 +:4024C000E880FF1F0E4B00F003001A78490102F0FC02104318701A7801F0600142F080021A701A7802F07F021A701A7802F09F020A431A701A7842F010021A70704700BFE0 +:4025000083430040014B01221A70704784430040044B00F00F021B6853F8220043F82210704700BF08ED00E0054A00F01F00126800F1100352F8230042F82310704700BFBA +:4025400008ED00E000F01F0000F16040490100F56440C9B2017070470F4B10B50F4900240F205C609C60DC601C615C61FFF7D0FF0B4A136843F0040313600A4B4FF47A72A2 +:40258000DB68B3FBF2F3084A1360084B4FF400421C60C3F8E82010BD4486FF1F0526000010E000E0E880FF1F14E000E018E000E0024A136843F002031360704710E000E08E +:4025C00008B5FFF7F5FF034A136843F00103136008BD00BF10E000E010B5054CA3691BB9FFF7BAFF0123A361BDE81040FFF7E8BF4486FF1F024B1868C0F30040704700BFF1 +:4026000010E000E038B5FFF7F5FF012808D1054D002455F8243003B198470134052CF8D138BD00BF4886FF1F024B03EB80035868596070474486FF1F134B144A1B78DBB2C6 +:402640000360127843EA0223114A0360127843EA0243104A0360127843EA026303600E4B0E4A1B78DBB24360127843EA02230C4A4360127843EA02430A4A4360127843EA32 +:4026800002634360704700BF0301004904010049EC460040020100490101004900010049050100490601004910B500F011FB204A044613780A2043F002031370137C43F068 +:4026C0000203137412F80A3C43F0010302F80A3C937943F00103937102F5AB52137843F003031370134B18221A7013F8012C42F0400203F8012C13F8012C02F0FC0203F8EC +:40270000012CCE2203F8062CA3F597530222183B1A70094A137843F008031370FFF7CAFE064B10222046BDE810401A6000F0D4BAAB4300400E5900402F5B004080E200E0B8 +:4027400008B500F0C5FA0F4A137803F0FE031370A2F5AA521D3A137803F0FD031370137C03F0FD03137412F80A3C03F0FE0302F80A3C937903F0FE039371BDE8084000F039 +:40278000ABBA00BF08590040044A137803F03F0343EA8010C0B21070704700BF08590040082804D00A280CBF8223C22300E0422308380E4AC0B20428137098BF0C4B4FF00A +:4027C000000298BF33F910100A4B88BF11461A8042F210734B4341F2883103F6C41393FBF1F305490B60054B1A8070470A59004076370000FE86FF1F0087FF1F0487FF1F9A +:4028000008B5102000F0A6F907210420FFF79AFE07490420FFF788FE064A0C20137843F006031370FFF7BCFF034B00221A8008BDF928000009590040FC86FF1F10B5054C93 +:4028400023781BB9FFF7DCFF01232370BDE81040FFF72ABF6086FF1F044B1A7802F0FB021A701A7842F001021A7070470859004010B5084B1C7814F0010403D10028F9D00C +:40288000002404E02046FFF715FE024B1B78204610BD00BF09590040034A044B1B881088181A00B2704700BF0487FF1FA25B00400E4A13881BB223B111880A2309B2594365 +:4028C00001E00B4B19680B4B1B88C01A42F2107300B203FB00F2022391FBF3F30028D8BF5B42134493FBF1F000B27047FE86FF1F0087FF1FFC86FF1F7047000010B500F07F +:40290000E7F9214A044613780A2043F001031370137C43F00103137412F80A3C43F0020302F80A3C937943F00203937102F5AA521832137843F003031370144B18221A708F +:4029400013F8012C42F0400203F8012C13F8012C02F0FC0203F8012CCE2203F8062CA3F597530222123B1A70094A137843F008031370FFF79FFD074B08222046BDE8104091 +:402980001A6000F0A9B900BFAB43004006590040275B004080E200E008B500F099F90F4A137803F0FE031370A2F5AA52153A137803F0FE031370137C03F0FE03137412F829 +:4029C0000A3C03F0FD0302F80A3C937903F0FD039371BDE8084000F07FB900BF00590040044A137803F03F0343EA8010C0B21070704700BF00590040082804D00A280CBF21 +:402A00008223C22300E0422308380E4AC0B20428137098BF0C4B4FF0000298BF33F910100A4B88BF11461A8042F210734B4341F2883103F6C41393FBF1F305490B60054B73 +:402A40001A80704702590040803700000A87FF1F1087FF1F0887FF1F08B5102000F084F807210320FFF76EFD07490320FFF75CFD064A0C20137843F006031370FFF7BCFF64 +:402A8000034B00221A8008BD512B0000015900400C87FF1F10B5054C23781BB9FFF7DCFF01232370BDE81040FFF728BF6186FF1F044B1A7802F0FB021A701A7842F001027B +:402AC0001A7070470059004010B5084B1C7814F0010403D10028F9D0002404E02046FFF7E9FC024B1B78204610BD00BF01590040034A044B1B881088181A00B2704700BF9C +:402B00000887FF1FA05B00400E4A13881BB223B111880A2309B2594301E00B4B19680B4B1B88C01A42F2107300B203FB00F2022391FBF3F30028D8BF5B42134493FBF1F05F +:402B400000B270470A87FF1F1087FF1F0C87FF1F70470000034A00F0F800137803431370704700BF02410040034A00F0F800137803431370704700BF06410040014B187044 +:402B8000704700BF73640040014B1870704700BF7664004073B515461E460B4C0023019300930A46014618462370FFF7F9FB324629462078FFF7B4FB02212078FFF79EFBBC +:402BC000207802B070BD00BFF880FF1F074A0223136002F688321268E0215064044A11706FF440710A441360704700BF80E100E001E400E0014B1870704700BF7B650040B5 +:402C0000014B1870704700BF7465004000000000FEB5494652465B460EB40746244909688A46244A12682448022100F071F8030020480068C018204900F06AF814388346AE +:402C40000121C9430C460125002600F041F8814651460B7823400B705846013000F030F83800F04028400B78234003430B70584600F026F80136072EF2D9002001300138D5 +:402C8000013001200B78234003430B705846043000F016F8484600F01FF800BF00BF00BF0EBC894692469B46FEBD00BFAFF30080D480FF1FF480FF1F00C2010000000000C4 +:402CC0000230800803D000BF01380046FCD17047EFF3108072B6704780F31088704700BF094A137803F00303012B0AD0022B09D113790C2103F07F02044B01FB02339B7A0D +:402D000000E0137900207047006000408886FF1F002902D0B0FBF1F0704708B14FF0FF3000F008B80029F8D00246B0FBF1F000FB11217047704700BF014B1868704700BF0E +:402D40005C81FF1F0E4B70B51E460E4C0025E41AA410A54204D056F8253098470135F8E700F0BAFD084B094C1E46E41AA4100025A54204D056F8253098470135F8E770BDEA +:402D8000E4380000E4380000E4380000EC38000003460244934202D003F8011BFAE7704730B5141E05469BB0184604DA8B232B604FF0FF301DE04FF40273ADF80C300CBFC5 +:402DC000234604F1FF33029305934FF6FF7300910491ADF80E3002461E9B6946284600F073F8431CBCBF8B232B6014B1009B00221A701BB030BD000007B5009313460A460E +:402E0000014603480068FFF7CBFF03B05DF804FB5C81FF1F2DE9F0478E6882469E420C46914698463ED88A8912F4906F3AD02568096902236F1A656905EB450595FBF3F57F +:402E40007B1C43449D4238BF1D4653050FD5294600F04AFB064698B13A46216900F0D2FAA38923F4906343F08003A38113E02A4600F098FB064670B92169504600F0E8FA63 +:402E80000C23CAF80030A3894FF0FF3043F04003A381BDE8F08726613E44266046466561ED1BA560464528BF464649463246206800F0B3FAA36800209B1BA36023681E44B8 +:402EC0002660BDE8F08700002DE9F04F9DB003938B8980461C060D4616460DD50B695BB9402100F001FB2860286118B90C23C8F80030CDE040236B610023099320238DF832 +:402F00002930DFF89CB130238DF82A3037463C4614F8013B1BB9B7EB060910D003E0252BF9D02746F3E74B46324629464046FFF771FF013000F0A780099B4B4409933B78C5 +:402F4000002B00F0A08000234FF0FF3204930793059206938DF853301A930126052221784E4800F041FA671C049B38B14B4A3C46801A06FA00F018430490EFE7D90644BF72 +:402F800020228DF853201A0744BF2B228DF8532022782A2A03D0079A00210A200BE0039A111D12680391002A10DA524243F00200079204900BE027463B780134303B092B14 +:402FC00003D800FB02320121F5E701B107923B782E2B1ED17B782A2B0AD1039B02371A1D1B680392002BB8BF4FF0FF33059310E0002319460593781C0A2407463A78013093 +:40300000303A092A03D804FB01210123F5E703B1059103223978224800F0E6F940B14023CBEB000003FA00F0049B013718430490397806221B487E1C8DF8281000F0D4F991 +:4030400088B1194B33B9039B073323F007030833039314E003AB00932A46144B04A94046AFF3008007E003AB00932A460F4B04A9404600F093F8B0F1FF3F824603D0099BEA +:403080005344099342E7AB895B0601D4099801E04FF0FF301DB0BDE8F08F00BFB3380000B9380000BD38000000000000152E00002DE9F04791461F460A698B680646934286 +:4030C000B8BF1346C9F8003091F843200C46DDF8208012B10133C9F800302368990642BFD9F800300233C9F80030256815F0060510D104F1190A07E00123524639463046F4 +:40310000C04701301AD00135E368D9F800209B1A9D42F1DB94F843302268003318BF012392060FD5E118302081F843005A1C94F845102244023382F8431003E04FF0FF3053 +:40314000BDE8F08704F1430239463046C0470130F4D02268D9F80050E36802F00602042A08BF5D1B2269A3680CBF25EAE57500259342C4BF9B1AED184FF000091A344D4582 +:4031800009D00123224639463046C0470130D5D009F10109F3E70020BDE8F0872DE9F04317460A7E85B06E2A984606460C460C9B01F1430E00F0AE8011D8632A22D009D8F6 +:4031C000002A00F0BB80582A40F0CA8081F84520834955E0642A1ED0692A1CD0C0E0732A00F0B08009D86F2A2ED0702A40F0B8800A6842F020020A603EE0752A24D0782A4A +:403200003AD0ADE01A6801F14205111D1960136884F84230A8E021681A6811F0800F02D0111D196008E011F0400F02F10401196002D0B2F9003000E01368002B3CDA2D224F +:403240005B4284F8432037E021681A6811F0800F02D0111D196007E011F0400F02F10401196001D0138800E01368227E5C496F2A14BF0A2208221BE078225A4984F8452018 +:403280002268186812F0800F00F104051D6003D1550601D5038800E00368D00744BF42F0200222601BB9226822F0200222601022002084F8430001E049490A226568002DB3 +:4032C000A56008DB206820F0040020602BB9002D7DD175460CE0002B79D07546B3FBF2F002FB1033CB5C05F8013D03460028F5D1082A0BD12368DA0708D5236962689A42A3 +:40330000DEBF302305F8013C05F1FF35C5EB0E0323612EE008681A6810F0800F496903D0101D1860136808E010F0400F02F104001860136801D0198000E019600023236135 +:40334000754616E01A68111D1960156800216268284600F049F808B1401B6060636804E004F1420584F8422001232361002384F84330CDF800803B4603AA21463046FFF7CF +:4033800097FE013002D14FF0FF3026E023692A4639463046C0470130F5D023689B0710D5002504F1190907E001234A4639463046C0470130E7D00135E368039A9B1A9D4293 +:4033C000F2DBE068039B9842B8BF184605E00B7804F1420584F842308AE705B0BDE8F08365370000C438000010B5C9B202449042034605D01C7801308C42F8D1184610BD06 +:40340000002010BD10B5431E0A44914204D011F8014B03F8014FF8E710BD884210B501EB020301D8421E0BE09842FBD28118D21AD34204D013F8014D01F8014DF8E710BD33 +:40344000994204D011F8014B02F8014FF8E710BD38B50546002944D051F8043C0C1F002BB8BFE41800F0D4F81E4A1368114613B96360146030E0A3420DD92268A0188342B0 +:4034800001BF18685B681218226063600C6023E0A24203D813465A68002AF9D118681918A1420BD12168014458188242196013D110685268014419605A600DE002D90C23ED +:4034C0002B6009E021686018824201BF106852680918216062605C602846BDE8384000F098B838BD6886FF1F70B5CD1C25F0030508350C2D38BF0C25002D064601DBA942AC +:4035000002D90C23336046E000F082F8234B1C681A462146A1B10B685B1B0ED40B2B03D90B60CC18CD501EE08C420BBF63684B681360636018BF0C4615E00C464968E9E7CF +:40354000174C23681BB9304600F052F820602946304600F04DF8431C18D0C41C24F00304A0420DD12560304600F053F804F10B00231D20F00700C31A0ED05A42E25070BDFA +:40358000211A304600F034F80130EBD10C233360304600F03EF8002070BD00BF6886FF1F6486FF1FF8B5074615460E4621B91146BDE8F840FFF798BF1AB9FFF749FF284650 +:4035C000F8BD00F027F885420ED929463846FFF78BFF044650B131462A46FFF713FF31463846FFF735FF01E03046F8BD2046F8BD38B5064C0023054608462360FDF744FDB9 +:40360000431C02D1236803B12B6038BD3887FF1F7047704751F8040C0028BEBF091851F8043CC0180438704700000000050209020B020D020F02110213027265706C792028 +:4036400030782530327800686F6D696E6700626567696E6E696E67207365656B2066726F6D20256420746F2025640066696E6973686564207365656B0057616974696E679A +:4036800020666F72205553422E2E2E0055534220726561647900636F6D6D616E642030782530327800756E64657272756E206166746572202564207061636B65747300638E +:4036C0006F756E743D256420693D256420643D256400636D645F777269746500703D25642063723D25642063773D256420663D256420773D256420696E6465783D2564206F +:40370000756E64657272756E3D25640077726974652066696E69736865640073746172742065726173696E670073746F702065726173696E670069646C6500005100401076 +:403740000040510040300000000140001000140140000800400140000A004C0140000200500140200030313233343536373839414243444546000001000000040000001018 +:4037800000010000000400000010000028000000000104000100000000000000000157494E5553420000303030303100000000000000000012034D0053004600540031007C +:4037C000300030000100000001000000D0370000010000009F380000000000000000000001000000E83700000100000071380000040000000A380000000000000000000078 +:403800000000000008380000FF00000001024000FF00000082024000FF00000003034000FF00000084034000FF00020304030904160346006C007500780045006E0067004E +:4038400069006E0065002A0343006F0077006C00610072006B00200054006500630068006E006F006C006F0067006900650073000009022E0001010080320904000004FF0B +:4038800000000107050102400000070582024000000705030340000A0705840340000A12010002FF0001080912006E0100020180014300232D302B2000686C4C0065666724 +:4038C000454647003031323334353637383961626364656600000000F8B500BFF8BC08BC9E4670475900000005110000F8B500BFF8BC08BC9E4670473500000010390000A9 +:40390000C880FF1F98000000E005000000000000000000004087FF1FFF000000675000400C000000070000007F800000030000000000007D00FA0000400000000090D0039A +:40394000FF0000000000000000000000000000000000000000000000000000000000000000000000B13800000000000000000000000000000000000000000000000000005F +:40398000000000000000000000000000000000000000000000000000000000000000000000000000FC80FF1F0000000000000000000000000000000000000000000000006D +:4039C00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C7 +:403A00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000086 +:403A40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046 +:403A80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006 +:403AC00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C6 +:403B00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000085 +:403B40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045 +:403B80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005 +:403BC00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C5 +:403C00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084 +:403C40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044 :403C80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004 :403CC00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C4 :403D00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083 @@ -4098,74 +4098,74 @@ :40FF80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041 :40FFC0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 :0200000480007A -:400000000145004008520040015B00400164004001650040450001403A01014048020140530301404504014057050140500601404E070140460801405B0901404C0A014076 -:400040005F0B0140570C0140550D0140460E01403C0F0140441401405B1501404716014054170140541801405C190140461A0140601B01400E4001400E410140094201406E -:400080000C430140054401400445014007460140114701400A48014010490140174C0140084D014008500140045101407E02080209441080180219016013611A7C40272152 -:4000C0003C01290A0207030507400804090F0A100F0A141815031601171019401A201C041D0C1E081F032018232024022618270F281F29032B1C2D802E18303F33C0353FA3 -:400100003B20580459045B045C995F0180208108840188108C0190109302950A96019704980C9A029B019C08A101A202A40AA604AA10AB04AD0CAE04AF02B430B50FB60F0E -:40014000D608D80BD904DB04DC99DD90DF01012204080550064009940B010D020E240F021098120217A519021D701F80210422282320261028102A422B182E902F803088C8 -:4001800031103610370538A039083B013F025E406640680269206A106B017F40821083808502864289808B01C0FAC2F7C4FFCABFCCEECE8FD610D810DE80E009E206E408D2 -:4001C000E60401080401050C07020A0112021401150A17041A011B011C01210F26012A042B042C012F0232073407350F3A285804590B5B045C995F0180068318860287203B -:4002000088068A018B078C068D048F08911F920694079540980699029B189C039D189E08A140A201A401A504A60CA710A918AA01AB01AC01AD40AE06B00FB140B33FB54083 -:40024000BB33BE01D608D804D904DB04DC90DD90DF0100100110028103200414080D09400B090C040F851101120A13081548172019011C041E081F0820A0231824082520DD -:4002800029092B062C022D082E102F9030A031063610370439803A063B103E043F02598063026F057F4080408202868487018F0C9120921094889644978099809D209E80F6 -:4002C0009F04A002A210A380A488A590A711A810A906AE02B120B220B308B608C06FC2FFC4EFCABFCC6FCECFD608D808DE80E002E201E606EA05EE0802020408050A0705B7 -:40030000080309020A0C0E010F02120814081502170419011A0F1B081C08200824082703280429012B022C0F2D03320F350737083B203E043F40580459045C905F018210A4 -:400340008308862087208A3F8B028D018E089001913F9602973F9A049B109C3F9F04A03FA33FA53FA63FAA3FAB3FAC3FAD3FB23FB33FBE04BF04D608D804D904DB04DD9016 -:40038000DF01000801100291055106100A040B590E030F541181120813041551170819081D04200621C02720281429802B102C402D402E082F08300831203540360937109D -:4003C000380439803B203C083D013F5049104A085F80668082408380848488018A048D908E049120932095D99640978C99229B0D9C099D049E059F20A042A120A204A309CE -:40040000A408A5D2A68AA772A820A902AC80AF01B050B120B310B704C0FFC2FFC4FFCAFECCF6CEFED610D810E24DEA09EC08EE0401010407050109010A070C060D010E01E6 -:400440000F02120113011407150119011A021C041F01200721012405250126022A082B012D012F02300F3303340F3A223F04580459045C095F0182C984098540880989C0D4 -:400480008A808C098D048F0890FC920293079408951F964398C999029B189CCD9D189E10A0C9A318A4C9A720A8CDA904AA30AB10AC04AD18AEE1AF01B0C0B13FB23CB34013 -:4004C000B403B580BE15BF04D804D904DC90DF0100810328051407010A650B020C020D100E200F02115812821440172418201B121D101F11200421042209272029A22A04C0 -:400500002D112E082F013098320135043752381439803C083E403F117C087F108002838086108A1A8E0891A09204955996039755981099A29A849B059C499D419E099F10E7 -:40054000A0CBA204A309A404A540A68AA762AB10AC08AD0AAF40B201C0EFC2FFC47FCAFFCCFFCEFEE60AEA0FEC08EE01000701080501060809010A420C070D011101121082 -:400580001501162118C61A211B011C071F0420A522422302248425012B012C072D0130E03108321F34E0370739803E013F015608580459045B045C995D905F0180028218D2 -:4005C000830586078A208D08901892019504961898049A109C1F9D02A004A208A418B104B23FB301B502B708BF51D608D804D904DB04DC99DD90DF01010803440502060402 -:400600000712081009400A400B100D080E020F84128013081420168219081A101E201F25208621032207244027032D802E042F483244340835603702380139803D183F41BF -:4006400048044A0858405C80600362406701698080048502872088018A018B018C808E018F84901A912C92409334948095419633978A983199419A849B0C9C029E519F4169 -:40068000A148A280A454A624A780AB40AD40AE40AF01B302C0FEC2FFC4BCCAF0CCFACEF9D618D818E004E4C0E622E820EA05000201030402050308020B080D030E0210020D -:4006C000130314021503180819031A011C101F03201C22032302240326042701280229032C022F04310F330F350F361F3E40580459045C905F0180F282048301840A860528 -:40070000870188138AE08B018D018ED390139101922095019A129B019F01A001A208A301A412A680A701A812AA40AB01AF01B0F0B207B408B501BA08BE10BF10D804D904F6 -:40074000DB04DC09DF0100800120021003A004820504070808010A210B080E44104411401220132014101518164019401C401D051E44201021102202232024082704288493 -:400780002B212C822E2430403211330835113748382039023B883DA63F10444047016C016D806F02840485018708880889108AA28B088D018F059020910C932494C0957116 -:4007C0009636970898A199309AA49B089C4A9D019E019F46A082A119A414A540A624A702A840AB80AC20AF08B005B340B440C0FFC25FC47FCAFFCCFFCEFFE080E245E67024 -:40080000EA60ECA000040203060108010A040C030E0411011202130E150E16011701190C1A011D031E011F08220126012A012E0134073508370739803E103F50402149FFC2 -:400840004AFF4BFF50045601580459045A045B045D095F0160806240644065648101820183088406853187C2887F8D0A8E018F0592049406972298569A219C409D809E0606 -:400880009F33A011A133A226A340A407A608A806AA78AB10ADF2AE02AF04B108B27FB308B5F0B707BB80BE04BF05D804D904DC90DF010028010102010448074808010A2285 -:4008C0000B080C880E040F4010401140122013101504160A170118201F10200421442206234825A0280829012B0232043340350136103748380639A03B103D023E0245A070 -:400900006C066D266F817488751076288110820287048C808D208E8090029488951C961497409A049C0E9D019E0A9F4FA108A210A488A540A604A801A921AF20B080B101A6 -:40094000B340B620C0FFC2FFC4FFCA0DCCFACE0BD030E010E410E602E820ECC00002023803070504071009040A400B080D020E070F181034111F12081404163017201838E7 -:400980001A011C3F1F18211822282301240826102918367F373F580459045C995F0180058102820A8601880B8A048B018C0C8E03920196019A019E01A103A201A601AA0119 -:4009C000AE01B202B401B60CB703BE50C201C60EC804C9FFCAFFCBFFCF83D804D90BDA04DB04DC99DD09DF0101800344048805110708080809600A020B400C880D010E0490 -:400A00001040130814401504160A170119801D801E201F202301240329112F40308032013304388039183B013E21458057405D805E185F026484650867017C0282048340AD -:400A40008408850886018908C0FBC2FFC4FCCA85CC0BCEAFD010D6F0D8F0DE80E420E684013F0208063F07020A3F0B100C3F0D01103F13081602173F1A101B201D3F1E3FE1 -:400A8000203F233F253F26042A202B3F2C012F04323F373F3E043F404003450E47C0482149FF4AFF4BFF50045601580459045A045B045D095F0162C082028A048E0190010F -:400AC00095019601970298019C01AA01AC01AD02AF01B102B407B501B922BA20BF11D804D904DB04DC09DF010101020A032004200542084009080A880D840E48100813455F -:400B00001510160118201D101E081F2021402488284829442C0231803259370439203A093B404010411043104A2051016203681C69016A2A6B126D806E406F027001714CBB -:400B40007208735580418302840485408A818B068D198E208F10901091189408958396409755984899029B049D419E089F12A002A180A20AA414A540A680A722A914AA01A0 -:400B8000B109B340B404B604C0DFC2FFC4CFCA1FCC4FCE0FD002E214E40FEA05EE020102050209020E030F06100211021201150117041902200421022401250226022B0300 -:400BC0002D033104320434023503360138A03E543F11580459045B045F018037814883208430860C87018A628B018C378F04901391019248954896119710983799019C374E -:400C00009D409F30A037A349A637A702A837A949AD49AE37B00FB340B507B670B738BB20BE41D804D904DB04DC90DF010080028003280701080809800A640B020C0210600B -:400C4000112012021680170419021B401D181F802010211022542404274028412A102B102D112E082F023254330236083712398A3B103C083F51640167026B016C026F040C -:400C80008110881089108C04911892049302941095019660975598409A909D419E099F52A060A20EA318A404A544A680A7E0A821A904AC41AD10B001B110B310B410C08F69 -:400CC000C21FC43FCAFFCCEFCEFFE080E210E404EA03EE290008030106020A080C080F021101120F1403160C18081C0F1F0120012408270428082C04300F310739023E0196 -:400D0000580459045B045C905F0182028303848F850386108A088B088D108E0192049304940E9503982E9AC19B019C7F9D03A021A103A2CEA601A702A80EA903AA70AE0E87 -:400D4000AF03B10FB27FB30FB480B510BE14BF10C026C602C804C9FFCAFFCBFFCD20CEF0D110D804D904DA04DB04DC90DD09DF01E108E240E340E480E640E7400010022159 -:400D8000038005AE08010A210B080D020E271090124A130314081502162518241F022008210A22082480274028202A422B042F1030203184330235013740382039823B08AE -:400DC0003D803F024004480451405C406A807A087B04886089018A108D518F10905A912E93289480955196A497C0980199019A019B0A9C489DA09E109F40A040A1C0A2329F -:400E0000A301A410A504A60DA74CA902AB02AD02AE12B180B220B301B710C0FFC2FFC4FFCA4FCC9FCE9FD004D204D610E080E4A4E8A0EC40013D03C0050C074009800D80F7 -:400E400011801580180219801C021F0321302580280129A92D563202340135FF3A083E103F105608580459045B045C095D905F01803E8113832085058640883089058C0426 -:400E80008D108E30900191059408952C9620970299059A0E9C089D089E109F02A10FA310A630A705A830A905AA02AD05B001B47EB73FBE01BF40D804D904DB04DC09DF0169 -:400EC000048A070809600C020D040E080F0210081504171019181A201B041E081F0121202540282029802A012B042C802D202E802F20302131883410350A374039603B09B6 -:400F00003C803E2758805E805F20600268086A406C0278027A4082408368841085128740881089A88A058B408C808D448EA48F80908A912C93099550962597C298219A019D -:400F40009B389C109D1A9E26A0E0A188A301A410A504A604A788A908AA08AB01B1A0B320B420B740C0F0C2F3C462CAFFCCFFCEFFD638D808E060E280E4F0E860ECE4EE029E -:400F80001B011F0831103308350836803B4081088340C630CCF0CE10E220E6203010320137143A083F80860197409D10A340AE80AF01CCF0CE60E640518057208D109740C9 -:400FC0009C109D109E089F14D46082408320841097409C109E08A580A720AB14E220E660EAA0150880408904C404E6015D0284809440D60118408140824094409C809D02DB -:40100000C60808800B200F818201871089028C109580964097019C809D02A740AB41C20FE001E20826808A808D80924097409A109E08A580B210C82056105A4079807F02B2 -:40104000814083028E0892409A109E08AF40D4C0DC80DE20E2A0EE40041008020D400E401F10538056805820620181028E808F809410958096409A01C001C20DC601D4077D -:40108000D802E002E40875028C0298029902A820AF10DE04E208010109010B010D010F0111011B011D0100FF01AB020211050000BF0000A09F001F00000000000000000097 -:4010C000100000004000000000000000C0000000FF0000B8470047000001000080000000800080000000000000030300030000002700180127001801000400000005000088 +:400000000145004007520040015B00400264004001010140490201404103014059040140540501404C0601404707014047080140470901404C0A0140500B0140590C0140B7 +:40004000520D0140460E0140380F01404E1401405F1501405516014058170140491801404C1901404B1A0140581B01400D400140094101400C4201400A43014003440140AF +:4000800004450140064601400E4701400B480140104901401D4C01400A4D014008500140045101407E020841090210801801600361157C4027212D0A3501E60103400410EF +:4000C0000620070E09300A1C0B020C100D3E0E4011011461150816061710186219301A01200B210822602320266027302A802B012C7C2D042F3032FC337E360337013980D2 +:400100003E403F404201470E481049FF4AFF4BFF4F83580459045A045B045C995D095F01823F843F8A028C019208963F9A3F9C3F9D01A210A604AA20AC3FAD02B502B63F2A +:40014000B701BE40BF50D804D904DB04DF010085020A04100504060108A90D040E040F2010201120134215401680171418021C101D801E20200222102680272028022D08FD +:400180002E802F4832403410350437013D423E083F20458046084720550858405A205C405E2A6501660867066A8080A08404870288408A028C20A508B108C0EFC26FC4FF5D +:4001C000CAF8CCE8CEF0D010D6FCD8F0E607EE20020703D3040805130610072009010B080DF20E280F04111212401380151217401804190A1A301B051C021E381F12203F7E +:40020000251327E028382A012C342E08307F33F0350737083B203F405608580459045B045C995D905F018002821883018404860887018B018E188F0191019207950198180E +:400240009B019C049E109F01A01FA301A418A501A601AB01AE20AF01B03FB101B301BF05C036C9FFCAFFCBFFD004D601D804D904DA04DB04DC09DD09DF01E080E240E44082 +:40028000E5640102032204020504060209410B080E840F02120B130215081742184019021E801F0121442298250127502B202C102D202E052F22310432923698370238028F +:4002C00039483A103D843EA247084A024B804F1059806002680269406B026D046E216F0675287622861094449548960497C698819B809C1A9D0D9E819F15A0E4A110A501E4 +:40030000A605A708A801AB80AC81AE88B001B401B510C0BDC2DBC4BBCAF2CCFFCEFFD040D220D608D808E202EA0B02010301040107010A010B010D040E010F0312011302F6 +:400340001503160117041A011B011E011F012201230125012601270428012B012E012F01330734013E103F04580459045B045F0180038140821C844C860387078B408C8032 +:400380008D1F9104931095189620970199189A059E4F9F20A003A102A210A318A504A708A80FAA40AB18AD80AE0AB03FB280B3C0B440B53FBA02BE04D804D904DB04DC9907 +:4003C000DF010142032004020528060209400B280E65124A13021404158016A019131A601F10201023042504280229242B402D282E812F62320A33603404369A3810390293 +:400400003A403B043D843E2E3F8059405B8069406E806F0D7A027B018580918C92019486975C988199209A229BD29C089D859F09A0E6A110A298A302A540A607A729A8400D +:40044000C0FDC2F7C4FBCAFFCCFFCEFFE208EE0C0156020103210403070108030B020C030D061003110713081602170119061A031C031F042106220423782540260827069F +:4004800029112A032B262C032D7F320F3403357F3E103F10580459045B045C095F0180018103830C843F870F89088A028E048F01910F923F95049620983F99089D089E3F1D +:4004C000A108A208A508A610AA3FAB02AC3FAF08B23FB70FBE04BF40D804D904DF01008801020244044005150AB10B040E450F111105120813801401153017861B081C2078 +:400500001D041E081F042302270429102A452D102E022F223218334234013510368838403A203B093C503D043E016D806E406F028A028B0490509145929095209645975408 +:40054000980299139AA59B409C809D049E02A044A288A411A54FA604A72AB404C0FFC2FFC4FFCAFFCCFFCEFFE208EE0C0105050F0601071009050A040C010D080F021105AF +:40058000120115051602180119101C081D052001230524012505292C2A012B022C082D132F2030073408373F3A223F40580459045C095F018001820C8303853D860187C0FF +:4005C000880689808C068D809003918092089407958099309A069C069D809E01A10CA201A340A5A9A602A801A980AA06AC06AD56B1FFB40FBE10BF01D608D804D904DB0439 +:40060000DD90DF010008030A044205100608072009800A200B840D080E451108120A130214201521160219111A881C042180260229122A042B022E092F4632013364350557 +:400640003680372239403A213B043C403D023F145F40600861106680868088028904905A914592329308940496C99714982099029A259B649C88A044A288A411A54EA60479 +:40068000A720AB20AD80AE20AF01B412B610B701C0F7C2FFC4FFCAFFCCFFCEFFD610D810E8C0EE1002490502060108400A300C480E20100115021602184919011E04204807 +:4006C00021052210244928012D022E013207330134383504364037023A083BC03F04400145C047E0482249FF4AFF4BFF50045609580459045A045B045C995D995F0162C025 +:40070000825D8501861D881D8C1D9207941D98019A309C1D9E40A01DA45DA801AA08AC0CAE22B040B203B301B43CBE15BF04C043C702C810C9FFCAFFCBFFCD20CEF0D11014 +:40074000D804D904DA04DD09DF01E108E240E340E480E640E7400062032004800511072008090A810B080E420F2410101188128013101450151016011A201B121C101D9077 +:400780001F8421042402269827202C442E202F81361438083C044104430245804C405004550159015A015CB05D1065406D456E106F547444750276A57709828083408504AB +:4007C000860189408A808E04904094109505965997149C0F9D829E859F38A201A410A50FA680A720C0FFC2FFC4FFCA90CC60CE42D013D610D810E280E63001030208040194 +:40080000070808080B020D030E0F100F1110140815031A021B031C031D031E0C2008230424082703280429032C082F01300F310F35103E013F10580459045B045C905F0131 +:400840008001812E8341850F861087108A3F8B088D0E8E028F70903F930295219620974E983F9B019E3F9F04A10EA208A604A70EAA3FAB01AC3FAD7FB57FB63FBE40BF103B +:40088000D804D904DF010040010202040320041005800680071008040AC90C100D420E190F0411051201132015011601172819011E022040210122102404281929012C40C4 +:4008C0002E502F203002310832403320340236843720380439823B103C603D083E0168028101821088408A04C0FFC2FFC4FFCAFFCCFFCEFFE40400AA0101024405080644A9 +:4009000009010CF10D0112221401170218CC1A221B011C881F01221123042B012D01300E3108330734F0360F3B083E013F015608580859045B045C995D905F0180028210E0 +:4009400083078540860A89188B018D028F18907A9104920493109401968098199A629B209C829E059F40A040A21BA318A41BA518A620A904AB08AD1FB13FB280B478B540A1 +:40098000B607B920BA80BE04BF10D804D904DC99DF01000A01800504074009880A400B040C020D080E090F20110114401620188019801B501D041E091F2420202101231042 +:4009C000250126012708280829012B022C022F64302431403642371038043A413B503D863E2058805A1060066180680469106A4079808080830884118501880489108B44A1 +:400A00008C0A8D408E40910592109380948095809748984099419A219B509C089D049E40A022A140A242A302A410A601A760AA01B508C03DC2FFC438CAFDCCBECEFFD60C07 +:400A4000D80CDE08E008E280E402E649EA06EE02001F0101034006200720090B0A180C180F0B1080124013021418160119421A071B051C021E1822C02440250126802702E3 +:400A800028042A082B082C042D022E102F1431403280343F350736403738388839803B203E443F01580459045B045C995F01803F8501861087868A3F8B288C01916892048B +:400AC000963F983F99869B019D039E089F80A108A202A43FA984AA20AD50AE3FB03FB118B307B580B760B908BE01BF14D608D804D908DB04DC90DD90DF0100A802400440A7 +:400B000006880710088909200C400D040E8810A0112013801514174519011C021D081E082101220123192402254026A22740280229102A022C022D102E802F24304032818E +:400B400033203622381039083D883E223F01410442205A8060026F0179808044812082108322850188018E408F40901091089380948695029758988199509A089B949C0AE3 +:400B80009D049F08A0E6A114A240A540A607A720B610C0FFC2FFC4FFCA7DCCADCEF6D608D808DE08E28DE820EE0B03220401050709800A020C0C0E020F111107140A160473 +:400BC00017071B081C102107223025442601280829552B222D662E042F11310F320F330F34103580362037703B0A3E103F10580459045B045C995F01810182068402850160 +:400C0000880289018C028F0190039101930294029501970299019E039F01A002A101A402A701A801A901AA04AC02AD01B003B204B503BE05BF10D804D904DF010088010262 +:400C40000215031804240580070108040A510C080E0211451208168A170819081B011C201E061F302220252F26042782280629082A012C082D802E082F80310833923624D6 +:400C8000370239613A043D103E023F846D9081048410870889208C049050914592509308952096059714980299139A849B409C809F80A044A288A302A401A50FA720B34087 +:400CC000C0EFC2ADC4FFCAFFCCEFCEFFE211E440E860EE0B0002010104020501080209010C020F01100215011602180219011C081D011E0120022301240326042704281059 +:400D000029012C1C2E032F02321F3507370739A03E04580459045C905F018006810282018360850186088738880489328C078D3290079102931095339602970498079932E7 +:400D40009D329E10A007A133A30CA601A732A805A932AA02AD1FAF40B30FB570B61FBF14D804D904DB04DC09DF01005002A0040205400608071008020A010B280E600F0644 +:400D800010021109120815101620170219081D401E011F80200A2110221023042718290A2B0A2FA63004321033403402351136A439443A113C503D013F0448035F406C099A +:400DC0006D106F018511875088048A128B098C108EA88FC090509144924093289420952096019714980499139A919B429E0A9F01A104A28CA32BA409A7C0AB02AD40B480B4 +:400E0000C0FFC2FFC47FCAFFCCFECEFFD610E090E260E440E6B1EC10EE021280170430203304368438083B403C808004C430CCF0CE70E68032043380364037029740A420E0 +:400E4000A604B040CCF0530456109308960897409F02A420A644A780AF04D460EE1097409E109F02A640A780A820AA04AE04EA80EE3014808301C4045D0893029880D60148 +:400E80001B0493029880B108C608E80108080B080D800F4086019302970898809B40AB04AF04B740C20FE8082580890297409E10A580AB02AE40AF80B180C820EED053045D +:400EC00056207240750282408B048E209902AE10AF40D460DC80DE20E220EA40EE40070408020E010F201F10538056205B40670283048A208F109302960198809B40A38043 +:400F0000A980AC08AF40B780C001C20DC601D407D601E208E401E8027210808092109880AF10B402B610DC01EA08EC08010109010B010D010F0111011B011D0100FF01AB85 +:400F400002021005BF0000A09F001F000000000000000000100000004000000000000000C0000000FF0000B84700470000010000800000008000800000000000000303005F +:400F800003000000270018012700180100010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000AD +:400FC00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F1 +:4010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B0 +:401040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070 +:401080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030 +:4010C00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F0 :4011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000AF :40114000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006F :40118000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002F @@ -4615,12 +4615,12 @@ :0200000490105A :04000000BC90ACAF55 :0200000490303A -:02000000C51623 +:0200000004BC3E :0200000490402A :4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C0 :400040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080 :400080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040 :4000C0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 :0200000490501A -:0C00000000012E16106900002E31D57F83 +:0C00000000012E16106900002E3015259E :00000001FF \ No newline at end of file diff --git a/FluxEngine.cydsn/FluxEngine.cyprj b/FluxEngine.cydsn/FluxEngine.cyprj index 55fb8d05..423691ed 100644 --- a/FluxEngine.cydsn/FluxEngine.cyprj +++ b/FluxEngine.cydsn/FluxEngine.cyprj @@ -1533,20 +1533,20 @@ - + - + - + @@ -1559,20 +1559,20 @@ - + - + - + @@ -1585,20 +1585,20 @@ - + - + - + @@ -1611,20 +1611,20 @@ - + - + - + @@ -3347,6 +3347,6 @@ - + \ No newline at end of file diff --git a/FluxEngine.cydsn/Sampler/Sampler.v b/FluxEngine.cydsn/Sampler/Sampler.v index 0581933d..d4421c62 100644 --- a/FluxEngine.cydsn/Sampler/Sampler.v +++ b/FluxEngine.cydsn/Sampler/Sampler.v @@ -123,7 +123,7 @@ begin STATE_OPCODE: /* opcode byte sent here */ state <= STATE_WAITING; - STATE_COUNTING: + STATE_COUNTING: /* counter changes here */ state <= STATE_WAITING; endcase end diff --git a/FluxEngine.cydsn/TopDesign/TopDesign.cysch b/FluxEngine.cydsn/TopDesign/TopDesign.cysch index 1cd7c9ef6cbaa3b2e6c4ff233d2a7fe84d83de89..f483823f91059c21dfab02d93ef9aaa4943dd600 100644 GIT binary patch delta 7918 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 z zU8ie-8eiU$mb-L6vP30-Uxi^Ye~3Sb>z7@Dz34^Kj)2Q&wD|ADffad zC-`$TzPTr4#CmDreCQ(`eNsj&CSaEvC?&vNX)s`9r4dFeuH?2BUbH{%60M;|Y!3)N Q%~P Date: Mon, 27 Jan 2020 22:52:25 +0100 Subject: [PATCH 2/4] Allow fractional revolutions and non-synced reading. Find more things which need fixing in the firmware sampler. --- .../ARM_GCC_541/Release/FluxEngine.hex | 44 ++++++++--------- FluxEngine.cydsn/main.c | 49 ++++++++++--------- lib/fluxsource/fluxsource.h | 3 +- lib/fluxsource/hardwarefluxsource.cc | 25 ++++++++-- lib/usb.cc | 9 ++-- lib/usb.h | 2 +- protocol.h | 5 +- src/fe-rpm.cc | 2 +- 8 files changed, 83 insertions(+), 56 deletions(-) diff --git a/FluxEngine.cydsn/CortexM3/ARM_GCC_541/Release/FluxEngine.hex b/FluxEngine.cydsn/CortexM3/ARM_GCC_541/Release/FluxEngine.hex index c31b82c5..d00b5d68 100644 --- a/FluxEngine.cydsn/CortexM3/ARM_GCC_541/Release/FluxEngine.hex +++ b/FluxEngine.cydsn/CortexM3/ARM_GCC_541/Release/FluxEngine.hex @@ -13,35 +13,35 @@ :4003000002F07AFD02A801F08AFF01F094FF13B05DF804EB04B0704710B5044601780648FFF7E5FF0420FFF7EFFE62782146BDE81040042001F080B83A36000007B50023B1 :40034000ADF804308DF80600032301A88DF80530FFF7E2FF03B05DF804FB0000F8B51D4C0646FFF733FF637F03B156B91A48FFF7BEFFFFF75EFF012000236077636302F048 :4003800099F83246616B1548FFF7B1FF114D0027636B9E4216D001F0D7FE00B16F63636B9E4205DD0020FFF72BFF6B6B013305E005DA0120FFF724FF6B6B013B6B6302F059 -:4003C000A1F8E5E7322002F05FF8BDE8F8400448FFF78DBF8081FF1F473600004E3600006B3600002DE9F04F9BB062B602F0F4F8B449042002F018F9B34801F0B1FEB34881 -:4004000002F0E4FBB24801F0E5FE02F0C5FA02F097F9002002F0B8FB01F000FF0221002000F0A4FFAB4D0321084602F04BF82E462C46DFF8C4B202F065F8AB7F73B12A6A5C -:40044000EB689B1A41F28832934207D9002001F075FE002002F098FB0023AB7700F0BEFF18B99D48FFF743FF04E000F0BDFF0028F7D109E000F0B2FF0028FBD09748FFF7F7 -:4004800036FF032001F016F8032000F0B9FF0128D1D19348FFF764FE92490320FFF782FE94F838109048FFF722FF94F83830023B122B00F2F583DFE813F01300F3031C001E -:4004C000F3032200F3034400F3036800F303A001F3033503F3035403F3035A03F303650303238DF828308DF829300A238DF82A3044E394F83A00FFF731FF7C4B3BE3FFF7AE +:4003C000A1F8E5E7322002F05FF8BDE8F8400448FFF78DBF8081FF1F473600004E3600006B3600002DE9F04F9BB062B602F0F4F8B749042002F018F9B64801F0B1FEB64878 +:4004000002F0E4FBB54801F0E5FE02F0C5FA02F097F9002002F0B8FB01F000FF0221002000F0A4FFAE4D0321084602F04BF82E462C46DFF8D4B202F065F8AB7F73B12A6A46 +:40044000EB689B1A41F28832934207D9002001F075FE002002F098FB0023AB7700F0BEFF18B9A048FFF743FF04E000F0BDFF0028F7D109E000F0B2FF0028FBD09A48FFF7F1 +:4004800036FF032001F016F8032000F0B9FF0128D1D19648FFF764FE95490320FFF782FE94F838109348FFF722FF94F83830023B122B00F2F583DFE813F01300F3031C0015 +:4004C000F3032200F3034400F3036800F303A001F3033503F3035403F3035A03F303650303238DF828308DF829300B238DF82A3044E394F83A00FFF731FF7F4B3BE3FFF7AA :4005000065FE00236372E068627A02F0FF0132B9EB681B1AB3F57A7FF6DD0B4608E03BB100227272F168627A12B9EB685B1AFAE707228DF8282004228DF82920ADF82A30A6 :400540001CE30220FFF7E0FD4FF000090DF1280A4FF480780027C8EB0903DA1907F80A200137402FF9D10220FFF7CEFD3A465146022000F061FFB8F10108EBD109F1010983 -:40058000B9F1400FE4D15A4BC7E294F83A0001F0F9FD606BFFF7E2FE02F09AFB554BDFF85C811A78002742F004021A701A7842F001021A701A7802F0FE021A701A7802F0B8 -:4005C000FE021A7002F088FB0220FFF79DFD41F6FF734FF480420121022002F0DBFA84F8780001F0FDFE08F807000137102FF8D1DFF80CA100270AF15D081FFA88F901378D -:40060000102F14BF3A4600221AF8010F2244062392F82420402101F017FF4A4646F242419AF8000001F022FF09F14009102F1FFA89F9E4D100237372637A002BFCD000275B -:40064000142239460AA8777202F0A2FB40230D934FF0FF333760736037723368DFF8A490334493F8241096F87800CDF8309001F06FFE96F8780001F02DFE012196F8780005 -:4006800001F000FECDF81090236813B96B7A002BFAD0002794F83BA0676094F80890B9F1000F08D101F02EFF6B7A83B3BAF1010A85F809902BD1042194F8780001F054FE3D -:4006C0005CE000BF19010000F900000091000000C50000008081FF1F793600008C3600009881FF1FB881FF1F963600002C3600002E360000926400409C640040A481FF1F2D -:40070000A381FF1F0086FF1F2B7A002BD3D1626823689A42F8D04FF0000962680AA808EB82124A440A92C9F140020B9200F0DAFA0B9A0137C2F1400209EB02030D9A5FFAC9 -:4007400083F95AB90220FFF7DFFC4022BC49022000F072FE049B0C9340230D93B9F13F0FDBD96268B74B01321340002BBEBF03F1FF3363F00F03013363608EE794F878002C -:4007800001F002FE0028F9D10AA800F0DFFA0220FFF7BAFC337A63B90D9A402A06D0C2F1400292B2A649022000F046FE0220FFF7ABFC0D9A32F0400206D10220114600F0D5 -:4007C0003BFE0220FFF7A0FCFFF744FD237A33B19D48FFF78CFD0220FFF7B0FD06E09B4B09A81B88ADF82430FFF796FD627A3946237A9748FFF77BFD55E29648FFF777FDC5 +:40058000B9F1400FE4D15D4BC7E294F83A0001F0F9FD606BFFF7E2FE02F09AFB584BDFF86C811A78002742F004021A701A7842F001021A701A7802F0FE021A701A7802F0A2 +:4005C000FE021A7002F088FB0220FFF79DFD41F6FF734FF480420121022002F0DBFA84F8780001F0FDFE08F807000137102FF8D1DFF81CA100270AF15D081FFA88F901377D +:40060000102F14BF3A4600221AF8010F2244062392F82420402101F017FF4A4646F242419AF8000001F022FF09F14009102F1FFA89F9E4D196F83B3033B100237372637A9C +:40064000002BFCD000237372142200210AA802F09FFB40234FF0FF320D9300232360626023722368274F234493F8241094F878000C9701F06DFE94F8780001F02BFE01210C +:4006800094F8780001F0FEFD04972368002BFCD000277760D6F80CA0237A7BB901F032FFA98F04E0EB68CAEB03038B4206D2626823689A422ED12B7A002BF3D094F808801C +:4006C000042194F878005FFA88F801F04DFE54E019010000F900000091000000C50000008081FF1F793600008C3600009881FF1FB881FF1F963600002C3600002E3600006F +:40070000926400400086FF1F9C640040A481FF1FA381FF1F4FF0000962680AA808EB82124A440A92C9F140020B9200F0DBFA0B9A0137C2F1400209EB02030D9A5FFA83F900 +:400740005AB90220FFF7E0FC4022BD49022000F073FE049B0C9340230D93B9F13F0FDBD96268B84B01321340002BBEBF03F1FF3363F00F03013363608EE794F8780001F0B3 +:4007800003FE0028F9D10AA800F0E0FA0220FFF7BBFC0D9B402B07D002204022A84900F04BFE0220FFF7B0FC0D9B022033F040021DBFC3F1400292B2A149114600F03CFEEF +:4007C0000220FFF7A1FCFFF745FDB8F1000F06D09D48FFF78CFD0220FFF7B0FD06E09B4B09A81B88ADF82430FFF796FD627A3946237A9748FFF77BFD55E29648FFF777FDEF :40080000E76B17F03F0701D003204AE2012001F0BFFC95F83A0001F0B5FC02F059FA9BF80030DFF8348203F0FB038BF800309BF8003043F001038BF800309BF8003003F027 :40084000FE038BF800309BF8003003F0FE038BF8003002F041FA686BFFF780FD01214FF4804341F6FF72084601F098FC85F8780001F0B6FD08F807000137102FF8D1DFF88D :40088000DC91002709F15D031FFA83F807930137102F14BF3A46002219F8010F2244052392F82420402101F0CFFD414646F24C4299F8000001F0DAFD08F14008102F1FFA56 -:4008C00088F8E4D10027B946BA46F36B4FF0FF389B09142239460AA837600593C6F80480377202F055FA402301200D9300F0E2FDCDF81880049701F005FE2268514B01322B +:4008C00088F8E4D10027B946BA46F36B4FF0FF389B09142239460AA837600493C6F80480377202F055FA402301200D9300F0E2FDCDF81880059701F005FE2268514B01322B :400900001340002BBCBF03F1FF3363F00F036168B8BF01338B4200F0A380BAF1000F07D0237A002B40F0B0806B7A002B40F0AC800B9B002B34D1B9F1000F0BD07F22404926 :400940005A540133402BFAD10A910B9328E0BAF1000F06D1012000F053FD01288046F6D107E0237A002B40F08F806B7A002BF1D08AE03349FFF716FC8146314B0B90404665 -:400980000A9300F097FDB9F13F0F07F1010706DD059BDB1BD3F1000949EB030900E0C1460B9BDBB12368079A0AA802EB83120D9BC3F1400313440C9300F0D7F90D9B6BB9FE +:400980000A9300F097FDB9F13F0F07F1010706DD049BDB1BD3F1000949EB030900E0C1460B9BDBB12368079A0AA802EB83120D9BC3F1400313440C9300F0D7F90D9B6BB9FF :4009C0002A68204B01321340002BBEBF03F1FF3363F00F030133236040230D93636801333ED12B680F2B3BD14FF00008C5F8048001F002FC85F808806B6895F878002B44DD :400A000093F8241001F0A4FC95F8780001F062FC012195F8780001F035FC85F80980637A002BFCD04FF00008012086F8098001F0EFFB404601F0ACFBCDF8188013E000BF78 -:400A40000086FF1F0F000080A536000030360000BF360000D2360000A481FF1FA381FF1FBAF1000F05D0237A73B96B7A63B94FF0010A6368069A93423FF43DAF049B0133AB -:400A800004936B68069336E701F0BCFB012001F07FFB002001F0BCFB042194F8780001F063FC94F8780001F06FFC0028F9D196F8780001F0FDFB737A327A02930123039279 -:400AC0000193CDF80090049B3A4605997A48FFF70EFCB9F1000F16D1059BBB420ADD012000F08EFC01288046F6D17449FFF75AFB3F2803DC012000F017FD04E0404600F04C +:400A40000086FF1F0F000080A536000030360000BF360000D2360000A481FF1FA381FF1FBAF1000F05D0237A73B96B7A63B94FF0010A6368069A93423FF43DAF059B0133AA +:400A800005936B68069336E701F0BCFB012001F07FFB002001F0BCFB042194F8780001F063FC94F8780001F06FFC0028F9D196F8780001F0FDFB737A327A02930123039278 +:400AC0000193CDF80090059B3A4604997A48FFF70EFCB9F1000F16D1049BBB420ADD012000F08EFC01288046F6D17449FFF75AFB3F2803DC012000F017FD04E0404600F04D :400B0000D9FC0137E8E7FFF7A5FB6D48FFF7EFFB237A0BB10220C4E06A4B1B8809A8ADF824302CE094F83A0001F02CFB606BFFF715FC6548FFF7DBFB00236372637A002B58 :400B4000FCD0012001F064FB00237372637A002BFCD0002001F05CFB5C48FFF7C8FB5C4B09E000206077FFF7F9FB5A4B03E05A48FFF7F6FA594B1B88ADF828300AA8FFF72A :400B8000CBFB90E0A37F3BB1002001F0D7FA002001F0FAFF0023AB7701F07CFF002001F01FFF2A2701F04AFE002001F0EDFD3A4600210AA802F0ECF815238DF828308DF8DD @@ -4615,12 +4615,12 @@ :0200000490105A :04000000BC90ACAF55 :0200000490303A -:0200000004BC3E +:0200000001A954 :0200000490402A :4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C0 :400040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080 :400080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040 :4000C0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 :0200000490501A -:0C00000000012E16106900002E3015259E +:0C00000000012E16106900002E301212B4 :00000001FF \ No newline at end of file diff --git a/FluxEngine.cydsn/main.c b/FluxEngine.cydsn/main.c index d6db3ff9..26d3f9d2 100644 --- a/FluxEngine.cydsn/main.c +++ b/FluxEngine.cydsn/main.c @@ -343,12 +343,15 @@ static void cmd_read(struct read_frame* f) wait_until_writeable(FLUXENGINE_DATA_IN_EP_NUM); init_capture_dma(); - /* Wait for the beginning of a rotation. */ + /* Wait for the beginning of a rotation, if requested. */ - index_irq = false; - while (!index_irq) - ; - index_irq = false; + if (f->synced) + { + index_irq = false; + while (!index_irq) + ; + index_irq = false; + } crunch_state_t cs = {}; cs.outputptr = usb_buffer; @@ -365,32 +368,27 @@ static void cmd_read(struct read_frame* f) /* Wait for the first DMA transfer to complete, after which we can start the * USB transfer. */ - while ((dma_writing_to_td == 0) && !index_irq) + while (dma_writing_to_td == 0) ; dma_reading_from_td = 0; /* Start transferring. */ - int revolutions = f->revolutions; + uint32_t start_time = clock; while (!dma_underrun) { CyWdtClear(); - /* Have we reached the index pulse? */ - if (index_irq) - { - index_irq = false; - revolutions--; - if (revolutions == 0) - break; - } - /* Wait for the next block to be read. */ while (dma_reading_from_td == dma_writing_to_td) { /* On an underrun, give up immediately. */ if (dma_underrun) goto abort; + + /* Also finish if the sample session is over. */ + if ((clock - start_time) >= f->milliseconds) + goto abort; } uint8_t dma_buffer_usage = 0; @@ -416,26 +414,33 @@ static void cmd_read(struct read_frame* f) dma_reading_from_td = NEXT_BUFFER(dma_reading_from_td); } abort:; + bool saved_dma_underrun = dma_underrun; CyDmaChSetRequest(dma_channel, CY_DMA_CPU_TERM_CHAIN); while (CyDmaChGetRequest(dma_channel)) ; donecrunch(&cs); wait_until_writeable(FLUXENGINE_DATA_IN_EP_NUM); - if (!dma_underrun) + /* If there's a complete packet waiting, send it. */ + if (cs.outputlen != BUFFER_SIZE) { - if (cs.outputlen != BUFFER_SIZE) - USBFS_LoadInEP(FLUXENGINE_DATA_IN_EP_NUM, usb_buffer, BUFFER_SIZE-cs.outputlen); + USBFS_LoadInEP(FLUXENGINE_DATA_IN_EP_NUM, usb_buffer, BUFFER_SIZE); wait_until_writeable(FLUXENGINE_DATA_IN_EP_NUM); } - if ((cs.outputlen == BUFFER_SIZE) || (cs.outputlen == 0)) + if ((cs.outputlen != 0) && (cs.outputlen != BUFFER_SIZE)) + { + /* If there's a partial packet waiting, send it; this will also terminate the transfer. */ + USBFS_LoadInEP(FLUXENGINE_DATA_IN_EP_NUM, usb_buffer, BUFFER_SIZE-cs.outputlen); + } + else { + /* Otherwise just terminate the transfer. */ USBFS_LoadInEP(FLUXENGINE_DATA_IN_EP_NUM, NULL, 0); - wait_until_writeable(FLUXENGINE_DATA_IN_EP_NUM); } + wait_until_writeable(FLUXENGINE_DATA_IN_EP_NUM); deinit_dma(); - if (dma_underrun) + if (saved_dma_underrun) { print("underrun after %d packets"); send_error(F_ERROR_UNDERRUN); diff --git a/lib/fluxsource/fluxsource.h b/lib/fluxsource/fluxsource.h index ac3c3865..e824f6e0 100644 --- a/lib/fluxsource/fluxsource.h +++ b/lib/fluxsource/fluxsource.h @@ -27,8 +27,9 @@ class FluxSource virtual bool retryable() { return false; } }; -extern void setHardwareFluxSourceRevolutions(int revolutions); +extern void setHardwareFluxSourceRevolutions(double revolutions); extern void setHardwareFluxSourceDensity(bool high_density); +extern void setHardwareFluxSourceSynced(bool synced); #endif diff --git a/lib/fluxsource/hardwarefluxsource.cc b/lib/fluxsource/hardwarefluxsource.cc index 5420e184..57cdcd3e 100644 --- a/lib/fluxsource/hardwarefluxsource.cc +++ b/lib/fluxsource/hardwarefluxsource.cc @@ -3,13 +3,19 @@ #include "fluxmap.h" #include "usb.h" #include "fluxsource/fluxsource.h" +#include "fmt/format.h" FlagGroup hardwareFluxSourceFlags; -static IntFlag revolutions( +static DoubleFlag revolutions( { "--revolutions" }, "read this many revolutions of the disk", - 1); + 1.25); + +static BoolFlag synced( + { "--sync-with-index" }, + "whether to wait for an index pulse before started to read", + false); static IntFlag indexMode( { "--index-mode" }, @@ -29,6 +35,10 @@ class HardwareFluxSource : public FluxSource HardwareFluxSource(unsigned drive): _drive(drive) { + usbSetDrive(_drive, high_density, indexMode); + std::cerr << "Measuring rotational speed... " << std::flush; + _oneRevolution = usbGetRotationalPeriod(); + std::cerr << fmt::format("{}ms\n", _oneRevolution / 1e6); } ~HardwareFluxSource() @@ -40,9 +50,10 @@ class HardwareFluxSource : public FluxSource { usbSetDrive(_drive, high_density, indexMode); usbSeek(track); - Bytes crunched = usbRead(side, revolutions); + Bytes crunched = usbRead(side, synced, revolutions * _oneRevolution); auto fluxmap = std::make_unique(); fluxmap->appendBytes(crunched.uncrunch()); + std::cerr << "return fluxmap\n"; return fluxmap; } @@ -59,13 +70,19 @@ class HardwareFluxSource : public FluxSource private: unsigned _drive; unsigned _revolutions; + nanoseconds_t _oneRevolution; }; -void setHardwareFluxSourceRevolutions(int revolutions) +void setHardwareFluxSourceRevolutions(double revolutions) { ::revolutions.setDefaultValue(revolutions); } +void setHardwareFluxSourceSynced(bool synced) +{ + ::synced.setDefaultValue(synced); +} + std::unique_ptr FluxSource::createHardwareFluxSource(unsigned drive) { return std::unique_ptr(new HardwareFluxSource(drive)); diff --git a/lib/usb.cc b/lib/usb.cc index 440ac6b6..621b6c6d 100644 --- a/lib/usb.cc +++ b/lib/usb.cc @@ -149,7 +149,7 @@ nanoseconds_t usbGetRotationalPeriod(void) usb_cmd_send(&f, f.f.size); auto r = await_reply(F_FRAME_MEASURE_SPEED_REPLY); - return r->period_ms * 1000; + return r->period_ms * 1000000; } static int large_bulk_transfer(int ep, Bytes& bytes) @@ -202,13 +202,16 @@ void usbTestBulkTransport() await_reply(F_FRAME_BULK_TEST_REPLY); } -Bytes usbRead(int side, int revolutions) +Bytes usbRead(int side, bool synced, nanoseconds_t readTime) { struct read_frame f = { .f = { .type = F_FRAME_READ_CMD, .size = sizeof(f) }, .side = (uint8_t) side, - .revolutions = (uint8_t) revolutions + .synced = (uint8_t) synced }; + uint16_t milliseconds = readTime / 1e6; + ((uint8_t*)&f.milliseconds)[0] = milliseconds; + ((uint8_t*)&f.milliseconds)[1] = milliseconds >> 8; usb_cmd_send(&f, f.f.size); auto fluxmap = std::unique_ptr(new Fluxmap); diff --git a/lib/usb.h b/lib/usb.h index 16941bb2..458a35bf 100644 --- a/lib/usb.h +++ b/lib/usb.h @@ -9,7 +9,7 @@ extern void usbRecalibrate(); extern void usbSeek(int track); extern nanoseconds_t usbGetRotationalPeriod(); extern void usbTestBulkTransport(); -extern Bytes usbRead(int side, int revolutions); +extern Bytes usbRead(int side, bool synced, nanoseconds_t readTime); extern void usbWrite(int side, const Bytes& bytes); extern void usbErase(int side); extern void usbSetDrive(int drive, bool high_density, int index_mode); diff --git a/protocol.h b/protocol.h index 7e301799..de7c257e 100644 --- a/protocol.h +++ b/protocol.h @@ -3,7 +3,7 @@ enum { - FLUXENGINE_VERSION = 10, + FLUXENGINE_VERSION = 11, FLUXENGINE_VID = 0x1209, FLUXENGINE_PID = 0x6e00, @@ -133,7 +133,8 @@ struct read_frame { struct frame_header f; uint8_t side; - uint8_t revolutions; + uint8_t synced; + uint16_t milliseconds; }; struct write_frame diff --git a/src/fe-rpm.cc b/src/fe-rpm.cc index 0b12d473..aa2ea428 100644 --- a/src/fe-rpm.cc +++ b/src/fe-rpm.cc @@ -19,7 +19,7 @@ int mainRpm(int argc, const char* argv[]) usbSetDrive(spec.drive, false, F_INDEX_REAL); nanoseconds_t period = usbGetRotationalPeriod(); if (period != 0) - std::cout << "Rotational period is " << period/1000 << " ms (" << 60e6/period << " rpm)" << std::endl; + std::cout << "Rotational period is " << period/1000000 << " ms (" << 60e3/period << " rpm)" << std::endl; else { std::cout << "No index pulses detected from the disk. Common causes of this are:\n" From 065257b5aa3d17f61f63514b8a2c21424b01c2ae Mon Sep 17 00:00:00 2001 From: David Given Date: Mon, 27 Jan 2020 23:09:07 +0100 Subject: [PATCH 3/4] Remove stray tracing. --- lib/fluxsource/hardwarefluxsource.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/fluxsource/hardwarefluxsource.cc b/lib/fluxsource/hardwarefluxsource.cc index 57cdcd3e..f1e1dc2f 100644 --- a/lib/fluxsource/hardwarefluxsource.cc +++ b/lib/fluxsource/hardwarefluxsource.cc @@ -53,7 +53,6 @@ class HardwareFluxSource : public FluxSource Bytes crunched = usbRead(side, synced, revolutions * _oneRevolution); auto fluxmap = std::make_unique(); fluxmap->appendBytes(crunched.uncrunch()); - std::cerr << "return fluxmap\n"; return fluxmap; } From a8eca06cf0804317127f2050335bb29566aadd18 Mon Sep 17 00:00:00 2001 From: David Given Date: Mon, 27 Jan 2020 23:09:29 +0100 Subject: [PATCH 4/4] Don't hang if we hit the end of stream while waiting for a data record. --- lib/decoders/decoders.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/decoders/decoders.cc b/lib/decoders/decoders.cc index 39739575..f5b1239e 100644 --- a/lib/decoders/decoders.cc +++ b/lib/decoders/decoders.cc @@ -56,7 +56,8 @@ void AbstractDecoder::decodeToSectors(Track& track) r = advanceToNextRecord(); if (r != UNKNOWN_RECORD) break; - fmr.readNextMatchingOpcode(F_OP_PULSE); + if (fmr.readNextMatchingOpcode(F_OP_PULSE) == 0) + break; } recordStart = fmr.tell(); if (r == DATA_RECORD)