Subversion Repositories Projects

Compare Revisions

Ignore whitespace Rev 1465 → Rev 1467

/NGVideo5_8/tags/V1.30/ngvideo.c
File deleted
\ No newline at end of file
/NGVideo5_8/tags/V1.30/makefile
File deleted
/NGVideo5_8/tags/V1.30/servo.c
File deleted
/NGVideo5_8/tags/V1.30/usart.c
File deleted
/NGVideo5_8/tags/V1.30/ngvideo.h
File deleted
\ No newline at end of file
/NGVideo5_8/tags/V1.30/tools.c
File deleted
/NGVideo5_8/tags/V1.30/lipo.c
File deleted
\ No newline at end of file
/NGVideo5_8/tags/V1.30/servo.h
File deleted
/NGVideo5_8/tags/V1.30/ngvideo.aws
File deleted
/NGVideo5_8/tags/V1.30/usart.h
File deleted
/NGVideo5_8/tags/V1.30/NGVideo_5_8GHz.pnproj
File deleted
\ No newline at end of file
/NGVideo5_8/tags/V1.30/tools.h
File deleted
\ No newline at end of file
/NGVideo5_8/tags/V1.30/lipo.h
File deleted
\ No newline at end of file
/NGVideo5_8/tags/V1.30/ngvideo.avrgccproj
File deleted
\ No newline at end of file
/NGVideo5_8/tags/V1.30/menue.c
File deleted
\ No newline at end of file
/NGVideo5_8/tags/V1.30/config.h
File deleted
/NGVideo5_8/tags/V1.30/keys.c
File deleted
\ No newline at end of file
/NGVideo5_8/tags/V1.30/mk.h
File deleted
\ No newline at end of file
/NGVideo5_8/tags/V1.30/NGVideo_5_8GHz.pnps
File deleted
\ No newline at end of file
/NGVideo5_8/tags/V1.30/menue.h
File deleted
\ No newline at end of file
/NGVideo5_8/tags/V1.30/keys.h
File deleted
\ No newline at end of file
/NGVideo5_8/tags/V1.30/dogm.c
File deleted
/NGVideo5_8/tags/V1.30/KurzanleitungFW.pdf
File deleted
/NGVideo5_8/tags/V1.30/ngvideo.avrsuo
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/NGVideo5_8/tags/V1.30/dogm.h
File deleted
/NGVideo5_8/tags/V1.30/tracking.c
File deleted
\ No newline at end of file
/NGVideo5_8/tags/V1.30/messages.c
File deleted
\ No newline at end of file
/NGVideo5_8/tags/V1.30/tracking.h
File deleted
\ No newline at end of file
/NGVideo5_8/tags/V1.30/messages.h
File deleted
\ No newline at end of file
/NGVideo5_8/tags/V1.30/ngvideo.avrsln
File deleted
/NGVideo5_8/tags/V1.30/main.c
File deleted
/NGVideo5_8/tags/V1.30/GPGGA_01_2011.txt
File deleted
/NGVideo5_8/tags/V1.30/Hexfiles/NGVideo_MEGA644.hex
File deleted
/NGVideo5_8/tags/V1.30/Hexfiles
Property changes:
Deleted: bugtraq:number
-true
\ No newline at end of property
/NGVideo5_8/tags/V1.30
Property changes:
Deleted: bugtraq:number
-true
\ No newline at end of property
/NGVideo5_8/tags/V1.31/GPGGA_01_2011.txt
0,0 → 1,69
MON-VER - 0A 04 46 00 35 2E 30 30 20 20 20 20 4A 61 6E 20 30 39 20 32 30 30 36 20 31 32 3A 30 30 3A 30 30 00 01 30 30 30 34 30 30 30 31 00 00 4D 34 48 31 2E 31 20 20 4A 61 6E 20 30 39 20 32 30 30 36 20 31 35 3A 33 39 3A 35 34 00 00
CFG-ANT - 06 13 04 00 0B 00 0F 38
CFG-DAT - 06 06 02 00 00 00
CFG-FXN - 06 0E 24 00 02 00 00 00 C0 D4 01 00 C0 D4 01 00 20 BF 02 00 20 BF 02 00 00 00 00 00 40 77 1B 00 00 00 00 00 00 00 00 00
CFG-INF - 06 02 08 00 00 00 00 00 00 87 00 00
CFG-INF - 06 02 08 00 01 00 00 00 00 87 00 87
CFG-INF - 06 02 08 00 03 00 00 00 00 00 00 00
CFG-MSG - 06 01 06 00 01 01 00 00 00 00
CFG-MSG - 06 01 06 00 01 02 00 01 00 00
CFG-MSG - 06 01 06 00 01 03 00 00 00 00
CFG-MSG - 06 01 06 00 01 04 00 00 00 00
CFG-MSG - 06 01 06 00 01 06 00 01 00 00
CFG-MSG - 06 01 06 00 01 08 00 01 00 00
CFG-MSG - 06 01 06 00 01 11 00 00 00 00
CFG-MSG - 06 01 06 00 01 12 00 01 00 00
CFG-MSG - 06 01 06 00 01 20 00 00 00 00
CFG-MSG - 06 01 06 00 01 21 00 00 00 00
CFG-MSG - 06 01 06 00 01 22 00 00 00 00
CFG-MSG - 06 01 06 00 01 30 00 00 00 00
CFG-MSG - 06 01 06 00 01 31 00 00 00 00
CFG-MSG - 06 01 06 00 01 32 00 00 00 00
CFG-MSG - 06 01 06 00 02 10 00 00 00 00
CFG-MSG - 06 01 06 00 02 11 00 00 00 00
CFG-MSG - 06 01 06 00 02 20 00 00 00 00
CFG-MSG - 06 01 06 00 02 30 00 00 00 00
CFG-MSG - 06 01 06 00 02 31 00 00 00 00
CFG-MSG - 06 01 06 00 0A 01 00 00 00 00
CFG-MSG - 06 01 06 00 0A 02 00 00 00 00
CFG-MSG - 06 01 06 00 0A 03 00 00 00 00
CFG-MSG - 06 01 06 00 0A 05 00 00 01 00
CFG-MSG - 06 01 06 00 0A 06 00 00 00 00
CFG-MSG - 06 01 06 00 0A 07 00 00 00 00
CFG-MSG - 06 01 06 00 0A 08 00 00 01 00
CFG-MSG - 06 01 06 00 0A 09 00 00 00 00
CFG-MSG - 06 01 06 00 0A 0A 00 00 00 00
CFG-MSG - 06 01 06 00 0B 00 00 00 00 00
CFG-MSG - 06 01 06 00 0B 30 00 00 00 00
CFG-MSG - 06 01 06 00 0B 31 00 00 00 00
CFG-MSG - 06 01 06 00 0D 01 00 00 00 00
CFG-MSG - 06 01 06 00 0D 03 00 00 00 00
CFG-MSG - 06 01 06 00 0D 04 00 00 00 00
CFG-MSG - 06 01 06 00 F0 00 00 01 00 00
CFG-MSG - 06 01 06 00 F0 01 00 00 00 01
CFG-MSG - 06 01 06 00 F0 02 00 00 00 01
CFG-MSG - 06 01 06 00 F0 03 00 00 00 01
CFG-MSG - 06 01 06 00 F0 04 00 00 00 01
CFG-MSG - 06 01 06 00 F0 05 00 00 00 01
CFG-MSG - 06 01 06 00 F0 06 00 00 00 00
CFG-MSG - 06 01 06 00 F0 07 00 00 00 00
CFG-MSG - 06 01 06 00 F0 08 00 00 00 01
CFG-MSG - 06 01 06 00 F0 09 00 00 00 00
CFG-MSG - 06 01 06 00 F0 0A 00 00 00 00
CFG-MSG - 06 01 06 00 F1 00 00 00 00 00
CFG-MSG - 06 01 06 00 F1 01 00 00 00 00
CFG-MSG - 06 01 06 00 F1 03 00 01 00 00
CFG-MSG - 06 01 06 00 F1 04 00 00 00 00
CFG-NAV2 - 06 1A 28 00 05 00 00 00 04 04 10 03 50 C3 00 00 18 14 05 3C 00 03 00 00 FA 00 FA 00 64 00 2C 01 00 00 00 00 00 00 00 00 00 00 00 00
CFG-NMEA - 06 17 04 00 00 23 00 02
CFG-PRT - 06 00 14 00 01 00 00 00 D0 08 00 00 00 E1 00 00 03 00 02 00 00 00 00 00
CFG-PRT - 06 00 14 00 02 00 00 00 D0 08 08 00 00 E1 00 00 07 00 03 00 00 00 00 00
CFG-PRT - 06 00 14 00 03 00 00 00 00 00 00 00 00 00 00 00 03 00 03 00 00 00 00 00
CFG-RATE - 06 08 06 00 C8 00 01 00 00 00
CFG-RXM - 06 11 02 00 03 00
CFG-SBAS - 06 16 08 00 01 01 01 00 51 08 00 00
CFG-TM2 - 06 19 0C 00 00 00 00 00 E8 03 00 00 14 01 00 00
CFG-TM2 - 06 19 0C 00 01 00 00 00 E8 03 00 00 14 01 00 00
CFG-TMODE - 06 1D 1C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 27 00 00 80 51 01 00 10 27 00 00
CFG-TP - 06 07 14 00 40 42 0F 00 20 A1 07 00 FF 01 00 00 32 00 34 03 00 00 00 00
CFG-USB - 06 1B 6C 00 46 15 A4 01 00 00 01 00 64 00 02 00 75 2D 62 6C 6F 78 20 41 47 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 41 4E 54 41 52 49 53 28 72 29 20 34 20 20 2D 20 20 47 50 53 20 52 65 63 65 69 76 65 72 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
/NGVideo5_8/tags/V1.31/Hexfiles/NGVideo_MEGA644.hex
0,0 → 1,2130
:100000000C949B070C949D0A0C94E20A0C94B8077C
:100010000C94B8070C94B8070C94B8070C94B80764
:100020000C94B8070C94B8070C94B8070C940B0AFE
:100030000C94B8070C943C2A0C94B8070C94B8079D
:100040000C94B8070C94B8070C94FD260C94B807D0
:100050000C94EA2A0C94B8070C94B8070C94B807CF
:100060000C94B8070C94B8070C94B8070C94B80714
:10007000084AD73B3BCE016E84BCBFFDC12F3D6C0F
:1000800074319ABD56833DDA3D00C77F11BED9E475
:10009000BB4C3E916BAAAABE000000803F05A84C55
:1000A000CDB2D44EB93836A9020C50B99186880821
:1000B0003CA6AAAA2ABE000000803F2020101010F3
:1000C000102020202018181818202020201C1C1C6C
:1000D0001C202020201E1E1E1E202020201F1F1F2F
:1000E0001F20200608141314080620040A200E04FA
:1000F000040E202001010101010120201F01010146
:10010000011F20201F030303031F20201F070707D1
:10011000071F20201F0F0F0F0F1F20201F1F1F1F43
:100120001F1F202010101010101020201F20202032
:10013000201F202001010101010120201F101010AB
:10014000101F20201F181818181F20201F1C1C1CEF
:100150001C1F20201F1E1E1E1E1F20C012201C80C0
:10016000254038004B009600E10000525353492DC2
:100170004D696E00525353492D4D617800446976A4
:10018000657273697479004C4344004156310041F3
:10019000563200312E52583A00322E52583A00321E
:1001A0003535003130323300536572766F00536558
:1001B00072766F203100536572766F20320053657E
:1001C00072766F2D546573740052535349004D4B32
:1001D0002D436F636B70697400536572766F2D48A1
:1001E00079737465722E0042617564726174650082
:1001F00020203556004E472D566964656F20203506
:100200002E3847487A0A48573A200020204D2E427F
:1002100065636B46573A20312E3331202067656283
:10022000616400537072616368650044657574733E
:10023000636800456E676C69736368004672616E3F
:100240007A947369736368005A757281636B0041B5
:10025000562D5175656C6C650052582D4B616E6161
:100260006C00525353492D4B616C6962722E004DE4
:10027000696E20616C6C65204B616E2E004B616C69
:1002800069622E0042697474652054582061756655
:1002900020004155530045494E0057656974657209
:1002A000206D697420456E746572004B6F6E7472B8
:1002B000617374004C43442D42656C6575636874CA
:1002C0002E004C696368743A0020696D6D65722078
:1002D0006175730020696D6D65722065696E00201F
:1002E00053656B2E00426174746572696500552D0B
:1002F0004D696E00556E74657273702E2D53657462
:10030000757000552D4F6666736574004D4B2D4218
:1003100061747465726965004261742E204E756D5A
:100320006D6572004261742E204B6170617A697450
:10033000847400492D4F666673657400492D4B6FB8
:10034000656666697A69656E7400572D4B6F6566E0
:1003500066697A69656E74004B616C696272696581
:1003600072756E67006C84756674004665686C65AE
:1003700072210053656E646572206E696368742033
:1003800000202020202020416B6B750A2020202097
:10039000656E746C6164656E2100536572766F2DB5
:1003A0004B616C6962722E00536572766F2D5363D8
:1003B00068726974746500536572766F20312072BB
:1003C00065762E004B616C69622E31206C696E6B14
:1003D00073004B616C69622E3120726563687473BF
:1003E000004B616C69622E31204D69747465005355
:1003F0006572766F2032207265762E004B616C69D3
:10040000622E32206C696E6B73004B616C69622ED8
:100410003220726563687473004B616C69622E32BE
:10042000204D6974746500506572696F646500548D
:100430006573742050756C736C846E6765005465C9
:10044000737420666F72746C6175662E0045696EF8
:100450007A656C736368726974746500416E7A6161
:10046000686C205465737473005061757365204522
:100470006E64706F732E0050617573652070726FBB
:1004800020496E632E005A84686C65723A0053747A
:100490006172742054657374006175730065696ED0
:1004A00000416E74656E6E65206E616368662E0035
:1004B000475053206D6974207769323332004E4DB6
:1004C000454120475053005458204F53442D446118
:1004D00074656E0048797374657265736500536561
:1004E0006E646520466F72646572756E6700475072
:1004F000532D416E7A656967656E0062657265634A
:10050000686E2E20446174656E00616B7475656C55
:100510006C6520506F732E005374617274706F732A
:100520006974696F6E00456C656B74722E20576537
:100530007274650020202020204E6F63680A2020FE
:100540006B65696E6520446174656E0A20202065C4
:100550006D7066616E67656E210052582D5A65692F
:10056000740053657269656C6C20434F4D002C001C
:10057000332C3356004C616E6775616765004765C3
:10058000726D616E00456E676C69736800467265D6
:100590006E63680052657475726E0041562D536F1C
:1005A000757263650052582D4368616E6E656C000C
:1005B000525353492D43616C6962722E004D696E2E
:1005C00020616C6C204368616E2E0043616C69622F
:1005D0002E0054582073776974636820004F464694
:1005E000004F4E00436F6E74696E756520456E74E2
:1005F000657200436F6E7472617374004261636B65
:1006000067722E204C69676874004C696768743A99
:1006100000616C77617973206F66660020616C778A
:10062000617973206F6E00207365632E00426174E0
:100630007465727900552D4D696E004C6F77207688
:100640006F6C7461676500552D4F66667365740045
:100650004D4B2D42617474657279004261742E2095
:100660004E756D626572004261742E204361706147
:100670006369747900492D4F666673657400492D6E
:10068000436F656666696369656E7400572D436FD5
:10069000656666696369656E740043616C69627260
:1006A0006174696F6E0072756E6E696E6700457277
:1006B000726F7221005472616E736D697474657229
:1006C000206E6F742000202020202020416363755D
:1006D0000A2020202020206C6F772100536572763D
:1006E0006F2D43616C6962722E00536572766F2DB7
:1006F000537465707300536572766F203120726594
:10070000762E0043616C69622E31206C6566740040
:1007100043616C69622E31207269676874004361BD
:100720006C69622E31206D6964646C65005365727A
:10073000766F2032207265762E0043616C69622EDE
:1007400032206C6566740043616C69622E322072DF
:10075000696768740043616C69622E32206D696458
:10076000646C6500506572696F64650054657374EC
:10077000205057005465737420636F6E74696E2E39
:100780000053696E676C652073746570004E756DFB
:10079000626572206F6620746573740050617573B2
:1007A0006520656E6420706F732E005061757365EF
:1007B0002070726F20696E632E00436F756E7465D2
:1007C000723A0053746172742054657374006F66DA
:1007D00066006F6E2000547261636B696E6700473C
:1007E00050532077697468207769323332004E4D58
:1007F000454120475053005458204F53442D4461E5
:100800007461004879737465726573650054726130
:100810006E736D69742064656D616E640044697304
:10082000706C6179204750530063616C632E2044E3
:100830006174610063757272656E7420506F732EFF
:1008400000486F6D65706F736974696F6E00456CF9
:100850006963747269632056616C2E002020202029
:100860004E6F74207965740A202020202044617422
:10087000610A2020207265636569766564210052F3
:10088000582D54696D650053657269656C6C204321
:100890004F4D002E00332E3356004C616E67756548
:1008A00000416C6C656D616E6400416E676C6169DE
:1008B00073004672616E87616973005265746F756B
:1008C000720041562D536F757263650052582D4367
:1008D000616E616C00525353492D43616C696272C1
:1008E0002E00546F7574857A82726F0043616C6953
:1008F000622E0000457465696E647265205478004C
:10090000416C6C756D6572205478004170702E20BA
:10091000456E74657200436F6E7472617374650026
:10092000526574722E2045636C0045636C61693AB0
:100930000020457465696E740020546A7273204FFC
:100940004E00205365632E004261747465726965C0
:1009500000562D4D696E00536575696C20416C61C0
:10096000726D6500562D4F6666736574004D4B2D94
:100970004261747465726965004261742E206E75FF
:100980006D82726F004261742E20636170616369D1
:10099000748200492D4F666673657400492D436F5C
:1009A000656666696369656E7400572D436F656699
:1009B00066696369656E740043616C696272617433
:1009C000696F6E00456E20636F75727300457272B9
:1009D00065757221004E6F2054780020202020423F
:1009E000617474657269650A2020202066616962FD
:1009F0006C652100536572766F2D43616C6962727C
:100A0000004E6272652064652050617300496E7605
:100A10006572732E20536572766F310043616C2EC0
:100A2000204761756368650043616C2E2044726FD6
:100A30006974650043616C2E2043656E74726500B5
:100A4000496E766572732E20536572766F3200435D
:100A5000616C2E204761756368650043616C2E20D0
:100A600044726F6974650043616C2E2043656E7437
:100A7000726500508272696F6465004C61726765CF
:100A8000757220496D702E005465737420436F6E2B
:100A900074696E75003120506173004E6F6D627223
:100AA00065205465737473005061757365206669C1
:100AB0006E616C65005061757365207061722070A5
:100AC000617300436F6D707465723A0044826275A1
:100AD000742054657374004F4646004F4E200054F6
:100AE0007261636B696E6700475053207769746861
:100AF000207769323332004E4D4541204750530034
:100B00005458204F53442D446174610048797374E4
:100B100065726573697300446F6E6E8265205472EE
:100B2000616E736D696500416666696368616765DA
:100B3000204750530043616C63756C20475053004D
:100B4000506F732E2061637475656C6C6500486F1F
:100B50006D65706F736974696F6E00906C826374F9
:100B6000722E2076616C2E0020417563756E6520B3
:100B7000646F6E6E82650A20202020207265877562
:100B800065210052582D54656D707300434F4D2EF2
:100B9000205382726965002E00332E3356002302E3
:100BA0002B0233023C0248024F02590262026F02DA
:100BB0007D028402920296029A02AB02B402C20241
:100BC000C902D402DF02E502EE02F40203030C03C1
:100BD0001803240333033C034A03580365036B03E0
:100BE000730381039A03A803B703C403D203E10389
:100BF000EF03FC030A04190427042F043E044D04E8
:100C00005C046904770486048E0499049D04A1049D
:100C1000B004BE04C704D404DE04EE04FB040A05D9
:100C20001805260534055A0562056E05700575051B
:100C30007E0585058D0594059B05A505B005BD05BB
:100C4000CB05D205DD05E105E405F305FC050A0643
:100C500011061C0627062D0635063B0647065006DC
:100C60005B06670675067E068C069A06A606AE0625
:100C7000B506C606DC06EA06F606030710071E07D9
:100C80002D073A074707550764076C077407810764
:100C90008D079C07AB07BA07C307CE07D207D60755
:100CA000DF07EE07F70703080D081D0829083408B9
:100CB00041084E085C087F088708930895089A0841
:100CC000A108AA08B208BB08C208CC08D508E208E7
:100CD000EC08F308F40800090B09160920092A0991
:100CE00031093909420948095109570964096D094F
:100CF0007909850993099C09AA09B809C409CD098C
:100D0000D509DB09F409010A0D0A1C0A280A340A6C
:100D1000400A4F0A5B0A670A730A7B0A880A950A27
:100D20009B0AA80AB50AC30ACC0AD70ADB0ADF0A5B
:100D3000E80AF70A000B0C0B170B270B350B400BBF
:100D40004E0B5B0B680B830B8C0B970B990B6B019A
:100D500074017D0187018B018F01930199019F012E
:100D6000A301A801AE01B601BE01C901CE01D9019E
:100D7000E701F001F5010B023000303100303200A4
:100D80003033003033310030333200303333003011
:100D900034003035003035310030353200303532F6
:100DA00031003035323200303532330030353234B4
:100DB00000303533003035333100303533320030D8
:100DC00035333300303533340030360030363100BF
:100DD0003036320030363231003036323200303682
:100DE000323300303632340030363235003036336C
:100DF00000303634003037003037310030373200C1
:100E0000303800303831003038320030383300307C
:100E10003833310030383332003038333300303833
:100E20003334003038333500303900303A00303B4D
:100E300000303B3100303B3200303B3300303B343C
:100E400000303B3500780D36257A0D2A227D0DDFE6
:100E500021800D1425830DC821870D65218B0D4F31
:100E6000218F0D1321920DF224950DD320990DCDD4
:100E7000249D0DCD20A20DC120A70DB520AC0DA93C
:100E800020B10DA724B50DC720BA0DBB20BF0DAFF3
:100E900020C40DA320C90D7E24CC0DEA1FD00D580F
:100EA00024D40DE21DD90DB91FDE0D881FE30D57A7
:100EB0001FE80D261FED0D3920F10D6A20F50D39C3
:100EC00024F80DE322FC0DA222000E1724030EA429
:100ED0001D070E731D0B0EF1230F0E6C1D140ED487
:100EE0001C190EA31C1E0E721C230E411C280EEA98
:100EF0001B2B0ED51B2E0EBF23310E9419350E94CD
:100F000019390E94193D0E9419410E692201000001
:100F1000000A00000064000000E803000010270041
:100F200000A086010040420F008096980000E1F585
:100F30000500CA9A3B0011241FBECFEFD0E1DEBFEF
:100F4000CDBF12E0A0E0B1E0E4E8F3E802C0059014
:100F50000D92AC37B107D9F714E0ACE7B2E001C0AD
:100F60001D92A73BB107E1F70E94BA070C94C0415C
:100F70000C940000AF92CF92EF92FF920F9388EE05
:100F800093E024EF31E0F9013197F1F70197D9F7B8
:100F9000239A2B9887B18F7387B9579886B190E0C1
:100FA000807C09F091E0892F0E94D20F4F9904C0F4
:100FB000369902C00E94920F81B18F6181B984B1CC
:100FC000876184B980910C010E94E90C80910C0129
:100FD0008093C80313980E94CE0885E085BD809158
:100FE0006E00816080936E0083E08093B1008091F9
:100FF00070008160809370008AB1837F8AB980918C
:1010000069008A608093690080917D020E94770860
:101010008AB180638AB98091EA02882319F084E159
:101020000E9407288091C9036091A80340E020E056
:101030000E9478260E9495088BEB90E067E00E9462
:10104000E3250E94CC1A82E06EE10E94AE097894FA
:1010500080910D018E3F21F410920D010E94132109
:101060000E94E9160E94870F0E948B0C0E947E0C42
:10107000809181028823B1F780E20E94C7278823EC
:1010800029F081E08093CB030E94362580910C01EA
:1010900090E061E070E047E050E020E000E033E302
:1010A000E32E34E1F32ECC24C394AA240E945415D9
:1010B000982F80910C01981729F090930C01892F9B
:1010C0000E94E90C80E20E94D727882359F2809180
:1010D000EA02843039F60E945A2FC4CF1498109235
:1010E000AA030895149A81E08093AA030895982F83
:1010F000813041F0813018F0823089F40AC08DB31C
:101100008C7F09C08DB38C7F8DBB149A9093AA03FA
:1011100006C08DB383608DBB14981092AA03892FEB
:10112000089510927C022F98089580917C02882364
:1011300071F420910103309102038091080190E045
:101140002817390720F481E080937C022F9A0895B4
:1011500080917C02813009F540910801442321F4FB
:1011600010927C022F9808954F31B8F4F894809132
:10117000010390910203019690930203809301036F
:1011800078942091010330910203842F90E0281776
:10119000390718F010927C022F98089580E480930C
:1011A0007C0087E080937A0080917A008068809349
:1011B0007A0080917A00806480937A0080917A002E
:1011C00086FDFCCF809178009091790008959091F0
:1011D0007C008F71907E892B80937C0080917A00B7
:1011E000806480937A0080917A0086FDFCCF209104
:1011F000780030917900C90108954F925F926F9203
:101200007F928F929F92AF92BF92CF92DF92EF9296
:10121000FF920F931F93CF93DF93482E562E7A01A0
:10122000662477244301AA24BB246501C0E0D0E0F2
:1012300008E813E116C0842D0E94E708A0E0B0E0A2
:10124000680E791E8A1E9B1E852D0E94E708A0E06D
:10125000B0E0A80EB91ECA1EDB1EC8010197F1F747
:101260002196CE15DF0538F300E010E0C601B50188
:10127000A80197010E94E73ED22EC32EC401B301FC
:10128000A80197010E94E73EB9018D2D9C2DDF91A9
:10129000CF911F910F91FF90EF90DF90CF90BF9073
:1012A000AF909F908F907F906F905F904F90089538
:1012B000AF92BF92CF92DF92EF92FF920F931F9364
:1012C0002C9A90E0A0E0B0E0BC01CD010E945E3C11
:1012D0005B016C0120E030E44CE955E40E94D53D0F
:1012E0007B018C0120E030E040E85FE30E94BE3BE0
:1012F00088231CF461E070E024C0C801B70120E03D
:101300003FEF4FE757E40E94CA3D1816B4F4C601F8
:10131000B50120E030E040E251E40E94D53D0E945A
:10132000323C84EF91E005C0FC013197F1F7615048
:10133000704061157105C1F707C0C801B7010E946F
:10134000323CCB010197F1F72C981F910F91FF9040
:10135000EF90DF90CF90BF90AF9008959F92AF92A3
:10136000BF92CF92DF92EF92FF920F931F93982E2E
:10137000E62E0E945809FF2400E010E0C801B701E2
:101380000E945E3C5B016C0120E030E44CE955E4D6
:101390000E94D53D7B018C0120E030E040E85FE316
:1013A0000E94BE3B88231CF461E070E024C0C801A9
:1013B000B70120E03FEF4FE757E40E94CA3D1816FF
:1013C000B4F4C601B50120E030E040E251E40E94EF
:1013D000D53D0E94323C84EF91E005C0FC0131977D
:1013E000F1F76150704061157105C1F707C0C80180
:1013F000B7010E94323CCB010197F1F7892D0E9481
:1014000058091F910F91FF90EF90DF90CF90BF9000
:10141000AF909F9008951F920F920FB60F921124D4
:101420002F938F939F93AF93BF9384E68093B200E3
:101430008091C6038F3F29F08091C6038F5F809310
:10144000C6038091A4038F3F29F08091A4038F5F8E
:101450008093A40380919E0390919F03805D9042AE
:1014600048F480919E0390919F03019690939F036F
:1014700080939E03809183028823D9F08091780223
:1014800090917902A0917A02B0917B0280362AEA8B
:1014900092072BEDA20720E0B20758F40196A11D98
:1014A000B11D8093780290937902A0937A02B09351
:1014B0007B028091EA02823029F4809182028823A3
:1014C00039F431C0843079F58091A703882359F528
:1014D0008091AA038823A1F08091880290918902CB
:1014E000A0918A02B0918B020196A11DB11D80933B
:1014F000880290938902A0938A02B0938B0213C052
:101500008091840290918502A0918602B091870219
:101510000196A11DB11D8093840290938502A09332
:101520008602B0938702BF91AF919F918F912F91C7
:101530000F900FBE0F901F9018951F920F920FB62D
:101540000F9211248F939F938091C6038F34A8F03C
:101550008091C603823588F41092A5038091AA0376
:101560008823A9F08091A4038F3F89F414981092E6
:10157000AA0381E08093C7030AC091E09093A5037A
:101580008091C703882319F4149A9093AA03909129
:10159000A5038091C703981761F48091C503882340
:1015A00021F414981092AA0304C0149A81E0809345
:1015B000AA031092C6039F918F910F900FBE0F90B8
:1015C0001F9018951F920F920FB60F9211248F93B0
:1015D0009F938091A4038F34A8F08091A403823557
:1015E00088F41092C7038091AA038823A9F48091FC
:1015F000C6038F3F89F4149A81E08093AA038093F5
:10160000A5030AC081E08093C7038091A5038823C6
:1016100019F414981092AA039091A5038091C7031E
:10162000981761F48091C503882321F414981092CF
:10163000AA0304C0149A81E08093AA031092A40321
:101640009F918F910F900FBE0F901F9018950E9441
:1016500095088091A203882331F0F8941092A20398
:1016600078940E94A80808958091FE028823A9F02A
:10167000F8941092FE0278948091EA02823019F474
:101680000E94613604C0843011F40E947535809147
:101690008002853011F40E946B140895AF92BF92BE
:1016A000CF92DF92EF92FF920F931F93DF93CF932E
:1016B000CDB7DEB72C970FB6F894DEBF0FBECDBF07
:1016C0006C018E010F5F1F4F5C0178012BE0A4E0DD
:1016D0007FEFA03241F0F501808191818417950759
:1016E00010F4272FA0E2F701A1937F017F5F82E032
:1016F00090E0A80EB91E7B3061F72F3FC1F0332771
:1017000027FD3095F901EE0FFF1FEC0DFD1D8081C7
:101710009181841B950B70E00E94C03EFE013196C2
:10172000E20FF31F6083653010F084E080838DE06A
:10173000E82EF12CEC0EFD1EF80181918F010E9424
:10174000A8250E151F05C1F72C960FB6F894DEBF1D
:101750000FBECDBFCF91DF911F910F91FF90EF9002
:10176000DF90CF90BF90AF900895CF92DF92EF922D
:10177000FF920F931F93CF93DF93082F6B01142FCA
:1017800085E00E94E708A0E0B0E0209112013091CE
:10179000130140E050E0BC01CD010E94953E37E0CE
:1017A00096958795779567953A95D1F77B0186E071
:1017B0000E94E708A0E0B0E02091140130911501EB
:1017C00040E050E0BC01CD010E94953E27E0969597
:1017D0008795779567952A95D1F7EB01023001F54A
:1017E000E616F70670F410928C028091C6038F3FC4
:1017F000C9F48091A4038F3FA9F414981092AA030E
:1018000011C091E090938C028091C6038F3F51F4F8
:101810008091A4038F3F31F4149A9093AA0302C0DD
:1018200000938C02112309F446C0023011F01BEF23
:101830001DC09091A5038091C703981791F09091D6
:10184000C6038091A40389238F3F59F08091A5039B
:1018500010928D02882319F081E080938D0213E7A6
:1018600005C080918C0280938D0214E6F601808180
:1018700091818E159F0520F48C179D0708F410E2C6
:1018800082E061E00E943526C6016091A903A701AC
:101890000E944E0B82E062E00E943526C6016091F4
:1018A000A903AE010E944E0B023029F480918D02F3
:1018B000612F0E946F1380918C02DF91CF911F9155
:1018C0000F91FF90EF90DF90CF90089580910703E4
:1018D000882399F0F89410920703789480917D0200
:1018E0006DEA73E040E00E94B50B8093C5038091E0
:1018F000EA02833011F40E946D2F08950E94660C55
:101900000E94340B0E94270B8091EA02813011F46F
:101910000E94FB36089580910303882391F0F89488
:1019200010920303789440E080918102882309F4A7
:1019300041E080917D026DEA73E00E94B50B8093D7
:10194000C5030895CF93DF93EC0180910C0161E012
:1019500070E0681B710943E0660F771F4A95E1F755
:10196000709561957F4F615F7F4F8EE091E048E019
:1019700050E00E94644180910E0190910F010F97F9
:101980002091100130911101821B930B6BE070E0EC
:101990000E94C03EA62FB0E040E050E020E030E0E2
:1019A000FE01E20FF31F80910E0190910F01841B45
:1019B000950B918380834A0F5B1F2E5F3F4F283129
:1019C000310571F7862F65E00E94B43EDF91CF911B
:1019D00008958150282F277092B1922B92B995B11A
:1019E000292B25B9886F92B1982392B995B1892393
:1019F00085B98DEA93E00E94A20C8093A903089513
:101A0000BF92CF92DF92EF92FF920F931F93CF93EB
:101A1000DF93B82E6B01EA017A0100E010E09B0130
:101A200040E050E06C177D07B8F4E7E0EE0CFF1CD7
:101A3000001F111FEA95D1F7C801B7010E94E73EC8
:101A4000309313012093120180E890E090931501E8
:101A5000809314017E0118C077E0220F331F441FCA
:101A6000551F7A95D1F7CA01B901A80197010E94C3
:101A7000E73E309315012093140180E890E09093A5
:101A800013018093120176010B2D10E001501040DC
:101A900063E0000F111F6A95E1F7609112017091E8
:101AA0001301C8018D5E9F4F0E94A84160911401EF
:101AB00070911501C8018B5E9F4F0E94A841C7011C
:101AC000DF91CF911F910F91FF90EF90DF90CF901A
:101AD000BF9008951F93182F0E94002680E290E087
:101AE0000E94F71560E00E94DD2681E290E00E94EE
:101AF000F71561E00E94DD26812F90E00E94F71526
:101B000062E00E94DD268EE10E94C42C1F910895A0
:101B1000FF920F931F93DF93CF93CDB7DEB76197FB
:101B20000FB6F894DEBF0FBECDBFF82E0E94002680
:101B30008EE190E00E94F71560E00E94DD26FF2014
:101B400011F401E027C086E090E00E94F715BC0187
:101B50008E010F5F1F4FC8010E94D940C80160E08D
:101B600071E00E94C540F80101900020E9F731972B
:101B7000E01BD801AE0FB11D80E3F80EFC92EF5FC1
:101B8000C8018E0F911DFC011082C80161E00E9406
:101B9000DD2602E08FE190E00E94F715602F0E94A1
:101BA000DD2661960FB6F894DEBF0FBECDBFCF9194
:101BB000DF911F910F91FF900895CF93DF93EC0178
:101BC00080E00E94880D85E066E048EE53E00E94C8
:101BD000FD089B01AC01CB01840F951F80599140FA
:101BE000E0F480910C01B9010E94000DBC018091CC
:101BF0000C0190E0F3E0880F991FFA95E1F7875FF9
:101C00009F4F0E94A84184E06EE10E94AE09CE0180
:101C10000E94A20C8093A90303C08CE00E946A0D6D
:101C2000DF91CF9108950F931F93CF93DF93182FD8
:101C3000EB0100E0882309F401E0812F0E94880D68
:101C4000002311F010910C0185E066E048EE53E0AE
:101C50000E94FD089B01AC01CB01840F951F855F9D
:101C60009140E0F0812FB9010E94000DBC01812F4D
:101C700090E0A3E0880F991FAA95E1F7895F9F4F35
:101C80000E94A841002389F084E06EE10E94AE0921
:101C9000CE010E94A20C8093A90307C0002311F477
:101CA00080E004C08BE00E946A0D81E0DF91CF915B
:101CB0001F910F9108957F928F929F92AF92BF9242
:101CC000CF92DF92EF92FF920F931F93DF93CF9308
:101CD0000F92CDB7DEB7782E87E00E94E7089C010F
:101CE00040E050E060E070E080E090E010EFA12E76
:101CF000B9EABB2ECC24DD24EE24FF2400E010E062
:101D00000E94FE38122FF32ED42EC52EB62EA72EEB
:101D1000982EE92E2091090130E040E050E060E08B
:101D200070E080E090E00DE00E94783A892E210F6B
:101D3000E1E0211708F0E0E03F0DF1E03F1508F089
:101D4000F0E0FE2EF30EE1E0F31608F0E0E0FE2BEB
:101D50004D0DA1E04D1508F0A0E00F2F040FE1E0BC
:101D6000041708F0E0E0AE2B5C0DF1E05C1508F024
:101D7000F0E01A2F150FE1E0151708F0E0E0FE2B58
:101D80006B0DA1E06B1508F0A0E0BF2FB60FE1E0EE
:101D9000B61708F0E0E0AE2B7A0DF1E07A1508F006
:101DA000F0E0A70FE1E0A71708F0E0E0FE2B890DB7
:101DB00091E0891508F090E0F80FE1E0F81708F0DD
:101DC000E0E09E2BE80C3F2DA8016B2F7A2F8F2F80
:101DD0009E0D0DE00E94F93989012091AB033091ED
:101DE000AC032017310708F440C08091810288239A
:101DF00011F580910A0190910B0144969093AC03E8
:101E00008093AB038091EA02823011F40E94713713
:101E10000E94002682E290E00E94F7150E94592657
:101E200081E08093810284E10E94580980EF8093D1
:101E30008E0210928F0281E0781631F580918F0228
:101E400090918E028F5F80938F0281508917E0F00E
:101E500084E199830E9458099981933018F09695EE
:101E600090938E0210928F020FC080910A01909180
:101E70000B018217930740F4109281029093AC03F8
:101E80008093AB030E94E916C8010F90CF91DF91B8
:101E90001F910F91FF90EF90DF90CF90BF90AF9088
:101EA0009F908F907F9008950F93A0E0B0E0BC01C9
:101EB000CD0145E022E002E00E94072E0E94592653
:101EC00086E50E94A8250F9108950F93A0E0B0E049
:101ED000BC01CD0144E022E001E00E94072E0E94F7
:101EE00059260F910895CF93DF9381E00E945B0EF6
:101EF000EC0180918102882339F48BE060E00E943C
:101F00003526CE010E94650FDF91CF910895809113
:101F1000A003882331F0F8941092A00378940E94D3
:101F2000730F08958091C903813021F41092C90381
:101F300080E104C081E08093C9038CE08093A80312
:101F400086E090E06091C9030E94924187E090E0B2
:101F50006091A8030E94924108958091EA02835003
:101F6000823068F480912701E82FF0E0EE0FFF1F28
:101F7000E55AFE4F85919591A591B49102C080E0FC
:101F800091EE0E94B82A08950E949A28BC01769585
:101F9000679580E00E946A2981E060E070E00E941D
:101FA0006A290895EF92FF920F931F93DF93CF93C7
:101FB00000D000D00F92CDB7DEB7082F80E090E0C0
:101FC0000E947441182F7E010894E11CF11CC70186
:101FD00061E070E045E050E00E94644188E893E1F0
:101FE0000197F1F71B3499F4002341F083E091E06D
:101FF000B7010E94D040009709F4C3C083E091E08C
:10200000BE016F5F7F4F0E94D0400097B9F080E023
:1020100090E06BE40E94924186E090E060E00E94D4
:10202000924187E090E060E10E94924183E091E07C
:1020300061E070E045E050E00E94884188E090E077
:102040006FE10E94924189E090E065E50E94924133
:102050008AE090E060EC73E00E94A8418CE090E0A0
:1020600061E00E9492418DE090E060E00E94924128
:102070008EE090E06EEF0E9492410FE010E08EE063
:1020800091E0B80148E050E00E948841085F1F4F8E
:1020900080E00734180799F787E490E060E00E9439
:1020A000924186E191E068E470E047E050E00E94F0
:1020B00088418DE191E06FE470E047E050E00E94DC
:1020C000884186E590E064E10E94924187E590E0D6
:1020D00060E00E94924188E590E060E00E949241B9
:1020E00089E590E061E00E9492418AE590E06AE033
:1020F0000E9492418BE590E060E00E9492418CE565
:1021000090E060E00E9492418DE590E068E20E94DC
:1021100092418EE590E060E00E9492418FE590E070
:1021200065E00E94924186EF92E060E670E046E052
:1021300050E00E94884186E690E060E00E94924173
:1021400007E610E083E792E0B80149E050E00E9422
:102150008841075F1F4F80E0013C180799F781EC29
:1021600090E068E00E94924182EC90E060E50E947D
:10217000924183EC90E060E50E949241109204034A
:102180009FC088E090E00E9474418093080189E03C
:1021900090E00E947441809309018AE090E00E94DF
:1021A000824190930B0180930A018CE090E00E94A1
:1021B000744180930C018DE090E00E947441809303
:1021C0007D028EE090E00E94744180930D0187E4CF
:1021D00090E00E9474418093040386E191E068E4FA
:1021E00070E047E050E00E9464418DE191E06FE4CF
:1021F00070E047E050E00E94644186E590E00E9474
:1022000074418093240188E590E00E94744180939A
:102210007E0289E590E00E947441809325018AE561
:1022200090E00E947441809326018BE590E00E942B
:10223000744180937F028CE590E00E94744180930A
:10224000EA028DE590E00E94744180936F028EE572
:1022500090E00E9474418093EB028FE590E00E9431
:1022600074418093270186EF92E060E670E046E0DB
:1022700050E00E94644186E690E00E947441682F1D
:102280008093F50289E0689FB001112469597F4F5E
:1022900083E792E049E050E00E94644181EC90E0E5
:1022A0000E9474418093700282EC90E00E9474411D
:1022B0008093710283EC90E00E94744180937202DB
:1022C00086E090E00E9474418093C90387E090E02B
:1022D0000E9474418093A80380910A0190910B01A0
:1022E0009093AC038093AB0380917D028093C503F0
:1022F00080E0609116010E94A728609117017091FB
:10230000180180E00E94B6286091190170911A01AD
:1023100080E00E94D32860911B0170911C0180E035
:102320000E94F22881E060911D010E94A72860911F
:102330001E0170911F0181E00E94B628609120016A
:102340007091210181E00E94D32860912201709157
:10235000230181E00E94F2280E94C40F81E0809353
:10236000A7030E94AD0F8091EA020E94202C809169
:102370007602909177029093F4028093F3020F908B
:102380000F900F900F900F90CF91DF911F910F91B1
:10239000FF90EF90089510929102E2E9F2E087E059
:1023A000819392E0E03AF907D9F786E08083CF0184
:1023B0000F970895A82FB0E0A330B10514F080E086
:1023C00001C08F5FAC5FBD4FAC91B0E0AA0FBB1FE7
:1023D000A60FB71FE82FF0E0EC5FFD4FE081F0E0C3
:1023E000EE0FFF1FE60FF71F2D913C918081918129
:1023F0008217930714F48FEF089581E008951F93D7
:102400001091EA021092EA020E94072880E060E040
:102410000E943526812F1F910895CF93DF93E0917D
:10242000CC0397FF0DC0E901C61BD70BE130A9F41F
:102430001092CC0383EF90E065E00E94E3250DC08D
:10244000EA01C21BD30BEE2341F483E391E065E084
:102450000E94E32581E08093CC03CE01DF91CF91F0
:1024600008950F93A0E0B0E0BC01CD0144E022E06C
:1024700002E00E94072E0E9459260F9108950F93A3
:1024800022E330E0829FB001839F700D929F700D18
:10249000112480E090E044E020E000E00E94072E5C
:1024A0000E94592688E291E00E9459260F910895D2
:1024B0000F93A0E0B0E0BC01CD0143E020E000E0DC
:1024C0000E94072E0E9459260F9108950F93BC0178
:1024D0008A30910560F080E090E043E021E001E087
:1024E0000E94072E0E9459268CE291E00EC084E6DD
:1024F00090E09C01629FC001639F900D729F900DC0
:1025000011240E9458128FE291E00E9459260F91E7
:102510000895EF92FF920F931F937C010E949A28D7
:1025200096958795B701681B790B882777FD80956D
:10253000982F44E020E000E00E94072E0E945926D8
:102540008091CA03B7010E94F2281091CA030E9429
:102550009A28BC0176956795812F0E946A291F9160
:102560000F91FF90EF9008950F931F938C010E949D
:1025700058128091CA03B8010E94B6288091CA03FC
:1025800090E0FC0143E0EE0FFF1F4A95E1F7E81BE6
:10259000F90BEA5EFE4F8081882319F460E070E059
:1025A00003C00E949A28BC018091CA030E946A2934
:1025B0001F910F910895EF92FF920F931F93CF9366
:1025C000DF93E82EC6E1D1E008E410E0FF24298182
:1025D0003A814B815C818D819E81EE2089F4369514
:1025E0002795369527953A8329835695479556958D
:1025F00047955C834B83969587959695879511C0F3
:10260000220F331F220F331F3A832983440F551F94
:10261000440F551F5C834B83880F991F880F991FA8
:1026200003969E838D8369817A818F2D0E94B628BF
:102630006B817C818F2D0E94D3286D817E818F2DAF
:102640000E94F228CE01B80147E050E00E94884184
:10265000F3942796095F1F4F82E0F81609F0B7CF71
:102660000E94C40FDF91CF911F910F91FF90EF90C7
:1026700008950F931F93CF93DF938C010E949A28A4
:10268000EC01C8010E9458128091CA03B8010E944F
:10269000D3282091CA03822F90E0FC01B3E0EE0F13
:1026A000FF1FBA95E1F7E81BF90BEA5EFE4F808148
:1026B000882311F0C0E0D0E0822FBE010E946A2979
:1026C000DF91CF911F910F9108958091EA028823A5
:1026D00029F484E00E94C42C0E943B2908950F93A2
:1026E0001F93182F062F823078F462E0681B8FE06A
:1026F0000E94352680E20E94A8251F5F8FE0612F8F
:102700000E943526802F0CC08FE061E00E943526A4
:1027100080E20E94A8258FE062E00E94352680E2D8
:102720000E94A8251F910F91089580917D0282300B
:1027300010F064E601C06BEF8091C5030E946F1337
:1027400008950F93992787FD90950597AA2797FDE0
:10275000A095BA2FBC01CD0144E021E001E00E9428
:10276000072E0E94592681E40E94A8250F91089502
:10277000DF92EF92FF920F931F93CF93DF938C0121
:10278000EB01D42E0E94CB117C01980117FF04C0ED
:1027900022273327201B310BC90143E0880F991FE3
:1027A0004A95E1F7821B930BBE010E94D43E462F4F
:1027B000E62FFF27E7FDF095EC9FC001ED9F900D00
:1027C000FC9F900D112469EF7FEF0E94D43E260FED
:1027D000371F83E290E0BC01269FC001279F900D28
:1027E000369F900D1124BE010E94D43E65300CF03E
:1027F00064E017FF0DC088E0841B16167CF4E82FF8
:10280000FF27E7FDF095EE0DFF1D3197608306C0B1
:1028100016161CF4EE0DFF1D608788E0E82FFF27D9
:10282000E7FDF095EE0DFF1D80E095E002C091936D
:102830008F5F8417E4F380E06D2D0E943526C0E0A1
:10284000D0E0F701EC0FFD1F80810E94A8252196A2
:10285000C031D105B1F7DF91CF911F910F91FF905A
:10286000EF90DF9008950F931F93DF93CF93CDB731
:10287000DEB72E970FB6F894DEBF0FBECDBF8C012A
:10288000DE011196E0ECF1E08EE001900D928150B6
:10289000E1F7802F805D0E94A82582E391E00E94ED
:1028A000592601501048000F111F0C0F1D1FF80171
:1028B000818192810E94592685E391E00E945926E8
:1028C0002E960FB6F894DEBF0FBECDBFCF91DF912D
:1028D0001F910F91089586E061E00E943526609176
:1028E00084027091850280918602909187020E94F5
:1028F0001D2D86E062E00E9435266091880270916D
:10290000890280918A0290918B020E941D2D089568
:102910000F931F93DF93CF93CDB7DEB727970FB6F3
:10292000F894DEBF0FBECDBFFC01EE0FFF1FE55ACE
:10293000FE4F659175918591949180E090E08E01B4
:102940000F5F1F4FA8012AE030E00E942841C80114
:1029500061E00E94DD2627960FB6F894DEBF0FBE19
:10296000CDBFCF91DF911F910F910895CF92DF924C
:10297000EF92FF920F931F93DF93CF9300D00F92AC
:10298000CDB7DEB78C01DE011196EFE2F1E083E016
:1029900001900D928150E1F78091CA03B8010E9425
:1029A00041298091040390E0FC01EE0FFF1FE80F26
:1029B000F91FEE0FFF1FDF01A850BE4F14962D9197
:1029C0003C9115976801C21AD30A6D917C91E6502B
:1029D000FE4F40815181C6010E940D127C01C6014B
:1029E000B70142E00E94B81381E061E00E94352601
:1029F000C8010E9473288C0183E0083E180750F438
:102A000085E7898389E391E00E945926C8010E94E5
:102A100058120AC0B80180E090E045E023E003E0EE
:102A20000E94072E0E945926CE0101960E94592627
:102A300088E061E00E943526B601882777FD809501
:102A4000982F28EE33E040E050E00E94953E970139
:102A5000442737FD4095542F0E94093FB90188272C
:102A600077FD8095982F46E021E001E00E94072E37
:102A70000E94592685E20E94A8250F900F900F9082
:102A8000CF91DF911F910F91FF90EF90DF90CF904A
:102A900008951F93182F0E9458128091C903612F27
:102AA0000E941C261F9108956F927F928F929F9291
:102AB000AF92CF92EF92FF920F931F93CF93DF933A
:102AC000EC014B013A01122F80E40E94B1278823C8
:102AD00029F480E40E94BC27882389F0C615D70515
:102AE00028F421968A2D0E94ED2702C0C110E4012E
:102AF000812F602F0E943526CE01F701099580E8CD
:102B00000E94B127882329F480E80E94BC278823EB
:102B100089F08C169D0628F421978A2D0E94ED27B6
:102B200002C0C110E301812F602F0E943526CE0123
:102B3000F7010995CE01DF91CF911F910F91FF9081
:102B4000EF90CF90AF909F908F907F906F9008956F
:102B50000E947E0C80E00E945B0E80E20E94D727DC
:102B6000882321F480918102882319F01092490171
:102B700081E008950F931F93CF93DF938C01FC01A5
:102B80008081882309F1C0E0D0E0FE01EE0FFF1F35
:102B9000EE0FFF1FEB5BF14F65917491C8010E942E
:102BA000B040892B69F4CE01880F991F880F991FB7
:102BB000895B914FFC0125913491F901099504C07D
:102BC0002196C233D10509F7DF91CF911F910F9163
:102BD00008951F93182F0E94C40F1093EA020E94B9
:102BE000651389E491E00E94BA151F910895883415
:102BF000910540F0FC01EE0FFF1FE254F34F659189
:102C000074911CC020910D01213029F0880F991F6B
:102C1000223079F408C0FC01EE0FFF1FE25DF34F94
:102C2000659174910BC0FC01E254F34F659174916E
:102C300005C0FC01E256F44F6591749181EA92E07F
:102C40000E94B94081EA92E00895EF92FF920F93BB
:102C50001F93E82E82E062E00E94352684E390E034
:102C60000E94F7150E945926FF2400E010E0C801D9
:102C7000B70144E020E000E00E94072E0E945926A0
:102C80001F910F91FF90EF900895DF93CF9300D0A5
:102C90000F92CDB7DEB7FC019E012F5F3F4F40E89A
:102CA00051E083E0DA010D90AD01D9010D929D0153
:102CB0008150C1F7EC0FFD1F818190E00E94F71554
:102CC00061E00E94DD260F900F900F90CF91DF9171
:102CD0000895EF92FF920F931F93DF93CF93CDB799
:102CE000DEB761970FB6F894DEBF0FBECDBF7C0193
:102CF0000E94002689E090E00E94F715BC018E0139
:102D00000F5F1F4FC8010E94D940C8016CE371E0FA
:102D10000E94C54080E290E00E94F715BC01C80106
:102D20000E94C540C80160E00E94DD2686E090E078
:102D30000E94F71561E00E94DD26C70162E00E9453
:102D4000DD268EE10E94C42C61960FB6F894DEBF9A
:102D50000FBECDBFCF91DF911F910F91FF90EF90EC
:102D60000895FF920F931F93DF93CF93CDB7DEB7F4
:102D700064970FB6F894DEBF0FBECDBFF82E8AE081
:102D800090E00E94F715BC018E010F5F1F4FC80134
:102D90000E94D9408F2D90E00E94F715BC01C80118
:102DA0000E94C540C80161E00E94DD268DE090E0F0
:102DB0000E94F71562E00E94DD2664960FB6F89433
:102DC000DEBF0FBECDBFCF91DF911F910F91FF905E
:102DD0000895109249010E94002680918102882363
:102DE000A1F40E94002680910C0190E00E9433140F
:102DF0008FE060E00E9435268EE391E00E94592624
:102E00000E9495130E94730F089582E290E00E9441
:102E1000F71560E00E94DD260895823058F0815059
:102E2000E82FF0E0E75BFE4F808180538093CB0377
:102E3000108208950E94E91608952F923F924F92B2
:102E40005F926F927F928F929F92AF92BF92CF923A
:102E5000DF92EF92FF920F931F93CF93DF93EC01DA
:102E60001B012A01F22E380188809980FFE0BF2ED5
:102E7000B2228B2D61E00E943526C401F80109952C
:102E8000809149018823A9F489E491E064E471E028
:102E90000E94D9400EC088819981B101A2012B2DD9
:102EA00001E07301CD2CA12E0E94541599838883D3
:102EB00005C0E0E4DE2EDF201F2D107880E20E94A6
:102EC000C727882341F40E94A815882321F4809104
:102ED0009002882301F30E940026809190028823AB
:102EE00029F010929002998288820BC0E9E4F1E007
:102EF00001900020E9F73197E954F1408E2F0E94AC
:102F00000D1720E0888199818816990609F021E043
:102F1000822FDF91CF911F910F91FF90EF90DF9063
:102F2000CF90BF90AF909F908F907F906F905F9069
:102F30004F903F902F900895FF920F931F93DF9330
:102F4000CF9300D0CDB7DEB784E10E94FF11F82EF9
:102F50001091CA030E949A28BC0176956795812F2B
:102F60000E946A298091CA0390E0FC0103E0EE0F01
:102F7000FF1F0A95E1F7E81BF90BEA5EFE4F85811A
:102F800096819A8389838091040390E0FC01EE0F7F
:102F9000FF1FE80FF91FEE0FFF1FEE0FFF1FE0529C
:102FA000FE4F6085718542855385CE01019625E8E7
:102FB00009E812E10E941D17882319F16091CA03E4
:102FC000862F90E0FC01A3E0EE0FFF1FAA95E1F72A
:102FD000E81BF90BEA5EFE4F89819A81968385830F
:102FE00087E0689FB0011124CB018A5E9E4F685B29
:102FF0007F4F47E050E00E94884184E06EE10E94EC
:10300000AE098F2D0E94E9150F900F90CF91DF919F
:103010001F910F91FF900895FF920F931F93DF93DD
:10302000CF9300D0CDB7DEB784E10E94FF11F82E18
:103030008091CA0360E070E00E946A298091CA030F
:1030400090E0FC0163E0EE0FFF1F6A95E1F7E81BDB
:10305000F90BEA5EFE4F818192819A838983809188
:10306000040390E0FC01EE0FFF1FE80FF91FEE0FC5
:10307000FF1FEE0FFF1FDF01A052BE4F6D917C912D
:10308000EE51FE4F40815181CE01019626E804EBBE
:1030900012E10E941D178823A9F16091CA03862FAF
:1030A00090E0FC0123E0EE0FFF1F2A95E1F7E81BFB
:1030B000F90BEA5EFE4F89819A819283818387E0D2
:1030C000689FB0011124CB018A5E9E4F685B7F4FE1
:1030D00047E050E00E9488418091CA03282F30E0E9
:1030E000F90193E0EE0FFF1F9A95E1F7E21BF30B56
:1030F000EA5EFE4F658176810E94F22884E06EE1EF
:103100000E94AE098F2D0E94E9150F900F90CF916C
:10311000DF911F910F91FF900895FF920F931F93DE
:10312000DF93CF9300D0CDB7DEB784E10E94FF11CB
:10313000F82E1091CA030E949A28BC01812F0E9488
:103140006A298091CA0390E0FC0123E0EE0FFF1F83
:103150002A95E1F7E81BF90BEA5EFE4F8381948123
:103160009A8389838091040390E0FC01EE0FFF1F96
:10317000E80FF91FEE0FFF1FEE0FFF1FDF01AC512D
:10318000BE4F6D917C91E052FE4F46815781CE013A
:10319000019626E809E313E10E941D178823A9F18F
:1031A0006091CA03862F90E0FC01A3E0EE0FFF1FA1
:1031B000AA95E1F7E81BF90BEA5EFE4F89819A8137
:1031C0009483838387E0689FB0011124CB018A5EDA
:1031D0009E4F685B7F4F47E050E00E94884180919E
:1031E000CA03282F30E0F90173E0EE0FFF1F7A9534
:1031F000E1F7E21BF30BEA5EFE4F658176810E94E8
:10320000F22884E06EE10E94AE098F2D0E94E9153C
:103210000F900F90CF91DF911F910F91FF90089524
:10322000FF920F931F93DF93CF9300D0CDB7DEB7FC
:1032300084E10E94FF11F82E8091CA0390E0FC0106
:1032400053E0EE0FFF1F5A95E1F7E81BF90BEA5E1A
:10325000FE4F808189831A82CE01019660E070E082
:1032600041E050E026E00EE11AE10E941D1788239C
:1032700029F18091CA036981282F30E0F90143E0E8
:10328000EE0FFF1F4A95E1F7E21BF30BEA5EFE4FDC
:1032900060830E94A7286091CA0387E0689FB001FD
:1032A0001124CB018A5E9E4F685B7F4F47E050E060
:1032B0000E94884184E06EE10E94AE098F2D0E9439
:1032C000E9150F900F90CF91DF911F910F91FF9013
:1032D000089580E20E94C727882341F40E94A81520
:1032E000882321F480919002882399F30E9400267C
:1032F00080914901882319F40E94E91603C081E0F6
:103300000E94580980914901882319F480E090E0D7
:1033100008C090E080919002811191E081E09827AF
:10332000892F109290020895CF93DF93E9E4F1E0A2
:1033300001900020E9F73197E954F140E150CE2F98
:10334000D0E0FE01E75BFE4F9081905390938002A6
:103350008091EA02843029F4943019F485E3808363
:1033600016C09093CB0381E08093A603943031F094
:1033700083E490E00E94F7150E9459260E94691983
:10338000882319F0C75BDE4F18821092800289E40F
:1033900091E00E94BA15DF91CF910895CF93DF930A
:1033A000EC01009741F486E390E00E94F71561E09C
:1033B0000E94DD260AC085E061E00E943526CE012C
:1033C0000E94581280E20E94A825DF91CF910895B3
:1033D0000F931F938C010E94CE19012B41F088E0BE
:1033E00061E00E9435268FE291E00E9459261F91EC
:1033F0000F910895892B19F483E590E002C084E5CC
:1034000090E00E94F7150E9459260895DF93CF930C
:1034100000D0CDB7DEB720E5298321E52A83FE0160
:10342000E80FF91F818190E00E94F71561E00E948A
:10343000DD260F900F90CF91DF910895892B19F41D
:1034400086E390E002C087E390E00E94F7150E94B7
:10345000592608950F931F93DF93CF9300D000D088
:103460000F92CDB7DEB79C01009721F08F31910507
:1034700039F403C081E190E01CC082E190E019C002
:1034800073E0880F991F7A95E1F7220F331F820F9F
:10349000931F8E010F5F1F4FB8014AE050E00E945A
:1034A000074180E20E94A825C8010E94592683E1B5
:1034B00090E00E94F7150E9459260E940A260F905C
:1034C0000F900F900F900F90CF91DF911F910F9160
:1034D0000895DF93CF9300D0CDB7DEB726E32983DD
:1034E0002DE32A83FE01E80FF91F818190E00E94FD
:1034F000F71561E00E94DD260F900F90CF91DF91CC
:103500000895DF93CF9300D000D00F92CDB7DEB7F0
:10351000FC019E012F5F3F4F45E951E085E0DA0154
:103520000D90AD01D9010D929D018150C1F7EC0FB5
:10353000FD1F818190E00E94F71561E00E94DD2669
:103540000F900F900F900F900F90CF91DF910895F3
:10355000DF93CF9300D00F92CDB7DEB7FC019E0171
:103560002F5F3F4F4AE951E083E0DA010D90AD0152
:10357000D9010D929D018150C1F7EC0FFD1F818192
:1035800090E00E94F71561E00E94DD260F900F90F9
:103590000F90CF91DF91089580E060E00E94352682
:1035A0008BE590E00E94F7150E9459268091C9038F
:1035B000882319F487E490E002C08AE590E00E9435
:1035C000F7150E9459268CE590E00E94F7150E949D
:1035D00059268EE10E94C42C0E94002608950F9364
:1035E0001F93082F90E00E94F715FC010190002026
:1035F000E9F73197E81BE031D8F480E190E08E1BC9
:10360000910995958795182F823098F0825060E047
:103610000E94352686E491E00E945926802F90E092
:103620000E94F7150E94592680E20E94A82516C024
:1036300010E080E060E00E9435268AE20E94A82522
:10364000812F60E00E943526802F90E00E94F715C0
:103650000E9459268FE060E00E9435268AE20E948F
:10366000A8251F910F9108950F931F93DF93CF9378
:1036700000D0CDB7DEB789E50E94EF1A809127010F
:1036800089831A82CE01019660E070E046E050E046
:1036900023E008E814E10E941D178823C9F069811E
:1036A000609327018FE590E00E94924184E06EE1F3
:1036B0000E94AE0980912701E82FF0E0EE0FFF1F76
:1036C000E55AFE4F85919591A591B4910E94B82A33
:1036D00089E491E00E94BA150F900F90CF91DF918D
:1036E0001F910F9108950F931F93DF93CF9300D0F5
:1036F000CDB7DEB78BE30E94EF1A8091EB0289838E
:103700001A82CE01019660E070E041E050E023E0D3
:1037100009E61AE10E941D17882359F06981609318
:10372000EB028EE590E00E94924184E06EE10E94FF
:10373000AE0989E491E00E94BA150F900F90CF91E5
:10374000DF911F910F9108950F931F93DF93CF93F4
:1037500000D0CDB7DEB78CE30E94EF1A80916F02E4
:1037600089831A82CE01019660E070E044E650E061
:1037700027E808E512E10E941D17882359F06981A6
:1037800060936F028DE590E00E94924184E06EE1CB
:103790000E94AE0989E491E00E94BA150F900F9043
:1037A000CF91DF911F910F9108958091EA028230AD
:1037B00059F0833018F4813061F403C0853048F447
:1037C00006C00E94A41B08950E94731B08950E94C6
:1037D000341B08950F931F93DF93CF9300D0CDB781
:1037E000DEB788E30E94EF1A8091EA0289831A8289
:1037F000CE01019660E070E044E050E023E001E893
:103800001AE10E941D17882389F1F8946981609359
:10381000EA0278948CE590E00E94924184E06EE1A7
:103820000E94AE098091EA020E94202C81E08093E0
:10383000A7031092840210928502109286021092C1
:103840008702109288021092890210928A021092C6
:103850008B020E94C40F8091EA02882319F084E150
:103860000E9407280E9465130E94AD0F89E491E031
:103870000E94BA150F900F90CF91DF911F910F9179
:1038800008950F931F93DF93CF9300D0CDB7DEB78A
:103890008DE10E94EF1A8091720289831A82CE0113
:1038A00001966EE170E048EC50E026E801E312E199
:1038B0000E941D17882359F069816093720283EC7E
:1038C00090E00E94924184E06EE10E94AE0989E49A
:1038D00091E00E94BA150F900F90CF91DF911F9148
:1038E0000F9108950F931F93DF93CF9300D0CDB71F
:1038F000DEB78CE10E94EF1A8091710289831A82EF
:10390000CE0101966EE170E048EC50E026E801E35C
:1039100012E10E941D17882359F06981609371029A
:1039200082EC90E00E94924184E06EE10E94AE0938
:1039300089E491E00E94BA150F900F90CF91DF912A
:103940001F910F9108950F931F93DF93CF9300D092
:10395000CDB7DEB78BE10E94EF1A809170028983A8
:103960001A82CE01019660E070E044E150E025E863
:1039700001EA13E10E941D17882359F069816093C1
:10398000700281EC90E00E94924184E06EE10E941E
:10399000AE0989E491E00E94BA150F900F90CF9183
:1039A000DF911F910F9108950F931F93DF93CF9392
:1039B00000D0CDB7DEB78AE10E94EF1A8091740281
:1039C0009091750262E370E00E94C03E7A83698341
:1039D000CE01019664E170E048E750E025E80FE38E
:1039E00012E10E941D17882311F129813A8182E397
:1039F00090E0AC01249FC001259F900D349F900D55
:103A0000112490937502809374026091F50289E00D
:103A1000689FB001112469597F4F83E792E049E024
:103A200050E00E94884184E06EE10E94AE0989E482
:103A300091E00E94BA150F900F90CF91DF911F91E6
:103A40000F9108950F931F93DF93CF9300D0CDB7BD
:103A5000DEB789E10E94EF1A8091F50290E00196AD
:103A60009A838983CE01019661E070E04AE050E0DC
:103A700025E808E512E10E941D17882331F16981CC
:103A80007A81615070407A8369836093F50286E69B
:103A900090E00E9492416091F50289E0689FB00138
:103AA000112469597F4F83E792E049E050E00E947A
:103AB000644180917602909177029093F402809312
:103AC000F30284E06EE10E94AE090F900F90CF9157
:103AD000DF911F910F9108950E94221D89E491E0CA
:103AE0000E94BA1508950F931F93DF93CF9300D0D0
:103AF000CDB7DEB787E10E94EF1A80910901898373
:103B00001A82CE01019660E070E048EC50E024E8B3
:103B100004E51FE00E941D17882359F06981609316
:103B2000090189E090E00E94924184E06EE10E94E8
:103B3000AE0989E491E00E94BA150F900F90CF91E1
:103B4000DF911F910F9108950F931F93DF93CF93F0
:103B500000D0CDB7DEB785E10E94EF1A80910A014F
:103B600090910B019A838983CE01019666E272E0FF
:103B700048E755E024E804E51FE00E941D1788236C
:103B8000B1F069817A8170930B0160930A018AE038
:103B900090E00E94A84180910A0190910B019093BE
:103BA000AC038093AB0384E06EE10E94AE0989E42C
:103BB00091E00E94BA150F900F90CF91DF911F9165
:103BC0000F9108952F923F924F925F926F927F9242
:103BD0008F929F92AF92BF92CF92DF92EF92FF921D
:103BE0000F931F93DF93CF93CDB7DEB728970FB610
:103BF000F894DEBF0FBECDBF809124010E94FF115B
:103C00008F8383EF90E068E00E94E3251092CC035D
:103C10008FE20E94EF1A809125010E9425161A82D8
:103C200019820E949A282C01569447945C824B82F8
:103C30000E949A288887292E8D839E8380E08E019A
:103C40000F5F1F4FB8010E94DA11382EE091040275
:103C5000F0E0EE0FFF1FE00FF11F80809180609079
:103C6000250177247394ACC0840104191509C80197
:103C700060E070E04885522D92010E940D12BC0157
:103C8000C80141E00E94B8138091CA03B4010E94A8
:103C90006A29E72DF0E0EC5FFD4FE081F0E0EE0FE8
:103CA000FF1F61E070E06C0F7D1FE60FF71F0190B2
:103CB000F081E02D8E169F0609F46BC040917E02C4
:103CC000832D992787FD9095242F30E0BC01629FBA
:103CD000C001639F900D729F900D1124880E991E54
:103CE00037FE04C08E169F0644F005C0332019F03D
:103CF000E815F90514F0442309F44F01209124013B
:103D000060917F0270E0620F711D6F5F7F4F8827A7
:103D100077FD8095982F0E94603C5B016C0120E04C
:103D200030E44CE955E40E94D53D7B018C0120E054
:103D300030E040E85FE30E94BE3B88231CF461E072
:103D400070E023C0C801B70120E03FEF4FE757E420
:103D50000E94CA3D1816ACF4C601B50120E030E05F
:103D600040E251E40E94D53D0E94323C06C084EFFF
:103D700091E00197F1F76150704061157105B9F755
:103D80001FC0C801B7010E94323CCB010197F1F777
:103D900017C0872DBE016F5F7F4F0E94DA11382E4A
:103DA00072E0771510F4772407C0772021F46A9425
:103DB000862D0E9425167394809126010E94C42CA2
:103DC00080E20E94C727882339F40E94A81588231F
:103DD00019F4662009F048CF0E940026809149011D
:103DE000882319F40E94E9160BC0E9E4F1E0019080
:103DF0000020E9F73197E954F1408E2F0E940D170A
:103E00008BEB90E067E00E94E325F89484E10E9448
:103E1000072878948F810E94E91528960FB6F894A8
:103E2000DEBF0FBECDBFCF91DF911F910F91FF90ED
:103E3000EF90DF90CF90BF90AF909F908F907F904A
:103E40006F905F904F903F902F9008950F931F9326
:103E5000DF93CF9300D0CDB7DEB783E30E94EF1A94
:103E600080917F0289831A82CE01019660E070E022
:103E700048EC50E025E808EE19E10E941D17882360
:103E800059F0698160937F028BE590E00E94924136
:103E900084E06EE10E94AE0989E491E00E94BA15C7
:103EA0000F900F90CF91DF911F910F9108950F9375
:103EB0001F93DF93CF9300D0CDB7DEB782E30E948C
:103EC000EF1A8091260189831A82CE01019664E05F
:103ED00070E044E150E025E806E612E10E941D177B
:103EE000882359F06981609326018AE590E00E9459
:103EF000924184E06EE10E94AE0989E491E00E9463
:103F0000BA150F900F90CF91DF911F910F910895E7
:103F10000F931F93DF93CF9300D0CDB7DEB781E32C
:103F20000E94EF1A8091250189831A82CE010196A1
:103F300061E070E044E650E025E808E512E10E9407
:103F40001D17882359F069816093250189E590E068
:103F50000E94924184E06EE10E94AE0989E491E002
:103F60000E94BA150F900F90CF91DF911F910F9182
:103F700008950F931F93DF93CF9300D0CDB7DEB793
:103F800080E30E94EF1A80917E0289831A82CE011B
:103F9000019660E070E044E150E025E80EEC19E1A4
:103FA0000E941D17882359F0698160937E0288E57D
:103FB00090E00E94924184E06EE10E94AE0989E4A3
:103FC00091E00E94BA150F900F90CF91DF911F9151
:103FD0000F910895FF920F931F93DF93CF9300D01B
:103FE000CDB7DEB7809124010E94FF11F82E83EF38
:103FF00090E068E00E94E3251092CC038EE20E94DC
:10400000EF1A2091040330E0A8EFB1E0C901880F56
:10401000991F820F931FFC01EE0FFF1FEA0FFB1F7A
:10402000248135813A832983608171810196880FCB
:10403000991FA80FB91F4D915C91CE01019624E8FC
:1040400006EB14E10E941D178BEB90E067E00E94E5
:10405000E325F89484E10E94072878948F2D0E942C
:10406000E9150F900F90CF91DF911F910F91FF9065
:1040700008950F931F93DF93CF9300D0CDB7DEB792
:1040800082E50E94EF1A8091CA0389831A82CE01C9
:10409000019660E070E041E050E024E00AEF19E1B1
:1040A0000E941D17882359F069816093CA0387E530
:1040B00090E00E94924184E06EE10E94AE0989E4A2
:1040C00091E00E94BA150F900F90CF91DF911F9150
:1040D0000F9108950F931F93DF93CF9300D0CDB727
:1040E000DEB78DE20E94EF1A88E061E00E9435267B
:1040F0008FE291E00E9459268091240189831A82DF
:10410000CE0101966AE070E04EE150E025E808E556
:1041100012E10E941D17882359F0698160932401E0
:1041200086E590E00E94924184E06EE10E94AE0933
:1041300089E491E00E94BA150F900F90CF91DF9122
:104140001F910F9108958CE20E94EF1A0E949C1714
:10415000089588E20E94EF1A0E949C1708958BE24E
:104160000E94EF1A0E940C18089587E20E94EF1A2D
:104170000E940C1808958AE20E94EF1A0E948D187E
:10418000089586E20E94EF1A0E948D18089589E230
:104190000E94EF1A0E941019089585E20E94EF1AFA
:1041A0000E94101908950F931F93DF93CF9300D0AF
:1041B000CDB7DEB784E20E94EF1A88E061E00E948A
:1041C00035268091040389831A82CE01019660E02E
:1041D00070E041E050E025E006E01AE10E941D1782
:1041E0008823B1F0F89469816093040387E490E038
:1041F0000E949241809104030E94DB1284E10E949C
:10420000072878940E94651384E06EE10E94AE094D
:1042100089E491E00E94BA150F900F90CF91DF9141
:104220001F910F9108950F931F93DF93CF9300D0A9
:10423000CDB7DEB780E00E94EF1A80910D0189832F
:104240001A828EE090E00E94744180930D01CE01AD
:10425000019660E070E042E050E023E005E416E102
:104260000E941D1769817A8180910D0190E0681785
:10427000790751F060930D018EE090E00E94924129
:1042800084E06EE10E94AE0989E491E00E94BA15D3
:104290000F900F90CF91DF911F910F91089589E4B6
:1042A0000E94EF1A8CE00E94B1160E9469198823BF
:1042B00039F08DEA93E00E94DD0D0E94E916089521
:1042C00089E491E00E94BA150895DF92EF92FF927F
:1042D0000F931F93DF93CF93CDB7DEB72F970FB612
:1042E000F894DEBF0FBECDBF88E00E94EF1A8BE0CE
:1042F0000E94B1160E9469198823C1F100E011E003
:104300007E010894E11CF11C5CE2D52E812F0E94F5
:10431000E90C812F6DEA73E00E94130E882369F483
:10432000F701E00FF11D105D10831053802F8F5F98
:10433000F701E80FF11DD0820E5F1F5F183031F7D3
:1043400080910C010E94E90C84E06EE10E94AE09AC
:10435000002349F00150CE010196FC01E00FF11D50
:1043600010820E9469160E94E91604C089E491E057
:104370000E94BA152F960FB6F894DEBF0FBECDBFC0
:10438000CF91DF911F910F91FF90EF90DF900895F3
:1043900088E40E94EF1A8BE00E94B1160E9469190E
:1043A000882341F080E06DEA73E00E94130E0E94C2
:1043B000E916089589E491E00E94BA1508950F93D3
:1043C0001F93DF93CF9300D0CDB7DEB786E00E9476
:1043D000EF1A80910C0189831A82CE01019661E067
:1043E00070E047E050E023E003E314E10E941D1772
:1043F000882341F48091C80390E029813A812817ED
:104400003907E9F0698160930C016093C8038CE07F
:1044100090E00E94924184E06EE10E94AE0980919A
:104420000C010E94E90C80914901882341F460E06D
:104430000E94352680910C0190E00E94331489E49B
:1044400091E00E94BA150F900F90CF91DF911F91CC
:104450000F9108950F931F93DF93CF9300D0CDB7A3
:10446000DEB785E00E94EF1A80917D0289831A826F
:10447000CE01019660E070E042E050E023E008EAFF
:104480001AE10E941D178823C9F0F894698160938E
:104490007D028DE090E00E94924184E06EE10E94F6
:1044A000AE0980917D020E9477088093C5038091B8
:1044B0004901882311F40E949513789489E491E0CE
:1044C0000E94BA150F900F90CF91DF911F910F911D
:1044D000089584E40E94EF1A80E061E00E9435268E
:1044E0008EE490E00E94F7150E94592680E062E079
:1044F0000E9435268FE490E00E94F7150E9459260D
:104500000E946B148091EA02843021F48091800231
:10451000843009F085E08093CB0385E080938002AE
:104520000E946919882339F0E9E4F1E00190002044
:10453000E9F7329710821092800289E491E00E949C
:10454000BA1508950F931F93DF93CF9300D0CDB783
:10455000DEB78FE00E94EF1A80E061E00E9435260E
:1045600080E190E00E94F7150E9459268091080191
:1045700089831A82CE01019660E070E04FE150E03D
:1045800026E80AE21AE10E941D17882389F0698152
:104590006093080188E090E00E94924184E06EE11F
:1045A0000E94AE0980910801882311F40E949108AD
:1045B00089E491E00E94BA150F900F90CF91DF919E
:1045C0001F910F9108950F931F93DF93CF9300D006
:1045D000CDB7DEB78BE40E94EF1A82E061E00E9463
:1045E00035268EE090E00E94F7150E94592682E35E
:1045F00091E00E9459268091A80389831A82CE01F6
:10460000019660E070E04EE150E02BE009E415E136
:104610000E941D17882359F069816093A80387E0E1
:1046200090E00E94924184E06EE10E94AE0989E42C
:1046300091E00E94BA150F900F90CF91DF911F91DA
:104640000F9108950F931F93CF93DF93EC0166238F
:1046500021F0162F115000E002C01881FCCF82E03B
:10466000602F0E943526FE01E10FF11D818190E04F
:104670000E94F7150E9459260E940A268881181761
:1046800010F010E001C01F5F0F5F033041F7DF91B2
:10469000CF911F910F9108951F93CF93DF93EC015A
:1046A000162F0E94002680E061E00E9435268CEFE4
:1046B0000E94A82523C080E40E94B127882329F402
:1046C00080E40E94BC27882349F0112311F0115087
:1046D00001C01881CE01612F0E94222380E80E9430
:1046E000B127882329F480E80E94BC27882351F051
:1046F0008881181710F010E001C01F5FCE01612FF4
:104700000E94222380E20E94C727882341F40E944E
:10471000A815882321F480919002882361F20E94D9
:10472000002680919002882319F01093CB0321C0BA
:10473000E9E4F1E001900020E9F73197E954F14014
:104740009E2F112311F0EE2321F4892F0E940D17C3
:1047500010C081E08093CB03F0E0E75BFE4F105D7B
:1047600010839F5FE92FF0E0E75BFE4F10820E940D
:10477000580910929002DF91CF911F910895DF9315
:10478000CF93CDB7DEB727970FB6F894DEBF0FBE35
:10479000CDBFDE011196EFE4F1E087E001900D92CC
:1047A0008150E1F78091EA02843021F4898384E426
:1047B0008E8304C0823011F083E08983CE0101969C
:1047C0006091CB030E944C2389E491E00E94BA15CA
:1047D00027960FB6F894DEBF0FBECDBFCF91DF9105
:1047E0000895DF93CF93CDB7DEB727970FB6F89430
:1047F000DEBF0FBECDBFDE011196E6E5F1E087E03A
:1048000001900D928150E1F7CE0101966091CB03AA
:104810000E944C2389E491E00E94BA1527960FB6B6
:10482000F894DEBF0FBECDBFCF91DF910895DF9327
:10483000CF9300D000D00F92CDB7DEB7DE01119636
:10484000EDE5F1E085E001900D928150E1F7CE01B8
:1048500001966091CB030E944C2389E491E00E9471
:10486000BA150F900F900F900F900F90CF91DF918E
:104870000895DF93CF9300D000D0CDB7DEB782E0AC
:10488000898384E08A838EE08B838FE08C83CE01E2
:1048900001966091CB030E944C2389E491E00E9431
:1048A000BA150F900F900F900F90CF91DF91089550
:1048B000DF93CF93CDB7DEB727970FB6F894DEBF5F
:1048C0000FBECDBFDE011196E2E6F1E087E0019078
:1048D0000D928150E1F7CE0101966091CB030E94C9
:1048E0004C2389E491E00E94BA1527960FB6F894FC
:1048F000DEBF0FBECDBFCF91DF910895DF93CF9381
:1049000000D000D000D0CDB7DEB7DE011196E9E6C9
:10491000F1E086E001900D928150E1F7CE01019621
:104920006091CB030E944C2387E590E00E94744184
:104930008093CA0389E491E00E94BA1526960FB6C7
:10494000F894DEBF0FBECDBFCF91DF910895DF9306
:10495000CF9300D000D000D0CDB7DEB7DE011196E6
:10496000EFE6F1E086E001900D928150E1F7CE0193
:1049700001966091CB030E944C2381E08093CA038F
:1049800089E491E00E94BA1526960FB6F894DEBF2E
:104990000FBECDBFCF91DF910895DF93CF9300D0AD
:1049A00000D000D0CDB7DEB7DE011196E5E7F1E02B
:1049B00086E001900D928150E1F7CE010196609161
:1049C000CB030E944C231092CA0389E491E00E9419
:1049D000BA1526960FB6F894DEBF0FBECDBFCF91A5
:1049E000DF910895DF93CF9300D000D00F92CDB721
:1049F000DEB7DE011196EBE7F1E085E001900D9264
:104A00008150E1F7CE0101966091CB030E944C23C7
:104A100089E491E00E94BA150F900F900F900F90CB
:104A20000F90CF91DF910895DF93CF9300D000D006
:104A30000F92CDB7DEB7DE011196E3E8F1E085E035
:104A400001900D928150E1F7CE0101966091CB0368
:104A50000E944C2389E491E00E94BA150F900F90B8
:104A60000F900F900F90CF91DF910895DF93CF9328
:104A7000CDB7DEB72D970FB6F894DEBF0FBECDBF12
:104A8000DE011196E8E8F1E08DE001900D92815091
:104A9000E1F78091EA02823079F0833018F48130B6
:104AA000C9F405C0833089F08430A1F40BC088E5D7
:104AB0008C8789818F5F04C08BE38C8789818E5FAF
:104AC000898308C089818F5F898389818F5F89830A
:104AD00085E48C8789E491E064E471E00E94D94028
:104AE000CE0101966091CB030E944C2389E491E0B2
:104AF0000E94BA152D960FB6F894DEBF0FBECDBF3B
:104B0000CF91DF91089528B1982F9F70922B98B97B
:104B100098B1806F982398B9459A8DE08A95F1F7FE
:104B2000459888EC8A95F1F708951F93182F829580
:104B30008F700E948325812F0E9483251F910895E5
:104B400044980E9495250895449A0E9495250895B9
:104B50000E94A4258091CD038F5F8093CD03803385
:104B600010F01092CD030895EF92FF920F931F93D0
:104B7000CF93DF93182F7B0188E20E94A025012F9D
:104B800010E083E0000F111F8A95E1F7C0E0D0E04C
:104B90009E01200F822F80640E94A025F701EC0F58
:104BA000FD1FE4918E2F0E94A8252196C830D105C3
:104BB00079F789E20E94A025DF91CF911F910F9193
:104BC000FF90EF900895EF92FF920F931F93CF9372
:104BD000DF937C01062F10E0C0E0D0E008C0B701F1
:104BE0006C0F7D1F812F0E94B4251F5F2896101720
:104BF000B0F3DF91CF911F910F91FF90EF90089547
:104C000081E00E94A0251092CD0380E197E20197F8
:104C1000F1F708951F931091CD031F7031F080E2DA
:104C20000E94A4251F5F1031D1F78091CD038068C9
:104C30000E94A0251F9108950F931F93162F813076
:104C400011F400E501C004E589E20E94A025812F4E
:104C50008F7080670E94A02512951370802F812B82
:104C60000E94A0251F910F910895982F813108F07F
:104C700090E0643008F060E0862F8295807F890F95
:104C80008093CD0380680E94A02508951F93682F0C
:104C900080E00E94352610E080E20E94A4251F5F7C
:104CA0001031D1F78091CD0380680E94A0251F911B
:104CB00008951F93CF93DF93EC011091CD031295CC
:104CC0001F700FC08A3051F4133010F010E001C093
:104CD0001F5F80E0612F0E94352602C00E94A82538
:104CE00021968881882371F7DF91CF911F910895D4
:104CF000CF92DF92EF92FF920F931F93582F162FB0
:104D0000C42E022F279A3D9A3C9A87B18F6087B9AB
:104D1000459880E991E024EF31E0F9013197F1F70E
:104D20000197D9F7513039F4EDE1FE2E7CE6D72E0C
:104D300060E5E62E06C055E1F52E4EE6D42E34E5AC
:104D4000E32E449883E00E94832580E197E2019757
:104D5000F1F783E30E94832582E30E94A02589E284
:104D60000E94A0258F2D0E94A025812F8F70806723
:104D70000E94A025129513708E2D812B0E94A025D4
:104D80008D2D0E94A02588E20E94A02501700C6054
:104D90008C2D90E081709070880F991F802B0E945D
:104DA000A0250E94002686E00E94A0251F910F9159
:104DB000FF90EF90DF90CF900895FF920F931F9395
:104DC000082FF92E162F862F0E944626E02FFF2D42
:104DD000DF010D900020E9F7EA1BFB0B7196F695B9
:104DE000E7958E2F612F0E943526802F9F2D0E94E0
:104DF00059261F910F91FF9008951F920F920FB6A1
:104E00000F9211242F933F938F939F938DE386BD31
:104E100026B189B13091A30390E080789070959588
:104E2000879595958795207C282B20952327809121
:104E3000D802822380958093D8029091D702922342
:104E400098279093D702822389239091A3039827D0
:104E50009093A3032091A1039091A3038923822B14
:104E60008093A1038091A103807E51F010920203F0
:104E70001092010388EE93E09093CF018093CE01CE
:104E80008091A303807E49F482E38093D60284E17B
:104E90008093060386E08093FF028091D6028150C2
:104EA0008093D602882361F4809106038093D60212
:104EB000909105038091A303807E892B8093050345
:104EC0008091D50281508093D502882331F482E30A
:104ED0008093D50281E08093A0038091D402815019
:104EE0008093D402882331F484E18093D40281E05A
:104EF000809303038091D30281508093D30288234F
:104F000031F482E08093D30281E0809307038091A3
:104F1000D20281508093D202882331F48AE08093B8
:104F2000D20281E08093FE028091CE019091CF0168
:104F300001979093CF018093CE01892B49F488EE9D
:104F400093E09093CF018093CE0181E08093A20300
:104F50009F918F913F912F910F900FBE0F901F90B7
:104F60001895F8949091A10389239091A103982713
:104F70009093A10378940895F89490910503892360
:104F80009091050398279093050378940895F894D9
:104F90009091A303F8942091A103909589238223F3
:104FA0009091A10398279093A10378940895982F46
:104FB000F8948091050398238091050389278093B5
:104FC00005037894F8948091A10389239091A1031B
:104FD00098279093A103789408958823B9F080913D
:104FE000FF02882341F0F8948091FF028150809362
:104FF000FF027894089580910603843038F0F89485
:105000008091060382508093060378940895EF926E
:10501000FF920F931F93E82E80916F008D7F8093F6
:105020006F00E0910403EE2309F054C080918100E9
:105030008C7F8093810080918100846080938100C7
:1050400080E18093CE0380E28093DA031092E7033D
:105050001092E603FF2400E010E0F0E083E0EE0FA2
:10506000FF1F8A95E1F7E053FE4F2681378140E02C
:1050700050E060E07DE281E391E00E94E73EC801FC
:10508000B7010E94953E0E945E3C2FE632E143E864
:105090005AE30E94D53D0E94323CAB017093E90374
:1050A0006093E8033091880020918900922F80E07E
:1050B000830F911D840F951F909389008093880022
:1050C00080916F00826080936F001F910F91FF901D
:1050D000EF900895809181008B7F80938100809173
:1050E00081008360ABCFE0910403F0E023E0EE0F9A
:1050F000FF1F2A95E1F7E053FE4F26813781829FFB
:10510000B001839F700D929F700D112480E090E09C
:105110000E945E3C20E030E040EA51E40E94C53B42
:1051200020E030E040E05FE30E94F83A0E94323C29
:10513000CB010895E0910403F0E033E0EE0FFF1F90
:105140003A95E1F7EC52FE4F80819181089590E00D
:10515000FC01EE0FFF1FE80FF91FEE0FFF1FEE0F10
:10516000FF1FE253FC4F61706383089590E0DC0100
:10517000AA0FBB1FA80FB91FAA0FBB1FAA0FBB1FE7
:10518000AE52BC4FE0910403F0E083E0EE0FFF1F4E
:105190008A95E1F7EE52FE4F80819181860F971F2D
:1051A0008D939C93089590E0DC01AA0FBB1FA80F7C
:1051B000B91FAA0FBB1FAA0FBB1FA253BC4FE09180
:1051C0000403F0E033E0EE0FFF1F3A95E1F7E05300
:1051D000FE4F80819181861B970B17969C938E932F
:1051E0001697089590E0EEECF3E09C01220F331F38
:1051F000280F391FD901AA0FBB1FAA0FBB1FAE0F63
:10520000BF1F1B967C936E931A972F5F3F4F220F01
:10521000331F220F331FE20FF31F40815181E091B2
:105220000403F0E083E0EE0FFF1F8A95E1F7EC52F4
:10523000FE4F80819181909581959F4F841B950BA6
:1052400016962D913C911797820F931F660F771F2B
:10525000860F971F73E0880F991F7A95E1F764E036
:10526000969587956A95E1F7840F951F19969C93FB
:105270008E9318970895EFE6F0E080818D7F80830C
:105280000895482F50E0FA01EE0FFF1FE40FF51FBD
:10529000EE0FFF1FEE0FFF1FEE52FC4F0190F0814B
:1052A000E02DCB016E177F0708F4CF01FA01EE0F56
:1052B000FF1FE40FF51FEE0FFF1FEE0FFF1FE2535E
:1052C000FC4F268137812817390708F4C9019283DA
:1052D00081830895CF92DF92EF92FF920F931F93F5
:1052E000CF93DF939B01C82FD0E0FE01EE0FFF1F8D
:1052F000EC0FFD1FEE0FFF1FEE0FFF1FE253FC4FE1
:105300008381882381F0E0910403F0E0B3E0EE0FA5
:10531000FF1FBA95E1F7EC52FE4F80819181AC01FD
:10532000461B570B9A01E0910403F0E0A3E0EE0F57
:10533000FF1FAA95E1F7EC52FE4F80819181AC01ED
:1053400056954795FE01EE0FFF1F6C01EE24FF24DA
:105350002417350700F5EC0FFD1FEE0FFF1FEE0FB2
:10536000FF1FDF01AE52BC4F0D911C91E253FC4F69
:1053700060857185601B710B80E090E0660F771F80
:10538000881F991F40E050E00E94953EA7019601BA
:105390000E94093F1EC0EC0FFD1FEE0FFF1FEE0F16
:1053A000FF1FE253FC4F0085118566817781601BEA
:1053B000710B80E090E0660F771F881F991F241BF8
:1053C000350B40E050E00E94953EA70196010E94F7
:1053D000E73EC801820F931FFE01EE0FFF1FEC0F87
:1053E000FD1FEE0FFF1FEE0FFF1FEE52FC4F01904F
:1053F000F081E02D8E179F0708F4CF01FE01EE0F1C
:10540000FF1FEC0FFD1FEE0FFF1FEE0FFF1FE253FC
:10541000FC4F268137812817390708F4C901928388
:105420008183DF91CF911F910F91FF90EF90DF90DB
:10543000CF9008951F93182F882777FD8095982F78
:10544000E0910403F0E023E0EE0FFF1F2A95E1F75F
:10545000EC52FE4F2081318140E050E00E94953EA9
:1054600024EB30E040E050E00E94E73E812FB9019C
:105470000E946A291F9108951F920F920FB60F92F2
:1054800011242F933F934F935F938F939F93EF93A9
:10549000FF933091D902323090F42BB1832F90E0FA
:1054A000FC01EE0FFF1FE80FF91FEE0FFF1FEE0FBD
:1054B000FF1FE253FC4F8081809582238BB9832F9D
:1054C0008F5F8093D9028230C9F0833010F0109240
:1054D000D9022BB18091D90290E0FC01EE0FFF1FA1
:1054E000E80FF91FEE0FFF1FEE0FFF1FE253FC4FF7
:1054F0008081282B2BB9418152810AC04091E80359
:105500005091E9038091E6039091E703481B590B02
:105510003091880020918900922F80E0830F911DA7
:10552000840F951F90938900809388008091E603F3
:105530009091E703840F951F9093E7038093E60310
:105540002091E8033091E9038217930720F010922D
:10555000E7031092E603FF91EF919F918F915F9186
:105560004F913F912F910F900FBE0F901F90189564
:105570009C0140E050E084E0220F331F441F551F80
:105580008A95D1F760E07DE281E391E00E94E73EF9
:10559000215030403093C5002093C40088E98093A7
:1055A000C10086E08093C2000895982F8091C000CA
:1055B00085FFFCCF9093C6000895FC0107C0809141
:1055C000C00085FFFCCF9093C6003196908199234F
:1055D000B1F708951F920F920FB60F9211242F93D7
:1055E0008F939F93EF93FF932091C6008091DA02EF
:1055F000882309F054C08091DB02281771F4809150
:105600000B02882351F010920B028AEE93E09093E4
:105610000A02809309021092810480910B02882370
:10562000F1F5E0910902F0910A0220838091810452
:105630008F5F8093810480918004882329F080917A
:10564000DC02281701F51AC080918104823029F408
:10565000213019F081E080930B0280918104833026
:1056600021F4223010F086E001C085E0809308022A
:105670009091810480910802981729F481E0809329
:105680000B028093DA023196F0930A02E09309024A
:1056900080918104863919F481E080930B02FF9197
:1056A000EF919F918F912F910F900FBE0F901F90B0
:1056B0001895982F80538A3068F08153863010F403
:1056C000865F0895892F8154863010F080E0089518
:1056D000892F87530895CF93DF93EC0130E044C0C6
:1056E0004F5FE42FF0E0E651FC4F20812D534F5FD8
:1056F000E42FF0E0E651FC4F70814F5FE42FF0E0C3
:105700004350E651FC4F5081DE01A30FB11D922F93
:1057100092959F70E42FF0E0E651FC4F80818D530D
:10572000880F880F892B8C93613009F1972F9D5337
:105730003F5FFE01E30FF11D31502295207F892F3D
:1057400086958695282B2083623089F04C5F6350C4
:105750003E5FFE01E30FF11D9295990F990F907C2A
:105760005D53952B90833F5F662309F0B9CFDF919E
:10577000CF910895982F8091DA02813009F04BC0C3
:1057800080918104833008F446C08091EC0389172E
:1057900009F041C020E040E050E006C0E651FC4F77
:1057A0008081480F511D2F5FE22FF0E0809181042E
:1057B00090E00397E817F9078CF3CA019F70E09116
:1057C000810426E0959587952A95E1F7835CF0E0C2
:1057D000E951FC4F20818217B1F4E09181044F73AD
:1057E0005070942F935CF0E0E851FC4F8081981743
:1057F00051F460918104665088E093E043E00E9498
:105800006B2B21E001C020E0F89410929F031092CE
:105810009E03789401C020E080919E0390919F03A5
:105820008C5E944048F48091EC03813428F08B35F1
:1058300018F481E0809300031092DA02822F089519
:10584000823019F0843081F405C083E28093DB025A
:105850008DE004C084E28093DB028AE08093DC0266
:1058600081E080938004089580E88093DB021092A9
:1058700080040895AC01809181048250809381045A
:105880008091DA02813091F420E009C0FA01E20F40
:10589000F11DB0E0A651BC4F8C9180832F5FA22FE9
:1058A000A60F80918104281788F302C0109281040A
:1058B0001092DA02809181040895EF92FF920F9383
:1058C0001F93CF93DF938091DA02813009F047C0B4
:1058D00080918104882309F442C000E091E002C075
:1058E0000E279F5F80918104981738F4E92FF0E02C
:1058F000E651FC4FE081EA3299F7E92FF0E0EF0141
:1059000022968091810490E0C817D90744F53AEEB9
:10591000E32E33E0F32EEE0EFF1EF70181810E948D
:10592000592B182FC651DC4F88810E94592B129594
:10593000107F182B101799F4F701108288E093E07C
:105940006BEE73E00E94D94081E080930003F894ED
:1059500010929F0310929E03789421E001C020E0F2
:1059600080919E0390919F038C5E944018F481E097
:10597000809300031092DA02822FDF91CF911F9162
:105980000F91FF90EF90089590E044EF51E009C02F
:1059900028EE33E0FA013197F1F721503040D1F78A
:1059A0009F5F9817A8F308957F928F929F92AF926E
:1059B000BF92CF92DF92EF92FF920F931F938C01D1
:1059C0006A017B01B22ECB01BA012CE330E040E04A
:1059D00050E00E94E73EA62E972E882E792E0B0DC2
:1059E000111D2AE030E040E050E00E94E73E205DDB
:1059F000F80120836A2D792D882D972D2AE030E03B
:105A000040E050E00E94E73E605DF8016183C7011D
:105A1000B6012CE330E040E050E00E94E73ECA01CE
:105A2000B9011F910F91FF90EF90DF90CF90BF9041
:105A3000AF909F908F907F900895FF920F931F9348
:105A4000DF93CF93CDB7DEB729970FB6F894DEBFBB
:105A50000FBECDBF20EA3FE040E050E00E94E73EAD
:105A6000BA0119868E010F5F1F4FC801A90126E0F8
:105A70000E94D42CAB01BC018AE3F82EFE82C8013F
:105A800023E00E94D42CAB01BC01FB82C80120E0C2
:105A90000E94D42CC8010E94592629960FB6F8946A
:105AA000DEBF0FBECDBFCF91DF911F910F91FF9051
:105AB00008950F931F93DF93CF93CDB7DEB727974A
:105AC0000FB6F894DEBF0FBECDBFAB01BC011F8285
:105AD00077FF0DC0CA0157FF03C0909581959F4F76
:105AE000AC01662757FD6095762F8DE201C080E2FC
:105AF00089838E010F5F1F4FC80124E00E94D42CC0
:105B0000AB01BC018AE38C83C80121E00E94D42C44
:105B1000C8010E94592627960FB6F894DEBF0FBE23
:105B2000CDBFCF91DF911F910F9108957F928F92FA
:105B30009F92AF92BF92CF92DF92EF92FF920F931C
:105B40001F93DF93CF9300D0CDB7DEB75A016B011F
:105B5000BE016F5F7F4F4AE050E00E945B3F7B01D8
:105B60008C01E981FA8180818E3249F54F011AC09A
:105B7000C801B7012AE030E040E050E00E94953EC5
:105B80007B018C01872D90E0C097AA2797FDA095F7
:105B9000BA2FE80EF91E0A1F1B1F0894A108B108AE
:105BA000C108D108F4017180772049F00894811C64
:105BB000911CA114B104C104D104D1F616C0A114E2
:105BC000B104C104D10489F0F501EE0FFF1FEE0FFF
:105BD000FF1FE35FF04F2591359145915491C80126
:105BE000B7010E94953E7B018C01B701C8010F905F
:105BF0000F90CF91DF911F910F91FF90EF90DF9069
:105C0000CF90BF90AF909F908F907F9008953F92DC
:105C10004F925F926F927F928F929F92AF92BF92BC
:105C2000CF92DF92EF92FF920F931F93CF93DF9368
:105C30006B017C01B42E122F842E9924F401E352BF
:105C4000FD4F10820217B8F4E22FF0E0E01BF109DB
:105C5000EE0FFF1FEE0FFF1FE35FF04F2591359111
:105C600045915491C701B6010E94093FC901DA016B
:105C70006C017D01102FF7FC02C033240AC0F094A0
:105C8000E094D094C094C11CD11CE11CF11C3324BD
:105C9000339441E15FE021E005C02F5F4C5F5F4F2F
:105CA0002A3051F0FA0185919591A591B491C816C9
:105CB000D906EA06FB068CF731102F5F11112F5F12
:105CC000022F0B1910160CF07BC0A02FBB27A7FDCD
:105CD000B095212F30E0A217B30729F0C901019632
:105CE000A817B90771F5A12FB0E0AA0FBB1FAA0F23
:105CF000BB1FCD01875F904FFC01259135914591E8
:105D00005491CA01B90112E0660F771F881F991FCD
:105D10001A95D1F7620F731F841F951F6C0D7D1D9F
:105D20008E1D9F1DFD01E35FF04F2591359145913B
:105D300054910E94093FC901DA016C017D0110E014
:105D40003FC0A217B30764F5AA0FBB1FAA0FBB1F62
:105D5000CD01875F904FFC0125913591459154917C
:105D6000CA01B901E2E0660F771F881F991FEA9503
:105D7000D1F7620F731F841F951F6C0D7D1D8E1D43
:105D80009F1DFD01E35FF04F2591359145915491A1
:105D90000E94093FC901DA016C017D01101B10C08E
:105DA0002B2D2150E22FFF27E7FDF095E352FD4F09
:105DB0008AE203C080832150319727FFFBCF66C062
:105DC0002B2D2150822F992787FD9095EC01C352EE
:105DD000DD4F022FAA24BB242C01632C77240894C6
:105DE0008108910835C0112379F0C401811B910904
:105DF0002817390749F486E490E00E94F715FC0162
:105E00008081888310E01FC0C701B6012AE030E01E
:105E100040E050E00E94093F605D6883C701B60121
:105E20002AE030E040E050E00E94093FC901DA0179
:105E30006C017D01C114D104E104F10421F41123AA
:105E400011F401500BC001500894A11CB11C219702
:105E500092012A193B09261537052CF6332049F003
:105E6000E02FFF27E7FDF095E352FD4F8DE28083A1
:105E70000150E02FFF27E7FDF095E352FD4F80E250
:105E800003C080830150319707FFFBCF8DED92E077
:105E9000DF91CF911F910F91FF90EF90DF90CF9006
:105EA000BF90AF909F908F907F906F905F904F903A
:105EB0003F9008958091A703882371F46091940422
:105EC0007091950480919604909197040E942D3CC6
:105ED0007093AD046093AC04089588E093E062E0B1
:105EE0000E943A2C882331F180910803843011F507
:105EF00080910A0390E09695982F8827979587952B
:105F000020910B0330E0822B932B64E170E00E9420
:105F1000C03E6C33710518F460E070E007C06C534C
:105F20007040653B710510F064EB70E080910903EF
:105F30000E941A2A08958F929F92AF92BF92CF9299
:105F4000DF92EF92FF920F931F93FC014B0182812E
:105F5000482F50E04051524080812AE0829FC0018A
:105F600011242181820F911D805E91409C0173E07C
:105F7000220F331F7A95E1F7880F991F280F391FD9
:105F8000420F531F5A01CC24B7FCC094DC2CCF0124
:105F9000039646E050E060E070E00E94962D7B01A1
:105FA0008C01C601B50120E836E948E950E00E94BD
:105FB000953E5B016C01C801B70126E030E040E08E
:105FC00050E00E94093F2A0D3B1D4C1D5D1DF40150
:105FD0008081873539F450954095309521953F4F14
:105FE0004F4F5F4FB901CA011F910F91FF90EF9082
:105FF000DF90CF90BF90AF909F908F9008958F9239
:106000009F92AF92BF92CF92DF92EF92FF920F9347
:106010001F93FC014B0190818AE0989F900111240D
:106020008181280F311D205132405901CC24B7FC09
:10603000C094DC2CCF01029646E050E060E070E0B6
:106040000E94962D7B018C01C601B50120E836E93E
:1060500048E950E00E94953E5B016C01C801B70120
:1060600026E030E040E050E00E94093F2A0D3B1D51
:106070004C1D5D1DF4018081833539F450954095A8
:10608000309521953F4F4F4F5F4FB901CA011F9186
:106090000F91FF90EF90DF90CF90BF90AF909F90C7
:1060A0008F9008957F928F929F92AF92BF92CF92DE
:1060B000DF92EF92FF920F931F93CF93DF934C01E8
:1060C0008FE40E94BA2B882309F481C028E033E0D2
:1060D000D4012D933C9380919E0390919F038C5EFD
:1060E000944008F07DC0A3E8B4E0F90131968DE05A
:1060F00001900D928150E1F7F401C081D1817724A4
:10610000CC5BDF4F8881C454D04087FF02C0772426
:1061100073946091A8047091A9048091AA0490914D
:10612000AB040E94603C5B016C016BA97CA98827D1
:1061300077FD8095982F20EA3FE040E050E00E94F4
:10614000953E0E94603C20E030E044EB51E40E9428
:10615000C53B7B018C0160918B0470918C04809114
:106160008D0490918E040E94603C9B01AC01C8019B
:10617000B7010E94F83AA60195010E94F73A20E083
:1061800030E040EA50E40E94C53B9B01AC01C601EF
:10619000B5010E94F83A0E942D3C60938B047093E5
:1061A0008C0480938D0490938E04CD5BDF4F8881A7
:1061B000817080938202D4018D919C910E94DD3781
:1061C000D401ED91FC9182A9809382040AC0809150
:1061D0009E0390919F03805D904211F40E9471375D
:1061E00077248091EB02882359F080919E0390914F
:1061F0009F03855A914020F08CE092E00E94DD2AB6
:10620000872DDF91CF911F910F91FF90EF90DF903D
:10621000CF90BF90AF909F908F907F900895809186
:106220008102882389F580914901882369F581E0FD
:1062300060E00E943526809100038823B9F08091A8
:10624000EF02863020F41092EE0285E010C08091BB
:10625000EE02882371F481E08093EE028091820443
:106260008A3014F088E503C0805D01C08AE30E9493
:10627000A825109200038091EF028F5F8093EF02B8
:106280008C3011F41092EF020895CF92DF92EF92CA
:10629000FF920F937A0169010E943526C7010E947F
:1062A0005926C6010E945926002319F0802F0E940A
:1062B000A8250F91FF90EF90DF90CF900895CF9297
:1062C000DF92EF92FF920F93CF93DF938091800242
:1062D000882309F404C29091A703992319F084300C
:1062E00009F0FDC180918102882309F0F8C18091F5
:1062F000A603882331F0992321F41092A6030E946B
:10630000002680918002823009F49AC0833020F404
:10631000813009F0E4C107C0833009F4D1C0843072
:1063200009F0DDC11BC16091AC047091AD048827F8
:1063300077FD8095982F43E020E000E00E94072E33
:106340009C0180E060E047E152E00FED0E944531A2
:1063500060919004709191048091920490919304C3
:106360000E94323C43E020E000E00E94072E9C01A6
:1063700088E060E04CE152E00DE60E94453160911A
:1063800094047091950480919604909197040E94D2
:10639000323C43E020E000E00E94072E9C0180E0B8
:1063A00061E041E252E00FED0E94453160918B04C3
:1063B00070918C0480918D0490918E042091A8049A
:1063C0003091A9044091AA045091AB04621B730B55
:1063D000840B950B43E023E001E00E94072E9C0113
:1063E00088E061E046E252E00DE60E9445316091AE
:1063F000AE047091AF04882777FD8095982F43E015
:1064000020E000E00E94072E9C0180E062E04BE269
:1064100052E00FED0E9445316091B0047091B104DB
:10642000882777FD8095982F43E020E000E00E94C8
:10643000072E9C0188E062E040E352E00FED3DC092
:106440006091830470918404809185049091860406
:106450004BE027E007E00E94072E9C0180E060E00F
:1064600045E352E000E00E9445316091870470915D
:1064700088048091890490918A044BE027E007E02A
:106480000E94072E9C0180E061E04BE352E000E0B7
:106490000E94453160918B0470918C0480918D0431
:1064A00090918E044BE023E001E00E94072E9C01B6
:1064B00080E062E041E452E000E00E9445310FC11B
:1064C0006091A0047091A1048091A2049091A30412
:1064D0004BE027E007E00E94072E9C0180E060E08F
:1064E00047E452E000E00E9445316091A4047091BD
:1064F000A5048091A6049091A7044BE027E007E053
:106500000E94072E9C0180E061E04DE452E000E033
:106510000E9445316091A8047091A9048091AA0459
:106520009091AB044BE023E001E00E94072E9C0118
:1065300080E062E043E552E000E00E94453180E403
:106540000E94B127882331F480E80E94B127882374
:1065500009F4C5C081E08093A703C1C06091B20473
:1065600070E080E090E044E021E001E00E94072E2E
:106570009C0180E060E049E552E006E50E9445317B
:106580006091F3027091F40280E090E044E020E03A
:1065900000E00E94072E9C0188E060E04CE552E09C
:1065A0000E9445316091B3047091B40480E090E0A2
:1065B00044E021E001E00E94072E9C0180E061E0C0
:1065C0004FE552E001E40E9445312091FA023091FA
:1065D000FB022115310519F4C0E0D0E00FC040E006
:1065E00050E06091F6027091F7028091F80290916C
:1065F000F9020E94E73EE901232B21F4CC24DD249B
:10660000760138C0609174027091750280E090E06C
:106610002091F3023091F40240E050E0621B730BD2
:10662000840B950B24E230E040E050E00E94953E60
:106630009E0140E050E00E94093FC901DA016C016F
:106640007D0197FF03C0309521953F4F20513E407B
:106650008CF0B7FD07C0FFE0CF2EFEE0DF2EE12C6F
:10666000F12C08C0E1EFCE2EE1EFDE2EEFEFEE2EA3
:10667000EFEFFE2EBE0180E090E044E021E001E07B
:106680000E94072E9C0188E061E042E652E001E4AE
:106690000E94453180E062E00E9435268AE10E9436
:1066A000A825609178027091790280917A02909188
:1066B0007B0220EA3FE040E050E00E94E73ECA0152
:1066C000B9010E94592D88E062E00E94352685E6D6
:1066D00092E00E945926C701B6010E94592D0E94DE
:1066E0000F31DF91CF910F91FF90EF90DF90CF901E
:1066F00008952F923F924F925F926F927F928F9266
:106700009F92AF92BF92CF92DF92EF92FF920F9340
:106710001F93DF93CF93CDB7DEB728970FB6F894CA
:10672000DEBF0FBECDBF1C012B01FC016480758054
:1067300086809780FB0164817581868197810E94A4
:10674000603C20E836E948E15BE40E94C53B5B0120
:106750006C01C401B301A60195010E94F83A20E042
:1067600030E040E05FE30E94D53D29E33AEF4EE898
:106770005CE30E94D53D0E94C23B20E032E649ED39
:1067800057E40E94D53D7B018C01F201608171814B
:10679000828193810E94603C20E836E948E15BE415
:1067A0000E94C53B9B01AC01F10160817181828136
:1067B00093810E94F73A9B01AC01C801B7010E9486
:1067C000D53D1B012C01C401B301A60195010E9416
:1067D000F73A20E032E649ED57E40E94D53D5B01EF
:1067E0006C01C201B101A60195010E946B3B21EE33
:1067F0003EE245E652E40E94D53D20E030E044E32D
:1068000053E40E94F83A20E030E044EB53E40E9465
:10681000A23C7B018C0137014801C801B70120E08F
:1068200030E044EB53E40E94CA3D181654F4C8010A
:10683000B70120E030E044EB53E40E94F73A3B011B
:106840004C01C201B101A20191010E94D53D7B0121
:106850008C01C601B501A60195010E94D53D9B01A1
:10686000AC01C801B7010E94F83A0E943C3E69831E
:106870007A838B839C836D827E828F829886298126
:106880003A814B815C816D817E818F8198852896CC
:106890000FB6F894DEBF0FBECDBFCF91DF911F9131
:1068A0000F91FF90EF90DF90CF90BF90AF909F90AF
:1068B0008F907F906F905F904F903F902F900895B2
:1068C000EF92FF920F931F93DF93CF93CDB7DEB775
:1068D00028970FB6F894DEBF0FBECDBF88E994E0CD
:1068E00063E874E00E94793329833A834B835C83A5
:1068F0006D837E838F839887A0E9B4E0FE01319693
:1069000088E001900D928150E1F7E0909004F090C2
:106910009104009192041091930460918B04709102
:106920008C0480918D0490918E042091A804309164
:10693000A9044091AA045091AB04621B730B840B11
:10694000950B0E94603C20E030E04AE754E40E944E
:10695000C53BA80197010E946B3B21EE3EE245E654
:1069600052E40E94D53D0E942D3C7093B104609387
:10697000B004C801B70120E030E040E850E40E94D4
:10698000BE3B87FD0EC0C801B70120E030E040ECFF
:1069900050E40E94BE3B8823F4F48091ED028823EA
:1069A000D1F06091AC047091AD04882777FD80959B
:1069B000982F0E94603C6093940470939504809398
:1069C0009604909397041092B1041092B00481E061
:1069D0008093ED0202C01092ED026091AC047091C0
:1069E000AD04882777FD8095982F0E94603C9B011D
:1069F000AC016091940470919504809196049091FB
:106A000097040E94F73A20E030E044EB53E40E9400
:106A1000F83A20E030E044EB52E40E94F83A20E0FB
:106A200030E044EB53E40E94A23C9B01AC01CA015C
:106A3000B9010E942D3CCB017093AF046093AE046A
:106A400021E06936720734F0885691409093AF0484
:106A50008093AE048091B0049091B10497FF04C07C
:106A60001092B1041092B0048091B0049091B104DE
:106A7000853B910534F084EB90E09093B1048093D2
:106A8000B0048091AE049091AF04843B910594F0E2
:106A9000845B90409093AF048093AE0484EB90E0CD
:106AA0002091B0043091B104821B930B9093B104F8
:106AB0008093B0046091AE047091AF0480E00E94B6
:106AC0001A2A6091B0047091B10481E00E941A2AE0
:106AD00028960FB6F894DEBF0FBECDBFCF91DF91E1
:106AE0001F910F91FF90EF9008956F927F928F9278
:106AF0009F92AF92BF92CF92DF92EF92FF920F934D
:106B00001F930E945D2C882309F4CCC088E093E099
:106B100067E672E00E94C04069E672E00E94D040E1
:106B2000009709F0BFC080E090E067E672E00E9445
:106B3000C04080E090E067E672E00E94C0408C01B7
:106B400080E090E067E672E00E94C040BC01C801AE
:106B50000E94FF2F5B016C0180E090E067E672E02D
:106B60000E94C0408C0180E090E067E672E00E94E5
:106B7000C040BC01C8010E949B2F7B018C0180E0BA
:106B800090E067E672E00E94C040FC0180818033A3
:106B900009F488C080E090E067E672E00E94C0409F
:106BA0000E948A408093820480E090E067E672E071
:106BB0000E94C04080E090E067E672E00E94C04022
:106BC00043E050E060E070E00E94962D3B014C01F4
:106BD00060938B0470938C0480938D0490938E0447
:106BE000A0928704B0928804C0928904D0928A044B
:106BF000E0928304F0928404009385041093860449
:106C00008091A703882309F44BC0809182048630C9
:106C10000CF446C0C801B7010E94603C20E836E988
:106C200048E15BE40E94C53B60939804709399042B
:106C300080939A0490939B04C601B5010E94603C26
:106C400020E836E948E15BE40E94C53B60939C0480
:106C500070939D0480939E0490939F04E092A004FF
:106C6000F092A1040093A2041093A304A092A404A0
:106C7000B092A504C092A604D092A7046092A80482
:106C80007092A9048092AA049092AB041092AD0471
:106C90001092AC041092A70388E760EF0E94AE093F
:106CA0000E9460340E945F311F910F91FF90EF901E
:106CB000DF90CF90BF90AF909F908F907F906F901C
:106CC00008958F929F92AF92BF92CF92DF92EF92F0
:106CD000FF920F931F93DF93CF9300D0CDB7DEB712
:106CE0008091EC02882309F077C081E08093EC0268
:106CF000CE0101960E945230882309F469C0809128
:106D0000A703882309F462C089809A8023E430E0D5
:106D1000820E931EF40180812DEB3FEF820E931EB5
:106D200083FF56C0F401A78CB0A0C1A0D2A0C601B9
:106D3000B5010E94603C20E836E948E15BE40E942E
:106D4000C53B609398047093990480939A04909340
:106D50009B04F401E3A0F4A005A116A1C801B701AA
:106D60000E94603C20E836E948E15BE40E94C53BB4
:106D700060939C0470939D0480939E0490939F0461
:106D8000A092A004B092A104C092A204D092A30445
:106D9000E092A404F092A5040093A6041093A70423
:106DA000F40187A190A5A1A5B2A58093A804909312
:106DB000A904A093AA04B093AB0486AD97AD9093B9
:106DC000AD048093AC041092A70302C00E9460340B
:106DD0000E945F311092EC020F900F90CF91DF91E3
:106DE0001F910F91FF90EF90DF90CF90BF90AF90E9
:106DF0009F908F9008950F931F93CF93DF9385E01B
:106E00000E94E708A0E0B0E0209112013091130148
:106E100040E050E0BC01CD010E94953EB7E0969560
:106E2000879577956795BA95D1F7EB0186E00E9433
:106E3000E708A0E0B0E0209114013091150140E096
:106E400050E0BC01CD010E94953EA7E09695879544
:106E500077956795AA95D1F78091F2028823B1F4CE
:106E6000C617D70740F48091F0029091F102009785
:106E700011F101971CC080916F02680F711D6C1792
:106E80007D0750F581E08093F20226C06C177D07E4
:106E9000D0F40091F0021091F1020E949A28081794
:106EA000190748F48091F0029091F10201969093B5
:106EB000F1028093F0026091F0027091F10280E0A3
:106EC0000E946A2909C080916F02C80FD11DC617A0
:106ED000D70710F41092F202DF91CF911F910F911A
:106EE00008951F93CF93DF938091F502C82FD0E0D0
:106EF000CE0133E0880F991F3A95E1F78C0F9D1F63
:106F000084599F4F0E947C41109283022091780205
:106F10003091790240917A0250917B026217730797
:106F20008407950709F445C080918202882341F4C3
:106F30008091F3029091F40290937702809376020D
:106F4000CE0123E0880F991F2A95E1F78C0F9D1F32
:106F500089599F4F609173020E9492418091F5027E
:106F600019E0819FC001112460917602709177022F
:106F700086599F4F0E94A8418091F502819FC001D0
:106F80001124409178025091790260917A027091B7
:106F90007B0284599F4F0E94A04186EF92E060E6F9
:106FA00070E046E050E00E94884184E06EE10E947B
:106FB000AE09DF91CF911F910895EF92FF920F9349
:106FC0001F93DF93CF9300D000D000D0CDB7DEB7B2
:106FD0007C01FC0141AD4093B20480918202882380
:106FE00009F050C02EE430E0E20EF31EF70180817C
:106FF000918122EB3FEFE20EF31E079708F042C0AB
:10700000442309F43FC080917302481718F4409359
:10701000730238C0242F30E090E004968217930763
:107020008CF540937302109283021092F402109236
:10703000F302109277021092760210927802109268
:10704000790210927A0210927B020E9400268E0131
:107050000F5F1F4FC80169E471E00E94D9400E9490
:10706000221D89E491E0B8010E94D9408091490134
:10707000882319F40E94E91603C081E080939002EE
:107080000E94713781E0809383020091FA0210918F
:10709000FB0236E401351307E8F12091F602309146
:1070A000F7024091F8025091F902CA01B901F3E0E8
:1070B000660F771F881F991FFA95D1F7620F731F0C
:1070C000841F951F2AE030E040E050E00E94E73E38
:1070D0002093F6023093F7024093F8025093F9029E
:1070E000980140E050E0CA01B901E3E0660F771F64
:1070F000881F991FEA95D1F7620F731F841F951F90
:107100002AE030E040E050E00E94E73E3093FB028E
:107110002093FA028EE490E0E80EF91EF7016081F8
:10712000718122EB3FEFE20EF31E65307105C8F16D
:107130006550704080E090E02091710230E040E0C6
:1071400050E00E94953E24E630E040E050E00E948E
:10715000E73E8091700290E0820F931F9093B404F9
:107160008093B304A0E0B0E02091F6023091F702E2
:107170004091F8025091F902820F931FA41FB51F8E
:107180008093F6029093F702A093F802B093F9026D
:107190008091FA029091FB0201969093FB028093FA
:1071A000FA026091720270E080E090E0E0E5F0E0C9
:1071B000EE0EFF1EF7012081318140E050E00E9479
:1071C000953E24E630E040E050E00E94E73E8091AA
:1071D000760290917702820F931F9093F40280932E
:1071E000F30226960FB6F894DEBF0FBECDBFCF9147
:1071F000DF911F910F91FF90EF900895A0E3B0E011
:10720000E4E0F9E30C94243FA8E04E010894811CCB
:10721000911CF401BA2F1192BA95E9F729833A83A8
:107220004B835C836D837E838F839887CE01099621
:10723000FC011192AA95E9F7A986BA86CB86DC866D
:10724000ED86FE860F87188B29813A814B815C8100
:107250002DA73EA74FA758AB79018A018FEF9FEF6B
:10726000A0E0B0E0E822F9220A231B231A014424FB
:10727000552429853A854B855C8529A73AA74BA7D4
:107280005CA759016A01A822B922CA22DB223A016D
:1072900088249924C601B501A80197010E94953E52
:1072A0006DA37EA38FA398A7C401B3010E94953E4E
:1072B00069A37AA38BA39CA3C601B501A201910186
:1072C0000E94953E7B018C01C401B3010E94953E52
:1072D0005B016C0189A19AA1ABA1BCA18E0D9F1D80
:1072E000A01FB11F89A39AA3ABA3BCA32DA13EA14C
:1072F0004FA158A5CA01AA27BB2729A13AA14BA192
:107300005CA1280F391F4A1F5B1F29A33AA34BA377
:107310005CA32E153F054007510740F480E090E044
:10732000A1E0B0E0A80EB91ECA1EDB1E89A19AA179
:10733000ABA1BCA19D01442755272A0D3B1D4C1D27
:107340005D1D2D8F3E8F4F8F58A36C01BB24AA2447
:107350008DA19EA1AFA1B8A5A070B070A80EB91E56
:10736000CA1EDB1EA98EBA8ECB8EDC8E9A8C8B8CBD
:107370007C8C9E8D6F8D78A1FE01719688E0DF0177
:107380001D928A95E9F72D8B9E8B6F8B788F2D85BB
:107390003E854F8558896DA57EA58FA598A90E9429
:1073A000953E7B018C012D813E814F81588569A5D9
:1073B0007AA58BA59CA50E94953EE60EF71E081F98
:1073C000191F6D897E898F89988D6E0D7F1D801F95
:1073D000911F6D8B7E8B8F8B988FEE892A2D392D87
:1073E000482D572D7E2F8F89988DE096E2E10C94E1
:1073F000403FEF92FF920F93DF93CF93CDB7DEB76D
:1074000060970FB6F894DEBF0FBECDBFA82F002344
:1074100009F461C07E010894E11CF11C88E0F701C9
:1074200011928A95E9F729833A834B835C836D83B4
:107430007E83AF83988780E2801BE82FFF27E7FDDC
:10744000F0954D815E816F817885181684F01D86D8
:107450001E861F86188A882799278E1B9F0B04C0BB
:1074600076956795579547958A95D2F728C0202F2E
:10747000332727FD3095DB01CA01022E04C0B695E3
:10748000A795979587950A94D2F78D879E87AF87A2
:10749000B88B04C0440F551F661F771FEA95D2F7BB
:1074A00089819A81AB81BC8104C0B695A7959795D7
:1074B00087952A95D2F7482B592B6A2B7B2B498726
:1074C0005A876B877C8729853A854B855C856D85D6
:1074D0007E85AF8598898A2F60960FB6F894DEBFB7
:1074E0000FBECDBFCF91DF910F91FF90EF90089528
:1074F000EF92FF920F93DF93CF93CDB7DEB76097F4
:107500000FB6F894DEBF0FBECDBFA82F002309F43D
:1075100061C07E010894E11CF11C88E0F701119222
:107520008A95E9F729833A834B835C836D837E8355
:10753000AF83988780E2801BE82FFF27E7FDF09557
:1075400049815A816B817C81181684F019861A86CC
:107550001B861C86882799278E1B9F0B04C0440F0F
:10756000551F661F771F8A95D2F728C0202F332713
:1075700027FD3095DB01CA01022E04C0880F991F38
:10758000AA1FBB1F0A94D2F789879A87AB87BC874B
:1075900004C07695679557954795EA95D2F78D8102
:1075A0009E81AF81B88504C0880F991FAA1FBB1F99
:1075B0002A95D2F7482B592B6A2B7B2B4D875E8758
:1075C0006F87788B29853A854B855C856D857E85AF
:1075D000AF8598898A2F60960FB6F894DEBF0FBEEC
:1075E000CDBFCF91DF910F91FF90EF90089550584C
:1075F000BB27AA270ED083C24CD230F051D220F044
:1076000031F49F3F11F41EF41CC20EF4E095E7FB29
:1076100004C2E92F96D280F3BA1762077307840772
:10762000950718F071F49EF5AEC20EF4E0950B2E9E
:10763000BA2FA02D0B01B90190010C01CA01A001C4
:107640001124FF27591B99F0593F50F4503E68F11F
:107650001A16F040A22F232F342F4427585FF3CF60
:10766000469537952795A795F0405395C9F77EF431
:107670001F16BA0B620B730B840BBAF09150A1F07A
:10768000FF0FBB1F661F771F881FC2F70EC0BA0F00
:10769000621F731F841F48F4879577956795B79588
:1076A000F7959E3F08F0B3CF9395880F08F0992780
:1076B000EE0F979587950895ECD158F080E891E00A
:1076C00009F49EEFEDD128F040E851E059F45EEF67
:1076D00009C0B7C158C2E92FE07833D268F3092E48
:1076E000052AC1F3261737074807590738F00E2E29
:1076F00007F8E02569F0E025E0640AC0EF6307F8C9
:10770000009407FADB01B9019D01DC01CA01AD015A
:10771000EF934AD0F4D10AD05F91552331F02BED8D
:107720003FE049E450FD49EC63CF0895DF93DD2746
:10773000B92FBF7740E85FE31616170648075B07C7
:1077400010F4D92F2BD29F938F937F936F93D2D224
:10775000E0E7F0E079D1D3D12F913F914F915F9144
:1077600030D2DD2349F09058A2EA2AED3FE049ECFF
:107770005FE3D0785D274DDFDF91C1C12AD108F4E6
:1077800081E0089595D1E395CBC10CD0B8C188D1E3
:1077900040F07FD130F021F45F3F19F03EC151112C
:1077A000F3C14FC1CED198F39923C9F35523B1F357
:1077B000951B550BBB27AA2762177307840738F060
:1077C0009F5F5F4F220F331F441FAA1FA9F333D0BF
:1077D0000E2E3AF0E0E830D091505040E695001C73
:1077E000CAF729D0FE2F27D0660F771F881FBB1F2F
:1077F000261737074807AB07B0E809F0BB0B802D09
:10780000BF01FF2793585F4F2AF09E3F510568F054
:1078100004C1BAC15F3FECF3983EDCF386957795DF
:107820006795B795F7959F5FC9F7880F911D969556
:10783000879597F90895E1E0660F771F881FBB1FB2
:10784000621773078407BA0720F0621B730B840B5F
:10785000BA0BEE1F88F7E095089504D06894B11133
:1078600093C1089576D188F09F5790F0B92F99274A
:10787000B751A0F0D1F0660F771F881F991F1AF03B
:10788000BA95C9F712C0B13081F07DD1B1E0089549
:107890007AC1672F782F8827B85F39F0B93FCCF3CA
:1078A000869577956795B395D9F73EF49095809531
:1078B000709561957F4F8F4F9F4F0895E89409C051
:1078C00097FB3EF490958095709561957F4F8F4F13
:1078D0009F4F9923A9F0F92F96E9BB279395F69529
:1078E000879577956795B795F111F8CFFAF4BB0FA7
:1078F00011F460FF1BC06F5F7F4F8F4F9F4F16C00B
:10790000882311F096E911C0772321F09EE8872F94
:10791000762F05C0662371F096E8862F70E060E050
:107920002AF09A95660F771F881FDAF7880F9695C9
:10793000879597F90895ADD018F011F0B1D038F4CB
:1079400080C022C1E92FFDD0B0F35523C9F3E7FB76
:107950006217730784079507A8F199F3E92FFF27AA
:1079600088232AF03197660F771F881FDAF7952F43
:107970005527442332F091505040220F331F441FAB
:10798000D2F7BB27E91BF50B621B730B840BB10904
:10799000C1F222F4620F731F841FB11D31972AF0C8
:1079A000660F771F881FBB1FEFCF915050405AF0D2
:1079B00041F0882332F0660F771F881F91505040A6
:1079C000C1F7939530C08695779567959F5FD9F7F6
:1079D000F8CF990F0008550FAA0BE0E8FEEF161636
:1079E0001706E807F907C0F012161306E407F507B3
:1079F00098F0621B730B840B950B39F40A2661F027
:107A0000232B242B252B21F408950A2609F4A140C9
:107A1000A6958FEF811D811D089597F99F6780E8D6
:107A200070E060E008959F3F31F0915020F4879519
:107A300077956795B795880F911D9695879597F9D6
:107A400008959FEF80EC0895DF93CF931F930F93DA
:107A5000FF92EF92DF927B018C01689405C0DA2ED1
:107A6000EF01AFD0FE01E894A591259135914591A4
:107A70005591AEF3EF01CDDDFE019701A801DA9437
:107A800079F7DF90EF90FF900F911F91CF91DF91E9
:107A9000089500240A941616170618060906089574
:107AA00000240A9412161306140605060895C9CF79
:107AB00050D0E8F3E894E0E0BB279F57F0F02AEDC0
:107AC0003FE049EC06C0EE0FBB0F661F771F881F13
:107AD00028F0B23A62077307840728F0B25A620BA3
:107AE000730B840BE3959A9572F7803830F49A956E
:107AF000BB0F661F771F881FD2F7904896CF092EBD
:107B00000394000C11F4882352F0BB0F40F4BF2BF8
:107B100011F460FF04C06F5F7F4F8F4F9F4F089538
:107B2000EF93E0FF06C0A2EA2AED3FE049EC5FEBED
:107B300070DDE5DF0F90039401FC9058EDE9F0E073
:107B4000E3C057FD9058440F551F59F05F3F71F047
:107B50004795880F97FB991F61F09F3F79F08795B4
:107B60000895121613061406551FF2CF4695F1DF3D
:107B700008C0161617061806991FF1CF86957105CD
:107B8000610508940895E894BB2766277727CB0101
:107B900097F908951EDF08F48FEF08959B01AC015B
:107BA00060E070E080E89FE3F0CD0BD0A8CF71DFFC
:107BB00028F076DF18F0952309F02FCF42CF11245B
:107BC000E3CFBFDFA0F3959FD1F3950F50E0551F92
:107BD000629FF001729FBB27F00DB11D639FAA2722
:107BE000F00DB11DAA1F649F6627B00DA11D661F71
:107BF000829F2227B00DA11D621F739FB00DA11D92
:107C0000621F839FA00D611D221F749F3327A00D4B
:107C1000611D231F849F600D211D822F762F6A2FE7
:107C200011249F5750408AF0E1F088234AF0EE0F6C
:107C3000FF1FBB1F661F771F881F91505040A9F779
:107C40009E3F510570F0E9CE9FCF5F3FECF3983E29
:107C5000DCF3869577956795B795F795E7959F5FE0
:107C6000C1F7FE2B880F911D9695879597F908957A
:107C700011F40EF4E6CED7CE6CDFD0F39923D9F30E
:107C8000CEF39F57550B87FF38D00024A0E640EA7B
:107C9000900180585695979528F4805C660F771F61
:107CA000881F20F026173707480730F4621B730B34
:107CB000840B202931294A2BA69517940794202557
:107CC00031254A2758F7660F771F881F20F026179F
:107CD0003707480730F4620B730B840B200D311DFE
:107CE000411DA09581F7B901842F9158880F969571
:107CF000879508959B01AC0158CF91505040660F75
:107D0000771F881FD2F708959F938F937F936F9368
:107D1000FF93EF939B01AC0148DFEF91FF9194DE5D
:107D20002F913F914F915F9140CF629FD001739F00
:107D3000F001829FE00DF11D649FE00DF11D929F07
:107D4000F00D839FF00D749FF00D659FF00D992746
:107D5000729FB00DE11DF91F639FB00DE11DF91F6A
:107D6000BD01CF0111240895991B79E004C0991F2A
:107D7000961708F0961B881F7A95C9F78095089585
:107D8000AA1BBB1B51E107C0AA1FBB1FA617B70741
:107D900010F0A61BB70B881F991F5A95A9F780955D
:107DA0009095BC01CD01089597FB092E07260AD0B6
:107DB00077FD04D0E5DF06D000201AF470956195B8
:107DC0007F4F0895F6F7909581959F4F0895A1E212
:107DD0001A2EAA1BBB1BFD010DC0AA1FBB1FEE1F45
:107DE000FF1FA217B307E407F50720F0A21BB30B90
:107DF000E40BF50B661F771F881F991F1A9469F70C
:107E000060957095809590959B01AC01BD01CF0167
:107E1000089597FB092E05260ED057FD04D0D7DF15
:107E20000AD0001C38F450954095309521953F4F6D
:107E30004F4F5F4F0895F6F7909580957095619537
:107E40007F4F8F4F9F4F08952F923F924F925F9297
:107E50006F927F928F929F92AF92BF92CF92DF925A
:107E6000EF92FF920F931F93CF93DF93CDB7DEB7BF
:107E7000CA1BDB0B0FB6F894DEBF0FBECDBF099453
:107E80002A88398848885F846E847D848C849B84AA
:107E9000AA84B984C884DF80EE80FD800C811B81B8
:107EA000AA81B981CE0FD11D0FB6F894DEBF0FBEE7
:107EB000CDBFED0108952F923F925F926F927F9216
:107EC0008F929F92AF92BF92CF92DF92EF92FF92EA
:107ED0000F931F93CF93DF938C011B01EA01611570
:107EE000710519F0FB0191838083209749F0CE0141
:107EF0000297839728F020E030E040E050E0F6C0A1
:107F0000F801A1908F018A2D90E00E94A840892B52
:107F1000B9F7FDE2AF1631F4F801A1908F015524B5
:107F2000539407C0FBE2AF1619F4F801A1908F013A
:107F30005524209719F0C031D105C1F4F0E3AF16F4
:107F400079F4F8018081883711F0883549F4F80117
:107F5000A1800E5F1F4FF2E05F2AC0E1D0E006C0B3
:107F6000209721F480E3A816E9F427C0C830D10592
:107F700031F1C930D10524F4C230D10531F50CC03E
:107F8000CA30D10589F0C031D105F9F4C12CD12C0A
:107F9000E12CB8E0FB2E28C0C12CD12CE12CA0E4B0
:107FA000FA2E22C0CAE0D0E0FCECCF2EFCECDF2E93
:107FB000FCECEF2EFCE0FF2E17C0C8E0D0E0C12C97
:107FC000D12CE12CE0E1FE2E0FC09E01442737FDAD
:107FD0004095542F60E070E080E090E80E94E73E1A
:107FE000C901DA016C017D0120E030E040E050E0A1
:107FF00060E03E01882477FC8094982C70EDB72EC9
:10800000BA0CE9E0EB1570F48A2D81548A3118F42A
:1080100099ECB92E06C08A2D81568A3150F589EA2D
:10802000B82EBA0C8B2D90E08C179D0714F56F3F7E
:10803000E1F0C216D306E406F506B0F0CA01B901B4
:10804000A40193010E94953E9B01AC012B0D311DB3
:10805000411D511D2130F0E03F07F0E04F07F0E8EF
:108060005F0710F461E001C06FEFF801A1908F018C
:10807000C5CF2114310481F0662331F00150104046
:10808000F1011183008308C051FE1AC00250104054
:10809000F1011183008314C067FF12C050FC05C0BA
:1080A0002FEF3FEF4FEF5FE704C020E030E040E00C
:1080B00050E882E290E09093B6048093B50416C035
:1080C00050FE08C050954095309521953F4F4F4F39
:1080D0005F4F0CC057FF0AC082E290E09093B60455
:1080E0008093B5042FEF3FEF4FEF5FE7B901CA016F
:1080F000DF91CF911F910F91FF90EF90DF90CF9084
:10810000BF90AF909F908F907F906F905F903F90C7
:108110002F900895FC0188279927E8942191203217
:10812000E9F3293010F02E30C8F32B3241F02D3214
:1081300039F4689404C00E945C41820F911D219122
:1081400020532A30C0F31EF4909581959F4F0895D7
:10815000911103C1803219F089508550D0F70895EC
:10816000FB01DC018D91059080190110D9F3990B69
:108170000895FB01DC0105900D920020E1F70895C0
:108180004CEF52E00E94E0400895FB01DC010D90AD
:108190000020E9F7119701900D920020E1F7089572
:1081A000FB01DC018D91019080190110D9F3990B2D
:1081B0000895FB01DC0101900D920020E1F7089584
:1081C000FA01A191B081009719F41097E1F0CD0167
:1081D000DC01CD010D90002011F4C00113C0FB01A2
:1081E0002191222319F02015D9F7F3CFFB0121911A
:1081F000201519F41E92119606C02223C1F70D9086
:108200000020A1F7D001FA01A193B0830895FB01EA
:108210009F01E8944230C4F04532B4F44A3029F466
:1082200097FB1EF4909581959F4F642F77270E94AE
:10823000C03E805D8A330CF0895D8193CB0100974D
:10824000A1F716F45DE251931082C9010C94B0417C
:10825000FA01CF93FF93EF93223044F1253234F5A6
:10826000C22FE894CA3049F497FB3EF4909580956C
:10827000709561957F4F8F4F9F4F2C2F3327442749
:108280005527FF93EF930E94E73EEF91FF91605DCA
:108290006A330CF0695D6193B901CA0160507040A6
:1082A0008040904051F716F4CDE2C19310828F9137
:1082B0009F91CF910C94B0417AE0979F902D879F2A
:1082C000802D910D11240895DC01CB01FC01F99959
:1082D000FECF06C0F2BDE1BDF89A319600B40D9212
:1082E00041505040B8F70895F999FECF92BD81BD35
:1082F000F89A992780B50895A6E1B0E044E050E0EF
:108300000C946641A8E1B0E042E050E00C94664174
:10831000DC01CB0103C02D910E949341415050409C
:10832000D0F70895262FF999FECF1FBA92BD81BDCF
:1083300020BD0FB6F894FA9AF99A0FBE01960895E7
:10834000242F0E949341252F0E9493410C94A84111
:108350000E949241272F0C949341992788270895D2
:10836000DC01FC01672F71917723E1F7329704C09C
:108370007C916D9370836291AE17BF07C8F3089527
:04838000F894FFCF9F
:108384003A2000312E3331001F55C00301FECC01C9
:108394004B0080008000002D002D007F00002D0088
:1083A4002D007F0014010A056D4168007320006DE3
:1083B40073003A20004D487A002020002D00560A10
:1083C400310A320030002A2000300000000000058D
:1083D400043F404142440504191A1B1C1D030416A2
:1083E40017180504353031323304042E2F522D046E
:1083F40004292A2B2C040425262728030424535457
:10840400010203030448084909040506070023552B
:108414004B1438003E365639573A4C4D4A353734AA
:1084240030003537363000353738300035383030A5
:1084340000353832300035383430003538363000C5
:108444009D01A201A701AC01B101B601BB01E80382
:10845400D3001A00FF0000014C036800FF03400032
:1084640000006400000064006600980000009001B1
:10847400000090019B0163024A00A00075002901DD
:108484008102D5010100010206EA030123636F3F63
:108494005D3D3D45480D004469723A004469733AB4
:1084A400004265613A00416C743A0050616E3A00D2
:1084B40054696C3A00614C6F6E3A00614C61743AD5
:1084C4000061416C743A00684C6F6E3A00684C610C
:1084D400743A0068416C743A00553A00573A0049BE
:1084E4003A00EE3A0052002C00475047474100281A
:0C84F400085050FFC40900000000000008
:00000001FF
/NGVideo5_8/tags/V1.31/Hexfiles
Property changes:
Added: bugtraq:number
+true
\ No newline at end of property
/NGVideo5_8/tags/V1.31/KurzanleitungFW.pdf
0,0 → 1,1928
%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œÕ]ýÝÆu…íÚÚ] rlIVlí±«÷d-Íá7µŠ*)ÚübcÛ´±ûS‚¤(bIþ 3$gæÌ̹òí“Û&@BqùÈáÌý8÷Ü;—º. U]—æ¿öà·ß]}þuý‡¿\M§¯¿þårðç?\ýéj(jóŸéÿö»ë¸Õ?®õmnUã86jú›ºn»¢k®ë¡èÊRÿù»«ÃkÇÛÿ¾ªô™ªR×7ÓÃowõÍáõcU ªQ¾Âœnº¶W‡1ÇÕضCkÏ÷]Yé«ÿóöŸ¯^Þ^}¥‡VuUuݨ²èºáú;óÏÖýóó?«±óÿ¬àŸÿuõëëïO~½Z5Ëû5¾ß4°¯6ÜV•ô¾ýt[}Kóú®ß>:ª¢oª±?\ë¢ú±>¼áŽ~t¼QEٍúϗǛÊ<¨­ïϓ׌}sxëxÓªšñp™Ç~¬5ÌoóûS8Ç÷§y÷Ó¡ôºëÛ_]éyªÏ빝ÿPcWՍ~½ºó¤À¯š¢l†zþã7åÞí%ŒGÿ¦{Ó×`ðoÃÀ–+êʼ© ¼ø§ætݵm{øÒ=/hÝهóVúäƒI*õ(‚‡éŸiñRmÝ> cî¥Ì͆áðxúóкW›~tÏ?ÌÿNâøÝ£p…´¤T0²ª=üã±*‹f,;#úd]ªöðí÷NÍàønÜ—p֏ý38 Sý¦»àIt¾¢oÇ`¼ö} ëø<¼I8óFþª¾*ÊAYùywšmÕ·‡³”÷Uxê_;ê·o”V°Ãµ¹—ÖÕ60dÿÎþ_­'~*í¥Á~
+ïƒïöîñF[¼®ß5‹”˜qƒÄm”sAr²Sð*øøoÿ|¼éŠ^ ²y¾>Ô³1ÀµËÚÚü¬jK3É7v–o´’óL':bÌL¢#“ʢ܂œ<
+ÕÈ]òá<ª¡9°÷/Ú|—u‰*óàxÓj¬œ,š“ÝÑû‚p]òÅýà8êé*ë
+¾¥ X~ îû“·‹i‹6tVþÞÁ—ϝšXÉ1Ñ
+d²&€j÷Ü2qé1^†ZŸíBß˜Í у”OIƒ
+‚Ó½ðÏ` ŸÅ­k&ìµpa™F{9‹%NrÜË
+ Î󆈺…í# ƒCNÁˆ
+Ž!0”.¡Ù ïþ¡ë†ãNqِ=u¶c‘°ïQ¨¡ó©×Ýq!¤Äf
+ð ý4`zè8NW}ê€0jTC·“ô Ÿ&ìÞ½*#ͬÍSJïß(ȝ±£0]·ª©La€5~èo¸#häöí÷G-EYŽQ˵±¨”ª=×¹6æÛ³öÛt³5f»ö¯¶€î’VnfìxW[DñAÀ6`µ^ؙµµmV§µ6¬àö‰Ì°N«¡4Öa㟓¶çúM ÉØ|Ý-ÒÂÞ2Ø7ÏîR‰^šŽu`­fJÃéEÛø ªg ½Ãö$šâ±L:šWøu(Ŗ¬ö‹%^d`3xÂxÅF<‘üŠ¤öaþí X2™whJÁ|þ{nÜÏ
+YœL?7!±«É
+toàûʹÞQm£%ãP¥Í
+Ÿ­|¤¢˜
+é:Zz*ë£{ڎŒlE„ œ¹ƒ‹s„·ž«ügŒÈS A7'دp©±‹ ‚ågÛLü8ŽUê[†Œ ß¯íá4`ìLÐLªÔËw8LÑüM¸‘¾MÂv™ø{G]Ò@™ºÏ´¹þMRš!%K½ Û³á<ՉÕnÊÔHçèÅ-h;Àúæۖϲ*ÆÑ¥ÛDÞ¾?¯ÑÝSÌ˛²<Åæ
+c°ÁÃþ4Íä?yօß‚àîS¯šwfîçžaó `Æ4q6rـ}¼ÏôV‚Ä$¾\`*g2úý¬ –‚mú
+?lµÅCŖ_JΩõnŸ<¢¦qóZÅéÜÝ°‚<`ULÈþ‚|R±]¾¿zcgš' 0>vG>Cq³Ag7~âݞ]—IÐÏ-ǖÖ֌ÀûºXȗFn/JÀûãIU|×.‘ÓNÎ ä
+¾¥¢à¹lzÔÃp››HYÙ$­x~+)M¦dÜöìTÔå_n™ò#J›òŠ ßÂBRšÚÚÛ2ótA›A&¡JÄΓV˜Q‚2Ÿ«”,‘¯”ž}Ã. tù„0îWûšäÑñ1/€lSšï15MTëWk.õåͯ6gTӍÅà¥Ö–UϤ¿³ÔÞ.ŠLðC™fjm5CÁ“ü3µ?•ïÉû§åzùéÇVÊ|åv8TGeÎvyëÈٜõˆ-ªtÌy~>n©Bk•˜ÊéX•Y…Ú÷wœÏÙÏ«²x Ï=$фBæÌ^&ºë)ß5ò\1~ø!T‘ˆpšûWP! †Fރ$Ô:ÛÇ+x³Y®ÔZ­0l<=7Û«Û¡>5Rù·µ`ú’JÞ]íœ8åÀÚøK@`W…3P
+ªâfú˜¥af˜· XV7×6,íúÔ;R·õÛ\Ç&Aƒ¦äS¼Ø I¹+¥îb´+̹[Ô½òo£lh¥Š€“"6ÊVFà‘¹€àk©i6DP%‰²Û,ó¥ÁïOŒ´Õ}ešfÎyxe²Š«˜4±YÿªVDH"U€•}ʗÓü0úýš˜ÎQe«rîåG» ß¶/FUùÄ |H‹]„ÉAðæ>½4c®¶«VYúz¬q“ZÁ­"fÁïm¨þó8æ¹6‡nÎá<ÂS'Â;Ðäv"æãóWnƒÞ‹míÿNÍSf†3·Ö²
+‚l%õÍûéü¤à)Þv%»¶0Î+oØܘ ·•/4*ùØú?GàCQ·Cjƒ¸•“Òe[Ç`›Ø18›ËˆåÊ1`UÒB¹ ?h/՝«Pî7±xs~ËhnŸÈXN7¤¶H9ïHÙ,ê¢áäÏ°5NZ\9;õøâÐlS! ê϶íÍ…Ø ‰Ðæ—ëùûáډHæwúã×ÚOùÖ~³lΝí¬löÚUU\ BüDZ8ýÏËÛ«¯ôÿdÉûendstream
+endobj
+30 0 obj
+5883
+endobj
+36 0 obj
+<</Length 37 0 R/Filter /FlateDecode>>
+stream
+kãömœÄÅ«^­4ô>¯é¼H¦™ŸþÁÌ]ÿ—õœÞ{º¸¿Ø­Ö©Å•øê °É«qäçi‹w“ð߉O=[,élZGâ_¬ü’…r4­M]ÑXah̋8üAÓ1Z]©Z’RÿÅ8€_Ù*Šårš€ŽRTuãh½p‰Ý€Wú)”"1³oƒÕރ§øå<{µ\5U+DËOv©{—QMÿ³5:3÷´XÖ¥t‰c÷Grò³Ñ ¤ôÒùÄÝŠÖÀ•î¯,`Ïçƒ&µ´l¯IÒJRϖ¬2 Ô¼օ·ïÃ5Þ?HÃøÝôÒ£‘x.d½ŽŒ&îDuÝ†ë“1Œ®M’$ÈK>ýž-‡tNé•Öѹ×ÊÔUݒ,æáçÖÕž>†•Ü• s)C¶Ž «—¡¬Ì^+MíÏf5Ϊ³k@`¡IïŽèú•cØµ iàHIoGP¡ŒÉÎ*³ãA$h"c­õ&R°Ó xÈÕKj½x,9Ù×Àt„cÓ¯0ۍôü||+oç c×〹’ªÅbo¬gÓ›nEÇy‚ÆÔÑî&ãwKòÀ5í °áÑrE¬¥Ñ[ì57pÎH˜‘slþ¾µ0ÌqÍtâõ»¾ôC®Òî¤òKú‰A%lï½@>.¼…“oéD¬…ËE<¿Qd\zãí EéÜ LZÐBw²€’ôȬ| p-ÖÇ`nhzßÀhf‹Ù}?¾Ž3ÞMä¹é֡֞ZƒŽx½Ï؏/ÑaFðC~‘0.Ùr²ïÑ#
+UœÙ³Dm6Ýݖ<y–ÎPG½CQøÐZã
+»"'N; ³2Dz™†|Æ^š(GîêK
+—§0íùq7.—ŃûQ‡«®­È\=Q¿0 bÕÒÔI¡[ÏØlÓÑ·¶V珣º¶U“):úC.{wÈ:¹-ò®£˜p=ѓNªD zN_ë<Qjo<9À«#@)„DØÞ>Üæf‹
+¦s?!GŸOЄºMù„³Fà ?æð¢€7¬g.6N¤çª‰¤Iæ懝#=z“5aˆåëÿ'øþû ¾_¤ ™Ï ‚Û’CæYk¡ˆô}–W >Á÷ƒ‘ONéóÏ«Ik+ÿP0>±Vê͹Źj>l`M“­j°D£Šøúü¿óWù%ö’Çøé•E”në,´Ÿ]Q|§ØèL¼¯«§ô…„e ™ÖÍA{¢’•Y{⽔؛ôp…@¬tóAŠèS##Œdt€¿äÄG
+8칂®t£³pÀÕ¤Ž,DàTòYfÙ'èET&øA–ªŒöÉó6"‚eҞÛCßq>™^2ök›R-;4¶·,EEñ~^³î YŠNËXÀÆ烎ÜQ„)ʈ1½~lQxE<€¼^×ø©u¦
+‚åk\ÄÂg Žráv½ÜU³PiØäRú%¹”¡kb·¢´LJ
+;•Åº¬ nÚ ¡6$.\-t®³ƒ5M«lÂÚǜn
+žºi»Œ¢!‚#háMiŠU3¸Ò{ Ë»µms±Ã4¾EÔ*\jy+ø†s‰åvã‰ÞêضÄ÷-\
+p¹™⠚Í}¸_^ ;9=´$Jƒs_ᆎ2o2ËaL€Ï0AwöƎè¦Friԍm>ç!:¢êqA®°LGoûÍɨÉkoóç9¸ç­?ÒHÍõáö·¹ëršþE‘Äldy±i9ï×K, ”¨ÌÞ$¢;ÆÙéÛ r(+Wé…[€ÅBç‰OHQ<bóp„ë0+8Ÿ¾‘aØÎZõ3Zj`ýé+‡ôÆó7÷5â÷ùÍ-jäg-#°™“d^C‚Ö‡*=·k´l€1A“ÒQA§
+Ÿ -y ¾Mð·Ë¶$BŸóÀ’0æ
+ùÃéҗäÕØ̒çB…o‚vdj)›‹´ æ©0$à¥%M(4Ý惶É9›ÅXû>M’zX"jr)IߥÖ¸ë£4Ù¸+h*
+ùÜX€.þŸ4Â!h‡Yâ•WÅDÈ5.=ÊÏ?¨„OŽN–ÉÞ [÷òÍÝÈò9r)<r4Ù76ÛwýóÑ.œõt~-=Vèiy2ûpDˆìendstream
+endobj
+37 0 obj
+3557
+endobj
+44 0 obj
+<</Length 45 0 R/Filter /FlateDecode>>
+stream
+FT|o9ãQ‹èóçlI1¥ðJÙq ñ¸2£¢ù>“ãR¡*ÿÜã ´Rcµ±¸íqYˆáþÐy²æp  &>«Zæ•3#ó^#_¡õ멁=“U˜øäF+y ¡K#ßßÂ)õ0Q/ }¿¿l¥¡¥ áZ›(™ %×ëU' CA;¥<q-ô'Ê%C90@*”@>Á‘qÞ@B—„æó:CŠ¾\ph9-ëÁ7ÕT®Êéy˜ÓAž•È·¶¼VJ¡šó¶/\ÆQ£V
+6±q¹GœGãQºu€øbŸúrj7[N#o·çlqò`§>ªfa”üH³™Dû<]ÃÌæZx©>ÜËõ!èñð<
+6“Fᙉòƒ{9s1«ƒŠ*=5
+•bm9*‘ÆûWÖåX'•‹ã,7ðP¶ò–ÚtžãÑ(Šg¦;÷Á˄sk ½âŽŠ­çìÍwƳ×Í!:~-ìåP/ZÓ"Èײ)ó
+33ÎôŸòƒ%:SÍ´†eÈLl’ÇfÊ­~.ڗY‹Aa3M2Ûû蚘<&!> ³ZÀl£cšr–‚Yã÷döØqê~HܝVßÑÐ2t.‡¾…¿¬PHš!½ãôê„.7|èçôüÖÒ°ÌÚË^›½»©»ò±ÉÚÎÂsz4j‚Û¾Ÿ­íZëCÐâZ]êžåÌÉ=eáLë˜Ælhå}é&ô1¯‰â  (›zˆo"×ȼâ`Wî‹õ¹bŸ¢5Å)2Kx‘¯å
+õrZSäh;I© ªÒðŒeåAºþøh?… 'Ä<0¥ Y^¢âd€.NÛԁ›#Z ǚÏr&ݕ£ýÌs¶Ç¤a5‹fUôMÍ¢[ÅeÎÈÅ0aBüÜñ„éའ‹Û.àé'™0(€"&O}^"”(–4¼e>¸õՙ˜eÆAÕž¿—?ϟTÿüJFendstream
+endobj
+45 0 obj
+1479
+endobj
+49 0 obj
+<</Length 50 0 R/Filter /FlateDecode>>
+stream
+xœí][¯µVHÂ999
+…Ü
+ôãè÷6<¿¾ë³¶È+â6A5t¤a뫑/;x#XÅ·dßyVåf*j¯¯Q›]"õ6þݸ‰mÙBo’„~Xûrût§ËM.j]œÚ~OÙœ²Ø4÷ª‹¦´‹2´V»—UMUۏ–-›*kÚÆc¡¡íñNdy+šv»é-ZùÙ»}“‰¢­¹¿²mŸ×¢tZX B¸l¿ÃÝ»3 Xç¹P„*Šörڒ=„…ÇŒ j^¹³+ë|©Fùè¥ÈÔU1NnìÅ
+í<´ðf·ðˆŸT&Á4Åüj9ì‘}DÛtM§å”f/üŽ
+c‚Ò½ÞF@€Úˆ{À‚€tõ»Þ¾2·ÌVµÛ?ìä“èF›V=IçbB˜jr$”ć@û„ȇÕÈH[¶ŒPïöÒ½iä:ÐàWŸBoèáTŒ„Y8Ô¸U½5o)ϪôZZ¤#D­Ûzàúøý‰zە…@_Qü9]˜@ª-a´+ٍà{Ö~
+P÷Ž…ÈǶäÐ¥-jŒù¨ÿ÷ÀB­ð]¥@Áý¾8ÖÌÂÕÔÌø°Ra<!â,XV˜2Ôr·ˆ?¿’ UÖBl_5âúڼӁûö†»Æ£ÍQƒY!|8š¾a¹œš¹PNP¨CcY ¦‹Ó³6©¤ÚÏ#Hæ
+=÷²j[wEÕw:P"µW?T™Þ¤{0«‹{>V~†M”TÉuŒ„Ú!Øc_²ÀԑÍZùÐß41J‚`XÓIÞDeM+XIú ©C ÑÇ5÷·¹2'Y‘6üò†]ܘ+Ï&uÝ®I}Pü机%Y˜­œA~ohÑåe«k0=G†Eï|‡N1ª†½ÁÚ´Yßw(øRxâÎ]H«åæ™tázÏtÚ
+ø,Y3SÚkrœ{ï;=FI¡< -þY‘öãŒçˆÞ™>m ì ³{“:7@É/'Î!t3ÖíöÃ]¡ÂŒy1U´íõê‚xZ×½+pܓu º›ÆÁns{D9|I”
+G°m°
+cÃtfgþŠ1‘h¤ÃÁFŒn#qÎύ™ÛÓ<.ÓZA°~͹,Za µñ¢Œ„¶pZ“G¸Ãξ£Fˋ¤ÓJ ™% ²ÿقQ‡N"¤i›xšœÆ“ÑCkq]‘S!tAâ‚ÃoÔJ[±L%÷#I.lò׈-ñwÙa-wÉÑ¥YWuð=I­‰‚ÿ%gMX ä:¬5y@&´_½¼UÌ~Õ®ƒô`Ç]Ãô£¤¶l{`Žê°ÓÁ‘ÓäÃu/­äí.†ÀRùӋ¾[Þ=ً‚Ëô8Ñ´©‘”úé<Ú
+·Z̞ˆ…³8ø„ï ºylõ|à퐠írƒ¶Ÿ7°Õ’FނªªÀoő¤È9îx—ÙÛqüÂOŠIÕTVèÌB[NEn,§9k -=?ÿ`lÄ|v91˜Ö*¼ìq6ôåJCñ¹T8˜æ#Ÿk©Í¡ç£F¶hj·¢ÆÆGøA(ÀǦi$s–Œòªzn9YX4ù†}Q†]ŸWlkÁ
+6ê`ó3PÛhäܙ<y8©/]wnEÈæ p\£šfý–œ+=«Œçmc{g<EÓfmnÂ~tåúâÁðD”g“§k5Rĉ àbË hYñè>÷hgƒY²íù¦­½L&î`øIòå/FÂÚ±Tæs³*yÏâÓ¯j’‰ký!’%i;]úg‹æGN™¨Íéu§Jbõ,¹UÇ8Ÿ–Ÿò¶‡fÍ:±sŒìÌˁUþÉ ŠìÀ
+@*5-Š
+
+.j*ãÀFMä[ä=ƒ&#+šXK¢‰±³<íh“ëç &øā‘C ,êFñ€„(ó‡-)VÊ?ŸrßúF2ùŸ{“o<_k@#„†“
+:]:@+ÒùÒ®ˆAÒêéÈ­ ©;<C0ìº2róÎ|Qlºãœy~«¬†¼âÞ0¬ÉàÅÁÖ½9yÄj.æRþHF÷`ÛfÉÕàÜmuÓI¦Âû Ü>:™Šë[éÇA‹Nâ%®·nï¸vWCéó¬÷äý=¼AÄìLV¯$Mª4„QJ×eæÅlø÷ϑäeï\1è$™ÊÝëì8áñ#Ý­œ2fC*cÑî3Õ֚úXõÉ»“·™¨Ìñ¹˜Þ{d^ÈäÔTI_½÷%="›Šd-¹AKíª$Þx#E×T^5Ö¬Ÿy°>ä‡Õ#´}Ï7ÈÜÊÊqc’~Q:§·êº vg/xjëðp󪓰´Äw·àW /FØõWúðÿ±Îl^ÇåOt…¬¹»J}>.ò—z´Æ´Nä•Ym£ÕӒ´ð‹KÌÿ0ñÉÉÿo:ÖÄendstream
+endobj
+50 0 obj
+4721
+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
+35 0 obj
+<</Type/Page/MediaBox [0 0 595 842]
+/Rotate 0/Parent 3 0 R
+/Resources<</ProcSet[/PDF /ImageC /Text]
+/ExtGState 40 0 R
+/XObject 41 0 R
+/Font 42 0 R
+>>
+/Contents 36 0 R
+>>
+endobj
+43 0 obj
+<</Type/Page/MediaBox [0 0 595 842]
+/Rotate 0/Parent 3 0 R
+/Resources<</ProcSet[/PDF /Text]
+/ExtGState 46 0 R
+/Font 47 0 R
+>>
+/Contents 44 0 R
+>>
+endobj
+48 0 obj
+<</Type/Page/MediaBox [0 0 595 842]
+/Rotate 0/Parent 3 0 R
+/Resources<</ProcSet[/PDF /Text]
+/ExtGState 51 0 R
+/Font 52 0 R
+>>
+/Contents 49 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages /Kids [
+4 0 R
+14 0 R
+19 0 R
+28 0 R
+35 0 R
+43 0 R
+48 0 R
+] /Count 7
+/Rotate 0>>
+endobj
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+/Metadata 62 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
+40 0 obj
+<</R7
+7 0 R>>
+endobj
+41 0 obj
+<</R39
+39 0 R/R38
+38 0 R>>
+endobj
+39 0 obj
+<</Subtype/Image
+/ColorSpace/DeviceRGB
+/Width 930
+/Height 510
+/BitsPerComponent 8
+/Filter/DCTDecode/Length 43781>>stream
+ÿØÿîAdobedÿÛC
+$, !$4.763.22:ASF:=N>22HbINVX]^]8EfmeZlS[]YÿÛC**Y;2;YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYÿÀþ¢"ÿÄ
+ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚
+%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖ×ØÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ
+ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ
+$4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖ×ØÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?˻Ң†ÒY’SëY¶0-Íäp¶pÝqZWšÌ7
++M‚êÑe“9rGZƒV³ŠÏËXóóg©¥ÓõT´¶XšägqPêZ‡Û™ÃÁ€ Í K›Pc4ËtººòäÎ1Úµ.´ËX­d’=۔w¬>èY܉™<Á‚6çvïY[ˆ<¤€ õÎh’—0ô±•Æà;d
+迲-C‚Äã½s„ၡÍlÅ®*šÔŸ«S’“ØZ÷±,7.‹ÀSÅ]Ò¬ ¹µó&Ÿv8=«>òçí7Jn㐠ô«~§ö(Ú31Ï^”I;h
+Z£_•yHUæ²%ÊìüÇ51R[µs£K´¡òÃ1PsšÅÔcHnÝa{
+ºšÞ-ãŒ@7¨å·u¬ë»ƒs;JÀnÔàõ 5ÐÐѬṊV•7m<f¤Õìá·¶G’ØãéT,/ÚÉX,k npƟ{ªI{ÆѬj§#§–\×jÃôh#žæA*x´oôè"²šDEkÂùìei#Ef#5ZºÖf¸·’'‰~¸¤ã.`º±š€PcpºÁ§Y?Ñ×ä÷®I[‡5¨u»¸ò㪔dރMXmºõ‰ÐUMw?ÚÆ:u«Zk=Ƭ% É5_Ä:œ‡ÐN:KQIèdŽ¶—
+Š\b€A<Ð4êîíòm!n9AŠáTý+·²%¬¡àà¨Ækš©½=‰ˆÎ7
+­—­ ⁈izÑ@ Bçš8£ùнFqFy¦RŽ™¢I´RRŠ1F3A4hhÅ¢€
+LњQ֗½% ¥Í%ZQŒr):ÑE- £斀hÅ´P(¢˜‚ŒRu¥ïŠ@è<Rž¹¤ëLaŸj(Í€â'Òî €Ë ]£ÐÕX yçX“›¦k¤Ô扬%Ù4nN:75‡¥È"Ô¢‘˜*ŒòÕÊ¥+\Ù-I_H¸U$•Àç­g8Æk¬–öØÇ ûDlÅN5Ê?qD$ÚÔÔЋG¸’5pPæª\[½´†7Æáé]…Í»Á<Ȥ&ãXºÃ«ß9F 1´æ”g&ì6‘¶-Ì^bmÚ}i—vRZ•Œžx­}î´õŽI['©ªúì±9‹Ê‘Žvš¤ä&’Fu­»]Oå!±œšµ6“,Q3³.®)º<©öùYUvã'¥k__Z½´«ÊîÀà
+të¬ÙÊÙÏÝÛJnwVJÆE‚5IÁ*qÞ«k¤›ö$`‘Í[µK¯‰cÉ ÄŠ­âIò:
+/8¤íEh@6(£¿µ(ã4 p8Œñ]Ֆ[O·ÏhÅpª~Sšî,76ŸnHÏÈ1\ÕÍ©«–O#ŸÊ¹ûË ‰/·€H'ƒé]nFx¤èrsøV ØЂÝ
+Åó1ペÏ×Oú*qü\V«®=3ÍekœÙ!#’®ŠOCSóï]všqè+ç<w®»KÁˆa]f4¨¤Í犡
+=è qE
+@
+MELÅ-Š@§Ò“µf€ŠNô¿JƒH)qÍ{ÒöÅ ü)zÐi2(<Q@ÅíIEæ€rsGãJp)ï@…<ZN3KŠJZNôt4`.)¥íIÅ ¥.3IŠ\b€ŠLS¨ê8 ´€RÐõ¢Ž( àRQŒÑÓ4R“GaŠ:S£=©ERcšS׊^ô†7¥Å)<њ&(¥Ñ@¥&’€ QKŠC@ ‚;Q@¥íš`%QœRA}%Ä(ýh¢–­Š_¥&E´P3Îl¼àþ"– c&º­QTØK…hƒ¥5HrŒõ̧¡µµ*ùmŸ¸GáHsžk´š4ò½íÖ¸¹NQݵÉfØOáM*W‚ö®¾Î1ö[|'ÌPvëXZÞ¢à :Q݃‹3–&a…¾‚†ò¤fº]Ki£
+ÁÛ6æîàWx34¹ûۈ¥ ÜMk`[i˜dDäzí¨Ý Çjì­Éû,8RÐ+›Öä#.:Q
+—v‰N(d—>Z3ãû£4²[KÜèÊ=Åkøy±ÀÎmÙ«ë«i‘Áùù4sê9èãyN#RÇÚ¥{;ˆÐ»F꣩"®hgm۞˜ZÚԎÝ>mý
+œõ¡ñÅùÏ\jÌdÂL»{Ɋ¯âOù ?€4EÞB—Âc杸Œb›“øÒ©õ®ƒ̺Ì¡D²3„\ž‚£–êYP+1*:QJ‰œK`¶ôí8çÝ|¨FiÚN˜¥MÅÑډÐõ_UÔ¾ÐÞ\,Cõ¬dÜôF‰ò›V7ÿk¹˜Æ1KÀ®Rèæg>¬MZÓõ²I•T0c>•IرÍ8Såbœ®0ñA$
+QïF3[†áEf
+Ìç±Ëƒ†?Zë4£û°}«•OÖiXò×ýÚìF&ˆâ”}h(f¨4¢Å'ҋbŠZJ,0Qô¢€µ£œæ KIKšµ©)h;Pizъ@h—4P <њ( c§Ú“4¦ˆ)MŠ{PïFh¢€
+u²ZZˆŸ… ¹98Î;S„“Øeˆµ ¸Ê„¹u Ðg¥E<Ï;—‘‹¹êMtöVÖÿb‰š$,˞Eck0¤W˜@+œB•ÞÀîŠp]\ĸŽgEô›,Ò͏2F|tÍoèQC&ŸºH•É'Õ]z(á0ùJp9Å
+i»dÃ$‘9xœ£cZ‘®®ž=<Œž„ñVtAj™C ^†¶¯`‡ìRW°æ¦SJV)­Pý9©¼û‚ó¤Àè3Q¸çÜW]$11Ú1ÅT䐬ìr.Xœ±$ÒÇ4Ñÿ«wA覭jjþa€=«KATkV,Îò9)ÊVWM³I%~ñݽ7D.¹1³ß¶µè£H"d@¬Xæ ðò#ÏpYC£ƒK›Ý¹I;™¬ò²á¤vy5ö®£VŽ?ìÙUW\Ô#ý"êàSŒ½Ý„Ó¸«$Ü$œtù1ò3»’z×kå '÷K´qŒWxvÜKŽ(ÊýӸՖãn²àvɦ9b~rI÷®ºÑTÛ'ʤ”«ŸÕ‚‹ç
+Rˆnâ⃎´}iJ r(ÔÅ(␭(ÐMéˆUs]¶–âWm뷊â‡JítßٖýÙÀ®jæôö-°ç‰wª˜/
+lÈS‚kiI-žý*½ÆŸ ²™$L·SŠÁXÐ|SoU3ÓÚ©kŸòEÇñւ ÕG\çO_@À
+pܙZÇ/üfº/î(ö®Xòƺ/ýRõZîF& ¥¦Ž´ìSZZ( Aš(ïA bŽ´QŽ(ÆhêhïJ8¢/N”œf–‰ŒQE.(˜¥
+Æ£up»f”²žÝª²9YÇÞS‘í[—úU½½£ÊŒçÞ5ˆ‹¾xñ¼âœdšºµ.kßÀNpýxEØ»NIë]*èvĀKúW?v‚ ‰tVÀ¢3LÉãÔïUP ˆ Ó Uç™ç™å•·;žMoÛèÖ­3 2äóÒ²5;dµ¼x“¢ŒòhR‹z¹Sۆ¹Lòp*K«û«¼}¢MûzqŠµ¤YCx²rvÀ©õM6ÞÒÛ̇vIÇ&—4næD3Éo'™ QSK{u2‘,ÌÊ{—H¶K«Ò’‚Ê’+VëL´ŠÎY[z®G=(rÂÎÇ6IëÐÕ¯í+͛>Ðå}*·”äWM‘e±|Èß=IÝNN=D®ci*n5X™Ï#-Ïz‰8ÔÀ*H£þ XÓ!Uð3Åidgî
+¥(ÅéÎ)OµG\ÐãoJE¥<š!äRçŠN”qš\ь
+1¡zQIJ) Í £½èáŒR
+( ‚i0iqLAž:ÒsKKHŒQތЊ\qE/jcŠ^´c
+JQ@▐€Q֓4´˜É¥  sGZJQ@ëŠaKõ¤¥ @h¢ƒí@¢“¥.3Fh¥X¡ih☠ϭ!£4
+*Œ+zÕ½+RŽÆŽXÝ÷6àEW˜ †xÔ:÷Z-lg»Vh”94IFÀ›-jz¤w¨Q†rj¾—|,&’FBÛÆ0)—VZ¨iFtæ™gg-ì†8@$ òqG,lMÙ¥y¬Gs`Öë«79&±Ñ‚ÌŒyØÀñW§Ò® …¤(TëƒTBåÕGV8F1H.ÍØõøÓ9…Î}ëâO:YÜsô­¡Ý€2þú¬ù#0¹G<©ÁÅ(¨ôlۃ^Ž8#íÜàa˜5fê+wteD(¤cäԑi¨e
+AëU®­žÖSœ0æˆÆ)è'{–4ëõ±YG”d/ïŒTڎ¬·–¢%„¡ë’ÙªÖ|×ûÌEN¥Ž)÷ZdÖ°™©ã­Á܋OºWFfRà®0*ýƸ“A$bبqŒ–¬ë;G½œÅ\Ÿš­M£ËLìêBŒñM¨Üz™Á‘Ò¶âñ@ZïÀþ÷ZÄ?ýjÖMv]ÅãÅåê‘ZÈ×zêύ ¶â=/‰ÿä!Ó ¦Ø£ÚkQFz“ƒOñ@ÿ‰^v
+#ñ
+aš^ԃ4µBQšAKŸjLšZ( c±éM4£¥‡Š)sš(Å.sIœb–XJ£—áŒÐGJ;ÐzP Ç¥€ñïTuKÙì¢G·²’ì³`ªg~ e¤ždtŽXÝӆU`JýGjËÕµ¹,/¢µŠÉ®^DÞ6~Ø>•…¦ê—PjwóG¦M3ÌÀ´kœÇ׃òÖ¶£§j7·Öº…›Åm"B$ÎTœäc֎ÌWܹ¦êwW­*˦Mk±7)œ1ôä
+]V¬s“$Mµ“vïÇ ÷ª>©~5y4ÍH¤’€JÈ ÙíÛ¾4ÏMùb¼]Ëõ<ÿ0i¡t4î5o'YƒNŽ1¤fݍƒžØô§Ò¹Í}¿X¿Ô›•ÝåF}¿ý@~uÒb…°ú•î¶iîlkùŸaX_ð“O i-´‹™mÇI2€Ö›ã#•±Ž!iÿÓúWukFÂ4:u´kybß ÈíKÌ<‰_Z„诩C:/í9Î=ét]]uhä>Q†HÎ gƒÐö¬»‹·¾ðmÅđÇ»r#|sPÆ“.™©/ó‘NcÏùô÷¦·CsOÕ~Ùy{oäìû+mÝ»;¹#¦8éYPø¢æà1ƒGšeS‚QËù-;A?ñ9Öÿë¡þmIà¯øò¹ÿ®¿Ò’ýÿSOHÖmõeahæ@ FßÓÔV§A\±Pž;A“2þéÿëWSO¥Ã­„¥Í ¥àõ¤Fh8¢€
+1IK@£u£­/Z(4PRŠ3KÛހŠ(¢À¥¤ PÒ撊\QE! Æ( RÐQÔÑޗð Ñ»Ž”u£‚–ŒbŽô´è¢€
+\ÑF;ÐÑҁK@ EP>©°L7 cŸ­sºF©xsš¨K’Äþ4Þz×*††·ÔíæòÖ9:go5ÅMÉqß&“ý㟭Ž´á‡s®±’?³@×!~õ‰¯07ìx<•˜ç GãHxsD`9\é¼<Göh”Ç«cˆÜn…wØìsX>§žÔâ:þ´”,î6î‹Ú+*êAœ€žI®†ñÔYJ^DÉN>aÍq¤sŠv1ÉÇ­…ÝÅÍ 
+÷®Æ  H‘Lу´dn®7ë@SØs…Ø»«0kù
+sq&ˆöi¦2:©Ïғ…
+)+
+¢[‘Õs‘ø×-}©"è$ÈR›9¥œòEF1¿ŒÞ¹Ñ¶‚¶Ò8õëTuÄQ¦prK ևÊF®J¡®`i­€s¸d֐܉lrL1#].”tŸJæƺ]$úWaÎl
+ZAOíTQIš^=(A£)3LëƒM£½†…´ÜÒÐ&húҎ(4 )>´´˜ BŠ  b”ûS1KIJ(:ÃLûýåȗÚ[;vão^ùç­A¨ÚjïteÓ¯’4pŽA1éÁþ•±ÒŠ@bi4¶—R^ÞÏçÝÈ0Hè¿çð¥ñ6§öy-¤H戟™‰p+jŠtkìÝ6+v*\d¹^„š½žhÅhzOTÓ¡Ôí ds•aÕO­a#][f´P…í°P•ÿ¾Iu“µbDðãé±Ì#ï`T}à}êÙӄÚ"XNFDA @ uhRzoPF£ÜéÍr×RÇ#L =3× U=]°VKKËXÕÛqyüVº²( F>¢gÊ÷3Ìn.äg=½~¿ZÙ£­'zCQH3šp ¢Š\PŠAҗ4‡š_j^””¹ ­ècšJQE- ¢ƒÅ-%-'z^ô­-% @ÇRb€yÅҁ Ž3E´(ã4){SÇ4
+)riLòh sGzö¥íڎÔ™¦¥¤¹¤E/SF(ÅsE00µ;hÆR±*²®F`iJ’jУ€c9È5j{íFæ6ŠE[ƒµ9ªÑ[]A"ȱàðqšäŠiXÕ=NšKX
+ä1›I>E)íÒ°–ÂöÎPñ¡,8ÊóS´ú´‘˜Ìm†ëòu¢Wné…ÕŒgàq]¤Ä°ÀB)¿ÍÿdÝlÝ圞ÓVƒë0À »N^÷Q­WYu
+ ¸£áµ­$2 -æc‘œ
+¡ý›}våH=Ë
+’ }J×+
+%ÄzàT”3€xcvz…¤ŒÑ#+‚G4­îÚâêoꪇM˜²·‘\Šs<]9qšÔ•ui¡òä ўب¤Ñî£Tpn»GU¢:h#§TŒ`2¦ÑþÍqºˆÛw2ŽcÓÒ´êýŸ¥@úe䅤•æ<ç¹¢*ÏVýˆd…‚(R£œV½íŒt§G¨#
+†M‰Ðg¥"i··“Ÿ;å8ûÌzÑ۵؟Ã[OÚT¨$E_וWN!”F8¬˜lõ9ƒ*OR´é­5K…Ù)gRzFœ×¸›º#ðúïÕqé5Ð_ô)ò¿Àk
+=/P·›Ìƒå|crš‘“X’6™Êž£4œ¯p1‰”ƒÜWiåUUzàc€ÚÀ\m.‡¸©<½\pd@ÕR³ê5¡ÁÄêé Š6¢GRŠ#½H–ÒÛ܋»Æ¡ÈÉÉ&².§k‰žF<±&´ŠW¹z¸£4¸â`
+ØÄè&¹æŠLgšLãŠ_¥&(héBŠS@ ÔRäAPցJ c×ÔvÙèm·I—¸Áq‹Åvž èñ’ánµÍˆØڙ¢@SŒýj7ö©6“ž¬›ÝN;YÂ4lþ¸5Ïs[šh6d“T5³9¹êFY†Q4jêô5¶?â\ÞÄg5pø…-QǶCšé´~aO¥sl?zk¥ÑŽ!O¥væÊô£¥Š^µ@QJFhÅw¤æ€ƒFN(ëց)qIғ9¦1Ԕ
+) gµ´b—Š â˜Ä R)i´Rb– .¨À3¨-ÐŒÓÏJÆÕÿãéÜÌÖÉ©R»k±ÕV‚§N¿Ä%-•G(µ¢vTFw`ª£%‰ÀÖ«Ùj6š„l֓ 7øiº·ü‚/¿ëƒÿè&¹ßÿË÷ý³ÿÙ¨×ö¤£4dÐ1zLóEZ;QE“NÆ) Ræ€
+rÅA˜Œñò×:Ð[Œf“¢ŸPUÀkÖXǘÀgºÓ¹d0Ûçåæ¹.Ô¹Æ
+8x†Ìâ\žŸ/JäwZ2}hö(~Ðë?á!³Î&Ï÷±Gü$VØ?,¸®L9õ£q£Ø¡{C¬>!´Îfã¦i?á ¶È&9 ÷®Oqõ¥ qG±AíY×GâUl•gÐSˆm™‰+(ü+”Ü}M.㎴ýŒAT:¿øHlÀʤÃÔо"¶ ˑ±í\ ã€Ô{ÐêOˆíòq¼õ4£Äv¿óÊQŽ•Êî4›¨ö(^Ðêÿá$·åŠRi¿ð‘ÛàþæLžÙ®[w4gèöH=¡ÔAÕ¡p=6o®?qÿhñ\Öx柆lõ4ý”Gí,]ÞËtå¥lûvI5rh#][éTÈæµI#6ؽ©;RöëIÛ4Phǽ!éÅhÅ‚sE
+CëŠ($àf<Ò}h'ů4t¥^3H)Ã¥8Wg ø“Ä1’~¼×µÛè:5¾2IÝü뚾Æô‹û‰^5Ÿw§%́߭hJ § cÞ¹Sf…x¢DF1ÅT×3ýœÀûZXÃagk@-ÏlŒқ÷…-ŽE¿Ö“]&rœv®m¾ù®G?¹Œv®ãlR␠S…1(ÅP¥Ï¥!ã½%-½(Ò9¥Å/Z QA旵 qHiAůî(À ô¦ÒØ£P(Í0”Pzô¤¤F¯ÿKþàþf¶qXÚ¿ü}/ûƒùšÙ¬¡ñHôq_À¥èÿ@éH:š\QZžp™¥4†Ò€)êÃþ%¿õÁÿô\÷åÿþÙÿìÕÑjßò½ÿ®è&¹ßË÷ý³ÿÙ¨֚9¥¤9íE†â—4ƒéK@”QH(Å.))h¸€Qޓ4î;PRcš\ÒÐH3KƒE.8Í%‚9õ ¸£<P:s@cŠqEP Š3Fhh ô¤¹ö “KÅ  }iqzCíK@¢Š(4”Qڀ
+1Í%( ´”f€ ÑKEya<ç֗¦ô­Ëm
+i¡I¨22*%5Ƕcm4l8®ˆxnl È£4ȯ´Èð©U"Êpg8:Òí®ŒxvFé"qKÿÛõ3/Ð
+)¢€
+(£P ¥éK‘Ú“­
+-
+9â]nßìWx®úÀÿľû€×&!lmObÃF`÷¨/|ÁdDYþÕ>Üð'­)bA<`®™£Õú_Ú<ÖÞWäõ­Vû¸ôQ“Œ`Rt8}h“¸-…à gœW=â¢Lз*k  |̶Oá\ïŠHóàÁþʪŽäÔÕ˃º›´â¯Ád÷²²¨rqL*–ò2°Þ®ôsð{яzsòÙ)4Ä~4¥(ëKÎy ‘IžqN94€cµ&)zÑÔñ@&€
+ãb€µz+¹Ÿ¢GЊ¢œŠqÈ_sI¤÷);Îömm3–y"9éõª"êŽ1!zlnõ–®v€I§n=gìÒ/Úµœ X£Lèo9j‹Vš&Ó]REoLä7äþt…Î8&¡Q³¸ÝK¡Ä‚äŠèôbL)é\Ì}y®›E?»Lt­ŒînŽ)ئƒšZ ×­8
+LsEB‘@¢– Ҋ;ÒPÐ)1J(£fŽ¿J1Ž{ÒçŠÅŠJ^ô`^Ýh(¢Šc
+(ç4ÆÕÿãé?ÜÌÖÉ5¬ÇÒ¸?™­ŠÆCü
+/zh4€óK@
+)
+3òӂûæš:úUžZàË¿¾G€¬“éWŠÙˆÆÓ.þþ”¡,ÉçÍÛց”±Þ˜sŠÐE³çwœ?*†qßÝîÈõ¦+G]6‹þ¥k›A“]&‹þ¥y&‘HÞS³šhæLíIß­^¢ŠÀ¤ïš/󤥥 aŘ¥êiˆOj\RQHaGZ(é@ƒ¥- æŒP1ii){Ð!)~”˜Í(Wÿ¥ÿp3[5«ÿÇÒÿ¸?™­Žk(|R=Wð)z?ÐZLÑEjyŽhÇ4”£ž´OVÿE÷ýp“ÿA5Îøþ_ÿíŸþÍ]¯ÿ ‹ïúá'þ‚kœð'ü¿ÿÛ?ýš€:ìRQE
+
+M,ËsÖ³äbìXÒ¸XÆ¿æCYŒqÖ´ïú±¬ÏÖ¥™ÈÔÝ´p+D¬%b{SË[Ë?ْ%ێUÒ5¨Ü¿(èjkHå…E¨àšhFdã2ÿt‘šv@©&cܞµéLc€­ý.6.áI|ñéX(@"»/ I
+[~ý>]ÙÝQ&‘qO¡——pLÆÀ?x{R_ʒظcûÁʚìï4«;Ù·Àê®FvŽ3\Ž¯jÖÉ*ºm##¥&ãÐ¥~¤~Eyåf꫑W'‚Y[yÏçU|.p×+Óå5¾@’ÔFbÎðy5Ÿ2ORí¦†d´öÓÁ9ʨ%I¬=&5—RŠ6n<}+©ò¼«w'p'&¹?Û1û£šûK›Ö‹QØ X×÷«ÿÚFî_!ðèGR]ééq–$†õ–öKj–Ïz\êÖ)&sw,Z£ÛçåÜ1zÚÔ¥{[dH¾\`+#Tu¦'®àMt·É<f7ÆÜçñ¡±-Ìèõ…XÑHŒ&ŠS¢ÇŸ¾h£ÇÎ{Ó[icHF)d×Q€ÓÖ¯éwòi×Bx±ÆnõL¡ê(Æ)×Öuí&R!¨þÜÖ1æžÇ<bšÐ@÷©( Å.@ë@žjt‘S’3P
+iëhV»åAªD“øš¹©Ì³Ù@«Ë…é֐Œ ŒÇäRHäàf­£Þ¬E¦ÝFN)‚IlؘÉF#­(Õ/1þ¹¹íU 
+Ëā½E ûPa…”Ýi¢úãvá#nõ ÞܿޕŽ:s@‡0»/ó 2}ÍE$r’L€þ4ãw6Aó#¾j7žG1'ñ “´`
+`Ò÷æœÇݧ֌cŠp4§ó @Ç4¼QŽh(íJƚ:u iÄãސʝŽh€g¥9c.p4€âï܇ €Рà Òº·†=.7çnA¬ù®d¹Ìۛץ:kÉ%·ŽÆÔ銮i¸¥¥í@
+·Î]ðjÅÒ2ò1šÍM±ê,w¨wëZ¾—̾¼n›ðkÿ µ-Íâ8Á¤RA{RzçÔÂqύp›=Ƃ;qS %—§z„ýþje$`ÍZZF¥ÿ!ŽŒšÔÐøE>õ•¨ÿÈJà´kWE8Eú×lv9™ÐNš´ñŠÑ˜Í4´
+O­/j4b ÑŽih)x ô¤íLbÑIKHBS©)G”´QÎ(( ô£µ f”1F(è~´ËÖ¿åü úUëoøô‡ýÅþUCYëü úV…¯üzÃþâÿ*Ê?=ßî”ý_æÉ3Å-ƒ;kSÎQ֊J««ø“ß×ÿÐMsžÿ—ÿûgÿ³WG«cûûþ¸Iÿ šç< ÿ/ÿöÏÿf »4w£¥€
+ uæŠZZ(£E€Z¢ŒÐ±Í­àQž(;SY°*9fTïT.® DüãŽÔ‹/{
+`ÍÀàFA8ÅQ֋K§Ë¸ç Ö­r¼úÕ-YÕ4érq¸b¹£{›èfxz@²J¼üÀWB$;O85Ìè.‚ä«n\­tJà7=M\Ñ(y}ÛA¦+–ÒÛn°œŠé¥eH™·à\•Œªš”nÄì.sN+@‘Ù#Häz
+RýKT(êNNO§4ŽÃ€ëY´WCšÕ þÖvîH®›ÌlƒŒŠå5YAԜ©Î®¢Öhä·V;…i%¡+rÆáéE7+ëúÑYØÓC„–ÒEçËp=ÔÕt‰ö¨çÐW[zš×”ÆU £ŠÆÓ-î%½/k6.íÒ»Û9eA‹‡SùTB4iIUÏ<t®ƒR‡QxÕ.c@±ä’ƒ­e[Z<ÈJœãm`µ´·’í£ dB§iéÍS‘B’cŠÖ%ÀV}ÁUFsT­lžêV9*hA˜ž4kqô …ÁIU$Ž•‘${O§¥ž9¤Ç4ù"hÆ$O¡¨y d¢š„1Å9[µ8Šµë‹_ “9ª¼Ògsíc9X0}褺³F·±èj Í¬&î[7  Jp#ùU›fK•Ã¢ «ŒV_ւ( ’K3K‚yíQœâ…<âœF9¦«‘ÒŸ´‘íRE4J 4[\æ¦ûD2?Ëlz(n”L‚;P犷4«˜’Ü/Ô滁ŠµU`€Ý}éHƒ×¡N*ȸsfÚz Òý¢"ùòÝÍ&M§Ò—jÃOýÞP ýÜÒ4ñ–BÇLÐ;ÊKå¶Üçð«‚ò»~É>¤žhŽò4RÚ93Ó'¥Q*H÷¥ŸLÕñ{Ê~ɶzÓ>؀®-`äœõ E`‡=(1¹«ßÚ’Øâ9À<‘õ1ø—Bt<äP33ilphòÏ¥\}MJ K8є`œýê•5MèØÂ[ûÜó@¥¥+'˓WÛP]Œ†Î"ÍߺÔ3]ùÈ‹Žê(›. ÎjFÓ ÄNQ[#¸ D{HëVmíä˜ey­=o¶ˆ#8õ^juÕ\n js… ¼±*Ûâ\FäÕÿ
+Çj,RŠ9Ÿífïoà´ßí%ݖ³„Š¹qáëÅÞ|¢y'=+EØåAÏj h½©GŠ ã]«0'µU¶º’ÞMÈH=ñޮݍú]ŠÈ¨ˆàðhßpW[iâòÎø7±àÖUö¡%ÙÃ𣠥ŠÂySrFÌ=…Tš7FÁíR¢‹rv&´.eó´ç¶›\NÈã&°#8?ZÜ[;X`ŒÜd´ƒ 祂–âRh©}ªËp
+ª„SéÔÖh89­‘¦)»E'19ê+6ò%†îXӐ€j”RØNMššn²#É¸BØû®:ŠKý]¹Kºz’9¬dëÁ¥“¯&£Ù«Üjm
+Ź5NÕÔð2zÕVÞÎYÁ(™Õ·u”FT†'ªqMXJM3¥͖CçéEeLÈ¢£Ù"ý£7.õȦ¶‘³¸’y¬mö+'¸waÎÍKý‚ÝDÈyúS[C9æUüê÷As^}fÒêÆHÔ¨.¤sëXþ0ù’}¦TˆíJÚٖ•qBè{¿åªP
+ñeh‘aD–#æ¸<Vù&Ï`kVX>ØâPã ûU’[•tûvX‹Ðnª×mmi7üz+£ ˜Óîà[§W‰×
+>ä,±E+m‹~XžqI‚,òOJNå'=kPÜéi i R©êזF5û›Ÿ>˜©E3UĬ=Z§šK–ùðƒPg-¸õÝZW‘=ӉbRÙ¥Y%ç
+Í´zÒÝÀÐI´÷äZ”YO¸)‡ÖŸªÈ¬Ñ(ꋃ@™D
+¥7“KŽ”‡“]'„³ö«ŒôØ3\Ø?5tžm·W9<yuo„Ö–çJ@éŠcõ8©[åÊ䑎j àŒ
+Å)R“Æ( µoùß× ?ô\ç?åÿþÙÿìÕÒjÄÿd_×¼Ÿú ®sÀƒ?oÿ¶û5ÔëzÒâŒRs@
+:QފZCÅ 5Ì¢Sü#8õ¬«mU§å'<`ÒnÈi\Ú€k9ï]N0:÷¤köA’€®qšžt>Vh杞+5¯YFí ƒ@Ô2»‚dSæB±¥IYë©)Œ0íJ5có?G2 iOJÎ’nÛ´ç·½!Õ?q©ó ±£XZ¤i ò㤋‘WWRŒœo^*Ž«:MlAOJ9Xå¤Oš¢òýêĀî#ñ¨±Ï֙#D|õ ÇŽ†¥éŠCŒúR֘UnWÌÉ^¸©<ÉeÛÓq"«Ù){Œ p*áµbXŽ”„A嚍jÔv¬ã–ÁúS¦+J wr8ì@¤Š\òG>”\¢Æä$‚Aêµ
+n9Í$—2²úÔ
+£4fÍ Ò\Rb ERÐ18ô¥Æh4™Å/JNô£šLó@ƒ½ÒÒs@3/Zÿ–?ð/éZ¿ñëû‹üª†µÿ,?à_Ò¯ÚǬ?î/ò¬£üFz5¿Ý)ú¿Í’÷£4¿ZmjyŠSE%TÕÿä}ÿ\$ÿÐMs~ÿ—ÿûgÿ³WG«ø“ß× ?ô\ç?åÿþÙÿìÔ×ҊAGzZB(ÍhÅ`ŠQë@ KKI@ F)sFhb–@Š(Å!†*†¯ng°eQÏZÑ)®2¤zӍŽÐã‘O¹ÍnIiåʄôsŠ®ÊÙ})Ëh¶¦Ò£5Y­ùÆ+hª•äT.ƒ=)
+Ædpäu« $ëÂÈÀ}jÁŒbœ¨»¹4™V*ÒƂÓãýtŸ^0EÔHµ"ŽÍ )f`I¿çH^|“æ¾O½Z*)BŠ„gȒÉ÷Éo­0ےkPGO«OQL,dfÍ4ÀTMk›˜ŒŠ«<1S@X¦ÌajÕ9‡gjÃLšúM®æôÒ%¢…4œÔ÷P=¼ÏŒ2œïP€E;„Œ
+£ )<ñYȤZ\U¸ÈQ¸óíT£>µmA#P0a–'µU»
+©“Ð
+ ëNÁíFÒE #Jì1J@$MMin&Îé1ëWOL“öˆ°;Ñ Ú¥æ¢"—>^Òx®‘´+.ª$'ëXβNƊ›g.l»(™8Ï­W16ì[Ú´2F\à‚iþµŠà\K:‡ØB¨§ít¸(;˜,
+.h)h´Rb— ¤ B`Qô¥¢
+jyÁG4¹¢”õoùß× ?ô\ç€ÿåÿþÙÿìÕÑêçþ$÷ßõÂOý×9àOùÿ¶û5êuãqš1Fh8 KHF(zRÍ{Ð(sMëK@⁀´™¥b–Ž”P 4PEu¤¥Îi?
+†ésnÙäV<¬Cd÷­×BB+
+lÛÉ5Í´‡a‰Æ6⭼ʑáE*J’B%S•#9 fJ]^ m;tÜj}*Íàó$“ïÈrjÒ^@ù!Ú2iÂæ?5P0ÜüI6)qŠ\R{ÑKÅÖ^¯Å«ŸLV¡ð¬Í`fՏ¸ g,N=©ÌÁ¡摇ÊßZ@3{P“Gp‘ؼDÌA§á3ÿR=P“XU›;™læóam¯ŒgÚ¦qº±Pvg£n˜sÒ¡/ó ü«ŒþÙ½<ùퟥ=u»Õ_õÍÁôÍì·´HëVFÆ3ÇÒ²¼O–Ó à ?QX‡W»læv9æŸu«I{h¶® Îîù¢4¤È””‘”TàÖdžâó.%€Ú¼ç½d Z"T5HÔ¤Ó®h•™q†Öö3Ž‹RÓdŠ9Œ,,{
+ü¹ˆO„y]r:š¿}âkËÛaÅcªªâ±’_8²*Ç'q=©é`µ‹£W¸JULcŠ¿dsXqIå€õ¹dÃnHÂöœ2â(U…~¸èjªž:U•ã=Fj–¡•¶v…]ûÕZùA´”7M¼Õ!2+Íh˜¶FsŽ•*ÄTŸRrj¶ãɒaÈÎkÈù˜ù“sß4÷Êתq.Bž¼sYèt¸~u’Vq؊йKxyvÇf¨f–Æ’GŒáÇÊÕ¤„Ìëû›¥CLã>áÐûS|Ý/íQä\ù?ÄN3SÍu¦Ìô•1ýÅYÛKÚ
+ ؟ï Qp&Žm%odo*å­ö ã9¨¤¹ÓvüÜÿhŒT(öAŽôŽØ4ã.žz$Àöæªä“yÚi‚>'2è?
+žÅ/kªR,t¥ÍVûCú-'ÚÑi{X‡²‘fŽµ_íè´}¡ñŒ-Ö!ì¤Y4‚«ï›ý¯ûæóz7ýóGµ]ƒÙ>åŽüRÍVß0ìß÷Íçôoû柵]ƒÙ>è´hW377åŠ6Mêß÷Õ/iÙ³îʚßü°ÿJ¿iÿ°ÿ¸¿Ê³5D,lùÀ$dŸóéV­|׶±] uôâ¡M©·c¾¬ÂÓWÙ²ø¤5[dþ­ÿ}QäÈܱçÜÕó¾Ç³]Ë4Uo³¿ªÑövõZ9åü¡Éæ«Œh÷ßõï'þ‚k›ð'ü¿ÿÛ?ýš¶õHiW„‘Äÿ šÀðTfO¶ààUJN×±.*é\ì·¯÷‡çFôþúþuÙÿÚý)~Íþ×éSÍ>Årù7˜ŸÞ_΁"wuüê³·úQöoöÿJ/>ÁËO¹7˜€}õüé¾|Þý)ŸeõҗìëêÔ^}‚Ôûó¢þ÷èi<èÿ½úoٓթE²zµ;ÔÝ÷bùñçï~”ˆÇLŸ ¦ý™=Zœ-£§êi~ð»í)èÔ¢é=—ȏû¿©£ìñÿwõ¢Õz}˜ß´§£P.Pvjw‘÷SKäEýÏÔÑjzdjð™ZCuþÇëSˆãâ(1']«ùQË>áz}Šæç*FÏÖ³̶I—“þÏÿ^¶ÌiýÅü«Ÿ¼2E;ªÈü¨åŸpæ‡aÿ`ÿ¦Ÿøïÿ^¤ûÞÌVy–aÿ-þú4Š”¹eÜ9à¶F—Øãþóþb”Z èÎ?Yê¼bœÑÉ.áÏå4M¸?òÒOΘm¢O™Ý±ßqÀ¬ó4x£’]ÃÚGùM-¶ŸßOûïÿ¯K¶Óûéÿ}ÿõë+Ê4»9éG#îÑvF²›eé"øÿ^”µ¹ë"ßu“åæž#ãŠ9pö‹²4¼ÛxÀ×ÜÔM=—ñl?TÿëU0˜*АO¥ÏÌ=¯’4_Q²òÂ4ƒË…Øqùb±Ž ñÈæ"UœnØSYÑâWw¨Ï—åA'UF"sæ=ÊΡD{Xu9ëQ¬y^zÓÝjɌ6
+ӚÐ͌Ž ¡¡©²Íå`ô5Ci’i]HPÄðOzKRh
+È#dz«wÄL}ª„:|ˆˆÚP8ç4íª_Ö£Gg@X“õ4ìÒq}Í’[ 2@Ã÷Ûp?¼xªÍs§8
+æ& ÐÎ?JKâe†qÚ©À!™K=ªÆƒø‰ëMS¾ì^Ó²Díq¤/Uƒð‹?Қnô^ëýø?áY„°3í…p¢©(°Oý’î/jû#£ûf‹ýØ?ïÁÿ
+?´ô«ožRǃåE´ãñÅsŽn”Æ]´{%Ü=³ìŽœx‚ÐÿË9¿ï‘þ4oÚçý\ß÷Èÿæ9Å)äàQì¢ÚGOý¿kýÉ¿!þ4oÚÿÏ9¿!þ5̀qR¢™Ç½Ê!í¤tÖ:¬W×ÂÝ‘J–ÞØþ_ýz×[pÄaÿJ᠒KYCÆv¾1‘V[T¾gz
+ÎT_Ù-V:MRoìè‘ö‰7œœS4«Ÿí;åòü¼wÎk˜šþâçhšF/@{V÷…W‹‚zŒ
+‰AÆ:Ž5fØ´È_jdÑG
+F[¢ÁÕ?ºøÖ$çŸÎ¯èÿ}«±B=ŒyåÜéâEeÖž"û¿­$gä\
+cþ=ýñüK¦DŽ_ó5±ÿ‹þøþF¤Ósö¿æk/ùxýB_îQÿù—;ÑIšjyâšJZ>´§«ó£ß×¼Ÿú ®sÀòÿÿlÿöjé5Ž4{ïúá'þ‚k›ðü¿ÿÛ?ýš€:ú@ih 4
+)r3@
+:Q@ š1FhPhƒH)i€v¥£( Š(4€Z;QE4œg=…sÊd™œõ'šêg^+™»ŒÃ# t8¤ÀcúСÜO£"ù‚œ$ÔM;i  Úà•
+OPÜÒpÉ&Ö£žH™0‘•8õÎj ri»1¢´žR)È9=é¥"hsžEC2æN¹¦í €(BÔºsŠt22LÔdx\{šbdÌê@4·‡#µÒjXa,ø¢Á‚WŽ9†æ©»sӚëôí*Øé—WJ@EùO½rRãqààò)rØÑÔm Éô¢™“E3#ª¿çF# *i¶'(ÏhÍ;Pÿ+g°¦Úø“噦Q‰e—õÏúÕÆ×m}ÑOéU,WäºÇ?ºþµt®u»_hÇò¤Æð9?ZqäRò҂(N&ó@Efk9y?Þ´ÇZÍÖãϟïq@ÆIb*þ–Ym®Àþçj¥ß<qÅ[Ófoތêx!iµ,µì¶ö‘•Ëds’j՞ °˜î®7”`FÕìj­ÑÚlŽ ç<Ž1Y·;mP6…ã›\È"ÚgT5í<‚¤PØéCkZy·âgÞOM•ÈlldÒª?ašÇØÅs¶u¿Û– ±w>Þ!zU][S²½±‘ bÌ1·"¹ÿ%ØШѶ{Š(ÞèNnÖÆÞGÍVl­DìàðÍH—vË´½¨fÆ=jþ%½ÝÊÆ`\€rkS$R¦=¼±À$qV/c˜-®\'< bº/ÚÚA 1[N—¨â¹ £<ò圁ù
+¦º‡©|ØÙEï;{úW-Hò—`ÀÅsiÛËãé[ö 
+5R/©Œ°8ˆïª~µ§k<0Ø‘C¶üíöª_c™91ŸÃšGÔ€Ê˟QŒÕ©'±Ï*S‡Å‹ßl¶<}—õéQ_J’º´C
+¨TcŠ³~Š†= gÌÊ+šê|"rnÃtãó®\}á]O„EÙôÇ…m©3¡,ÁqMi0™%¾• Q·æ䊊Hñ´ž¤s\W7èŽ3Mb2ƒ•8ö¦¹#¿J|{v“‚ÓÖ©-Ilóû…ÁÄÿ:ÐÑÉÜç°5F¼ÀÿxÕ톨®øìs·©Õ'ÝJ~8¨âû Ô™«@¢ŒñIŽhMbŠ` qš1GzBôQŠLÐ÷¢t¥ Áõ¥Å
+LQŸÊ–”
+J.M&)ؤ f~±ÿ«þøþF¥Óúó5±ÿ‰þøþF¥Ó?ãÂ?ÇùšÉú„¿Ü£þ/ó-GJ(­O8Ph˜¢€*êÿò¾ÿ¯y?ô\߀ÿåÿþÙÿìÕÑêßò¾ÿ¯y?ô\ç€ÿåÿþÙÿìÔëûÑECquok·íC»îùŽ?LÓC&b©SNãý>×þÿ/øÒ>¯§"3µý±d('òš@]b²‰ôqÿ/ù ÿƒâ}þ~ÿòÿ…kâ—ÏKâý69YUn%Qühƒó þ”ßøLôïùãwÿ|¯ÿ@ËÏãKE@`µžGÏIA¨ÍAÿ ¿ýCÿò7ÿc@\ì;R×!ÿ ÇýCÿò7ÿcT¿á3Ô獯ýòßüUs½½+‚ÿ„ÏQÿž6¿÷ËñTæ×<Exkh$XˆÀòm÷)ç®H?ϵ¹Ýæs\ö—Šçßþþ&•gñUê´ \¨#$˜Ä]û6ó w;£ÐŸNk™½˜Ëpç¶k'û7År÷_ø?øª¢özºÌßñ .o.?:x#+š:MËL‘’O$“Ïé@Ñ®OñEùŸð¤+ÜÁ–XБœ3GÛlÿçæûø+-FSæNªÞŠ¹ÿ
+_ìúyÿÈýzæܚ†œ‘ÓFqýÖÉü…SmVÀž&ÿÇü*’hH¤ù“³E\;ûßûòþcü( –†«aõßøã…DuËE$”àõ
+0Z‹ûß»Ëùð©ÿ²ìÿçþ<ßã@5Û.ñÜß#üi¯â uǗo$ž»˜.?žiçK³íþ>ßãRÅakà[ÆsÏÌ7:§ÿ ãþ=ýýÿëTrkû”…¶ã‚_8ý+Oì–Ãþ]áÿ¾ ·2C·bH í9‰ÎØÿ#þ5­}¦Ò)Daaž§Ö6R^:
+Fè¬ðɼ‡'µ`#¼¾‘Õ²Àµ;÷)ÚÆ>Ê*ËV#=(£C3sRÿ;ŽûEcþ$ °jÓ4S–‹!±Ô
+¡‚ ¬BÇÓ"Î{OR~×Çü²ÇëW¶Ÿí«b:SúUëhío$†Á«BüÑ @ fj<
+Jî%
+'${€Oæj„m.ôLžëUÞ £’)sŒ²‘Z ®ÎoŠ6^àd±ºŒØ’QŽªÙÿ
+b0öšcñÒº_í …eätGŸñ¦´Lß¼>PÝþÙOÓ"€9廝\3ñêr*ÌW×ä†úŠÕoڕ;d”Đ¥Ft6E&V?í.?Æ¥Æ/tmEXü2y]/_ø‘O¦*O¶ e`}¹¤}*é1´,™þëtüñUä³¹F*a‘è¹¥K¥ÐèŽcˆÚ¹kíVî7Ýy®m¦ÁwCÇ÷±Y¤aˆ`Ai@ 1旲¶ÌÓûAËã‚#Gì1g ¸öÍh賍-¥Ü ‚R2W‚?ƹÈä„Þjž>jßÐ.´óçÇ}qR ’ùÖU#$µw.8œ4¾*vôðÆúë6ŒB‘*´ËÇèiEý«É8ÿdÖ±fÔü6êw-ÏP’gõNïRђ%k[É$~êcoð‡³}™¥ðrûMNå‘ #«¨<sI —wBx
+Mq/­Z.6ù‘“…éíÉ©¡×`Xþ[‰bÏ~oéV¡%Ð^Ƅ¾«ç¡øÞßï·£ŸÞ8¨¼Û¼Ø¹ç—ÅZ¶E¶l¦OÖ·UÜÉåÕ°iú3¥ˆü€J’²?µY#ù ݁“ùϛWÖ“l¤ð ± {’FjÕH¾¦2ÁWŽñýN 
+qòx‡[‹¬ 9þê3&¨dÖüCrÃjñ…È&+rsõÎjÓOcžPœ>$Ñۊ+…þÑñ?÷.¿ðñ4©w⛓䅹]àŒ˜D}¿¼@ÇçL‹Ïnh®û;ÄÿóÒëÿ‡ÿKýâùéuÿCÿŠ ê€=k†
+j·'Ξâ•À-æHÌÝ:ƒMÿ„;PÿžÖ¿÷Óñ4íçžd<ÑĄà3°QŸNjí];þíïòÿr°x2á·}¢î(ñÓËRùúç©¿á
+J¿ð™ißóÆëþù_þ*™7ŒìÄdÃopïØ>Õñÿ*Ðÿ„gGÿŸOüŠÿãR[øJË¥”d‘œ—“(‡ÿ ·ýCÿò7ÿcGü&ßõÿÈßýtŸÙZwüøZÿߕÿ
+Oì­?þ|-ïÊÿ…Ôæ ñÆ­;Ã$QGå×nwp9篥Gqâ[Í>fµ†+vŽ>…Õ‰äg±÷®ŸYÿDÿ|#SiŸñáãüÍd¿ˆýBîQÿùœwöö¿}ûËHœF>SäA¹sõ óÈ£ûKÅóÎëÿGÿ]Õ;­O>Ç
+³ø¦ô4 \®FI1ˆ»ölçMþÍñG÷î¿ð(ñUÝќÐ87ÒüM"2;\²°ÁSt#ÓïRÿ¨ÿÏk_ûí¿øšïµ! V8OøCuùíkÿ}7ÿV ðT̄Ïyož!q©Åvy£4ŽCþŸúˆäþʟ‚c5ó¼}ÂFŸÇ'ùWW֜:P;çü!šwüöºÿ¾—ÿ‰¤ÿ„3Nÿž×÷Òÿñ5ÒRƒÍ01SÂúB¢©¶.@Áf‘²}ø8¥ÿ„cGÿŸOüŠÿã[4w¤m¾ƒ¥[îÙc݌ùƒå»8©N•§g‹ _ûò¿áWi(ªi–êéel®§*Â%^•o 
+Gæžù¦´™ï@ö+vžRˆìqžõNXÙ$!ã#\NR@P° õšC~ÿÄCÜÑq1¸_OΦF\8öª¾ag'5,X$sÞªä³ZщÜ:
+ІåU^õ™l̍ÀžµxO
+çÌZ-æÙ-„‹ßµbȤqÞµe™M¹(§gLŸZËwÉ9<ÐX>”S°h¤;´Ä1j »%E3Ybב’1Ê
+¹m®¥<¬¸VÛ¨eKÑuo8ÁÆSÒNÛö(6ýÚè;VU¬K{ö©¢ò¸ákPR)‹ŠLRÑրqJqIŠ;b+3ZÇØý÷
+$…ÇÞZÔÍ\uΫwtª³Êî«ÙÏ佅-g_!$’AµI^•%õ“&Âàªôê*™aYãhåN£Ö‡pZ”£‚fSû©1ëŒ
+رˆ,J ⠟[’HÙV@Ãb×,Š\üجäÑITòÀv¨Ü¾zñVAéRˆ€Á#5;”™4~åWÇSP^àÁ.?ºjÂýÌtª÷#tl£©¦‰g(5,æT”ÊJáˆEß¹`øŠÓtÎ"˜³)
+
+€3ùÔ×m¼“o¸‰]° ‘ŸÈՋmNR$[eb?¼KȜUÝfs’jÛÇúŒÀ¿úÕXÞgþYÿãÕÕßÙZ,­´
+qÚ0+Ÿhcÿžkù
+“ZdR§Æ {KvR¦Áô?¥³[0öøY|TíèÿáˆST¶cƒ½=Èÿ
+½=Ø…R©ÔÆX*ñÞ?©zŠ®—¶Òg(Ç÷¸þu2:H3+™Sš¤ÓØç•9ÃâM£<Š;R
+»€þÆÝÅMö‡_ºÄTFbNIÏց‘óÅ*FaH„'—ÏJQ=¸§oÁÿ
+_4Ž†€b?Ý4DŽªçnLgÿC5Ô*[#҆3挖Î8¨ cÒ¯ÇÍުɕsBŠ£µM‡u;y§E×'Ö¨–k&qÈÏÊjhYf\Ùàš¡àwƒŽÜT‹¹‰ÛҁBc²t`N^³L7}jvg˜ûÒª4ŒŽ”ŠKSI."ƒ
+’\QT–õÕؼ QLÖ̽o©¬’ìt1“Ó=ëDsYº¢½«GÃîÁ­`1ùR3¸ê3IKLÑF)HÆ)”¿J( úVn·Ÿììö+LñYšæ?³WŸãæ†2>áÏsRÛD²õ$֘±‘ 9äàÔÚ~?|¼’ËÅ$1Ò%£UqÐÕÿ
+Ûæêv FÐEV¶æ6‰H’E3KÔZÃQfûñò6ƒ€iTWZNVgu‹°ƒ£a´=+'þc‘ PO÷ÅKý·g$yy‚H;k“ÙÉs#E9É
+séTu¨ü˪Çñ,ÌU½qTõmîã ˜Èêwg4áMÞìR’hȕ
+O*{£hâ*Çá“ûÌçÒã˕—×pÏøT/¤JÉ"0ÿk#ükdRTºQ}ˆæˆý«˜ßd¿‹ä›hé¶LçG©'ˉxãîgõÇ5µŠ:Òö]™_røáò9ë›Ù.cꀟ”±g©,¤O*¹ËÏå[%C¤ä…¬í™J˜SÐ`þb—³’wL¿®Pœ=œ©Ùy?øbºj–Ìpw§»ð©’öÚLí™F?½Çó¦>—jã
+8R50ã#½s7±ùR²×K#l›û£5Ë\HÒÌÎÝIéIÆkBÍÈæª(®‹Ãö‚t2 Æj‘2¼–죑UdŒŽ1]D‰å íWR:ՏxèH
+"‹H¢® &¦,¹éG€ˆ) )'5ev÷ =¨@V1Ÿz‰ã UòaùçM™á+ò#)rzÒ`gôü*¼ÀsRÜ7Ž*;XRà9iÕGFïI„§¦‰8ç­BÃkãҜ’eÆI«.ª:jÌP°ÆÑÏcU¡s»Ô
+Ø·pñÂ8¡S1·%ºÕ•ƒåZ<’=1UÞØ¿N¸ëT;ØÏÁô¢´—O—hù{QSb¹ÉáÓßÍ<¾a^ƒÒ´@¥¢€RÒP0Å͸¢âiE6œP1I¬ím@Ò××~kB³µÃ‹ÇRô9¤'É<ñœb£Fxǘ‡U?»eíº˜[÷Æh&›QšHö«ŸîÕ Z“ha‘Ò†ɹsJ€ÇjM´g‚ì\æ—;OÂrzQž(ò;`àCJÒ''x¥ P‡rEªB@\Tq’õªz–ëLLr Áf=*í¥â(
+1óË+` =*#Ì`äV$@®Ÿ çÅlZÈ<¥9íY²·,ˆsށQ×4á2ÔÜ,gõ5 °ŒzœÌ¸ëÍE$ŠAæ¨V3Q!:DÙr%V'ÖœúÔ³9ó$ñ¸Ô8$šÑ
+ãOº­ ‘}óHy§”tÆ—8Èõ jkQp8<óJÇé‹Èô§´R$÷ëL'&Þ‚j
++¢ð’ÿ¦ÎOAk‘šè¼*ÓfUÀ%;Ö5ŸºmKs¦Á?68íYšÏœm€°9ç®ÇåÇAš)ÊðkŽ,èfŠ.Š‘1%{ëZ,
+ɏQVp»~QŠŠAŒý;ÓZ²'±Ã^.&qþÑ©ô¾'8ô¨oyžCêƦÒø•½q]ñØç:Ø?Ô©5/¿1/Ò¥éÔU€v¥À Ð)ˆ);ÒâŒRÅ(™À4
+QE&)@ .'4¹8¥¤é@\k*·ÞPqê)†Þ"s³òâ¤Ïµ:€+D9ÁaQ›6ÇÊàŸqŠ¹EQû<é÷_îœQ›”Èùÿ,Õú1@¬Qû\«Á ‘ê)âôg” {´FF1‘M0Ä˂Š>‚€#[¸ŽrHúŠzÍ¿ÓgõCQ!žî3@õ-:ŽôµDÙÉÎ
+ŸëFÛ¤ù¾n=óúP"÷J:U´NŸ|ué¹qJ/2ô8 w.ŽiUÔ«¨e=ˆÈªâñ02¬*E¸ˆñ¼gߊ;l2K+i (û#Ê¢“J¶`6†Luºþul21ùYIö4ê—¾†ñÄUŽÒy˜ú26LÊ=gü*Ñæ vI_SkjŠ—J/¡¼s D~ÕÌ1i¨F6F\(é¶LçIöI‘(UL×»GZ^ÊÛ2ÿ´¾8EüŒA«Ï‘”ŒŽøüjdÖWpß Ü†É­GEu*êOPFE@öVÒ ×åþTrÍlÃÛáeñS·£ÿ†!MZَô÷eÿ
+/m¤ í:…ô«WƦ?ºÝ<Ô£!oÝÌÊ?Úÿ
+/Q.
+¹T}¸8q\¼J2+»Ðì–-L§/(ç4‰c5ä‡VσtÙbDd}+jâÐ1$ÝU$²$\ôª$À“õ¨95®Öhcæ¢ûµLƃ84¬4T³È¥äv«V—Ë¥S ã4ðN2)$DªN=êÈEÆÍVwÇãQ3c$ô«‘ø
+ïI2_i7ç*·QPÑv5,ô-Fà1*¦Ÿ>¨${¶øÕµ^Õw}¡€=Ž9ü)¯¬Ì»wn{
+nje52Ú³c¤ÚAb®08u«-nÊy{Tr&8Å ¦"aéIJF(ô Ç"·ü*ö„„uÙÅ` “[Þ;u''û‡eî›RÜë'iɍ5ƒq‘ëR’C1ùÔʽsøW
+6b¶åûÀ`úT.»Ü(éOÜ
+òzSGÌwdü½M\^¢kC‡½ÏŸ'³‘Sig3·Ò£¾ÜÊ?Û5&—þ¼ý+º;ýN²Ûî
+urciÉ®ZïkÎÛzRéE›Ã0Ä/µq¡ÇcZÑjÚ¤Ɗíä§!Lcúâ²#@JSŠé¦‡jÆÐŒTû.Ì¿¯ó|tâþE×nD›™TƒÔ Š´¾$sâ à‚¥:„Ça
+W¸5¢4+W³ß$x9ÎTcùSåšÙ‹ëY|TíèÿáŽvK¸¥b~eúŠ¤VèÃùUùô¥,|¤lØÿR’ÉÕ¿ˆqGï@åÁOi8‘îôéëOSÈZaµ“’G­3˗8üésÉn‡õJ2ø*¯žƒ§ŒŽ½ic_Ýá˜óҚÍ+ràŸªÓØàgv{X‰åÕ¾ËOіáˆ€Ni÷ ¢«ÀòsU’p?QI$ŠêB’>µ^Ò/©„°Uã¼_çù&|­@.dIwc‘Sº°?tŸ¥V‘ʱR¼jiÜÂPœ>%bÄ·ÂT£]ø¨ä‚8¨ÁÎÎ*U|ŒcŠ£6[Œqך°ƒ*05kµUÎEXˆ±lŒï@‡Æž¼PŒ–^µ;§ËŒÔ&M„¶0zEÂÂàtÑLûKö¢‹ŽÆ£HªáI4¬Ê£$ÔO¼›ó‚:SDœ¿RÙ<ö¦;–2>´z®Ñ:¯ÊNr*HápFâM!Ü·ŽhØ3“Ö€3J(Å/N1Nc½ÃéYºÊÿı³œŽ•¦k?[bºHQÒI2
+Li’’
+Cþ§íQÎóJWýе12³žõ<.=­L
+¹ù©
+$ŒÌÍ*ß^FK‡9ÅU3ŒR‰C`t4Y
+aêº/’¦XrÉԎâkªÍk/—xœžcÑ##ÆT‚U‡5JRƒ šÐ󧌩¦àâµµ›_³^¼cîžWéYt×le̎f¬ È+wƒv¥'œÖ"¹¹á@ÇQ”ƒŒ!'Þ³­ðšSÜëíS“ÎxÅV»™- 2ÈØã½[)¸ƒŽ*Ž¥fní¼¾˜<áZ2;¨nã/ÛÁ¬ÆpÄMTÒ´Ï°ˆg늼«ûߛtíTž¢láo†.%íŸçOÓúOáLÔF.¥ÿ|Ó´Î.?µÝŒ:m·ú•©ÅCkþ©~•>+AP(æ”BhŤ֗µ—8¢“­ÒQ҃@4fŒQ@4¢’Ž”´u¤#4J@.3F)3J4À1KIޓ½)Q֊BiG"ŠQҀ
+)i0M¥š8¥ï@ E'4´( P0¢ŠA@…>”RÒf€bŒœ”ROµFm" ¤{ƒSњ¨ÖKÆ×#ê3Qµ“çå`G¿P3Ä7+–Àôj<ë…ù˜U­ Ph˜÷$l¤F2;VcY¾~VR=ø®†TV^@8îk›ººx¦tŽNúÐR‹{[BðÜÆÌ ª6zñZw†_áÇ=ªŽ–./ّB’‹’qVRžˆOҋ‹[–¬¤PùoÒº¨+ïlcƒ\¼VóɓmÇáHÞt<6åúŠX¸/H%I뚢Ò3çÓ¤-/ÞbiŠ„w•4È@ÆqQîù¸æ–Hœä® ¦~>SŸj
+˜‘¾Ó8TæÂ'›‰PñœªRB±ˆWŒÖv¸„é°–ãsœ
+¦`͐0sN¶j7H=iUÁ B¿÷ K•Ú“?8šSׄÎ=)Œˆü­ÇJš426dúS#¥tUåÙ¶…­]OL›G”,À†lô¡Ì ©ÁëGQ) 7½QƒêhiñºòIFpy47ðA;G4ÝØàq@^IcŸJ5™›‘)ðÛËp¢³l ⑉ÇN;TÖ÷÷6‰*Á&Á(ÚÀ¢†R+ZÚÊÊâ²ì,ª»™]p?YlÅØgµH˜ŽEaÁ¹#ޟ֐„¡Oc@…#ž´}hj3Åu¤éÇjržiZ¡ÏJô{›h@Œ ~ç<×}£] Ë%Pma\˜„tRØÇÖǛ®AˆºcŽ=±cŒúÖv³§ÉxË4C÷Š+<j—0)Šx2W€k7±~¡âe_³G.pû¸÷­½5ÞK·Œ6Õ®u`¹Õ§W‘vĝ‰è+¨‰
+¤R:QAôPM&(ïKF(tæ—¢Œš-%t Ræ“8<
+ â€{QڃE£¥! 1KEw Qҁ@¼f“>ô¸ µ%&)hRÒ
+(hÍ%-ƒÖŒsAë@ƒF( E]EŒvR²õÆržy®Îâ?6CüB¹™­v1œPkNI2K»‹2Æ
+Ø¡…òÌÑZBܐ?Šv̈¢yPº³:žqQ˜ßaq»hïÚ·,ÖæÃN–·2#ò3Ú³î/$šØZ"QÉ#½sò¾Æéù•bŽY‘K0^¤”›.Y ‚ûGpMhØË=¥ŒÐ,BDç­2Kénm͜P¬JN[oSE¥qÝ>¥á–e.¥ŠŽ§4†)Bo
+vúÖ朳éö’'ÙÄÈä`ÞÕíô³ÇöU-Ãá•ìþe Hîny,Ä(稦šâÞLolã®Mmibm-d) ”H¸Ç¥A¨Asur±˜—~ÝØà`UB-î)NÛ3 ÞÍ»–?0NòH3–9èkDir´›@@Þ¦ÝX¾ŸrŠàwÊr*¹lG;{›gMŠ=
+iÊåÛN:W-*²ÄsýïÖ¶®u¹¥¶X€9 1JȸWï~ ±lU$D·3˜äœÒch硧L¨ òzŠ„¶@“Ž”ÄZ‡ËØYјúŠd“6ìǕ8¦ÆÎùIæœÌŠ…GsœÐhÅd ÜAfòúâíƒÏ+JàcžÕUˆÏËJŒU²9 \†·sýM\±KWYZæFO”í
+2I¤HvȬÐ2¹•Êã¥XŠÊG9ùGæ¶"³–å÷ìX—»»l¸ó J3Վ+‚ÔÂKÜ ’ýjÒÃh.78Ì`}Ú莬tq#1<q*W³V™blc;W­K˜ìrX‰2beaT岖3ó-ww:5¾K"(þÍfϦ: ÄÌG÷XP¦˜¬q®¥3êiçÕ¹=œeˆ•LmÜU‹tŒŠ@ì}j®t;‰ÔÅ88íHxg4 †æX—9éGlУ§c>ÔÂÃ~hšyLt¦g&€ø«OCԎŸ9ÜO’ÿxVe
+}*g%bã.Vz$ r«"JqÆJWUn
+sÉÅpV·³[>ar¾Ý«Lø’ø©»ô'oZãt$¶:H³©XЪ1ŸJ£«jÉa E;ç=è+›¹Ön§ÇÊ1YÆB͖%©<֑¢ú‘)®ƒä‘¤bìIf9&š3M¹æº-cÇc½á/ù
+? Œõ¬÷­ï
+(¢“4 @æŒÒÐRS»S{Pç4
+£4†€<ÑIŽ( £9¥¤ ¬ÛÛ2Ù+ƒZt†€9¡–6åX{Š’ÚõѶ¹${Šê jF
+³2nÈ皧§ÂKo'
+=kný“ìr†ÈëéYp[ù–¥Ôœç ®šRos)é±7™m+´(ozǽ·0Kƒß‘WM“ðB{桞#•žqÆks&ÌФŸJ–5Àç“VD)Ž¢¥ò—hÉZ c-ù5¹¦?–܀ǭgEo¹rAýjÁ>ZVqÚš`vƒS1YÆ
+ϟ íMw±a=ª5@>N£9攬Àúö©H¹lˆ¯‚ÙZ½uÀ¶]Á³Óš¡¢.r1Ú­›çƒh·Q0íÖ¢NÃH ÐÁAßÁ'µ[‚XæR¬‹pI<ÕT¸Ì;˜dŽÇ¥Uó9Ü£iô–¥-Çj¶P”ِÙçÅssÂ`o&Uù*ÕÐÁ%Šä‘Žj“ »…áàS[A“$r·V¦)=Aä¬ØÙæFñ±ÉNA¬ÉWkS[ *OS֜1Ž•RG~•3¡¶œdzRÐL㥥î) êM֔t síJ~^)€ßzrõÏjB1ÍàŠ.yÅÇ¡§žM4}â/z\óL'šzs@
+q[Þ%uq”`ÖüNÿ`Ö5¾j{~sœf™ Y>VPø4ñ.á€0) ã§5™G¾ï.0¹ô¤gŽ1Rc‘žsHÊ sTž ìpz7³ŸöÍ&œÚ?
+“Uâþã÷ÍE§ŒÝí]ñØç{u¯0©éVV³ÿRµdU¢@ÐéGE½(¤£$š3š)Ã¥&3K@%(÷ QIžh{QšZJZBhí@ h\ñF)=©{P!:SI֗‚”g=hPšm¹ ç8¥£©¤ QڛÎ( £­iGJ((£¥-7ږŠAKF(€ QKҒ€a@£­¢Š(Ï41Ï4«ŠNô P4ÓO4Ò3õA˜AØ×;åyŽì1…ëšêîâ@êMsï!$äÒhD֚œP[¬o¾•:ëPqº9ÐVkˆ‚ƒ´þT‘ùMËø
+F|µà)ÅQ)äçŒÓ·°ç5iLyÆÓÉ¥qƒhžNuÍZkŸ”£²1ëQ'–ýAÅ:Gˆp¿`“dM"ôɤÝã½J d}ÓAúCh½k)hþvRv ÜÇ%Ìi»å^™ª*Fì âœÛ;y¥qX¶òI½°üfŠ¥¹Ú¢‹ŽÇÿÙ
+endstream
+endobj
+38 0 obj
+<</Subtype/Image
+/ColorSpace/DeviceRGB
+/Width 467
+/Height 224
+/BitsPerComponent 8
+/Filter/FlateDecode
+/DecodeParms<</Predictor 15
+/Columns 467
+/Colors 3>>/Length 14713>>stream
+xœí} ¸eEuf]Gä%‚4H2‰Hl¯òTðòèæ)—·™|8>F||¹$&~݈€""Jƒ¢\c†¤OF3Œ‰ŽÌL³¢@·M7 ˆ´´$£MŒ
+ÝÄ("6àãÎ>{Ÿ³w=ÖZõصw}ïúù¾æžÚµ«V­ª½ªöªUÿžXûÐwƒÁ`0ZÄÄWØò2 F»˜X·ñ{©e`0Œ……‰{¾ùÏ©e`0Œ……‰õÿKùãÈWþŽûò cã©'ŸúöÿûÞO~òdÜbwÛmçýï¥;î¼ã¼©¢€nyçææ\
+š˜˜X³fÍóvi\ù FG±a݃½êe{.Ú=n±[·üø¡oþÓÔч̛*
+LlØôýòÇÔäÌìiñ÷Ò¥K×®][^Ò~.[¶,˹ÝûƕÁ`twÞ±á´Sú÷Ÿý"n±/Úå·ÞvÏñ'M͛*
+LÜû­-¼ö¿­¬y'&ª¿Õµp±æ}þ‹_W>ƒÑQd6ëôSúql›µû./¸E2‹íW1'¦oBLäþ'£HšË²ÿæÙ憗Šÿï!U1¼é¾G~Pþ8bÉoeö4[ÞæW$³;a®\ökÞí÷ÜOºüðÿ~ߧþý’“οpé‹žÝØßÓ#¿†­k?yåæî}êyËOÜ#¬5Åc0¾üÅõ§Ÿ~L«Å[nùÊ ¯;ÒZņ5k¼ï~¬œCŽ8|jÙ2×*žxª4³#dkω{×fU|uTàk¦ŽY¶aíÚï¿¿ªbéÒA¾‘yž››ü='^ôÂË*
+LÜÿ?,þò}†kÞÂìŽÊPj/nË×¼;,Z,]{ø†‹V/zïE™…züî«®ÝxÈy+Nt3VՍÞyÿÒ§®¹uÑ[?yö+†?×n=qé+œju†‹x ÆBGf³Î8íèŸüüé¸Åî¶Óö7ߺ®4‹DŸ¼ò£_øÜuX9oxÓ»–_ü~Ç*¤5ï„­y³í§þëUÿç «Š ð†s=âð¯ßw¿œòî÷]V‘-«Ë*†å~íTþxõ/®y5?Cösôo±ì-Ö¼;Tø7¿paf¡Þ·lOío+\2ƒy¶¬™½bˉö†È¦6@<c¡ãŽÛï9ãôc~ú䶸Åî¶ó7Ýò•“N>jXÅiGÿôçπ9g¯¼’¶¼+.¾®b§çßt뺲Š3Ï8æÇ?ÛVÙ½|å[Ä{ÖÜýõ{ï»áóQÜxöÿXþûÐ×qä±ËÄÜDuCî«È
+Ú}×nºy؊|ûÑòÇaûï­¬y‡÷*–wx[¾æÝé%¿'ÉÿÍÿõÞՋ.|ß±{*ësïþŸæ×ùëÞôªü¯ÇîþÄ·çÿà·}ê?O–™³?þêE¶­wÌ^}K.Ùao½æà‡³t¡"ò<žxÍ9€á­n/ª‰tÊÞ·¯~ û±÷)XqÜ^†$øE»© zŒ…Š/®^wæéGÿäIØ,ㅻlóÍ_yÝ)G«8#3îp×^qEay3#+§—‰ç}àp™å½E«âéҗ[˜Â¹Ñâ÷ž»ï~`ýŸÿ›?—Kxã[þô°©×uì±Ò¹¸kˆÝvÞþ¦Q+†Å~ý;•?]¼—Ëš7ËPXޝ÷9@ª}ãçÏ_½×EïÏ,Ôãw~ôczÁù'½¸ºåî_þÐA<ïøEê¥wˆÏ^þØëþü“JQbÓõ×n9ù¼ã«RJl½ãÚϊ·(µ”þ•x{^T–窯4¸q˜™õ«ß|`Væ…-Îùø9¯ÈþØxÐ ÅrcQµ)Õ"½fc¡âöÕëÎ:c)¶ ]wç_Û°»÷ÕSSG<x)3‹7Þ¼öäÜfÑU|âò˯ûÔåÙïz÷ßóÁ‰ö*²•ûÄhã,7ŸùÎÙp ¼î®¬-÷Å%¿:3»Ç—]Å?[ºŠ_¸Óöe&ܼ¥üqÈ~‹ªØ2°!ûW¾1ÇÆÏ¿§÷àðïWŸó‰·Mnú|ækù_ûL¿ÿâãÄ?ñÑGO*¯o¼íїüP|é{
+[öx–çæj)~èÌÇÞ,²<‹²Ûe+û¸Y¾éoÿäáÿÛ'7J%Œþs³8U®¿Q˜R( FŽþm_yý™K±5ofK¨‰?xù¨YÜùù7Þ´vúÔcŠ*Î:séH¿üòk¯¹$ûã¼÷®”ÓËÄó‘*vÍ-oUÅKŸxê™|)¯\‡ ë¾|çW×o(Ê,‘þš#§Ž9áÙRoÍïÛuǪŠßø§­åƒ_¶'U61úYÄüîúÛKTù7~î¼[÷zÿŽS–¥™µúÑë®}û+Ė»®ùïâ­ÈíW‘"߸ê±}öùÑ^§]ó–Õ»ÈÂe~ø±“¯{“fzÕÛ¿õ7ïÚxP–G.A)mëW\}ëyçuoړ¼œÁ` Ñ¿uí™gâ ҏ\~Օb÷^tñÕï¹6‹»í”[ÞӖUœ5¨âY0çÇ?òºŠó/½¼´ëNÛÝ4ªbuVÅKŸÜöK=²![û¥Ìì®/kÉʔÿ~ÍQG.=á°Šwx^fyOÉ«(0ñÐw/´ï‹ oƒ|h¢@éa(~.[³æ¡·þ‰šå¡Ï­¸u¯‹/QŒãÃ}þí{_tÁÉ{n½ýãW>pðàꖻ>vÙ7¾ìüi7îùÅ?þâÞEz–²êÑӀ<ÇiÛ\YùŸþê¡ïü‹7½2ÿ¹õö»¶œ|Ü+·‹"qP›}û¤R‚^ÚÖ/¯ü¬øÃóOx”¼Ñ”ŠÁ` ±ú–5¿Ö±?}
+¶¼»ìÃ+?|vï%ºö‚Ë>^záŽÏÿ»ï>åôemVñĶ_›cåÊ·Xv^ué‡Ê*²?úÈû×­—S.úð‡³EïÄÜÐÛ;WOˆ]vx^YE‰ßû·òǁ/݃8=œYÞ"ó×¼ËÏùSõúC»|`¡Tççcw^}Ùm?bŸ×*~´×9ÅÕ,ç_~=¿|è;ÿòͯ*oÌ3‹³ÞwáÉ{n¹ýš+oF]öGŸø/múì}æáßJµrÎ}ò{•Äß:õâ²ÒR¼Ñß[>óžOÑy¯yÇ'ß1i½Ñ
+Óƒ±ÐÙ¬×Ÿ¹ì§OÁ Òµ_þÒWïYÝ›¯O/½pÇíþþ¦5¥Yl§Š'Ÿþ•t}èmÈþ·öŽ;î[wO‘zøÑG{ÒIk¤”#Ž>jéI'I'.*ì¼ýsË*
+L|óŸ\þxÕïî^¬j—å!ÇÕ
+‡rÀÞ{G>qôè£[xð;qjÞTQ`â[ßÿiÜ: ÆÄϟüÅ}÷~c۶ȧ‡wØaû#^{ðN;¿`ÞTQ`â‘}"n ƒÁ 1ñÈØò2 F«˜ø‡ü,µ ƒ±°0´¼vLnÆ`0ŒX¸øâ‹>±«-ïuסk ƒÁÐðÌ3Ï<þøãÏ}îs·Ûn»ç<ç9ezÔ;!±/Läxú駳[Øò2ZGÿ܉S6Í~gýòýìy»ÍŸ<rñ
+ŒVqeyÏ*,Yöoös½8çc6Ë[¾ð8Y4C±•é·z̙)¿:¥yP=ý¥¤`ñ¸þT߇ÚÝ“„eQiî8´í¤õˆ
+iÓOS–×·_œx—4‹°‰€YÞ,%ûù›ßüæ׿þu‘¾æ,—Tn^ŸDé™rY‹0ó™þY}i[<4~¹Íþ{Á·³JŔ8ûúõ§Þv¤dy«÷!éá‘<M.­R˙Á†ºæí¯ª4v=7¼«¢9rªDà¡1šd¾wºÌÍ•'}„uý¨ŽtHÈ7Ë0wš°¼¾ýBX^¯ö
+1ã °:tÛÛëAûÉà8ToÅ SsÏ*ÿ(Q'ó5oË«‹·Yˆˆ~^4öõ͕1c1`¥ôÌ5z#’I´<t¹ 3
+ۂrÔ×
+º{ç¿eœ·Ï+¿˜0cŽ,PcиÒÛ@.0R_9]ù<$O ˛†º|¡¶'´¼`ý%@s$«A6Ù+—ÌN®Xa¸«Â!™º–‘ÇÚUèâ »G,5ÛPÛòÊҀ
+Àz&6J[’©‘''Ê&‰rɈ.ŽŽöâØ4`;lXz·-o2=3cN0´×o‹1G+G&ŽÐ"Ëͯ¾ õÔºÐ6¼7•_
+;tÍÛ^ÿTiìznxWEsäT‰Í1éX4oTžôÖõ£:^Ð!!ß,#úW߃ê…‰X^¯ö
+<J0cN]ËÛ6cZŽ‹å–°Bå-sÔsã à³!&ÿXòÅSÕJåµÍ{ÍK•ì–¶æµó6ˆ€öR A‰ÀŒ9cÌA3èFu8¡(ɚ{By‘ûÈ;¶îG$cÒ±/àŸ=6±¬Âô#‹¯
+wŸE?,oP½f{á6ßöùS‚s:ǘC\·›µz§f…RY,°{Œ}ÌÅ®_hr¶Æ¤ƒh{ÂxCx¯›²¼˜~ª+Žtv:¢oCP½t{Àz‰üéÀgØ‘춙g`=0À–—;~;Öà ly £m°åeŒŽX3¸o;É>R—89ßm|ßòc÷ßc“Dãs˜1gÌÐö“`ìÔ!ÇN&ÞqN®á8¡T©Îy±åÍÁŒ9~²BZ`Ì)+×lÃ@ä'Ó½C³¼@ŠšÚðÔ#þª`l!lþ¸XÞ:q|¢oÃ@©ˆs‚¡$ê·Å˜ST¬XÉü\º·++ȏ¦ûÊã *j©-f¢ ÔùªqË I÷‹õ‡FŠœ“#¿„M·ÎŒ9˜àxC»RéI0Nυy'´†O¦t+˯”?53#z‚\B‚z¬™1§kŒ9è‚™™°üäÂßCo؞lJO詜¯È¦õrnE‚õ… ù跇GÃ[}y$dÂÖÔÕ/JÏ8uÛbÅX{ázr¨:yÍ/ëP‰~‡è1/onn3ætŒ1ØPød¨áõ‘'¥AKÌ£:ò‚܎ñµHm8ëx©>U”p9€fo¸<6ÿUMËë¨s X K™ßÔ§m¼Áã|pçòõ¿„¯Iû̘cúyCsô…^>¡•_}7™t°ü2WƒZŽŸ<µ 9lªÄæ˜qÀÞVµöV<ŽxÿÊ9fDË«:p€Wv?/ö‘uaŠa6 lœ„^tÔC°å]lNxÎ3½á˜Ó×¼èۇÓ܋Aj íçµÝ­&v˜1Çun·å_Œ•ã)OMÀ3cCÌ8(¬ÝöözÐþE28ŽÕ@1ÈÔÜÁ³Ê?JÔã Æ|Í[Çòêâm"¢Ÿ=@}s¥D̘C X)=sÞˆäGÒ-Ý_.HƌƒÂ¶à…\õõ€ë/©fg?/àT“ È·QÓòbòlî÷Åô4aŽ}'?o oƒ®ÃžÅùoç̘Ó9Æ q¥·\ `¤¾rºòy
+3
+…;t¬‡…Œ!Q#°åe0 ;/¨;
+vÀ¢ý¥®sÅF!ó<ª;gÆ(ŽØ‡éÆV/ÔªRÃÊ;†o{¡üÉÁŒ9]cÌA-£‹å…ŽELª±‰= Oج9¥?ô´Žçaêsn“åEpði“ÐOˆ·Áéì™g¿cuô&æ×^ CP"0cNÇsÅJçjlÞø´|O³Gõ ôKD”’¦aÒ±,*͇¶Ýƒ´~±@!múiÊòúö‹Óïò‚f6˜1'8$ºŸ„1G/gv蚷¼þ©ÒØõÜð®ŠæÈ©›cÒ±hÞ¨<é#¬ëGu¼ CB¾YFô¯¾Õ 5±¼^íxþ”`Ɯº–·mÆ´Ë ,a…Ê[æ¨çÆÀ3fCL:þ °ä‹§ª•Êk›÷š—*Ù-=lÍkæmí¥‚s:ǘƒfЍêpBQ’5÷„ò."÷‘wlݏ.HƤc_À>)zmbY…éG_î>‹~"XÞ zÍöÂ;l¾í%ò§3ætŽ1‡¸n7kõNÍ ¥²X`÷û˜‹]ÿ¾ÐälI'Ðö„ñ†ð^7ey1ýTW é&ìtDކ zéö:2þ€õùӁϰ1"!Øm3ÏÀz`8€-/#
+wüv¬†Øò2 FÛ`ËË34±6fpßv’}¤.qr¾Ûø¾ådžo¿Ç'‰Æ3æ0cΘ¡í'ÁØ©CŽ64L¼ãœ\ÃqB¨Rób˛ƒsüd…:´À˜SV®Ù0†ÈO¦{‡fy5%´á©Gü5T%ÀØBØüq±¼-tâøD߆R3æC;HÔo‹1§¨X±’ù¹t#nWVM÷•ÇTÔR[Ì8D¨óUã–’ïê&9'G~ ›ns 1Áñ†v¥Ò“`œž ó6Nh= ŸLé
+_“ö™1Çôó†2æè ½|B+¿ún2é`ùe®µ?yjAsØT‰Í1㠀½­jí­xñþ•s̈.–Wuà¯ìþ~^ì#ëÂÃlØ8 ½è¨‡`˻؜ðœgzÃ1)¦#®yÑ·§¹ƒÔ@ÚÏk»[Mì0cŽëÜnË¿+ÇSžš€gƆ˜qPXºííõ ý‹dpª7€b©¹ƒg•”¨ÇŒùš·ŽåÕÅÛ,DD?/{€úæJ‰˜1‡°Rzæ½ɏ¤ Zº¿\Œ…mÁ ¹êëÖ_RÍÎ~^À©&?o£¦åÅäÙÜï‹éiÂûN>~ÞÞ]‡=‹óß2Ι1§sŒ9@ãJo¹@ÀH}åtåó<1,ofèò…ÚžhÐò€õ—Í‘¬Ùd¯\2;¹b…áj¬
+‡dêZ^DkW¡‹c$ì±ÔXlCmË+K>(€~ˆqÎgØžvÏÌ3°2j÷>[^†
+wèX 5B¢F`ËË`0v^Pw>ˆÌ¶²åetè†é¼D´íC¿Æ,}„n÷Kûz‚sƉ6`lë™Ø(mI¦Fžp|œ(›$Ê%#º8:ڋcӀí°aéݶ¼Éô̌9ÁÐF\¿-Æ­™8B‹,7¿ú.ÔSëBÛðÞT~)Èû;lQ€5­Y ã
+ðiùžfê藈(%MäcYTš;m»iýbBÚôӔåõí§ÞåÍ"l"0cNpHt? cŽ^Î 6ìÐ5oxýS¥±ë¹á]͑S%6ǤcѼQyÒGX׏êxA‡„|³Œè_}ªj$by½Ú+ðü)ÁŒ9u-oی9h9.–XÂ
+•·ÌQύ$€ğ˜tü`ÉOU+•×6ï5/U²[zؚ×ÌÛ ÚK1%3ætŽ1Í Õᄢ$kî å]Dî#ïغ]ŒIǾ€|Rô<ÚIJ
+ß~5N7fÌaƜ1CÛO‚±S‡;mh˜xÇ9¹†ã„P¥:çŖ73æøÉ6
+1ã °:tÛÛëAûÉà8ToÅ SsÏ*ÿ(Q'ó5oË«‹·Yˆˆ~^4öõ͕1c1`¥ôÌ5z#’I´<t¹ 3
+ۂrÔ×
+²É^¹dvrÅ
+Óy‰hۇ~5Œ9XúÝî—öõ<3æŒmÀØÖ3±QڒL<áø8Q6I”KFtqt´ǦÛaÃÒ»my“é™s‚¡¸~[Œ9Z92q„Yn~õ]¨§Ö…¶á½©üR÷wØ¢kZ³@Ç æ;
+t?º “Ž}ø¤èy´‰e¦Y|MP¸û,ú‰`yƒê5Û ï°ù¶—ÈŸ̘Ó9Æâ:¸Ý¬Õ;5k,”ÊbÝcìc.výûB“³5&|œ@ÛÆ
+UÔvàõÓ0æ¸Îí¶ü‹±r<å© s<@í€f옳‚u<´·×ƒö/’Áq<¨ÞŠA¦æžUþQ¢O0ækÞ:–Wo³ý¼hìê›+%j›1'‚W(OëÐXµÃ˜£­þl–͏¤ Zº¿\Œ…u<.€úz@õ—T³³Ÿ ¡– È·QÓòbòlî÷Åô4aŽ}'?o oƒ®ÃžÅùoç ‘1'’÷²Ÿˆ1h\ém ©¯œ®|ž’'†åM̃ÔöDƒ–w¬¿hŽd5È&{å’ÙÉ+ WcU8Ä S×ò"òX»
+]#KÅ6Ô¶¼²4àƒè‡ç|†á‰>3Âä`=,dÔî}¶¼ /4îÐ9°2ì(V°åe0 ;/¨;
+Df[Ùò2:tÃt^"Úö¡_c–>B·û¥}=ÁŒ9̘Ö3±QڒL<áÈ8Ñ®¨—Œèâèh/ŽM¶Ã†¥wÛò&Ó33ætŽ1G+G&ŽÐ"Ëͯ¾ õÔºÐ6¼7•_
+òþ[`Mkø8Â|G„33½^£,ê櫟 «âkycÕ BÅÀDª7Nˆ©?˜1§sŒ9J9RÃ(Ë+Ÿò„bÝõ\ ‰³mÔß“Žy> ;`ÑþR ×¹b£y՝3cGìÃtc«jU©aå÷½Pþä`Ɯ:q©)sPËèby¡c“jl¢EÏÈ6kNé=­ã9E˜:Ĝ[ãdyQ|Ú$ôâmp:{æÙ/ÀX½‰ùµ×”̘c½1c Xé\Í۟–ïéaö¨ž~‰ˆRÒ4L:–E¥¹ãж{Ö (¤M?MY^ß~qzà]^Ð,Â&3棟„1?Þäºæí¯ª4v=7¼«¢9rªÄæ˜t,š7*OúëúQ/萐o–ý«ïAõBD,¯W{ž?%˜1'ý4Œ9h9.–XÂ
+Ë I÷‹õ‡FŠœ“#¿„M·ÎŒ9˜àxC»RéI0Nυy'´†O¦t+˯”?53#z‚\³z¬™1§Nüi
+ÆtýŽÌLX~2¨ÜCo؞lJO詜¯ÈæxðrnE‚5Øù跇GN}y$dÂÖÔÕ/JÏ8uÛbÅX{áz({Ð(‰7óË:T¢ßa «½¬¼¹¹U̘c½1cþ`
+ djîàYå%êñc¾æ­cyuñ6 ÑϋÆ ¾¹R"fÌ!X±´ú³Y^4?’.hyèþrA2fÖñ¸êëÖ_RÍÎ~^y7Iâq¦djZ^LžÍý¾˜ž&̱ï$àãçámÐuس8ÿ-ãœs‚ÑOĘ4®ô6 ŒÔWNW>OÉÃò¦aÆAŽj{¢AË;Ö_4G²d“½rÉì䊆«±*b©kyy¬]….Ž‘ƒˆ¥Æbj[^YðAôCŒs>ÃÆðDŸar°2j÷>[^†
+Ut•1Çun·å_Œ•ã)OM˜ãj4cǜ¬ã¡½½´‘ ŽãAõP 25wð¬òõx‚1_óÖ±¼ºx›…ˆèçEcPß\)3æ¬XZýÙ,/šI´<t¹ 3
+²É^¹dvrÅ
+…;t¬‡… {Šly àêŽÂ‘ÙV¶¼ŒŽÝ0—ˆ¶}èW#À˜ƒ¥Ðí~i_ÏC0c3æ€õLl”¶$S#O82N´+à7ÔC{ql°6,½Û–7™ž™1§sŒ9Z92q„Yn~õ]¨§Ö…¶á½©üR÷wØ¢kZ³ÀljS˜oCV
+uóÕOUñµ¼±ê…
+¡b`"Õ'ÄÔ̘Ó9Æ¥©a”å•OyB1îz.ÐÄÙ6ê‰o‹IÇ<F[ކÏø9Ö¥Ø(džGuç̘Åû0ÝØê…ZUŽ<%ÆÙ·½Pþä`Ɯ:q©)sPËèby¡c“jl¢EÏÈ6+Fé=­ãiM’έV𦠠8ø´Iè'ÄÛàtö̳_€±:zók¯…!(˜1Çz;!cÆ@±Ò¹›·>-ßÓÃìQ=ý¥¤i˜t,‹JÈãÝ.³0­Ÿ2‹å…ŦŸ¦,¯o¿8=ð./has‚ÑO˜ƒor]óö€×?U»žÞUÑ9UbsL:Í•'Ø]Òõ£:^Ð!!ß,#úW߃ê…‰X^¯ö
+t?º “Ž}ájŒZüÖúzÀńõ#Ë  ŠúÙ(ýD°¼Aõší…wØ|ÛKäO fÌ F?cqÜnÖꝚ5Je±Àî1ö1»þ}¡ÉÙ“:N°í‰†õà(§TEuÅ`À‘nB›ßÛT/Ý^GÆ°^":ð6F$ô™A&ëá¶¼Œ(Hæð3°N`ËË`0mƒ-/c̐(R+Ü·d©Kœœï6¾où±áÛï±ÆI¢ñƌ9ãßÇ¢í'Ê¥†¬‘wœ“ktVhUªs^lys0cŽŸl£P‡sÊÊ5›Æ0ùÉtïÐ,/¢¦„6b„};T „86\,o 8>Ñ·a TTÇòþ9]æ
+endstream
+endobj
+42 0 obj
+<</R8
+8 0 R/R10
+10 0 R>>
+endobj
+46 0 obj
+<</R7
+7 0 R>>
+endobj
+47 0 obj
+<</R22
+22 0 R/R8
+8 0 R/R10
+10 0 R>>
+endobj
+51 0 obj
+<</R7
+7 0 R>>
+endobj
+52 0 obj
+<</R22
+22 0 R/R8
+8 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 57 0 R/Subtype/TrueType>>
+endobj
+57 0 obj
+<</Type/Encoding/BaseEncoding/WinAnsiEncoding/Differences[
+1/space]>>
+endobj
+58 0 obj
+<</Filter/FlateDecode/Length 710>>stream
+xœ]ÕMnÛ0à½O¡˜|ü‘ܤ›,Zm/ KTàEdÁq½}gæÕ]t1A^H“üHš9¾¼~yÝ.÷áøývöû°^¶åÖ?®Ÿ·¹çþvÙцå2ßÿVú9¿OûáøòuÚýÞû€}õúÛôޏ?ÊI‰þ™ùºô}šûmÚÞúá9„ö¼®íз忦'óOœ×G×Ø<ÁBC™š'¤È27O(Ʋ4O¨…eů#Ë1±<5O¨úìSó„Q§æ µ²<7O¨™åÜ<¡Î,—æ edٛ'ŒZÆÚ<!M(#´L¹³„&J”ùÙhMÁPœ7¬O,‹֕%pсE”'–°Fy«&‚5ʛÎ,aòVÍ k”wÔ"aòz#¬QÞDo„5Êk
+Ö(oÒD°FyqP
+&ân¬æ^Žl°š¼™"ƒÕäÍ KXMÞD Ájò'2XMÞÄ#3XMޢΰš¼Y­°šŸ/oŽÁjò®Z$¬æçK®„еHXMÞªUÁjä>'à’€…á&*˜W­À%Gž 
+ÖÌe$à’€™—y( ¸$ qëpɁ<£\päUIÀ%³:—Lj. hÜg£‚ÎZpŒ…ȍÅ1*˜HX´r¯2¬Ù/0÷
+ WЙ"L® •§€
+–Á¡pæ
+Z5¬Yޕ‹Ì°f?Pð…PÐY­°fy°p«"!Úå5n–¦`(ž fSÐÊ}ÆåRЪ¡`e077QA+,%G.°y+;ã¥QB˜9®ž‚C¡ßór7pAÈÇW\ÁÈ$àñP° u†µ¸WCÁʘEpl»JX‹a)*°2Œ[W`-òf­Ö¢ó5•°¿ÏE¯ðã¹åƒÌ—ýñóçíÖ·»ž=ï|Ö/[ÿ÷b¿îüԀþµ}³
+endstream
+endobj
+8 0 obj
+<</BaseFont/WACZZZ+TimesNewRoman/FontDescriptor 9 0 R/ToUnicode 58 0 R/Type/Font
+/FirstChar 1/LastChar 95/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 722 500 1000 389 500 833]
+/Encoding 59 0 R/Subtype/TrueType>>
+endobj
+59 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/Q/underscore/ellipsis/J/asterisk/percent]>>
+endobj
+31 0 obj
+<</BaseFont/KPSHBO+Wingdings/FontDescriptor 32 0 R/Type/Font
+/FirstChar 1/LastChar 1/Widths[ 1067]
+/Encoding 60 0 R/Subtype/TrueType>>
+endobj
+60 0 obj
+<</Type/Encoding/BaseEncoding/WinAnsiEncoding/Differences[
+1/barb4right]>>
+endobj
+10 0 obj
+<</BaseFont/AKCXNM+TimesNewRoman,Bold/FontDescriptor 11 0 R/Type/Font
+/FirstChar 1/LastChar 59/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 667 333 500 778 722 722 500 500]
+/Encoding 61 0 R/Subtype/TrueType>>
+endobj
+61 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/E/f/adieresis/O/D/U/quotedblbase/quotedblleft]>>
+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 53 0 R>>
+endobj
+53 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/WACZZZ+TimesNewRoman/FontBBox[-76 -215 936 833]/Flags 4
+/Ascent 694
+/CapHeight 694
+/Descent -215
+/ItalicAngle 0
+/StemV 140
+/MissingWidth 777
+/FontFile2 54 0 R>>
+endobj
+54 0 obj
+<</Filter/FlateDecode
+/Length1 60848/Length 38607>>stream
+xœ¬¼ |TÕÙ8|–{ïì3wf2{fÏ,É$™!$Dr’°LdMÐ4 û¦$l
+B‰+T¨UÔª«¸5‹ÀVѪuk¥­Z·
+mÑ⒖ZêJf¾çÜ [ß¾ß÷ÿÿ~ßܜç¬÷ÞsŸý9çÞ ŒÒ¡nDQSãôx’Ÿ} `Ö¼«;:3õ¿C;oíj_*ññihø!Å ;]ý«GÝpe!aÔ¢åëfÆ{®Cè/^Ð1ÿãIOý ¡!¨£²ÅÐ`ú‡uBzvýœÅW¯¾.3þóZ„hÖòó:2õßørö]Ýq]gVLx
+hKúŒR£ñèè0^Ž§£8”'’|ƒ;oOE6Mÿ&ýÔDŸàœt?š¥O‘EÐ&ôdBKÑëé³ ƒh.z oÀŸ!?jGÛ¸®'½ EûÑ;¸JSÑ:þ=Õ~´ÎzÛðÑôñôßÐsF àJ7¢-0ãt”Òñ|/ò¡0º ]Ž: ÷zô>6ãQTJGÒ5éû õ1ô‰‘W¨æC“Pº=ØxDÿÆ\ŠÄ{áøþ;ÿÌ­­A끯ì=†ö¡CxElÄز¡\4ú¶£=pÿAt 7à|¿@÷ð‰TU:+mIÿ-Fy¨f¸½÷8ƒ0î@t5çáVóEÃ7ÀÎG cèw0ïÿFßâ<8þL~L6¥g§OsQ"/ƒ®@sÐ
+/ÂÛñNœÄïã÷‰@ü¤‹|Nûèô#®ŒçÓp%+òÀ}ƒh6Z ø1`ûNxÞÇÑËè5lÁa\Oô.œÿ5Kjáx˜¼E>¦·ÐíÜYþÖԉÔ©Ò=H\6ð°= Xø¶ÂrñR¼
+ÿf¾ƒ<CõT¤AZJ«é ÚB·Ð»è«ô·ÜJn/÷?‰ïà÷*:Rפ~—nHß ¸ÀH€yEP>*A£7-ƒùu±m@7 tð˝¨í…ç~½†ÞAB_öܗÀݯ®»ßÇ}x~¿Œ_ÃÆ_³ƒàˆ’2REƓz²ˆÜÇ]äy—œ¢ÙtÝD»áØEÐ÷9Äq\š/‚c"¿LxCULTÌU¾yvh8o¸eøãJ9SW¦v¦^Hý-=+½æB¨fºfyðà8žN<€^Ao¢?Êsý
+ÑÚA»è}ôôEú6ýŽ#\>ç*¹YÜ"î&î-îwÜ{ܼ—¯ãó»ø—P"Ì–
+O §„³
+žÌ向r¼4î0ö !܅:ñÝHÂGðŸpaü8} O!Z VÑáÑ`„~CýømªF-lŽ8L,¸‰œ&3é³Â1ZŠ1h‰ß£õ˜âðι_
+]p‰€N«mò\„ìèÐ÷gRÏ2Í¿Ço>{ˆæ£i(Zɨdã8šÑ­¨܂ä^´!ݍçƒÞŸ
+ú“ $^ŠâXÚÒsÛöÂJ  Ûà®ß‚þ´~þ;ºû@²Ž¢(Çznãê@3µƒþÝÇ|Ô
+µНÂ~þ¨Ûâ|©]À塁Íù+Ü߉*a~sÐC\>ÌÚš¹ Îx 5Ip܊ÞÀm„99oâ&‚æݙ^
+5Pê³;û±m– ÄVWÑOR“êskëúÁZ6ƒ>ªë˜ß×tEs]­Ëïo)ÈïÃãççö¡`MŸ!&AãåÛô ãûòm|KØÓ m¾þü£=·%E4·=¦œßqUsíha÷0Æྵ}¶õ'íªpqÓøæÍ÷ºhO}‰U{z6ûúz¯h¾¸×Ï`K \£„êÛ{êáÆ·
+æØgßL]¤%S".*_
+úÄ`Ï!ÚL›{:ëÚϑ?™>¼ÍÕW[ <Äb\¬MPMo¹¢_Â[¦Ïi>q™oˌæ‚Éøöš–þèk>ћ$·ÖÊYÅÇ*`ó@*ˆRï:$!Ô-÷rrƒ\Ÿ—ÄHnSžkÃh^’dÚÄsmÚ¸L›$·±Óãg4_̲`µÈND­þTš-¢V\”[.ù½ÌZt³ÑW`Uߛ â³Y݆ á9„fÐ/iž·ªÚBO¢vúÚM?AÇ!qH„JU:¡œ†Ä§Ò?ÖÕIIÈc…r>Í-:Ä:œÙE¿¤&ûÀ#÷BÃñ«Kîùx ¦f¤P6&SÌ+(:^­¦£@"ôcz¬«|Ö`´°ètµ0ý12€³ãE½ôO¨Aý`0'\´ûyú&ô¿N_ǂöڀÎXü5=áŠòý#=ûõÆ"T½ŠÞø8
+ð¤NCâÐ
+Às}‰‘þvH‚ÜZs®Ob璳RGäh.îËŽ¹xG.–*«ª‹¤“ÉÔl µEÛöp+‚+B+¢+öpÁÆPc´qW¬
+UE«öpñ`<Æ÷pÞ 7äz÷pÛ§<=åù)oMáÚ¦¬˜²i
+ù‘ŽXd(0ˆ¿áå2̗²üºïüºùuÿôëôëºüºËüì¼l]ɒ¡†AˆÒœ,ð¤ñê^ñêf{u£½ºjޅáî¨F†ºÄ_=c¨5 Õüª…+áÊ\/˜u9ÃéÊjÈR• ¨ÜÙ÷•?õ>‹¿Ã²IÃ_äœôV[ð<‰cõäÿē ^ôâӐ/‚üQT‰C?2Pyÿ0œÿ3¨ÿ”lüC ³|7ž$·?8rÞùsá®÷䯃»þ åËw½g ÿ$´þt +dwä/‡lû@ˆMpé@ež·Úˆ¡ÂÆÎC!Âf2eäŽáÊË!Ÿ9¹n ŸUËnÄã‚£ ‹°Y>‹ƒ¨I¾w (?¤åKd£ <i
+¾8¬±#ëÚ*{•iœ±¼¾ö¿€ö»ð³Ç.þÙÝ};¦7÷=éné+b…´»¥¡o‹~‘.²¢®öédYKó!¼žtÕMcíx}mËùa(@:aªd6ˆl
+MÍýJTÓA¬œä¡Ýåo©±Šãdáë·ÿØu˜C`¶4±–>m°¦O‰uTT³.NÖ¥g«L#]öõ»ãÇGºDh6kP Ùë–Ôžÿ[µjÕj–Ö¬‰\½Æ.·­¡õOoè«g1qe_e]ŸÔ^ۂ9֌üÆ7Kâó•oU’•›*·Wî®|º’_³¦šMÏÞ
+äðǪ«×¬b?7X)s»ØšØøæêšÞ.ϼ™!!Cš‰G¿øH…ô/Hº àO!= iµÐZPg_RËîØcJÇN‹¥Ec’w,ÌäÓçdòºË3yeu‘òªbuµoŒ|Ґ>‡ô=$žÑ"ùâk2\Û²
+­Ša˜>‚ÊjVÅVã0C÷êU±b‰18P†Æð¥|ðª5P É­«ØikX~îÇ:X¤MÀ°!>›¹ÌgOí'øy|Uy~ñ\’<÷ Ej+ìÇÈ¡ø硟 Šs‘
+/Ã?Bö˜øuåpååâ™Ê©Ã•¨
+ÊâY£~£ß€³9tÖGž•xôòqGáü“é“ø~Ò";Z|„<‰HхªlL ’¤ê%‹5²<þµó[ý¢2$啖<†Â|“tÒA‚ê$³Ê¥’!5'JÖµÄ}ë¿:3d4•Ç‡PÕP•øé¨î’ñÃõµ8HÃ¥%eÅEVK–‚2(¬/7 ããñjîšÂêêBHxÍ+uVM™Ò`MT°æ‚jÀº…ɳ0sÄ­L:^u|£¥ÚdúÛÁ`¨DÎ %8™>5SFÉô«’
+;çßh±BkÓuö-ð`:”Ä3Ô©‡| ‹"x¤gt:5§gÏfu:mFõÕܯlW##6Þâʾ˿t=X§¯[‡¿Î<æȳWV1”ÇpWëˆ\‰i䢧õ_üèD*³’1…±rsyjîhkiA~…³ŒqÎ:‡£ª¢bÔÌy©qt}¾T1vTäŽÔûì¹Cé“ôCxnˆÞñ¤«”¼Âdçm&Τ· FƒBÔÛ<:»`Ô*D»Î«v FBt©yŒJRˆXÌ4˦·ÚôÄâ¦Yv“X\êl—šfa¤"Žf!•ÚåJ҈¤Bª,„Tz›ÕàšYv»Îbµ:N'Ƅ5Úh–Ùìvggs=¨0šL×Ëóë+PˆƒV«Ñ(•
+AU«Ínw¹Z4³²,UúͶ§t›ÛívbOdSov©6»X„¢ $˜\åk~„±wWe¥X)ž:)žüºõäð™3¬ÊXeCù¾P<óßZ7󅱍âK› í,3üǶÕf–›ý¥~s1e©Ø„ä§A³ŸšýfÿªÖ½GêÒ›¯œ~%¾¢czۓ‡êÓ©Ó­W\™zªí<}bjo6þõ4<» ÿ:UÎRSê‰i™qàÙ ù&¦_æ5)2¢…ªq)¡ä áQíâ¡GóŸHh‰‡Bò%´w*)‘ñÄʯÑqe®zµ©^Ä-8Ê¡¢zð¼Z$gE}^gœbMd̸ïËÆ4b±P*$…Iò±¤«QŒñ~o£wÔ̘cò˜
+”²UP*¹qUÀè‚
+7º,
+ Ë`rcŸÀªs¹‘G ÷..(ܼó¥P+nÅ8ˆýç4 “¸2[@°dÙ¬6kqÛ ‹„q‘õÒ~…<à\7ßy6§…~tvææ»_ÛxscÓ¶úâF«1ÇâMŠFùènŸúäêI[·NH
+SWZ¦®’šW5ïiNi8-ÓT
+éT15%©µZÕÕ´[7C’!ÐC—‹u j?EUS™.Â+)æ‹Õή2[IAÁXYÕD¯vI„~´ ¸ö©Éd2£
+÷,Øñ.úúú]—û“7¦V„¦,ü îy—áô5yµ_¦v¾üîÓ=ý æPs˜%Ï¡\ÊÉåò”y
+ë
+<žIãr/#–œ„+ä±jù±ù“BÎì@"7×Õ>nlYÃõò5\V]íÜÜ©¨à¡Ú`Qc¸Àªp­.½µ&âÉϛ4*V>~m,:Úm)Ll..Š$¦YÅÂlÇh“6KçpœÜU· ÉïÊÜÎ]Éý
+•TRE©Jª*mSáݪ§UDu‹6#] þسJ„.ö4Q\’ÌeX—Øuiú$rOÑ4p|ø7¼àñb̪#4‹˜6x¾ÐÀ^)ËG´vÒ^z‚
+ô~Š¼Á%ñŠþã²>Ã
+îȈ—Á\B0Id\Ê҄¿àïø~ÿ$óæ&§Oуüb$¢tx CéKba€ç-,ÓéœIlL*'
+È™@ÉÁ>-Ö&ñh/è. ;
+z H´ïoSl‚gO’O$µT‚{KŽ–ˆ¢ñ¸ƒ’ùy31;Š™Â9už@2u†˜ap.P=±¡•UC­C,0–uPYaÜV8!àúsü!?'ð!}8¬åç
+æbJ~Md.V«
+…Ä\ìÕ¹™¶+G<ý¼à'ËØJÔNm™¬s€NV™Xþ#ފ¬}JeÝ™2Ê*WôßüðìšÃ»;ïL}±u^Üïp¯³…òÞtzc;/÷5îžxCûý‹¹É[ï^Ú8ç®]£\ßwÃãµw¾’¯4»–76ŒqG«=êÝܸhÓ£L‡û@ZuÕH‡þ(E­:l@u:É@%ÎÓb‹.¦*^ÀœV£CœVÇ ZHU¶dR(³
+¥’r
+‚¤À
+‡þ"ꪔ)T ÅOE¶BTUÏÄwâðÊJc¹Qì8°W¬(GÁh%x#]+±%h ‚O‚‹!ÃôЁ=Ã/’5×ìIåà3w¤~†vÓÏÞFncúk.ðû:~
+è™ñW5KšeÜ
+Ó|O'ßéæ[[ÀÉRøœìO ùX#ÌË<iL×]žZ܂U÷ß2ûæ+V­[¿¢0èŒÄ¦®éßµíêg1ÇOyò@dזä²ݑÑӋ²c¢¿¤ÓõïT(ˆqg3Т¸ÓŽ¢è¬”·FµV}­þFÕû¡ÏB‚@ñFºž[o½ÅÆU*£OƒŽ¨C ¾6peAwð…q8lçìöA;â™s2hÐa@®Äh$™4N”'å)¯=¯7ïD—çÈຐY4ûÌ ³dÞaî5+ÌŽÜ .ÊYp8OŽø(²ª…XmZ hÄpùŒFp DF!èüìÊäÎödÁ҅Cª hÑ5ùõPÊQ‡çâl“o.
+ß.~Ó4¡¾xÒì­[6†gó‹CºÆŸÿzë¼}OÞöäUƒØ}OL5×nžÞþçšø#÷îýÞR0%}’î)Р!.}bÐìÇË[sPp(1OóT5HÒµëzu¯ã×È{ø=rB(ÅŒt’Žžò§’“’,J Gu¼4¡”ÿ  þ‚Í“ø¾½¬qhùÃä¢äo’q"'qM\/ÇsϒO‘vï,J>)«ë3̂ÆÄ¡XÆ?ݬßøÒóªV󫅛ù›n„qÁB®<‚ÎVTÀSD~Kþ˜ªìÄw§¶u%f»ù)áïŸã^v¶kØêõà·à7
+£b¼^:Ü!{±·8/²¢x} [Ó­ívv»n u‡{ŠŸ°ïq>Ô>ã<>yYý²æ:«©± #NUĪ³9Cº¾߆oÒÝ¢éÇ¢
+܀ð¤h¾2rUñR´/!‹ÂK#‹‹¯Ç"kó7oç¶ó݊nåÆMÛ³¶[ïåv*ï2î4Ýo}4üTä©â$w@ù™æsígúÏ"Ÿå*tªH*ÇcŠøZ%Ò:#œ D›ì‹ |ËÌ:wµ
+ôº
+cFG•gè•çÊQµa1”†½:ÿ\ä6°°I %ŸÆ±“@@ºX%1BÉ6ÁÆV§Fg4ÿèg†€vŒ@
+’‚é’–^ ±<‹C`7~QF{œ‘}¾(œ6_ZûGönòãÕ5,§}™»°zØ\“)Õ0ËtGj/ÄÖý0Ÿ š'¹ü¡Œ‹Ê^1¼ ZËlUÚv-›WV’^.y=’â|ƒÊ Á}™K¬0ø½þn?õ¿êrä°P_^¼†ð@Ž¼‡a–qñ¤L'™T¸ë’ Óÿem;G&ÿ£ÿ\ä ýRfîÒ÷ßÿÏåŒ"èw%wønÿ:8šb² dD©j8¤T`I¥+Á<ŠÇcò¬\864"i>K DàI¦®B8 Qaá0<њê# |jDQä}ÐñïƒËÉáZ©Pâq¿‚ßÄwóO0æ/ñd›øvž´C3‘øNž€éæ ˆé šþ)Y‘A8&6a»@V›"\¥¦Î´‚s8t¶•ýä½oír:†‡vÈÄ¡!ðwì²x¾ÐÂ\DÜjÆ ®äì\ºë‡7ɋø÷³Sפ–ÎÁïÊ»VøCî*ù=MÚÐ/(àAð\G¸ç趑I#셔t·4¶±nDšô¢cè①ð<!"ÆÇ0N` ÷bŠ°ˆ}˜â«T
+z³š}v$*ÛÍßdÆæ$>°_]ïÂ&é4É”r5µ¢p¾¢ÿ¸Üؽ9,^mý4?‘ÄW K¾üD>É?Bt(æxô ÿ9™ÙOå¥Ô®®ó{²_W‚×Þ:²þm+GòÊ·íÜR'(q§-[©u…4v©œ
+Ãëâ«î×=Þ¿0œOy¾3|+~çþΓ¯24¸ˆ|_@r{<Ù*½Ú¥²fÛ\V%Q¸”c–ËrÇ úDOvvÀ(f;˜}§O’×$#ñdâñº÷€PɈKâý’V)¨ÅjU*UÊì$þ^Rà²G/“$1ØèÁž$ùRÒû$}“þ´žêó-ë‘%Ñáëdw²€rèžõ¶MS¹YŸ‰#7·êA 7ó_ŠÙ‘8„Å£ÿn7¾T©¨„?9°¼ðªÕJˆ(ý
+Ù©³øKÙ^ .ƙuHÙØi}bø_WÆÎM͜é(‡ÿÄNþìŠòè5Ÿ~‰_y·1â+B!ƒ=ñSîªîÝr
+q…þü6¬#9Ã1ÿ>€÷)D5CcÈF)1ÍñlE[<[‹ïs>ÙçÜùÌùyäoqí´>²®øgE÷ïÉy²ø=ç{‘÷¢j®"Iþ6hXTVÁ¸";PÂré¯[I±äÏàð”IÁ(—»¤6§6´Õù>~7çƒâOB
+.‡tE"µ.g–ÇšcZ…Eu9“KfãfǜÈNb‘X1ÏÉi¯è¬è®è­P:΢&šÆ™ã‰:âœ@¨Çæi,ޒó³œ÷‹¾
+š´:^ŒÚ=Xát9\DÂ9इ£öp1Ž+Fã '\LKð¨bqåã_XŒBî@1òÑÒbˆSÅÊXåÅ[ûòšníÂ+W®D+»Î;ˆ-ÝfÂ!è/•·íÙZ{0Xê/ÊìW†¬ÌwÎhk…q$ėxéÀíõÝÇ?î.ž²¹#S‹ÉäGæíܵaøúP[ù?½üÅÃó›Vwín֋ÛÇ5»È3žš«nYphf¨,¸’.ÿ±??dÏ9xí‡
+EՍS¯}ÜúÃ
+×Ã×5Þ9ƒãÙú×äôŸyèêL¤•'ŽÙ^cÜ»ÓpŸçaÃ憃&Ò³Çéõ–묷Óëƒt§s=BUZªçˆ{"m¡|\)s\äóû‰ ãÃ(Iø~ÆG³)N’ãû±>‹IZ½»n·Žè’4.ųTd‰ûž6b¯±ÊHŒN PUé³cƒÝk'v™=ì“BóçÉ~s¬u¥¼gôõÊ.N»˜Íì:ÓzæÓª¡/πÊañêk2y}— U„œaMØ\ª¤µP:ø¬¶é
+:O¹L„³²«›ƒ2҉%Ë$ï Ù.èc¨)‡™MF¹ÑÜï¼ÞqŸ>´ùƒk‡î½ùõuޅ©ÓGROê9€«~ùÓíy&W–SÃ/K¿u`kêíãÉÔW;ºÏÚÿø÷‡Ï¾g™h5»ÌJÁJ²•G+ÄvTjѸ4î[Å»ÅwD~­¸6k³x¯ù>Ëk®×Üo‹J»Ñ”åöP…ovnñ¨Rðº? ðºtþ ÍïðFõzqD­V¤Ì®l4áL@™0I&ޔL|€áÐ4)Èdq\U©ľ î ²LôÛdi´ÉÒh“ÑÍ^0ъ ‚Ü(8Y£°+Ð1B&‹Ã2„Øseìk™(D®üœˆe;=‹Ê
+;p­›ñ:8ƒÜ3€ñb\&UI¥‹²¯Í¾?ñ„}_âHâD©r–£SèTlRnRu ݊íÊí*UŽ×åöB^WÌTJ !J¿^ïU¹”
+†J?kQø ñ
+(ГÏÈ
+4I¾•4êʦ06„½aŽÐiId— ‹¬?<©t~Ï­@!‚œÅc2©dª”—£•Äs–jDK–øb
+¦z"¾hÚ\´ íýúß)5ˆ½`Èk½*.…p\U¥jT݆^)y}UbPiš.%ÅRÔT÷(~˜ì‘꾚ߠÐ1ü6y—~¾À§ñ¿Õ§µ_éìÖbkIIQ¢d¾Ý¥ÛYtw‰jdEØ7<•žºZ ²$ˆ>hÄnu¸ì‚]™vEÆFSÃ/ˀEÈ]2!âÕ.©\Ð)\³²þ@ÜëŠú•Õ—¹*yŽsñÙêz½®ˆ?8¶¤Â5#Ðë² ©Fˆ-LÍH”d%%ëJªùºª.á*t˜°æ¤Pè;õÏë‰>¬à
+«Õ±Ï^9vl4¹¬¢"77¼/b·Ù^YùSNŸHĹnwò˜O’1’VÒ5éH·÷é°.I¾“òãÙ£2ȶÀ [CŒ=ãÆc/Ë´gWmݳ¸R^Zpœ[Z8çZSµ’½®%/̟<÷UÁ%hœ«†Zã€+¶ÅÆ^¯Ðg>ÑÐg¾ÑY }a5l¤ÂV­!ÜA]+Ç7KªxqAu¼¦`<×ÚÒcï]¨ËìV]•Ú—U^”LŸ8 –K¢¾œ}4 /GÐ2 ׎ˆ¬v´²ó´döSñÈJZæÅ üÿ©Òe£Ñhy遵é {•l>>sý/f__Ql.MåË"S8üÜEª©¦0žïµg­Á¹ã\yE^üUþÄÅS¬ûÉé”áúpö#v{¸¿•j¸Ä Ø3š]šŸê0/Çâ•Q-Þ¥µª>ëH].øóAê|¨Or‰HÄ>äÃR`6YD®%=¾û|Oøù´8ÄwHÅúùe3ÉUºžúÖÑ.ãeµ×%úƒ>/ÛcEË6Š$;H¨Än9I’—¤¸õ¿¼*•ZfµÜª–YE½ËßÑzÁùÎh«3gä—ú@VN¶2e“?[¿ËFÿciÇ1±rŒTÆíô¯þáÓâY!‹Â.\>Û'j‹nš÷Àãk©¡1¾Õt _C8OZwvßt¯%«pMF _Vø5é”ÁŽõHiÓ;tQC®!K(L—áËâ-öx±ýêø:û=øgñ7ìØOá/ì:«mB¢>AËìe‰ vjMDìáì|Âf£1” µ±¨ÂVn/u”&ªŠ‹£õh­}cu¢mµß’¸ݓx=šè-ê+zÓöšýhÑG¶÷íNJ†lŸÛ?wœ(ú}oû&šˆ'Ùêãsp‹mV|©í:Ç+ö—ïÚßM|bÿ$¡Ï¬Bú¼.§?P(kð“”þ`f]Ò/k榳Í(»a‡ÝÎÔǸD<+a·%âö8ŽÃÜmN‡ÃFTJ%B‰D$ªL\ ¾#^ðùü½þ>?³Å'ü‚—T„‹0a—ЉŸÁÈVGÉFhÉ<§©,f°:ñtD¸3Ûp9ÿ”¼ÝÄ
+ö þXø.`ùE)W\ÌÒVá Ëívc¹]4•#¥½Ü–LÛo+·%²Ê3¯nÊ©ƒóËry©T2ã‹<‚‹º1­>ã
+5%RÑĬk–¾a:îÆ_⓸;>;ǚjŠMÌZ‡ÿÍ­9»v£7/*ñ­¤kçDݑÐrrõlÏùŽž¶K’þ"²)(‚_zLØ´c"5–n'Øä&8B
+f1ºM&#&$`
+˜ õK£î1=®xBý„È]‹×)6ã-
+n¼REÔTöJöŸ¢"eŸ"H”§“ÜŒ¾ÎªRŸ[r·±’ý7!’yebRöÈb/[Vœ*vžά/žûB »Ø—ΰ9¬×  Û p–JVJ¢ZW€€Ii)@6ÎR€.FVì`°,Fù-Pg”?0ÅH˜ a%¾)µ>õEêTꦏžÿæÀ5[ï¸zðùï¶^AïŠÔÛ©7R‹ñ¸³ÒæÇSϦž܂óp5¾jﶶËvžbr̒¯;„
+`¯Ká‚¢µøƒÈíËÏsG«‚A *,yQ«ÕB”
+¥…x-¾ï@;•¿6|‚TœAB5˜ÎRÒ{¸$9&ŕ֨H‘gŸRÉüöz‡¦)•: TzÍq3¹ð¦*ož='AQ)J¢ÎJQçӃΫ#ºI‘ÿ&A'Ù^X+ÈQeû†KF»¤
+ûBÙaV­%‚=” ‰àµ
+°[åá1¡êÏòÀS¹´©”½µMäwÞϽöžÇ¾³y­ÿ{À¸©;qXOÒèÍH£¹¤95žÑžÓžÛ㘌Lç$r9Áąpµ´±] Hã–#„v‰ ´åØ­i·ÜÝƄ”bÚ@é¶)Ùݖ¥ý–B÷ËRXp›¶)_[bû{ïi&1ýï~_HïéôFÒüîë!)4™H¤–×<8‹jVÂM’ºãʙ¯Þ5÷òܯ¯_Óp€" ¸âÞM‡w|ñîOúΧ÷¬ª=/M>*ê¶+ž¹¢»÷c ø"({æ>9wüÏswÒÿýùœ›œ;r`ïÞo€ž?<:¶³é]¹b`š¨¤y ¡"°50ðîiÊíɗâ/婕‰Çò¤õ®LP<à¤ÑGl;ȉ›ÁÍ䧣ŸÖoh¹Ñ¸ ìÑïÏ?ž2Ž$¿“ŸOxý6ðÅÄm©€o’&öç_È¿^úm~>ïPJbY[w¡»te⚢Ðʑ¡ðFƒR¬…0ÒAêáN¨#ëQÜ$sF"ÑBI‚Ä·Hd[3`ƒÝ.+³ýìKãðp"ø­Pe
+|ɔÚÓápˆ”œN¨Fr
+£ÑbiIZ@žijD@©Ԇ
+҉.r“©)_Î H¤"$:MdlÙu`É»º§ÀróDGWG€
+ÒÛÔmÚ¶À¶ cs؜Dët7}ý:ÇuΤáÈpt¸8\ÚËÝaßãØã¼Mړ}œ~¼,+Ž²£â¨†ËáJ¸Š\»yZèÑL&_^ “uº¤•"¥h)v^å¼ê
+NJÖõöŽMòÆÌÆl8
+Dý x«ÜŸõ^8óã_¾]җ¡ŸÊú„^³ïêÛÿu-ä8È\½$:2û‹ÿêë~~à¤²ëè&FgŸ^÷ãÑU×z4vë9
+Ôʾ°‹T
+%-oÛAˆÈŽ)ê?8£¤uBAù¾êòì‰Ó ˆ‚'EEŽg¯=áXšP­°ÈrÕ
+‹ÌqkÞªÇ+P>ŒžŠQÏúªÏ&cfmOhß
+y 4`cÀUŸ¥GG%(f$Ëðúÿ×%Ÿé÷òѾwJ^ÓÛïôžòÚtïwØ;楽Sä{‡õØWb(šAíôàÉABmXpâ°Uqç ´òÎýa‰j6£ˆäó‚ªÔ$S©ÑȊ ×8Î]ƒbãë‡Ý5!íF£¯?-՚ZïÊáó¢ Žêg$SQB€F_ÕöíF53—2æ蔬­\L¶^ÚUÀ,v/³‰¶5†#Övҟ¥¿´ÅÛ ƒ/$Ú?~æ¿(×uùpÕ‰¢DÁù_±» Ö¨ˆ{‡yЕIz\úƒL‘!¾¤í
+›Ǻͥõm×0ÛÙkíW®~¢|}s{ƒp£ýfñæÀÁ]¡õ닷Ó_äî
+ÝY¼³´·íöû½î{Õ÷ïK¹x_éqîIþIû“ÇƒO„ž ?V|†}†;"L–~Pú3÷gû™ðŸõUW¯(]ݶ—§»‚×FvD?•§¯`¯à®æ©ÕüšèŠôê"=ÜT¼°Dõ³ýÜ;E³„Ŭ¯ØÊDÛؚ½éΠʢî`‰Ñv—õfƒ
+¥ jòIUž=•”ììÛgõ’u´P!Ƽsn×\üߑqផ=üÇÊ=8 ¡ñé?2U@œCêI§}ŽzíôÜEUÅ^'®šÁàmi c#-ö€QҝJ%­ x¯²»ªçG<Ù¹;Òs?š;ž˜ûd^ô,[>P«]9`ÿUZ‡Zœ[ÓÜRNtUò€d.ìKž18Y‰ßöásÔågþ¾ò³þ¤a¥–øggYrÏèÖö¤Û¡p ʔwÏFÉ÷n)ùӜcµõéý«ëT®ÁQ\4«!Ndº;ÓBn9éŠ:©u‘IR㎨Ã?²ØŒ|æ,‚Ë;]À¡ñÉnp#ñ™˜M‰¢t §T+ʞšÜkfÍ^ªƾh¼rq£ë¦–áìMù[ˆ?
+•Ÿˆ=ÑòDüÑüÅçâÏÏ%Ÿí:\E~)ø’þJmº÷gÊÏô?ÛOõ†”¢¬+-z"›.‹çÉ%¥¤/Šu¤JÙ>ªé½zo©÷D/ýr\—¿¥x{vo‘^’b×â¾ÅõÞՁ%)Fñ@¢pEì‘Ø#º-t ×̸’ÒEÄ
+tÐ@¯"`zÁdW²áQ}é¥Fƒ^B“­.èEéE¹Å%·(uä•:#³A& ÃYRù4DÂzw°ftЦ)jPK¶ Y‹Á®|‹,·€¼€<¤œ
+”ú›Ðgá•°C©YƒPŠ>ß J6‡`dÉæÃEi).¦ ®ƒ$ìkbÛ³;ŠC½ØW
+ îƒ±Lº2uMي¼¦qف¬äï˜n±WíµÜâ+|µdɇƧûj-iâŒoðÕPíáÃvì¬!‘÷À®ÔòœRkѕZ2ÏKµ”Õ Ó<lt«ÉZÍ⏲׳–i?wͬ†N+‰/EfAÚCG' 8±Ûme •€Z
+â;¯ß2ûlwÈäÙÒÛs'óJǚ¹hÙX<¼˜süäý—“Ÿî_T:ñ»V·(V€_Õ[.";wÁÁmG;o¸ý~W¸dî¾î”Wo¥ Ã&6o÷=—Ã#ª2úæ~Ú:Ò^¯ìu8$ù/¸†Àµù‡\€<¨˜(÷ ¢åeî@¥K꒗ÚVIwÐ{Gx”ãÂàb¸@ØN_ƹ¯£GÙa÷ô­ì˜û â áÇ ÄxA˜rx$ÙÆ°6Šb\6…A´ð‚r&^æ@ÀQ\ºÅ4˜`»\Š¶dQn‚UJm‚¡™@Ñ]w¯sSnW».ùnNSÜ;cŸÄvèµPނâþۃ¸ôÍZá:Û#¿Ý(e•Ž°\>ÖÈ-‹D«ƒ„,"÷:². SózÚòßÁ_3†‚©XÄZ,…íÁ3·“¹±½Õ˜ùá$uåÜ×~¬ìM†lk>d†Ÿbæ0è׊7‹ 0ÿÛ¹å´2÷ Z£â(A¢BM„D6\E÷­€šæ{¬b$ðNbÕ­|øŸ[¾Y3WÎÏP{©ýD;qµ²‘Q¥×qTÝDʑ7È ÎnG6N4jbقi…ÜPö¡Sàñ/±²VFZ˜)Le|n¹Æâ–Íc‡€ÎÃK
+GÔ/Î"Ú÷ÓìqP„E¦§ßÈfÉ?=ŽB£‚æ{è®2©\Ü=Z«?Î(%«ì"v•ï ¾`ÿB• +¾n¹>V§ùÐÛf™¾¬eM·Yßæ'«-+Ája¥}euuç’î•çm²_e¿¿M¸Í.­÷Ýê#£õmurˆ+•žB&_yŠ?"!B¢À×Ä´½&bkzwU†²‰Œ!‘ÒqsƒH‹=*rÏeìµuê6u‡JÕÝ*©~6
+a>q©Çì!ác£Â4ù*|oSÔrÓEÛ Óy2ˆ²C+øâÏÀ_€ÙP~՝' ôÎaD1cÜ Mã”AŽÀÑIÆsä‚%¼PLŠÖ¼Sà*3,ÖÚXÓYÓÙ~vŒ¥dœbJ3_²xɧ,ãÕÈèheíg¡‚‹|0=³ÙfÜʃºPÝ6yf¤>ƒâ\²®:'›-ZŒí%H´f%÷°«¯º(·¹;»:ºH†çŽdb-z ÉTí5p…Ý!BqKQG´ÄÙj!¢‹«è Z±+!9œ-p×Íô„l?F­†ÆÜڊÒeÀ(*óÈ(¨]Át3K`$lƒOZ@¤ZÆÍag­Sw"*üÎ5o™vH½u{Í·‚ö€j>öZgµlØò°åÏzL›ð9f%Dˆ-“/ãõ/̓ôû¼8ÆE½{-2"˸
+a°ŒpÙæ »½U™^¢‹ÌÐî <Ñùt¾(ª~‚&y7’×\“‡§y¼DÐàí±’ÅvÎúYËЉñôì´ü2DZ(¶5¤Ÿ$œ‚‚SÀëÐ5èڈ͖4”«ÃlPI½èvþtÃÎoŽ !QL.L âO£ÞñÆ÷·Ò[ƒæN9 ¾Éf±ÿ¥mÉ%ŽÁ=y=u}µ‡~”zŠcûXÐÍyRŽ^wijTõ‹ôr œ½“¶¨mÜJ(ßo£lï‰>‚P¢(;úÎq=w“Šp wY v§'¬bÿ‘žªcÈøÞêFžŠá´b½fG- ðhÝå¯á
+j5ҚNÙÙ¤NEtÔ¡©v1ÄÁ£(Ӂf†ˆ0Ôåv¦Ï}<ŽÕ…:ù¹*/¶,WdÊ(»\¾sn,ºýÁ¿û×o|á©þG6Jºjuw¾üÉÚÖø‡íÕjšüàèïþåô—Ǻ»©C¿" LJgÓ³ÿÑ^~å…ÉçƒÈ×CZ¹G üñGƒ&ÿ IòÁ<€ñÏņc$2öàÀìXRüƒn¹vþù0â(á6
+’xH¾³ƒõc3PŽ£ ܧœcôéÖ|…ˆ£_ÏïØd#CîõôŶ‹™õìæàæ{•íÛ1;öú[ÄÙøNÐ6ªBÛâCêPèu4t—r·{Ü5®>
+5f—Rƒiý8*‚uâ>‘‹2Ž)"†‰qb’@Yí< ‰'?¸5@öÀD¦€h*§@02cÉ+6fI˒£ä—,÷Ê[™<9‚Á*›­Ï̌`Ò}Ri ˜pqøòð§ÃÔ½a€êÄAÜèêê]¸
+ðÇú%”RTd9uØ]³Ér3,P_Ùg $Y­åöfi•F¡CLÈ m£V¯ßú÷ïppÏ·Ûr‹".{<¾xûy~}ïetVÀ%‡¾˜7_Î}k“Ť÷†hdÕe_ÿæ‡K
+§|½¡Hxi^f§s^üÖ¢9ËE){”°ÇD ŠwÈ7æÛ¾qé{/ÓÏ ƒ[ºPA푾*³¤°dwö¾vfvª@("r>2$2¦„|ŽL’YšKI.£YîÒ¬¡ƒV[N'Ζ, »„£ÀäèEæJ£×­@F\=G-vì·Å«.äÞjÀ0ùƒ%c«¾ò֟¾¿s¤¬¸òRÌÌÛçN˜žË‹›—m¼vëUËÏûð¥—@ßÚ'þÊßøz_Èù!x}épmÝÕ¯üó¿CˆFÕ°.¦& ¦v5 :Íù ¿QŠ2áÄM#kË[2 €Â5H‚ÑòÁóӘV¢ŽéBÑma.eû‘È­]Íbê
+Ïc¡6ú¾vþùºÍnDŽIÐ8g921XCv\<>}Ž‡½¨ôÈ$A5#^ñMXßhe)&ˬÎN²Á±¨ÌÍÞCƒ>@Sè«Xøh“œ=žh>'꧅`ž6Nr:£‘²ðìñˆ‹̶[Շ Øc#®²MԆˆ!Ïk”MÓCPL Õ|f¨Å)áKVU¸(bQ bé
+¾¸µP 2¿Ù}©o›‹º5ÀŠgXžmޕÌ^ò‹Ìñ.ùöð?’O©‡Ü?%.ýB>Mþr+Cì7 Ÿn/ÿ"ûŠtŠ…œŽuÜFR<Ââɪ~9Ùǯ‹®'×󗑣ä^÷^í÷7ùo
+e·ÏŸ€ ÙãXxs…RCïø’ @¿ûcΗÖ$ØáÛíÛç£|§=ž1”‚2Α%n÷&GɜÉÁ'á&¹·8†{Ò饉½®¨œ©”œ¨VE8e§î¤N9Ý ߥsIdICr*ÀÚÙ$¶Œ Pö(çãbH£¤²£.øAY{‡ÊÚ¨Ú ®¥3Š )]](~|Éæƒ Hrd+ت1Šã.XømöxM4ó5ÜВÒÈé€D#­£ õYãH°ŽëˆÇG¦“¯ye­¦é®šCÇ! û)}``ÀÍøyØS3bIˏý °}ûž-·ç£Þ¾ÿ‘÷~wøÁ—g÷€Çm²vyÇÅ·’‹~|Ýu—ßèÙû+~þ`ôd÷æD—ù9(­#ê&Û‰,É5°ÛÈc~•7ÛÉc½:˜²“œ38§8Qv‹‚Ô©`Ô·Bá˜g­3SàFÄORFšÁ
+´ƒ_ü¸54AÀû@’ZJ-Wh·S·‹¶iPÌ%'¸ þkò×\“y^f ÚÖº-K†8çÁwO 8a§(ΌÆ#‘"dĕ0ü Û•ßRkFq1+ÈÀ§ÀEÏìƒ
+“D+S`.ú‚N×;×mÝÑy}rx+ªx«ÿ6u_õ®Å·.Û·úŽu_öY}`Ý}ÔvÐPýa凫§·žØúÖÖS[ƒÝ[–«žŽèVÛcܪŽzðQ±UAB[rnMuÞíöðܘهȇ ôsxÄ:jM»b¯Oû ʘ_;´9;Cîá_št®2Û{!FÅ×à^ƒçšêø*°
+Ö¥‡ÓÓéi:íDg¦›Qê°óSA#}½¾µ´ÕÜú0|維èҐ]¬luîûÊr°[q–·é> ù†}¯Bb?5ÿ{Ӆ£LD$øð=ú¦ÈçM÷uPo+QýÙO(MRèUjá
+e×ë`©º<6¤6…ÀÆMáî <=¸ˆXÓ¶J«WU;Lr ªZº˜î  Š†ˆ‹3êÄ2ÿ’Ua²=ÕØ}tÅ«V\z!?N–Á¬Í
+2„Ѫ¬ [Ó©§•F U36
+™>á€ÄéP›ë ÷5xc¸ËDˆ+ .3BAM cJ©ÈʃpBEö8¬á©N¤jqË(HÆ*ÕTÄhQ$7Ä𱼊æÈ£<S4
+;`“U¾‰c°ó¾)a¦Œç˨…õ
+Õ*p3à–†[Š¨  ‚*¶cU;ˆ”+œ£‘«XDº ÎéFF~KÄB«|ìåvùXÖ9Äc tÃÍ¡dïá7¦*pR4¥+%`ö+`–+`¶,4,]x¨aûR»:A Çðp ÇàӜÂÔv~};gŽ Ïòù®Î×ÆL»Ñ?Ž„.ø–u —…DVòb—ÙZº† Ü,Rr¬k¼‹žìšî:ÑEeÐß5Ô5Œ†Ì. sj&⚢$ÓՒÏDR«Z„LD^e"É)ÊiâÕT¡·©.zªƒÀO Å*—K45Á `R’0,L¯
+dћ®wVِü™ÙþìxöqçãᇳŒƲ” GNd©—N齩Hz©†‰Ùàð­ZPψ¬o
+8M‡L" ¿YšÀÅ<¯2{Z­ŸÙì«R…¬ß€¿¯µØô‡žîÑè¸$ uAN键cëàÔü¡ÆˆlƒZ³ÿC¿9N†jx²8ø­r¶ö4üõeœS¯[x6ÉÄð63:€Êg5Ö6P²¥Z¬Z¡ˆS
+!)gI9 ©¿@6˜¿˜.,_ù¯à&íéÉBð{å᭛Ûb ëc1µà;=ûðǭٞ9ý̕ï<?ow°›ŒM_"¿øÕl C \A‹îuR/4à'Àì_Ã{+L×eåŽY!»¢A€í¡lð†Ô1³–Ð‘*DAC<À58b 
+˜ÿ|¸
+M9¡Ð”
+ˆ’¢
+¨DN-ÈÀ¥“‚?`¤ñ!‘ý9(-$‰*„=¥K DREËOFýça^t`ð¦þóiÁK‚dBÄlvzzúœC¬Á§_†T…‹µ•ˆ&•jÑ©02€ÿïå¿,ŒÛÇҤ])F'jÏBM«¶ÉÛ\Û¢×Ê;\;¢‘ü{‘™(9ÆÎù2õ²ô.ù®4ãú­ÂÕ]uµíÒëµåÒ¨p½ÄÉVY7ôd±ÖºdÖ+oÉëu:.o›¤·å?ʶ•®ÑïñßþoÁæç}r4.#ϗ»Kr;bXŠ8£ÌÅÔúbۀ¼ÞµÞÍhR8‰^L6#›Š*†i SBª
+´øF†)Epäž ålæ“;­•8jjƒXiQVÑTôÙ1–Åu"FGËg´`HŒV~± ÑÆõ•hj^p ›ðÒr:`¯ÙQãªIVÃ[
+|Žÿ>b¹T7w"3î´ì ¸ó{üigçæ5ˆÇ£Á5M ‚?áO׬ØÜ@×Ù½ ïoðüÌÇëuD”!ôN:V¯ßü±|þb܊p+Í¿s( j*TÞ­¿ ª°'~ë£Æ ˆ m;ëãP©Ö3uŠ<s°¥3iƒÓÞ²&é[ÕâÊDüP¯>Ïf"¥)Êq0ޛ‰,‡sq|CjmïúȆ¥\¦s­Yˤ9‚5ú6nB?Œ‘;ËÐ6¶oy[Iõ Pú”]‰XIÃú$Zú TM©3SÈ&ºJ`¸s²“ìDc¾µ›zkÖD×ö¯%Ç֎¯%‰µòZr-
+Iz»—ϵ­©Ùm±ÜºŽêÅy­mõÜ¢z{˹) x²äûÛ¥dëöm7®^½¡û–¹6ê>¨àû師Ü5\0«+ìÙ¹ÕXë‡\é"8Öf†ssÞ-ÁD"¸h¸ô«¹¦<,õÿ@JV&ÏR²*¦d%,·YÅ8ÉG$¡€ŽâáD†Ã$©QsÓ·Ík<Dák’'_3„Ó‡,ÐItºã‹Ãx¢0ž"œÁÖµ œ3M9c‰h¸óA#GÒ6]‘!Bd¢„ ߆5³¶v*Ϗ
+sÜ«Í!Ã[0S'Z£™þ̪';–ÏLf("#gH\&‡‡ŸªXÆ·ìßn|STbhC£ü!`cT[ ‰ÆVs”ψ–än„©ý–7T®|Áà9!  VýžÕ×ê>§½íü¹En³,нk?sƒÝ‰ѳ¼MŠ6ñpæ{«7öÜ2·sSTÃ67iøÌ®‘Ïυ}aˆi}ÛÁúGV°åí“ÔQˆg&Ŧ… h7bqÎÒéd -h„;èCÔ1ÝhÆ§Ñ~ƒ³ËaqF+„Ͳ:œ ®àÑç輺8ˆ`*@{0ÄyDKp2ßh, .MGDÑ
+»Ló‚Ç|‡}/òÇÂ?çå×XÁ/ómòÞ¾Èï•~d£f{•ÆÁQð²÷‡Ҍ‚•\ón\T? åÿuipíûé!z˜§'i†~-T7Å ¨âœ @qÁÈ0›]=™¾xõdÿ…[ž#+ŸŽÒ+/Ú²ùy MÐp‹ÎO#¸dówˆÕNЄ‡jW~7¸àr‡sÕx:@X1œIÒ%ƒIº$N„A@>öTöÜYA
+2™5
+vë8Ü^G¾¦¼†é®~6
+W§ÒY…v2g­%PL;?
+†³c€a±}Œ'0&„NHa¡ä6ƒ îGÂr§å—!a-~$ºí(Ñ>æÄvÁ$Q„EÝðî0ܺ1tëÀ֫ߘA,¬éð¬4ãL@s›±£»A7€cte‹2‚³Ñ?'á?Y՟!h­É+å­ò^}G,ÊÕ­ÎmÍ}Üõñܧ¹®¹Û¸GØw¹?óŽÒ¢ÍåÊµÚ\Š•Î(n(Viw´¸¡p•Š©ØºT„XJ*Ù4Eä€î„dÑ=iª³½-*Œ ä0&ì(á=Ä&¼ ®÷£°Õ±@ážVˆ§-6ԍz±2ƒ“@¬X^D‘ÖÖK9Ñ
+fÔÁQ1ÑhkfJ>†£bÏrú ¹
+ÙR;Ù.™¤)}žfÍV°­D,b©þŽx*¥÷&#©¥„`ouytÐ*Z^º&‹@ (‚…rû6˜ `
+ÑVÐJ¸ÑhTcú¸Nº åøiý„nӇ2žÍÓ°$ñѓ#£¢X£3ƒ®F¶.±À10
+¹0$oގfônS6öŸuw}Ä,³æÓ;;WTñM^ś/¹ç/žË.oÑ›#ˆ¦à¥öÿä'Kr©ŽežÌ¥s+פ ‹Mø°Ô{ùÃç…›…ð²}þ$ù3/mt¥/©2†—²‰x( °G `‚.%¢ñTLBžô™„È];®ÆÚÆr))F+YØi×ڀÍ(ZYí3pyD =†Ã2 Ø‰ú±ÁAÈ©Š°…Í
+ E ¹óñŸ—jÑ»³ÐÑ“RÝê‹(ÙÚÆZÓhÊjø„ífi3ZÙ¥°=r]„ŒŠ ;ü½@Ð"IåöçIJfJAM*UnoеcV{ E7¢M>vl°.ù1|… ŸÓr¤¢L{-—¶×Tπ¸%ù|_Â&°BZÈ •‡ËceF*OÝÜIä?rK3þ=þZâç¹·é·ão'ÞÍٕzn0÷©ü®Ü>°ÜGyÑÊ£c¡½ù}ª $P¼È„„Ü+-?Œs!ÊçQB¾°– æàÒïß›°+YG:·*·®¼­|cæÆÜÎÇãûËïPo‡Ä ×!ž'#
+Šxq¨ìâù˜®V5¢=Œ¢ tøæЇÚó>ôa‹¢$â;-¥pc‹€…bkA —ø¬¦©(ÌÞã+¢KþX@A#¿Eñ@”Ç´£už‡¥q‰’¦@‡©¥Z!Ê.7‘C©áÔXŠÒS¥™zèD;П^ÝDT‹°³(Vq>jEÈýÌØE+'Oãå.q¡Þ…y ì @i:á°{{³LπU§gpô#•z`·±xoAç"k-ÞJg¢ºìbب ª·L† hÙ-‚MÛBEÖ¬…~PNê‡ìò®ÓôàT|Q1žÍ¦6&È jÂþ cÜ;Ž‡hùj|"/âÄÕ¿¿Ù´ãÅÄr%ÊِhãJëZOk5`
+5nA+l2€½­B­‡rxãk¢QêNíP¢b°†­–°‚OãV#¢ÒîZ®Q;á€bÍ%)ð+øJ-§+èšS¦$ÁÓ¤%;à÷8ЧLÅ¿Çρ›êÂÛ_'R}ôX™U¨øÐÙEAýgtEk¸¸ÊÍԖDjaá!r<–üÌ%Ë7êÑm÷üèùë×_óú±Xèk—-Ûô±¹_æóÝܱ¶ì’‘Ú?÷ʽ_•ïJg
+}—c×!ú¾x÷…µe—Žw×6Ü*¤ažùߑ=ô‹DÌ6ã<æiX;:í"V“E¯ØܸëƌÌ݌iq7½Ÿnô.¬B3v.'ù<4
+‹p6¬òÚ0´¹-%ŸÁwŠùŸ»é‡q»Ã¡*/ŽÖ®Ïžœ–ËÇ›žgø³x½bmØF’õð®´¼/ø¦´w4v" öÀ:qc›¸ÍñGê‹^5¥R>¯ª(€vžàÀò–wK•H0bÝ´ïUï›Þßz)ïžà ;òÎätÈ< Åðd˜ д-áéwƒ17@E'ÝÓîî·ÜŒ{(ôÔÞ¦×(Ã=xz…¯FùŒ³'- üè$p¡ý5¥f­u‚W„Æ‘#eo܅Wî,㬂$ŠðìÀëέzíµr:¶Ø•Š--lnýRç§óþ ýâÜ¿-ŸýöÀâLú²ËËÛ.'¯Žù®Y‘¼qFj ³Ô}„A–PåKaK×pDØõtÃnې‡ôHC8iyÎõ>1 `±Ò7¥©1ÀÎiÜ¡$š
+p “¢ŠÒïw“cp7馬ʚØA K~o÷Gå4T~/4ÛXæ
+ž( ^sÓ7n$õŸOÈÕ=óþûõ"äÅs–6UàƒÏ·Äàuv6Ñy܌«‹Û
+Câˆß:îèhžãÙsÿ­€ÐâÇeœûdòÊÅÂfu«Fi¸¤qµq¡y«Íˆó-BÌ¥+ U×ô@7_ºTŽ¼;°Š[É/–©Ë´•k¸¿çàÿ!ð`p¢å âqîþÚ7¿Ëâ ‡Õ#Ú³ç‚Ó-?S?>P? ä'xЂ#†*¸Í¶Ym$cµ}}V›JYm<nµ.nMS U¤–[ˆQ0JÛnÑ?g»Ýµ¯…ïæ*BE­_f¦c¯Ø;…½êêTV¨¤[õDÜDPŠàŠ@,¸ÃÌñMW5­dU8 žƒ=Žel4ÍA‘Ì­@±‰`š]=m€,$„ á°ðSÁ&ì⃈e“)>Ìå~±w¯]@éë:ÁÃû•”
+C,Ä
+EP,$+ª@ô ‘B8\+ºkM‚V,6ê!Š6míÑ3}# qÓïó¥*•ª`ŲŠҒ•j¥\5”}¾¢ ¸ªP,õ‰á]ZDŠÆŽøî8ßqÍ(jåüï3™T¹¾í]UPµÙXCcÙDÕðT«†èK¥JeÑS.‹ð—WyÑ_Nš½«˜TJ¬°U)BQøK èg€ ÜåB\¹@çA>‰„Š˜‡vø€¯`Lç3º4DWE¹jj“Ú[Ú)FˆkϑD™`ÁUª…¤ÏeP~Ž|‘¨ÝäÚgbÇ÷ZåêN£ØÂÁìÈÌéæ2ۃMn‹Òªe,oâªaX±Qþ‡j[@Uj»ŠêûòÉAôŽOâV&„#2>”oyöXNîqöìqÊ=»ŽCÍ1î ŽZ+á’Í3;Ä)őýé_ó#+쿃ִð"%•¹ê3(×U4
+J\¼!â§pÖ3¼ÛT1^ K¿? !i!¸Oo
+§KkXø­@ »ÐBpÛxŠßÅ¡põpö5 …O褾o[sõ™Óʕ'Pp
+ÙÿMDz8³ äi²Àª_)‚§¼ù|ìÍã.–kɂV#­òÚÜ:ö_¸hMg)VK ‘¾DïÜ)¦Éþ2„áT8µl®ü%“Vx»
+•Iª–J‹zÊmD•\›'ÐSëN06mQÏ{±GWcàF•/?X;;‹× :=8‹×PÆEF°*RkF$XÆ·ŽJ—‘õj¬ØjtòµÁ±U{9Rª"’FƗ .®#*"Ü%µtˆÈzÓ¡F
+ʁ1œgD儿І‚ݪ¼ ¤‘“òŸ—?ˆn–­n™ˆ8‘¯t‹‘…çŽ{ô±X?Õå«rrªªè?â)Ö#΅/s"÷c\bÅñ
+7µ$ĔŠãîÁT}oK¼’ã<:W ©¸fËÝ7$ªTj•'Ñ–Ts¿lԕ3X–ÎñBÀ“[7Þ5ø’Óéﯰò¼¦,;¯ag×ÈK¤gœa†¨O°ÌÐ*&+M(«Ë4J=Ìr¢ž±b¶e~Áh3N=8”û¤Æd±¾N¹Á¿£«„ƒ¡Å[Bw$K¤Î
+R   lÀƒ¨ƒLȇ\H-$AdALÂZØë@j(lè‡ȀûAX0<pÊà$ä@8Á>Ø pÁ#0 ñ`Ĕ¥ÁYH3aô†Á
+ãž@>NþG”ÌcÐO({ 4²nHC6¡?½nvØÑß@®ñyL2¸ÑŸ†÷\qÉ÷­•r㥅ãuãçvÁÞ¯ÀkR÷XÐ1Üü9ÂÊ!¦¡ÝèÖcZkÑmÁg¶¢?€ä0ÝåtéÊ úµèÈKA‹~5²?wãs˜ÆA¼¯ÇpšÄÅçrèZH\üŸ®;Î÷Ý©Š%IßÂÕt~Žô—0ýNbK£Ät5~!_ìÿ±I/܍Xæ'ÄüÕD‰é:óï|vuìý‚ƒô™öo3'Ž¿¶A(ÿLaZílG/&Ïw~®à©ë㡃Pðx©Œöµÿ¥r2
+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 55 0 R>>
+endobj
+55 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/AKCXNM+TimesNewRoman,Bold/FontBBox[0 -215 991 857]/Flags 4
+/Ascent 677
+/CapHeight 677
+/Descent -215
+/ItalicAngle 0
+/StemV 148
+/MissingWidth 777
+/FontFile2 56 0 R>>
+endobj
+56 0 obj
+<</Filter/FlateDecode
+/Length1 41176/Length 24354>>stream
+xcÈ=³©CóÑt_Ÿâ¸âtn=2Ãü’0Ò­è1ôSô
+Ì~æ}¶Œý"WŸ{)Q p7¢g`^¿Bï w^ãq7þ¹™Qܖ»ÆC‹a›Ðãè ú+°ë°{q×ÁÌnÀGð‡ÄCDÒËÌcö(îÊ­Ë}ù€WúÑBh¹݊6£è(úú+Å.hƒ–­¸oÌÌlæ>VbïcŸe_fÏ)LŠ—³ogOªÓ~ªP7|ûÑ"´Ö:ßWÐ{˜Án\=Ã“ §9x¾oÇ÷âGñx?þ>†?Å_àÿ¹‹|Ÿ&¯‘£äãa"L'óó&ëcßc¿VÍód_Ê~‘Ó梹Dn{îÁÜr£2Šã[Qp×2ЛÐvt/ú¬ù>ôú-ðÝ ù{
+b¬(È<N†IŽyƒõ¢ï¡“ÌxêM ŸŠqzº-yxsgƒ–¢zTçáY¨j& ’ܵ0ò'@I¹Ù¹Š>Eý
+OÁVôh/¬â}
+éc^D؅A–Þn‡5˜”\½lDw<={ȯÐiÌãÙè'è8HŽä|><Ÿƒ~&£Ë€ê«Ð oÅ#P²• ¬ÓW؀ëÉjxÕ³÷ž=cz} š#'«7áN Þ|ô/*Ëð„Zԃ÷ž¼5ÀNÙɼ‰þŒ°»¶ƒŒ>í€7 ȃa‚ʳSsõd ó"¶Ánh®š ;û8<£0Â<ƐOC5ÙK ·gA—õ(‡Ý7
+;ƒ•XÙ+—Á¸ßƒìWhe®?  Ú/›)µ¶Œknjl¨¯«I&âÕU±ÊŠòh$\V
+ÆBB§¿8±ðBœ’Ñijò¥VÓ‰!RÞù^I¯sª§ÑÂz´u~= Á§C«Ô È’”ºc`+ßHËiû”"ȋޭ_"àqôoß.™[(Qù/MR>¹ÀjP>ŠFS‘eUÐÆØ"çk*Ê×dÈCâ ïˇz`mçö5Æ`ù}>Jà;3š™ÔðôÞ|ދæ¹ÓHŠEûRd€Ö9_c½ŒÖ Ÿ¯¹Ð|@Nއ¨cMq¡ FÞVÔµ¸1…mÿ—ê…ùúÉ3ÄÉÓgõz»¶ÖvòÌoåòõõê
+©TQG/ã&…q3r-0åì È4Ó«K±AøSÊL½ £â€+åìŸâ&äã>Ï÷ÿ²Q&wš¶’Á7Í
+@]ïA/(]¹”\(¥9/́gœž&œ\å>îã°\ËÊr~~#¹Œ;_†Ñü ɗñr|¨ wÌ콘„²\ôUK[¨|Ù.t¾¾ã«¼\ò­Ì:ú+Ð?P3ìùJ°xðÀûåîÌ向½3½V7¢3Ä)LÙãV;RæŒm<kFÃ2BÜ
+aFŽ1’Xsúú„”°2–çÁÒ<˜™^ÄI(‘;šGìŽ8-ÑèâÃrjš7¥g%¤65k‚!Q<š‘‡éž„\ÝM{1¡Kò¥#]ùVíùâ–rcBh @Þ A‚0a„Ó”0zŠAØ!•so„mvC8IqåÞ¸„±ÍÍòPÃËsç‘!A¬枒c#ËÁªph„‡XbYM]#„N˜‘.y¤ÌH´R†é²p\®H»Šã/Ân»œJ
+•Àü  àëÌH/ó±#†ç=
+è2ëPªgÖ£8À§˜›Á¢h¿OòÏù}º,oÓ0O27Ê(«˜!0æfY:.x3Q~dþ6¢ÖÒñý-Í[ã/2Ÿ2ː°N–]0¾È,G1t&™µ>¾½MÇd`šXƈÑCr,1¿NCG𼧙a0»æ(s ˜×ó ³1mŽfþ%£¥½ÀóŽ¡`DoˆiS3Paþ+þùigFBõqÔbîBU,êGúˆ
+SZ!lƒð„“réåUð„ˆ·C Ðc ò<Ä„ÃvC8á4:ÊTÀs*»
+B¼ûB»9rJ€ø|[†<ߝ2’õPº^Òd³Qe6qæ 9”^b2d_ºŒ0’i
+™„P|ZŽ?•ã¥’! ÿK@ÿz@ÿh@ÿH@„üPá“\~ýŸýú?úõüúgüú{üúÙ~ýt¿~ŠŸvU†¼HO<4ÆWÉq±d÷êÏyõzõ¿ôêßðêöêû¼úF/ ãÀ~ªÇÊñ9®9Ô I½'©?D@3á+ÓF¤>L¾éM:Ò"dµ ˆ/ÝPœînàNw_
+À•î^  (Ý}Ð¦&F¼Œð^ŽB]:r Tkó€KG® HG„ Φ#"€¯Ó‹<¾J/*p6½( àK
+^ÀÿD‹tƒÿž^ôCè†Êh·ø"Ï̤»[û@þéxjÁA(׌Ž?—ŽÀàðSéH€'ӑ€'òàÑtDðpzQ%€¦ÝàéE§<.»†ö·•Éý܏B2\•îvCõPº›ö0˜îŽX‘î®°,Ýò€%é–S´éÕx/ÎƋPDéÜô¢TÏ)L¤•ÉÕ³QÜó%énº$ãi'mzÜU˜H'î 6nÇ{å^¤t¤
+ÐZґ€qù•kN/Š¨O—ÁãºtÙaåj Sú¼€0 ڑ˜Ž< HBzQ@IzQ7m ƒ**<ՌZäA™ÒŠÅ§#^á'X‹É=jP?°_ƒ~¿nÉàËÓÂWR†Ãiá_eö ëž'üµ;¯ðˆð³û…€úA $%­ð~ä”ð‡E~áÀÜÂÏ#•Â+¡uB¦ì°0Ò]"셁¥Íö,’{øqš¥…§Ê2Cë݋¦÷G¢ÂŽP†Žá{€¼…>:ÚY'l Ý"\¬°ºûaUÄ# –]%,-£² K"—
+‹a"WC›…‹®æFîjä_yK˜Q#Ïaò"yF[äŠ ‹.Æ࢕VÀš€/ãд²æ0]#°T:FÞ.«{À.Œ‡!¬”*U/ªnVÍSÍTµÃ~Sª
+Füµ»£}«P4š`4Šà™0kÙзɆ¾ViKü¶ûÏÝ_v3Gd ÿ„“²…¬ûcN‚…_Âi9Ör²…9Ò}¬û$à~p샓0G*ŽUœ¬`ê
+# êÃ0Âo¾×EW]G‹£Xž­<o:4$è¬Ï/Ã*¹bµ¼0ðɗËM£ÐQôBóè7‰UùÊëä&ùÒUßð0TÐîW_ýŸŸB)=e#¸!E±ÜCp¹Ú÷üŠR•a8©)ØW¤Q±¯`ä䔊WónCjė#G”?Û<Ö<•?ÓÜ=֌Z!͟ƒ¨ºÊgò™‚ábó2GÎI
+ô5ò²G5isÆôޏŠÑÍ/’ò ¹•ïxÔe§ä2M´k·—ì.!%v»Kg™èB’SH¢—1–]3HcÑ%¸ˆ«Ü¨tD—ÁE’ú%%V:=Ǐ:¢0¦þîÑþSýæ†hl4ʏNå»v~܏Z»Ç>n­®Âã;ÇwNìÄb¨´4T“¬MÄmV‹J¥d(TŠ~Z†¯)W•&c³'M˜¯)öw̙ÓÑ1ç*|på#ï½zY÷Us&N9öÞêìÛs:åšØÉÚ³;ñ‹8AïaH¦ÿ¬R³øeô¦y¢NÃN¶‚$iqB0bc›ãG߁Õ;ÓflµŽžŦ†UQMmmM²4$úU…QÈ#S.Z½DÃÓy¢MW,¸äòõ?Êî,?4äæT¦Ù-í 6¯ÞöÝKãxYGZ€Ž.IÞr)°“¥›ÊŸâ?F±îQxŒ¯ÆG֍$—àGi«Y¹Oð“8‰´È¿MTjºšZ¯ºJMÔN݊;hës°ž0Th}ñ¡ñsçuu͝‹“2èêš'ïë¹I+P˜Aµ’6ÞVÂXø ÆDË졃ÚCÊÙºèiÎÒ®›[›·(*£7ñ¯Â3°ˆIk¶c¿¤XöÕÅVÊ7“r§˜ç‹é›D<IrªÝJAT‡í*‡ÛêµaµŠÃk9i³¢ÀˆRo¶gDR ”DR´¢D-DMã’êA»éJU˜~ÁOüÓ°MõR‘5©w–ùw:ñ³Ñ•ÀI½’Ý/J“~ډŸv⧝¬ðã!*F}€('ºG©ÑaÝÈvªƒ_†Ð„Âç¡Õ€½Ð
+†ã
+œ’efô ̨ýE
+ÜN~Lžc˜Rݽ Ñh5ZŒnónÛ>±“FËgðÀ~s̞²{ûÓØÌQvÑê“\† ì3(°òŒäF
+æÈò?§J õû|5È\“”×Jf ªM•ØkX—`zÎý ¯øÁÆ«¸,Xûþö«Ÿ˜´0û^Óñløy\¹}ɝèdžœ¸ùŽƒÙçÍÑ.ºŽ¾ÜGÌVXÇ(:* *£Ý¸8º.ºÙºÙ¶«è^ÛÓæ'l‡Š´Å­ÅÄÂá ¾WR#D_x Ÿ|¾pA|äM0>…\ˆƒéèMIy]ÍV€äWû%ƒÂ¥Gðñ÷y1Vhá{‘»ö—ä—”ÁÓ;(̇I˜*“ÑŽí®
+e­•mî¡ëfÝñ ,LøòG°ž¤G;%G«'0fKTj‚ÓëËéõZmϖx„-@-Â*N«Ç,:ŒÏ!Ò^ÒqXÁéô|>ÂfÔб
+ÎÀ.r
+ Ç>Kà¾C;ïÎfx¢¯¥-ZÚ3w\¹Pzéªìîìw­bJ6»EÿЭ¯ÜôÅ--åõÑvog„×]?3õ>†wÐ/£˜º?–Ë©ŒÑ±E&¥¨K·8´.¤
+â:ûåñµì­d“óý®À3úgn¿E·WI_*Kv5c5Fªýn]Ёtɬ@Ͻ¨P `¯R/o±&è–bQԊ’:f†®'8_·Jw+Ruz}Ü Ñ¬ö#«;èqPšã8 ÛŠU·
+šõ&ì3ñFÖ&úLÂb»hôÊ@™b|Š—x#ª]£QsF¶Â‘ˆ+%Ñ«qV…Cáݡc¡“!eyCR¨J¶‡R!Õ¶ka†øþ3NW÷Øh?ì,Í<|[›]ԊmzÁÁã闙…Á蠉þW£tónhp ~óGòqÿÅßܬjn.pPûTÀ ï`
+Á&[…-Ÿ¡† å¢ÒR`í™Y_Cq¥{ivÜÄ«ºðŸ‹ð§ã+ü-cƒîi^›’/ýÅ1¼qS{´ÁÍsÁ vþ.¶ñë§~Á /1©Ûÿ‰ßÉV€&7TaMîMP/“¾{¿›º×5UO:ž-?Tr¨üMÕûÿ‰iÊp=ž€'º/#}î…ä6²©ê)ü³òߔ\òÿْûÿ]ešÀ…‚Ł@©ÁëQûýF¯Çâ«‚%LUz«ª#(XWm)® Ֆ@¥Õj!‘JŽSsÈË{‰÷ç̬+¨6–
+¥¤´ÂhpÆ̎øÆõ:¢Ñ©ÔÝí?EݖŽÞý¨’¯$•ÝŸö»÷VvöƒQɏÒuÒXÞé
+¶Ð:Qñ†fºÚ`ùÇ£>ÑæP¨ìAÈT†Êƒ¢ÍÃ~EU•1ìsh$B™X¡ˆÄŠòÍ[ž~n%UüæõUŸVPy´ªÁßW~[ùïTJY5@d³ËfklÛŸl«)´
+…:lmÅöÍöÛܛŠ°‡K4±Ðba­r~û¶¢CFUÁdxÐ,âÁ`0ZÀ5å{Úd6(–zÃR«ω™°É5Â!spùA—;ðüÔF !šn§ó %ôH>5
+¿©nýêƒÃ¿]³ò_ÿ>»çÀ/qßËÛšíôÆTŠeÙHæÕï­Ùqpö·;ï¸ní²ãñ™—ñì#-X‚êJ7Èߐ,Q¬•f»†aáEñ4ŠÒèê¢ÅŽ«ƒ„3eŠ«MK ³Ãt¿í±"å|ƒÊëA~?çõübq¥Ñ@ü5n7âÌÅFà!ž®J…{TXuSù¸çóš~ˆŠø`°¸<
+ñ!êFÞRea,µ°¤°ÈûCÝU,çFû
+"Æt~a¯¢ ;IŒò.s‘©ˆ(ËJÃ¥‘RFùMŽ(mV»ÕauZYe åCA¡‘肨´¨˜FQ(‹­þàEâ”÷‹ei¢Ùõë
+ñcp>ËðŠÂ–ê‡Â&JЄI¬$bÞקY&¿¯É„–Ï=€ÔTö E*Ý·¬æC!]÷¢¹EÉÆé?ùs<8îëk*š.ƒV¡q‡Ú+Ø!ϒúØìØñG~8Ö¸úû‰ìÆÁ¸7µ/;=h5ø‹˜g[E`ºìŠ{†KèíÃJ ï@ßr쓺U¬ZSÎøµ“´
+´ ˆÊ‚bå**_À ¬qXºŒVQ Oó™fºë5Ê,S”Ó¨Úœ§+ä?æ?–‘
+m¯ÖñÉs™3Yóž´ZŽO"ي¡Ö‹Q-¨‰Z¶^Ôò†=ÛÜMMê}qÀÇÀ~o£Çdù£2DqUÄqoDiÔÂòK „UA¨"ƒoÇ^ÁÈ+#Ó”êƒÈèÕ·#.,ïw n© +ïz²¾’.%·
+À¦GÎïyç) {l„&êRR×ðÈW8'©SlvdÏ<tÿ/fÎ~ë;ÕW×ÚºªErÏä&^½1ûɎŸæ^©aË[8½ü5sq•6Dÿ«o>›ýÕïdßÛjµ`WO, *„@ѤìǍMKž]¶õYÇOðÜäpµXÀ>UZ@^;p«dîðƒ–¢‡óûԛvÐu6Ô·"ïØí`¨V͐ßðǽžˆßßH«‹¯Qc£Ð¸§‘i÷zg¿_E{P]èAÅ«v«ìõ¨h¢ÉKÉ>ßCXî!,„÷„´4àHW‰ ¯§Á/ú}eˆŠn+} ‡;ilhà8'¢v¾´·Ä s@ïބººˆÔÕÓµ»+ÕÅvyó§¨-&Äcøëá1Sç¸5…ýzeaÃî:{>ƒÎ;!467€†k–y#Zˆ/Jʊ˜§ºÿŸØJ›)}ÿ£ä¿[ªÿ–lòMµø„­³¡œ¼ZÞ,BŽ¦ÇšóirWvö‹z>ÆÃßäÎmú&Cy]­ìÚ7á¹Ñ8ðòýeÉq” ò¦$‡5zmLÛ4OÔ/ׯA[Ðøýîqü¢.£?Дw™wƒ~¬´W6áýŒØ̦¥øêJššŒFcSee¬Â
+ZÏÉÚÙæ÷Wx=¡Ùþº¦zOÃn Œf-
+á#—7ùüç–-ëòf…Á^O´½E1åÜrÉúh# µâ´¯w°KÎ=rÝ¥@àY×0/jý$H/£uO+–!=*ÁÏJ‰Åüâ¢û5ïšßuw/~×ó‰Y­r¨JìÄ¡³»ìÅ¥|iQ©¥Ì¥)¡®±Fւñg¼èƒBŽŠÕjR,L#ó|Ù©ÜÉݧۡ‚<¡û™âgê×=ïâwõzª8¥Z©±c;±ëìz›G½È¹¨øzÅZÝçÏã~Ç~Ï»îӜörƒ¡1¶•Ú¬u
+Ë{ev£Nr"7,Ò-1˜qż­^â5š31ƒG­ï!jïIÆo!˜»GóU£çßISón:5ïšq ô„,!uPrº.¢4êÍAX'w[9Hٕ2é A¬/&ã"-ˆ\,DÑh3|ó®uþ¬
+Ä°×^B)E
+h¢w|õJ´«ïæ[‡V;*µZãt:\.N‹Ü …fÞùC3»Ùcò–•Ž@2uF/¸@7UGª<Õf‘6“Û4âÐj`ß¿AZitå/Âpá2K8\¦CZ<+m…Ãnq8ìjšÓ”9œv*Uª²p"vVÃòe.'ý×%åe ŠáH¸ŒþgX~Új¯¦ Ñj8•:AY¦Mƒ_&ÍH…×
+†à}Š¥ìööaSávlž´`g&óÇùs­øùZxϚ»žXÿæ­SÖ4ìò«4ÑÞ¤ÔLiJL¬®-m#hllýбÛw~ukUíBöñéEÅn{,;°AlšØøÜÉw{é~;5wŠ™ZLD—®ýR‰jܧ~¢ä5òšx†ÿDT—“ˆå
+·Ù·VܯßaÛUþ„íÙòCå†aã&B©Øß'Kw,/ݱ‚tÇ
+ҍåŸPôç… ñš¼+q^‘ʲ%ÖåÆP yók%WQŸ½î’ãGÏ\üüâŽÅMj]Uû–I˂Ž`,Ya/띪˜òõ›×Z|^Ö×ýýË[vo|qÇë“mصÌæ)ŽŒÝv·Exðá½Ï„Š¶æ¹€é³"/®‘z•æɖ~Ë
+I
+çšâ|AòdXbÎÃPURæ°Ó1°¾‚ʧÅùkoýg£QÊ,Ñhþ²æ™1ê*žé?…ùŸ叟L%ž`þø©Ø,” —ÅV‚KLîl·BT8~¢GQJä!ìËKc~Ç£4ýTÉóÂjeúÇrêY]s›çÕû§dÖ[vùØ3w¿ý¹´ŠI_þòÐ53:®°íºe÷-/}†­Ÿ>òðõ‚9Ñ·K¤¿ÉBˆiW, J³¥V bT"• äUl$Š0›x½Ng…卺€ z͏‚dÖ-¸[ÝÌ0M⡍V\a¸µP`?ÖÄè¥jcLˆˆ11°Ñ±ü¸ÊéN:JÂ~  {8öމ
+SHN}̟žùi´ðÓ·ó~$¸÷ 9©¥oÞè­Où*b>¦"._¥"UgõÑ*˜ÄšDMiò%J5êù‹ÄvkŠOX¼—ý¾µÆrûíø}7¬4.9aÞî)%[™®±µW9À `wÕrǼ®Øö#³ë+Úk}êb“Ѫ1VÕìY;þö°;;žùHR‡¦à7¥éA^kl-nQß^qOøyö :Þ_y:ðe§F“P×(”MÞ©
+Ä6¬ õÂá.nsd—úɊ';´Ò„@»OvðˆiT,-a}L'[ì.`öÉÜÐ"…J“-R‰‘Õ‘¬jÁ-òïCɖ ÃJV‹…Š¨ÅS·C§óÄ#Ū“L†)–tÀÁÕ;bª®Ç8A5s+…’F띀'Lp4frÇdÕ«očqÇJÁ+ŽÑݍQJáòv Adlµcc»ÐNÚ'øxZÈ˅<οŠÍ0
+ÉJVAW$‰I!I’’/-§Ï ´\* 'Ë©Ál,_Q¾­œé)?VNÊ×vƒ¹,[R ·§š)½ùÑ~ù=¬õ•‹£ùëægšÇ¢òŝQjClb‹$ø’ѾѨ¬
+îÜAÔÓÂòQMì’ ‡ Õ/\X§³
+/vQ”¾Õ“O.e —o 'êâöü!3½Ð!ßU¿èº*—9Éoم\ˆü7T9V¼4I¹²b\]ˏ~=mhñe·<uó±Y]Wm\ºê¶ëO¦ú'5öL«mî©ð^·È×°æÑ;2º¯e\^]VÛ´àžŠ¦p ’TJ›/»ÓW]}EUåD§´²kcUõî%wü¼åºÌ½+–?4ÒVõõßMBMbƤ§©ÄF-ªñ±õòÍ­‘2w:­m_•Æ&×$ã é¡oJU
+…Ò¦ )Y£ùQ¹ çý|¹Ò¼Ç𒁸1*
+aË©gŸ}¶>õìÌj£¾¾êTÂ܎ Ô&R[»ÎÁ|9•Jªªc¶šÇ/hžp2¢…‹†f@OÀ@­!IÑBš¡éº^2´6]g¹§@Çà®AÕ¯À’(^šJ*P—èSSIIô3ØÕ®¡6äqó0-'1pRëUÀŒfÔ0ôpÈó“ö_·3»Ûq;€•Ðbþ‘{o™(z°g8äß&Å0/ǪNŽZnÛSUÍò-•JtJ/ÐVa¼x¢è(ƪíÿ„Y”AÃø¤m,[†„~wNN<uj|êçÒ)ªƒÜ:Nµ±Ò©SÑ©“„脍8…œã3„dÄl¡Yeê3DŒýt½\ÆAT{lõ õríÅ*t¼`¡sëé.Ê´šøKýën¹ò_oøÜH¥S¥§ú[Îk¤lyýãÞïÌO$ W.ÇÎÛ³±ñ/ÏD³ÀmQä<,.ø*ųDÖòd à=  ÉDb/—ñA‹⑤q/I¼À’Ê- LŽÊ-N‰¨UÂ:ÜÉsԄŠ‘JÁ’JB&*µš`K'¡¦âyPÀûliwiòƒòA™­ÊuyŸ|L>!s2¹¾£V#ôH¥­ ÂI:׳¤“
+2涄Á²¬™µÇ%Q?ԂÐiò¸»'fhÊ$óòálÅÐZ `*ÙCë׳¢¡uÝ,ଡ&™WžÔ͸ÇÐ@Ù,éçÚ ®;³•îŒ;ÔþÎ+ꕏÉùþ-%è2Q v±š­¡¡‡r ÇûEQ±Á#ããb_½cÍؾ{-“-µUàT…žª|½òR…5+û*Lå5$öh=LOéü
+SÙÚå'˜`«°9>ÀĖ M2MdȀV¶ð8Í(ëŸjÒñ~Kâ²ý£êÄ7Zšé3¨Ã¤å9iktJeT;)ÁÇñíùd¾ƒkS1ïL q{}U¾SÅ ¯jM¬š&8º&héêMYK»Üi—Zà4w¦€Ò—SÓ²”WÆåC'†Þkxk^sè7¸†Ý#±!®—áG¼àdN°u›5"ËNSôEOH¡:?9ýÖ ²”ÂÐ s™7ghÀgJ÷EÁÚíó’}P²ÿ¸pÆ˃NÉì>dÍæÿü`Læ*¶VÕù.~aÅ-ÃëvfF?3zÅöJä¼/!+åTyM%h$ Q©&Z2Õ.8§Ò>€}d×êE«Ç֍®½cãæÍ5£¹Bâ
+|ïM‹3õzó)ž#R w¬Â÷î6¶¼áÙPçi·°™‘h·`áŐ‹2ã xñÕ'„>7+TCº¼k´‚9ÀŠ9žý!óöûq6ÄwŠd€’`dѽkYóK©|@üºè‰¤bh¢…ó€õ¬°$Ŏi‚C: ʲ®gÒiQô{bWr¬Ã™˜Ä—M'fõé'̱h¾¡2ï¡h2RœT€÷E§•—F!ÐRX©X©˜]Ý°4¨ÙPÀT¶T¶T¶”¬@)j•ƒ¦ZÙbh²b£IJ¡’Š*+6Š¬Øè²b£KúND@••¤=ì
+ùX™ÇÕü±üñ<›·aeކ•y Nµ|¬õ œ¤hRš'ËÄNp†·¨8Ú! à†­'ûgټϔi S¦›˜R$˜2ÝĔ"ÕL)L)ž‹)a
+´è8Æ· @“›ßƒ‘ßͳßÚ{áú+°d¡+"ÉåøزBW£`³çÃK6-ï{¨ñÙÍRæbðƒÛû3»ÂGzg±¡=åIàCÊàÕfô[q\ðbù—?ïÃÈÉ;Ý.!e:šÚF‡™/×DvÄuKÛHÉ‹Ô)™è[X#Ô4ZʵcúqAº©_®“"gê_ÐÝr;3 X°µM”BՄñúkBŒx³î9\èêÝJzNëãYzIû“¸*4@L?ýH´;\Œ3RŽÉijZex%
+–=;0zeoĐa&ÀçòšÀ;ýRÍD\î°¾o‡­Mî z,ÂюãL{‡Ù1Ú±¥ÃÑ!Û°Ä'›^Üî5½£ÞcÞã^Îk?ËfãµTµ^[Uë=Çfc«›é¥Ö¥ö¥³m6¶sÛë֌äY:èt¾5ªÆrå|*_ȵF‹œWaSŠW
+\ÖøòP-šË1™ÈåìÉ<f×PºúÉß{÷/weã_ÞÙ·úW¿]»à^‚±–#Ä~8 ˆ ¦GÈ }‚â•,‘‚Y Þ³ ­V¶1Ð=‡´.º›R­Ã¢D©YPÂ5©Œ÷ ÷”!æ ÔÄRQQKIªTäq(‰ ìCšJ¡jä9-E¡ªnhEÂM)ÝÓ)šj?ôxɞºøa2È "¯¦<â8òŗ!¾ìÉ{œÇ'œ,ðãQS@E1¢Á̱¤g-~ËÒÑ F}Å&iËgL‘õcY¼¥ãG¥aK‹eaU` ˜S¼þºtҚIö“¡„9œ”9¨ò²Œm\K‡íî¶iü±ËCË``ùÛ¸Æïè]4ÐÖ5ìôøRñb(Þjoù°ìòäÛÙG¾÷éË.¨/Z¶ØÁ‡³õ+v¼ÜÛ'%b,€‚¾ 7Nƹ]Û|’ù|£Næ1ó/„öTwH¾¢"¥Š^ +ÏåžËÿPú…ô¶ä,J¹R¯Ô]º]øœþ9ãQáKú¤pX8/çsCÞ%Âr/o
+¦—‘;5ô£aLÆLt„_ >r˜Aô€\…µêïÊQ-ö@B‹ÇIÇ
+—ÜÇñI|©ÆÿN–¹|Ù)«yY°åؔC5¼žx±Ÿ8ìVø‹IÁô¸æbËQ±fíe‰¦Äœý·æÇþ¸XÃÕÚHí²ÚuµÝµ5¾&»Ò¤²e.¶ü%M¸Ù*eãŖ¦m¢·4­{-±y¤Ë'=þÖ2q¥Bú…'\iFI¨3·¸L%Swõ‡t؄s° m³GV2DœÞFÌVÍ[3iKÛsÂtC™Ká~Ғ ¨‚R¨…R¨ˆÐC3u•×ž,Ó¸)1l¶Dá%'°‘°!~è¦/l‡WAõ×É?RUU¬«“Ó?ð*…+%nëôBzÝSˆÈ%õœ
+r*\Å)ÍKÈ¢ºñrÓC”j«¦'P¯šn6VLR l]Eþs®¢~|¢ÐT€¹
+56Ì'ԌÀ8f`Í8h0Uc‹ÁŠ¡’H:š ¨Øo£|¿òýVe´
+Øӏ«þcþã~ÖӇg Út” ZäٚãsôÈ0Œ¼~fõ" JŠù‰«5QIR“$€”¦„·ÌÖxouº(µÐžز°qË¢Û.ÙU*œ‡o
+Fª¥—`ó)ƒhˆn]zÅ'ÂÛ Ÿºyã|5Á§ì™aùðõ“x¯—Ä`ÉØÑ®®¬ŽªOzO¨oªN•Œâ¾.•4<ŸÔjõðHxŒg~—ætDp$Õ"ÖWÁœÆ‡¥žœ¾Ã¼ZDÉt"™%E%ŒÐ¥¢Jþ¤#/¥¡‡HoI)’èÇ\F§“ç“HHü§tc»hŠ£"+ŽûI):¥ñƒ˜!Ìôfñ(y²‰þ‘}„^¨©¦O¬IT7|BuH*>í`R€%؉ÌÓ qeëkœ"~ØS±S㧢VøGºfÉ֜Â)â h)oç,gÄgÊ₩IèǧAPB*yX•<,#’uL6À;')}”„yë Ö›kIÖr8o-%´œ²‚ÁY
+O k‘|:§åÍÉé&,³ÝíæG4Ԛ.·¶jiEÓÒAäF¼Æ K5vUëf1{© úÄ d(˒ƒeîV5(cÄ„4þeú4“.´rZSÉù9°§µF<n¾•eÐFx¾Õ2GõôZf§tÆ2;EcñZ›Iœ Ḿ6Ü‰Ä ;ÒÚ$®1/l 0¯á
+oÛj™÷hÅ,ÜXÖK—yBÌDaÕ¼ñ8Y2À³¼6“éÂd…ˆSdBØ
+Dzèßa˜ýW¬®%u6Ø`Ìc•“avµ¾b–<üÑ{Ñô´ߍÿW&Èï†;ÑÝø.¼u>Á’S>ÊÜóäÖ[áXŒñªµ‰’YN˜ž‰Õ»M҇`¼XÛÕuQoon-Եت ý#¼úšU×¢£Ìç¡®Ž3uMNÿúðà ÛMkµAfPSÏÔFq­m]ÛO Ú{‚.˜)>Ej›õX­Š
+=…:áûüšÖYïdÌNÜ CêªÇ¡Z.¡b¢
+;†™ýÜS¯ÛLò·"ùV¯¡0{«èÆî·Ä[C±èªýÖ
+µ©ÓãSÍ5ÔÌpvüæ̬2è]1ÜÓ3<ÜxÚ.pk(™•á V2/±_ᮁÿ_EŸ0§™ÓqÆéÆ-Kâo y>é}áØ7¢%(1^Œ’ˆ$øµÇ±\÷Va^Œì†’Ë+f(VÛWÁbE«0•±öwX@n&uS§NÃÕW?î:ÙÌø–+¶:7
+­A£q´­D#h]ˆ.AËàÑ|ԃÆÐ Z×]„ÚÑ*”Gè•PZ‚$E"ù%!´…PÍCÝÈ@ ›Q­E£(ˆ(‚RèCH†o҂–¢Í¨P/zMÐÿ.Ã7c ÄÃy´ú#×nڞÞô±ôªë®½â£­ç_·y#½
+á{÷[ë:{÷MôæôY,A|N63yæ1tàg„ÎÚ tӇx‰Ë ß¹rò<ÈÌÊC$ÿ©:¹o!‰Ce +!' \tü µñ}è"ÈåY™ks~
+ẔGáºÚLގ®†{—Á¹vR'¼ùƒdx¾¿€{Ëì§Ð0Р#ð\çÃñ°?í,‘ åÅ yŽÇЅä8mûvT îYΦÐJ¸/ûu8„g43œ›i»?@¦Ï÷?É3þ73´-ü¿-C[VþÙtBV¿ø'þˆlp_=~ðÀÑËÄþß»b–0=ô³®ABŸÿƼ‘wKB®.¸Öݔ¥ÿR ¦o
+endstream
+endobj
+62 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='68825cfa-3c73-11e1-0000-0edcf5b7d689' xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:Producer='GPL Ghostscript 8.61'/>
+<rdf:Description rdf:about='68825cfa-3c73-11e1-0000-0edcf5b7d689' xmlns:xap='http://ns.adobe.com/xap/1.0/' xap:ModifyDate='2012-01-08T17:43:36+01:00' xap:CreateDate='2012-01-08T17:43:36+01:00'><xap:CreatorTool>PScript5.dll Version 5.2.2</xap:CreatorTool></rdf:Description>
+<rdf:Description rdf:about='68825cfa-3c73-11e1-0000-0edcf5b7d689' xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='68825cfa-3c73-11e1-0000-0edcf5b7d689'/>
+<rdf:Description rdf:about='68825cfa-3c73-11e1-0000-0edcf5b7d689' 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:20120108174336+01'00')
+/ModDate(D:20120108174336+01'00')
+/Creator(PScript5.dll Version 5.2.2)
+/Title(Microsoft Word - KurzanleitungFW.doc)
+/Author(gba)>>endobj
+xref
+0 63
+0000000000 65535 f
+0000033409 00000 n
+0000206698 00000 n
+0000033299 00000 n
+0000032119 00000 n
+0000000015 00000 n
+0000004816 00000 n
+0000033474 00000 n
+0000131904 00000 n
+0000138776 00000 n
+0000133243 00000 n
+0000180583 00000 n
+0000033515 00000 n
+0000033545 00000 n
+0000032279 00000 n
+0000004836 00000 n
+0000011432 00000 n
+0000033586 00000 n
+0000033616 00000 n
+0000032441 00000 n
+0000011453 00000 n
+0000016086 00000 n
+0000130894 00000 n
+0000133930 00000 n
+0000033719 00000 n
+0000033657 00000 n
+0000033687 00000 n
+0000071626 00000 n
+0000032627 00000 n
+0000016107 00000 n
+0000022062 00000 n
+0000133001 00000 n
+0000177676 00000 n
+0000071678 00000 n
+0000071708 00000 n
+0000032789 00000 n
+0000022083 00000 n
+0000025712 00000 n
+0000115773 00000 n
+0000071844 00000 n
+0000071771 00000 n
+0000071801 00000 n
+0000130689 00000 n
+0000032975 00000 n
+0000025733 00000 n
+0000027284 00000 n
+0000130730 00000 n
+0000130760 00000 n
+0000033137 00000 n
+0000027305 00000 n
+0000032098 00000 n
+0000130812 00000 n
+0000130842 00000 n
+0000134122 00000 n
+0000138984 00000 n
+0000177874 00000 n
+0000180795 00000 n
+0000131040 00000 n
+0000131126 00000 n
+0000132451 00000 n
+0000133152 00000 n
+0000133636 00000 n
+0000205234 00000 n
+trailer
+<< /Size 63 /Root 1 0 R /Info 2 0 R
+/ID [<CCECB3E9CCD91A2981C6D56996BA4DFD><CCECB3E9CCD91A2981C6D56996BA4DFD>]
+>>
+startxref
+206916
+%%EOF
/NGVideo5_8/tags/V1.31/NGVideo_5_8GHz.pnproj
0,0 → 1,0
<Project name="NGVideo_5_8GHz"><File path="config.h"></File><File path="dogm.c"></File><File path="dogm.h"></File><File path="keys.c"></File><File path="keys.h"></File><File path="lipo.c"></File><File path="lipo.h"></File><File path="main.c"></File><File path="makefile"></File><File path="menue.c"></File><File path="menue.h"></File><File path="messages.c"></File><File path="messages.h"></File><File path="mk.h"></File><File path="ngvideo.c"></File><File path="ngvideo.h"></File><File path="servo.c"></File><File path="servo.h"></File><File path="tools.c"></File><File path="tools.h"></File><File path="tracking.c"></File><File path="tracking.h"></File><File path="usart.c"></File><File path="usart.h"></File></Project>
/NGVideo5_8/tags/V1.31/NGVideo_5_8GHz.pnps
0,0 → 1,0
<pd><ViewState><e p="NGVideo_5_8GHz" x="true"></e></ViewState></pd>
/NGVideo5_8/tags/V1.31/config.h
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 */
/* */
/* Tabs: 2 */
/* */
/****************************************************************/
 
#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_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 erkennen
#define VERSION "1.31"
#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, TRACKING_NMEA
#define TRACKING_MAX 4
/* 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.3
#define MK_I_OFFSET_MIN 0 // -0.5 (+0,5A ist auch der vom MK gesendete konstante Offset)
#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.31/dogm.c
0,0 → 1,299
 
/****************************************************************/
/* */
/* 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>
#include <string.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)
 
uint8_t CursorPos; // ersetzt lesen der aktuellen LCD-CursorPosition
 
/************************************************************************************/
/* 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 lcdSendC(char c)
{
lcdSetRegSelect(); // LCD-RS für Daten
lcdSendByte(c);
}
 
/************************************************************************************/
/* sendet ein Zeichen zum LCD-Display */
/* Parameter: */
/* char c :Zeichen */
/* */
/************************************************************************************/
void lcdPutc(char c)
{
lcdSendC(c);
CursorPos++;
if (CursorPos >= (LCD_LINES * LCD_COLS)) CursorPos = 0;
}
 
/************************************************************************************/
/* sendet einen String zum LCD-Display */
/* Parameter: */
/* char *str :Zeichenkette */
/* */
/************************************************************************************/
void lcdPuts(char *str)
{ uint8_t pos = CursorPos / LCD_COLS;
 
while (*str) {
if (*str == '\n') {
if (pos >= LCD_LINES)
pos = 0;
else
pos++;
lcdGotoXY(0, pos);
}
else
lcdPutc(*str);
str++;
}
}
 
/************************************************************************************/
/* stellt eine String mittig auf Display dar */
/* Parameter: */
/* char *str : darzustellende Zeichenkette */
/* uint8_t zle : Display-Zeile */
/* */
/************************************************************************************/
void lcdPutStrMid(char *str, uint8_t zle)
{ int8_t x;
 
lcdClearLine(zle);
x = (LCD_COLS - strlen(str))/2; // Array-String mittig schreiben
lcdGotoXY(x,zle);
lcdPuts(str);
}
 
/************************************************************************/
/* 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(SpecialChr_t *lcdChr, uint8_t quantity)
{
for (uint8_t i = 0; i < quantity; i++)
lcdWriteCGRAM(i, lcdChr[i]); // Sonderzeichen in CGRAM der LCD schreiben
}
 
/************************************************************************************/
/* Löscht Inhalt auf LCD-Display */
/* */
/************************************************************************************/
void lcdClear()
{
lcdSendInstruction(CLEAR_DISPLAY);
CursorPos = 0;
_delay_ms(2);
}
 
/************************************************************************************/
/* Löscht Inhalt ab Cursorposition bis Zeilenende auf LCD-Display */
/* CursorPos bleibt auf ab zu löschenden Zeichen */
/* */
/************************************************************************************/
void lcdClearEOL()
{ uint8_t cp = CursorPos % LCD_COLS;
if (cp > 0) //falls letztes Zeichen auf letzte Spalte geschrieben, nicht nächste Zeile löschen
for (; cp < LCD_COLS; cp++) lcdSendC(' ');
lcdSendInstruction(SET_DDRAM_ADDR | CursorPos);
}
 
/************************************************************************************/
/* Löscht Inhalt der angegebenen Zeile auf LCD-Display */
/* CursorPos bleibt auf Zeilenanfang */
/* */
/************************************************************************************/
void lcdClearLine(uint8_t y)
{
lcdGotoXY(0, y);
for (uint8_t x = 0; x < LCD_COLS; x++) lcdSendC(' ');
lcdSendInstruction(SET_DDRAM_ADDR | CursorPos);
}
 
/************************************************************************************/
/* 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)
{
if(x > LCD_COLS) x = 0;
if(y > LCD_LINES) y = 0;
CursorPos = y * LCD_COLS + x;
lcdSendInstruction(SET_DDRAM_ADDR | CursorPos);
}
 
/************************************************************************************/
/* 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.31/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 SpecialChr_t[8];
 
void lcdWriteCGRAM(uint8_t lcd_addr, char *lcdChr); // write a char string to CGRAM
void lcdWriteCGRAM_Array(SpecialChr_t *lcdChr, uint8_t quantity); // write a array of char string to CGRAM
void lcdSendInstruction(char instruction);
void lcdPutc(char c);
void lcdPuts(char *str);
void lcdPutStrMid(char *str, uint8_t zle);
void lcdClear(void);
void lcdClearEOL(void);
void lcdClearLine(uint8_t y);
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.31/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) { // jetzt beschleunigen, Wert bestimmt die max. Beschleunigung/Wiederholrate
cli(); // kann jedoch nicht kleiner 10ms sein
key_repeat_next -= 2; // noch etwas schneller
sei();
}
}
}
}
/NGVideo5_8/tags/V1.31/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.31/lipo.c
0,0 → 1,91
 
/****************************************************************/
/* */
/* 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/eeprom.h>
#include <stdlib.h>
#include <string.h>
#include "ngvideo.h"
#include "dogm.h"
#include "menue.h"
#include "mk.h"
 
uint8_t mk_UBat; // Battery Voltage in 0.1 Volts
uint16_t mk_dUsedCapacity = 0;
uint16_t mk_Ikorr;
 
uint8_t mk_akku_nr = AKKU_NR_MIN;
uint8_t mk_i_offset = MK_I_OFFSET;
uint8_t mk_i_faktor = MK_I_FAKTOR;
uint8_t mk_w_faktor = MK_W_FAKTOR;
mk_current_t mk_current = {0, 0};
mk_lipo_t mk_lipo = {0xff, AKKU_CAPACITY, 0, 0}; // Umk 255 ==> erste Inbetriebnahme keine Nachfrage Akku-Nr.
 
 
void store_LipoData(void)
{ uint32_t tmp_time_on;
 
tmp_time_on = eeprom_read_dword(&ep_mk_lipo[mk_akku_nr].time_on);
mk_timer = 0;
if (tmp_time_on != mk_lipo.time_on) {
if (!MK_Motor_run) mk_lipo.UsedCapacity = mk_dUsedCapacity;
eeprom_write_byte(&ep_mk_lipo[mk_akku_nr].Umk, mk_lipo.Umk);
eeprom_write_word(&ep_mk_lipo[mk_akku_nr].UsedCapacity, mk_lipo.UsedCapacity);
eeprom_write_dword(&ep_mk_lipo[mk_akku_nr].time_on, mk_lipo.time_on);
eeprom_write_block(&mk_current,&ep_mk_current,sizeof(mk_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 MK_ProcessLipo(NaviData_t *navi_data)
{ char tmp_pmenu[sizeof(pmenu)];
mk_UBat = navi_data->UBat;
// Spannung, Strom, Leistung sofort (ohne Motorstart) lesen
if ((!MK_Motor_run) && (navi_data->Current <= I_MOTOR_OFF) && (mk_UBat > 0)) {
if (mk_UBat < mk_lipo.Umk)
mk_lipo.Umk = mk_UBat; // Bei Ruhestrom, da je nach Last mk_UBat schwankend
else
if (mk_UBat > (mk_lipo.Umk + 4)) { // Bei Ruhestrom kleiner 501mA Akku gewechselt? IR=280mA gemessen, 400mV Hysterese
// Akku des MK wurde gegen einen geladenen ausgetauscht
mk_lipo.Umk = mk_UBat;
mk_timer = 0;
mk_dUsedCapacity = 0;
mk_lipo.UsedCapacity = 0;
mk_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
Menu_MK_BatteryChangeNr(); // eingeschobenes Menü, danach aber wieder zur ursprünglichen Anzeige! GPS ruft sich hier noch mal selbst auf!
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 möglichen while, innerhalb der Fkt. wieder auf 0 gesetzt
store_LipoData();
}
}
mk_timer = 1; // MK-Timer auf on stellen
if (mk_current.Count > 18000) { // ungefär 30 Minuten Mittelwert
mk_current.Sum = (mk_current.Sum * 9)/10; // um 10% verkleinern
mk_current.Count = ((uint32_t)mk_current.Count * 9)/10;
}
if (navi_data->Current >= MK_I_OFFSET_5) { // keine negativen Zwischenergebnisse zulassen
mk_Ikorr = mk_i_offset + (uint32_t)(navi_data->Current - MK_I_OFFSET_5) * mk_i_faktor / 100;
mk_current.Sum += mk_Ikorr;
mk_current.Count++;
}
mk_dUsedCapacity = mk_lipo.UsedCapacity + (uint32_t)navi_data->UsedCapacity * mk_w_faktor / 100;
}
/NGVideo5_8/tags/V1.31/lipo.h
0,0 → 1,33
#ifndef _LIPO_H_
#define _LIPO_H_
 
#include "mk.h"
 
typedef struct {
uint8_t Umk;
uint16_t Capacity;
uint16_t UsedCapacity;
uint32_t time_on;
}mk_lipo_t;
 
typedef struct {
uint32_t Sum;
uint16_t Count;
}mk_current_t;
 
 
extern uint8_t mk_UBat; // Battery Voltage in 0.1 Volts
extern uint16_t mk_dUsedCapacity;
extern uint16_t mk_Ikorr;
 
extern mk_current_t mk_current;
extern uint8_t mk_akku_nr;
extern mk_lipo_t mk_lipo;
extern uint8_t mk_i_offset;
extern uint8_t mk_i_faktor;
extern uint8_t mk_w_faktor;
 
void store_LipoData(void);
void MK_ProcessLipo(NaviData_t *navi_data);
 
#endif
/NGVideo5_8/tags/V1.31/main.c
0,0 → 1,110
 
/****************************************************************/
/* */
/* 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 <util/delay.h>
 
#include "ngvideo.h"
#include "menue.h"
#include "servo.h"
#include "config.h"
#include "dogm.h"
#include "keys.h"
#include "usart.h"
#include "tracking.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();
}
 
Displ_Main_Disp();
 
while(1)
{
Task_0_1();
Task_0_2();
Tasks_invisible();
if (!bat_low) {
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);
}
if (Get_Key_Long( 1<<SW_ENTER ) && tracking == TRACKING_NMEA) setNMEAdir(); // direction
}
}
}
/NGVideo5_8/tags/V1.31/makefile
0,0 → 1,412
# 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 ngvideo.c menue.c dogm.c keys.c servo.c usart.c tools.c tracking.c lipo.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
#DIRAVR = C:\Program Files (x86)\Atmel\AVR Studio 5.0\AVR Toolchain\avr
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.31/menue.c
0,0 → 1,1787
 
/****************************************************************/
/* */
/* 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/interrupt.h>
#include <avr/eeprom.h>
#include <util/delay.h>
#include <stdlib.h>
#include <string.h>
 
#include "config.h"
#include "ngvideo.h"
#include "keys.h"
#include "menue.h"
#include "servo.h"
#include "tracking.h"
#include "messages.c"
#include "dogm.h"
#include "tools.h"
#include "usart.h"
#include "ngvideo.h"
 
typedef uint8_t scr_menu_t[SCROLL_MAIN_MAX];
char pmenu[6] = {"0"}; // Zuordnung Menü Programmgliederung zu hinterlegten Funktionen
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
uint8_t exit_while = 0; // unabhängige Task (z.B: Menu_MK_BatteryChangeNr() - Aufruf) kann Eingabe while-Schleife beenden, wenn 1
 
// 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 = RXTimeStr;
 
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 oder NMEA 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} // bei NMEA wird dieser Menüpunkt um 1 vorgezogen (anstelle GPS_MISC)
};
 
 
uint8_t Change_Value(uint16_t *val, uint16_t min_val, uint16_t max_val, uint8_t fl_pos, Displ_Fnct_t Displ_Fnct);
 
 
/**************************************************************/
/* */
/* 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 */
/* */
/************************************************************************************/
uint8_t Long_Enter(void)
{
Tasks_invisible(); // Dadurch ist Doppelaufruf von MK-GPS möglich!!! Nur bei Menu_MK_BatteryChangeNr()
// falls Akku leer ==> Menü verlassen und Anzeige __ACCU_LOW
U_Messen_cmp(DISABLE_BTIMER);
if (Get_Key_Long( 1<<SW_ENTER ) || bat_low) {
pmenu[0] ='\0'; // direkt in das Hauptprogramm
return 1;
}
else return 0;
}
 
uint8_t Short_Enter(void)
{ uint8_t ret;
 
// bis Short- oder Long-Enter, auch Akku leer
while( !Get_Key_Short( 1<<SW_ENTER ) && !Long_Enter() && !exit_while);
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 i;
if (scr_idx > 0) scr_idx--; else scr_idx = scr_menu[0];
for (i = 0; i < LCD_LINES; i++) {
lcdGotoXY(2, i); // LCD Beginn x-Position, 2 Zeichen rechts eingerückt
lcdPuts(Msg(scr_menu[scr_idx + 1]));
lcdClearEOL(); // ab Stringende bis zum Zeilenende löschen; LCD löschen flackert sonst zu sehr
if (scr_idx < scr_menu[0]) 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 > 1) { // bei l=1 und Subtraktion 1 wird sowieso Displ_Main_Disp() ausgeführt und dort pmenu[0] = '\0' gesetzt
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
}
else 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 scr_idx)
{ uint8_t l;
 
lcdClear();
lcdGotoXY(0, 1);
lcdPutc(MARKER_SELECT); // '>>'
Displ_Scroll_Menu(scr_menu, scr_idx);
// bis Menueeingabe bestätigt oder zum vorherigen Menue
while( !Get_Key_Short( 1<<SW_ENTER ) && !Long_Enter() && !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 = scr_menu[0];
Displ_Scroll_Menu(scr_menu, scr_idx);
}
// >> Menueauswahl nach unten
if( Get_Key_Press( 1<<SW_MINUS ) || Get_Key_Rpt( 1<<SW_MINUS )) {
if (scr_idx < scr_menu[0]) scr_idx++; else scr_idx = 0;
Displ_Scroll_Menu(scr_menu, scr_idx);
}
}
 
lcdClear();
if (exit_while) // wegen Aufruf Menu_MK_BatteryChangeNr() in Task
m_pkt = scr_idx; // nach Task Menu_MK_BatteryChangeNr() wieder zum ursprünlichen Anzeigepunkt
else {
l = strlen(pmenu);
if ((scr_idx == 0) || (l == 0)) // long Enter wird durch l == 0 brücksichtigt
return_m_pkt(l); // um bei Rücksprung auf ursprünglichen Menüpunkt zu zeigen oder Displ_Main_Disp()
else {
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] ='\0';
Beep(BEEPENTER);
}
}
exit_while = 0;
}
 
/************************************************************************************/
/* */
/* Ändern der Werte mit Tasten +,- und Anzeige */
/* z.B. für U-Offset, Batterie leer Eingabe ... */
/* */
/* Parameter: */
/* uint16_t val :zu ändernter Wert */
/* uint16_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 */
/* uint16_t Change_Value_plmi(...) :Rückgabe geänderter Wert */
/* */
/************************************************************************************/
uint16_t Change_Value_plmi(uint16_t val, uint16_t min_val, uint16_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: */
/* uint16_t *val :zu ändernter Wert */
/* uint16_t min_val, max_val :min, max Grenze Wert ändern darf */
/* uint8_t fl_pos :Bit 7 beschleunigte Repeat-Funktion aus/ein */
/* Bit 6 zyklische Werteänderung aus/ein */
/* Bit 4-5 z.Z. ohne Funktion */
/* Bit 0-3 Wert xPos auf LCD */
/* Displ_Fnct_t Displ_Fnct :Index um variable Display Funktion aufzurufen */
/* uint8_t Change_Value(...) :Rückgabe geändert ergibt TRUE */
/* */
/************************************************************************************/
// Bei Bedarf könnte einfach innerhalp fl_pos auch noch pos_y (Bit 4-5) übergeben werden
uint8_t Change_Value(uint16_t *val, uint16_t min_val, uint16_t max_val, uint8_t fl_pos, Displ_Fnct_t Displ_Fnct)
{ uint16_t tmp_val;
 
tmp_val = *val;
lcdGotoXY(fl_pos & POSXMASK, ZLE_VAL); // Position Wert
Displ_Fnct(tmp_val); // initiale Wertdarstellung, je nach Menüpunkt
if (pmenu[0] =='\0') strcpy(pmenu, "0"); // sonst wird eventuell nachfolgende while-Schleife nicht ausgeführt
// bis Menueeingabe bestätigt oder zum vorherigen Menue
while( !Get_Key_Short( 1<<SW_ENTER ) && !Long_Enter() && !exit_while)
*val = Change_Value_plmi(*val, min_val, max_val, fl_pos & POSXMASK, ZLE_VAL, Displ_Fnct, fl_pos & (1<<CYCLE), fl_pos & (1<<V_REPEAT));
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(tmp_val != *val);
}
 
/**************************************************************/
/* */
/* LCD-Darstellungen der Menüs */
/* Zur Unterstützung der Auswahl werden einige Einstellungen */
/* sofort ausgeführt. Z.B.: Kontrast, Servo-Endausschlag */
/* */
/**************************************************************/
 
/************************************************************************************/
/* 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: */
/* uint16_t k :Index anzuzeigender Wert = Kanal + 0x30 als Char, */
/* uint16_t wegen Vereinheitlichung f. Funktionsaufrauf */
/* */
/************************************************************************************/
void Displ_Channels(uint16_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: */
/* uint16_t q :Index anzuzeigender Wert, */
/* unint16_t wegen Vereinheitlichung f. Funktionsaufrauf */
/* */
/************************************************************************************/
void Displ_AV_Source(uint16_t q)
{ uint8_t av_src_table[] = {MSG_AV1, MSG_AV2, MSG_DIVERSITY};
 
lcdPutStrMid(Msg(av_src_table[q]), ZLE_VAL);
}
 
/************************************************************************************/
/* zeigt Tracking-Varianten zur Auswahl auf Display an */
/* Parameter: */
/* uint16_t q :Index anzuzeigender Wert, */
/* uint16_t wegen Vereinheitlichung f. Funktionsaufrauf */
/* */
/************************************************************************************/
void Displ_sel_Tracking(uint16_t q)
{ uint8_t track_sel_table[] = {MSG_OFF, MSG_TRACK_RSSI, MSG_TRACK_GPS, MSG_TRACK_MKCOCKPIT, MSG_TRACK_NMEA};
 
lcdPutStrMid(Msg(track_sel_table[q]), ZLE_VAL);
}
 
/************************************************************************************/
/* zeigt Senden der OSD-Daten Anforderung zur Auswahl auf Display an */
/* Parameter: */
/* uint16_t q :Index anzuzeigender Wert, */
/* uint16_t wegen Vereinheitlichung f. Funktionsaufrauf */
/* */
/************************************************************************************/
void Displ_track_TX(uint16_t q)
{ uint8_t track_TX_table[] = {MSG_OFF, MSG_TRACK_TX_ON};
 
lcdPutStrMid(Msg(track_TX_table[q]), ZLE_VAL);
}
 
/************************************************************************************/
/* zeigt einen max. 3-stelligen Integerwert auf Display an */
/* Parameter: */
/* uint16_t val :anzuzeigender Wert, */
/* uint16_t wegen Vereinheitlichung f. Funktionsaufrauf */
/* */
/************************************************************************************/
void Displ_Format_Int(uint16_t val)
{
lcdPuts(my_itoa(val, 3, 0, 0));
}
 
/************************************************************************************/
/* zeigt den Kontrastwert auf Display an mit sofortiger Änderung */
/* Parameter: */
/* uint16_t val :anzuzeigender Wert, */
/* uint16_t wegen Vereinheitlichung f. Funktionsaufrauf */
/* */
/************************************************************************************/
void Displ_Set_Contrast(uint16_t val)
{
Displ_Format_Int(val);
lcdContrast(dogm_vers, val);
}
 
/************************************************************************************/
/* zeigt die Zeit zur Abschaltung der LCD-Hintergrundbeleuchtung an */
/* Parameter: */
/* uint16_t val :anzuzeigender Wert, */
/* uint16_t wegen Vereinheitlichung f. Funktionsaufrauf */
/* */
/************************************************************************************/
void Displ_Backgr_Light(uint16_t val)
{ char str[5];
 
switch(val) {
case BACKGR_LIGHT_MIN : lcdPuts(Msg(MSG_LIGHT_OFF));
break;
case BACKGR_LIGHT_MAX : lcdPuts(Msg(MSG_LIGHT_ON));
break;
default : itoa (val * 10, str, 10);
lcdPutc(' ');
lcdPuts(str);
lcdPuts(Msg(MSG_SEC));
}
lcdClearEOL();
}
 
/************************************************************************************/
/* zeigt ein oder aus zur Auswahl auf Display an */
/* Parameter: */
/* uint16_t val :0 = aus oder 1 = ein, */
/* uint16_t wegen Vereinheitlichung f. Funktionsaufrauf */
/* */
/************************************************************************************/
void Displ_Off_On(uint16_t val)
{
if (val == 0) lcdPuts(Msg(MSG_OFF)); else lcdPuts(Msg(MSG_ON));
}
 
/************************************************************************************/
/* zeigt Servoschritte zur Auswahl auf Display an */
/* Parameter: */
/* uint16_t val :0 = 255 oder 1 = 1023, */
/* uint16_t wegen Vereinheitlichung f. Funktionsaufrauf */
/* */
/************************************************************************************/
void Displ_Servo_Steps(uint16_t val)
{ uint8_t servo_step_table[] = {MSG_STEPS_255, MSG_STEPS_1023};
 
lcdPutStrMid(Msg(servo_step_table[val]), ZLE_VAL);
}
 
/************************************************************************************/
/* zeigt Servo-Anschlagposition links auf Display an */
/* mit sofortiger Wirkung auf Servo */
/* Parameter: */
/* uint16_t val :anzuzeigender Wert, */
/* uint16_t wegen Vereinheitlichung f. Funktionsaufrauf */
/* */
/************************************************************************************/
void Displ_Servo_Min(uint16_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: */
/* uint16_t val :anzuzeigender Wert, */
/* uint16_t wegen Vereinheitlichung f. Funktionsaufrauf */
/* */
/************************************************************************************/
void Displ_Servo_Max(uint16_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: */
/* uint16_t val :anzuzeigender Wert, */
/* uint16_t wegen Vereinheitlichung f. Funktionsaufrauf */
/* */
/************************************************************************************/
void Displ_Servo_Mid(uint16_t val)
{ int16_t mid_val;
mid_val = val - ServoSteps()/2;
lcdPuts(my_itoa(mid_val, 4, 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: */
/* uint16_t val :0 = Servo 1 oder 1 = Servo 2, */
/* uint16_t wegen Vereinheitlichung f. Funktionsaufrauf */
/* */
/************************************************************************************/
void Displ_ServoNr(uint16_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; // Anzahl der vollen Kästchen
 
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(uint16_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(" ");
Displ_Format_Int(Pos_us);
}
else {
lcdPuts(my_itoa(Pos_us, 5, 3, 3));
}
lcdPuts(me);
lcdGotoXY(8, 1);
lcdPuts(my_itoa(PosProzent, 6, 1, 1));
lcdPutc('%');
}
 
/************************************************************************************/
/* zeigt Pausenlänge der Links-, Mittel- und Rechtsposition auf Display an */
/* Parameter: */
/* uint16_t val : Zeit in 1ms * 100 */
/* */
/************************************************************************************/
void Displ_Pause(uint16_t val)
{
if (val > 9) {
lcdPuts(my_itoa(val, 3, 1, 1));
lcdPuts("s ");
}
else {
Displ_Format_Int(val * 100);
lcdPuts("ms");
}
}
 
/************************************************************************************/
/* zeigt aus oder Integerwert auf Display an */
/* Parameter: */
/* uint16_t val : val = 0 ==> aus, sont Integerwert */
/* */
/************************************************************************************/
void Displ_Off_Format_Int(uint16_t val)
{
if (val == 0)
lcdPutStrMid(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: */
/* uint16_t val : val = 0 ==> aus, sont Integerwert */
/* */
/************************************************************************************/
void Displ_Pause_Step(uint16_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: */
/* uint16_t q :Index anzuzeigender Wert, */
/* uint16_t wegen Vereinheitlichung f. Funktionsaufrauf */
/* */
/************************************************************************************/
void Displ_Baudrate(uint16_t q)
{ char str[7];
 
ltoa(getBaud(q), str, 10);
lcdPutStrMid(str, ZLE_VAL);
}
 
/************************************************************************************/
/* zeigt aktive Empfängerzeiten auf Display an */
/* */
/************************************************************************************/
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: */
/* uint16_t val :Akku-Kapazität in 50mAh Schritte */
/* uint16_t wegen Vereinheitlichung f. Funktionsaufrauf */
/* */
/************************************************************************************/
void Displ_MK_Capacity(uint16_t val)
{
lcdPuts(my_itoa(val * 50, 4, 0, 0));
lcdPuts("mAh");
}
 
/************************************************************************************/
/* zeigt Offset (Korrektur Ruhestrom) für Strom des MK auf Display an */
/* Parameter: */
/* uint16_t val :Korrekturfaktor */
/* uint16_t wegen Vereinheitlichung f. Funktionsaufrauf */
/* */
/************************************************************************************/
void Displ_I_Offset(uint16_t val)
{
lcdPuts(my_itoa((int8_t)val - MK_I_OFFSET_5,4,1,1));
lcdPutc('A');
}
 
 
/************************************************************************************/
/* zeigt Korrekturfaktor für Strom und Arbeit des MK auf Display an */
/* Parameter: */
/* uint16_t val :Korrekturfaktor */
/* uint16_t wegen Vereinheitlichung f. Funktionsaufrauf */
/* */
/************************************************************************************/
void Displ_Faktor_2Nk(uint16_t val)
{
lcdPuts(my_itoa(val,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 SetAndDispl_AV_Mark(void)
{ char marker;
 
marker = av_source < DIVERSITY? MARKER_AV : MARKER_RSSI; // wird nur bei gesetzten Diversity überschrieben
Displ_AV_Mark(sw_avx, marker);
}
 
void Displ_Main_Disp(void)
{
pmenu[0] ='\0'; // bei Direktansprung z.B. von Menu_RSSI_min() erforderlich
lcdClear();
if (!bat_low) {
lcdClear();
Displ_Channels(channel);
lcdGotoXY(LCD_COLS - 1, 0);
lcdPuts("V\n1\n2");
SetAndDispl_AV_Mark();
Displ_VBat(); // muss zuletzt stehen
}
else {
lcdPutStrMid(Msg(MSG_ACCU_LOW), 0);
}
}
 
 
 
/**************************************************************/
/* */
/* Menüs */
/* */
/**************************************************************/
 
/**************************/
/* */
/* Haupmenü */
/* */
/**************************/
void Menu_Main(void)
{ scr_menu_t scr_main_menu = {SCROLL_MAIN_MAX-4, 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};
 
switch(tracking) {
case TRACKING_RSSI: scr_main_menu[11] = MSG_TRACK_SERVO_HYTERESE;
scr_main_menu[0]++; // SCROLL_MAIN_MAX erhöhen
break;
case TRACKING_GPS: scr_main_menu[11] = MSG_TRACK_TX_OSD_DATA;
scr_main_menu[0] += 2; // SCROLL_MAIN_MAX erhöhen, zusätzliche Anzeige zu GPS MSG_GPS_DISPLAY
break;
case TRACKING_NMEA: scr_main_menu[0]++; // SCROLL_MAIN_MAX erhöhen, zusätzliche Anzeige zu GPS
case TRACKING_MKCOCKPIT: scr_main_menu[0]++; // SCROLL_MAIN_MAX erhöhen
scr_main_menu[11] = MSG_COM;
break;
}
strcpy(pmenu, "0");
Scroll_Menu(scr_main_menu, m_pkt); // pmenu global
Jump_Menu(pmenu); //gewähltes Untermenü anspringen oder nur Return
}
 
/**************************/
/* */
/* AV-Quelle */
/* */
/**************************/
void Menu_AV_Source(void)
{ uint16_t tmp_val;
 
Displ_Title(MSG_AV_SOURCE);
tmp_val = av_source;
if (Change_Value(&tmp_val, AV_SOURCE_MIN, AV_SOURCE_MAX, 3, Displ_AV_Source)) { // pmenu global
cli();
av_source = tmp_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 bei long Enter im Hauptdisplay nicht aktuallisiert
SetAndDispl_AV_Mark();
sei();
}
Jump_Menu(pmenu);
}
 
/**************************/
/* */
/* Kanal */
/* */
/**************************/
void Menu_RX_Channel(void)
{ uint16_t tmp_val;
 
Displ_Title(MSG_RX_CHANNEL);
tmp_val = channel;
if (Change_Value(&tmp_val, CHANNEL_MIN, CHANNEL_MAX, 3, Displ_Channels) || (tmp_val != ch_stored)) { // pmenu global
channel = tmp_val;
ch_stored = tmp_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[SCROLL_MAX_5] = {SCROLL_MAX_5-2, MSG_RETURN, MSG_RSSI_MIN, MSG_RSSI_MIN_ALL, MSG_RSSI_MAX};
 
Scroll_Menu(scr_sub_menu, m_pkt); // pmenu global
Jump_Menu(pmenu);
}
 
void AdviceTX(uint8_t msg)
{ char str[20];
 
strcpy(str, Msg(MSG_TX));
strcat(str, Msg(msg));
lcdPutStrMid(str, 1);
lcdPutStrMid(Msg(MSG_CONTINUE), 2);
}
 
void Menu_RSSI_min(void)
{
Displ_Title(MSG_RSSI_MIN);
AdviceTX(MSG_TX_OFF);
if (Short_Enter()) { // pmenu global
RSSI_Min_Calibrate(0, bar_udbm);
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));
lcdPutStrMid(str,0);
lcdPutStrMid(Msg(MSG_RX_CHANNEL),1);
lcdPutStrMid(str_ch, 2);
delay_ms100x(30);
}
 
void Menu_RSSI_min_all(void)
{ char not_cal[15];
uint8_t f = 0;
 
Displ_Title(MSG_RSSI_MIN_ALL);
AdviceTX(MSG_TX_OFF);
if (Short_Enter()) { // pmenu global
for ( uint8_t i = 1; i <= CHANNEL_MAX; i++) {
Set_Channel(i);
if (!RSSI_Min_Calibrate(i, bar_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);
}
Displ_Main_Disp();
}
else
Jump_Menu(pmenu);
}
 
void Menu_RSSI_max(void)
{
Displ_Title(MSG_RSSI_MAX);
AdviceTX(MSG_TX_ON);
if (Short_Enter()) { // pmenu global
RSSI_Max_Calibrate(bar_udbm);
Displ_Main_Disp();
}
else
Jump_Menu(pmenu);
}
 
/**************************/
/* */
/* Sprache */
/* */
/**************************/
void Displ_Language(uint16_t i)
{ uint8_t lanuage_table[3] = {MSG_GERMAN, MSG_ENGLISH, MSG_FRENCH};
 
lcdPutStrMid(Msg(lanuage_table[i]), ZLE_VAL);
}
 
void Menu_Language(void)
{ uint16_t tmp_val;
 
Displ_Title(MSG_LANGUAGE);
tmp_val = language;
language = eeprom_read_byte(&ep_language); // damit bei Erstinbetriebnahme Sprache gespeichert wird NO_LANGUAGE
Change_Value(&tmp_val, GERMAN, LAST_LANG, 3, Displ_Language); // pmenu global
if (tmp_val != language) {
language = tmp_val;
eeprom_write_byte(&ep_language, language);
Double_Beep(DBEEPWR, DBEEPWRP);
}
Jump_Menu(pmenu);
}
 
/**************************/
/* */
/* Servo-Einstellungen */
/* */
/**************************/
void Menu_Servo_Calibr(void)
{ uint8_t scr_sub_menu[SCROLL_MAX_5] = {SCROLL_MAX_5 - 2, MSG_RETURN, MSG_SERVO_STEPS, MSG_SERVO1, MSG_SERVO2};
 
Scroll_Menu(scr_sub_menu, m_pkt); // pmenu global
Jump_Menu(pmenu);
}
 
void NoTracking_ServosOff(void)
{
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
}
}
 
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)
{ uint16_t tmp_val;
Displ_Title(MSG_SERVO_STEPS);
lcdGotoXY(8, ZLE_VAL);
tmp_val = sIdxSteps;
if (Change_Value(&tmp_val, STEPS_255, STEPS_1023, 5, Displ_Servo_Steps)) { // pmenu global
cli();
sIdxSteps = tmp_val;
eeprom_write_byte(&ep_sIdxSteps, sIdxSteps);
Servo_NewValues(sIdxSteps); // hier ist der neue Index anzugeben!
servoInit(SERVO_PERIODE);
sei();
NoTracking_ServosOff();
Double_Beep(DBEEPWR, DBEEPWRP);
}
Jump_Menu(pmenu);
}
 
void Menu_Servo1(void)
{ uint8_t scr_servo_menu[SCROLL_MAX_6] = {SCROLL_MAX_6 - 2, MSG_RETURN, MSG_SERVO1_REVERSE, MSG_CALIB1_LEFT, MSG_CALIB1_RIGHT, MSG_CALIB1_MIDDLE};
Scroll_Menu(scr_servo_menu, m_pkt); // pmenu global
servo_nr = 0;
Jump_Menu(pmenu);
}
 
void Menu_Servo2(void)
{ uint8_t scr_servo_menu[SCROLL_MAX_6] = {SCROLL_MAX_6 - 2, MSG_RETURN, MSG_SERVO2_REVERSE, MSG_CALIB2_LEFT, MSG_CALIB2_RIGHT, MSG_CALIB2_MIDDLE};
Scroll_Menu(scr_servo_menu, 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)
{
servoSetDefaultPos();
tracking = track; // ursprünglicher Wert Tracking aus, RSSI oder GPS
NoTracking_ServosOff(); // Servos sind nur zum Tracking oder bei Kalibrierung eingeschaltet
Jump_Menu(pmenu);
}
 
void Menu_Servo_rev(void)
{ uint16_t tmp_val;
uint8_t tmp_tracking;
 
tmp_tracking = Servo_tmp_on(SERVO_PERIODE);
tmp_val = servo[servo_nr].rev;
if (Change_Value(&tmp_val , 0, 1, 6, Displ_Off_On)) { // pmenu global; reverse gibt es nur 0=off, 1=on
servo[servo_nr].rev = tmp_val ;
servoSet_rev(servo_nr, tmp_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)
{ uint16_t tmp_val;
uint8_t tmp_tracking;
 
tmp_tracking = Servo_tmp_on(SERVO_PERIODE);
servoSetPosition(servo_nr, ServoSteps()); // Linkssanschlag um Kalibrierung am Servo zu sehen
tmp_val = servo[servo_nr].max;
if (Change_Value(&tmp_val, servo_limit[sIdxSteps][LEFT].min, servo_limit[sIdxSteps][LEFT].max, 6|(1<<V_REPEAT), Displ_Servo_Max)) { // pmenu global
servo[servo_nr].max = tmp_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)
{ uint16_t tmp_val;
uint8_t tmp_tracking;
 
tmp_tracking = Servo_tmp_on(SERVO_PERIODE);
servoSetPosition(servo_nr, 0); // Rechtsanschlag um Kalibrierung am Servo zu sehen
tmp_val = servo[servo_nr].min;
if (Change_Value(&tmp_val, servo_limit[sIdxSteps][RIGHT].min, servo_limit[sIdxSteps][RIGHT].max, 6|(1<<V_REPEAT), Displ_Servo_Min)) { // pmenu global
servo[servo_nr].min = tmp_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)
{ uint16_t tmp_val;
uint8_t tmp_tracking;
 
tmp_tracking = Servo_tmp_on(SERVO_PERIODE);
servoSetPosition(servo_nr, ServoSteps()/2); // Mittelposition um Kalibrierung am Servo zu sehen
tmp_val = servo[servo_nr].mid;
if (Change_Value(&tmp_val, servo_limit[sIdxSteps][MIDDLE].min, servo_limit[sIdxSteps][MIDDLE].max, 5|(1<<V_REPEAT), Displ_Servo_Mid)) { // pmenu global
servo[servo_nr].mid = tmp_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-Tests */
/* */
/**************************/
void Menu_Servo_Test(void)
{ uint8_t scr_sub_menu[SCROLL_MAX_6] = {SCROLL_MAX_6 - 2, MSG_RETURN, MSG_PULSE_WIDTH, MSG_CONTINOUS, MSG_SERVO, MSG_FRAME};
 
Scroll_Menu(scr_sub_menu, m_pkt); // pmenu global
servo_nr = eeprom_read_byte(&ep_servo_nr);
Jump_Menu(pmenu);
}
 
void Menu_Test_Frame(void)
{ uint16_t tmp_val;
 
Displ_Title(MSG_FRAME);
lcdGotoXY(8, ZLE_VAL);
lcdPuts("ms");
tmp_val = servo_frame;
if (Change_Value(&tmp_val, SERVO_PERIODE_MIN, SERVO_PERIODE_MAX, 5|(1<<V_REPEAT), Displ_Format_Int)) { // pmenu global
servo_frame = tmp_val;
eeprom_write_byte(&ep_servo_frame, servo_frame);
Double_Beep(DBEEPWR, DBEEPWRP);
}
Jump_Menu(pmenu);
}
 
void Menu_Test_ServoNr(void)
{ uint16_t tmp_val;
 
Displ_Title(MSG_SERVO);
tmp_val = servo_nr;
if (Change_Value(&tmp_val, 0, 1, 4, Displ_ServoNr)) { // pmenu global; es gibt nur 0=Servo1, 1=Servo2
servo_nr = tmp_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;
uint16_t tmp_val;
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);
tmp_val = steps_pw[sIdxSteps].mid;
Change_Value(&tmp_val, steps_pw[sIdxSteps].min, steps_pw[sIdxSteps].max, 4|(1<<V_REPEAT), Displ_PulseWidth); // 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[SCROLL_MAX_7] = {SCROLL_MAX_7 - 2, MSG_RETURN, MSG_START, MSG_SINGLE_STEP, MSG_REPEAT, MSG_PAUSE, MSG_PAUSE_STEP};
 
Scroll_Menu(scr_sub_menu, m_pkt); // pmenu global
Jump_Menu(pmenu);
}
 
void Menu_Test_SingleStep(void)
{uint16_t tmp_val;
 
Displ_Title(MSG_SINGLE_STEP);
tmp_val = single_step;
if (Change_Value(&tmp_val, SINGLE_STEP_MIN, SINGLE_STEP_MAX, 5|(1<<V_REPEAT), Displ_Off_Format_Int)) { // pmenu global
single_step = tmp_val;
eeprom_write_byte(&ep_single_step, single_step);
Double_Beep(DBEEPWR, DBEEPWRP);
}
Jump_Menu(pmenu);
}
 
void Menu_Test_Repeat(void)
{uint16_t tmp_val;
 
Displ_Title(MSG_REPEAT);
tmp_val = repeat;
if (Change_Value(&tmp_val, REPEAT_MIN, REPEAT_MAX, 5|(1<<V_REPEAT), Displ_Format_Int)) { // pmenu global
repeat = tmp_val;
eeprom_write_byte(&ep_repeat, repeat);
Double_Beep(DBEEPWR, DBEEPWRP);
}
Jump_Menu(pmenu);
}
 
void Menu_Test_Pause(void)
{uint16_t tmp_val;
 
Displ_Title(MSG_PAUSE);
tmp_val = pause;
if (Change_Value(&tmp_val, PAUSE_MIN, PAUSE_MAX, 5|(1<<V_REPEAT), Displ_Pause)) { // pmenu global
pause = tmp_val;
eeprom_write_byte(&ep_pause, pause);
Double_Beep(DBEEPWR, DBEEPWRP);
}
Jump_Menu(pmenu);
}
 
void Menu_Test_Pause_Step(void)
{uint16_t tmp_val;
 
Displ_Title(MSG_PAUSE_STEP);
tmp_val = pause_step;
if (Change_Value(&tmp_val, PAUSE_STEP_MIN, PAUSE_STEP_MAX, 5|(1<<V_REPEAT), Displ_Pause_Step)) { // pmenu global
pause_step = tmp_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);
}
 
void Displ_LoopCounter(uint8_t val)
{
lcdGotoXY(2,2);
lcdPuts(Msg(MSG_COUNTER));
lcdPuts(my_itoa(val, 4, 0, 0));
}
 
// 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);
Displ_LoopCounter(repeat);
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 ) && !Long_Enter() && (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
Displ_LoopCounter(rep);
}
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)
}
}
 
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[SCROLL_MAX_4] = {SCROLL_MAX_4 - 2, MSG_RETURN, MSG_CONTRAST, MSG_BACKGR_LIGHT};
 
Scroll_Menu(scr_sub_menu, m_pkt); // pmenu global
Jump_Menu(pmenu);
}
 
void Menu_lcd_Contrast(void)
{ uint16_t tmp_val;
 
Displ_Title(MSG_LCD);
lcdGotoXY(2, ZLE_VAL);
lcdPuts(Msg(MSG_CONTRAST));
lcdPuts(": ");
tmp_val = contrast;
if (Change_Value(&tmp_val, CONTRAST_MIN, CONTRAST_MAX, 11, Displ_Set_Contrast)) { // pmenu global
contrast = tmp_val;
eeprom_write_byte(&ep_contrast, contrast);
Double_Beep(DBEEPWR, DBEEPWRP);
}
Jump_Menu(pmenu);
}
 
void Menu_lcd_Backgr_Light(void)
{ uint16_t tmp_val;
 
Displ_Title(MSG_BACKGR_LIGHT);
lcdGotoXY(0, ZLE_VAL);
lcdPuts(Msg(MSG_LIGHT));
tmp_val = light_time;
if (Change_Value(&tmp_val, BACKGR_LIGHT_MIN, BACKGR_LIGHT_MAX, 6|(1<<V_REPEAT), Displ_Backgr_Light)) { // pmenu global
light_time = tmp_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[SCROLL_MAX_5] = {SCROLL_MAX_5 - 2, MSG_RETURN, MSG_U_SETUP, MSG_U_OFFSET, MSG_MK_BATTERY};
 
Scroll_Menu(scr_sub_menu, m_pkt); // pmenu global
Jump_Menu(pmenu);
}
 
/*****************/
/* NG-Video Akku */
/*****************/
void Menu_Low_U_Setup(void)
{ uint16_t tmp_val;
 
Displ_Title(MSG_U_MIN);
tmp_val = u_min;
if (Change_Value(&tmp_val, U_MIN_MIN, U_MIN_MAX, 4|(1<<V_REPEAT), Displ_U_2Nk)) { // pmenu global
u_min = tmp_val;
eeprom_write_word(&ep_u_min, u_min);
hyst_u_min = u_min;
Double_Beep(DBEEPWR, DBEEPWRP);
}
Jump_Menu(pmenu);
}
 
void Menu_U_Offset(void)
{ uint16_t tmp_val;
 
Displ_Title(MSG_U_OFFSET);
tmp_val = u_offset;
if (Change_Value(&tmp_val, U_OFFSET_MIN, U_OFFSET_MAX, 4|(1<<V_REPEAT), Displ_U_2Nk)) { // pmenu global
u_offset = tmp_val;
eeprom_write_byte(&ep_u_offset, u_offset);
Double_Beep(DBEEPWR, DBEEPWRP);
}
Jump_Menu(pmenu);
}
 
/******************/
/* MK-Akku(s) */
/******************/
void Menu_MK_Battery(void)
{ uint8_t scr_sub_menu[SCROLL_MAX_7] = {SCROLL_MAX_7 - 2, 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, m_pkt); // pmenu global
Jump_Menu(pmenu);
}
 
// für Nutzung verschiedener Akku's unterschiedlicher Kapazität
// könnte auch für Statistik Ladezyklen erweitert werden aber sinnlos bei Verwendung gleicher Akku's in anderen Modellen
void Menu_MK_BatteryChangeNr(void)
{ uint16_t tmp_val;
 
Displ_Title(MSG_MK_BAT_NR);
tmp_val = mk_akku_nr+1;
if (Change_Value(&tmp_val, AKKU_NR_MIN+1, AKKU_NR_MAX+1, 5|(1<<V_REPEAT), Displ_Format_Int)) { // pmenu global
mk_akku_nr = --tmp_val;
eeprom_write_byte(&ep_mk_akku_nr, mk_akku_nr);
eeprom_read_block(&mk_lipo,&ep_mk_lipo[mk_akku_nr],sizeof(mk_lipo_t));
mk_dUsedCapacity = mk_lipo.UsedCapacity;
Double_Beep(DBEEPWR, DBEEPWRP);
}
}
 
void Menu_MK_BatteryNr(void)
{
Menu_MK_BatteryChangeNr();
Jump_Menu(pmenu);
}
 
void Menu_MK_BatteryCapacity(void)
{ uint16_t tmp_val;
 
Displ_Title(MSG_MK_BAT_CAPACITY);
tmp_val = mk_lipo.Capacity/50;
if (Change_Value(&tmp_val, AKKU_CAPACITY_MIN/50, AKKU_CAPACITY_MAX/50, 5|(1<<V_REPEAT), Displ_MK_Capacity)) { // pmenu global
mk_lipo.Capacity = tmp_val * 50;
eeprom_write_block(&mk_lipo,&ep_mk_lipo[mk_akku_nr],sizeof(mk_lipo_t));
Double_Beep(DBEEPWR, DBEEPWRP);
}
Jump_Menu(pmenu);
}
 
void Menu_MK_I_Offset(void)
{ uint16_t tmp_val;
 
Displ_Title(MSG_MK_I_OFFSET);
tmp_val = mk_i_offset;
if (Change_Value(&tmp_val, MK_I_OFFSET_MIN, MK_I_OFFSET_MAX, 5|(1<<V_REPEAT), Displ_I_Offset)) { // pmenu global
mk_i_offset = tmp_val;
eeprom_write_byte(&ep_mk_i_offset, mk_i_offset);
Double_Beep(DBEEPWR, DBEEPWRP);
}
Jump_Menu(pmenu);
}
 
void Menu_MK_I_Faktor(void)
{ uint16_t tmp_val;
 
Displ_Title(MSG_MK_I_FAKTOR);
tmp_val = mk_i_faktor;
if (Change_Value(&tmp_val, MK_I_FAKTOR_MIN, MK_I_FAKTOR_MAX, 6|(1<<V_REPEAT), Displ_Faktor_2Nk)) { // pmenu global
mk_i_faktor = tmp_val;
eeprom_write_byte(&ep_mk_i_faktor, mk_i_faktor);
Double_Beep(DBEEPWR, DBEEPWRP);
}
Jump_Menu(pmenu);
}
 
void Menu_MK_W_Faktor(void)
{ uint16_t tmp_val;
 
Displ_Title(MSG_MK_W_FAKTOR);
tmp_val = mk_w_faktor;
if (Change_Value(&tmp_val, MK_W_FAKTOR_MIN, MK_W_FAKTOR_MAX, 6|(1<<V_REPEAT), Displ_Faktor_2Nk)) { // pmenu global
mk_w_faktor = tmp_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)
{ uint16_t tmp_val;
 
Displ_Title(MSG_TRACKING);
tmp_val = tracking;
if (Change_Value(&tmp_val, TRACKING_MIN, TRACKING_MAX, 3, Displ_sel_Tracking)) { // pmenu global
cli();
tracking = tmp_val;
sei();
eeprom_write_byte(&ep_tracking, tracking);
Double_Beep(DBEEPWR, DBEEPWRP);
USART_RX_Mode(tracking); // Unterschied Datenempfang GPS/MKCockpit/NMEA
coldstart = 1;
rxcount0 = 0;
rxcount1 = 0;
servoSetDefaultPos(); // Ausgangsstellung beider Servos
if (tracking > TRACKING_MIN)
servoInit(SERVO_PERIODE);
NoTracking_ServosOff();
USART_Init_Baudrate();
}
Jump_Menu(pmenu);
}
 
/**************************/
/* Optionen */
/* Antennennachführung */
/* */
/**************************/
void Menu_Tracking_HYST(void)
{ uint16_t tmp_val;
 
Displ_Title(MSG_HYSTERESE);
tmp_val = track_hyst;
if (Change_Value(&tmp_val, TRACKING_HYST_MIN, TRACKING_HYST_MAX, 7|(1<<V_REPEAT), Displ_Format_Int)) { // pmenu gloabal
track_hyst = tmp_val;
eeprom_write_byte(&ep_track_hyst, track_hyst);
Double_Beep(DBEEPWR, DBEEPWRP);
}
Jump_Menu(pmenu);
}
 
void Menu_Tracking_TXOSD(void)
{ uint16_t tmp_val;
 
Displ_Title(MSG_TRACK_TX_OSD_DATA);
tmp_val = track_tx;
if (Change_Value(&tmp_val, 0, 1, 3, Displ_track_TX)) { // pmenu global; Senden gibt es nur 0=off, 1=on
track_tx = tmp_val;
eeprom_write_byte(&ep_track_tx, track_tx);
Double_Beep(DBEEPWR, DBEEPWRP);
}
Jump_Menu(pmenu);
}
 
void Menu_Baudrate(void)
{ uint16_t tmp_val;
 
Displ_Title(MSG_BAUDRATE);
tmp_val = baudrate;
if (Change_Value(&tmp_val, BAUDRATE_MIN, BAUDRATE_MAX, 3, Displ_Baudrate)) { // pmenu global
baudrate = tmp_val;
eeprom_write_byte(&ep_baudrate, baudrate);
Double_Beep(DBEEPWR, DBEEPWRP);
USART_Init(getBaud(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:
case TRACKING_NMEA: Menu_Baudrate();
break;
}
}
 
/**************************/
/* */
/* Anzeige GPS */
/* */
/**************************/
void Menu_GPS_Display(void)
{ uint8_t scr_sub_menu[SCROLL_MAX_7] = {SCROLL_MAX_7 - 2, MSG_RETURN, MSG_GPS_CALCULATE, MSG_GPS_CURRENT, MSG_GPS_HOME, \
MSG_GPS_MISC, MSG_RX_TIME};
 
if (tracking == TRACKING_NMEA) { // Manipulierung der Menüanzeige/-ausführung
scr_sub_menu[0] = SCROLL_MAX_7 - 3;
scr_sub_menu[5] = MSG_RX_TIME;
}
else
if (tracking != TRACKING_GPS) scr_sub_menu[0] = SCROLL_MAX_7 - 4; // Only show MISC in GPS mode, not NMEA
Scroll_Menu(scr_sub_menu, 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
if ((tracking == TRACKING_NMEA) && (gps_display == GPS_MISC))
pmenu[slen] = RXTimeChr[0]; // Manipulierung der Menüausführung
else {
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();
// bei Menüpunktmanipulatin TRACKING_NMEA und vorgezogen Menu_GPS_Displ_RX_Time ist Rücksprung real GPS_MISC
m_pkt = ((tracking == TRACKING_NMEA) && (gps_display == GPS_MISC))? GPS_MISC: GPS_RX_COUNT;
gps_display = GPS_RX_COUNT;
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.31/menue.h
0,0 → 1,103
 
/****************************************************************/
/* */
/* 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 13 // index array Scroll_Menu scr_main_menu[] = {....}
#define SCROLL_MAX_4 4 // später SCROLL_MAX_N - 2, da array[0] Scrollwert und
#define SCROLL_MAX_5 5 // for-Schleifen mit Zählen 0 beginnen
#define SCROLL_MAX_6 6
#define SCROLL_MAX_7 7
 
#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 POSXMASK 0b00001111 // separiert pos_x für lcdGotoXY()
#define CYCLE 6 // Bit bei Erreichen Endwert wird Anfangswert dargestellt ("kreisförmige Auswahl")
#define V_REPEAT 7 // Bit sich ändernte repeat Geschwindigkeit
#define CHRLS 0 // Flag überladener Zeichensatz lcdSpecialChrLs
#define CHRRS 1 // Flag überladener Zeichensatz lcdSpecialChrRs
 
#define RXTimeChr "5"
#define RXTimeStr "0;"RXTimeChr
 
typedef void (*Displ_Fnct_t)( uint16_t );
 
extern char pmenu[6]; // Zuordnung Menü Programmgliederung zu hinterlegten Funktionen
extern uint8_t m_pkt;
extern uint8_t exit_while;
 
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);
 
void Displ_Version(void);
void Displ_Main_Disp(void);
void Displ_AV_Mark(uint8_t p, char marker);
void Displ_RX_Time(void);
void Displ_Channels(uint16_t k);
void Menu_MK_BatteryChangeNr(void);
 
#endif /* _MENUE_H */
/NGVideo5_8/tags/V1.31/messages.c
0,0 → 1,528
 
/****************************************************************/
/* */
/* 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"
 
#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_COUNTER, GERMAN_COUNTER)
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_NMEA, GERMAN_TRACK_NMEA)
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_COUNTER, ENGLISH_COUNTER)
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_NMEA, ENGLISH_TRACK_NMEA)
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_COUNTER, FRENCH_COUNTER)
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_NMEA, FRENCH_TRACK_NMEA)
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)
 
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_COUNTER),
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_NMEA),
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_COUNTER),
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_NMEA),
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_COUNTER),
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_NMEA),
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.31/messages.h
0,0 → 1,387
 
/****************************************************************/
/* */
/* 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_COUNTER "Z""\x84""hler:"
#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_NMEA "NMEA GPS"
#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_COUNTER "Counter:"
#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_NMEA "NMEA GPS"
#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_COUNTER "Compter:"
#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_NMEA "NMEA GPS"
#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_COUNTER 52
#define MSG_START 53
#define MSG_OFF 54
#define MSG_ON 55
#define MSG_TRACKING 56
#define MSG_TRACK_GPS 57
#define MSG_TRACK_NMEA 58
#define MSG_TRACK_TX_OSD_DATA 59
#define MSG_HYSTERESE 60
#define MSG_TRACK_TX_ON 61
#define MSG_GPS_DISPLAY 62
#define MSG_GPS_CALCULATE 63
#define MSG_GPS_CURRENT 64
#define MSG_GPS_HOME 65
#define MSG_GPS_MISC 66
#define MSG_GPS_NO_DATA 67
#define MSG_RX_TIME 68
#define MSG_COM 69
#define MSG_KOMMA 70
#define MSG_UHW33V 71
#define LAST_NAT_MESSAGE 71
 
/* 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
 
typedef uint16_t MessageType;
char* Msg(MessageType Message);
 
#endif /* _MESSAGES_H_ */
/NGVideo5_8/tags/V1.31/mk.h
0,0 → 1,59
#ifndef _MK_H_
#define _MK_H_
 
// 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;
 
 
#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
 
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 Rick 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;
 
#endif
/NGVideo5_8/tags/V1.31/ngvideo.avrgccproj
0,0 → 1,162
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<SchemaVersion>2.0</SchemaVersion>
<ProjectVersion>5.0</ProjectVersion>
<ProjectGuid>c0066cc9-6e35-4d76-9ffe-a4af66a2de41</ProjectGuid>
<avrdevice>ATmega644A</avrdevice>
<avrdeviceseries>none</avrdeviceseries>
<OutputType>Executable</OutputType>
<Language>C</Language>
<OutputFile>ngvideo.elf</OutputFile>
<OutputDirectory>$(MSBuildProjectDirectory)\$(Configuration)</OutputDirectory>
<UseGlobalToolchain>False</UseGlobalToolchain>
<ToolchainDirPath>C:\Program Files (x86)\Atmel\AVR Studio 5.0\AVR Toolchain\bin</ToolchainDirPath>
<MakeDirPath>C:\Program Files (x86)\Atmel\AVR Studio 5.0\AVR Toolchain\bin</MakeDirPath>
<GlobalToolchainPath>C:\Program Files (x86)\Atmel\AVR Studio 5.0\AVR ToolChain\bin</GlobalToolchainPath>
<AvrGccProjectExtensions>
</AvrGccProjectExtensions>
<avrtool>com.atmel.avrdbg.tool.simulator</avrtool>
<preserveEEPROM>True</preserveEEPROM>
<avrtoolinterface>JTAG</avrtoolinterface>
<com_atmel_avrdbg_tool_avrdragon>
<ToolType>com.atmel.avrdbg.tool.avrdragon</ToolType>
<ToolName>AVR Dragon</ToolName>
<ToolNumber>00A200005843</ToolNumber>
<Channel>
<host>127.0.0.1</host>
<port>9042</port>
<ssl>False</ssl>
</Channel>
<ToolOptions>
<InterfaceName>JTAG</InterfaceName>
<InterfaceProperties>
<JtagDbgClock>200000</JtagDbgClock>
<JtagProgClock>1000000</JtagProgClock>
<IspClock>150000</IspClock>
<JtagInChain>false</JtagInChain>
<JtagEnableExtResetOnStartSession>false</JtagEnableExtResetOnStartSession>
<JtagDevicesBefore>0</JtagDevicesBefore>
<JtagDevicesAfter>0</JtagDevicesAfter>
<JtagInstrBitsBefore>0</JtagInstrBitsBefore>
<JtagInstrBitsAfter>0</JtagInstrBitsAfter>
</InterfaceProperties>
</ToolOptions>
</com_atmel_avrdbg_tool_avrdragon>
<com_atmel_avrdbg_tool_simulator>
<ToolType xmlns="">com.atmel.avrdbg.tool.simulator</ToolType>
<ToolName xmlns="">AVR Simulator</ToolName>
<ToolNumber xmlns="">
</ToolNumber>
<Channel xmlns="">
<host>127.0.0.1</host>
<port>1486</port>
<ssl>False</ssl>
</Channel>
</com_atmel_avrdbg_tool_simulator>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'default' ">
<OutputPath>bin\default\</OutputPath>
<MemorySettings>
<MemorySegments>
<InitialStack IsEnabled="0">
<Address>0x1000</Address>
</InitialStack>
</MemorySegments>
</MemorySettings>
<ToolchainSettings>
<AvrGcc>
<avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>True</avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>
<avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>True</avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>
<avrgcc.compiler.optimization.level>Optimize for size (-Os)</avrgcc.compiler.optimization.level>
<avrgcc.compiler.optimization.PackStructureMembers>True</avrgcc.compiler.optimization.PackStructureMembers>
<avrgcc.compiler.optimization.AllocateBytesNeededForEnum>True</avrgcc.compiler.optimization.AllocateBytesNeededForEnum>
<avrgcc.compiler.warnings.AllWarnings>True</avrgcc.compiler.warnings.AllWarnings>
<avrgcc.compiler.miscellaneous.OtherFlags>-gdwarf-2 -std=gnu99 </avrgcc.compiler.miscellaneous.OtherFlags>
<avrgcc.assembler.general.AssemblerFlags>-Wall -gdwarf-2 -std=gnu99 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums</avrgcc.assembler.general.AssemblerFlags>
<avrgcc.assembler.debugging.DebugLevel>Default (-Wa,-g2)</avrgcc.assembler.debugging.DebugLevel>
</AvrGcc>
</ToolchainSettings>
<UsesExternalMakeFile>True</UsesExternalMakeFile>
<ExternalMakeFilePath>D:\Daten\Entwicklung\FW NGVideo-5.8GHz\tags\ngvideo\makefile</ExternalMakeFilePath>
<GenerateHexFile>True</GenerateHexFile>
<OutputDirectory>D:\Daten\Entwicklung\FW NGVideo-5.8GHz\tags\ngvideo</OutputDirectory>
</PropertyGroup>
<Import Project="$(AVRSTUDIO_EXE_PATH)\\Vs\\AvrGCC.targets" />
<ItemGroup>
<Compile Include="config.h">
<SubType>compile</SubType>
</Compile>
<Compile Include="dogm.c">
<SubType>compile</SubType>
</Compile>
<Compile Include="dogm.h">
<SubType>compile</SubType>
</Compile>
<Compile Include="keys.c">
<SubType>compile</SubType>
</Compile>
<Compile Include="keys.h">
<SubType>compile</SubType>
</Compile>
<Compile Include="lipo.c">
<SubType>compile</SubType>
</Compile>
<Compile Include="lipo.h">
<SubType>compile</SubType>
</Compile>
<Compile Include="main.c">
<SubType>compile</SubType>
</Compile>
<Compile Include="menue.c">
<SubType>compile</SubType>
</Compile>
<Compile Include="menue.h">
<SubType>compile</SubType>
</Compile>
<Compile Include="messages.c">
<SubType>compile</SubType>
</Compile>
<Compile Include="messages.h">
<SubType>compile</SubType>
</Compile>
<Compile Include="mk.h">
<SubType>compile</SubType>
</Compile>
<Compile Include="ngvideo.c">
<SubType>compile</SubType>
</Compile>
<Compile Include="ngvideo.h">
<SubType>compile</SubType>
</Compile>
<Compile Include="servo.c">
<SubType>compile</SubType>
</Compile>
<Compile Include="servo.h">
<SubType>compile</SubType>
</Compile>
<Compile Include="tools.c">
<SubType>compile</SubType>
</Compile>
<Compile Include="tools.h">
<SubType>compile</SubType>
</Compile>
<Compile Include="tracking.c">
<SubType>compile</SubType>
</Compile>
<Compile Include="tracking.h">
<SubType>compile</SubType>
</Compile>
<Compile Include="usart.c">
<SubType>compile</SubType>
</Compile>
<Compile Include="usart.h">
<SubType>compile</SubType>
</Compile>
</ItemGroup>
<ItemGroup>
<None Include="makefile">
<SubType>compile</SubType>
</None>
</ItemGroup>
</Project>
/NGVideo5_8/tags/V1.31/ngvideo.avrsln
0,0 → 1,17

Microsoft Visual Studio Solution File, Format Version 11.00
# AvrStudio Solution File, Format Version 11.00
Project("{D1100916-62DA-4D80-A9B4-55A1E7CCEEB3}") = "ngvideo", "ngvideo.avrgccproj", "{C0066CC9-6E35-4D76-9FFE-A4AF66A2DE41}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
default|AVR = default|AVR
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{C0066CC9-6E35-4D76-9FFE-A4AF66A2DE41}.default|AVR.ActiveCfg = default|AVR
{C0066CC9-6E35-4D76-9FFE-A4AF66A2DE41}.default|AVR.Build.0 = default|AVR
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal
/NGVideo5_8/tags/V1.31/ngvideo.avrsuo
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/NGVideo5_8/tags/V1.31/ngvideo.aws
0,0 → 1,0
<AVRWorkspace><IOSettings><CurrentRegisters/></IOSettings><part name="ATMEGA644"/><Files><File00000 Name="C:\Source\atmel4\ngvideo\tracking.c" Position="354 210 1296 580" LineCol="157 0" State="Maximized"/><File00001 Name="C:\Source\atmel4\ngvideo\usart.c" Position="262 99 1370 654" LineCol="238 0" State="Maximized"/><File00002 Name="C:\Source\atmel4\ngvideo\usart.h" Position="288 144 1212 496" LineCol="41 4" State="Maximized"/></Files></AVRWorkspace>
/NGVideo5_8/tags/V1.31/ngvideo.c
0,0 → 1,833
/****************************************************************/
/* */
/* 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 <string.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 "tools.h"
#include "keys.h"
#include "usart.h"
#include "tracking.h"
 
// LCD selbst definierte Sonderzeichen, RSSI-Balken und wi232 Empfang Daten im Flash
// deshalb in dogm.c lcdPutc(pgm_read_byte(&lcdChr[i]));
SpecialChr_t lcdSpecialChr[7] 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
 
SpecialChr_t lcdSpecialChrLs[8] 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}};
 
SpecialChr_t lcdSpecialChrRs[5] 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}};
 
/**************************************************************/
/* */
/* EEPROM */
/* */
/**************************************************************/
uint8_t ep_eep_init EEPROM;
char ep_version[sizeof(VERSION)] EEPROM;
uint8_t ep_dogm_vers EEPROM;
uint8_t ep_contrast EEPROM;
uint8_t ep_light_time EEPROM;
uint8_t ep_u_offset EEPROM;
uint16_t ep_u_min EEPROM;
uint8_t ep_channel EEPROM;
uint8_t ep_av_source EEPROM;
uint8_t ep_language EEPROM;
udbm_t ep_udbm[CHANNEL_MAX] EEPROM;
uint8_t ep_sIdxSteps EEPROM;
servo_t ep_servo[SERVO_NUM_CHANNELS] EEPROM;
uint8_t ep_servo_frame EEPROM;
uint8_t ep_servo_nr EEPROM;
uint8_t ep_single_step EEPROM;
uint8_t ep_repeat EEPROM;
uint8_t ep_pause EEPROM;
uint8_t ep_pause_step EEPROM;
uint8_t ep_tracking EEPROM;
uint8_t ep_track_hyst EEPROM;
uint8_t ep_track_tx EEPROM;
uint8_t ep_baudrate EEPROM;
mk_current_t ep_mk_current EEPROM;
uint8_t ep_mk_akku_nr EEPROM;
mk_lipo_t ep_mk_lipo[AKKU_NR_MAX+1] EEPROM;
uint8_t ep_mk_i_offset EEPROM;
uint8_t ep_mk_i_faktor EEPROM;
uint8_t ep_mk_w_faktor EEPROM;
 
/**************************************************************/
// Working variables of EEPROM contents
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;
uint16_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};
uint16_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 baudrate = BAUDRATE;
 
/**************************************************************/
uint8_t coldstart; // Flag erstmaliger MK-Start(Motore) nur nach GPS-Fix
uint8_t ch_stored; // Flag zur Speicherung, wenn Wert im Hauptdisplay geändert
 
uint8_t gps_display = 0;
uint8_t gps_disp_clear;
 
uint16_t bar_udbm[12]; // RSSI-Bargraph
uint8_t wudbm; // Differenz/Abstand benachbarter udbm[i] für differenzierteren Bargraphen
uint8_t bat_low = 0;
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
 
const uint16_t PROGMEM baud[8] = {4800, 7200, 9600, 14400, 19200, 38400, 57600};
 
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;
 
 
/************************************************************************************/
/* 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_word(&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(&mk_current,&ep_mk_current,sizeof(mk_current_t));
eeprom_write_byte(&ep_mk_akku_nr, AKKU_NR_MIN);
for (uint8_t i = 0; i <= AKKU_NR_MAX; i++)
eeprom_write_block(&mk_lipo,&ep_mk_lipo[i],sizeof(mk_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_word(&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(&mk_current,&ep_mk_current,sizeof(mk_current_t));
mk_akku_nr = eeprom_read_byte(&ep_mk_akku_nr);
eeprom_read_block(&mk_lipo,&ep_mk_lipo[mk_akku_nr],sizeof(mk_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);
mk_dUsedCapacity = mk_lipo.UsedCapacity;
}
 
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 || tracking == TRACKING_NMEA)
USART_Init(getBaud(baudrate));
else
USART_Init(57600);
}
 
/************************************************************************************/
/* 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(bar_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_count < light_time)) {
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 */
/* */
/* Bei AVR-Studio 5 ist in delay.h */
/* #define __DELAY_BACKWARD_COMPATIBLE__ */
/* zu setzen */
/* */
/**************************************************************/
 
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 */
/* */
/**************************************************************/
 
// uint16_t u, da bei Displ_Fnct[fu_index](val) der größte Wert UBat gleich 16 Bit
void Displ_1Nk(uint16_t u)
{
// 4 => 2 Ziffern vor Komma + 1 Komma + eine Ziffer Nachkomma darstellen, 2 Festkomma
lcdPuts(my_itoa(u,4,2,1));
}
 
void Displ_U_2Nk(uint16_t u)
{
lcdPuts(my_itoa(u,5,2,2));
lcdPutc('V');
}
 
// uint8_t beep_timer :Akku-leer-Beeper nur mit Task_0_1()-Intervalle bei Menü-Rücksprung
uint16_t U_Messen_cmp(uint8_t beep_timer)
{ uint16_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) { // 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 = 1;
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 = 0; // 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
{ uint16_t ubat;
ubat = U_Messen_cmp(ENABLE_BTIMER);
if (!bat_low) { // 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();
lcdPutStrMid(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';
lcdPutStrMid(str,1);
zle = 2;
}
lcdPutStrMid(Msg(MSG_RUNNING),zle);
}
 
void Displ_Error_TX(uint8_t message)
{
lcdClear();
lcdPutStrMid(Msg(MSG_ERROR), 0);
lcdPutStrMid(Msg(MSG_TX_NOT), 1);
lcdPutStrMid(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
div_flag = vsync0 == 0? AV1: 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) && (mk_lipo.time_on < T2PROD_M59S59)) ++mk_lipo.time_on; // T2PRODM59S59 = 3599 * 4000
if (((tracking == TRACKING_GPS) && (MK_Motor_run)) || ((tracking == TRACKING_NMEA) && !coldstart)) { // 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;
if ((mux_X) && (vscount1 == 255)) {
SetMux0();
vsync1 = 1;
}
}
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;
if (!(mux_X) && (vscount0 == 255)) {
SetMux1();
vsync0 = 1;
}
}
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, bar_udbm, !bat_low);
}
}
 
void Task_0_3(void)
{
if (task_timer0_3) {
cli();
task_timer0_3 = 0;
sei();
sw_avx = RSSI_Diversity(av_source, bar_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();
else if (tracking == TRACKING_NMEA)
Tracking_NMEA();
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_invisible(void) // wird in main.c und menue.c aufgerufen
{
Task_0_3();
Task_0_4();
Task_0_5();
if (tracking == TRACKING_RSSI) Tracking_RSSI();
}
/NGVideo5_8/tags/V1.31/ngvideo.h
0,0 → 1,208
 
/****************************************************************/
/* */
/* 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 NGVIDEO_H_
#define NGVIDEO_H_
 
#include "config.h"
#include "messages.h"
#include "servo.h"
#include "dogm.h"
#include "menue.h"
#include "lipo.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 nach Enter kurz Scroll_Menu() und Select_Menu()
#define DBEEPWR 4 // Beep on nach geänderten Werte ROM schreiben
#define DBEEPWRP 30 // Beep Pause nach geänderten 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 DBEEPNMEAFIX 120 // Beep on nach NMEA SAT-FIX
#define DBEEPMEAFIXP 240 // Beep Pause nach NMEA SAT-FIX
 
#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 getBaud(x) (uint16_t)pgm_read_dword(&baud[x])
extern const uint16_t PROGMEM baud[8];
 
#define POLOLU_CMD 2
 
#define OFF 0
#define ON 1
 
#define EEPROM __attribute__ ((section(".eeprom")))
 
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;
 
/**************************************************************/
/* */
/* EEPROM */
/* */
/**************************************************************/
extern uint8_t ep_eep_init EEPROM;
extern char ep_version[sizeof(VERSION)] EEPROM;
extern uint8_t ep_dogm_vers EEPROM;
extern uint8_t ep_contrast EEPROM;
extern uint8_t ep_light_time EEPROM;
extern uint8_t ep_u_offset EEPROM;
extern uint16_t ep_u_min EEPROM;
extern uint8_t ep_channel EEPROM;
extern uint8_t ep_av_source EEPROM;
extern uint8_t ep_language EEPROM;
extern udbm_t ep_udbm[CHANNEL_MAX] EEPROM;
extern uint8_t ep_sIdxSteps EEPROM;
extern servo_t ep_servo[SERVO_NUM_CHANNELS] EEPROM;
extern uint8_t ep_servo_frame EEPROM;
extern uint8_t ep_servo_nr EEPROM;
extern uint8_t ep_single_step EEPROM;
extern uint8_t ep_repeat EEPROM;
extern uint8_t ep_pause EEPROM;
extern uint8_t ep_pause_step EEPROM;
extern uint8_t ep_tracking EEPROM;
extern uint8_t ep_track_hyst EEPROM;
extern uint8_t ep_track_tx EEPROM;
extern uint8_t ep_baudrate EEPROM;
extern mk_current_t ep_mk_current EEPROM;
extern uint8_t ep_mk_akku_nr EEPROM;
extern mk_lipo_t ep_mk_lipo[AKKU_NR_MAX+1] EEPROM;
extern uint8_t ep_mk_i_offset EEPROM;
extern uint8_t ep_mk_i_faktor EEPROM;
extern uint8_t ep_mk_w_faktor EEPROM;
 
/**************************************************************/
// Working variables of EEPROM contents
extern uint8_t eep_init;
extern char version[sizeof(VERSION)];
extern uint8_t dogm_vers;
extern uint8_t contrast;
extern uint8_t light_time;
extern uint8_t u_offset;
extern uint16_t u_min;
extern uint8_t channel;
extern uint8_t av_source;
extern uint8_t language;
extern udbm_t udbm;
extern uint8_t sIdxSteps;
extern servo_t servo[SERVO_NUM_CHANNELS];
extern uint8_t servo_frame;
extern uint8_t servo_nr;
extern uint8_t single_step;
extern uint8_t repeat;
extern uint8_t pause;
extern uint8_t pause_step;
extern uint8_t tracking;
extern uint8_t track_hyst;
extern uint8_t track_tx;
extern uint8_t baudrate;
extern uint8_t ch_stored; // Flag zur Speicherung, wenn Wert im Hauptdisplay geändert
 
/**************************************************************/
extern uint8_t coldstart; // Flag erstmaliger MK-Start(Motore) nur nach GPS-Fix
extern uint8_t bat_low;
extern uint16_t hyst_u_min;
extern uint8_t gps_display;
extern uint8_t gps_disp_clear;
extern uint8_t sw_avx;
extern uint16_t bar_udbm[12];
 
extern uint8_t MK_Motor_run; // Flag für RX Time-Counter Start/Stop
extern uint8_t mk_timer; // Zeitzähler lipo.time_on auf aus
 
extern volatile uint32_t rxcount0;
extern volatile uint32_t rxcount1;
 
extern SpecialChr_t lcdSpecialChr[7];
extern SpecialChr_t lcdSpecialChrLs[8];
extern SpecialChr_t lcdSpecialChrRs[5];
 
void Init_EEPROM(uint8_t ep_reset);
void servoSetDefaultPos(void);
void Set_DOGM_Version(void);
void Set_Channel(uint8_t channel);
uint8_t Set_AV_Source(uint8_t src);
 
void lcdSet_BackgrLight_Off(void);
void lcd_BackgrLight_On(void);
void lcd_BackgrLight(void);
 
void ADC_Init(void);
uint16_t ADC_Read( uint8_t channel );
 
void Beep(uint8_t time);
void Double_Beep(uint8_t time, uint8_t pause);
 
void Displ_VBat(void);
void Displ_U_2Nk(uint16_t u);
 
uint8_t RSSI_Calc_UdBm(uint16_t *pbar_udbm);
uint8_t RSSI_Min_Calibrate(uint8_t nchannel, uint16_t *pbar_udbm);
void RSSI_Max_Calibrate(uint16_t *pbar_udbm);
 
void USART_Init_Baudrate(void);
void Double_Beep(uint8_t time, uint8_t pause);
uint16_t Change_Value_plmi(uint16_t val, uint16_t min_val, uint16_t max_val, uint8_t posX, uint8_t posY, Displ_Fnct_t Displ_Fnct, uint8_t cycle, uint8_t vrepeat);
uint16_t U_Messen_cmp(uint8_t beep_timer);
 
void Task_0_1(void);
void Task_0_2(void);
void Task_0_3(void);
void Task_0_4(void);
void Task_0_5(void);
void Tasks_invisible(void);
 
#endif /* NGVIDEO_H_ */
/NGVideo5_8/tags/V1.31/servo.c
0,0 → 1,207
 
/********************************************************************/
/* */
/* 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 : 2 */
/* */
/*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];
 
const 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}};
 
// Servo limits (depend on hardware)
const 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}}};
 
// Servopositionen normiert 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}};
 
// anzufahrende Servopositionen 0=MIN, 1=MID, 2=MAX
const uint8_t PosIdx[POSIDX_MAX] = {1, 0, 1, 2 };
 
// 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 (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;
}
 
//! 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);
}
 
// Umrechnung Winkel in Servoschritte
void servoSetAngle(uint8_t servo_nr, int16_t angle)
{
servoSetPosition(servo_nr, (uint16_t)((uint32_t)angle * ServoConst[sIdxSteps].steps / 180));
}
 
//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.31/servo.h
0,0 → 1,129
/*********************************************************************/
/* */
/* 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
 
// Define servo limits (depend on hardware)
typedef struct {
uint16_t min;
uint16_t max;
}servo_limit_t;
 
extern const servo_limit_t servo_limit[2][3];
 
// Define servo positions (depend on hardware)
typedef struct {
uint16_t min;
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
extern const steps_pw_t steps_pw[2];
 
#define RIGHT 0 // Servopostionen, welche vom Einbau abhängig sind
#define LEFT 1
#define MIDDLE 2
 
#define POSIDX_MAX 4
extern const uint8_t PosIdx[POSIDX_MAX]; // anzufahrende Servopositionen 0=MIN, 1=MID, 2=MAX
 
// 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);
 
// set servo to a specific angle
void servoSetAngle(uint8_t servo_nr, int16_t angle);
 
// 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.31/tools.c
0,0 → 1,179
 
/****************************************************************/
/* */
/* 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 <stdlib.h>
#include <util/delay.h>
#include <avr/pgmspace.h>
 
#include "config.h"
#include "dogm.h"
#include "tools.h"
#include "messages.h"
 
#define MAX_POWER 10
#define getPower(x) (int32_t)pgm_read_dword(&powers[x])
const int32_t PROGMEM powers[MAX_POWER] = {1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000};
 
/* Funktion zur Umwandlung einer vorzeichenbehafteten Integer
32-Bit "Festkomma-Zahl"(gedachtes Komma in Integer) in einen String
vereinfacht Variablenübergabe funktion change_value(uint16_t x),
kein printf, double oder float
siehe http://www.mikrocontroller.net/articles/Festkommaarithmetik
len: max 13, Gesamtlänge des Resultats inklusive Vorzeichen und Komma, Rest wird mit ' ' aufgefüllt
fixedPoint: Position des Kommas im Integer-Wert. Bei Wert in mm und Anzeige in m ist das z.B. 3
afterPoint: Ziffern nach dem Komma = wieviele der fixedPoint Ziffern angezeigt werden sollen
 
Ist nicht genug Platz für die Zahl vorhanden werden nur '*' Zeichen ausgegeben!
makefile derzeit somit auch ohne! Minimalistic printf version*/
char *my_itoa(int32_t value, uint8_t len, uint8_t fixedPoint, uint8_t afterPoint)
{ int8_t i;
int8_t digits, digitsNeeded;
uint8_t neg = 0;
static char str[13];
// Terminate string
str[len] = '\0';
 
// Reduce precision of value if we're not supposed to show all of the mantissa
if (fixedPoint > afterPoint) {
value /= getPower(fixedPoint - afterPoint);
fixedPoint = afterPoint;
}
 
// Handle negative values
if (value < 0) {
value = -value;
neg = 1;
}
 
// Check how many digits we've got in total and if it fits in our space
for (digits = 1; digits < MAX_POWER && value >= getPower(digits); digits++);
if (neg) digits++; // We also need space for the sign
if (fixedPoint) digits++; // Plus space for decimal point
digitsNeeded = digits - len;
if (digitsNeeded > 0) {
// Not enough space, do something
if (digitsNeeded == fixedPoint || digitsNeeded == fixedPoint + 1) { // +1 = space for decimal point that we can get rid of
// If space is just big enough for integer part then simply don't show mantissa BUT ROUND CORRECTLY
value = (value + 5 * getPower(fixedPoint - 1)) / getPower(fixedPoint);
fixedPoint = 0;
} else if (digitsNeeded < fixedPoint) {
// We can reduce precision to make it fit (round correctly)
value = (value + 5 * getPower(digitsNeeded - 1)) / getPower(digitsNeeded);
fixedPoint -= digitsNeeded;
} else {
// Error, cannot display value! Let's show stars
for (i = len - 1; i >= 0; --i) str[i] = '*';
return str;
}
}
 
for (i = len - 1; i >= neg; --i) {
if (fixedPoint && i == len - fixedPoint - 1) {
// Insert decimal point at the right location
str[i] = Msg(MSG_KOMMA)[0];
fixedPoint = 0; // Now in integer part
} else {
str[i] = (value % 10) + '0';
value /= 10;
// Break if we're in integer part and there are only zeros from this point on
if (value == 0 && fixedPoint == 0) {
--i;
break;
}
}
}
// Insert sign
if (neg) str[i--] = '-';
// Rest is blank
for (; i >= 0; --i)
str[i] = ' ';
 
return str;
}
 
 
// Trying to avoid floating point maths here. Converts a floating point string to an integer with a smaller unit
// i.e. floatStrToInt("4.5", 2) = 4.5 * 1E2 = 450
int32_t floatStrToInt(const char *s, int32_t power1)
{ char *endPtr;
int32_t v = strtol(s, &endPtr, 10);
 
if (*endPtr == '.') {
for (s = endPtr + 1; *s && power1; s++) {
v = v * 10 + (*s - '0');
--power1;
}
}
if (power1) {
// Table to avoid multiple multiplications
v = v * getPower(power1);
}
return v;
}
 
 
// Delay helper
void delay_ms100x(uint8_t delay)
{
for ( uint8_t i=0; i<delay; i++)
_delay_ms(100);
}
 
 
/************************************************************************************/
/* */
/* Zeitanzeige */
/* */
/************************************************************************************/
 
uint32_t TimeBase60(char *str, uint32_t time, uint8_t idx)
{ uint32_t tmp = time % 60;
 
str[idx] = (tmp / 10) + '0';
str[idx + 1] = (tmp % 10) + '0';
return time / 60;
}
 
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, 4);
str[3] = ':';
TimeBase60(str, time, 1);
lcdPuts(str);
}
 
void Displ_TimeHMS(uint32_t time)
{ char str[9];
 
time /= T2SECDIV; // Zähler aller 500µs
str[8] = '\0';
time = TimeBase60(str, time, 6);
str[5] = ':';
time = TimeBase60(str, time, 3);
str[2] = ':';
TimeBase60(str, time, 0);
lcdPuts(str);
}
/NGVideo5_8/tags/V1.31/tools.h
0,0 → 1,15
#ifndef _TOOLS_H_
#define _TOOLS_H_
 
#include <avr/io.h>
 
//char *my_itoa(int32_t value, uint8_t sign, uint8_t len, uint8_t fixedPoint, uint8_t afterPoint);
char *my_itoa(int32_t value, uint8_t len, uint8_t fixedPoint, uint8_t afterPoint);
int32_t floatStrToInt(const char *s, int32_t power1);
 
void delay_ms100x(uint8_t delay);
 
void Displ_TimeMS(int32_t time);
void Displ_TimeHMS(uint32_t time);
 
#endif
/NGVideo5_8/tags/V1.31/tracking.c
0,0 → 1,406
 
/****************************************************************/
/* */
/* 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 <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <util/delay.h>
 
#include "tracking.h"
#include "ngvideo.h"
#include "servo.h"
#include "tools.h"
#include "usart.h"
#include "config.h"
#include "mk.h"
#include "keys.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
 
HomePos_t MK_pos; // Home position of station
GPS_Pos_t currentPos; // Current position of flying object
int8_t satsInUse; // Number of satelites currently in use
 
uint8_t tracking = TRACKING_MIN;
uint8_t track_hyst = TRACKING_HYSTERESE;
uint8_t track_tx = 0;
 
geo_t geo;
int anglePan, angleTilt;
 
/**************************************************************/
/* */
/* 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 */
/* */
/**************************************************************/
 
// Datenempfang vom MK ==> blinkt Antennensymbol
void Displ_wiRX(void)
{ static uint8_t timer = 0;
static uint8_t picturedSats;
if (!bat_low && (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) {
picturedSats = 0;
lcdPutc(5); // Antennensymbol darstellen
}
else {
if (!picturedSats) { // Änderung Satelittenanzahl innerhalb dieser Periode nicht anzeigen
picturedSats = 1;
// aktuell empfangene Satellitenanzahl, Anzeige einstellig, da kein Platz auf Display
lcdPutc(satsInUse > 9? 'X': satsInUse + '0');
}
}
}
else
lcdPutc(':');
wi232RX = 0;
if (++timer == BLINK_PERIOD) timer = 0;
}
}
 
// Berechnung von Distanz und Winkel 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.0;
lat2 = (double)pos->Latitude / 10000000.0;
 
// 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);
}
 
// 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_GPS(int anglePan, int angleTilt, geo_t *geo)
void Displ_GPS(void)
{ uint16_t dDCurrent = 0;
// int32_t time_remaining = M59S59;
int32_t time_remaining = 0;
 
if (gps_display > GPS_DISP_NONE && (!coldstart || gps_display == GPS_MISC) && !bat_low) {
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, 3, 0, 0), '\xdf'); // '\xdf' entspricht '°'
Displ_Format_Data(8, 0, "Dis:", my_itoa((uint32_t)geo.distance, 3, 0, 0), 'm');
Displ_Format_Data(0, 1, "Bea:", my_itoa((uint32_t)geo.bearing, 3, 0, 0), '\xdf');
Displ_Format_Data(8, 1, "Alt:", my_itoa(currentPos.Altitude - MK_pos.Home_Alt, 3, 3, 1), 'm');
Displ_Format_Data(0, 2, "Pan:", my_itoa(anglePan, 3, 0, 0), '\xdf');
Displ_Format_Data(8, 2, "Til:", my_itoa(angleTilt, 3, 0, 0), '\xdf');
break;
case GPS_DISP_CURRENT:
Displ_Format_Data(0, 0, "aLon:", my_itoa(currentPos.Longitude, 11, 7, 7), '\0');
Displ_Format_Data(0, 1, "aLat:", my_itoa(currentPos.Latitude, 11, 7, 7), '\0');
Displ_Format_Data(0, 2, "aAlt:", my_itoa(currentPos.Altitude, 11, 3, 1), '\0');
break;
case GPS_DISP_HOME:
Displ_Format_Data(0, 0, "hLon:", my_itoa(MK_pos.Home_Lon7, 11, 7, 7), '\0');
Displ_Format_Data(0, 1, "hLat:", my_itoa(MK_pos.Home_Lat7, 11, 7, 7), '\0');
Displ_Format_Data(0, 2, "hAlt:", my_itoa(MK_pos.Home_Alt, 11, 3, 1), '\0');
// >> Menueauswahl nach oben
if (Get_Key_Press( 1<<SW_PLUS ) || Get_Key_Press( 1<<SW_MINUS )) coldstart = 1;
break;
case GPS_MISC:
Displ_Format_Data(0, 0, "U:", my_itoa(mk_UBat, 4, 1, 1), 'V');
Displ_Format_Data(8, 0, "W:", my_itoa(mk_dUsedCapacity, 4, 0, 0), '\0');
Displ_Format_Data(0, 1, "I:", my_itoa(mk_Ikorr, 4, 1, 1), 'A');
if (mk_current.Count > 0) {
dDCurrent = mk_current.Sum / mk_current.Count;
if (dDCurrent > 0) {
time_remaining = ((int32_t)mk_lipo.Capacity - mk_dUsedCapacity) * 36 / dDCurrent;
if (abs(time_remaining) > M59S59)
time_remaining = time_remaining < 0? -M59S59: M59S59; // M59S59 sind 59 Minuten und 59 Sekunden
}
}
Displ_Format_Data(8, 1, "\xee:", my_itoa(dDCurrent, 4, 1, 1), 'A');// Durchschnittszeichen
lcdGotoXY(0,2);
lcdPutc('\x1a'); // Summenzeichen
Displ_TimeMS(mk_lipo.time_on / T2SECDIV);
lcdGotoXY(8,2);
lcdPuts("R");
Displ_TimeMS(time_remaining);
break;
}
}
Displ_wiRX();
}
 
void do_tracking(void)
{ static uint8_t hysteresis = 0;
 
geo = calc_geo(&MK_pos, &currentPos);
angleTilt = RAD_TO_DEG * (double)atan2((double)(currentPos.Altitude - MK_pos.Home_Alt) / 1000, geo.distance);
if (geo.distance < 4 || (geo.distance < 6 && hysteresis)) { // < 4m ==> Pan-Servo in Mittelstellung. Hysterese bis 6m, damit Servo im Grenzbereich nicht wild rumschlägt
geo.bearing = MK_pos.direction;
angleTilt = 0;
hysteresis = 1;
}
else {
hysteresis = 0;
}
 
// egal wo der Übergangspunkt 359, 360, 1grd ist => Winkelübergangspunkt auf 0 bzw. 180grd des Servos bringen
// 360 grd negative Winkelwerte als positive
anglePan = fmod(geo.bearing - MK_pos.direction + 360 + 90, 360);
if (anglePan > 360) anglePan -= 360;
 
if (angleTilt < 0) angleTilt = 0;
if (angleTilt > 180) angleTilt = 180;
 
if (anglePan >= 180) { // zwecks 360grd-Abdeckung flipt Pan-/Tilt-Servo
anglePan = anglePan - 180;
angleTilt = 180 - angleTilt;
}
 
servoSetAngle(0, anglePan);
servoSetAngle(1, angleTilt);
}
 
 
/**************************************************************/
/* */
/* MK GPS Tracking */
/* */
/**************************************************************/
 
// MK OSD-Daten lesen und verifizieren
uint8_t OSD_Data_valid(NaviData_t **navi_data)
{ 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
*navi_data = (NaviData_t*)data_decode; // dekodierte Daten mit Struktur OSD-Daten versehen
if (rx_timeout < RX_TIME_OLD) { // GPS-Daten nicht zu alt und ok.
currentPos = (*navi_data)->CurrentPosition;
if ((*navi_data)->NCFlags & NC_FLAG_GPS_OK)
ret = 1;
// aus MkCockpit http://forum.mikrokopter.de/topic-post216136.html#post216136
// (4 * (........))/5 ==> Wichtung Luftdruck-Höhe zu GPS
currentPos.Altitude = MK_pos.Home_Alt + (4000 * (int32_t)((*navi_data)->Altimeter) / AltFaktor + currentPos.Altitude - MK_pos.Home_Alt) / 5;
MK_Motor_run = (*navi_data)->FCStatusFlags & FC_FLAG_MOTOR_RUN;
MK_ProcessLipo(*navi_data);
satsInUse = (*navi_data)->SatsInUse;
}
}
else
if (rx_timeout == RX_TIME_END) store_LipoData();// ca. 4 Sekunden nach Signalverlust
// 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)
{ NaviData_t *navi_data;
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(&navi_data)) {
if (coldstart) {
// erst nach Neustart NGVideo und beim Motorstart werden Daten vom MK übernommen
if (navi_data->FCStatusFlags & FC_FLAG_MOTOR_START) {
MK_pos.Home_Lon = (double)navi_data->HomePosition.Longitude / 10000000.0;
MK_pos.Home_Lat = (double)navi_data->HomePosition.Latitude / 10000000.0;
MK_pos.Home_Lon7 = navi_data->HomePosition.Longitude;
MK_pos.Home_Lat7 = navi_data->HomePosition.Latitude;
MK_pos.Home_Alt = navi_data->HomePosition.Altitude;
MK_pos.direction = navi_data->CompassHeading;
coldstart = 0;
}
}
else {
do_tracking();
}
}
Displ_GPS(); // letzte empfangene Daten auch bei ausgeschalteten MK sichtbar
track_running = 0;
}
}
 
/**************************************************************/
/* */
/* NMEA GPS Tracking */
/* */
/**************************************************************/
 
void setNMEAdir(void)
{
if (!coldstart)
MK_pos.direction = geo.bearing;
}
 
// NMEA latitudes are in the form ddmm.mmmmm, we want an integer in 1E-7 degree steps
int32_t getLatitude(const char *s, const char *NS)
{ int32_t deg = (s[0] - '0') * 10 + s[1] - '0'; // First 2 chars are full degrees
int32_t min = floatStrToInt(&s[2], 6) / 6; // Minutes * 1E5 * 100 / 60 = Minutes * 1E6 / 6 = 1E-7 degree steps
 
deg = deg * 10000000 + min;
if (*NS == 'S') deg = -deg;
return deg;
}
 
 
// NMEA longitudes are in the form dddmm.mmmmm, we want an integer in 1E-7 degree steps
int32_t getLongitude(const char *s, const char *WE)
{ int32_t deg = ((s[0] - '0') * 10 + s[1] - '0') * 10 + s[2] - '0'; // First 3 chars are full degrees
int32_t min = floatStrToInt(&s[3], 6) / 6; // Minutes * 1E5 * 100 / 60 = Minutes * 1E6 / 6 = 1E-7 degree steps
 
deg = deg * 10000000 + min;
if (*WE == 'W') deg = -deg;
return deg;
}
 
 
void Tracking_NMEA(void)
{ char *token;
int32_t latitude, longitude;
 
if (decodeNMEA()) {
token = strtok((char*)data_decode, ",");
// http://de.wikipedia.org/wiki/NMEA_0183
if (!strcmp(token, "GPGGA")) {
// $GPGGA,220613.400,4843.5080,N,00922.9583,E,1,7,2.23,287.1,M,48.0,M,,
// Skip time
strtok(0, ",");
// Latitude
latitude = getLatitude(strtok(0, ","), strtok(0, ","));
// Longitude
longitude = getLongitude(strtok(0, ","), strtok(0, ","));
// Signal valid? (Position Fix Indicator)
if (*strtok(0, ",") != '0') {
// Satellites in use
satsInUse = atoi(strtok(0, ","));
// Skip dilution
strtok(0, ",");
// Altitude
currentPos.Altitude = floatStrToInt(strtok(0, ","), 3);
currentPos.Latitude = latitude;
currentPos.Longitude = longitude;
 
if ((coldstart) && (satsInUse > 5)) {
// First position after reboot (or change of mode) will be the home position (facing north)
MK_pos.Home_Lon = (double)currentPos.Longitude / 10000000.0;
MK_pos.Home_Lat = (double)currentPos.Latitude / 10000000.0;
MK_pos.Home_Lon7 = currentPos.Longitude;
MK_pos.Home_Lat7 = currentPos.Latitude;
MK_pos.Home_Alt = currentPos.Altitude;
MK_pos.direction = 0;
coldstart = 0;
Double_Beep(DBEEPNMEAFIX, DBEEPMEAFIXP);
}
do_tracking();
}
}
}
Displ_GPS(); // letzte empfangene Daten auch bei ausgeschalteter NMEA sichtbar
}
 
 
/************************************************************************/
/* */
/* 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(data_decode, POLOLU_CMD)) {
switch (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 = data_decode[2];
ServoPos = ((ServoPos << 7) | data_decode[3]) / 20; // ServoPos * ServoSteps() sonst zu groß
 
if (ServoPos >= 60) ServoPos -= 60; else ServoPos = 0;
if (ServoPos > 180) ServoPos = 180;
servoSetAngle(data_decode[1], ServoPos);
}
}
}
/NGVideo5_8/tags/V1.31/tracking.h
0,0 → 1,29
#ifndef _TRACKING_H_
#define _TRACKING_H_
 
#define TRACKING_RSSI 1
#define TRACKING_GPS 2
#define TRACKING_MKCOCKPIT 3
#define TRACKING_NMEA 4
 
typedef struct {
double distance;
double bearing;
}geo_t;
 
typedef struct {
double Home_Lon; // in degrees
double Home_Lat; // in degrees
int32_t Home_Lon7; // in 1E-7 degrees
int32_t Home_Lat7; // in 1E-7 degrees
int32_t Home_Alt; // in mm
int16_t direction; // ermittelte Konstante aus Mittelposition Antenne geo.bearing - navi_data.CompassHeading
}__attribute__((packed)) HomePos_t;
 
void Tracking_MKCockpit(void);
void Tracking_GPS(void);
void Tracking_NMEA(void);
void Tracking_RSSI(void);
void setNMEAdir(void);
 
#endif
/NGVideo5_8/tags/V1.31/usart.c
0,0 → 1,292
 
/****************************************************************/
/* */
/* 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 <string.h>
#include "usart.h"
#include "tracking.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 | ent 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;
static char start;
static char end;
 
/**************************************************************/
/* */
/* 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;
 
received = UDR0;
if (rx_ready == 0) {
if ((received == start) && line_flag) { // start '#', '$' or 0x80
line_flag = 0; // New line has begun
ptr_write = rx_buffer; // Begin at start of buffer
rx_len = 0;
}
if (line_flag == 0) { // Are we receiving a line?
*ptr_write = received; // Add current byte
rx_len++;
 
// GPS Datensatzende
if (rx_GPS) {
if (received == end) { // End of MK-GPS or NMEA-line?
line_flag = 1; // Yes, start new line
rx_ready = 1; // Lock buffer until line has been processed
}
}
// Pololu Micro Serial very reduced/simplified; rx_len-checks 1 higher ==> already incremented
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; // Lock buffer until line has been processed
}
}
ptr_write++;
if(rx_len == RXD_BUFFER_SIZE) line_flag = 1; // Line too long? Try again
}
}
}
 
uint8_t hexDigitToInt(uint8_t digit)
{
if (digit >= '0' && digit <= '9') return digit - '0';
if (digit >= 'a' && digit <= 'f') return digit - 'a' + 10;
if (digit >= 'A' && digit <= 'F') return digit - 'A' + 10;
return 0;
}
 
uint8_t decodeNMEA(void)
{ uint8_t ret = 0;
uint8_t crc;
uint8_t tmpCRC = 0;
uint8_t i;
 
if (rx_ready == 1 && rx_len > 0) {
// Calculate checksum
for (i = 1; i < rx_len && rx_buffer[i] != '*'; i++) {
tmpCRC ^= rx_buffer[i];
}
if (rx_len >= i + 3) {
crc = hexDigitToInt(rx_buffer[i + 1]) << 4 | hexDigitToInt(rx_buffer[i + 2]);
if (crc == tmpCRC) {
rx_buffer[i] = 0;
strcpy(data_decode, &rx_buffer[1]); // Data without $, crc
ret = 1;
wi232RX = 1; // So antenna-symbol will blink
cli();
rx_timeout = 0; // Got valid data, reset counter
sei();
}
}
}
if (rx_timeout < RX_TIME_OLD) wi232RX = 1;
rx_ready = 0; // Unlock buffer, next NMEA string can be received
return ret;
}
 
// 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 Original 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 > 2) && (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(data_decode, rx_len - 6, 3); // Daten ohne Satzzeichen, header und crc
ret = 1;
}
cli();
rx_timeout = 0; // wenn kein gültiger Datensatz 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)
{
switch (tracking) {
case TRACKING_GPS:
start = '#';
end = '\r';
rx_GPS = 1;
break;
case TRACKING_NMEA:
start = '$';
end = '\n';
rx_GPS = 1;
break;
default:
start = 0x80;
rx_GPS = 0;
break;
}
}
 
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.31/usart.h
0,0 → 1,46
 
/****************************************************************/
/* */
/* 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 RXD_BUFFER_SIZE 150 // Puffergröße in Byte
#define TXD_BUFFER_SIZE 20
 
#define RX_TIMEOUT 420 // 210ms
#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);
 
// tx_Mk addresses
#define ANY_ADDRESS 0
#define FC_ADDRESS 1
#define NC_ADDRESS 2
 
//void tx_Mk(unsigned char addr, char cmd, char *data, uint8_t len);
 
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);
uint8_t decodeNMEA(void);
 
#endif /* USART_H_ */
 
/NGVideo5_8/tags/V1.31
Property changes:
Added: bugtraq:number
+true
\ No newline at end of property