Subversion Repositories Projects

Compare Revisions

Ignore whitespace Rev 1117 → Rev 1198

/NGVideo5_8/tags/v1.21/Hexfiles/NGVideo_MEGA644.hex
0,0 → 1,2076
:100000000C945E070C94210A0C94580A0C947B07FC
:100010000C947B070C947B070C947B070C947B0758
:100020000C947B070C947B070C947B070C9496092B
:100030000C947B070C94D1360C947B070C947B07B3
:100040000C947B070C947B070C94B4330C947B07C3
:100050000C947F370C947B070C947B070C947B07E4
:100060000C947B070C947B070C947B070C947B0708
:10007000084AD73B3BCE016E84BCBFFDC12F3D6C0F
:1000800074319ABD56833DDA3D00C77F11BED9E475
:10009000BB4C3E916BAAAABE000000803F05A84C55
:1000A000CDB2D44EB93836A9020C50B99186880821
:1000B0003CA6AAAA2ABE000000803F525353492DF5
:1000C0004D696E00525353492D4D61780044697655
:1000D000657273697479004C4344004156310041A4
:1000E000563200312E52583A00322E52583A0032CF
:1000F0003535003130323300536572766F00536509
:1001000072766F203100536572766F20320053652E
:1001100072766F2D546573740052535349004D4BE2
:100120002D436F636B70697400536572766F2D4851
:1001300079737465722E0042617564726174650032
:1001400020203556004E472D566964656F202035B6
:100150002E3847487A0A48573A200020204D2E4230
:1001600065636B46573A20312E3231202067656235
:1001700061640053707261636865004465757473EF
:10018000636800456E676C69736368004672616EF0
:100190007A947369736368005A757281636B004166
:1001A000562D5175656C6C650052582D4B616E6112
:1001B0006C00525353492D4B616C6962722E004D95
:1001C000696E20616C6C65204B616E2E004B616C1A
:1001D00069622E0042697474652054582061756606
:1001E00020004155530045494E00576569746572BA
:1001F000206D697420456E746572004B6F6E747269
:10020000617374004C43442D42656C65756368747A
:100210002E004C696368743A0020696D6D65722028
:100220006175730020696D6D65722065696E0020CF
:1002300053656B2E00426174746572696500552DBB
:100240004D696E00556E74657273702E2D53657412
:10025000757000552D4F6666736574004D4B2D42C9
:1002600061747465726965004261742E204E756D0B
:100270006D6572004261742E204B6170617A697401
:10028000847400492D4F666673657400492D4B6F69
:10029000656666697A69656E7400572D4B6F656691
:1002A00066697A69656E74004B616C696272696532
:1002B00072756E67006C84756674004665686C655F
:1002C00072210053656E646572206E6963687420E4
:1002D00000202020202020416B6B750A2020202048
:1002E000656E746C6164656E2100536572766F2D66
:1002F0004B616C6962722E00536572766F2D536389
:1003000068726974746500536572766F203120726B
:1003100065762E004B616C69622E31206C696E6BC4
:1003200073004B616C69622E31207265636874736F
:10033000004B616C69622E31204D69747465005305
:100340006572766F2032207265762E004B616C6983
:10035000622E32206C696E6B73004B616C69622E89
:100360003220726563687473004B616C69622E326F
:10037000204D6974746500506572696F646500543E
:100380006573742050756C736C846E67650054657A
:10039000737420666F72746C6175662E0045696EA9
:1003A0007A656C736368726974746500416E7A6112
:1003B000686C2054657374730050617573652045D3
:1003C0006E64706F732E0050617573652070726F6C
:1003D00020496E632E0053746172742054657374E7
:1003E000006175730065696E00416E74656E6E65BF
:1003F000206E616368662E00475053206D6974203B
:100400007769323332005458204F53442D4461747D
:10041000656E004879737465726573650053656E27
:10042000646520466F72646572756E67004750534D
:100430002D416E7A656967656E00626572656368F5
:100440006E2E20446174656E00616B7475656C6C12
:100450006520506F732E005374617274706F7369EE
:1004600074696F6E00456C656B74722E20576572EF
:1004700074650020202020204E6F63680A20206BC6
:1004800065696E6520446174656E0A202020656D83
:100490007066616E67656E210052582D5A656974E9
:1004A0000053657269656C6C20434F4D002C00331E
:1004B0002C3356004C616E67756167650047657245
:1004C0006D616E00456E676C697368004672656E9B
:1004D00063680052657475726E0041562D536F75D6
:1004E0007263650052582D4368616E6E656C0052F0
:1004F0005353492D43616C6962722E004D696E2021
:10050000616C6C204368616E2E0043616C69622EE1
:100510000054582073776974636820004F46460082
:100520004F4E00436F6E74696E756520456E74653D
:100530007200436F6E7472617374004261636B6723
:10054000722E204C69676874004C696768743A00C1
:10055000616C77617973206F66660020616C7761EA
:100560007973206F6E00207365632E00426174748E
:1005700065727900552D4D696E004C6F7720766F4E
:100580006C7461676500552D4F6666736574004D28
:100590004B2D42617474657279004261742E204E55
:1005A000756D626572004261742E204361706163F3
:1005B00069747900492D4F666673657400492D434F
:1005C0006F656666696369656E7400572D436F6574
:1005D0006666696369656E740043616C6962726125
:1005E00074696F6E0072756E6E696E670045727227
:1005F0006F7221005472616E736D6974746572203C
:100600006E6F742000202020202020416363750A33
:100610002020202020206C6F772100536572766F98
:100620002D43616C6962722E00536572766F2D5393
:100630007465707300536572766F20312072657631
:100640002E0043616C69622E31206C656674004334
:10065000616C69622E312072696768740043616C55
:1006600069622E31206D6964646C65005365727631
:100670006F2032207265762E0043616C69622E32E3
:10068000206C6566740043616C69622E3220726969
:100690006768740043616C69622E32206D6964641E
:1006A0006C6500506572696F6465005465737420F1
:1006B0005057005465737420636F6E74696E2E001A
:1006C00053696E676C652073746570004E756D625A
:1006D0006572206F66207465737400506175736570
:1006E00020656E6420706F732E00506175736520F5
:1006F00070726F20696E632E00537461727420549F
:10070000657374006F6666006F6E200054726163DB
:100710006B696E670047505320776974682077696A
:10072000323332005458204F53442D4461746100D9
:10073000487973746572657365005472616E736D88
:1007400069742064656D616E6400446973706C61E6
:1007500079204750530063616C632E2044617461BB
:100760000063757272656E7420506F732E00486F4F
:100770006D65706F736974696F6E00456C69637441
:100780007269632056616C2E00202020204E6F7409
:10079000207965740A2020202020446174610A2099
:1007A00020207265636569766564210052582D5476
:1007B000696D650053657269656C6C20434F4D002F
:1007C0002E00332E3356004C616E67756500416C08
:1007D0006C656D616E6400416E676C6169730046A3
:1007E00072616E87616973005265746F7572004142
:1007F000562D536F757263650052582D43616E61BB
:100800006C00525353492D43616C6962722E00543F
:100810006F7574857A82726F0043616C69622E0015
:1008200000457465696E64726520547800416C6C93
:10083000756D6572205478004170702E20456E747D
:10084000657200436F6E74726173746500526574F3
:10085000722E2045636C0045636C61693A00204547
:100860007465696E740020546A7273204F4E0020C4
:100870005365632E00426174746572696500562D7C
:100880004D696E00536575696C20416C61726D65D0
:1008900000562D4F6666736574004D4B2D42617492
:1008A0007465726965004261742E206E756D827286
:1008B0006F004261742E206361706163697482000D
:1008C000492D4F666673657400492D436F656666F2
:1008D000696369656E7400572D436F656666696369
:1008E00069656E740043616C6962726174696F6EF0
:1008F00000456E20636F7572730045727265757284
:1009000021004E6F20547800202020204261747412
:10091000657269650A20202020666169626C652124
:1009200000536572766F2D43616C696272004E628E
:1009300072652064652050617300496E766572733C
:100940002E20536572766F310043616C2E20476113
:10095000756368650043616C2E2044726F6974652D
:100960000043616C2E2043656E74726500496E769B
:100970006572732E20536572766F320043616C2E60
:10098000204761756368650043616C2E2044726F77
:100990006974650043616C2E2043656E7472650056
:1009A000508272696F6465004C6172676575722070
:1009B000496D702E005465737420436F6E74696EB8
:1009C00075003120506173004E6F6D627265205466
:1009D000657374730050617573652066696E616C30
:1009E00065005061757365207061722070617300DD
:1009F00044826275742054657374004F4646004FFC
:100A00004E2000547261636B696E6700475053203B
:100A100077697468207769323332005458204F5315
:100A2000442D44617461004879737465726573691B
:100A30007300446F6E6E8265205472616E736D69CF
:100A400065004166666963686167652047505300C9
:100A500043616C63756C2047505300506F732E20B8
:100A600061637475656C6C6500486F6D65706F735C
:100A70006974696F6E00906C826374722E20766167
:100A80006C2E0020417563756E6520646F6E6E82FA
:100A9000650A202020202072658775652100525844
:100AA0002D54656D707300434F4D2E205382726933
:100AB00065002E00332E33560073017B0183018CB9
:100AC0000198019F01A901B201BF01CD01D401E24A
:100AD00001E601EA01FB0104021202190224022FBD
:100AE0000235023E02440253025C02680274028331
:100AF000028C029A02A802B502BB02C302D102EA2A
:100B000002F80207031403220331033F034C035A84
:100B100003690377037F038E039D03AC03B903C707
:100B200003D603E103E503E903F803060413041DF8
:100B3000042D043A0449045704650473049904A17C
:100B400004AD04AF04B404BD04C404CC04D304DA7B
:100B500004E404EF04FC040A0511051C0520052328
:100B60000532053B05490550055B0566056C0574B6
:100B7000057A0586058F059A05A605B405BD05CB42
:100B800005D905E505ED05F40505061B062906351D
:100B90000642064F065D066C06790686069406A395
:100BA00006AB06B306C006CC06DB06EA06F9060469
:100BB0000708070C071507240730073A074A0756A6
:100BC0000761076E077B078907AC07B407C007C238
:100BD00007C707CE07D707DF07E807EF07F90702C0
:100BE000080F081908200821082D08380843084D67
:100BF0000857085E0866086F0875087E0884089123
:100C0000089A08A608B208C008C908D708E508F17C
:100C100008FA080209080921092E093A0949095563
:100C20000961096D097C0988099409A009A809B519
:100C300009C209C809D509E209F009FB09FF09033E
:100C40000A0C0A1B0A270A320A420A500A5B0A697E
:100C50000A760A830A9E0AA70AB20AB40ABB00C42B
:100C600000CD00D700DB00DF00E300E900EF00F378
:100C700000F800FE0006010E0119011E01290137CE
:100C800001400145015B013000303100303200305D
:100C900033003033310030333200303333003034FE
:100CA00000303500303531003035320030353231EA
:100CB00000303532320030353233003035323400D6
:100CC0003035330030353331003035333200303594
:100CD00033330030353334003036003036310030B5
:100CE0003632003036323100303632320030363271
:100CF000330030363234003036323500303633008F
:100D00003036340030370030373100303732003081
:100D10003800303831003038320030383300303865
:100D20003331003038333200303833330030383329
:100D300034003038333500303900303A00303B0071
:100D4000303B3100303B3200303B3300303B34002D
:100D5000303B3500870CFA2F890C992D8C0C352DE2
:100D60008F0CDA2F920C8331960C01319A0CB6302D
:100D70009E0CEB2CA10CBA2FA40C8F2CA80C952F39
:100D8000AC0C892CB10C022CB60C5F2BBB0CBE2A10
:100D9000C00C6F2FC40C832CC90CFC2BCE0C592B10
:100DA000D30CB82AD80C462FDB0C4329DF0C222F9A
:100DB000E30C6B20E80CFC28ED0CB528F20C6E2837
:100DC000F70C2728FC0C9F29000DE529040D022FA4
:100DD000070DD3270B0D7B270F0DE22E120D1827C1
:100DE000160DD1261A0DBE2E1E0D2E25230D712493
:100DF000280D2A242D0DE323320D9C23370D2C239F
:100E00003A0D1B233D0D9A2E400D8530440D853043
:100E1000480D85304C0D8530500D55302020101078
:100E200010102020202018181818202020201C1C0A
:100E30001C1C202020201E1E1E1E202020201F1FC4
:100E40001F1F20200608141314080620040A200E71
:100E500004040E202001010101010120201F0101D5
:100E600001011F20201F030303031F20201F07076A
:100E700007071F20201F0F0F0F0F1F20201F1F1FEE
:100E80001F1F1F202010101010101020201F2020C6
:100E900020201F202001010101010120201F10102E
:100EA00010101F20201F181818181F20201F1C1C8E
:100EB0001C1C1F20201F1E1E1E1E1F2011241FBEB3
:100EC000CFEFD0E1DEBFCDBF12E0A0E0B1E0E8E0BF
:100ED000F0E802C005900D92A238B107D9F714E0EE
:100EE000A2E8B2E001C01D92A93BB107E1F70E9460
:100EF000CF310C9402400C9400004F925F926F929D
:100F00007F928F929F92AF92BF92CF92DF92EF9299
:100F1000FF920F931F93CF93DF93EC013A014B01A4
:100F2000122FCB01BA012CE330E040E050E00E94E8
:100F3000BB3E5B016C01412E552447FC5094C40D0F
:100F4000D51DEE24FF24012F10E00150104018C0E1
:100F5000B501C6012AE030E040E050E00E94BB3E0F
:100F6000605D6883B501C6012AE030E040E050E0F2
:100F70000E94BB3E59016A010894E11CF11C2197B3
:100F8000C2018E199F098017910714F7C401B3019C
:100F90002CE330E040E050E00E94BB3ECA01B901C2
:100FA000DF91CF911F910F91FF90EF90DF90CF9045
:100FB000BF90AF909F908F907F906F905F904F9079
:100FC0000895149810921F030895149A81E0809355
:100FD0001F030895982F813041F0813018F082303E
:100FE00089F40AC08DB38C7F09C08DB38C7F8DBB13
:100FF000149A90931F0306C08DB383608DBB149821
:1010000010921F03892F0895109282022F9808953D
:10101000809182028823B1F48091A501882391F008
:10102000209115033091160390E02817390750F4EA
:10103000F8941092160310921503789481E080932F
:1010400082022F9A089580918202813009F54091A1
:10105000A501442321F4109282022F9808954F3164
:10106000B8F4F8948091150390911603019690932B
:10107000160380931503789420911503309116037D
:10108000842F90E02817390718F0109282022F98C9
:10109000089580E480937C0087E080937A008091BB
:1010A0007A00806880937A0080917A0080648093CF
:1010B0007A0080917A0086FDFCCF80917800909133
:1010C0007900089590917C008F71907E892B809398
:1010D0007C0080917A00806480937A0080917A000D
:1010E00086FDFCCF2091780030917900C9010895E8
:1010F0004F925F926F927F928F929F92AF92BF9228
:10110000CF92DF92EF92FF920F931F93CF93DF93D3
:10111000482E562E7A01662477244301AA24BB2444
:101120006501C0E0D0E008E813E116C0842D0E94FC
:101130006208A0E0B0E0680E791E8A1E9B1E852D15
:101140000E946208A0E0B0E0A80EB91ECA1EDB1E15
:10115000C8010197F1F72196CE15DF0538F300E0BD
:1011600010E0C601B501A80197010E94BB3ED22E36
:10117000C32EC401B301A80197010E94BB3EB9016F
:101180008D2D9C2DDF91CF911F910F91FF90EF90AE
:10119000DF90CF90BF90AF909F908F907F906F9097
:1011A0005F904F900895AF92BF92CF92DF92EF92EF
:1011B000FF920F931F932C9A90E0A0E0B0E0BC0147
:1011C000CD010E94323C5B016C0120E030E44CE92F
:1011D00055E40E94A93D7B018C0120E030E040E80D
:1011E0005FE30E94923B88231CF461E070E024C01E
:1011F000C801B70120E03FEF4FE757E40E949E3D52
:101200001816B4F4C601B50120E030E040E251E424
:101210000E94A93D0E94063C84EF91E005C0FC01BC
:101220003197F1F76150704061157105C1F707C042
:10123000C801B7010E94063CCB010197F1F72C9839
:101240001F910F91FF90EF90DF90CF90BF90AF90E4
:1012500008959F92AF92BF92CF92DF92EF92FF924A
:101260000F931F93982EE62E0E94D308FF2400E0D0
:1012700010E0C801B7010E94323C5B016C0120E024
:1012800030E44CE955E40E94A93D7B018C0120E04B
:1012900030E040E85FE30E94923B88231CF461E069
:1012A00070E024C0C801B70120E03FEF4FE757E4EA
:1012B0000E949E3D1816B4F4C601B50120E030E04E
:1012C00040E251E40E94A93D0E94063C84EF91E077
:1012D00005C0FC013197F1F761507040611571054F
:1012E000C1F707C0C801B7010E94063CCB010197B6
:1012F000F1F7892D0E94D3081F910F91FF90EF9075
:10130000DF90CF90BF90AF909F90089590E044EF12
:1013100051E009C028EE33E0FA013197F1F721508E
:101320003040D1F79F5F9817A8F308951F920F924E
:101330000FB60F9211242F938F939F93AF93BF9368
:1013400084E68093B20080915F038F3F29F0809103
:101350005F038F5F80935F03809103038F3F29F0CA
:10136000809103038F5F80930303809146039091E4
:101370004703805D904248F4809146039091470373
:1013800001969093470380934603809191028823AE
:10139000D9F08091CD019091CE01A091CF01B09173
:1013A000D00180362AEA92072BEDA20720E0B2078F
:1013B00058F40196A11DB11D8093CD019093CE01EB
:1013C000A093CF01B093D00180918602823079F54D
:1013D00080919002882359F180911F038823A1F006
:1013E0008091970290919802A0919902B0919A02EF
:1013F0000196A11DB11D8093970290939802A0932E
:101400009902B0939A0213C0809193029091940232
:10141000A0919502B09196020196A11DB11D8093F5
:10142000930290939402A0939502B0939602BF9179
:10143000AF919F918F912F910F900FBE0F901F90A2
:1014400018951F920F920FB60F9211248F939F93AE
:1014500080915F038F3438F080915F03823518F4F8
:10146000109208030AC091E09093080380916303EF
:10147000882319F4149A90931F0390910803809184
:101480006303981761F480913D03882321F4149835
:1014900010921F0304C0149A81E080931F031092DE
:1014A0005F039F918F910F900FBE0F901F90189523
:1014B0001F920F920FB60F9211248F939F938091DA
:1014C00003038F3438F080910303823518F41092AF
:1014D00063030AC081E0809363038091080388233B
:1014E00019F4149810921F039091080380916303DC
:1014F000981761F480913D03882321F41498109289
:101500001F0304C0149A81E080931F031092030309
:101510009F918F910F900FBE0F901F9018950E9472
:10152000080880910204882331F0F8941092020494
:1015300078940E94230808951092A302E4EAF2E04E
:1015400087E0819392E0E23BF907D9F786E0808358
:10155000CF010F970895A82FB0E0A330B10514F084
:1015600080E001C08F5FAF5FBD4FAC91B0E0AA0FCC
:10157000BB1FA60FB71FE82FF0E0EF5FFD4FE08124
:10158000F0E0EE0FFF1FE60FF71F2D913C918081D9
:1015900091818217930714F48FEF089581E00895E5
:1015A000CF93DF93E091100397FF0DC0E901C61BB5
:1015B000D70BE130A9F41092100384E59EE065E0BA
:1015C0000E94E1320DC0EA01C21BD30BEE2341F4AD
:1015D00084E99EE065E00E94E13281E0809310039F
:1015E000CE01DF91CF9108951F9310918602109242
:1015F00086020E94BE3480E060E00E941F33812F8B
:101600001F9108950F931F93DF93CF93CDB7DEB74C
:1016100029970FB6F894DEBF0FBECDBF20EA3FE09A
:1016200040E050E00E94BB3EBA0119868E010F5F78
:101630001F4FC801A90127E00E947D07AB01BC0133
:10164000C80124E00E947D07AB01BC01C80121E074
:101650000E947D078AE38B838E83C8010E942D330D
:1016600029960FB6F894DEBF0FBECDBFCF91DF91A4
:101670001F910F91089586E061E00E941F336091F1
:1016800093027091940280919502909196020E942B
:10169000020B86E062E00E941F3360919702709116
:1016A00098028091990290919A020E94020B0895EB
:1016B0000F931F93DF93CF93CDB7DEB727970FB666
:1016C000F894DEBF0FBECDBFAB01BC011F8277FF18
:1016D0000DC0CA0157FF03C0909581959F4FAC0183
:1016E000662757FD6095762F8DE201C080E28983E1
:1016F0008E010F5F1F4FC80125E00E947D07AB01DF
:10170000BC01C80122E00E947D078AE38C83C801E6
:101710000E942D3327960FB6F894DEBF0FBECDBFC3
:10172000CF91DF911F910F91089580916B038130CC
:1017300021F410926B0380E104C081E080936B037D
:101740008CE08093170386E090E060916B030E9429
:10175000D73F87E090E0609117030E94D73F08953C
:1017600080918602833061F4E091C701F0E0EE0FD2
:10177000FF1FEE0FFF1FEB57FE4F8081918104C0CA
:1017800080919D0190919E010E944D370895CF93C5
:10179000DF93EC018091AB0161E070E0681B71099F
:1017A00033E0660F771F3A95E1F7709561957F4FAB
:1017B0006F5E7F4F8DEA91E048E050E00E94AF3FBE
:1017C0008091AD019091AE010F972091AF013091C2
:1017D000B001821B930B6BE070E00E94943EA62F39
:1017E000B0E040E050E020E030E0FE01E20FF31F07
:1017F0008091AD019091AE01841B950B9183808304
:101800004A0F5B1F2E5F3F4F2831310571F7862F3E
:1018100065E00E94883EDF91CF9108958150282F86
:10182000277092B1922B92B995B1292B25B9886F67
:1018300092B1982392B995B1892385B98091D40149
:101840009091D5010E94C70B80931B0308950E94BD
:101850005135BC017695679580E00E94F83581E0AE
:1018600060E070E00E94F8350895DF92EF92FF92F9
:101870000F931F93D82E7B010E9451350027F7FC50
:101880000095102F9C0140E050E0C801B7010E9474
:10189000693E24EB30E040E050E00E94BB3E8D2DDD
:1018A000B9010E94F8351F910F91FF90EF90DF90E2
:1018B00008950F931F93CF93DF9385E00E946208F2
:1018C000A0E0B0E02091B1013091B20140E050E0E1
:1018D000BC01CD010E94693EE7E09695879577951A
:1018E0006795EA95D1F7EB0186E00E946208A0E0D7
:1018F000B0E02091B3013091B40140E050E0BC0170
:10190000CD010E94693E57E096958795779567953A
:101910005A95D1F78091F9028823B1F4C617D707F9
:1019200040F48091F7029091F802009711F101972D
:101930001CC08091C601680F711D6C177D0750F5A2
:1019400081E08093F90226C06C177D07D0F40091E6
:10195000F7021091F8020E9451350817190748F450
:101960008091F7029091F80201969093F80280938B
:10197000F7026091F7027091F80280E00E94F8355A
:1019800009C08091C601C80FD11DC617D70710F432
:101990001092F902DF91CF911F910F910895EF926C
:1019A000FF920F931F93CF93DF93E82EC5EBD1E007
:1019B0000AE410E0FF2429813A814B815C818D810A
:1019C0009E81EE2089F436952795369527953A83A2
:1019D000298356954795569547955C834B839695F5
:1019E00087959695879511C0220F331F220F331FBD
:1019F0003A832983440F551F440F551F5C834B8343
:101A0000880F991F880F991F03969E838D83698184
:101A10007A818F2D0E946D356B817C818F2D0E9484
:101A20008A356D817E818F2D0E94A935CE01B80146
:101A300047E050E00E94CD3FF39427960F5C1F4F84
:101A400082E0F81609F0B7CF0E94270CDF91CF9102
:101A50001F910F91FF90EF9008950F931F93182FF0
:101A6000062F823078F462E0681B8FE00E941F33FB
:101A700080E20E94AE321F5F8FE0612F0E941F3311
:101A8000802F0CC08FE061E00E941F3380E20E9433
:101A9000AE328FE062E00E941F3380E20E94AE32DD
:101AA0001F910F910895DF92EF92FF920F931F9372
:101AB000CF93DF938C01EB01D42E0E949C0A7C0112
:101AC000980117FF04C022273327201B310BC901BF
:101AD00073E0880F991F7A95E1F7821B930BBE0183
:101AE0000E94A83E462FE62FFF27E7FDF095EC9FCA
:101AF000C001ED9F900DFC9F900D112469EF7FEFC9
:101B00000E94A83E260F371F83E290E0BC01269F6B
:101B1000C001279F900D369F900D1124BE010E9499
:101B2000A83E65300CF064E017FF0DC088E0841B10
:101B300016167CF4E82FFF27E7FDF095EE0DFF1D4C
:101B40003197608306C016161CF4EE0DFF1D6087EA
:101B500088E0E82FFF27E7FDF095EE0DFF1D80E000
:101B600095E002C091938F5F8417E4F380E06D2DC0
:101B70000E941F33C0E0D0E0F701EC0FFD1F808111
:101B80000E94AE322196C031D105B1F7DF91CF91DD
:101B90001F910F91FF90EF90DF900895EF92FF92C9
:101BA0000F931F93DF93CF93CDB7DEB72E970FB66A
:101BB000F894DEBF0FBECDBF7B018C01DE01119614
:101BC000EEE5F2E08EE001900D928150E1F78E2D6E
:101BD000805D0E94AE3280E091E00E942D33089437
:101BE000E108F10801091109F701EE0FFF1FEC0FE1
:101BF000FD1F818192810E942D3383E091E00E943C
:101C00002D332E960FB6F894DEBF0FBECDBFCF9109
:101C1000DF911F910F91FF90EF900895EF92FF9247
:101C20000F931F93F82EE92E062F80E00E941F339A
:101C300010E080E20E94AE321F5F1031D1F7EF2D2D
:101C4000FE2DDF010D900020E9F7EA1BFB0B7196DA
:101C5000F695E7958E2F602F0E941F338F2D9E2DB6
:101C60000E942D331F910F91FF90EF900895AF9236
:101C7000BF92CF92DF92EF92FF920F931F93DF9369
:101C8000CF93CDB7DEB72C970FB6F894DEBF0FBE5B
:101C9000CDBF6C018E010F5F1F4F5C0178012BE0FF
:101CA000A4E07FEFA03241F0F5018081918184179B
:101CB000950710F4272FA0E2F701A1937F017F5F22
:101CC00082E090E0A80EB91E7B3061F72F3FC1F093
:101CD000332727FD3095F901EE0FFF1FEC0DFD1D99
:101CE00080819181841B950B70E00E94943EFE01DF
:101CF0003196E20FF31F6083653010F084E080833B
:101D00008DE0E82EF12CEC0EFD1EF80181918F0183
:101D10000E94AE320E151F05C1F72C960FB6F8942F
:101D2000DEBF0FBECDBFCF91DF911F910F91FF900E
:101D3000EF90DF90CF90BF90AF900895CF92DF9259
:101D4000EF92FF920F931F93CF93DF93082F6B01B6
:101D5000142F85E00E946208A0E0B0E02091B1015C
:101D60003091B20140E050E0BC01CD010E94693EDB
:101D700037E096958795779567953A95D1F77B01EA
:101D800086E00E946208A0E0B0E02091B3013091AB
:101D9000B40140E050E0BC01CD010E94693E27E063
:101DA00096958795779567952A95D1F7EB0102303F
:101DB00001F5E616F70670F41092E40280915F03D5
:101DC0008F3FC9F4809103038F3FA9F414981092B8
:101DD0001F0311C091E09093E40280915F038F3F55
:101DE00051F4809103038F3F31F4149A90931F03B1
:101DF00002C00093E402112309F447C0023011F03D
:101E00001BEF1EC09091080380916303981799F00F
:101E100090915F038091030389238F3F61F080914C
:101E20000803882319F41092E50203C081E080932F
:101E3000E50213E705C08091E4028093E50214E611
:101E4000F601808191818E159F0520F48C179D07E6
:101E500008F410E282E061E00E941F33C601609145
:101E60001B03A7010E94370E82E062E00E941F332D
:101E7000C60160911B03AE010E94370E023029F4A7
:101E80008091E502612F0E942D0D8091E402DF9187
:101E9000CF911F910F91FF90EF90DF90CF90089519
:101EA00080911803882381F0F89410921803789495
:101EB0006091D4017091D501809183024091D60147
:101EC0000E949E0E80933D0308958091D601882341
:101ED00041F18091D701882321F581E060E00E94E3
:101EE0001F3380910D03882371F08091F6028630B4
:101EF00010F485E009C080919E038A3010F088E5D7
:101F000003C0805D01C08AE30E94AE3210920D03CF
:101F10008091F6028F5F8093F6028C3011F410925C
:101F2000F6020895CF92DF92EF92FF920F937A011B
:101F300069010E941F33C7010E942D33C6010E9410
:101F40002D33002319F0802F0E94AE320F91FF90A5
:101F5000EF90DF90CF9008950F931F93DF93CF936F
:101F6000CDB7DEB727970FB6F894DEBF0FBECDBF53
:101F7000DC01CB01880F991F880F991F8B579E4F4B
:101F8000FC0160817181828193818E010F5F1F4FFF
:101F9000A8012AE030E00E947B3FC80161E00E9476
:101FA0000E0E27960FB6F894DEBF0FBECDBFCF91B1
:101FB000DF911F910F9108954F925F926F927F92E0
:101FC0008F929F92AF92BF92CF92DF92EF92FF9249
:101FD0000F931F93DF93CF9300D000D0CDB7DEB720
:101FE0002B013C0129833A834B835C83DF88B88CC7
:101FF00080E40E946834882329F480E40E947334CA
:102000008823E1F04E145F046006710648F40894DA
:10201000411C511C611C711C8B2D0E94A43406C0F4
:10202000DD2021F049805A806B807C808C2D6A2DC8
:102030000E941F33C301B201F401099580E80E9498
:102040006834882329F480E80E9473348823F1F0EF
:1020500089819A81AB81BC8184159505A605B70558
:1020600048F4089441085108610871088B2D0E94BA
:10207000A43404C0DD2011F0270138018C2D6A2D15
:102080000E941F33C301B201F4010995B201C301DB
:102090000F900F900F900F90CF91DF911F910F91A4
:1020A000FF90EF90DF90CF90BF90AF909F908F9078
:1020B0007F906F905F904F9008950F931F93CF93F1
:1020C000DF938C01FC018081882309F1C0E0D0E01E
:1020D000FE01EE0FFF1FEE0FFF1FEC5AF24F65914E
:1020E0007491C8010E942F3F892B69F4CE01880F9B
:1020F000991F880F991F8A5A924FFC01259134919C
:10210000F901099504C02196C233D10509F7DF9181
:10211000CF911F910F9108951F93182F8091050360
:10212000882319F060E070E005C00E945135BC01C1
:1021300076956795809105030E94F8351093860285
:10214000112329F484E00E9486090E94F23587ED6C
:1021500091E00E945D101F9108958634910540F032
:10216000FC01EE0FFF1FEF52F44F659174911CC0FC
:102170002091AC01213029F0880F991F223079F489
:1021800008C0FC01EE0FFF1FEB5BF44F65917491EB
:102190000BC0FC01EF52F44F6591749105C0FC0136
:1021A000E754F54F6591749183EB92E00E94383FBC
:1021B00083EB92E00895DF93CF9300D00F92CDB7D9
:1021C000DEB7DE011196E9E2F2E023E001900D9224
:1021D0002150E1F7FE01E60FF71F818190E00E9498
:1021E000AD1061E00E940E0E0F900F900F90CF91F6
:1021F000DF910895EF92FF920F931F93DF93CF9398
:10220000CDB7DEB761970FB6F894DEBF0FBECDBF76
:102210007C010E94FE3289E090E00E94AD10BC017A
:102220008E010F5F1F4FC8010E94533FC80167E036
:1022300071E00E943F3F80E290E00E94AD10BC013F
:10224000C8010E943F3FC80160E00E940E0E86E078
:1022500090E00E94AD1061E00E940E0EC70162E0A6
:102260000E940E0E8EE10E94860961960FB6F894C8
:10227000DEBF0FBECDBFCF91DF911F910F91FF90B9
:10228000EF900895611571058105910519F481E5B7
:1022900090E002C082E590E00E94AD100E942D33D4
:1022A0000895DF93CF9300D0CDB7DEB72EE4298316
:1022B0002FE42A83FE01E60FF71F818190E00E9440
:1022C000AD1061E00E940E0E0F900F90CF91DF9144
:1022D0000895611571058105910519F485E390E074
:1022E00002C086E390E00E94AD100E942D33089555
:1022F000DF92EF92FF920F931F93DF93CF9300D063
:1023000000D00F92CDB7DEB77B018C0180E190E069
:102310000E94AD10FC0101900020E9F73197DE2EFC
:10232000D81AE114F1040105110539F08FE1E8161E
:10233000F1040105110529F510C081E190E00E942A
:10234000AD10FC0101900020E9F73197E81BF90B73
:102350001D2D1E0F81E190E00FC082E190E00E94F0
:10236000AD10FC0101900020E9F73197E81BF90B53
:102370001D2D1E0F82E190E00E94AD100E942D33B2
:1023800037C0C801B7012AE030E040E050E00E94C9
:10239000693EDC01CB017E010894E11CF11CB70110
:1023A0004AE050E00E945A3F80E20E94AE32C701EC
:1023B0000E942D3383E190E00E94AD100E942D33E6
:1023C000F70101900020E9F78F01015010400E192C
:1023D0001F0983E190E00E94AD10DC010D90002008
:1023E000E9F71197A81BB90B1D2D100F1F5F1A0FCE
:1023F00000E1011B10E004C080E20E94AE321F5FCA
:102400001017D0F30F900F900F900F900F90CF9167
:10241000DF911F910F91FF90EF90DF900895DF9370
:10242000CF9300D0CDB7DEB725E329832BE32A83F2
:10243000FE01E60FF71F818190E00E94AD1061E080
:102440000E940E0E0F900F90CF91DF910895DF93B1
:10245000CF9300D000D0CDB7DEB725E3298324E5A4
:102460002A8328E32B8325E52C83FE01E60FF71F43
:10247000818190E00E94AD1061E00E940E0E0F90ED
:102480000F900F900F90CF91DF910895DF93CF932E
:1024900000D00F92CDB7DEB7DE011196E8E3F2E08F
:1024A00023E001900D922150E1F7FE01E60FF71FA6
:1024B000818190E00E94AD1061E00E940E0E0F90AD
:1024C0000F900F90CF91DF91089580E060E00E941F
:1024D0001F3389E590E00E94AD100E942D3380915A
:1024E0006B03882319F485E490E002C088E590E04E
:1024F0000E94AD100E942D338AE590E00E94AD103D
:102500000E942D338EE10E9486090E94FE320895BA
:102510000F931F93082F90E00E94AD10FC010190D3
:102520000020E9F73197E81BE031D8F480E190E032
:102530008E1B910995958795182F823098F08250BF
:1025400060E00E941F3389E091E00E942D33802FCC
:1025500090E00E94AD100E942D3380E20E94AE32C6
:1025600016C010E080E060E00E941F338AE20E9403
:10257000AE32812F60E00E941F33802F90E00E94D6
:10258000AD100E942D338FE060E00E941F338AE27D
:102590000E94AE321F910F910895CF92DF92EF9279
:1025A000FF920F931F93CF93DF93EC01D42E6623FA
:1025B00011F4F42E02C0F62EFA94EE243EE0C32E5F
:1025C00082E06E2D0E941F338E010F0D111DF80148
:1025D000808190E00E94AD100E942D33F80180812F
:1025E00090E00E94AD10FC0101900020E9F73197C6
:1025F000E81BF90B0C2D0E1B04C080E20E94AE32CA
:1026000001501016D4F3FD1410F0FF2401C0F39410
:10261000E394F3E0EF16A1F6DF91CF911F910F91B4
:10262000FF90EF90DF90CF9008951F93182F0E9496
:10263000FE3280E290E00E94AD1060E00E940E0E3B
:1026400081E290E00E94AD1061E00E940E0E812FA9
:1026500090E00E94AD1062E00E940E0E8EE10E949A
:1026600086091F910895FF920F931F93DF93CF93D5
:10267000CDB7DEB761970FB6F894DEBF0FBECDBF02
:10268000F82E0E94FE328EE190E00E94AD1060E0D4
:102690000E940E0EFF2011F401E027C086E090E0BA
:1026A0000E94AD10BC018E010F5F1F4FC8010E9438
:1026B000533FC80160E071E00E943F3FF801019084
:1026C0000020E9F73197E01BD801AE0FB11D80E380
:1026D000F80EFC92EF5FC8018E0F911DFC01108275
:1026E000C80161E00E940E0E02E08FE190E00E94BE
:1026F000AD10602F0E940E0E61960FB6F894DEBFEB
:102700000FBECDBFCF91DF911F910F91FF90089524
:102710002F923F924F925F926F927F928F929F92F1
:10272000AF92BF92CF92DF92EF92FF920F931F93DF
:10273000DF93CF93CDB7DEB72B970FB6F894DEBFFC
:102740000FBECDBF5B016C014B83122F402E5E2C60
:1027500084E490E00E94AD10FC0120812983D7FC25
:1027600002C01A820AC0D094C094B094A094A11C54
:10277000B11CC11CD11C31E03A835B81552321F08F
:1027800080E38093E80201C01150612E7724F301A9
:10279000E851FD4F118251105394812F992787FDE5
:1027A000909548EE842E42E0942E880E991EEE24D9
:1027B000FF249D838C839B81892F90E09F838E8350
:1027C0008301041911091801250C311CD801A851E5
:1027D000BD4FB987A88736C0EA85FB850E171F074E
:1027E00039F4442029F0E981A885B985EC9319C012
:1027F000C601B5012AE030E040E050E00E94DD3E35
:10280000605DD4016C93C601B5012AE030E040E080
:1028100050E00E94DD3EC901DA015C016D014420F7
:1028200059F0451448F0EA85FB852E163F0621F441
:10283000F101E851FD4F10820894E11CF11C08944D
:10284000810891082C813D812E193F093B872A87F9
:102850008E819F81281739070CF0BECFE8EEF2E099
:1028600020E030E04DE290E213C0AB81AA2351F0AA
:10287000BA81BB2339F0803321F4828159818517D5
:1028800009F440832F5F3F4F8081803341F491935F
:102890008181A9818A1719F02615370534F388EE4E
:1028A00092E02B960FB6F894DEBF0FBECDBFCF914E
:1028B000DF911F910F91FF90EF90DF90CF90BF902D
:1028C000AF909F908F907F906F905F904F903F90D0
:1028D0002F900895EF920F9340E024E002E052E041
:1028E000E52E0E9488130E942D330F91EF900895DA
:1028F000EF920F93772767FD70956550704088279A
:1029000077FD8095982F41E023E001E0EE24E394E9
:102910000E9488130E942D3381E40E94AE320F91F1
:10292000EF900895EF920F9322E330E040E050E003
:102930000E94693E40E024E000E0EE240E948813FB
:102940000E942D338CE091E00E942D330F91EF9087
:102950000895EF920F936A3071058105910560F03B
:1029600040E023E001E0EE24E3940E9488130E94FB
:102970002D3380E191E010C024E630E040E050E0EB
:102980000E94693E40E023E000E0EE240E948813AC
:102990000E942D3383E191E00E942D330F91EF903F
:1029A0000895AF92BF92CF92DF92EF92FF920F9372
:1029B0001F93DF93CF9300D00F92CDB7DEB77B018B
:1029C0008C01DE011196E3E1F1E083E001900D92CC
:1029D0008150E1F7570180910503B7010E94A836A5
:1029E0008091190390E0FC01EE0FFF1FE80FF91F23
:1029F000EE0FFF1FDF01AB50BE4F14962D913C919F
:102A00001597A21AB30A6D917C91E950FE4F40814F
:102A10005181C5010E94D00A6C01C501B60142E096
:102A20000E94530D81E061E00E941F33C7010E94A4
:102A30002A357C0100E010E0885E934068F485E769
:102A4000898386E191E00E942D33C801B70140E0FF
:102A500023E000E0EE2407C0C801B70140E025E014
:102A600003E0E3E0EE2E0E9488130E942D33CE0196
:102A700001960E942D3388E061E00E941F33B5016A
:102A8000882777FD8095982F28EE33E040E050E0CE
:102A90000E94693E9601442737FD4095542F0E94BD
:102AA000DD3EB901882777FD8095982F41E025E02C
:102AB00001E0EE24E3940E9488130E942D3385E206
:102AC0000E94AE320F900F900F90CF91DF911F9127
:102AD0000F91FF90EF90DF90CF90BF90AF9008954F
:102AE000AF92BF92CF92DF92EF92FF920F931F931C
:102AF0005B016C017B010E94513596958795E81A20
:102B0000F90A0027F7FC0095102FC801B70141E032
:102B100023E000E0EE240E9488130E942D33809170
:102B20000503B5010E94A935109105030E94513596
:102B3000BC0176956795812F0E94F8351F910F9102
:102B4000FF90EF90DF90CF90BF90AF900895EF92FD
:102B50000F9340E023E000E0EE240E9488130E94DF
:102B60002D330F91EF900895EF92FF920F931F93E3
:102B7000CF93DF937B018C010E945135EC01C8019A
:102B8000B7010E94A71580910503B7010E948A35FD
:102B900020910503822F90E0FC0133E0EE0FFF1F30
:102BA0003A95E1F7E81BF90BEB54FE4F808188233F
:102BB00011F0C0E0D0E0822FBE010E94F835DF9115
:102BC000CF911F910F91FF90EF900895EF92FF9298
:102BD0000F931F937B018C010E94A7158091050321
:102BE000B7010E946D358091050390E0FC0143E040
:102BF000EE0FFF1F4A95E1F7E81BF90BEB54FE4F70
:102C00008081882319F460E070E003C00E94513590
:102C1000BC01809105030E94F8351F910F91FF9030
:102C2000EF9008951F93162F0E94A71580916B03B4
:102C3000612F0E9406331F910895EF920F9340E099
:102C400025E002E052E0E52E0E9488130E942D3319
:102C500086E50E94AE320F91EF900895EF920F93A8
:102C600040E025E002E0EE24E3940E9488130E94F5
:102C70002D330F91EF900895EF920F9397FF0BC0B4
:102C80002AE030E040E050E00E94DD3ECA01B90198
:102C900041E022E015C0643671058105910534F4E8
:102CA00040E023E001E0EE24E3940CC02AE030E0B1
:102CB00040E050E00E94DD3ECA01B90140E023E05F
:102CC00000E0EE240E9488130E942D338DE60E94BE
:102CD000AE320F91EF900895EF92FF920F931F93F2
:102CE0007B018C01611571058105910541F485E336
:102CF00090E00E94AD1061E00E940E0E0BC085E0D6
:102D000061E00E941F33C801B7010E94A71580E24D
:102D10000E94AE321F910F91FF90EF900895EF92B5
:102D2000FF920F931F937B018C010E946C16E1149C
:102D3000F1040105110541F088E061E00E941F33B4
:102D400083E191E00E942D331F910F91FF90EF904E
:102D50000895BF92CF92DF92EF92FF920F931F934D
:102D6000CF93DF93B82E6B01EA017A0100E010E007
:102D70009B0140E050E06C177D07B8F4F7E0EE0CE3
:102D8000FF1C001F111FFA95D1F7C801B7010E945F
:102D9000BB3E3093B2012093B10180E890E0909364
:102DA000B4018093B3017E0118C0E7E0220F331F06
:102DB000441F551FEA95D1F7CA01B901A80197012F
:102DC0000E94BB3E3093B4012093B30180E890E0B1
:102DD0009093B2018093B10176010B2D10E0015068
:102DE000104073E0000F111F7A95E1F76091B10177
:102DF0007091B201C8018B5E9F4F0E94ED3F6091C0
:102E0000B3017091B401C801895E9F4F0E94ED3FEC
:102E1000C701DF91CF911F910F91FF90EF90DF904D
:102E2000CF90BF900895CF93DF93EC0180E00E9494
:102E3000331385E066E048EE53E00E9478089B017A
:102E4000AC01CB01840F951F80599140E0F4809133
:102E5000AB01B9010E94A916BC018091AB0190E0C1
:102E6000A3E0880F991FAA95E1F7855F9F4F0E9405
:102E7000ED3F84E06EE10E942909CE010E94C70B5C
:102E800080931B0303C08CE00E941513DF91CF9148
:102E900008950F931F93CF93DF93182FEB0100E05A
:102EA000882309F401E0812F0E943313002311F0DD
:102EB0001091AB0185E066E048EE53E00E9478088F
:102EC0009B01AC01CB01840F951F855F9140E0F021
:102ED000812FB9010E94A916BC01812F90E0B3E0B7
:102EE000880F991FBA95E1F7875F9F4F0E94ED3FCA
:102EF000002389F084E06EE10E942909CE010E943E
:102F0000C70B80931B0307C0002311F480E004C0AB
:102F10008BE00E94151381E0DF91CF911F910F91FB
:102F20000895EF92FF920F931F93DF93CF9300D0FA
:102F300000D00F92CDB7DEB7082F80E090E00E945E
:102F4000BF3F182F7E010894E11CF11CC70161E00E
:102F500070E045E050E00E94AF3F88E893E10197C0
:102F6000F1F71B3499F4002341F089E191E0B701B6
:102F70000E944A3F009709F4C5C089E191E0BE0173
:102F80006F5F7F4F0E944A3F0097B9F080E090E06A
:102F90006BE40E94D73F86E090E060E00E94D73F5C
:102FA00087E090E060E10E94D73F89E191E061E035
:102FB00070E045E050E00E94CD3F88E090E06FE196
:102FC0000E94D73F89E090E065E50E94D73F8AE004
:102FD00090E040EC53E060E070E00E94E53F8EE05E
:102FE00090E061E00E94D73F8FE090E060E00E94B7
:102FF000D73F80E190E06EEF0E94D73F01E110E003
:103000008DEA91E0B80148E050E00E94CD3F085FB2
:103010001F4F80E00934180799F789E490E060E0D9
:103020000E94D73F85EB91E06AE470E047E050E012
:103030000E94CD3F8CEB91E06BE770E047E050E001
:103040000E94CD3F8CEA90E064E10E94D73F8DEA78
:1030500090E060E00E94D73F8EEA90E060E00E943E
:10306000D73F8FEA90E061E00E94D73F80EB90E08D
:103070006AE00E94D73F81EB90E060E00E94D73F7A
:1030800082EB90E060E00E94D73F83EB90E068E243
:103090000E94D73F84EB90E060E00E94D73F85EB31
:1030A00090E065E00E94D73F88E892E066EB70E030
:1030B00046E050E00E94CD3F8CEB90E060E00E9443
:1030C000D73F0DEB10E088EC91E0B80149E050E00B
:1030D0000E94CD3F075F1F4F81E00E30180799F720
:1030E00087E191E068E00E94D73F88E191E060E5E8
:1030F0000E94D73F89E191E060E50E94D73F10929E
:103100001903A3C088E090E00E94BF3F8093A5010F
:1031100089E090E00E94BF3F8093A6018AE090E0A2
:103120000E94C73F6093A7017093A8018093A901F3
:103130009093AA018EE090E00E94BF3F8093AB0184
:103140008FE090E00E94BF3F8093830280E190E097
:103150000E94BF3F8093AC0189E490E00E94BF3F92
:103160008093190385EB91E06AE470E047E050E05A
:103170000E94AF3F8CEB91E06BE770E047E050E0DE
:103180000E94AF3F8CEA90E00E94BF3F8093C30152
:103190008EEA90E00E94BF3F809384028FEA90E025
:1031A0000E94BF3F8093C40180EB90E00E94BF3F2C
:1031B0008093C50181EB90E00E94BF3F8093850220
:1031C00082EB90E00E94BF3F8093860283EB90E009
:1031D0000E94BF3F8093C60184EB90E00E94BF3FF6
:1031E0008093870285EB90E00E94BF3F8093C701E8
:1031F00088E892E066EB70E046E050E00E94AF3F66
:103200008CEB90E00E94BF3F682F80938E0289E094
:10321000689FB001112463547F4F88EC91E049E02E
:1032200050E00E94AF3F87E191E00E94BF3F809352
:10323000D10188E191E00E94BF3F8093D20189E1F2
:1032400091E00E94BF3F8093D30186E090E00E940E
:10325000BF3F80936B0387E090E00E94BF3F809365
:1032600017038091A7019091A801A091A901B091A5
:10327000AA018093200390932103A0932203B0938B
:1032800023038091830280933D0380E06091B50128
:103290000E945E356091B6017091B70180E00E9496
:1032A0006D356091B8017091B90180E00E948A3556
:1032B0006091BA017091BB0180E00E94A93581E064
:1032C0006091BC010E945E356091BD017091BE01AC
:1032D00081E00E946D356091BF017091C00181E075
:1032E0000E948A356091C1017091C20181E00E9403
:1032F000A9350E94270C81E080930F030E94B00B38
:10330000809186020E94A1380F900F900F900F902D
:103310000F90CF91DF911F910F91FF90EF90089543
:103320001F93CF93DF9380918E02C82FD0E0CE0100
:1033300023E0880F991F2A95E1F78C0F9D1F8E536C
:103340009F4F0E94C73F109291022091CD01309172
:10335000CE014091CF015091D001621773078407CD
:10336000950709F445C080919002882341F480912B
:103370009D0290919E029093CC018093CB01CE014F
:1033800013E0880F991F1A95E1F78C0F9D1F835446
:103390009F4F6091C8010E94D73F80918E0219E033
:1033A000819FC00111246091CB017091CC018054A8
:1033B0009F4F0E94ED3F80918E02819FC00111249A
:1033C0004091CD015091CE016091CF017091D0011B
:1033D0008E539F4F0E94E53F88E892E066EB70E0D5
:1033E00046E050E00E94CD3F84E06EE10E94290952
:1033F000DF91CF911F9108957F928F929F92AF920C
:10340000BF92CF92DF92EF92FF920F931F93DF93C1
:10341000CF930F92CDB7DEB7782E87E00E94620877
:103420009C0140E050E060E070E080E090E0F0EF70
:10343000AF2EE9EABE2ECC24DD24EE24FF2400E0EA
:1034400010E00E94D238122FF32ED42EC52EB62EA5
:10345000A72E982EE92E2091A60130E040E050E002
:1034600060E070E080E090E00DE00E944C3A892E30
:10347000210FE1E0211708F0E0E03F0DF1E03F15FA
:1034800008F0F0E0FE2EF30EE1E0F31608F0E0E0C5
:10349000FE2B4D0DA1E04D1508F0A0E00F2F040FFD
:1034A000E1E0041708F0E0E0AE2B5C0DF1E05C1504
:1034B00008F0F0E01A2F150FE1E0151708F0E0E032
:1034C000FE2B6B0DA1E06B1508F0A0E0BF2FB60F2F
:1034D000E1E0B61708F0E0E0AE2B7A0DF1E07A15E6
:1034E00008F0F0E0A70FE1E0A71708F0E0E0FE2BFE
:1034F000890D91E0891508F090E0F80FE1E0F817E8
:1035000008F0E0E09E2BE80C3F2DA8016B2F7A2FEE
:103510008F2F9E0D0DE00E94CD3979018A01809197
:10352000200390912103A0912203B09123038E15D3
:103530009F05A007B10708F449C08091D6018823F0
:1035400059F18091A7019091A801A091A901B09192
:10355000AA014496A11DB11D8093200390932103DD
:10356000A0932203B093230380918602823011F44A
:103570000E9490190E94FE3282E290E00E94AD10FB
:103580000E942D331092D60184E10E94D30880EF6F
:103590008093E6021092E70281E0781689F5809127
:1035A000E7029091E6028F5F8093E70281508917CE
:1035B00038F184E199830E94D3089981933018F0FF
:1035C00096959093E6021092E7021AC02091A70107
:1035D0003091A8014091A9015091AA0128173907FB
:1035E0004A075B0768F481E08093D60120932003AB
:1035F0003093210340932203509323030E942B1BFB
:10360000B701C8010F90CF91DF911F910F91FF90EB
:10361000EF90DF90CF90BF90AF909F908F907F9072
:103620000895EF92FF920F931F9381E00E94FC197F
:103630007B018C018091D601882341F08BE060E012
:103640000E941F33C801B7010E942E161F910F91CF
:10365000FF90EF9008950E94FE328091D60188235A
:10366000F9F00E94FE326091AB0170E080E090E0E2
:103670000E94CE0D8FE060E00E941F338EE191E04A
:103680000E942D3380918302823010F064E601C0E5
:103690006BEF80913D030E942D0D0E94111B089538
:1036A00082E290E00E94AD1060E00E940E0E08954C
:1036B000882361F08150E82FF0E0E952FE4F9081BD
:1036C000905390930A031082882311F40E942B1BBD
:1036D000089580915E03882331F0F89410925E0380
:1036E00078940E94111B08958CE693E062E00E949A
:1036F000AF38882331F180916C03843011F58091CB
:103700006E0390E09695982F88279795879520913E
:103710006F0330E0822B932B64E170E00E94943EB3
:103720006C33710518F460E070E007C06C537040B2
:10373000653B710510F064EB70E080916D030E94B1
:10374000350C0895809124038823A9F0F8941092F1
:10375000240378946091D4017091D5018091830203
:1037600040E00E949E0E80933D038091860283304C
:1037700011F40E94741B08952F923F924F925F9212
:103780006F927F928F929F92AF92BF92CF92DF9271
:10379000EF92FF920F931F93DF93CF93CDB7DEB7D6
:1037A00028970FB6F894DEBF0FBECDBF69A07AA0F0
:1037B0008BA09CA06FA978AD89AD9AAD0E94343CD6
:1037C00020E836E948E15BE40E94993B5B016C012B
:1037D000C401B301A60195010E94CC3A20E030E07B
:1037E00040E05FE30E94A93D29E33AEF4EE85CE345
:1037F0000E94A93D0E94963B20E032E649ED57E445
:103800000E94A93D7B018C016BA97CA98DA99EA971
:103810000E94343C20E836E948E15BE40E94993B91
:103820009B01AC016D8D7E8D8F8D98A10E94CB3A4E
:103830009B01AC01C801B7010E94A93D1B012C01ED
:10384000C401B301A60195010E94CB3A20E032E603
:1038500049ED57E40E94A93D5B016C01C201B10131
:10386000A60195010E943F3B21EE3EE245E652E46F
:103870000E94A93D20E030E044E353E40E94CC3AAA
:1038800020E030E044EB53E40E94763C7B018C0165
:1038900037014801C801B70120E030E044EB53E4B0
:1038A0000E949E3D181654F4C801B70120E030E094
:1038B00044EB53E40E94CB3A3B014C01C201B101FD
:1038C000A20191010E94A93D7B018C01C601B501B5
:1038D000A60195010E94A93D9B01AC01C801B70159
:1038E0000E94CC3A0E94103E69837A838B839C832A
:1038F0006D827E828F82988629813A814B815C819C
:103900006D817E818F81988528960FB6F894DEBFF1
:103910000FBECDBFCF91DF911F910F91FF90EF9020
:10392000DF90CF90BF90AF909F908F907F906F90DF
:103930005F904F903F902F900895AF92BF92CF929B
:10394000DF92EF92FF920F931F93DF93CF93CDB748
:10395000DEB728970FB6F894DEBF0FBECDBF8091BB
:10396000F502882309F073C381E08093F5020E9479
:103970009926882309F4B0C180910F03882309F4A4
:1039800063C08091AF0383FFA7C1A0908B03B09069
:103990008C03C0908D03D0908E03C601B5010E94A8
:1039A000343C20E836E948E15BE40E94993B6093AF
:1039B00048037093490380934A0390934B03E0902C
:1039C0008F03F09090030091910310919203C8012E
:1039D000B7010E94343C20E836E948E15BE40E94EC
:1039E000993B60934C0370934D0380934E039093E7
:1039F0004F03A0925003B0925103C0925203D09251
:103A00005303E0925403F09255030093560310932E
:103A100057038091930390919403A0919503B091E3
:103A200096038093580390935903A0935A03B0933D
:103A30005B038091AA039091AB0390935D03809305
:103A40005C0310920F0348C12DB73EB7235230409C
:103A50000FB6F8943EBF0FBE2DBF2F5F3F4FD90169
:103A6000E8E4F3E086E101900D928150E1F7D9019D
:103A70005696EDE6F3E08DE001900D928150E1F76E
:103A80000E94BC1B29833A834B835C836D837E83B6
:103A90008F839887AEE3B3E0FE01319688E0019012
:103AA0000D928150E1F760919F037091A0038827E8
:103AB00077FD8095982F0E94343C20E030E044EB65
:103AC00051E40E94993B20E030E040E850E40E943D
:103AD000A93D7B018C016091750370917603809103
:103AE00077039091780320915803309159034091C6
:103AF0005A0350915B03621B730B840B950B0E945E
:103B0000343C20E030E04AE754E40E94993B9B01BA
:103B1000AC01C801B7010E94CC3A20E030E040EA95
:103B200050E40E94993BA62ED72EC82EB92E262FE0
:103B3000372F482F592F20931103309312034093AE
:103B4000130350931403E0903E03F0903F03009161
:103B50004003109141032DB73EB72D5D3F4F0FB687
:103B6000F8943EBF0FBE2DBFCA01A80197010E9465
:103B70003F3B21EE3EE245E652E40E94A93D0E9411
:103B8000013C7093070360930603C801B70120E06E
:103B900030E040E850E40E94923B882314F56091A5
:103BA0005C0370915D03882777FD8095982F0E94B4
:103BB000343C609342037093430380934403909397
:103BC00045036A2D7D2D8C2D9B2D20E030E040E4B7
:103BD00050E40E94923B882324F410920703109231
:103BE000060360915C0370915D03882777FD8095E3
:103BF000982F0E94343C9B01AC016091420370916C
:103C0000430380914403909145030E94CB3A20E006
:103C100030E044EB53E40E94CC3A20E030E044EB47
:103C200052E40E94CC3A20E030E044EB53E40E949E
:103C3000763C9B01AC01CA01B9010E94013CCB0159
:103C400070930C0360930B0331E06936730734F013
:103C50008856914090930C0380930B038091060348
:103C60009091070397FF04C0109207031092060378
:103C70008091060390910703853B910534F084EB16
:103C800090E0909307038093060380910B0390913B
:103C90000C03843B910594F0845B904090930C035B
:103CA00080930B0384EB90E020910603309107038F
:103CB000821B930B909307038093060360910B0381
:103CC00070910C0380E00E94350C609106037091A6
:103CD000070381E00E94350C80918F02882309F44C
:103CE000B2C190910F03992319F0843009F0ABC150
:103CF0008091D601882309F4A6C180910E03882300
:103D000031F0992321F410920E030E94FE3280912B
:103D10008F02823009F497C0833020F4813009F09B
:103D200092C107C0833009F4D2C0843009F08BC13E
:103D30000FC160915C0370915D03882777FD8095CA
:103D4000982F40E023E000E0EE240E9488139C01BD
:103D500080E060E044E251E00FED0E94920F88E0C5
:103D600060E00E941F3389E291E00E942D33609150
:103D70003E0370913F03809140039091410320E006
:103D800030E040E251E40E94A93D0E94013C0E94C3
:103D90003C166091420370914303809144039091DB
:103DA00045030E94063C40E023E000E00E948813A7
:103DB0009C0180E061E04EE251E00FED0E94920F25
:103DC00088E061E00E941F3383E391E00E942D337D
:103DD0006091110370911203809113039091140369
:103DE00020E030E040E251E40E94A93D0E94013C05
:103DF0000E943C1660910B0370910C03882777FD9D
:103E00008095982F40E023E000E00E9488139C01F9
:103E100080E062E048E351E00FED0E94920F609174
:103E2000060370910703882777FD8095982F40E05F
:103E300023E000E00E9488139C0188E062E04DE3EB
:103E400051E00FED41C060916D0370916E03809160
:103E50006F039091700340E02BE007E017E0E12E44
:103E60000E9488139C0180E060E042E451E000E0A1
:103E70000E94920F6091710370917203809173039D
:103E80009091740340E02BE007E00E9488139C01AE
:103E900080E061E048E451E000E00E94920F609110
:103EA000750370917603809177039091780341E0D8
:103EB0002BE003E0EE24E3940E9488139C0180E051
:103EC00062E04EE451E000E00E94920FBCC06091BD
:103ED000500370915103809152039091530340E03D
:103EE0002BE007E0B7E0EB2E0E9488139C0180E0F6
:103EF00060E045E551E000E00E94920F60915403BC
:103F000070915503809156039091570340E02BE048
:103F100007E00E9488139C0180E061E04BE551E0DE
:103F200000E00E94920F60915803709159038091B4
:103F30005A0390915B0341E02BE003E0EE24E3940D
:103F40000E9488139C0180E062E041E651E0BBCF13
:103F50006091A50370E080E090E040E024E001E0A3
:103F6000EE24E3940E9488139C0180E060E048E620
:103F700051E006E50E94920F60919D0270919E02B1
:103F800080E090E040E024E000E0EE240E9488130E
:103F90009C0188E060E04BE651E00E94920F609146
:103FA0001D0370911E0380E090E040E024E001E0FA
:103FB000EE24E3940E9488139C0180E061E04EE6C9
:103FC00051E001E40E94920F60919B0270919C026B
:103FD00080E090E040E024E001E00E9488139C0132
:103FE00088E061E041E751E001E40E94920F80E047
:103FF00062E00E941F3384E791E00E942D336091BC
:10400000CD017091CE018091CF019091D00120EA35
:104010003FE040E050E00E94BB3ECA01B9010E946F
:10402000580B88E062E00E941F3386E791E00E940F
:104030002D3360919F027091A0028091A102909116
:10404000A2020E94580B0E94650F1092F50228965A
:104050000FB6F894DEBF0FBECDBFCF91DF911F9199
:104060000F91FF90EF90DF90CF90BF90AF900895A9
:1040700080910403882381F0F894109204037894CB
:1040800080918602823011F40E949D1C80918F02E3
:10409000853011F40E943B0B08950E94A21B0E94E0
:1040A00038200E948F0A80918602813011F40E948C
:1040B000590C08950E944D2080E00E94FC1980E276
:1040C0000E948E34882321F48091D601882311F434
:1040D0001092D70108952F923F924F925F926F9264
:1040E0007F928F929F92AF92BF92CF92DF92EF9288
:1040F000FF920F931F93DF93CF93CDB7DEB728972F
:104100000FB6F894DEBF0FBECDBF8091C3010E94F1
:10411000F40A8F8384E59EE068E00E94E132109209
:1041200010038FE20E9488121A8219820E94513570
:104130002C01569447945C824B820E9451358887AB
:10414000292E8D839E8380E08E010F5F1F4FB80163
:104150000E94AB0A682E3090C40142017724739408
:10416000ABC0840104191509C80160E070E04885FE
:10417000522D92010E94D00ABC01C80141E00E9468
:10418000530D80910503B4010E94F835E72DF0E04E
:10419000EF5FFD4FE081F0E0EE0FFF1F61E070E0A8
:1041A0006C0F7D1FE60FF71F0190F081E02D8E163A
:1041B0009F0609F46BC040918402862D992787FDE4
:1041C0009095242F30E0BC01629FC001639F900D49
:1041D000729F900D1124880E991E67FE04C08E16E2
:1041E0009F0644F005C0662019F0E815F90514F0A3
:1041F000442309F44F012091C3016091850270E0CE
:10420000620F711D6F5F7F4F882777FD8095982F14
:104210000E94343C5B016C0120E030E44CE955E441
:104220000E94A93D7B018C0120E030E040E85FE383
:104230000E94923B88231CF461E070E023C0C80117
:10424000B70120E03FEF4FE757E40E949E3D18166C
:10425000ACF4C601B50120E030E040E251E40E9438
:10426000A93D0E94063C06C084EF91E00197F1F75A
:104270006150704061157105B9F71CC0C801B701E4
:104280000E94063CCB010197F1F714C0872DBE01B7
:104290006F5F7F4F0E94AB0A682E72E0771510F4B3
:1042A000772404C0772009F43A9473948091C5016F
:1042B0000E9486090E945A2080E20E947E34882350
:1042C00039F48091D701882319F0332009F049CFC0
:1042D0000E94FE328091D701882319F40E942B1B83
:1042E0000BC0E7EDF1E001900020E9F73197E75DC1
:1042F000F1408E2F0E94581B8CE19EE067E00E94E7
:10430000E132F89484E10E94BE3478948F810E9457
:104310008C1028960FB6F894DEBF0FBECDBFCF919C
:10432000DF911F910F91FF90EF90DF90CF90BF90A2
:10433000AF909F908F907F906F905F904F903F9045
:104340002F9008952F923F924F925F926F927F929B
:104350008F929F92AF92BF92CF92DF92EF92FF9295
:104360000F931F93DF93CF93CDB7DEB728970FB688
:10437000F894DEBF0FBECDBF6887272E382ED92E0A
:1043800029833A834B835C8327013801CD82BF8226
:10439000AE82B82C8C2D61E00E941F336885722D8F
:1043A000832D9D2D2E813F81F90109951885022DC0
:1043B000F32CED2C1EC000D0EDB7FEB71182B282F7
:1043C000612F702F8F2D9E2D29813A814B815C8129
:1043D00083017201CD80AA24A3948E809F800E94C5
:1043E000DC0F162F072FF82EE92E0F900F900E944A
:1043F0005A2080E20E947E34882341F48091D701C4
:10440000882321F0809192028823A9F20E94FE3233
:1044100080919202882319F0109292020FC0E7ED6A
:10442000F1E001900020E9F73197E75DF1408E2F30
:104430000E94581B1887202E3F2CDE2C6885722D79
:10444000832D9D2D28960FB6F894DEBF0FBECDBFED
:10445000CF91DF911F910F91FF90EF90DF90CF9060
:10446000BF90AF909F908F907F906F905F904F9094
:104470003F902F9008958F92AF92BF92CF92EF927C
:10448000FF920F931F9387E50E9488126091C701E6
:1044900070E080E090E020E030E040E050E0A6E016
:1044A000EA2EF12C012D112DF3E0CF2EECEAAE2EE9
:1044B000EFE0BE2E88240E94A2219B01AC018091D6
:1044C000C70190E0A0E0B0E0281739074A075B0772
:1044D000C1F02093C70185EB90E0622F0E94D73F87
:1044E00084E06EE10E942909E091C701F0E0EE0F3F
:1044F000FF1FEE0FFF1FEB57FE4F808191810E943F
:104500004D3787ED91E00E945D101F910F91FF9054
:10451000EF90CF90BF90AF908F9008958F92AF9211
:10452000BF92CF92EF92FF920F931F9389E30E9465
:1045300088126091870270E080E090E020E030E037
:1045400040E050E0F1E0EF2EF12C012D112DE3E0E1
:10455000CE2EBFE0AB2EB2E1BB2E88240E94A2215A
:104560009B01AC018091870290E0A0E0B0E02817A9
:1045700039074A075B0759F02093870284EB90E0E4
:10458000622F0E94D73F84E06EE10E94290987EDE7
:1045900091E00E945D101F910F91FF90EF90CF90DE
:1045A000BF90AF908F9008958F92AF92BF92CF92AD
:1045B000EF92FF920F931F938AE30E9488126091FB
:1045C000C60170E080E090E020E030E040E050E0A4
:1045D000E4E6EE2EF12C012D112DB7E0CB2EA7EA4B
:1045E000AA2EA5E1BA2E882483940E94A2219B01C1
:1045F000AC018091C60190E0A0E0B0E02817390737
:104600004A075B0759F02093C60183EB90E0622FC5
:104610000E94D73F84E06EE10E94290987ED91E076
:104620000E945D101F910F91FF90EF90CF90BF906F
:10463000AF908F90089580918602823039F0833058
:1046400041F0813041F40E94D42208950E948E22CC
:1046500008950E943B2208958F92AF92BF92CF920D
:10466000EF92FF920F931F9387E30E94881260914D
:10467000860270E080E090E020E030E040E050E032
:10468000B3E0EB2EF12C012D112DA3E0CA2EF7E2A1
:10469000AF2EF2E1BF2E88240E94A2219B01AC0123
:1046A0008091860290E0A0E0B0E0281739074A0721
:1046B0005B07A9F1F894622F20938602789482EB2D
:1046C00090E00E94D73F84E06EE10E94290980912A
:1046D00086020E94A13881E080930F03109293021A
:1046E00010929402109295021092960210929702E4
:1046F000109298021092990210929A020E94270C2E
:1047000080918602882321F084E10E94BE3405C096
:1047100084E00E9486090E94F2350E94B00B87ED6A
:1047200091E00E945D101F910F91FF90EF90CF904C
:10473000BF90AF908F9008958F92AF92BF92CF921B
:10474000EF92FF920F931F938DE10E948812609168
:10475000D30170E080E090E02EE130E040E050E0F6
:10476000A8ECEA2EF12C012D112DF6E0CF2EEAE671
:10477000AE2EE4E1BE2E882483940E94A2219B01E8
:10478000AC018091D30190E0A0E0B0E02817390798
:104790004A075B0759F02093D30189E191E0622F2A
:1047A0000E94D73F84E06EE10E94290987ED91E0E5
:1047B0000E945D101F910F91FF90EF90CF90BF90DE
:1047C000AF908F9008958F92AF92BF92CF92EF9259
:1047D000FF920F931F938CE10E9488126091D20187
:1047E00070E080E090E02EE130E040E050E0F8EC56
:1047F000EF2EF12C012D112DE6E0CE2EBAE6AB2ED8
:10480000B4E1BB2E882483940E94A2219B01AC01B9
:104810008091D20190E0A0E0B0E0281739074A0764
:104820005B0759F02093D20188E191E0622F0E944A
:10483000D73F84E06EE10E94290987ED91E00E9454
:104840005D101F910F91FF90EF90CF90BF90AF90B0
:104850008F9008958F92AF92BF92CF92EF92FF9276
:104860000F931F938BE10E9488126091D10170E039
:1048700080E090E020E030E040E050E0E4E1EE2E27
:10488000F12C012D112DB5E0CB2EA8E7AA2EA4E125
:10489000BA2E882483940E94A2219B01AC018091AE
:1048A000D10190E0A0E0B0E0281739074A075B0784
:1048B00059F02093D10187E191E0622F0E94D73F08
:1048C00084E06EE10E94290987ED91E00E945D106D
:1048D0001F910F91FF90EF90CF90BF90AF908F906E
:1048E00008958F92AF92BF92CF92EF92FF920F9363
:1048F0001F938AE10E9488128091C9019091CA0198
:1049000062E370E00E94943E80E090E024E130E0B9
:1049100040E050E0B8E7EB2EF12C012D112DA5E081
:10492000CA2EF2E9AF2EF4E1BF2E882483940E94B0
:10493000A2218B019C018091C9019091CA0162E37F
:1049400070E00E94943E80E090E006171707280769
:104950003907F1F0C901B80122E330E040E050E04E
:104960000E94693E7093CA016093C90160918E02F2
:1049700089E0689FB001112463547F4F88EC91E077
:1049800049E050E00E94CD3F84E06EE10E94290999
:1049900087ED91E00E945D101F910F91FF90EF90C5
:1049A000CF90BF90AF908F9008958F92AF92BF92AB
:1049B000CF92EF92FF920F931F9389E10E9488128A
:1049C00060918E0270E06F5F7F4F882777FD809542
:1049D000982F21E030E040E050E0AAE0EA2EF12CF0
:1049E000012D112DF5E0CF2EE7EAAE2EE5E1BE2E2A
:1049F000882483940E94A2219B01AC012150304065
:104A00004040504080918E0290E0A0E0B0E0281736
:104A100039074A075B07C9F020938E028CEB90E0C0
:104A2000622F0E94D73F60918E0289E0689FB0019B
:104A3000112463547F4F88EC91E049E050E00E94DC
:104A4000AF3F84E06EE10E9429091F910F91FF9012
:104A5000EF90CF90BF90AF908F9008950E94D52493
:104A600087ED91E00E945D100895AF92BF92CF92C2
:104A7000DF92EF92FF920F931F93CF93DF9380917A
:104A80009002882309F047C04091A5038091C80196
:104A900090E00296242F30E082179307E4F580918E
:104AA000BA039091BB030797B0F54093C8011092E9
:104AB000910210929E0210929D021092CC011092CF
:104AC000CB011092CD011092CE011092CF01109225
:104AD000D0010E94FE3285E693E067ED71E00E940E
:104AE000533F87ED91E068E771E00E94533F0E94D9
:104AF000D52487ED91E065E673E00E94533F8091F5
:104B0000D701882319F40E942B1B03C081E08093F6
:104B100092020E94901981E080939102809190020C
:104B2000882381F48091BA039091BB03079750F4D6
:104B30009091A503992331F08091C801981710F442
:104B40009093C801C0918C02D0918D0246E4C1358A
:104B5000D407E8F1209188023091890240918A02BD
:104B600050918B02CA01B90113E0660F771F881FAD
:104B7000991F1A95D1F7620F731F841F951F2AE0A2
:104B800030E040E050E00E94BB3E2093880230932A
:104B9000890240938A0250938B029E0140E050E0CC
:104BA000CA01B901B3E0660F771F881F991FBA9534
:104BB000D1F7620F731F841F951F2AE030E040E099
:104BC00050E00E94BB3E30938D0220938C02609196
:104BD000BA037091BB036550704080E090E0209173
:104BE000D20130E040E050E00E94693E24E630E02F
:104BF00040E050E00E94BB3E6091D10170E0620F46
:104C0000731F70931E0360931D0380E090E020915A
:104C100088023091890240918A0250918B02620F82
:104C2000731F841F951F609388027093890280937D
:104C30008A0290938B0220918C0230918D022F5F1B
:104C40003F4F30938D0220938C0240E050E00E9451
:104C5000BB3E59016A0130939C0220939B026091F4
:104C6000D30170E080E090E02091BC033091BD035F
:104C700040E050E00E94693E24E630E040E050E031
:104C80000E94BB3E790130936203209361038091BF
:104C9000CB019091CC01E80EF91EF0929E02E092B9
:104CA0009D026091C9017091CA0180E090E000E02E
:104CB00010E06E197F09800B910B24E230E040E098
:104CC00050E00E94693ECC24DD24A60195010E949B
:104CD000DD3EC901DA0180939F029093A002A09368
:104CE000A102B093A20297FF03C0309521953F4FD8
:104CF00020513E409CF0B7FF05C081EF91EFAFEF30
:104D0000BFEF04C08FE09EE0A0E0B0E080939F0280
:104D10009093A002A093A102B093A202DF91CF9141
:104D20001F910F91FF90EF90DF90CF90BF90AF90C9
:104D300008951F938FE40E943B388823B1F080913F
:104D40004603909147038C5E9440C0F48091B00379
:104D500087FD02C010E006C08091AF038170809390
:104D6000900211E00E9435250AC08091460390917F
:104D70004703805D904211F40E94901910E08091E9
:104D80008702882359F08091460390914703855A02
:104D9000914020F08AE791E00E947237812F1F91A5
:104DA00008958F92AF92BF92CF92EF92FF920F939E
:104DB0001F9387E10E9488126091A60170E080E055
:104DC00090E020E030E040E050E0A8ECEA2EF12C4A
:104DD000012D112DF4E0CF2EEDE1AE2EE6E1BE2E39
:104DE000882483940E94A2219B01AC018091A6019A
:104DF00090E0A0E0B0E0281739074A075B0759F0B8
:104E00002093A60189E090E0622F0E94D73F84E0C2
:104E10006EE10E94290987ED91E00E945D101F91CB
:104E20000F91FF90EF90CF90BF90AF908F9008952B
:104E30008F92AF92BF92CF92EF92FF920F931F93F8
:104E400085E10E9488126091A7017091A80180916C
:104E5000A9019091AA0126E232E040E050E0F8E793
:104E6000EF2EF5E0FF2E012D112DE4E0CE2EBDE159
:104E7000AB2EB6E1BB2E882483940E94A221AB0105
:104E8000BC018091A7019091A801A091A901B091C6
:104E9000AA01481759076A077B0701F14093A70148
:104EA0005093A8016093A9017093AA018AE090E051
:104EB0000E94E53F8091A7019091A801A091A901CE
:104EC000B091AA018093200390932103A093220321
:104ED000B093230384E06EE10E94290987ED91E0FD
:104EE0000E945D101F910F91FF90EF90CF90BF90A7
:104EF000AF908F9008958F92AF92BF92CF92EF9222
:104F0000FF920F931F938FE00E94881280E061E070
:104F10000E941F3380E190E00E94AD100E942D336B
:104F20006091A50170E080E090E020E030E040E09A
:104F300050E0EFE1EE2EF12C012D112DB6E0CB2E3D
:104F4000A8E7AA2EA1E1BA2E882483940E94A22168
:104F50009B01AC018091A50190E0A0E0B0E0281792
:104F600039074A075B0791F02093A50188E090E09C
:104F7000622F0E94D73F84E06EE10E942909809150
:104F8000A501882319F4109282022F9887ED91E0F1
:104F90000E945D101F910F91FF90EF90CF90BF90F6
:104FA000AF908F9008958F92AF92BF92CF92EF9271
:104FB000FF920F931F9389E40E94881282E061E0C0
:104FC0000E941F338EE090E00E94AD100E942D33AE
:104FD00080E091E00E942D336091170370E080E043
:104FE00090E020E030E040E050E0BEE1EB2EF12C1C
:104FF000012D112DABE0CA2EF2E1AF2EF6E1BF2E4E
:1050000088240E94A2219B01AC018091170390E0AB
:10501000A0E0B0E0281739074A075B0759F0209352
:10502000170387E090E0622F0E94D73F84E06EE193
:105030000E94290987ED91E00E945D101F910F9158
:10504000FF90EF90CF90BF90AF908F9008958F9288
:10505000AF92BF92CF92EF92FF920F931F9383E391
:105060000E9488126091850270E080E090E020E06C
:1050700030E040E050E0A8ECEA2EF12C012D112D9B
:10508000F5E0CF2EEFE8AE2EE6E1BE2E8824839425
:105090000E94A2219B01AC018091850290E0A0E0DA
:1050A000B0E0281739074A075B0759F020938502BB
:1050B00081EB90E0622F0E94D73F84E06EE10E9476
:1050C000290987ED91E00E945D101F910F91FF90DB
:1050D000EF90CF90BF90AF908F9008958F92AF9246
:1050E000BF92CF92EF92FF920F931F9382E30E94A1
:1050F00088126091C50170E080E090E024E030E02B
:1051000040E050E0F4E1EF2EF12C012D112DE5E00F
:10511000CE2EB9EAAB2EB4E1BB2E882483940E9434
:10512000A2219B01AC018091C50190E0A0E0B0E01C
:10513000281739074A075B0759F02093C50180EB10
:1051400090E0622F0E94D73F84E06EE10E9429091F
:1051500087ED91E00E945D101F910F91FF90EF90FD
:10516000CF90BF90AF908F9008958F92AF92BF92E3
:10517000CF92EF92FF920F931F9381E30E948812C8
:105180006091C40170E080E090E021E030E040E018
:1051900050E0E4E6EE2EF12C012D112DB5E0CB2EE2
:1051A000A7EAAA2EA5E1BA2E882483940E94A22100
:1051B0009B01AC018091C40190E0A0E0B0E0281711
:1051C00039074A075B0759F02093C4018FEA90E042
:1051D000622F0E94D73F84E06EE10E94290987ED8B
:1051E00091E00E945D101F910F91FF90EF90CF9082
:1051F000BF90AF908F9008958F92AF92BF92CF9251
:10520000EF92FF920F931F9380E30E9488126091A8
:10521000840270E080E090E020E030E040E050E088
:10522000B4E1EB2EF12C012D112DA5E0CA2EFCE6E8
:10523000AF2EF6E1BF2E882483940E94A2219B0109
:10524000AC018091840290E0A0E0B0E0281739071B
:105250004A075B0759F0209384028EEA90E0622FA0
:105260000E94D73F84E06EE10E94290987ED91E01A
:105270000E945D101F910F91FF90EF90CF90BF9013
:10528000AF908F9008958F92AF92BF92CF92DF929E
:10529000EF92FF920F931F938091C3010E94F40A33
:1052A000D82E84E59EE068E00E94E132109210035F
:1052B0008EE20E9488128091190390E005EF11E0C0
:1052C000FC01EE0FFF1FE80FF91FDF01AA0FBB1F44
:1052D000A00FB11F14966D917C91159780E090E01E
:1052E0002D913C9140E050E03196EE0FFF1F0E0FE4
:1052F0001F1FF801E080F18000E010E0F4E0CF2E05
:10530000E1EDAE2EE4E1BE2E882483940E94A2211A
:105310008CE19EE067E00E94E132F89484E10E9413
:10532000BE3478948D2D0E948C101F910F91FF90A8
:10533000EF90DF90CF90BF90AF908F9008958F92B5
:10534000AF92BF92CF92EF92FF920F931F9380E59F
:105350000E9488126091050370E080E090E020E0F8
:1053600030E040E050E0A1E0EA2EF12C012D112DBB
:10537000F4E0CF2EE2E4AE2EE1E1BE2E88240E94BE
:10538000A2219B01AC018091050390E0A0E0B0E078
:10539000281739074A075B0759F0209305038DEA60
:1053A00090E0622F0E94D73F84E06EE10E942909BD
:1053B00087ED91E00E945D101F910F91FF90EF909B
:1053C000CF90BF90AF908F9008958F92AF92BF9281
:1053D000CF92EF92FF920F931F938DE20E9488125B
:1053E00088E061E00E941F3383E191E00E942D3349
:1053F0006091C30170E080E090E02AE030E040E09E
:1054000050E0FEE1EF2EF12C012D112DE5E0CE2E26
:10541000B7EAAB2EB5E1BB2E882483940E94A2216B
:105420009B01AC018091C30190E0A0E0B0E028179F
:1054300039074A075B0759F02093C3018CEA90E0D3
:10544000622F0E94D73F84E06EE10E94290987ED18
:1054500091E00E945D101F910F91FF90EF90CF900F
:10546000BF90AF908F9008958F92AF92BF92CF92DE
:10547000DF92EF92FF920F931F9384E10E94F40A50
:10548000D82E109105030E945135BC017695679581
:10549000812F0E94F8352091190330E08091050397
:1054A00090E0FC0113E0EE0FFF1F1A95E1F7E81BF7
:1054B000F90BEB54FE4F6581768180E090E0F901B5
:1054C000EE0FFF1FE20FF31FEE0FFF1FEE0FFF1F88
:1054D000E352FE4F2085318540E050E0E284F384C2
:1054E00000E010E0E5E0CE2EB0E7AB2EB5E1BB2E3C
:1054F000882483940E94A221AB01BC018091050302
:10550000282F30E0F901A3E0EE0FFF1FAA95E1F785
:10551000E21BF30BEB54FE4F85819681A0E0B0E0D7
:10552000481759076A077B07B1F05683458381E323
:1055300090E0289FB001299F700D389F700D1124B5
:10554000665B7F4FCF0147E050E00E94CD3F84E093
:105550006EE10E9429098D2D0E948C101F910F91E0
:10556000FF90EF90DF90CF90BF90AF908F90089515
:105570008CE20E9488120E94342A089588E20E94D8
:1055800088120E94342A08958F92AF92BF92CF92D0
:10559000DF92EF92FF920F931F9384E10E94F40A2F
:1055A000D82E8091050360E070E00E94F8352091CC
:1055B000190330E08091050390E0FC0103E0EE0F59
:1055C000FF1F0A95E1F7E81BF90BEB54FE4F6181D1
:1055D000728180E090E0F901EE0FFF1FE20FF31FF0
:1055E000EE0FFF1FEE0FFF1FDF01A352BE4F2D91E5
:1055F0003C9140E050E0E152FE4FE080F18000E05D
:1056000010E0E6E0CE2EB6EEAB2EB5E1BB2E882440
:1056100083940E94A221AB01BC0180910503282F35
:1056200030E0F901A3E0EE0FFF1FAA95E1F7E21BBE
:10563000F30BEB54FE4F81819281A0E0B0E048175C
:1056400059076A077B0741F15283418381E390E068
:10565000289FB001299F700D389F700D1124665B43
:105660007F4FCF0147E050E00E94CD3F809105037E
:10567000282F30E0F90193E0EE0FFF1F9A95E1F734
:10568000E21BF30BEB54FE4F658176810E94A93536
:1056900084E06EE10E9429098D2D0E948C101F91DB
:1056A0000F91FF90EF90DF90CF90BF90AF908F90D1
:1056B00008958BE20E9488120E94C42A089587E20E
:1056C0000E9488120E94C42A08958F92AF92BF92BE
:1056D000CF92DF92EF92FF920F931F9384E10E948B
:1056E000F40AD82E109105030E945135BC01812F78
:1056F0000E94F8352091190330E08091050390E075
:10570000FC0103E0EE0FFF1F0A95E1F7E81BF90B20
:10571000EB54FE4F6381748180E090E0F901EE0F5D
:10572000FF1FE20FF31FEE0FFF1FEE0FFF1FDF0142
:10573000AF51BE4F2D913C9140E050E0E352FE4FFF
:10574000E680F78000E010E0E6E0CE2EB4EBAB2E72
:10575000B5E1BB2E882483940E94A221AB01BC0139
:1057600080910503282F30E0F901A3E0EE0FFF1F21
:10577000AA95E1F7E21BF30BEB54FE4F8381948172
:10578000A0E0B0E0481759076A077B0741F154834E
:10579000438381E390E0289FB001299F700D389FDB
:1057A000700D1124665B7F4FCF0147E050E00E94EF
:1057B000CD3F80910503282F30E0F90193E0EE0FF3
:1057C000FF1F9A95E1F7E21BF30BEB54FE4F658147
:1057D00076810E94A93584E06EE10E9429098D2D11
:1057E0000E948C101F910F91FF90EF90DF90CF904F
:1057F000BF90AF908F9008958AE20E9488120E9415
:10580000652B089586E20E9488120E94652B0895F8
:105810008F92AF92BF92CF92DF92EF92FF920F934F
:105820001F9384E10E94F40AD82E8091050390E032
:10583000FC01B3E0EE0FFF1FBA95E1F7E81BF90B8F
:10584000EB54FE4F608170E080E090E020E030E0BB
:1058500040E050E0A1E0EA2EF12C012D112DF6E000
:10586000CF2EE9E6AE2EE1E1BE2E88240E94A221D1
:105870009B01AC0160910503862F90E0FC0173E071
:10588000EE0FFF1F7A95E1F7E81BF90BEB54FE4F83
:10589000808190E0A0E0B0E0281739074A075B0755
:1058A00029F12083862F622F0E945E352091050307
:1058B00030E0C90143E0880F991F4A95E1F7821B48
:1058C000930B41E350E0249FB001259F700D349F5E
:1058D000700D1124665B7F4F8B549E4F47E050E064
:1058E0000E94CD3F84E06EE10E9429098D2D0E9427
:1058F0008C101F910F91FF90EF90DF90CF90BF9091
:10590000AF908F90089589E20E9488120E94082C1F
:10591000089585E20E9488120E94082C08958F92B3
:10592000AF92BF92CF92EF92FF920F931F9384E2B8
:105930000E94881288E061E00E941F336091190381
:1059400070E080E090E020E030E040E050E0A1E056
:10595000EA2EF12C012D112DF5E0CF2EE1E5AE2E32
:10596000E1E1BE2E88240E94A2219B01AC0180911E
:10597000190390E0A0E0B0E0281739074A075B0759
:10598000E9F0F8942093190389E490E0622F0E94D3
:10599000D73F809119030E94CF0C84E10E94BE344E
:1059A000789480918602882329F484E00E948609F5
:1059B0000E94F23584E06EE10E94290987ED91E0B2
:1059C0000E945D101F910F91FF90EF90CF90BF90BC
:1059D000AF908F9008958F92AF92BF92CF92EF9237
:1059E000FF920F931F9380E00E9488126091AC0198
:1059F00070E080E090E020E030E040E050E0F2E055
:105A0000EF2EF12C012D112DE3E0CE2EBBEDAB2EB0
:105A1000B0E1BB2E88240E94A2217B018C0180E191
:105A200090E00E94BF3F8093AC0190E0A0E0B0E026
:105A3000E816F9060A071B0759F0E092AC0180E16D
:105A400090E06E2D0E94D73F84E06EE10E9429090C
:105A500087ED91E00E945D101F910F91FF90EF90F4
:105A6000CF90BF90AF908F9008958F92AF92BF92DA
:105A7000CF92EF92FF920F931F9386E00E948812BD
:105A80006091AB0170E080E090E021E030E040E028
:105A900050E0E7E0EE2EF12C012D112DB3E0CB2EDE
:105AA000AEECAA2EADE0BA2E88240E94A2219B0162
:105AB000AC018091AB0190E0A0E0B0E0281739077D
:105AC0004A075B0751F48091640390E0A0E0B0E0E6
:105AD000281739074A075B07F9F02093AB01209399
:105AE00064038EE090E0622F0E94D73F84E06EE175
:105AF0000E9429098091AB010E940E0C8091D70170
:105B0000882351F460E00E941F336091AB0170E084
:105B100080E090E00E94CE0D87ED91E00E945D1044
:105B20001F910F91FF90EF90CF90BF90AF908F900B
:105B300008958F92AF92BF92CF92EF92FF920F9300
:105B40001F9385E00E9488126091830270E080E0DC
:105B500090E020E030E040E050E0B2E0EB2EF12CAD
:105B6000012D112DA3E0CA2EF6E4AF2EF2E1BF2ED7
:105B700088240E94A2219B01AC018091830290E0C5
:105B8000A0E0B0E0281739074A075B0711F1F89445
:105B9000209383028FE090E0622F0E94D73F84E041
:105BA0006EE10E942909809183020E94EA07982FE2
:105BB00080933D038091D701882351F48091830223
:105BC000823010F064E601C06BEF892F0E942D0D2A
:105BD000789487ED91E00E945D101F910F91FF90E6
:105BE000EF90CF90BF90AF908F9008950F931F9339
:105BF000CF93DF93EC01062F142F8091D8018823D7
:105C000009F590918602892F81508330D8F40F5F77
:105C1000913029F4FE01E00FF11D86E5808380912B
:105C20008602823031F4FE01E00FF11D89E38083AA
:105C30000F5F80918602833029F4FE01E00FF11D91
:105C400083E480830E94FE3280E061E00E941F3383
:105C50008CEF0E94AE32CE01612F402F0E94CD12F8
:105C60002AC080E40E946834882329F480E40E94DA
:105C70007334882351F0112311F4102F01C01150F7
:105C8000CE01612F402F0E94CD1280E80E9468341F
:105C9000882329F480E80E947334882351F0101778
:105CA00010F010E001C01F5FCE01612F402F0E9455
:105CB000CD120E945A2080E20E947E34882341F453
:105CC0008091D701882321F080919202882349F2A4
:105CD0000E94FE328091D701882319F40E942B1B69
:105CE00022C0809192028823E1F4E7EDF1E0DF0128
:105CF0000D900020E9F71197AE1BBF0BEA2F11237F
:105D000061F081E080930A03F0E0E952FE4F105DFC
:105D1000108311820E94D30806C08A2F0E94581B4C
:105D200002C010930A0310929202DF91CF911F914B
:105D30000F910895DF93CF9300D000D000D0CDB75E
:105D4000DEB7DE011196E5E0F2E086E001900D920B
:105D50008150E1F7CE01019665E040910A030E946F
:105D6000F62D87ED91E00E945D1026960FB6F8940F
:105D7000DEBF0FBECDBFCF91DF910895DF93CF93EC
:105D800000D000D000D0CDB7DEB7DE011196EBE039
:105D9000F2E086E001900D928150E1F7CE0101968C
:105DA00065E040910A030E94F62D87ED91E00E9484
:105DB0005D1026960FB6F894DEBF0FBECDBFCF9113
:105DC000DF910895DF93CF9300D000D0CDB7DEB739
:105DD00084E0898386E18A8387E18B8388E18C83F1
:105DE000CE01019663E040910A030E94F62D87EDF3
:105DF00091E00E945D100F900F900F900F90CF9147
:105E0000DF910895DF93CF9300D00F92CDB7DEB727
:105E1000DE011196E1E1F2E083E001900D92815004
:105E2000E1F7CE01019662E040910A030E94F62D4F
:105E300087ED91E00E945D100F900F900F90CF9131
:105E4000DF910895DF93CF9300D000D000D0CDB77D
:105E5000DEB7DE011196E4E1F2E086E001900D92FA
:105E60008150E1F7CE01019665E040910A030E945E
:105E7000F62D87ED91E00E945D1026960FB6F894FE
:105E8000DEBF0FBECDBFCF91DF910895DF93CF93DB
:105E900000D000D00F92CDB7DEB7DE011196EAE157
:105EA000F2E085E001900D928150E1F7CE0101967C
:105EB00064E040910A030E94F62D8DEA90E00E9472
:105EC000BF3F8093050387ED91E00E945D100F9026
:105ED0000F900F900F900F90CF91DF910895DF9367
:105EE000CF9300D000D00F92CDB7DEB7DE01119670
:105EF000EFE1F2E085E001900D928150E1F7CE01F3
:105F0000019664E040910A030E94F62D81E080939F
:105F1000050387ED91E00E945D100F900F900F90A8
:105F20000F900F90CF91DF910895DF93CF9300D022
:105F300000D00F92CDB7DEB7DE011196E4E2F2E0B9
:105F400085E001900D928150E1F7CE01019664E069
:105F500040910A030E94F62D1092050387ED91E00F
:105F60000E945D100F900F900F900F900F90CF91A7
:105F7000DF910895DF93CF9300D000D0CDB7DEB787
:105F800084E0898384E28A8381E58B8382E58C8344
:105F9000CE01019663E040910A030E94F62D87ED41
:105FA00091E00E945D100F900F900F900F90CF9195
:105FB000DF910895DF93CF9300D000D0CDB7DEB747
:105FC00084E0898386E48A8388E08B8387E48C83FA
:105FD000CE01019663E040910A030E94F62D87ED01
:105FE00091E00E945D100F900F900F900F90CF9155
:105FF000DF910895DF93CF93CDB7DEB72C970FB61F
:10600000F894DEBF0FBECDBFDE011196ECE2F2E0E8
:106010008CE001900D928150E1F787ED91E068E707
:1060200071E00E94533FCE01019669E040910A035E
:106030000E94F62D87ED91E00E945D102C960FB620
:10604000F894DEBF0FBECDBFCF91DF91089502C09F
:106050000E945A2080E20E947E34882341F480917D
:10606000D701882321F080919202882389F30E942E
:10607000FE328091D701882319F40E942B1B03C0A4
:1060800081E00E94D3088091D701882319F480E031
:1060900090E008C090E080919202811191E081E04F
:1060A0009827892F10929202089582E40E94881204
:1060B00080E061E00E941F338CE490E00E94AD100C
:1060C0000E942D3380E062E00E941F338DE490E057
:1060D0000E94AD100E942D330E943B0B85E08093FF
:1060E0008F0280930A030E942730882339F0E7ED5E
:1060F000F1E001900020E9F73297108210928F02B0
:1061000087ED91E00E945D100895CF93DF93E7ED56
:10611000F1E001900020E9F73197E75DF140E150AF
:10612000CE2FD0E0FE01E952FE4F80818053809354
:106130008F0280930A0391E090930E03843031F034
:1061400081E490E00E94AD100E942D330E94273020
:10615000882319F0C952DE4F188210928F0287ED02
:1061600091E00E945D10DF91CF9108950F931F93EE
:10617000DF93CF93CDB7DEB764970FB6F894DEBF49
:106180000FBECDBF87E40E9488128AE090E00E9493
:10619000AD10BC018E010F5F1F4FC8010E94533F1D
:1061A0008CE090E00E94AD10BC01C8010E943F3F0E
:1061B000C80161E00E940E0E8DE090E00E94AD10DB
:1061C00062E00E940E0E0E942730882359F08091D1
:1061D000D4019091D5010E9413171092D7010E940B
:1061E0002B1B04C087ED91E00E945D1064960FB6F2
:1061F000F894DEBF0FBECDBFCF91DF911F910F91FD
:106200000895DF92EF92FF920F931F93DF93CF9346
:10621000CDB7DEB7A3970FB6F894DEBF0FBECDBFE4
:1062200088E00E9488128AE090E00E94AD10BC01D4
:106230008E01005F1F4FC8010E94533F8BE090E02A
:106240000E94AD10BC01C8010E943F3FC80161E03F
:106250000E940E0E8DE090E00E94AD1062E00E9460
:106260000E0E0E9427308823E1F110E001E07E014C
:106270000894E11CF11C8CE2D82E802F0E940E0C99
:106280006091D4017091D501802F0E944917882315
:1062900069F4F701E10FF11D005D00830053812FC8
:1062A0008F5FF701E80FF11DD0821E5F0F5F08308E
:1062B00021F78091AB010E940E0C84E06EE10E94F8
:1062C0002909112349F01150CE010196FC01E10F7B
:1062D000F11D10820E94FA101092D7010E942B1B10
:1062E00004C087ED91E00E945D10A3960FB6F8946C
:1062F000DEBF0FBECDBFCF91DF911F910F91FF90F9
:10630000EF90DF9008950F931F93DF93CF93CDB756
:10631000DEB764970FB6F894DEBF0FBECDBF86E43C
:106320000E9488128AE090E00E94AD10BC018E01AC
:106330000F5F1F4FC8010E94533F8BE090E00E9407
:10634000AD10BC01C8010E943F3FC80161E00E943E
:106350000E0E8DE090E00E94AD1062E00E940E0EE5
:106360000E942730882361F06091D4017091D5019B
:1063700080E00E9449171092D7010E942B1B04C095
:1063800087ED91E00E945D1064960FB6F894DEBF31
:106390000FBECDBFCF91DF911F910F9108958F92C6
:1063A0009F92AF92CF92DF92EF92FF920F931F9343
:1063B00088EE93E024EF31E0F9013197F1F701978E
:1063C000D9F7239A2B9887B18F7387B9579886B1DD
:1063D00090E0807C09F091E0892F0E9491174F99FD
:1063E00004C0369902C00E94950B81B18F6181B9BA
:1063F00084B1876184B98091AB010E940E0C8091B9
:10640000AB018093640313980E94490885E085BD21
:1064100080916E00816080936E0083E08093B10074
:10642000809170008160809370008AB1837F8AB907
:10643000809169008A6080936900809183020E9444
:10644000EA078AB180638AB980918602882319F0AD
:1064500084E10E94BE3480916B036091170340E099
:1064600020E00E944F330E9408088CE19EE067E024
:106470000E94E1320E94651282E06EE10E942909C9
:1064800078948091AC018E3F21F41092AC010E946F
:10649000EB2C1092D7010E942B1BDD24D39480910A
:1064A000D701882321F40E94691B0E94500F0E948B
:1064B0004D208091D601882391F380E20E947E34A2
:1064C000882321F0D0920A030E94FA2F00D0609115
:1064D000AB0170E080E090E0EDB7FEB7D1821282B0
:1064E00021E030E040E050E0F7E0EF2EF12C012D0C
:1064F000112DCC24AA24EEEC8E2EEDE09E2E0E94CF
:10650000DC0F0F900F908091AB01681741F2609300
:10651000AB01862F0E940E0CC2CF28B1982F9F701E
:10652000922B98B998B1806F982398B9459A8DE0CD
:106530008A95F1F7459888EC8A95F1F708951F93AD
:10654000182F82958F700E948D32812F0E948D327C
:106550001F91089544980E949F320895449A0E9482
:106560009F320895EF92FF920F931F93CF93DF9383
:10657000182F7B0188E20E94AA32012F10E083E0ED
:10658000000F111F8A95E1F7C0E0D0E09E01200FB7
:10659000822F80640E94AA32F701EC0FFD1FE49164
:1065A0008E2F0E94AE322196C830D10579F789E24C
:1065B0000E94AA32DF91CF911F910F91FF90EF902F
:1065C0000895EF92FF920F931F93CF93DF937C0177
:1065D000062F10E0C0E0D0E008C0B7016C0F7D1FAF
:1065E000812F0E94B2321F5F28961017B0F3DF91FF
:1065F000CF911F910F91FF90EF90089581E00E943D
:10660000AA3280E197E20197F1F708950F931F9363
:10661000162F813011F400E501C004E589E20E94E3
:10662000AA32812F8F7080670E94AA321295137050
:10663000802F812B0E94AA321F910F9108958131E2
:1066400008F080E0643008F060E06295607F680FD9
:10665000862F80680E94AA3208950F931F93CF93CC
:10666000DF93EC0100E010E00FC08A3051F41330EA
:1066700010F010E001C01F5F80E0612F0E941F3307
:1066800002C00E94AE320F5FFE01E00FF11D80815B
:10669000882359F7DF91CF911F910F910895CF92E1
:1066A000DF92EF92FF920F931F93582F162FC42E55
:1066B000022F279A3D9A3C9A87B18F6087B94598F7
:1066C00080E991E024EF31E0F9013197F1F701978A
:1066D000D9F7513039F4EDE1FE2E7CE6D72E60E596
:1066E000E62E06C055E1F52E4EE6D42E34E5E32E17
:1066F000449883E00E948D3280E197E20197F1F7A0
:1067000083E30E948D3282E30E94AA3289E20E94D2
:10671000AA328F2D0E94AA32812F8F7080670E942B
:10672000AA32129513708E2D812B0E94AA328D2DC4
:106730000E94AA3288E20E94AA3201700C608C2D5D
:1067400090E081709070880F991F802B0E94AA3270
:106750000E94FE3286E00E94AA321F910F91FF90A4
:10676000EF90DF90CF9008951F920F920FB60F9287
:1067700011242F933F938F939F938DE386BD26B172
:1067800089B13091030490E0807890709595879559
:1067900095958795207C282B2095232780910003B1
:1067A00082238095809300039091FF029223982783
:1067B0009093FF028223892390910304982790935A
:1067C000030420916003909103048923822B80931A
:1067D000600380916003807E51F010921603109246
:1067E000150388EE93E090936D0280936C02809184
:1067F0000304807E49F482E38093FE0284E1809367
:106800001C0386E0809309038091FE0281508093EF
:10681000FE02882361F480911C038093FE02909114
:106820001A0380910304807E892B80931A03809140
:10683000FD0281508093FD02882331F482E380932E
:10684000FD0281E080935E038091FC028150809381
:10685000FC02882331F484E18093FC0281E0809380
:1068600018038091FB0281508093FB02882331F44E
:1068700082E08093FB0281E0809324038091FA02FE
:1068800081508093FA02882331F48AE08093FA02DF
:1068900081E08093040380916C0290916D020197D6
:1068A00090936D0280936C02892B49F488EE93E0FB
:1068B00090936D0280936C0281E0809302049F911B
:1068C0008F913F912F910F900FBE0F901F901895B1
:1068D000F894909160038923909160039827909396
:1068E000600378940895F89490911A038923909105
:1068F0001A03982790931A0378940895F894909126
:106900000304F89420916003909589238223909149
:10691000600398279093600378940895982FF894D3
:1069200080911A03982380911A03892780931A0370
:106930007894F8948091600389239091600398275C
:1069400090936003789408958823B9F080910903A7
:10695000882341F0F89480910903815080930903C2
:106960007894089580911C03843038F0F8948091D5
:106970001C03825080931C0378940895EF92FF9239
:106980000F931F93E82E80916F008D7F80936F008F
:10699000E0911903EE2309F054C0809181008C7FAF
:1069A000809381008091810084608093810080E1E8
:1069B0008093040480E28093100410921D041092CE
:1069C0001C04FF2400E010E0F0E083E0EE0FFF1F66
:1069D0008A95E1F7E259FD4F2681378140E050E08A
:1069E00060E07DE281E391E00E94BB3EC801B70117
:1069F0000E94693E0E94323C2FE632E143E85AE3AE
:106A00000E94A93D0E94063CAB0170931F04609355
:106A10001E043091880020918900922F80E0830F1E
:106A2000911D840F951F9093890080938800809119
:106A30006F00826080936F001F910F91FF90EF9025
:106A40000895809181008B7F8093810080918100E7
:106A50008360ABCFE0911903F0E023E0EE0FFF1F5E
:106A60002A95E1F7E259FD4F26813781829FB001D7
:106A7000839F700D929F700D112480E090E00E9422
:106A8000323C20E030E040EA51E40E94993B20E0B3
:106A900030E040E05FE30E94CC3A0E94063CCB012C
:106AA0000895E0911903F0E033E0EE0FFF1F3A95EF
:106AB000E1F7EE58FD4F80819181089590E0FC014F
:106AC000EE0FFF1FE80FF91FEE0FFF1FEE0FFF1F66
:106AD000EC5FFB4F61706383089590E0DC01AA0FC7
:106AE000BB1FA80FB91FAA0FBB1FAA0FBB1FA85F10
:106AF000BB4FE0911903F0E083E0EE0FFF1F8A9592
:106B0000E1F7E059FD4F80819181860F971F8D93AA
:106B10009C93089590E0DC01AA0FBB1FA80FB91F3A
:106B2000AA0FBB1FAA0FBB1FAC5FBB4FE09119039D
:106B3000F0E033E0EE0FFF1F3A95E1F7E259FD4F29
:106B400080819181861B970B17969C938E93169745
:106B5000089590E0E4E0F4E09C01220F331F280F39
:106B6000391FD901AA0FBB1FAA0FBB1FAE0FBF1F32
:106B70001B967C936E931A972F5F3F4F220F331F04
:106B8000220F331FE20FF31F40815181E09119035F
:106B9000F0E083E0EE0FFF1F8A95E1F7EE58FD4F1E
:106BA00080819181909581959F4F841B950B1696BE
:106BB0002D913C911797820F931F660F771F860FB9
:106BC000971F73E0880F991F7A95E1F764E0969517
:106BD00087956A95E1F7840F951F19969C938E937C
:106BE00018970895EFE6F0E080818D7F8083089507
:106BF000CF92DF92EF92FF920F931F93CF93DF9389
:106C00009B01C82FD0E0FE01EE0FFF1FEC0FFD1F10
:106C1000EE0FFF1FEE0FFF1FEC5FFB4F83818823FA
:106C200081F0E0911903F0E0B3E0EE0FFF1FBA9599
:106C3000E1F7EE58FD4F80819181AC01461B570B67
:106C40009A01E0911903F0E0A3E0EE0FFF1FAA956F
:106C5000E1F7EE58FD4F80819181AC015695479543
:106C6000FE01EE0FFF1F6C01EE24FF2424173507F1
:106C700000F5EC0FFD1FEE0FFF1FEE0FFF1FDF01F2
:106C8000A85FBB4F0D911C91EC5FFB4F6085718538
:106C9000601B710B80E090E0660F771F881F991FC3
:106CA00040E050E00E94693EA70196010E94DD3E4F
:106CB0001EC0EC0FFD1FEE0FFF1FEE0FFF1FEC5F5E
:106CC000FB4F0085118566817781601B710B80E029
:106CD00090E0660F771F881F991F241B350B40E03B
:106CE00050E00E94693EA70196010E94BB3EC80188
:106CF000820F931FFE01EE0FFF1FEC0FFD1FEE0F23
:106D0000FF1FEE0FFF1FE85FFB4F0190F081E02DAA
:106D10008E179F0708F4CF01FE01EE0FFF1FEC0F47
:106D2000FD1FEE0FFF1FEE0FFF1FEC5FFB4F2681D5
:106D300037812817390708F4C90192838183DF91CD
:106D4000CF911F910F91FF90EF90DF90CF9008951A
:106D5000482F50E0FA01EE0FFF1FE40FF51FEE0F72
:106D6000FF1FEE0FFF1FE85FFB4F0190F081E02D4A
:106D7000CB016E177F0708F4CF01FA01EE0FFF1F5A
:106D8000E40FF51FEE0FFF1FEE0FFF1FEC5FFB4F31
:106D9000268137812817390708F4C9019283818336
:106DA00008951F920F920FB60F9211242F933F93C5
:106DB0004F935F938F939F93EF93FF9330910103D2
:106DC000323090F42BB1832F90E0FC01EE0FFF1FC7
:106DD000E80FF91FEE0FFF1FEE0FFF1FEC5FFB4FD9
:106DE0008081809582238BB9832F8F5F80930103ED
:106DF0008230C9F0833010F0109201032BB18091E2
:106E0000010390E0FC01EE0FFF1FE80FF91FEE0FEA
:106E1000FF1FEE0FFF1FEC5FFB4F8081282B2BB96C
:106E2000418152810AC040911E0450911F048091FB
:106E30001C0490911D04481B590B3091880020912F
:106E40008900922F80E0830F911D840F951F9093EE
:106E500089008093880080911C0490911D04840F08
:106E6000951F90931D0480931C0420911E04309163
:106E70001F048217930720F010921D0410921C0427
:106E8000FF91EF919F918F915F914F913F912F9142
:106E90000F900FBE0F901F9018959C0140E050E09E
:106EA00084E0220F331F441F551F8A95D1F760E0FD
:106EB0007DE281E391E00E94BB3E2150304030935F
:106EC000C5002093C40088E98093C10086E08093C8
:106ED000C2000895982F8091C00085FFFCCF909349
:106EE000C6000895FC0107C08091C00085FFFCCF5B
:106EF0009093C600319690819923B1F708951F921F
:106F00000F920FB60F9211242F938F939F93EF93AD
:106F1000FF932091C60080910203882309F052C09C
:106F20008091B704281771F480918102882351F071
:106F30001092810280E294E09093800280937F021D
:106F40001092B804809181028823E1F5E0917F02DC
:106F5000F091800220838091B8048F5F8093B80401
:106F60008091B604882319F02D3001F51AC0809164
:106F7000B804823029F4213019F081E08093810235
:106F80008091B804833021F4223010F086E001C0F3
:106F900085E080937E029091B80480917E029817DC
:106FA00029F481E080938102809302033196F0936B
:106FB0008002E0937F028091B804863919F481E061
:106FC00080938102FF91EF919F918F912F910F906C
:106FD0000FBE0F901F901895CF93DF93EC0130E018
:106FE00044C04F5FE42FF0E0E05EFB4F20812D5363
:106FF0004F5FE42FF0E0E05EFB4F70814F5FE42FC6
:10700000F0E04350E05EFB4F5081DE01A30FB11D65
:10701000922F92959F70E42FF0E0E05EFB4F80810D
:107020008D53880F880F892B8C93613009F1972F2E
:107030009D533F5FFE01E30FF11D31502295207FEC
:10704000892F86958695282B2083623089F04C5FA6
:1070500063503E5FFE01E30FF11D9295990F990F6A
:10706000907C5D53952B90833F5F662309F0B9CFE9
:10707000DF91CF910895982F80910203813009F01C
:107080004BC08091B804882309F446C08091220443
:10709000891709F041C040E050E020E006C0E05E02
:1070A000FB4F8081480F511D2F5FE22FF0E0809150
:1070B000B80490E00397E817F9078CF3CA019F70B2
:1070C000E091B80426E0959587952A95E1F7835CD1
:1070D000F0E0E35EFB4F20818217B1F4E091B80449
:1070E0004F735070942F935CF0E0E25EFB4F808111
:1070F000981751F46091B80466508CE693E043E031
:107100000E94EC3721E001C020E0F8941092470380
:1071100010924603789401C020E08091460390913C
:1071200047038C5E944048F480912204813428F017
:107130008B3518F481E080930D0310920203822FA7
:10714000089590E0823009F491E09093B604992379
:1071500011F083E201C080E88093B7040895AC0188
:107160008091B80482508093B804809102038130EA
:1071700091F420E009C0FA01E20FF11DB0E0A05E39
:10718000BB4F8C9180832F5FA22FA60F8091B804F4
:10719000281788F302C01092B8041092020380915D
:1071A000B8040895A0E3B0E0E8EDF8E30C94F83EED
:1071B000A8E04E010894811C911CF401BA2F119291
:1071C000BA95E9F729833A834B835C836D837E8389
:1071D0008F839887CE010996FC011192AA95E9F751
:1071E000A986BA86CB86DC86ED86FE860F87188B4D
:1071F00029813A814B815C812DA73EA74FA758ABCF
:1072000079018A018FEF9FEFA0E0B0E0E822F92238
:107210000A231B231A014424552429853A854B85CA
:107220005C8529A73AA74BA75CA759016A01A82248
:10723000B922CA22DB223A0188249924C601B50169
:10724000A80197010E94693E6DA37EA38FA398A712
:10725000C401B3010E94693E69A37AA38BA39CA3D6
:10726000C601B501A20191010E94693E7B018C011A
:10727000C401B3010E94693E5B016C0189A19AA11E
:10728000ABA1BCA18E0D9F1DA01FB11F89A39AA306
:10729000ABA3BCA32DA13EA14FA158A5CA01AA270B
:1072A000BB2729A13AA14BA15CA1280F391F4A1F76
:1072B0005B1F29A33AA34BA35CA32E153F054007F0
:1072C000510740F480E090E0A1E0B0E0A80EB91EC4
:1072D000CA1EDB1E89A19AA1ABA1BCA19D014427B6
:1072E00055272A0D3B1D4C1D5D1D2D8F3E8F4F8F49
:1072F00058A36C01BB24AA248DA19EA1AFA1B8A55F
:10730000A070B070A80EB91ECA1EDB1EA98EBA8E60
:10731000CB8EDC8E9A8C8B8C7C8C9E8D6F8D78A125
:10732000FE01719688E0DF011D928A95E9F72D8BA9
:107330009E8B6F8B788F2D853E854F8558896DA5E7
:107340007EA58FA598A90E94693E7B018C012D81A5
:107350003E814F81588569A57AA58BA59CA50E9481
:10736000693EE60EF71E081F191F6D897E898F89F9
:10737000988D6E0D7F1D801F911F6D8B7E8B8F8B67
:10738000988FEE892A2D392D482D572D7E2F8F89E4
:10739000988DE096E2E10C94143FEF92FF920F93E8
:1073A000DF93CF93CDB7DEB760970FB6F894DEBF0B
:1073B0000FBECDBFA82F002309F461C07E01089441
:1073C000E11CF11C88E0F70111928A95E9F7298305
:1073D0003A834B835C836D837E83AF83988780E29F
:1073E000801BE82FFF27E7FDF0954D815E816F81BF
:1073F0007885181684F01D861E861F86188A8827B1
:1074000099278E1B9F0B04C07695679557954795D6
:107410008A95D2F728C0202F332727FD3095DB012E
:10742000CA01022E04C0B695A795979587950A9430
:10743000D2F78D879E87AF87B88B04C0440F551F46
:10744000661F771FEA95D2F789819A81AB81BC814B
:1074500004C0B695A795979587952A95D2F7482B9E
:10746000592B6A2B7B2B49875A876B877C87298509
:107470003A854B855C856D857E85AF8598898A2F99
:1074800060960FB6F894DEBF0FBECDBFCF91DF91EF
:107490000F91FF90EF900895EF92FF920F93DF937B
:1074A000CF93CDB7DEB760970FB6F894DEBF0FBEAF
:1074B000CDBFA82F002309F461C07E010894E11C10
:1074C000F11C88E0F70111928A95E9F729833A8344
:1074D0004B835C836D837E83AF83988780E2801BC0
:1074E000E82FFF27E7FDF09549815A816B817C8168
:1074F000181684F019861A861B861C8688279927F9
:107500008E1B9F0B04C0440F551F661F771F8A9563
:10751000D2F728C0202F332727FD3095DB01CA0181
:10752000022E04C0880F991FAA1FBB1F0A94D2F70E
:1075300089879A87AB87BC8704C0769567955795EE
:107540004795EA95D2F78D819E81AF81B88504C0B9
:10755000880F991FAA1FBB1F2A95D2F7482B592BBA
:107560006A2B7B2B4D875E876F87788B29853A85C1
:107570004B855C856D857E85AF8598898A2F609661
:107580000FB6F894DEBF0FBECDBFCF91DF910F9144
:10759000FF90EF9008955058BB27AA270ED083C2C2
:1075A0004CD230F051D220F031F49F3F11F41EF450
:1075B0001CC20EF4E095E7FB04C2E92F96D280F3DB
:1075C000BA17620773078407950718F071F49EF5E0
:1075D000AEC20EF4E0950B2EBA2FA02D0B01B9010F
:1075E00090010C01CA01A0011124FF27591B99F039
:1075F000593F50F4503E68F11A16F040A22F232F45
:10760000342F4427585FF3CF469537952795A79594
:10761000F0405395C9F77EF41F16BA0B620B730B3B
:10762000840BBAF09150A1F0FF0FBB1F661F771FAC
:10763000881FC2F70EC0BA0F621F731F841F48F461
:10764000879577956795B795F7959E3F08F0B3CFE7
:107650009395880F08F09927EE0F979587950895D1
:10766000ECD158F080E891E009F49EEFEDD128F0DC
:1076700040E851E059F45EEF09C0B7C158C2E92FA4
:10768000E07833D268F3092E052AC1F326173707AD
:107690004807590738F00E2E07F8E02569F0E02575
:1076A000E0640AC0EF6307F8009407FADB01B90150
:1076B0009D01DC01CA01AD01EF934AD0F4D10AD09B
:1076C0005F91552331F02BED3FE049E450FD49EC4B
:1076D00063CF0895DF93DD27B92FBF7740E85FE3DD
:1076E0001616170648075B0710F4D92F2BD29F9365
:1076F0008F937F936F93D2D2E0E7F0E079D1D3D12B
:107700002F913F914F915F9130D2DD2349F09058F6
:10771000A2EA2AED3FE049EC5FE3D0785D274DDF38
:10772000DF91C1C12AD108F481E0089595D1E39594
:10773000CBC10CD0B8C188D140F07FD130F021F45A
:107740005F3F19F03EC15111F3C14FC1CED198F343
:107750009923C9F35523B1F3951B550BBB27AA27D2
:1077600062177307840738F09F5F5F4F220F331F44
:10777000441FAA1FA9F333D00E2E3AF0E0E830D010
:1077800091505040E695001CCAF729D0FE2F27D013
:10779000660F771F881FBB1F261737074807AB07E1
:1077A000B0E809F0BB0B802DBF01FF2793585F4F56
:1077B0002AF09E3F510568F004C1BAC15F3FECF367
:1077C000983EDCF3869577956795B795F7959F5F1B
:1077D000C9F7880F911D9695879597F90895E1E06F
:1077E000660F771F881FBB1F621773078407BA07CE
:1077F00020F0621B730B840BBA0BEE1F88F7E09529
:10780000089504D06894B11193C1089576D188F099
:107810009F5790F0B92F9927B751A0F0D1F0660F7C
:10782000771F881F991F1AF0BA95C9F712C0B13097
:1078300081F07DD1B1E008957AC1672F782F882734
:10784000B85F39F0B93FCCF3869577956795B395D6
:10785000D9F73EF490958095709561957F4F8F4F45
:107860009F4F0895E89409C097FB3EF4909580954A
:10787000709561957F4F8F4F9F4F9923A9F0F92FF6
:1078800096E9BB279395F695879577956795B79574
:10789000F111F8CFFAF4BB0F11F460FF1BC06F5F5A
:1078A0007F4F8F4F9F4F16C0882311F096E911C06C
:1078B000772321F09EE8872F762F05C0662371F08D
:1078C00096E8862F70E060E02AF09A95660F771FA1
:1078D000881FDAF7880F9695879597F90895ADD0A8
:1078E00018F011F0B1D038F480C022C1E92FFDD0DA
:1078F000B0F35523C9F3E7FB6217730784079507B5
:10790000A8F199F3E92FFF2788232AF03197660F12
:10791000771F881FDAF7952F5527442332F09150AF
:107920005040220F331F441FD2F7BB27E91BF50B32
:10793000621B730B840BB109C1F222F4620F731F37
:10794000841FB11D31972AF0660F771F881FBB1F58
:10795000EFCF915050405AF041F0882332F0660F3B
:10796000771F881F91505040C1F7939530C086957E
:10797000779567959F5FD9F7F8CF990F0008550F56
:10798000AA0BE0E8FEEF16161706E807F907C0F0A5
:1079900012161306E407F50798F0621B730B840BAD
:1079A000950B39F40A2661F0232B242B252B21F487
:1079B00008950A2609F4A140A6958FEF811D811D27
:1079C000089597F99F6780E870E060E008959F3F11
:1079D00031F0915020F4879577956795B795880F8A
:1079E000911D9695879597F908959FEF80EC0895DE
:1079F000DF93CF931F930F93FF92EF92DF927B0160
:107A00008C01689405C0DA2EEF01AFD0FE01E89436
:107A1000A5912591359145915591AEF3EF01CDDDBD
:107A2000FE019701A801DA9479F7DF90EF90FF90BB
:107A30000F911F91CF91DF91089500240A9416169B
:107A4000170618060906089500240A94121613064C
:107A5000140605060895C9CF50D0E8F3E894E0E095
:107A6000BB279F57F0F02AED3FE049EC06C0EE0F30
:107A7000BB0F661F771F881F28F0B23A6207730793
:107A8000840728F0B25A620B730B840BE3959A9526
:107A900072F7803830F49A95BB0F661F771F881FE6
:107AA000D2F7904896CF092E0394000C11F4882346
:107AB00052F0BB0F40F4BF2B11F460FF04C06F5FA6
:107AC0007F4F8F4F9F4F0895EF93E0FF06C0A2EACC
:107AD0002AED3FE049EC5FEB70DDE5DF0F900394AA
:107AE00001FC9058EDE9F0E0E3C057FD9058440FD9
:107AF000551F59F05F3F71F04795880F97FB991F0D
:107B000061F09F3F79F087950895121613061406C9
:107B1000551FF2CF4695F1DF08C016161706180656
:107B2000991FF1CF86957105610508940895E89431
:107B3000BB2766277727CB0197F908951EDF08F446
:107B40008FEF08959B01AC0160E070E080E89FE357
:107B5000F0CD0BD0A8CF71DF28F076DF18F0952399
:107B600009F02FCF42CF1124E3CFBFDFA0F3959FC1
:107B7000D1F3950F50E0551F629FF001729FBB2714
:107B8000F00DB11D639FAA27F00DB11DAA1F649FC0
:107B90006627B00DA11D661F829F2227B00DA11D73
:107BA000621F739FB00DA11D621F839FA00D611DF9
:107BB000221F749F3327A00D611D231F849F600D1A
:107BC000211D822F762F6A2F11249F5750408AF053
:107BD000E1F088234AF0EE0FFF1FBB1F661F771FDF
:107BE000881F91505040A9F79E3F510570F0E9CE93
:107BF0009FCF5F3FECF3983EDCF3869577956795D2
:107C0000B795F795E7959F5FC1F7FE2B880F911DFC
:107C10009695879597F9089511F40EF4E6CED7CE90
:107C20006CDFD0F39923D9F3CEF39F57550B87FF21
:107C300038D00024A0E640EA9001805856959795E8
:107C400028F4805C660F771F881F20F026173707FF
:107C5000480730F4621B730B840B202931294A2B0F
:107C6000A69517940794202531254A2758F7660FC3
:107C7000771F881F20F026173707480730F4620B5C
:107C8000730B840B200D311D411DA09581F7B901A7
:107C9000842F9158880F9695879508959B01AC0184
:107CA00058CF91505040660F771F881FD2F7089524
:107CB0009F938F937F936F93FF93EF939B01AC01FF
:107CC00048DFEF91FF9194DE2F913F914F915F91AB
:107CD00040CF629FD001739FF001829FE00DF11DA4
:107CE000649FE00DF11D929FF00D839FF00D749F36
:107CF000F00D659FF00D9927729FB00DE11DF91FE2
:107D0000639FB00DE11DF91FBD01CF01112408953E
:107D1000991B79E004C0991F961708F0961B881FDD
:107D20007A95C9F780950895AA1BBB1B51E107C03E
:107D3000AA1FBB1FA617B70710F0A61BB70B881FFB
:107D4000991F5A95A9F780959095BC01CD0108958A
:107D500097FB092E07260AD077FD04D0E5DF06D071
:107D600000201AF4709561957F4F0895F6F790956D
:107D700081959F4F0895A1E21A2EAA1BBB1BFD01FE
:107D80000DC0AA1FBB1FEE1FFF1FA217B307E407FA
:107D9000F50720F0A21BB30BE40BF50B661F771F52
:107DA000881F991F1A9469F7609570958095909532
:107DB0009B01AC01BD01CF01089597FB092E05265B
:107DC0000ED057FD04D0D7DF0AD0001C38F45095F0
:107DD0004095309521953F4F4F4F5F4F0895F6F7EF
:107DE00090958095709561957F4F8F4F9F4F089527
:107DF0002F923F924F925F926F927F928F929F92BB
:107E0000AF92BF92CF92DF92EF92FF920F931F93A8
:107E1000CF93DF93CDB7DEB7CA1BDB0B0FB6F89459
:107E2000DEBF0FBECDBF09942A88398848885F8499
:107E30006E847D848C849B84AA84B984C884DF800A
:107E4000EE80FD800C811B81AA81B981CE0FD11DEE
:107E50000FB6F894DEBF0FBECDBFED010895FB0154
:107E6000DC018D91059080190110D9F3990B0895CB
:107E7000FB01DC0105900D920020E1F70895FB0164
:107E8000DC010D900020E9F7119701900D92002080
:107E9000E1F70895FB01DC018D910190801901103B
:107EA000D9F3990B0895FB01DC0101900D9200209C
:107EB000E1F70895FB019F01E8944230C4F0453298
:107EC000B4F44A3029F497FB1EF4909581959F4FA6
:107ED000642F77270E94943E805D8A330CF0895D81
:107EE0008193CB010097A1F716F45DE251931082C4
:107EF000C9010C94F23FFA01CF93FF93EF93223024
:107F000044F1253234F5C22FE894CA3049F497FB86
:107F10003EF490958095709561957F4F8F4F9F4F60
:107F20002C2F332744275527FF93EF930E94BB3E06
:107F3000EF91FF91605D6A330CF0695D6193B90167
:107F4000CA01605070408040904051F716F4CDE275
:107F5000C19310828F919F91CF910C94F23FDC01DD
:107F6000CB01FC01F999FECF06C0F2BDE1BDF89A44
:107F7000319600B40D9241505040B8F70895F999E8
:107F8000FECF92BD81BDF89A992780B50895A6E1EC
:107F9000B0E044E050E00C94B13FDC01CB0103C001
:107FA0002D910E94D83F41505040D0F70895262F80
:107FB000F999FECF1FBA92BD81BD20BD0FB6F894CE
:107FC000FA9AF99A0FBE01960895242F0E94D83F7D
:107FD000252F0E94D83F0C94ED3F0E94D73F272FBA
:107FE0000C94D83FDC01FC01672F71917723E1F7F6
:107FF000329704C07C916D9370836291AE17BF0776
:08800000C8F30895F894FFCFC6
:108008003A20004D487A002D002A20006D41680072
:108018007320006D7300202000312E323100560A83
:10802800310A32004469723A004469733A00426581
:10803800613A00416C743A0050616E3A0054696CC0
:108048003A00614C6F6E3A00614C61743A006141CC
:108058006C743A2000684C6F6E3A00684C61743A50
:108068000068416C743A2000553A00573A00493A82
:1080780000EE3A001A005200300023636F3F5D3D66
:108088003D45480D00C0120000201C00008025005E
:108098000040380000004B00000096000000E1009E
:1080A80000000000001F55C003000001FECC014B7A
:1080B8000080008000002D002D007F00002D002D85
:1080C800007F0014010A2805FFC409000000000011
:1080D8000008505025030130000000000000006433
:1080E8000000006400660098000000900100009005
:1080F800019B0163024A00A000750029018102D595
:108108000101000102043D3E3F404204191A1B1CB4
:108118001D040E0F043430313233042E2F502D0439
:10812800292A2B2C042526272801020304050607E3
:10813800002353491437003C4A4B48353734300044
:10814800353736300035373830003538303000357F
:1081580038323000353834300035383630003B029C
:10816800400245024A024F0254025902E803D30072
:108178001A00FF0000014C036800FF0340000620BE
:028188000401F0
:04000005008004B7BC
:00000001FF
/NGVideo5_8/tags/v1.21/Hexfiles
Property changes:
Added: bugtraq:number
+true
\ No newline at end of property
/NGVideo5_8/tags/v1.21/KurzanleitungFW.pdf
0,0 → 1,1303
%PDF-1.4
%Ç쏢
5 0 obj
<</Length 6 0 R/Filter /FlateDecode>>
stream
xœå][¯µV“n¹@à„[ÎN²‡±=Ï´¥(ªTõ©¡OT¥ª
ôÿK]ž{}/ÏÌNN.@‘ʜٶÇ^^—o]l~:©+¥OjÿOxøî‡ãO¾q'ßÿïxx}òÍ_¦‡Ÿ¿?þ鸫ŒÿßðŸ¿ûáä‹Ô±;¡aü븮ú¾oÔð›:±mÕ6'¦«Úº¦Ÿ8>=·{ðŸcMo´V'ûáãþyüðôüNWjTK-ü릵N¾àŸuomgÃ{×֚ZÿãÁ_¿zpü5MM·ZŸ4ª®Ú¶;ùÁÿiãŸÿÿÔ}ËjøóßÇ?ùñ‘—gT3­¯ép}ÃľÞ0¬ªÈFCúѨiXWçZù¾©”ëšžˆc*۹ޜ¾Ÿ.Œkzjú7}y·×þó֜Ŷùå·?䧎á®ëp€K°¯Láz}úíÏ;¢tÓÙþôò°'DÙ®wž£h[©)Qƒ©·¿îM¢šœ›DJIkZôߎÜ}xúênoª¦66YØk»½ªê¶ïNœçíh~R<ƒé»ãèçcßs°¤á›0bø"¿¢bÿ„ÀqÎ0QlLt%ú™ºîaà|QF‡ÁÂø/kàe~<—î˾­—Ac\ŽãB· ¾e£:ÛyrÏóÒFύ꫾vDzUiÛ4§¯Óƒk4äøô&wG~áï_ęIÖÙ&Y%¯Æ¶×&Ú) Ȥ¹¿x+Y.¥¬¶§7v=®¦éŽÌ£­­œU#G?„¡`¹É¤âø7GÊ:Óʽ`‚𖿏šð퉙#öè`±@–|Cýgß¡¦­iúöôV|z7>áøHx¤Ñ¥tË‘ÂÀ7œ–¶ˆ¸§ï'Þ1ª#æٓhÚ¹‘{”³ËÜÓªÀ<¤sý¨ÚÖ~söJ“¢wjÐ(îç7òºÌXWc[Ü8–º%vò¿‡auݜ¾ä„eŸøפŒm؅ŽÀYNZÀSf±. ¹Ff„C¯rnaŒÛq³ÞO¯Ç§üLk­M:}ã¾WxÏ\€=Q]|”—Ÿ?.8õÎdÏ´+¬õh”ò–æÞ7AÊå}.ì4>uÎ%`˜s×÷†¬bãdaÙ2ݎšöýøÄz8'ÿÐéC0BïÞ³
Ǟù‡÷Ø&'¿åÕ\±šaVZ5„tôo͌œñض7UݛÀ¶¿L3âáÑ)O û‰Ä¿¼Áäêßz¤Ø‘ñ®u7rš!ó1q)ç@.KK¼Ö%˜œ¢Í±]U+ó¬mÎ\¡â>œ§LïÁ…!vçˆZßîdS'ãi?et¦2¶ª»u• J‘ñõuP}wáùÕÐ;šRåÚQd:ò_a‹J~ùš{è^äëH(‰±‘è÷`”4îZ£A„½/½¤½Rþ™<AV&ùñ®Œ›1úV^ÈU]“#{º÷C¶:Å¿åñˆ½¦®¤L„AâDìöŽ'ªq5&¡]l
+b`Ÿ­RÊβRš[
+7 £+´ž^÷ÞïB΂/#wÂ,^ò¯m§ Q3é
+¢wÄÐ;ågÝÎaÙ¾¯¬öŒ½¾¥á÷M;ÊbºÙÊ$„›é^1s°Nâ>%ŸÍ :°øO@)#÷Ð|\_«Geô,"mPœ›Â?ôb IGÍLÈÌ;)ې»ƒÕ–Ɲ_ùÝ.t ø¸‰ õ"L hc#–=
+9¾“mÌe)®+jÅ,í4GïyÂfØ %°âE1üô3B8Ï
+Äç/³y¿/¼Û$$³ØVX&ÈÉ2äIÅÙÿqüþÃðï-
+¸ß+:æMYx.­Imjv¢ß „»­-§ä•×Q˜‹Ð>ÿØ\M-EäDikEk×fƒˆtú{Jýyý=é •%·¹Š|SÔ1ÌZ…À*ƒªkúͲð5`Ãp?P«_a¤Á´_qš€§n$ߝ;!³å ô9È4t”+#„¢‚[
+ÃúΩêaœ˜ÌßVª`ž\ƒ¡èw2#EªKisÜ.0Ôræ¾ &Cë$5¶ówkÌVâ~Ç[s@}AiÜåk)¯,Q˜{•$>Ñ<âêCÝÉhÃ<F9¨Ðq{Ž^ì&Û¸ÒâdNº—pҚj(ñ``‰f›oô¾wÎJ?œí–P1d29ÏIÈdL1¶•ncü~šŸk›ÕsôNúªˆÎ„(Sø˜¬Ôž^"ü¬ÃåÈx¹ÃóÄÂåëÚJÂ+¾¤o"cÂ%W2d÷\ÉLáoq%÷GPmœ#.ŒÖzœp{˜K^ú,д«µcë-`½¶ÏŒû>º Ïyâ|Z“,ÏQuÍÓÎ{Ã`Úó×&T…¢Úý$}Õ¶Í ¾6Jw… w̲†IÓÍAnC‹J»B
+C<rV¹ ‰åº—Ãâ6Pžð'¸`%’*ÚDˆŸrhá>‚õªn!ç
+È߄ŒAš” (9ÌÊiLZۙj•Ðís^úÁbu¨XÄ&–ìJ¨Ò ì: "ËÁÉϙÛä³¢¼\€<Ìlû!:ÕD¬ÝwQ(0¢FŽ@b„%‡†«äÚ=¹`C<ÿ;D؄Aã=mTß6iJ@61¥£øRfyK¾¿1(Ñl$ºr•;¶ÕÓE¾XhÃõA쯀؟ŸÄ~Ü@úAºñ‚‘/á=_óÁ‚Ä(É ôÌ+Faf}P@ÀN¥‡1rk^oÉÚE®?:ÛBP"ß/ÿ6˗ðÄÖÈFËÊ«dÒB¬yEZÅÜbÊÕÑ¥“SG)‰Æˆ±¿ª)¢
+!KšàÕ©5pZ¾-³Ãk)¹Å‘Ø6ߖnÍ®fcb¬Í·EâŒRá9—¹áÎzØ¿ ë!ïpÃ`%̀–nFI5_Á³zWgÓñ¹´3Ù¨¿dúÀÕ_
+âP@ÂÝd̳ìÖuUm%O
+ÌBCn°)1[ß-\\4­k5@¢ Êɓ³68«È=ó@ý9…Ò–7!ú‡•ƒ‰‘$Ü8ü@@ÑÜxá ŠÇ=Q9<]n†PàEoEޝëªsL¬HÝ}̨~'ŠîT¦÷÷NbÌ\³Ã+‰2ÞÊo:šÙ±* cпîo ½‰B(?šŠ· ?°[¾=.WÍï>ø")é
+ðBÔwø5ïÌ X¨)¡¥Ú-6¼.øè‹ì¸(«í¤²jÓͨŸ26»-…Ø N¡°@5º#úpezv¹*1o¹‡SOž‘µ& ê&®gÄS‹5fâî•Â“’î]=%ž”KŽ_½„ñ°cÙ*µ` »Óü>§5Ž€Ñg,¡ý-Æ2K,9’såŬ±@϶¦1̆R@@|’°éHƓ ÷&·/ƒƒ
+ë}Îb,*öaŸc¤qÈ ë®²JŠô¯Þ|»¾·-d€°Ç¹½‚{J7ÃÜfæÏ`îà,Ï`n|Ïþ¶ŠO7#êy+/ɚȨDNÊG³[óYâI7u«+š»tDìH
+Y÷ŠõC]yª­^÷x
+`‚ÙƒÌ5¶ê8ÕðôUÁ<ֈ’y6`à˜¾uyHKëí7z&û“פì!e)ü<Ãv³˜Bjù™w+õšÝMm7b΢¼ËÈi‘mE¿`ž…)–K»=K»%…Ńa)t#J%ì´\õ8Øië9l,M¤Ð’`kùú‚>ÿ”Œ8%3âx^«'@¥¶Ÿí<œï̀šÆêÊ9H˜ùawÞ}
+ sޟwäv5½Òó_•Î±HM:PQ·àኝ•“îZ
+´L¾@×û˜±&(_ˆcÀE
+JqM¥ú”Qá&=0îÝxS¡ÓÄ-ä¿‚¦9åݬnUÎî åºpÓJ檽x$GcžàáÖ¬@
+U;…CqIæ1½ês̉‹ØL64á^ÂÆßò/]¡*¸ÿ+K~aӅ¾­ë¦è³®–É/žœæÃÓJeã‰g¶ŠŒIrêB)¤ƒº˜ÍÎ ïȖ[2—ϱ(sk"Bò'/M¯qd®
+–‹Oã°¨ÃAª¶À]á?æÑX“c·ŒÏBKà3̅á3\âúhM‚JoUÕu°•üõ›°>x„wÐ$“»­ÉsXÅן‘ñ†ß7€iYWËó)ìNáØ“?Ÿ<VïÙâÕ§åyBýüôß
+ü?OO·îendstream
+endobj
+6 0 obj
+4731
+endobj
+15 0 obj
+<</Length 16 0 R/Filter /FlateDecode>>
+stream
+ hÞ<̏·ÁÅ|ŽpÅS8ž^]3œæ¸ïŽæ¼Þ7¥ÿÀ~g™S‹ï‡oõ&4J“îáF¸ã^Ön{³x6¯P_wÁDïNäS5C¡†NóÄ~\„ˆwgò¯†ñð“i5j
+,*®`í€xqðw„Áç;.Ä; ·~ÀŸÂ³ÐÓXœý…ÏèßýŌÖkÚh‘Tÿæós8ÆE pÙ^»i2ž]Vý6yö‡z+š~lJT/RipL{Ç©T«G}¹°ÇH›'LhõO9íz¶²Sª»z&¯Z_ÜÙGkÌ©9“zA€«òÝÁ,Ë Uei°DÏܸϓ7BaEåR„)ŽöàÂ$îû•ÀñÏÞÕ+26–w‰’“ ’ÕŽBÉéÆàïx×¼×Ð4ZOÌ˳;líø2âã"€£Â¸˜=ïăƒÇÅ'¸kîwvû†­ä‡{m—g¡Þ®{ûú­S#´¸ˆ¦š}-ª ,bMÏ܃ÉL&–š¡?Åubñ{pìÅ¢ÅT¯~G0ó¹C¤§0âg NcÒFsŽáü™J÷Öüž"˚Š
+š‚ö¼ºÛ¬­¿Š`ð,tØU'Gmwög ºmêÀÀåäsbPEjPHoÀæaOØ[ûŸ³j‘¡zVók7U×:22ùûör†ÞCºÜÞ•¨H :YQ–oL‡=Ã
+˜ôę[MÕ[ˆ^dTWv ®ÐFbjkH“ýÜM_ÍÌ°NæMKþ.?ÌÜVç3ÈZ¸8E‡Ñ\Z¥Šyd>¢jîédÁtÁËÏì¹ç¼ V{^6y¿ëK³¦h ¤zZceWc½÷
+@DÀõ¸b?°y¶Û)M£í”ÊØ)Í×裪6›t>‘D?–
+˜Ù¿–,bé—¥x1´ÞµãÈi(ÿ×
+ΙÎ@ &ʆ©ÓØP<5܄a© %à,Ù;½TΑú”ƒg¥uEóҝõø½ÂKßexï?øzæ(6 ] ÂÔµÆÓ[¼íkb€
+ºaÖ®d„(ˆÄŸ¸õÄ fI§5–Tÿ3cEúŸ»mƒcÚÚWŽº>Ò³íêfÄ£¯¨Zx9Éz}…1"fŠl‹±l-EzŠ½Èa­¿4˜ßBŒó¨YbÜk¢^­a=•Z„ ÊZ…§:*C>]`›´ñ“nuï¦k¿Öú¬žWW©”¿6ÑmÚõªå“!Œ5Ä xËùp
+ôÊ<‚4hû¡À´çF‰‹¾å¦2ú¬%H²Øª†à¼É±PõJñk©ÚðÐ+oyOª"÷Uºò'Y AïÊGï1}î±Ã\”lIÁ "ο@¤3|Õ(+:we(©æÞ <•Ž>=s¥®×1ô}xG6׬Ї…~c®Q€“•
+˜RÁÅÀ–åVýd¡ëX듅•çmîîæ
+„òUl{ÄÒ÷•¦c#-:Á×­}’¨JØÃE•áâ1ºpSlœ,"b¹$åÑ©™‚›fýy´j½#4õ‡GZBêGËB, ÝÌ ÈFnX„*¸škI:Ö
+hø™¥R'Öò7µì.¦H¡úU]n*»ÜÿKé€D³¢€Bß3׶ƒªÇ¥¿Ä.àMé/t©¹6MÓ…\.†¾Þ°LÂ$±ú‡
+´E†lL‡k(J µÎ¾D]„¬ygfÕuáaóº¾YϔӇ8cbL-{ÝS|\XȐƒEØ@^¥‡`谜)ÖÛümx·#ã(
+fm¹T%¢ý±æß¹¤Z3•û€Ôîw˜*ñUjn‚$ñ
+™†2¸l >ÄÇTœÀ1‡™hæ¯Ç ~  7´ÙÁ’N"/ô¾ Uä€î¸Í¥ˆçåžW‚Iƒ
+|ƒLYGëºÃýïàμàM Ñ_¼MÍMš¢oC|O²,‰\^uڞì'JYTŒ™ú /‹vÕ-X¼ôõ²Ñ‰Lþtù5G½1î•È›zÀ’ÄÔ²^§›·¨ê»sè˜w{t‘"àéÄZŠ5ªºH¦hƓÌC
+\ÍùÂÇËê2ù;í0†ÌJ«|zÒÇÞCM´Ôi#?s·ñPºôëþ£õ ’éR4Ñ€Š0
+êeò#g3².ºÝ@±í¸fõõרC y-$ù08¡®0¶€†ÞÙPÒ¬׊Y¨,
+6!ípiæ#ō
+pw5R+î´\åÚ±à@4ÄÙ/;¡*”ri
+¤ïÆé·u…‹÷È­úÉ#»IéWגIðàÅ¥{¡•Hh<Ÿ\J
+’Ë¢ ÀVÑäH3Š¶ZØUrªãjæ=\’¥¬Ç¿©ÂsüáCòהóf bTª‰§@‡f>°Çîªy†U厴k{HýpháÑ¢ƒä-£‚Z<ïO–ËSgÌJð3S%B¥nwՇ0Y“-±“ªç“
+ð>Á6 r=;³ÑMì"KQ-å˜åjƒ#ò\ç»}‘B«U÷^«æT™ŒÅ$C( 3í \ڗ˜Kõ†N6Í®_ªG5c®Mx‰/¢ªJ…-šîq–òqbyÏ«=TŠêÔŒ€þ÷wà˜'§ÝwêýJIÚBÔsÉFímLb*E HP|’X”¸XŸËÒ®EÛm‰h à5»GÈ÷vþ1 …ss?+d¾ŒI ` ‡Ól
+nëÛ;>èZq¥@¥AiÈ¥Zj©Çî@+[K‚tGB$7¸Ü
+f³6°:é6)«í0ÞÀM¿
+ ÁD€C˜Žµîš 3ìšÄ”¦ûˆUÔ•\…Œü¤©ÏtÌãüzÆ©F“dcøK«²ÅãiY¨C`œ."¤iCIUa»ÚáGùïiGF˜›_i
+8Mïj×$µw”8ýVì=baÅ%p[Ãô9Îut©I™H³$Cåîð`În﬌@f-M9é.±(ͨÆñ!MEwQ¦ÙQ;³4+x- ‘æe•)ØíM§Ë3…dø“à×J‰…_6ƒí“ÓŽ…RN Hƒ1Ke Ýxó¡¦m³“‘i2Z:
+ɀë>Ȝa–uµd²)ƒÍ;É¡œc‚FŠ6]àâËHî t”@xÖAƼí¢:1U_Œú¹ÆXµM³4û08ð˜E:¸¯ÓC˜¦ü#AÀԈG^Q÷y¾òò/<ÎW…¾_©xOW°d~QÛYè}ó}«ÚÄ؈Ñ©¾Ew¶D·§Õ0+ñï—Ò±ÐC[ȐÒ÷V’ùf2_В-®Ö‡Á°¡ëvÊ^±GQÆ̆/¶ÌIóœÄÆYÒãò0ÿÉdÏÖ8…ç9´M…—¤v;א–-ºÃ²™҉ÿɛÐò”iû$9Í/’`ù _È2àOÑêÞÜ>˜Äí ŒllB¥4Ð9
+š ë×Ô+ÍzTì{R<RPŜ×(óT"±hM¢Ì¯ÖÐ{­!ÎNÀô¡€á:é†gôxÇUSÓ6ðX C\Ðá$XÚà×Ù%/ÒhÛz¾¯Bù&ºÜV~C¡K(+¤„–ÔÓà m 8ΔÖõ¨,¥-Ô2ٛKÓÿªŽ ñzMö–ÛÅR=Ö5v²¿¹âÏ=]$ðÙPB•œ(Ú¼ }Âc­­K$—ˆI‹‹¹©£Í(Ç <©lY¶zƒ(
+Cg†´°ïn©‘#‹ägä™s­]K Å¶gâÖDZè
+ðcĆÆZ¿î°—¬¹‡»½¥qžŒ¯™«cÖÛ,‘øºhj§—
+IEá§5¼ÃÚhteÛT¡bŸbI,[6:CÝõqâ…L_t}嚭e|ͽEÂ@³Â\¾E®C
+Sú/Åë½tÜû¶goø²Þ»îð;jÎà=©pžŸ™´¶jÚàꎾîðÏ÷iìŽa"<v0ú Ô?ÜÀ<úµpþ“P|¸ó†5y~V á‚çék}8Á3§ãŏÉÿgâ§þ0ýF¡áÜÒQ øa‰ð»à»Û/Ÿ¿ÀÓ­Ï#ºƒuÛFºK˜Ó* °8îsi"xÞRBI?Ìä¦1-ôÝ)®E­e¤GéÓ[CmQŸ|®˜‡kä$ Oݽ·xYºBn…à9íì±7­p]äf}Žy‹,›uMûYJî?Át€=&"Þ=Fыóœ©"¡©ç~"öH"s(!«¶\\23]€l{•s·p,ááAɶzÁ¾s¸ªjÎq7ç‡ñ)Ì|$yÊÒÁz"®]$äC~ʩ̵+Š¡%jUÁ|Ùoe岛ó>Z7‡
+×Ú²f;êÇXWö?eã%þ­gãØWæâ:×ێWììpªç×LHÓÏ4¾ RSmD³\ÚVŸú†¯.MiËòRúµ¤ œf³ÖéYÈÅc•C· µCŠsÒõ´¡Æø‚éé|ÌÈQµhã¨e:HX6 × £S&Q;§³±Ú9)ñ|¬”Cžuâˆ{ Yx…<ÛaG£JU‘¾Or¡ãO£D9ak}6Y§’Î`сø:#úkû³K¶‹ë„½BÂ;tŸ`+\~Ŗ¼
+Qÿ¯Õ+wœé$,Dî‹Û×Ò=„,3{éòs­
+Ã]ÃÓqùáŠÛoÚzÀŒ$‰5pôñ¦’sOÈÇ
+wØÔy^xÉw*Åñ
+çk1ÏâúúIr›%¤îØc××Ii2Cµ,…ùÑVs÷:µîG”¶y±§Hi±Ç,í+ôUΚ *ZåšP7E²a’Ël¢'•a =\íh¶è£ö=çeïTáPþ™ÜÙ¬±Ù"èZç»à‡TÓ}º ]Xn`ߙŸÃq-è~ÜW€Æé„]¨~êW™2Žå}³Ýõ%æ×4,døyfœûh_®v#òD)>C/O^Àx`z¶š¤¦²r}–‡a oÝ2]óK\šÚC’,­¾ŽG\é¨Iö©Fög{¶ÀÇ DW;þœá°à™ £m´¢š½í+ÿþ9Áµ;­„§÷؃ØTžèàù:Ä÷Ÿµº}kê0|‹‡e}gê®þ¸WÐc÷’/‡‡¶”wƵ$ž)\„T¥Õèx¿Qu§Ð:%•Ð´n;[~“¸wâ>Ȋ†-…ܦBýÇ_5ÖI9hΪ†¦è†!uƒpÄ»²©©v¶ÖDhVˆI @ԏã½_©Ô¾q{ç¼Ûš$S¹+`­-Þ+Õ¾šeë@43këF]›¦ˆäÇÅ ø\+xЭ³9æø ®m(Ãdžße
+f;Ý.ûÓM\p4қtúüߞÒå[u©†q.ÿ1(Ëý3º×jÀ‚¾½èij¼îǒJÌòèm¦¾IµÚMv¡üÄ|ÒÿM¬!ÿú!]!þ ò“c´†¦¼]ôUO{“”PÈíÕùi¿)dl(§õÄϐÆnmàõÅ<AÃGí¸*ªÚÈ”9øášÂD>ÀþKáS)&â>sŠ}ڗ6çÝ_g‘ª†ccCÆÔiz1÷WT >uî€Òö¤žuÍ7W§ßèÿ݅íüendstream
+endobj
+16 0 obj
+6524
+endobj
+20 0 obj
+<</Length 21 0 R/Filter /FlateDecode>>
+stream
+xœÕ][Ü¶Æ&Ùx½^¸u¼ö"´ã$Žgl,Jԭ郓ÆNÑhâèƒÝ§MQÔ)’þ ¤$’ɏº¬w“¶y¨VCIäá9ß¹Ó?lòL›\ÿg.¾}uüèY³ùî?Çýíͳ/Nj¿;þá¸ÍJý¿þ^ûjóùsõ`»Q¯yþ÷ã<ëºNŠþ7±©ê¬–›²Íê<W?¿:Þìžÿó¸PwŠBlöýǟÿíøÅö]‘µBŠZÐ·e]5bû±¾.ºªj+s¿©óBþëó??y~üµšZQÅFŠ<«ëvóJÿYÙ?ÿ5üYtµû³€?ÿqü—Í÷ç^^)ä¸>Ùâúú‰}½àµ"Ÿ ›z¥þ?õÖ[±Y#‹®Ù¾½ÛËL4­ì¶¸Ë£]™UmӕÛ7íÕîgxèÚ@RÙ5ž4m»-vûBMU
+¼…„¿Ò=nBÛòr6¡ÛՙÚa)búêÍHΜÑá¾GT\Í-*oë몥Žò¡+ä^²Îúy¦KìÛ@ì„Ãòùn_*()Ú.aÃGN£¡y·*hZé’|Áþ3 Oì@‘TѨ¤ÓÉᬳ²²é‚¹ø='Iòónø,4k‚c#Þ uò}ÿ#Fõ¤,мçSƎD»‚›ð#éú*«ö®‚fó¼R¡oC3ÆdH*õ'
+DŽÿ3÷3~ÊÚÖ÷"¾sôó(ȜxÕ*¶i­ß̃=JtxLün±Ÿp_c¡íh¾çŒRñøêÔ·ëRvé -ó‰Ý2eŸÇ·ž8»ÛÚâg‡þQV6ÚÜ#uÁæÙ¬C±3`®l½È6腕ÛD=å+ÌR¯0Q["\hRÎ.Ž¦U¨ð¬t#ºëüqó~¦R
+äŒO‘+äÁs<ï/ˆ \uhèiHÈ6%ÈØzƒ9¡,ŽÒ‚:Hґ ›;¡éR§’‘Ó®V¯X璠ÜÀšIŽ9È<—•«Cht€í§s’b{××xKÊb’
+2YQêgðùu… $m@E!ašOáwˆ‚ef Fº8Cðpâ8[¹6e"lw¢ºG‚ °æ›ƒåY'­šû—÷•Ê® ÙbŠßSµe—h4{I<ÊR,Œùq)Æ)9ls0ðûEA«A)â;?pÁ‚a@Æ ÂP„1hËð„–Bw¢
+Å|ª¥ü! 9㾍 ©¼:´‰CË$x‚Ä°ËœÆcî¹:ñDqÐE·“ÒËkŒ€,3{¹!á8ĸô^n.jŋÜўE¼Ëɯ$5Ãow¢/³‰
+í%ñW
+ŽÜ²Ée„!8&Œ€HTP{B‹öhª_¡úqlȇ«gK[i•
+ ˜(sáJ Œ†N•>ዱ/.ŽD§—‘ˆù¯¬‰i²ºQ¶DêÑ ’’ɍù1κæ2¼kß}“.êÏ=]¥1ŒzyÁ-L?2^èb5+È…ˆûÀeh"eÍ¢^ÌD½r9ýU]ÌC¾8˜Ã>ˆ¦°®9pÜçÏØ׉þf!¹ysuºRÐ,ÎT¹â‘ž.Üü£Xlë¢=ZÔÄŠúzpVkÑ¥Äl.5NƒU«º,¸UÎ(ŠFÜXé\ËùÚCT‰ë͖ øjз¬&J¹;ú
+0[Ä~È#½,?Pwʎê.(¢rƒD
+¥k¢@‰èòÄá:óóå‚hv‘z-¿º/ñ”;‹gØï Õ y°O±ÄÑ5WóT%Muª,íå¥|¢¬È?^*š§ \Gí?N¹‡-ƒPâ4?ó×N©é|ƒù.ŽH-y/r@Lùv6ßo`—w]ÊlðK¡¡V¬’Û3Fö=pÔ¥ ÔÙ¹\íw8}á<,Vڕ2þ“ý™ì؅Õ[uEK6½I&dç•úz½ê¾Õ?D5:ÒØo)^Ó ´ä<¬¸žv}vÒËð} 7±Kñ3\'Â=¢ø»±ÉG´Ä÷;W……ØÖBˆ‚Pƒm3›Âݏ®nâûê#\itÀ¯4eWÌ'LœiFý#– šJm„0œH„aô7Ì1?‰xj✒d­éՖ5I® G¤êUR+ÅBªø¬¡·ðR…³ óãb#.­ìLÃŽ"ՇN›"c6ÕÁŽ „‚O¸œI’Ô­N<ÿìnѐïóñÓzß2qŠO­Š°"îŸ7¼iq7«LyÏäڐ;íd:H²Øïµ;MçÏã•ÿޏéLSþ‰×$m¼$n,)­2^RÑX/ võtŽú¸ ;’fÕiyFö‡Œ¹í•à óbÄÅÑ49ú(þ琂¦f/]Ã‹±füg³þ õ‰ãKendstream
+endobj
+21 0 obj
+4561
+endobj
+29 0 obj
+<</Length 30 0 R/Filter /FlateDecode>>
+stream
+xœÅ]]Ü¶…í:ž]/œ&^góñÐ ’43¶W–D}¶yˆ‹º)Ú¾$Ø6-â>¥hŠ¢ôÿ%%‘<ÏG³ë´y¨¬¡(Š¼ç~œ{Éýa›gE¹ÍÍöâÛW§Ï¾j·ßý÷t¸½ýê‹éâÇïN8í2eþ7ÜÀëo_ms¥춺›«žæYß÷U1üVlë&kª­ê²&ÏõϯNw·öWÿ>-õ²,¶—Ã˯þqúÍîö¾Ìº¢*ÝÂÜ®šº-v4×e_×]mï·M^êÖ¿úÃ鋫Ó/õÐʦ,·U‘gMÓm_™ÖîŸÿÿYöÿg ÿü×é×Ûïþ<UTÓ÷U~ß0°/è¶Èi¿íЭîÒüŸîõ›Ýû"k«²ow›½Êê®íÕúùþ²Èò¦×?Ÿì/Kó¢ZíÞ'¯êÛj÷Æþ²ÊŠ¶«úÝÙ4m_îÌoóûÜ¿„ë³aÞýtzÍöêO§zE>Õ÷õ܎?¨¬oJUé¯Ñ«;N
+<UeyÕ©ñÇov…û¶0bý]÷¥·`ð÷a`S Uš/µs?2·US×õîs÷>lP»»Ç),õ̓TêQ/ӏiñ*jÕîÞ£cú*Lg]·{4üÜÕîӆ‡îù—ùçá&±ƒçÎÃҒRÂÈÊz÷Û}™gUŸ7F$ôM•õîå÷fðü¶®Á Üõcwaªïº³ºE[÷Áxí;Úëø>ì$œy#e[fyWXùyk˜í¢­wÏG)oËv÷©¿¼µ×__`»­éK£ ¨+²ÿf¯Ö…ŸJÛ4XÂOà{ðÛÞÚ_j×Tð\5I‰7H܁RbD7›>_ÿòÇýe“µZÍûõ¥žÚN=ÕÊ<VÖ¹™äK;˗äÝ8ÓFŒš‰02@åää<„‘kòþ8ª®î9°}‡û½Vß¹Ê2ö—mVô¥“Esó‘»zG®¾¸ïí{=]¹*ë\ßøϗ ÊÚÂÚÁâ#¸6nÏ¼‰aVæU°Ô•ªŽT¿êk¤îyrc¸?¢´®³F9”Nr×jãBêG~‘’ü a5áØs¼!êk†NIø³ë2ê¥ËRû;¥
+ “¹%GƒvÏÃÇô’uUÕ7»—ûQ=©ºR»7}“_G—f:&]nºŽ•«¹‹kæMÄ' ¥þ® „è+°Å¹V®vúÒЮԮùî> ąa¾ú_W´M¾ŽÈr­}¥Å´lUØöœÞò;hq®%ÜÿXhƒ_)Ë/Á™¿y5Hk´®±ú?|ƒQ.ÏL¬äÑ
+¼öTë¾ñ¯ç|põŽrC3e]¾Hi¬ñ¹†þÙþReU^v½õŒs¬/õ 
+P˜úþ§üG˜îCƒî]ù³(ÌVNë°¯E%؆ê8õ+/±w0*ҞŠ au Ü
+º £cQf}דp"iãùX ÌCÝ8çwÏc}…æõ@>Ö\·MՒzRÊ îenü‹IéÏ0Þ0x0陪q¾é¤_'usæՒ0©ã‹8è@—c\]ÐXcÀ§U ¨·¸Ãáq2×À+‰Lv#ú>œ"‘Hì瘺P´œ ê¾·cíeÚë_až0†Ð<{ƒ°ZL3Žê¡ÊšÖj‡µD
+ç9ŠýâÑîzþ¹HY«¢›WÚ9‹PoŒž@¯'9«ü礞Êa©{p’Ps³i½°™ðDå¼[©¾†+å9ß^>\R¿}œl*Òþ‹»Ïéí.áŽ$gCà‰ MRÇ,Þx
+ô…= ë37SÚÓ#"r”"ñùÐ'ÒÙ¾ª]¦|ý÷>ðAíJ 1’yuµÇ>àóqJ> &M N®
+RΛÔ4DÜþ!…ÜÒÀ*c|^ÏÌvT©5LAFFõ˜'Â}Ï´`6wœuº…–ivÜAëg!‘ák¢›Q‘ªáV1 LœßÄ=+ø$U9Í»žƒù¼Û‘˱D°îz¶æ5€ZîŠ<e
+;U8—¡9Dâ–pæùp6v͆€»®³eÛ*„ä!Õ3Ē7yØÎ j{JÊJ(een—TÌê1½øÍužWµ°cXJE{¨J;&ÖD`㪰ºhŠ=¸y<– ·nLÀÒqÜי,øò¢uOC¯mÔKyéÂ=Ѩú(w›ª
+B1¦Gõ¸(€ê0Ôb¨öÕԂ¾”ÃY°·Ç 9̯ú2ŒŠi(ÉW‡åe›"YôFH¥ãyrt¦öm.nÚ×ÙÜ“(íÐñ{y™§€ÅÄ¿᬴ä¨îà³.h“œ\Ôä%·”|ÏfÚ'8D3ú^k«U
+ tbÝßw§á¸[ \Ȟ:Ý1I获©«?ó·³>èŽ !Å æ0ãP€éÇY먇ûéE Œª¢¢ÛIZOv¯ÞG•fvÌSL¯ß(ȍ±£0ÝoeUšÂ«$üÐï¸+8Èíå÷{-Yž÷³#×ú¬,
+ä:Þõ~ÇÔòšQ&òÊrڊâÍ©µu.WµË\JÕ¯¢5ægþunÙÄ®bHi‚ôxŠtÌLôY¥z²çlY*¡oæ)t¾#hӀSÊâ¢Ã¢¢Ñ²b8wæëŝ3â€-ñ°JGì4Շž
+ø?›ÍH'U¤$…œþ²Æ{Ý™¥úâM¨Ä‚—ñ˜º¤¼‚cíX*o¹Öùçã±ÒŠNºÃ@ॏEÅðg~Ø9v¯'‹mMèð²¨Ôv´ä6bRelbýO€¼–ýÜÛۈ±šp7lp I¥!;'qž›XuÈ
+œÞÀ÷•sÜQm£%cP¥Í
+žâá
+Ë%ÊÌ_2ÿIÁ“\Ó_ üBü¶„endstream
+endobj
+30 0 obj
+4671
+endobj
+4 0 obj
+<</Type/Page/MediaBox [0 0 595 842]
+/Rotate 0/Parent 3 0 R
+/Resources<</ProcSet[/PDF /Text]
+/ExtGState 12 0 R
+/Font 13 0 R
+>>
+/Contents 5 0 R
+>>
+endobj
+14 0 obj
+<</Type/Page/MediaBox [0 0 595 842]
+/Rotate 0/Parent 3 0 R
+/Resources<</ProcSet[/PDF /Text]
+/ExtGState 17 0 R
+/Font 18 0 R
+>>
+/Contents 15 0 R
+>>
+endobj
+19 0 obj
+<</Type/Page/MediaBox [0 0 595 842]
+/Rotate 0/Parent 3 0 R
+/Resources<</ProcSet[/PDF /ImageC /Text]
+/ExtGState 25 0 R
+/XObject 26 0 R
+/Font 27 0 R
+>>
+/Contents 20 0 R
+>>
+endobj
+28 0 obj
+<</Type/Page/MediaBox [0 0 595 842]
+/Rotate 0/Parent 3 0 R
+/Resources<</ProcSet[/PDF /Text]
+/ExtGState 33 0 R
+/Font 34 0 R
+>>
+/Contents 29 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages /Kids [
+4 0 R
+14 0 R
+19 0 R
+28 0 R
+] /Count 4
+/Rotate 0>>
+endobj
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+/Metadata 44 0 R
+>>
+endobj
+7 0 obj
+<</Type/ExtGState
+/OPM 1>>endobj
+12 0 obj
+<</R7
+7 0 R>>
+endobj
+13 0 obj
+<</R8
+8 0 R/R10
+10 0 R>>
+endobj
+17 0 obj
+<</R7
+7 0 R>>
+endobj
+18 0 obj
+<</R8
+8 0 R/R10
+10 0 R>>
+endobj
+25 0 obj
+<</R7
+7 0 R>>
+endobj
+26 0 obj
+<</R24
+24 0 R>>
+endobj
+24 0 obj
+<</Subtype/Image
+/ColorSpace/DeviceRGB
+/Width 632
+/Height 385
+/BitsPerComponent 8
+/Filter/DCTDecode/Length 37759>>stream
+ÿØÿîAdobedÿÛC
+$, !$4.763.22:ASF:=N>22HbINVX]^]8EfmeZlS[]YÿÛC**Y;2;YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYÿÀx"ÿÄ
+ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚
+%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖ×ØÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ
+ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ
+¿îäQ¶I†sܓ×è;U¬ÜÿÏÄß÷Ù©®_2ÿ¾býšeŒ4÷—m4µV7Ú3úàu9ôíÚ¢M£¦(ÔÞV5@º?òñ7ýöiâ;“ÿ/ßfª[\I-üQ’<©(ÞÀ`–ôì;àž£3ëL uA;oT¤lf<‘üÅ
+W&­'MÙö¹?•sÿ?ßf*çþ~&ÿ¾ÍU’ðXVÚvt[d—/Œ’3ïŸlӟU¸Ž)üÛH’Xd
+7û÷þyAÿMÿÆéF|?å”øßün’ŠZ!Ô«*šnì>ÏfSk”.^Fb@;‡$ç­,ÐÚÎ\±‘L„3æt'î‘ÛµÙßóÎü
+oþ7Iý}ÿ<àÿÀ¦ÿãtÌƽ¥„ˆh„%UŠ©QÐ`qØõä‚Ñ<¿õ¯å¹u2LîA*W«؞(þǾÿžpàSñº?±ï¿çœøßün˜¾¦Hˆ ؑ¬ADŒUû €yÇlô«%-ì ù¥˜òã? ¨ÿ²/¿çœøßün“ûûþyÁÿMÿÆè¸hQ¶±DÔVv†bŒ8TYžLîí† ëÀþ•j+KaòHbHGØ.ӕÀ'Œ:TŸØ×ßóÎü
+oþ7Iý‹}ÿ<àÿÀ£ÿÆèhä‚)%t4­¹Îzœü€§ÈÇqUŽ‰}ýÈ?ð(ÿñºiÐoðCÿGÿÒÅCgˆ¢ä«"|ǀqŸä*'OUUXöì‡`WnqƒœŽ§ëžiçÃקøaÿÀ£ÿÆé§Ãw¾‘àQÿãtÆy:~ÙSkyrä²y­´ç!s…9ç#“ÊÓü£W9pûÌ®_p~wtã¯Jü#W¾‘àQÿãtŸðŒÞÓ/ü
+?ün€–Å°X1a·dmß.qóg=Ï×<Ô0ÚÛ|ò|Óov¼b£q<…'àã zÔÿðŒ^Ó/ü
+?ünøF/?é—þþ7@h1¢ÓÚ%Œ¡±y0Êc8<þ4Žš{îܙ-¿qÞÙmÃ'<ŒcŽØè*OøF/?é—þþ7Iÿ½çý2ÿÀ£ÿÆé…Ä™ì¥YC¨"XÄOóTgÔÔj‚-þ_سsÔÔ¿ð‹^Ó/ü ?ünš|'vzù_øøÝtS’ùz„ݧ­hÂ!séþŸþ7Iÿ…Ϥ_øøÝ!ÜÏûZzÑö´õ­øD.}"ÿÀ“ÿÆèÿ„>çÒ/ü ?ün€¹ž/Ö¥[Äõ«ð‡ÜúEÿ'ÿÒ܎ÑàIÿãtÊâí=hûZzÕ±áK¡Ú/ü ?ünøEn¿»þþ7@\©ö´õ£íiëVÿáºþì_øøÝðŠÝv/ü
+?ün€¹SíiëGÚÓÖ­ÿÂ+uýØ¿ð(ÿñº?áºþì_øøÝr§ÚÓ֏µ§­[ÿ„Rëû±àIÿãtÂ)uýØ¿ð$ÿñºå»OZˆÝ§­i Ýá‹ÿOÿ¦ŸܞÑàIÿãtÌï¶'­/ÛÖ¯ÿÂ!séþŸþ7Gü">‘àIÿãtÊlOZ>؞µ¡ÿ…Ϥ_øøÝðˆ\úEÿ'ÿÐ3þ؞´¿lOZ¿ÿ…Ϥ_øøÝðˆ\úEÿ'ÿÐ(}±=hûbzÕÿøD.}"ÿÀ“ÿÆèÿ„BçÒ/ü ?ün€¹Cí‰ëGÛÖ¯ÿÂ!séþŸþ7Gü">‘àIÿãtÊ?lOZ>؞µ{þ ŸH¿ð$ÿñº?á¹ô‹ÿOÿ 9Š?lOZ>؞µ{þ ŸH¿ð$ÿñº?á¹ô‹ÿOÿ 9Š?lOZ>֞µ{þ ŸH¿ð$ÿñº?á¹ô‹ÿOÿ .QûbzÑöÄõ«ßðˆÜúEÿ'ÿÑÿÏ¤_øøÝr—Û֔^'­\ÿ„FçÒ/ü ?ün—þŸH¿ð$ÿñºåaxž´ñxžµ8ðÐíþŸþ7Nÿ„Vëû±àQÿãtÈâzÓÅâzÔ£Â÷CøaÿÀ“ÿÆéá»þì?øøÝq‚í=ißi‰ö†-òœ©S‚ùìiãÃWcø!ÿÀ£ÿÆéG‡/ðCÿGÿÐ+§ü÷Ÿò‹ÿÓ„Éÿ=çü¢ÿâ)ÃÃ÷ƒø ÿÀ£ÿÆéÃA¼òÎü
+?ün˜h0J½®'ü¢ÿâ)UÑQTO>êºðSÿ°ï?çœøøÝ/ö%ïüòƒÿ›ÿÐ Þ¿óñ?åÿK½çâÊ/þ"Ÿý‹{ÿ< ÿÀ¦ÿãt¿Ø׿óÊü
+nîþ{Gÿ}Qº?ùíýõY4P¶èÿç´÷Õ*”c…‘ú¬ŠPH ƒ‚;о0 b¤ñMÝüöþú¬‹Id—F³idwfߒĒ~cK@Û£ÿžÑÿßTnþ{Gÿ}VM­º?ùíýõFèÿç´÷ÕdÑ@Û£ÿžÑÿßTnþ{Gÿ}VM­º?ùíýõFèÿç´÷ÕdÑ@ã GVÇ]§8§8É }kžÔ%’)^)7ãæRAê+¡“ïš6´¿?Ú_ΨGª[K~ÖKö=~ð6òžwÆӃœqWhÛ?Ú_΍Ÿí/çPÜO­´·6È¢BîØ'
+IâœÎÙs´aIìO8éÓ©öÅI³ý¥üèÙèTþ4Ú(ŒÖ5;ßúøÿÚQQPHi.سÎKŸõqÑY=ÎÚoÝEé¥'Quÿ§¨ÿôzWQsÿ’þιi“”‡þž£ÿÑé]MÏüzKø:Ñlü¹{q
+f×l<™¬ÈÈÅÐÄ KýÎûÕVk{¨—`{ˆb7)TšL³8)ÆÒOnsŸš¶dÕ,âiCÊÊ" Yü¶Úv‚XÆŒ'ƒèióß[ÛÈÑÈíæ(S±Q™ŽíØÀ'î·NÀšÈŠÞúI‘g–ô¹E•ƒÊ nxª‚ää¯~‡ É©3…ó®bTޖøŠI a#’º#æLƒ×ûÙÛ¥™p¢VÉ
+9nÑmšâçm´ ü­+mùx¶~îOcÏLàðsªY[Dî" „n~ã0Pý~îH桸´¼0c—|jÀ¨iY×äg‘ƒ‚rqƒÜšvº5ÌP˹¢Æ7UóùIÞ\#<†w'©Ç¨ÊÜÛµË[¬ñ4è74AÆårG^ãó§Cÿ!Í?þÚè5—k¥<:€•‚´k4“+™ä<¾îuq¼ŒóœtçHä9§ÿÛOý€#¾¸û%…ÅÎÝþLM&Üã8ã?…6´–9'ùRÕFVfl«»è{òz`“Q·{½6îÞ2¡æ…ãRÝ š‚K;ˆà’ I RÅJ`Œ #¢‘‘‘ÊvÈÀP 'Õ,¡´7hŠDØò Ô™[o<ã*ÞÚ´±D·0™%]ñ e×ÔãƒÍcE¡Ü1»óY"[ˆ¦‰žb»Ö%sOú²*s¥Í%ùžEB²ËÏþ‘&”(ÀA…~S†8ëÐãíýÜ֑¼Ën¯(d•Ì›NI
+0rp;àr9ë…Õä/áüÅE{ì—q´Q[Ín€0I&dùóÔá[8ã‡'’ê¿ò—ðþb€4ï¿ãîOÃù
+Ô1Ê¡‡##Øã¸èjKùØÿÛOýÔ:u»ÚiööÎT˜PG¸^öÈã·©ëSXÈÇþÚèF€EfÍ(՟O…PÊ`IP°8PYƒ3sÈ\É'°É^úÝ.|†vߐ¤ìbªO@[äpNy¢€,Õ=aMý#VwkyUFI%NØ5{+/ˑñ&6–‰Ô`ýÒIôõ< š Õì®<¿.GĘÚZ'Qƒ÷I$ ÐÔð2h=4é¡Ô´öef†ÒfŠ ¹ÎN?à Ï÷3üU/‡á–ÃN´·–'"X•·•;•öŒ«ý1€}S‚ë²j¶QA ÒN©È$G`@*JŒŸN]zúû‚ãUAäýžE,î¨b’&V’5$çp8#Àôê§EVkè²Ü6HœáLq;ç¯8PN8ëÐñê*²jÐ<ò)•#Ž9Bù„’)‹ÌÈnƒŒžüö…iQTN¯dª Èñ’ÁI«’A#
+´¯Ì>aU0 ÕÿHd҃o™ÔO:©˜±}¢W
+çšmÝæ•yl‹uڗyÄhò:°“ÒÇ$þð΍¿“öh¾Íåù—åãnÜqŒqŒP ò”iÇý<ýIó?ý|ýŠ»5çéÿ_Qè䮊çþ=%ü?s×Cmÿ_Qè䮑Ô<L‡8bô!3&Š¿öHÿÛÿ¾‡øQöHÿÛÿ¾‡øSBŠ¿öHÿÛÿ¾‡øQöHÿÛÿ¾‡øP
+*ÿÙ#ÿoþúáGÙ#ÿoþúá@(«ÿdý¿ûè…dý¿ûè…P¦Cÿ!Í?þÚè5¥öHÿÛÿ¾‡øSVÊ%º†àoßí£pÁÈÇ<PRѲ«² ¸ÊûŒñYí¦Ë0šK‹„k‡ò¶´qAå±uʖ$üÄ瑑éÖº²Gþßýô?²Gþßýô?€9vðü-Æï$G7šK¬
+&̙Îd9ãæ8ÀÉç%Ƌ%Ô­=ÕÄ3ÊvW·Ì@®ñ÷s’1!=zŒçWQöHÿÛÿ¾‡øQöHÿÛÿ¾‡øP6š0Ž7U••‹hH‚¢²HÒ´[§\¹9§Ùé’A~÷rÜùÒ>òÃËÚ2Â1Ç=—Çגq“Ðý’?öÿï¡þ}’?öÿï¡þÇ&›ynÐÙ@¬Öáàyet\1Œ&JùŽ
+žsÎFÝÇü|Xÿ×Ôε¾Éû÷Ðÿ
+cØBïùŠA ãð 
+÷ññ/ûçùÔu öÑ»³ÙcŸ½ÿÖ¤û$íÿßCü(…ì‘ÿ·ÿ}ð£ì‘ÿ·ÿ}ð 
+Uÿ²Gþßýô?²Gþßýô?€3m?ä/?ýy·þ…O«±ÙEËN7îhŒDÆsé֝öHÿÛÿ¾‡øP
+i}’?öÿï¡þÕ²‰n¡¸÷ûhÜ0r1ÏJŠ¿öHÿÛÿ¾‡øQöHÿÛÿ¾‡øP
+*ÿÙ#ÿoþúáGÙ#ÿoþúá@*¦«ÿ ùæ+kì‘ÿ·ÿ}ð¨®4Øn!hœÈ±œ0Ï_¥6ûþ>äü?ªõ¥, ,…Ø0'Ñ¿úÔϲGþßýô?€(QWþÉû÷Ðÿ
+>Éû÷Ðÿ
+¡E_û$íÿßCü(û$íÿßCü(…ì‘ÿ·ÿ}ð£ì‘ÿ·ÿ}ð 
+Uÿ²Gþßýô?²Gþßýô?€(S,?äcÿm?ô#Z_dý¿ûè…6(¡µŠÝw”‹8%†y9ô  i´ôšîYÙÙY‘
+Œ4l¥ÎààxÆ1ŒƒH¨N›+ÊKÜ'—$±Ï*ˆˆ&Dۍ§w ò/מxè~Éû÷Ðÿ
+>Éû÷Ðÿ
+æâѼ¸bÏϗ´yÙ×ÉrÙëß8ö÷¢-ˆ(üüùq[G|—-ž½óozé>Éû÷Ðÿ
+>Éû÷Ðÿ
+åƉ&mC^f;UXâO+*¼l2sË~ïôä` ºëCK«¹&’U)#†hÚ<‚3 óÏúŸü{۞›ì‘ÿ·ÿ}ð£ì‘ÿ·ÿ}ð vëJ{ˆãFš)–"v-Ô>jí8ê7 °ÆuÁ ä’jºø}¢ZµÃ€ð˜b|ƒ ÁÏ`ô8 õÏWÙ#ÿoþúáGÙ#ÿoþúá@òi²µìWwó#û¸Š©P²0XœæBsžÃŽõnÎßì°´{·fY$Î1÷œ¶? âµ¾Éû÷Ðÿ
+>Éû÷Ðÿ
+Í°ÿý´ÿЍ>®Ãe6±[®ò‘g°Ï'>”ï²Gþßýô?€(QWþÉû÷Ðÿ
+>Éû÷Ðÿ
+¡E_û$íÿßCü(û$íÿßCü(…ì‘ÿ·ÿ}ð£ì‘ÿ·ÿ}ð 
+Uÿ²Gþßýô?²Gþßýô?€1u_ùËø1]$Ÿ|Õ 6ˆZ'2lg 3×éW˜î9Æ(m
+9–âF¸˜]Ë!•eáÁýÙ1†ÚÛB äs´f‹ .l–ÖYÛËóî%b«‚D¢P@ôǛמ9­Š(èJڐ½Ú<Œé,Žm“z…#v/Ê8Á#'$0i‘}§þ<bH³³ïíxŸ=xÿUŽÿ{۝ª(÷ÃÉuy-Ñ6ÒHò umæÆ ¤j~]ÃŸÝ ô$c½l[¶öÑ@œ¬Hpc ÀRQ@t ¸\únô\tTòF¶÷wp¦v­Çs“þª3ýh¤QjñÒÿÓÌ_ú9+ =?èkù0ÄÿÓÌ?ú9+dôü¡¡(¨î'ŽÖÚ[‰›dQ!wl…$ñXrj·VÖ}µ–Úæ)íÞBÅHXe•x'§Ê7¦zü›¸È¦# ¢±oõ‡ƒaòn#í.'v
+¢XÄ{pÀ1Ç!ºNJäjìz”2LªÉæ´²DSrl–ažü¸?í§÷¨íR9/£"<J-;$áxûÞí۞z`·@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ÿڀ¼‹Ü¡dU# à÷¥þÒoúÞÿß þ5Jä³K›ÂÙ´†yÍÂ2p;Ç®ÜŽàž¤]s¬-ê']9x`ó#C ‚Ìʤääòyl š·ý¤ßô½ÿ¾ühþÒoúÞÿß þ4[j°]Ü$p$ΏȲìÂá†åãï €y#nAÝÅ_ 
+ÚMÿ@ûßûáƏí&ÿ }ïýð¿ãWè 
+ÚMÿ@ûßûáƏí&ÿ }ïýð¿ãWè 
+ÚMÿ@ûßûáƏí&ÿ }ïýð¿ãWè 
+ÚMÿ@ûßûáƏí&ÿ }ïýð¿ãWè 
+ÚMÿ@ûßûáƏí&ÿ }ïýð¿ãWè 
+ÚMÿ@ûßûáƏí&ÿ }ïýð¿ãWè 
+ÚMÿ@ûßûáƏí&ÿ }ïýð¿ãWè 
+ÚMÿ@ûßûáƏí&ÿ }ïýð¿ãWè 
+ÚMÿ@ûßûáƏí&ÿ }ïýð¿ãWè 
+ÚMÿ@ûßûáƏí&ÿ }ïýð¿ãWè 
+ÚMÿ@ûßûáƏí&ÿ }ïýð¿ãWè 
+eêcäõóþŽJÔ=?èj„Cwl—–æ KØ©`?ˆ Sê0GpHªGA°WV·…mfKuTW*êêXÎ
+Éühî÷[ò4`ÿu¿#U¿°´ÏùóOÌÿØZgüù§æƀ,àÿu¿#F÷[ò5[û LÿŸ4üÏøÕMBÏDӖÜÜZ ÜN–ñ…’ìp;ð:ŸÃ׊ÔÁþë~FŒî·äk(4ynÖ§:Æò<1Îq²IvåvàFÇä€>SÏ#:ØZgüù§æƀ,àÿu¿#F÷[ò5›k§iWRJƒO(Ðí?uʆÙÁ9 $Ž9'œYþÂÓ?çÍ?3þ4gû­ù0ºß‘ªßØZgüù§æƏì-3þ|Óó?ã@pºß‘£û­ù­ý…¦Ϛ~gühþÂÓ?çÍ?3þ4gû­ù0ºß‘ªßØZgüù§æƏì-3þ|Óó?ã@pºß‘£û­ù­ý…¦Ϛ~gühþÂÓ?çÍ?3þ4gû­ù0ºß‘ªßØZgüù§æƏì-3þ|Óó?ã@pºß‘£û­ù­ý…¦Ϛ~gühþÂÓ?çÍ?3þ4gû­ù0ºß‘ªßØZgüù§æƏì-3þ|Óó?ã@Ë*A ’ÌÂ8À囁ީmißóöŸ­Mý…¦Ϛ~gühþÂÓ?çÍ?3þ4JÞê ½q^ÞU‘E³Gc¹kZ¢‡O´²rÖÐ$l˂G\dT´QEQEQEQEQEQEQEQEŠ«›íCþ¾GþŠŽŠ|#7º—ý|ý†T¹¿’{–‘B­Ì\i’º#Óñþ†¹Yþѓþ¾cÿÑË]QéøÿCBRÖ`’ëE¿·…wË-¼ˆ‹2ÅHš¤ÖOý³,ÒX}¡ÞTxn·ªùA\çxä9ÚS»òØÚ¢˜ŽHh·O  6…ÐD—r¬Š¦éı1”2Ç$9l7ÍÇ$֟Øn`±ÔílãòiB[yLBŒˆ¬êM­½±ÆH>¹­ª(›¸Ò/Fèq NmË U6ë•*tÉÉLòÀG¥2mä]Üý’áŒ$ñY•!E¹’(°êÝ–@qÎ[8Á&ºz(”´ÐI–ÝZÖá->ÐH¦hP`E('d@. d’XpF!ÐîZ-Išß2­»¥Î0Œ%œÇ´g
+UZ=§ àcšêè vÇJžy®¥[‚þl®Óf Ž»jä1°
+¬B¼•A訢€
+(¢€
+(¢€
+(¢€
+(¢€
+(¢€
+(¢€
+(¢€
+(¢€
+²Þ7‘#L¶!,üÙT´r†™—pªË¹ as…8É6cÒní¼»›8#[óytí$‘å·œc AÎÂÆ2TwçÉ«ßñ6þý—å'ÿGüM¿¿eùIÿÅPnŒ`ЮnEìŸÙÖ³$~J^=´[œÞUb!zÉÆzz
+íÕííÚÙå„Ú1E<òܧó4”³Égscpˆ->ßæ¦<…¸UÀô¸`dÚ:ՋWƒRþ؇ϖKàÂ×·1‚2±cî¾Ðq“Ç˸㉨i‘ù~^Ôò“ËM°8ؼ|£åàp8öÅ΍tŒ·Ã2³‰IlÌ cŽW®8Ï¥]Ó-žÒÅ!®àXí_º€±!ÙA
+fjgYvÃLûÙÜí˜ÎŒZ>û†gÓ¸ìN-Ez“Á3Ú«ÌTchR™<÷l
+oûÿøÐßòOúõoý UúʂI¥ÖÕ¦ƒÈ?g`‘[?2úÕ Š( Š( Š( Š( Š( Š( Š( Š( ÄMRçþ»í(¨¦x”ãU¹ÿ®ßûJ*+)n2mÙ×%ôôŸú=+·=?èk„_ùÍÿ_Iÿ£Ò»³Óñþ†´@ʚ­ËÙi7·Q2AÈ¡ºªHÏåQÁ¨ -úB±Ù8S»ƒÑ°?½‘µ@ÏNçh›Qµûvui¿ËûDOìgnàFqß­U½ÑÒê)áWU·˜‰Méæ 3Бó/~¼Ib 5»ÊI%ÒÃzË#)܊ gÖ/QÈ`z
+ÑHΤóÈ$ŒŽ8yàDÔ þÐ{3.ù‹°TX›å
+h’DŠ7’WTff8
+RMAi{æñ2crKFÀ‡kppyéÁô4ûȒ{+ˆ¥‰¦ŽHÙZ58.Áäc=:­aÉ.¡.Ÿx¶Ó]Ëò¶Íqnc——ýè
+´cÇ÷¹99ät­vú‰m—±Ü´ð˜æò– '˜i1çýoSž˜þޒDCHêŠH\±Ç$àĐ)ÕÈ5ñÒô䕯æómâšï{9ed’ã«ó8\3c» Õ½“&Ózu²¼÷LþSL_w›ˆ±³æ °6ùz¤PÚ_[Ixö‹&gMۗiã ç§Ióö5f¸‘o¬ d•ã™.š?ßJ#'ªY‰یð²cií;y©¤EwöûS,×rÛ"NÊ]%‰sû ŏY1¿ž¸ÐEEPEPEPEPEPEPEPEPEP–4Ëwy~¥î¤†4¤bq’Uôò«V¶ðÝÆ^íC
+v²¼®Œ§®
+²¬ióm±Àùz¬ƒw
+ £mq-òH“Ìñ;ïM¥›ìñ8ÿxõPÏìÑÿ?·ßøÔfùý¾ÿÀ†«ÔPìÑÿ?·ßøÔfùý¾ÿÀ†«ÔPìÑÿ?·ßøÔfùý¾ÿÀ†«ÔPìÑÿ?·ßøÔfùý¾ÿÀ†«ÔPìÑÿ?·ßøÔfùý¾ÿÀ†«ÔPìÑÿ?·ßøÔfùý¾ÿÀ†«ÔPìÑÿ?·ßøÔfùý¾ÿÀ†«ÔPìÑÿ?·ßøÔfùý¾ÿÀ†«ÔPxlãHeŽF’á[‰ÜÈ8ÏcÅ'ö}Ÿüú[ߕÿ
+²:?ÓúÌÔôƒ¨]ÛL/ïm–#ûÈà‘e_CƒÇ=Ç8Èô Ž ×!Š8×ìÌNÄ Ÿ™}iÕÿú׫èb¯ÐEPEPEPEPEPEPEPEPâù
+fXk†ÓJ4°i±ß;3ÿ¬gÄtã”>Ã8@‡©ê3ý‹WU‰ {HXä|À¨Ê’¾„Ž0X6+Z7qÞ<öæÚUH”þô>a¹x)íŸÔu!”ÝQ@Q@Q@Q@Q@Q@Q@|·mkæÛiàÇ34¹7#’NOðÕ¯7Rÿ rÿàJÿñ5‘’µ¶l!¼ž·šFŽÒaîV@ mëÀ Üg¸ãŽ$K¦$¿†òâo.òÒ\¹Ux¤d´c
+Ióä®FxÆ4üÝKþËÿ+ÿÄÑæê_ô_ü _þ&©hrÊeÒ¤i¦v¿ÓÚæq$ŒÀÈ<®T„;p¸ôàc£  Ÿ7Rÿ rÿàJÿñ4yº—ý—ÿWÿ‰­j('ÍÔ¿è¿ø¿üMn¥ÿ@åÿÀ•ÿâkZŠÉóu/ú/þ¯ÿG›©Ð9ð%øšÖ¢€2|ÝKþËÿ+ÿÄÑæê_ô_ü _þ&µ¨  Ÿ7Rÿ rÿàJÿñ4yº—ý—ÿWÿ‰­j('ÍÔ¿è¿ø¿üMn¥ÿ@åÿÀ•ÿâkZŠÉóu/ú/þ¯ÿG›©Ð9ð%øšÖ¢€2|ÝKþËÿ+ÿÄÑæê_ô_ü _þ&µ¨  Ÿ7Rÿ rÿàJÿñ4yº—ý—ÿWÿ‰­j('ÍÔ¿è¿ø¿üMn¥ÿ@åÿÀ•ÿâkZŠÉóu/ú/þ¯ÿG›©Ð9ð%øšÖ¢€2|ÝKþËÿ+ÿÄÑæê_ô_ü _þ&µ¨  idՌ.°ØF’0Àfœ0†RòüIéþ;]5§[j_o7–1EÚy9`{VµI/Qô?ÌTtQEQEQEQEQEQEQEQEçÞ*ÿ¥ÇývÿÚQQIâ³ÿ[úíÿ´¢¢²–å!Пø¨§ÿ¯´ÿÑé^€z~?Ðמ@⤸ÿ¯´ÿÑé^†z~?ÐÕÄLl‘¤±¼r¢¼n
+Ç;ƒ ORw ’zž¹Í>êÖ¸ÂL
+Gq¨ÇoªÙXÈ0×i!Fçï&ӎž„œÿ³ï@ƒNµ·¸ó㍼ì.Ò3€ç'ž#N}½Î[•eoG ;p͕eP€ƒœýÕúŒƒœœÔ:üMüà)†Êy!Ÿ û#ÞÛAr1ž€œÕ˜õ‹ Ó}ªŽØ yE ‡Ue`sÐîÀ=È45¥µ–ÿ³Ç³vù‰Àg¢Œœ(àdàsT×@²{­.“ÏH¢ò:²ïŒp¡€8bBz‘·5jîù ±[˜¶Î²X¶·ÊåØ*œóÆXr3ÇcS‹ˆNÜKÞæ5Ù†r£Ümlcé@®´{iá»Hǔ×HÑ»rÛUÏ´…-ԑÔàqZ5KûF’ÈÀÑÏÛ´i,Nn
+ߖ˞Hܬ:dgÐTàhbt•d·M›q\*RP6ÒF WÐb­¤ÑZhºt§ý§Ît‰¤ÂéÙäýî0NqÖ¥ÐÉ®M§Gi¥†ŠEB²\™ÁErËÐýJžÑô{9LOlmP×!„kýÔˆEàp¸AW?µlçîßþÿ'øÖ:êù0Hú]¸[ÈÖ[L0%ƒ<h<ϗä9•3ßÅ×:Zx†èN“XÛÅ=¼žTŠ˜uÎÕa‚@$a‡P9ÏԀMý«cÿ?vÿ÷ù?Əí[ùû·ÿ¿Éþ57ØíçÚûàQö;_ùö‡þøö­üýÛÿßäÿ?µlçîßþÿ'øÔßcµÿŸhïGØíçÚûàP?Ú¶?ó÷oÿ“ühþÕ±ÿŸ»ûüŸãS}Ž×þ}¡ÿ¾cµÿŸhï@ÿjØÿÏÝ¿ýþOñ£ûVÇþ~íÿïòMö;_ùö‡þø}Ž×þ}¡ÿ¾Cý«cÿ?vÿ÷ù?Əí[ùû·ÿ¿Éþ57ØíçÚûàQö;_ùö‡þøö­üýÛÿßäÿ?µlçîßþÿ'øÔßcµÿŸhïGØíçÚûàP?Ú¶?ó÷oÿ“ühþÕ±ÿŸ»ûüŸãS}Ž×þ}¡ÿ¾cµÿŸhï@ÿjØÿÏÝ¿ýþOñ£ûVÇþ~íÿïòMö;_ùö‡þø}Ž×þ}¡ÿ¾Cý«cÿ?vÿ÷ù?Əí[ùû·ÿ¿Éþ57ØíçÚûàQö;_ùö‡þøö­üýÛÿßäÿ?µlçîßþÿ'øÔßcµÿŸhïGØíçÚûàP?Ú¶?ó÷oÿ“ühþÕ±ÿŸ»ûüŸãS}Ž×þ}¡ÿ¾cµÿŸhï@ÿjØÿÏÝ¿ýþOñ£ûVÇþ~íÿïòMö;_ùö‡þø}Ž×þ}¡ÿ¾Cý«cÿ?vÿ÷ù?Əí[ùû·ÿ¿Éþ57ØíçÚûàQö;_ùö‡þø^[ܹXgŠF
+µ’Èad¶µ‘„{£}å·R¥¸R@È
+Š+/û:÷þ‚mÿ€ñÿ…Ù׿ôoüü(RŠËþνÿ ›à<áGöuïýÛÿãÿ
+J+/û:÷þ‚mÿ€ñÿ…Ù׿ôoüü(RŠËþνÿ ›à<áGöuïýÛÿãÿ
+J+/û:÷þ‚mÿ€ñÿ…Ù׿ôoüü(RŠËþνÿ ›à<áGöuïýÛÿãÿ
+J+/û:÷þ‚mÿ€ñÿ…Ù׿ôoüü(ü½GÐÿ1QÔ0[O±ší§xZ®9‚¦ Š( Š( Š( Š( Š( Š( Š( Š( ÄÐyšµÁÿ¦ßûJ**Þ¼?âgsÿ]¿ö”tT2ÑÏÙ¶|ct?éñô¡+ÕOÇúò›ù®¿ëõô¥+ՏOÇú²
+b>§9³¾šÖ[+©PB¿m·]±…g!9|lR_' É\ué( bÆëQ¼š+q©G†Šà¤ðí•XR[b†Ú]¾è€H5+êwrėKýk$«”o ª¹vÞÃ÷€GÈÇˑ÷…tTP?u4÷^‰ÌŠe7‘,r²ä:‹•ä g*¸À9ã~.l!šî{¸ÅÍǗž€AJ¥˜/æc;˜dƒ’T`u­ê(·Õõ‹+Û¡yÛ+C0ªºÌË$Ê2ØVŒà õz}En_^°’ße¸ËKct<`2ûw­Š(’–öêÖÊÞ8n!´ç»3\K*ĦE˜Œdp7ä.3÷ŽnÚêÉx‹y|¶×9ˆ%¢ÅÄêQ 0FgÞgÈ ·‘ò¶z
+(‰FºAÒ`{¦1Mkå•}c–˜dŠÄ±l—< Šèl.ä—X¼î|À™>XŒÎºž¿{!ÆHVŠçlo¾ÄñyÒyv¯-ð?.wIö‘GrÄoŽO<Q£jW73Ø î÷¼Ö‘ÈÑÀÉ( b0É<8ù:®Nô0G™å.Ñ#—` ÆãԁÛ=N;’z“N‘‘¼lX+¤«<úÈúŠÅÓ¬"Ô|+¤Å32¨µ‰¾P§þYã¸>½;ô9ƒ¹MŽ4Š4Ž$TUU
+@:€
+(¢€
+(¢€
+(¢€
+(¢€
+(¢€
+(¢€0­õ+]?HÓD’ÚÃu4n±KrÁU#q$‘‘÷~PrN:XU0´ރå[Í=•±K{9ÖHÙ] ¹òOËۏ üØ­-2ÿÈÓ Ž ;ÙcUáÄKóãÕkûR_úßߑÿÅP4$I,´EGVk XVì“nDÖĉ?¸@G'8û­èk¤ÑdIçÕ.!u’ ®ƒG"« jH#‚2ã¸#µ/ö¤¿ô¾ÿ¿#ÿŠ£ûR_úßߑÿÅP¥—ý©/ýï¿ïÈÿâ¨þԗþ÷ß÷äñT©EeÿjKÿ@ûïûò?øª?µ%ÿ }÷ýùüUjQYڒÿÐ>ûþüþ*íIè}ÿ~Gÿ@”V_ö¤¿ô¾ÿ¿#ÿŠ£ûR_úßߑÿÅP¥—ý©/ýï¿ïÈÿâ¨þԗþ÷ß÷äñT©EeÿjKÿ@ûïûò?øª?µ%ÿ }÷ýùüUjQYڒÿÐ>ûþüþ*íIè}ÿ~Gÿ@”V_ö¤¿ô¾ÿ¿#ÿŠ£ûR_úßߑÿÅP¥—ý©/ýï¿ïÈÿâ¨þԗþ÷ß÷äñT©EeÿjKÿ@ûïûò?øª?µ%ÿ }÷ýùüUjQYڒÿÐ>ûþüþ*íIè}ÿ~Gÿ@”V_ö¤¿ô¾ÿ¿#ÿŠ£ûR_úßߑÿÅP¥—ý©/ýï¿ïÈÿâ¨þԗþ÷ß÷äñT~^£è˜¨ê.ÞåØ5­Ä;W¬¨G¹©¨¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(Œ×üL®ë·þҎŠ]w‹û£ÿM¿ö”tT=ËG;`?â°»ÿ¯Åÿ҄¯T=?èkËì‡üU×GþŸÿJ½@ôü¡ª †ñ§K+†´E’åcc7F|p#¾;Ö\:œ6vw7×Ç܋˜2©cÕPm'6[6$A$o
+À©*ÅO>„r>¢¨dFÑÍçÜÜO4»?|û.Æܘ
+¡xbO ç<äqL
+ÐxŽÖ嶂âvÙ+²Ã±ÊùaIV!‰Þ˜ÚO'œ`â̚Ÿ“d %Ó6Á’T‰•›hb@ÈEÜrGzäT–úrÅsÃÜ\O2#¦ùXr¦x‹ÐÔòNj1£ÛÇl±@ò@ÑÊfŽXÂîF ¯‚0샅v€ ÔµÚ'Ú­¤š3ÇŒ<‰ûåGa#æÏLñQÁ¨Éiowq<—7q+%Ôio!rHeù„cl žäŒž‚øÓaûZʳ–ÈÜÎ$xÇ,2p^1R^Z-ÚGûÉ!’'ß±ãr6
+ä<1ƒ××€3“ĶrFdŠ;‰#H„òHŠ
+¼v·4÷}²&ŠWb»ˆf‘‰™[¶:qV¯,…Ì‘Ê—[OeY"ÚNÖÁ# 䪞™ã¯\€g?ˆ-,¬mžiÚá¥2*– 6ÆÚۄ…@ àÆNHt²5Ë2@&6ëœÏ坡J–}îTqŒ‚3»ŠEŠ¢[k›˜$ˆÊVPÊï‰{).<ã’3Àç®].m4„Ë%đšJH!”+|ß{Fq‘»¹ 
+×z´ñËd>Çw =ÆDž‘Y¤S„T•ûÊ;Œc'äËý¿fo!MÃ`m%Ýuþ-ËÀ
+H$TÑé€K ³ÝÜÜË žb´…Gð2ã
+­´Vð#$0 á@À>Ô=ÝãÑ¿ï“Fñèß÷É QMÞ=þù4oÿ|šuÝãÑ¿ï“Fñèß÷É QMÞ=þù4oÿ|šuÝãÑ¿ï“Fñèß÷É QMÞ=þù4oÿ|šuÝãÑ¿ï“Fñèß÷É QMÞ=þù4oÿ|šuÝãÑ¿ï“Fñèß÷É QMÞ=þù4oÿ|šuÝãÑ¿ï“Fñèß÷É QMÞ=þù4oÿ|šuÝãÑ¿ï“Fñèß÷É QMÞ=þù4oÿ|šd½GÐÿ1QԎsÐqŽâ£ Š( Š( Š( Š( Š( Š( Š( Š( /Ä-‹ë¯úíÿ´ã¢ ñ;íÔ.ë·þҎŠÍîR2ì˜ÂYt?éñô¡+ÓÏOÇúò«ÿŠÆèÓêÿéJWªžŸô5¡$wÇkm-ÄͲ(»¶ ’x¨­.žãx’ÖâÙ×l¡NAî
+Äë,§™0Yœa“
+ò§Êwc#,h§¨m®RédhÃlI=ÇøŠœ6>Œçl¡éRißÙ¸‡Ê"Ä¥ÑÜ iG—´1Ï͌8@
+Ȏv"Q÷™D{2Ûg2ò2āž3ăW¹ºx…¬k w,µÄd²8ä|¨#8Ú0|ôÁÜ¢¨Z2jšk-ìʾcÅ"2eÇ!\í9êW8秮náa³ð%ŠÃmn¿i´bäFÜm$%Æ?ˆíÁ>„ÐgEaÛÃs¢^ÆfVŸíWٟ?»d™¼¼žs†Pzc s¾yÝõ8¢eUÚ@&\ÞGQ! uÁ1‚3Ñ°ã’@:
+¥¼PIñ$`+d`䃑Å>òg·²¸ž(Zy"b^®@ÈQׯJ¥e¨ƒi5Ä÷ÖWp!MhÞ?Á´Éåqƒ“»é °Z[[,k¼1,`ª@»A9 c¦Hý(’ÒÚ[w·–ށÉfbNâHéן­TmnÁsË"ü’; †E@ ÊðÊyÆw g"¦¸Ômm¤h呼Õ
+Û6v;·cOÜcœIâ€,ÇEG*F€*ªŒ £kKg {xZV2€ª¥po”‘ô$S<Ö»³ó,fY¾ëÉ`¤W*r0F2=zb²¯w†bÔg–Ûí@ÓF‹?¹i}ãÓi9î0 Ío,hŒìˆªÎw1ŽÉõàø
+:VŠ3$‹òž 0rÊY¸ÁÎxÇsÀ¤°³HD)in±hÂÀP¬rˌt8äw§Ïimr²,öðʲ®n䞸$‘õªÃX³1³–™X¾SA ”ç8ÂÜz7  z8j¶Fdfß¿n$Ef-‚ ¸A9äî£ Oe ÖbÔ/•m1ù`,©H8 ctÅ<Z[ †¸ð‰Ø†2l‰¨9ëÀ$} ¬Ý/^µ»Ó­fšUY¥Ž"ÁQ¶—rªBžøf
+pNÒpqVeÕ-G–©pªÏ!Aº69Û*Æ÷ñ0\ûç(EÓ­£k_*5Š+RÍQ¨T AÀŒÞß1ã8ź΃\Ó®!ó¢¸ÝÀêÛoòñó\H“Š­m®Å-ÕЖO*(•à‘dp#ÐóÒ` e·.=À6¨¬q¯[µê¢³, †_2I©‹j… ‘(ã’F*욍¬wbÙ¤o3!I±EcÑYñ´‘€NNG¨  tVv‘©¦¢³ùüŸ/÷ªŒ«(hÕÃz}ﻒGëSi×RÝÀÒMnÖì?(9ä_ñÁʀ tQEQEQEQEQE`ÛÉ£>kôV÷†ùZKfp3×O§åW×UÓ!EUUƒýP>#à¯ËòñÁ#ŽÆªé·_aÓ,¬Þ¤– %2KŒ£C/'xç=ºsÆƛwöý2Òóg—öˆR]™ÎÝÊ3ß­f%hÙo
+ý§>~-˜y¹Îw|Ÿ7S×ÔÔ¶ú®™kÃl« +©ª2sÀ ë[P_öí—üôoûõ'ÿGöí—üôoûõ'ÿZ”P_öí—üôoûõ'ÿGöí—üôoûõ'ÿZ”P_öí—üôoûõ'ÿGöí—üôoûõ'ÿZ”P_öí—üôoûõ'ÿGöí—üôoûõ'ÿZ”P_öí—üôoûõ'ÿGöí—üôoûõ'ÿZ”P_öí—üôoûõ'ÿGöí—üôoûõ'ÿZ”P_öí—üôoûõ'ÿGöí—üôoûõ'ÿZ”P_öí—üôoûõ'ÿGöí—üôoûõ'ÿZ”P_öí—üôoûõ'ÿGöí—üôoûõ'ÿZ”P_öí—üôoûõ'ÿGöí—üôoûõ'ÿZ”P_öí—üôoûõ'ÿGöí—üôoûõ'ÿZ”P_öí—üôoûõ'ÿGöí—üôoûõ'ÿZ”P_öí—üôoûõ'ÿGöí—üôoûõ'ÿZ”P5/]–bUr~FÇrMRKÔ}óQEQEQEQEQEQEQEQEy_Žÿä5?ýv?ú**)Þ:\ëÿ×cÿ¢¢¢¤d:xǍ.ÿëõô¥+ÖOÇúò‹όîÇý>/þ”%z¹éøÿCT!²)xÝUÚ6`@uÆWÜdùŠÉ›F{È®~Ý<2Í8‰~X1#rê
+9ù‰Ï##Ž:Ö´’$Q¼’º¤h 31ÀP:’j KØ/7ˆŒ“’Xš6ô;XƒƒÏN¡ 
+OQ
+õ½çü!ºm¼Q\yŸd1Ë©ÏüzÈ6°ÿ{hÁïŽõÕÑ@"ÆcáífÑ#“í3½ÖÕf8båŠm'ŒËӌ“žsPêìڜwRZArʚmÔD=»ÆK¾Í ¶v·Lþ¢ºJ(”¹[¶G_ǧo{L— 8“v"R3äýӎ½·P ԍ­ä¦{÷x,D–À+F@ÓùrI lX’AÁ=:º([Iä½Ú-¦Ý¬E[iÞLXÁíÎ9ª÷·7SÝËzŠZˆàØ6H›Èiwp¿¼\ü •‡ÊH)×¢hÑÙÑYîRFvœ‘éÁ#ñ4êÊ°ßýµqæy›þÃm»ÌÛ»;¦ÎvñŸ§•~ÖÖHÌpU'qËsÜòO^§Ô’O$š‘cDgdEVs¹ˆÜpO¯ÀS¨¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(Þ_ X,hÎÂâ݈Q“:~€
+uÔZG´]Aog¹ŠBrþCGò+ž?w÷‡Íódqü5©kZ[GEöF02A?ʥ޼ߧøP&-®ÏIE¶¸Ý¦[EÈ10Ã,¶ìBä~óˆœü™Î¨ÏA¤yuŸ.DŠæäI˜…¨Š4$«G*Ý@鞄UÍçûÍú…Ï÷›ôÿ
+çûÍú…Ï÷›ôÿ
+çûÍú…Ï÷›ôÿ
+çûÍú…Ï÷›ôÿ
+žŠƒyþó~ŸáFóýæý?€/Qô?ÌTt¥³Ô“ÛšJ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šá|Iÿ!;úíÿ´£¢¢ñD›ukÿM¿ö”TVRܵ±$já ˜ÿÓÒèô®ÒæÝ®T\M?º gó¹0ö̸ëö”ÿÑË]*2æMŠJÅìÖÿ …ïýö¿áGökÐB÷þû_ð«ôqëúؒ‡ökÐB÷þû_ð£û5¿è!{ÿ}¯øUþ=CG¿¡ 
+zþ†€(f·ý/ïµÿ
+?³[þ‚¿÷Úÿ…_ã×ô4qëú¡ýšßô½ÿ¾×ü(þÍoú^ÿßkþ_ÐÔI:=Ì°)%â
+[Ž9Î?•UþÍoú^ÿßkþf·ý/ïµÿ
+¿EPþÍoú^ÿßkþf·ý/ïµÿ
+¿EPþÍoú^ÿßkþf·ý/ïµÿ
+¿EPþÍoú^ÿßkþf·ý/ïµÿ
+¿Gl“Š¡ýšßô½ÿ¾×ü(þÍoú^ÿßkþ_ÐÑǯèh‡ökÐB÷þû_ð£û5¿è!{ÿ}¯øUþ=CG¿¡ 
+zþ†€(f·ý/ïµÿ
+?³[þ‚¿÷Úÿ…_ã×ô4qëú¡ýšßô½ÿ¾×ü(þÍoú^ÿßkþjÞt¹„KvÀ:à‘ý*Z¡ýšßô½ÿ¾×ü(þÍoú^ÿßkþ~Š¡ýšßô½ÿ¾×ü(þÍoú^ÿßkþ~Š¡ýšßô½ÿ¾×ü(þÍoú^ÿßkþ~Š¡ýšßô½ÿ¾×ü(þÍoú^ÿßkþŒrqG¿¡ 
+zþ†€(f·ý/ïµÿ
+?³[þ‚¿÷Úÿ…_ã×ô4qëú¡ýšßô½ÿ¾×ü(þÍoú^ÿßkþ_ÐÑǯèh‡ökÐB÷þû_ð£û5¿è!{ÿ}¯øUçdDff¨É84È%YàŽd,Š×f€*f·ý/ïµÿ
+?³[þ‚¿÷Úÿ…_¢€(f·ý/ïµÿ
+?³[þ‚¿÷Úÿ…_¢€(f·ý/ïµÿ
+?³[þ‚¿÷Úÿ…_¢€(f·ý/ïµÿ
+?³[þ‚¿÷Úÿ…_¢€(f·ý/ïµÿ
+?³[þ‚¿÷Úÿ…_¢€(f·ý/ïµÿ
+?³[þ‚¿÷Úÿ…_¢€(f·ý/ïµÿ
+?³[þ‚¿÷Úÿ…_¢€(f·ý/ïµÿ
+?³[þ‚¿÷Úÿ…_¢€(f·ý/ïµÿ
+?³[þ‚¿÷Úÿ…_¢€(f·ý/ïµÿ
+?³[þ‚¿÷Úÿ…_¢€(f·ý/ïµÿ
+?³[þ‚¿÷Úÿ…_¢€(f·ý/ïµÿ
+?³[þ‚¿÷Úÿ…_¢€(f·ý/ïµÿ
+?³[þ‚¿÷Úÿ…_¢€(f·ý/ïµÿ
+?³[þ‚¿÷Úÿ…_¢€(f·ý/ïµÿ
+?³[þ‚¿÷Úÿ…_¢€(f·ý/ïµÿ
+?³[þ‚¿÷Úÿ…_¢€<ËÅH`Ô¥O1äÄÇæs’w7Œ:´ÿõÛÿiEEe-Ë[£rué‡ý='þJîkƒŒÿÅC0ÿ§¤ÿÑé]åT"–ÂaØýò¢ŽÇè•d…Q@Wz¬ÐÙ#µŽKkøøv˜«ðÎÅÚAùXu#œŽ:ԑêžn¡qe;æ‚UFù¸T(­½¸ãïr=+Z÷N¼‘u+xE»A¨ç|¯!V‹1¬g
+ ØòA㵐¾w™Ì³²G)•ŸÊ|0&I"8íæ³{2¡9‚OÎà—òäk˜¶\´Ë#3»±
+¦Lc'w\¯B£&³g¶ÞHn-ç‚YZ'™%cÄlä’8è¿®jür$±¤‘:¼n+)È`zk&K ›ÛËK‹Ë{$0N²F2$
+wÃ8 cŒ“œ ºm³Ú[<r,ÓÍ'Ëèò3хKwÿsÿ×6þU™ÿ »OúâŸú©.ÿãÎúæßÊ£Ó?äiÿ\SÿAjŠ( Š( Š( 
+í²ÛGpóÇ2Qݶƒ‘‘×ڞn!ˆŒÑù¤pÉ F>„ƳLYJ¿š#i6æf‰˜9V%™]Á¸#ҟ–a†DA-4 |‘ì㜟ál ž½i^]‹tèÛâþ¯þZ–£oöÃËlÞFÝí*0}:ž¾•/Ûmv#ý¦Ž«yƒ ©¸ïY¥ÜÉ¿”#¶„FŒ²0i0Ñ°Î˝‰Æ{âž4™e R/:clHò\ -ËpžÝ‡½+˱N /{úþ¿ËsNKˆb$I4h@É À``œþJߑô¦K{k
+FòÜÃH2ŒÒz^¢© ‰õî®Vßj²-Ilm¤rràçôɧwź]Ã~t—qº`+áròù‚‘ŸŸœ‘ŒuÁÍMj¡NM+ë§ü|£un²Iž!$k¹Ô¸ÊR;iñË»¼¹ö1VÚAÚGP}ë"m"YáÂÎdv™Ï.Ÿuq»¯=:sƌ6ÞUä’(EˆÃj«Æ6–íéó
+iÊú£9šâõ%š2RaÈc…?‰éëL7¶ JMÌ Bq!óÈsŒNj„:KF RB8 7Ë4 Æ:uÊ.{|ώµD±¤Hvf-UÌÎû‚º18<' Ðg·#®iv-S£üƄ·ð¥ä6«$o4µ8܃il‘×°üéë{jñy©s G’7‰$géÏÒ³î4ۉÓìى`ó&7q-ó«ŒmÆ8/ëږ-1ÍÄ3KcdªÄ4Ï1!UÀå½Ü`cäö/+ƒ§G–÷þ¿àþM?6?'ÎóÊÛ»~FÜuÎ})‰uo'•²x›ÍϗµÁߎ¸õÅU{}:KrÃy¥b3ûÝàdr; Žžõl‹!vX†øäVVw›–ØKrà ÏNÃޝå؅
+£k*ã=:·éT³.Úu’GFh×ï´ÎÞcGû¤aÙÛ8Ï|U¸í${讧ŽÝYVN$‚vr@Éžp8 {Ò¼™n(ë{ÿÃ_©5åĐÒI&“`å@ùY³œîúR[Þ+ÈÐÍåÅp®S`|î;C|¹Á<0íUƛ¾ËN·b•m¶ùŠÃ*،¯òA§\é« ò¡ÁÙå‡
+¸Ú\¯ ;w–âJ—Âß}~ÿêÖù–VöÕ iÖæ
+jEëE:T©E ÇJC֊)45u>íU!™Ú‡SYÑõ¢ŠÐD­Mh¢‘HÓÑÿä#ãüQN"‘ÿÙ
+endstream
+endobj
+27 0 obj
+<</R22
+22 0 R/R8
+8 0 R/R10
+10 0 R>>
+endobj
+33 0 obj
+<</R7
+7 0 R>>
+endobj
+34 0 obj
+<</R22
+22 0 R/R8
+8 0 R/R31
+31 0 R/R10
+10 0 R>>
+endobj
+22 0 obj
+<</BaseFont/KPSHBO+Arial/FontDescriptor 23 0 R/Type/Font
+/FirstChar 1/LastChar 1/Widths[ 278]
+/Encoding 39 0 R/Subtype/TrueType>>
+endobj
+39 0 obj
+<</Type/Encoding/BaseEncoding/WinAnsiEncoding/Differences[
+1/space]>>
+endobj
+40 0 obj
+<</Filter/FlateDecode/Length 675>>stream
+¥·Hò̲´HåØ"©Ž,+þ9±œœåC‹¤ªo[$Mê<·Hª•å©ER-,—Iua¹¶H'–½EÒ¤el-’|F™¡eR*%4Y¢Âo³5CqÞ \°>². X7–ÀåR”dP>°„5Ë[5¬Y^?±„5Ë[5/¬YÞI‹„5Ë;қaÍò:½Ö,¯i(X³¼®‰`Íò;ã LÄÝ0X-¼Ù`5y E«É[V–°š¼N Ájò'2XM^瑬&ï¨Î°š¼E­°Zœ/oŽÁjònZ$¬çK®¤ÔµHXMÞªUÁjä>;p.àȉpÌ«Và\À‰'‡‚5sœ Xx áPЙ‡âÀ¹€Æ­sà<€<#ÎœxU8°¨3p. «8иÏ8Fµ*àK™‹cT0‘°2hå^XK\`î® 3E˜\A+O,ƒCáÌ´j(X‹¼Y`-q $à¡ ³Za-ò®$`á
+VEBµÈkÜ:,MÁP<A̦ •ûŒË¥ UCÁÊ`(n,n¢‚V7X
+JŽ<Â:Ê[Ù/’Ò‰põ
+½øõ(˜—» ¢€@>~â
+F&‡‚e¨3¬cx5¬Œž ¾•Ÿ"ŸM¾¿ŸÏí°|Ün}¿ë‘Ö#ÌÇ÷¼÷ïøõråWrø;»h}
+endstream
+endobj
+8 0 obj
+<</BaseFont/IXATKK+TimesNewRoman/FontDescriptor 9 0 R/ToUnicode 40 0 R/Type/Font
+/FirstChar 1/LastChar 89/Widths[ 250 333 500 667 444 389 278 444 500 333 500 278 944 333 278
+722 722 722 278 500 444 500 500 278 500 444 611 564 564 564 250
+500 722 722 889 500 250 500 556 611 500 500 500 444 778 333 333
+722 722 500 500 722 722 408 611 500 667 500 278 333 444 722 444
+722 556 667 500 611 500 500 556 500 333 180 500 333 444 333 564
+500 278 722 500 500 722 500 500 722 713]
+/Encoding 41 0 R/Subtype/TrueType>>
+endobj
+41 0 obj
+<</Type/Encoding/BaseEncoding/WinAnsiEncoding/Differences[
+1/space/hyphen/one/R/e/s/t/a/u/f/d/l/W/r/colon/N
+/G/V/i/o/c/h/n/semicolon/g/z/T/less/plus/greater/comma/b
+/D/O/M/three/period/five/S/E/p/udieresis/k/adieresis/m/parenleft/parenright/U
+/H/y/zero/A/w/quotedbl/Z/v/B/six/slash/I/quotedblbase/X/quotedblleft/K
+/P/C/eight/L/odieresis/two/F/germandbls/quoteright/quotesingle/four/exclam/question/quotesinglbase/equal/seven
+/j/Adieresis/x/numbersign/Udieresis/nine/endash/Oslash/summation]>>
+endobj
+31 0 obj
+<</BaseFont/KPSHBO+Wingdings/FontDescriptor 32 0 R/Type/Font
+/FirstChar 1/LastChar 1/Widths[ 1067]
+/Encoding 42 0 R/Subtype/TrueType>>
+endobj
+42 0 obj
+<</Type/Encoding/BaseEncoding/WinAnsiEncoding/Differences[
+1/barb4right]>>
+endobj
+10 0 obj
+<</BaseFont/RABYKY+TimesNewRoman,Bold/FontDescriptor 11 0 R/Type/Font
+/FirstChar 1/LastChar 51/Widths[ 778 556 444 444 500 556 278 444 278 333 500 250 611 1000 667
+389 444 556 333 556 944 500 722 556 722 778 722 556 333 500 250
+500 778 722 500 500 611 556 722 556 556 667 500 833 500 250 500
+333 722 278 500]
+/Encoding 43 0 R/Subtype/TrueType>>
+endobj
+43 0 obj
+<</Type/Encoding/BaseEncoding/WinAnsiEncoding/Differences[
+1/K/u/r/z/a/n/l/e/i/t/g/space/F/W/T/s
+/c/h/exclam/p/M/o/C/k/N/G/V/d/hyphen/five/comma/eight
+/H/w/two/three/P/S/A/b/udieresis/B/v/m/zero
+47/four/colon/Adieresis/slash/one]>>
+endobj
+23 0 obj
+<</Type/FontDescriptor/FontName/KPSHBO+Arial/FontBBox[0 0 625 625]/Flags 4
+/Ascent 625
+/CapHeight 625
+/Descent 0
+/ItalicAngle 0
+/StemV 93
+/MissingWidth 750
+/FontFile2 35 0 R>>
+endobj
+35 0 obj
+<</Filter/FlateDecode
+/Length1 13976/Length 4570>>stream
+xœí[y|TU–>÷ÞWK6R‰µH½J%¥¤£ L*KìˆXE£T‘€"р»P´"X‚ØŽM+.¸‹+/•HW@›(j+Š0j» ¸ô¨=D?µÝò滯*‘Ì83þ7L½“ïÜsÏ9w;ï¼[ï&bD”F!Ô<sNy×Ä·Áæµ-oíŒÕ'\KĦ¶]²R½ÇþÖ¿Cñ>‘¹å¼Î%Ë_¹<°•Èr
+Uҙt!u²î×oÔoÖ裡O¼¨ÿD)”Gm ýú¦·õ÷© -þ@·ÑavsғäÅ(!xÞIÓVqŽÂô%ú÷˜“.ÅšAûY?÷ ÷vú”å°«D=z¹O×ôçàe§s¨ƒ¶Ò.6‘MãNÓ}†¾Ÿ²0Æeèõ6ŠÐNP”ž¦wYªi@¿_ \*¥3°ž^z•õ‹ÁŸÖÖ b&DiM†eý™þB™‹=ÃW˜RM&¯é
+úŸü×Áoõ
+ý:š…|X‹ÙÿîÂÊúè½:L1Ka£@*s²¹ìJÐj¶‰Ý˶³‡Y/F9È>bŸ³¯Ø×ìN 3ÏçN^rñ‹ù¥ü~?:ÈÿÁ¿Ù¢PxÄD1UÄ
+(nÄú¾Ã«Ä ÖÄæÐ2~j¬7óhåS•½tTy
+k{=_fNe«ù1s*EñÉóyqŠâ/Ó»â0³(÷Ð{J2ËfGùC¢Yð´Rmò“SÜAOˆ‹ØÕô$÷%ÿ`݈<>‹=‚}¡…U°
+? YT)>¦kè|þ6Ås¼þÈ+KèFÏ®¢OéA<ãLšKÌcØK|©æ'°^âÊÃXÝdVĄi4]ËÎ[ÍÇø;´Š(ÉtH<†ÙàOˆʀi6ëÀp5]Gékér“_y-!ÁæQ±r»ÛU¢Bq¢\ƒ]eö´xºwa¨3 ÉA有¼˜‹b+èVì
+2h)žñ³±‹½J½æ¥%¦Q »‘òòàlš¯?H·éKèBýf*Ã~°^¿
+7u¤§žçý'OoÌÓ;ìÉlêTšZVªú\ª¶¿Á¥FÙüY~ț\U;jÈ3 ù&CNƒìt¢êËéhP5T}Zã%a_°Ýu§$×»êۓËJ©;9b
+ùZãÆbÕÁ¦à¡àT×íbfu{ن9óý}6œ6´ø#œñú`] »6ŸJä5´\j¥RVTY¡&†EF¸ÕðÏïÃi#dXCaÔÛ¢Œ uHǨ-Êc:ېŽC§Ät^C'/¹ÇÔ·øÏ㑠”ɏ;œ®ªÏ¢z}¿ãû+l†fÄ¥HMZ€¾ÂݝdÁ6|jσá1]Ç»9ï£qR;Çqð)1ŽŽ\Œ‹xÆ:úĉbl¤Êá
+WO昊ôÚ2¡¢·rƒ«à+€À@¡…¢zø ìö3¸´ªÀ
+`pDZÄXa¨[í‰"ms1Çt‘MÇä/f ÍÀ6ÀløIÍ
+Àùûà6þ–õx:Ò»ü]LíõHåäŠ>Cð”ÇGq\ÈΏ ™YQþZä»qÈ(7î42j·(¤j/
+Œü©@3:3¤7!½I!à&àn@eà6@åû€W€7éÀ 4V~0‚a¢ü@Ä]ç¨ÍÂ!à/8;ø~þ¢Q¾Â_0ʗùóFùÊ”ûø ‘Õ¦ÀNhcCiCY»‰?ÓS”éÐk3øÄÎ^Ô3…ÀfÀÌ÷ðÂÈbG&:ÙMû¬Ï}n”Ò½Vò.sxÝõH@U2÷”Ó!mS·¹¹×½å6T%sßx3$ÉÜ×n„$™ûŠµ$s_p $É܋—A’Ì=!$ÉÜ3[ Eù]*:ÑQ9ó|¦Ö¦óK¥K¥K¥KIÁDß)rn·GJJ±­^ϸGh =ÅB³Yè^jg¡Õ,´–…¦²Ð¹,äa!; °—…v³IEˆy{GT'{sXh =ÎB],äf¡b*b!•Uz£Ü9c¼QøŒ¢§V>t(O¯Æî“Νˆ¨9ïĞ°ü 5/œÔ˜sn, {Jjbõ“§T¬¨Î÷¢á^܆½tPpƒö"ö¢“½è ¼XôÇ0ûßlðtðr X¬Žfc:ÇN+âSÜaL¬<>陲Æ÷‚ä!Þɝޱ6»Íc›.6ÛYz›Y ðJÊÊ–™a͈²´ß¦ýóÛ4JªMâ7òÍ47â¦x¹9òÝXG”ÝqïvԎa¤YÇ&“›£œD]F}"Ù­²œ@vþ(ʊˆ}š¥GÜ¥Ž]l”lµÓñýÇçö(‡ø™}·ã-5ª°ˆã¯Ð<ºÓñ†ýzÇKåQ+4O¹£ Å.Õpí³Or<¾Ïp] Ãֈcµ,v:®¶Osœo7 í1ù]¨yÓ³ÝóÓÑ_ƒ}‘Ãۅ>w:jìç:¦Æ¼&Ê6;§`
+ž˜X‚ÉŽ³ƒº
+ÝEE†O¶J]†OW¶z¼Ï¾bø>Y!ÚgøìË
+;Ë3\æýìRw¹~Øåzc$Á~ö±Ç|Ҏ ù¤ç×^íuë©
+±Ÿ.\P­\%㞮ÿî‚͇ƒvƒü½~“V2§I«Áq·ÅmP.I›2¤KIñá|Sž å©bØQê¦J]RRÜñ¿ÞÿUñ²^>!¾»‡y ØJê
+­ ©…c+h‰ƒvá]J~<t°À.æa]C}ħíñP¬NrÍCX¹*.Åc±2^ÆZ¢I×PH†/,ÏpÄV¢C¹s¿d7áï÷äÌpfƒa—£UÑÿ£×D?ªôÇÎc” %(A JP‚” %(A JP‚” %(A JP‚” ÿS"âñoµ&a|Ç;0Åjÿ/…
+è#ñošå7,âÿûð¿Þ!ãO—¹[»µ»¦OýښèޏO,‘åK½´ûû?-±‘5Õ¤¡qþ ƒ"J
+endstream
+endobj
+9 0 obj
+<</Type/FontDescriptor/FontName/IXATKK+TimesNewRoman/FontBBox[-76 -215 936 833]/Flags 4
+/Ascent 694
+/CapHeight 694
+/Descent -215
+/ItalicAngle 0
+/StemV 140
+/MissingWidth 777
+/FontFile2 36 0 R>>
+endobj
+36 0 obj
+<</Filter/FlateDecode
+/Length1 58792/Length 37071>>stream
+xœ¬¼ |TÕõ8~ï}ï;¼™Éì™å͞L’2I !’HØ&ì ’&a—Å,,
+ڇ‚؃šˆ¬˜C¢÷Ñԅ>FgPÕ¡?`#\§u *Ï|¸mÍ…Q*4ý:†WáY(õɤGáÎ;2'‘E2¿Ê¼­GÑÇ8éG“¡ö 2 0ڂ~‚Œhúeæå ZˆžÂ›ðgH@­h;[ÂöfV¢±èú-®ƒÚt´{Oy­‚³ÇV|2s:óô‹Ñ¸ÒÍh+Ìx$EÌ®yQ]…®FmÐ{#z›ð(F̄3ã3õ)ô%‰’W9Ì#Š¦ t'z ¸ñ.:‹þ…Õ¸?Š÷Ãñ6þ÷Ì­­CA¯î=… £xE¬Ä
+ܲ¢<4úv ½pÿAt
+×á&|¿ÈìåâéªLNƜùK&ƒòQ#ÌpzîqÇa ܁ñ1kY7»–+¾ žp1zBoÃ<þ|ÿúçÃñGòc²%3/³/ó1ÌE<h šæ£v´]~
+R} ½Œþ¿'Jùû
+·‘;—¹xBãaîõ0z\{;Hi¥àxžÒ€½ðcðÕx&^†wà]8…ßÇïH'ù+“dÞ`>bË8.SW² 7Ü׏æ¡å ·ï†ç݇^A¯c3áBx¢wáü¯ÈXRÇãä-òæ6f{»=}&ýyúûL/’ƒ–M>¬CÏþŽ-0‡<¼¯Á†™ï$Ï1:†güL)SÍÌfš˜­Ì½Ìk̯Ù.v?û7…kãöËÛÒ×¥ßÎÔen^`$ƒy…Q*A£A–‚6­„ùuÀх6¡›P/º ôånԇöÃsŸ@¯£ß¢ß£/@ 0çkáî«AënÃwÁñ >€_įà×ññWô >8"¤ŒT‘ d"YFnƒã^rŠ¼K>er™E̦ŽÝÌaæ}±,›áŠá˜Ìm瞒½!È'Ë*Þ¼04œ?Ü4ü‡4J;Òפw¥_Lÿ%37³æD…¨fÚ³|tp/π&F¯¢7Ñ魯~‰ æ@ãmØÚPR«Â“ð8¦ãṕcžG^ˆ—ñwã›ñ-øV|'¾O:€gۋŸÆ‡á8‚Áñ[|‚ÿŠ¿$ Ä„m’0‰‘rxÒ d©'3áXFÚáè ]d=Hè)2HŽ’wd
+™6¦“yù/æ%ææ[–°lŒ­dç²ËØ[ططÙ÷Øï9WË-çvs/ɜ²ÙÙ
+Ù²ƒ²Oeä2yƒ|¡|“üyFkõ xîCèò_Lö^Ãå°7Ó°.lL׃çÇdd6³Š¹‹ùon)>Çxñ¸—¹–Y™yœ™H¾aÚñ\rûWÁ,Ew  ÞOþHΓ¿°f<›|†#ìOðÒÎL 2zî7¬™½…û!ò;TA6ã“äææ–ÌÏP·Ÿæv“·‘—=CLè4¬êr?œôkr-َÙî{t-ðýiîà÷8²ç3ï°»ÑnjŸüŸÃ»Àjü
+]½°²N¢K{î`kÁ2µ‚ýÝÇbÔ ­GÐݲCÜoP=¶"ÄzÓ»AË?B?Ÿóg¸¿UÂüæ£Çؘµ,s'œñHz2ḽ Ú s뼁 –wWf<áµà£¦O|]›¹MÙÍÌܒَZ2e ehVfØßõ™T†z¸&2—‹²%`c_Ç/ƒ?úo»=}ö(ˆmè¯püÌwõ²¿ÛY•¹#ó[d~ø€C Á‹žE«Ñ߀o“™“(‘¾šôg&2à¡N£™§2¬BË3«Àò>öÊ9°=ÝÈÍíÝÝÎ.%q˜o²àPp{Çϙ-V»ªrlEù˜Ñe¥%‰âQñXQaA4?/~Ÿàõ¸]¹N‡Ýfµä˜Œ^¯ÓjÔ*¥B.ãX†`TPëŸØêM†Z“lÈ?yr!mûۀÐv¡5éÒÄ+Ç$½­Ò0ï•#E¹ôßFŠÙ‘⥑˜÷V¢ÊÂo­ß›üUß›Âóg4BýΓ79$Õ§KõR] uA€¼µ¶å5Þ$nõÖ&'®_Þ[ÛZ—ëW«&ø',Q ~•ªj¨%­þŽ~l‡¥
+±ÖVô¤Ð¤’MmÒ3H2ÁÚ¶ÅɆµ5NAh*,H⠋ü “È?>©JCÐé6Iل¤\º÷Zú4h»·¿àdï)-ljû·-hL2mMô†(Ü·&iÝxÖöC.nœÐØsy¯“é­µ]ë¥ÍÞÞo²oFãå½ÅMMp$ Nlí7¾XX7Ë ÷"·55&ñmpC/}úLÙ§[⯥”ÖÞ¤Ò?Þ¿¼wE+ÆћD37‡x4s9j½½³ýB²Êéoj«ÉíÏA½37 ÚE¯ýʞ‚~ސek¿N?RÑh/¯,¹Ô'Õ¤á´V7ó_1‘
+¨CÒ»È 3iôÃ3¡hÉÔ»h ƒ_†³’‹A×&•Z{ù
+ÀÛ¶¦Š0_¨x·§D´ÉîÙ¶-t 1mJ’VÚsòbyíé¾ØséôV?èñsˆææ¤"t韞·˜j—W$±åÿн$Û_7Ë_7c~£·¶·u„·u³¯heûÇ\ê©ál0<ɁSSü z3ç7Rüã‚ýµ×¶N†¥sLš&42NҔ­'#]
+Ê$ý_œ’+@%
+öNLò­“³¸I%ÿ—'¥2çèYRñÃi#ϔ¬ˆ^Ù{EûŠéiz˜0"u³ç÷öª®è›ƪ·w¢ß;±·µ·-•é^è÷òþÞ£L#ÓØÛQÛzQü©Ì±íÎäÄ;šà!–ã
+Pm‚Æ÷ûñÖý"Þ:k~ãQÈ˼[g7L&´Žoê@_ãQ/Øg‰J(•iÃKàó`U …4ÞyTD¨[êe%‚Ô^”ÂH¢).Ò0Z”"Y‘F€Æfi¢D£?j)&Ìn¼\¤…ÕT(µ
+w0Œ‡‰1UL=ÓÂp©ÌÉyE
+¢ˆÆ‹¥Ò¤å¡»£x´¾z,9ÓxÀiyǪÚXr°‡< Ôgú,ªhààŒg©yìé£ô=R­Ñ~rE?~` "Q_=Ln À®}úH£³µƒ= øŒD¯ß'Ñ=€/žÃ€›/™¹ù°üæƒñŸZ:8ô3œÃ<zeÀ€€ƒ,3ŽyÌ<ò,Ȧ@Ԏ2{ÅŽÈhPðÕ<рhñ> ? ám®’p@ÔMÕ~5UûÂTííSµa¨$Z|¯„Q]­}®Z[_­Í«ÖÂÕ¬H@Zb–°Œbü¹„¯–p˜#h¿´ÿ´ÿ´
+Š»
+VA±c H'¸b 2ßSmÀËP€Ð±‹PÐ™L¹ãd¸ò*('eO®( gÕФð„ÿ((Ât–Ïc?jnçðKéB~é¹È/Mډ‚R©ÃziòZä“Jŀÿ&¸Šì¹àYÏוÇ郣aýÀnϟŸ‡ç› Í?á)û=o¥ìð¼UÂÁÞ_û{^ ¤ðÜÏɂ”:N¤>äé&'a,Á‡= –yžõK½{ýÐ ¢ÞSYèyØ?ßó`Úž›
+ž§Ó@«á‰çBwSÁ8Ï´Êýž‰Á†n±n&ª<þ.O9Ç¤ð”ÁýžQJ®±ÿ°'îòKS™3ú)Er¼N,¯•/”ϕϐ•'ä…r¯Ü%ϕç(Œ
+^¡Sh*…B!S°
+×4öc|W´’d+D£³AA)é6'Ía"Œc·Ýé¤å¦ÛîljÂuɓ‹PÝBoò«Yð*ˆÅ9ÿx²¬¯²UÇÊ'ÖüÔ:‚£?ülÑË6WrWݬÆä3®¦d1­d\MuÉI4û=J:I{mÍQÒA‹¦Æ£x#鬝IéxcMÓ¥aÈG:`ª¤6ˆ|tòáAiØ4i¨©¯¶¦ßçËz O¡ƒ@}^’-Ë^+·€k5І7
+H×
+>¹eBÝ÷Úvé^¶ü‡‹m¡›@ïõdÝ讣ÝOÒ{ÕÑ{ÕÑ{=)>)Ý«næx\×Ðد@㛠‰•ÊA¢VÁzhu
+Ù;þ‘¸@Áɍ6Îjd:«Ì —ó:«[k“4rÞ¦õ¨œ2ƒZÎ;UœÉ
+F£ÛíñpœŒöÊy½^£Q«
+Uєú5õ{êOÕ¬†jçRp(©jŠ*F¹šéÖΖ3ºw5_»¤æT5êîÕ3]®j»Ë¬%……c%õŠÜŠB5
+2,ëΙý#zÃæ¡áJ‰õCUC£â¨7cs("¥<m–Ɉ9Çê&dÓýKv>‚‹¿ºq÷Ղcêæt{pÚҟàÞwpÎ\—_óEz×+ïì}ê!˜CÌa®4‡r1Çæ+&s Üܓ0AX©TÁ²Œ¬ÛœU‡+'›M¥«Åh摼´¬ÌXZ."E,ÙñHú­¯oÜ3]°×mâç×-½;}ýoÓ¿Lã낵Ÿã•¯ü6ÙûäCÒ{ô;Ùk؟#5Ú#:b$Æx^%C^Î+‹©ÛQ»ZÖ
+72ə0RA©Fj) ¦dfV«Q+‡¹Ÿ‘n–fÂGp«+ŽËÔtI8¸V¸Ýq/‰âÕS„óR×4f9Ûy¾¬öÙf£zÞ,)¼ôoøls–ÕA¨¤!âXÓ:üe>ŸÖ܉ÿ9ÿ#­Ÿ™ÖR©^—Þ9òkȊf‰á&Òd}ÙÂ(­­öSvF‰‘œeõ
+O¬÷Ó+ÿ<Z;z ds‘(S3¢R¬(UŠU¥-J¼GyPI”·i¨õƒ˄>Û¨xðr/„b¢ä|^’pQL¤×e2gÉ8ÐPͣȽáoˆ1¨–09„À´Á+ªa¥zÄ/gZ™¦9ÃȘãøYò›Âíý§¥Õzž2LՈ¢îû1—67àϹ»¾›Ë=C-ýÔ̧Ìn9âQhSx!­à83-´ZG
+Òãk‘()ê°^O”sJ…†0èþ†O:^4”Æõ[ô;õ}zVo·#|v„¹ÑÊé<¬ÚJIºº`ÊÑ¿†.àE£ÒÒíl6†‹ÅjJǑRÊúüçðTÁT¹ MZÇXTò #8žýÅcß÷tq“`¸Fm$ݛïu{¨À3î‡gtãåâÍr›ºÜj˽ªÄ&²S¤w[,yòJùùÓr™è½†¯¸Æ:߶R±Ö°ÖøˆúQ݃†êº×¹×­¯ÙÞ·¾o;ãý–ýÖj6ckçœf»ÅnuÙäJ«Ú¦v•Ø'Ù·Ywxå6;!V‡]c—i;ád6+õ*&V›‚i(•bŽ¦ª[‰•)&!jxαÎ÷Øډý“ÆÝ9ˆ‰ÆÂwB”(ûS½©ÅÔnÚbbM),Mô}–yEo·—iõöy‰×~ ëL‹E1§…´“-d9AÞ"§É߉‚Ø=Çð]?èóÙʬF7O‡eÅӅ54ÜÜ aXg¿Œ¾ü:²C‰O(ßRÔÜÙ=KM˜$cy9á³CžÛl¿ÓýMºÊžÛü²îe®v5ƒÄ²!+#”"TZ¢’Éýe#.U&'r¡¸¬l4³¿åÂ܆½»¯[¼'´¿õðÞßǧ>ùí8¼pÕ¼‰Ì¥¿âñø§ozr]çÑWßÙ¹lÙO¥ÏáGьh¬ò¹ Ïb<í(ReÎ hʕ4è®Ô”W+kUÕu>ö-%ÎË“'–´–¼Ur¦äk••àjåÿÆ¢gGNJ^/:í?ü°è¯¾Ï‚š)Š¼¾c0áQŠœ<ÇñSrˆáx ¶¤ðžC.1+q¥ð„A^›9Ž—#ˆ÷ȟEuȀì”d’Lj°&…w½°»ì,ì+$…@?Ô"ßϞ"‹*±÷•œ,!aãqGDÓ 1ÙÔà|zI@’t†¨ct‚10=Ñ¡®ª¡æ!4K6¨¬(æ©ô¬Ì'ø…€XԅB*0.1¶p!vë¡&¨Ã ±JY$‹/Ä­‹Z¾r$õÊ¿ ~ÒëBj˜Ê$›r²HÂFœ”µ>¥’í ùýtRÉʗWôßúø¼ñÇ6wwܝþ|Û¢˜`wn°ó—Þïwx¢»®öÖï™|SëÃËÙ©Ûî[Q?ÿÞÝ£ߘ¼i_MØU àªdêÝ«êëƸ"ÕnՏn­_¶åIjý°Z‚tU§üNŒX´Xjµ¢žõ8_ƒÍr0¸˜Qr2ÌjÔZÄj´¬L£…U•+効\¡`X¹L£@-ÖǏ@N¨Æ{D-‡eJ…L¦àX†=Ž§ÀzQॢZ©Ô3xs!L
+åiÁôEYðW´*EȨ ¢‘Î.löü“à˜9zxïðKdÝu{Ó|þ®ôCxi7só…;ÈcÃ-Ô~-}ßÀMCv‹ž`±±É}­{ ·E¶Åu{§K^JJ…9Ìï<aeîznCnéuôæ>ÎìSöùÏøõȏõ¼Áh2[¬Šð¼ e•Á+€Ëe½‚ÙËÈm,Ô=ƒ^¯`:–ÄƘDà)þ"ˆÊŽáqȉ'ê–÷Q=Æÿ=öcÑßê'~X ßæIŸ€zQéù>žðvß1|þLâØÙf0ó|3厤Úgi
+¶§jHRh°úÔÊô(Š¢° ÑFÖЈÚ.ÜEº¼7ã›ÉÍ^XjhÀÎLXÐ(ªW²íÆÅî®ÃÅ57A%ä,Õ`™ì²kDyAwØÙpuzyV>|Û¼[g¬Ù°±½ÈïÇꦯëß½}õó˜å¦=s8¼{kjåáîðèYŹQ^(éßrão+
+l˱ϓOf„ï4›:+™ëóԃFù¡h6>íÑm~yDy•k¹µ²[¹[eìˆâ‚‡ì>Bá«aœ<ükò»te¾/½½3>;á⦅¾{}ÅYÔª¦;[›@ßzAßì(„x£x¬ R»„'‘nOlôu«»5ݎnçÍÁîPoâiÛ^ÇSÁAÍsŽ#¡ãáWT¯¨§µÈ‘
+Ë´Ä¡ [´VGPÔÕá;ð-ÚÛtO#ÝXTëPžiÁׄ$V øZ²,´"¼<q#Þ^_°)±ƒÝÁuË»7n6îÈÙay€Ý¥¸×°Ëø°åÉгág)ö°â3õ_5Ÿé> Vœ'×*è)æjHã³â­R,.ã
+ÏÏKFeèìùl„NÓ¬ ”¼8sû Va
+mkæ÷¿»jsýµ×¯¯/YKÿeâÞ֛Þ8orù
+°A3`%읰¢0ֈ‰Ãïs¿ó½f—³¸ÍŠÊë57h7˜®÷nWÜbR);òÈX¶ aǸƒ,’sÇð"dÃâsáðl`™De,؄ȹ©xtب;ž³Z‘ÖF-ë #oôc
+t½h†dºd§¹ÏLÌÏã øÿÆ(k=ÎK±÷ÈNL_–N›.O­…‘}݂XõxZ2ÉlŽ]T=lŸ­§žé®ô~È­ûa>~´Ht
+WNŠ¹Zô¸Eäùz¥’û2'_¡<B·À¯9íšêƒàè6/eÞÃ0ËV’“$*Üyń™ÿÍÞvŒLþGÿ¾ÉÁô‹Ù¹‹ß}÷?·;0
+£ãì5ì½»ýóÈh[‘MFFŒªšE
+€úÐ)tqH&ã8BxŒOaÇ"îà Â<öb/PÊYà$Z Èn®ew~¿‚'èÙ:nîŒVW~Õ,½(¡[Iô²£¿³fæù™ÒÞàq¶‰Ê³¢Ê†¬2eʙK"D¬BÎQrøÿA„ˆŠP&‰!wI„D1®ÂíÒßⰘc‰×cBÛ;ð̶c¬Ç1 µ@ïEùEdcŸ¾µ¢À$–‡ËÅQݍìþ²ñ"7²¢”d
+ý¿(¦Þ—ÒlÓ÷o2{.´±%äÎtÑ\|7ÞuM:ŸJtAæcf,·ùPúôR¡Bƒ›1ñҒX¼*^o‰oRnWîÕìu<îT†­Žá- 'xX¬×™TôOx9¡oK
+¶˜°)…RM´ƒ`SÌLÑéóԐµ¢P¼ÿ´ ë]ØÕâW[>)ˆ§ðê#!Ñ[/ ljÅÀ™Ÿ}[󉴕ÚÙyé}ÍW•µ7ã춀µQÙ¬·:Áˆ;¬¹
+eÉw–l•Èf©ïçM%Z½.^®ŸªŸÈOq× MúyüœœF÷
+ĝCˆÛãÚ ‹Jb\
+5
+^Ϙ-…B©ÈMáïD¥Î!{u¢!EâƒõnìN‘/DWÔ5èÎéÝSޕ½ÒJ´;À;Ù4¡úá}Öùfú¾ªG—Í#{šu° {¸Í/GmˆÂüÉÿ‰{øÍ/WÊ+។XþðFd”‚\
+6£<rÝ'_àWß­{bò`Po‹ßÃ.øþ­3¸`-
+Z°–†?¢ñ½!öÈjÜ(ŠÆÍb|>šïކ¶º·%t<>à8þÌñ×ð_bš1hcxCâ¡â{Ï$Þs¼~/¢b+Rä/ƒúeeT+r}%´ÿl¶–$D¡Ý]R,ú#€œ®’š@Mp›ã}ünàƒÄÇA9ÀAm1ϘeNGŽÛ°DÌñ¢âÚÀԒy¸Ñ>?¼‹xÄWÌÁó­Ý}
+<ûød‹É§^Ò^’î<Z ·cÄ&µSíº¿ÿ-Ï­ç×çôð˜4¿î|Ýõ¯°Œ9.7#7ãÇV7‰(d'|rS+ø­‚ÝÑé´Ä±X"·²Þˆ³ eÜ(9c*ó‡Ã”‡Æ)~ºÇU•Š~ìõã?ÝÁdü‚UZVi5Z%v[!ÕÐð°eQæ DÙn_ۈ èZ–0äž]ѯ$¡ü°äÊ/.±\‡[oæƒ9!·>w.v˜¹ ž¹Øi²Ï½È~ºå+¦¹3qåÂð²F3/— aà:[ 럘°äҁÐúª¼˜^÷ᖹŸââô¯ÏÍ_-¬aVmñ{Ó/ü&ýñ ï,ÌűÛq‹ê:ƒìsÀñ.«ÄÒe¹×ç>Úv ~<~¦T1×Þ!ëoQlQv˺å;;”Ê€Çé|A3*ø"eˆBÐé<J§BNY)PŠ\ Ä#sÊsy'Á~ˆ?\ ´7Z„
+yúz‚ü\EAj¯Ëùin®K¡< PÈTÑwHÎËëå \ë±AºÖú¢QOa N]å8à…ˆæ´“qÎj(í(í+eJ/‰Š—¤ÂK¢â}Á€$ª€D H¢
+Û¤k jøÎ_.‘ƒ:qæœô»|dÌ'k–ÇÇUGÖ}ÿy<õZÙqÖ¬›ő%þÔ_´6Y”돤«ç‡­ÞظÍéA+/.b:orG‚éß­l0ë©D(ýD
+q~$–Ânqtpq™’Uª’1æè±è«Ñ÷™ßD?c?S}Ï~¯Rvp²- ãn®[¶d¬«”ùD.h4)µ
+8£ÙÏ@ì³7¼îéÜõÏîº;ª=Õ3‰Ö~µ+g͙méëß|pîҁûޘº¡}ŒÉädÀÅÍîWÏþý¥ôÉûBA¼ui•
+•W§ÛÆU\øÙ׃OüüÚy¶<³?’§ÞîQX©µøúlFxd’H™†‚©ÌW‡¨D‚%©ÌÑH«%’î—H"*1ÁÑDÉ&ì“dç“Ö‹/•ùT”ŒOèsTóIº
+bEHX PP 9¦ú*]EŠrUUŤÌòWP~ñ…„pŒº¤“¿ŠÒò÷ѓ£âQ§ØÙ1©oÒ©Ig&±¦I»sŲ¨Ð8µàóyœ¹‚¯Äã,|µç8ÁG<N•à7yœNÁŽ£Pð—zœW ~à€?pŽ»ê*µZEŠ
+ ss
+ôŠB/Ší‚ä…Iu1RjÚ ‹Ë'|6Ó(øì'üJÓ ø0Ô
+’Ì4,úή[-è¬(þoøzQä†c0Ubið
+{Jëî•ê”Cçrï‡&¤˜ºQ÷‚Ž¬Bx ZGnÔ­o(ÝXvBuL«X°‘­-v•‘9d é&ÛĝäAqPûœîXâ؄ßjW¬5ª1£#2ÂoG=Å»Ñܧ{»X¡Fôc8NãQºµù(ˆcÊ*e½òôjÉûè˽RmWÇq)IˆãņÚ'ñãd¯x˜V%Çÿ
+ºÃ
+˜ŸÑ—c4ú`…þTԇ`•R‰‰Ó¡0*Iã,ƒÁËÇy‘gx0gÏ@8P9ÿœ”CEÚXáwçI;ŸU¥böÒ?×?“GòL9ôfAˆûðID®R¤*¥ >š8¨¤ÖiûéÅU ¶Öí¥= @ýé󷬬‡†zF¾á‚¯\±œ~vŽš©yŽ(vc®BåÆz4Õ؂æÛÑ
+ãFãÃøi|2¾¿ÃÆ¿L³„&y`çúw£$³oÐm¬"t{¬9¤;Ÿ¥sËiu`¤pJÅa{9ÄS´úž¨7–-Ær›ì妿7 .‡ËœÊßÊ)'¢á¢Í¿´MJµ
+æÇ?–õ¹½cA„„¥œE³?uAºÞLó³ÿia¥·–‘7´aËïäø‰ÜÐô’áãàŸsœàŸñ?ÿ÷Î_ÕU]:ÓµüþÉ·ÎN4Óëº=àŸÇxÖ2«h­n`㓧t“TªÇºï¯3ì@/ÉGP !â@ÀFÙ”˜ÖãÃÆÛB¯ø_)d¦ž*$6µhi€Qbe0œ„q;i܈o$k<k¼ë}7{q÷ÂýxðHèùÂLÀ,óފïÜ~(°?Až ,<Qø^üB­Y°ƒ# ÝQEñ¥kcª|ÉÍÅfS/øP0âDÔé¿…fØ~‘Á9Ð/‘ççí•6a­tºr^Þ o•3;¥Oh‘ó@nI
+¨ÈW@þ@Ü[œÀèâGç7݄»²ï1$»”>އøûÜ@Ny„Æç9’¡†ê¹C|yœ×ƒiÆY‹ n>,©ÚÿIå4^Çŗ¾A•sËÓ»Ò¥ ¯ÖÍ熦•JJ)øoïýjÇãû±­µ·ýÂU¦\åK¯ì¹¥bÙH0N¯¿R5«ž^·9Jßx{£†Ü‹÷ݼe‰æµÝ™?²Xí1džh7ÞW€õXOÔ Ò³”ÇEëq=Q*Rx¢xªlL™ƒq²-¶{‹£Å)㴜埬`ת×j×êÖë;ÜžŽXG|›âvu¶Gw«¾'ºÝ—àÚ„¶D[êJ¸J\¥ôõW!ëu{=yy…‰qx©bãö¸;î‰ W•\U:Y;9¶z®v?7onÔåÁâLxJe³m³í³MÅ  J”.(›?ZǨÕy&µ3ϯöVŒÍ‹Wt»LÛȈ=ß;y1ÿÕèɊs9W+Æ8Q;qÄoa‚·à‘·g¢¶ô¡Q¹NW»ÇévsQJ‰ý¡œ|Ð1.G£ÑE5ù:6¤”
+º¸N¹,ºkÄ5êšpÑ®iòí#zä³q‰Ç°vzøä0á­iº8×ñØzqç¿23“–Îýa‰JÔãˆäó‚W­È†Z¡‘öªT8ÎQbãO8*BʁFú„\©k[C(ÏÉÅ°ðñD"BIŒ(éÀ@-Ë©lùÆÊx9=ŸŒÏÓIE[µ”l¼¤=†€QèXn‘,«ãÖHÓåï}”þÔg8j‰Çù|¬ùê3¿¦ì×æ‚eD‰ügÉî‚X¡B&ìáA{:á´CèCŠ5™$|ÑO‹*)rrSy*U ˆ  ¨ñŒ••8g¡ÈTXÕæuT$¸ú r|ɏâ¶`€­ñ&ì´òåB?Doæᙓá²bJJ9R¾´¿1•lje*¾R±—éaûŕþõÌfv37$l–6û6×7í`¶³×ˆWù®ò°åzúzæzözáFñéߍþ]õë
+{èOrŸÜY¸³¸¯éö>ñ^ǽÞû|Ÿ÷:õ™Â§‹_ããó}Íÿhà±à#…'Ù'¹§„iß¡âwŠåþ*ž þUﻪpyñª¦}<Ýî¿&´3üá}9{9wOõó«Ã+SýzÈ¿©pa‘d¹-"E³„Ŭ€»ÐH‡›ØŠXw# µ³Ã_ä´h7Ÿ¬_åXˆ\%©"°‡p߅ÿ…²$üF–8žPî
+#Mö€QґDÎì 87XÃÓh™ÝU¾ äÌÌߑšÿþüñØü‡r’sy'x×[nÏñ—)jqMs¤I%Ö^ʐ٠;±bp¢½ý½g¨ËÎ|‘¾â£žD</6D?:ǒ{Ç·6'V•càPºe÷\˜|ûÖ¢'ÅÙ0VËPŸ~bu•ÊÖ8Šf½~ˆÓ‡˜Ž¶T!·’°Gˆ<ÐÚÉ©q GTákFlF9³€àÊMv`ÕøD¸‘¸!bQÃ(dÝ&W
+Š³¢t£›êF€±?-]OÜh¿¹a4ssîþ†û¢ƒ‡•G#6<}8÷há™è3ñgO·©¾¤¼àA©2Óýõ'ú_ÅSݵ èjƒˤò…Â¥¨õÎHk²˜é% šÞ­w»OtÓ/æÀµ¹[ {2û
+•öv¯ãÓ4†±pWUA5C ÁÅ`Œ‚`¼NL“3ä}¾]§ôf¢áÁ²ašüö£û³uÄ:= U!ÈÂ;âkÙrH˜d«¡Ôÿ}oQ ”¾2 ¥èƒðÉ „\øƖm>Ré†ÂR
+€EœØá0÷2GJ@õ€èM×m™{º#àòólñù“9µuõ|¸%¾tt%0æÿü¡Ï_F~d°³xâIί¿¬ÄZ·\Dþ~~Í¡mG‘;<{/¸xþÓI—ÞHÅãÅ·y+ø4Ø;uüDåñÞù֔˥¸ìɞ5;œÏNÐÈ/aä!Õ@ù!-/uøJír»Òcé“ï ÷YŸâQkˆå`°¾”q\K³£Ž;èÛØ Ç£Ä£ÂCÖçˆiðœ0muʊ…a-ÅØ- r¿7ð‚r&^á@ÀQ\ÞÂ0Z8AŒÚíŠHcQü¶Y–hŠ¡_ÁQu¬uP{³®ånNS7E>8ŒíŸPނâþø<ȎœëRÞ¨•Õ1ÓëMWƒ9²HAË Ñê¡HÈ­‹¬KÂôÙ¿<aúàی ÀY*R‘Sa»ÿÌ2;±¯1Þ;@]1¿æš´¸Ëê÷˜Ñ¯3ó÷ÅéW
+C7ƒuI¬:;Kí£'š‰%ÔªZæˆ^ÅÑU)8.?›s¢ˆì”h4NH-&\ªä†7Ú~þV¸Z&åBJO Þ·¥Ââ–Íac²ÎÃCò-DˆNg‹%ÉàáI%#D[;üJš>û²B;I½Û ¼xԋ÷ð*ñە¥‰ÂluòÃaµ‚#‡Žæýz9sà æ33¯f2ǔ—£¿±S |¢…T×µUW&ª_㏔šQw»Zî îï*3AÕÝ¡T'ª4XmYÍ,ח7¬î0ªû‚œ`cu¢aèV‰«ÊýmË:V-Ù$^)îáonåõîÛÜd¸º­JŽp-D©+ŸÎ•ž"ŒDH±ùŠ”+öet”(HH‘(7×K´ÔåE®´XYëÝæÝé¥
+ÞÝ^ÒûÑ0„xÇÅ.£‹„·=Š
+^A/ºœ¿BŸaçwO¡!IJÄí˜ @ğA½ãµß;n¦ñù›”ø*s„9Ìþ6L[ˬízâ:êzúj/ý0õuŽíeAçLZ»!g×#´ßM(°p%Maˤ™8û¸…²¼-¹ “$Å:hµNZé ¸9`¥«bÕ­E؝±ž°²VˆýOu•­#ñoõ×ò)P¬š'47<nZqÇ«vOWŠÂ¨‘ÒtJd:ҁOðÍ+J~
+ˎ’Ÿ2](?gx|lnløä«L¦:;;†I÷Iµ†bºàeÁ©{ƒÕ¸ÑÞÞÚqÁȌuD(ix‘UãÔGÅ¢(õ2}QH@¦›1€ìˆd¹D´4×KHÔ
+'‡/.›¥°Ä(W® &a¼
+å‹ œ(`¹öl/RáQ„.R:40Fp$HÃ"<èÆ4ÌM#‚¯Ð‰Z–e¸%Ñ7HYJã}ðÍ1¦ÇTíxÆ$n(L:ƒÈÅ«ÃÃÇ«(Ç8ˆG‰Âٙ'{{K„"dò¥‘­ô­–OÐ…Ç 3Ö(LH¢ànte6X6pë3Ÿeٕ,Ð mB¯°Qø<ýHãƒv¦p*Cê:¡Gž†Ð.B.¸¼K_«_¢_!\£ß¬OSúcìQöÅF1Á9’R·rô¸‚Iww ì ÃÃD:ëÂO-œÙl˜Ä‘t$`¨®÷„ûq7vOºI÷ÛéAÍRùjŸê-3ËòËv×ìã³sã(!ý¡hºqxː<*˜>Ê92éKdh.OpiÈÐp“bã:h´dub!5›nGŽ\ÿÈY‹LŽqÆdÄ*dÄås”ÑdÇK´lG.ª “ßY6Ñ÷Ù×ÿòí›ÖB
+t“(b€$hœœÃ¬!;.Ÿ9njƒ.TbáAÕ£%ñE˜¿hfcÅ+¬Î`)‚aQ9-š½‡þ
+}¦ÐO±ðÖ&&8;á¼Oԅw ÁÝ-lln4d³…Cïgá™ã'>6<œi6«¬@°Ç†Xu›wX!Fœ¯PM@1-PqJ§¾.ë+qaÄ"ÂÄR%<¼®1_ò3¿Ùq‰{›g‹w«Ï°<'Y\«˜}ä'™½Ò'”=Á$¿î=ìx™ü™üså4ù'Ê¡Ž°#Ü(¼»}üóìKò)r:Öz;IñOˆ'}­ü
+üùãÇ͈;¿±ô.ý>×} ª‡ê‘Vj{¨=’å~r»#hÚ©)nŠÿ’ò%û¯0Nmkܖ!œíPˆ»§
+±Óg„£¡©Ðs!2dÅ= 3•ßbcZµ3+(À§ÁEOî‡
+d÷¨ûGØOŸý£aǑ" ÜøÝÓ䳆ã¾*¨6©AŠ¤
+n„zðÄ>dlÇ
+Ä"ª
+„¸Š`0#¼1ôًƒ¼Èʃp‹ìqXÃóڐzˆ[†Ñ@"R*'s BK¹!‚ÏÉyÑ9rÓgÿvÂλØd•«ãì¼cȘ)ãóåÔºÈjU¸Æᚂk’(¡À€2¶c•[‰¤=˜¥‘«P@º Î]E†zSÄB«rìÅfåXÆ9Äc‹tÃÍ%¡doá/&Kð¤è”ö¤€Ù¯€Y®€Ù²P³tᡚíËÛÞ"x8‚‡#x8ïæ¦6°óÇCè Ø9óú.—ko«qmÌ´kýãHè‚waZÇpù;d%/´e¡}ÊÍr\NL´O¶ÓÚgÚO´S ¶´¢!£èœ7²OS²aoÈ¥Cɾ!Rú¢‘t(1Mٌ|´œÌw—Bå '[ |—P¬²ÛAóÆøI€,Œ
+"ö\³”aÃ0ÊÍGv {«™“]ËÇ2y5ŽÄ5#±jˆræÌj 5 ìüx÷šQ¿Ã&ù¥.£Y Â=Ŧ«û\•óK¢N¯ö¹
+;!£ 0°$‹µvt¦q@iðHԏ+¯×,$¦'æ8D H33¨œú&XuŒ¼Eç9Ôß_ëtw›Ckkc6ÈÔõ C¢%=ÒÀ:Ðí½kБ<‹Z1>XIöVŒèÎL|ð"ÄÇøGž2Q(]„¦Ž ¯ýÕãÕ㦳¢†
+8-w£/º;ç#súÆ
+d_×ðÏduMŽäÙËæW€ý–ýjÓàXÎ‹)V‚aôþNBwjàùz<j8Lø4a[@ÃV¨½ÏãC`ç|ìü>$ŒáÑ!a‚I'¼J)óRi·ÿ‡
+dГ®¶•­™ƒü™ÁÌdæk¶¯Ì0:ü0‘¡8r"Cù¸TRïN†R=º%fƒÃÇ7j~=-±îi`3¬
+AH,üey
+-¼Òèj4_³Ñ[¦òÇ߯ µØô‡încáð¤d ùN键cëàôÙ?CÙ6fþ5‚Þ9N¤©y28€Íú3p¾}(l!ã`ÕijÌqÿ! o³ãC¨LP­†»š©MI‰¤Ùä`< ‡ dó#)ÔõÈ& ów³È…ånù;¸Ieºº2<&^zpë榈Ïoÿ@ěwŸƒžýøëÆL×¼~抷O^6[ÙMñMŸ"?ù¹LC ìAKîµQÏÕà'ãÃì_Ã[3ÔÖnæ™a·’A€m¡lð&†Ô12¦ÐšÌ‡AM<Àµ" ò˜ÿçݸòu9!_—òˆ’¢äQ)œF˜W€=L'/žÂ?„Dög ´ ÊöÔV,-´¶ M’L?õ«#¼dÅàMýê ÁSdjBÄ\fffæœC¬Æ§_„T…|5kQˆ&•+á
+©2
+·ëÕÊ
+y\¸Næ
+d£¢ÇõD¡ÒÚÖ¥l)ëu:ªl›ä7”?+–Uö•áoñßþS°xx·†ÃËÉ dF´Ë«O
+Ñ’’º&Ý`£`$|Žè3š1‡¿a:žÏWÚÏÉ5X¬AòÌqȀ~ÝvÕáP´°/¤å¡¨’lH>$ I%mMºË¡Ö¢@ˆîÄô°S¤†²aNH”`v:Iʂ¢x…6‚ðLƒwŒÕ^é¢(0ò5Í+ˆEiB"OIà„ôºDŽJ3ȧãñLy×®€
+ضt~YŸšÿ–˜Ï¯ˆºDÙ¦û\v Xî>3ör*IÎ ©ëd¾ógóÿ~K¤`b1àrxZÀ•ó'†Ú½ ³‹žÈ…ÔS½~{Qš%P’!¥qOÕå+/°|å”ÀÖìs˜fL3€„Äìš/ü·XÐê"”„-ì
+Ÿ>û‹ÃØ;nyU\%¨ŽcÁ/Ž"Ý_Í4/˜ïL™ä²à-Ò’,%9±³¹Å ‚­YîL›f"è¢L¡G2‰î˜B$yÜïü«Øg„hÊS“žÏ)åÁƲ%Ô•Îð´noôÃ3èñŒz&=ÂY)bû@:Ä$£uG9¼$–³JµÓ˜á.åÎÒ¤%0"J“ÒƒÒ)É"t/[Lñ½ÚuNP*3¶Ÿa9åý²I2nÑJ½óÕjÞg {});°[î~¯{c{Ë!”ñ@¯)=c.©ljMÔ¿Õ¸ˆgk›CØë±ãWkß°ºX§÷EôBÑëC#†ŒÞq1ƒ÷Ê4µ­¨ïµ¢¾1"h¯ݽÝx¿n (ÝPºW;ѯ­®·ºÎ_V×O;34´ïjfužÁ‡gÚpŒhÃ¥®ÚPlÎj  ·a%íÚFâïqŝ6;>‡ŸÃŽZÌsèŚÿó[æ9ôFì>ûsCD»êdíû3F‘¿Ô­š—¯D•Þ»~ƒö)lk7ìÜ°{µa#ÓÛägE¶+k1#;
+Œ¶h#ÛИ{`SwlõêðÀà9109@Ê9€BUîÒÀÈæ¡ir äY»½Ó`û,’.Ä´œFzùI³éZcÎH‰¹Uü?€X=þŸXÐØë:{CL’­ñh"&EÀ&7Øâ‹uöq”e‚ê(J©ìÿ…â^ã%تβžstda˜]¤Ñ¿O‚mƒÛÕÜU-ou]ywÿª±ˆÛ*´.™ïrtF<íOn,p5Iº:VÌ7­®ˆ–Hvmky]NkêŸï¬6û°œ›”3C¾³]N4nßvcÿ†Ž[ç¯ß¨»¡‚ïQ¢öAð‰Ñ¼Q^)fæû±Ö¹ÒEp¬ÉfÛæ][Zý±˜¿s¸äsÙº<,õ¿ %k!(YS²"–‡›ÌÄ{NvGIÈ£OÑ`,Ía’T«­…éçÆæµZ.!Ž‹p×ɓ»ÂéFèÚÝMñÁA|¢ >E0­ki,8§ërÚÑpçÝZž¤m:"MÈX¾ kfMÍVT†Žk0ím“cͬ/kF‰
+fu8+Vy¿h¼ˆ~(ˆ€(¦‘íÙ¸¤àÆÖylÿnÂ}|Mæù凹'‡)‡©çÆán<äæАÛ].A¼gñ—A|£8B£N.҈˜ =Òéréjlƒ²iGÙh,se„ÿÅò`y¤<Zž,[r40p~:Pf”O”Ée0fÊTs§C²ixK§C±¾.²õEƒéPÔ4¼5%»‹¡¦žmnÁw‹FeÙ&xÜ1v’8 s£Ü÷#Žæá͟n ÆÃéÁôª›9‘žLHSDZI“¸Ä
+ÓP 4ƒ±8gêt
+
+†–|4Âô%ê4HãÝhOœ•8arF3„Í´:œ ®àÑ÷h?:؏`ÊG;1Ä9%Kp
+»\pGÜGÜ/€ïòǂ?ãõ7XÉ/woríŸä÷É?ó³a£¹Lãàˆ©0xÑõ]i„Á*®~5*.žòÿZŠ48¶ƒô=JOÒh†~MS5¤)¨â,Ä ¸`d˜ÍôH­ë?0xá–'¤Ðª'Âôª‹¶l~EB4\Ãgg \¶ù›„j&hÂI5¿¥¼å_ôr‡¡s•\ZAPÛd<âLÂ.;u"|:pó°çeaÏaUtà§àÆ%ztB³ÀMMg®ÿáH`kêÀ²Í†ý:ò:æfáfÛÍêîë¼×¸á¡Úl|@±Wüpu!Gh:jÉ¬VHܜ ©Õƒ¼µNµæp!‰ýàõ?Úý£›¯Üõƒuå^0õñ|tG/õø—ö>~˙‰‡îúçþõ†îê—n}iþ~ûô'GPìí_çû¨§!¬%‰
+vè8Ü^G¾º¼†é®¾…«S©ŒJÛßÓæT†ŏ|ÜÖ:Ä°Ø>Ƙ
+B'¤°Pr›Å÷}a¹3ʋ°ÞÝv”h>{æ0ÄfÁ$Q„Îxun˜F:t“`ëÕï ?Öt¸WŠ±%  ÙàňèjÐà]ŤŒ`!úçD-ü'ƒ ú£B'‚ÖŠ²JÙªì³ÓwdAg¶Úٟݚ½Ú~uö#ÜMö›²·s±oqå­ÅÎÍ-C¥kJ´Ñ
+•J«(Viw48 p•ŒÉÈÚdˆè!ÕLŠ¢óJ+@WB²èš4¯­¹),L
+äˆ0!<.PÂÛ:‰Mx~]Da«€Â=ÍOKd¤ôbe'r˜±¼ˆ" ¬gÁKÙP¥ü.³Dz¡ÌZ¹x)!%Šñ2Û¬ƒ‚nZøV4‰yýïJ¤c?"A*ÞâZ˜ÎÃa².À´¸ù$,&ÁDÉû5A‡¾DïþµŸ¸xìÎÑÇúZS͞Jÿ¼®µ%.%òÆA‰·}hÝö¥^ll.bTeü•›>pÍí/Ï>°Û%çæߺ¤%„
+š`±F}á¤\Ôã?üá²l²u¹3}ÉüªÕIÈbcn,õ^öà’b³^¶Ÿ=IþÂK]ªÁK²ÃK‹x( °G `ý>.)¡ñdDFžôŒÈ]3®äÙÄrI9B« ¸É®±K¼hdµBà²ÅuñúHŸ*ÕcÃÐS` ›a@‹@rçã/W^6éÝt4Gä$G7ºCjÞB66±æi4µß>h¹ÅBZâlOl]"CqUè
+±’M‰¯sHڒx@ùtÌ"°BJH´Œ¶L´0rË4Ѝ½D~ßú}۱رø¿G_‰ý,ûýFôØ[YQ­f‡³ÎíÊîûÉýԄ Í°8ؗ۟·¢ê>ÅKL@ȾÔðÝ( ÜN5àjiö>þ>áýÞè½1QÍXSÙ¾ìږm-7¦oÌÞaûZôñ–7©7Ršk
+¤Òa]±3lØÕ[&Í4½Á¦,ÚdRæ„&(¯ô=ö]å]û{)zx*¾¨ ÎfC›Sä5%ÞotMú&ý“û>ÊI8ùt Çïo6ÄB´»+û@쁬ex‰6ö”®Uø”V†P!áê7Ã&}ØÛ*Tòp(‹W¾")!µjÓÑ%ú+¸Ñ*13ø4j6*ïà¨dkõªæ¹dþ„
+B­dusʐe¸›\¡+ü+:Á)CµÂß±Â}àêµãõï©ÞÿÌÌ*T@haòCÏÂĕh®
+×=ÏðµúVxÝReØF’Õà}öû´ç\Ϲ§µ75v*öùÀZi­u›´Íúg/Ô]Þ¤—r»¼šhãô?(W±vµT‘$#•ÑE»äzÍõ{åºÜéÿ!"ïLV‡Ì3_’Aš¶Äœƒ0áhÚáŽÇ ÇëÆ1øú¾ºW+á<Œ§GónÕ¹“¦¿~uØÑÌpžŠZ1çtÀ3ßâȑWԎgHmkÁY áيç×ê{啖Td©=èÉonüTÛGrž4ýüü¿­˜ûÆÐÒtêÒËZ¶]F^qïX™¸qFj sÔ§‰8Y¬A•;‰-=\Í!꩚ݶ&顚pÒôœë>¼£OÅ6bµnj]c€Ó8¸CÕ›7ΈºÍ˳6‘EñӇ‘‚À DáÕ Šñ…BCU™}§î@7ëõ¿šY,GmbÍÀrŠD]ôÚbq<«yJpØS!˜ž
+ì»Ð}ØoáÃ"–OÀÚ¯Êq CžÎ˜¶Û„Š|-hµˁ:öT5™Xl…[…Ðf»Á!bA ʃ8k  ’ÈÜ¢'8¤Kb[¸C_^©[|œc-Ò"kCñd”K‚n6Äõèb<ÈMƒå†C âqȒÐýØQÅNj±Pù‚Q0~h€™TÍSÕAǤƒœ€›ʜëÚ;t‰oí~¿œ†*ŠÏá 5kÓùà³èÊ$5ä¨÷d{@öÅîW‚›SðìÕÙº»ÄÌ^©Ã!”ÛØr¤v䅣.“#îpÒ6ÿ»Üõ·.ËÚV‚î¡jæCý•-Ô§ç~2…sV¾5qÁÐ''À}ÝÍ~Ÿ{`b°u5É®i#ãȯat¨N>_¯£Ã>•Ás ÚáªÃ•¤~õ\ݳï¼S-@ŽP8gùhò
+¼Ÿãù†<NtbÓÁر¸­2$ø­ãŽŽÎs<sîß -¼z\Á¹O¯®6{·j”†Ëá–ú€«ìԜ¾(ß Dìºóêšîëà+B‡ŠJYwøú¸U|°Ü»\[åÛÁ}»ÿ¢ï~ÿTãÄ׸‡ø¯h_ñ}Íÿ/ÜaþˆpÄû”ö´ïÿLÃO¼ï
+ {Ú&Eˆ SÂáeÁ"ìâýˆƒ)<Èå~±w¯]çCéë:ÁÃë•Õ_ ƞÞæ2jž’Ê?Õ¥iðÜ¥L4˜Oî…Ú#²£A„US24[¢¾9ï„yïiß,jǽ³D½ð”2‹¨ëÞÿAõ)³¤ÍX]"À oV:,ènk¯7Ÿ‚-QðÔëPJPð¨à¨p:SàZóQ3¤^ÃÆá0 \D͸*sc’i×O^ñpbC dJÎh`þ™ôüQw*lo¦>OèÑâ<CZۃ6^ãqÚZqæw”¥µ ðҍϞ´‚Ø’¥Ž×°% Ùmd™blŸðrt*fdyµZ(˜Uiê%iꦗäž=8†-€U
+.Ã_ÔÀƒxVû‘ö¤z÷Ä
+¦ÁšSKIëi#} =“>‘fÓ#¹©iùý4ßìÜI¨ôŒÕpùàüÚ{ÒE)´Ö§4õ™ñ+HĪ—Ž0û³¦žµPƒE´purÀ-ùWÂBu°Ìbü¸‚
+
+†@¨ßÝ%£û£ ªÅóùJKîét²e>í]eP¶XظƲ±rÜY.Ç%w2Yl‘œ--|ó^^ò´$ãšØ^HxJ*±e9aø&
+ülÓ)íÔ¹×eÄðQ,!²lN’c…_Xñ²N$t´ÚᘇfP@BÂAÕlì¦Èà·VøìpõjEQ䊮YŦ]@TÁm6*b….dû8e8\•VÎUI•4\íœEÈÁ“¹+iÃWW¥­ð—=è×áª.
+û?ÿþÞ"Þ÷&CuCˆ9EOM~a quP®I¾oÚç6$çøÁãéHTtw÷¯lH€Ö¦Xӆ]'ׯ¬Ìæ4‡qǽ=¹ÜüObþĖ™oô]¸¦€ÇÛ¬4\uÕe>W’%oÃø#óÓ75Q±˜Óæñ ;¶ÕîM’±˜Å¼áì™kÚPÜÂü
+I þýxM8…\Z£ÂïJ؅&ÛÆSü.…«3¯È(ì|J'õýÛ² ­fɬÖRz÷ Àžáñ“Ãc'çN£\î¹Z@ÏÀÜÉLmâ»zåqnçFuõQêÿ9ƒ1D2ÿ(ŽeqfQÈ9ÒdۀYƒR_wår‘׎ÛY®!ã)/¯ÍßÕúø…«ÛŠ‘JJõƺ矒#šâi0œ &—Ï7ƒ¿¥S*/Z¡°îØªg>¼çΞlc‹[^:4E>ÎG%E2皢®Ð돕£½ô=e²=JOÓì”X=×Y›Z‰Íò ‹òÓ›C¾„¾H~>!³5¨LÊã¦dÒf‘ú-à ´ŒXHKQbzdp­ ¶É;eR.’QƒDoÎÍ&Zª-ñ®¢t»BȬ3š-–CBH¤m²£h'EєHÒ2l+úzÐ,E«Ä(Ûd )ÈϐK A“K,òSð¶òƒVP´ÖQ+eõ<UÏZå‘òb™ ©¹=_6YȚÓc§Qµ:4·Êéá“ÊI4ßÎF›ú5Ö24¡î¶w×1omîÚZƒI?1žJ¦û¶³' Ryª78ÌÀ
+;²>ÅÜ(¢ø?Ž¸+tʉº?=â¬Ð£*êNQ+´×…ºoqÁ®Œ»_äϜT+¡&Úqá²x­mÔÅ♟’#ó/ Ëá§S EÌÝÖìè÷("Ð棵hsß|üÌËѬ~%qö,Õ ËæŸÈ#£ün°|„(¦H’"GÉ‚Бæ[>LÒ²bdü†<šžLÿ(MM¦AZi^‰²4†Êet>\Ÿ¯½v¾§áù
+j#ڝ¥܏iìîN™4´ÛÉ¢¯è' ¯âÕ½E/ÝÏYÒ!¢¯ÁÞ¢‡ãÁ”½XNC5I'ŠñBh !¤â!–×›P™¤r±ØÙÕÒdEPÍ69}]•ŽcÑ:»ÞŽ<܏U_\£¼;07‡çš9=<‡çŠÅEF°*R©G$˜Æ·ÖR{<ãÒX©1ÞÆWǖŖHzã"O»³Ðε@I‚›„–
+W*P DAQOfäòì@]dx¸¥¼”,ÛKmõ],Êó%ëd™)½µèùZ½.4eSW‹kxøë_ù—ÖÔö~âÈ}›vdbÉ ÍȲ¯+Ùr璘þЎM^³è•mä¯ÿzՕOÝ}u_kcêÅ/cþ½‘ s™˜b÷ŠªÍV^qωÓBe×=wÜ8ñÜ{"H¢Bã–
+!b$ÚúäöVÉØ­•0v3€Ñ [¡Œüë<Ém®.ÒµÞ»~‹iϘ{w¸Æ
+DPƇ‡< XÈG£Ò¶”£¬Ñ˜ÍFŠ§AŠkðX ‹N19ØS¬Áj) ËQé„{Ùd]ðwå”@º¥¥\T*%ð6>׆·çCÓÂé]Š
+·öw®í[E¾2·®uéЇvÜqÝzÕF¿ò•ì#co~qþїÿ±¿gªðՁnŸ:sغ`óüÔož ˜3/J´Wo?uè–HÍ̯°|ÒòIÂEÜntvI’n¤î°Ñ*cÝJmµ~’D®¤IJ¬6Š¶Ú¬’-JRNHL©‡t+dD¢ôc²müéQØè§É{+yÏarûu<ßÅ|ö¨&š¼ç¿øfÏêsðÕæL‡\˜³¡Gьy(k·ÍcYý·×È/Î]FÏûSÊ-ž ÍswQÍ+ÖUúµÔüŠ8µ‡º!>ÿø'®ŸÏ<áW?pG€³¿/ÐvÒá0x” ©¤‰Ï®¤{W‹ú5¤!DaÁy¤¡íï½JGÁ « .-£®¤ÖY>¡6G|
+„özâþpª³‹)£áˆÇnˆGEPˆU2®Ó‰Ê`4²¿ãAøâ¿-Û¶ eCc<Ýñ¸8µ|a\ûda’ÍfçÐ ósÃ5±¬: œF֖EBD-æÔµP# eÆÿëa°bój·Z³jzI_Û²kö[/7DQ³îô’ö ®¾ÃòÁt~{gÔj“—d‹Ë¯Ý°ýŸ‰Ž‹—l6¥3Ó´r|ÎFpñ<u9ø#|
+>b­ä5(©ZÞI±N*oÛÒ!{ž ”ŸT4à› ‘ˆ?KÌ©Wæ†gωœµ[Br££Üz.Æ©Vh³F8weÜ'J6QõÙSKÍË>8ÔI]^XRN”òÌò]¹æ@blýõ0 ÷úþü×ÁŸ‰— '•‡ B†×(”¼Ï¯D<«Œ²°—Í£Ö/AšX î2–|Áÿ…ü£…éÂK…·
+ÌͶë<Ÿ°íñÐ^-$-G¸FÉ{¤Ñˆ‰ÄՐĦj c0ä\87‘£røõ>Yì·éÙvM¸(ºsY+6-~±è¶!-ŸElé$ü¯³£úûCOàý ö
+-ÿÍøG.¯
+Ò{íaFߨ~Ëh•×+2Z]3±šò¼Žg9¦¾¡RçX¿!¶Í1UEue×ä-ÿ­ùGƒæw¼Šêzý7˜±•÷í‡Ù;ÎÀ‡¹Ùg¯.úÚ?¹ë+›íÉRxÞØ·óÉG_n|»ïÇ]§æºê^û@:QÐ
+endstream
+endobj
+32 0 obj
+<</Type/FontDescriptor/FontName/KPSHBO+Wingdings/FontBBox[62 0 983 722]/Flags 4
+/Ascent 722
+/CapHeight 722
+/Descent 0
+/ItalicAngle 0
+/StemV 147
+/MissingWidth 500
+/FontFile2 37 0 R>>
+endobj
+37 0 obj
+<</Filter/FlateDecode
+/Length1 5640/Length 2626>>stream
+ ÓǍµjG;R(–N­5ŽNE:mCzî»IJlëø§3åžýÝß½çœwî=÷ÝûÞ[ À úÖÚÂ9`•ÔiXÝÖ°.Ò&úŽ“dQCû&ýÅÂýûQq@.YÝv׺“_-4'€´ê®ÖŽÕŠ«O››"gÈŸd¼ƒý›šQ‘šfÀ¾û×5¯Û´yl¼M¬¤u}Cdìúâx§×E6·±Û”Yèÿ*õ»#ëšÆüyåj[¿q“èg˜ÜÞ¶¡©íÖ7®_…þÇ0^|ßÊ»ÿÓR„Ò@‚ôAº[¿„z¬G4"ƒÝ°›ö ˜‹0±U˃06Xú¹p?Ö^ø酟ZšEPözô>…\Š¶dbÅØMº-~¶aì/i?=AOXÖÅ·Š{¡ýò êy¼­ð"œ'ÇÑç>؅¶#ð.¿
+×£ë
+ÙIž ýä(ÎïMò>ŽY iÅìÅ,·ÒÇéaú&ý5ýÑOé— ˜­bõl#ÛÇ°·ÙÛR…Ô#í•ÎIçd"›ÖJ¥*éʝJJ·jSתÛԟ©Oª¯Ø `*敇yUÁ
+ã}K”n–J¥åҝ˜ûiiHúï$•™œ-ϓKPšå»å-r—üîèayXI´V%UIS*ە=J¿rFQ3ÔLuJZ¤Öª­j»z@R?ÖږØZlìypfëß8½/ãî~Þ©B9‹»á–Œ^:?{4QmµµÐ~>;µ–ÌÄ;õ¸ÄlNÃ
+0ú¶ýCkfW–ßXš?‘D(„0ßÄl-ÀK?åï}O"øý蒚¢y*ôzÓ¡Š9H[-"½ h¿ ^AÏ zFÐ^A{U
+ª´TP™  RA‹-¤’1AÄs+ò9ÄYÄï¿C¼Žxñ2â%Dâ ¢ñ<bâ)ēˆnÄVDb•ó%ºOÐAÏ Ú'èYAO ò
+O²ú‘Þ#Ïà¼QGÙò@áåaÇ0,þë¢ÙsSÜ)Ùîw'ƒ‘N
+—Aü{q§4ÈÏxžòóKƒ‡TE {l ¥h”1Ñ#éÜQ#Çè`$
+Ýá±k@(STM‘PŽ7<u,NYP4{»\û€ãäö'§4â&88q÷á‡bÁÈ©ô'èô‘ßòǑ —ÛG.>-Æç±ÞÒºŽƒG<cr®Ê÷TÖÀ¿£ðBÇÞé¸k±,„b½Cþ¿‹„ßô¼–øú|Að$ŒÕØǓo­T\?Š-l+Z±ÑzG“ÿ7ð‹6¹û|1:IAÆ'WqWñÝ¡Eñ†o1ñ|û–ÂϞظùÒÑUɋ.j.q(÷õíºÌùµ²?7\®¶¨a7qüLþ YÁ\Ê
+endstream
+endobj
+11 0 obj
+<</Type/FontDescriptor/FontName/RABYKY+TimesNewRoman,Bold/FontBBox[0 -215 991 857]/Flags 4
+/Ascent 677
+/CapHeight 677
+/Descent -215
+/ItalicAngle 0
+/StemV 148
+/MissingWidth 777
+/FontFile2 38 0 R>>
+endobj
+38 0 obj
+<</Filter/FlateDecode
+/Length1 38136/Length 22306>>stream
+xœÄ¼yœSÕ8zι7ûv“ɾÝ$7ÉL’Éd&ÉìÃ̝ÕauVٔ@7PA­`mEÔVÜזQ eêÒjk vµÖ
+ë}#ÿÛÅPñ.BÊð²‘˯Xî[øB*!Ùß/_½qY>°¡9æåK.yoÁk"B߇ʺåPQÆZ¯GHÿ/(—_±þšÒû– DZV¯Y¼°X¾ê93W,¼fĺ“ƒ*}W.¼bi±ýî“…GÖ¬[_,cmY»tdՕÍ󾡲vÙ]ˆ—͐‚›ùr!Tø=è[øs~ZáŒlò+ '˜2øº`1”~!´џѽèB?& êÆUh±ØŽˆàF4sȆdX*€¦£~dAÓбíE5è#܃nÂ!4 =ˆh&²¢vt7ڃ/(|ˆnB?Ç+гÐû),¢r4÷Ž£Ù¨¿pށP3څîÇzÄC‹ …÷`„uh:„~…
+hºO¶FéG¢+ Ð|ôž‡/-¸ÑTt%º݇F/¡“ø6<ÎÊ
+è-Bk±—á
+ææÂS¨Aö¶ê…«…cˆø‡aÔ¿’ÛSø‰èÏ,.,J(C)x®D ýè]lǵL'Ò£4¼k]ö20Ç^t;|Û!|ÞËè Á×Ô£Åh:¯ÁãÄ/{[öiáZd‚ïKÃL·£ÇÐ÷Ñ+è/0ZžË\‘o+ÌD)Q uÛ¶ [Ñwaå^†çUlÀ~<Fþ>~ÿž¹’ùF~M Óè_¸¯À7’6r³,9ySá†/aŒ©è´=‡ÃXėBßÉÕäF²‰ÙϼËV°Ÿ
+˜éjÆK·Åç:|3¾ßÏøÛøaXß·ðÏðÏñqü>þ ¾ ‘8i'Àõ“KÉ< Èbr¹ƒ<ÏOɯÈoÉÈç Çž)gº™Ë™Û˜íL†yžùóK6̶³½ì*ö‡ì[ðå½²©²²Å²;dË•½,û‘줬 ¿Gþˆ<'ÿ³B­¨Sô+æ*nW<­8¬xWQP–=õÁì#èËß=øR6AvâÉÁw¬g~L¾Ÿ=ɶà – $ǼD¾uýNæÌsäf„Ø.©y
+f!ùÙM츎if·²o‚ÔÙó|”'
+œc>_ ïWÂ8ÓÑE€õuè Ž·à1¨Y‚¼(
+ëô9Öã²ÞGåì½ gÇaNï¢@r¤yUâfÜØ[ŒþIyÞP‡úñ>ÐÉûQ#hÊ.æMôGíÚ<úôÚÐ#j”½ ªÌÏ,4ÌKØ
+ÚPT54û<
+³0ÀwL" ž…jóÀhς,ë—=Ú7šÁB,ì%²‹`Þï€&û)Z[À÷+€ϋæŠm­SZš›êkÓ©dMu¢*^‹F*Êá ðûx¯Çír:ì6«Å\f2r½N«Q«”
+¹ŒeF•ÝBÏ°/ΰa¡·7NËÂB¨Xx^ÅpÆU=_…Éø†%0ßW!E€\öbR<‰9_ j‰Wúº_æ']‚/‡çÍ€ü׺„A_fBÊ÷IùR^y¿:øºíË»|<ìëÎôlX¾½{¸ †Û§Qw
+ºÃ·¯r|û9-Ži—KÎÈ0 é;Œ1xoWÆvíIû—EÜÔ9°íüV³½Û¾ÂG‹Û·oóeöÌ8¿ÕOãÁAú’PÏðöxõ°ˆÓçøàmdëà@o…Wúè—Я*~ßR¡›Ö ¯ôeTB‡°|ûÊa@s{]¸ÑŸu:хÈÙíÛ>w@ðgÚ\ÂàÂ.÷>3Ú~áÆ1‡ès|µ%^¹3vŸÞPÊhuçg–žk“r8ÍM¿ðÜÊb:#a*DÆ·Ø3à›h´´m_Ü`ðÄÐ+³0²"£êÞÎ5ÑzÚ?# q‚oûg(@˜øëWk–jä!î3D³”NΑ´ŸÍgb±L4JIDÑ 8…9¶JåÚxå†yHá|Àò¡~XۅƒM X~¿Ÿ"øŽœˆA!³yö@±ìC‹\Y$&bƒ2L[Æ϶X.¢-›Ï¶œë>,%?¨cÉ(Ãçþ8kY÷ò¦ ¶þš—ۧϦϞ7àëÞ>\ZÛés¿R*¶7œk+å2eŒ‹”rÄÅH­@”óÏÓ€6ÆàŸ\"ê%9…¨RªÁ¾ž 7Ü[ŒÕ~ÿÿËN¹Â§´—”|Ù­4ÍLSì«å比¿2=ív&̆Éô¹ó¶oW¥­$Ðöí=‚¯gûðö…¹ÂæE‚¶{¦|ûH÷ðYŒæ
+äÀ/»mî@–`Ò9Ü1¸/m} t¥Zr®––|´žPz–(¥&×Ap7K­¬T!•ç0’ê”gë0Zœ#Å:Nªƒeôιç£Pâ‹Á8…ŸïF—pè‹Û??ÎI5_ùí 5ºKÐßQ äå`+pà€÷«¼£P@2DöÍõåXí˜VŸ¤i¶Ì–̱š±
+ohçXÚ  Äm@`¤#‘5e¯I‰9HÖ“+‹ÉÊb27%¾€ÓPª0ΚÆlö$­Sk“›iªTѲ1;/%¶«X#L‰ÂќbšíOIÍ}t#º X;ÖÕ]ìÕQ¬n-7¥øö ”}D#öBø‚foD ;! °R‰Âm‚°Â'(¬4š2ehw±´pÒ·sˆ‡€À aVߞ‘b«„UQ¢YbˆeÕY´š?ƒ0cÝÒL™±X•”f+"I©!ët'_m»œJ*pÖê’ZP¶££”©k(fÆ¢ñäñv5‹Ð' ž;˜:R¯±Šªä§G Œ™<2`Lk™3cœÞÆLŽʒb;ÇüõC (ÃìCãZÃ|†6A ¾7¯¡/böŽ©õIà?A>›!0hÄX*‹(ü'ceV:üŸ²£Ôïx¶:]̌qöd»™yæóó3$ ÌóŸAÅ3?„Ôé˜×‘Nšçcc.¹Þ÷(€?ÊlDh~œ¹%!}Š¹l!
+ö›¬¾øžßd+¢Év5ó$s½²ŽSgV3«²IÞw˜yŒÒ#ó×1•†Îï¯YΒ|‰ùY…Ìu l¼á%æJ”€@¿$7¦Ò%w¶k™|f–…‡9bô‹Ìϲ0¼ïif3˜]<s”¹ Ìkžy†¹9káÇ3ÿ”ÀNÓQà}ÅÐdL§OŽ·«˜G(…0‡ÿ»ô¶Scá†$j3w¢jõ}ȽO™‘ùrš>Ô| ¨ùfñ1-b& e`Ì{h„ù-Ú á!ȳ0äÆ,¬àA)¬Hdn`®‡•àÃÚa¨½qL¥§3»>k*“À®§ Þöók4 É¿M9rÍaæ.éSvŽÙ]´Ã/²*-,ÝuE\@Çk)^b637K+q“´™ïA蟹Eê\Ó“›ûs¡¸âŽAø `sáæ¢ïÓ’†ÃÌ<©óÔ¬>Å¿Äô§÷J«Õ›µ¤9_PÊ°†¬Ë›üÍ 8H³$«gåÙ?û03èg33»„‡¹Ïθ´ã̱†¦dõaf¦´3³¼P¬Î–9¤LOVU¤«Î1µ‘ΤKŒe•z©:VbI&:f¶%y Ó&ékST–2õ€¾z@M=ðIJBFrŒ3õ/a’Ò%Ñ0„=2XÀqÀ“€ã$¸XIiEêàsëP¸­CŸBQÃÔ 6; p‚Lª†@ ¾Þ0 ñNFL@™ƒX„0 a3„=Æ!|
+AŽ2qxO «!Þ !á8pU ó¨„6ãC“J„x´‰ì›ð&´ o"›˜Mì&Ù&n“Q)ֆ*“âJUѨ¢úaՈj³Š©V‰ª~é|*’+ŒgM)HD“¼)õNßG}Ÿ÷1¦úò
+í6òŒ¸â‡ ‡À ÄmÖH%žB Éýc啠ðÉýÙ0ÈHHÅÄ[LÜR2æp&´Èý0äý0äý0-ñÚh©0Nvg»(ìîì”bҔ:Þ^Z”Ne7Ú  Y?$å·I¹½Œá\9ñ )7ñžsýH9â³}r?<»!g ×Bíµ¢† «Œ*“QiʑCÙ&>GžÏVpŒ“,MÚËk¯ÃKñw¥ø!)þ†_"ÅQ#èþ-è^tO
+ºv5™†‚Pý©(Å+E}P÷ç îAÝ£AÝ#AÝaü>
+Hu˜|)Ò1êl´•Ï1*)!þl_w¶¯W¶ïBHœÙ¾µ”eûîáÛUĀ÷±Â=Þ§¤©6½ š5ÅD™^‰,mäs8Ÿ
+|‘]æäóì2/$§³ËҐ|F“ñ?Ð2Ãà¿e—}†Ç¡
+:,þ
+®~.…É᧲Ñ
+HžÌFƒ<QLÍFyHÎ.«‚äÛÙe÷@ò­ì²“ÜŸ­XMÇۍ*¤qîCa)]—ísAóh¶Ž0’íK@²&ÛW ɪlëO Y‘m=I»^Ž÷a l¼ E¥™.Ì.‹Bó‚Ò‡ ¡
+©y>ª•F¾ ÛG—¤‡Ò®ÃÝ¥éÔæÃxŸ4Š˜VXk6†dJqåZ²Ëb4d+`q}¶âÛ°ru¥D(~^ÄA˜HÈFŸ >»,‰7»¬í “*+½Õ„Z¥I³Q
+Åe£>þ{Xƒ–I#ªQß¿ŸŸ„q¿hÍዳüçbN‰³ü?+ ÙÏÿµoÿ—¾X¼üGÀÂÏîçè{­5ü»Ñ“üo—øEBtñoD«øWÂù\Åa~¬ÏËe–-â÷.“Fønºeù§*rCï=Ëfð÷Ecü®pŽÎá뼍¾ÚÝÈß¾‰¿
+m´fÐ t™„®Uµ‡é¥Ò9öþ¢ú ha¼ÂZ±Jñ’âFÅ"Å\Eè›rEHáWxf¥IÉ)õJ­R­T*åJVI”H‰ˆ9W8!ƨKg–Kžœ¥1+å9BcRô Vp´2eÌt2}NG¦>6=§(\˜iˆMÏ(û/؇ñ]ƒxzf|1š¾È—9=GÈa5xÒ2¡gLÓÑô¹vΐÛÀ%;ÃÚc«‹nODWnýš‹¦=[¿68ˆ¬Úìm¦VccO×ÿˆ†KqwWì˟=ûJɓ¹wúœÌ3žÁL’f
+žÁé™ÝÂ:HV“•Ý]É*š ÄËÉêî i=^Þ5`Íj%« õÑÀÈ|ÔJÁ ~þy`xTwíkm-ÍÂû(0Í, h^¨ó| æÜ)u2wH@ß.¾0
+ó€Š40Ùj•^•­–Àìl_8 #- S}É0ì '¥æÙ_6W›¿SlþmÎaüe{m¸8Û
+–Þ&ûÿñ·´ãÿC'<6eÕtëqXè^
+£_y×íçÞÕpÓÿì&:X}×ÌÑÿÑ<J›gÒwÒwÒwÍgJïš~ažÞ?°O‰:;çÓ1¢Q· »üƒVn¤Ubf¿ýF×!᧐&6˜Ñ
+b˜á—ÏU±uWÑê–¾Vún:˜4dèWŸ]†uRÃziaàW¬—ºÆ` Ø¹î±/3늍WI]Šµë¾¤ah Ã¯¿*öß¿R-Ýe#؍Ì-÷\®Žç ~E®È1J± ÉØW¤V°¯`äPÊe¯æE܎T8„/Föwºe²e&wª¥o²µAž;QMµßè7† Ânñ1ãgDúùØqDMÚÂ1½÷Á!7ºñ%’Aä$÷ /ùú˜G…QŽqˆNãT›f§w—xm6§Ö<ՉDŸF/c,¹fÇZƒ“wg¥AËk‰6‡ËDÕ9–;<oµÇ`NC}C'‡L±ÄDŒ›˜Éu/íú`µõM~ÐVS{ºzº¦va!\^®M×¥’V‹Y¡34• Z‡WW*ÊӉùÓz$k݁Î :;\†®}äW/ê»lÁÔÇÞYŸkA—Ô2 š¬#¿¿„Sô†hü7Á
+•ÕÖÕÕ¦ËÃB@Qš…43ù²õ+0=­'Ö|ɒ .¾ö;ùݕɇæUJ…q~kǒ­ëw¼Gui¯!I+àÑ)jÁ{CNv°ôe3¹“Ü(Ñ7¯ñ×úÉÆɃä¼æ(í5¯ð'ü$N#
+Ü«ð,`Җï܌ÈV}¾A¶ÒÍ´ÂIæÙrz’ˆ§‰•KÎËCªˆMawY|–=¢R(ñÕJY“¬’1¹ÎdË1j1„Ä`8ÄXD©:ˆš§¤EԏöЕŠ› >@R¿C‡ub™%­sT~ö7úá§ck’:D[@ –§t$@YÀ£”PÊôMP£Ã²€mT¼”Bš¾½†m¥^°¢tM;7Š‹pÔççýDnÐsz"
+.§?žÜ?‘j¬„ˆzƒɔ
+ˆ.rè‹ô$pÝÐPß©‰ãÚÀ\8ÝÄC ÉÔ¸­*ƂÌ7 ŵ)Ã)cÊ"€á¯÷Sd˵×_ŸŸÈ[âí¸À¬8³ëhþ®>Jl@!Ý Æd3P÷‹Uz9V©ê
+ò©ò2F#ÃN—ÚÍz8ˆ=,v² SüÊ|e¤?FNRªçMˆÅl²ßäcŽ0càµ:Á1Ն2¾Œ”½«Õ‘y} ¿¥D‡‰&:Ee¿r’Q:ƒÜ[;8@× àŠkp
+ÐAtЀ`Ѥ)ÂÆK
+M6ŠÐ'Âk‡F±Ÿñ+XzÓFÎ
+ÕQQ¥KG)„~‡
+dƒëÕ×±ßÈX«à7ê ‹m‚!¬aŠñINä ˆvµZ¥4X±õ¾ ¸J|jGux$¼9¼'|,|",qa_X ÷CÍÎp&¬Øq,Ð(7tÊá웜ÍÒÂÁÓÖâ¤VÌ$HÓsϐD,J`lHí43ôjŒ*ïÆF;â&07^Œ‡Î/(¸–EKK‰‚bدê~S”8¨
+dCõ“ög+yU¾©x7þ7à^<Õut-%·’-ÕOáVþ¢ò½ÿ
+ü«ÚØ« ‡ÜÁ`¹ÞçQŸÇªC^&ˆª|Õ5QòÁßU™ÝU¡Ê¬²XÌ$Z¥Tª”ÈÇùˆï=Ç·L¬3¬1”óå¤<nÐ;’©fÇüSì±ØLênKçÀ~TÅU‘ª¾‡\ûªú&ƒÁ¨ä&hML8h,iº’í8‚Aœ¾…®6XþÉXÜ/Xí2…-ÛBòpeH°ú8@£˜¢*ýö ¨â²h¡×R²åéï&øQ´QÁoº¶úÃ8 Wƪƒ•·VþJ!—DDV›d–±vζ­õK¶š\Fk Ba4*ÌÖT©Äìøþ̑ëvåOLκ¬Óåê"Û?|yä®Éßßµ­÷‚-_ÇõuýÛzî'Gãâ¥wï^²1$4\Ɍ\ÙÍy|hÑn“¸~Þ¼u-xòÁ|_²®þ‚msìj¡–ÝìÂïe—€ЃÈZØ<¦R§Ý¹b*/¥:HÅAÈh*W]YŸóVëήÛÝÊUÆU¦Æ¦ÛOʟÒ=nû¡íÇ.µÜŠÂÖv÷fëVÛ­®-îìa¯:^Î_-ß ÛີìAQ¯7š‚4x0ŒfpMçùŸ6šô²•F¿Ò¢Â FltŽ„qغò NJÆx~*ƒšWuŸÃqŠ"z¬˜›ŸoèôPßÉ¢†ilü+øñ8óˆšÅÓçlܗTzƒV·\§Ä*U
+‘»Â:«:„änˆ4v}©œ²."3JQ‰‡Fè_ÉY3
+ÔÿSV4Q¬Ô[ä ƒ`<š‚ÔH¤U²KÊ+?½oÓ/jÚæ¿úàæ_nXûÏÇ“ß{àÇxðåÍwø
+J¬œ­ÕþXåQ‚Á¨˜Mȏå…×ç ¥B&ÚY:2 ‡„pș©ÂUë z^Oô­âAž·z½GÜl©¬’
+_÷ØBê<v
+rÀæÁw–רÛ^tÝå¸nÊqI_TnÐÀò‡Êƒå`焴‚*„ô~®ûx'BI]® !ƒOׁ”‰ÿ€©J•¸P’¦£CÒöè(e 0!9˃g1 ¼Œi¤ö1Eu-‡ü%¿­^¶5ԙ?õÐ}?š;ÿ'_«¹¼ÎÚ]#{¦7sª›óÚõýÂ+õ=XpéìÊ×Lîj30hàÕ7ŸÍÿôáWòïl·˜±³?…d|°lZþƒ¦æÏ®Úþ,Nâ'8åôH#åWЗr3ðk'nM°K@sy”€Z÷vºÎúzw²sö=vÆçóØsä7IŸ'4Ñæ2€kÆÐÄ7ímb:|ž&€ÙPÐçFPpŠ=
+û<
+:‚`ôQ´GΎ‘Fˆð‘½Fðy"#^&¤|žÆ€ðWt"ʺmt[9‰Øí6ÒÔبT*”êà:HGkҐÂðoA
+EKqt-ÕÁÀµC£§ÏÐY£ˆÆ¦Æµ 0Œ$ڈ•âó² 'k¨–¯îø|…-tó‹"Øÿ_5ÿكTÿ'g“×hÞ ÁÇ­]•äÕÊJ4?ÙR̓;óóÿ“Õ‹ùüf¼ùËҙ-_æñc%Y-ïÜ7ã…Ñð:é)!rÆ´«uš„¦y*žª»R·mC÷ãûu{¦äðKڜî@sfÊdÚò±ÊVՌ[uss›WâË«”HßÜ NxsUU"n­SJÒÙÄ}žðü@}sƒ§^Že9še¾Àû<¡€`¨Ãu‰ZOÝ8QõZ3®ª04›az—nÆÄõ:0u¨YGÝ£¡­™N´fU½#åî\ÖZ_«E!Wʝâ<%nàxŽp­ü/ö:Z¦¼HæJÒÝQ”£ÞA€¸oi¡á¬‹)·õUņô`³ÛÀ
+ F/VH¨ÿ´R" \4‹²¹ÿnéÔÚæÉÖÎòùù7’ö®é“sÏ#‘G»B´øŸ+bÖKˆñ‚Ù_gº'Ÿ½1î …ä^kt=ÞÍßµ2ú*…˜õ~Çåùyx×E©°UÀˆlšˆ ¤X4Q‡g‰k½ÔÓÑx±Ê{—T7t×õ7<‰^7×]‡¯FW»¯ö܊¶¹·yv{žò|äùÜ£i8Ñ@x_ƛ¹ ’L†2ƒLñªN®öyH àôyL@U“'h|c@à›($|žÚèÛÄNäqûïn—Ùív¡º:„â¯Ùãñ"\çq3<v¢ºZ‚I8äq›ŒJ„ê\œ;[ÕG5Ç5DãlôƒÛ›–&Ô@µ–ÊbM7xùŠDm3Ò¶ªUd¼êXݎú†ž fù{Wn¥$1´6F£@q¬Qµô!Yàv‰BŠ4R²Â•Ûªb2
+OkqÏÏã
+ £A±ÇæI­@ÄfUT˜z¹:¼@‡u7ô XàŒnäÂý.Œ\k\ÄuC $šG‡¨4¦’ùt1G°³2¹´ç‘´ÁÞð*‚JûYžŒÅ¶q-7¼º{S,ЃTȈ±²Zdà õh­oÄ¿Ù·Ù7ÚiØéÛé=ï×±>ÖeË5²¨SÎå
+—fËj!yô½ƒÄ™1ÇíÄ{Ü.ãV"ÊÓÀØôàûNivµqôšŠÊdoCJ}YÊ>-• æ6C®ð§1€ô¬ÞÖVt¸¤^lFW£ë‰ÅHÉ HÔ¯*k çÉ·„êQ<~q³?pfÕªn_žðÄ:Ze3Î \k"à ³†¿ØÅ®8óÈU‚ç­f^
+ÖH$g,òÇ»N`ã‘°«môQìÎ×4Î
+Ïik~¤ù‘A.§´{8Š‡pYÑ딶¤Çbf¥BêŠ
+ÆÔÙ³‰py9ï´¢žyYñ¼¿eÙՏ˜xæã9æÿù¦¸öâjÞÙd
+…*¿¸{dkjù–ƒ\òñ ­‰m.§W–oË3G¯¸ .$ªüs¯Z¾üÖg>sÍ‚Þ~ÿÚÙÕóf·_ºùÛ 9ÉiÛ}S(V§!$Ó_øÐsQŒ
+»3 º¡™3¥}1аՐ!øw
+ÅÀ¡Ýçá•Ïc­õ;§óŒ×Ã+œÈG8ƒ`Šä¨PVgÇ>{¿}§±û8|†~~¿“gùC8Šìä»cþ+èŽ-˜¡-`€ÒcSųD°8‹Þâd¬äFN‚2‘ ‰’?øßþ¢¤\£LôÍì
+/XjëlŠO6ÍÇE··^b ËfäïÞ´Æoúâ£/Ukmš}/^#Ý¥=•ô€ç `%šœÁô1§Ø] ¸Á†m+lOÛr6Öj³YìýO3<ÈÂÜ¢÷è´JGëw€*s…;Å:›BîSRß(qÍ"“Ë+lÈ9,J…œÕÊÀì¥L¦ðë´$Œ
+Œ6ŠÔ~ÀîSÓjiO‰zt-=шa Èèì°d¡Ñu·˜­6Œ¥Í.ÀM­,;­):'÷çsg‘íÖŸ«Â~¬­¶úøز!mgòà§ØºWºT¡Õà1Õ¬š"ƒWLsz«´FI/›
+¿W| ø¨!rql‡ê_2Õ¾Âñ´=gÝñ¡ãȢю•6BuhVrA²?µ
+´M’K‰©þÔHjsjgjO*“R½Œ&ßGÿ@…¤ljc}ÅVÕ-Ž=èIK½‚TvG•W$Rhª¯§f-Z‹Uˆ×|3Â*‡C¡R©»Ó©Ô h“?²€ï¢#n3yŒ¾
+ÐüàTqZƒ‡ãÀ5ÑjOÈFX¤É¶ŒÙ5jÐ5׉+"J…ÏY<ìSÆ#æH¤B‹4Xkš¸Ýf—N¥V)Õvär…¢" ¨M«Q³\…ÓAÿ<Û.¿(Š£‘h¤‚þõ¶V%Wkj|¼Z©P¥(É´«ñKÀÔ҂D`²6Ès…ñýàÒpt÷•\>v>õHÄã´O:%
+:çœ%¢µ”ŠLÿAHʯPÔy´CÒîlãÿÆÎ/|6´: ÔTi²DvQŸJ—öU”ÈlÈ¡ÑQ´vtK;”òÎ=z±á2 ÒF‚tc+++Rb­âãpÚ,oÌ_RžÏäï
+Vÿ²¡*ÙÞFîîöZìñþNàfU2ÁvÇ3+ÏÜËÎy²G
+²ՈoSð^哲'”XåÍÊ­*²‰Ý¤ÞÄo
+êX
+o‘«g4§¦Öԕw\,›19yíè±Ûv~KuÝRöñÙen M>–Þ$4Omzîįû›¨¾Y8É,)& ¿‰W|&ÇAT=á}¼&¼?Â
+Í}*¹ÍÆWÒs§ÖO¯ø›ýúØùƒ#wïýú¼Æ®™KÚŽTßC[þÖ«¢¼2 x¥xŋâøZQ¸O÷”î î€•5™ê•ÈËy‰«”öGxïk‚AÂRüó<~DÎCæÒÊØ-ؗôO„D‡m£?lVÀP¨hQDéþ4±G¥ÔÃ
+i>MÒ¢?«¤ï㡶R¬ˆ¤+©f¨\S¹£’é¯<VI*¯îLÒÎ@ '[&¨•51$HñäÐèвRu¬xMëTËdL:`ž vYÉÎ2‹¼?œˆITUr¢Vøì,ånŸÞ.]ð:wы^íj,@ Ý}–v`$ª‘nn¥ê“¶âf=x”îxwÑKQ„IJJ–)ªR)L¾…›ÇjÊìkŽL“¯O©oýÎÏf.¿è¦§n<6¯û²›W®»õš™¡iMý³êZú㾫–ù7<zÇC×̃WÖTÔ5/¹gŽ¬9¬"Uâ֋îð×Ô\R]5Õ!®í¾¹ºfϊÛßh½*÷Í5W>4Ö^ýÅߌ|mjδN‡Ñk¥Zº!¶Aºapü ’>Íj¥-ýÄôÚ´¬‡~º£¯ÉäVyXÎt(€*yà*妽ú#zâ¨,Èësä·¢1PäB@äu‚àòþyG\,TùJAÀ.èŠìËXEÀï×ëuj%¯Âª¨¹Lô··•‰Ý¤ËÄ)µeb'„Æ&(T×@T^Q,Q Pw™ÎçÑ2l(þ²£e„+ÃeÔ¼7Wa¾*SEU#t%Zk里ÁPR
+eÍùp³ÃXÞ
+ª)YN¾öÚkm“¯»¥Ûؘ˜lq‰ëPUqA®ªZæñ¸½^=Æb^­×ðj«ÛÆ[#A>’€À¨ÎÌ[ø /B4ÈW #û>3`zõxõfèÈ —yÜfË ózܜAO°²šGUH­’ƒ«GÿvÜs©ìÑ
+V‹úxõ'ÕdS5®¶Ùœ–.5~\ü‘±ˆ«sxoV¿–;„Á×Ã^Ñêî7xxñ\íõòÅKÑhTr9`Úø…Ç"'"lđ¨~3ȏfⓥS–XñÏQZ@<yêÔÐäÜ)i_ktHÚÙrôq§NÙ'ORBœzxùgÛÈH/ž®}^^:ۖ6­Z¤{ÂT¹ «Ö—¶œ¤kEY钧¤/…å? ëû¿éôWŠøіy·,{w+˜dyÏ=ØRњ÷”øõ̖_¶7¹\Ae(Ĥ6/ÉïU{¨Í®·µbCóSŸÇ²Å»,$´Ç!`4åØaΘ°A†äˆãeœœãäš /—øy™Ä·Ú ÏQWÝ*@O¹L]ú+ ¨VC¹RSäJšŒÅÓiM‰;i*
+Þ¡ÁŝÌëxÓSÆÄ$Lm¦¦qÓ “ÌDákÒišîW¥sRáúî”ó,SÒ-æÿbű/YpÆÎ1óú"Êxðõ3’_¶[™)òl2ñ¢Ú[¯4”¡ÔׁÐî‘ãºzGwõ×ÏâA¾2¢9Ðä[„€!ȗ ‚XŽA¾<GÞ> ˆÍ¸>È7C^Œ
+A¾Gx_YoKrë]¦V³
+Ô#oi®(7—©{E°‡$Cì"o z÷ôfzÇ{Ù^ x½ÁÀˆ!êt€ÊtPýøãˆã¨ƒ;Äñ¡?­ŠCS\jŠ‰3b|GœÄ?D†z¾žÔG;Ú%ãÑH·Ÿh'{Ú3íãíL¢cíL»ã‚Þ™3æ§
+rÂèÚ¢6“ °–ɳéPK‘¨ÅU:Ço£wø¸s2CºØS¼áSÒk’™LÔ¸<L^v‡kdU^,Wx4N/Öêò¤»´Þ¢±Îµ7<¤»´SçnM¼O©ò)½å2^å/G>¿R¥b¨¸!î=ÑKäÚ 6­{¥‘Í’ÍRÎTÍҌ÷ÊÈ,ù,íçr–xŽ®-:x½ôÏ5<ÒBq–6y®ð¯1P²R
+pEvîý™ÙÙÙÙÿݙ•öO«Õj%yõ³F¾c#ÛH²ÁÂÂ'°Íù±lã;l'2˜p\©#…«ƒmŒð%u&p€¯R…‹»rIs( gdžƒø$åõ̬»"•J¥*µzÕýff{Z3Óo^ýú½
+}åǧºÁ€”éð:üØÖÓüu]öóÄЊ:~äЍêðezèÕÎ
+¸Œ—áeÒvÁ6ʍ cÒhx·GØ#í
+¿F^Ñ\cöQ÷¨8ÚcßåÞ%î 9h¬ßæa€!؊5̘r°Þ˜
+òy*vC8¨lÀ°Ýµ†ƒ›¥n«
+cÚï`j#üáës‘îCûä"(?ʇ´ð¾¨‰PÅ
+×"‰õ îX˜›¯$pf¤ÿþ¡E£*_¨“ê ÞÓ² ûÚG
+NÞÅ£úzxâ­\å(Àçñsò9
+ò9Šï9
+í9
+)Àù) ç§,|Ÿ²ð=å͟¡æ”ó)×Ã0Ž¥°–z&EŠ©ÑI)šûEªhAÅ å{,”ï1+3ôÀþ.zŽyNxO8Ù?;Ijô†y®åø vdèFN}e¨ÒÀüÔe”š$i.)UgNO˜ý½ÕêFðT¶ù»†Ów,ºóҁÙoà[}¹h*ÞÐE±ùTŠZˆn\vÕíã­„Oݶ~¾ê‹ à³ÖÈЈü4´~ ë™ ‚e$c¶E‡Õ煓êÕ®Ò^ÜÝ®ÒÏÄ´R%0â»Ç¡ÙÙ FCZÐllÓ¸€ä×3wëEKDc±QRDQ­=°å‰y0b9)B¢Ú’N6)£’èÁ¶tŒv;ÇÅý­´½EÔÅA‘G<ïcºò‚Ñ%ðc˜Paz3x^١q…Ñd¶¤ên±$¶á“*+©ø¸,Áª{Þ¸¼Ùg©?éTøìÈِ¹l’á[oYNá'êôfﲙn/ç¿*î»ÊŒÆ1‚‡ý*½X•^,‘¼±
+5%òMM=ZBÑ´„9§´FSaWe'ƒ™5æz géñÊ°-K,CXg“ê“1â¼|8— ‰|VË'4•~‡Å®¦l&t9¹&† ¾™Ê|“9ÕÙeN;%êÌi§P8RjÖé„9Ü9Ќ›ƒÁHv[B›À…#ú•ÞQ/ñþP9«Î1çÌìòØÎp¡y‚ ’8ëûÙðÙëˆ9b*Œ/øc¢¹¶,×ÞYGÌ͞/o{¾»oþ+E·êüK­Ú†I›ÎµðA9Ig—ip‡Å?€P8”r®Š.“dªÒk
+ovŽæù¢ÌLΠs¥Ïº²áyø­–Tâîq—Z(âwºÔøø-‘L'ö7wä§ÿ3Fþjjyr_1áI§c²wåôŸâC}9j}°;¸4’M± éíߝ
+ˆ üŒÞŽ–æ“^r-3Ælî!÷2{Ýç¨×EÓ#,v¯f†„1?eìD‚Ó· Rt oBÞþ]ø­àà +D‰"°Ö\Mƒ@Ÿ‹DÈ­äò±7¶ ~a›°[8
+ÔHÁ
+•_ä–wq:]«1³ÏÉyÃDRÊH‡W°‚fÙDýCHú {›áZä2\‹0û” Üg)Óþ³Ÿ§ŒÎïìY
+[ª‹(é$sêt….Û$uŸ6Örø|ÑP¯[ 1sƒx4uS1¤ü(7c_ò›\4ŽŸ<èñÍ®ºsëË´.é¸tv.:LÃ[6›Ó{FÅ œXV0‘@“dPÍégih#Ïüp]];èIcêü˜BËy̢߽AÈÞ«.+ŒŒošèÇöçcæ²ä%ë°ýÝá›D33æº(Ü?“ ¢ßÛ´£ûñ½xµ=ÇІÉ%À8¹i7üS0žC¥fQÒóQÝõõn–’K¡¿no‡º $f†ºV™u¡_R|ö¥Ir/GQnNEmMŠ
+·A'¸âY¨:8¨˜Zml?Ùk[e¬ӡǸÝHÞ-…¡ù™Ý¢;?wûá{Íؘ©OF¦ªžàÆÄÀù+ÖÍÙ&Þ®Kú;;ûû§_´6l« 6'Ño¥Zôï¤I4ƒ³xY@ždz™ÙÕ¶ (q@ç’]wt:‘Ao¸Þâÿ’pR8éþ…ç¸ç¸¸‘’´Rz[zÛû¤|îˤ|Ç¿&àJÁw‚ï„[#ë£(Šb߈ýºL»/qSݦºMõ “ÿ’º<=”éÍþ˜RÃ'UÊÅþG´ì÷Ò=5ªQjT£Õ¨F5ªQjT£Õ¨F5ªQjT£Õ¨F5úß%ú7ú-MøSCŽ@â`£yÕʑÅË–^|y/“›ß9ÔÓÇ^Ú²"ÓßÚX^"…Ähþ
+`^Gê¢ÛÒÃ>o0~µ¬ ÿO,ºÓÈYú|Î̛™Ӝ~òf´
+¡Ôå.E-hÊ ~ԊQ-A
+¥Gâ
+endstream
+endobj
+44 0 obj
+<</Type/Metadata
+/Subtype/XML/Length 1387>>stream
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
+<?adobe-xap-filters esc="CRLF"?>
+<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 2.9.1-13, framework 1.6'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+<rdf:Description rdf:about='e528704e-c197-11e0-0000-0fc394587b2d' xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:Producer='GPL Ghostscript 8.61'/>
+<rdf:Description rdf:about='e528704e-c197-11e0-0000-0fc394587b2d' xmlns:xap='http://ns.adobe.com/xap/1.0/' xap:ModifyDate='2011-08-05T10:24:54+02:00' xap:CreateDate='2011-08-05T10:24:54+02:00'><xap:CreatorTool>PScript5.dll Version 5.2.2</xap:CreatorTool></rdf:Description>
+<rdf:Description rdf:about='e528704e-c197-11e0-0000-0fc394587b2d' xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='e528704e-c197-11e0-0000-0fc394587b2d'/>
+<rdf:Description rdf:about='e528704e-c197-11e0-0000-0fc394587b2d' xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>Microsoft Word - KurzanleitungFW.doc</rdf:li></rdf:Alt></dc:title><dc:creator><rdf:Seq><rdf:li>gba</rdf:li></rdf:Seq></dc:creator></rdf:Description>
+</rdf:RDF>
+</x:xmpmeta>
+
+
+<?xpacket end='w'?>
+endstream
+endobj
+2 0 obj
+<</Producer(GPL Ghostscript 8.61)
+/CreationDate(D:20110805102454+02'00')
+/ModDate(D:20110805102454+02'00')
+/Creator(PScript5.dll Version 5.2.2)
+/Title(Microsoft Word - KurzanleitungFW.doc)
+/Author(gba)>>endobj
+xref
+0 45
+0000000000 65535 f
+0000021630 00000 n
+0000132033 00000 n
+0000021541 00000 n
+0000020871 00000 n
+0000000015 00000 n
+0000004816 00000 n
+0000021695 00000 n
+0000060967 00000 n
+0000067695 00000 n
+0000062240 00000 n
+0000107966 00000 n
+0000021736 00000 n
+0000021766 00000 n
+0000021031 00000 n
+0000004836 00000 n
+0000011432 00000 n
+0000021807 00000 n
+0000021837 00000 n
+0000021193 00000 n
+0000011453 00000 n
+0000016086 00000 n
+0000059992 00000 n
+0000062849 00000 n
+0000021940 00000 n
+0000021878 00000 n
+0000021908 00000 n
+0000059847 00000 n
+0000021379 00000 n
+0000016107 00000 n
+0000020850 00000 n
+0000061998 00000 n
+0000105059 00000 n
+0000059899 00000 n
+0000059929 00000 n
+0000063041 00000 n
+0000067903 00000 n
+0000105257 00000 n
+0000108178 00000 n
+0000060138 00000 n
+0000060224 00000 n
+0000061489 00000 n
+0000062149 00000 n
+0000062601 00000 n
+0000130569 00000 n
+trailer
+<< /Size 45 /Root 1 0 R /Info 2 0 R
+/ID [<834406724FA725791E961187722C2E24><834406724FA725791E961187722C2E24>]
+>>
+startxref
+132251
+%%EOF
/NGVideo5_8/tags/v1.21/NGVideo_5_8GHz.pnproj
0,0 → 1,0
<Project name="NGVideo_5_8GHz"><File path="makefile"></File><File path="main.c"></File><File path="dogm.c"></File><File path="dogm.h"></File><File path="config.h"></File><File path="keys.c"></File><File path="servo.c"></File><File path="servo.h"></File><File path="ngvideo.h"></File><File path="keys.h"></File><File path="usart.c"></File><File path="usart.h"></File><File path="tracking.c"></File><File path="ngvideo.c"></File><File path="messages.c"></File><File path="messages.h"></File><File path="menue.h"></File><File path="menue.c"></File></Project>
/NGVideo5_8/tags/v1.21/NGVideo_5_8GHz.pnps
0,0 → 1,0
<pd><ViewState><e p="NGVideo_5_8GHz" x="true"></e></ViewState></pd>
/NGVideo5_8/tags/v1.21/config.h
0,0 → 1,184
/****************************************************************/
/* */
/* NG-Video 5,8GHz */
/* */
/* Copyright (C) 2011 - gebad */
/* */
/* This code is distributed under the GNU Public License */
/* which can be found at http://www.gnu.org/licenses/gpl.txt */
/* */
/****************************************************************/
 
#ifndef CONFIG_H_
#define CONFIG_H_
 
/* PINA */
#define VBAT 7 // ADC
#define RSSI1 6 // ADC
#define RSSI0 5 // ADC
#define MUX_IN 4 // OUT
#define MUX_EN 3 // OUT
#define CHANNel_12 2 // OUT
#define CHANNel_11 1 // OUT
#define CHANNel_10 0 // OUT
 
/* PINB */
#define LCD_BACKLIGHT 7 // OUT
#define BEEPER 4 // OUT
#define POWER 3 // OUT
#define CHANNel_02 2 // OUT
#define CHANNel_01 1 // OUT
#define CHANNel_00 0 // OUT
 
/* PINC */
#define KEY_MINUS 7 // IN
#define KEY_PLUS 6 // IN
#define LCD_ENABLE 5 // OUT
#define LCD_REGSELECT 4 // OUT
#define LCD_DATA7 3 // OUT
#define LCD_DATA6 2 // OUT
#define LCD_DATA5 1 // OUT
#define LCD_DATA4 0 // OUT
 
/* PIND */
#define KEY_ENTER 7 // IN
#define HSYNC 6 // IN
#define SERVO1 5 // OUT PWM
#define SERVO2 4 // OUT PWM
#define VSYNC1 3 // IN Int1
#define VSYNC0 2 // IN Int0
#define TX 1 // OUT USART
#define RX 0 // IN USART
/* PORT - DDR */
/* LCD */
#define LCD_BACKLIGHT_PORT PORTB
#define LCD_BACKLIGHT_DDR DDRB
#define LCD_E_PORT PORTC
#define LCD_E_DDR DDRC
#define LCD_RS_PORT PORTC
#define LCD_RS_DDR DDRC
#define LCD_DATA_PORT PORTC
#define LCD_DATA_DDR DDRC
#define LCD_DATA_PIN PINC
 
#define LCD_LINES 3
#define LCD_COLS 16
 
/* SWITCH */
#define KEY_MP_DDR DDRC
#define KEY_MP_PORT PORTC
#define KEY_MP_PIN PINC
#define KEY_ENTER_DDR DDRD
#define KEY_ENTER_PORT PORTD
#define KEY_ENTER_PIN PIND
 
#define SW_MINUS 7
#define SW_PLUS 6
#define SW_ENTER 5
#define REPEAT_MASK (1<<SW_MINUS | 1<<SW_PLUS | 1<<SW_ENTER)
 
/* zusätzliche Timer in Abhängikeit vom Interrupttimer 0 - Keys */
#define TIMER0_1 50 // x * 10ms für Anzeige UBat
#define TIMER0_2 20 // x * 10ms für Bargraph und Diversity
#define TIMER0_3 2 // x * 10ms für RSSI Diversity
#define TIMER0_4 10 // x * 10ms für wi232 Nachführung Antenne
#define TIMER0_5 1000 // x * 10ms Hintergrundbeleuchtung 10 sekunden Schritte
#define BLINK_PERIOD 12 // abhängig von Tracking_GPS() in Task_0_4(void)
#define T2SECDIV 4000 // Divisor für Timer 2 - Ergebnis in Sekunden
#define M59S59 3599 // 3599 sind 59 Minuten und 59 Sekunden
#define T2PROD_M59S59 (uint32_t)T2SECDIV*M59S59
/* initiale Anfangswerte der Einstellungen */
#define EEP_INITB 75 // irgend ein Wert um beschriebenen EEPROM zu erkennen75
#define VERSION "1.21"
#define CONTRAST3V 16 // 16 bei LCD 3,3V Bias 1/5 default Wert
#define CONTRAST5V 12 // 12 bei LCD 5V Bias 1/4
#define CONTRAST_MIN 0
#define CONTRAST_MAX 30
#define BACKGR_LIGHT 31 // Hintergrundbeleuchtung immer an
#define BACKGR_LIGHT_MIN 0 // Hintergrundbeleuchtung immer aus
#define BACKGR_LIGHT_MAX 31 // Hintergrundbeleuchtung immer an, z.Z.: Max = 5 Minuten
#define U_OFFSET 85 // um type float o. double zu vermeiden *100
#define U_OFFSET_MIN 0
#define U_OFFSET_MAX 200
#define U_MIN 960 // um type float o. double zu vermeiden *100
#define U_MIN_MIN 550 // auch für Lipo 2s
#define U_MIN_MAX 1400
#define CHANNEL 1 // default Wert
#define CHANNEL_MIN 1
#define CHANNEL_MAX 7
#define AV_SOURCE 0 // av1, av2, diversity
#define AV_SOURCE_MIN 0
#define AV_SOURCE_MAX 2
/* Toleranzen bei den RSSI-Spannungen ausgleichen */
#define UDBM_MIN 460 // RSSI geringste Feldstärke
#define UDBM_MAX 75 // RSSI größte Feldstärke
#define UDBM_KORR_FA 128 // Korrekturfaktor 1 * 128 RSSI1 korrigieren
/* Servo */
#define SERVO_PAN 0
#define SERVO_TILT 1
#define SERVO_NUM_CHANNELS 2 // Anzahl der angeschlossen Servos max. 2!!!
/* Servokalibrierungen derzeit zu SERVO_STEPS = 255 skaliert */
//prescaler 256
#define SERVO_I0_RIGHT 45 // default Wert, ca. 0,9ms
#define SERVO_I0_RIGHT_MIN 0 // Servokalibrierung Grenze der linken Position
#define SERVO_I0_RIGHT_MAX 100 // SERVO_MIN + SERVO_RIGHT
#define SERVO_I0_LEFT 45 // default Wert, ca. 2,1ms
#define SERVO_I0_LEFT_MIN 0 // Servokalibrierung ,Grenze der rechten Position
#define SERVO_I0_LEFT_MAX 100 // SERVO_MAX - SERVO_LEFT
#define SERVO_I0_MIDDLE SERVO_STEPS/2
#define SERVO_I0_MIDDLE_MIN SERVO_STEPS/2 - 25
#define SERVO_I0_MIDDLE_MAX SERVO_STEPS/2 + 25
//prescaler 64
#define SERVO_I1_RIGHT 180 // default Wert, ca. 0,9ms
#define SERVO_I1_RIGHT_MIN 0 // Servokalibrierung Grenze der linken Position
#define SERVO_I1_RIGHT_MAX 400 // SERVO_MIN + SERVO_RIGHT
#define SERVO_I1_LEFT 180 // default Wert, ca. 2,1ms
#define SERVO_I1_LEFT_MIN 0 // Servokalibrierung ,Grenze der rechten Position
#define SERVO_I1_LEFT_MAX 400 // SERVO_MAX - SERVO_LEFT
//#define SERVO_I1_MIDDLE ((SERVO_STEPS + 1) * 4 - 1)/2
#define SERVO_I1_MIDDLE_MIN ((SERVO_STEPS + 1) * 4 - 1)/2 - 100
#define SERVO_I1_MIDDLE_MAX ((SERVO_STEPS + 1) * 4 - 1)/2 + 100
 
#define SERVO_REV 0 // kein Reverse
/* Test Servo */
#define SERVO_PERIODE 20 // default Angabe in ms
#define SERVO_PERIODE_MIN 10 // 10ms
#define SERVO_PERIODE_MAX 30 // 30ms
#define SINGLE_STEP 0 // Einzelschritt aus
#define SINGLE_STEP_MIN 0
#define SINGLE_STEP_MAX 20 // bei prescaler 256, sonst * 4 (von links nach rechts in 9 Abschnitte)
// zwischen den Schritten muss Pause > der Servoperiode sein, sonst keine Aktualisierung
#define REPEAT 1
#define REPEAT_MIN 1
#define REPEAT_MAX 100
#define PAUSE 10
#define PAUSE_MIN 4 // mindestens 400ms, da mechanischer Servo-Lauf zur Position berücksichtigt werden muss
#define PAUSE_MAX 20 // Pause pro Links-, Mittel- und Rechtsposition 10*100ms
#define PAUSE_STEP 0
#define PAUSE_STEP_MIN 0 // Pause bei jeden Servoschritt in ms
#define PAUSE_STEP_MAX 200
/* Antennen-Nachführung */
#define TRACKING_MIN 0 // aus, TRACKING_RSSI, TRACKING_GPS, TRACKING_MKCOCKPIT
#define TRACKING_MAX 3
/* Antennen-Nachführung per RSSI */
#define TRACKING_HYSTERESE 40 // Hysterese bevor Tracking bei Richtungswechsel anspricht
#define TRACKING_HYST_MIN 0
#define TRACKING_HYST_MAX 100
/* MK Akku-Kapazität */
#define AKKU_NR_MIN 0
#define AKKU_NR_MAX 9
#define AKKU_CAPACITY 2500 // in mAh für Ermittlung verbleibende Flugzeit
#define AKKU_CAPACITY_MIN 1000
#define AKKU_CAPACITY_MAX 6000
#define MK_I_OFFSET 8 // Standart 0
#define MK_I_OFFSET_MIN 0 // -0.5
#define MK_I_OFFSET_MAX 20
#define MK_I_OFFSET_5 5 // entspricht -0.5
#define MK_I_FAKTOR 80
#define MK_I_FAKTOR_MIN 30 // Angabe * 100
#define MK_I_FAKTOR_MAX 200
#define MK_W_FAKTOR 80
#define MK_W_FAKTOR_MIN 30
#define MK_W_FAKTOR_MAX 200
 
#endif /* CONFIG_H_ */
/NGVideo5_8/tags/v1.21/dogm.c
0,0 → 1,247
 
/****************************************************************/
/* */
/* NG-Video 5,8GHz */
/* */
/* Copyright (C) 2011 - gebad */
/* */
/* This code is distributed under the GNU Public License */
/* which can be found at http://www.gnu.org/licenses/gpl.txt */
/* */
/* using DOGM-Library 1.0. */
/* Copyright (C) 2010-averyfarwaydate Luca Bertoncello */
/* Hartigstrasse, 12 - 01127 Dresden Deutschland */
/* E-Mail: lucabert@lucabert.de, lucabert@lucabert.com */
/* http://www.lucabert.de/ http://www.lucabert.com/ */
/****************************************************************/
 
#include <util/delay.h>
 
#include "config.h"
#include "dogm.h"
#include <avr/pgmspace.h>
 
// Instruktionen mit ST7036 4 Bit Mode im "Extension mode"
#define CLEAR_DISPLAY 0b00000001
#define FUNCTION_SET_INIT_0 0b00110011 // 0x30 & 0x30 als nibble
#define FUNCTION_SET_INIT_1 0b00110010 // 0x30 & 0x20 als nibble
#define FUNCTION_SET_INIT_2 0b00101001 // 0x29 4-bit, 2 Zeilen, kein DoubleHeight, InstructionTable1
#define INSTRUCTION_Table_0 0b00101000 // Instruction table 0
#define INSTRUCTION_Table_1 0b00101001 // Instruction table 1
#define SET_CGRAM 0b01000000 // für user defined Char
#define BIAS_SET 0b00010101 // table 1 DB3=Bias 1/4, DB0=3 Zeilen 0b00011101
#define FOLLOWER_CONTROL 0b01101110 // nach Datenblattbsp. 3,3V DOGM bei 5V 0b01101100
#define CONTRAST_SET 0b01110000 // Kontrastwert Bit3 bis Bit0
#define POWER_CONTRAST 0b01010100 // Bit1 und Bit0 entspricht Kontrastwert Bit5 und Bit4 3,3V 0b0101 0100 5V 0b0101 0000
#define DISPLAY_ON 0b00001100
#define ENTRY_MODE 0b00000110 // Cursor Auto-Increment
#define SET_DDRAM_ADDR 0b10000000 // Bit7 bis Bit0 Adresse
#define BS 3 // 0 - 1/5 bias // 1 - 1/4 bias
#define RAB1 1 // select follower amplified ratio
#define BON 2 // set booster circuit on/off bei Power_Contrast
 
#define lcdSetEnable() LCD_E_PORT |= (1<<LCD_ENABLE);
#define lcdClearEnable() LCD_E_PORT &= ~(1<<LCD_ENABLE);
#define lcdSetRegSelect() LCD_RS_PORT |= (1<<LCD_REGSELECT)
#define lcdClearRegSelect() LCD_RS_PORT &= ~(1<<LCD_REGSELECT)
 
 
 
/************************************************************************/
/* Definieren eines Sonderzeichen */
/* Parameter: */
/* uint8_t lcd_addr : Adresse, 1.Adresse 0 */
/* char *lcd_zeichen: Zeiger auf das 1. Byte der Zeichendefinition */
/* */
/************************************************************************/
void lcdWriteCGRAM(uint8_t lcd_addr, char *lcdChr)
{ int8_t i;
 
lcdSendInstruction(INSTRUCTION_Table_0);
for(i = 0; i < 8; i++)
{
lcdSendInstruction(SET_CGRAM | (lcd_addr * 8 + i)); // CG RAM Adresse
//lcdPutc(lcdChr[i]); // Data Write 8x Pixelzeile
lcdPutc(pgm_read_byte(&lcdChr[i])); // array im Flash
}
lcdSendInstruction(INSTRUCTION_Table_1);
}
 
/************************************************************************/
/* Definieren von n <= 8 Sonderzeichen */
/* Parameter: */
/* SpecialChr_t lcdChr : Array mit Sonderzeichen */
/* uint8_t quantity : Anzahl der zu übertragenen Sonderzeichen */
/* */
/************************************************************************/
void lcdWriteCGRAM_Array(SpecialChr8_t lcdChr, uint8_t quantity)
{
for (uint8_t i = 0; i < quantity; i++)
lcdWriteCGRAM(i, lcdChr[i]); // Sonderzeichen in CGRAM der LCD schreiben
}
 
/************************************************************************************/
/* sendet ein Nibble (4 Bit) zum LCD-Controller */
/* Parameter: */
/* char data :Byte */
/* */
/************************************************************************************/
void lcdSendNibble(char data)
{
LCD_DATA_PORT |= (data & 0x0f);
LCD_DATA_PORT &= (data | 0xf0);
lcdSetEnable();
_delay_us(2);
lcdClearEnable();
_delay_us(30); // nach Datenblatt > 26,3µs
}
 
/************************************************************************************/
/* sendet 8 Bit (2 Nibble) zum LCD-Controller */
/* Parameter: */
/* char data :Byte */
/* */
/************************************************************************************/
void lcdSendByte(char data)
{
lcdSendNibble(data>>4);
lcdSendNibble(data);
}
 
/************************************************************************************/
/* sendet instruction zum LCD-Controller */
/* Parameter: */
/* char instruction :Byte */
/* */
/************************************************************************************/
void lcdSendInstruction(char instruction)
{
lcdClearRegSelect(); // LCD-RS für Instruktionen
lcdSendByte(instruction);
}
 
/************************************************************************************/
/* sendet ein Zeichen zum LCD-Display */
/* Parameter: */
/* char c :Zeichen */
/* */
/************************************************************************************/
void lcdPutc(char c)
{
lcdSetRegSelect(); // LCD-RS für Daten
lcdSendByte(c);
}
 
/************************************************************************************/
/* sendet einen String zum LCD-Display */
/* Parameter: */
/* char *str :Zeichenkette */
/* */
/************************************************************************************/
void lcdPuts(char *str)
{
uint8_t l;
uint8_t pos = 0;
 
for(l = 0; str[l] != 0; l++)
// funtioniert nur von Zeile 0 an, da aktuelle Zeile nicht bekannt! Kein read!
// man könnte pos bei lcdSendByte, lcdGotoXY und lcdClear abhängig von Steuerung mitzählen
if(str[l] == '\n')
{
if (pos >= LCD_LINES)
pos = 0;
else
pos++;
lcdGotoXY(0, pos);
}
else
lcdPutc(str[l]);
}
 
/************************************************************************************/
/* Löscht Inhalt auf LCD-Display */
/* */
/************************************************************************************/
void lcdClear()
{
lcdSendInstruction(CLEAR_DISPLAY);
_delay_ms(2);
}
 
/************************************************************************************/
/* Setzt Kontrast auf LCD-Display */
/* Parameter: */
/* uint8_t contrast :Wert vo 0 bis max 63 */
/* */
/************************************************************************************/
void lcdContrast(uint8_t dogm, uint8_t contrast)
{ uint8_t power_contrast = POWER_CONTRAST;
 
if(dogm == DOGM5V) {
power_contrast &= ~(1<<BON);
}
lcdSendInstruction(INSTRUCTION_Table_1);
lcdSendInstruction(CONTRAST_SET | (contrast & 0x0F));
lcdSendInstruction(power_contrast | ((contrast>>4) & 0x03));
}
 
//***********************************************************************************/
/* Setzt setzt den Cursor zur Position x/y */
/* Parameter: */
/* uint8_t x, :Position Spalte */
/* uint8_t y, :Position Zeile */
/* */
/************************************************************************************/
void lcdGotoXY(uint8_t x, uint8_t y)
{ uint8_t pos;
 
if(x > LCD_COLS) x = 0;
if(y > LCD_LINES) y = 0;
pos = y * LCD_COLS + x;
lcdSendInstruction(SET_DDRAM_ADDR | pos);
}
 
/************************************************************************************/
/* Initialisiert den LCD-Controller und der Atmega-Ausgänge */
/* Parameter: */
/* uint8_t dogm :0=3,3V oder 1=5V DOGM */
/* uint8_t contrast :Wert vo 0 bis max 63 */
/* uint8_t cursor :Darstellung des Cursors ein oder 0 aus */
/* uint8_t blink :Cursor blinken, 0 kein blinken */
/* */
/************************************************************************************/
void lcdInit(uint8_t dogm, uint8_t contrast, uint8_t cursor, uint8_t blink)
{ uint8_t bias_set = BIAS_SET;
uint8_t follower_ctrl = FOLLOWER_CONTROL;
uint8_t power_contrast = POWER_CONTRAST;
 
LCD_BACKLIGHT_DDR |= (1<<LCD_BACKLIGHT);
LCD_E_DDR |= (1<<LCD_ENABLE);
LCD_RS_DDR |= (1<<LCD_REGSELECT);
LCD_DATA_DDR |= (1<<LCD_DATA7) | (1<<LCD_DATA6) | (1<<LCD_DATA5) | (1<<LCD_DATA4);
 
lcdClearEnable();
_delay_ms(40); // lt. Datenblatt muss > 40ms nach Power On or ext. Reset
 
if(dogm == DOGM5V) {
follower_ctrl &= ~(1<<RAB1);
bias_set |= (1 << BS);
power_contrast &= ~(1<<BON);
}
 
//Initialisierung für DOGM (mit ST7036) 4 Bit Mode
lcdClearRegSelect(); // LCD-RS für Instruktionen
lcdSendNibble(FUNCTION_SET_INIT_0>>4);
_delay_ms(2); // lt. Datenblatt muss > 1,6ms Pause nach ersten Nibble
lcdSendNibble(FUNCTION_SET_INIT_0);
lcdSendInstruction(FUNCTION_SET_INIT_1);
lcdSendInstruction(FUNCTION_SET_INIT_2);
lcdSendInstruction(bias_set);
lcdSendInstruction(CONTRAST_SET | (contrast & 0x0F));
lcdSendInstruction(power_contrast | ((contrast>>4) & 0x03));
lcdSendInstruction(follower_ctrl);
lcdSendInstruction(INSTRUCTION_Table_0);
lcdSendInstruction(DISPLAY_ON | (cursor & 0x01) << 1 | (blink & 0x01));
lcdClear();
lcdSendInstruction(ENTRY_MODE);
}
/NGVideo5_8/tags/v1.21/dogm.h
0,0 → 1,44
 
/****************************************************************/
/* */
/* NG-Video 5,8GHz */
/* */
/* Copyright (C) 2011 - gebad */
/* */
/* This code is distributed under the GNU Public License */
/* which can be found at http://www.gnu.org/licenses/gpl.txt */
/* */
/* using DOGM-Library 1.0. */
/* Copyright (C) 2010-averyfarwaydate Luca Bertoncello */
/* Hartigstrasse, 12 - 01127 Dresden Deutschland */
/* E-Mail: lucabert@lucabert.de, lucabert@lucabert.com */
/* http://www.lucabert.de/ http://www.lucabert.com/ */
/****************************************************************/
 
#ifndef DOGM_H_
#define DOGM_H_
 
#include <avr/io.h>
 
#define DOGM3V 0 // 3,3V DOGM
#define DOGM5V 1 // 5V DOGM
 
typedef char SpecialChr5_t[5][8];
typedef char SpecialChr7_t[7][8];
typedef char SpecialChr8_t[8][8];
 
void lcdWriteCGRAM(uint8_t lcd_addr, char *lcdChr); // write a char string to CGRAM
void lcdWriteCGRAM_Array(SpecialChr8_t lcdChr, uint8_t quantity); // write a array of char string to CGRAM
void lcdSendByte(char data);
void lcdSendInstruction(char instruction);
void lcdPutc(char c);
void lcdPuts(char *str);
void lcdClear(void);
void lcdContrast(uint8_t dogm, uint8_t contrast);
void lcdGotoXY(uint8_t x, uint8_t y);
void lcdInit(uint8_t dogm, uint8_t contrast, uint8_t cursor, uint8_t blink);
 
#define lcdBacklightOn() LCD_BACKLIGHT_PORT |= (1<<LCD_BACKLIGHT);
#define lcdBacklightOff() LCD_BACKLIGHT_PORT &= ~(1<<LCD_BACKLIGHT);
 
#endif /* DOGM_H_ */
/NGVideo5_8/tags/v1.21/keys.c
0,0 → 1,135
 
/************************************************************************/
/* */
/* Debouncing 8 Keys */
/* Sampling 4 Times */
/* With Repeat Function */
/* */
/* Author: Peter Dannegger */
/* danni@specs.de */
/* */
/* ergänzt: gebad, beschschleunigende Tastenwiederholung */
/* */
/************************************************************************/
 
#include <stdint.h>
#include <avr/io.h>
#include <avr/interrupt.h>
 
#include "keys.h"
#include "config.h"
 
ISR( TIMER0_OVF_vect ) // every 10ms
{
static uint8_t ct0, ct1, rpt, timer0_1, timer0_2, timer0_3, timer0_4;
static uint16_t timer0_5 = TIMER0_5;
uint8_t i, key_pin;
 
TCNT0 = 256 - (F_CPU / 1024 * 10e-3) + 0.5; // preload for 10ms 8bit-Timer
 
key_pin = (KEY_MP_PIN & ( (1<<KEY_MINUS) | (1<<KEY_PLUS)));
key_pin |= (KEY_ENTER_PIN & (1<<KEY_ENTER)) >> 2;// move enter bit to sw_enter bit
i = key_state ^ ~key_pin; // key changed ?
ct0 = ~( ct0 & i ); // reset or count ct0
ct1 = ct0 ^ (ct1 & i); // reset or count ct1
i &= ct0 & ct1; // count until roll over ?
key_state ^= i; // then toggle debounced state
key_press |= key_state & i; // 0->1: key press detect
if (key_press & REPEAT_MASK) { // da bei mir alle Tasten in REPEAT_MASK
light_count = 0; // wenn keine Taste gedrückt beginnt Zähler für Hintergrundbeleuchtung aus
timer0_5 = TIMER0_5;
}
if( (key_state & REPEAT_MASK) == 0 ) { // check repeat function
rpt = REPEAT_START; // start delay
key_repeat_next = REPEAT_NEXT; // Wert bestimmt Tasten-Beschleunigung/-Wiederholrate beginnt, mit 200ms
key_counter = REPEAT_ACC_N; // wenn V_REPEAT, nach dem angegebenen Zeichen beschleunigen
}
if( --rpt == 0 ){
rpt = key_repeat_next; // repeat delay
key_rpt |= key_state & REPEAT_MASK;
}
if ( --timer0_1 == 0) {
timer0_1 = TIMER0_1;
task_timer0_1 = 1;
}
if ( --timer0_2 == 0) {
timer0_2 = TIMER0_2;
task_timer0_2 = 1;
}
if ( --timer0_3 == 0) {
timer0_3 = TIMER0_3;
task_timer0_3 = 1;
}
if ( --timer0_4 == 0) {
timer0_4 = TIMER0_4;
task_timer0_4 = 1;
}
if ( --timer0_5 == 0) {
timer0_5 = TIMER0_5;
task_timer0_5 = 1;
}
}
 
///////////////////////////////////////////////////////////////////
//
// check if a key has been pressed. Each pressed key is reported
// only once
//
uint8_t Get_Key_Press( uint8_t key_mask )
{
cli(); // read and clear atomic !
key_mask &= key_press; // read key(s)
key_press ^= key_mask; // clear key(s)
sei();
return key_mask;
}
 
///////////////////////////////////////////////////////////////////
//
// check if a key has been pressed long enough such that the
// key repeat functionality kicks in. After a small setup delay
// the key is reported beeing pressed in subsequent calls
// to this function. This simulates the user repeatedly
// pressing and releasing the key.
//
uint8_t Get_Key_Rpt( uint8_t key_mask )
{
cli(); // read and clear atomic !
key_mask &= key_rpt; // read key(s)
key_rpt ^= key_mask; // clear key(s)
sei();
return key_mask;
}
 
///////////////////////////////////////////////////////////////////
//
uint8_t Get_Key_Short( uint8_t key_mask )
{
cli(); // read key state and key press atomic !
return Get_Key_Press( ~key_state & key_mask );
}
 
///////////////////////////////////////////////////////////////////
//
uint8_t Get_Key_Long( uint8_t key_mask )
{
return Get_Key_Press( Get_Key_Rpt( key_mask ));
}
 
void Key_Speedup_rpt( uint8_t speedup )
{
if (speedup) {
if (key_counter > 0) { // nach x Zeichen wird Wiederholrate kontinuierlich erhöht
cli();
key_counter--;
sei();
}
else {
if (key_repeat_next > 3) { // Wert bestimmt die max. Beschleunigung/Wiederholrate
cli(); // kann jedoch nicht kleiner 10ms sein
key_repeat_next -= 2;
sei();
}
}
}
}
/NGVideo5_8/tags/v1.21/keys.h
0,0 → 1,43
 
/************************************************************************/
/* */
/* Debouncing 8 Keys */
/* Sampling 4 Times */
/* With Repeat Function */
/* */
/* Author: Peter Dannegger */
/* danni@specs.de */
/* */
/* ergänzt: gebad, beschschleunigende Tastenwiederholung */
/* */
/************************************************************************/
 
#ifndef KEYS_H_
#define KEYS_H_
 
#define REPEAT_START 50 // after 500ms
#define REPEAT_NEXT 20 // every 200ms
#define REPEAT_ACC_N 6 // wenn V_REPEAT, nach dem angegebenen Zeichen beschleunigen
 
volatile uint8_t key_state; // debounced and inverted key state:
// bit = 1: key pressed
volatile uint8_t key_press; // key press detect
volatile uint8_t key_rpt; // key long press and repeat
volatile uint8_t key_repeat_next;
volatile uint8_t key_counter;
 
volatile uint8_t task_timer0_1;
volatile uint8_t task_timer0_2;
volatile uint8_t task_timer0_3;
volatile uint8_t task_timer0_4;
volatile uint8_t task_timer0_5;
 
uint8_t Get_Key_Press( uint8_t key_mask );
uint8_t Get_Key_Rpt( uint8_t key_mask );
uint8_t Get_Key_Short( uint8_t key_mask );
uint8_t Get_Key_Long( uint8_t key_mask );
void Key_Speedup_rpt( uint8_t speedup );
 
volatile uint16_t light_count; // muss bei jeden Tastendruck auf 0 gesetzt werdwn
 
#endif /* KEYS_H_ */
/NGVideo5_8/tags/v1.21/main.c
0,0 → 1,111
 
/****************************************************************/
/* */
/* NG-Video 5,8GHz */
/* */
/* Copyright (C) 2011 - gebad */
/* */
/* This code is distributed under the GNU Public License */
/* which can be found at http://www.gnu.org/licenses/gpl.txt */
/* */
/****************************************************************/
 
#include <string.h>
#include <avr/interrupt.h>
 
#include "servo.h"
#include "config.h"
#include "dogm.h"
#include "keys.h"
#include "ngvideo.c"
#include "menue.c"
#include "usart.h"
 
 
int main(void)
{ uint8_t ep_reset = 1;
uint8_t val;
 
_delay_ms(100); // Einschaltstörungen unterdrücken
 
DDRB |= (1<<POWER);
PORTB &= ~(1<<POWER); //NOT(SHDN) LT1776
 
// switch init
KEY_MP_DDR &= ~((1<<KEY_MINUS) | (1<<KEY_PLUS));
KEY_ENTER_DDR &= ~((1<<KEY_ENTER));
// auf default rücksetzen - Tasten direkt lesen, da noch kein Interrupt
if( !(KEY_MP_PIN & ((1<<KEY_MINUS) | (1<<KEY_PLUS))))
--ep_reset;
 
Init_EEPROM(ep_reset);
 
// auf DOGM 5V/3,3V rück-/setzen - Tasten direkt lesen, da noch kein Interrupt
if(!((KEY_ENTER_PIN & (1<<KEY_ENTER)) || (KEY_MP_PIN & (1<<KEY_PLUS))))
Set_DOGM_Version();
 
DDRA |= (1<<CHANNel_12) | (1<<CHANNel_11) | (1<<CHANNel_10) | (1<<MUX_IN) | (1<<MUX_EN);
DDRB |= (1<<BEEPER) | (1<<CHANNel_02) | (1<<CHANNel_01) | (1<<CHANNel_00);
Set_Channel(channel);
ch_stored = channel;
PORTA &= ~(1<<MUX_EN); // MUX enable
 
ADC_Init();
// Timer 0 für Tasten und Anzeigen(Task's)
TCCR0B = (1<<CS02)|(1<<CS00); // divide by 1024
TIMSK0 |= 1<<TOIE0; // 8 bit Timer/Counter0 Overflow Interrupt aktiviert
 
// Timer 2 für Diversity vSync und GPS-Tracking MK Datensatz senden
TCCR2B = (1<<CS21) | (1<<CS20); // divide by 64
TIMSK2 |= 1<<TOIE2; // 8 bit Timer/Counter2 Overflow Interrupt aktiviert
 
// Interrupt für sync - RX-Umschaltung bei Diversity
DDRD &= ~((1<<VSYNC1) | (1<<VSYNC0));
//EICRA |= (1<<ISC11) | (1<<ISC10) | (1<<ISC01) | (1<<ISC00);// interrupt on INT0 and INT1 pin rising edge
EICRA |= (1<<ISC11) | (1<<ISC01); // interrupt on INT0 and INT1 pin falling edge
Set_AV_Source(av_source); // MUX auf av-x setzen; EIMSK Int0 und Int1 für Sync-Diversity ein
 
DDRD |= (1<<SERVO1) | (1<<SERVO2); // Servoports als Ausgang
if (tracking > TRACKING_MIN) // Servos sind nur bei Tracking und Servokalibrierung zugeschaltet
servoInit(SERVO_PERIODE);
 
// LCD init
lcdInit(dogm_vers, contrast, 0, 0);
lcd_BackgrLight_On();
lcdWriteCGRAM_Array(lcdSpecialChr, 7);
 
Displ_Version();
Double_Beep(DBEEPVERS, DBEEPVERSP);
 
sei();
 
if (language == NO_LANGUAGE) {
language = GERMAN; // Beim Einschalten pmenu[] vordefiniert mit "0"
Menu_Language();
}
pmenu[0] = '\0'; // falls GPS-Antennennachführung ==> Empfang blinken
 
Displ_Main_Disp();
 
while(1)
{
if (pmenu[0] == '\0') { // nur wegen Menu_MK_BatteryChangeNr()
Task_0_1();
Task_0_2();
}
Tasks_unvisible();
if (bat_low != 0) {
if (Get_Key_Short( 1<<SW_ENTER )) {
m_pkt = 1; // 0 wäre "zurück", so aber ins Untermenü immer erster Menüpunkt
Menu_Main();
}
val = Change_Value_plmi(channel, CHANNEL_MIN, CHANNEL_MAX, 0, 0, Displ_Channels, 1, C_REPEAT);
if (val != channel) { // nicht bei jeden Schleifendurchlauf Set_Channel()
channel = val;
Set_Channel(channel);
}
}
}
}
/NGVideo5_8/tags/v1.21/makefile
0,0 → 1,411
# WinAVR Sample makefile written by Eric B. Weddington, Jörg Wunsch, et al.
# Released to the Public Domain
# Please read the make user manual!
#
# Additional material for this makefile was submitted by:
# Tim Henigan
# Peter Fleury
# Reiner Patommel
# Sander Pool
# Frederik Rouleau
# Markus Pfaff
#
# On command line:
#
# make all = Make software.
#
# make clean = Clean out built project files.
#
# make coff = Convert ELF to AVR COFF (for use with AVR Studio 3.x or VMLAB).
#
# make extcoff = Convert ELF to AVR Extended COFF (for use with AVR Studio
# 4.07 or greater).
#
# make program = Download the hex file to the device, using avrdude. Please
# customize the avrdude settings below first!
#
# make filename.s = Just compile filename.c into the assembler code only
#
# To rebuild project do "make clean" then "make all".
#
 
# MCU name
MCU = atmega644
 
## 16500000 is for attiny45/85/461/861 only (RC+PLL mode)
#CLK = 12000000UL
#CLK = 15000000UL
#CLK = 16000000UL
#CLK = 16500000UL
CLK = 20000000UL
#CLK = 18432000UL
 
#Fuse settings for ATmega644
ifeq ($(MCU), atmega644)
FUSE_BITS = -u -U lfuse:w:0xef:m -U hfuse:w:0xd9:m -U efuse:w:0xfd:m
HEX_FILE_NAME = MEGA644
endif
 
# Output format. (can be srec, ihex, binary)
FORMAT = ihex
 
# Target file name (without extension).
TARGET = Hexfiles/NGVideo_$(HEX_FILE_NAME)
 
# Optimization level, can be [0, 1, 2, 3, s]. 0 turns off optimization.
# (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
OPT = s
 
# If there is more than one source file, append them above, or modify and
# uncomment the following:
SRC = main.c dogm.c keys.c servo.c usart.c
 
 
# List Assembler source files here.
# Make them always end in a capital .S. Files ending in a lowercase .s
# will not be considered source files but generated files (assembler
# output from the compiler), and will be deleted upon "make clean"!
# Even though the DOS/Win* filesystem matches both .s and .S the same,
# it will preserve the spelling of the filenames, and gcc itself does
# care about how the name is spelled on its command-line.
ASRC =
 
 
# List any extra directories to look for include files here.
# Each directory must be seperated by a space.
EXTRAINCDIRS =
 
 
# Optional compiler flags.
# -g: generate debugging information (for GDB, or for COFF conversion)
# -O*: optimization level
# -f...: tuning, see gcc manual and avr-libc documentation
# -Wall...: warning level
# -Wa,...: tell GCC to pass this to the assembler.
# -ahlms: create assembler listing
CFLAGS = -g -O$(OPT) \
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums \
-Wall -Wstrict-prototypes \
-Wa,-adhlns=$(<:.c=.lst) \
$(patsubst %,-I%,$(EXTRAINCDIRS))
 
 
# Set a "language standard" compiler flag.
# Unremark just one line below to set the language standard to use.
# gnu99 = C99 + GNU extensions. See GCC manual for more information.
#CFLAGS += -std=c89
#CFLAGS += -std=gnu89
#CFLAGS += -std=c99
CFLAGS += -std=gnu99
 
 
 
# Optional assembler flags.
# -Wa,...: tell GCC to pass this to the assembler.
# -ahlms: create listing
# -gstabs: have the assembler create line number information; note that
# for use in COFF files, additional information about filenames
# and function names needs to be present in the assembler source
# files -- see avr-libc docs [FIXME: not yet described there]
ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs
 
 
 
# Optional linker flags.
# -Wl,...: tell GCC to pass this to linker.
# -Map: create map file
# --cref: add cross reference to map file
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref
 
 
 
# Additional libraries
 
# Minimalistic printf version
#LDFLAGS += -Wl,-u,vfprintf -lprintf_min
 
# Floating point printf version (requires -lm below)
#LDFLAGS += -Wl,-u,vfprintf -lprintf_flt
 
# -lm = math library
LDFLAGS += -lm
 
 
 
 
# Programming support using avrdude. Settings and variables.
 
# Programming hardware: alf avr910 avrisp bascom bsd
# dt006 pavr picoweb pony-stk200 sp12 stk200 stk500
#
# Type: avrdude -c ?
# to get a full listing.
#
 
#AVRDUDE_PROGRAMMER = AVR910
#AVRDUDE_PROGRAMMER = stk200
AVRDUDE_PROGRAMMER = USBasp
 
AVRDUDE_PORT = usb # programmer connected to USB port
#AVRDUDE_PORT = com1 # programmer connected to serial device
#AVRDUDE_PORT = lpt1 # programmer connected to parallel port
 
AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex $(FUSE_BITS)
AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep
 
#AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -b 115200 -c $(AVRDUDE_PROGRAMMER)
AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
 
# Uncomment the following if you want avrdude's erase cycle counter.
# Note that this counter needs to be initialized first using -Yn,
# see avrdude manual.
#AVRDUDE_ERASE += -y
 
# Uncomment the following if you do /not/ wish a verification to be
# performed after programming the device.
#AVRDUDE_FLAGS += -V
 
# Increase verbosity level. Please use this when submitting bug
# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude>
# to submit bug reports.
#AVRDUDE_FLAGS += -v -v
 
 
 
 
# ---------------------------------------------------------------------------
 
# Define directories, if needed.
DIRAVR = c:/WinAVR-20090313
DIRAVRBIN = $(DIRAVR)/bin
DIRAVRUTILS = $(DIRAVR)/utils/bin
DIRINC = .
DIRLIB = $(DIRAVR)/avr/lib
 
 
# Define programs and commands.
SHELL = sh
 
CC = avr-gcc
 
OBJCOPY = avr-objcopy
OBJDUMP = avr-objdump
SIZE = avr-size
 
 
# Programming support using avrdude.
AVRDUDE = avrdude
 
 
REMOVE = rm -f
COPY = cp
 
HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex
ELFSIZE = $(SIZE) -A $(TARGET).elf
 
 
 
# Define Messages
# English
MSG_ERRORS_NONE = Errors: none
MSG_BEGIN = -------- begin --------
MSG_END = -------- end --------
MSG_SIZE_BEFORE = Size before:
MSG_SIZE_AFTER = Size after:
MSG_COFF = Converting to AVR COFF:
MSG_EXTENDED_COFF = Converting to AVR Extended COFF:
MSG_FLASH = Creating load file for Flash:
MSG_EEPROM = Creating load file for EEPROM:
MSG_EXTENDED_LISTING = Creating Extended Listing:
MSG_SYMBOL_TABLE = Creating Symbol Table:
MSG_LINKING = Linking:
MSG_COMPILING = Compiling:
MSG_ASSEMBLING = Assembling:
MSG_CLEANING = Cleaning project:
 
 
 
 
# Define all object files.
OBJ = $(SRC:.c=.o) $(ASRC:.S=.o)
 
# Define all listing files.
LST = $(ASRC:.S=.lst) $(SRC:.c=.lst)
 
# Combine all necessary flags and optional flags.
# Add target processor to flags.
ALL_CFLAGS = -mmcu=$(MCU) -DF_CPU=$(CLK) -I. $(CFLAGS)
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)
 
 
 
# Default target.
all: begin gccversion sizebefore $(TARGET).elf $(TARGET).hex $(TARGET).eep \
$(TARGET).lss $(TARGET).sym sizeafter finished end
 
 
# Eye candy.
# AVR Studio 3.x does not check make's exit code but relies on
# the following magic strings to be generated by the compile job.
begin:
@echo
@echo $(MSG_BEGIN)
 
finished:
@echo $(MSG_ERRORS_NONE)
 
end:
@echo $(MSG_END)
@echo
 
 
# Display size of file.
sizebefore:
@if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); echo; fi
 
sizeafter:
@if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); echo; fi
 
 
 
# Display compiler version information.
gccversion :
@$(CC) --version
 
 
 
 
# Convert ELF to COFF for use in debugging / simulating in
# AVR Studio or VMLAB.
COFFCONVERT=$(OBJCOPY) --debugging \
--change-section-address .data-0x800000 \
--change-section-address .bss-0x800000 \
--change-section-address .noinit-0x800000 \
--change-section-address .eeprom-0x810000
 
 
coff: $(TARGET).elf
@echo
@echo $(MSG_COFF) $(TARGET).cof
$(COFFCONVERT) -O coff-avr $< $(TARGET).cof
 
 
extcoff: $(TARGET).elf
@echo
@echo $(MSG_EXTENDED_COFF) $(TARGET).cof
$(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof
 
 
 
 
# Program the device.
program: $(TARGET).hex $(TARGET).eep
$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM)
 
 
 
 
# Create final output files (.hex, .eep) from ELF output file.
%.hex: %.elf
@echo
@echo $(MSG_FLASH) $@
$(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@
 
%.eep: %.elf
@echo
@echo $(MSG_EEPROM) $@
-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
--change-section-lma .eeprom=0 -O $(FORMAT) $< $@
 
# Create extended listing file from ELF output file.
%.lss: %.elf
@echo
@echo $(MSG_EXTENDED_LISTING) $@
$(OBJDUMP) -h -S $< > $@
 
# Create a symbol table from ELF output file.
%.sym: %.elf
@echo
@echo $(MSG_SYMBOL_TABLE) $@
avr-nm -n $< > $@
 
 
 
# Link: create ELF output file from object files.
.SECONDARY : $(TARGET).elf
.PRECIOUS : $(OBJ)
%.elf: $(OBJ)
@echo
@echo $(MSG_LINKING) $@
$(CC) $(ALL_CFLAGS) $(OBJ) --output $@ $(LDFLAGS)
 
 
# Compile: create object files from C source files.
%.o : %.c
@echo
@echo $(MSG_COMPILING) $<
$(CC) -c $(ALL_CFLAGS) $< -o $@
 
 
# Compile: create assembler files from C source files.
%.s : %.c
$(CC) -S $(ALL_CFLAGS) $< -o $@
 
 
# Assemble: create object files from assembler source files.
%.o : %.S
@echo
@echo $(MSG_ASSEMBLING) $<
$(CC) -c $(ALL_ASFLAGS) $< -o $@
 
 
 
 
 
 
# Target: clean project.
clean: begin clean_list finished end
 
clean_list :
@echo
@echo $(MSG_CLEANING)
# $(REMOVE) $(TARGET).hex
$(REMOVE) $(TARGET).eep
$(REMOVE) $(TARGET).obj
$(REMOVE) $(TARGET).cof
$(REMOVE) $(TARGET).elf
$(REMOVE) $(TARGET).map
$(REMOVE) $(TARGET).obj
$(REMOVE) $(TARGET).a90
$(REMOVE) $(TARGET).sym
$(REMOVE) $(TARGET).lnk
$(REMOVE) $(TARGET).lss
$(REMOVE) $(OBJ)
$(REMOVE) $(LST)
$(REMOVE) $(SRC:.c=.s)
$(REMOVE) $(SRC:.c=.d)
 
 
# Automatically generate C source code dependencies.
# (Code originally taken from the GNU make user manual and modified
# (See README.txt Credits).)
#
# Note that this will work with sh (bash) and sed that is shipped with WinAVR
# (see the SHELL variable defined above).
# This may not work with other shells or other seds.
#
%.d: %.c
set -e; $(CC) -MM $(ALL_CFLAGS) $< \
| sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > $@; \
[ -s $@ ] || rm -f $@
 
 
# Remove the '-' if you want to see the dependency files generated.
-include $(SRC:.c=.d)
 
 
 
# Listing of phony targets.
.PHONY : all begin finish end sizebefore sizeafter gccversion coff extcoff \
clean clean_list program
 
/NGVideo5_8/tags/v1.21/menue.c
0,0 → 1,1795
 
/****************************************************************/
/* */
/* NG-Video 5,8GHz */
/* */
/* Copyright (C) 2011 - gebad */
/* */
/* This code is distributed under the GNU Public License */
/* which can be found at http://www.gnu.org/licenses/gpl.txt */
/* */
/****************************************************************/
 
#include <util/delay.h>
 
#include "config.h"
#include "ngvideo.h"
#include "keys.h"
#include "menue.h"
#include "servo.h"
#include "messages.c"
 
typedef uint8_t scr_menu_t[SCROLL_MAIN_MAX + 3]; // einmal, da Index mit 0 beginnt plus Vergrößerung für 2 zusätzlich eingeblendete Punkte
uint8_t m_pkt; // um bei Rücksprung auf ursprünglichen Arrayeintrag(Menüpunkt), Scroll_Menu zeigen
uint8_t servo_nr; // zwischen Servo 1 und 2 wird nur mit global servo_nr unterschieden
uint8_t chrxs; // zum Laden lcdSpecialChrLs oder lcdSpecialChrRs
 
// Menügliederung im Flash belassen
const char cmdStr0[] PROGMEM = "0";
const char cmdStr01[] PROGMEM = "01";
const char cmdStr02[] PROGMEM = "02";
const char cmdStr03[] PROGMEM = "03";
const char cmdStr031[] PROGMEM = "031";
const char cmdStr032[] PROGMEM = "032";
const char cmdStr033[] PROGMEM = "033";
const char cmdStr04[] PROGMEM = "04";
const char cmdStr05[] PROGMEM = "05";
const char cmdStr051[] PROGMEM = "051";
const char cmdStr052[] PROGMEM = "052"; // zwischen Servo 1 und 2 wird danach
const char cmdStr0521[] PROGMEM = "0521"; // mit global servo_nr unterschieden
const char cmdStr0522[] PROGMEM = "0522";
const char cmdStr0523[] PROGMEM = "0523";
const char cmdStr0524[] PROGMEM = "0524";
const char cmdStr053[] PROGMEM = "053";
const char cmdStr0531[] PROGMEM = "0531";
const char cmdStr0532[] PROGMEM = "0532";
const char cmdStr0533[] PROGMEM = "0533";
const char cmdStr0534[] PROGMEM = "0534";
const char cmdStr06[] PROGMEM = "06";
const char cmdStr061[] PROGMEM = "061";
const char cmdStr062[] PROGMEM = "062";
const char cmdStr0621[] PROGMEM = "0621";
const char cmdStr0622[] PROGMEM = "0622";
const char cmdStr0623[] PROGMEM = "0623";
const char cmdStr0624[] PROGMEM = "0624";
const char cmdStr0625[] PROGMEM = "0625";
const char cmdStr063[] PROGMEM = "063";
const char cmdStr064[] PROGMEM = "064";
const char cmdStr07[] PROGMEM = "07";
const char cmdStr071[] PROGMEM = "071";
const char cmdStr072[] PROGMEM = "072";
const char cmdStr08[] PROGMEM = "08";
const char cmdStr081[] PROGMEM = "081";
const char cmdStr082[] PROGMEM = "082";
const char cmdStr083[] PROGMEM = "083";
const char cmdStr0831[] PROGMEM = "0831";
const char cmdStr0832[] PROGMEM = "0832";
const char cmdStr0833[] PROGMEM = "0833";
const char cmdStr0834[] PROGMEM = "0834";
const char cmdStr0835[] PROGMEM = "0835";
const char cmdStr09[] PROGMEM = "09";
const char cmdStr0d[] PROGMEM = "0:"; // wird nur bei Tracking RSSI oder GPS eingeblendet - SCROLL_MAIN_MAX wird geändert
const char cmdStr0e[] PROGMEM = "0;"; // wird nur bei Tracking GPS eingeblendet - SCROLL_MAIN_MAX wird geändert
const char cmdStr0e1[] PROGMEM = "0;1"; // nach '9' (0x39) folgt ':' (0x3a) ';' (0x3b)
const char cmdStr0e2[] PROGMEM = "0;2";
const char cmdStr0e3[] PROGMEM = "0;3";
const char cmdStr0e4[] PROGMEM = "0;4";
const char cmdStr0e5[] PROGMEM = "0;5";
 
command_table_t command_table[] PROGMEM = // Befehls-Tabelle
{
{cmdStr0, Menu_Main},
{cmdStr01, Menu_AV_Source},
{cmdStr02, Menu_RX_Channel},
{cmdStr03, Menu_RSSI_Calibr},
{cmdStr031, Menu_RSSI_min},
{cmdStr032, Menu_RSSI_min_all},
{cmdStr033, Menu_RSSI_max},
{cmdStr04, Menu_Language},
{cmdStr05, Menu_Servo_Calibr},
{cmdStr051, Menu_Servo_Steps},
{cmdStr052, Menu_Servo1}, // zwischen Servo 1 und 2 wird danach
{cmdStr0521, Menu_Servo1_rev}, // mit global servo_nr unterschieden
{cmdStr0522, Menu_Servo1_left},
{cmdStr0523, Menu_Servo1_right},
{cmdStr0524, Menu_Servo1_middle},
{cmdStr053, Menu_Servo2},
{cmdStr0531, Menu_Servo2_rev},
{cmdStr0532, Menu_Servo2_left},
{cmdStr0533, Menu_Servo2_right},
{cmdStr0534, Menu_Servo2_middle},
{cmdStr06, Menu_Servo_Test},
{cmdStr061, Menu_Test_PulseWidth},
{cmdStr062, Menu_Test_Continuous},
{cmdStr0621, Menu_Test_Start},
{cmdStr0622, Menu_Test_SingleStep},
{cmdStr0623, Menu_Test_Repeat},
{cmdStr0624, Menu_Test_Pause},
{cmdStr0625, Menu_Test_Pause_Step},
{cmdStr063, Menu_Test_ServoNr},
{cmdStr064, Menu_Test_Frame},
{cmdStr07, Menu_lcd},
{cmdStr071, Menu_lcd_Contrast},
{cmdStr072, Menu_lcd_Backgr_Light},
{cmdStr08, Menu_Battery},
{cmdStr081, Menu_Low_U_Setup},
{cmdStr082, Menu_U_Offset},
{cmdStr083, Menu_MK_Battery},
{cmdStr0831, Menu_MK_BatteryNr},
{cmdStr0832, Menu_MK_BatteryCapacity},
{cmdStr0833, Menu_MK_I_Offset},
{cmdStr0834, Menu_MK_I_Faktor},
{cmdStr0835, Menu_MK_W_Faktor},
{cmdStr09, Menu_Tracking_Ant},
{cmdStr0d, Menu_Tracking_Option}, // wird nur bei Tracking RSSI oder GPS eingeblendet - SCROLL_MAIN_MAX wird geändert
{cmdStr0e, Menu_GPS_Display}, // wird nur bei Tracking GPS eingeblendet - SCROLL_MAIN_MAX wird geändert
{cmdStr0e1, Menu_GPS_Display_FLAG}, // nach '9' (0x39) folgt ':' (0x3a)
{cmdStr0e2, Menu_GPS_Display_FLAG},
{cmdStr0e3, Menu_GPS_Display_FLAG},
{cmdStr0e4, Menu_GPS_Display_FLAG},
{cmdStr0e5, Menu_GPS_Displ_RX_Time}
};
 
 
typedef void (*Displ_Fnct_t)( uint32_t );
uint32_t Change_Value(uint32_t val, uint32_t min_val, uint32_t max_val, uint8_t pos, Displ_Fnct_t Displ_Fnct, uint8_t vrepeat);
 
 
/**************************************************************/
/* */
/* Steuerung der Menüs */
/* */
/**************************************************************/
 
/************************************************************************************/
/* sucht nach übergebenen String in der Kommandotabelle und springt zum daneben */
/* stehenden Menü-Programm */
/* Parameter: */
/* char *pmenu :zu suchender String in Kommandotabelle */
/* */
/************************************************************************************/
void Jump_Menu(char *pmenu)
{ uint8_t i;
void (*func)(void);
 
if (pmenu[0] != '\0'){
for (i=0; i < sizeof(command_table) / sizeof(command_table_t); i++) {
// Ist das der gesuchte String?
if (!(strcmp_P(pmenu, (char*)pgm_read_word(&(command_table[i].menu_nr))))) {
func = (void(*)(void))pgm_read_word(&(command_table[i].fp));
func();
break;
}
}
}
}
 
/************************************************************************************/
/* */
/* Abfrage Short- oder Long-Enter */
/* verbleibt in Abfrage bis Enter betätigt; Rückgabe => Short-Enter True/False */
/* */
/************************************************************************************/
void Long_Enter(void)
{
Tasks_unvisible();
// falls Akku leer ==> Menü verlassen und Anzeige __ACCU_LOW
U_Messen_cmp(DISABLE_BTIMER);
if ((Get_Key_Long( 1<<SW_ENTER )) || (bat_low == 0)) pmenu[0] ='\0'; // direkt in das Hauptprogramm
}
 
uint8_t Short_Enter(void)
{ uint8_t ret;
 
// bis Short- oder Long-Enter, auch Akku leer
while( !Get_Key_Short( 1<<SW_ENTER ) && (pmenu[0] !='\0') && !exit_while) {
Long_Enter();
}
lcdClear();
if (pmenu[0] == '\0') Displ_Main_Disp(); else Beep(BEEPENTER); // bei ShortEnter Beep
ret = (pmenu[0] != '\0') && !exit_while;
exit_while = 0;
return(ret); // ShortEnter bringt 1 zurück
}
 
/************************************************************************************/
/* */
/* Unterprogramm vom Scroll_Menu(...) stellt Menüpunkte dar */
/* Parameter: */
/* scr_menu_t scr_menu : Array mit Strings der Menüanzeige */
/* uint8_t scr_idx : ausgewählter Menüpunkt */
/* uint8_t scroll_max: scrollen bis Wert */
/* */
/************************************************************************************/
void Displ_Scroll_Menu(scr_menu_t scr_menu, uint8_t scr_idx, uint8_t scroll_max)
{
uint8_t i;
const uint8_t p = 2; // LCD Beginn x-Position, 2 Zeichen rechts eingerückt
if (scr_idx > 0) scr_idx--; else scr_idx = scroll_max;
for (i = 0; i < LCD_LINES; i++) {
lcdGotoXY(p, i);
lcdPuts(Msg(scr_menu[scr_idx]));
// ab Stringende bis zum Zeilenende löschen; LCD löschen flackert sonst zu sehr
for (int8_t n = LCD_COLS - strlen(Msg(scr_menu[scr_idx])) - p; n > 0; n--)
lcdPutc(' ');
if (scr_idx < scroll_max) scr_idx++; else scr_idx = 0;
}
}
 
/************************************************************************************/
/* */
/* Unterprogramm vom Scroll_Menu(...) und Change_Value(...) */
/* bei Rücksprung auf ursprünglichen Menüpunkt zeigen */
/* Parameter: */
/* uint8_t l : Strinlänge von pmenue */
/* */
/************************************************************************************/
void return_m_pkt(uint8_t l)
{
if (l > 0) {
l--;
m_pkt = pmenu[l] - '0'; // um bei Rücksprung auf ursprünglichen Arrayeintrag(Menüpunkt) zeigen
pmenu[l] ='\0'; // auf letztes Zeichen Stringende schreiben
}
if (l == 0) Displ_Main_Disp();
}
 
/************************************************************************************/
/* */
/* scrollt Menü über Mehrzeilige LCD */
/* */
/* Taste<Enter> lang springt in Hauptanzeige, kurz geht in den angewälten Menüpunkt*/
/* Taste<+> eine Zeile nach oben */
/* Taste<-> eine Zeile nach unten */
/* Parameter: */
/* scr_menu_t scr_menu : Array mit Strings der Menüanzeige */
/* uint8_t scroll_max: scrollen bis Wert */
/* uint8_t scr_idx : Index für array von Displ_Scroll_Menu(...) */
/* */
/************************************************************************************/
void Scroll_Menu(scr_menu_t scr_menu, uint8_t scroll_max, uint8_t scr_idx)
{ uint8_t l;
 
// pmenu[1] == '\0' entspricht <wenn Hauptmenue>, da jetzt nur noch Servo x für Scrollemenue (rev,min,max,mid)
if ((pmenu[1] == '\0') && ((tracking == TRACKING_RSSI) || (tracking == TRACKING_GPS) || (tracking == TRACKING_MKCOCKPIT))) {
++scroll_max;
if (tracking == TRACKING_RSSI) scr_menu[scroll_max] = MSG_TRACK_SERVO_HYTERESE;
if (tracking == TRACKING_GPS) {
scr_menu[scroll_max] = MSG_TRACK_TX_OSD_DATA;
++scroll_max; // zusätzliche Anzeige zu GPS
}
if (tracking == TRACKING_MKCOCKPIT) scr_menu[scroll_max] = MSG_COM;
}
lcdClear();
lcdGotoXY(0, 1);
lcdPutc(MARKER_SELECT); // '>>'
Displ_Scroll_Menu(scr_menu, scr_idx, scroll_max);
// bis Menueeingabe bestätigt oder zum vorherigen Menue
while( !Get_Key_Short( 1<<SW_ENTER ) && (pmenu[0] !='\0') && !exit_while)
{
// >> Menueauswahl nach oben
if( Get_Key_Press( 1<<SW_PLUS ) || Get_Key_Rpt( 1<<SW_PLUS ))
{
if (scr_idx > 0) scr_idx--; else scr_idx = scroll_max;
Displ_Scroll_Menu(scr_menu, scr_idx, scroll_max);
}
// >> Menueauswahl nach unten
if( Get_Key_Press( 1<<SW_MINUS ) || Get_Key_Rpt( 1<<SW_MINUS ))
{
if (scr_idx < scroll_max) scr_idx++; else scr_idx = 0;
Displ_Scroll_Menu(scr_menu, scr_idx, scroll_max);
}
Long_Enter();
}
lcdClear();
if ((pmenu[0] =='\0'))
Displ_Main_Disp();
else
if (!exit_while) { // wegen Aufruf Menu_MK_BatteryChangeNr() in Task
l = strlen(pmenu);
if (scr_idx > 0) {
m_pkt = 1; // 0 wäre "zurück", so aber ins Untermenü immer erster Menüpunkt
pmenu[l] = scr_idx + '0'; // nächsten MenueIndex anhängen 1 oder 2 oder ...
pmenu[l + 1] ='\0';
Beep(BEEPENTER);
}
else {
return_m_pkt(l); // um bei Rücksprung auf ursprünglichen Menüpunkt zu zeigen oder Displ_Main_Disp()
}
}
else
m_pkt = scr_idx; // nach Task Menu_MK_BatteryChangeNr() wieder zum ursprünlichen Anzeigepunkt
exit_while = 0;
}
 
/************************************************************************************/
/* */
/* Ändern der Werte mit Tasten +,- und Anzeige */
/* z.B. für U-Offset, Batterie leer Eingabe ... */
/* */
/* Parameter: */
/* uint32_t val :zu ändernter Wert */
/* uint32_t min_val, max_val :min, max Grenze Wert ändern darf */
/* uint8_t posX, posY :Darstellung Wert xPos, YPos auf LCD */
/* Displ_Fnct_t Displ_Fnct :Index um variable Display Funktion aufzurufen */
/* uint8_t cycle :0 begrenzt Anzeige bei man_val, bzw. max_val */
/* :1 springt nach max_val auf min_val und umgedreht */
/* uint8_t vrepeat :beschleunigte Repeat-Funktion aus/ein */
/* uint32_t Change_Value_plmi(...) :Rückgabe geänderter Wert */
/* */
/************************************************************************************/
uint32_t Change_Value_plmi(uint32_t val, uint32_t min_val, uint32_t max_val, uint8_t posX, uint8_t posY, \
Displ_Fnct_t Displ_Fnct, uint8_t cycle, uint8_t vrepeat)
{
// >> Menueauswahl nach oben
if( Get_Key_Press( 1<<SW_PLUS ) || Get_Key_Rpt( 1<<SW_PLUS )){
if (val < max_val) {
val++;
Key_Speedup_rpt(vrepeat); // beschleunigte Repeat-Funktion
}
else
if (cycle) {
val = min_val;
}
lcdGotoXY(posX, posY); // lcd Position Wert
Displ_Fnct(val); // geänderten Wert darstellen, je nach Menüpunkt
}
// >> Menueauswahl nach unten
if( Get_Key_Press( 1<<SW_MINUS ) || Get_Key_Rpt( 1<<SW_MINUS )) {
if (val > min_val) {
val--;
Key_Speedup_rpt(vrepeat); // beschleunigte Repeat-Funktion
}
else
if (cycle) {
val = max_val;
}
lcdGotoXY(posX, posY); // noch einmal lcd Position, sonst zum Teil + und - gleichzeitig, Anzeige verrutscht
Displ_Fnct(val); // geänderten Wert darstellen, je nach Menüpunkt
}
return(val);
}
 
/************************************************************************************/
/* */
/* Ändern der Werte mit Tasten +,- repetierend; (long)Entertaste und Anzeige */
/* z.B. für U-Offset, Batterie leer Eingabe ... */
/* */
/* Parameter: */
/* uint32_t val :zu ändernter Wert */
/* uint32_t min_val, max_val :min, max Grenze Wert ändern darf */
/* uint8_t pos :Darstellung Wert xPos auf LCD */
/* Displ_Fnct_t Displ_Fnct :Index um variable Display Funktion aufzurufen */
/* uint8_t vrepeat :beschleunigte Repeat-Funktion aus/ein */
/* uint32_t Change_Value(...) :Rückgabe geänderter Wert */
/* */
/************************************************************************************/
uint32_t Change_Value(uint32_t val, uint32_t min_val, uint32_t max_val, uint8_t pos, Displ_Fnct_t Displ_Fnct, \
uint8_t vrepeat)
{ uint32_t tmp_val;
 
tmp_val = val;
lcdGotoXY(pos, ZLE_VAL); // Position Wert
Displ_Fnct(val); // initiale Wertdarstellung, je nach Menüpunkt
// bis Menueeingabe bestätigt oder zum vorherigen Menue
while( !Get_Key_Short( 1<<SW_ENTER ) && (pmenu[0] !='\0') && !exit_while)
{
val = Change_Value_plmi(val, min_val, max_val, pos, ZLE_VAL, Displ_Fnct, 0, vrepeat);
Long_Enter();
}
lcdClear();
if (exit_while) {
exit_while = 0;
val = tmp_val;
}
else
return_m_pkt(strlen(pmenu)); // um bei Rücksprung auf ursprünglichen Menüpunkt zeigen oder Displ_Main_Disp()
return(val);
}
 
 
/**************************************************************/
/* */
/* LCD-Darstellungen der Menüs */
/* Zur Unterstützung der Auswahl werden einige Einstellungen */
/* sofort ausgeführt. Z.B.: Kontrast, Servo-Endausschlag */
/* */
/**************************************************************/
 
/************************************************************************************/
/* stellt eine String mittig auf Display dar */
/* Parameter: */
/* char *str : darzustellende Zeichenkette */
/* uint8_t zle : Display-Zeile */
/* */
/************************************************************************************/
void Displ_Str_mid(char *str, uint8_t zle)
{ int8_t x;
 
lcdGotoXY(0,zle);
for (x = 0; x < LCD_COLS; x++) lcdPutc(' '); // Zeile löschen
x = (LCD_COLS - strlen(str))/2; // Array-String mittig schreiben
lcdGotoXY(x,zle);
lcdPuts(str);
}
 
/************************************************************************************/
/* zeigt Menü- * Überschrift * auf erste Zeile mittig auf Display an */
/* Parameter: */
/* uint8_t message : index (MSG_) der darzustellenden Zeichenkette */
/* */
/************************************************************************************/
void Displ_Title(uint8_t message)
{ uint8_t l;
uint8_t x = 0;
 
l = strlen(Msg(message));
if ( LCD_COLS > l) x = (LCD_COLS - l)/2;
if (x > 1) {
lcdGotoXY(x - 2, 0);
lcdPuts("* ");
lcdPuts(Msg(message));
lcdPutc(' ');
}
else {
lcdGotoXY(0, 0);
lcdPutc('*');
lcdGotoXY(x, 0);
lcdPuts(Msg(message));
lcdGotoXY(LCD_COLS - 1, 0);
}
lcdPutc('*');
}
 
/************************************************************************************/
/* zeigt bei Programmstart Firmware- und DOGM-Version auf Display an */
/* */
/************************************************************************************/
void Displ_Version(void)
{
lcdGotoXY(0, 0);
lcdPuts(Msg(MSG_VERSION1));
if (dogm_vers == DOGM3V)
lcdPuts(Msg(MSG_UHW33V));
else
lcdPuts(Msg(MSG_UHW5V));
lcdPuts(Msg(MSG_VERSION2));
delay_ms100x(30);
lcdClear();
}
 
/************************************************************************************/
/* zeigt auszuwählenden/-gewählten Kanal und Frequenz auf Display an */
/* Parameter: */
/* uint32_t k :Index anzuzeigender Wert = Kanal + 0x30 als Char, */
/* unint32_t wegen Vereinheitlichung f. Funktionsaufrauf */
/* */
/************************************************************************************/
void Displ_Channels(uint32_t k)
{ char *channels[] = {"5740", "5760","5780", "5800", "5820", "5840", "5860"};
 
lcdPutc(k+0x30);
lcdPuts(": ");
lcdPuts(channels[k-1]);
lcdPuts("MHz");
}
 
/************************************************************************************/
/* zeigt Source AV1, AV2 oder Diversity zur Auswahl auf Display an */
/* Parameter: */
/* uint32_t q :Index anzuzeigender Wert, */
/* unint32_t wegen Vereinheitlichung f. Funktionsaufrauf */
/* */
/************************************************************************************/
void Displ_AV_Source(uint32_t q)
{ uint8_t av_src_table[] = {MSG_AV1, MSG_AV2, MSG_DIVERSITY};
 
Displ_Str_mid(Msg(av_src_table[q]), ZLE_VAL);
}
 
/************************************************************************************/
/* zeigt Tracking-Varianten zur Auswahl auf Display an */
/* Parameter: */
/* uint32_t q :Index anzuzeigender Wert, */
/* unint32_t wegen Vereinheitlichung f. Funktionsaufrauf */
/* */
/************************************************************************************/
void Displ_sel_Tracking(uint32_t q)
{ uint8_t track_sel_table[] = {MSG_OFF, MSG_TRACK_RSSI, MSG_TRACK_GPS, MSG_TRACK_MKCOCKPIT};
 
Displ_Str_mid(Msg(track_sel_table[q]), ZLE_VAL);
}
 
/************************************************************************************/
/* zeigt Senden der OSD-Daten Anforderung zur Auswahl auf Display an */
/* Parameter: */
/* uint32_t q :Index anzuzeigender Wert, */
/* unint32_t wegen Vereinheitlichung f. Funktionsaufrauf */
/* */
/************************************************************************************/
void Displ_track_TX(uint32_t q)
{ uint8_t track_TX_table[] = {MSG_OFF, MSG_TRACK_TX_ON};
 
Displ_Str_mid(Msg(track_TX_table[q]), ZLE_VAL);
}
 
/************************************************************************************/
/* zeigt einen max. 3-stelligen Integerwert auf Display an */
/* Parameter: */
/* uint32_t val :anzuzeigender Wert, */
/* unint32_t wegen Vereinheitlichung f. Funktionsaufrauf */
/* */
/************************************************************************************/
void Displ_Format_Int(uint32_t val)
{
lcdPuts(my_itoa(val, 0, 3, 0, 0));
}
 
/************************************************************************************/
/* zeigt den Kontrastwert auf Display an mit sofortiger Änderung */
/* Parameter: */
/* uint32_t val :anzuzeigender Wert, */
/* unint32_t wegen Vereinheitlichung f. Funktionsaufrauf */
/* */
/************************************************************************************/
void Displ_Set_Contrast(uint32_t val)
{
Displ_Format_Int(val);
lcdContrast(dogm_vers, val);
}
 
/************************************************************************************/
/* zeigt die Zeit zur Abschaltung der LCD-Hintergrundbeleuchtung an */
/* Parameter: */
/* uint32_t val :anzuzeigender Wert, */
/* unint32_t wegen Vereinheitlichung f. Funktionsaufrauf */
/* */
/************************************************************************************/
void Displ_Backgr_Light(uint32_t val)
{ char str[5];
uint8_t l;
l = strlen(Msg(MSG_LIGHT)); // etwas Aufwand um Zeilenende sauber zu löschen
switch(val) {
case BACKGR_LIGHT_MIN : l += strlen(Msg(MSG_LIGHT_OFF));
lcdPuts(Msg(MSG_LIGHT_OFF));
break;
case BACKGR_LIGHT_MAX : l += strlen(Msg(MSG_LIGHT_ON));
lcdPuts(Msg(MSG_LIGHT_ON));
break;
default : itoa (val * 10, str, 10);
lcdPutc(' ');
lcdPuts(str);
lcdPuts(Msg(MSG_SEC));
l += 1 + strlen(str) + strlen(Msg(MSG_SEC));
}
l = LCD_COLS - l;
for (uint8_t x = 0; x < l; x++) lcdPutc(' '); // Zeilenende löschen
}
 
/************************************************************************************/
/* zeigt ein oder aus zur Auswahl auf Display an */
/* Parameter: */
/* uint32_t val :0 = aus oder 1 = ein, */
/* unint32_t wegen Vereinheitlichung f. Funktionsaufrauf */
/* */
/************************************************************************************/
void Displ_Off_On(uint32_t val)
{
if (val == 0) lcdPuts(Msg(MSG_OFF)); else lcdPuts(Msg(MSG_ON));
}
 
/************************************************************************************/
/* zeigt Servoschritte zur Auswahl auf Display an */
/* Parameter: */
/* uint32_t val :0 = 255 oder 1 = 1023, */
/* unint32_t wegen Vereinheitlichung f. Funktionsaufrauf */
/* */
/************************************************************************************/
void Displ_Servo_Steps(uint32_t val)
{ uint8_t servo_step_table[] = {MSG_STEPS_255, MSG_STEPS_1023};
 
Displ_Str_mid(Msg(servo_step_table[val]), ZLE_VAL);
}
 
/************************************************************************************/
/* zeigt Servo-Anschlagposition links auf Display an */
/* mit sofortiger Wirkung auf Servo */
/* Parameter: */
/* uint32_t val :anzuzeigender Wert, */
/* unint32_t wegen Vereinheitlichung f. Funktionsaufrauf */
/* */
/************************************************************************************/
void Displ_Servo_Min(uint32_t val)
{ uint16_t steps = 0;
 
Displ_Format_Int(val);
servoSet_min(servo_nr, val); // Wert setzen damit nachfolgend die
if (servo[servo_nr].rev) steps = ServoSteps();
servoSetPosition(servo_nr, steps); // Änderung direkt am Servo sichtbar ist
}
 
/************************************************************************************/
/* zeigt Servo-Anschlagposition rechts auf Display an */
/* mit sofortiger Wirkung auf Servo */
/* Parameter: */
/* uint32_t val :anzuzeigender Wert, */
/* unint32_t wegen Vereinheitlichung f. Funktionsaufrauf */
/* */
/************************************************************************************/
void Displ_Servo_Max(uint32_t val)
{ uint16_t steps = ServoSteps();
 
Displ_Format_Int(val);
servoSet_max(servo_nr, val); // Wert setzen damit nachfolgend die
if (servo[servo_nr].rev) steps = 0;
servoSetPosition(servo_nr, steps); // Änderung direkt am Servo sichtbar ist
}
 
/************************************************************************************/
/* zeigt Servo-Anschlagposition Mitte auf Display an */
/* mit sofortiger Wirkung auf Servo */
/* Parameter: */
/* uint32_t val :anzuzeigender Wert, */
/* unint32_t wegen Vereinheitlichung f. Funktionsaufrauf */
/* */
/************************************************************************************/
void Displ_Servo_Mid(uint32_t val)
{ int16_t mid_val;
mid_val = val - ServoSteps()/2;
lcdPuts(my_itoa(mid_val, 1, 3, 0, 0));
servoSet_mid(servo_nr, val); // Wert setzen damit nachfolgend die
servoSetPosition(servo_nr, ServoSteps()/2);// Änderung direkt am Servo sichtbar ist
}
 
/************************************************************************************/
/* zeigt zu testende Servonummer zur Auswahl auf Display an */
/* Parameter: */
/* uint32_t val :0 = Servo 1 oder 1 = Servo 2, */
/* unint32_t wegen Vereinheitlichung f. Funktionsaufrauf */
/* */
/************************************************************************************/
void Displ_ServoNr(uint32_t val)
{
if (val == 0) lcdPuts(Msg(MSG_SERVO1)); else lcdPuts(Msg(MSG_SERVO2));
}
 
 
/************************************************************************************/
/* zeigt Servoausschlag in ms, in % und als Bargraph auf Display an */
/* Parameter: */
/* int16_t PosProzent : aktuell eingestellte Position vom 0-Punkt (Mitte) aus */
/* int16_t range : maximaler absoluter Ausschlag vom 0-Punkt aus */
/* */
/************************************************************************************/
// leerer Rahmen für Bar
char* empty_Bar(void)
{ static char tmp_empty[LCD_COLS];
uint8_t i;
tmp_empty[0] = '\0';
for (i = 1; i < 15; i++)
tmp_empty[i] = '\x07';
tmp_empty[i] = '\x06';
return(tmp_empty);
}
 
void draw_bar(int16_t PosProzent, int16_t range, uint8_t zle)
{ int8_t i, sp_quad, sp_ch;
int8_t lz = 8;
char* bar;
bar = empty_Bar(); // leerer Rahmen für Bar
sp_quad = abs(PosProzent) * 7 / range;
 
sp_ch = (abs(PosProzent) -(range * sp_quad / 7)) * 35 / range; // Unterteilung Kästchen in 6 senkrechte Striche
if (sp_ch > 4) sp_ch = 4; // bei 28 (7*4) wäre keine Korrektur erforderlich aber so kontinuierlicher
if (PosProzent < 0){
lz -= sp_quad; // Position für volles Kästchen bei Linksausschlag
if (sp_ch > 0) bar[lz-1] = sp_ch; // vor erstes volles Kästchen Kästchenunterteilung schreiben
} // Unterteilung Kästchen der 4 senkrechte Striche nach Bar (0 und 5 entfallen)
else
if (sp_ch > 0) bar[lz+sp_quad] = sp_ch;// nach lezten vollen Kästchen Kästchenunterteilung schreiben
 
for (i = 0; i < sp_quad; i++)
bar[i+lz] = '\x05'; // volle Kästchen schreiben
lcdGotoXY(0,zle);
for (uint8_t i = 0; i < LCD_COLS; i++) lcdPutc(bar[i]);// kpl. Bar zum Display
}
 
uint16_t calc_range(int16_t PosProzent, int16_t min, int16_t max, int16_t mid)
{ uint16_t range;
 
if (PosProzent < 0) {
range = mid - min;
if (chrxs == CHRRS) { // falls Richtung geändert, anderen Zeichensatz laden
chrxs = CHRLS;
lcdWriteCGRAM_Array(lcdSpecialChrLs, 5);// LCD-Char mit Rahmensymbole vom Graph
}
}
else {
range = max - mid;
if (chrxs == CHRLS) { // falls Richtung geändert, anderen Zeichensatz laden
lcdWriteCGRAM_Array(lcdSpecialChrRs, 5);// LCD-Char mit Rahmensymbole vom Graph
chrxs = CHRRS;
}
}
return(range);
}
 
void Displ_PulseWidth(uint32_t val)
{ int16_t PosProzent, range;
uint16_t Pos_us;
char me[3] = {"ms"};
 
servoSetPositionRaw(servo_nr, val);
PosProzent = val - steps_pw[sIdxSteps].mid;
range = calc_range(PosProzent, steps_pw[sIdxSteps].min, steps_pw[sIdxSteps].max, steps_pw[sIdxSteps].mid);
draw_bar(PosProzent, range, 2); // auf 3. Display-Zeile
PosProzent = (int32_t)1000 * PosProzent / range;
lcdGotoXY(1, 1);
Pos_us = pw_us(val); // Zeit in µs bei x Servoschritte
if (Pos_us < 1000) {
me[0] = 'u'; // soll 'µ' => programmierbarer Zeichensatz zu klein
lcdPuts(" ");
lcdPuts(my_itoa(Pos_us, 0, 3, 0, 0));
}
else {
lcdPuts(my_itoa(Pos_us, 0, 5, 3, 3));
}
lcdPuts(me);
lcdGotoXY(8, 1);
lcdPuts(my_itoa(PosProzent, 1, 5, 1, 1));
lcdPutc('%');
}
 
/************************************************************************************/
/* zeigt Pausenlänge der Links-, Miettel- und Rechtsposition auf Display an */
/* Parameter: */
/* uint32_t val : Zeit in 1ms * 100 */
/* */
/************************************************************************************/
void Displ_Pause(uint32_t val)
{
if (val > 9) {
lcdPuts(my_itoa(val, 0, 3, 1, 1));
lcdPuts("s ");
}
else {
lcdPuts(my_itoa(val * 100, 0, 3, 0, 0));
lcdPuts("ms");
}
}
 
/************************************************************************************/
/* zeigt aus oder Integerwert auf Display an */
/* Parameter: */
/* uint32_t val : val = 0 ==> aus, sont Integerwert */
/* */
/************************************************************************************/
void Displ_Off_Format_Int(uint32_t val)
{
if (val == 0)
Displ_Str_mid(Msg(MSG_OFF), ZLE_VAL);
else {
lcdGotoXY(5,ZLE_VAL);
Displ_Format_Int(val);
lcdPutc(' ');
}
}
 
/************************************************************************************/
/* zeigt aus oder Pausenzeit zwischen 2 Servoschritte auf Display an */
/* Parameter: */
/* uint32_t val : val = 0 ==> aus, sont Integerwert */
/* */
/************************************************************************************/
void Displ_Pause_Step(uint32_t val)
{
Displ_Off_Format_Int(val);
if (val > 0) {
lcdGotoXY(8,ZLE_VAL);
lcdPuts("ms");
}
}
/************************************************************************************/
/* zeigt Baudrate für COM bei MKCockpit zur Auswahl auf Display an */
/* Parameter: */
/* uint32_t q :Index anzuzeigender Wert, */
/* unint32_t wegen Vereinheitlichung f. Funktionsaufrauf */
/* */
/************************************************************************************/
void Displ_Baudrate(uint32_t q)
{ char str[7];
 
ltoa(baud[q], str, 10);
Displ_Str_mid(str, ZLE_VAL);
}
 
void Displ_TimeHMS(uint32_t time)
{ char str[9];
 
time /= T2SECDIV; // Zähler aller 500µs
str[8] = '\0';
time = TimeBase60(str, time, 7);
time = TimeBase60(str, time, 4);
TimeBase60(str, time, 1);
str[2] = ':';
str[5] = ':';
lcdPuts(str);
}
 
void Displ_RX_Time(void)
{
lcdGotoXY(6, 1);
Displ_TimeHMS(rxcount0);
lcdGotoXY(6, 2);
Displ_TimeHMS(rxcount1);
}
 
/************************************************************************************/
/* zeigt eingestellte Akku-Kapazität des MK auf Display an */
/* Parameter: */
/* uint32_t val :Akku-Kapazität in 50mAh Schritte */
/* unint32_t wegen Vereinheitlichung f. Funktionsaufrauf */
/* */
/************************************************************************************/
void Displ_MK_Capacity(uint32_t val)
{
lcdPuts(my_itoa(val * 50, 0, 4, 0, 0));
lcdPuts("mAh");
}
 
/************************************************************************************/
/* zeigt Offset (Korrektur Ruhestrom) für Strom des MK auf Display an */
/* Parameter: */
/* uint32_t val :Korrekturfaktor */
/* unint32_t wegen Vereinheitlichung f. Funktionsaufrauf */
/* */
/************************************************************************************/
void Displ_I_Offset(uint32_t val)
{
lcdPuts(my_itoa((int8_t)val - MK_I_OFFSET_5,1,3,1,1));
lcdPutc('A');
}
 
 
/************************************************************************************/
/* zeigt Korrekturfaktor für Strom und Arbeit des MK auf Display an */
/* Parameter: */
/* uint32_t val :Korrekturfaktor */
/* unint32_t wegen Vereinheitlichung f. Funktionsaufrauf */
/* */
/************************************************************************************/
void Displ_Faktor_2Nk(uint32_t val)
{
lcdPuts(my_itoa(val,0,4,2,2));
}
 
/************************************************************************************/
/* zeigt den Marker in Hauptdarstellung auf selektierten RX an */
/* d Diversity, << fester RX */
/* Parameter: */
/* uint8_t p :x-Position des Markers */
/* uint8_t marker :Markerzeichen z.B.:'' oder 'd' oder 's' */
/* */
/************************************************************************************/
void Displ_AV_Mark(uint8_t p, char marker)
{
if (p < 2) {
lcdGotoXY(15,2 - p); // da p immer neue Position 0 oder 1
lcdPutc(' '); // bisherigen AVx-, Diversity-Marker löschen
lcdGotoXY(15,p + 1); // an neuer Positon
lcdPutc(marker); // übergebenes Markerzeichen darstellen
}
else { // falls beim Einschalten Diversity auf aktiv, keine Marker
lcdGotoXY(15,1);
lcdPutc(' ');
lcdGotoXY(15,2);
lcdPutc(' ');
}
}
 
/************************************************************************************/
/* Hauptanzeige unter Berücksichtigung von VBat */
/* */
/************************************************************************************/
void Displ_Main_Disp(void)
{ char marker;
 
lcdClear();
if (bat_low != 0) {
lcdClear();
Displ_Channels(channel);
lcdGotoXY(LCD_COLS - 1, 0);
lcdPuts("V\n1\n2");
if (av_source < DIVERSITY)
marker = MARKER_AV; // wird nur bei gesetzten Diversity überschrieben
else
marker = MARKER_RSSI; // nur Schönheit, damit man sofort Umschaltung sieht
Displ_AV_Mark(sw_avx, marker);
Displ_VBat(); // muss zuletzt stehen
}
else {
Displ_Str_mid(Msg(MSG_ACCU_LOW), 0);
}
}
 
 
 
/**************************************************************/
/* */
/* Menüs */
/* */
/**************************************************************/
 
/**************************/
/* */
/* Haupmenü */
/* */
/**************************/
void Menu_Main(void)
{ scr_menu_t scr_main_menu = {MSG_RETURN, MSG_AV_SOURCE, MSG_RX_CHANNEL, MSG_RSSI_CALIBR, MSG_LANGUAGE, MSG_SERVO_CALIBR, \
MSG_TEST_SERVO, MSG_LCD , MSG_BATTERY, MSG_TRACKING, 0, MSG_GPS_DISPLAY};
 
strcpy(pmenu, "0");
Scroll_Menu(scr_main_menu, SCROLL_MAIN_MAX, m_pkt); // pmenu global
Jump_Menu(pmenu); //gewähltes Untermenü anspringen oder nur Return
}
 
/**************************/
/* */
/* AV-Quelle */
/* */
/**************************/
void Menu_AV_Source(void)
{ char marker;
uint32_t eep_val;
 
Displ_Title(MSG_AV_SOURCE);
eep_val = Change_Value(av_source, AV_SOURCE_MIN, AV_SOURCE_MAX, 3, Displ_AV_Source, C_REPEAT); // pmenu global
if (eep_val != av_source) {
cli();
av_source = eep_val;
eeprom_write_byte(&ep_av_source, av_source);
Double_Beep(DBEEPWR, DBEEPWRP);
sw_avx = Set_AV_Source(av_source);
if (pmenu[0] == '\0') { // sonst ist AV-Source marker im Hauptdisplay nicht aktuallisiert
if (av_source < DIVERSITY)
marker = MARKER_AV; // wird nur bei gesetzten Diversity überschrieben
else
marker = MARKER_RSSI; // nur Schönheit, damit man sofort Umschaltung sieht
Displ_AV_Mark(sw_avx, marker);// da erst jetzt die Variable für main_display geändert ist!
}
sei();
}
Jump_Menu(pmenu);
}
 
/**************************/
/* */
/* Kanal */
/* */
/**************************/
void Menu_RX_Channel(void)
{ uint32_t eep_val;
 
Displ_Title(MSG_RX_CHANNEL);
eep_val = Change_Value(channel, CHANNEL_MIN, CHANNEL_MAX, 3, Displ_Channels, C_REPEAT); // pmenu global
if ((eep_val != channel) || (eep_val != ch_stored)) { // oder Channel wurde im Hauptdisplay geändert
channel = eep_val;
ch_stored = eep_val;
eeprom_write_byte(&ep_channel, channel);
Double_Beep(DBEEPWR, DBEEPWRP);
Set_Channel(channel);
if (pmenu[0] == '\0') { // sonst ist channel im Hauptdisplay nicht aktuallisiert
lcdGotoXY(0,0);
Displ_Channels(channel); // da erst jetzt die Variable für main_display geändert ist!
}
}
Jump_Menu(pmenu);
}
 
/**************************/
/* */
/* RSSI */
/* */
/**************************/
void Menu_RSSI_Calibr(void)
{ uint8_t scr_sub_menu[4] = {MSG_RETURN, MSG_RSSI_MIN, MSG_RSSI_MIN_ALL, MSG_RSSI_MAX};
 
Scroll_Menu(scr_sub_menu, 3, m_pkt); // pmenu global
Jump_Menu(pmenu);
}
 
void Menu_RSSI_min(void)
{ char str[20];
 
Displ_Title(MSG_RSSI_MIN);
strcpy(str, Msg(MSG_TX));
strcat(str, Msg(MSG_TX_OFF));
Displ_Str_mid(str, 1);
Displ_Str_mid(Msg(MSG_CONTINUE), 2);
if (Short_Enter()) { // pmenu global
RSSI_Min_Calibrate(0, pbar_udbm);
pmenu[0] = '\0'; // zur Hauptdarstellung
Displ_Main_Disp(); // da erst jetzt die Variable für main_display geändert ist!
}
else
Jump_Menu(pmenu);
}
 
void Displ_RSSImin_allError(char *str_ch)
{ char str[LCD_COLS + 1];
lcdClear();
strcpy(str, Msg(MSG_CALIB));
strcat(str, "-");
strcat(str, Msg(MSG_ERROR));
Displ_Str_mid(str,0);
Displ_Str_mid(Msg(MSG_RX_CHANNEL),1);
Displ_Str_mid(str_ch, 2);
delay_ms100x(30);
}
 
void Menu_RSSI_min_all(void)
{ char str[20];
char not_cal[15];
uint8_t f = 0;
 
Displ_Title(MSG_RSSI_MIN_ALL);
strcpy(str, Msg(MSG_TX));
strcat(str, Msg(MSG_TX_OFF));
Displ_Str_mid(str, 1);
Displ_Str_mid(Msg(MSG_CONTINUE), 2);
if (Short_Enter()) { // pmenu global
for ( uint8_t i = 1; i <= CHANNEL_MAX; i++) {
Set_Channel(i);
if (!RSSI_Min_Calibrate(i, pbar_udbm)) {
not_cal[f++] = i + 0x30;
not_cal[f++] = ',';
}
}
Set_Channel(channel);
Double_Beep(DBEEPWR, DBEEPWRP);
if (f > 0) { // Konnten einige Kanäle nicht auf RSSI-Min kalibiert werden?
not_cal[--f] = '\0'; // letzes Komma durch Stringende ersetzen
Displ_RSSImin_allError(not_cal);
}
pmenu[0] = '\0'; // zur Hauptdarstellung
Displ_Main_Disp(); // da erst jetzt die Variable für main_display geändert ist!
}
else
Jump_Menu(pmenu);
}
 
void Menu_RSSI_max(void)
{ char str[20];
 
Displ_Title(MSG_RSSI_MAX);
strcpy(str, Msg(MSG_TX));
strcat(str, Msg(MSG_TX_ON));
Displ_Str_mid(str, 1);
Displ_Str_mid(Msg(MSG_CONTINUE), 2);
if (Short_Enter()) { // pmenu global
RSSI_Max_Calibrate(pbar_udbm);
pmenu[0] = '\0'; // zur Hauptdarstellung
Displ_Main_Disp(); // da erst jetzt die Variable für main_display geändert ist!
}
else
Jump_Menu(pmenu);
}
 
/**************************/
/* */
/* Sprache */
/* */
/**************************/
void Displ_Language(uint32_t i)
{ uint8_t lanuage_table[3] = {MSG_GERMAN, MSG_ENGLISH, MSG_FRENCH};
 
Displ_Str_mid(Msg(lanuage_table[i]), ZLE_VAL);
}
 
void Menu_Language(void)
{ uint32_t eep_val;
 
Displ_Title(MSG_LANGUAGE);
eep_val = Change_Value(language, GERMAN, LAST_LANG, 3, Displ_Language, C_REPEAT); // pmenu global
language = eeprom_read_byte(&ep_language); // damit bei Erstinbetriebnahme Sprache gespeichert wird NO_LANGUAGE
if (eep_val != language) {
language = eep_val;
eeprom_write_byte(&ep_language, language);
Double_Beep(DBEEPWR, DBEEPWRP);
}
Jump_Menu(pmenu);
}
 
/**************************/
/* */
/* Servos */
/* */
/**************************/
void Menu_Servo_Calibr(void)
{ uint8_t scr_sub_menu[4] = {MSG_RETURN, MSG_SERVO_STEPS, MSG_SERVO1, MSG_SERVO2};
 
Scroll_Menu(scr_sub_menu, 3, m_pkt); // pmenu global
Jump_Menu(pmenu);
}
 
void Servo_NewValues(uint8_t idx_presc)
{
for (uint8_t i = 0; i < SERVO_NUM_CHANNELS; i++) {
if (idx_presc == STEPS_255) { // Werte umrechnen für Prescaler = 256
servo[i].min /= 4;
servo[i].max /= 4;
servo[i].mid /= 4;
}
else { // Werte umrechnen für Prescaler = 64
servo[i].min *= 4;
servo[i].max *= 4;
servo[i].mid = (servo[i].mid + 1) * 4 - 1;
}
servoSet_min(i, servo[i].min);
servoSet_max(i, servo[i].max);
servoSet_mid(i, servo[i].mid);
eeprom_write_block(&servo[i],&ep_servo[i],sizeof(servo_t));
}
// Vorberechnung von ServoChannels[channel].duty
servoSetDefaultPos(); // Ausgangsstellung beider Servos
}
 
void Menu_Servo_Steps(void)
{ uint32_t eep_val;
Displ_Title(MSG_SERVO_STEPS);
lcdGotoXY(8, ZLE_VAL);
eep_val = Change_Value(sIdxSteps, STEPS_255, STEPS_1023, 5, Displ_Servo_Steps, C_REPEAT); // pmenu global
if (eep_val != sIdxSteps) {
cli();
sIdxSteps = eep_val;
eeprom_write_byte(&ep_sIdxSteps, sIdxSteps);
Servo_NewValues(sIdxSteps); // hier ist der neue Index anzugeben!
servoInit(SERVO_PERIODE);
sei();
if (tracking == TRACKING_MIN) {
delay_ms100x(4); // sonst werden Impulse bereits vor erreichen der Servo-default-Stellung abgeschaltet
servoOff(); // Servos sind nur zum Tracking oder bei Kalibrierung eingeschaltet
}
Double_Beep(DBEEPWR, DBEEPWRP);
}
Jump_Menu(pmenu);
}
 
void Menu_Servo1(void)
{ uint8_t scr_servo_menu[5] = {MSG_RETURN, MSG_SERVO1_REVERSE, MSG_CALIB1_LEFT, MSG_CALIB1_RIGHT, MSG_CALIB1_MIDDLE};
Scroll_Menu(scr_servo_menu, SCROLL_SERVO_MAX, m_pkt); // pmenu global
servo_nr = 0;
Jump_Menu(pmenu);
}
 
void Menu_Servo2(void)
{ uint8_t scr_servo_menu[5] = {MSG_RETURN, MSG_SERVO2_REVERSE, MSG_CALIB2_LEFT, MSG_CALIB2_RIGHT, MSG_CALIB2_MIDDLE};
Scroll_Menu(scr_servo_menu, SCROLL_SERVO_MAX, m_pkt); // pmenu global
servo_nr = 1;
Jump_Menu(pmenu);
}
 
uint8_t Servo_tmp_on(uint8_t servo_period)
{ uint8_t tmp_tracking = tracking;
 
tracking = 0; // Servopositionierung durch tracking abschalten
if (tracking == TRACKING_MIN) servoInit(servo_period); // falls aus, Servos einschalten
lcdGotoXY(0, 0); // lcd Cursor vorpositionieren
return(tmp_tracking);
}
 
void Servo_tmp_Original(uint8_t track)
{ uint16_t steps;
 
if (servo_nr == SERVO_PAN)
steps = ServoSteps()/2; // PAN auf Mittelstellung
else
steps = 0; // Tilt auf Endausschlag
servoSetPosition(servo_nr, steps); // Bei PAN auf ServoSteps/2 und bei Tilt auf 0 oder ServoSteps NICHT!!! reverse beachten
tracking = track; // ursprünglicher Wert Tracking aus, RSSI oder GPS
if (tracking == TRACKING_MIN) {
delay_ms100x(4); // sonst werden Impulse bereits vor erreichen der Servo-default-Stellung abgeschaltet
servoOff(); // Servos sind nur zum Tracking oder bei Kalibrierung eingeschaltet
}
Jump_Menu(pmenu);
}
 
void Menu_Servo_rev(void)
{ uint32_t eep_val;
uint8_t tmp_tracking;
 
tmp_tracking = Servo_tmp_on(SERVO_PERIODE);
eep_val = Change_Value(servo[servo_nr].rev, 0, 1, 6, Displ_Off_On, C_REPEAT); // pmenu global; reverse gibt es nur 0=off, 1=on
if (eep_val != servo[servo_nr].rev) {
servo[servo_nr].rev = eep_val;
servoSet_rev(servo_nr, eep_val);
eeprom_write_block(&servo[servo_nr],&ep_servo[servo_nr],sizeof(servo_t));
Double_Beep(DBEEPWR, DBEEPWRP);
}
Servo_tmp_Original(tmp_tracking);
}
 
void Menu_Servo1_rev(void)
{
Displ_Title(MSG_SERVO1_REVERSE);
Menu_Servo_rev();
}
 
void Menu_Servo2_rev(void)
{
Displ_Title(MSG_SERVO2_REVERSE);
Menu_Servo_rev();
}
 
void Menu_Servo_left(void)
{ uint32_t eep_val;
uint8_t tmp_tracking;
 
tmp_tracking = Servo_tmp_on(SERVO_PERIODE);
servoSetPosition(servo_nr, ServoSteps()); // Linkssanschlag um Kalibrierung am Servo zu sehen
eep_val = Change_Value(servo[servo_nr].max, servo_limit[sIdxSteps][LEFT].min, servo_limit[sIdxSteps][LEFT].max, 6, Displ_Servo_Max, V_REPEAT); // pmenu global
if (eep_val != servo[servo_nr].max) {
servo[servo_nr].max = eep_val;
eeprom_write_block(&servo[servo_nr],&ep_servo[servo_nr],sizeof(servo_t));
servoSet_mid(servo_nr, servo[servo_nr].mid); // Mittelposition muss sich bei Ausschlagsänderung verschieben
Double_Beep(DBEEPWR, DBEEPWRP);
}
Servo_tmp_Original(tmp_tracking);
}
 
void Menu_Servo1_left(void)
{
Displ_Title(MSG_CALIB1_LEFT);
Menu_Servo_left();
}
 
void Menu_Servo2_left(void)
{
Displ_Title(MSG_CALIB2_LEFT);
Menu_Servo_left();
}
 
void Menu_Servo_right(void)
{ uint32_t eep_val;
uint8_t tmp_tracking;
 
tmp_tracking = Servo_tmp_on(SERVO_PERIODE);
servoSetPosition(servo_nr, 0); // Rechtsanschlag um Kalibrierung am Servo zu sehen
eep_val = Change_Value(servo[servo_nr].min, servo_limit[sIdxSteps][RIGHT].min, servo_limit[sIdxSteps][RIGHT].max, 6, Displ_Servo_Min, V_REPEAT); // pmenu global
if (eep_val != servo[servo_nr].min) {
servo[servo_nr].min = eep_val;
eeprom_write_block(&servo[servo_nr],&ep_servo[servo_nr],sizeof(servo_t));
servoSet_mid(servo_nr, servo[servo_nr].mid); // Mittelposition muss sich bei Ausschlagsänderung verschieben
Double_Beep(DBEEPWR, DBEEPWRP);
}
Servo_tmp_Original(tmp_tracking);
}
 
void Menu_Servo1_right(void)
{
Displ_Title(MSG_CALIB1_RIGHT);
Menu_Servo_right();
}
 
void Menu_Servo2_right(void)
{
Displ_Title(MSG_CALIB2_RIGHT);
Menu_Servo_right();
}
 
void Menu_Servo_middle(void)
{ uint32_t eep_val;
uint8_t tmp_tracking;
 
tmp_tracking = Servo_tmp_on(SERVO_PERIODE);
servoSetPosition(servo_nr, ServoSteps()/2); // Mittelposition um Kalibrierung am Servo zu sehen
eep_val = Change_Value(servo[servo_nr].mid, servo_limit[sIdxSteps][MIDDLE].min, servo_limit[sIdxSteps][MIDDLE].max, 5, Displ_Servo_Mid, V_REPEAT); // pmenu global
if (eep_val != servo[servo_nr].mid) {
servo[servo_nr].mid = eep_val;
eeprom_write_block(&servo[servo_nr], &ep_servo[servo_nr], sizeof(servo_t));
Double_Beep(DBEEPWR, DBEEPWRP);
}
Servo_tmp_Original(tmp_tracking);
}
 
void Menu_Servo1_middle(void)
{
Displ_Title(MSG_CALIB1_MIDDLE);
Menu_Servo_middle();
}
 
void Menu_Servo2_middle(void)
{
Displ_Title(MSG_CALIB2_MIDDLE);
Menu_Servo_middle();
}
 
/**************************/
/* Servos-Test */
/**************************/
void Menu_Servo_Test(void)
{ uint8_t scr_sub_menu[5] = {MSG_RETURN, MSG_PULSE_WIDTH, MSG_CONTINOUS, MSG_SERVO, MSG_FRAME};
 
Scroll_Menu(scr_sub_menu, 4, m_pkt); // pmenu global
servo_nr = eeprom_read_byte(&ep_servo_nr);
Jump_Menu(pmenu);
}
 
void Menu_Test_Frame(void)
{ uint32_t eep_val;
 
Displ_Title(MSG_FRAME);
lcdGotoXY(8, ZLE_VAL);
lcdPuts("ms");
eep_val = Change_Value(servo_frame, SERVO_PERIODE_MIN, SERVO_PERIODE_MAX, 5, Displ_Format_Int, V_REPEAT); // pmenu global
if (eep_val != servo_frame) {
servo_frame = eep_val;
eeprom_write_byte(&ep_servo_frame, servo_frame);
Double_Beep(DBEEPWR, DBEEPWRP);
}
Jump_Menu(pmenu);
}
 
void Menu_Test_ServoNr(void)
{ uint32_t eep_val;
 
Displ_Title(MSG_SERVO);
eep_val = Change_Value(servo_nr, 0, 1, 4, Displ_ServoNr, C_REPEAT); // pmenu global; es gibt nur 0=Servo1, 1=Servo2
if (eep_val != servo_nr) {
servo_nr = eep_val;
eeprom_write_byte(&ep_servo_nr, servo_nr);
Double_Beep(DBEEPWR, DBEEPWRP);
}
Jump_Menu(pmenu);
}
 
// Dieser Test im raw-Modus ohne Anschlagkalibrierung (normiert) z.B.: für Modelleinstellungen ohne Empfänger
void Menu_Test_PulseWidth(void)
{ uint8_t tmp_tracking;
 
tmp_tracking = Servo_tmp_on(servo_frame);
lcdWriteCGRAM_Array(lcdSpecialChrLs, 8); // LCD-Char mit Rahmensymbole vom Graph
chrxs = CHRLS; // verhindert wiederholtes Lesen bereits geladener LCD-Char
Displ_Title(MSG_PULSE_WIDTH);
Change_Value(steps_pw[sIdxSteps].mid, steps_pw[sIdxSteps].min, steps_pw[sIdxSteps].max, 4, Displ_PulseWidth, V_REPEAT); // pmenu global
lcdWriteCGRAM_Array(lcdSpecialChr, 7); // LCD-Char für Bargraph zurückschreiben
cli();
servoInit(SERVO_PERIODE);
sei();
Servo_tmp_Original(tmp_tracking);
}
 
void Menu_Test_Continuous(void)
{ uint8_t scr_sub_menu[6] = {MSG_RETURN, MSG_START, MSG_SINGLE_STEP, MSG_REPEAT, MSG_PAUSE, MSG_PAUSE_STEP};
 
Scroll_Menu(scr_sub_menu, 5, m_pkt); // pmenu global
Jump_Menu(pmenu);
}
 
void Menu_Test_SingleStep(void)
{uint32_t eep_val;
 
Displ_Title(MSG_SINGLE_STEP);
eep_val = Change_Value(single_step, SINGLE_STEP_MIN, SINGLE_STEP_MAX, 5, Displ_Off_Format_Int, V_REPEAT); // pmenu global
if (eep_val != single_step) {
single_step = eep_val;
eeprom_write_byte(&ep_single_step, single_step);
Double_Beep(DBEEPWR, DBEEPWRP);
}
Jump_Menu(pmenu);
}
 
void Menu_Test_Repeat(void)
{uint32_t eep_val;
 
Displ_Title(MSG_REPEAT);
eep_val = Change_Value(repeat, REPEAT_MIN, REPEAT_MAX, 5, Displ_Format_Int, V_REPEAT); // pmenu global
if (eep_val != repeat) {
repeat = eep_val;
eeprom_write_byte(&ep_repeat, repeat);
Double_Beep(DBEEPWR, DBEEPWRP);
}
Jump_Menu(pmenu);
}
 
void Menu_Test_Pause(void)
{uint32_t eep_val;
 
Displ_Title(MSG_PAUSE);
eep_val = Change_Value(pause, PAUSE_MIN, PAUSE_MAX, 5, Displ_Pause, V_REPEAT); // pmenu global
if (eep_val != pause) {
pause = eep_val;
eeprom_write_byte(&ep_pause, pause);
Double_Beep(DBEEPWR, DBEEPWRP);
}
Jump_Menu(pmenu);
}
 
void Menu_Test_Pause_Step(void)
{uint32_t eep_val;
 
Displ_Title(MSG_PAUSE_STEP);
eep_val = Change_Value(pause_step, PAUSE_STEP_MIN, PAUSE_STEP_MAX, 5, Displ_Pause_Step, V_REPEAT); // pmenu global
if (eep_val != pause_step) {
pause_step = eep_val;
eeprom_write_byte(&ep_pause_step, pause_step);
Double_Beep(DBEEPWR, DBEEPWRP);
}
Jump_Menu(pmenu);
}
 
int8_t calc_dir(uint8_t idx, int16_t *Position)
{ uint8_t nextIdx;
int8_t nextDir = 1;
 
nextIdx = idx;
if ((idx + 1) < POSIDX_MAX)
nextIdx++;
else
nextIdx = 0;
if (Position[PosIdx[idx]] > Position[PosIdx[nextIdx]]) nextDir = -1;
return(nextDir);
}
 
// Test über Scalierung der Servos mit Anschlagkalibrierung
void Menu_Test_Start(void)
{ uint8_t tmp_tracking, idx, rep;
int8_t dir;
int16_t sPos;
int16_t Position[3];
int16_t range;
tmp_tracking = Servo_tmp_on(servo_frame);
lcdWriteCGRAM_Array(lcdSpecialChrLs, 8); // LCD-Char mit Rahmensymbole vom Graph
chrxs = CHRLS; // Flag, welche Kästchensymbole geladen
Displ_Title(MSG_CONTINOUS);
Position[0] = 0; // skalierte Servoposition aber unterschiedliche Schrittanzahl möglich
Position[1] = ServoSteps()/2;
Position[2] = ServoSteps();
// init Einzelschritt
idx = 0;
dir = calc_dir(idx, Position);
sPos = Position[PosIdx[idx]];
idx++;
rep = repeat;
// Test bis Ende der Wiederholungen oder irgendein Enter
while( !Get_Key_Short( 1<<SW_ENTER ) && (pmenu[0] !='\0') && (rep > 0)) {
range = calc_range(sPos - Position[1], Position[0], Position[2], Position[1]);
draw_bar(sPos - Position[1], range, 1);// eingerahmter Balkengraph auf 2. Display-Zeile
servoSetPosition(servo_nr, sPos);
 
if ( sPos != Position[PosIdx[idx]]) { // Links-, Mittel- oder Rechtsposotion erreicht?
sPos += (single_step * dir); // variable Schrittweite subtrahieren oder addieren
if (((dir < 0) && (sPos < Position[PosIdx[idx]])) || ((dir > 0) && (sPos > Position[PosIdx[idx]])) || !(single_step))
sPos = Position[PosIdx[idx]]; // Überlauf bei variabler Schrittweite berücksichtigen oder Einzelschritt
_delay_ms(servo_frame + 1 + pause_step); // Bei Schrittweite um 1 würden welche übersprungen, zusätzlich pro Servoschritt verzögert
}
else {
dir = calc_dir(idx, Position); // Richtungsänderung
if (idx < (POSIDX_MAX - 1)) {
if (idx == 0) rep--; // bei jeden vollen Durchlauf Wiederholzähler verringern
idx++; // Index für nächsten Positionswert ==> Array PosIdx[] bestimmt Anschlagreihenfolge
}
else
idx = 0;
delay_ms100x(pause); // variable Pause bei Links-, Mittel- und Rechtsposotion Mindestzeit 400ms (Servolauf)
}
Long_Enter();
}
lcdClear();
if (pmenu[0] == '\0')
Displ_Main_Disp();
else
return_m_pkt(strlen(pmenu)); // um bei Rücksprung auf ursprünglichen Menüpunkt zeigen oder Displ_Main_Disp()
lcdWriteCGRAM_Array(lcdSpecialChr, 7);// LCD-Char für Bargraph zurückschreiben
cli();
servoInit(SERVO_PERIODE);
sei();
Servo_tmp_Original(tmp_tracking);
}
 
 
/**************************/
/* */
/* LCD */
/* */
/**************************/
void Menu_lcd(void)
{ uint8_t scr_sub_menu[3] = {MSG_RETURN, MSG_CONTRAST, MSG_BACKGR_LIGHT};
 
Scroll_Menu(scr_sub_menu, 2, m_pkt); // pmenu global
Jump_Menu(pmenu);
}
 
void Menu_lcd_Contrast(void)
{ uint32_t eep_val;
 
Displ_Title(MSG_LCD);
lcdGotoXY(2, ZLE_VAL);
lcdPuts(Msg(MSG_CONTRAST));
lcdPuts(": ");
eep_val = Change_Value(contrast, CONTRAST_MIN, CONTRAST_MAX, 11, Displ_Set_Contrast, C_REPEAT); // pmenu global
if (eep_val != contrast) {
contrast = eep_val;
eeprom_write_byte(&ep_contrast, contrast);
Double_Beep(DBEEPWR, DBEEPWRP);
}
Jump_Menu(pmenu);
}
 
void Menu_lcd_Backgr_Light(void)
{ uint32_t eep_val;
 
Displ_Title(MSG_BACKGR_LIGHT);
lcdGotoXY(0, ZLE_VAL);
lcdPuts(Msg(MSG_LIGHT));
eep_val = Change_Value(light_time, BACKGR_LIGHT_MIN, BACKGR_LIGHT_MAX, 6, Displ_Backgr_Light, V_REPEAT); // pmenu global
if (eep_val != light_time) {
light_time = eep_val;
eeprom_write_byte(&ep_light_time, light_time);
Double_Beep(DBEEPWR, DBEEPWRP);
if (light_time == BACKGR_LIGHT_MIN) lcdSet_BackgrLight_Off(); // Hintergrundbeleuchtung immer aus ==> sofort schalten
}
Jump_Menu(pmenu);
}
 
/**************************/
/* */
/* Batterie */
/* */
/**************************/
void Menu_Battery(void)
{ uint8_t scr_sub_menu[4] = {MSG_RETURN, MSG_U_SETUP, MSG_U_OFFSET, MSG_MK_BATTERY};
 
Scroll_Menu(scr_sub_menu, 3, m_pkt); // pmenu global
Jump_Menu(pmenu);
}
 
void Menu_Low_U_Setup(void)
{ uint32_t eep_val;
 
Displ_Title(MSG_U_MIN);
eep_val = Change_Value(u_min, U_MIN_MIN, U_MIN_MAX, 4, Displ_U_2Nk, V_REPEAT); // pmenu global
if (eep_val != u_min) {
u_min = eep_val;
eeprom_write_dword(&ep_u_min, u_min);
hyst_u_min = u_min;
Double_Beep(DBEEPWR, DBEEPWRP);
}
Jump_Menu(pmenu);
}
 
void Menu_U_Offset(void)
{ uint32_t eep_val;
 
Displ_Title(MSG_U_OFFSET);
eep_val = Change_Value(u_offset, U_OFFSET_MIN, U_OFFSET_MAX, 4, Displ_U_2Nk, V_REPEAT); // pmenu global
if (eep_val != u_offset) {
u_offset = eep_val;
eeprom_write_byte(&ep_u_offset, u_offset);
Double_Beep(DBEEPWR, DBEEPWRP);
}
Jump_Menu(pmenu);
}
 
void Menu_MK_Battery(void)
{ uint8_t scr_sub_menu[6] = {MSG_RETURN, MSG_MK_BAT_NR, MSG_MK_BAT_CAPACITY, MSG_MK_I_OFFSET, MSG_MK_I_FAKTOR, MSG_MK_W_FAKTOR};
 
Scroll_Menu(scr_sub_menu, 5, m_pkt); // pmenu global
Jump_Menu(pmenu);
}
 
void Menu_MK_BatteryChangeNr(void)
{ uint32_t eep_val;
 
Displ_Title(MSG_MK_BAT_NR);
eep_val = Change_Value(akku_nr+1, AKKU_NR_MIN+1, AKKU_NR_MAX+1, 5, Displ_Format_Int, V_REPEAT); // pmenu global
eep_val--;
if (eep_val != akku_nr) {
akku_nr = eep_val;
eeprom_write_byte(&ep_akku_nr, akku_nr);
eeprom_read_block(&lipo,&ep_lipo[akku_nr],sizeof(lipo_t));
Double_Beep(DBEEPWR, DBEEPWRP);
}
}
 
void Menu_MK_BatteryNr(void)
{
Menu_MK_BatteryChangeNr();
Jump_Menu(pmenu);
}
 
void Menu_MK_BatteryCapacity(void)
{ uint32_t eep_val;
 
Displ_Title(MSG_MK_BAT_CAPACITY);
eep_val = Change_Value(lipo.Capacity/50, AKKU_CAPACITY_MIN/50, AKKU_CAPACITY_MAX/50, 5, Displ_MK_Capacity, V_REPEAT); // pmenu global
if (eep_val != lipo.Capacity/50) {
lipo.Capacity = eep_val * 50;
eeprom_write_block(&lipo,&ep_lipo[akku_nr],sizeof(lipo_t));
Double_Beep(DBEEPWR, DBEEPWRP);
}
Jump_Menu(pmenu);
}
 
void Menu_MK_I_Offset(void)
{ uint32_t eep_val;
 
Displ_Title(MSG_MK_I_OFFSET);
eep_val = Change_Value(mk_i_offset, MK_I_OFFSET_MIN, MK_I_OFFSET_MAX, 5, Displ_I_Offset, V_REPEAT); // pmenu global
if (eep_val != mk_i_offset) {
mk_i_offset = eep_val;
eeprom_write_byte(&ep_mk_i_offset, mk_i_offset);
Double_Beep(DBEEPWR, DBEEPWRP);
}
Jump_Menu(pmenu);
}
 
void Menu_MK_I_Faktor(void)
{ uint32_t eep_val;
 
Displ_Title(MSG_MK_I_FAKTOR);
eep_val = Change_Value(mk_i_faktor, MK_I_FAKTOR_MIN, MK_I_FAKTOR_MAX, 6, Displ_Faktor_2Nk, V_REPEAT); // pmenu global
if (eep_val != mk_i_faktor) {
mk_i_faktor = eep_val;
eeprom_write_byte(&ep_mk_i_faktor, mk_i_faktor);
Double_Beep(DBEEPWR, DBEEPWRP);
}
Jump_Menu(pmenu);
}
 
void Menu_MK_W_Faktor(void)
{ uint32_t eep_val;
 
Displ_Title(MSG_MK_W_FAKTOR);
eep_val = Change_Value(mk_w_faktor, MK_W_FAKTOR_MIN, MK_W_FAKTOR_MAX, 6, Displ_Faktor_2Nk, V_REPEAT); // pmenu global
if (eep_val != mk_w_faktor) {
mk_w_faktor = eep_val;
eeprom_write_byte(&ep_mk_w_faktor, mk_w_faktor);
Double_Beep(DBEEPWR, DBEEPWRP);
}
Jump_Menu(pmenu);
}
 
 
/**************************/
/* */
/* Antennennachführung */
/* */
/**************************/
void Menu_Tracking_Ant(void)
{ uint32_t eep_val;
 
Displ_Title(MSG_TRACKING);
eep_val = Change_Value(tracking, TRACKING_MIN, TRACKING_MAX, 3, Displ_sel_Tracking, C_REPEAT); // pmenu global
if (eep_val != tracking) {
cli();
tracking = eep_val;
sei();
eeprom_write_byte(&ep_tracking, tracking);
Double_Beep(DBEEPWR, DBEEPWRP);
USART_RX_Mode(tracking); // Unterschied Datenempfang GPS/MKCockpit
coldstart = 1;
rxcount0 = 0;
rxcount1 = 0;
servoSetDefaultPos(); // Ausgangsstellung beider Servos
if (tracking > TRACKING_MIN)
servoInit(SERVO_PERIODE);
else {
delay_ms100x(4); // sonst wird Impuls bereits vor erreichen der Mittelstellung abgeschaltet
servoOff();
}
USART_Init_Baudrate();
}
Jump_Menu(pmenu);
}
 
/**************************/
/* Optionen */
/* Antennennachführung */
/* */
/**************************/
void Menu_Tracking_HYST(void)
{ uint32_t eep_val;
 
Displ_Title(MSG_HYSTERESE);
eep_val = Change_Value(track_hyst, TRACKING_HYST_MIN, TRACKING_HYST_MAX, 7, Displ_Format_Int, V_REPEAT); // pmenu gloabal
if (eep_val != track_hyst) {
track_hyst = eep_val;
eeprom_write_byte(&ep_track_hyst, track_hyst);
Double_Beep(DBEEPWR, DBEEPWRP);
}
Jump_Menu(pmenu);
}
 
void Menu_Tracking_TXOSD(void)
{ uint32_t eep_val;
 
Displ_Title(MSG_TRACK_TX_OSD_DATA);
eep_val = Change_Value(track_tx, 0, 1, 3, Displ_track_TX, C_REPEAT); // pmenu global; Senden gibt es nur 0=off, 1=on
if (eep_val != track_tx) {
track_tx = eep_val;
eeprom_write_byte(&ep_track_tx, track_tx);
Double_Beep(DBEEPWR, DBEEPWRP);
}
Jump_Menu(pmenu);
}
 
void Menu_Baudrate(void)
{ uint32_t eep_val;
 
Displ_Title(MSG_BAUDRATE);
eep_val = Change_Value(baudrate, BAUDRATE_MIN, BAUDRATE_MAX, 3, Displ_Baudrate, C_REPEAT); // pmenu global; Senden gibt es nur 0=off, 1=on
if (eep_val != baudrate) {
baudrate = eep_val;
eeprom_write_byte(&ep_baudrate, baudrate);
Double_Beep(DBEEPWR, DBEEPWRP);
USART_Init(baud[baudrate]);
}
Jump_Menu(pmenu);
}
 
void Menu_Tracking_Option(void)
{ // im Menü ist dies der gleiche Gliederungspunkt aber mit geänderter Auswahl
switch(tracking) {
case TRACKING_RSSI: Menu_Tracking_HYST();
break;
case TRACKING_GPS: Menu_Tracking_TXOSD();
break;
case TRACKING_MKCOCKPIT: Menu_Baudrate();
}
}
 
/**************************/
/* */
/* Anzeige GPS */
/* */
/**************************/
void Menu_GPS_Display(void)
{ uint8_t scr_sub_menu[6] = {MSG_RETURN, MSG_GPS_CALCULATE, MSG_GPS_CURRENT, MSG_GPS_HOME, MSG_GPS_MISC, MSG_RX_TIME};
 
Scroll_Menu(scr_sub_menu, 5, m_pkt); // pmenu global
Jump_Menu(pmenu);
}
 
void Menu_GPS_Display_FLAG(void) // ist Flag in tracking.c Tracking_GPS(void)
{ uint8_t slen;
slen = strlen(pmenu) - 1;
gps_display = pmenu[slen] - '0'; // char to byte 1 bis 3 im String enthalten
m_pkt = gps_display;
gps_disp_clear = 1; // damit Text "...keine Daten empf..." nach Datenempfang gelöscht wird
if (gps_display != GPS_MISC) lcdPuts(Msg(MSG_GPS_NO_DATA));
if (Short_Enter()) // pmenu global
pmenu[slen] = '\0'; // Menüpunkt zurück
gps_display = GPS_DISP_NONE; // nach Tastaturabfrage keine Anzeige GPS, sondern normales Menü
Jump_Menu(pmenu);
}
 
void Menu_GPS_Displ_RX_Time(void)
{
Displ_Title(MSG_RX_TIME);
lcdGotoXY(0, 1);
lcdPuts(Msg(MSG_RX1));
lcdGotoXY(0, 2);
lcdPuts(Msg(MSG_RX2));
Displ_RX_Time();
gps_display = GPS_RX_COUNT;
m_pkt = gps_display;
if (Short_Enter()) // pmenu global
pmenu[strlen(pmenu) - 1] = '\0';// Menüpunkt zurück
gps_display = GPS_DISP_NONE; // nach Tastaturabfrage keine Anzeige GPS, sondern normales Menü
Jump_Menu(pmenu);
}
/NGVideo5_8/tags/v1.21/menue.h
0,0 → 1,123
 
/****************************************************************/
/* */
/* NG-Video 5,8GHz */
/* */
/* Copyright (C) 2011 - gebad */
/* */
/* This code is distributed under the GNU Public License */
/* which can be found at http://www.gnu.org/licenses/gpl.txt */
/* */
/****************************************************************/
 
#ifndef _MENUE_H_
#define _MENUE_H_
 
#define SCROLL_MAIN_MAX 9 // index array Scroll_Menu scr_main_menu[] = {....} Anzahl-1, da Beginn bei 0
#define SCROLL_SERVO_MAX 4 // index array Scroll_Menu scr_servo_menu[] = {....} Anzahl-1, da Beginn bei 0
 
/* bei Change_Value(....) */
#define ZLE_VAL 1 // DOGM Zeile des zu ändernten Wertes, einfache generelle bessere Gestaltung
 
#define C_REPEAT 0 // konstante repeat Geschwindigkeit
#define V_REPEAT 1 // sich ändernte repeat Geschwindigkeit
#define CHRLS 0 // Flag überladener Zeichensatz lcdSpecialChrLs
#define CHRRS 1 // Flag überladener Zeichensatz lcdSpecialChrRs
 
typedef struct
{
const char *menu_nr; // Stringzeiger auf Befehlsnamen
void (*fp)(void); // Zeiger auf auszuführende Funktion
} command_table_t;
void Menu_Main (void);
void Menu_AV_Source (void);
void Menu_RX_Channel (void);
void Menu_RSSI_Calibr (void);
void Menu_RSSI_min (void);
void Menu_RSSI_min_all (void);
void Menu_RSSI_max (void);
void Menu_Language (void);
void Menu_Servo_Calibr (void);
void Menu_Servo_Steps (void);
void Menu_Servo1 (void);
void Menu_Servo2 (void);
void Menu_Servo1_rev (void);
void Menu_Servo1_left (void);
void Menu_Servo1_right (void);
void Menu_Servo1_middle (void);
void Menu_Servo2_rev (void);
void Menu_Servo2_left (void);
void Menu_Servo2_right (void);
void Menu_Servo2_middle (void);
void Menu_Servo_Test (void);
void Menu_Test_Frame (void);
void Menu_Test_ServoNr (void);
void Menu_Test_PulseWidth (void);
void Menu_Test_Continuous (void);
void Menu_Test_SingleStep (void);
void Menu_Test_Repeat (void);
void Menu_Test_Pause (void);
void Menu_Test_Pause_Step (void);
void Menu_Test_Start (void);
void Menu_lcd (void);
void Menu_lcd_Contrast (void);
void Menu_lcd_Backgr_Light (void);
void Menu_Battery (void);
void Menu_Low_U_Setup (void);
void Menu_U_Offset (void);
void Menu_MK_Battery (void);
void Menu_MK_BatteryNr (void);
void Menu_MK_BatteryCapacity(void);
void Menu_MK_I_Offset (void);
void Menu_MK_I_Faktor (void);
void Menu_MK_W_Faktor (void);
void Menu_Tracking_Ant (void);
void Menu_Tracking_Option (void);
void Menu_GPS_Display (void);
void Menu_GPS_Display_FLAG (void);
void Menu_GPS_Displ_RX_Time (void);
 
char pmenu[6] = {"0"}; // Zuordnung Menü Programmgliederung zu hinterlegten Funktionen
char tmp_pmenu[6];
 
uint8_t ch_stored; // Flag zur Speicherung, wenn Wert im Hauptdisplay geändert
uint8_t coldstart; // Flag erstmaliger MK-Start(Motore) nur nach GPS-Fix
 
void Displ_Main_Disp(void);
void Displ_AV_Mark(uint8_t p, char marker);
void Displ_Str_mid(char *str, uint8_t zle);
void Displ_RX_Time(void);
void Menu_MK_BatteryChangeNr(void);
 
#define RIGHT 0 // Servopostionen, welche vom Einbau abhängig sind
#define LEFT 1
#define MIDDLE 2
 
typedef struct
{
uint16_t min; // entspricht Servopostionen, welche vom Einbau abhängig sind
uint16_t max;
} servo_limit_t;
 
servo_limit_t servo_limit[2][3] = {{{SERVO_I0_RIGHT_MIN, SERVO_I0_RIGHT_MAX},\
{SERVO_I0_LEFT_MIN, SERVO_I0_LEFT_MAX},\
{SERVO_I0_MIDDLE_MIN, SERVO_I0_MIDDLE_MAX}},\
{{SERVO_I1_RIGHT_MIN, SERVO_I1_RIGHT_MAX},\
{SERVO_I1_LEFT_MIN, SERVO_I1_LEFT_MAX},\
{SERVO_I1_MIDDLE_MIN, SERVO_I1_MIDDLE_MAX}}};
typedef struct
{
uint16_t min; // entspricht Servopostionen, welche vom Einbau abhängig sind
uint16_t max;
uint16_t mid;
} steps_pw_t;
 
// Servopositionen für 950µs, 2,05ms und 1,5ms ==> Ergebnis Schritte. Da Zeit in µs ist F_CPU*e-1
const steps_pw_t steps_pw[2] = {{(uint64_t)950*F_CPU*1e-6/SERVO_PRESCALER + 0.5, (uint64_t)2050*F_CPU*1e-6/SERVO_PRESCALER + 0.5, (uint64_t)1500*F_CPU*1e-6/SERVO_PRESCALER + 0.5},\
{(uint64_t)950*4*F_CPU*1e-6/SERVO_PRESCALER + 0.5, (uint64_t)2050*4*F_CPU*1e-6/SERVO_PRESCALER + 0.5, (uint64_t)1500*4*F_CPU*1e-6/SERVO_PRESCALER + 0.5}};
 
# define POSIDX_MAX 4
const uint8_t PosIdx[POSIDX_MAX] = {1, 0, 1, 2 }; // anzufahrende Servopositionen 0=MIN, 1=MID, 2=MAX
 
#endif /* _MENUE_H */
/NGVideo5_8/tags/v1.21/messages.c
0,0 → 1,276
 
/****************************************************************/
/* */
/* NG-Video 5,8GHz */
/* */
/* Copyright (C) 2011 - gebad */
/* */
/* This code is distributed under the GNU Public License */
/* which can be found at http://www.gnu.org/licenses/gpl.txt */
/* */
/* using */
/* http://www.avrfreaks.net/ */
/* index.php?name=PNphpBB2&file=viewtopic&t=71985&view=previous*/
/* */
/****************************************************************/
 
#include "messages.h"
 
PGM_P MessageTableGerman[LAST_NAT_MESSAGE+1] PROGMEM = {
MSG_TABLE(GERMAN, MSG_LANGUAGE),
MSG_TABLE(GERMAN, MSG_GERMAN),
MSG_TABLE(GERMAN, MSG_ENGLISH),
MSG_TABLE(GERMAN, MSG_FRENCH),
MSG_TABLE(GERMAN, MSG_RETURN),
MSG_TABLE(GERMAN, MSG_AV_SOURCE),
MSG_TABLE(GERMAN, MSG_RX_CHANNEL),
MSG_TABLE(GERMAN, MSG_RSSI_CALIBR),
MSG_TABLE(GERMAN, MSG_RSSI_MIN_ALL),
MSG_TABLE(GERMAN, MSG_CALIB),
MSG_TABLE(GERMAN, MSG_TX),
MSG_TABLE(GERMAN, MSG_TX_OFF),
MSG_TABLE(GERMAN, MSG_TX_ON),
MSG_TABLE(GERMAN, MSG_CONTINUE),
MSG_TABLE(GERMAN, MSG_CONTRAST),
MSG_TABLE(GERMAN, MSG_BACKGR_LIGHT),
MSG_TABLE(GERMAN, MSG_LIGHT),
MSG_TABLE(GERMAN, MSG_LIGHT_OFF),
MSG_TABLE(GERMAN, MSG_LIGHT_ON),
MSG_TABLE(GERMAN, MSG_SEC),
MSG_TABLE(GERMAN, MSG_BATTERY),
MSG_TABLE(GERMAN, MSG_U_MIN),
MSG_TABLE(GERMAN, MSG_U_SETUP),
MSG_TABLE(GERMAN, MSG_U_OFFSET),
MSG_TABLE(GERMAN, MSG_MK_BATTERY),
MSG_TABLE(GERMAN, MSG_MK_BAT_NR),
MSG_TABLE(GERMAN, MSG_MK_BAT_CAPACITY),
MSG_TABLE(GERMAN, MSG_MK_I_OFFSET),
MSG_TABLE(GERMAN, MSG_MK_I_FAKTOR),
MSG_TABLE(GERMAN, MSG_MK_W_FAKTOR),
MSG_TABLE(GERMAN, MSG_CALIBRATION),
MSG_TABLE(GERMAN, MSG_RUNNING),
MSG_TABLE(GERMAN, MSG_ERROR),
MSG_TABLE(GERMAN, MSG_TX_NOT),
MSG_TABLE(GERMAN, MSG_ACCU_LOW),
MSG_TABLE(GERMAN, MSG_SERVO_CALIBR),
MSG_TABLE(GERMAN, MSG_SERVO_STEPS),
MSG_TABLE(GERMAN, MSG_SERVO1_REVERSE),
MSG_TABLE(GERMAN, MSG_CALIB1_LEFT),
MSG_TABLE(GERMAN, MSG_CALIB1_RIGHT),
MSG_TABLE(GERMAN, MSG_CALIB1_MIDDLE),
MSG_TABLE(GERMAN, MSG_SERVO2_REVERSE),
MSG_TABLE(GERMAN, MSG_CALIB2_LEFT),
MSG_TABLE(GERMAN, MSG_CALIB2_RIGHT),
MSG_TABLE(GERMAN, MSG_CALIB2_MIDDLE),
MSG_TABLE(GERMAN, MSG_FRAME),
MSG_TABLE(GERMAN, MSG_PULSE_WIDTH),
MSG_TABLE(GERMAN, MSG_CONTINOUS),
MSG_TABLE(GERMAN, MSG_SINGLE_STE),
MSG_TABLE(GERMAN, MSG_REPEAT),
MSG_TABLE(GERMAN, MSG_PAUSE),
MSG_TABLE(GERMAN, MSG_PAUSE_STEP),
MSG_TABLE(GERMAN, MSG_START),
MSG_TABLE(GERMAN, MSG_OFF),
MSG_TABLE(GERMAN, MSG_ON),
MSG_TABLE(GERMAN, MSG_TRACKING),
MSG_TABLE(GERMAN, MSG_TRACK_GPS),
MSG_TABLE(GERMAN, MSG_TRACK_TX_OSD_DATA),
MSG_TABLE(GERMAN, MSG_HYSTERESE),
MSG_TABLE(GERMAN, MSG_TRACK_TX_ON),
MSG_TABLE(GERMAN, MSG_GPS_DISPLAY),
MSG_TABLE(GERMAN, MSG_GPS_CALCULATE),
MSG_TABLE(GERMAN, MSG_GPS_CURRENT),
MSG_TABLE(GERMAN, MSG_GPS_HOME),
MSG_TABLE(GERMAN, MSG_GPS_MISC),
MSG_TABLE(GERMAN, MSG_GPS_NO_DATA),
MSG_TABLE(GERMAN, MSG_RX_TIME),
MSG_TABLE(GERMAN, MSG_COM),
MSG_TABLE(GERMAN, MSG_KOMMA),
MSG_TABLE(GERMAN, MSG_UHW33V),
};
 
PGM_P MessageTableEnglish[LAST_NAT_MESSAGE+1] PROGMEM = {
MSG_TABLE(ENGLISH, MSG_LANGUAGE),
MSG_TABLE(ENGLISH, MSG_GERMAN),
MSG_TABLE(ENGLISH, MSG_ENGLISH),
MSG_TABLE(ENGLISH, MSG_FRENCH),
MSG_TABLE(ENGLISH, MSG_RETURN),
MSG_TABLE(ENGLISH, MSG_AV_SOURCE),
MSG_TABLE(ENGLISH, MSG_RX_CHANNEL),
MSG_TABLE(ENGLISH, MSG_RSSI_CALIBR),
MSG_TABLE(ENGLISH, MSG_RSSI_MIN_ALL),
MSG_TABLE(ENGLISH, MSG_CALIB),
MSG_TABLE(ENGLISH, MSG_TX),
MSG_TABLE(ENGLISH, MSG_TX_OFF),
MSG_TABLE(ENGLISH, MSG_TX_ON),
MSG_TABLE(ENGLISH, MSG_CONTINUE),
MSG_TABLE(ENGLISH, MSG_CONTRAST),
MSG_TABLE(ENGLISH, MSG_BACKGR_LIGHT),
MSG_TABLE(ENGLISH, MSG_LIGHT),
MSG_TABLE(ENGLISH, MSG_LIGHT_OFF),
MSG_TABLE(ENGLISH, MSG_LIGHT_ON),
MSG_TABLE(ENGLISH, MSG_SEC),
MSG_TABLE(ENGLISH, MSG_BATTERY),
MSG_TABLE(ENGLISH, MSG_U_MIN),
MSG_TABLE(ENGLISH, MSG_U_SETUP),
MSG_TABLE(ENGLISH, MSG_U_OFFSET),
MSG_TABLE(ENGLISH, MSG_MK_BATTERY),
MSG_TABLE(ENGLISH, MSG_MK_BAT_NR),
MSG_TABLE(ENGLISH, MSG_MK_BAT_CAPACITY),
MSG_TABLE(ENGLISH, MSG_MK_I_OFFSET),
MSG_TABLE(ENGLISH, MSG_MK_I_FAKTOR),
MSG_TABLE(ENGLISH, MSG_MK_W_FAKTOR),
MSG_TABLE(ENGLISH, MSG_CALIBRATION),
MSG_TABLE(ENGLISH, MSG_RUNNING),
MSG_TABLE(ENGLISH, MSG_ERROR),
MSG_TABLE(ENGLISH, MSG_TX_NOT),
MSG_TABLE(ENGLISH, MSG_ACCU_LOW),
MSG_TABLE(ENGLISH, MSG_SERVO_CALIBR),
MSG_TABLE(ENGLISH, MSG_SERVO_STEPS),
MSG_TABLE(ENGLISH, MSG_SERVO1_REVERSE),
MSG_TABLE(ENGLISH, MSG_CALIB1_LEFT),
MSG_TABLE(ENGLISH, MSG_CALIB1_RIGHT),
MSG_TABLE(ENGLISH, MSG_CALIB1_MIDDLE),
MSG_TABLE(ENGLISH, MSG_SERVO2_REVERSE),
MSG_TABLE(ENGLISH, MSG_CALIB2_LEFT),
MSG_TABLE(ENGLISH, MSG_CALIB2_RIGHT),
MSG_TABLE(ENGLISH, MSG_CALIB2_MIDDLE),
MSG_TABLE(ENGLISH, MSG_FRAME),
MSG_TABLE(ENGLISH, MSG_PULSE_WIDTH),
MSG_TABLE(ENGLISH, MSG_CONTINOUS),
MSG_TABLE(ENGLISH, MSG_SINGLE_STE),
MSG_TABLE(ENGLISH, MSG_REPEAT),
MSG_TABLE(ENGLISH, MSG_PAUSE),
MSG_TABLE(ENGLISH, MSG_PAUSE_STEP),
MSG_TABLE(ENGLISH, MSG_START),
MSG_TABLE(ENGLISH, MSG_OFF),
MSG_TABLE(ENGLISH, MSG_ON),
MSG_TABLE(ENGLISH, MSG_TRACKING),
MSG_TABLE(ENGLISH, MSG_TRACK_GPS),
MSG_TABLE(ENGLISH, MSG_TRACK_TX_OSD_DATA),
MSG_TABLE(ENGLISH, MSG_HYSTERESE),
MSG_TABLE(ENGLISH, MSG_TRACK_TX_ON),
MSG_TABLE(ENGLISH, MSG_GPS_DISPLAY),
MSG_TABLE(ENGLISH, MSG_GPS_CALCULATE),
MSG_TABLE(ENGLISH, MSG_GPS_CURRENT),
MSG_TABLE(ENGLISH, MSG_GPS_HOME),
MSG_TABLE(ENGLISH, MSG_GPS_MISC),
MSG_TABLE(ENGLISH, MSG_GPS_NO_DATA),
MSG_TABLE(ENGLISH, MSG_RX_TIME),
MSG_TABLE(ENGLISH, MSG_COM),
MSG_TABLE(ENGLISH, MSG_KOMMA),
MSG_TABLE(ENGLISH, MSG_UHW33V),
};
 
PGM_P MessageTableFrench[LAST_NAT_MESSAGE+1] PROGMEM = {
MSG_TABLE(FRENCH, MSG_LANGUAGE),
MSG_TABLE(FRENCH, MSG_GERMAN),
MSG_TABLE(FRENCH, MSG_ENGLISH),
MSG_TABLE(FRENCH, MSG_FRENCH),
MSG_TABLE(FRENCH, MSG_RETURN),
MSG_TABLE(FRENCH, MSG_AV_SOURCE),
MSG_TABLE(FRENCH, MSG_RX_CHANNEL),
MSG_TABLE(FRENCH, MSG_RSSI_CALIBR),
MSG_TABLE(FRENCH, MSG_RSSI_MIN_ALL),
MSG_TABLE(FRENCH, MSG_CALIB),
MSG_TABLE(FRENCH, MSG_TX),
MSG_TABLE(FRENCH, MSG_TX_OFF),
MSG_TABLE(FRENCH, MSG_TX_ON),
MSG_TABLE(FRENCH, MSG_CONTINUE),
MSG_TABLE(FRENCH, MSG_CONTRAST),
MSG_TABLE(FRENCH, MSG_BACKGR_LIGHT),
MSG_TABLE(FRENCH, MSG_LIGHT),
MSG_TABLE(FRENCH, MSG_LIGHT_OFF),
MSG_TABLE(FRENCH, MSG_LIGHT_ON),
MSG_TABLE(FRENCH, MSG_SEC),
MSG_TABLE(FRENCH, MSG_BATTERY),
MSG_TABLE(FRENCH, MSG_U_MIN),
MSG_TABLE(FRENCH, MSG_U_SETUP),
MSG_TABLE(FRENCH, MSG_U_OFFSET),
MSG_TABLE(FRENCH, MSG_MK_BATTERY),
MSG_TABLE(FRENCH, MSG_MK_BAT_NR),
MSG_TABLE(FRENCH, MSG_MK_BAT_CAPACITY),
MSG_TABLE(FRENCH, MSG_MK_I_OFFSET),
MSG_TABLE(FRENCH, MSG_MK_I_FAKTOR),
MSG_TABLE(FRENCH, MSG_MK_W_FAKTOR),
MSG_TABLE(FRENCH, MSG_CALIBRATION),
MSG_TABLE(FRENCH, MSG_RUNNING),
MSG_TABLE(FRENCH, MSG_ERROR),
MSG_TABLE(FRENCH, MSG_TX_NOT),
MSG_TABLE(FRENCH, MSG_ACCU_LOW),
MSG_TABLE(FRENCH, MSG_SERVO_CALIBR),
MSG_TABLE(FRENCH, MSG_SERVO_STEPS),
MSG_TABLE(FRENCH, MSG_SERVO1_REVERSE),
MSG_TABLE(FRENCH, MSG_CALIB1_LEFT),
MSG_TABLE(FRENCH, MSG_CALIB1_RIGHT),
MSG_TABLE(FRENCH, MSG_CALIB1_MIDDLE),
MSG_TABLE(FRENCH, MSG_SERVO2_REVERSE),
MSG_TABLE(FRENCH, MSG_CALIB2_LEFT),
MSG_TABLE(FRENCH, MSG_CALIB2_RIGHT),
MSG_TABLE(FRENCH, MSG_CALIB2_MIDDLE),
MSG_TABLE(FRENCH, MSG_FRAME),
MSG_TABLE(FRENCH, MSG_PULSE_WIDTH),
MSG_TABLE(FRENCH, MSG_CONTINOUS),
MSG_TABLE(FRENCH, MSG_SINGLE_STE),
MSG_TABLE(FRENCH, MSG_REPEAT),
MSG_TABLE(FRENCH, MSG_PAUSE),
MSG_TABLE(FRENCH, MSG_PAUSE_STEP),
MSG_TABLE(FRENCH, MSG_START),
MSG_TABLE(FRENCH, MSG_OFF),
MSG_TABLE(FRENCH, MSG_ON),
MSG_TABLE(FRENCH, MSG_TRACKING),
MSG_TABLE(FRENCH, MSG_TRACK_GPS),
MSG_TABLE(FRENCH, MSG_TRACK_TX_OSD_DATA),
MSG_TABLE(FRENCH, MSG_HYSTERESE),
MSG_TABLE(FRENCH, MSG_TRACK_TX_ON),
MSG_TABLE(FRENCH, MSG_GPS_DISPLAY),
MSG_TABLE(FRENCH, MSG_GPS_CALCULATE),
MSG_TABLE(FRENCH, MSG_GPS_CURRENT),
MSG_TABLE(FRENCH, MSG_GPS_HOME),
MSG_TABLE(FRENCH, MSG_GPS_MISC),
MSG_TABLE(FRENCH, MSG_GPS_NO_DATA),
MSG_TABLE(FRENCH, MSG_RX_TIME),
MSG_TABLE(FRENCH, MSG_COM),
MSG_TABLE(FRENCH, MSG_KOMMA),
MSG_TABLE(FRENCH, MSG_UHW33V),
};
 
PGM_P MessageTableInternational[MESSAGE_LAST_MESSAGE+1] PROGMEM = {
MSG_TABLE(INTERNAT, MSG_RSSI_MIN),
MSG_TABLE(INTERNAT, MSG_RSSI_MAX),
MSG_TABLE(INTERNAT, MSG_DIVERSITY),
MSG_TABLE(INTERNAT, MSG_LCD),
MSG_TABLE(INTERNAT, MSG_AV1),
MSG_TABLE(INTERNAT, MSG_AV2),
MSG_TABLE(INTERNAT, MSG_RX1),
MSG_TABLE(INTERNAT, MSG_RX2),
MSG_TABLE(INTERNAT, MSG_STEPS_255),
MSG_TABLE(INTERNAT, MSG_STEPS_1023),
MSG_TABLE(INTERNAT, MSG_SERVO),
MSG_TABLE(INTERNAT, MSG_SERVO1),
MSG_TABLE(INTERNAT, MSG_SERVO2),
MSG_TABLE(INTERNAT, MSG_TEST_SERVO),
MSG_TABLE(INTERNAT, MSG_TRACK_RSSI),
MSG_TABLE(INTERNAT, MSG_TRACK_MKCOCKPIT),
MSG_TABLE(INTERNAT, MSG_TRACK_SERVO_HYTERESE),
MSG_TABLE(INTERNAT, MSG_BAUDRATE),
MSG_TABLE(INTERNAT, MSG_UHW5V),
MSG_TABLE(INTERNAT, MSG_VERSION1),
MSG_TABLE(INTERNAT, MSG_VERSION2)
};
 
char* Msg(MessageType Message)
{ static char Str[LCD_LINES * LCD_COLS + 1];
 
if (Message > LAST_NAT_MESSAGE)
strcpy_P(Str, (const char*)( pgm_read_word( &(MessageTableInternational[Message - LAST_NAT_MESSAGE - 1]))));
else
switch (language) {
case ENGLISH: strcpy_P(Str, (const char*)( pgm_read_word( &(MessageTableEnglish[Message]))));
break;
case FRENCH : strcpy_P(Str, (const char*)( pgm_read_word( &(MessageTableFrench[Message]))));
break;
default: strcpy_P(Str, (const char*)( pgm_read_word( &(MessageTableGerman[Message]))));
}
return(Str);
}
/NGVideo5_8/tags/v1.21/messages.h
0,0 → 1,619
 
/****************************************************************/
/* */
/* NG-Video 5,8GHz */
/* */
/* Copyright (C) 2011 - gebad */
/* */
/* This code is distributed under the GNU Public License */
/* which can be found at http://www.gnu.org/licenses/gpl.txt */
/* */
/* using */
/* http://www.avrfreaks.net/ */
/* index.php?name=PNphpBB2&file=viewtopic&t=71985&view=previous*/
/* */
/****************************************************************/
 
#ifndef _MESSAGES_H_
#define _MESSAGES_H_
 
#include <avr/pgmspace.h>
 
/* International */
#define INTERNAT_RSSI_MIN "RSSI-Min"
#define INTERNAT_RSSI_MAX "RSSI-Max"
#define INTERNAT_DIVERSITY "Diversity"
#define INTERNAT_LCD "LCD"
#define INTERNAT_AV1 "AV1"
#define INTERNAT_AV2 "AV2"
#define INTERNAT_RX1 "1.RX:"
#define INTERNAT_RX2 "2.RX:"
#define INTERNAT_STEPS_255 "255"
#define INTERNAT_STEPS_1023 "1023"
#define INTERNAT_SERVO "Servo"
#define INTERNAT_SERVO1 "Servo 1"
#define INTERNAT_SERVO2 "Servo 2"
#define INTERNAT_TEST_SERVO "Servo-Test"
#define INTERNAT_TRACK_RSSI "RSSI"
#define INTERNAT_TRACK_MKCOCKPIT "MK-Cockpit"
#define INTERNAT_TRACK_SERVO_HYTERESE "Servo-Hyster."
#define INTERNAT_BAUDRATE "Baudrate"
#define INTERNAT_UHW5V " 5V"
#define INTERNAT_VERSION1 "NG-Video 5.8GHz\nHW: "
#define INTERNAT_VERSION2 " M.Beck""FW: "VERSION " gebad"
 
#define GERMAN_LANGUAGE "Sprache"
#define GERMAN_GERMAN "Deutsch"
#define GERMAN_ENGLISH "Englisch"
#define GERMAN_FRENCH "Franz""\x94""sisch"
#define GERMAN_RETURN "Zur""\x81""ck"
#define GERMAN_AV_SOURCE "AV-Quelle"
#define GERMAN_RX_CHANNEL "RX-Kanal"
#define GERMAN_RSSI_CALIBR "RSSI-Kalibr."
#define GERMAN_RSSI_MIN_ALL "Min alle Kan."
#define GERMAN_TX "Bitte TX auf "
#define GERMAN_TX_OFF "AUS"
#define GERMAN_TX_ON "EIN"
#define GERMAN_CONTINUE "Weiter mit Enter"
#define GERMAN_CONTRAST "Kontrast"
#define GERMAN_BACKGR_LIGHT "LCD-Beleucht."
#define GERMAN_LIGHT "Licht:"
#define GERMAN_LIGHT_OFF " immer aus"
#define GERMAN_LIGHT_ON " immer ein"
#define GERMAN_SEC " Sek."
#define GERMAN_BATTERY "Batterie"
#define GERMAN_U_MIN "U-Min"
#define GERMAN_U_SETUP "Untersp.-Setup"
#define GERMAN_U_OFFSET "U-Offset"
#define GERMAN_MSG_MK_BATTERY "MK-Batterie"
#define GERMAN_MSG_MK_BAT_NR "Bat. Nummer"
#define GERMAN_MSG_MK_BAT_CAPACITY "Bat. Kapazit""\x84""t"
#define GERMAN_MSG_MK_I_OFFSET "I-Offset"
#define GERMAN_MSG_MK_I_FAKTOR "I-Koeffizient"
#define GERMAN_MSG_MK_W_FAKTOR "W-Koeffizient"
#define GERMAN_CALIBRATION "Kalibrierung"
#define GERMAN_RUNNING "l""\x84""uft"
#define GERMAN_ERROR "Fehler!"
#define GERMAN_TX_NOT "Sender nicht "
#define GERMAN_ACCU_LOW " Akku\n entladen!"
#define GERMAN_SERVO_CALIBR "Servo-Kalibr."
#define GERMAN_SERVO_STEPS "Servo-Schritte"
#define GERMAN_CALIB "Kalib."
#define GERMAN_LEFT "links"
#define GERMAN_RIGHT "rechts"
#define GERMAN_MIDDLE "Mitte"
#define GERMAN_REVERSE "rev."
#define GERMAN_SERVO1_REVERSE INTERNAT_SERVO1 " " GERMAN_REVERSE
#define GERMAN_CALIB1_LEFT GERMAN_CALIB "1 " GERMAN_LEFT
#define GERMAN_CALIB1_RIGHT GERMAN_CALIB "1 " GERMAN_RIGHT
#define GERMAN_CALIB1_MIDDLE GERMAN_CALIB "1 " GERMAN_MIDDLE
#define GERMAN_SERVO2_REVERSE INTERNAT_SERVO2 " " GERMAN_REVERSE
#define GERMAN_CALIB2_LEFT GERMAN_CALIB "2 " GERMAN_LEFT
#define GERMAN_CALIB2_RIGHT GERMAN_CALIB "2 " GERMAN_RIGHT
#define GERMAN_CALIB2_MIDDLE GERMAN_CALIB "2 " GERMAN_MIDDLE
#define GERMAN_FRAME "Periode"
#define GERMAN_PULSE_WIDTH "Test Pulsl""\x84""nge"
#define GERMAN_CONTINOUS "Test fortlauf."
#define GERMAN_SINGLE_STEP "Einzelschritte"
#define GERMAN_REPEAT "Anzahl Tests"
#define GERMAN_PAUSE "Pause Endpos."
#define GERMAN_PAUSE_STEP "Pause pro Inc."
#define GERMAN_START "Start Test"
#define GERMAN_OFF "aus"
#define GERMAN_ON "ein"
#define GERMAN_TRACKING "Antenne nachf."
#define GERMAN_TRACK_GPS "GPS mit wi232"
#define GERMAN_TRACK_TX_OSD_DATA "TX OSD-Daten"
#define GERMAN_HYSTERESE "Hysterese"
#define GERMAN_TRACK_TX_ON "Sende Forderung"
#define GERMAN_GPS_DISPLAY "GPS-Anzeigen"
#define GERMAN_GPS_CALCULATE "berechn. Daten"
#define GERMAN_GPS_CURRENT "aktuelle Pos."
#define GERMAN_GPS_HOME "Startposition"
#define GERMAN_GPS_MISC "Elektr. Werte"
#define GERMAN_GPS_NO_DATA " Noch\n keine Daten\n empfangen!"
#define GERMAN_RX_TIME "RX-Zeit"
#define GERMAN_COM "Seriell COM"
#define GERMAN_KOMMA ","
#define GERMAN_UHW33V "3,3V"
 
#define ENGLISH_LANGUAGE "Language"
#define ENGLISH_GERMAN "German"
#define ENGLISH_ENGLISH "English"
#define ENGLISH_FRENCH "French"
#define ENGLISH_RETURN "Return"
#define ENGLISH_AV_SOURCE "AV-Source"
#define ENGLISH_RX_CHANNEL "RX-Channel"
#define ENGLISH_RSSI_CALIBR "RSSI-Calibr."
#define ENGLISH_RSSI_MIN_ALL "Min all Chan."
#define ENGLISH_TX "TX switch "
#define ENGLISH_TX_OFF "OFF"
#define ENGLISH_TX_ON "ON"
#define ENGLISH_CONTINUE "Continue Enter"
#define ENGLISH_CONTRAST "Contrast"
#define ENGLISH_BACKGR_LIGHT "Backgr. Light"
#define ENGLISH_LIGHT "Light:"
#define ENGLISH_LIGHT_OFF "always off"
#define ENGLISH_LIGHT_ON " always on"
#define ENGLISH_SEC " sec."
#define ENGLISH_BATTERY "Battery"
#define ENGLISH_U_MIN "U-Min"
#define ENGLISH_U_SETUP "Low voltage"
#define ENGLISH_U_OFFSET "U-Offset"
#define ENGLISH_MSG_MK_BATTERY "MK-Battery"
#define ENGLISH_MSG_MK_BAT_NR "Bat. Number"
#define ENGLISH_MSG_MK_BAT_CAPACITY "Bat. Capacity"
#define ENGLISH_MSG_MK_I_OFFSET "I-Offset"
#define ENGLISH_MSG_MK_I_FAKTOR "I-Coefficient"
#define ENGLISH_MSG_MK_W_FAKTOR "W-Coefficient"
#define ENGLISH_CALIBRATION "Calibration"
#define ENGLISH_RUNNING "running"
#define ENGLISH_ERROR "Error!"
#define ENGLISH_TX_NOT "Transmitter not "
#define ENGLISH_ACCU_LOW " Accu\n low!"
#define ENGLISH_SERVO_CALIBR "Servo-Calibr."
#define ENGLISH_SERVO_STEPS "Servo-Steps"
#define ENGLISH_CALIB "Calib."
#define ENGLISH_LEFT "left"
#define ENGLISH_RIGHT "right"
#define ENGLISH_MIDDLE "middle"
#define ENGLISH_REVERSE "rev."
#define ENGLISH_SERVO1_REVERSE INTERNAT_SERVO1 " " ENGLISH_REVERSE
#define ENGLISH_CALIB1_LEFT ENGLISH_CALIB "1 " ENGLISH_LEFT
#define ENGLISH_CALIB1_RIGHT ENGLISH_CALIB "1 " ENGLISH_RIGHT
#define ENGLISH_CALIB1_MIDDLE ENGLISH_CALIB "1 " ENGLISH_MIDDLE
#define ENGLISH_SERVO2_REVERSE INTERNAT_SERVO2 " " ENGLISH_REVERSE
#define ENGLISH_CALIB2_LEFT ENGLISH_CALIB "2 " ENGLISH_LEFT
#define ENGLISH_CALIB2_RIGHT ENGLISH_CALIB "2 " ENGLISH_RIGHT
#define ENGLISH_CALIB2_MIDDLE ENGLISH_CALIB "2 " ENGLISH_MIDDLE
#define ENGLISH_FRAME "Periode"
#define ENGLISH_PULSE_WIDTH "Test PW"
#define ENGLISH_CONTINOUS "Test contin."
#define ENGLISH_SINGLE_STEP "Single step"
#define ENGLISH_REPEAT "Number of test"
#define ENGLISH_PAUSE "Pause end pos."
#define ENGLISH_PAUSE_STEP "Pause pro inc."
#define ENGLISH_START "Start Test"
#define ENGLISH_OFF "off"
#define ENGLISH_ON "on "
#define ENGLISH_TRACKING "Tracking"
#define ENGLISH_TRACK_GPS "GPS with wi232"
#define ENGLISH_TRACK_TX_OSD_DATA "TX OSD-Data"
#define ENGLISH_HYSTERESE "Hysterese"
#define ENGLISH_TRACK_TX_ON "Transmit demand"
#define ENGLISH_GPS_DISPLAY "Display GPS"
#define ENGLISH_GPS_CALCULATE "calc. Data"
#define ENGLISH_GPS_CURRENT "current Pos."
#define ENGLISH_GPS_HOME "Homeposition"
#define ENGLISH_GPS_MISC "Elictric Val."
#define ENGLISH_GPS_NO_DATA " Not yet\n Data\n received!"
#define ENGLISH_RX_TIME "RX-Time"
#define ENGLISH_COM "Seriell COM"
#define ENGLISH_KOMMA "."
#define ENGLISH_UHW33V "3.3V"
 
#define FRENCH_LANGUAGE "Langue"
#define FRENCH_GERMAN "Allemand"
#define FRENCH_ENGLISH "Anglais"
#define FRENCH_FRENCH "Fran""\x87""ais"
#define FRENCH_RETURN "Retour"
#define FRENCH_AV_SOURCE "AV-Source"
#define FRENCH_RX_CHANNEL "RX-Canal"
#define FRENCH_RSSI_CALIBR "RSSI-Calibr."
#define FRENCH_RSSI_MIN_ALL "Tout""\x85""z""\x82""ro"
#define FRENCH_TX ""
#define FRENCH_TX_OFF "Eteindre Tx"
#define FRENCH_TX_ON "Allumer Tx"
#define FRENCH_CONTINUE "App. Enter"
#define FRENCH_CONTRAST "Contraste"
#define FRENCH_BACKGR_LIGHT "Retr. Ecl"
#define FRENCH_LIGHT "Eclai:"
#define FRENCH_LIGHT_OFF " Eteint"
#define FRENCH_LIGHT_ON " Tjrs ON"
#define FRENCH_SEC " Sec."
#define FRENCH_BATTERY "Batterie"
#define FRENCH_U_MIN "V-Min"
#define FRENCH_U_SETUP "Seuil Alarme"
#define FRENCH_U_OFFSET "V-Offset"
#define FRENCH_MSG_MK_BATTERY "MK-Batterie"
#define FRENCH_MSG_MK_BAT_NR "Bat. num""\x82""ro"
#define FRENCH_MSG_MK_BAT_CAPACITY "Bat. capacit""\x82"
#define FRENCH_MSG_MK_I_OFFSET "I-Offset"
#define FRENCH_MSG_MK_I_FAKTOR "I-Coefficient"
#define FRENCH_MSG_MK_W_FAKTOR "W-Coefficient"
#define FRENCH_CALIBRATION "Calibration"
#define FRENCH_RUNNING "En cours"
#define FRENCH_ERROR "Erreur!"
#define FRENCH_TX_NOT "No Tx"
#define FRENCH_ACCU_LOW " Batterie\n faible!"
#define FRENCH_SERVO_CALIBR "Servo-Calibr"
#define FRENCH_SERVO_STEPS "Nbre de Pas"
#define FRENCH_CALIB "Calib."
#define FRENCH_LEFT "Gauche"
#define FRENCH_RIGHT "Droit"
#define FRENCH_MIDDLE "Milieu"
#define FRENCH_REVERSE "Inversion"
#define FRENCH_SERVO1_REVERSE "Invers. Servo1"
#define FRENCH_CALIB1_LEFT "Cal. Gauche"
#define FRENCH_CALIB1_RIGHT "Cal. Droite"
#define FRENCH_CALIB1_MIDDLE "Cal. Centre"
#define FRENCH_SERVO2_REVERSE "Invers. Servo2"
#define FRENCH_CALIB2_LEFT "Cal. Gauche"
#define FRENCH_CALIB2_RIGHT "Cal. Droite"
#define FRENCH_CALIB2_MIDDLE "Cal. Centre"
#define FRENCH_FRAME "P""\x82""riode"
#define FRENCH_PULSE_WIDTH "Largeur Imp."
#define FRENCH_CONTINOUS "Test Continu"
#define FRENCH_SINGLE_STEP "1 Pas"
#define FRENCH_REPEAT "Nombre Tests"
#define FRENCH_PAUSE "Pause finale"
#define FRENCH_PAUSE_STEP "Pause par pas"
#define FRENCH_START "D""\x82""but Test"
#define FRENCH_OFF "OFF"
#define FRENCH_ON "ON "
#define FRENCH_TRACKING "Tracking"
#define FRENCH_TRACK_GPS "GPS with wi232"
#define FRENCH_TRACK_TX_OSD_DATA "TX OSD-Data"
#define FRENCH_HYSTERESE "Hysteresis"
#define FRENCH_TRACK_TX_ON "Donn""\x82""e Transmie"
#define FRENCH_GPS_DISPLAY "Affichage GPS"
#define FRENCH_GPS_CALCULATE "Calcul GPS"
#define FRENCH_GPS_CURRENT "Pos. actuelle"
#define FRENCH_GPS_HOME "Homeposition"
#define FRENCH_GPS_MISC "\x90""l""\x82""ctr. val."
#define FRENCH_GPS_NO_DATA " Aucune donn""\x82""e\n re""\x87""ue!"
#define FRENCH_RX_TIME "RX-Temps"
#define FRENCH_COM "COM. S""\x82""rie"
#define FRENCH_KOMMA "."
#define FRENCH_UHW33V "3.3V"
 
 
/* Languages */
#define GERMAN 0
#define ENGLISH 1
#define FRENCH 2
#define LAST_LANG 2
#define INTERNAT LAST_LANG + 1
#define NO_LANGUAGE 254 // für Sprachabfrage bei Erstinbetriebnahme NGVideo
 
/* Message languages */
#define MSG_LANGUAGE 0
#define MSG_GERMAN 1
#define MSG_ENGLISH 2
#define MSG_FRENCH 3
#define MSG_RETURN 4
#define MSG_AV_SOURCE 5
#define MSG_RX_CHANNEL 6
#define MSG_RSSI_CALIBR 7
#define MSG_RSSI_MIN_ALL 8
#define MSG_CALIB 9
#define MSG_TX 10
#define MSG_TX_OFF 11
#define MSG_TX_ON 12
#define MSG_CONTINUE 13
#define MSG_CONTRAST 14
#define MSG_BACKGR_LIGHT 15
#define MSG_LIGHT 16
#define MSG_LIGHT_OFF 17
#define MSG_LIGHT_ON 18
#define MSG_SEC 19
#define MSG_BATTERY 20
#define MSG_U_MIN 21
#define MSG_U_SETUP 22
#define MSG_U_OFFSET 23
#define MSG_MK_BATTERY 24
#define MSG_MK_BAT_NR 25
#define MSG_MK_BAT_CAPACITY 26
#define MSG_MK_I_OFFSET 27
#define MSG_MK_I_FAKTOR 28
#define MSG_MK_W_FAKTOR 29
#define MSG_CALIBRATION 30
#define MSG_RUNNING 31
#define MSG_ERROR 32
#define MSG_TX_NOT 33
#define MSG_ACCU_LOW 34
#define MSG_SERVO_CALIBR 35
#define MSG_SERVO_STEPS 36
#define MSG_SERVO1_REVERSE 37
#define MSG_CALIB1_LEFT 38
#define MSG_CALIB1_RIGHT 39
#define MSG_CALIB1_MIDDLE 40
#define MSG_SERVO2_REVERSE 41
#define MSG_CALIB2_LEFT 42
#define MSG_CALIB2_RIGHT 43
#define MSG_CALIB2_MIDDLE 44
#define MSG_FRAME 45
#define MSG_PULSE_WIDTH 46
#define MSG_CONTINOUS 47
#define MSG_SINGLE_STEP 48
#define MSG_REPEAT 49
#define MSG_PAUSE 50
#define MSG_PAUSE_STEP 51
#define MSG_START 52
#define MSG_OFF 53
#define MSG_ON 54
#define MSG_TRACKING 55
#define MSG_TRACK_GPS 56
#define MSG_TRACK_TX_OSD_DATA 57
#define MSG_HYSTERESE 58
#define MSG_TRACK_TX_ON 59
#define MSG_GPS_DISPLAY 60
#define MSG_GPS_CALCULATE 61
#define MSG_GPS_CURRENT 62
#define MSG_GPS_HOME 63
#define MSG_GPS_MISC 64
#define MSG_GPS_NO_DATA 65
#define MSG_RX_TIME 66
#define MSG_COM 67
#define MSG_KOMMA 68
#define MSG_UHW33V 69
#define LAST_NAT_MESSAGE 69
 
/* International */
#define MSG_RSSI_MIN 0 + LAST_NAT_MESSAGE + 1
#define MSG_RSSI_MAX 1 + LAST_NAT_MESSAGE + 1
#define MSG_DIVERSITY 2 + LAST_NAT_MESSAGE + 1
#define MSG_LCD 3 + LAST_NAT_MESSAGE + 1
#define MSG_AV1 4 + LAST_NAT_MESSAGE + 1
#define MSG_AV2 5 + LAST_NAT_MESSAGE + 1
#define MSG_RX1 6 + LAST_NAT_MESSAGE + 1
#define MSG_RX2 7 + LAST_NAT_MESSAGE + 1
#define MSG_STEPS_255 8 + LAST_NAT_MESSAGE + 1
#define MSG_STEPS_1023 9 + LAST_NAT_MESSAGE + 1
#define MSG_SERVO 10 + LAST_NAT_MESSAGE + 1
#define MSG_SERVO1 11 + LAST_NAT_MESSAGE + 1
#define MSG_SERVO2 12 + LAST_NAT_MESSAGE + 1
#define MSG_TEST_SERVO 13 + LAST_NAT_MESSAGE + 1
#define MSG_TRACK_RSSI 14 + LAST_NAT_MESSAGE + 1
#define MSG_TRACK_MKCOCKPIT 15 + LAST_NAT_MESSAGE + 1
#define MSG_TRACK_SERVO_HYTERESE 16 + LAST_NAT_MESSAGE + 1
#define MSG_BAUDRATE 17 + LAST_NAT_MESSAGE + 1
#define MSG_UHW5V 18 + LAST_NAT_MESSAGE + 1
#define MSG_VERSION1 19 + LAST_NAT_MESSAGE + 1
#define MSG_VERSION2 20 + LAST_NAT_MESSAGE + 1
#define MESSAGE_LAST_MESSAGE 20
 
#define MSG_TABLE(l,n) mt ## l ## _ ## n
#define MSG_STRING(l,n,s) \
const char mt ## l ## _ ## n [] PROGMEM = s ;
 
MSG_STRING(INTERNAT, MSG_RSSI_MIN, INTERNAT_RSSI_MIN)
MSG_STRING(INTERNAT, MSG_RSSI_MAX, INTERNAT_RSSI_MAX)
MSG_STRING(INTERNAT, MSG_DIVERSITY, INTERNAT_DIVERSITY)
MSG_STRING(INTERNAT, MSG_LCD, INTERNAT_LCD)
MSG_STRING(INTERNAT, MSG_AV1, INTERNAT_AV1)
MSG_STRING(INTERNAT, MSG_AV2, INTERNAT_AV2)
MSG_STRING(INTERNAT, MSG_RX1, INTERNAT_RX1)
MSG_STRING(INTERNAT, MSG_RX2, INTERNAT_RX2)
MSG_STRING(INTERNAT, MSG_STEPS_255, INTERNAT_STEPS_255)
MSG_STRING(INTERNAT, MSG_STEPS_1023, INTERNAT_STEPS_1023)
MSG_STRING(INTERNAT, MSG_SERVO, INTERNAT_SERVO)
MSG_STRING(INTERNAT, MSG_SERVO1, INTERNAT_SERVO1)
MSG_STRING(INTERNAT, MSG_SERVO2, INTERNAT_SERVO2)
MSG_STRING(INTERNAT, MSG_TEST_SERVO, INTERNAT_TEST_SERVO)
MSG_STRING(INTERNAT, MSG_TRACK_RSSI, INTERNAT_TRACK_RSSI)
MSG_STRING(INTERNAT, MSG_TRACK_MKCOCKPIT, INTERNAT_TRACK_MKCOCKPIT)
MSG_STRING(INTERNAT, MSG_TRACK_SERVO_HYTERESE, INTERNAT_TRACK_SERVO_HYTERESE)
MSG_STRING(INTERNAT, MSG_BAUDRATE, INTERNAT_BAUDRATE)
MSG_STRING(INTERNAT, MSG_UHW5V, INTERNAT_UHW5V)
MSG_STRING(INTERNAT, MSG_VERSION1, INTERNAT_VERSION1)
MSG_STRING(INTERNAT, MSG_VERSION2, INTERNAT_VERSION2)
 
MSG_STRING(GERMAN, MSG_LANGUAGE, GERMAN_LANGUAGE)
MSG_STRING(GERMAN, MSG_GERMAN, GERMAN_GERMAN)
MSG_STRING(GERMAN, MSG_ENGLISH, GERMAN_ENGLISH)
MSG_STRING(GERMAN, MSG_FRENCH, GERMAN_FRENCH)
MSG_STRING(GERMAN, MSG_RETURN, GERMAN_RETURN)
MSG_STRING(GERMAN, MSG_AV_SOURCE, GERMAN_AV_SOURCE)
MSG_STRING(GERMAN, MSG_RX_CHANNEL, GERMAN_RX_CHANNEL)
MSG_STRING(GERMAN, MSG_RSSI_CALIBR, GERMAN_RSSI_CALIBR)
MSG_STRING(GERMAN, MSG_RSSI_MIN_ALL, GERMAN_RSSI_MIN_ALL)
MSG_STRING(GERMAN, MSG_CALIB, GERMAN_CALIB)
MSG_STRING(GERMAN, MSG_TX, GERMAN_TX)
MSG_STRING(GERMAN, MSG_TX_OFF, GERMAN_TX_OFF)
MSG_STRING(GERMAN, MSG_TX_ON, GERMAN_TX_ON)
MSG_STRING(GERMAN, MSG_CONTINUE, GERMAN_CONTINUE)
MSG_STRING(GERMAN, MSG_CONTRAST, GERMAN_CONTRAST)
MSG_STRING(GERMAN, MSG_BACKGR_LIGHT, GERMAN_BACKGR_LIGHT)
MSG_STRING(GERMAN, MSG_LIGHT, GERMAN_LIGHT)
MSG_STRING(GERMAN, MSG_LIGHT_OFF, GERMAN_LIGHT_OFF)
MSG_STRING(GERMAN, MSG_LIGHT_ON, GERMAN_LIGHT_ON)
MSG_STRING(GERMAN, MSG_SEC, GERMAN_SEC)
MSG_STRING(GERMAN, MSG_BATTERY, GERMAN_BATTERY)
MSG_STRING(GERMAN, MSG_U_MIN, GERMAN_U_MIN)
MSG_STRING(GERMAN, MSG_U_SETUP, GERMAN_U_SETUP)
MSG_STRING(GERMAN, MSG_U_OFFSET, GERMAN_U_OFFSET)
MSG_STRING(GERMAN, MSG_MK_BATTERY, GERMAN_MSG_MK_BATTERY)
MSG_STRING(GERMAN, MSG_MK_BAT_NR, GERMAN_MSG_MK_BAT_NR)
MSG_STRING(GERMAN, MSG_MK_BAT_CAPACITY, GERMAN_MSG_MK_BAT_CAPACITY)
MSG_STRING(GERMAN, MSG_MK_I_OFFSET, GERMAN_MSG_MK_I_OFFSET)
MSG_STRING(GERMAN, MSG_MK_I_FAKTOR, GERMAN_MSG_MK_I_FAKTOR)
MSG_STRING(GERMAN, MSG_MK_W_FAKTOR, GERMAN_MSG_MK_W_FAKTOR)
MSG_STRING(GERMAN, MSG_CALIBRATION, GERMAN_CALIBRATION)
MSG_STRING(GERMAN, MSG_RUNNING, GERMAN_RUNNING)
MSG_STRING(GERMAN, MSG_ERROR, GERMAN_ERROR)
MSG_STRING(GERMAN, MSG_TX_NOT, GERMAN_TX_NOT)
MSG_STRING(GERMAN, MSG_ACCU_LOW, GERMAN_ACCU_LOW)
MSG_STRING(GERMAN, MSG_SERVO_CALIBR, GERMAN_SERVO_CALIBR)
MSG_STRING(GERMAN, MSG_SERVO_STEPS, GERMAN_SERVO_STEPS)
MSG_STRING(GERMAN, MSG_SERVO1_REVERSE, GERMAN_SERVO1_REVERSE)
MSG_STRING(GERMAN, MSG_CALIB1_LEFT, GERMAN_CALIB1_LEFT)
MSG_STRING(GERMAN, MSG_CALIB1_RIGHT, GERMAN_CALIB1_RIGHT)
MSG_STRING(GERMAN, MSG_CALIB1_MIDDLE, GERMAN_CALIB1_MIDDLE)
MSG_STRING(GERMAN, MSG_SERVO2_REVERSE, GERMAN_SERVO2_REVERSE)
MSG_STRING(GERMAN, MSG_CALIB2_LEFT, GERMAN_CALIB2_LEFT)
MSG_STRING(GERMAN, MSG_CALIB2_RIGHT, GERMAN_CALIB2_RIGHT)
MSG_STRING(GERMAN, MSG_CALIB2_MIDDLE, GERMAN_CALIB2_MIDDLE)
MSG_STRING(GERMAN, MSG_FRAME, GERMAN_FRAME)
MSG_STRING(GERMAN, MSG_PULSE_WIDTH, GERMAN_PULSE_WIDTH)
MSG_STRING(GERMAN, MSG_CONTINOUS, GERMAN_CONTINOUS)
MSG_STRING(GERMAN, MSG_SINGLE_STE, GERMAN_SINGLE_STEP)
MSG_STRING(GERMAN, MSG_REPEAT, GERMAN_REPEAT)
MSG_STRING(GERMAN, MSG_PAUSE, GERMAN_PAUSE)
MSG_STRING(GERMAN, MSG_PAUSE_STEP, GERMAN_PAUSE_STEP)
MSG_STRING(GERMAN, MSG_START, GERMAN_START)
MSG_STRING(GERMAN, MSG_OFF, GERMAN_OFF)
MSG_STRING(GERMAN, MSG_ON, GERMAN_ON)
MSG_STRING(GERMAN, MSG_TRACKING, GERMAN_TRACKING)
MSG_STRING(GERMAN, MSG_TRACK_GPS, GERMAN_TRACK_GPS)
MSG_STRING(GERMAN, MSG_TRACK_TX_OSD_DATA, GERMAN_TRACK_TX_OSD_DATA)
MSG_STRING(GERMAN, MSG_HYSTERESE, GERMAN_HYSTERESE)
MSG_STRING(GERMAN, MSG_TRACK_TX_ON, GERMAN_TRACK_TX_ON)
MSG_STRING(GERMAN, MSG_GPS_DISPLAY, GERMAN_GPS_DISPLAY)
MSG_STRING(GERMAN, MSG_GPS_CALCULATE, GERMAN_GPS_CALCULATE)
MSG_STRING(GERMAN, MSG_GPS_CURRENT, GERMAN_GPS_CURRENT)
MSG_STRING(GERMAN, MSG_GPS_HOME, GERMAN_GPS_HOME)
MSG_STRING(GERMAN, MSG_GPS_MISC, GERMAN_GPS_MISC)
MSG_STRING(GERMAN, MSG_GPS_NO_DATA, GERMAN_GPS_NO_DATA)
MSG_STRING(GERMAN, MSG_RX_TIME, GERMAN_RX_TIME)
MSG_STRING(GERMAN, MSG_COM, GERMAN_COM)
MSG_STRING(GERMAN, MSG_KOMMA, GERMAN_KOMMA)
MSG_STRING(GERMAN, MSG_UHW33V, GERMAN_UHW33V)
 
MSG_STRING(ENGLISH, MSG_LANGUAGE, ENGLISH_LANGUAGE)
MSG_STRING(ENGLISH, MSG_GERMAN, ENGLISH_GERMAN)
MSG_STRING(ENGLISH, MSG_ENGLISH, ENGLISH_ENGLISH)
MSG_STRING(ENGLISH, MSG_FRENCH, ENGLISH_FRENCH)
MSG_STRING(ENGLISH, MSG_RETURN, ENGLISH_RETURN)
MSG_STRING(ENGLISH, MSG_AV_SOURCE, ENGLISH_AV_SOURCE)
MSG_STRING(ENGLISH, MSG_RX_CHANNEL, ENGLISH_RX_CHANNEL)
MSG_STRING(ENGLISH, MSG_RSSI_CALIBR, ENGLISH_RSSI_CALIBR)
MSG_STRING(ENGLISH, MSG_RSSI_MIN_ALL, ENGLISH_RSSI_MIN_ALL)
MSG_STRING(ENGLISH, MSG_CALIB, ENGLISH_CALIB)
MSG_STRING(ENGLISH, MSG_TX, ENGLISH_TX)
MSG_STRING(ENGLISH, MSG_TX_OFF, ENGLISH_TX_OFF)
MSG_STRING(ENGLISH, MSG_TX_ON, ENGLISH_TX_ON)
MSG_STRING(ENGLISH, MSG_CONTINUE, ENGLISH_CONTINUE)
MSG_STRING(ENGLISH, MSG_CONTRAST, ENGLISH_CONTRAST)
MSG_STRING(ENGLISH, MSG_BACKGR_LIGHT, ENGLISH_BACKGR_LIGHT)
MSG_STRING(ENGLISH, MSG_LIGHT, ENGLISH_LIGHT)
MSG_STRING(ENGLISH, MSG_LIGHT_OFF, ENGLISH_LIGHT_OFF)
MSG_STRING(ENGLISH, MSG_LIGHT_ON, ENGLISH_LIGHT_ON)
MSG_STRING(ENGLISH, MSG_SEC, ENGLISH_SEC)
MSG_STRING(ENGLISH, MSG_BATTERY, ENGLISH_BATTERY)
MSG_STRING(ENGLISH, MSG_U_MIN, ENGLISH_U_MIN)
MSG_STRING(ENGLISH, MSG_U_SETUP, ENGLISH_U_SETUP)
MSG_STRING(ENGLISH, MSG_U_OFFSET, ENGLISH_U_OFFSET)
MSG_STRING(ENGLISH, MSG_MK_BATTERY, ENGLISH_MSG_MK_BATTERY)
MSG_STRING(ENGLISH, MSG_MK_BAT_NR, ENGLISH_MSG_MK_BAT_NR)
MSG_STRING(ENGLISH, MSG_MK_BAT_CAPACITY, ENGLISH_MSG_MK_BAT_CAPACITY)
MSG_STRING(ENGLISH, MSG_MK_I_OFFSET, ENGLISH_MSG_MK_I_OFFSET)
MSG_STRING(ENGLISH, MSG_MK_I_FAKTOR, ENGLISH_MSG_MK_I_FAKTOR)
MSG_STRING(ENGLISH, MSG_MK_W_FAKTOR, ENGLISH_MSG_MK_W_FAKTOR)
MSG_STRING(ENGLISH, MSG_CALIBRATION, ENGLISH_CALIBRATION)
MSG_STRING(ENGLISH, MSG_RUNNING, ENGLISH_RUNNING)
MSG_STRING(ENGLISH, MSG_ERROR, ENGLISH_ERROR)
MSG_STRING(ENGLISH, MSG_TX_NOT, ENGLISH_TX_NOT)
MSG_STRING(ENGLISH, MSG_ACCU_LOW, ENGLISH_ACCU_LOW)
MSG_STRING(ENGLISH, MSG_SERVO_CALIBR, ENGLISH_SERVO_CALIBR)
MSG_STRING(ENGLISH, MSG_SERVO_STEPS, ENGLISH_SERVO_STEPS)
MSG_STRING(ENGLISH, MSG_SERVO1_REVERSE, ENGLISH_SERVO1_REVERSE)
MSG_STRING(ENGLISH, MSG_CALIB1_LEFT, ENGLISH_CALIB1_LEFT)
MSG_STRING(ENGLISH, MSG_CALIB1_RIGHT, ENGLISH_CALIB1_RIGHT)
MSG_STRING(ENGLISH, MSG_CALIB1_MIDDLE, ENGLISH_CALIB1_MIDDLE)
MSG_STRING(ENGLISH, MSG_SERVO2_REVERSE, ENGLISH_SERVO2_REVERSE)
MSG_STRING(ENGLISH, MSG_CALIB2_LEFT, ENGLISH_CALIB2_LEFT)
MSG_STRING(ENGLISH, MSG_CALIB2_RIGHT, ENGLISH_CALIB2_RIGHT)
MSG_STRING(ENGLISH, MSG_CALIB2_MIDDLE, ENGLISH_CALIB2_MIDDLE)
MSG_STRING(ENGLISH, MSG_FRAME, ENGLISH_FRAME)
MSG_STRING(ENGLISH, MSG_PULSE_WIDTH, ENGLISH_PULSE_WIDTH)
MSG_STRING(ENGLISH, MSG_CONTINOUS, ENGLISH_CONTINOUS)
MSG_STRING(ENGLISH, MSG_SINGLE_STE, ENGLISH_SINGLE_STEP)
MSG_STRING(ENGLISH, MSG_REPEAT, ENGLISH_REPEAT)
MSG_STRING(ENGLISH, MSG_PAUSE, ENGLISH_PAUSE)
MSG_STRING(ENGLISH, MSG_PAUSE_STEP, ENGLISH_PAUSE_STEP)
MSG_STRING(ENGLISH, MSG_START, ENGLISH_START)
MSG_STRING(ENGLISH, MSG_OFF, ENGLISH_OFF)
MSG_STRING(ENGLISH, MSG_ON, ENGLISH_ON)
MSG_STRING(ENGLISH, MSG_TRACKING, ENGLISH_TRACKING)
MSG_STRING(ENGLISH, MSG_TRACK_GPS, ENGLISH_TRACK_GPS)
MSG_STRING(ENGLISH, MSG_TRACK_TX_OSD_DATA, ENGLISH_TRACK_TX_OSD_DATA)
MSG_STRING(ENGLISH, MSG_HYSTERESE, ENGLISH_HYSTERESE)
MSG_STRING(ENGLISH, MSG_TRACK_TX_ON, ENGLISH_TRACK_TX_ON)
MSG_STRING(ENGLISH, MSG_GPS_DISPLAY, ENGLISH_GPS_DISPLAY)
MSG_STRING(ENGLISH, MSG_GPS_CALCULATE, ENGLISH_GPS_CALCULATE)
MSG_STRING(ENGLISH, MSG_GPS_CURRENT, ENGLISH_GPS_CURRENT)
MSG_STRING(ENGLISH, MSG_GPS_HOME, ENGLISH_GPS_HOME)
MSG_STRING(ENGLISH, MSG_GPS_MISC, ENGLISH_GPS_MISC)
MSG_STRING(ENGLISH, MSG_GPS_NO_DATA, ENGLISH_GPS_NO_DATA)
MSG_STRING(ENGLISH, MSG_RX_TIME, ENGLISH_RX_TIME)
MSG_STRING(ENGLISH, MSG_COM, ENGLISH_COM)
MSG_STRING(ENGLISH, MSG_KOMMA, ENGLISH_KOMMA)
MSG_STRING(ENGLISH, MSG_UHW33V, ENGLISH_UHW33V)
 
MSG_STRING(FRENCH, MSG_LANGUAGE, FRENCH_LANGUAGE)
MSG_STRING(FRENCH, MSG_GERMAN, FRENCH_GERMAN)
MSG_STRING(FRENCH, MSG_ENGLISH, FRENCH_ENGLISH)
MSG_STRING(FRENCH, MSG_FRENCH, FRENCH_FRENCH)
MSG_STRING(FRENCH, MSG_RETURN, FRENCH_RETURN)
MSG_STRING(FRENCH, MSG_AV_SOURCE, FRENCH_AV_SOURCE)
MSG_STRING(FRENCH, MSG_RX_CHANNEL, FRENCH_RX_CHANNEL)
MSG_STRING(FRENCH, MSG_RSSI_CALIBR, FRENCH_RSSI_CALIBR)
MSG_STRING(FRENCH, MSG_RSSI_MIN_ALL, FRENCH_RSSI_MIN_ALL)
MSG_STRING(FRENCH, MSG_CALIB, FRENCH_CALIB)
MSG_STRING(FRENCH, MSG_TX, FRENCH_TX)
MSG_STRING(FRENCH, MSG_TX_OFF, FRENCH_TX_OFF)
MSG_STRING(FRENCH, MSG_TX_ON, FRENCH_TX_ON)
MSG_STRING(FRENCH, MSG_CONTINUE, FRENCH_CONTINUE)
MSG_STRING(FRENCH, MSG_CONTRAST, FRENCH_CONTRAST)
MSG_STRING(FRENCH, MSG_BACKGR_LIGHT, FRENCH_BACKGR_LIGHT)
MSG_STRING(FRENCH, MSG_LIGHT, FRENCH_LIGHT)
MSG_STRING(FRENCH, MSG_LIGHT_OFF, FRENCH_LIGHT_OFF)
MSG_STRING(FRENCH, MSG_LIGHT_ON, FRENCH_LIGHT_ON)
MSG_STRING(FRENCH, MSG_SEC, FRENCH_SEC)
MSG_STRING(FRENCH, MSG_BATTERY, FRENCH_BATTERY)
MSG_STRING(FRENCH, MSG_U_MIN, FRENCH_U_MIN)
MSG_STRING(FRENCH, MSG_U_SETUP, FRENCH_U_SETUP)
MSG_STRING(FRENCH, MSG_U_OFFSET, FRENCH_U_OFFSET)
MSG_STRING(FRENCH, MSG_MK_BATTERY, FRENCH_MSG_MK_BATTERY)
MSG_STRING(FRENCH, MSG_MK_BAT_NR, FRENCH_MSG_MK_BAT_NR)
MSG_STRING(FRENCH, MSG_MK_BAT_CAPACITY, FRENCH_MSG_MK_BAT_CAPACITY)
MSG_STRING(FRENCH, MSG_MK_I_OFFSET, FRENCH_MSG_MK_I_OFFSET)
MSG_STRING(FRENCH, MSG_MK_I_FAKTOR, FRENCH_MSG_MK_I_FAKTOR)
MSG_STRING(FRENCH, MSG_MK_W_FAKTOR, FRENCH_MSG_MK_W_FAKTOR)
MSG_STRING(FRENCH, MSG_CALIBRATION, FRENCH_CALIBRATION)
MSG_STRING(FRENCH, MSG_RUNNING, FRENCH_RUNNING)
MSG_STRING(FRENCH, MSG_ERROR, FRENCH_ERROR)
MSG_STRING(FRENCH, MSG_TX_NOT, FRENCH_TX_NOT)
MSG_STRING(FRENCH, MSG_ACCU_LOW, FRENCH_ACCU_LOW)
MSG_STRING(FRENCH, MSG_SERVO_CALIBR, FRENCH_SERVO_CALIBR)
MSG_STRING(FRENCH, MSG_SERVO_STEPS, FRENCH_SERVO_STEPS)
MSG_STRING(FRENCH, MSG_SERVO1_REVERSE, FRENCH_SERVO1_REVERSE)
MSG_STRING(FRENCH, MSG_CALIB1_LEFT, FRENCH_CALIB1_LEFT)
MSG_STRING(FRENCH, MSG_CALIB1_RIGHT, FRENCH_CALIB1_RIGHT)
MSG_STRING(FRENCH, MSG_CALIB1_MIDDLE, FRENCH_CALIB1_MIDDLE)
MSG_STRING(FRENCH, MSG_SERVO2_REVERSE, FRENCH_SERVO2_REVERSE)
MSG_STRING(FRENCH, MSG_CALIB2_LEFT, FRENCH_CALIB2_LEFT)
MSG_STRING(FRENCH, MSG_CALIB2_RIGHT, FRENCH_CALIB2_RIGHT)
MSG_STRING(FRENCH, MSG_CALIB2_MIDDLE, FRENCH_CALIB2_MIDDLE)
MSG_STRING(FRENCH, MSG_FRAME, FRENCH_FRAME)
MSG_STRING(FRENCH, MSG_PULSE_WIDTH, FRENCH_PULSE_WIDTH)
MSG_STRING(FRENCH, MSG_CONTINOUS, FRENCH_CONTINOUS)
MSG_STRING(FRENCH, MSG_SINGLE_STE, FRENCH_SINGLE_STEP)
MSG_STRING(FRENCH, MSG_REPEAT, FRENCH_REPEAT)
MSG_STRING(FRENCH, MSG_PAUSE, FRENCH_PAUSE)
MSG_STRING(FRENCH, MSG_PAUSE_STEP, FRENCH_PAUSE_STEP)
MSG_STRING(FRENCH, MSG_START, FRENCH_START)
MSG_STRING(FRENCH, MSG_OFF, FRENCH_OFF)
MSG_STRING(FRENCH, MSG_ON, FRENCH_ON)
MSG_STRING(FRENCH, MSG_TRACKING, FRENCH_TRACKING)
MSG_STRING(FRENCH, MSG_TRACK_GPS, FRENCH_TRACK_GPS)
MSG_STRING(FRENCH, MSG_TRACK_TX_OSD_DATA, FRENCH_TRACK_TX_OSD_DATA)
MSG_STRING(FRENCH, MSG_HYSTERESE, FRENCH_HYSTERESE)
MSG_STRING(FRENCH, MSG_TRACK_TX_ON, FRENCH_TRACK_TX_ON)
MSG_STRING(FRENCH, MSG_GPS_DISPLAY, FRENCH_GPS_DISPLAY)
MSG_STRING(FRENCH, MSG_GPS_CALCULATE, FRENCH_GPS_CALCULATE)
MSG_STRING(FRENCH, MSG_GPS_CURRENT, FRENCH_GPS_CURRENT)
MSG_STRING(FRENCH, MSG_GPS_HOME, FRENCH_GPS_HOME)
MSG_STRING(FRENCH, MSG_GPS_MISC, FRENCH_GPS_MISC)
MSG_STRING(FRENCH, MSG_GPS_NO_DATA, FRENCH_GPS_NO_DATA)
MSG_STRING(FRENCH, MSG_RX_TIME, FRENCH_RX_TIME)
MSG_STRING(FRENCH, MSG_COM, FRENCH_COM)
MSG_STRING(FRENCH, MSG_KOMMA, FRENCH_KOMMA)
MSG_STRING(FRENCH, MSG_UHW33V, FRENCH_UHW33V)
 
typedef uint16_t MessageType;
char* Msg(MessageType Message);
 
#endif /* _MESSAGES_H_ */
/NGVideo5_8/tags/v1.21/ngvideo.c
0,0 → 1,825
/****************************************************************/
/* */
/* NG-Video 5,8GHz */
/* */
/* Copyright (C) 2011 - gebad */
/* */
/* This code is distributed under the GNU Public License */
/* which can be found at http://www.gnu.org/licenses/gpl.txt */
/* */
/****************************************************************/
 
#include <avr/io.h>
#include <stdlib.h>
#include <avr/interrupt.h>
#include <avr/eeprom.h>
#include <util/delay.h>
 
#include "config.h"
#include "dogm.h"
#include "messages.h"
#include "ngvideo.h"
#include "menue.h"
#include "servo.h"
#include "tracking.c"
 
// LCD selbst definierte Sonderzeichen, RSSI-Balken und wi232 Empfang Daten im Flash
// deshalb in dogm.c lcdPutc(pgm_read_byte(&lcdChr[i]));
static SpecialChr7_t lcdSpecialChr PROGMEM = {{32,32,16,16,16,16,32,32},\
{32,32,24,24,24,24,32,32},\
{32,32,28,28,28,28,32,32},\
{32,32,30,30,30,30,32,32},\
{32,32,31,31,31,31,32,32},\
{6,8,20,19,20,8,6,32},\
{4,10,32,14,4,4,14,32}}; // Antenne und Imax
 
static SpecialChr8_t lcdSpecialChrLs PROGMEM = {{32,1,1,1,1,1,1,32},\
{32,31,1,1,1,1,31,32},\
{32,31,3,3,3,3,31,32},\
{32,31,7,7,7,7,31,32},\
{32,31,15,15,15,15,31,32},\
{32,31,31,31,31,31,31,32},\
{32,16,16,16,16,16,16,32},\
{32,31,32,32,32,32,31,32}};
 
static SpecialChr5_t lcdSpecialChrRs PROGMEM = {{32,1,1,1,1,1,1,32},\
{32,31,16,16,16,16,31,32},\
{32,31,24,24,24,24,31,32},\
{32,31,28,28,28,28,31,32},\
{32,31,30,30,30,30,31,32}};
 
/************************************************************************************/
/* initialisiert den EEPROM mit default Werten, bzw. liest EEPROM gespeicherte */
/* Werte in gloabale Variablen. */
/* Parameter: */
/* uint8_t ep_reset :0 = zwangsweises Rückstetzen auf default-Werte */
/* */
/************************************************************************************/
void Init_EEPROM(uint8_t ep_reset)
{ char ver[sizeof(VERSION)];
uint8_t eep_init;
eep_init = eeprom_read_byte(&ep_eep_init);
eeprom_read_block(&ver, &ep_version, sizeof(VERSION));
_delay_ms(1);
 
if ((eep_init != EEP_INITB) || (ep_reset == 0) || strcmp(VERSION, ver))
{
// nur bei Erstinitialisierung DOGM auf default 3,3V setzen
if ((eep_init != EEP_INITB) || strcmp(VERSION, ver)){
eeprom_write_byte(&ep_eep_init, EEP_INITB);
eeprom_write_byte(&ep_dogm_vers, DOGM3V);
eeprom_write_byte(&ep_contrast, CONTRAST3V);
eeprom_write_block(&VERSION, &ep_version, sizeof(VERSION));
}
eeprom_write_byte(&ep_light_time, BACKGR_LIGHT_MAX);
eeprom_write_byte(&ep_u_offset, U_OFFSET);
eeprom_write_dword(&ep_u_min, U_MIN);
eeprom_write_byte(&ep_channel, CHANNEL);
eeprom_write_byte(&ep_av_source, AV_SOURCE);
eeprom_write_byte(&ep_language, NO_LANGUAGE);
for (uint8_t i = 0; i < CHANNEL_MAX; i++)
eeprom_write_block(&udbm,&ep_udbm[i],sizeof(udbm_t));
eeprom_write_byte(&ep_sIdxSteps, STEPS_255);
eeprom_write_block(&servo[0],&ep_servo[0],sizeof(servo_t));
eeprom_write_block(&servo[1],&ep_servo[1],sizeof(servo_t));
eeprom_write_byte(&ep_servo_frame, SERVO_PERIODE);
eeprom_write_byte(&ep_servo_nr, 0); // nur bei Test-Servo
eeprom_write_byte(&ep_single_step, SINGLE_STEP); // nur bei Test-Servo
eeprom_write_byte(&ep_repeat, REPEAT); // nur bei Test-Servo
eeprom_write_byte(&ep_pause, PAUSE); // nur bei Test-Servo
eeprom_write_byte(&ep_pause_step, PAUSE_STEP); // nur bei Test-Servo
eeprom_write_byte(&ep_tracking, TRACKING_MIN);
eeprom_write_byte(&ep_track_hyst, TRACKING_HYSTERESE);
eeprom_write_byte(&ep_track_tx, 0);
eeprom_write_byte(&ep_baudrate, BAUDRATE);
eeprom_write_block(&current,&ep_current,sizeof(current_t));
eeprom_write_byte(&ep_akku_nr, AKKU_NR_MIN);
for (uint8_t i = 0; i < AKKU_NR_MAX; i++)
eeprom_write_block(&lipo,&ep_lipo[i],sizeof(lipo_t));
eeprom_write_byte(&ep_mk_i_offset, MK_I_OFFSET);
eeprom_write_byte(&ep_mk_i_faktor, MK_I_FAKTOR);
eeprom_write_byte(&ep_mk_w_faktor, MK_W_FAKTOR);
sIdxSteps = STEPS_255;
}
else
{
light_time = eeprom_read_byte(&ep_light_time);
u_offset = eeprom_read_byte(&ep_u_offset);
u_min = eeprom_read_dword(&ep_u_min);
channel = eeprom_read_byte(&ep_channel);
av_source = eeprom_read_byte(&ep_av_source);
language = eeprom_read_byte(&ep_language);
sIdxSteps = eeprom_read_byte(&ep_sIdxSteps);
eeprom_read_block(&servo[0],&ep_servo[0],sizeof(servo_t));
eeprom_read_block(&servo[1],&ep_servo[1],sizeof(servo_t));
servo_frame = eeprom_read_byte(&ep_servo_frame); // nur bei Test-Servo
single_step = eeprom_read_byte(&ep_single_step); // nur bei Test-Servo
repeat = eeprom_read_byte(&ep_repeat); // nur bei Test-Servo
pause = eeprom_read_byte(&ep_pause); // nur bei Test-Servo
pause_step = eeprom_read_byte(&ep_pause_step); // nur bei Test-Servo
tracking = eeprom_read_byte(&ep_tracking);
track_hyst = eeprom_read_byte(&ep_track_hyst);
track_tx = eeprom_read_byte(&ep_track_tx);
baudrate = eeprom_read_byte(&ep_baudrate);
eeprom_read_block(&current,&ep_current,sizeof(current_t));
akku_nr = eeprom_read_byte(&ep_akku_nr);
eeprom_read_block(&lipo,&ep_lipo[akku_nr],sizeof(lipo_t));
mk_i_offset = eeprom_read_byte(&ep_mk_i_offset);
mk_i_faktor = eeprom_read_byte(&ep_mk_i_faktor);
mk_w_faktor = eeprom_read_byte(&ep_mk_w_faktor);
}
dogm_vers = eeprom_read_byte(&ep_dogm_vers);
contrast = eeprom_read_byte(&ep_contrast);
hyst_u_min = u_min;
sw_avx = av_source;
for (uint8_t i = 0; i < SERVO_NUM_CHANNELS; i++) {
servoSet_rev(i, servo[i].rev);
servoSet_min(i, servo[i].min);
servoSet_max(i, servo[i].max);
servoSet_mid(i, servo[i].mid);
}
// Vorberechnung von ServoChannels[channel].duty
servoSetDefaultPos(); // Ausgangsstellung beider Servos
coldstart = 1;
USART_Init_Baudrate();
USART_RX_Mode(tracking);
}
 
void servoSetDefaultPos(void)
{
servoSetPosition(SERVO_PAN, ServoSteps()/2); // Ausgangsstellung SERVO_PAN
servoSetPosition(SERVO_TILT, 0); // Ausgangsstellung SERVO_TILT
}
 
void USART_Init_Baudrate(void)
{
if (tracking == TRACKING_MKCOCKPIT)
USART_Init(baud[baudrate]);
else
USART_Init(baud[6]); //57600
}
 
/************************************************************************************/
/* Zeitanzeige */
/* */
/************************************************************************************/
 
uint32_t TimeBase60(char *str, uint32_t time, uint8_t idx_a)
{ uint32_t tmp;
tmp = time % 60;
time /= 60;
for (int8_t i = idx_a; i >= (idx_a - 1); i--) {
str[i] = (tmp % 10) + '0';
tmp /= 10;
}
return(time);
}
 
void Displ_TimeMS(int32_t time)
{ char str[7];
 
str[6] = '\0';
if (time < 0) {
time = abs(time);
str[0] = '-';
}
else
str[0] = ' ';
time = TimeBase60(str, time, 5);
TimeBase60(str, time, 2);
str[3] = ':';
lcdPuts(str);
}
 
/************************************************************************************/
/* setzt Flag für 3,3V oder 5V DOGM */
/* Parameter: */
/* uint8_t dogm :Version */
/* */
/************************************************************************************/
void Set_DOGM_Version(void)
{
if(dogm_vers == DOGM5V) {
dogm_vers = DOGM3V;
contrast = CONTRAST3V;
}
else {
dogm_vers = DOGM5V;
contrast = CONTRAST5V;
}
eeprom_write_byte(&ep_dogm_vers, dogm_vers);
eeprom_write_byte(&ep_contrast, contrast);
}
 
/************************************************************************************/
/* setzt den RX-Kanal von 1 bis 7 */
/* Parameter: */
/* uint8_t channel :Kanal */
/* */
/************************************************************************************/
void Set_Channel(uint8_t channel)
{ uint8_t tmp;
 
channel--;
tmp = channel & 0b00000111; // Kanal 1 bis 7 Werte 0 bis 6 setzen
PORTA |= tmp;
PORTB |= tmp;
tmp = channel | 0b11111000;
PORTA &= tmp;
PORTB &= tmp;
wudbm = RSSI_Calc_UdBm(pbar_udbm); // Vergleichstabelle für dBm-Balken berechnen
}
 
/************************************************************************************/
/* schaltet den MUX auf AV1 oder AV2 ohne Darstellung und en-/disabled Interrupt */
/* wird nur in main.c (Initialisierung) und Menü Sourceumschaltung eingesetzt */
/* deswegen cli() und sei() nur in Menu_AV_Source(void) */
/* Parameter: */
/* uint8_t src :0-AV1, 1-AV2 */
/* */
/************************************************************************************/
void SetMux0(void) {
SET_MUX_0;
mux_X = 0; // für Erkennung RX Zeitzähler
}
 
void SetMux1(void) {
SET_MUX_1;
mux_X = 1; // für Erkennung RX Zeitzähler
}
 
uint8_t Set_AV_Source(uint8_t src)
{
switch(src) {
case AV1: CLEAR_INT10; // Interrupt für Sync ausschalten
SetMux0();
break;
case AV2: CLEAR_INT10; // Interrupt für Sync ausschalten
SetMux1();
break;
case DIVERSITY: SET_INT10; // External Interrupt Mask Register ein
SetMux0();
break;
}
return(src);
}
 
 
/**************************************************************/
/* */
/* LCD-Backlight */
/* */
/**************************************************************/
 
void lcdSet_BackgrLight_Off(void)
{
backgr_light = OFF;
lcdBacklightOff();
}
 
void lcd_BackgrLight_On(void)
{ // ...&& (light_count < light_time)) ==> sonst wird Beleuchtung laufend wieder eingeschaltet
if ((backgr_light == OFF) && (light_time > BACKGR_LIGHT_MIN) && (light_count < light_time)) {
cli();
light_count = 0;
sei();
backgr_light = ON;
lcdBacklightOn();
}
}
 
void lcd_BackgrLight(void)
{
if (backgr_light == ON) { // nur wenn Beleuchtung an
if (light_time == BACKGR_LIGHT_MIN) // Hintergrundbeleuchtung immer aus?
lcdSet_BackgrLight_Off();
else
if (light_time < BACKGR_LIGHT_MAX) { // Hintergrundbeleuchtung immer an?
cli();
light_count++;
sei();
if (light_count >= light_time) lcdSet_BackgrLight_Off();
}
}
}
 
/**************************************************************/
/* */
/* ADC */
/* */
/* http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial */
/* */
/**************************************************************/
 
void ADC_Init(void)
{
uint16_t result;
ADMUX = (0<<REFS1) | (1<<REFS0); // AVcc als Referenz benutzen, da an AREF 4,8 V
ADCSRA = (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0); // Frequenzvorteiler Prescaler 128
ADCSRA |= (1<<ADEN); // ADC aktivieren
/* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest
also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */
ADCSRA |= (1<<ADSC); // eine ADC-Wandlung
while (ADCSRA & (1<<ADSC) ) {} // auf Abschluss der Konvertierung warten
/* ADCW muss einmal gelesen werden, sonst wird Ergebnis der nächsten
Wandlung nicht übernommen. */
result = ADCW;
}
 
/* ADC Einzelmessung */
uint16_t ADC_Read( uint8_t channel )
{
// Kanal waehlen, ohne andere Bits zu beeinflußen
ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F);
ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion"
while (ADCSRA & (1<<ADSC) ) {} // auf Abschluss der Konvertierung warten
return ADCW; // ADC auslesen und zurückgeben
}
 
/* ADC Mehrfachmessung mit Mittelwertbbildung */
adc_avg_t ADC_Read_Avg(uint8_t channel0, uint8_t channel1, uint16_t average )
{ adc_avg_t result;
uint32_t u0 = 0;
uint32_t u1 = 0;
 
for (uint16_t i = 0; i < average; ++i){
u0 += ADC_Read( channel0 );
u1 += ADC_Read( channel1 );
_delay_ms(1);
}
result.u0 = u0/average;
result.u1 = u1/average;
return(result);
}
 
/**************************************************************/
/* */
/* Beeper */
/* */
/**************************************************************/
 
void Beep(uint8_t time)
{
PORTB |= (1<<BEEPER);
_delay_ms(time);
PORTB &= ~(1<<BEEPER);
}
 
void Double_Beep(uint8_t time, uint8_t pause)
{
Beep(time);
_delay_ms(pause);
Beep(time);
}
 
/**************************************************************/
/* */
/* U-Batterie */
/* */
/**************************************************************/
 
/* Funktion zur Umwandlung einer vorzeichenbehafteten Integer
32-Bit "Festkomma-Zahl"(gedachtes Komma in Integer) in einen String
vereinfacht Variablenübergabe funktion change_value(uint32_t x),
kein printf, double oder float
siehe http://www.mikrocontroller.net/articles/Festkommaarithmetik
Vorz ==> 0 kein '-' trotz negativer Zahl, 1 wenn kein '-' bleibt Stelle leer
len max 11, Vorzeichen wird nicht mitgezählt aber Komma; Vorz 0 oder 1
Festkomma ==> Position der Kommastelle bei Integerwert
Nachkomma ==> angezeigte Nachkommastellen bei Festkomma
makefile derzeit somit auch ohne! Minimalistic printf version
Achtung: keine Fehlerprüfung! */
char* my_itoa(int32_t zahl, uint8_t Vorz, uint8_t len, uint8_t Festkomma, uint8_t Nachkomma)
{
int8_t i;
uint8_t neg = 0;
char Komma; // Sprachversion Deutsch ',' andere '.'
static char str[13];
 
Komma = Msg(MSG_KOMMA)[0]; // [0] nur als Char, sonst wäre es ein String
if( zahl < 0 ) { // ist die Zahl negativ?
zahl = -zahl;
neg = 1;
}
if (Vorz) str[0] = '0'; else len--;
str[len+1]='\0'; // String Terminator
if (Nachkomma > 0) Nachkomma++;
 
for(i=len; i>=Vorz; i--) {
if ((len - Festkomma == i) && (Festkomma > 0))
str[i]= Komma; // bei Bedarf Komma einfügen
else { // Integer-Dezimalumrechnung
str[i]=(zahl % 10) +'0'; // Modulo rechnen, dann den ASCII-Code von '0' addieren
zahl /= 10;
}
// festgelegt Festkomma aber verkleinern der Anzeige Mantisse
if ((Festkomma > 0) && (Festkomma >= Nachkomma) && (len - Festkomma + Nachkomma == i)) str[i]= '\0';
}
i=0;
while ((str[i+1] != Komma) && (i < len)) {
// Vorzeichen unmittelbar vor Zahl schreiben
if((Vorz) && (neg) && ((str[i+1] != '0') || (str[i+2] == Komma))) str[i] = '-';
// eine 0 vor Komma lassen
if(str[i] == '0') str[i++] = ' '; else break; // Vornullen entfernen
}
return(str);
}
 
// uint32_t u, da bei Displ_Fnct[fu_index](val) der größte Wert UBat gleich 32 Bit
void Displ_1Nk(uint32_t u)
{
// 0 kein Vorzeichen, 5 => 2 Ziffern vor Komma + 1 Komma + 2 Mantisse, Festkomma, eine Ziffer Nachkomma darstellen
lcdPuts(my_itoa(u,0,5,2,1));
}
 
void Displ_U_2Nk(uint32_t u)
{
lcdPuts(my_itoa(u,0,5,2,2));
lcdPutc('V');
}
 
// uint8_t beep_timer :Akku-leer-Beeper nur mit Task_0_1()-Intervalle bei Menü-Rücksprung
uint32_t U_Messen_cmp(uint8_t beep_timer)
{ uint32_t ubat;
static struct
{ uint8_t time;
uint8_t count;
} beep_low;
 
/* ubat = ((ADC_Read(VBAT) * Vref * (R104 + R103)) /(1024 * R103)) + UD10 (UD10 ist Offset)
Verhältniswert * 100 *8192 ( Verhältniswert = realer Korrekturwert;
mal 100 da alle Werte 2 Nachkommastellen berücksichtigt, aber ohne gerechnet wird
mal 8192 => ohne Bruch gerechnet aber dabei mehr Kommastellen berücksichtigt) */
ubat = (ADC_Read(VBAT) * (uint64_t)43504 + (uint64_t)u_offset * 8192)/ 8192;
if ( ubat <= hyst_u_min )
{
if (bat_low != 0) { // nicht laufend Display neu schreiben
hyst_u_min = u_min + 20; // 200mV Hysterese - beruhigt Anzeige
if (tracking == TRACKING_GPS)
store_LipoData(); // wenigstens von GPS-Statisik UsedCapacity, time_on usw. speichern
lcdClear();
lcdPuts(Msg(MSG_ACCU_LOW));
bat_low = 0;
Beep(BEEPBAT);
// da derzeit Fkt. aller 500ms aufgerufen, mit 2 Min Abstand beginnen
beep_low.time = BEEP_LOW_TIME;
beep_low.count = 0;
}
// Akku leer, in immer kürzeren Intervallen Beep
if ((beep_timer == 1) && (beep_low.count++ >= beep_low.time)){
Beep(BEEPBAT);
if (beep_low.time > 2)
beep_low.time /= 2;
beep_low.count = 0;
}
}
else {
if (hyst_u_min > u_min) { // falls Anzeige von Batterie leer
bat_low = 1; // und zurück geschaltet wird,
hyst_u_min = u_min; // dann Main_Disp wieder darstellen
Displ_Main_Disp();
}
}
return(ubat);
}
 
void Displ_VBat(void) // da u_offset globale Variable
{ uint32_t ubat;
ubat = U_Messen_cmp(ENABLE_BTIMER);
if (bat_low != 0) { // würde sonst Anzeige Akku leer überschreiben
lcdGotoXY(11, 0);
Displ_1Nk(ubat);
}
}
 
 
/**************************************************************/
/* */
/* RSSI */
/* */
/**************************************************************/
 
/* RSSI Werte Korrekturfaktor berechnen */
uint16_t RSSI_Calc_Korr(uint8_t nchannel, uint16_t u0, uint16_t u1)
{ uint16_t u_max;
 
// immer nur den kleineren Wert vergrößern
if (u0 < u1) {
udbm.korr_1 = (((uint32_t)u1 * UDBM_KORR_FA) / u0); // nur mit Integer und 2 Nachkommastellen rechnen
udbm.korr_2 = UDBM_KORR_FA;
u_max = u1;
}
else {
udbm.korr_2 = (((uint32_t)u0 * UDBM_KORR_FA) / u1); // nur mit Integer und 2 Nachkommastellen rechnen
udbm.korr_1 = UDBM_KORR_FA;
u_max = u0;
}
eeprom_write_word(&ep_udbm[nchannel - 1].korr_1, udbm.korr_1);
eeprom_write_word(&ep_udbm[nchannel - 1].korr_2, udbm.korr_2);
return(u_max);
}
 
void Displ_Calibr_Aktiv(uint8_t nchannel)
{ char str[LCD_COLS + 1];
uint8_t l;
uint8_t zle = 1;
 
// Anzeige für nur einen Kanal oder wenn in Schleife, Kanalnr. des z.Z. kalbrierenden Kanals
lcdClear();
Displ_Str_mid(Msg(MSG_CALIBRATION),0);
if (nchannel > 0) { // Anzeige aller RX-Kanäle min. kalibrieren?
strcpy(str, Msg(MSG_RX_CHANNEL));
strcat(str, ": ");
l = strlen(str);
str[l] = nchannel + 0x30; // gerade zu kalibrierender Kanal, String zusammen stellen
str[++l] = '\0';
Displ_Str_mid(str,1);
zle = 2;
}
Displ_Str_mid(Msg(MSG_RUNNING),zle);
}
 
void delay_ms100x(uint8_t delay)
{
for ( uint8_t i=0; i<delay; i++)
_delay_ms(100);
}
 
void Displ_Error_TX(uint8_t message)
{
lcdClear();
Displ_Str_mid(Msg(MSG_ERROR), 0);
Displ_Str_mid(Msg(MSG_TX_NOT), 1);
Displ_Str_mid(Msg(message), 2);
delay_ms100x(30);
}
 
uint8_t RSSI_Min_Calibrate(uint8_t nchannel, uint16_t *pbar_udbm)
{ adc_avg_t rssi_avg;
uint16_t udbm_min;
uint8_t one_channel = !nchannel;
 
Displ_Calibr_Aktiv(nchannel);
if (one_channel) nchannel = channel;
rssi_avg = ADC_Read_Avg(RSSI0, RSSI1, 1000 ); //1000 Wiederholungen mit Mittelwertbildung
// Plausibilitätsprüfung ob Sender ausgeschaltet
if (rssi_avg.u0 + rssi_avg.u1 > 500) {
udbm_min = RSSI_Calc_Korr(nchannel, rssi_avg.u0, rssi_avg.u1); // ist real die größere Spannung, aber der kleinere dbm Wert
eeprom_write_word(&ep_udbm[nchannel - 1].min, udbm_min);
if (one_channel) {
Double_Beep(DBEEPWR, DBEEPWRP);
wudbm = RSSI_Calc_UdBm(pbar_udbm);
}
}
else
if (one_channel)
Displ_Error_TX(MSG_TX_OFF);
else
return(0); // Fehleranzeige wird in menue.c gesammelt ausgewertet
return(1); // kein Fehler, da bei einen Kanal bereits Fehler angezeigt wurde
}
 
void RSSI_Max_Calibrate(uint16_t *pbar_udbm)
{ adc_avg_t rssi_avg;
uint16_t udbm_max;
 
Displ_Calibr_Aktiv(0);
rssi_avg = ADC_Read_Avg(RSSI0, RSSI1, 1000 ); //1000 Wiederholungen mit Mittelwertbildung
// Plausibilitätsprüfung ob Sender in der Nähe eingeschaltet
if (rssi_avg.u0 + rssi_avg.u1 < 400) {
udbm_max = RSSI_Calc_Korr(channel, rssi_avg.u0, rssi_avg.u1); // ist real die kleinere Spannung, aber der größere dbm Wert
eeprom_write_word(&ep_udbm[channel - 1].max, udbm_max);
Double_Beep(DBEEPWR, DBEEPWRP);
wudbm = RSSI_Calc_UdBm(pbar_udbm);
}
else Displ_Error_TX(MSG_TX_ON);
}
 
// Vergleichstabelle für RSSI-Bargraph berechnen, vermeidet laufend gleiche Berechnung
uint8_t RSSI_Calc_UdBm(uint16_t *pbar_udbm)
{ uint8_t n;
 
eeprom_read_block(&udbm,&ep_udbm[channel - 1],sizeof(udbm_t));
// -15 um Ende dBm Skala sicher zu erreichen; ohne verfeinerten Bahrgraph war Wert -3
n = (udbm.min - udbm.max -15)/11;
for (uint8_t i = 0; i < 12; i++)
pbar_udbm[i] = (udbm.min - i * n);
return(n / 5); // da 5 Pixel Breite pro Display-Zeichen; Anzeigebalken pro Pixel differenzieren
}
 
void Displ_RSSI_Bargraph(uint16_t *pbar_udbm, uint8_t wudbm, uint16_t uadc)
{ char charBar[12];
uint8_t i;
int8_t lz = 11;
char b = 4;
// Balken zeichnen - udbm
for (i = 0; i < 12; i++) {
if ((b != ' ') && (uadc > pbar_udbm[i])) {
b = ' ';
lz = i - 1;
}
charBar[i] = b;
}
if (lz >= 0) {
charBar[lz] = (pbar_udbm[lz] - uadc) / wudbm ;// Anzeigebalken pro Pixel-"Breite" differenzieren
// bei Teilung 4 wäre richtig und keine Korr. erforderlich, so aber gleichmäßigerer Balkenverlauf
if (charBar[lz] > 4) charBar[lz] = 4;
}
for (i = 0; i < 12; i++)// lcdPuts (ist auch for) funktioniert hier nicht, da Char'\0' für Zeichen auch Stringende
lcdPutc(charBar[i]);
}
 
uint8_t RSSI_Diversity(uint8_t src, uint16_t *pbar_udbm, uint8_t visible)
{ uint16_t u0, u1;
static uint8_t div_flag, ret_div_flag;
char marker;
 
u0 = (ADC_Read(RSSI0) * (uint32_t)udbm.korr_1)/UDBM_KORR_FA;
u1 = (ADC_Read(RSSI1) * (uint32_t)udbm.korr_2)/UDBM_KORR_FA;
// falls beide RX gleich gut/schlecht synchronisieren
// Achtung! Niedrigere Spannung - größere Feldstärke
if (src == DIVERSITY) {
if (u0 < u1) {
ret_div_flag = AV1;
if ((vscount0 == 255) && (vscount1 == 255)) SetMux0(); // egal wann RSSI schaltet ==> es ist kein sync vorhanden
}
else {
ret_div_flag = AV2;
if ((vscount0 == 255) && (vscount1 == 255)) SetMux1(); // egal wann RSSI schaltet ==> es ist kein sync vorhanden
}
}
else ret_div_flag = src; // sonst leerer Returnwert
if (visible) {
if (src == DIVERSITY) {
// Synchronisation vorrangig zur Feldstärke
if ((vsync0 != vsync1) && ((vscount0 & vscount1) < 255)) {
// ist nur zur Anzeige - Sync-MUX wird über Interrupt gesteuert
if (vsync0 == 0) {
div_flag = AV1;
}
else {
div_flag = AV2;
}
marker = MARKER_SYNC;
}
else {
div_flag = ret_div_flag;
marker = MARKER_RSSI;
}
}
else marker = MARKER_AV;
// wäre unschön - keine RSSI-Anzeige, aber Marker springt
if ((u0 > pbar_udbm[0]) && (u1 > pbar_udbm[0])) marker = ' ';
lcdGotoXY(2, 1);
Displ_RSSI_Bargraph(pbar_udbm, wudbm, u0);
lcdGotoXY(2, 2);
Displ_RSSI_Bargraph(pbar_udbm, wudbm, u1);
if (src == DIVERSITY) Displ_AV_Mark(div_flag, marker);
}
return(ret_div_flag);
}
 
/**************************************************************/
/* */
/* Diversity v-Synchronisation Interruptroutinen */
/* */
/**************************************************************/
 
/* Impulszähler für V-Synchronisation 0 und 1
wird durch Interrupt des jewiligen vSync einzeln zurückgesetzt. 8-bit Timer*/
ISR(TIMER2_OVF_vect)
{
TCNT2 = (int8_t)(int16_t)-(F_CPU / 64 * 500e-6); // preload
if (vscount0 < 255) ++vscount0; // Überlauf von vscount vermeiden
if (vscount1 < 255) ++vscount1; // Überlauf von vscount vermeiden
if (rx_timeout < RX_TIME_END) ++rx_timeout; // veranlasst bei GPS-Tracking MK Datensatz senden
if ((mk_timer) && (lipo.time_on < T2PROD_M59S59)) ++lipo.time_on; // T2PRODM59S59 = 3599 * 4000
if ((tracking == TRACKING_GPS) && (MK_Motor_run)) { // MK-Motoren müssen laufen
if (mux_X)
rxcount1++; // kein Test auf Überlauf ==> Counter groß genug - bis Stunden
else
rxcount0++;
}
}
 
/* Messung von Impulsabstand v-Synchronisation 0
Zur Vermeidung von Bildstörunen erfolgt MUX-Umschaltung in Bildaustastung */
ISR(INT0_vect)
{
if ((vscount0 >= 79) && (vscount0 <= 81))
vsync0 = 0;
else {
vsync0 = 1;
if (vsync1 == 0)
SetMux1();
}
if (vsync0 == vsync1) { //nur wenn vSynchronisation gleich gut/schlecht ist greift RSSI
if (sw_avx == AV1) {
SetMux0();
}
else
SetMux1();
}
vscount0 = 0;
}
 
/* Messung von Impulsabstand v-Synchronisation 1
Zur Vermeidung von Bildstörunen erfolgt MUX-Umschaltung in Bildaustastung */
ISR(INT1_vect)
{
if ((vscount1 >= 79) && (vscount1 <= 81))
vsync1 = 0;
else {
vsync1 = 1;
if (vsync0 == 0)
SetMux0();
}
if (vsync0 == vsync1) { //nur wenn vSynchronisation gleich gut/schlecht ist greift RSSI
if (sw_avx == AV1) {
SetMux0();
}
else
SetMux1();
}
vscount1 = 0;
}
 
/**************************************************************/
/* */
/* Tasks */
/* ermöglicht unterschiedliche Zeiten f. UBat, Sync... */
/* */
/**************************************************************/
 
void Task_0_1(void)
{
if (task_timer0_1) {
cli();
task_timer0_1 = 0;
sei();
Displ_VBat();
}
}
 
void Task_0_2(void)
{
if (task_timer0_2) {
cli();
task_timer0_2 = 0;
sei();
sw_avx = RSSI_Diversity(av_source, pbar_udbm, bat_low);
}
}
 
void Task_0_3(void)
{
if (task_timer0_3) {
cli();
task_timer0_3 = 0;
sei();
sw_avx = RSSI_Diversity(av_source, pbar_udbm, 0);
if (tracking == TRACKING_MKCOCKPIT) Tracking_MKCockpit();
}
}
 
void Task_0_4(void)
{
if (task_timer0_4) {
cli();
task_timer0_4 = 0;
sei();
if (tracking == TRACKING_GPS) Tracking_GPS();
if (gps_display == GPS_RX_COUNT) Displ_RX_Time(); // aktualisieren der Empfängerzeiten
}
}
 
void Task_0_5(void) // Nur für Tasten-Beschleunigung/-Wiederholrate! Hintergrund: Rücksetzung.
{ // Hintergrund: Rücksetzung. Beginnt nach jeden Tastendruck neu zu zählen.
lcd_BackgrLight_On(); // muss bei beliebiger Taste sofort eingeschaltet werden
if (task_timer0_5) {
cli();
task_timer0_5 = 0;
sei();
lcd_BackgrLight();
}
}
 
void Tasks_unvisible(void)
{
Task_0_3();
Task_0_4();
Task_0_5();
if (tracking == TRACKING_RSSI) Tracking_RSSI();
}
/NGVideo5_8/tags/v1.21/ngvideo.h
0,0 → 1,198
 
/****************************************************************/
/* */
/* NG-Video 5,8GHz */
/* */
/* Copyright (C) 2011 - gebad */
/* */
/* This code is distributed under the GNU Public License */
/* which can be found at http://www.gnu.org/licenses/gpl.txt */
/* */
/****************************************************************/
 
#ifndef SETTING_H_
#define SETTING_H_
 
/* Indexwerte für av_source bzw. zur Auswertung von av_source */
#define AV1 0
#define AV2 1
#define DIVERSITY 2
 
#define MARKER_SELECT 0xfc // 0xfc enspricht '>>' Menue-Marker
#define MARKER_AV 0xfb // 0xfb enspricht '<<' Diversity AV-Marker
#define MARKER_RSSI 'd' // Diversity, wenn RX umschaltet mittels RSSI-Wert
#define MARKER_SYNC 's' // Diversity, wenn RX umschaltet auf Grund der Bildsynchronisation
 
#define SET_MUX_0 PORTA &= ~(1<<MUX_IN); // MUX SxA enabled
#define SET_MUX_1 PORTA |= (1<<MUX_IN); // MUX SxB enabled
#define CLEAR_INT10 EIMSK &= ~((1<<INT1) | (1<<INT0)); // Interrupt für Sync ausschalten
#define SET_INT10 EIMSK |= (1<<INT1) | (1<<INT0); // External Interrupt Mask Register ein
 
/* Beep Verzögerungszeitein */
#define DBEEPVERS 2 // Beep on nach Versionsanzeige
#define DBEEPVERSP 30 // Beep Pause nach Versionsanzeige
#define BEEPENTER 1 // Beep on Enter kurz Scroll_Menu() und Select_Menu()
#define DBEEPWR 4 // Beep on geänderte Werte ROM schreiben
#define DBEEPWRP 30 // Beep Pause geänderte Werte ROM schreiben
#define BEEPBAT 20 // Beep on bei Akku low
#define BEEP_LOW_TIME 240 // TIMER0_1 aller 500ms aufgerufen, BeepIntervall Akku leer mit 2 Min Abstand beginnen
 
#define ENABLE_BTIMER 1 // damit Intervall Beeper für Akku leer mit TIMER0_1 gesteuert wird
#define DISABLE_BTIMER 0
 
#define GPS_DISP_NONE 0 // Anzeigen bei Antennennachführung per WI232 und GPS
#define GPS_DISP_CALC 1
#define GPS_DISP_CURRENT 2
#define GPS_DISP_HOME 3
#define GPS_MISC 4
#define GPS_RX_COUNT 5
 
#define BAUDRATE 5 // für Antennennachführung mittels MKCockpit
#define BAUDRATE_MIN 0
#define BAUDRATE_MAX 6
 
#define POLOLU_CMD 2
 
#define OFF 0
#define ON 1
 
#define EEPROM __attribute__ ((section(".eeprom")))
 
uint32_t baud[8] = {4800, 7200, 9600, 14400, 19200, 38400, 57600};
 
typedef struct {
uint8_t rev;
uint16_t min;
uint16_t max;
uint16_t mid;
} servo_t;
 
typedef struct
{ uint16_t min;
uint16_t max;
uint16_t korr_1;
uint16_t korr_2;
} udbm_t;
 
typedef struct
{
uint16_t u0;
uint16_t u1;
} adc_avg_t;
 
typedef struct
{
uint16_t min;
uint16_t max;
} clipo_t;
 
typedef struct
{
uint8_t Umk;
uint16_t Capacity;
uint16_t UsedCapacity;
uint32_t time_on;
} lipo_t;
 
typedef struct
{
uint32_t Sum;
uint16_t Count;
} current_t;
 
/**************************************************************/
/* */
/* EEPROM */
/* */
/**************************************************************/
static uint8_t ep_eep_init EEPROM;
static char ep_version[sizeof(VERSION)] EEPROM;
static uint8_t ep_dogm_vers EEPROM;
static uint8_t ep_contrast EEPROM;
static uint8_t ep_light_time EEPROM;
static uint8_t ep_u_offset EEPROM;
static uint32_t ep_u_min EEPROM;
static uint8_t ep_channel EEPROM;
static uint8_t ep_av_source EEPROM;
static uint8_t ep_language EEPROM;
static udbm_t ep_udbm[CHANNEL_MAX] EEPROM;
static uint8_t ep_sIdxSteps EEPROM;
static servo_t ep_servo[SERVO_NUM_CHANNELS][sizeof(servo_t)] EEPROM;
static uint8_t ep_servo_frame EEPROM;
static uint8_t ep_servo_nr EEPROM;
static uint8_t ep_single_step EEPROM;
static uint8_t ep_repeat EEPROM;
static uint8_t ep_pause EEPROM;
static uint8_t ep_pause_step EEPROM;
static uint8_t ep_tracking EEPROM;
static uint8_t ep_track_hyst EEPROM;
static uint8_t ep_track_tx EEPROM;
static uint8_t ep_baudrate EEPROM;
static current_t ep_current EEPROM;
static uint8_t ep_akku_nr EEPROM;
static lipo_t ep_lipo[AKKU_NR_MAX+1] EEPROM;
static uint8_t ep_mk_i_offset EEPROM;
static uint8_t ep_mk_i_faktor EEPROM;
static uint8_t ep_mk_w_faktor EEPROM;
 
uint8_t dogm_vers;
uint8_t contrast;
uint8_t light_time = BACKGR_LIGHT_MAX;
uint8_t backgr_light = OFF;
uint8_t u_offset = U_OFFSET;
uint32_t u_min = U_MIN;
uint8_t channel = CHANNEL;
uint8_t av_source = AV_SOURCE;
uint8_t language = NO_LANGUAGE;
udbm_t udbm = {UDBM_MIN, UDBM_MAX, UDBM_KORR_FA, UDBM_KORR_FA};
uint32_t hyst_u_min;
servo_t servo[SERVO_NUM_CHANNELS] = {{SERVO_REV, SERVO_I0_RIGHT, SERVO_I0_LEFT, SERVO_I0_MIDDLE},\
{SERVO_REV, SERVO_I0_RIGHT, SERVO_I0_LEFT, SERVO_I0_MIDDLE}};
uint8_t servo_frame = SERVO_PERIODE;
uint8_t single_step = SINGLE_STEP;
uint8_t repeat = REPEAT;
uint8_t pause = PAUSE;
uint8_t pause_step = PAUSE_STEP;
uint8_t tracking = TRACKING_MIN;
uint8_t track_hyst = TRACKING_HYSTERESE;
uint8_t track_tx = 0;
uint8_t baudrate = BAUDRATE;
current_t current = {0, 0};
uint8_t akku_nr = AKKU_NR_MIN;
lipo_t lipo = {0xff, AKKU_CAPACITY, 0, 0}; // Umk 255 ==> erste Inbetriebnahme keine Nachfrage Akku-Nr.
uint8_t mk_i_offset = MK_I_OFFSET;
uint8_t mk_i_faktor = MK_I_FAKTOR;
uint8_t mk_w_faktor = MK_W_FAKTOR;
 
uint8_t gps_display = 0;
uint8_t gps_disp_clear;
 
uint8_t RSSI_Calc_UdBm(uint16_t *pbar_udbm);
uint8_t Set_AV_Source(uint8_t src);
 
uint16_t bar_udbm[12]; // RSSI-Bargraph
uint16_t* pbar_udbm = bar_udbm;
uint8_t wudbm; // Differenz/Abstand benachbarter udbm[i] für differenzierteren Bargraphen
uint8_t bat_low = 1;
uint8_t sw_avx; // steuert über Set_AV_Source() oder rssi_diversity(av_source) Marker-Position und RX-Umschaltung
uint8_t mux_X; // berücksichtigt Schaltung auf Grund Synchronisation und RSSI (sw_avx meist RSSI) RX-Zählung
uint8_t MK_Motor_run = 0; // Flag für RX Time-Counter Start/Stop
uint8_t mk_timer = 0; // Zeitzähler lipo.time_on auf aus
uint8_t exit_while = 0; // unabhängige Task (z.B: Menu_MK_BatteryChangeNr() - Aufruf) kann Eingabe while-Schleife beenden, wenn 1
 
volatile uint8_t vsync0;
volatile uint8_t vsync1;
volatile uint8_t vscount0;
volatile uint8_t vscount1;
volatile uint32_t rxcount0 = 0;
volatile uint32_t rxcount1 = 0;
 
uint16_t ADC_Read( uint8_t channel );
void servoSetDefaultPos(void);
void USART_Init_Baudrate(void);
void Double_Beep(uint8_t time, uint8_t pause);
char* my_itoa(int32_t zahl, uint8_t Vorz, uint8_t len, uint8_t Festkomma, uint8_t Nachkomma);
void Displ_TimeMS(int32_t time);
 
 
#endif /* SETTING_H_ */
/NGVideo5_8/tags/v1.21/servo.c
0,0 → 1,186
 
/********************************************************************/
/* */
/* NG-Video 5,8GHz */
/* */
/* Copyright (C) 2011 - gebad */
/* */
/* This code is distributed under the GNU Public License */
/* which can be found at http://www.gnu.org/licenses/gpl.txt */
/* */
/* using */
/*! \file servo.c \brief Interrupt-driven RC Servo function library.*/
/* */
/*File Name : 'servo.c' */
/*Title : Interrupt-driven RC Servo function library */
/*Author : Pascal Stang - Copyright (C) 2002 */
/*Created : 7/31/2002 */
/*Revised : 8/02/2002 */
/*Version : 1.0 */
/*Target MCU : Atmel AVR Series */
/*Editor Tabs : 4 */
/* */
/*This code is distributed under the GNU Public License */
/* which can be found at http://www.gnu.org/licenses/gpl.txt */
/* */
/********************************************************************/
 
#include <avr/interrupt.h>
#include <avr/io.h>
 
#include "servo.h"
#include "config.h"
 
// Global variables
uint16_t ServoPosTics;
uint16_t ServoPeriodTics;
 
// servo channel registers
ServoChannelType ServoChannels[SERVO_NUM_CHANNELS];
ServoConst_t ServoConst[2] = {{SERVO_MAX, SERVO_MIN, SERVO_STEPS, SERVO_PRESCALER},\
{SERVO_MAX * 4, SERVO_MIN * 4, (SERVO_STEPS + 1) * 4 - 1, SERVO_PRESCALER / 4}};
 
 
// functions
 
//! initializes software PWM system 16-bit Timer
// normaler Weise wird ein Serv-PWM Signal aller 20ms wiederholt
// Werte: rev, min, max, mid vorher über servoSet...() initialisieren und einmal servoSetPosition(...) ausführen!!!
void servoInit(uint8_t servo_period)
{ uint16_t OCValue; // set initial interrupt time
 
// disble Timer/Counter1, Output Compare A Match Interrupt
TIMSK1 &= ~(1<<OCIE1A);
// set the prescaler for timer1
if (sIdxSteps == STEPS_255) {
TCCR1B &= ~((1<<CS11) | (1<<CS10));
TCCR1B |= (1<<CS12); // prescaler 256, Servo-Schritte 185 bei 180 grd Winkel
}
else {
TCCR1B &= ~(1<<CS12);
TCCR1B |= (1<<CS11) | (1<<CS10); // prescaler 64, Servo-Schritte 740 bei 180 grd Winkel
}
// attach the software PWM service routine to timer1 output compare A
// timerAttach(TIMER1OUTCOMPAREA_INT, servoService);
// enable channels
for(uint8_t channel=0; channel < SERVO_NUM_CHANNELS; channel++) {
// set default pins assignments SERVO2 Pin 4; SERVO1 Pin 5
ServoChannels[channel].pin = (1 << (SERVO2 + channel));
}
ServoPosTics = 0; // set PosTics
// set PeriodTics
ServoPeriodTics = F_CPU / ServoConst[sIdxSteps].prescaler * servo_period * 1e-3;
// read in current value of output compare register OCR1A
OCValue = OCR1AL; // read low byte of OCR1A
OCValue += (OCR1AH << 8); // read high byte of OCR1A
OCValue += ServoPeriodTics; // increment OCR1A value by nextTics
// set future output compare time to this new value
OCR1AH = OCValue >> 8; // write high byte
OCR1AL = OCValue & 0x00FF; // write low byte
TIMSK1 |= (1<<OCIE1A); // enable the timer1 output compare A interrupt
}
 
uint16_t pw_us(uint16_t Steps)
{
return(Steps * ServoConst[sIdxSteps].prescaler/(F_CPU * 1e-6) + 0.5); // Zeit pro Schritt (Wert * e-1) in µs
}
 
uint16_t ServoSteps(void)
{
return(ServoConst[sIdxSteps].steps);
}
 
void servoSet_rev(uint8_t channel, uint8_t val)
{
ServoChannels[channel].rev = val & 0x01;
}
 
void servoSet_min(uint8_t channel, uint16_t min)
{
ServoChannels[channel].min = ServoConst[sIdxSteps].min + min;
}
 
void servoSet_max(uint8_t channel, uint16_t max)
{
ServoChannels[channel].max = ServoConst[sIdxSteps].max - max;
}
 
void servoSet_mid(uint8_t channel, uint16_t mid)
{
ServoChannels[channel].mid = mid;
// Faktor 16, bzw. 16/2 um mit einer Nachkommastelle zu Rechnen
ServoChannels[channel].mid_scaled = (8 * (ServoChannels[channel].max - ServoChannels[channel].min) + \
(16 * mid - 8 * ServoConst[sIdxSteps].steps))/16 + ServoChannels[channel].min;
}
 
//! turns off software PWM system
void servoOff(void)
{
// disable the timer1 output compare A interrupt
TIMSK1 &= ~(1<<OCIE1A);
}
 
//! set servo position on channel
// input should be between 0 and ServoSteps (entspricht Maximalausschlag)
void servoSetPosition(uint8_t channel, uint16_t position)
{ uint16_t pos_scaled;
// calculate scaled position
if (ServoChannels[channel].rev != 0) position = ServoConst[sIdxSteps].steps - position;
if (position < ServoConst[sIdxSteps].steps/2)
//bei Position < Servomittelstellung Position*(Mitte - Min)/(Servoschritte/2)
pos_scaled = ServoChannels[channel].min + ((int32_t)position*2*(ServoChannels[channel].mid_scaled-ServoChannels[channel].min))/\
ServoConst[sIdxSteps].steps;
else
//bei Position >= Servomittelstellung
pos_scaled = ServoChannels[channel].mid_scaled + (uint32_t)(position - ServoConst[sIdxSteps].steps / 2) \
* 2 * (ServoChannels[channel].max-ServoChannels[channel].mid_scaled)/ServoConst[sIdxSteps].steps;
// set position
servoSetPositionRaw(channel, pos_scaled);
}
 
//! set servo position on channel (raw unscaled format)
void servoSetPositionRaw(uint8_t channel, uint16_t position)
{
// bind to limits
if (position < ServoChannels[channel].min) position = ServoChannels[channel].min;
if (position > ServoChannels[channel].max) position = ServoChannels[channel].max;
// set position
ServoChannels[channel].duty = position;
}
 
//Interruptroutine
ISR(TIMER1_COMPA_vect)
{ static uint8_t ServoChannel;
uint16_t nextTics;
uint16_t OCValue; // schedule next interrupt
 
if(ServoChannel < SERVO_NUM_CHANNELS) {
PORTD &= ~ServoChannels[ServoChannel].pin; // turn off current channel
}
ServoChannel++; // next channel
if(ServoChannel != SERVO_NUM_CHANNELS) {
// loop to channel 0 if needed
if(ServoChannel > SERVO_NUM_CHANNELS) ServoChannel = 0;
// turn on new channel
PORTD |= ServoChannels[ServoChannel].pin;
// schedule turn off time
nextTics = ServoChannels[ServoChannel].duty;
}
else {
// ***we could save time by precalculating this
// schedule end-of-period
nextTics = ServoPeriodTics-ServoPosTics;
}
// read in current value of output compare register OCR1A
OCValue = OCR1AL; // read low byte of OCR1A
OCValue += (OCR1AH <<8); // read high byte of OCR1A
OCValue += nextTics; // increment OCR1A value by nextTics
// set future output compare time to this new value
OCR1AH = OCValue >> 8; // write high byte
OCR1AL = OCValue & 0x00FF; // write low byte
 
ServoPosTics += nextTics; // set our new tic position
if(ServoPosTics >= ServoPeriodTics) ServoPosTics = 0;
}
 
/NGVideo5_8/tags/v1.21/servo.h
0,0 → 1,100
/*********************************************************************/
/* */
/* NG-Video 5,8GHz */
/* */
/* Copyright (C) 2011 - gebad */
/* */
/* This code is distributed under the GNU Public License */
/* which can be found at http://www.gnu.org/licenses/gpl.txt */
/* */
/* using */
/*! \file servo.c \brief Interrupt-driven RC Servo function library. */
/* */
/*File Name : 'servo.c' */
/*Title : Interrupt-driven RC Servo function library */
/*Author : Pascal Stang - Copyright (C) 2002 */
/*Created : 7/31/2002 */
/*Revised : 8/02/2002 */
/*Version : 1.0 */
/*Target MCU : Atmel AVR Series */
/*Editor Tabs : 4 */
/* */
/*ingroup driver_sw */
/*defgroup servo Interrupt-driven RC Servo Function Library (servo.c)*/
/*code #include "servo.h" \endcode */
/*par Overview */
/* */
/*This code is distributed under the GNU Public License */
/*which can be found at http://www.gnu.org/licenses/gpl.txt */
/* */
/*********************************************************************/
 
#ifndef SERVO_H
#define SERVO_H
 
// The numbers below good for parallax servos at an F_CPU of 20.000MHz.
// Da einige Servo's auch eien Winkel von 180 grd zulassen, Wertebereich
// entgegen den sonst üblichen. Einschränkung mit default Kalibrierung
// auf 0,9ms (45) bis 2,1ms(45) gesetzt. Je nach Servo, entspricht einen
// Winkel von etwa 180grd
// Periode default 20ms
 
#define SERVO_MAX 211 // 2,7 ms bei prescaler 256, bei prescaler 64 SERVO_MAX * 4
#define SERVO_MIN 26 // 0,33ms bei prescaler 256, bei prescaler 64 SERVO_MIN * 4
#define SERVO_STEPS 255 // Servo-Schritte von links nach rechts, Anschlagkalibrierung spielt keine Rolle
#define SERVO_PRESCALER 256 // bei prescaler 256, bei prescaler 64 SERVO_PRESCALER / 4
#define STEPS_255 0 // Servo-Schritte von links nach rechts, Anschlagkalibrierung spielt keine Rolle
#define STEPS_1023 1 // Servo-Schritte von links nach rechts, Anschlagkalibrierung spielt keine Rolle
 
typedef struct //Servo-Konstante je nach Prescaler
{
uint16_t max;
uint16_t min;
uint16_t steps;
uint16_t prescaler;
} ServoConst_t;
 
typedef struct //struct_ServoChannel
{
uint8_t pin; // hardware I/O port and pin for this channel
uint16_t duty; // PWM duty setting which corresponds to servo position
uint8_t rev; // Parameter, wie on/off; reverse; range
uint16_t min; // SERVO_MIN + Parameter min
uint16_t max; // SERVO_MAX - Parameter max
uint16_t mid_scaled; // skalierte Servomitte
int16_t mid; // Servomitte = SERVO_STEPS/2 +/- x Schritte; bei Pescaler 256 wird nur uint8_t benötigt aber bei 64
} ServoChannelType;
 
uint8_t sIdxSteps; // 0 für 255 und 1 für 1023 Schritte; Prescaler 256 oder 64
 
// functions
 
// initializes servo system
// You must run this to begin servo control
void servoInit(uint8_t servo_period);
 
// turns off servo system
// This stops controlling the servos and
// returns control of the SERVOPORT to your code
void servoOff(void);
 
// set servo position on a given channel
// servoSetPosition() commands the servo on <channel> to the position you
// desire. The position input must lie between 0 and POSITION_MAX and
// will be automatically scaled to raw positions between SERVO_MIN and
// SERVO_MAX
void servoSetPosition(uint8_t channel, uint16_t position);
 
// set raw servo position on a given channel
// Works like non-raw commands but position is not scaled. Position must
// be between SERVO_MIN and SERVO_MAX
void servoSetPositionRaw(uint8_t channel, uint16_t position);
// vor servoInit(), oder vor sei() ServoWerte mit servoSet...() initialisieren, einschließlich servoSetPosition(...)!
void servoSet_rev(uint8_t channel, uint8_t val);
void servoSet_min(uint8_t channel, uint16_t min);
void servoSet_max(uint8_t channel, uint16_t max);
void servoSet_mid(uint8_t channel, uint16_t mid);
uint16_t pw_us(uint16_t Steps); // gibt Zeit in µs bei x Servoschritte
uint16_t ServoSteps(void); // gibt "Konstante" derzeitiger Servoschritte zürück
 
#endif /* SERVO_H */
/NGVideo5_8/tags/v1.21/tracking.c
0,0 → 1,369
 
/****************************************************************/
/* */
/* NG-Video 5,8GHz */
/* */
/* Copyright (C) 2011 - gebad */
/* */
/* This code is distributed under the GNU Public License */
/* which can be found at http://www.gnu.org/licenses/gpl.txt */
/* */
/****************************************************************/
 
#include "usart.h"
#include "math.h"
#include <stdio.h>
 
#include "servo.h"
 
#define DLEFT 0
#define DRIGHT 1
#define DEG_TO_RAD 0.0174533// degrees to radians = PI / 180
#define RAD_TO_DEG 57.2957795// radians to degrees = 180 / PI
#define AltFaktor 22.5
 
 
typedef struct {
double distance;
double bearing;
} geo_t;
 
geo_t geo;
int AngelPan, AngelTilt;
float Altitude;
uint16_t dDCurrent = 0;
uint16_t dUsedCapacity = 0;
int32_t time_remaining = 0;
uint16_t Ikorr;
uint16_t Wkorr;
/**************************************************************/
/* */
/* RSSI Tracking */
/* */
/**************************************************************/
 
void Tracking_RSSI(void)
{ uint16_t u0, u1;
static uint8_t direction;
static uint16_t servo1pos;
u0 = (ADC_Read(RSSI0) * (uint32_t)udbm.korr_1)/UDBM_KORR_FA;
u1 = (ADC_Read(RSSI1) * (uint32_t)udbm.korr_2)/UDBM_KORR_FA;
 
if (direction == DLEFT) {
if (u0 < u1) {
if ( servo1pos > 0) --servo1pos; // Servo Endposition?
servoSetPosition(SERVO_PAN, servo1pos); // beibehaltene Richtung ==> sofort ausführen
}
else
if (u0 > (u1 + track_hyst)) direction = DRIGHT; // Richtungwechsel, wenn Hysterese überschritten
}
else {
if (u0 > u1) {
if ( servo1pos < ServoSteps()) ++servo1pos; // Servo Endposition?
servoSetPosition(SERVO_PAN, servo1pos); // beibehaltene Richtung ==> sofort ausführen
}
else
if ((track_hyst + u0) < u1) direction = DLEFT; // Richtungwechsel, wenn Hysterese überschritten
}
}
 
/**************************************************************/
/* */
/* GPS Tracking */
/* */
/**************************************************************/
 
// Umrechnung Winkel in Servoschritte
void servo_track(uint8_t servo_nr, int16_t Angel)
{
servoSetPosition(servo_nr, (uint16_t)((uint32_t)Angel * ServoSteps() / 180));
}
 
// Anzeige eines GPS-Wertes auf LCD
void Displ_Format_Data(uint8_t x, uint8_t y, char *description, char *data, char measure)
{
lcdGotoXY(x, y);
lcdPuts(description);
lcdPuts(data);
if (measure != '\0')
lcdPutc(measure);
}
 
void Displ_Val_comma(int32_t zahl)
{
if (zahl < 0)
lcdPuts(my_itoa(zahl / 10, 1, 2, 0, 0)); // Übergabe Integer, vorher *10 für eventuelle Kommastelle
else
if (zahl < 100)
lcdPuts(my_itoa(zahl, 0, 3, 1, 1));
else
lcdPuts(my_itoa(zahl / 10, 0, 3, 0, 0));
lcdPutc('m');
}
// Datenempfang vom MK ==> blinkt Antennensymbol
void Displ_wiRX(void)
{ static uint8_t timer = 0;
char Sats;
if ((bat_low != 0) && (pmenu[0] == '\0')) { // nicht im Menü und nicht bei Akku leer blinken
lcdGotoXY(1, 0);
if (wi232RX) { // Datensatz vom MK empfangen?
if (timer < BLINK_PERIOD/2)
lcdPutc(5);
else {
Sats = MK.navi_data.SatsInUse; // aktuell empfangene Satellitenanzahl
if (MK.navi_data.SatsInUse > 9)
Sats = 'X'; // Anzeige einstellig, da kein Platz auf Display
else
Sats = MK.navi_data.SatsInUse + '0'; // Umrechnung Char
lcdPutc(Sats);
}
}
else
lcdPutc(':');
wi232RX = 0;
if (++timer == BLINK_PERIOD) timer = 0;
}
}
 
// Berechnung von Distanz und Winkels aus GPS-Daten home(MK eingeschaltet)
// zur aktuellen Position(nach Motorstart)
geo_t calc_geo(HomePos_t home, GPS_Pos_t pos)
{ double lat1, lon1, lat2, lon2, d1, dlat;
geo_t geo;
lon1 = home.Home_Lon;
lat1 = home.Home_Lat;
lon2 = (double)pos.Longitude / 10000000;
lat2 = (double)pos.Latitude / 10000000;
 
// Formel verwendet von http://www.kompf.de/gps/distcalc.html
// 111.3 km = Abstand zweier Breitenkreise und/oder zweier Längenkreise am Äquator
// es wird jedoch in Meter weiter gerechnet
d1 = 111300 * (double)cos((double)(lat1 + lat2) / 2 * DEG_TO_RAD) * (lon1 - lon2);
dlat = 111300 * (double)(lat1 - lat2);
// returns a value in metres http://www.kompf.de/gps/distcalc.html
geo.bearing = fmod((RAD_TO_DEG * (double)atan2(d1, dlat)) + 180, 360); // +180 besserer Vergleich mit MkCockpit
if (geo.bearing > 360) geo.bearing -= 360; // bekam schon Werte über 400
geo.distance = sqrt(d1 * d1 + dlat * dlat);
return(geo);
}
 
void store_LipoData(void)
{ uint32_t tmp_time_on;
 
tmp_time_on = eeprom_read_dword(&ep_lipo[akku_nr].time_on);
mk_timer = 0;
if (tmp_time_on != lipo.time_on) {
if (!MK_Motor_run) lipo.UsedCapacity = dUsedCapacity;
eeprom_write_byte(&ep_lipo[akku_nr].Umk, lipo.Umk);
eeprom_write_word(&ep_lipo[akku_nr].UsedCapacity, lipo.UsedCapacity);
eeprom_write_dword(&ep_lipo[akku_nr].time_on, lipo.time_on);
eeprom_write_block(&current,&ep_current,sizeof(current_t));
Double_Beep(DBEEPWR, DBEEPWRP);
}
}
 
#define I_MOTOR_OFF 6 // IR=280mA gemessen; IR vom MK Akku voll 500mA; I Motoren an 1,3A; Grenzwert für Erkennung Akkuwechsel zwischen 500 und 1200mA
void Misc(void)
{
// Spannung, Strom, Leistung sofort (ohne Motorstart) lesen
if ((!MK_Motor_run) && ((lipo.Umk + 2) < MK.navi_data.UBat) && (MK.navi_data.Current <= I_MOTOR_OFF)) { // Bei Ruhestrom kleiner 501mA Akku gewechselt? IR=280mA gemessen
lipo.Umk = MK.navi_data.UBat;
mk_timer = 0;
dUsedCapacity = 0;
lipo.UsedCapacity = 0;
lipo.time_on = 0;
lcdClear();
// Funktion wird innhalb Task ausgeführt, auch innerhalb eines anderen Menüpunkes oder Eingabeaufforderung
strcpy(tmp_pmenu, pmenu); // da bei Change_Value(...) ein Menüpunkt zurück
strcpy(pmenu,"0");
Menu_MK_BatteryChangeNr(); // eingeschobenes Menü, danach aber wieder zur ursprünglichen Anzeige!
strcpy(pmenu, tmp_pmenu); // Sonst müsste vorherige aktuelle LCD-Anzeige zwischengespeichert werden.
/* irgendeine Eingabe-While-Schleife (Menue, Change..) zum Verlassen zwingen und mit Jump_Menu(pmenu)
den gleichen Menüpunkt wieder aufrufen */
if (pmenu[0] == '\0')
Displ_Main_Disp();
else
exit_while = 1; // wird nach den möglichen while, innerhalb der Fkt. wieder auf 0 gesetzt
store_LipoData();
}
mk_timer = 1; // MK-Timer auf on stellen
if ((!MK_Motor_run) && (MK.navi_data.Current <= I_MOTOR_OFF) && (MK.navi_data.UBat > 0) && (MK.navi_data.UBat < lipo.Umk))
lipo.Umk = MK.navi_data.UBat; // Bei Ruhestrom, da je nach Last UBat schwankend
/* if (current.Sum > 0xfffffff) { // wesentlich größerer Zeitraum für Mittelwertbildung
current.Sum /= 2;
current.Count /= 2;
} */
if (current.Count > 18000) { // ungefär 30 Minuten Mittelwert
current.Sum = (current.Sum * 9)/10; // um 10% verkleinern
current.Count = ((uint32_t)current.Count * 9)/10;
}
Ikorr = mk_i_offset + (uint32_t)(MK.navi_data.Current - MK_I_OFFSET_5) * mk_i_faktor / 100;
current.Sum += Ikorr;
current.Count++;
dDCurrent = current.Sum / current.Count;
Wkorr = (uint32_t)MK.navi_data.UsedCapacity * mk_w_faktor / 100;
dUsedCapacity = lipo.UsedCapacity + Wkorr;
time_remaining = ((int32_t)lipo.Capacity - dUsedCapacity) * 36 / dDCurrent;
if (abs(time_remaining) > M59S59) {
if (time_remaining < 0)
time_remaining = -1 * M59S59;
else
time_remaining = M59S59; // M59S59 sind 59 Minuten und 59 Sekunden
}
}
 
// MK OSD-Daten lesen und verifizieren
uint8_t OSD_Data_valid(void)
{ uint8_t ret = 0;
char *tx_osd = {"#co?]==EH\r"};
// char interval[2] = {10, '\0'};
if (rx_line_decode('O')) { // OSD-Datensatz prüfen/dekodieren
if (rx_timeout < RX_TIME_OLD) { // GPS-Daten nicht zu alt und ok.
if (MK.navi_data.NCFlags & NC_FLAG_GPS_OK) {
ret = 1;
MK_Motor_run = MK.navi_data.FCStatusFlags & FC_FLAG_MOTOR_RUN;
}
Misc();
}
}
else
if (rx_timeout == RX_TIME_END) // ca. 4 Sekunden nach Signalverlust
store_LipoData();
// ca. 210ms keine OSD-Daten empfangen ==> sende neue Anforderung an MK
// if ((track_tx) && (rx_timeout > RX_TIMEOUT)) tx_Mk(NC_ADDRESS, 'o', interval, 1); // 420 * 0.5ms interval
if ((track_tx) && (rx_timeout > RX_TIMEOUT)) USART_send_Str(tx_osd); // 420 * 0.5ms interval
return(ret);
}
 
// MK eingeschaltet und GPS-ok, danach Motoren gestartet ==> Berechnung horizontaler/vertikaler Servowinkel
// Hauptprogramm von GPS Antennen-Nachführung
void Tracking_GPS(void)
{ static uint8_t track_running = 0;
 
if (!track_running) {
track_running = 1; // verhindert doppelten Aufruf, wenn in Eingabeschleife Menu_MK_BatteryChangeNr()
if (OSD_Data_valid()) {
if (coldstart) {
// erst nach Neustart NGVideo und beim Motorstart werden Daten vom MK übernommen
if (MK.navi_data.FCStatusFlags & FC_FLAG_MOTOR_START) {
// doppelt um nur einmal nach Start zu rechnen und Anzeige ohne! Minimalistic printf version
MK_pos.Home_Lon = (double)MK.navi_data.HomePosition.Longitude / 10000000;
MK_pos.Home_Lat = (double)MK.navi_data.HomePosition.Latitude / 10000000;
MK_pos.Home_Lon_7 = MK.navi_data.HomePosition.Longitude;
MK_pos.Home_Lat_7 = MK.navi_data.HomePosition.Latitude;
MK_pos.Home_Alt = MK.navi_data.HomePosition.Altitude;
MK_pos.direction = MK.navi_data.CompassHeading;
coldstart = 0;
}
}
else {
geo = calc_geo(MK_pos, MK.navi_data.CurrentPosition);
// aus MkCockpit http://forum.mikrokopter.de/topic-post216136.html#post216136
// (4 * (........))/5 ==> Wichtung Luftdruck-Höhe zu GPS
Altitude = (4 * (MK.navi_data.Altimeter/AltFaktor) + ((float)(MK.navi_data.CurrentPosition.Altitude - MK_pos.Home_Alt) / 1000)) /5;
AngelTilt = RAD_TO_DEG * atan2(Altitude, geo.distance);
if (geo.distance < 4) { // Abstand MK- zu Antennenposition < 4m ==> Pan-Servo in Mittelstellung
geo.bearing = MK_pos.direction;
if (Altitude < 3) AngelTilt = 0; // wenn (Altitude <= 0) ist AngelTilt sowieso 0
}
// egal wo der Übergangspunkt 359, 360, 1grd ist => Winkelübergangspunkt auf 0 bzw. 180grd des Servos bringen
// 360 grd negative Winkelwerte als positive
AngelPan = fmod(geo.bearing - MK_pos.direction + 360 + 90, 360);
if (AngelPan > 360) AngelPan -= 360;
 
if (AngelTilt < 0) AngelTilt = 0;
if (AngelTilt > 180) AngelTilt = 180;
if (AngelPan >= 180) { // zwecks 360grd-Abdeckung flipt Pan-/Tilt-Servo
AngelPan = AngelPan - 180;
AngelTilt = 180 - AngelTilt;
}
 
servo_track(0, AngelPan);
servo_track(1, AngelTilt);
}
}
if ((gps_display > GPS_DISP_NONE) && ((!coldstart) || (gps_display == GPS_MISC)) && (bat_low != 0)) {
if ((gps_disp_clear) && (!coldstart)){
gps_disp_clear = 0;
lcdClear();
}
// makefile ohne! Minimalistic printf version
switch(gps_display) {
case GPS_DISP_CALC:
Displ_Format_Data(0, 0, "Dir:", my_itoa(MK_pos.direction, 0, 3, 0, 0), '\xdf'); // '\xdf' entspricht '°'
lcdGotoXY(8,0);
lcdPuts("Dis:");
Displ_Val_comma(geo.distance * 10);
Displ_Format_Data(0, 1, "Bea:", my_itoa((uint32_t)(geo.bearing), 0, 3, 0, 0), '\xdf');
lcdGotoXY(8,1);
lcdPuts("Alt:");
Displ_Val_comma(Altitude * 10);
Displ_Format_Data(0, 2, "Pan:", my_itoa(AngelPan, 0, 3, 0, 0), '\xdf');
Displ_Format_Data(8, 2, "Til:", my_itoa(AngelTilt, 0, 3, 0, 0), '\xdf');
break;
case GPS_DISP_CURRENT:
Displ_Format_Data(0, 0, "aLon:", my_itoa(MK.navi_data.CurrentPosition.Longitude, 0, 11, 7, 7), '\0');
Displ_Format_Data(0, 1, "aLat:", my_itoa(MK.navi_data.CurrentPosition.Latitude, 0, 11, 7, 7), '\0');
Displ_Format_Data(0, 2, "aAlt: ", my_itoa(MK.navi_data.CurrentPosition.Altitude, 1, 11, 3, 1), '\0');
break;
case GPS_DISP_HOME:
Displ_Format_Data(0, 0, "hLon:", my_itoa(MK_pos.Home_Lon_7, 0, 11, 7, 7), '\0');
Displ_Format_Data(0, 1, "hLat:", my_itoa(MK_pos.Home_Lat_7, 0, 11, 7, 7), '\0');
Displ_Format_Data(0, 2, "hAlt: ", my_itoa(MK_pos.Home_Alt, 1, 11, 3, 1), '\0');
break;
case GPS_MISC:
Displ_Format_Data(0, 0, "U:", my_itoa(MK.navi_data.UBat, 0, 4, 1, 1), 'V');
Displ_Format_Data(8, 0, "W:", my_itoa(dUsedCapacity, 0, 4, 0, 0), '\0');
Displ_Format_Data(0, 1, "I:", my_itoa(Ikorr, 0, 4, 1, 1), 'A');
Displ_Format_Data(8, 1, "\xee:", my_itoa(dDCurrent, 0, 4, 1, 1), 'A');
lcdGotoXY(0,2);
lcdPuts("\x1a");
Displ_TimeMS(lipo.time_on / T2SECDIV);
lcdGotoXY(8,2);
lcdPuts("R");
Displ_TimeMS(time_remaining);
}
}
Displ_wiRX();
track_running = 0;
}
}
 
/************************************************************************/
/* */
/* MKCockPit Tracking */
/* */
/* http://www.pololu.com/file/download/ssc03a_guide.pdf?file_id=0J37 * */
/* */
/************************************************************************/
 
void Tracking_MKCockpit(void)
{ uint16_t ServoPos;
 
if (Get_Pololu_cmd(MK.data_decode, POLOLU_CMD)) {
switch(MK.data_decode[0]) {
// Command 0: Set Parameters(1 data byte)
case 0x00: ;
break;
// Command 1: Set Speed (1 data byte)
case 0x01: ;
break;
// Command 4: Set Position,Absollute(2 data bytes) - angepasst für default MKCockPit
case 0x04:ServoPos = MK.data_decode[2];
ServoPos = ((ServoPos << 7) | MK.data_decode[3]) / 20; // ServoPos * ServoSteps() sonst zu groß
if (ServoPos >= 60) ServoPos -= 60; else ServoPos = 0;
if (ServoPos > 180) ServoPos = 180;
//servoSetPosition(MK.data_decode[1], (uint16_t)((uint32_t)ServoPos * ServoSteps() / 180));
servo_track(MK.data_decode[1], ServoPos);
}
}
}
/NGVideo5_8/tags/v1.21/usart.c
0,0 → 1,239
 
/****************************************************************/
/* */
/* NG-Video 5,8GHz */
/* */
/* Copyright (C) 2011 - gebad */
/* */
/* This code is distributed under the GNU Public License */
/* which can be found at http://www.gnu.org/licenses/gpl.txt */
/* */
/****************************************************************/
 
#include <avr/io.h>
#include <avr/interrupt.h>
#include "usart.h"
 
/********************************************************************************************************************/
/* */
/* MK Protokoll */
/* http://www.mikrokopter.de/ucwiki/en/SerialCommands?highlight=(command) */
/* http://www.mikrokopter.de/ucwiki/en/SerialProtocol?highlight=(protocol) */
/* */
/* Slave-Address Part */
/* 1 FC */
/* 2 NC */
/* 3 MK3MAG */
/* */
/* Auszug von Commands, nur OSD verwendet: */
/* Received by NC | Sent by NC */
/* | since NC */
/* Description ID Address Data | ID Address Data Firmware */
/* Debug Request 'd' AnyAddr u8 AutoSendInterval. Value is | 'D' SlaveAddr Debug Data Struct */
/* multiplied by 10 in receiver and , | */
/* then used as milliseconds. Subsciption | */
/* needs to be renewed every 4s. | */
/* Request OSD 'o' NC-Addr 1 byte sending interval (in 10ms steps)| 'O' NC-Addr NaviDataStruct 0.12h */
/* -Data | */
/* Redirect UART 'u' NC-Addr 1 byte param for uart selector (0=FC, | - - - 0.12h */
/* 1=MK3MAG, 2=MKGPS), can be switched | */
/* back to NC debug by sending the magic | */
/* packet "0x1B,0x1B,0x55,0xAA,0x00" | */
/* Set 3D-Data 'c' AnyAddr u8 Interval | 'C' NC-Addr struct Data3D 0.14a */
/* Interval */
/* */
/********************************************************************************************************************/
 
char rx_buffer[RXD_BUFFER_SIZE];
 
volatile uint8_t rx_len;
volatile uint8_t rx_ready = 0;
uint8_t rx_GPS;
char start;
 
/**************************************************************/
/* */
/* USART */
/* 8 Datenbits, 1 Stopbit, keine Parität */
/* */
/**************************************************************/
 
void USART_Init(unsigned int baud)
{ uint16_t ubrx;
 
ubrx = F_CPU/(baud * 16L) - 1;
/* Set baud rate */
UBRR0H = (unsigned char)(ubrx>>8);
UBRR0L = (unsigned char)ubrx;
/* RX Complete Interrupt Enable, Enable receiver and transmitter */
UCSR0B = (1<<RXCIE0) | (1<<RXEN0) | (1<<TXEN0);
/* Asynchronous USART, no Parity, Set frame format: 8data, 1stop bit */
UCSR0C = (1<<UCSZ01) | (1<<UCSZ00); // 8data Bit
}
 
void USART_send_Chr(unsigned char data)
{
/* Wait for empty transmit Puffer */
while ( !( UCSR0A & (1<<UDRE0)) ) ;
/* Put data into Puffer, sends the data */
UDR0 = data;
}
 
void USART_send_Str(char *str )
{
while (*str) {
USART_send_Chr(*str);
str++;
}
}
 
/*
// verwendet Orginal H&I MK-Software http://www.mikrokopter.de/ucwiki/en/SerialProtocol?highlight=(protocol)
// kann auch vereinfacht werden ==> gleich kodierten String senden char *tx_osd = {"#co?]==EH\r\0"}
// Funktion getestet und funktioniert
void tx_Mk(unsigned char addr, char cmd, char *data, uint8_t len)
{ char tx_buffer[TXD_BUFFER_SIZE];
uint8_t tx_i = 0;
uint8_t i = 0;
unsigned char a,b,c;
unsigned int tmpCRC = 0;
 
tx_buffer[tx_i++] = '#'; // Start-Byte
tx_buffer[tx_i++] = 'a' + addr; // Adress
tx_buffer[tx_i++] = cmd; // Command
// code64
while (len) {
if (len) { a = data[i++]; len--;} else a = 0;
if (len) { b = data[i++]; len--;} else b = 0;
if (len) { c = data[i++]; len--;} else c = 0;
tx_buffer[tx_i++] = '=' + (a >> 2);
tx_buffer[tx_i++] = '=' + (((a & 0x03) << 4) | ((b & 0xf0) >> 4));
tx_buffer[tx_i++] = '=' + (((b & 0x0f) << 2) | ((c & 0xc0) >> 6));
tx_buffer[tx_i++] = '=' + (c & 0x3f);
}
// add crc
for (i = 0; i < tx_i; i++) {
tmpCRC += tx_buffer[i];
}
tmpCRC %= 4096;
tx_buffer[i++] = '=' + tmpCRC / 64;
tx_buffer[i++] = '=' + tmpCRC % 64;
tx_buffer[i++] = '\r'; // End-Byte
 
tx_buffer[i++] = '\0'; // USART_send_Str(...) ==> End-while
USART_send_Str(tx_buffer);
} */
 
ISR(USART0_RX_vect)
{ char received;
static uint8_t line_flag = 1;
static char* ptr_write = rx_buffer;
static uint8_t frame = 6;
// von '#' bis '\r' Puffer, einschließlich Satzzeichen schreiben
received = UDR0;
if (rx_ready == 0) {
if ((received == start) && line_flag) { // start '#' oder 0x80
line_flag = 0; // MK-Datensatzanfang wurde erkannt
ptr_write = rx_buffer; // Schreibzeiger auf Anfang Puffer setzen
rx_len = 0;
}
if (line_flag == 0) { // MK/Pololu-Datensatz ?
*ptr_write = received;
rx_len++;
 
/* GPS Datensatzende */
if (rx_GPS) {
if (received == '\r') { // Ende MK-Datensatz ?
line_flag = 1;
rx_ready = 1; // Puffer Schreiben sperren, MK-Datensatz kann nun verarbeitet werden
}
}
/* Pololu Micro Serial stark reduziert/vereinfacht; rx_len-Abfrage 1 höher ==> bereits incrementiert */
else {
if ((rx_len == 2) && (received != 0x01)) line_flag = 1; // device
if ((rx_len == 3) && (received > 0x01)) frame = 6; else frame = 5; // command
if (rx_len == frame) {
line_flag = 1;
rx_ready = 1; // Puffer Schreiben sperren, Pololu-Datensatz kann nun verarbeitet werden
}
}
 
ptr_write++;
if(rx_len == RXD_BUFFER_SIZE) line_flag = 1; // ungültiger MK/Pololu-Datensatz ? ==> neu beginnen
}
}
}
 
// verwendet aus Orginal H&I MK-Software http://www.mikrokopter.de/ucwiki/en/SerialProtocol?highlight=(protocol)
void Decode64(char *ptrOut, uint8_t len, uint8_t ptrIn)
{ unsigned char a,b,c,d;
unsigned char ptr = 0;
unsigned char x,y,z;
while(len)
{
a = rx_buffer[ptrIn++] - '=';
b = rx_buffer[ptrIn++] - '=';
c = rx_buffer[ptrIn++] - '=';
d = rx_buffer[ptrIn++] - '=';
 
x = (a << 2) | (b >> 4);
y = ((b & 0x0f) << 4) | (c >> 2);
z = ((c & 0x03) << 6) | d;
if(len--) ptrOut[ptr++] = x; else break;
if(len--) ptrOut[ptr++] = y; else break;
if(len--) ptrOut[ptr++] = z; else break;
}
}
 
// eingearbeitet Orginal H&I MK-Software mkprotocol.h und mkprotocol.c
uint8_t rx_line_decode(char rx_ID)
{ uint8_t ret = 0;
uint8_t crc1,crc2;
int tmpCRC = 0;
// rx_ready gleichzeitig usart rx_buffer schreiben gesperrt
if ((rx_ready == 1) && (rx_len > 0) && (rx_buffer[2] == rx_ID)) {
// Checksumme
// verwendet http://www.mikrokopter.de/ucwiki/en/SerialProtocol?highlight=(protocol)
for(uint8_t i = 0; i < rx_len - 3;i++) {
tmpCRC += rx_buffer[i];
}
tmpCRC %= 4096;
crc1 = '=' + tmpCRC / 64;
crc2 = '=' + tmpCRC % 64;
if ((crc1 == rx_buffer[rx_len-3]) && (crc2 == rx_buffer[rx_len-2])) {
Decode64(MK.data_decode, rx_len - 6, 3); // Daten ohne Satzzeichen, header und crc
ret = 1;
}
cli();
rx_timeout = 0; // wenn kein gültiger Datensatz für rx_ID ==> Counter wird nicht mehr rückgesetzt
sei();
}
// für Blinken des Antennenzeichens, MK antwortet immer mit cmd Großbuchstaben
if ((rx_timeout < RX_TIME_OLD) && (rx_buffer[2] >= 'A') && (rx_buffer[2] <= 'Z')) wi232RX = 1;
rx_ready = 0; // Puffer Schreiben entsperren, neuer MK-Datensatz kann wieder empfangen/gepuffert werden
return(ret);
}
 
void USART_RX_Mode(uint8_t tracking)
{
rx_GPS = (tracking == TRACKING_GPS);
if (rx_GPS) start ='#'; else start = 0x80;
}
 
uint8_t Get_Pololu_cmd(char *ptrOut, uint8_t ptrIn)
{
rx_len -=2; // ohne Start-Char und device
if (rx_ready == 1) {
for (uint8_t i = 0; i < rx_len; i++)
ptrOut[i] = rx_buffer[ptrIn++]; // ab Pololu-Command
}
else
rx_len = 0;
rx_ready = 0; // Puffer Schreiben entsperren, neuer Pololu-Datensatz kann wieder empfangen/gepuffert werden
return(rx_len);
}
/NGVideo5_8/tags/v1.21/usart.h
0,0 → 1,121
 
/****************************************************************/
/* */
/* NG-Video 5,8GHz */
/* */
/* Copyright (C) 2011 - gebad */
/* */
/* This code is distributed under the GNU Public License */
/* which can be found at http://www.gnu.org/licenses/gpl.txt */
/* */
/****************************************************************/
 
#ifndef USART_H_
#define USART_H_
 
#define TRACKING_RSSI 1
#define TRACKING_GPS 2
#define TRACKING_MKCOCKPIT 3
 
#define RXD_BUFFER_SIZE 150 //Puffergröße in Byte
#define TXD_BUFFER_SIZE 20
#define ANY_ADDRESS 0
#define FC_ADDRESS 1
#define NC_ADDRESS 2
 
#define FC_FLAG_MOTOR_RUN 0x01
#define FC_FLAG_FLY 0x02
#define FC_FLAG_CALIBRATE 0x04
#define FC_FLAG_MOTOR_START 0x08
 
#define NC_FLAG_GPS_OK 0x80
 
#define RX_TIMEOUT 420 // 420 * 0.5ms interval (16bit-Timer 2)
#define RX_TIME_OLD 3 * RX_TIMEOUT // Grenze, Datensatz viel zu alt
#define RX_TIME_END 20* RX_TIMEOUT // Zählerbegrenzung und lipo speichern
 
//volatile unsigned char buffercounter;
 
//char data_decode[RXD_BUFFER_SIZE];
volatile uint16_t rx_timeout;
 
void USART_Init(unsigned int baud);
void USART_send_Str(char *str );
uint8_t rx_line_decode(char rx_ID);
//void tx_Mk(unsigned char addr, char cmd, char *data, uint8_t len);
 
// Orginal H&I MK-Software
typedef struct
{
int32_t Longitude; // in 1E-7 deg
int32_t Latitude; // in 1E-7 deg
int32_t Altitude; // in mm
uint8_t Status; // validity of data
} __attribute__((packed)) GPS_Pos_t;
 
typedef struct
{
uint16_t Distance; // distance to target in dm
int16_t Bearing; // course to target in deg
} __attribute__((packed)) GPS_PosDev_t;
 
typedef struct
{
uint8_t Version; // version of the data structure
GPS_Pos_t CurrentPosition; // see ubx.h for details
GPS_Pos_t TargetPosition;
GPS_PosDev_t TargetPositionDeviation;
GPS_Pos_t HomePosition;
GPS_PosDev_t HomePositionDeviation;
uint8_t WaypointIndex; // index of current waypoints running from 0 to WaypointNumber-1
uint8_t WaypointNumber; // number of stored waypoints
uint8_t SatsInUse; // number of satellites used for position solution
int16_t Altimeter; // hight according to air pressure
int16_t Variometer; // climb(+) and sink(-) rate
uint16_t FlyingTime; // in seconds
uint8_t UBat; // Battery Voltage in 0.1 Volts
uint16_t GroundSpeed; // speed over ground in cm/s (2D)
int16_t Heading; // current flight direction in ° as angle to north
int16_t CompassHeading; // current compass value in °
int8_t AngleNick; // current Nick angle in 1°
int8_t AngleRoll; // current Roll angle in 1°
uint8_t RC_Quality; // RC_Quality
uint8_t FCStatusFlags; // Flags from FC
uint8_t NCFlags; // Flags from NC
uint8_t Errorcode; // 0 --> okay
uint8_t OperatingRadius; // current operation radius around the Home Position in m
int16_t TopSpeed; // velocity in vertical direction in cm/s
uint8_t TargetHoldTime; // time in s to stay at the given target, counts down to 0 if target has been reached
uint8_t RC_RSSI; // Receiver signal strength (since version 2 added)
int16_t SetpointAltitude; // setpoint for altitude
uint8_t Gas; // for future use
uint16_t Current; // actual current in 0.1A steps
uint16_t UsedCapacity; // used capacity in mAh
} __attribute__((packed)) NaviData_t;
 
typedef union
{
char data_decode[RXD_BUFFER_SIZE];
NaviData_t navi_data;
} MK_t;
 
MK_t MK;
 
typedef struct
{
double Home_Lon;
double Home_Lat;
int32_t Home_Lon_7; // in 1E-7 deg
int32_t Home_Lat_7; // in 1E-7 deg
int32_t Home_Alt; // in mm
int16_t direction; // ermittelte Konstante aus Mittelposition Antenne geo.bearing - navi_data.CompassHeading
} HomePos_t;
 
HomePos_t MK_pos;// steht hier nur wegen Vermeidung Compiler-Warnung
uint8_t wi232RX; // Statusflag für Empfangszeichen auf lcd
 
void USART_RX_Mode(uint8_t tracking);
uint8_t Get_Pololu_cmd(char *ptrOut, uint8_t ptrIn);
 
#endif /* USART_H_ */
 
/NGVideo5_8/tags/v1.21
Property changes:
Added: bugtraq:number
+true
\ No newline at end of property