From cc5a9fe9a8829e5731a4e47234a6eb5dbf44da3d Mon Sep 17 00:00:00 2001 From: ToSa27 Date: Thu, 24 Jul 2014 13:38:55 +0200 Subject: [PATCH] Node JS controller initial commit --- NodeJsController/BlinkGreen.hex | 71 + NodeJsController/BlinkRed.hex | 71 + .../DallasTemperatureSensor.cpp.hex | 1220 +++++++++++++++++ NodeJsController/NodeJsController.js | 617 +++++++++ NodeJsController/Reboot.js | 45 + NodeJsController/package.json | 9 + 6 files changed, 2033 insertions(+) create mode 100644 NodeJsController/BlinkGreen.hex create mode 100644 NodeJsController/BlinkRed.hex create mode 100644 NodeJsController/DallasTemperatureSensor.cpp.hex create mode 100644 NodeJsController/NodeJsController.js create mode 100644 NodeJsController/Reboot.js create mode 100644 NodeJsController/package.json diff --git a/NodeJsController/BlinkGreen.hex b/NodeJsController/BlinkGreen.hex new file mode 100644 index 0000000..00c3de6 --- /dev/null +++ b/NodeJsController/BlinkGreen.hex @@ -0,0 +1,71 @@ +:100000000C9461000C947E000C947E000C947E0095 +:100010000C947E000C947E000C947E000C947E0068 +:100020000C947E000C947E000C947E000C947E0058 +:100030000C947E000C947E000C947E000C947E0048 +:100040000C949A000C947E000C947E000C947E001C +:100050000C947E000C947E000C947E000C947E0028 +:100060000C947E000C947E00000000002400270009 +:100070002A0000000000250028002B0000000000DE +:1000800023002600290004040404040404040202DA +:100090000202020203030303030301020408102007 +:1000A0004080010204081020010204081020000012 +:1000B0000007000201000003040600000000000029 +:1000C000000011241FBECFEFD8E0DEBFCDBF11E08E +:1000D000A0E0B1E0E4E5F4E002C005900D92A030AC +:1000E000B107D9F711E0A0E0B1E001C01D92A9303D +:1000F000B107E1F70E9418020C9428020C9400004A +:1001000087E061E00E94C4016AEF70E080E090E067 +:100110000E941D0187E060E00E94C4016AEF70E068 +:1001200080E090E00E941D01089587E061E00E9458 +:10013000850108951F920F920FB60F9211242F93ED +:100140003F938F939F93AF93BF93809104019091BE +:100150000501A0910601B0910701309108010196B7 +:10016000A11DB11D232F2D5F2D3720F02D57019696 +:10017000A11DB11D209308018093040190930501F6 +:10018000A0930601B09307018091000190910101B5 +:10019000A0910201B09103010196A11DB11D8093B0 +:1001A000000190930101A0930201B0930301BF915C +:1001B000AF919F918F913F912F910F900FBE0F9014 +:1001C0001F901895789484B5826084BD84B5816051 +:1001D00084BD85B5826085BD85B5816085BDEEE64F +:1001E000F0E0808181608083E1E8F0E0108280812E +:1001F00082608083808181608083E0E8F0E080819C +:1002000081608083E1EBF0E0808184608083E0EBBB +:10021000F0E0808181608083EAE7F0E080818460A3 +:1002200080838081826080838081816080838081FF +:10023000806880831092C1000895EF92FF920F931F +:100240001F93CF93DF937B018C013FB7F89480918C +:10025000000190910101A0910201B091030126B526 +:10026000A89B05C02F3F19F00196A11DB11D3FBFEE +:10027000BA2FA92F982F8827820F911DA11DB11D7C +:1002800052E0880F991FAA1FBB1F5A95D1F7EC01A6 +:1002900030C00E9427023FB7F894809100019091EE +:1002A0000101A0910201B091030126B5A89B05C0F0 +:1002B0002F3F19F00196A11DB11D3FBFBA2FA92FE5 +:1002C000982F8827820F911DA11DB11D32E0880F44 +:1002D000991FAA1FBB1F3A95D1F78C1B9D0B885EF7 +:1002E0009340B8F20894E108F10801091109C851D6 +:1002F000DC4FE114F1040105110559F6DF91CF91AE +:100300001F910F91FF90EF900895CF93DF93482FA7 +:1003100050E0CA0186569F4FFC0134914A575F4F07 +:10032000FA018491882369F190E0880F991FFC01FC +:10033000E859FF4FA591B491FC01EE58FF4FC591CC +:10034000D491662351F42FB7F8948C91932F909504 +:1003500089238C93888189230BC0623061F42FB785 +:10036000F8948C91932F909589238C938881832B7B +:1003700088832FBF06C09FB7F8948C91832B8C93F2 +:100380009FBFDF91CF910895482F50E0CA01825559 +:100390009F4FFC012491CA0186569F4FFC01949106 +:1003A0004A575F4FFA013491332309F440C02223A6 +:1003B00051F1233071F0243028F42130A1F02230A3 +:1003C00011F514C02630B1F02730C1F02430D9F433 +:1003D00004C0809180008F7703C0809180008F7D62 +:1003E0008093800010C084B58F7702C084B58F7D64 +:1003F00084BD09C08091B0008F7703C08091B000A8 +:100400008F7D8093B000E32FF0E0EE0FFF1FEE58DA +:10041000FF4FA591B4912FB7F894662321F48C91E6 +:100420009095892302C08C91892B8C932FBF0895BE +:10043000CF93DF930E94E2000E949500C0E0D0E0DD +:100440000E9480002097E1F30E940000F9CF0895F8 +:04045000F894FFCF4E +:00000001FF diff --git a/NodeJsController/BlinkRed.hex b/NodeJsController/BlinkRed.hex new file mode 100644 index 0000000..3f2c259 --- /dev/null +++ b/NodeJsController/BlinkRed.hex @@ -0,0 +1,71 @@ +:100000000C9461000C947E000C947E000C947E0095 +:100010000C947E000C947E000C947E000C947E0068 +:100020000C947E000C947E000C947E000C947E0058 +:100030000C947E000C947E000C947E000C947E0048 +:100040000C949A000C947E000C947E000C947E001C +:100050000C947E000C947E000C947E000C947E0028 +:100060000C947E000C947E00000000002400270009 +:100070002A0000000000250028002B0000000000DE +:1000800023002600290004040404040404040202DA +:100090000202020203030303030301020408102007 +:1000A0004080010204081020010204081020000012 +:1000B0000007000201000003040600000000000029 +:1000C000000011241FBECFEFD8E0DEBFCDBF11E08E +:1000D000A0E0B1E0E4E5F4E002C005900D92A030AC +:1000E000B107D9F711E0A0E0B1E001C01D92A9303D +:1000F000B107E1F70E9418020C9428020C9400004A +:1001000086E061E00E94C4016AEF70E080E090E068 +:100110000E941D0186E060E00E94C4016AEF70E069 +:1001200080E090E00E941D01089586E061E00E9459 +:10013000850108951F920F920FB60F9211242F93ED +:100140003F938F939F93AF93BF93809104019091BE +:100150000501A0910601B0910701309108010196B7 +:10016000A11DB11D232F2D5F2D3720F02D57019696 +:10017000A11DB11D209308018093040190930501F6 +:10018000A0930601B09307018091000190910101B5 +:10019000A0910201B09103010196A11DB11D8093B0 +:1001A000000190930101A0930201B0930301BF915C +:1001B000AF919F918F913F912F910F900FBE0F9014 +:1001C0001F901895789484B5826084BD84B5816051 +:1001D00084BD85B5826085BD85B5816085BDEEE64F +:1001E000F0E0808181608083E1E8F0E0108280812E +:1001F00082608083808181608083E0E8F0E080819C +:1002000081608083E1EBF0E0808184608083E0EBBB +:10021000F0E0808181608083EAE7F0E080818460A3 +:1002200080838081826080838081816080838081FF +:10023000806880831092C1000895EF92FF920F931F +:100240001F93CF93DF937B018C013FB7F89480918C +:10025000000190910101A0910201B091030126B526 +:10026000A89B05C02F3F19F00196A11DB11D3FBFEE +:10027000BA2FA92F982F8827820F911DA11DB11D7C +:1002800052E0880F991FAA1FBB1F5A95D1F7EC01A6 +:1002900030C00E9427023FB7F894809100019091EE +:1002A0000101A0910201B091030126B5A89B05C0F0 +:1002B0002F3F19F00196A11DB11D3FBFBA2FA92FE5 +:1002C000982F8827820F911DA11DB11D32E0880F44 +:1002D000991FAA1FBB1F3A95D1F78C1B9D0B885EF7 +:1002E0009340B8F20894E108F10801091109C851D6 +:1002F000DC4FE114F1040105110559F6DF91CF91AE +:100300001F910F91FF90EF900895CF93DF93482FA7 +:1003100050E0CA0186569F4FFC0134914A575F4F07 +:10032000FA018491882369F190E0880F991FFC01FC +:10033000E859FF4FA591B491FC01EE58FF4FC591CC +:10034000D491662351F42FB7F8948C91932F909504 +:1003500089238C93888189230BC0623061F42FB785 +:10036000F8948C91932F909589238C938881832B7B +:1003700088832FBF06C09FB7F8948C91832B8C93F2 +:100380009FBFDF91CF910895482F50E0CA01825559 +:100390009F4FFC012491CA0186569F4FFC01949106 +:1003A0004A575F4FFA013491332309F440C02223A6 +:1003B00051F1233071F0243028F42130A1F02230A3 +:1003C00011F514C02630B1F02730C1F02430D9F433 +:1003D00004C0809180008F7703C0809180008F7D62 +:1003E0008093800010C084B58F7702C084B58F7D64 +:1003F00084BD09C08091B0008F7703C08091B000A8 +:100400008F7D8093B000E32FF0E0EE0FFF1FEE58DA +:10041000FF4FA591B4912FB7F894662321F48C91E6 +:100420009095892302C08C91892B8C932FBF0895BE +:10043000CF93DF930E94E2000E949500C0E0D0E0DD +:100440000E9480002097E1F30E940000F9CF0895F8 +:04045000F894FFCF4E +:00000001FF diff --git a/NodeJsController/DallasTemperatureSensor.cpp.hex b/NodeJsController/DallasTemperatureSensor.cpp.hex new file mode 100644 index 0000000..dbd4fa5 --- /dev/null +++ b/NodeJsController/DallasTemperatureSensor.cpp.hex @@ -0,0 +1,1220 @@ +:100000000C94AE020C94231F0C94501F0C94D60237 +:100010000C94D6020C94D6020C9447140C94D6027D +:100020000C94D6020C94D6020C94D6020C94D602F0 +:100030000C94D6020C94D6020C94D6020C94D602E0 +:100040000C947D1F0C94D6020C9453220C94D6224F +:100050000C94D6020C94D6020C94D6020C94D602C0 +:100060000C94D6020C94D602303B303B25643B25E1 +:10007000643B0072643D636C6561720A0069643DB3 +:1000800025640A0066756C6C0A006E6577207061E5 +:1000900072656E743D25642C20643D25640A0076EB +:1000A000657273696F6E206D69736D61746368004A +:1000B000726561643A2025642D25642D25642073C2 +:1000C0003D25642C633D25642C743D25642C70749F +:1000D0003D25642C6C3D25643A25730A0073656EDA +:1000E000643A2025642D25642D25642D2564207314 +:1000F0003D25642C633D25642C743D25642C70746F +:100100003D25642C6C3D25642C73743D25733A2584 +:10011000730A00726571206E6F64652069640A005D +:10012000636865636B2077697265730A00257320C5 +:10013000737461727465642C2069642025640A00FC +:100140000001020304050A0B0C0D0E0F111213140B +:100150001516A702AD02B302BB02C402CE02D7023B +:10016000DE02E602ED02F402FC02504120506F77FD +:10017000657209203D2025530D0A00435243204C4F +:10018000656E67746809203D2025530D0A004D6F88 +:1001900064656C0909203D2025530D0A00446174F3 +:1001A00061205261746509203D2025530D0A0044E9 +:1001B000594E50442F4645415455524500434F4EE9 +:1001C0004649470052465F53455455500052465FDA +:1001D000434800454E5F52584144445200454E5FEB +:1001E00041410052585F50575F50302D36005458EF +:1001F0005F414444520052585F414444525F503280 +:100200002D350052585F414444525F50302D31002B +:100210000D0A00253032780020307800255309255A +:1002200063203D000D0A002030782530327800250B +:1002300053092563203D004F4253455256455F54B4 +:10024000583D253032783A20504F4C535F434E543E +:100250003D2578204152435F434E543D25780D0A99 +:10026000005354415455530909203D20307825301E +:1002700032782052585F44523D25782054585F44CC +:10028000533D2578204D41585F52543D25782052EA +:10029000585F505F4E4F3D25782054585F46554C6F +:1002A0004C3D25780D0A00314D42505300324D42ED +:1002B0005053003235304B425053006E5246323468 +:1002C0004C3031006E524632344C30312B00446990 +:1002D0007361626C65640038206269747300313642 +:1002E00020626974730050415F4D494E0050415F78 +:1002F0004C4F570050415F484947480050415F4DBF +:10030000415800005EBCE2613FDD83C29C7E20A3B9 +:10031000FD1F419DC3217FFCA2401E5F01E3BD3E46 +:100320006082DC237D9FC1421CFEA0E1BF5D038093 +:10033000DE3C62BEE0025CDF81633D7C22C09E1D2C +:1003400043A1FF4618FAA427799BC584DA3866E5ED +:10035000BB5907DB856739BAE406581947A5FB780E +:1003600026C49A653BD987045AB8E6A7F91B45C647 +:10037000987A24F8A6441A99C7257B3A6486D85BF4 +:1003800005E7B98CD2306EEDB3510F4E10F2AC2FA1 +:100390007193CD114FADF3702ECC92D38D6F31B2DE +:1003A000EC0E50AFF1134DCE90722C6D33D18F0CFB +:1003B00052B0EE326C8ED0530DEFB1F0AE4C1291C4 +:1003C000CF2D73CA947628ABF517490856B4EA695D +:1003D00037D58B5709EBB536688AD495CB2977F496 +:1003E000AA4816E9B7550B88D6346A2B7597C94ABF +:1003F00014F6A8742AC896154BA9F7B6E80A54D77C +:10040000896B3500000000240027002A000000004E +:1004100000250028002B00000000002300260029F2 +:10042000000404040404040404020202020202039D +:1004300003030303030102040810204080010204A7 +:10044000081020010204081020000000070002012B +:100450000000030406000000000000000000407AD5 +:1004600010F35A00A0724E18090010A5D4E800003D +:10047000E87648170000E40B54020000CA9A3B00DB +:100480000000E1F505000080969800000040420F52 +:10049000000000A08601000000102700000000E816 +:1004A00003000000006400000000000A00000000DB +:1004B000000100000000002C76D888DC674F08237C +:1004C000DFC1DFAE59E1B1B796E5E3E453C63AE6E2 +:1004D00051997696E8E6C28426EB898C9B62ED40C2 +:1004E0007C6FFCEFBC9C9F40F2BAA56FA5F4900511 +:1004F0005A2AF75C936B6CF9676DC11BFCE0E40D45 +:1005000047FEF520E6B500D0ED902E030094357738 +:10051000050080841E080000204E0A000000C80C60 +:10052000333333330F986E12831141EF8D211489C9 +:100530003BE65516CFFEE6DB18D1844B381BF77C23 +:100540001D901DA4BBE424203284725E228100C968 +:10055000F124ECA1E53D27003F09892211241FBEAB +:10056000CFEFD8E0DEBFCDBF11E0A0E0B1E0E8EC16 +:10057000FBE402C005900D92AC35B107D9F713E04A +:10058000ACE5B1E001C01D92A530B107E1F715E07F +:10059000CCE5D5E004C02297FE010E949325C83522 +:1005A000D107C9F70E94FC220C94E2250C940000AC +:1005B000EF92FF920F931F93F22FF02E47FD02C090 +:1005C000E4E001C0E4E1242F332727FD309537FF15 +:1005D00003C0309521953F4F4F2D512F0F2FEE2EF9 +:1005E0000E9455068F2D912F1F910F91FF90EF9034 +:1005F0000895FC0188279927E89421912032E9F396 +:10060000293010F02E30C8F32B3241F02D3239F45E +:10061000689404C00E94DA03820F911D2191205337 +:100620002A30C0F31EF4909581959F4F08951F9333 +:10063000FC0199278827BC01E89411911032E9F355 +:10064000193010F01E30C8F31B3251F01D3249F43E +:10065000689406C00E94C503610F711D811D911D24 +:10066000119110531A30B0F33EF490958095709527 +:1006700061957F4F8F4F9F4F1F910895FB01DC01C4 +:1006800001900D920020E1F70895FB01DC0141503B +:10069000504048F001900D920020C9F701C01D9212 +:1006A00041505040E0F70895A0E0B0E0EAE5F3E003 +:1006B0000C94B5257C01EB018A01690109C0CE01CA +:1006C0002196F6010995F70181937F0101501040B1 +:1006D00001151105A1F7CDB7DEB7E8E00C94D125DF +:1006E000FB019F01E8944230C4F04532B4F44A3033 +:1006F00029F497FB1EF4909581959F4F642F7727DF +:100700000E949725805D8A330CF0895D8193CB012F +:100710000097A1F716F45DE251931082C9010C9481 +:10072000A508FA01CF93FF93EF93223044F12532CD +:1007300034F5C22FE894CA3049F497FB3EF4909503 +:100740008095709561957F4F8F4F9F4F2C2F33274A +:1007500044275527FF93EF930E946F25EF91FF9158 +:10076000605D6A330CF0695D6193B901CA01605044 +:1007700070408040904051F716F4CDE2C193108252 +:100780008F919F91CF910C94A508592F482F372F07 +:10079000262F660F771F881F991F660F771F881FE8 +:1007A000991F620F731F841F951F660F771F881F85 +:1007B000991F08957AE0979F902D879F802D910D26 +:1007C00011240895FA01CF93FF93EF932230CCF0D8 +:1007D0002532BCF4C22F2C2F332744275527FF93F3 +:1007E000EF930E946F25EF91FF91605D6A330CF0EB +:1007F000695D6193B901CA016050704080409040CA +:1008000051F710828F919F91CF910C94A508FB0115 +:100810009F01423074F0453264F4642F77270E94C0 +:100820009725805D8A330CF0895D8193CB01009719 +:10083000A1F71082C9010C94A508AEE0B0E0E3E294 +:10084000F4E00C94B9250D891E898F89988D97FF46 +:1008500002C080E090E801979E838D831A8309830C +:100860008EE08C839E01255E3F4FCE010196698DFF +:100870007A8DA9010E9478044D815E8157FD0AC0DE +:100880002F813885421753070CF49A01020F131F6A +:10089000F80110822E96E4E00C94D525AEE0B0E08D +:1008A000E4E5F4E00C94B9258C0177FF02C060E028 +:1008B00070E8615070407E836D831A8309838EE0F7 +:1008C0008C83CE010196BA01A9010E9478042D8182 +:1008D0003E8137FD09C0EF81F8852E173F070CF4E4 +:1008E000F901E00FF11F10822E96E4E00C94D5255B +:1008F000ABE0B0E0EEE7F4E00C94AB253C012B015B +:100900005A01FC0117821682838181FD03C06FEFBB +:100910007FEFC6C19AE0892E1E010894211C311C6C +:10092000F3012381F20123FD859123FF81912F01A2 +:10093000882309F4B2C1853239F423FD859123FF60 +:1009400081912F01853229F490E0B3010E94B5080E +:10095000E7CF982FFF24EE249924FFE1FF15D0F074 +:100960009B3269F09C3228F4903259F0933291F422 +:100970000EC09D3249F0903369F441E024C052E04A +:10098000F52A84E0F82A28C098E0F92A25C0E0E199 +:10099000FE2A22C0F7FC29C0892F80538A3070F4C8 +:1009A000F6FE05C0989C902C1124980E15C0E89C6A +:1009B000E02C1124E80EF0E2FF2A0EC09E3229F44A +:1009C000F6FC6BC140E4F42A07C09C3619F450E8E9 +:1009D000F52A02C0983649F4F20123FD959123FFD0 +:1009E00091912F01992309F0B8CF892F8554833035 +:1009F00018F08052833038F444E050E0A40EB51E65 +:100A00005FE359830FC0933631F0933779F0933514 +:100A100009F056C020C0F5018081898342E050E092 +:100A2000A40EB51E610101E010E012C0F501C08006 +:100A3000D180F6FC03C06FEF7FEF02C0692D70E03C +:100A400042E050E0A40EB51EC6010E949A088C0137 +:100A50005FE7F52214C0F501C080D180F6FC03C029 +:100A60006FEF7FEF02C0692D70E042E050E0A40E0E +:100A7000B51EC6010E948F088C0150E8F52AF3FECE +:100A800007C01AC080E290E0B3010E94B508EA9462 +:100A90008E2D90E008171907A8F30EC0F601F7FC99 +:100AA0008591F7FE81916F0190E0B3010E94B50836 +:100AB000E110EA94015010400115110579F7EAC0E0 +:100AC000943611F0993669F5F7FE08C0F5012081DA +:100AD00031814281538184E090E00AC0F501808138 +:100AE00091819C01442737FD4095542F82E090E08E +:100AF000A80EB91E9FE6F92257FF09C050954095F0 +:100B0000309521953F4F4F4F5F4FE0E8FE2ACA01D5 +:100B1000B901A1012AE030E00E94E108D82ED218E4 +:100B200040C0953729F41F2D1F7E2AE030E01DC0FC +:100B30001F2D197F9F3661F0903720F4983509F00A +:100B4000ACC00FC0903739F0983709F0A6C004C088 +:100B500028E030E00AC0106114FD146020E130E0AC +:100B600004C014FD166020E132E017FF08C0F50153 +:100B7000608171818281938144E050E008C0F50179 +:100B800080819181BC0180E090E042E050E0A40EC1 +:100B9000B51EA1010E94E108D82ED2188FE7F82EC9 +:100BA000F122F6FE0BC05EEFF522D91438F4F4FE04 +:100BB00007C0F2FC05C08FEEF82202C01D2D01C057 +:100BC000192DF4FE0DC0FE01ED0DF11D8081803365 +:100BD00019F499EEF92208C01F5FF2FE05C003C0A8 +:100BE0008F2D867809F01F5F0F2DF3FC14C0F0FEE7 +:100BF0000FC01E1510F09D2C0BC09D2C9E0C911A41 +:100C00001E2D06C080E290E0B3010E94B5081F5F70 +:100C10001E15C0F304C01E1510F4E11A01C0EE2425 +:100C200004FF0FC080E390E0B3010E94B50802FF0B +:100C30001DC001FD03C088E790E00EC088E590E08C +:100C40000BC0802F867891F001FF02C08BE201C0BB +:100C500080E2F7FC8DE290E0B3010E94B50806C087 +:100C600080E390E0B3010E94B5089A94D914C0F3D0 +:100C7000DA94F101ED0DF11D808190E0B3010E9445 +:100C8000B508DD20A9F706C080E290E0B3010E941C +:100C9000B508EA94EE20C1F743CEF301668177816F +:100CA000CB012B96E2E10C94C725A9E0B0E0EBE57F +:100CB000F6E00C94AF256A01122FA02EBE2C2BE378 +:100CC000201718F42CE3922E02C0902E9394AE01BC +:100CD0004F5F5F4F27E0092D0E94B707BC01898154 +:100CE000E82EFF24C70189709070019711F4ADE2DE +:100CF00009C0B1FE02C0ABE205C0B0FC02C0A0E07A +:100D000001C0A0E2E3FE3BC0AA2311F423E001C02E +:100D100024E0211710F020E002C0121B212FEB2C41 +:100D2000B4FE02C0322F0AC0F601322F80E202C0A8 +:100D3000819331503323E1F7C20ED11CAA2319F05D +:100D4000F601A1936F01F6013196E2FE05C09EE423 +:100D5000D6019C9381E404C09EE6D6019C9381E673 +:100D600011968C9391833296DF01832F90E202C01B +:100D70009D9381508823E1F7E30FF11D40C0E2FE0F +:100D800042C0AA2311F423E001C024E0211710F08F +:100D900020E002C0121B212FEB2CB4FE02C0922FC8 +:100DA0000AC0F601922F80E202C0819391509923EC +:100DB000E1F7C20ED11CAA2319F0F601A1936F012D +:100DC000F6013196E2FE08C089E4D6018C938EE4E8 +:100DD00011968C9386E407C089E6D6018C938EE643 +:100DE00011968C9386E681833296DF01892F20E26B +:100DF00002C02D9381508823E1F7E90FF11D108285 +:100E00002EEF3FEFAFC0161617061CF041E050E082 +:100E100003C0AB014F5F5F4FAA2019F480E090E060 +:100E200003C08A2D90E0019620E030E0AA2311F063 +:100E300021E030E0240F351F280F391F812F90E06B +:100E40002817390714F020E002C0121B212F4B2D68 +:100E500050E0CA0180719070B4FC0DC0B3FC0BC0AF +:100E6000F601322F40E202C0419331503323E1F7C3 +:100E7000C20ED11C01C0322FAA2319F0F601A19392 +:100E80006F01892B11F0132F0AC0F601132F80E395 +:100E900002C0819311501123E1F7C30ED11C092D1B +:100EA000060FBA8090E1892E912C8E209F20E4FEBF +:100EB00004C0F1E3BF1609F40150101614F001E06C +:100EC00003C0093008F008E09B0177FF02C020E072 +:100ED00030E0CB010196821B930BFE013196E80FA7 +:100EE000F91F8EE2F82E3B01601A71088A2D90E0FE +:100EF00044275527481B590B8FEF2F3F380719F40C +:100F0000D601FD926D01621773072CF0621673060D +:100F100014F4808101C080E32150304031962417C1 +:100F2000350724F0D6018D936D01E6CF26173707DC +:100F300049F4B5E3BB1528F0BB1621F481149104E4 +:100F400009F481E3F6018193D601812F90E202C07A +:100F50009C93815011968823D9F7E10FF11D1082DF +:100F600020E030E0C9012996EEE00C94CB25283032 +:100F700008F027E03327DA01990F311D87FD9160D2 +:100F800000966105710539F432602E5F3D9330E3C0 +:100F90002A95E1F708959F3F30F08038710561058B +:100FA00009F03C5F3C5F3D93913008F08068911DF3 +:100FB000DF93CF931F930F93FF92EF92192F987F98 +:100FC0009695E92F96959695E90FFF27E954FB4FE3 +:100FD00099273327EE24FF24A701E7010590089401 +:100FE000079428F4360FE71EF81E491F511D660F9F +:100FF000771F881F991F0694A1F70590079428F47E +:10100000E70EF81E491F561FC11D770F881F991F35 +:10101000661F0694A1F70590079428F4F80E491F5F +:10102000561FC71FD11D880F991F661F771F069473 +:10103000A1F70590079420F4490F561FC71FD81F2A +:10104000990F661F771F881F0694A9F78491109542 +:10105000177041F0D695C79557954795F794E79443 +:101060001A95C1F7EDE5F4E0689415901591359166 +:101070006591959105907FE27395E118F10A430B14 +:10108000560BC90BD009C0F7E10CF11E431F561FC8 +:10109000C91FD01D7EF4703311F48A95E6CFE89411 +:1010A000015030F0080F0AF40027021708F4202F2F +:1010B0002395022F7A3328F079E37D932A95E9F777 +:1010C00010C07D932A9589F6069497956795379574 +:1010D00017951794E118F10A430B560BC90BD00969 +:1010E00098F023957E9173957A3308F070E37C93A2 +:1010F0002013B8F77E9170617D9330F0839571E392 +:101100007D9370E32A95E1F71124EF90FF900F9102 +:101110001F91CF91DF91992787FD90950895FC014C +:101120000590615070400110D8F7809590958E0F12 +:101130009F1F0895FC016150704001900110D8F785 +:10114000809590958E0F9F1F0895DC01FC01672FFD +:1011500071917723E1F7329704C07C916D9370838E +:101160006291AE17BF07C8F308950F931F93CF93F3 +:10117000DF938C01EB018B8181FF1BC082FF0DC0CF +:101180002E813F818C819D812817390764F4E88185 +:10119000F9810193F983E88306C0E885F985802FFA +:1011A0000995892B31F48E819F8101969F838E83CF +:1011B00002C00FEF1FEFC801DF91CF911F910F9178 +:1011C0000895FA01AA27283051F1203181F1E894DD +:1011D0006F936E7F6E5F7F4F8F4F9F4FAF4FB1E02A +:1011E0003ED0B4E03CD0670F781F891F9A1FA11D25 +:1011F000680F791F8A1F911DA11D6A0F711D811D26 +:10120000911DA11D20D009F468943F912AE0269FEA +:1012100011243019305D3193DEF6CF010895462F49 +:101220004770405D4193B3E00FD0C9F7F6CF462F2A +:101230004F70405D4A3318F0495D31FD4052419393 +:1012400002D0A9F7EACFB4E0A69597958795779550 +:101250006795BA95C9F700976105710508959B01D7 +:10126000AC010A2E06945795479537952795BA9560 +:10127000C9F7620F731F841F951FA01D08950F9358 +:101280001F930CE511E0C80163E00E94B81D8AE6D7 +:1012900091E0B8010E940F198CE791E069E04AE003 +:1012A0000E94E91385E392E060E040E00E94330A87 +:1012B0001F910F910895CF92DF92EF92FF920F93BB +:1012C0001F93CF93DF938CE791E00E94790D8AE61C +:1012D00091E00E94041A83EFC82E81E0D82EC0E06E +:1012E000D0E056C08CE791E00E941B0B882331F0C0 +:1012F0008AE691E06C2F0E94271B05C08AE691E0E8 +:101300006C2F0E944E1B20E030E040E251E40E942E +:101310000C250E942924882777FD8095982F0E940C +:101320005C2420E030E040E251E40E94C1237B01D4 +:101330008C01F6016081718182819381A8019701FE +:101340000E94BD238823F9F0C801B70120E030E0F6 +:101350004EEF52EC0E94BD238823A9F085E392E072 +:101360006C2F0E94380AB801A70121E00E94470AA9 +:10137000BC018CE791E040E00E942112F601E0827E +:10138000F18202831383219684E090E0C80ED91E77 +:101390008091330290913402C817D90724F4C031E8 +:1013A000D10509F09FCF60914001709141018CE718 +:1013B00091E00E94800CDF91CF911F910F91FF90DF +:1013C000EF90DF90CF900895AF92BF92CF92EF92BF +:1013D000FF920F93CF93DF938AE691E00E945D1B0B +:1013E0008CE791E060E070E04FEF20E00FEFE3E08A +:1013F000EE2EF12C5CE4C52E32E0A32EB12C0E941F +:10140000B3128CE791E060E071E043E151E020E04D +:101410000E94B1118AE691E00E941D198093330267 +:1014200010923402C0E0D0E008C08CE791E06C2F4D +:1014300046E020E00E94FF112196809133029091B6 +:101440003402C817D9071CF4C031D10571F7DF91F8 +:10145000CF910F91FF90EF90CF90BF90AF900895F4 +:10146000FC0114820895FC0114826683458308956B +:10147000FC0166830895FC01808187708860808309 +:1014800081818F70806181836783CF010895CF92BE +:10149000DF92EF92FF920F931F937C01F7E0CF2E24 +:1014A000D12CC80ED91ECB01BA0142E086010E94A0 +:1014B000D802F60101900020E9F73197EC19FD09F7 +:1014C000EE0FEE0FEE0FD7018C918770E82BEC93A7 +:1014D00011968C9111978F7011968C93C7011F9163 +:1014E0000F91FF90EF90DF90CF900895CF93DF930F +:1014F000EC01DB010D900020E9F71197A61B4A2FA4 +:1015000050E09A01B3E0220F331FBA95E1F78881CA +:101510008770822B888389818F708983A93110F02D +:1015200049E150E0CE0107960E944503CE01DF91CC +:10153000CF910895FC01818182958F7090E0009792 +:1015400031F0019711F080E0089587810895CF016F +:1015500007960E94F9020895FC01818182958F709F +:1015600090E0009761F0059729F020E030E040E03E +:1015700050E00EC0278130854185528509C0CF01DA +:1015800007960E941703AC01CB01DA019C01AD0163 +:10159000B901CA010895CF93DF93FC01EB0181816A +:1015A00082958F7031F43796CB01BF010E943E03C4 +:1015B00036C06115710599F18330B9F0843028F493 +:1015C000813041F0823059F508C08430A9F085306F +:1015D00031F51CC0878190E002C087819085BE01F3 +:1015E0004AE050E00E9470031AC0878190854AE06B +:1015F00050E00E94070413C0678170858185928541 +:10160000AE012AE030E00E94910309C06781708535 +:1016100081859285AE012AE030E00E94E203CE018E +:10162000DF91CF9108959C01F999FECF32BD21BD84 +:10163000F89A80B50895FC0181890895EF92FF9290 +:101640000F931F93DF93CF93CDB7DEB7CC52D1402A +:101650000FB6F894DEBF0FBECDBFC95CDE4FE88089 +:10166000F980C753D140CB5CDE4FA881B981C55307 +:10167000D14054968C91882389F1EDB7FEB73A9703 +:101680000FB6F894FEBF0FBEEDBF31968E010F5F0F +:101690001F4FADB7BEB712961C930E9311978BE2F6 +:1016A00091E09383828388E690E09583848383E04E +:1016B00090E09783868389E090E0918780870E94FD +:1016C0001D04EDB7FEB73A960FB6F894FEBF0FBEF5 +:1016D000EDBF84E692E0B8010E945423FE01E75C6E +:1016E000FE4FCB5CDE4FA881B981C553D1405496E3 +:1016F0008C919E012F5F3F4F882359F0C9016CE305 +:1017000070E0A7019F010E944E048AE08CAF1DAEDD +:1017100007C0C9016BE271E0A7019F010E944E045E +:1017200084E692E0BE016F5F7F4F0E94542384E6FF +:1017300092E00E94E121C45DDE4F0FB6F894DEBF57 +:101740000FBECDBFCF91DF911F910F91FF90EF9012 +:101750000895CF93DF93EB010CC086E592E069E03A +:1017600070E040E050E020E030E00E94F913C05407 +:10177000DF418091440190914501892B89F08FE1EF +:10178000C034D80754F7B3C086E592E068E070E053 +:1017900040E050E020E030E00E94F913C05ADF4002 +:1017A0008091440190914501892B81F087E0C03DF3 +:1017B000D80764F086E592E067E070E040E050E032 +:1017C00020E030E00E94F913C05DD74080914401D1 +:1017D00090914501892B81F083E0C83ED80764F0E1 +:1017E00086E592E066E070E040E050E020E030E026 +:1017F0000E94F913C85ED340809144019091450145 +:10180000892B81F081E0C43FD80764F086E592E03F +:1018100065E070E040E050E020E030E00E94F91325 +:10182000C45FD1408091440190914501892B79F0AA +:10183000CA3FD10564F086E592E064E070E040E0E4 +:1018400050E020E030E00E94F913CA5FD040809160 +:10185000440190914501892B79F0CD37D10564F091 +:1018600086E592E063E070E040E050E020E030E0A8 +:101870000E94F913C857D0408091440190914501CE +:10188000892B71F0C034D1055CF086E592E062E00E +:1018900070E040E050E020E030E00E94F913EC9767 +:1018A0008091440190914501892B71F0C032D1059E +:1018B0005CF086E592E061E070E040E050E020E01E +:1018C00030E00E94F9136E97809144019091450198 +:1018D000892B99F060978CF086E592E060E070E0EB +:1018E00040E050E020E030E00E94F91306C08FE0B5 +:1018F000C03AD8070CF454CF47CFDF91CF91089569 +:10190000EF92FF920F931F938C017B0184E692E08C +:101910000E94E121C8010E941E1881E090E090938E +:10192000450180934401C801B7010E94A90B1F9192 +:101930000F91FF90EF9008955F926F927F928F9238 +:101940009F92AF92BF92CF92DF92EF92FF920F934E +:101950001F93CF93DF937C01562EEA01822E88815C +:10196000982E969496949694D7011E969C919B835C +:10197000887F82608883DE2CCF2CC7010E940318E9 +:10198000C7010E94331830E040E050E060E070E0B2 +:1019900080E090E0052DF1E03D3F08F4F0E0E1E06B +:1019A000423E08F4E0E031EEA32EAF0EE060F1E03D +:1019B000593A08F4F0E028EAB22EBE0EE1E0B8EAA7 +:1019C000BB1608F0E0E0FE2BA1E0693A08F4A0E0C5 +:1019D000BF2FB855E1E0B83A08F0E0E0AE2BF1E0F7 +:1019E000772309F4F0E0E1E0882309F4E0E08D2DAD +:1019F0009C2D1CEF95014B2F5A2F6F2F7E2F0E948D +:101A00004416892D90E04A9714F040E202C0492D17 +:101A1000495F8D2D9C2DBE01282D0E94F715682E43 +:101A20008D2D9C2D0E944E18BA80AB809C808E809C +:101A300019817D800881662029F497E1C92E91E003 +:101A4000D92E04C08CE1C82E81E0D82EB701695A86 +:101A50007F4FCE010E94CB0AEDB7FEB77A970FB643 +:101A6000F894FEBF0FBEEDBF3196ADB7BEB712966C +:101A7000FC92EE9211972DED30E033832283B482F5 +:101A80001582A682178250861186928613868486D6 +:101A90001586212F30E02770307037872687708AAF +:101AA000118A12951F70128B138A0695069506955A +:101AB000048B158AD78AC68A918F808F0E941E0B4D +:101AC000EDB7FEB77A960FB6F894FEBF0FBEEDBF26 +:101AD000862DDF91CF911F910F91FF90EF90DF90B6 +:101AE000CF90BF90AF909F908F907F906F905F90BE +:101AF00008954F925F926F927F928F929F92AF92D2 +:101B0000BF92CF92DF92EF92FF920F931F93DF93DA +:101B1000CF930F92CDB7DEB74C01582E492C8E01D2 +:101B20000F5F1F4FB8010E94E417882309F4D5C244 +:101B30008981873008F0D1C2C4010E94F414482F73 +:101B400065E1662E712C680C791CC401B3010E94FA +:101B5000EA15C4016981A80121E00E948614D4011C +:101B600055960C9106950695069510E0F401E00F48 +:101B7000F11F148EF401E788D08CC18CB38CF688E9 +:101B8000A28CB401695A7F4FC3010E94CB0A2DB7C2 +:101B90003EB7265130400FB6F8943EBF0FBE2DBF62 +:101BA000EDB7FEB73196ADB7BEB712969C928E9246 +:101BB000119720EB30E033832283E4821582D682B2 +:101BC0001782C0861186B28613862F2D30E02770CB +:101BD000307035872487A6861786F2945FE0F52259 +:101BE000F08A118A138B028B958B848B0E941E0BBB +:101BF000F401858987702DB73EB72A5E3F4F0FB637 +:101C0000F8943EBF0FBE2DBF8230B1F000D000D09F +:101C1000ADB7BEB712969C928E9211978FE990E065 +:101C200014969C938E9313970E941E0B80E00F9046 +:101C30000F900F900F9052C2F4012689022F077067 +:101C4000128DE788F08C318D9289992379F10330D8 +:101C500069F5173059F50E94C51F73708070907038 +:101C60000E941820D4011E968C911E9757968C9333 +:101C700057975996EC9259978FEF5B968C935B9799 +:101C800088E05A968C935A9756968C915697807FF7 +:101C9000836056968C935697C30150966C910E9420 +:101CA0003B0AAC01C4016E2D21E0F5C1F40186852B +:101CB000381709F0DBC123FF21C0D401D6967596F1 +:101CC00081E201900D928150E1F7D401D7968C9179 +:101CD000D797877FD7968C93D7971E968C911E9710 +:101CE000D8968C93D89757968C915797DA968C9371 +:101CF000B4016A5C7F4FC4010E944211F4018289E1 +:101D0000882319F18785F81601F12E2D30E081E73F +:101D100090E0880E991ED401ED91FC918FE89FEF21 +:101D2000880E991EE20FF31F80818F1571F0F082EB +:101D3000F999FECF1FBA2D5F3F4F32BD21BDF0BCD8 +:101D40000FB6F894FA9AF99A0FBE033009F081C1E0 +:101D5000183009F053C0D40154968C91882309F0AF +:101D60004DC0C3010E949A0A482F282F30E0F40189 +:101D7000808990E00197281739070CF0AEC14F5FBA +:101D8000408B27892787F999FECF1FBA81E090E021 +:101D900092BD81BD20BD0FB6F894FA9AF99A0FBE94 +:101DA000D40150963C91F999FECF1FBA82E090E0A1 +:101DB00092BD81BD30BD0FB6F894FA9AF99A0FBE64 +:101DC000EDB7FEB738970FB6F894FEBF0FBEEDBF64 +:101DD0003196ADB7BEB712969C928E9211978AE853 +:101DE00090E09383828324831582368317820E9436 +:101DF0001E0B80E0EDB7FEB73896A3C0EE2009F0C9 +:101E000028C1163009F4A3C0173038F4113009F492 +:101E10000FC1143009F061C112C01A3009F4B0C00A +:101E20001D3009F05AC128E088E190E00FB6F8941F +:101E3000A895809360000FBE20936000FFCFD4016F +:101E40001E968C918F3F09F048C1C3010E949A0AE7 +:101E5000F40186878F3FA9F400D000D0ADB7BEB79C +:101E600012969C928E92119784E890E014969C931F +:101E70008E9313970E941E0B0F900F900F900F9050 +:101E8000FFCF282F30E040E050E060E070E080E0DD +:101E900090E0E22E01E03D3F08F400E011E0423E18 +:101EA00008F410E00F511060E1E0593A08F4E0E066 +:101EB0001855F1E0183A08F0F0E0EF2BF1E0693A3C +:101EC00008F4F0E0BE2FB855E1E0B83A08F0E0E0E1 +:101ED000FE2BA1E0772309F4A0E0E1E0882309F4D8 +:101EE000E0E0852D942D61E04CEFF42E2B2F3F2F59 +:101EF0004A2F5E2F0E946517F4012685F999FECFBF +:101F00001FBA12BC11BC20BD0FB6F894FA9AF99A08 +:101F10000FBE00D000D000D0EDB7FEB73196ADB700 +:101F2000BEB712969C928E9211978DE790E09383A4 +:101F30008283248315820E941E0B80E0EDB7FEB7DA +:101F400036960FB6F894FEBF0FBEEDBFC7C0C301F3 +:101F50000E949A0A20E08D3409F421E0D4015196C0 +:101F60008C915197821709F4B8C051962C93F99926 +:101F7000FECF1FBA83E091E092BD81BD20BDA8C015 +:101F8000F4018289882309F4A8C0C3010E949A0A37 +:101F9000833409F0A2C000D000D0ADB7BEB712960E +:101FA0009C928E92119783E790E014969C938E9367 +:101FB00013970E941E0B20E030E00F900F900F90BF +:101FC0000F90D401AF58BF4F9FEFED91FC91119747 +:101FD000E20FF31F80818F3F81F09083F999FECF4C +:101FE0001FBA2D5F3F4F32BD21BD2350304090BD01 +:101FF0000FB6F894FA9AF99A0FBE2F5F3F4F22302E +:10200000310519F7F4018685878B118E8FEF838F49 +:102010008AE0828F8689807F8360868BC3016FE12F +:1020200071E00E94760ABC01C4010E94421155C0B1 +:1020300023E730E0820E931ED4010D911C9101150F +:10204000110509F44AC0C3010E94AC0AF8010995C0 +:1020500044C0E5E7F0E08E0E9F1ED401ED91FC91A7 +:10206000309711F0C301099581E038C09923A9F197 +:102070008981813091F584010F581F4FD801ED916E +:10208000FC91E30FF11D6081862F81508E3F30F46B +:10209000C401A30120E00E949C0C1FC0C401F401F4 +:1020A0006785A30120E00E949C0C6E2D70E0D80192 +:1020B000ED91FC91E60FF71F80818F1571F0F08292 +:1020C000F999FECF1FBA6D5F7F4F72BD61BDF0BC45 +:1020D0000FB6F894FA9AF99A0FBE80E00F90CF915C +:1020E000DF911F910F91FF90EF90DF90CF90BF9005 +:1020F000AF909F908F907F906F905F904F900895DA +:10210000EF92FF920F931F93CF93DF93EC010E9406 +:10211000C51F7B018C0103C0CE010E94790D0E9476 +:10212000C51F6E197F09800B910B605D7740804061 +:10213000904090F3DF91CF911F910F91FF90EF901E +:102140000895EF92FF920F931F938C0100591F4F38 +:10215000F8011082005710409FEFF801908B8685A0 +:10216000878B918F938F87E0828F8689807F8360B2 +:10217000868B75E1E72EF12CE00EF11EC7016FE1B1 +:1021800071E00E94760AC8016FEFA70121E00E946A +:102190009C0CC8010E9480101F910F91FF90EF903E +:1021A0000895EF92FF920F931F93CF93DF93EC016B +:1021B00000D000D0EDB7FEB79283818383E191E038 +:1021C000948383830E941E0B0F900F900F900F90AB +:1021D0008E85282F30E040E050E060E070E080E045 +:1021E00090E0E22E01E03D3F08F400E011E0423EC5 +:1021F00008F410E00F511060E1E0593A08F4E0E013 +:102200001855F1E0183A08F0F0E0EF2BF1E0693AE8 +:1022100008F4F0E0BE2FB855E1E0B83A08F0E0E08D +:10222000FE2BA1E0772309F4A0E0E1E0882309F484 +:10223000E0E0CE0161E02CEFF22E2B2F3F2F4A2F52 +:102240005E2F0E9465178E858F8B198E8FEF8B8F77 +:1022500083E08A8F8E89807F83608E8BCE01459646 +:102260006FE171E00E94760ABC01CE010E9442112A +:10227000CE010E948010DF91CF911F910F91FF90AE +:10228000EF9008951F93CF93DF93EC01DB0120E0E3 +:1022900011968C9111978770833009F421E08E8517 +:1022A0008F3F59F4222329F015968C91159783308E +:1022B00021F0CE010E94D1102CC08A89882331F1EF +:1022C00014969C911497CF58DF4FE881F981C1573C +:1022D000D040E90FF11D6081862F81508E3F30F490 +:1022E000992321F0CE01AD0120E00DC0222371F031 +:1022F00015968C911597843049F49F3F39F4CE019F +:102300006FEFAD0121E00E949C0C27C08C898823CF +:1023100011F080E022C0CE016F85AD0120E00E9467 +:102320009C0C182F882329F011E0C059DF4F188228 +:1023300013C08B89882351F0C059DF4F8881C05763 +:10234000D040863018F0CE010E94A110FE01E05965 +:10235000FF4F80818F5F8083812FDF91CF911F910D +:102360000895FF920F931F93CF93DF93EC018A019F +:10237000F22E61157105E1F08E858F8B198E8FEF2E +:102380008B8F8BE08A8F30E02170307053E0220F0A +:10239000331F5A95E1F78E89807F8360822B8E8B65 +:1023A000CE0145960E94760ABC01CE010E944211E0 +:1023B00001151105F1F08E858F8B198E8FEF8B8FA4 +:1023C0008CE08A8F2F2D30E02170307043E0220F97 +:1023D000331F4A95E1F78E89807F8360822B8E8B35 +:1023E000CE014596B8010E94760ABC01CE010E943A +:1023F0004211DF91CF911F910F91FF9008950F939C +:102400001F938C01FC018685878B118E638F428F11 +:1024100030E02170307063E0220F331F6A95E1F7DE +:102420008689807F822B868BC801459660E271E0A9 +:102430000E94760ABC01C8010E9442111F910F91AF +:102440000895DC01FB011E968C911E97828350E05B +:102450004170507083E0440F551F8A95E1F78181E8 +:10246000807F8160842B8183CD010E944211811184 +:1024700081E008950F931F938C0180E091E00E940A +:102480000B230F581F4FF8018083918363E070E0A6 +:1024900040E051E023E13BE00E9454031F910F9183 +:1024A0000895EF92FF920F931F93CF93DF93EC0168 +:1024B000E62EF42E8901C059DF4F1882C057D04054 +:1024C000CE010E948718CE010E946C14882389F4E3 +:1024D00000D000D0EDB7FEB7D283C18380E291E097 +:1024E000948383830E941E0B0F900F900F900F9088 +:1024F000FFCFCE0161E00E94E015CE0162E040E036 +:102500000E94FE16CE010E942A17CE016F2D0E9456 +:102510001116CE016E2D0E94E516CE01B8010E9463 +:10252000B416CE0165E04FE00E94D615CE0162E000 +:1025300070E00E949916CE010E944617CE0162E01B +:10254000EE24EA942CEFF22E01EE18EA28EA30E0AD +:1025500040E050E00E946517DF91CF911F910F91ED +:10256000FF90EF9008958F929F92AF92BF92CF927B +:10257000DF92EF92FF920F931F93CF93DF93EC01C3 +:102580004B01D42E122F84E692E040E052EC61E041 +:1025900070E026E00E9443211C8A1A8A112311F060 +:1025A00081E08A8BCB58DF4F99828882C557D04013 +:1025B0008A89882319F0CE010E943A12CE01B70110 +:1025C0004C2D95010E945112CE010E9660E070E0F4 +:1025D00043E050E023E13BE00E945403CE014196EA +:1025E00063E271E041E050E023E13BE00E945403EC +:1025F00089898F3F11F481E0898B0F3F19F00F8794 +:102600001B8A02C081E08B8B8FEFD812DE868B890C +:10261000882331F08F858F3F19F4CE010E94A110DD +:102620008E858F3F19F4CE010E94D1108A898823AC +:1026300019F420E331E002C027E331E0ADB7BEB7C3 +:1026400018970FB6F894BEBF0FBEADBFEDB7FEB77B +:1026500031961296DC93CE9311978DE291E093839D +:102660008283358324838E85868317820E941E0B86 +:10267000DC2ECD2E8DB79EB708960FB6F8949EBF70 +:102680000FBE8DBF8E85282F30E040E050E060E027 +:1026900070E080E090E0E22E01E03D3F08F400E0D1 +:1026A00011E0423E08F410E00F511060E1E0593AA9 +:1026B00008F4E0E01855F1E0183A08F0F0E0EF2BEC +:1026C000F1E0693A08F4F0E0BE2FB855E1E0B83A1D +:1026D00008F0E0E0FE2BA1E0772309F4A0E0E1E0C0 +:1026E000882309F4E0E08D2D9C2D60E04CEFF42E62 +:1026F0002B2F3F2F4A2F5E2F0E9465178E85282F84 +:1027000030E040E050E060E070E080E090E0E22EF9 +:1027100001E03D3F08F400E011E0423E08F410E023 +:102720000F511060E1E0593A08F4E0E01855F1E08B +:10273000183A08F0F0E0EF2BF1E0693A08F4F0E025 +:10274000BE2FB855E1E0B83A08F0E0E0FE2BA1E07A +:10275000772309F4A0E0E1E0882309F4E0E08D2D7F +:102760009C2D61E03CEFF32E2B2F3F2F4A2F5E2F45 +:102770000E9465178A89882311F441E101C042E172 +:10278000CE016FEF20E00E94FF118E858F8B198E96 +:102790008FEF8B8F86E08A8F8E89807F83608E8B10 +:1027A000CE0145966F850E943B0ABC01CE010E9476 +:1027B0004211CE010E948010DF91CF911F910F91A5 +:1027C000FF90EF90DF90CF90BF90AF909F908F9051 +:1027D00008950F931F938C010E945B14C8014596C6 +:1027E0000E94300AC801C6960E94300A1F910F91BC +:1027F00008954115510529F480917A008F778093CF +:102800007A006A307105B9F063FD02C0E8E001C0EA +:10281000E8E2862F8770E82B88E190E00FB6F89405 +:10282000A895809360000FBEE093600080916000E7 +:10283000806480936000232BA1F483B7817F846040 +:1028400083BFF89483B7816083BF85B7806685BFF7 +:102850008F7D85BF7894889583B78E7F83BF78946A +:102860000EC083B7817F846083BFF89483B7816093 +:1028700083BF7894889583B78E7F83BF7894452BE8 +:1028800029F480917A00806880937A0008951F92DD +:102890000F920FB60F9211248F9388E10FB6F89420 +:1028A00080936000109260000FBE8F910F900FBE5A +:1028B0000F901F901895FC01608341831282138250 +:1028C00080E2848315821682178210861186128612 +:1028D0001386148615860895FC0183810895FF925E +:1028E0000F931F938C01F62E81E00E94D91880E08F +:1028F0000E94E21884E00E94E718F80181816F2DA0 +:102900000E94BF201F910F91FF900895EF92FF92B8 +:102910000F931F93CF93DF93EC01162F042FF52E07 +:10292000E22E60E00E946F141770186A1EBD0DB48D +:1029300007FEFDCF802F9F2D9C01F9012E2D213206 +:1029400008F020E28EB508C080818EBD0DB407FE70 +:10295000FDCF31968EB521502223B1F7CE0161E033 +:102960000E946F14DF91CF911F910F91FF90EF9014 +:102970000895CF93DF93EC0160E00E946F1480E52F +:102980008EBD0DB407FEFDCF8EB583E78EBD0DB4B1 +:1029900007FEFDCF8EB5CE0161E00E946F14DF917E +:1029A000CF9108951F93CF93DF93EC01162F60E032 +:1029B0000E946F141EBD0DB407FEFDCF1EB5CE01E3 +:1029C00061E00E946F14812FDF91CF911F910895D4 +:1029D0006FEF0E94D214089561EE0E94D214089500 +:1029E00062EE0E94D21408951F93CF93DF93EC01FF +:1029F00060E00E946F1480E68EBD0DB407FEFDCF2F +:102A00008EB58FEF8EBD0DB407FEFDCF1EB5CE0186 +:102A100061E00E946F14113220F0CE010E94F01488 +:102A200010E0812FDF91CF911F910895EF92FF92D7 +:102A30000F931F93CF93DF93EC01F62EE72E9C812B +:102A4000142F941708F4192F8D81882311F000E0BA +:102A500002C0092F011BCE0160E00E946F1481E6C5 +:102A60008EBD0DB407FEFDCF8F2D9E2D9C01F9016B +:102A7000FEB49FEF07C09EBD0DB407FEFDCF8EB51F +:102A8000819311501123B9F707C08EBD0DB407FE15 +:102A9000FDCF9EB5015001C08FEF0023B1F7CE01ED +:102AA00061E00E946F148F2DDF91CF911F910F91E4 +:102AB000FF90EF900895DF92EF92FF920F931F9394 +:102AC000CF93DF93EC01E62ED72EF22E9C81142FAC +:102AD000941708F4192F8D81882311F000E002C0AB +:102AE000092F011BCE0160E00E946F14FEBC0DB4E3 +:102AF00007FEFDCF8E2D9D2D9C01F901FEB408C06F +:102B000080818EBD0DB407FEFDCF31968EB511507C +:102B10001123B1F706C01EBC0DB407FEFDCF8EB564 +:102B200001500023C1F7CE0161E00E946F148F2D88 +:102B3000DF91CF911F910F91FF90EF90DF9008955B +:102B4000CF93DF93EC01222311F420EA01C020EBA4 +:102B5000CE010E945B15888161E00E94BF208881C0 +:102B600060E00E94BF20DF91CF9108950F931F93E3 +:102B7000CF93DF93EC01162F042F60E00E946F14B7 +:102B80001F7110621EBD0DB407FEFDCF1EB50EBD38 +:102B90000DB407FEFDCF8EB5CE0161E00E946F142B +:102BA000812FDF91CF911F910F910895262F4F70A4 +:102BB0002295207F242B64E0422F0E94B6150895B1 +:102BC000662319F061E04FE302C061E040E00E943B +:102BD000B61508950F931F938C010E941615C80116 +:102BE00067E040E70E94B6151F910F910895CF93BB +:102BF000DF93EC010E94A015CE010E94E8148073BF +:102C0000D9F3CE0167E040E70E94B61584FD02C00B +:102C100081E004C0CE010E94EC1480E0DF91CF91EE +:102C20000895462F603808F04FE765E00E94B6151A +:102C30000895EF92FF920F931F93CF93DF937C0140 +:102C4000162FEA01022F60E00E946F141F711062BC +:102C50001EBD0DB407FEFDCF1EB508C088818EBD18 +:102C60000DB407FEFDCF21968EB501500023B1F7BC +:102C7000C70161E00E946F14812FDF91CF911F91F6 +:102C80000F91FF90EF900895EF92FF920F931F9393 +:102C9000DF93CF93CDB7DEB728970FB6F894DEBF9A +:102CA0000FBECDBF7C0109831A832B833C834D83E8 +:102CB0005E836F8378878E010F5F1F4F6AE0A801E4 +:102CC00025E00E941916C70160E1A80125E00E94D5 +:102CD0001916C70161E1F70144810E94B6152896D3 +:102CE0000FB6F894DEBF0FBECDBFCF91DF911F911D +:102CF0000F91FF90EF9008951F93CF93DF93EC0116 +:102D0000162F60E00E946F141F711EBD0DB407FEE8 +:102D1000FDCF8EB58FEF8EBD0DB407FEFDCF1EB576 +:102D2000CE0161E00E946F14812FDF91CF911F913E +:102D300008950F931F93CF93DF938C01EB0160E015 +:102D40000E947C16482F437F209729F0219711F489 +:102D5000486001C04C60C80160E00E94B615DF9178 +:102D6000CF911F910F910895FF920F931F93CF93CF +:102D7000DF93EC018B0166E00E947C161A82F7ED6E +:102D8000FF2EF8220230110511F480E206C0013056 +:102D9000110529F481E08A8388E0F82A01C01A82AB +:102DA000CE0166E04F2D0E94B615CE0166E00E946E +:102DB0007C168F1511F481E002C01A8280E0DF9149 +:102DC000CF911F910F91FF9008951F93CF93DF93A1 +:102DD000EC01162F66E00E947C16143010F04CE0D7 +:102DE00003C0412F440F4F5F887F482BCE0166E020 +:102DF0000E94B615DF91CF911F9108950F931F93F5 +:102E0000CF93DF93EC01162F042F6730F0F461E0CD +:102E10000E947C16282F002351F081E090E002C030 +:102E2000880F991F1A95E2F7422F482B0AC081E0BC +:102E300090E002C0880F991F1A95E2F7482F40953D +:102E40004223CE0161E00E94B615DF91CF911F9120 +:102E50000F9108950F931F938C010E94B914C8011C +:102E60006DE10E947C16482F4660C8016DE10E940A +:102E7000B615C8016CE10E947C16482F4360C8015A +:102E80006CE10E94B6151F910F9108950F931F9347 +:102E90008C010E94B914C8016DE10E947C16482F74 +:102EA0004460C8016DE10E94B615C8016CE10E9442 +:102EB0007C16482F4F63C8016CE10E94B61581E073 +:102EC000F80185831F910F910895BF92CF92DF92F1 +:102ED000EF92FF920F931F93DF93CF93CDB7DEB79F +:102EE00028970FB6F894DEBF0FBECDBF6C01B62E8B +:102EF000E982FA820B831C832D833E834F8358879C +:102F0000662389F4F601E6828A8187838B81808734 +:102F10008C8181878D8182878E8183878F81848751 +:102F20008885858707C0F6E0F61708F43DC081E084 +:102F3000681761F4EB2DF0E0EA5BFE4FE491C60107 +:102F40006E2FAE014F5F5F4F25E00BC0E62FF0E024 +:102F5000EA5BFE4FE491C6016E2FAE014F5F5F4FFB +:102F600021E00E9419160B2D10E0F801E45BFE4FE2 +:102F7000E491C6016E2FF60144810E94B615C60188 +:102F800062E00E947C16005C1E4FF801649121E013 +:102F900030E002C0220F331F6A95E2F7482F422B20 +:102FA000C60162E00E94B61528960FB6F894DEBFFF +:102FB0000FBECDBFCF91DF911F910F91FF90EF908A +:102FC000DF90CF90BF9008950F931F93CF93DF931F +:102FD000EC018B0167E10E947C1680FF02C080E05B +:102FE0000DC00115110549F0CE010E94E81490E0D2 +:102FF000959587958770F801808381E0DF91CF9167 +:103000001F910F910895CF93DF93EC0160E00E9430 +:103010007C1681FD10C0CE0160E00E947C16482F16 +:103020004260CE0160E00E94B61565E070E080E08D +:1030300090E00E941820DF91CF9108950F931F9385 +:103040008C01FC01808160E00E94BF20C80160E02B +:103050000E947C16482F4D7FC80160E00E94B61583 +:103060001F910F9108950F931F938C01FC01808194 +:1030700060E00E94BF20C8010E94EC14C8010E94B9 +:10308000F014C80160E00E947C16482F4E7FC801F2 +:1030900060E00E94B6151F910F910895CF93DF93C2 +:1030A000EC010E940318CE0160E00E947C16482FBC +:1030B0004160CE0160E00E94B615CE0167E040E7B6 +:1030C0000E94B6158E819F81892B9885892B9985C1 +:1030D000892B9A85892B9B85892B9C85892B9D859E +:1030E000892B41F0AE014A5F5F4FCE016AE025E0D7 +:1030F0000E941916CE010E94F014CE010E94EC1419 +:10310000888161E00E94BF20DF91CF910895CF9325 +:10311000DF93EC01888161E00E948020898161E079 +:103120000E9480200E94F818888160E00E94BF20E1 +:10313000CE0161E00E946F1465E070E080E090E0F5 +:103140000E941820CE0165E04FE00E94D615CE0106 +:1031500062E070E00E94B416882311F081E08B8356 +:10316000CE0160E070E00E94B416CE0162E070E033 +:103170000E949916CE0167E040E70E94B615CE0185 +:103180006CE40E941116CE010E94F014CE010E9440 +:10319000EC14CE010E940318CE0160E00E947C1660 +:1031A000482F4E7FCE0160E00E94B615DF91CF918F +:1031B0000895882319F48CB5806202C08CB58F7D88 +:1031C0008CBD08959CB5937F982B9CBD08952CB51C +:1031D000382F33702C7F322B3CBD2DB590E0959568 +:1031E00087959595879581702E7F822B8DBD08954B +:1031F0008AE061E00E94BF208AE061E00E948020B6 +:103200008CB580618CBD8CB580648CBD8DE061E037 +:103210000E9480208BE061E00E9480200895FC01E4 +:1032200087ED99E1918B808B758364831382108283 +:103230008FE190E0928381830895FC01838108955A +:103240006F927F928F929F92AF92BF92CF92DF92B6 +:10325000EF92FF920F931F93CF93DF93FB01EA014D +:10326000998180E0288130E0282B392BE081E232FF +:1032700031F0E83221F0E03109F084C04BC04C81DC +:103280004F3329F1403420F44F3109F07BC02FC077 +:103290004F3579F04F3709F075C0B901882777FDB0 +:1032A0008095982F0E945C2420E030E040E85DE3A8 +:1032B0002EC035952795B901882777FD8095982FE1 +:1032C0000E945C2420E030E040E05EE320C03595C1 +:1032D000279535952795B901882777FD8095982FF3 +:1032E0000E945C2420E030E040E85EE310C093E000 +:1032F000359527959A95E1F7B901882777FD80954F +:10330000982F0E945C2420E030E040E05FE30E94C0 +:103310000C2532C0EF8035952795B901882777FDB8 +:103320008095982F0E945C2420E030E040E85EE326 +:103330000E9458233B014C016E2D70E02E81621BD0 +:103340007109882777FD8095982F0E945C245B0186 +:103350006C01FF2400E010E0C801B7010E945A246C +:103360009B01AC01C601B5010E94C1239B01AC01C8 +:10337000C401B3010E9459239B01AC01832F942FF8 +:10338000752F00C0262F382F492F572FB901CA019A +:10339000DF91CF911F910F91FF90EF90DF90CF9031 +:1033A000BF90AF909F908F907F906F9008950895F9 +:1033B000EF92FF920F931F938C017B01FC0184819C +:1033C00095810E94D71CF80184819581B7010E94E4 +:1033D000B61CF8018481958164EB40E00E94711C69 +:1033E000F801848195810E94EC1BF82EF8018481FC +:1033F00095810E94D71C80E0FF2009F481E01F9195 +:103400000F91FF90EF9008950F931F938C01FC0193 +:10341000848195810E94D71CF801848195810E9446 +:10342000B11CF8018481958164E440810E94711C83 +:10343000F801818192818F33910551F08F3591058B +:1034400061F04F9779F46EE570E080E090E00EC097 +:103450006CEB70E080E090E009C067E771E080E02D +:1034600090E004C06EEE72E080E090E00E941820D0 +:103470001F910F910895CF92DF92EF92FF920F93D9 +:103480001F938C016B017A01FC01848195810E945C +:10349000D71CF80184819581B6010E94B61CF80101 +:1034A000848195816EEB40E00E94711CF80184815B +:1034B00095810E94201CF7018083F8018481958109 +:1034C0000E94201CF7018183F801848195810E946C +:1034D000201CF7018283F801848195810E94201CC1 +:1034E000F7018383F801848195810E94201CF701F4 +:1034F0008483F801848195810E94201CF7018583D3 +:10350000F801848195810E94201CF7018683F801CF +:10351000848195810E94201CF7018783F8018481B2 +:1035200095810E94201CF7018087F8018481958194 +:103530000E94D71C1F910F91FF90EF90DF90CF90CA +:1035400008950F931F938A010E943B1AC80168E0F7 +:103550000E94DB1B20E0F8019085891709F421E027 +:10356000822F1F910F910895CF92DF92EF92FF92D9 +:103570000F931F93DF93CF93CDB7DEB729970FB685 +:10358000F894DEBF0FBECDBF8C017B016E010894A5 +:10359000C11CD11CA6010E94A11A882329F460E055 +:1035A00070E08EEF92EC05C0C801B701A6010E9441 +:1035B000201929960FB6F894DEBF0FBECDBFCF916C +:1035C000DF911F910F91FF90EF90DF90CF900895C2 +:1035D0000F931F938B01CB0167E00E94DB1B20E060 +:1035E000F8019781891709F421E0822F1F910F912B +:1035F0000895EF92FF920F931F93CF93DF93EC0107 +:103600007B01042F8C819D810E94CE1B10E007C09E +:10361000CE01B7010E94E81A8823A9F00AC08C8164 +:103620009D81B7010E94221D882329F0101759F4AB +:10363000EFCF81E001C080E0DF91CF911F910F912A +:10364000FF90EF9008951F5F0117A8F3E8CFEF9266 +:10365000FF920F931F93DF93CF93CDB7DEB72897D9 +:103660000FB6F894DEBF0FBECDBF7C01462F8E0192 +:103670000F5F1F4FB8010E94F91AC701B8010E94DD +:10368000B41A28960FB6F894DEBF0FBECDBFCF9107 +:10369000DF911F910F91FF90EF9008950E94271BDB +:1036A00026E636E646EE5FE30E940C2520E030E099 +:1036B00040E052E40E94592308959F92AF92BF9236 +:1036C000CF92DF92EF92FF920F931F93DF93CF93EE +:1036D000CDB7DEB761970FB6F894DEBF0FBECDBF92 +:1036E0008C01FC01848195810E94CE1BF80113821C +:1036F0007E010894E11CF11CE9E0AE2EB12CAC0E69 +:10370000BD1E7FE7C72ED12C992493942DC0C801EC +:10371000B7010E94E81A882339F1F80180818823D3 +:1037200041F4C801B7010E94D819882311F0F801AB +:103730009082C801B701A5010E943B1A898180319E +:1037400021F4F801D282C1820BC08D85282F30E090 +:10375000F801818192818217930714F432832183C7 +:10376000F80183818F5F8383F80184819581B7019C +:103770000E94221D882359F661960FB6F894DEBF89 +:103780000FBECDBFCF91DF911F910F91FF90EF90B2 +:10379000DF90CF90BF90AF909F900895FC0113866B +:1037A0001586148687E090E012863197009711F015 +:1037B0000197FACF0895DC0180E00BC0E82FF0E01C +:1037C0008D9190E0E827F927ED5FFC4FE49161507F +:1037D0008E2F662399F70895DF92EF92FF920F9351 +:1037E0001F93FC01E08001811281F894F80181812E +:1037F0008E2981838281DE2CD0948D21828383E087 +:1038000090E00E94D31FF80181818D2181838AE09D +:1038100090E00E94D31FF8010081789485E390E046 +:103820000E94D31F80E010E0FF240E211F21012BF6 +:1038300009F081E01F910F91FF90EF90DF900895C4 +:10384000EF92FF920F931F93CF93DF937C0101E0E0 +:1038500010E0C0E0D0E0C7010E94EC1B8111102BEA +:10386000000F2196C830D105B1F7812FDF91CF919C +:103870001F910F91FF90EF9008951F93CF93DF93C7 +:10388000FC011081C181D281912F909560FF12C0FF +:10389000F8948A8189238A838981812B89838AE0AC +:1038A00090E00E94D31F8A81812B8A83789487E3DA +:1038B00090E011C0F8948A8189238A838981812BC1 +:1038C000898381E490E00E94D31F8A81812B8A83BF +:1038D000789485E090E00E94D31FDF91CF911F91F3 +:1038E0000895CF92DF92EF92FF920F931F93CF93A1 +:1038F000DF938C01E42EFF24F394C0E0D0E0C62EC9 +:10390000DD2460E08F2D90E08C219D21892B09F032 +:1039100061E0C8010E943D1CFF0C2196C830D10512 +:1039200081F7EE20A9F4F894D8011196ED91FC915D +:10393000129791818C918095982391831196ED91A6 +:10394000FC91129792818C91809598239283789420 +:10395000DF91CF911F910F91FF90EF90DF90CF906B +:1039600008956CEC40E00E94711C0895EF92FF9264 +:103970000F931F93CF93DF938C017B0165E540E0AC +:103980000E94711CC0E0D0E0F701EC0FFD1FC801E0 +:10399000608140E00E94711C2196C830D105A1F7DA +:1039A000DF91CF911F910F91FF90EF900895DF92DB +:1039B000EF92FF920F931F93CF93DF93FC0100814F +:1039C000C181D281F8948981D02ED0948D218983B0 +:1039D00078941DE7E02EFF24115059F182E090E029 +:1039E0000E94D31F888190E08E219F21892BA1F313 +:1039F000F8948A818D218A838981802B89837894A8 +:103A000084EF91E00E94D31FF89489818D218983EE +:103A100080E590E00E94D31F888110E090E0E822CA +:103A2000F922EF2809F411E0789484EA91E00E94E9 +:103A3000D31F812FDF91CF911F910F91FF90EF90B6 +:103A4000DF900895AF92BF92DF92EF92FF920F93B3 +:103A50001F93CF93DF93EC015B018D85882309F0E1 +:103A600061C0CE010E94D71C882329F41B861D86C5 +:103A70001C8690E06BC0CE0160EF40E00E94711C9C +:103A800001E0DD24EE24FF24F394CE010E94EC1B20 +:103A9000182FCE010E94EC1B113019F48130E1F493 +:103AA00039C0181709F58B85081770F460E0FE011E +:103AB000EE0DF11D838190E02F2D30E082239323C2 +:103AC000181619064CF003C060E0081729F00930F9 +:103AD00008F04CC00C874AC0FE01EE0DF11D838139 +:103AE0008F29838361E009C0612FFE01EE0DF11D76 +:103AF0009F2D9095838189238383CE010E943D1C55 +:103B00000F5FFF0C19F4E394FF24F39487E08E1504 +:103B100008F0BBCF013430F0DB86DD2011F581E009 +:103B20008D871FC01B861D861C8690E0DE0120E06D +:103B300030E0F501E20FF31F13968C911397808309 +:103B40002F5F3F4F11962830310599F7892FDF916C +:103B5000CF911F910F91FF90EF90DF90BF90AF90AA +:103B600008958B818823F1F291E0E0CFD02EBDCF74 +:103B7000FF920F931F938C01F62E862F60E00E9418 +:103B800080208F2D90E0FC01EB5CFB4FE491D8018D +:103B9000EC938F5D9B4FFC016491E62FF0E0EE0FFC +:103BA000FF1FE95EFB4F8591949112969C938E9333 +:103BB00011971B961C921B971D961C921D971C9685 +:103BC0001C92F80187E090E012863197009711F07F +:103BD0000197FACF1F910F91FF9008950F931F93B4 +:103BE000CF93DF93BC018230910510F462E070E066 +:103BF000E0910303F091040340E050E0A0E0B0E066 +:103C000024C08081918186179707D0F08617970787 +:103C100071F482819381109729F013969C938E936F +:103C200012972CC0909304038093030327C041157F +:103C3000510519F08417950718F48D01AC01EF01B7 +:103C4000DF01828193819C01F9013097D1F6411502 +:103C50005105F9F0CA01861B970B8430910580F459 +:103C60008A819B810115110521F0F80193838283DC +:103C700004C09093040380930303FE01329645C071 +:103C8000FE01E80FF91F619371930297998388836E +:103C90003CC08091010390910203892B41F48091F3 +:103CA0004801909149019093020380930103409150 +:103CB0004A0150914B014115510541F44DB75EB792 +:103CC0008091460190914701481B590B20910103B7 +:103CD0003091020324173507B0F4CA01821B930BFD +:103CE0008617970780F0AB014E5F5F4F84179507EB +:103CF00050F0420F531F5093020340930103F90108 +:103D00006193719302C0E0E0F0E0CF01DF91CF91C9 +:103D10001F910F910895CF93DF939C01009709F4B1 +:103D20008FC0EC0122971B821A826091030370916D +:103D300004036115710581F488819981820F931FB5 +:103D400020910103309102032817390739F5D093E8 +:103D50000203C093010374C0DB0140E050E0AC17E4 +:103D6000BD0708F1BB83AA83FE0121913191E20FC7 +:103D7000F31FAE17BF0779F48D919C911197280F0F +:103D8000391F2E5F3F4F3983288312968D919C9166 +:103D900013979B838A834115510571F4D0930403D3 +:103DA000C09303034DC012968D919C911397AD0162 +:103DB000009711F0DC01D3CFDA011396DC93CE9398 +:103DC0001297FA0121913191E20FF31FCE17DF070D +:103DD00069F488819981280F391F2E5F3F4FFA01BE +:103DE000318320838A819B8193838283E0E0F0E0AA +:103DF000DB0112968D919C911397009719F0BC01ED +:103E0000FD01F6CFAB014E5F5F4FDB018D919C91C1 +:103E1000840F951F20910103309102032817390761 +:103E200079F4309729F4109204031092030302C02E +:103E30001382128242505040509302034093010378 +:103E4000DF91CF9108951F920F920FB60F92112418 +:103E50002F933F934F935F936F937F938F939F9392 +:103E6000AF93BF93EF93FF938091570290915802C5 +:103E7000892B29F0E0915702F09158020995FF91A2 +:103E8000EF91BF91AF919F918F917F916F915F91D2 +:103E90004F913F912F910F900FBE0F901F9018954B +:103EA0001F920F920FB60F9211242F933F934F93AF +:103EB0005F936F937F938F939F93AF93BF93EF9392 +:103EC000FF938091590290915A02892B29F0E09139 +:103ED0005902F0915A020995FF91EF91BF91AF916C +:103EE0009F918F917F916F915F914F913F912F9112 +:103EF0000F900FBE0F901F9018951F920F920FB644 +:103F00000F9211242F933F938F939F93AF93BF935F +:103F100080915F0290916002A0916102B091620273 +:103F2000309163020196A11DB11D232F2D5F2D3706 +:103F300020F02D570196A11DB11D2093630280939F +:103F40005F0290936002A0936102B093620280913D +:103F50005B0290915C02A0915D02B0915E020196BD +:103F6000A11DB11D80935B0290935C02A0935D0242 +:103F7000B0935E02BF91AF919F918F913F912F912E +:103F80000F900FBE0F901F9018958FB7F894209147 +:103F90005F023091600240916102509162028FBFD6 +:103FA000B901CA010895019739F0880F991F880F48 +:103FB000991F02970197F1F70895789484B582606C +:103FC00084BD84B5816084BD85B5826085BD85B5BD +:103FD000816085BDEEE6F0E0808181608083E1E86C +:103FE000F0E01082808182608083808181608083A4 +:103FF000E0E8F0E0808181608083E1EBF0E08081A7 +:1040000084608083E0EBF0E0808181608083EAE778 +:10401000F0E0808184608083808182608083808101 +:10402000816080838081806880831092C1000895C0 +:10403000EF92FF920F931F93CF93DF937B018C013D +:104040003FB7F89480915B0290915C02A0915D0271 +:10405000B0915E0226B5A89B05C02F3F19F00196CE +:10406000A11DB11D3FBFBA2FA92F982F8827820FFE +:10407000911DA11DB11D52E0880F991FAA1FBB1FE2 +:104080005A95D1F7EC0130C00E9457233FB7F894FE +:1040900080915B0290915C02A0915D02B0915E0202 +:1040A00026B5A89B05C02F3F19F00196A11DB11D93 +:1040B0003FBFBA2FA92F982F8827820F911DA11DCE +:1040C000B11D32E0880F991FAA1FBB1F3A95D1F787 +:1040D0008C1B9D0B885E9340B8F20894E108F108B0 +:1040E00001091109C851DC4FE114F1040105110562 +:1040F00059F6DF91CF911F910F91FF90EF900895A6 +:10410000CF93DF93482F50E0CA018B5C9B4FFC019B +:1041100034914F5D5B4FFA018491882369F190E0FF +:10412000880F991FFC01ED5FFB4FA591B491FC0135 +:10413000E35FFB4FC591D491662351F42FB7F894F8 +:104140008C91932F909589238C93888189230BC020 +:10415000623061F42FB7F8948C91932F9095892356 +:104160008C938881832B88832FBF06C09FB7F894D8 +:104170008C91832B8C939FBFDF91CF910895482F13 +:1041800050E0CA01875B9B4FFC012491CA018B5C04 +:104190009B4FFC0194914F5D5B4FFA0134913323A7 +:1041A00009F440C0222351F1233071F0243028F467 +:1041B0002130A1F0223011F514C02630B1F02730A3 +:1041C000C1F02430D9F404C0809180008F7703C0FF +:1041D000809180008F7D8093800010C084B58F77A0 +:1041E00002C084B58F7D84BD09C08091B0008F77F7 +:1041F00003C08091B0008F7D8093B000E32FF0E08A +:10420000EE0FFF1FE35FFB4FA591B4912FB7F8941A +:10421000662321F48C919095892302C08C91892B7F +:104220008C932FBF0895DC015C968C915C97FD0107 +:10423000E80FF11DE35AFF4F20815C968C915C974B +:1042400090E001968F7390705C968C935C97569675 +:10425000ED91FC91579720835096ED91FC915197E9 +:104260008081806480835B969C915B975C968C9147 +:104270005C97981739F45296ED91FC915397808191 +:104280008F7D80830895DF92EF92FF920F931F93AB +:10429000CF93DF93EC017A018B01D22EE889F98963 +:1042A00082E08083403081EE580780E0680780E03C +:1042B0007807A1F060E079E08DE390E0A801970134 +:1042C0000E946F2521503040404050405695479500 +:1042D0003795279580E12030380798F0E889F989EB +:1042E000108260E874E88EE190E0A80197010E94D6 +:1042F0006F252150304040405040569547953795A6 +:104300002795EC85FD853083EE85FF852083188E0B +:10431000EC89FD89D082EA89FB8980818061808374 +:10432000EA89FB89808188608083EA89FB898081B2 +:1043300080688083EA89FB8980818F7D8083DF911B +:10434000CF911F910F91FF90EF90DF900895FC01A6 +:10435000218D828D30E0205C3F4F281B31092F7367 +:104360003070C9010895FC01918D828D981719F460 +:104370002FEF3FEF06C0828DE80FF11D858D282FAE +:1043800030E0C9010895DC0159969C9159975A96DD +:104390008C915A97981719F42FEF3FEF10C05A9647 +:1043A0008C915A97FD01E80FF11D958D5A968C91CD +:1043B0005A978F5F8F735A968C93292F30E0C901DB +:1043C0000895CF93DF93EC01888D882361F419C0A1 +:1043D0008C9185FF0AC0E889F989808185FF05C035 +:1043E000CE010E941321AA89BB898C9185FD05C04D +:1043F000E889F989808186FD04C00FB607FEE8CF01 +:10440000F4CFDF91CF9108950F931F93CF93DF9354 +:10441000EC01062F9B8D8C8D981791F5E889F98911 +:10442000808185FF2DC0EE89FF896083E889F98945 +:104430008081806480831DC00FB607FC08C0E889B6 +:10444000F989808185FF03C0CE010E9413218C8DE4 +:10445000181791F38B8DFE01E80FF11DE35AFF4F02 +:1044600000831B8FEA89FB8980818062808381E0E1 +:10447000888F81E090E0DF91CF911F910F91089597 +:104480001B8D1F5F1F73E3CF8CEC92E2892B51F0E1 +:1044900080E090E0892B31F00E94CC22882311F03B +:1044A0000E94000008951F920F920FB60F921124E0 +:1044B0002F938F939F93EF93FF93E0917402F0916A +:1044C0007502808182FD16C0E0917A02F0917B0234 +:1044D000208190917D029F5F9F7380917E0298174B +:1044E00071F0E0917D02F0E0EC59FD4F258F909343 +:1044F0007D0205C0E0917A02F0917B02E081FF919C +:10450000EF919F918F912F910F900FBE0F901F9061 +:104510001895109267021092660288EE93E0A0E070 +:10452000B0E08093680290936902A0936A02B0930E +:104530006B0280E591E0909365028093640285ECC4 +:1045400090E0909371028093700284EC90E09093DD +:1045500073028093720280EC90E0909375028093D6 +:10456000740281EC90E0909377028093760282EC63 +:1045700090E0909379028093780286EC90E090939B +:104580007B0280937A0210927D0210927E0210923A +:104590007F0210928002089584E692E00E94A72193 +:1045A00020E0892B09F021E0822F08951F920F92BD +:1045B0000FB60F9211242F933F934F935F936F93F6 +:1045C0007F938F939F93AF93BF93EF93FF9384E673 +:1045D00092E00E941321FF91EF91BF91AF919F91C3 +:1045E0008F917F916F915F914F913F912F910F909C +:1045F0000FBE0F901F901895CF93DF930E94DD1F81 +:104600000E94E409C4E4D2E20E945B092097E1F32E +:104610000E944422F9CF0E94EE1D0895CF92DF92AE +:10462000EF92FF920F931F93CF93DF937C016B0167 +:104630008A01C0E0D0E00FC0D6016D916D01D701B5 +:10464000ED91FC910190F081E02DC7010995C80F13 +:10465000D91F015010400115110571F7CE01DF91EE +:10466000CF911F910F91FF90EF90DF90CF90089521 +:10467000CF93DF93EC016115710519F420E030E070 +:104680000FC0DB010D900020E9F71197A61BB70BB7 +:10469000E881F9810280F381E02DAD0109959C014B +:1046A000C901DF91CF9108950E943823089508959C +:1046B0005058BB27AA270ED075C166D130F06BD1F8 +:1046C00020F031F49F3F11F41EF45BC10EF4E0952D +:1046D000E7FB51C1E92F77D180F3BA17620773075F +:1046E0008407950718F071F49EF58FC10EF4E095DC +:1046F0000B2EBA2FA02D0B01B90190010C01CA019C +:10470000A0011124FF27591B99F0593F50F4503E46 +:1047100068F11A16F040A22F232F342F4427585F38 +:10472000F3CF469537952795A795F0405395C9F750 +:104730007EF41F16BA0B620B730B840BBAF0915008 +:10474000A1F0FF0FBB1F661F771F881FC2F70EC0A7 +:10475000BA0F621F731F841F48F48795779567957A +:10476000B795F7959E3F08F0B3CF9395880F08F063 +:104770009927EE0F979587950895D9D008F481E091 +:1047800008950CD00FC107D140F0FED030F021F4D5 +:104790005F3F19F0F0C0511139C1F3C014D198F343 +:1047A0009923C9F35523B1F3951B550BBB27AA27B2 +:1047B00062177307840738F09F5F5F4F220F331F24 +:1047C000441FAA1FA9F333D00E2E3AF0E0E830D0F0 +:1047D00091505040E695001CCAF729D0FE2F27D0F3 +:1047E000660F771F881FBB1F261737074807AB07C1 +:1047F000B0E809F0BB0B802DBF01FF2793585F4F36 +:104800002AF09E3F510568F0B6C000C15F3FECF34F +:10481000983EDCF3869577956795B795F7959F5FFA +:10482000C9F7880F911D9695879597F90895E1E04E +:10483000660F771F881FBB1F621773078407BA07AD +:1048400020F0621B730B840BBA0BEE1F88F7E09508 +:10485000089504D06894B111D9C00895BCD088F0EF +:104860009F5790F0B92F9927B751A0F0D1F0660F5C +:10487000771F881F991F1AF0BA95C9F712C0B13077 +:1048800081F0C3D0B1E00895C0C0672F782F88278A +:10489000B85F39F0B93FCCF3869577956795B395B6 +:1048A000D9F73EF490958095709561957F4F8F4F25 +:1048B0009F4F0895E89409C097FB3EF4909580952A +:1048C000709561957F4F8F4F9F4F9923A9F0F92FD6 +:1048D00096E9BB279395F695879577956795B79554 +:1048E000F111F8CFFAF4BB0F11F460FF1BC06F5F3A +:1048F0007F4F8F4F9F4F16C0882311F096E911C04C +:10490000772321F09EE8872F762F05C0662371F06C +:1049100096E8862F70E060E02AF09A95660F771F80 +:10492000881FDAF7880F9695879597F90895990F5C +:104930000008550FAA0BE0E8FEEF16161706E80769 +:10494000F907C0F012161306E407F50798F0621B8A +:10495000730B840B950B39F40A2661F0232B242B5F +:10496000252B21F408950A2609F4A140A6958FEF7E +:10497000811D811D089597F99F6780E870E060E0D0 +:1049800008959FEF80EC089500240A9416161706E8 +:1049900018060906089500240A9412161306140630 +:1049A00005060895092E0394000C11F4882352F093 +:1049B000BB0F40F4BF2B11F460FF04C06F5F7F4F4B +:1049C0008F4F9F4F089557FD9058440F551F59F032 +:1049D0005F3F71F04795880F97FB991F61F09F3FEC +:1049E00079F087950895121613061406551FF2CF15 +:1049F0004695F1DF08C0161617061806991FF1CF65 +:104A000086957105610508940895E894BB2766278B +:104A10007727CB0197F908950BD0C4CFB5DF28F0E5 +:104A2000BADF18F0952309F0A6CFABCF1124EECF53 +:104A3000CADFA0F3959FD1F3950F50E0551F629FF9 +:104A4000F001729FBB27F00DB11D639FAA27F00DE7 +:104A5000B11DAA1F649F6627B00DA11D661F829F0E +:104A60002227B00DA11D621F739FB00DA11D621FF3 +:104A7000839FA00D611D221F749F3327A00D611D10 +:104A8000231F849F600D211D822F762F6A2F1124F2 +:104A90009F5750408AF0E1F088234AF0EE0FFF1F45 +:104AA000BB1F661F771F881F91505040A9F79E3F7C +:104AB000510570F060CFAACF5F3FECF3983EDCF376 +:104AC000869577956795B795F795E7959F5FC1F7B9 +:104AD000FE2B880F911D9695879597F90895A1E271 +:104AE0001A2EAA1BBB1BFD010DC0AA1FBB1FEE1F68 +:104AF000FF1FA217B307E407F50720F0A21BB30BB3 +:104B0000E40BF50B661F771F881F991F1A9469F72E +:104B100060957095809590959B01AC01BD01CF018A +:104B20000895EE0FFF1F0590F491E02D0994AA1B44 +:104B3000BB1B51E107C0AA1FBB1FA617B70710F088 +:104B4000A61BB70B881F991F5A95A9F780959095BA +:104B5000BC01CD0108952F923F924F925F926F92C8 +:104B60007F928F929F92AF92BF92CF92DF92EF92FD +:104B7000FF920F931F93CF93DF93CDB7DEB7CA1B7E +:104B8000DB0B0FB6F894DEBF0FBECDBF09942A88A9 +:104B9000398848885F846E847D848C849B84AA8451 +:104BA000B984C884DF80EE80FD800C811B81AA81DE +:104BB000B981CE0FD11D0FB6F894DEBF0FBECDBFA9 +:084BC000ED010895F894FFCF08 +:104BC80054656D70657261747572652053656E7396 +:104BD8006F7200312E30006661696C006F6B0000E7 +:104BE800312E346231202831383834386132290086 +:104BF80073656E736F7200726570656174657200BB +:104C0800307500000100800005030000000000006E +:0C4C180004220E23A721C321B321E121B7 +:00000001FF diff --git a/NodeJsController/NodeJsController.js b/NodeJsController/NodeJsController.js new file mode 100644 index 0000000..25a53c4 --- /dev/null +++ b/NodeJsController/NodeJsController.js @@ -0,0 +1,617 @@ +const gwType = 'Ethernet'; +const gwAddress = '10.0.1.99'; +const gwPort = 9999; + +//const gwType = 'Serial'; +//const gwPort = 'COM4'; +//const gwBaud = 115200; + +const dbAddress = '127.0.0.1'; +const dbPort = 27017; +const dbName = 'MySensorsDb'; + +const fwHexFiles = [ 'BlinkRed.hex', 'BlinkGreen.hex', 'DallasTemperatureSensor.cpp.hex' ]; +const fwDefaultType = 2; // index of hex file from array above + +const FIRMWARE_BLOCK_SIZE = 16; +const BROADCAST_ADDRESS = 255; +const NODE_SENSOR_ID = 255; + +const C_PRESENTATION = 0; +const C_SET = 1; +const C_REQ = 2; +const C_INTERNAL = 3; +const C_STREAM = 4; + +const V_TEMP = 0; +const V_HUM = 1; +const V_LIGHT = 2; +const V_DIMMER = 3; +const V_PRESSURE = 4; +const V_FORECAST = 5; +const V_RAIN = 6; +const V_RAINRATE = 7; +const V_WIND = 8; +const V_GUST = 9; +const V_DIRECTION = 10; +const V_UV = 11; +const V_WEIGHT = 12; +const V_DISTANCE = 13; +const V_IMPEDANCE = 14; +const V_ARMED = 15; +const V_TRIPPED = 16; +const V_WATT = 17; +const V_KWH = 18; +const V_SCENE_ON = 19; +const V_SCENE_OFF = 20; +const V_HEATER = 21; +const V_HEATER_SW = 22; +const V_LIGHT_LEVEL = 23; +const V_VAR1 = 24; +const V_VAR2 = 25; +const V_VAR3 = 26; +const V_VAR4 = 27; +const V_VAR5 = 28; +const V_UP = 29; +const V_DOWN = 30; +const V_STOP = 31; +const V_IR_SEND = 32; +const V_IR_RECEIVE = 33; +const V_FLOW = 34; +const V_VOLUME = 35; +const V_LOCK_STATUS = 36; + +const I_BATTERY_LEVEL = 0; +const I_TIME = 1; +const I_VERSION = 2; +const I_ID_REQUEST = 3; +const I_ID_RESPONSE = 4; +const I_INCLUSION_MODE = 5; +const I_CONFIG = 6; +const I_PING = 7; +const I_PING_ACK = 8; +const I_LOG_MESSAGE = 9; +const I_CHILDREN = 10; +const I_SKETCH_NAME = 11; +const I_SKETCH_VERSION = 12; +const I_REBOOT = 13; + +const S_DOOR = 0; +const S_MOTION = 1; +const S_SMOKE = 2; +const S_LIGHT = 3; +const S_DIMMER = 4; +const S_COVER = 5; +const S_TEMP = 6; +const S_HUM = 7; +const S_BARO = 8; +const S_WIND = 9; +const S_RAIN = 10; +const S_UV = 11; +const S_WEIGHT = 12; +const S_POWER = 13; +const S_HEATER = 14; +const S_DISTANCE = 15; +const S_LIGHT_LEVEL = 16; +const S_ARDUINO_NODE = 17; +const S_ARDUINO_REPEATER_NODE = 18; +const S_LOCK = 19; +const S_IR = 20; +const S_WATER = 21; +const S_AIR_QUALITY = 22; + +const ST_FIRMWARE_CONFIG_REQUEST = 0; +const ST_FIRMWARE_CONFIG_RESPONSE = 1; +const ST_FIRMWARE_REQUEST = 2; +const ST_FIRMWARE_RESPONSE = 3; +const ST_SOUND = 4; +const ST_IMAGE = 5; + +const P_STRING = 0; +const P_BYTE = 1; +const P_INT16 = 2; +const P_UINT16 = 3; +const P_LONG32 = 4; +const P_ULONG32 = 5; +const P_CUSTOM = 6; + +var fs = require('fs'); + +function crcUpdate(old, value) { + var c = old ^ value; + for (var i = 0; i < 8; ++i) { + if ((c & 1) > 0) + c = ((c >> 1) ^ 0xA001); + else + c = (c >> 1); + } + return c; +} + +function pullWord(arr, pos) { + return arr[pos] + 256 * arr[pos + 1]; +} + +function pushWord(arr, val) { + arr.push(val & 0x00FF); + arr.push((val >> 8) & 0x00FF); +} + +function pushDWord(arr, val) { + arr.push(val & 0x000000FF); + arr.push((val >> 8) & 0x000000FF); + arr.push((val >> 16) & 0x000000FF); + arr.push((val >> 24) & 0x000000FF); +} + +function loadFirmware(fwtype, fwversion, filename, db) { + console.log("loading firmware: " + filename); + fwdata = []; + var start = 0; + var end = 0; + var pos = 0; + var hex = fs.readFileSync(filename).toString().split("\n"); + for(l in hex) { + line = hex[l].trim(); + if (line.length > 0) { + while (line.substring(0, 1) != ":") + line = line.substring(1); + var reclen = parseInt(line.substring(1, 3), 16); + var offset = parseInt(line.substring(3, 7), 16); + var rectype = parseInt(line.substring(7, 9), 16); + var data = line.substring(9, 9 + 2 * reclen); + var chksum = parseInt(line.substring(9 + (2 * reclen), 9 + (2 * reclen) + 2), 16); + if (rectype == 0) { + if ((start == 0) && (end == 0)) { + if (offset % 128 > 0) + throw new Error("error loading hex file - offset can't be devided by 128"); + start = offset; + end = offset; + } + if (offset < end) + throw new Error("error loading hex file - offset lower than end"); + while (offset > end) { + fwdata.push(255); + pos++; + end++; + } + for (var i = 0; i < reclen; i++) { + fwdata.push(parseInt(data.substring(i * 2, (i * 2) + 2), 16)); + pos++; + } + end += reclen; + } + } + } + var pad = end % 128; // ATMega328 has 64 words per page / 128 bytes per page + for (var i = 0; i < 128 - pad; i++) { + fwdata.push(255); + pos++; + end++; + } + var blocks = (end - start) / FIRMWARE_BLOCK_SIZE; + var crc = 0xFFFF; + for (var i = 0; i < blocks * FIRMWARE_BLOCK_SIZE; ++i) { + var v = crc; + crc = crcUpdate(crc, fwdata[i]); + } + db.collection('firmware', function(err, c) { + c.update({ + 'type': fwtype, + 'version': fwversion + }, { + $set: { + 'filename': filename, + 'blocks': blocks, + 'crc': crc, + 'data': fwdata + } + }, { + upsert: true + }, function(err, result) { + if (err) + console.log('Error writing firmware to database'); + }); + }); + console.log("loading firmware done. blocks: " + blocks + " / crc: " + crc); +} + +/* +function decode(msg) { + var msgs = msg.toString().split(";"); + rsender = +msgs[0]; + rsensor = +msgs[1]; + rcommand = +msgs[2]; + rtype = +msgs[3]; + var pl = msgs[4].trim(); + rpayload = []; + for (var i = 0; i < pl.length; i+=2) { + var b = parseInt(pl.substring(i, i + 2), 16); + rpayload.push(b); + } +} +*/ + +function encode(destination, sensor, command, acknowledge, type, payload) { + var msg = destination.toString(10) + ";" + sensor.toString(10) + ";" + command.toString(10) + ";" + acknowledge.toString(10) + ";" + type.toString(10) + ";"; + if (command == 4) { + for (var i = 0; i < payload.length; i++) { + if (payload[i] < 16) + msg += "0"; + msg += payload[i].toString(16); + } + } else { + msg += payload; + } + msg += '\n'; + return msg.toString(); +} + +function saveProtocol(sender, payload, db) { + db.collection('node', function(err, c) { + c.update({ + 'id': sender + }, { + $set: { + 'protocol': payload + } + }, { + upsert: true + }, function(err, result) { + if (err) + console.log("Error writing protocol to database"); + }); + }); +} + +function saveValue(sender, sensor, type, payload, db) { + var cn = "Value-" + sender.toString() + "-" + sensor.toString(); + db.createCollection(cn, function(err, c) { + c.save({ + 'timestamp': new Date().getTime(), + 'type': type, + 'value': payload + }, function(err, result) { + if (err) + console.log("Error writing value to database"); + }); + }); +} + +function saveBatteryLevel(sender, payload, db) { + var cn = "BatteryLevel-" + sender.toString(); + db.createCollection(cn, function(err, c) { + c.save({ + 'timestamp': new Date().getTime(), + 'value': payload + }, function(err, result) { + if (err) + console.log("Error writing battery level to database"); + }); + }); +} + +function saveSketchName(sender, payload, db) { + db.collection('node', function(err, c) { + c.update({ + 'id': sender + }, { + $set: { + 'sketchName': payload + } + }, function(err, result) { + if (err) + console.log("Error writing sketch name to database"); + }); + }); +} + +function saveSketchVersion(sender, payload, db) { + db.collection('node', function(err, c) { + c.update({ + 'id': sender + }, { + $set: { + 'sketchVersion': payload + } + }, function(err, result) { + if (err) + console.log("Error writing sketch version to database"); + }); + }); +} + +function sendTime(destination, sensor, gw) { + var payload = new Date().getTime(); + var command = C_INTERNAL; + var acknowledge = 0; // no ack + var type = I_TIME; + var td = encode(destination, sensor, command, acknowledge, type, payload); + console.log('-> ' + td.toString()); + gw.write(td); +} + +function sendNextAvailableSensorId(db, gw) { + db.collection('node', function(err, c) { + c.find({ + $query: { }, + $orderby: { + 'id': 1 + } + }).toArray(function(err, results) { + if (err) + console.log('Error finding nodes'); + var id = 1; + for (var i = 0; i < results.length; i++) + if (results[i].id > i + 1) { + id = i + 1; + break; + } + if (id < 255) { + c.save({ + 'id': id + }, function(err, result) { + if (err) + console.log('Error writing node to database'); + var destination = BROADCAST_ADDRESS; + var sensor = NODE_SENSOR_ID; + var command = C_INTERNAL; + var acknowledge = 0; // no ack + var type = I_ID_RESPONSE; + var payload = id; + var td = encode(destination, sensor, command, acknowledge, type, payload); + console.log('-> ' + td.toString()); + gw.write(td); + }); + } + }); + }); +} + +function sendConfig(destination, gw) { + var payload = "M"; + var sensor = NODE_SENSOR_ID; + var command = C_INTERNAL; + var acknowledge = 0; // no ack + var type = I_CONFIG; + var td = encode(destination, sensor, command, acknowledge, type, payload); + console.log('-> ' + td.toString()); + gw.write(td); +} + +function sendFirmwareConfigResponse(destination, fwtype, fwversion, db, gw) { + // keep track of type/versin info for each node + // at the same time update the last modified date + // could be used to remove nodes not seen for a long time etc. + db.collection('node', function(err, c) { + c.update({ + 'id': destination + }, { + $set: { + 'type': fwtype, + 'version': fwversion + } + }, { + upsert: true + }, function(err, result) { + if (err) + console.log("Error writing node type and version to database"); + }); + }); + if (fwtype == 0xFFFF) { + // sensor does not know which type / blank EEPROM + // take predefined type (ideally selected in UI prior to connection of new sensor) + if (fwDefaultType == 0xFFFF) + throw new Error('No default sensor type defined'); + fwtype = fwDefaultType; + } + db.collection('firmware', function(err, c) { + c.findOne({ + $query: { + 'type': fwtype + }, + $orderby: { + 'version': -1 + } + }, function(err, result) { + if (err) + console.log('Error finding firmware for type ' + fwtype); + if (!result) + console.log('No firmware found for type ' + fwtype); + var payload = []; + pushWord(payload, result.type); + pushWord(payload, result.version); + pushWord(payload, result.blocks); + pushWord(payload, result.crc); + var sensor = NODE_SENSOR_ID; + var command = C_STREAM; + var acknowledge = 0; // no ack + var type = 1; // I_FIRMWARE_CONFIG_RESPONSE + var td = encode(destination, sensor, command, acknowledge, type, payload); + console.log('-> ' + td.toString()); + gw.write(td); + }); + }); +} + +function sendFirmwareResponse(destination, fwtype, fwversion, fwblock, db, gw) { + db.collection('firmware', function(err, c) { + c.findOne({ + 'type': fwtype, + 'version': fwversion + }, function(err, result) { + if (err) + console.log('Error finding firmware version ' + fwversion + ' for type ' + fwtype); + var payload = []; + pushWord(payload, result.type); + pushWord(payload, result.version); + pushWord(payload, fwblock); + for (var i = 0; i < FIRMWARE_BLOCK_SIZE; i++) + payload.push(result.data[fwblock * FIRMWARE_BLOCK_SIZE + i]); + var sensor = NODE_SENSOR_ID; + var command = C_STREAM; + var acknowledge = 0; // no ack + var type = ST_FIRMWARE_RESPONSE; + var td = encode(destination, sensor, command, acknowledge, type, payload); + console.log('-> ' + td.toString()); + gw.write(td); + }); + }); +} + +function rebootNode(destination, gw) { + var sensor = NODE_SENSOR_ID; + var command = C_INTERNAL; + var acknowledge = 0; // no ack + var type = I_REBOOT; + var payload = ""; + var td = encode(destination, sensor, command, acknowledge, type, payload); + console.log('-> ' + td.toString()); + gw.write(td); +} + +function rfReceived(data, db, gw) { + if ((data != null) && (data != "")) { + console.log('<- ' + data); + // decoding message + var datas = data.toString().split(";"); + var sender = +datas[0]; + var sensor = +datas[1]; + var command = +datas[2]; + var type = +datas[3]; + var rawpayload = datas[4].trim(); + var payload; + if (command == 4) { + payload = []; + for (var i = 0; i < rawpayload.length; i+=2) + payload.push(parseInt(rawpayload.substring(i, i + 2), 16)); + } else { + payload = rawpayload; + } + // decision on appropriate response + switch (command) { + case C_PRESENTATION: + saveProtocol(sender, payload, db); + break; + case C_SET: + saveValue(sender, sensor, type, payload, db); + break; + case C_REQ: + break; + case C_INTERNAL: + switch (type) { + case I_BATTERY_LEVEL: + saveBatteryLevel(sender, payload, db); + break; + case I_TIME: + sendTime(sender, sensor, gw); + break; + case I_VERSION: + break; + case I_ID_REQUEST: + sendNextAvailableSensorId(db, gw); + break; + case I_ID_RESPONSE: + break; + case I_INCLUSION_MODE: + break; + case I_CONFIG: + sendConfig(sender, gw); + break; + case I_PING: + break; + case I_PING_ACK: + break; + case I_LOG_MESSAGE: + break; + case I_CHILDREN: + break; + case I_SKETCH_NAME: + saveSketchName(sender, payload, db); + break; + case I_SKETCH_VERSION: + saveSketchVersion(sender, payload, db); + break; + case I_REBOOT: + break; + } + break; + case C_STREAM: + switch (type) { + case ST_FIRMWARE_CONFIG_REQUEST: + var fwtype = pullWord(payload, 0); + var fwversion = pullWord(payload, 2); + sendFirmwareConfigResponse(sender, fwtype, fwversion, db, gw); + break; + case ST_FIRMWARE_CONFIG_RESPONSE: + break; + case ST_FIRMWARE_REQUEST: + var fwtype = pullWord(payload, 0); + var fwversion = pullWord(payload, 2); + var fwblock = pullWord(payload, 4); + sendFirmwareResponse(sender, fwtype, fwversion, fwblock, db, gw); + break; + case ST_FIRMWARE_RESPONSE: + break; + case ST_SOUND: + break; + case ST_IMAGE: + break; + } + break; + } + } +} + +var dbc = require('mongodb').MongoClient; +dbc.connect('mongodb://' + dbAddress + ':' + dbPort + '/' + dbName, function(err, db) { + if(err) { + console.log('Error connecting to database at mongodb://' + dbAddress + ':' + dbPort + '/' + dbName); + return; + } + console.log('Connected to database at mongodb://' + dbAddress + ':' + dbPort + '/' + dbName); + db.createCollection('node', function(err, collection) { }); + db.createCollection('firmware', function(err, collection) { }); + + // ToDo : check for new hex files / only load if new / get type and version from filename + for (var i = 0; i < hexFiles.length; i++) + loadFirmware(i, 1, hexFiles[i], db); + + var gw; + if (gwType == 'Ethernet') { + gw = require('net').Socket(); + gw.connect(gwPort, gwAddress); + gw.setEncoding('ascii'); + gw.on('connect', function() { + console.log('connected to ethernet gateway at ' + gwAddress + ":" + gwPort); + }).on('data', function(rd) { + var rds = rd.toString().split('\n'); + for (var i = 0; i < rds.length; i++) + rfReceived(rds[i].trim(), db, gw); + }).on('end', function() { + console.log('disconnected from gateway'); + }).on('error', function() { + console.log('connection error - trying to reconnect'); + gw.connect(gwPort, gwAddress); + gw.setEncoding('ascii'); + }); + } else if (gwType == 'Serial') { + gw = require('serialport').SerialPort(gwPort, { baudrate: gwBaud }, false); + gw.open(); + gw.on('open', function() { + console.log('connected to serial gateway at ' + gwPort); + }).on('data', function(rd) { + var rds = rd.toString().split('\n'); + for (var i = 0; i < rds.length; i++) + rfReceived(rds[i].trim(), db, gw); + }).on('end', function() { + console.log('disconnected from gateway'); + }).on('error', function() { + console.log('connection error - trying to reconnect'); + gw.open(); + }); + } else { + throw new Error('unknown Gateway type'); + } +}); + diff --git a/NodeJsController/Reboot.js b/NodeJsController/Reboot.js new file mode 100644 index 0000000..4a521e1 --- /dev/null +++ b/NodeJsController/Reboot.js @@ -0,0 +1,45 @@ +var NodeIdToReboot = 1; + +var gwType = 'Ethernet'; +var gwAddress = '10.0.1.99'; +var gwPort = 9999; + +var BROADCAST_ADDRESS = 255; +var NODE_SENSOR_ID = 255; + +function encode(destination, sensor, command, acknowledge, type, payload, binary) { + var msg = destination.toString(10) + ";" + sensor.toString(10) + ";" + command.toString(10) + ";" + acknowledge.toString(10) + ";" + type.toString(10) + ";"; + if (binary) { + for (var i = 0; i < payload.length; i++) { + if (payload[i] < 16) + msg += "0"; + msg += payload[i].toString(16); + } + } else { + msg += payload; + } + msg += '\n'; + return msg.toString(); +} + +function rebootNode(destination, gw) { + var sensor = NODE_SENSOR_ID; + var command = 3; // C_INTERNAL + var acknowledge = 0; // no ack + var type = 13; // I_REBOOT + var payload = ""; + var td = encode(destination, sensor, command, acknowledge, type, payload, false); + console.log('-> ' + td.toString()); + gw.write(td); +} + +var gw = require('net').Socket(); +gw.connect(gwPort, gwAddress); +gw.setEncoding('ascii'); +gw.on('connect', function() { + console.log('connected to ethernet gateway at ' + gwAddress + ":" + gwPort); + rebootNode(NodeIdToReboot, gw); + console.log('reboot request submitted for ' + NodeIdToReboot); +}).on('end', function() { + console.log('disconnected from gateway'); +}); diff --git a/NodeJsController/package.json b/NodeJsController/package.json new file mode 100644 index 0000000..f9ec6ff --- /dev/null +++ b/NodeJsController/package.json @@ -0,0 +1,9 @@ +{ + "name": "NodeJsController", + "version": "0.0.1", + "description": "MySensors Controller based on Node JS", + "dependencies": { + "net": "~1.0.2", + "mongodb": "~1.4.7" + } +}